commit 67e7ff1e29e44dac9365192a0ed88d767a63338e
Author: weipengfei <2187978347@qq.com>
Date:   Thu Apr 25 18:02:30 2024 +0800

    初始化

diff --git a/.hbuilderx/launch.json b/.hbuilderx/launch.json
new file mode 100644
index 0000000..81f13f4
--- /dev/null
+++ b/.hbuilderx/launch.json
@@ -0,0 +1,16 @@
+{ // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
+  // launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数
+    "version": "0.0",
+    "configurations": [{
+     	"default" : 
+     	{
+     		"launchtype" : "local"
+     	},
+     	"mp-weixin" : 
+     	{
+     		"launchtype" : "local"
+     	},
+     	"type" : "uniCloud"
+     }
+    ]
+}
diff --git a/App.vue b/App.vue
new file mode 100644
index 0000000..301b258
--- /dev/null
+++ b/App.vue
@@ -0,0 +1,23 @@
+<script>
+	export default {
+		onLaunch: function() {
+			console.log('App Launch')
+		},
+		onShow: function() {
+			console.log('App Show')
+		},
+		onHide: function() {
+			console.log('App Hide')
+		}
+	}
+</script>
+
+<style lang="scss">
+	/*每个页面公共css */
+  @import "@/uni_modules/uview-plus/index.scss";
+  
+  page{
+    font-size: 26rpx;
+    background-color: #eee;
+  }
+</style>
diff --git a/api/api.js b/api/api.js
new file mode 100644
index 0000000..e69de29
diff --git a/components/viewPopup/index.vue b/components/viewPopup/index.vue
new file mode 100644
index 0000000..287e993
--- /dev/null
+++ b/components/viewPopup/index.vue
@@ -0,0 +1,101 @@
+<template>
+  <view class="view-popup">
+    <!-- #ifdef MP-WEIXIN -->
+    <view v-if="nav" style="width: 100%;" :style="{height: height + 'px'}"></view>
+    <!-- #endif -->
+    <!-- #ifndef MP-WEIXIN -->
+    <view v-if="nav" style="width: 100%;height: calc( var(--status-bar-height) + 44px );"></view>
+    <!-- #endif -->
+    <view class="center">
+      <slot></slot>
+      <view class="up" @click="close">
+        <text>点击收起</text>
+        <up-icon name="arrow-up"></up-icon>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script setup>
+  import { ref } from "vue"
+
+  const props = defineProps({
+    nav: {
+      type: Boolean,
+      default: false
+    },
+    show: {
+      type: Boolean,
+      default: false
+    }
+  })
+
+  const emit = defineEmits(['close', 'click'])
+  const close = () => {
+    emit('close')
+  }
+
+  // #ifdef MP-WEIXIN
+  const height = ref(0);
+  uni.getSystemInfo({
+    success: (res) => {
+      // 获取手机顶部状态栏的高度
+      const statusBarHeight = res.statusBarHeight || 0;
+
+      // 获取导航栏的高度(手机状态栏高度 + 胶囊高度 + 胶囊的上下间距)
+      const menuButtonInfo = uni.getMenuButtonBoundingClientRect();
+      const navBarHeight = menuButtonInfo.height + (menuButtonInfo.top - statusBarHeight) * 2;
+
+      // 计算顶部图标距离
+      const topIconDistance = statusBarHeight + navBarHeight;
+
+      // 打印顶部图标距离
+      console.log('顶部图标距离:', topIconDistance);
+      height.value = topIconDistance;
+    },
+    fail: (err) => {
+      console.error('获取系统信息失败:', err);
+    },
+  });
+  // #endif
+</script>
+
+<style scoped lang="scss">
+  .view-popup {
+    height: 100vh;
+    width: 100%;
+    background-color: rgba(#000, 0.3);
+    position: absolute;
+    top: 0;
+    left: 0;
+    z-index: 10;
+
+    .center {
+      animation: slideDown 0.3s forwards;
+    }
+
+    .up {
+      width: 100%;
+      height: 80rpx;
+      background-color: #fff;
+      border-radius: 0 0 28rpx 28rpx;
+      border-top: 1rpx solid #eee;
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      font-size: 24rpx;
+    }
+  }
+
+  @keyframes slideDown {
+    from {
+      transform: translateY(-100%);
+      /* 初始状态:向上偏移100% */
+    }
+
+    to {
+      transform: translateY(0);
+      /* 最终状态:无偏移 */
+    }
+  }
+</style>
\ No newline at end of file
diff --git a/config/app.js b/config/app.js
new file mode 100644
index 0000000..a5b74d4
--- /dev/null
+++ b/config/app.js
@@ -0,0 +1,33 @@
+let BASE_URL
+import store from "@/store/index.js"
+// 环境
+let env = "dev"
+// let env = "prod"
+
+
+let HTTP_REQUEST_URL
+let HEADER
+if (env == 'dev') {
+	BASE_URL = 'https://ceshi-suyuan-breed.lihaink.cn/'
+	// BASE_URL = 'http://192.168.1.24:8084/'
+} else if (env = 'prod') {
+	BASE_URL = 'https://suyuan-breed.lihaink.cn/'
+}
+let config = {
+	HTTP_REQUEST_URL: BASE_URL,
+	HEADER: {
+		'content-type': 'application/json',
+		//#ifdef MP
+		'Form-type': 'routine',
+		//#endif
+		//#ifdef APP-PLUS
+		'Form-type': 'app',
+		//#endif
+		'TOKEN': ''
+
+	}
+}
+
+export {
+	config
+};
\ No newline at end of file
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..c3ff205
--- /dev/null
+++ b/index.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <script>
+      var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
+        CSS.supports('top: constant(a)'))
+      document.write(
+        '<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
+        (coverSupport ? ', viewport-fit=cover' : '') + '" />')
+    </script>
+    <title></title>
+    <!--preload-links-->
+    <!--app-context-->
+  </head>
+  <body>
+    <div id="app"><!--app-html--></div>
+    <script type="module" src="/main.js"></script>
+  </body>
+</html>
diff --git a/main.js b/main.js
new file mode 100644
index 0000000..9b4f788
--- /dev/null
+++ b/main.js
@@ -0,0 +1,29 @@
+import App from './App'
+import uviewPlus from '@/uni_modules/uview-plus'
+
+// #ifndef VUE3
+import Vue from 'vue'
+import './uni.promisify.adaptor'
+Vue.config.productionTip = false
+App.mpType = 'app'
+const app = new Vue({
+  ...App
+})
+app.$mount()
+// #endif
+
+// #ifdef VUE3
+import { createSSRApp } from 'vue'
+//导入pinia  
+import * as Pinia from 'pinia'
+export function createApp() {
+  const app = createSSRApp(App)
+  // 创建Pinia实例  // 将pinia实例挂载到vue实例上 
+  app.use(Pinia.createPinia());
+  app.use(uviewPlus)
+  return {
+    app,
+    Pinia, // 此处必须将 Pinia 返回
+  }
+}
+// #endif
\ No newline at end of file
diff --git a/manifest.json b/manifest.json
new file mode 100644
index 0000000..349ef7c
--- /dev/null
+++ b/manifest.json
@@ -0,0 +1,80 @@
+{
+    "name" : "purchase-let",
+    "appid" : "__UNI__2BE6000",
+    "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" : [
+                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+                ]
+            },
+            /* ios打包配置 */
+            "ios" : {},
+            /* SDK配置 */
+            "sdkConfigs" : {}
+        }
+    },
+    /* 快应用特有相关 */
+    "quickapp" : {},
+    /* 小程序特有相关 */
+    "mp-weixin" : {
+        "appid" : "",
+        "setting" : {
+            "urlCheck" : false
+        },
+        "usingComponents" : true
+    },
+    "mp-alipay" : {
+        "usingComponents" : true
+    },
+    "mp-baidu" : {
+        "usingComponents" : true
+    },
+    "mp-toutiao" : {
+        "usingComponents" : true
+    },
+    "uniStatistics" : {
+        "enable" : false
+    },
+    "vueVersion" : "3",
+    "h5" : {
+        "router" : {
+            "mode" : "hash"
+        },
+        "devServer" : {
+            "port" : 5177
+        }
+    }
+}
diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json
new file mode 100644
index 0000000..b8a6273
--- /dev/null
+++ b/node_modules/.package-lock.json
@@ -0,0 +1,45 @@
+{
+  "name": "purchase-let",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "node_modules/clipboard": {
+      "version": "2.0.11",
+      "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz",
+      "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==",
+      "dependencies": {
+        "good-listener": "^1.2.2",
+        "select": "^1.1.2",
+        "tiny-emitter": "^2.0.0"
+      }
+    },
+    "node_modules/dayjs": {
+      "version": "1.11.10",
+      "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz",
+      "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ=="
+    },
+    "node_modules/delegate": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
+      "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw=="
+    },
+    "node_modules/good-listener": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz",
+      "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==",
+      "dependencies": {
+        "delegate": "^3.1.2"
+      }
+    },
+    "node_modules/select": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz",
+      "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA=="
+    },
+    "node_modules/tiny-emitter": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
+      "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="
+    }
+  }
+}
diff --git a/node_modules/clipboard/.babelrc.json b/node_modules/clipboard/.babelrc.json
new file mode 100644
index 0000000..b442199
--- /dev/null
+++ b/node_modules/clipboard/.babelrc.json
@@ -0,0 +1,11 @@
+{
+  "presets": [
+    [
+      "@babel/env",
+      {
+        "forceAllTransforms": true,
+        "modules": false
+      }
+    ]
+  ]
+}
diff --git a/node_modules/clipboard/.editorconfig b/node_modules/clipboard/.editorconfig
new file mode 100644
index 0000000..202ee21
--- /dev/null
+++ b/node_modules/clipboard/.editorconfig
@@ -0,0 +1,22 @@
+# EditorConfig helps developers define and maintain consistent
+# coding styles between different editors and IDEs
+# http://editorconfig.org
+
+root = true
+
+[*]
+# Change these settings to your own preference
+indent_style = space
+indent_size = 2
+
+# We recommend you to keep these unchanged
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[*.md]
+trim_trailing_whitespace = false
+
+[{package.json,bower.json}]
+indent_size = 2
diff --git a/node_modules/clipboard/.eslintignore b/node_modules/clipboard/.eslintignore
new file mode 100644
index 0000000..8730547
--- /dev/null
+++ b/node_modules/clipboard/.eslintignore
@@ -0,0 +1,12 @@
+# Ignore artifacts:
+dist
+
+lib
+npm-debug.log
+bower_components
+node_modules
+yarn-error.log
+yarn.lock
+
+src/*.ts
+/*.js
diff --git a/node_modules/clipboard/.eslintrc.json b/node_modules/clipboard/.eslintrc.json
new file mode 100644
index 0000000..a6890ef
--- /dev/null
+++ b/node_modules/clipboard/.eslintrc.json
@@ -0,0 +1,24 @@
+{
+  "env": {
+    "browser": true,
+    "es2021": true,
+    "mocha": true
+  },
+  "extends": ["airbnb-base", "plugin:prettier/recommended"],
+  "parserOptions": {
+    "ecmaVersion": 12,
+    "sourceType": "module"
+  },
+  "plugins": ["prettier"],
+  "rules": {
+    "prettier/prettier": "error",
+    "prefer-const": "off",
+    "camelcase": "off",
+    "no-underscore-dangle": "off",
+    "consistent-return": "off",
+    /* Remove the necessity to use this on classes */
+    "class-methods-use-this": "off",
+    /* Enable variables declarations from shadowing variables declared in the outer scope */
+    "no-shadow": "off"
+  }
+}
diff --git a/node_modules/clipboard/.github/ISSUE_TEMPLATE/bug_report.md b/node_modules/clipboard/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 0000000..99fe3e6
--- /dev/null
+++ b/node_modules/clipboard/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,57 @@
+---
+name: 🐛 Bug Report
+about: Submit a bug report to help us improve
+labels: 'bug, needs triage'
+---
+
+<!--
+
+  ! PLEASE HELP US HELP YOU !
+
+  Bugs are fixed faster if you include:
+  - a repro repository to inspect the code
+  - an url to see the problem live
+
+-->
+
+## 🐛 Bug Report
+
+> Fork this [JSFiddle](https://jsfiddle.net/zenorocha/5kk0eysw/) and reproduce your issue.
+
+(A clear and concise description of what the issue is.)
+
+### Have you read the [Contributing Guidelines on issues](https://github.com/zenorocha/clipboard.js/blob/master/contributing.md)?
+
+(Write your answer here.)
+
+### Expected Behaviour
+
+<!--
+  How did you expect your project to behave?
+  It’s fine if you’re not sure your understanding is correct.
+  Write down what you thought would happen.
+-->
+
+I thought that by going to the page '...' and pressing the button '...' then '...' would happen.
+
+_Tip: Try to use screenshots, gifs, videos, always remember people better understand with a visual way._
+
+### Actual Behaviour
+
+Instead of '...', what I saw was that '...' happened instead.
+
+### To Reproduce
+
+(Write your steps such as:)
+
+1. Step 1...
+1. Step 2...
+1. Step 3...
+
+### Browsers Affected
+
+I tested on all major browsers and only IE 11 does not work.
+
+### Operational System
+
+(Place here your Operational System.)
diff --git a/node_modules/clipboard/.github/ISSUE_TEMPLATE/documentation.md b/node_modules/clipboard/.github/ISSUE_TEMPLATE/documentation.md
new file mode 100644
index 0000000..adbcf5c
--- /dev/null
+++ b/node_modules/clipboard/.github/ISSUE_TEMPLATE/documentation.md
@@ -0,0 +1,13 @@
+---
+name: 📚 Documentation
+about: Report an issue related to documentation
+labels: 'documentation, needs triage'
+---
+
+## 📚 Documentation
+
+(A clear and concise description of what the issue is.)
+
+### Have you read the [Contributing Guidelines on issues](https://github.com/zenorocha/clipboard.js/blob/master/contributing.md)?
+
+(Write your answer here.)
diff --git a/node_modules/clipboard/.github/ISSUE_TEMPLATE/proposal.md b/node_modules/clipboard/.github/ISSUE_TEMPLATE/proposal.md
new file mode 100644
index 0000000..f7ce878
--- /dev/null
+++ b/node_modules/clipboard/.github/ISSUE_TEMPLATE/proposal.md
@@ -0,0 +1,26 @@
+---
+name: 💥 Proposal
+about: Propose a non-trivial change to Clipboard.js
+labels: 'proposal, needs triage'
+---
+
+## 💥 Proposal
+
+**Is your feature request related to a problem? Please describe**
+A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
+
+**Describe the solution you'd like**
+A clear and concise description of what you want to happen.
+
+**Describe alternatives you've considered**
+A clear and concise description of any alternative solutions or features you've considered.
+
+**Are you able to assist to bring the feature to reality?**
+no | yes, I can...
+
+**Additional context**
+Add any other context or screenshots about the feature request here.
+
+### Have you read the [Contributing Guidelines on issues](https://github.com/zenorocha/clipboard.js/blob/master/contributing.md)?
+
+(Write your answer here.)
diff --git a/node_modules/clipboard/.github/PULL_REQUEST_TEMPLATE.md b/node_modules/clipboard/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000..b2f50c8
--- /dev/null
+++ b/node_modules/clipboard/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,35 @@
+<!--
+Please make sure to read the Pull Request Guidelines:
+https://github.com/zenorocha/clipboard.js/blob/master/contributing.md#proposing-pull-requests
+-->
+
+<!-- PULL REQUEST TEMPLATE -->
+<!-- (Update "[ ]" to "[x]" to check a box) -->
+
+**What kind of change does this PR introduce?** (check at least one)
+
+- [ ] Bugfix
+- [ ] Feature
+- [ ] Code style update
+- [ ] Refactor
+- [ ] Build-related changes
+- [ ] Other, please describe:
+
+**Does this PR introduce a breaking change?** (check one)
+
+- [ ] Yes
+- [ ] No
+
+If yes, please describe the impact and migration path for existing applications:
+
+**The PR fulfills these requirements:**
+
+- [ ] It's submitted to the `dev` branch for v2.x (or to a previous version branch), _not_ the `master` branch
+- [ ] When resolving a specific issue, it's referenced in the PR's title (e.g. `fix #xxx[,#xxx]`, where "xxx" is the issue number)
+- [ ] New/updated tests are included
+
+If adding a **new feature**, the PR's description includes:
+
+- [ ] A convincing reason for adding this feature (to avoid wasting your time, it's best to open a suggestion issue first and wait for approval before working on it)
+
+**Other information:**
diff --git a/node_modules/clipboard/.github/stale.yml b/node_modules/clipboard/.github/stale.yml
new file mode 100644
index 0000000..efee0d1
--- /dev/null
+++ b/node_modules/clipboard/.github/stale.yml
@@ -0,0 +1,21 @@
+# Number of days of inactivity before an issue becomes stale
+daysUntilStale: 60
+
+# Number of days of inactivity before a stale issue is closed
+daysUntilClose: 7
+
+# Issues with these labels will never be considered stale
+exemptLabels:
+  - pinned
+
+# Label to use when marking an issue as stale
+staleLabel: stale
+
+# Comment to post when marking an issue as stale. Set to `false` to disable
+markComment: >
+  This issue has been automatically marked as stale because it has not had
+  recent activity. It will be closed if no further activity occurs. Thank you
+  for your contributions.
+
+# Comment to post when closing a stale issue. Set to `false` to disable
+closeComment: false
diff --git a/node_modules/clipboard/.github/workflows/publish.yml b/node_modules/clipboard/.github/workflows/publish.yml
new file mode 100644
index 0000000..e0dadfc
--- /dev/null
+++ b/node_modules/clipboard/.github/workflows/publish.yml
@@ -0,0 +1,47 @@
+# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created
+# For more information see: https://help.github.com/actions/language-and-framework-guides/publishing-nodejs-packages
+
+name: publish
+
+on:
+  release:
+    types: [created]
+
+jobs:
+  build:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v2
+      - uses: actions/setup-node@v1
+        with:
+          node-version: 14
+      - run: npm ci
+      - run: npm test
+
+  publish-npm:
+    needs: build
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v2
+      - uses: actions/setup-node@v1
+        with:
+          node-version: 14
+          registry-url: https://registry.npmjs.org/
+      - run: npm ci
+      - run: npm publish
+        env:
+          NODE_AUTH_TOKEN: ${{secrets.npm_token}}
+
+  publish-gpr:
+    needs: build
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v2
+      - uses: actions/setup-node@v1
+        with:
+          node-version: 14
+          registry-url: https://npm.pkg.github.com/
+      - run: npm ci
+      - run: npm publish
+        env:
+          NODE_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}}
diff --git a/node_modules/clipboard/.github/workflows/test.js.yml b/node_modules/clipboard/.github/workflows/test.js.yml
new file mode 100644
index 0000000..04f169a
--- /dev/null
+++ b/node_modules/clipboard/.github/workflows/test.js.yml
@@ -0,0 +1,34 @@
+# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
+# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
+
+name: build
+
+on:
+  push:
+    branches: [master]
+  pull_request:
+    branches: [master]
+
+env:
+  FORCE_COLOR: 2
+
+jobs:
+  build:
+    runs-on: ubuntu-latest
+
+    strategy:
+      matrix:
+        node-version: [10.x, 12.x, 14.x, 15.x]
+        # See supported Node.js release schedule at https://nodejs.org/en/about/releases/
+        # For now is not possible to target LTS verssions =/ check progress here https://github.com/actions/setup-node/issues/26
+
+    steps:
+      - uses: actions/checkout@v2
+      - name: Use Node.js ${{ matrix.node-version }}
+        uses: actions/setup-node@v2
+        with:
+          node-version: ${{ matrix.node-version }}
+      - run: npm ci
+      - run: npm run build --if-present
+      - run: npm run lint
+      - run: npm test
diff --git a/node_modules/clipboard/.husky/pre-commit b/node_modules/clipboard/.husky/pre-commit
new file mode 100644
index 0000000..d37daa0
--- /dev/null
+++ b/node_modules/clipboard/.husky/pre-commit
@@ -0,0 +1,4 @@
+#!/bin/sh
+. "$(dirname "$0")/_/husky.sh"
+
+npx --no-install lint-staged
diff --git a/node_modules/clipboard/.nvmrc b/node_modules/clipboard/.nvmrc
new file mode 100644
index 0000000..8351c19
--- /dev/null
+++ b/node_modules/clipboard/.nvmrc
@@ -0,0 +1 @@
+14
diff --git a/node_modules/clipboard/.prettierignore b/node_modules/clipboard/.prettierignore
new file mode 100644
index 0000000..0069bdb
--- /dev/null
+++ b/node_modules/clipboard/.prettierignore
@@ -0,0 +1,9 @@
+# Ignore artifacts:
+dist
+
+lib
+npm-debug.log
+bower_components
+node_modules
+yarn-error.log
+yarn.lock
diff --git a/node_modules/clipboard/.prettierrc.json b/node_modules/clipboard/.prettierrc.json
new file mode 100644
index 0000000..471698f
--- /dev/null
+++ b/node_modules/clipboard/.prettierrc.json
@@ -0,0 +1,9 @@
+{
+  "printWidth": 80,
+  "tabWidth": 2,
+  "semi": true,
+  "singleQuote": true,
+  "trailingComma": "es5",
+  "bracketSpacing": true,
+  "arrowParens": "always"
+}
diff --git a/node_modules/clipboard/LICENSE b/node_modules/clipboard/LICENSE
new file mode 100644
index 0000000..01cdf07
--- /dev/null
+++ b/node_modules/clipboard/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) Zeno Rocha
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/node_modules/clipboard/bower.json b/node_modules/clipboard/bower.json
new file mode 100644
index 0000000..c0b31e4
--- /dev/null
+++ b/node_modules/clipboard/bower.json
@@ -0,0 +1,18 @@
+{
+  "name": "clipboard",
+  "version": "2.0.11",
+  "description": "Modern copy to clipboard. No Flash. Just 3kb",
+  "license": "MIT",
+  "main": "dist/clipboard.js",
+  "ignore": [
+    "/.*/",
+    "/demo/",
+    "/test/",
+    "/.*",
+    "/bower.json",
+    "/karma.conf.js",
+    "/src",
+    "/lib"
+  ],
+  "keywords": ["clipboard", "copy", "cut"]
+}
diff --git a/node_modules/clipboard/composer.json b/node_modules/clipboard/composer.json
new file mode 100644
index 0000000..50a9405
--- /dev/null
+++ b/node_modules/clipboard/composer.json
@@ -0,0 +1,25 @@
+{
+  "name": "zenorocha/clipboardjs",
+  "description": "Modern copy to clipboard. No Flash. Just 3kb gzipped https://clipboardjs.com",
+  "type": "component",
+  "homepage": "https://clipboardjs.com/",
+  "authors": [
+    {
+      "name": "Zeno Rocha",
+      "homepage": "http://zenorocha.com/"
+    }
+  ],
+  "require": {
+    "oomphinc/composer-installers-extender": "*"
+  },
+  "extra": {
+    "component": {
+      "scripts": [
+        "dist/clipboard.js"
+      ],
+      "files": [
+        "dist/clipboard.min.js"
+      ]
+    }
+  }
+}
diff --git a/node_modules/clipboard/contributing.md b/node_modules/clipboard/contributing.md
new file mode 100644
index 0000000..9146adc
--- /dev/null
+++ b/node_modules/clipboard/contributing.md
@@ -0,0 +1,29 @@
+# Contributing guide
+
+Want to contribute to Clipboard.js? Awesome!
+There are many ways you can contribute, see below.
+
+## Opening issues
+
+Open an issue to report bugs or to propose new features.
+
+- Reporting bugs: describe the bug as clearly as you can, including steps to reproduce, what happened and what you were expecting to happen. Also include browser version, OS and other related software's (npm, Node.js, etc) versions when applicable.
+
+- Proposing features: explain the proposed feature, what it should do, why it is useful, how users should use it. Give us as much info as possible so it will be easier to discuss, access and implement the proposed feature. When you're unsure about a certain aspect of the feature, feel free to leave it open for others to discuss and find an appropriate solution.
+
+## Proposing pull requests
+
+Pull requests are very welcome. Note that if you are going to propose drastic changes, be sure to open an issue for discussion first, to make sure that your PR will be accepted before you spend effort coding it.
+
+Fork the Clipboard.js repository, clone it locally and create a branch for your proposed bug fix or new feature. Avoid working directly on the master branch.
+
+Implement your bug fix or feature, write tests to cover it and make sure all tests are passing (run a final `npm test` to make sure everything is correct). Then commit your changes, push your bug fix/feature branch to the origin (your forked repo) and open a pull request to the upstream (the repository you originally forked)'s master branch.
+
+## Documentation
+
+Documentation is extremely important and takes a fair deal of time and effort to write and keep updated. Please submit any and all improvements you can make to the repository's docs.
+
+## Known issues
+
+If you're using npm@3 you'll probably face some issues related to peerDependencies.
+https://github.com/npm/npm/issues/9204
diff --git a/node_modules/clipboard/demo/constructor-node.html b/node_modules/clipboard/demo/constructor-node.html
new file mode 100644
index 0000000..2780ebc
--- /dev/null
+++ b/node_modules/clipboard/demo/constructor-node.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <title>constructor-node</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1" />
+  </head>
+  <body>
+    <!-- 1. Define some markup -->
+    <div id="btn" data-clipboard-text="1">
+      <span>Copy</span>
+    </div>
+
+    <!-- 2. Include library -->
+    <script src="../dist/clipboard.min.js"></script>
+
+    <!-- 3. Instantiate clipboard by passing a HTML element -->
+    <script>
+      var btn = document.getElementById('btn');
+      var clipboard = new ClipboardJS(btn);
+
+      clipboard.on('success', function (e) {
+        console.info('Action:', e.action);
+        console.info('Text:', e.text);
+        console.info('Trigger:', e.trigger);
+      });
+
+      clipboard.on('error', function (e) {
+        console.info('Action:', e.action);
+        console.info('Text:', e.text);
+        console.info('Trigger:', e.trigger);
+      });
+    </script>
+  </body>
+</html>
diff --git a/node_modules/clipboard/demo/constructor-nodelist.html b/node_modules/clipboard/demo/constructor-nodelist.html
new file mode 100644
index 0000000..31dd419
--- /dev/null
+++ b/node_modules/clipboard/demo/constructor-nodelist.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <title>constructor-nodelist</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1" />
+  </head>
+  <body>
+    <!-- 1. Define some markup -->
+    <button data-clipboard-text="1">Copy</button>
+    <button data-clipboard-text="2">Copy</button>
+    <button data-clipboard-text="3">Copy</button>
+
+    <!-- 2. Include library -->
+    <script src="../dist/clipboard.min.js"></script>
+
+    <!-- 3. Instantiate clipboard by passing a list of HTML elements -->
+    <script>
+      var btns = document.querySelectorAll('button');
+      var clipboard = new ClipboardJS(btns);
+
+      clipboard.on('success', function (e) {
+        console.info('Action:', e.action);
+        console.info('Text:', e.text);
+        console.info('Trigger:', e.trigger);
+      });
+
+      clipboard.on('error', function (e) {
+        console.info('Action:', e.action);
+        console.info('Text:', e.text);
+        console.info('Trigger:', e.trigger);
+      });
+    </script>
+  </body>
+</html>
diff --git a/node_modules/clipboard/demo/constructor-selector.html b/node_modules/clipboard/demo/constructor-selector.html
new file mode 100644
index 0000000..33e3d56
--- /dev/null
+++ b/node_modules/clipboard/demo/constructor-selector.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <title>constructor-selector</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1" />
+  </head>
+  <body>
+    <!-- 1. Define some markup -->
+    <button class="btn" data-clipboard-text="1">Copy</button>
+    <button class="btn" data-clipboard-text="2">Copy</button>
+    <button class="btn" data-clipboard-text="3">Copy</button>
+
+    <!-- 2. Include library -->
+    <script src="../dist/clipboard.min.js"></script>
+
+    <!-- 3. Instantiate clipboard by passing a string selector -->
+    <script>
+      var clipboard = new ClipboardJS('.btn');
+
+      clipboard.on('success', function (e) {
+        console.info('Action:', e.action);
+        console.info('Text:', e.text);
+        console.info('Trigger:', e.trigger);
+      });
+
+      clipboard.on('error', function (e) {
+        console.info('Action:', e.action);
+        console.info('Text:', e.text);
+        console.info('Trigger:', e.trigger);
+      });
+    </script>
+  </body>
+</html>
diff --git a/node_modules/clipboard/demo/function-target.html b/node_modules/clipboard/demo/function-target.html
new file mode 100644
index 0000000..74b7460
--- /dev/null
+++ b/node_modules/clipboard/demo/function-target.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <title>function-target</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1" />
+  </head>
+  <body>
+    <!-- 1. Define some markup -->
+    <button class="btn">Copy</button>
+    <div>hello</div>
+
+    <!-- 2. Include library -->
+    <script src="../dist/clipboard.min.js"></script>
+
+    <!-- 3. Instantiate clipboard -->
+    <script>
+      var clipboard = new ClipboardJS('.btn', {
+        target: function () {
+          return document.querySelector('div');
+        },
+      });
+
+      clipboard.on('success', function (e) {
+        console.info('Action:', e.action);
+        console.info('Text:', e.text);
+        console.info('Trigger:', e.trigger);
+      });
+
+      clipboard.on('error', function (e) {
+        console.info('Action:', e.action);
+        console.info('Text:', e.text);
+        console.info('Trigger:', e.trigger);
+      });
+    </script>
+  </body>
+</html>
diff --git a/node_modules/clipboard/demo/function-text.html b/node_modules/clipboard/demo/function-text.html
new file mode 100644
index 0000000..d7b00a5
--- /dev/null
+++ b/node_modules/clipboard/demo/function-text.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <title>function-text</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1" />
+  </head>
+  <body>
+    <!-- 1. Define some markup -->
+    <button class="btn">Copy</button>
+
+    <!-- 2. Include library -->
+    <script src="../dist/clipboard.min.js"></script>
+
+    <!-- 3. Instantiate clipboard -->
+    <script>
+      var clipboard = new ClipboardJS('.btn', {
+        text: function () {
+          return 'to be or not to be';
+        },
+      });
+
+      clipboard.on('success', function (e) {
+        console.info('Action:', e.action);
+        console.info('Text:', e.text);
+        console.info('Trigger:', e.trigger);
+      });
+
+      clipboard.on('error', function (e) {
+        console.info('Action:', e.action);
+        console.info('Text:', e.text);
+        console.info('Trigger:', e.trigger);
+      });
+    </script>
+  </body>
+</html>
diff --git a/node_modules/clipboard/demo/target-div.html b/node_modules/clipboard/demo/target-div.html
new file mode 100644
index 0000000..61a039f
--- /dev/null
+++ b/node_modules/clipboard/demo/target-div.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <title>target-div</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1" />
+  </head>
+  <body>
+    <!-- 1. Define some markup -->
+    <div>hello</div>
+    <button
+      class="btn"
+      data-clipboard-action="copy"
+      data-clipboard-target="div"
+    >
+      Copy
+    </button>
+
+    <!-- 2. Include library -->
+    <script src="../dist/clipboard.min.js"></script>
+
+    <!-- 3. Instantiate clipboard -->
+    <script>
+      var clipboard = new ClipboardJS('.btn');
+
+      clipboard.on('success', function (e) {
+        console.info('Action:', e.action);
+        console.info('Text:', e.text);
+        console.info('Trigger:', e.trigger);
+      });
+
+      clipboard.on('error', function (e) {
+        console.info('Action:', e.action);
+        console.info('Text:', e.text);
+        console.info('Trigger:', e.trigger);
+      });
+    </script>
+  </body>
+</html>
diff --git a/node_modules/clipboard/demo/target-input-number.html b/node_modules/clipboard/demo/target-input-number.html
new file mode 100644
index 0000000..c537384
--- /dev/null
+++ b/node_modules/clipboard/demo/target-input-number.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <title>target-input-number</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1" />
+  </head>
+  <body>
+    <!-- 1. Define some markup -->
+    <input id="foo" type="number" value="0" />
+    <button
+      class="btn"
+      data-clipboard-action="copy"
+      data-clipboard-target="#foo"
+    >
+      Copy
+    </button>
+
+    <!-- 2. Include library -->
+    <script src="../dist/clipboard.min.js"></script>
+
+    <!-- 3. Instantiate clipboard -->
+    <script>
+      var clipboard = new ClipboardJS('.btn');
+
+      clipboard.on('success', function (e) {
+        console.info('Action:', e.action);
+        console.info('Text:', e.text);
+        console.info('Trigger:', e.trigger);
+      });
+
+      clipboard.on('error', function (e) {
+        console.log(e);
+      });
+    </script>
+  </body>
+</html>
diff --git a/node_modules/clipboard/demo/target-input.html b/node_modules/clipboard/demo/target-input.html
new file mode 100644
index 0000000..b34d26d
--- /dev/null
+++ b/node_modules/clipboard/demo/target-input.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <title>target-input</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1" />
+  </head>
+  <body>
+    <!-- 1. Define some markup -->
+    <input id="foo" type="text" value="hello" />
+    <button
+      class="btn"
+      data-clipboard-action="copy"
+      data-clipboard-target="#foo"
+    >
+      Copy
+    </button>
+
+    <!-- 2. Include library -->
+    <script src="../dist/clipboard.min.js"></script>
+
+    <!-- 3. Instantiate clipboard -->
+    <script>
+      var clipboard = new ClipboardJS('.btn');
+
+      clipboard.on('success', function (e) {
+        console.info('Action:', e.action);
+        console.info('Text:', e.text);
+        console.info('Trigger:', e.trigger);
+      });
+
+      clipboard.on('error', function (e) {
+        console.log(e);
+      });
+    </script>
+  </body>
+</html>
diff --git a/node_modules/clipboard/demo/target-programmatic-copy.html b/node_modules/clipboard/demo/target-programmatic-copy.html
new file mode 100644
index 0000000..0f00ded
--- /dev/null
+++ b/node_modules/clipboard/demo/target-programmatic-copy.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <title>target-programmatic-copy</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1" />
+  </head>
+  <body>
+    <!-- 1. Define some markup -->
+    <textarea id="bar">hello</textarea>
+    <button id="btn">
+      Copy
+    </button>
+
+    <!-- 2. Include library -->
+    <script src="../dist/clipboard.min.js"></script>
+
+    <!-- 3. Instantiate clipboard -->
+    <script>
+      var btn = document.querySelector('#btn');
+
+      btn.addEventListener('click', () => {
+        const textCopied = ClipboardJS.copy(document.querySelector('#bar'));
+        console.log('copied!', textCopied);
+      })
+    </script>
+  </body>
+</html>
diff --git a/node_modules/clipboard/demo/target-programmatic-cut.html b/node_modules/clipboard/demo/target-programmatic-cut.html
new file mode 100644
index 0000000..3b5e9f0
--- /dev/null
+++ b/node_modules/clipboard/demo/target-programmatic-cut.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <title>target-programmatic-cut</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1" />
+  </head>
+  <body>
+    <!-- 1. Define some markup -->
+    <textarea id="bar">hello</textarea>
+    <button id="btn">
+      Cut
+    </button>
+
+    <!-- 2. Include library -->
+    <script src="../dist/clipboard.min.js"></script>
+
+    <!-- 3. Instantiate clipboard -->
+    <script>
+      var btn = document.querySelector('#btn');
+
+      btn.addEventListener('click', () => {
+        const textCut = ClipboardJS.cut(document.querySelector('#bar'));
+        console.log('cut!', textCut);
+      })
+    </script>
+  </body>
+</html>
diff --git a/node_modules/clipboard/demo/target-textarea.html b/node_modules/clipboard/demo/target-textarea.html
new file mode 100644
index 0000000..0ef462b
--- /dev/null
+++ b/node_modules/clipboard/demo/target-textarea.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <title>target-textarea</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1" />
+  </head>
+  <body>
+    <!-- 1. Define some markup -->
+    <textarea id="bar">hello</textarea>
+    <button
+      class="btn"
+      data-clipboard-action="cut"
+      data-clipboard-target="#bar"
+    >
+      Cut
+    </button>
+
+    <!-- 2. Include library -->
+    <script src="../dist/clipboard.min.js"></script>
+
+    <!-- 3. Instantiate clipboard -->
+    <script>
+      var clipboard = new ClipboardJS('.btn');
+
+      clipboard.on('success', function (e) {
+        console.info('Action:', e.action);
+        console.info('Text:', e.text);
+        console.info('Trigger:', e.trigger);
+      });
+
+      clipboard.on('error', function (e) {
+        console.info('Action:', e.action);
+        console.info('Text:', e.text);
+        console.info('Trigger:', e.trigger);
+      });
+    </script>
+  </body>
+</html>
diff --git a/node_modules/clipboard/demo/text-programmatic-copy.html b/node_modules/clipboard/demo/text-programmatic-copy.html
new file mode 100644
index 0000000..7cb7ed0
--- /dev/null
+++ b/node_modules/clipboard/demo/text-programmatic-copy.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <title>text-programmatic-copy</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1" />
+  </head>
+  <body>
+    <!-- 1. Define some markup -->
+    <button id="btn">
+      Copy
+    </button>
+
+    <!-- 2. Include library -->
+    <script src="../dist/clipboard.min.js"></script>
+
+    <!-- 3. Instantiate clipboard -->
+    <script>
+      var btn = document.querySelector('#btn');
+
+      btn.addEventListener('click', () => {
+        const textCopied = ClipboardJS.copy('123');
+        console.log('copied!', textCopied);
+      })
+    </script>
+  </body>
+</html>
diff --git a/node_modules/clipboard/dist/clipboard.js b/node_modules/clipboard/dist/clipboard.js
new file mode 100644
index 0000000..aeb826f
--- /dev/null
+++ b/node_modules/clipboard/dist/clipboard.js
@@ -0,0 +1,890 @@
+/*!
+ * clipboard.js v2.0.11
+ * https://clipboardjs.com/
+ *
+ * Licensed MIT © Zeno Rocha
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else if(typeof exports === 'object')
+		exports["ClipboardJS"] = factory();
+	else
+		root["ClipboardJS"] = factory();
+})(this, function() {
+return /******/ (function() { // webpackBootstrap
+/******/ 	var __webpack_modules__ = ({
+
+/***/ 686:
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+
+// EXPORTS
+__webpack_require__.d(__webpack_exports__, {
+  "default": function() { return /* binding */ clipboard; }
+});
+
+// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js
+var tiny_emitter = __webpack_require__(279);
+var tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter);
+// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js
+var listen = __webpack_require__(370);
+var listen_default = /*#__PURE__*/__webpack_require__.n(listen);
+// EXTERNAL MODULE: ./node_modules/select/src/select.js
+var src_select = __webpack_require__(817);
+var select_default = /*#__PURE__*/__webpack_require__.n(src_select);
+;// CONCATENATED MODULE: ./src/common/command.js
+/**
+ * Executes a given operation type.
+ * @param {String} type
+ * @return {Boolean}
+ */
+function command(type) {
+  try {
+    return document.execCommand(type);
+  } catch (err) {
+    return false;
+  }
+}
+;// CONCATENATED MODULE: ./src/actions/cut.js
+
+
+/**
+ * Cut action wrapper.
+ * @param {String|HTMLElement} target
+ * @return {String}
+ */
+
+var ClipboardActionCut = function ClipboardActionCut(target) {
+  var selectedText = select_default()(target);
+  command('cut');
+  return selectedText;
+};
+
+/* harmony default export */ var actions_cut = (ClipboardActionCut);
+;// CONCATENATED MODULE: ./src/common/create-fake-element.js
+/**
+ * Creates a fake textarea element with a value.
+ * @param {String} value
+ * @return {HTMLElement}
+ */
+function createFakeElement(value) {
+  var isRTL = document.documentElement.getAttribute('dir') === 'rtl';
+  var fakeElement = document.createElement('textarea'); // Prevent zooming on iOS
+
+  fakeElement.style.fontSize = '12pt'; // Reset box model
+
+  fakeElement.style.border = '0';
+  fakeElement.style.padding = '0';
+  fakeElement.style.margin = '0'; // Move element out of screen horizontally
+
+  fakeElement.style.position = 'absolute';
+  fakeElement.style[isRTL ? 'right' : 'left'] = '-9999px'; // Move element to the same position vertically
+
+  var yPosition = window.pageYOffset || document.documentElement.scrollTop;
+  fakeElement.style.top = "".concat(yPosition, "px");
+  fakeElement.setAttribute('readonly', '');
+  fakeElement.value = value;
+  return fakeElement;
+}
+;// CONCATENATED MODULE: ./src/actions/copy.js
+
+
+
+/**
+ * Create fake copy action wrapper using a fake element.
+ * @param {String} target
+ * @param {Object} options
+ * @return {String}
+ */
+
+var fakeCopyAction = function fakeCopyAction(value, options) {
+  var fakeElement = createFakeElement(value);
+  options.container.appendChild(fakeElement);
+  var selectedText = select_default()(fakeElement);
+  command('copy');
+  fakeElement.remove();
+  return selectedText;
+};
+/**
+ * Copy action wrapper.
+ * @param {String|HTMLElement} target
+ * @param {Object} options
+ * @return {String}
+ */
+
+
+var ClipboardActionCopy = function ClipboardActionCopy(target) {
+  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
+    container: document.body
+  };
+  var selectedText = '';
+
+  if (typeof target === 'string') {
+    selectedText = fakeCopyAction(target, options);
+  } else if (target instanceof HTMLInputElement && !['text', 'search', 'url', 'tel', 'password'].includes(target === null || target === void 0 ? void 0 : target.type)) {
+    // If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange
+    selectedText = fakeCopyAction(target.value, options);
+  } else {
+    selectedText = select_default()(target);
+    command('copy');
+  }
+
+  return selectedText;
+};
+
+/* harmony default export */ var actions_copy = (ClipboardActionCopy);
+;// CONCATENATED MODULE: ./src/actions/default.js
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+
+
+/**
+ * Inner function which performs selection from either `text` or `target`
+ * properties and then executes copy or cut operations.
+ * @param {Object} options
+ */
+
+var ClipboardActionDefault = function ClipboardActionDefault() {
+  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+  // Defines base properties passed from constructor.
+  var _options$action = options.action,
+      action = _options$action === void 0 ? 'copy' : _options$action,
+      container = options.container,
+      target = options.target,
+      text = options.text; // Sets the `action` to be performed which can be either 'copy' or 'cut'.
+
+  if (action !== 'copy' && action !== 'cut') {
+    throw new Error('Invalid "action" value, use either "copy" or "cut"');
+  } // Sets the `target` property using an element that will be have its content copied.
+
+
+  if (target !== undefined) {
+    if (target && _typeof(target) === 'object' && target.nodeType === 1) {
+      if (action === 'copy' && target.hasAttribute('disabled')) {
+        throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');
+      }
+
+      if (action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {
+        throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');
+      }
+    } else {
+      throw new Error('Invalid "target" value, use a valid Element');
+    }
+  } // Define selection strategy based on `text` property.
+
+
+  if (text) {
+    return actions_copy(text, {
+      container: container
+    });
+  } // Defines which selection strategy based on `target` property.
+
+
+  if (target) {
+    return action === 'cut' ? actions_cut(target) : actions_copy(target, {
+      container: container
+    });
+  }
+};
+
+/* harmony default export */ var actions_default = (ClipboardActionDefault);
+;// CONCATENATED MODULE: ./src/clipboard.js
+function clipboard_typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { clipboard_typeof = function _typeof(obj) { return typeof obj; }; } else { clipboard_typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return clipboard_typeof(obj); }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
+
+function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
+
+function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
+
+function _possibleConstructorReturn(self, call) { if (call && (clipboard_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
+
+function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
+
+function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
+
+function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
+
+
+
+
+
+
+/**
+ * Helper function to retrieve attribute value.
+ * @param {String} suffix
+ * @param {Element} element
+ */
+
+function getAttributeValue(suffix, element) {
+  var attribute = "data-clipboard-".concat(suffix);
+
+  if (!element.hasAttribute(attribute)) {
+    return;
+  }
+
+  return element.getAttribute(attribute);
+}
+/**
+ * Base class which takes one or more elements, adds event listeners to them,
+ * and instantiates a new `ClipboardAction` on each click.
+ */
+
+
+var Clipboard = /*#__PURE__*/function (_Emitter) {
+  _inherits(Clipboard, _Emitter);
+
+  var _super = _createSuper(Clipboard);
+
+  /**
+   * @param {String|HTMLElement|HTMLCollection|NodeList} trigger
+   * @param {Object} options
+   */
+  function Clipboard(trigger, options) {
+    var _this;
+
+    _classCallCheck(this, Clipboard);
+
+    _this = _super.call(this);
+
+    _this.resolveOptions(options);
+
+    _this.listenClick(trigger);
+
+    return _this;
+  }
+  /**
+   * Defines if attributes would be resolved using internal setter functions
+   * or custom functions that were passed in the constructor.
+   * @param {Object} options
+   */
+
+
+  _createClass(Clipboard, [{
+    key: "resolveOptions",
+    value: function resolveOptions() {
+      var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+      this.action = typeof options.action === 'function' ? options.action : this.defaultAction;
+      this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;
+      this.text = typeof options.text === 'function' ? options.text : this.defaultText;
+      this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;
+    }
+    /**
+     * Adds a click event listener to the passed trigger.
+     * @param {String|HTMLElement|HTMLCollection|NodeList} trigger
+     */
+
+  }, {
+    key: "listenClick",
+    value: function listenClick(trigger) {
+      var _this2 = this;
+
+      this.listener = listen_default()(trigger, 'click', function (e) {
+        return _this2.onClick(e);
+      });
+    }
+    /**
+     * Defines a new `ClipboardAction` on each click event.
+     * @param {Event} e
+     */
+
+  }, {
+    key: "onClick",
+    value: function onClick(e) {
+      var trigger = e.delegateTarget || e.currentTarget;
+      var action = this.action(trigger) || 'copy';
+      var text = actions_default({
+        action: action,
+        container: this.container,
+        target: this.target(trigger),
+        text: this.text(trigger)
+      }); // Fires an event based on the copy operation result.
+
+      this.emit(text ? 'success' : 'error', {
+        action: action,
+        text: text,
+        trigger: trigger,
+        clearSelection: function clearSelection() {
+          if (trigger) {
+            trigger.focus();
+          }
+
+          window.getSelection().removeAllRanges();
+        }
+      });
+    }
+    /**
+     * Default `action` lookup function.
+     * @param {Element} trigger
+     */
+
+  }, {
+    key: "defaultAction",
+    value: function defaultAction(trigger) {
+      return getAttributeValue('action', trigger);
+    }
+    /**
+     * Default `target` lookup function.
+     * @param {Element} trigger
+     */
+
+  }, {
+    key: "defaultTarget",
+    value: function defaultTarget(trigger) {
+      var selector = getAttributeValue('target', trigger);
+
+      if (selector) {
+        return document.querySelector(selector);
+      }
+    }
+    /**
+     * Allow fire programmatically a copy action
+     * @param {String|HTMLElement} target
+     * @param {Object} options
+     * @returns Text copied.
+     */
+
+  }, {
+    key: "defaultText",
+
+    /**
+     * Default `text` lookup function.
+     * @param {Element} trigger
+     */
+    value: function defaultText(trigger) {
+      return getAttributeValue('text', trigger);
+    }
+    /**
+     * Destroy lifecycle.
+     */
+
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.listener.destroy();
+    }
+  }], [{
+    key: "copy",
+    value: function copy(target) {
+      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
+        container: document.body
+      };
+      return actions_copy(target, options);
+    }
+    /**
+     * Allow fire programmatically a cut action
+     * @param {String|HTMLElement} target
+     * @returns Text cutted.
+     */
+
+  }, {
+    key: "cut",
+    value: function cut(target) {
+      return actions_cut(target);
+    }
+    /**
+     * Returns the support of the given action, or all actions if no action is
+     * given.
+     * @param {String} [action]
+     */
+
+  }, {
+    key: "isSupported",
+    value: function isSupported() {
+      var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];
+      var actions = typeof action === 'string' ? [action] : action;
+      var support = !!document.queryCommandSupported;
+      actions.forEach(function (action) {
+        support = support && !!document.queryCommandSupported(action);
+      });
+      return support;
+    }
+  }]);
+
+  return Clipboard;
+}((tiny_emitter_default()));
+
+/* harmony default export */ var clipboard = (Clipboard);
+
+/***/ }),
+
+/***/ 828:
+/***/ (function(module) {
+
+var DOCUMENT_NODE_TYPE = 9;
+
+/**
+ * A polyfill for Element.matches()
+ */
+if (typeof Element !== 'undefined' && !Element.prototype.matches) {
+    var proto = Element.prototype;
+
+    proto.matches = proto.matchesSelector ||
+                    proto.mozMatchesSelector ||
+                    proto.msMatchesSelector ||
+                    proto.oMatchesSelector ||
+                    proto.webkitMatchesSelector;
+}
+
+/**
+ * Finds the closest parent that matches a selector.
+ *
+ * @param {Element} element
+ * @param {String} selector
+ * @return {Function}
+ */
+function closest (element, selector) {
+    while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {
+        if (typeof element.matches === 'function' &&
+            element.matches(selector)) {
+          return element;
+        }
+        element = element.parentNode;
+    }
+}
+
+module.exports = closest;
+
+
+/***/ }),
+
+/***/ 438:
+/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
+
+var closest = __webpack_require__(828);
+
+/**
+ * Delegates event to a selector.
+ *
+ * @param {Element} element
+ * @param {String} selector
+ * @param {String} type
+ * @param {Function} callback
+ * @param {Boolean} useCapture
+ * @return {Object}
+ */
+function _delegate(element, selector, type, callback, useCapture) {
+    var listenerFn = listener.apply(this, arguments);
+
+    element.addEventListener(type, listenerFn, useCapture);
+
+    return {
+        destroy: function() {
+            element.removeEventListener(type, listenerFn, useCapture);
+        }
+    }
+}
+
+/**
+ * Delegates event to a selector.
+ *
+ * @param {Element|String|Array} [elements]
+ * @param {String} selector
+ * @param {String} type
+ * @param {Function} callback
+ * @param {Boolean} useCapture
+ * @return {Object}
+ */
+function delegate(elements, selector, type, callback, useCapture) {
+    // Handle the regular Element usage
+    if (typeof elements.addEventListener === 'function') {
+        return _delegate.apply(null, arguments);
+    }
+
+    // Handle Element-less usage, it defaults to global delegation
+    if (typeof type === 'function') {
+        // Use `document` as the first parameter, then apply arguments
+        // This is a short way to .unshift `arguments` without running into deoptimizations
+        return _delegate.bind(null, document).apply(null, arguments);
+    }
+
+    // Handle Selector-based usage
+    if (typeof elements === 'string') {
+        elements = document.querySelectorAll(elements);
+    }
+
+    // Handle Array-like based usage
+    return Array.prototype.map.call(elements, function (element) {
+        return _delegate(element, selector, type, callback, useCapture);
+    });
+}
+
+/**
+ * Finds closest match and invokes callback.
+ *
+ * @param {Element} element
+ * @param {String} selector
+ * @param {String} type
+ * @param {Function} callback
+ * @return {Function}
+ */
+function listener(element, selector, type, callback) {
+    return function(e) {
+        e.delegateTarget = closest(e.target, selector);
+
+        if (e.delegateTarget) {
+            callback.call(element, e);
+        }
+    }
+}
+
+module.exports = delegate;
+
+
+/***/ }),
+
+/***/ 879:
+/***/ (function(__unused_webpack_module, exports) {
+
+/**
+ * Check if argument is a HTML element.
+ *
+ * @param {Object} value
+ * @return {Boolean}
+ */
+exports.node = function(value) {
+    return value !== undefined
+        && value instanceof HTMLElement
+        && value.nodeType === 1;
+};
+
+/**
+ * Check if argument is a list of HTML elements.
+ *
+ * @param {Object} value
+ * @return {Boolean}
+ */
+exports.nodeList = function(value) {
+    var type = Object.prototype.toString.call(value);
+
+    return value !== undefined
+        && (type === '[object NodeList]' || type === '[object HTMLCollection]')
+        && ('length' in value)
+        && (value.length === 0 || exports.node(value[0]));
+};
+
+/**
+ * Check if argument is a string.
+ *
+ * @param {Object} value
+ * @return {Boolean}
+ */
+exports.string = function(value) {
+    return typeof value === 'string'
+        || value instanceof String;
+};
+
+/**
+ * Check if argument is a function.
+ *
+ * @param {Object} value
+ * @return {Boolean}
+ */
+exports.fn = function(value) {
+    var type = Object.prototype.toString.call(value);
+
+    return type === '[object Function]';
+};
+
+
+/***/ }),
+
+/***/ 370:
+/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
+
+var is = __webpack_require__(879);
+var delegate = __webpack_require__(438);
+
+/**
+ * Validates all params and calls the right
+ * listener function based on its target type.
+ *
+ * @param {String|HTMLElement|HTMLCollection|NodeList} target
+ * @param {String} type
+ * @param {Function} callback
+ * @return {Object}
+ */
+function listen(target, type, callback) {
+    if (!target && !type && !callback) {
+        throw new Error('Missing required arguments');
+    }
+
+    if (!is.string(type)) {
+        throw new TypeError('Second argument must be a String');
+    }
+
+    if (!is.fn(callback)) {
+        throw new TypeError('Third argument must be a Function');
+    }
+
+    if (is.node(target)) {
+        return listenNode(target, type, callback);
+    }
+    else if (is.nodeList(target)) {
+        return listenNodeList(target, type, callback);
+    }
+    else if (is.string(target)) {
+        return listenSelector(target, type, callback);
+    }
+    else {
+        throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');
+    }
+}
+
+/**
+ * Adds an event listener to a HTML element
+ * and returns a remove listener function.
+ *
+ * @param {HTMLElement} node
+ * @param {String} type
+ * @param {Function} callback
+ * @return {Object}
+ */
+function listenNode(node, type, callback) {
+    node.addEventListener(type, callback);
+
+    return {
+        destroy: function() {
+            node.removeEventListener(type, callback);
+        }
+    }
+}
+
+/**
+ * Add an event listener to a list of HTML elements
+ * and returns a remove listener function.
+ *
+ * @param {NodeList|HTMLCollection} nodeList
+ * @param {String} type
+ * @param {Function} callback
+ * @return {Object}
+ */
+function listenNodeList(nodeList, type, callback) {
+    Array.prototype.forEach.call(nodeList, function(node) {
+        node.addEventListener(type, callback);
+    });
+
+    return {
+        destroy: function() {
+            Array.prototype.forEach.call(nodeList, function(node) {
+                node.removeEventListener(type, callback);
+            });
+        }
+    }
+}
+
+/**
+ * Add an event listener to a selector
+ * and returns a remove listener function.
+ *
+ * @param {String} selector
+ * @param {String} type
+ * @param {Function} callback
+ * @return {Object}
+ */
+function listenSelector(selector, type, callback) {
+    return delegate(document.body, selector, type, callback);
+}
+
+module.exports = listen;
+
+
+/***/ }),
+
+/***/ 817:
+/***/ (function(module) {
+
+function select(element) {
+    var selectedText;
+
+    if (element.nodeName === 'SELECT') {
+        element.focus();
+
+        selectedText = element.value;
+    }
+    else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {
+        var isReadOnly = element.hasAttribute('readonly');
+
+        if (!isReadOnly) {
+            element.setAttribute('readonly', '');
+        }
+
+        element.select();
+        element.setSelectionRange(0, element.value.length);
+
+        if (!isReadOnly) {
+            element.removeAttribute('readonly');
+        }
+
+        selectedText = element.value;
+    }
+    else {
+        if (element.hasAttribute('contenteditable')) {
+            element.focus();
+        }
+
+        var selection = window.getSelection();
+        var range = document.createRange();
+
+        range.selectNodeContents(element);
+        selection.removeAllRanges();
+        selection.addRange(range);
+
+        selectedText = selection.toString();
+    }
+
+    return selectedText;
+}
+
+module.exports = select;
+
+
+/***/ }),
+
+/***/ 279:
+/***/ (function(module) {
+
+function E () {
+  // Keep this empty so it's easier to inherit from
+  // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)
+}
+
+E.prototype = {
+  on: function (name, callback, ctx) {
+    var e = this.e || (this.e = {});
+
+    (e[name] || (e[name] = [])).push({
+      fn: callback,
+      ctx: ctx
+    });
+
+    return this;
+  },
+
+  once: function (name, callback, ctx) {
+    var self = this;
+    function listener () {
+      self.off(name, listener);
+      callback.apply(ctx, arguments);
+    };
+
+    listener._ = callback
+    return this.on(name, listener, ctx);
+  },
+
+  emit: function (name) {
+    var data = [].slice.call(arguments, 1);
+    var evtArr = ((this.e || (this.e = {}))[name] || []).slice();
+    var i = 0;
+    var len = evtArr.length;
+
+    for (i; i < len; i++) {
+      evtArr[i].fn.apply(evtArr[i].ctx, data);
+    }
+
+    return this;
+  },
+
+  off: function (name, callback) {
+    var e = this.e || (this.e = {});
+    var evts = e[name];
+    var liveEvents = [];
+
+    if (evts && callback) {
+      for (var i = 0, len = evts.length; i < len; i++) {
+        if (evts[i].fn !== callback && evts[i].fn._ !== callback)
+          liveEvents.push(evts[i]);
+      }
+    }
+
+    // Remove event from queue to prevent memory leak
+    // Suggested by https://github.com/lazd
+    // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910
+
+    (liveEvents.length)
+      ? e[name] = liveEvents
+      : delete e[name];
+
+    return this;
+  }
+};
+
+module.exports = E;
+module.exports.TinyEmitter = E;
+
+
+/***/ })
+
+/******/ 	});
+/************************************************************************/
+/******/ 	// The module cache
+/******/ 	var __webpack_module_cache__ = {};
+/******/ 	
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+/******/ 		// Check if module is in cache
+/******/ 		if(__webpack_module_cache__[moduleId]) {
+/******/ 			return __webpack_module_cache__[moduleId].exports;
+/******/ 		}
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = __webpack_module_cache__[moduleId] = {
+/******/ 			// no module.id needed
+/******/ 			// no module.loaded needed
+/******/ 			exports: {}
+/******/ 		};
+/******/ 	
+/******/ 		// Execute the module function
+/******/ 		__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
+/******/ 	
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+/******/ 	
+/************************************************************************/
+/******/ 	/* webpack/runtime/compat get default export */
+/******/ 	!function() {
+/******/ 		// getDefaultExport function for compatibility with non-harmony modules
+/******/ 		__webpack_require__.n = function(module) {
+/******/ 			var getter = module && module.__esModule ?
+/******/ 				function() { return module['default']; } :
+/******/ 				function() { return module; };
+/******/ 			__webpack_require__.d(getter, { a: getter });
+/******/ 			return getter;
+/******/ 		};
+/******/ 	}();
+/******/ 	
+/******/ 	/* webpack/runtime/define property getters */
+/******/ 	!function() {
+/******/ 		// define getter functions for harmony exports
+/******/ 		__webpack_require__.d = function(exports, definition) {
+/******/ 			for(var key in definition) {
+/******/ 				if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
+/******/ 					Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
+/******/ 				}
+/******/ 			}
+/******/ 		};
+/******/ 	}();
+/******/ 	
+/******/ 	/* webpack/runtime/hasOwnProperty shorthand */
+/******/ 	!function() {
+/******/ 		__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
+/******/ 	}();
+/******/ 	
+/************************************************************************/
+/******/ 	// module exports must be returned from runtime so entry inlining is disabled
+/******/ 	// startup
+/******/ 	// Load entry module and return exports
+/******/ 	return __webpack_require__(686);
+/******/ })()
+.default;
+});
\ No newline at end of file
diff --git a/node_modules/clipboard/dist/clipboard.min.js b/node_modules/clipboard/dist/clipboard.min.js
new file mode 100644
index 0000000..1103f81
--- /dev/null
+++ b/node_modules/clipboard/dist/clipboard.min.js
@@ -0,0 +1,7 @@
+/*!
+ * clipboard.js v2.0.11
+ * https://clipboardjs.com/
+ *
+ * Licensed MIT © Zeno Rocha
+ */
+!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return b}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),r=n.n(e);function c(t){try{return document.execCommand(t)}catch(t){return}}var a=function(t){t=r()(t);return c("cut"),t};function o(t,e){var n,o,t=(n=t,o="rtl"===document.documentElement.getAttribute("dir"),(t=document.createElement("textarea")).style.fontSize="12pt",t.style.border="0",t.style.padding="0",t.style.margin="0",t.style.position="absolute",t.style[o?"right":"left"]="-9999px",o=window.pageYOffset||document.documentElement.scrollTop,t.style.top="".concat(o,"px"),t.setAttribute("readonly",""),t.value=n,t);return e.container.appendChild(t),e=r()(t),c("copy"),t.remove(),e}var f=function(t){var e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{container:document.body},n="";return"string"==typeof t?n=o(t,e):t instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(null==t?void 0:t.type)?n=o(t.value,e):(n=r()(t),c("copy")),n};function l(t){return(l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var s=function(){var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},e=t.action,n=void 0===e?"copy":e,o=t.container,e=t.target,t=t.text;if("copy"!==n&&"cut"!==n)throw new Error('Invalid "action" value, use either "copy" or "cut"');if(void 0!==e){if(!e||"object"!==l(e)||1!==e.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===n&&e.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===n&&(e.hasAttribute("readonly")||e.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes')}return t?f(t,{container:o}):e?"cut"===n?a(e):f(e,{container:o}):void 0};function p(t){return(p="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function d(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}function y(t,e){return(y=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t})(t,e)}function h(n){var o=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}();return function(){var t,e=v(n);return t=o?(t=v(this).constructor,Reflect.construct(e,arguments,t)):e.apply(this,arguments),e=this,!(t=t)||"object"!==p(t)&&"function"!=typeof t?function(t){if(void 0!==t)return t;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e):t}}function v(t){return(v=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)})(t)}function m(t,e){t="data-clipboard-".concat(t);if(e.hasAttribute(t))return e.getAttribute(t)}var b=function(){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&y(t,e)}(r,i());var t,e,n,o=h(r);function r(t,e){var n;return function(t){if(!(t instanceof r))throw new TypeError("Cannot call a class as a function")}(this),(n=o.call(this)).resolveOptions(e),n.listenClick(t),n}return t=r,n=[{key:"copy",value:function(t){var e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{container:document.body};return f(t,e)}},{key:"cut",value:function(t){return a(t)}},{key:"isSupported",value:function(){var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:["copy","cut"],t="string"==typeof t?[t]:t,e=!!document.queryCommandSupported;return t.forEach(function(t){e=e&&!!document.queryCommandSupported(t)}),e}}],(e=[{key:"resolveOptions",value:function(){var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof t.action?t.action:this.defaultAction,this.target="function"==typeof t.target?t.target:this.defaultTarget,this.text="function"==typeof t.text?t.text:this.defaultText,this.container="object"===p(t.container)?t.container:document.body}},{key:"listenClick",value:function(t){var e=this;this.listener=u()(t,"click",function(t){return e.onClick(t)})}},{key:"onClick",value:function(t){var e=t.delegateTarget||t.currentTarget,n=this.action(e)||"copy",t=s({action:n,container:this.container,target:this.target(e),text:this.text(e)});this.emit(t?"success":"error",{action:n,text:t,trigger:e,clearSelection:function(){e&&e.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(t){return m("action",t)}},{key:"defaultTarget",value:function(t){t=m("target",t);if(t)return document.querySelector(t)}},{key:"defaultText",value:function(t){return m("text",t)}},{key:"destroy",value:function(){this.listener.destroy()}}])&&d(t.prototype,e),n&&d(t,n),r}()},828:function(t){var e;"undefined"==typeof Element||Element.prototype.matches||((e=Element.prototype).matches=e.matchesSelector||e.mozMatchesSelector||e.msMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector),t.exports=function(t,e){for(;t&&9!==t.nodeType;){if("function"==typeof t.matches&&t.matches(e))return t;t=t.parentNode}}},438:function(t,e,n){var u=n(828);function i(t,e,n,o,r){var i=function(e,n,t,o){return function(t){t.delegateTarget=u(t.target,n),t.delegateTarget&&o.call(e,t)}}.apply(this,arguments);return t.addEventListener(n,i,r),{destroy:function(){t.removeEventListener(n,i,r)}}}t.exports=function(t,e,n,o,r){return"function"==typeof t.addEventListener?i.apply(null,arguments):"function"==typeof n?i.bind(null,document).apply(null,arguments):("string"==typeof t&&(t=document.querySelectorAll(t)),Array.prototype.map.call(t,function(t){return i(t,e,n,o,r)}))}},879:function(t,n){n.node=function(t){return void 0!==t&&t instanceof HTMLElement&&1===t.nodeType},n.nodeList=function(t){var e=Object.prototype.toString.call(t);return void 0!==t&&("[object NodeList]"===e||"[object HTMLCollection]"===e)&&"length"in t&&(0===t.length||n.node(t[0]))},n.string=function(t){return"string"==typeof t||t instanceof String},n.fn=function(t){return"[object Function]"===Object.prototype.toString.call(t)}},370:function(t,e,n){var f=n(879),l=n(438);t.exports=function(t,e,n){if(!t&&!e&&!n)throw new Error("Missing required arguments");if(!f.string(e))throw new TypeError("Second argument must be a String");if(!f.fn(n))throw new TypeError("Third argument must be a Function");if(f.node(t))return c=e,a=n,(u=t).addEventListener(c,a),{destroy:function(){u.removeEventListener(c,a)}};if(f.nodeList(t))return o=t,r=e,i=n,Array.prototype.forEach.call(o,function(t){t.addEventListener(r,i)}),{destroy:function(){Array.prototype.forEach.call(o,function(t){t.removeEventListener(r,i)})}};if(f.string(t))return t=t,e=e,n=n,l(document.body,t,e,n);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList");var o,r,i,u,c,a}},817:function(t){t.exports=function(t){var e,n="SELECT"===t.nodeName?(t.focus(),t.value):"INPUT"===t.nodeName||"TEXTAREA"===t.nodeName?((e=t.hasAttribute("readonly"))||t.setAttribute("readonly",""),t.select(),t.setSelectionRange(0,t.value.length),e||t.removeAttribute("readonly"),t.value):(t.hasAttribute("contenteditable")&&t.focus(),n=window.getSelection(),(e=document.createRange()).selectNodeContents(t),n.removeAllRanges(),n.addRange(e),n.toString());return n}},279:function(t){function e(){}e.prototype={on:function(t,e,n){var o=this.e||(this.e={});return(o[t]||(o[t]=[])).push({fn:e,ctx:n}),this},once:function(t,e,n){var o=this;function r(){o.off(t,r),e.apply(n,arguments)}return r._=e,this.on(t,r,n)},emit:function(t){for(var e=[].slice.call(arguments,1),n=((this.e||(this.e={}))[t]||[]).slice(),o=0,r=n.length;o<r;o++)n[o].fn.apply(n[o].ctx,e);return this},off:function(t,e){var n=this.e||(this.e={}),o=n[t],r=[];if(o&&e)for(var i=0,u=o.length;i<u;i++)o[i].fn!==e&&o[i].fn._!==e&&r.push(o[i]);return r.length?n[t]=r:delete n[t],this}},t.exports=e,t.exports.TinyEmitter=e}},r={},o.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return o.d(e,{a:e}),e},o.d=function(t,e){for(var n in e)o.o(e,n)&&!o.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},o.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},o(686).default;function o(t){if(r[t])return r[t].exports;var e=r[t]={exports:{}};return n[t](e,e.exports,o),e.exports}var n,r});
\ No newline at end of file
diff --git a/node_modules/clipboard/karma.conf.js b/node_modules/clipboard/karma.conf.js
new file mode 100644
index 0000000..c696b07
--- /dev/null
+++ b/node_modules/clipboard/karma.conf.js
@@ -0,0 +1,36 @@
+var webpackConfig = require('./webpack.config.js');
+
+module.exports = function (karma) {
+  karma.set({
+    plugins: [
+      'karma-webpack',
+      'karma-chai',
+      'karma-sinon',
+      'karma-mocha',
+      'karma-chrome-launcher',
+    ],
+
+    frameworks: ['chai', 'sinon', 'mocha', 'webpack'],
+
+    files: [
+      { pattern: 'src/**/*.js', watched: false },
+      { pattern: 'test/**/*.js', watched: false },
+    ],
+
+    preprocessors: {
+      'src/**/*.js': ['webpack'],
+      'test/**/*.js': ['webpack'],
+    },
+
+    webpack: {
+      module: webpackConfig.module,
+      plugins: webpackConfig.plugins,
+    },
+
+    webpackMiddleware: {
+      stats: 'errors-only',
+    },
+
+    browsers: ['ChromeHeadless'],
+  });
+};
diff --git a/node_modules/clipboard/package.js b/node_modules/clipboard/package.js
new file mode 100644
index 0000000..779e77d
--- /dev/null
+++ b/node_modules/clipboard/package.js
@@ -0,0 +1,12 @@
+// Package metadata for Meteor.js.
+
+Package.describe({
+  name: 'zenorocha:clipboard',
+  summary: 'Modern copy to clipboard. No Flash. Just 3kb.',
+  version: '2.0.11',
+  git: 'https://github.com/zenorocha/clipboard.js',
+});
+
+Package.onUse(function (api) {
+  api.addFiles('dist/clipboard.js', 'client');
+});
diff --git a/node_modules/clipboard/package.json b/node_modules/clipboard/package.json
new file mode 100644
index 0000000..8efc98c
--- /dev/null
+++ b/node_modules/clipboard/package.json
@@ -0,0 +1,63 @@
+{
+  "name": "clipboard",
+  "version": "2.0.11",
+  "description": "Modern copy to clipboard. No Flash. Just 2kb",
+  "homepage": "https://clipboardjs.com",
+  "repository": "zenorocha/clipboard.js",
+  "license": "MIT",
+  "main": "dist/clipboard.js",
+  "types": "src/clipboard.d.ts",
+  "keywords": [
+    "clipboard",
+    "copy",
+    "cut"
+  ],
+  "dependencies": {
+    "good-listener": "^1.2.2",
+    "select": "^1.1.2",
+    "tiny-emitter": "^2.0.0"
+  },
+  "devDependencies": {
+    "@babel/core": "^7.12.10",
+    "@babel/preset-env": "^7.12.11",
+    "babel-loader": "^8.2.2",
+    "chai": "^4.2.0",
+    "cross-env": "^7.0.3",
+    "eslint": "^7.20.0",
+    "eslint-config-airbnb-base": "^14.2.1",
+    "eslint-config-prettier": "^7.2.0",
+    "eslint-plugin-import": "^2.22.1",
+    "eslint-plugin-prettier": "^3.3.1",
+    "husky": "^5.0.9",
+    "karma": "^6.0.0",
+    "karma-chai": "^0.1.0",
+    "karma-chrome-launcher": "^3.1.0",
+    "karma-mocha": "^2.0.1",
+    "karma-sinon": "^1.0.4",
+    "karma-webpack": "^5.0.0-alpha.5",
+    "lint-staged": "^10.5.3",
+    "mocha": "^8.2.1",
+    "prettier": "2.2.1",
+    "sinon": "^9.2.3",
+    "tsd": "^0.7.2",
+    "uglifyjs-webpack-plugin": "^2.2.0",
+    "webpack": "^5.15.0",
+    "webpack-cli": "^4.4.0"
+  },
+  "scripts": {
+    "test:types": "tsd",
+    "build": "npm run build-debug && npm run build-min",
+    "build-debug": "webpack",
+    "build-min": "cross-env NODE_ENV=production webpack",
+    "build-watch": "webpack --watch",
+    "test": "karma start --single-run",
+    "prepublish": "npm run build",
+    "lint": "eslint --ext .js src/"
+  },
+  "lint-staged": {
+    "*.{js,css,md}": [
+      "prettier --write",
+      "eslint --fix"
+    ]
+  }
+}
diff --git a/node_modules/clipboard/readme.md b/node_modules/clipboard/readme.md
new file mode 100644
index 0000000..6506470
--- /dev/null
+++ b/node_modules/clipboard/readme.md
@@ -0,0 +1,192 @@
+# clipboard.js
+
+![Build Status](https://github.com/zenorocha/clipboard.js/workflows/build/badge.svg)
+![Killing Flash](https://img.shields.io/badge/killing-flash-brightgreen.svg?style=flat)
+
+> Modern copy to clipboard. No Flash. Just 3kb gzipped.
+
+<a href="https://clipboardjs.com/"><img width="728" src="https://cloud.githubusercontent.com/assets/398893/16165747/a0f6fc46-349a-11e6-8c9b-c5fd58d9099c.png" alt="Demo"></a>
+
+## Why
+
+Copying text to the clipboard shouldn't be hard. It shouldn't require dozens of steps to configure or hundreds of KBs to load. But most of all, it shouldn't depend on Flash or any bloated framework.
+
+That's why clipboard.js exists.
+
+## Install
+
+You can get it on npm.
+
+```
+npm install clipboard --save
+```
+
+Or if you're not into package management, just [download a ZIP](https://github.com/zenorocha/clipboard.js/archive/master.zip) file.
+
+## Setup
+
+First, include the script located on the `dist` folder or load it from [a third-party CDN provider](https://github.com/zenorocha/clipboard.js/wiki/CDN-Providers).
+
+```html
+<script src="dist/clipboard.min.js"></script>
+```
+
+Now, you need to instantiate it by [passing a DOM selector](https://github.com/zenorocha/clipboard.js/blob/master/demo/constructor-selector.html#L18), [HTML element](https://github.com/zenorocha/clipboard.js/blob/master/demo/constructor-node.html#L16-L17), or [list of HTML elements](https://github.com/zenorocha/clipboard.js/blob/master/demo/constructor-nodelist.html#L18-L19).
+
+```js
+new ClipboardJS('.btn');
+```
+
+Internally, we need to fetch all elements that matches with your selector and attach event listeners for each one. But guess what? If you have hundreds of matches, this operation can consume a lot of memory.
+
+For this reason we use [event delegation](https://stackoverflow.com/questions/1687296/what-is-dom-event-delegation) which replaces multiple event listeners with just a single listener. After all, [#perfmatters](https://twitter.com/hashtag/perfmatters).
+
+# Usage
+
+We're living a _declarative renaissance_, that's why we decided to take advantage of [HTML5 data attributes](https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Using_data_attributes) for better usability.
+
+### Copy text from another element
+
+A pretty common use case is to copy content from another element. You can do that by adding a `data-clipboard-target` attribute in your trigger element.
+
+The value you include on this attribute needs to match another's element selector.
+
+<a href="https://clipboardjs.com/#example-target"><img width="473" alt="example-2" src="https://cloud.githubusercontent.com/assets/398893/9983467/a4946aaa-5fb1-11e5-9780-f09fcd7ca6c8.png"></a>
+
+```html
+<!-- Target -->
+<input id="foo" value="https://github.com/zenorocha/clipboard.js.git" />
+
+<!-- Trigger -->
+<button class="btn" data-clipboard-target="#foo">
+  <img src="assets/clippy.svg" alt="Copy to clipboard" />
+</button>
+```
+
+### Cut text from another element
+
+Additionally, you can define a `data-clipboard-action` attribute to specify if you want to either `copy` or `cut` content.
+
+If you omit this attribute, `copy` will be used by default.
+
+<a href="https://clipboardjs.com/#example-action"><img width="473" alt="example-3" src="https://cloud.githubusercontent.com/assets/398893/10000358/7df57b9c-6050-11e5-9cd1-fbc51d2fd0a7.png"></a>
+
+```html
+<!-- Target -->
+<textarea id="bar">Mussum ipsum cacilds...</textarea>
+
+<!-- Trigger -->
+<button class="btn" data-clipboard-action="cut" data-clipboard-target="#bar">
+  Cut to clipboard
+</button>
+```
+
+As you may expect, the `cut` action only works on `<input>` or `<textarea>` elements.
+
+### Copy text from attribute
+
+Truth is, you don't even need another element to copy its content from. You can just include a `data-clipboard-text` attribute in your trigger element.
+
+<a href="https://clipboardjs.com/#example-text"><img width="147" alt="example-1" src="https://cloud.githubusercontent.com/assets/398893/10000347/6e16cf8c-6050-11e5-9883-1c5681f9ec45.png"></a>
+
+```html
+<!-- Trigger -->
+<button
+  class="btn"
+  data-clipboard-text="Just because you can doesn't mean you should — clipboard.js"
+>
+  Copy to clipboard
+</button>
+```
+
+## Events
+
+There are cases where you'd like to show some user feedback or capture what has been selected after a copy/cut operation.
+
+That's why we fire custom events such as `success` and `error` for you to listen and implement your custom logic.
+
+```js
+var clipboard = new ClipboardJS('.btn');
+
+clipboard.on('success', function (e) {
+  console.info('Action:', e.action);
+  console.info('Text:', e.text);
+  console.info('Trigger:', e.trigger);
+
+  e.clearSelection();
+});
+
+clipboard.on('error', function (e) {
+  console.error('Action:', e.action);
+  console.error('Trigger:', e.trigger);
+});
+```
+
+For a live demonstration, go to this [site](https://clipboardjs.com/) and open your console.
+
+## Tooltips
+
+Each application has different design needs, that's why clipboard.js does not include any CSS or built-in tooltip solution.
+
+The tooltips you see on the [demo site](https://clipboardjs.com/) were built using [GitHub's Primer](https://primer.style/css/components/tooltips). You may want to check that out if you're looking for a similar look and feel.
+
+## Advanced Options
+
+If you don't want to modify your HTML, there's a pretty handy imperative API for you to use. All you need to do is declare a function, do your thing, and return a value.
+
+For instance, if you want to dynamically set a `target`, you'll need to return a Node.
+
+```js
+new ClipboardJS('.btn', {
+  target: function (trigger) {
+    return trigger.nextElementSibling;
+  },
+});
+```
+
+If you want to dynamically set a `text`, you'll return a String.
+
+```js
+new ClipboardJS('.btn', {
+  text: function (trigger) {
+    return trigger.getAttribute('aria-label');
+  },
+});
+```
+
+For use in Bootstrap Modals or with any other library that changes the focus you'll want to set the focused element as the `container` value.
+
+```js
+new ClipboardJS('.btn', {
+  container: document.getElementById('modal'),
+});
+```
+
+Also, if you are working with single page apps, you may want to manage the lifecycle of the DOM more precisely. Here's how you clean up the events and objects that we create.
+
+```js
+var clipboard = new ClipboardJS('.btn');
+clipboard.destroy();
+```
+
+## Browser Support
+
+This library relies on both [Selection](https://developer.mozilla.org/en-US/docs/Web/API/Selection) and [execCommand](https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand) APIs. The first one is [supported by all browsers](https://caniuse.com/#search=selection) while the second one is supported in the following browsers.
+
+| <img src="https://clipboardjs.com/assets/images/chrome.png" width="48px" height="48px" alt="Chrome logo"> | <img src="https://clipboardjs.com/assets/images/edge.png" width="48px" height="48px" alt="Edge logo"> | <img src="https://clipboardjs.com/assets/images/firefox.png" width="48px" height="48px" alt="Firefox logo"> | <img src="https://clipboardjs.com/assets/images/ie.png" width="48px" height="48px" alt="Internet Explorer logo"> | <img src="https://clipboardjs.com/assets/images/opera.png" width="48px" height="48px" alt="Opera logo"> | <img src="https://clipboardjs.com/assets/images/safari.png" width="48px" height="48px" alt="Safari logo"> |
+| :-------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------: |
+|                                                   42+ ✔                                                   |                                                 12+ ✔                                                 |                                                    41+ ✔                                                    |                                                       9+ ✔                                                       |                                                  29+ ✔                                                  |                                                   10+ ✔                                                   |
+
+The good news is that clipboard.js gracefully degrades if you need to support older browsers. All you have to do is show a tooltip saying `Copied!` when `success` event is called and `Press Ctrl+C to copy` when `error` event is called because the text is already selected.
+
+You can also check if clipboard.js is supported or not by running `ClipboardJS.isSupported()`, that way you can hide copy/cut buttons from the UI.
+
+## Bonus
+
+A browser extension that adds a "copy to clipboard" button to every code block on _GitHub, MDN, Gist, StackOverflow, StackExchange, npm, and even Medium._
+
+Install for [Chrome](https://chrome.google.com/webstore/detail/codecopy/fkbfebkcoelajmhanocgppanfoojcdmg) and [Firefox](https://addons.mozilla.org/en-US/firefox/addon/codecopy/).
+
+## License
+
+[MIT License](https://zenorocha.mit-license.org/) © Zeno Rocha
diff --git a/node_modules/clipboard/src/actions/copy.js b/node_modules/clipboard/src/actions/copy.js
new file mode 100644
index 0000000..fa25651
--- /dev/null
+++ b/node_modules/clipboard/src/actions/copy.js
@@ -0,0 +1,47 @@
+import select from 'select';
+import command from '../common/command';
+import createFakeElement from '../common/create-fake-element';
+
+/**
+ * Create fake copy action wrapper using a fake element.
+ * @param {String} target
+ * @param {Object} options
+ * @return {String}
+ */
+const fakeCopyAction = (value, options) => {
+  const fakeElement = createFakeElement(value);
+  options.container.appendChild(fakeElement);
+  const selectedText = select(fakeElement);
+  command('copy');
+  fakeElement.remove();
+
+  return selectedText;
+};
+
+/**
+ * Copy action wrapper.
+ * @param {String|HTMLElement} target
+ * @param {Object} options
+ * @return {String}
+ */
+const ClipboardActionCopy = (
+  target,
+  options = { container: document.body }
+) => {
+  let selectedText = '';
+  if (typeof target === 'string') {
+    selectedText = fakeCopyAction(target, options);
+  } else if (
+    target instanceof HTMLInputElement &&
+    !['text', 'search', 'url', 'tel', 'password'].includes(target?.type)
+  ) {
+    // If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange
+    selectedText = fakeCopyAction(target.value, options);
+  } else {
+    selectedText = select(target);
+    command('copy');
+  }
+  return selectedText;
+};
+
+export default ClipboardActionCopy;
diff --git a/node_modules/clipboard/src/actions/cut.js b/node_modules/clipboard/src/actions/cut.js
new file mode 100644
index 0000000..537ce48
--- /dev/null
+++ b/node_modules/clipboard/src/actions/cut.js
@@ -0,0 +1,15 @@
+import select from 'select';
+import command from '../common/command';
+
+/**
+ * Cut action wrapper.
+ * @param {String|HTMLElement} target
+ * @return {String}
+ */
+const ClipboardActionCut = (target) => {
+  const selectedText = select(target);
+  command('cut');
+  return selectedText;
+};
+
+export default ClipboardActionCut;
diff --git a/node_modules/clipboard/src/actions/default.js b/node_modules/clipboard/src/actions/default.js
new file mode 100644
index 0000000..d1af8e5
--- /dev/null
+++ b/node_modules/clipboard/src/actions/default.js
@@ -0,0 +1,53 @@
+import ClipboardActionCut from './cut';
+import ClipboardActionCopy from './copy';
+
+/**
+ * Inner function which performs selection from either `text` or `target`
+ * properties and then executes copy or cut operations.
+ * @param {Object} options
+ */
+const ClipboardActionDefault = (options = {}) => {
+  // Defines base properties passed from constructor.
+  const { action = 'copy', container, target, text } = options;
+
+  // Sets the `action` to be performed which can be either 'copy' or 'cut'.
+  if (action !== 'copy' && action !== 'cut') {
+    throw new Error('Invalid "action" value, use either "copy" or "cut"');
+  }
+
+  // Sets the `target` property using an element that will be have its content copied.
+  if (target !== undefined) {
+    if (target && typeof target === 'object' && target.nodeType === 1) {
+      if (action === 'copy' && target.hasAttribute('disabled')) {
+        throw new Error(
+          'Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute'
+        );
+      }
+
+      if (
+        action === 'cut' &&
+        (target.hasAttribute('readonly') || target.hasAttribute('disabled'))
+      ) {
+        throw new Error(
+          'Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes'
+        );
+      }
+    } else {
+      throw new Error('Invalid "target" value, use a valid Element');
+    }
+  }
+
+  // Define selection strategy based on `text` property.
+  if (text) {
+    return ClipboardActionCopy(text, { container });
+  }
+
+  // Defines which selection strategy based on `target` property.
+  if (target) {
+    return action === 'cut'
+      ? ClipboardActionCut(target)
+      : ClipboardActionCopy(target, { container });
+  }
+};
+
+export default ClipboardActionDefault;
diff --git a/node_modules/clipboard/src/clipboard.d.ts b/node_modules/clipboard/src/clipboard.d.ts
new file mode 100644
index 0000000..aeb3fe8
--- /dev/null
+++ b/node_modules/clipboard/src/clipboard.d.ts
@@ -0,0 +1,91 @@
+/// <reference lib="dom"/>
+
+type Action = 'cut' | 'copy';
+type Response = 'success' | 'error';
+type CopyActionOptions = {
+  container?: Element;
+};
+
+/**
+ * Base class which takes one or more elements, adds event listeners to them,
+ * and instantiates a new `ClipboardAction` on each click.
+ */
+declare class ClipboardJS {
+  constructor(
+    selector: string | Element | NodeListOf<Element>,
+    options?: ClipboardJS.Options
+  );
+
+  /**
+   * Subscribes to events that indicate the result of a copy/cut operation.
+   * @param type Event type ('success' or 'error').
+   * @param handler Callback function.
+   */
+  on(type: Response, handler: (e: ClipboardJS.Event) => void): this;
+
+  on(type: string, handler: (...args: any[]) => void): this;
+
+  /**
+   * Clears all event bindings.
+   */
+  destroy(): void;
+
+  /**
+   * Checks if clipboard.js is supported
+   */
+  static isSupported(): boolean;
+
+
+  /**
+   * Fires a copy action
+   */
+  static copy(target: string | Element, options?: CopyActionOptions): string;
+
+   /**
+   * Fires a cut action
+   */
+  static cut(target: string | Element): string;
+}
+
+declare namespace ClipboardJS {
+  interface Options {
+    /**
+     * Overwrites default command ('cut' or 'copy').
+     * @param elem Current element
+     */
+    action?(elem: Element): Action;
+
+    /**
+     * Overwrites default target input element.
+     * @param elem Current element
+     * @returns <input> element to use.
+     */
+    target?(elem: Element): Element;
+
+    /**
+     * Returns the explicit text to copy.
+     * @param elem Current element
+     * @returns Text to be copied.
+     */
+    text?(elem: Element): string;
+
+    /**
+     * For use in Bootstrap Modals or with any
+     * other library that changes the focus
+     * you'll want to set the focused element
+     * as the container value.
+     */
+    container?: Element;
+  }
+
+  interface Event {
+    action: string;
+    text: string;
+    trigger: Element;
+    clearSelection(): void;
+  }
+}
+
+export = ClipboardJS;
+
+export as namespace ClipboardJS;
diff --git a/node_modules/clipboard/src/clipboard.js b/node_modules/clipboard/src/clipboard.js
new file mode 100644
index 0000000..ee5fe56
--- /dev/null
+++ b/node_modules/clipboard/src/clipboard.js
@@ -0,0 +1,165 @@
+import Emitter from 'tiny-emitter';
+import listen from 'good-listener';
+import ClipboardActionDefault from './actions/default';
+import ClipboardActionCut from './actions/cut';
+import ClipboardActionCopy from './actions/copy';
+
+/**
+ * Helper function to retrieve attribute value.
+ * @param {String} suffix
+ * @param {Element} element
+ */
+function getAttributeValue(suffix, element) {
+  const attribute = `data-clipboard-${suffix}`;
+
+  if (!element.hasAttribute(attribute)) {
+    return;
+  }
+
+  return element.getAttribute(attribute);
+}
+
+/**
+ * Base class which takes one or more elements, adds event listeners to them,
+ * and instantiates a new `ClipboardAction` on each click.
+ */
+class Clipboard extends Emitter {
+  /**
+   * @param {String|HTMLElement|HTMLCollection|NodeList} trigger
+   * @param {Object} options
+   */
+  constructor(trigger, options) {
+    super();
+
+    this.resolveOptions(options);
+    this.listenClick(trigger);
+  }
+
+  /**
+   * Defines if attributes would be resolved using internal setter functions
+   * or custom functions that were passed in the constructor.
+   * @param {Object} options
+   */
+  resolveOptions(options = {}) {
+    this.action =
+      typeof options.action === 'function'
+        ? options.action
+        : this.defaultAction;
+    this.target =
+      typeof options.target === 'function'
+        ? options.target
+        : this.defaultTarget;
+    this.text =
+      typeof options.text === 'function' ? options.text : this.defaultText;
+    this.container =
+      typeof options.container === 'object' ? options.container : document.body;
+  }
+
+  /**
+   * Adds a click event listener to the passed trigger.
+   * @param {String|HTMLElement|HTMLCollection|NodeList} trigger
+   */
+  listenClick(trigger) {
+    this.listener = listen(trigger, 'click', (e) => this.onClick(e));
+  }
+
+  /**
+   * Defines a new `ClipboardAction` on each click event.
+   * @param {Event} e
+   */
+  onClick(e) {
+    const trigger = e.delegateTarget || e.currentTarget;
+    const action = this.action(trigger) || 'copy';
+    const text = ClipboardActionDefault({
+      action,
+      container: this.container,
+      target: this.target(trigger),
+      text: this.text(trigger),
+    });
+
+    // Fires an event based on the copy operation result.
+    this.emit(text ? 'success' : 'error', {
+      action,
+      text,
+      trigger,
+      clearSelection() {
+        if (trigger) {
+          trigger.focus();
+        }
+        window.getSelection().removeAllRanges();
+      },
+    });
+  }
+
+  /**
+   * Default `action` lookup function.
+   * @param {Element} trigger
+   */
+  defaultAction(trigger) {
+    return getAttributeValue('action', trigger);
+  }
+
+  /**
+   * Default `target` lookup function.
+   * @param {Element} trigger
+   */
+  defaultTarget(trigger) {
+    const selector = getAttributeValue('target', trigger);
+
+    if (selector) {
+      return document.querySelector(selector);
+    }
+  }
+
+  /**
+   * Allow fire programmatically a copy action
+   * @param {String|HTMLElement} target
+   * @param {Object} options
+   * @returns Text copied.
+   */
+  static copy(target, options = { container: document.body }) {
+    return ClipboardActionCopy(target, options);
+  }
+
+  /**
+   * Allow fire programmatically a cut action
+   * @param {String|HTMLElement} target
+   * @returns Text cutted.
+   */
+  static cut(target) {
+    return ClipboardActionCut(target);
+  }
+
+  /**
+   * Returns the support of the given action, or all actions if no action is
+   * given.
+   * @param {String} [action]
+   */
+  static isSupported(action = ['copy', 'cut']) {
+    const actions = typeof action === 'string' ? [action] : action;
+    let support = !!document.queryCommandSupported;
+
+    actions.forEach((action) => {
+      support = support && !!document.queryCommandSupported(action);
+    });
+
+    return support;
+  }
+
+  /**
+   * Default `text` lookup function.
+   * @param {Element} trigger
+   */
+  defaultText(trigger) {
+    return getAttributeValue('text', trigger);
+  }
+
+  /**
+   * Destroy lifecycle.
+   */
+  destroy() {
+    this.listener.destroy();
+  }
+}
+
+export default Clipboard;
diff --git a/node_modules/clipboard/src/clipboard.test-d.ts b/node_modules/clipboard/src/clipboard.test-d.ts
new file mode 100644
index 0000000..dceb32e
--- /dev/null
+++ b/node_modules/clipboard/src/clipboard.test-d.ts
@@ -0,0 +1,4 @@
+import { expectType } from 'tsd';
+import * as Clipboard from './clipboard';
+
+expectType<Clipboard>(new Clipboard('.btn'));
diff --git a/node_modules/clipboard/src/common/command.js b/node_modules/clipboard/src/common/command.js
new file mode 100644
index 0000000..5980cb4
--- /dev/null
+++ b/node_modules/clipboard/src/common/command.js
@@ -0,0 +1,12 @@
+/**
+ * Executes a given operation type.
+ * @param {String} type
+ * @return {Boolean}
+ */
+export default function command(type) {
+  try {
+    return document.execCommand(type);
+  } catch (err) {
+    return false;
+  }
+}
diff --git a/node_modules/clipboard/src/common/create-fake-element.js b/node_modules/clipboard/src/common/create-fake-element.js
new file mode 100644
index 0000000..aa8db8d
--- /dev/null
+++ b/node_modules/clipboard/src/common/create-fake-element.js
@@ -0,0 +1,26 @@
+/**
+ * Creates a fake textarea element with a value.
+ * @param {String} value
+ * @return {HTMLElement}
+ */
+export default function createFakeElement(value) {
+  const isRTL = document.documentElement.getAttribute('dir') === 'rtl';
+  const fakeElement = document.createElement('textarea');
+  // Prevent zooming on iOS
+  fakeElement.style.fontSize = '12pt';
+  // Reset box model
+  fakeElement.style.border = '0';
+  fakeElement.style.padding = '0';
+  fakeElement.style.margin = '0';
+  // Move element out of screen horizontally
+  fakeElement.style.position = 'absolute';
+  fakeElement.style[isRTL ? 'right' : 'left'] = '-9999px';
+  // Move element to the same position vertically
+  let yPosition = window.pageYOffset || document.documentElement.scrollTop;
+  fakeElement.style.top = `${yPosition}px`;
+
+  fakeElement.setAttribute('readonly', '');
+  fakeElement.value = value;
+
+  return fakeElement;
+}
diff --git a/node_modules/clipboard/test/actions/copy.js b/node_modules/clipboard/test/actions/copy.js
new file mode 100644
index 0000000..6c13b5d
--- /dev/null
+++ b/node_modules/clipboard/test/actions/copy.js
@@ -0,0 +1,69 @@
+import ClipboardActionCopy from '../../src/actions/copy';
+
+describe('ClipboardActionCopy', () => {
+  before(() => {
+    global.input = document.createElement('input');
+    global.input.setAttribute('id', 'input');
+    global.input.setAttribute('value', 'abc');
+    document.body.appendChild(global.input);
+
+    global.paragraph = document.createElement('p');
+    global.paragraph.setAttribute('id', 'paragraph');
+    global.paragraph.textContent = 'abc';
+    document.body.appendChild(global.paragraph);
+  });
+
+  after(() => {
+    document.body.innerHTML = '';
+  });
+
+  describe('#selectText', () => {
+    it('should select its value based on input target', () => {
+      const selectedText = ClipboardActionCopy(
+        document.querySelector('#input'),
+        {
+          container: document.body,
+        }
+      );
+
+      assert.equal(selectedText, document.querySelector('#input').value);
+    });
+
+    it('should select its value based on element target', () => {
+      const selectedText = ClipboardActionCopy(
+        document.querySelector('#paragraph'),
+        {
+          container: document.body,
+        }
+      );
+
+      assert.equal(
+        selectedText,
+        document.querySelector('#paragraph').textContent
+      );
+    });
+
+    it('should select its value based on text', () => {
+      const text = 'abc';
+      const selectedText = ClipboardActionCopy(text, {
+        container: document.body,
+      });
+
+      assert.equal(selectedText, text);
+    });
+
+    it('should select its value in a input number based on text', () => {
+      const value = 1;
+      document.querySelector('#input').setAttribute('type', 'number');
+      document.querySelector('#input').setAttribute('value', value);
+      const selectedText = ClipboardActionCopy(
+        document.querySelector('#input'),
+        {
+          container: document.body,
+        }
+      );
+
+      assert.equal(Number(selectedText), value);
+    });
+  });
+});
diff --git a/node_modules/clipboard/test/actions/cut.js b/node_modules/clipboard/test/actions/cut.js
new file mode 100644
index 0000000..44c1ac5
--- /dev/null
+++ b/node_modules/clipboard/test/actions/cut.js
@@ -0,0 +1,32 @@
+import ClipboardActionCut from '../../src/actions/cut';
+
+describe('ClipboardActionCut', () => {
+  before(() => {
+    global.input = document.createElement('input');
+    global.input.setAttribute('id', 'input');
+    global.input.setAttribute('value', 'abc');
+    document.body.appendChild(global.input);
+
+    global.paragraph = document.createElement('p');
+    global.paragraph.setAttribute('id', 'paragraph');
+    global.paragraph.textContent = 'abc';
+    document.body.appendChild(global.paragraph);
+  });
+
+  after(() => {
+    document.body.innerHTML = '';
+  });
+
+  describe('#selectText', () => {
+    it('should select its value', () => {
+      const selectedText = ClipboardActionCut(
+        document.querySelector('#input'),
+        {
+          container: document.body,
+        }
+      );
+
+      assert.equal(selectedText, document.querySelector('#input').value);
+    });
+  });
+});
diff --git a/node_modules/clipboard/test/actions/default.js b/node_modules/clipboard/test/actions/default.js
new file mode 100644
index 0000000..8fb99cd
--- /dev/null
+++ b/node_modules/clipboard/test/actions/default.js
@@ -0,0 +1,80 @@
+import ClipboardActionDefault from '../../src/actions/default';
+
+describe('ClipboardActionDefault', () => {
+  before(() => {
+    global.input = document.createElement('input');
+    global.input.setAttribute('id', 'input');
+    global.input.setAttribute('value', 'abc');
+    document.body.appendChild(global.input);
+
+    global.paragraph = document.createElement('p');
+    global.paragraph.setAttribute('id', 'paragraph');
+    global.paragraph.textContent = 'abc';
+    document.body.appendChild(global.paragraph);
+  });
+
+  after(() => {
+    document.body.innerHTML = '';
+  });
+
+  describe('#resolveOptions', () => {
+    it('should set base properties', () => {
+      const selectedText = ClipboardActionDefault({
+        container: document.body,
+        text: 'foo',
+      });
+
+      assert.equal(selectedText, 'foo');
+    });
+  });
+
+  describe('#set action', () => {
+    it('should throw an error since "action" is invalid', (done) => {
+      try {
+        let clip = ClipboardActionDefault({
+          text: 'foo',
+          action: 'paste',
+        });
+      } catch (e) {
+        assert.equal(
+          e.message,
+          'Invalid "action" value, use either "copy" or "cut"'
+        );
+        done();
+      }
+    });
+  });
+
+  describe('#set target', () => {
+    it('should throw an error since "target" do not match any element', (done) => {
+      try {
+        let clip = ClipboardActionDefault({
+          target: document.querySelector('#foo'),
+        });
+      } catch (e) {
+        assert.equal(e.message, 'Invalid "target" value, use a valid Element');
+        done();
+      }
+    });
+  });
+
+  describe('#selectedText', () => {
+    it('should select text from editable element', () => {
+      const selectedText = ClipboardActionDefault({
+        container: document.body,
+        target: document.querySelector('#input'),
+      });
+
+      assert.equal(selectedText, 'abc');
+    });
+
+    it('should select text from non-editable element', () => {
+      const selectedText = ClipboardActionDefault({
+        container: document.body,
+        target: document.querySelector('#paragraph'),
+      });
+
+      assert.equal(selectedText, 'abc');
+    });
+  });
+});
diff --git a/node_modules/clipboard/test/clipboard.js b/node_modules/clipboard/test/clipboard.js
new file mode 100644
index 0000000..8aa1175
--- /dev/null
+++ b/node_modules/clipboard/test/clipboard.js
@@ -0,0 +1,192 @@
+import Clipboard from '../src/clipboard';
+
+describe('Clipboard', () => {
+  before(() => {
+    global.button = document.createElement('button');
+    global.button.setAttribute('class', 'btn');
+    global.button.setAttribute('data-clipboard-text', 'foo');
+    document.body.appendChild(global.button);
+
+    global.span = document.createElement('span');
+    global.span.innerHTML = 'bar';
+
+    global.button.appendChild(span);
+
+    global.event = {
+      target: global.button,
+      currentTarget: global.button,
+    };
+  });
+
+  after(() => {
+    document.body.innerHTML = '';
+  });
+
+  describe('#resolveOptions', () => {
+    before(() => {
+      global.fn = () => {};
+    });
+
+    it('should set action as a function', () => {
+      let clipboard = new Clipboard('.btn', {
+        action: global.fn,
+      });
+
+      assert.equal(global.fn, clipboard.action);
+    });
+
+    it('should set target as a function', () => {
+      let clipboard = new Clipboard('.btn', {
+        target: global.fn,
+      });
+
+      assert.equal(global.fn, clipboard.target);
+    });
+
+    it('should set text as a function', () => {
+      let clipboard = new Clipboard('.btn', {
+        text: global.fn,
+      });
+
+      assert.equal(global.fn, clipboard.text);
+    });
+
+    it('should set container as an object', () => {
+      let clipboard = new Clipboard('.btn', {
+        container: document.body,
+      });
+
+      assert.equal(document.body, clipboard.container);
+    });
+
+    it('should set container as body by default', () => {
+      let clipboard = new Clipboard('.btn');
+
+      assert.equal(document.body, clipboard.container);
+    });
+  });
+
+  describe('#listenClick', () => {
+    it('should add a click event listener to the passed selector', () => {
+      let clipboard = new Clipboard('.btn');
+      assert.isObject(clipboard.listener);
+    });
+  });
+
+  describe('#onClick', () => {
+    it('should init when called', (done) => {
+      let clipboard = new Clipboard('.btn');
+
+      clipboard.on('success', () => {
+        done();
+      });
+
+      clipboard.onClick(global.event);
+    });
+
+    it("should use an event's currentTarget when not equal to target", (done) => {
+      let clipboard = new Clipboard('.btn');
+      let bubbledEvent = {
+        target: global.span,
+        currentTarget: global.button,
+      };
+
+      clipboard.on('success', () => {
+        done();
+      });
+
+      clipboard.onClick(bubbledEvent);
+    });
+
+    it('should throw an exception when target is invalid', (done) => {
+      try {
+        const clipboard = new Clipboard('.btn', {
+          target() {
+            return null;
+          },
+        });
+
+        clipboard.onClick(global.event);
+      } catch (e) {
+        assert.equal(e.message, 'Invalid "target" value, use a valid Element');
+        done();
+      }
+    });
+  });
+
+  describe('#static isSupported', () => {
+    it('should return the support of the given action', () => {
+      assert.equal(Clipboard.isSupported('copy'), true);
+      assert.equal(Clipboard.isSupported('cut'), true);
+    });
+
+    it('should return the support of the cut and copy actions', () => {
+      assert.equal(Clipboard.isSupported(), true);
+    });
+  });
+
+  describe('#static copy', () => {
+    it('should copy in an programatic way based on text', () => {
+      assert.equal(Clipboard.copy('lorem'), 'lorem');
+    });
+
+    it('should copy in an programatic way based on target', () => {
+      assert.equal(Clipboard.copy(document.querySelector('span')), 'bar');
+    });
+  });
+
+  describe('#static cut', () => {
+    it('should cut in an programatic way based on text', () => {
+      assert.equal(Clipboard.cut(document.querySelector('span')), 'bar');
+    });
+  });
+
+  describe('#destroy', () => {
+    it('should destroy an existing instance of ClipboardActionDefault', () => {
+      let clipboard = new Clipboard('.btn');
+
+      clipboard.onClick(global.event);
+      clipboard.destroy();
+
+      assert.equal(clipboard.clipboardAction, null);
+    });
+  });
+
+  describe('#events', () => {
+    it('should fire a success event with certain properties', (done) => {
+      let clipboard = new Clipboard('.btn');
+
+      clipboard.on('success', (e) => {
+        assert.property(e, 'action');
+        assert.equal(e.action, 'copy');
+        assert.property(e, 'text');
+        assert.property(e, 'trigger');
+        assert.property(e, 'clearSelection');
+
+        done();
+      });
+
+      clipboard.onClick(global.event);
+    });
+  });
+
+  describe('#clearSelection', () => {
+    it('should clear text selection without moving focus', (done) => {
+      let clipboard = new Clipboard('.btn');
+
+      clipboard.on('success', (e) => {
+        e.clearSelection();
+
+        let selectedElem = document.activeElement;
+        let selectedText = window.getSelection().toString();
+
+        assert.equal(selectedElem, e.trigger);
+        assert.equal(selectedText, '');
+
+        done();
+      });
+
+      clipboard.onClick(global.event);
+    });
+  });
+});
diff --git a/node_modules/clipboard/test/common/command.js b/node_modules/clipboard/test/common/command.js
new file mode 100644
index 0000000..474d7c1
--- /dev/null
+++ b/node_modules/clipboard/test/common/command.js
@@ -0,0 +1,49 @@
+import select from 'select';
+import command from '../../src/common/command';
+
+describe('#command', () => {
+  before(() => {
+    global.stub = sinon.stub(document, 'execCommand');
+    global.input = document.createElement('input');
+    global.input.setAttribute('id', 'input');
+    global.input.setAttribute('value', 'abc');
+    document.body.appendChild(global.input);
+  });
+
+  after(() => {
+    global.stub.restore();
+    document.body.innerHTML = '';
+  });
+
+  it('should execute cut', (done) => {
+    global.stub.returns(true);
+    select(document.querySelector('#input'));
+
+    assert.isTrue(command('cut'));
+    done();
+  });
+
+  it('should execute copy', (done) => {
+    global.stub.returns(true);
+    select(document.querySelector('#input'));
+
+    assert.isTrue(command('copy'));
+    done();
+  });
+
+  it('should not execute copy', (done) => {
+    global.stub.returns(false);
+    select(document.querySelector('#input'));
+
+    assert.isFalse(command('copy'));
+    done();
+  });
+
+  it('should not execute cut', (done) => {
+    global.stub.returns(false);
+    select(document.querySelector('#input'));
+
+    assert.isFalse(command('cut'));
+    done();
+  });
+});
diff --git a/node_modules/clipboard/test/common/create-fake-element.js b/node_modules/clipboard/test/common/create-fake-element.js
new file mode 100644
index 0000000..98934a8
--- /dev/null
+++ b/node_modules/clipboard/test/common/create-fake-element.js
@@ -0,0 +1,13 @@
+import createFakeElement from '../../src/common/create-fake-element';
+
+describe('createFakeElement', () => {
+  it('should define a fake element and set the position right style property', (done) => {
+    // Set document direction
+    document.documentElement.setAttribute('dir', 'rtl');
+
+    const el = createFakeElement(document.body);
+
+    assert.equal(el.style.right, '-9999px');
+    done();
+  });
+});
diff --git a/node_modules/clipboard/webpack.config.js b/node_modules/clipboard/webpack.config.js
new file mode 100644
index 0000000..14dc705
--- /dev/null
+++ b/node_modules/clipboard/webpack.config.js
@@ -0,0 +1,46 @@
+const pkg = require('./package.json');
+const path = require('path');
+const webpack = require('webpack');
+const UglifyJSPlugin = require('uglifyjs-webpack-plugin');
+
+const production = process.env.NODE_ENV === 'production' || false;
+
+const banner = `clipboard.js v${pkg.version}
+https://clipboardjs.com/
+
+Licensed MIT © Zeno Rocha`;
+
+module.exports = {
+  entry: './src/clipboard.js',
+  mode: 'production',
+  target: ['web', 'es5'],
+  output: {
+    filename: production ? 'clipboard.min.js' : 'clipboard.js',
+    path: path.resolve(__dirname, 'dist'),
+    library: 'ClipboardJS',
+    globalObject: 'this',
+    libraryExport: 'default',
+    libraryTarget: 'umd',
+  },
+  module: {
+    rules: [{ test: /\.js$/, exclude: /node_modules/, loader: 'babel-loader' }],
+  },
+  optimization: {
+    minimize: production,
+    minimizer: [
+      new UglifyJSPlugin({
+        parallel: require('os').cpus().length,
+        uglifyOptions: {
+          ie8: false,
+          keep_fnames: false,
+          output: {
+            beautify: false,
+            comments: (node, { value, type }) =>
+              type == 'comment2' && value.startsWith('!'),
+          },
+        },
+      }),
+    ],
+  },
+  plugins: [new webpack.BannerPlugin({ banner })],
+};
diff --git a/node_modules/dayjs/.editorconfig b/node_modules/dayjs/.editorconfig
new file mode 100644
index 0000000..d4d73cf
--- /dev/null
+++ b/node_modules/dayjs/.editorconfig
@@ -0,0 +1,7 @@
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+insert_final_newline = true
+indent_size = 2
diff --git a/node_modules/dayjs/CHANGELOG.md b/node_modules/dayjs/CHANGELOG.md
new file mode 100644
index 0000000..1447804
--- /dev/null
+++ b/node_modules/dayjs/CHANGELOG.md
@@ -0,0 +1,919 @@
+## [1.11.10](https://github.com/iamkun/dayjs/compare/v1.11.9...v1.11.10) (2023-09-19)
+
+
+### Bug Fixes
+
+* Add Korean Day of Month with ordinal ([#2395](https://github.com/iamkun/dayjs/issues/2395)) ([dd55ee2](https://github.com/iamkun/dayjs/commit/dd55ee2aadd1009242235e47d558bbf028827896))
+* change back fa locale to the Gregorian calendar equivalent ([#2411](https://github.com/iamkun/dayjs/issues/2411)) ([95e9458](https://github.com/iamkun/dayjs/commit/95e9458b221fe35e59ee4a160a5db247313a68fb))
+* duration plugin - MILLISECONDS_A_MONTH const calculation ([#2362](https://github.com/iamkun/dayjs/issues/2362)) ([f0a0b54](https://github.com/iamkun/dayjs/commit/f0a0b546b074b3b511c2319a1ce83d412894b91f))
+* duration plugin getter get result  0 instead of undefined ([#2369](https://github.com/iamkun/dayjs/issues/2369)) ([061aa7e](https://github.com/iamkun/dayjs/commit/061aa7ed6c31696974665fc9b11a74d30841ebed))
+* fix isDayjs check logic ([#2383](https://github.com/iamkun/dayjs/issues/2383)) ([5f3f878](https://github.com/iamkun/dayjs/commit/5f3f8786c796cd432fe6bcb6966a810daea89203))
+* fix timezone plugin to get correct locale setting ([#2420](https://github.com/iamkun/dayjs/issues/2420)) ([4f45012](https://github.com/iamkun/dayjs/commit/4f4501256fa1bc72128aae1d841bbd782df86aed))
+* **locale:** add meridiem in `ar` locale ([#2418](https://github.com/iamkun/dayjs/issues/2418)) ([361be5c](https://github.com/iamkun/dayjs/commit/361be5c7c628614ee833d710acbe154a598b904d))
+* round durations to millisecond precision for ISO string ([#2367](https://github.com/iamkun/dayjs/issues/2367)) ([890a17a](https://github.com/iamkun/dayjs/commit/890a17a8d8ddd43c7c8b806e3afc7b27f3288d27))
+* sub-second precisions need to be rounded at the seconds field to avoid adding floats ([#2377](https://github.com/iamkun/dayjs/issues/2377)) ([a9d7d03](https://github.com/iamkun/dayjs/commit/a9d7d0398d22ebd4bfc3812ca0134a97606d54d9))
+* update $x logic to avoid plugin error ([#2429](https://github.com/iamkun/dayjs/issues/2429)) ([2254635](https://github.com/iamkun/dayjs/commit/22546357f30924fcff3b3ffa14fd04be21f97a5e))
+* Update Slovenian locale for relative time ([#2396](https://github.com/iamkun/dayjs/issues/2396)) ([5470a15](https://github.com/iamkun/dayjs/commit/5470a15e437fac803797363063b24f3ba3bd5299))
+* update uzbek language translation ([#2327](https://github.com/iamkun/dayjs/issues/2327)) ([0a91056](https://github.com/iamkun/dayjs/commit/0a910564d76dc7c128da8e0d85d8e11ebdb5660b))
+
+## [1.11.9](https://github.com/iamkun/dayjs/compare/v1.11.8...v1.11.9) (2023-07-01)
+
+
+### Bug Fixes
+
+* Add null to min and max plugin return type ([#2355](https://github.com/iamkun/dayjs/issues/2355)) ([62d9042](https://github.com/iamkun/dayjs/commit/62d9042eb84b78d78324694ccbeaad1679d37e68))
+* check if null passed to objectSupport parser ([#2175](https://github.com/iamkun/dayjs/issues/2175)) ([013968f](https://github.com/iamkun/dayjs/commit/013968f609c32e2269df69b4dd1feb2e8e1e035a))
+* dayjs.diff improve performance ([#2244](https://github.com/iamkun/dayjs/issues/2244)) ([33c80e1](https://github.com/iamkun/dayjs/commit/33c80e14cf14f70ceb4f54639e266cd70a3c3996))
+* dayjs(null) throws error, not return dayjs object as invalid date ([#2334](https://github.com/iamkun/dayjs/issues/2334)) ([c79e2f5](https://github.com/iamkun/dayjs/commit/c79e2f5d03eef5660b1f13385b69c0c9668d2f98))
+* objectSupport plugin causes an error when null is passed to dayjs function (closes [#2277](https://github.com/iamkun/dayjs/issues/2277)) ([#2342](https://github.com/iamkun/dayjs/issues/2342)) ([89bf31c](https://github.com/iamkun/dayjs/commit/89bf31ce0a36dcfc892029dc019d85d3654cf5fb))
+* Optimize format method ([#2313](https://github.com/iamkun/dayjs/issues/2313)) ([1fe1b1d](https://github.com/iamkun/dayjs/commit/1fe1b1d9a214d3b8c9f267b432801424a493f1c4))
+* update Duration plugin add/subtract take into account days in month ([#2337](https://github.com/iamkun/dayjs/issues/2337)) ([3b1060f](https://github.com/iamkun/dayjs/commit/3b1060f92183ab3a3c49289c2d87fbdd34c1eacc))
+* update MinMax plugin 1. ignore the 'null' in args 2. return the only one arg ([#2330](https://github.com/iamkun/dayjs/issues/2330)) ([3c2c6ee](https://github.com/iamkun/dayjs/commit/3c2c6ee4db00bbb43a7a3bb0b56bc0d0f03daddc))
+
+## [1.11.8](https://github.com/iamkun/dayjs/compare/v1.11.7...v1.11.8) (2023-06-02)
+
+
+### Bug Fixes
+
+* .format add padding to 'YYYY' ([#2231](https://github.com/iamkun/dayjs/issues/2231)) ([00c223b](https://github.com/iamkun/dayjs/commit/00c223b7e92970d07557133994fcb225a6d4c960))
+* Added .valueOf method to Duration class ([#2226](https://github.com/iamkun/dayjs/issues/2226)) ([9b4fcfd](https://github.com/iamkun/dayjs/commit/9b4fcfde35b39693894be1821b6c7222fac98657))
+* timezone type mark `date` parameter as optional ([#2222](https://github.com/iamkun/dayjs/issues/2222)) ([b87aa0e](https://github.com/iamkun/dayjs/commit/b87aa0ed9a748c478a66ef48230cd1d6350d7b8a))
+* type file first parameter date is optional in isSame(), isBefore(), isAfter() ([#2272](https://github.com/iamkun/dayjs/issues/2272)) ([4d56f3e](https://github.com/iamkun/dayjs/commit/4d56f3eb2b3770879d60f824590bf1b32f237d47))
+
+## [1.11.7](https://github.com/iamkun/dayjs/compare/v1.11.6...v1.11.7) (2022-12-06)
+
+
+### Bug Fixes
+
+* Add locale (zh-tw) meridiem ([#2149](https://github.com/iamkun/dayjs/issues/2149)) ([1e9ba76](https://github.com/iamkun/dayjs/commit/1e9ba761ff4e3f2759106dfe1aa9054d5826451c))
+* update fa locale ([#2151](https://github.com/iamkun/dayjs/issues/2151)) ([1c26732](https://github.com/iamkun/dayjs/commit/1c267321a1a01b4947e1482bac67d67ebc7c3dfa))
+
+## [1.11.6](https://github.com/iamkun/dayjs/compare/v1.11.5...v1.11.6) (2022-10-21)
+
+
+### Bug Fixes
+
+* add BigIntSupport plugin ([#2087](https://github.com/iamkun/dayjs/issues/2087)) ([f6dce48](https://github.com/iamkun/dayjs/commit/f6dce48a9e39677718b087867d9fd901d5078155))
+* Fix objectSupport collides with Duration plugin - issue [#2027](https://github.com/iamkun/dayjs/issues/2027) ([#2038](https://github.com/iamkun/dayjs/issues/2038)) ([c9370ea](https://github.com/iamkun/dayjs/commit/c9370ea96bf420439ee7eaa4146e8ed643160312))
+
+## [1.11.5](https://github.com/iamkun/dayjs/compare/v1.11.4...v1.11.5) (2022-08-12)
+
+
+### Bug Fixes
+
+* ordinal for nl not working ([#2011](https://github.com/iamkun/dayjs/issues/2011)) ([c93c85e](https://github.com/iamkun/dayjs/commit/c93c85eaa11564a1aae2d823480a417812c01bf4))
+* wrong ordinal for french locale ([#2010](https://github.com/iamkun/dayjs/issues/2010)) ([dd192a7](https://github.com/iamkun/dayjs/commit/dd192a72fc5d26ce56481e89b0c1ccf5f939be0c))
+
+## [1.11.4](https://github.com/iamkun/dayjs/compare/v1.11.3...v1.11.4) (2022-07-19)
+
+
+### Bug Fixes
+
+* correct past property in ku (kurdish) locale ([#1916](https://github.com/iamkun/dayjs/issues/1916)) ([74e82b9](https://github.com/iamkun/dayjs/commit/74e82b9da5ec8b90361fc27ac7c8b63faf354502))
+* fix French [fr] local ordinal ([#1932](https://github.com/iamkun/dayjs/issues/1932)) ([8f09834](https://github.com/iamkun/dayjs/commit/8f09834a88b8e7f8353c6e7473d4711596890a8c))
+* fix objectSupport plugin ConfigTypeMap type ([#1441](https://github.com/iamkun/dayjs/issues/1441)) ([#1990](https://github.com/iamkun/dayjs/issues/1990)) ([fd51fe4](https://github.com/iamkun/dayjs/commit/fd51fe4f7fa799d8c598343e71fa59299ec4cf93))
+* fix type error to add ordianl property in InstanceLocaleDataReturn and GlobalLocaleDataReturn types ([#1931](https://github.com/iamkun/dayjs/issues/1931)) ([526f0ae](https://github.com/iamkun/dayjs/commit/526f0ae549ffbeeb9ef1099ca23964791fc59743))
+* update locale ar-* meridiem function ([#1954](https://github.com/iamkun/dayjs/issues/1954)) ([3d31611](https://github.com/iamkun/dayjs/commit/3d316117f04362d31f4e8bd349620b8414ce5d0c))
+* zh-tw / zh-hk locale ordinal error ([#1976](https://github.com/iamkun/dayjs/issues/1976)) ([0a1bd08](https://github.com/iamkun/dayjs/commit/0a1bd08e736be7d4e378aaca280caa6543f8066d))
+
+## [1.11.3](https://github.com/iamkun/dayjs/compare/v1.11.2...v1.11.3) (2022-06-06)
+
+
+### Bug Fixes
+
+*  customParseFormat plugin to parse comma as a separator character ([#1913](https://github.com/iamkun/dayjs/issues/1913)) ([41b1405](https://github.com/iamkun/dayjs/commit/41b1405971e099431211ae6c2a100cd797da4427))
+* update Dutch [nl] locale ordinal ([#1908](https://github.com/iamkun/dayjs/issues/1908)) ([5da98f8](https://github.com/iamkun/dayjs/commit/5da98f8085d2d2847d79e38c795082703a14f24b))
+
+## [1.11.2](https://github.com/iamkun/dayjs/compare/v1.11.1...v1.11.2) (2022-05-06)
+
+
+### Bug Fixes
+
+* add OpUnitType (week) to quarterOfYear startOf/endOf types ([#1865](https://github.com/iamkun/dayjs/issues/1865)) ([400bc3e](https://github.com/iamkun/dayjs/commit/400bc3e8915e0c58e7abbfd3a1235364b1abaf3e))
+* Fix type issue with ManipulateType ([#1864](https://github.com/iamkun/dayjs/issues/1864)) ([d033dfc](https://github.com/iamkun/dayjs/commit/d033dfcfc1d2ced39b2733898e8d85ad5984c9e9))
+* fix UTC plugin .valueOf not taking DST into account  ([#1448](https://github.com/iamkun/dayjs/issues/1448)) ([27d1c50](https://github.com/iamkun/dayjs/commit/27d1c506100ae6624f258c21cc06b24768ced733))
+
+## [1.11.1](https://github.com/iamkun/dayjs/compare/v1.11.0...v1.11.1) (2022-04-15)
+
+
+### Bug Fixes
+
+* add Bengali (Bangladesh) [bn-bd] locale ([#1806](https://github.com/iamkun/dayjs/issues/1806)) ([840ed76](https://github.com/iamkun/dayjs/commit/840ed76eedc085afefc4dedd05f31d44196b63b0))
+* refactor replace deprecated String.prototype.substr() ([#1836](https://github.com/iamkun/dayjs/issues/1836)) ([627fa39](https://github.com/iamkun/dayjs/commit/627fa393e4daf83c92431162dbe18534b23fcbae))
+* Update German [de] locale, adds the abbreviations for month including a . in the end, as in September -> Sept. ([#1831](https://github.com/iamkun/dayjs/issues/1831)) ([4e2802c](https://github.com/iamkun/dayjs/commit/4e2802cc3bec2941ffb737a15fb531c90951eafe))
+* update Italian (Switzerland) [it-ch] locale relativeTime ([#1829](https://github.com/iamkun/dayjs/issues/1829)) ([8e6d11d](https://github.com/iamkun/dayjs/commit/8e6d11d053393d97bee1ba411adb2d82de1a58c4))
+* update Kurdish [ku] locale strings and formatted output contains non-standard kurdish characters ([#1848](https://github.com/iamkun/dayjs/issues/1848)) ([a597d0b](https://github.com/iamkun/dayjs/commit/a597d0b1b8dd28e626f8c59d326622088f7b51e7))
+* update locale bo [Tibetan]: corrected the orders in formats ([#1823](https://github.com/iamkun/dayjs/issues/1823)) ([e790516](https://github.com/iamkun/dayjs/commit/e79051617af6787358f6c9b5443d987b8b53a9e1))
+
+# [1.11.0](https://github.com/iamkun/dayjs/compare/v1.10.8...v1.11.0) (2022-03-14)
+
+
+### Bug Fixes
+
+* Add Kirundi (rn) locale ([#1793](https://github.com/iamkun/dayjs/issues/1793)) ([74e5247](https://github.com/iamkun/dayjs/commit/74e5247227a779fffde39bdfcd1ee19911496709))
+* add missing date shorthand D type definition ([#1752](https://github.com/iamkun/dayjs/issues/1752)) ([b045baf](https://github.com/iamkun/dayjs/commit/b045baf1646a81f7e4f446f355d02d5fb0ef4aa7))
+* Add relative time to Galician (gl) and fix ordinals ([#1800](https://github.com/iamkun/dayjs/issues/1800)) ([dcbf170](https://github.com/iamkun/dayjs/commit/dcbf1708400624addfbddbc71e0f6a9ac15fa961))
+* update German locales (de-at, de-ch) ([#1775](https://github.com/iamkun/dayjs/issues/1775)) ([f9055a7](https://github.com/iamkun/dayjs/commit/f9055a77bf3d84c575e5fcf99e21611138ba64d7))
+* update Icelandic [is] locale relativeTime config ([#1796](https://github.com/iamkun/dayjs/issues/1796)) ([76f9e17](https://github.com/iamkun/dayjs/commit/76f9e1756de7e99c01e471dab30ea074b9ec9629))
+* Update index.d.ts note ([#1716](https://github.com/iamkun/dayjs/issues/1716)) ([5a108ff](https://github.com/iamkun/dayjs/commit/5a108ff3159c53fd270ea7638f33c35c934d6457))
+* Update locale German [de] monthsShort ([#1746](https://github.com/iamkun/dayjs/issues/1746)) ([4a7b7d0](https://github.com/iamkun/dayjs/commit/4a7b7d07c885bb9338514c234dbb708e24e9863e))
+* update meridiem function to Kurdish (ku) locale ([#1725](https://github.com/iamkun/dayjs/issues/1725)) ([efd3904](https://github.com/iamkun/dayjs/commit/efd3904ff8cbf0a4fc064911dda76fc86b669f7b))
+* update updateLocal plugin typescript types ([#1692](https://github.com/iamkun/dayjs/issues/1692)) ([c7a3f73](https://github.com/iamkun/dayjs/commit/c7a3f73064dbb63b4d365b2ad4c792f075f4d8d8))
+
+
+### Features
+
+* Fallback to language only locale + support uppercase locales ([#1524](https://github.com/iamkun/dayjs/issues/1524)) ([9138dc2](https://github.com/iamkun/dayjs/commit/9138dc28206875372da4fb74c64716437cd11b95))
+
+## [1.10.8](https://github.com/iamkun/dayjs/compare/v1.10.7...v1.10.8) (2022-02-28)
+
+
+### Bug Fixes
+
+* set locale pt, pt-br correct weekdays and months ([#1697](https://github.com/iamkun/dayjs/issues/1697)) ([e019301](https://github.com/iamkun/dayjs/commit/e01930171c8235f58a114236f146086428f99569))
+
+## [1.10.7](https://github.com/iamkun/dayjs/compare/v1.10.6...v1.10.7) (2021-09-10)
+
+
+### Bug Fixes
+
+* Add  Spanish (Mexico) [es-mx] locale ([#1614](https://github.com/iamkun/dayjs/issues/1614)) ([3393f2a](https://github.com/iamkun/dayjs/commit/3393f2ad55346d55902683a2e31c6f253d96c8c2))
+* Add Arabic (Iraq) [ar-iq] locale ([#1627](https://github.com/iamkun/dayjs/issues/1627)) ([b5a1391](https://github.com/iamkun/dayjs/commit/b5a1391011b247d08863d291542db5937b23b427))
+* add format object type to type file ([#1572](https://github.com/iamkun/dayjs/issues/1572)) ([5a79cc6](https://github.com/iamkun/dayjs/commit/5a79cc6408e825d9e123629eb44fc19c996d7751))
+* duration plugin when parsing duration from ISO string, set missing components to 0 instead of NaN ([#1611](https://github.com/iamkun/dayjs/issues/1611)) ([252585b](https://github.com/iamkun/dayjs/commit/252585b4b2bd59508150e21bb994908a9d78f9b0))
+* narrow type for `add` and `subtract` ([#1576](https://github.com/iamkun/dayjs/issues/1576)) ([1686962](https://github.com/iamkun/dayjs/commit/16869621b1a42563064dbf87f80c1ebfd74c1188))
+* update customParseFormat plugin strict x X parsing ([#1571](https://github.com/iamkun/dayjs/issues/1571)) ([08adda5](https://github.com/iamkun/dayjs/commit/08adda54edbcca38601f57841921d0f87f84e49e))
+* update Lithuanian [lt] locale spelling for single month ([#1609](https://github.com/iamkun/dayjs/issues/1609)) ([255dc54](https://github.com/iamkun/dayjs/commit/255dc54d9295de135a9037ce6ca13cae4bfd2cfb))
+* Update Norwegian Bokmål [nb] local yearStart 4 ([#1608](https://github.com/iamkun/dayjs/issues/1608)) ([7a8467c](https://github.com/iamkun/dayjs/commit/7a8467c0b7d59821f7e19d4a6973bcda8e4c19b1))
+* update plugin advancedFormat `isValid` validation ([#1566](https://github.com/iamkun/dayjs/issues/1566)) ([755fc8b](https://github.com/iamkun/dayjs/commit/755fc8bb1c532eb991459f180eee81367d12016c))
+* update Sinhalese [si] locale month name ([#1475](https://github.com/iamkun/dayjs/issues/1475)) ([63de2a8](https://github.com/iamkun/dayjs/commit/63de2a8b7dcd7e68c132c85d88572d4c9d296907))
+* update utcOffset plugin type file ([#1604](https://github.com/iamkun/dayjs/issues/1604)) ([f68e4b1](https://github.com/iamkun/dayjs/commit/f68e4b1a29fc33542f74cde10ec6d9fb045ca37e))
+
+## [1.10.6](https://github.com/iamkun/dayjs/compare/v1.10.5...v1.10.6) (2021-07-06)
+
+
+### Bug Fixes
+
+* add invalid date string override ([#1465](https://github.com/iamkun/dayjs/issues/1465)) ([#1470](https://github.com/iamkun/dayjs/issues/1470)) ([06f88f4](https://github.com/iamkun/dayjs/commit/06f88f425828b1ce96b737332d25145a95a4ee9d))
+* add sv-fi Finland Swedish locale ([#1522](https://github.com/iamkun/dayjs/issues/1522)) ([8e32164](https://github.com/iamkun/dayjs/commit/8e32164855cff724642e24c37a631eb4c4d760c8))
+* customParseFormat support parsing X x timestamp ([#1567](https://github.com/iamkun/dayjs/issues/1567)) ([eb087f5](https://github.com/iamkun/dayjs/commit/eb087f52861313b8dd8a5c1b77858665ec72859e))
+* dayjs ConfigTypeMap add null & undefined ([#1560](https://github.com/iamkun/dayjs/issues/1560)) ([b5e40e6](https://github.com/iamkun/dayjs/commit/b5e40e6f16abeaea6a0facfa466d20aefaa8a444))
+* Fix DayOfYear plugin when using BadMutable plugin ([#1511](https://github.com/iamkun/dayjs/issues/1511)) ([0b0c6a3](https://github.com/iamkun/dayjs/commit/0b0c6a31ec9c0aff991b0e8dd6eed116201274cc))
+* Implement ordinal in Bulgarian translation (fixes [#1501](https://github.com/iamkun/dayjs/issues/1501)) ([#1502](https://github.com/iamkun/dayjs/issues/1502)) ([b728da5](https://github.com/iamkun/dayjs/commit/b728da5ed9ed08210004ed20ce5fcd52a92de7da))
+* more strict delimiter in REGEX_PARSE ([#1555](https://github.com/iamkun/dayjs/issues/1555)) ([bfdab5c](https://github.com/iamkun/dayjs/commit/bfdab5c0d45a5736b68e8e1b1354fc021e05f607))
+* parameter type ([#1549](https://github.com/iamkun/dayjs/issues/1549)) ([f369844](https://github.com/iamkun/dayjs/commit/f369844dd69d253c4c7cbf68150939db3db233be))
+* update customParseFormat plugin to custom two-digit year parse function ([#1421](https://github.com/iamkun/dayjs/issues/1421)) ([bb5df55](https://github.com/iamkun/dayjs/commit/bb5df55cd3975dc7638b8f4e762afa470b6620f7))
+* update names of weekdays and months in Bulgarian [bg] to lowercase ([#1438](https://github.com/iamkun/dayjs/issues/1438)) ([b246210](https://github.com/iamkun/dayjs/commit/b24621091fec9cf6704de21e4b323f6f0c4abbf1))
+* update type file `.diff` ([#1505](https://github.com/iamkun/dayjs/issues/1505)) ([6508494](https://github.com/iamkun/dayjs/commit/6508494a4e62977b4397baaeef293d1bcf3c7235))
+* update UTC plugin type file for strict parsing ([#1443](https://github.com/iamkun/dayjs/issues/1443)) ([b4f28df](https://github.com/iamkun/dayjs/commit/b4f28df219fe63202dffdbeeaec5677c4d2c9111))
+
+## [1.10.5](https://github.com/iamkun/dayjs/compare/v1.10.4...v1.10.5) (2021-05-26)
+
+
+### Bug Fixes
+
+* add meridiem in ar locales ([#1375](https://github.com/iamkun/dayjs/issues/1375)) ([319f616](https://github.com/iamkun/dayjs/commit/319f616e572a03b984013d04d1b3a18ffd5b1190))
+* Added Zulu support to customParseFormat ([#1359](https://github.com/iamkun/dayjs/issues/1359)) ([1138a3f](https://github.com/iamkun/dayjs/commit/1138a3f0a76592c6d72fb86c4399e133fa41e2ec))
+* fix Bengali [bn] locale monthsShort error ([a0e6c0c](https://github.com/iamkun/dayjs/commit/a0e6c0cf3e1828020dfa11432c6716990f6ed5e0))
+* fix missing types for ArraySupport plugin ([#1401](https://github.com/iamkun/dayjs/issues/1401)) ([b1abdc4](https://github.com/iamkun/dayjs/commit/b1abdc40ee6c9d18ff46c311a114e0755677ea6f))
+* fix Ukrainian [uk] locale ([#1463](https://github.com/iamkun/dayjs/issues/1463)) ([0fdac93](https://github.com/iamkun/dayjs/commit/0fdac93ff2531542301b76952be9b084b2e2dfa0))
+* hotfix for `Duration` types ([#1357](https://github.com/iamkun/dayjs/issues/1357)) ([855b7b3](https://github.com/iamkun/dayjs/commit/855b7b3d049a3903794f91db3419f167c00dabd2)), closes [#1354](https://github.com/iamkun/dayjs/issues/1354)
+* timezone plugin DST error ([#1352](https://github.com/iamkun/dayjs/issues/1352)) ([71bed15](https://github.com/iamkun/dayjs/commit/71bed155edf32bff24379930ac684fc783538d8f))
+* Update duration plugin change string to number ([#1394](https://github.com/iamkun/dayjs/issues/1394)) ([e1546d1](https://github.com/iamkun/dayjs/commit/e1546d1a0cdb97ae92cf11efe61d94707af6a3a3))
+* update Duration plugin to support no-argument ([#1400](https://github.com/iamkun/dayjs/issues/1400)) ([8d9a5ae](https://github.com/iamkun/dayjs/commit/8d9a5ae0749e1b4e76babd4deeaa3b1d9776c29b))
+* Update Finnish [fi] locale to set yearStart  ([#1378](https://github.com/iamkun/dayjs/issues/1378)) ([f3370bd](https://github.com/iamkun/dayjs/commit/f3370bda4e435118f714c8a7daf5c88cfc4b69ba))
+* update Russian [ru] locale meridiem and unit tests ([#1403](https://github.com/iamkun/dayjs/issues/1403)) ([f10f39d](https://github.com/iamkun/dayjs/commit/f10f39de7db70244a3c35e4a421090a12972457b))
+* update Russian [ru] locale yearStart config  ([#1372](https://github.com/iamkun/dayjs/issues/1372)) ([5052515](https://github.com/iamkun/dayjs/commit/5052515fe35b2444201ef8ef87220b1876a94d0a))
+* update Slovenian [sl] locale to set correct ordinal  ([#1386](https://github.com/iamkun/dayjs/issues/1386)) ([cb4f746](https://github.com/iamkun/dayjs/commit/cb4f74633b3020d6dbf19548c8cb13613dafca18))
+* update Spanish [es] locale to change month names to lowercase ([#1414](https://github.com/iamkun/dayjs/issues/1414)) ([9c20e77](https://github.com/iamkun/dayjs/commit/9c20e77caf7b1b5eccf418175203b198d4e29535))
+* update Swedish [sv] locale to set correct yearStart ([#1385](https://github.com/iamkun/dayjs/issues/1385)) ([66c5935](https://github.com/iamkun/dayjs/commit/66c59354964ef456bcd5f6152819618f44978082))
+* update UTC plugin to support string argument like +HH:mm ([#1395](https://github.com/iamkun/dayjs/issues/1395)) ([656127c](https://github.com/iamkun/dayjs/commit/656127cc44eda50923a1ac755602863fc32b9e69))
+
+## [1.10.4](https://github.com/iamkun/dayjs/compare/v1.10.3...v1.10.4) (2021-01-22)
+
+
+### Bug Fixes
+
+* Correct handling negative duration ([#1317](https://github.com/iamkun/dayjs/issues/1317)) ([3f5c085](https://github.com/iamkun/dayjs/commit/3f5c085608182472f20b84766b10949945663e44))
+* Improve `Duration` types ([#1338](https://github.com/iamkun/dayjs/issues/1338)) ([4aca4b1](https://github.com/iamkun/dayjs/commit/4aca4b1b584a15de1146d929f95c944594032f20))
+* parse a string for MMM month format with underscore delimiter ([#1349](https://github.com/iamkun/dayjs/issues/1349)) ([82ef9a3](https://github.com/iamkun/dayjs/commit/82ef9a304f06287ac0a14c4da9a7fe6152b5fec9))
+* Update Bengali [bn] locale ([#1329](https://github.com/iamkun/dayjs/issues/1329)) ([02d96ec](https://github.com/iamkun/dayjs/commit/02d96ec7189f62d6ef8987135919cbb5ceff20a6))
+* update locale Portuguese [pt] yearStart ([#1345](https://github.com/iamkun/dayjs/issues/1345)) ([5c785d5](https://github.com/iamkun/dayjs/commit/5c785d528cc08811638d7cbfc7fc158d67b32d75))
+* update Polish [pl] locale yearStart ([#1348](https://github.com/iamkun/dayjs/issues/1348)) ([e93e6b8](https://github.com/iamkun/dayjs/commit/e93e6b8ffa61036b26382f1763e3864d4a7d5df5))
+* Update Slovenian [sl] relativeTime locale ([#1333](https://github.com/iamkun/dayjs/issues/1333)) ([fe5f1d0](https://github.com/iamkun/dayjs/commit/fe5f1d0afbe57b70339e268047e6c3028ca3d59b))
+
+## [1.10.3](https://github.com/iamkun/dayjs/compare/v1.10.2...v1.10.3) (2021-01-09)
+
+
+### Bug Fixes
+
+* fix customParseFormat plugin strict mode parse meridiem bug ([#1321](https://github.com/iamkun/dayjs/issues/1321)) ([e49eeef](https://github.com/iamkun/dayjs/commit/e49eeefbe8acb36419d36ca2e7ed8bc152f73ac1))
+* fix weekYear plugin missing locale bug ([#1319](https://github.com/iamkun/dayjs/issues/1319)) ([344bdc0](https://github.com/iamkun/dayjs/commit/344bdc0eed6843edb05723dc7853a41833d88f08)), closes [#1304](https://github.com/iamkun/dayjs/issues/1304)
+* update advancedFormat plugin to add format options for iso week and weekyear ([#1309](https://github.com/iamkun/dayjs/issues/1309)) ([2c54c64](https://github.com/iamkun/dayjs/commit/2c54c6441871a175ac9b95e41e4cd075dbac10cb))
+* update devHelper to add dev warning setting locale before loading ([c5cc893](https://github.com/iamkun/dayjs/commit/c5cc89355e1e206ca72433c19c40cb528690b04f))
+* update German [de] locale yearStart ([1858df8](https://github.com/iamkun/dayjs/commit/1858df8008de56570680723df89b36a8cbc970ef)), closes [#1264](https://github.com/iamkun/dayjs/issues/1264)
+
+## [1.10.2](https://github.com/iamkun/dayjs/compare/v1.10.1...v1.10.2) (2021-01-05)
+
+
+### Bug Fixes
+
+* fix parse regex bug ([#1307](https://github.com/iamkun/dayjs/issues/1307)) ([db2b6a5](https://github.com/iamkun/dayjs/commit/db2b6a5ea8e70f9fda645d113ca33495aa96b616)), closes [#1305](https://github.com/iamkun/dayjs/issues/1305)
+* remove module entry in package.json to revert 1.10.1 change ([#1314](https://github.com/iamkun/dayjs/issues/1314)) ([824dcb8](https://github.com/iamkun/dayjs/commit/824dcb8dfcccf14f64b6a2741a00fcdfe53dcd98))
+* update devHelper add warning "passing Year as a Number will be parsed as a Unix timestamp" ([#1315](https://github.com/iamkun/dayjs/issues/1315)) ([b0dda31](https://github.com/iamkun/dayjs/commit/b0dda3139e25441ab4e7c1f4f192dee0ecce6ef8))
+
+## [1.10.1](https://github.com/iamkun/dayjs/compare/v1.10.0...v1.10.1) (2021-01-03)
+
+
+### Bug Fixes
+
+* fix typescript type error UnitTypeLongPlural ([#1302](https://github.com/iamkun/dayjs/issues/1302)) ([bfaabe4](https://github.com/iamkun/dayjs/commit/bfaabe4f398c11564eca6cda7c8aded22e1b231a)), closes [#1300](https://github.com/iamkun/dayjs/issues/1300)
+
+# [1.10.0](https://github.com/iamkun/dayjs/compare/v1.9.8...v1.10.0) (2021-01-03)
+
+
+### Bug Fixes
+
+* add ordinal to localeData plugin ([#1266](https://github.com/iamkun/dayjs/issues/1266)) ([fd229fa](https://github.com/iamkun/dayjs/commit/fd229fa5bd26bcba810e2535eb937ea8d99106c2))
+* add preParsePostFormat plugin & update Arabic [ar] locale ([#1255](https://github.com/iamkun/dayjs/issues/1255)) ([f2e4790](https://github.com/iamkun/dayjs/commit/f2e479006a9a49bc0917f8620101d40ac645f7f2))
+* add type support for plural forms of units ([#1289](https://github.com/iamkun/dayjs/issues/1289)) ([de49bb1](https://github.com/iamkun/dayjs/commit/de49bb100badfb92b9a5933cc568841f340a923f))
+* escape last period to match only milliseconds ([#1239](https://github.com/iamkun/dayjs/issues/1239)) ([#1295](https://github.com/iamkun/dayjs/issues/1295)) ([64037e6](https://github.com/iamkun/dayjs/commit/64037e6a8cf303dcfd2b954f309bd9691f87fffc))
+
+
+### Features
+
+* add ES6 Module Support, package.json module point to "esm/index.js" ([#1298](https://github.com/iamkun/dayjs/issues/1298)) ([f63375d](https://github.com/iamkun/dayjs/commit/f63375dea89becbd3bb2bb8ea7289c58c752bfed)), closes [#598](https://github.com/iamkun/dayjs/issues/598) [#313](https://github.com/iamkun/dayjs/issues/313)
+
+## [1.9.8](https://github.com/iamkun/dayjs/compare/v1.9.7...v1.9.8) (2020-12-27)
+
+
+### Bug Fixes
+
+* fix Ukrainian [uk] locale typo ([1605cc0](https://github.com/iamkun/dayjs/commit/1605cc0f6fe0e9c46a92d529bc9cd6e130432337))
+* update Hebrew [he] locale for double units ([#1287](https://github.com/iamkun/dayjs/issues/1287)) ([1c4b0da](https://github.com/iamkun/dayjs/commit/1c4b0da1468522e59dc9ee646d10dd2b31477d99))
+* update zh locale meridiem "noon" ([0e7ff3d](https://github.com/iamkun/dayjs/commit/0e7ff3dd29ca3aed85cb76dfcb8298d326e26542))
+* update zh-cn locale definition of noon  ([#1278](https://github.com/iamkun/dayjs/issues/1278)) ([d5930b9](https://github.com/iamkun/dayjs/commit/d5930b96ff884f4176ca3fcb1bc95e8f1ec75c71))
+
+## [1.9.7](https://github.com/iamkun/dayjs/compare/v1.9.6...v1.9.7) (2020-12-05)
+
+
+### Bug Fixes
+
+* add duration.format to format a Duration ([#1202](https://github.com/iamkun/dayjs/issues/1202)) ([9a859a1](https://github.com/iamkun/dayjs/commit/9a859a147ba223a1eeff0f2bb6f33d97e0ccc6c7))
+* Add function handling for relativeTime.future and relativeTime.past ([#1197](https://github.com/iamkun/dayjs/issues/1197)) ([ef1979c](https://github.com/iamkun/dayjs/commit/ef1979ce85c61fe2d759ef3c37cb6aaf2358094f))
+* avoid install installed plugin ([#1214](https://github.com/iamkun/dayjs/issues/1214)) ([a92eb6c](https://github.com/iamkun/dayjs/commit/a92eb6c4dc1437ec920e69484d52984f5921a8ea))
+* avoid memory leak after installing a plugin too many times ([b8d2e32](https://github.com/iamkun/dayjs/commit/b8d2e32a9eb59661a7ed6200daa070687becaebd))
+* fix diff bug when UTC plugin enabled ([#1201](https://github.com/iamkun/dayjs/issues/1201)) ([9544ed2](https://github.com/iamkun/dayjs/commit/9544ed2a6c466b8308d26b33a388a6737435a1f4)), closes [#1200](https://github.com/iamkun/dayjs/issues/1200)
+* fix startOf/endOf bug in timezone plugin ([#1229](https://github.com/iamkun/dayjs/issues/1229)) ([eb5fbc4](https://github.com/iamkun/dayjs/commit/eb5fbc4c7d1b62a8615d2f263b404a9515d8e15c))
+* fix utc plugin diff edge case ([#1187](https://github.com/iamkun/dayjs/issues/1187)) ([971b3d4](https://github.com/iamkun/dayjs/commit/971b3d40b4c9403165138f1034e2223cd97c3abf))
+* update customParseFormat plugin to parse 2-digit offset ([#1209](https://github.com/iamkun/dayjs/issues/1209)) ([b56936a](https://github.com/iamkun/dayjs/commit/b56936ab77b8f6289a1b77d49307b495c4bf9f91)), closes [#1205](https://github.com/iamkun/dayjs/issues/1205)
+* Update timezone plugin type definition ([#1221](https://github.com/iamkun/dayjs/issues/1221)) ([34cfb92](https://github.com/iamkun/dayjs/commit/34cfb920b9653ad44d4b31fe49e533692a3ce01b))
+
+## [1.9.6](https://github.com/iamkun/dayjs/compare/v1.9.5...v1.9.6) (2020-11-10)
+
+
+### Bug Fixes
+
+* fix customParseFormat plugin parsing date bug ([#1198](https://github.com/iamkun/dayjs/issues/1198)) ([50f05ad](https://github.com/iamkun/dayjs/commit/50f05ad3addf27827c5657ae7519514e40d9faec)), closes [#1194](https://github.com/iamkun/dayjs/issues/1194)
+* Update lv (Latvian) locale relative time ([#1192](https://github.com/iamkun/dayjs/issues/1192)) ([6d6c684](https://github.com/iamkun/dayjs/commit/6d6c6841b13ba4f7e69de92caf132a3592c5253a))
+
+## [1.9.5](https://github.com/iamkun/dayjs/compare/v1.9.4...v1.9.5) (2020-11-05)
+
+
+### Bug Fixes
+
+* customParseFormat plugin supports parsing localizedFormats  ([#1110](https://github.com/iamkun/dayjs/issues/1110)) ([402b603](https://github.com/iamkun/dayjs/commit/402b603aa3ee4199786950bc88b3fdc6b527aa35))
+* fix customParseFormat plugin parse meridiem bug ([#1169](https://github.com/iamkun/dayjs/issues/1169)) ([9e8f8d9](https://github.com/iamkun/dayjs/commit/9e8f8d96c69d557f4d267f42567c25ae9e7ab227)), closes [#1168](https://github.com/iamkun/dayjs/issues/1168)
+* fix devHelper error in umd bundle in browser ([#1165](https://github.com/iamkun/dayjs/issues/1165)) ([d11b5ee](https://github.com/iamkun/dayjs/commit/d11b5ee7dc11af671355f65ccda00f6ba42cc725))
+* fix utc plugin diff bug in DST ([#1171](https://github.com/iamkun/dayjs/issues/1171)) ([f8da3fe](https://github.com/iamkun/dayjs/commit/f8da3fe7e50c84c0502bf5be0b364910922dbd79)), closes [#1097](https://github.com/iamkun/dayjs/issues/1097) [#1021](https://github.com/iamkun/dayjs/issues/1021)
+* isoWeek plugin type ([#1177](https://github.com/iamkun/dayjs/issues/1177)) ([c3d0436](https://github.com/iamkun/dayjs/commit/c3d0436b06f74989e3a2c751a5d170f8072c4aad))
+* update localeData plugin to support meridiem ([#1174](https://github.com/iamkun/dayjs/issues/1174)) ([fdb09e4](https://github.com/iamkun/dayjs/commit/fdb09e4074cc7e8f6196846f18d3566c1f9e8fcd)), closes [#1172](https://github.com/iamkun/dayjs/issues/1172)
+* update timezone plugin parse Date instance / timestamp logic & remove useless test ([#1183](https://github.com/iamkun/dayjs/issues/1183)) ([a7f858b](https://github.com/iamkun/dayjs/commit/a7f858bb70ad81f718ba35c479e84b54eace48b2))
+
+## [1.9.4](https://github.com/iamkun/dayjs/compare/v1.9.3...v1.9.4) (2020-10-23)
+
+
+### Bug Fixes
+
+* Add descriptions to types ([#1148](https://github.com/iamkun/dayjs/issues/1148)) ([9a407a1](https://github.com/iamkun/dayjs/commit/9a407a140b089345a387d1aceab4d0d1635229c7))
+* add devHelper plugin ([#1163](https://github.com/iamkun/dayjs/issues/1163)) ([de49dc8](https://github.com/iamkun/dayjs/commit/de49dc80c83b85de4170571b64412bd60ada221b))
+* Fix Hungarian (hu) locale ([#1112](https://github.com/iamkun/dayjs/issues/1112)) ([ab13754](https://github.com/iamkun/dayjs/commit/ab13754f43c5033dacaa0eb2042dc4ab1a7a2754))
+* fix minMax plugin parsing empty array bug ([#1062](https://github.com/iamkun/dayjs/issues/1062)) ([368108b](https://github.com/iamkun/dayjs/commit/368108bc6d5cb1542f711b8eba722bd4dfaab0cd))
+* update adding/subtracting Duration from Dayjs object ([#1156](https://github.com/iamkun/dayjs/issues/1156)) ([f861aca](https://github.com/iamkun/dayjs/commit/f861acac3e83e28d3a4a96312c71119fd6b544fc))
+* update en-NZ locale to use proper ordinal formatting function ([#1143](https://github.com/iamkun/dayjs/issues/1143)) ([fcdbc58](https://github.com/iamkun/dayjs/commit/fcdbc5880710456a29b2bacf250542230bf48b99))
+* update localeData plugin type ([#1116](https://github.com/iamkun/dayjs/issues/1116)) ([ee5a4ec](https://github.com/iamkun/dayjs/commit/ee5a4ec41edddfb57d103c35182dc635c9264a10))
+* update timezone plugin to support custom parse format ([#1160](https://github.com/iamkun/dayjs/issues/1160)) ([48cbf31](https://github.com/iamkun/dayjs/commit/48cbf3118ba5427de428777c2e025896db654f2e)), closes [#1159](https://github.com/iamkun/dayjs/issues/1159)
+* update timezone plugin to support keepLocalTime ([#1161](https://github.com/iamkun/dayjs/issues/1161)) ([1d429e5](https://github.com/iamkun/dayjs/commit/1d429e5fe4467ebddcf81b43cf6f36e5e3be944c)), closes [#1149](https://github.com/iamkun/dayjs/issues/1149)
+
+## [1.9.3](https://github.com/iamkun/dayjs/compare/v1.9.2...v1.9.3) (2020-10-13)
+
+
+### Bug Fixes
+
+* fix localizedFormat export error ([#1133](https://github.com/iamkun/dayjs/issues/1133)) ([deecd6a](https://github.com/iamkun/dayjs/commit/deecd6ab8a2f4173ee7046f6b568b41fd2677531)), closes [#1132](https://github.com/iamkun/dayjs/issues/1132)
+
+## [1.9.2](https://github.com/iamkun/dayjs/compare/v1.9.1...v1.9.2) (2020-10-13)
+
+
+### Bug Fixes
+
+* add arraySupport plugin ([#1129](https://github.com/iamkun/dayjs/issues/1129)) ([be505c2](https://github.com/iamkun/dayjs/commit/be505c2c540261027342cecc55d8919a3d18d893))
+* export type of duration plugin ([#1094](https://github.com/iamkun/dayjs/issues/1094)) ([2c92e71](https://github.com/iamkun/dayjs/commit/2c92e71bf55d09601120cdf433da7a19cc8abff6))
+* Fix LocaleData plugin longDateFormat lowercase error ([#1101](https://github.com/iamkun/dayjs/issues/1101)) ([7937ccd](https://github.com/iamkun/dayjs/commit/7937ccdeac47d094a60e65ebb62a6020b81c46f4))
+* Fix objectSupport plugin bug in UTC ([#1107](https://github.com/iamkun/dayjs/issues/1107)) ([fe90bb6](https://github.com/iamkun/dayjs/commit/fe90bb6944f2ff1969ca975954d303b449dfa95b)), closes [#1105](https://github.com/iamkun/dayjs/issues/1105)
+* fix Serbian locale grammar (sr, sr-cyrl) ([#1108](https://github.com/iamkun/dayjs/issues/1108)) ([cc87eff](https://github.com/iamkun/dayjs/commit/cc87eff8b75b0d86ce0956516319d402bccae6c0))
+* Fix typo for "monday" in arabic ([#1067](https://github.com/iamkun/dayjs/issues/1067)) ([2e1e426](https://github.com/iamkun/dayjs/commit/2e1e42650124f30282dc4d710798d576b928f1c7))
+* support dayjs.add(Duration), dayjs.subtract(Duration) ([#1099](https://github.com/iamkun/dayjs/issues/1099)) ([b1a0294](https://github.com/iamkun/dayjs/commit/b1a02942c5238203aaa04ce9a074c73742324ab7))
+* update Breton [br] locale relativeTime config ([#1103](https://github.com/iamkun/dayjs/issues/1103)) ([b038bfd](https://github.com/iamkun/dayjs/commit/b038bfdb128889d677c95534d2be29cc30c9e72f))
+* update Catalan [ca] locale ordinal ([73da380](https://github.com/iamkun/dayjs/commit/73da38024c8b550bdcfbe3ff7e578e742c7aecf2))
+* update German [de] locale relativeTime config ([#1109](https://github.com/iamkun/dayjs/issues/1109)) ([f6e771b](https://github.com/iamkun/dayjs/commit/f6e771b70f93d19ebb12e6b794aa4628a1796248))
+* update localeData plugin to add longDateFormat to global localeData ([#1106](https://github.com/iamkun/dayjs/issues/1106)) ([16937d1](https://github.com/iamkun/dayjs/commit/16937d16e053b8c1d4a607622fa2fdbfd9809832))
+* Update objectSupport plugin to return current date time while parsing empty object ([f56783e](https://github.com/iamkun/dayjs/commit/f56783e14d8cf50916b015e7188b23bb6fbca839))
+
+## [1.9.1](https://github.com/iamkun/dayjs/compare/v1.9.0...v1.9.1) (2020-09-28)
+
+
+### Bug Fixes
+
+* Fix objectSupport plugin to get the correct result (zero-based month) ([#1089](https://github.com/iamkun/dayjs/issues/1089)) ([f95ac15](https://github.com/iamkun/dayjs/commit/f95ac15a4577ae5a3d1ce353872a2cd9fc454bc2))
+
+# [1.9.0](https://github.com/iamkun/dayjs/compare/v1.8.36...v1.9.0) (2020-09-28)
+
+
+### Bug Fixes
+
+* Add `setDefault` typing to timezone.d.ts ([#1057](https://github.com/iamkun/dayjs/issues/1057)) ([c0f0886](https://github.com/iamkun/dayjs/commit/c0f088620f17260e6e3ebce7697d561b5623f5f3))
+* fix DST bug in utc plugin ([#1053](https://github.com/iamkun/dayjs/issues/1053)) ([3d73543](https://github.com/iamkun/dayjs/commit/3d7354361f042ced1176d91f9ae9edffe6173425))
+* Fix optional type for timezone plugin ([#1081](https://github.com/iamkun/dayjs/issues/1081)) ([a6ebcf2](https://github.com/iamkun/dayjs/commit/a6ebcf283a83273562dce5663155e3b3a12ea9a5)), closes [#1079](https://github.com/iamkun/dayjs/issues/1079)
+* Fix timezone plugin conversion bug ([#1073](https://github.com/iamkun/dayjs/issues/1073)) ([16816a3](https://github.com/iamkun/dayjs/commit/16816a31ff43220aca9d1d179df6b729182abb55))
+* update duration plugin type file ([#1065](https://github.com/iamkun/dayjs/issues/1065)) ([94af9af](https://github.com/iamkun/dayjs/commit/94af9af27c5bc182cbb24f1845e561dd1d82d776))
+* update timezone plugin to support getting offset name e.g. EST ([#1069](https://github.com/iamkun/dayjs/issues/1069)) ([cbb755e](https://github.com/iamkun/dayjs/commit/cbb755e5c68d49c5678291f3ce832b32831a056e))
+* update utc plugin to support keepLocalTime `.utc(true)` ([#1080](https://github.com/iamkun/dayjs/issues/1080)) ([5ce4e0d](https://github.com/iamkun/dayjs/commit/5ce4e0d2f552f3645262537ff7afdc946f5a7e72))
+
+
+### Features
+
+* Correct casing for en-sg locale name ([#1048](https://github.com/iamkun/dayjs/issues/1048)) ([2edaddc](https://github.com/iamkun/dayjs/commit/2edaddc22a7eb914f915531f389766217acd7034))
+
+## [1.8.36](https://github.com/iamkun/dayjs/compare/v1.8.35...v1.8.36) (2020-09-17)
+
+
+### Bug Fixes
+
+* Add Amharic (am) locale ([#1046](https://github.com/iamkun/dayjs/issues/1046)) ([cdc49a1](https://github.com/iamkun/dayjs/commit/cdc49a1911c74b7ea96ed222f42796d53715cfed))
+* Export Duration type in duration plugin ([#1043](https://github.com/iamkun/dayjs/issues/1043)) ([0f20c3a](https://github.com/iamkun/dayjs/commit/0f20c3ac75d9ac1026a15a7bb343d3a150d9b30f))
+* Fix duration plugin parsing milliseconds bug ([#1042](https://github.com/iamkun/dayjs/issues/1042)) ([fe2301b](https://github.com/iamkun/dayjs/commit/fe2301b22318886aaa89ed1620e0a118e98c2b8a))
+* Timezone plugin set default timezone ([#1033](https://github.com/iamkun/dayjs/issues/1033)) ([0c2050a](https://github.com/iamkun/dayjs/commit/0c2050a152da708b01edd6150a5013f642b14576))
+* Timezone plugin should have the same behavior in latest ICU version ([#1032](https://github.com/iamkun/dayjs/issues/1032)) ([de31592](https://github.com/iamkun/dayjs/commit/de315921575cc50c38464b27d0338e30a54d8e2a))
+* Update Finnish (fi) locale ([#963](https://github.com/iamkun/dayjs/issues/963)) ([cf8b6a0](https://github.com/iamkun/dayjs/commit/cf8b6a096f24b54cbdb95675ac386d8ac85ea616))
+* Update Polish (pl) , Hungarian (hr) and Lithuanian (lt) localization ([#1045](https://github.com/iamkun/dayjs/issues/1045)) ([638fd39](https://github.com/iamkun/dayjs/commit/638fd394fc24f4188390faf387da6b156e7c6320))
+
+## [1.8.35](https://github.com/iamkun/dayjs/compare/v1.8.34...v1.8.35) (2020-09-02)
+
+
+### Bug Fixes
+
+* Fix BadMutable plugin bug in .diff ([#1023](https://github.com/iamkun/dayjs/issues/1023)) ([40ab6d9](https://github.com/iamkun/dayjs/commit/40ab6d9a53e8047cfca63c611c25dd045372d021))
+* fix LocaleData plugin to support instance.weekdays() API ([#1019](https://github.com/iamkun/dayjs/issues/1019)) ([a09d259](https://github.com/iamkun/dayjs/commit/a09d259a407b81d1cb6bb5623fad551c775d8674)), closes [#1017](https://github.com/iamkun/dayjs/issues/1017)
+* Update Dutch (nl) locale to set correct yearStart ([1533a2c](https://github.com/iamkun/dayjs/commit/1533a2cc1475270032da2d87b19fc3d62327e6e3))
+
+## [1.8.34](https://github.com/iamkun/dayjs/compare/v1.8.33...v1.8.34) (2020-08-20)
+
+
+### Bug Fixes
+
+* Fix Timezone plugin to preserve milliseconds while changing timezone ([#1003](https://github.com/iamkun/dayjs/issues/1003)) ([5f446ed](https://github.com/iamkun/dayjs/commit/5f446eda770fa97e895c81a8195b3ba5d082cef0)), closes [#1002](https://github.com/iamkun/dayjs/issues/1002)
+* support parsing unlimited decimals of millisecond ([#1010](https://github.com/iamkun/dayjs/issues/1010)) ([d1bdd36](https://github.com/iamkun/dayjs/commit/d1bdd36a56e3d1786523a180e3fc18068f609135)), closes [#544](https://github.com/iamkun/dayjs/issues/544)
+* update Duration plugin to support global locale ([#1008](https://github.com/iamkun/dayjs/issues/1008)) ([1c49c83](https://github.com/iamkun/dayjs/commit/1c49c83e79811eede13db6372b5d65db598aee77)), closes [#1007](https://github.com/iamkun/dayjs/issues/1007)
+
+## [1.8.33](https://github.com/iamkun/dayjs/compare/v1.8.32...v1.8.33) (2020-08-10)
+
+
+### Bug Fixes
+
+* Add PluralGetSet plugin for plural getters/setters ([#996](https://github.com/iamkun/dayjs/issues/996)) ([f76e3ce](https://github.com/iamkun/dayjs/commit/f76e3ce2fbe5d3e9ed9121086baf55eb0cc4d355))
+* Add typescript type defs in esm build ([#985](https://github.com/iamkun/dayjs/issues/985)) ([50e3b3c](https://github.com/iamkun/dayjs/commit/50e3b3c6719cb0b4ec6eff394dacd63d5db8f253))
+* Fix isoWeek Plugin cal bug in UTC mode ([#993](https://github.com/iamkun/dayjs/issues/993)) ([f2e5f32](https://github.com/iamkun/dayjs/commit/f2e5f327aaf12b4572296ec6e107ecc05fcf76e7))
+* Fix Timezone plugin parsing js date, Day.js object, timestamp bug && update type file ([#994](https://github.com/iamkun/dayjs/issues/994)) ([22f3d49](https://github.com/iamkun/dayjs/commit/22f3d49405da98db6da56d1673eebcd01b57554b)), closes [#992](https://github.com/iamkun/dayjs/issues/992) [#989](https://github.com/iamkun/dayjs/issues/989)
+* Fix Timezone plugin UTCOffset rounding bug ([#987](https://github.com/iamkun/dayjs/issues/987)) ([b07182b](https://github.com/iamkun/dayjs/commit/b07182bbdf5aef7f6bf1e88fcd38432e2b8ee465)), closes [#986](https://github.com/iamkun/dayjs/issues/986)
+* Fix UTC plugin bug while comparing an utc instance to a local one ([#995](https://github.com/iamkun/dayjs/issues/995)) ([747c0fb](https://github.com/iamkun/dayjs/commit/747c0fb4eba6353755b5dad3417fd8d5a408c378))
+* Update pt-br locale weekStart 0 ([#984](https://github.com/iamkun/dayjs/issues/984)) ([0f881c1](https://github.com/iamkun/dayjs/commit/0f881c18efb02b9d0ba7f76cba92bb504226fa95))
+
+## [1.8.32](https://github.com/iamkun/dayjs/compare/v1.8.31...v1.8.32) (2020-08-04)
+
+
+### Bug Fixes
+
+* Add Experimental Timezone Plugin ([#974](https://github.com/iamkun/dayjs/issues/974)) ([e69caba](https://github.com/iamkun/dayjs/commit/e69caba1b0957241a855aa0ae38db899fa2c3795))
+* fix parse date string error e.g. '2020/9/30' ([#980](https://github.com/iamkun/dayjs/issues/980)) ([231790d](https://github.com/iamkun/dayjs/commit/231790da62af0494732960c2c50d86ae9bf63ec6)), closes [#979](https://github.com/iamkun/dayjs/issues/979)
+* update monthDiff function to get more accurate results ([19e8a7f](https://github.com/iamkun/dayjs/commit/19e8a7f2f7582b717f49d446822e39603694433c))
+* Update UTC plugin to support keepLocalTime ([#973](https://github.com/iamkun/dayjs/issues/973)) ([9f488e5](https://github.com/iamkun/dayjs/commit/9f488e5aca92f0b4c2951459436829d79f86d8d7))
+
+## [1.8.31](https://github.com/iamkun/dayjs/compare/v1.8.30...v1.8.31) (2020-07-29)
+
+
+### Bug Fixes
+
+* Rollback LocalePresetType to string ([#968](https://github.com/iamkun/dayjs/issues/968)) ([b342bd3](https://github.com/iamkun/dayjs/commit/b342bd3d84987d6c7587a0c4590d614fb0e670d7))
+* Update Regex to parse 'YYYY' correctly ([#969](https://github.com/iamkun/dayjs/issues/969)) ([70c1239](https://github.com/iamkun/dayjs/commit/70c123990dcc6bd479fa2b5d7f9985127872a826))
+
+## [1.8.30](https://github.com/iamkun/dayjs/compare/v1.8.29...v1.8.30) (2020-07-22)
+
+
+### Bug Fixes
+
+* Add Haitian Creole (ht) and Spanish Puerto Rico (es-pr) locale configs ([#958](https://github.com/iamkun/dayjs/issues/958)) ([b2642e2](https://github.com/iamkun/dayjs/commit/b2642e2d1f87734a34808c66e5176cb18bc0414d))
+* Fix UTC plugin wrong hour bug while adding month or year  ([#957](https://github.com/iamkun/dayjs/issues/957)) ([28ae070](https://github.com/iamkun/dayjs/commit/28ae070024ff26685c88ce4cc8747307e86923c9))
+* Update French (fr) locale to set correct yearStart ([14ab808](https://github.com/iamkun/dayjs/commit/14ab808a7b7e226f2eb2cbe894916a18ed5d967d)), closes [#956](https://github.com/iamkun/dayjs/issues/956)
+
+## [1.8.29](https://github.com/iamkun/dayjs/compare/v1.8.28...v1.8.29) (2020-07-02)
+
+
+### Bug Fixes
+
+* Duration plugin supports parse ISO string with week (W) ([#950](https://github.com/iamkun/dayjs/issues/950)) ([f0fc12a](https://github.com/iamkun/dayjs/commit/f0fc12adadcab53fb0577ad8f5e2f1cf784fd8f5))
+* LocaleData plugin supports locale order ([#938](https://github.com/iamkun/dayjs/issues/938)) ([62f429d](https://github.com/iamkun/dayjs/commit/62f429db73a0a069b1267231dea172b85f4b90e3)), closes [#936](https://github.com/iamkun/dayjs/issues/936)
+* Update type definition to support array format ([#945](https://github.com/iamkun/dayjs/issues/945)) ([81d4740](https://github.com/iamkun/dayjs/commit/81d4740511d47e34f891b21afeb0449ef8a28688)), closes [#944](https://github.com/iamkun/dayjs/issues/944)
+* Update type definition to support strict mode ([#951](https://github.com/iamkun/dayjs/issues/951)) ([8d54f3f](https://github.com/iamkun/dayjs/commit/8d54f3f7d4d161e72c767fa09699e70a2b3d681c))
+
+## [1.8.28](https://github.com/iamkun/dayjs/compare/v1.8.27...v1.8.28) (2020-05-28)
+
+
+### Bug Fixes
+
+* Fix CustomParseFormat plugin month index error ([#918](https://github.com/iamkun/dayjs/issues/918)) ([fa2ec7f](https://github.com/iamkun/dayjs/commit/fa2ec7fcb980dcd2c7498dafe2f9ca2e52d735cf)), closes [#915](https://github.com/iamkun/dayjs/issues/915)
+* Update Ukrainian (uk) locale monthFormat and monthStandalone ([#899](https://github.com/iamkun/dayjs/issues/899)) ([a08756e](https://github.com/iamkun/dayjs/commit/a08756e80bd1d7126fca28c5ad9e382613fc86c4))
+
+## [1.8.27](https://github.com/iamkun/dayjs/compare/v1.8.26...v1.8.27) (2020-05-14)
+
+
+### Bug Fixes
+
+* Add Kinyarwanda (rw) locale ([#903](https://github.com/iamkun/dayjs/issues/903)) ([f355235](https://github.com/iamkun/dayjs/commit/f355235a836540d77880959fb1b614c87e9f7b3e))
+* Add plugin objectSupport ([#887](https://github.com/iamkun/dayjs/issues/887)) ([52dfb13](https://github.com/iamkun/dayjs/commit/52dfb13a6b84f0a753cc5761192b92416f440961))
+* Add Turkmen (tk) locale ([#893](https://github.com/iamkun/dayjs/issues/893)) ([a9ca8dc](https://github.com/iamkun/dayjs/commit/a9ca8dcbbd0964c5b9abb4e8a2d620c983cf091a))
+* Fix CustomParseFormat plugin set locale error ([#896](https://github.com/iamkun/dayjs/issues/896)) ([8035c8a](https://github.com/iamkun/dayjs/commit/8035c8a760549b631252252718db3cdc4ab2f68f))
+* Fix locale month function bug ([#908](https://github.com/iamkun/dayjs/issues/908)) ([bf347c3](https://github.com/iamkun/dayjs/commit/bf347c36e401f50727fb5afcc537497b54b90d6b))
+* Update CustomParseFormat plugin to support Array formats ([#906](https://github.com/iamkun/dayjs/issues/906)) ([97856c6](https://github.com/iamkun/dayjs/commit/97856c603ef5fbbeb1cf8a42387479e56a77dbe8))
+
+## [1.8.26](https://github.com/iamkun/dayjs/compare/v1.8.25...v1.8.26) (2020-04-30)
+
+
+### Bug Fixes
+
+* Fix Duration plugin `.toISOString` format bug ([#889](https://github.com/iamkun/dayjs/issues/889)) ([058d624](https://github.com/iamkun/dayjs/commit/058d624808fd2be024ae846bcb2e03885f39b556)), closes [#888](https://github.com/iamkun/dayjs/issues/888)
+* Fix WeekOfYear plugin bug while using BadMutable plugin ([#884](https://github.com/iamkun/dayjs/issues/884)) ([2977438](https://github.com/iamkun/dayjs/commit/2977438458542573a4500e21f7ba5d1f8442960e))
+* Update CustomParseFormat plugin strict mode ([#882](https://github.com/iamkun/dayjs/issues/882)) ([db642ac](https://github.com/iamkun/dayjs/commit/db642ac73e52e00d8c41546b2935c9e691cf66e0))
+* Update RelativeTime plugin default config ([#883](https://github.com/iamkun/dayjs/issues/883)) ([0606f42](https://github.com/iamkun/dayjs/commit/0606f425aef8ccbfc3da3e43cba368130603b0cc))
+
+## [1.8.25](https://github.com/iamkun/dayjs/compare/v1.8.24...v1.8.25) (2020-04-21)
+
+
+### Bug Fixes
+
+* Fix CustomParseFormat plugin of parsing only YYYY / YYYY-MM bug ([#873](https://github.com/iamkun/dayjs/issues/873)) ([3cea04d](https://github.com/iamkun/dayjs/commit/3cea04d33d54d44bbdd3d026b5c7f67ebf176116)), closes [#849](https://github.com/iamkun/dayjs/issues/849)
+* Fix Duration plugin get seconds ([#867](https://github.com/iamkun/dayjs/issues/867)) ([62b092d](https://github.com/iamkun/dayjs/commit/62b092d9f9a3db5506ef01f798bdf211f163f53f))
+* Fix type definition of locale ([9790b85](https://github.com/iamkun/dayjs/commit/9790b853e6113243a7f4a81dd12c6509e406a102))
+* Fix UTC plugin startOf, endOf bug ([#872](https://github.com/iamkun/dayjs/issues/872)) ([4141084](https://github.com/iamkun/dayjs/commit/4141084ba96d35cadcda3f1e661bf1d0f6c8e4de)), closes [#809](https://github.com/iamkun/dayjs/issues/809) [#808](https://github.com/iamkun/dayjs/issues/808)
+
+## [1.8.24](https://github.com/iamkun/dayjs/compare/v1.8.23...v1.8.24) (2020-04-10)
+
+
+### Bug Fixes
+
+* Add config option to RelativeTime plugin ([#851](https://github.com/iamkun/dayjs/issues/851)) ([bd24034](https://github.com/iamkun/dayjs/commit/bd24034b95bfc656024b75ef3f3c986708845fed))
+* add Duration plugin ([#858](https://github.com/iamkun/dayjs/issues/858)) ([d568273](https://github.com/iamkun/dayjs/commit/d568273223199ca0497f238e2cc3a8d3dcf32d0f))
+* Add en-in, en-tt locales ([#855](https://github.com/iamkun/dayjs/issues/855)) ([c39fb96](https://github.com/iamkun/dayjs/commit/c39fb96e2a9102c14b004c14a6c073af9d266f2f))
+* add isToday, isTomorrow, isYesterday plugins ([#857](https://github.com/iamkun/dayjs/issues/857)) ([fc08ab6](https://github.com/iamkun/dayjs/commit/fc08ab68f8a28269802deeab9d6b0473b92cdc51))
+* Add option callback to Calendar plugin ([#839](https://github.com/iamkun/dayjs/issues/839)) ([b25be90](https://github.com/iamkun/dayjs/commit/b25be9094325295310c8fc5e617fb058be8a5f68))
+* Fix monthsShort for locale fr ([#862](https://github.com/iamkun/dayjs/issues/862)) ([d2de9a0](https://github.com/iamkun/dayjs/commit/d2de9a0b44b830038ed0094f79bfd40726311f2a))
+* Update Breton locale (br) meridiem config ([#856](https://github.com/iamkun/dayjs/issues/856)) ([a2a6672](https://github.com/iamkun/dayjs/commit/a2a66720abb788a8f1cffbfd0929b35579f29c72))
+* Update Ukrainian (uk) locale relative time ([#842](https://github.com/iamkun/dayjs/issues/842)) ([578bc1a](https://github.com/iamkun/dayjs/commit/578bc1a23c6e737783bbac3da12c0ed5d1edcf82))
+
+## [1.8.23](https://github.com/iamkun/dayjs/compare/v1.8.22...v1.8.23) (2020-03-16)
+
+
+### Bug Fixes
+
+* Add Chinese (zh) locale ([f9b8945](https://github.com/iamkun/dayjs/commit/f9b89453166d8b53d33b1d7eefd9942022552e6e))
+* Fix IsoWeek plugin typescript definition ([#828](https://github.com/iamkun/dayjs/issues/828)) ([30aab0c](https://github.com/iamkun/dayjs/commit/30aab0c7bce85dfac0ae208a891def30f88b5cb4))
+* Update Arabic (ar) locale relative time ([#836](https://github.com/iamkun/dayjs/issues/836)) ([14044c6](https://github.com/iamkun/dayjs/commit/14044c6fda1229e3f0e5473d3f886bd79589b15f))
+* Update Slovak (sk) locale,  Czech (cs) locale ([#833](https://github.com/iamkun/dayjs/issues/833)) ([f0d451f](https://github.com/iamkun/dayjs/commit/f0d451f795e9ebf752cd854d51b25b11de2343a3))
+* Update Thai (th) locale relativeTime ([#826](https://github.com/iamkun/dayjs/issues/826)) ([63b7c03](https://github.com/iamkun/dayjs/commit/63b7c03a6dbb0507d60776e8bad6cccde3828b88)), closes [#816](https://github.com/iamkun/dayjs/issues/816)
+
+## [1.8.22](https://github.com/iamkun/dayjs/compare/v1.8.21...v1.8.22) (2020-03-08)
+
+
+### Bug Fixes
+
+* Add IsoWeek plugin ([#811](https://github.com/iamkun/dayjs/issues/811)) ([28a2207](https://github.com/iamkun/dayjs/commit/28a2207ef9849afbac15dd29267b2e7a09cd3c16))
+* Fix unsupported locale fallback to previous one ([#819](https://github.com/iamkun/dayjs/issues/819)) ([4868715](https://github.com/iamkun/dayjs/commit/48687152cf5bee6a4c1b8ceea4bda8b9bab9be10))
+
+## [1.8.21](https://github.com/iamkun/dayjs/compare/v1.8.20...v1.8.21) (2020-02-26)
+
+
+### Bug Fixes
+
+* Set + Get accept 'D' as the short version of 'date' ([#795](https://github.com/iamkun/dayjs/issues/795)) ([523c038](https://github.com/iamkun/dayjs/commit/523c03880fa8bbad83214494ad02cd606cdb8b30))
+* Update DayOfYear plugin type ([#799](https://github.com/iamkun/dayjs/issues/799)) ([5809652](https://github.com/iamkun/dayjs/commit/5809652e40245b7759827d9bf317abdcfa75a330))
+* Update fi (Finnish) locale relativeTime ([#797](https://github.com/iamkun/dayjs/issues/797)) ([4a470fb](https://github.com/iamkun/dayjs/commit/4a470fbd6fef9e051727d0f26d53cc050b85935d))
+
+## [1.8.20](https://github.com/iamkun/dayjs/compare/v1.8.19...v1.8.20) (2020-02-04)
+
+
+### Bug Fixes
+
+* Add Bislama Locale (bi) ([#780](https://github.com/iamkun/dayjs/issues/780)) ([9ac6ab4](https://github.com/iamkun/dayjs/commit/9ac6ab481bc883dd4ecc02caab12c8b2fc218a42))
+* Fix weekOfYear plugin to support yearStart locale for better week number result ([#769](https://github.com/iamkun/dayjs/issues/769)) ([f00db36](https://github.com/iamkun/dayjs/commit/f00db36e70bc7beaca1abadeb30a9b1fbb3261ee))
+* Update et (Estonian) locale relativeTime ([#790](https://github.com/iamkun/dayjs/issues/790)) ([d8e0f45](https://github.com/iamkun/dayjs/commit/d8e0f45f6cd2d5e5704b9797929227454c92d1a5))
+* Update LocaleData plugin to support dayjs.localeData().weekdays() API ([287fed6](https://github.com/iamkun/dayjs/commit/287fed6db9eb4fd979b4861aca4dacbd32422533)), closes [#779](https://github.com/iamkun/dayjs/issues/779)
+* Update LocaleData plugin to support dayjs.months dayjs.weekdays API ([144c2ae](https://github.com/iamkun/dayjs/commit/144c2ae6e15fbf89e3acd7c8cb9e237c5f6e1348)), closes [#779](https://github.com/iamkun/dayjs/issues/779)
+* Update pl locale fusional config ([d372475](https://github.com/iamkun/dayjs/commit/d3724758bb27d5b17587b995ba14e7e80dcd1151))
+
+## [1.8.19](https://github.com/iamkun/dayjs/compare/v1.8.18...v1.8.19) (2020-01-06)
+
+
+### Bug Fixes
+
+* Add UpdateLocale plugin to update a locale's properties ([#766](https://github.com/iamkun/dayjs/issues/766)) ([82ce2ba](https://github.com/iamkun/dayjs/commit/82ce2ba8d7e402e40f6d005d400eb5356a0b0633))
+* Fix CustomParseFormat Plugin 'YYYY-MM' use first day of the month ([ba709ec](https://github.com/iamkun/dayjs/commit/ba709eca86a71ae648bc68bf67d9abdc229198d4)), closes [#761](https://github.com/iamkun/dayjs/issues/761)
+* Fix CustomParseFormat Plugin to set correct locale ([66ce23f](https://github.com/iamkun/dayjs/commit/66ce23f2e18c5506e8f1a7ef20d3483a4df80087))
+* Fix WeekOfYear Plugin wrong calender week number bug ([79b86db](https://github.com/iamkun/dayjs/commit/79b86dbbf3cfd3f1e2165b3d479a7061ad1b6925)), closes [#760](https://github.com/iamkun/dayjs/issues/760)
+* Update RelativeTime plugin to support function to make additional processing ([#767](https://github.com/iamkun/dayjs/issues/767)) ([4bd9250](https://github.com/iamkun/dayjs/commit/4bd9250fbe7131e2fddfb5fa1b3350e8c2262ca9))
+* Update ru, uk, cs locale to support relativeTime with plural ([3f080f7](https://github.com/iamkun/dayjs/commit/3f080f7d6bfdc4018cbb7c4d0112ff1ead4ef6b8))
+
+## [1.8.18](https://github.com/iamkun/dayjs/compare/v1.8.17...v1.8.18) (2019-12-18)
+
+
+### Bug Fixes
+
+* Add missing locale type definition ([#716](https://github.com/iamkun/dayjs/issues/716)) ([cde5d0b](https://github.com/iamkun/dayjs/commit/cde5d0b91be7b2f5f3098de4aa0b9a4f0f28ea5c))
+* Fix .locale() handel unsupported locale ([78ec173](https://github.com/iamkun/dayjs/commit/78ec173fcecc1299516ab7b44f4554d431b4b2fd))
+* Update Italian locale (it) ([#727](https://github.com/iamkun/dayjs/issues/727)) ([5b53e98](https://github.com/iamkun/dayjs/commit/5b53e98c0a3ba0eb9573a9c77caeb907439be9e7))
+* Update locale (fa) ([#733](https://github.com/iamkun/dayjs/issues/733)) ([9ad2e47](https://github.com/iamkun/dayjs/commit/9ad2e47e0569b23991bb0d5578f49c792c12df08))
+* Update locale (zh-cn) ([#706](https://github.com/iamkun/dayjs/issues/706)) ([e31e544](https://github.com/iamkun/dayjs/commit/e31e54414fb90e1f54da13a117748ba37f52645d))
+* Update locale (zh-cn) meridiem ([#735](https://github.com/iamkun/dayjs/issues/735)) ([15d1b81](https://github.com/iamkun/dayjs/commit/15d1b813e7faf5a1f9d1ea6fc673fd27ac49d8b1))
+* Update LocaleData plugin to support dayjs().longDateFormat() ([#734](https://github.com/iamkun/dayjs/issues/734)) ([aa0f210](https://github.com/iamkun/dayjs/commit/aa0f210a1e3c4f6aba61c3b96f9eb445b43a33f0)), closes [#680](https://github.com/iamkun/dayjs/issues/680)
+* Update Mongolian (mn) locale relativeTime ([#753](https://github.com/iamkun/dayjs/issues/753)) ([6d51435](https://github.com/iamkun/dayjs/commit/6d51435092c0c94d8e50256d3f0f058cdd15febe))
+* Update Swedish locale (sv) fix ordinal error ([#745](https://github.com/iamkun/dayjs/issues/745)) ([49670d5](https://github.com/iamkun/dayjs/commit/49670d5ae31e4e21636cc5a8bfe35fef0f6d9e4a)), closes [#743](https://github.com/iamkun/dayjs/issues/743)
+
+## [1.8.17](https://github.com/iamkun/dayjs/compare/v1.8.16...v1.8.17) (2019-11-06)
+
+
+### Bug Fixes
+
+* Fix set utcOffset in utc mode ([d148115](https://github.com/iamkun/dayjs/commit/d148115dad8f1a5afc0a64e9b8163dfeba4616b6))
+* Update advancedFormat plugin to support w ww wo week tokens … ([#678](https://github.com/iamkun/dayjs/issues/678)) ([26cfa63](https://github.com/iamkun/dayjs/commit/26cfa63a524b803f7966dac5464f9cbf8f63387e)), closes [#676](https://github.com/iamkun/dayjs/issues/676)
+* Update ka locale weekdays ([f8ca3d4](https://github.com/iamkun/dayjs/commit/f8ca3d4ba1d3cbe41613d3909c0627935a51a0c4))
+* Update nb locale ([#679](https://github.com/iamkun/dayjs/issues/679)) ([1063b0e](https://github.com/iamkun/dayjs/commit/1063b0e1b5c19a1354d233cc0f21438e7073233a))
+* Update Polish locale (pl)([#713](https://github.com/iamkun/dayjs/issues/713)) ([30d2f02](https://github.com/iamkun/dayjs/commit/30d2f026b47188833a4f44fee4bab52467d4a718))
+* Update Ukrainian locale (uk) ([#710](https://github.com/iamkun/dayjs/issues/710)) ([360161c](https://github.com/iamkun/dayjs/commit/360161cac75f597fdd51d9d1ff138601282a1b4b))
+* UTC plugin set utcOffset value ([#668](https://github.com/iamkun/dayjs/issues/668)) ([8877883](https://github.com/iamkun/dayjs/commit/88778838e71dd309e79cd1a8094d5bea36ca3390))
+
+## [1.8.16](https://github.com/iamkun/dayjs/compare/v1.8.15...v1.8.16) (2019-08-27)
+
+
+### Bug Fixes
+
+* Fix relativeTime Plugin .FromNow() result error in UTC mode ([a385d5c](https://github.com/iamkun/dayjs/commit/a385d5c))
+* Handle locale in WeekOfYear plugin ([#658](https://github.com/iamkun/dayjs/issues/658)) ([0e45b0a](https://github.com/iamkun/dayjs/commit/0e45b0a))
+* LocaleData plugin returns all months and weekdays data when pas no argument ([#645](https://github.com/iamkun/dayjs/issues/645)) ([95e70b4](https://github.com/iamkun/dayjs/commit/95e70b4))
+* Return null in toJSON if not valid ([#633](https://github.com/iamkun/dayjs/issues/633)) ([19affc8](https://github.com/iamkun/dayjs/commit/19affc8))
+* Update Danish (da) locale ([#626](https://github.com/iamkun/dayjs/issues/626)) ([ac2ec77](https://github.com/iamkun/dayjs/commit/ac2ec77))
+* Update Korean locale meridiem ([#642](https://github.com/iamkun/dayjs/issues/642)) ([b457146](https://github.com/iamkun/dayjs/commit/b457146))
+* update Occitan locale Catalan locale ([#630](https://github.com/iamkun/dayjs/issues/630)) ([fef135e](https://github.com/iamkun/dayjs/commit/fef135e))
+* update pt-br locale ([#628](https://github.com/iamkun/dayjs/issues/628)) ([ccf596d](https://github.com/iamkun/dayjs/commit/ccf596d))
+* Update weekdaysShort to some locale files ([#643](https://github.com/iamkun/dayjs/issues/643)) ([cc1f15f](https://github.com/iamkun/dayjs/commit/cc1f15f))
+
+## [1.8.15](https://github.com/iamkun/dayjs/compare/v1.8.14...v1.8.15) (2019-07-08)
+
+
+### Bug Fixes
+
+* Fix dayjs.locale() returns current global locale ([#602](https://github.com/iamkun/dayjs/issues/602)) ([790cd1a](https://github.com/iamkun/dayjs/commit/790cd1a))
+* Fix incorrect Thai locale translation of July ([#607](https://github.com/iamkun/dayjs/issues/607)) ([43cbfd3](https://github.com/iamkun/dayjs/commit/43cbfd3))
+* Lowercase french locale months and weekdays ([#615](https://github.com/iamkun/dayjs/issues/615)) ([e5a257c](https://github.com/iamkun/dayjs/commit/e5a257c))
+* Type - Export Ls object to query all available locales ([#623](https://github.com/iamkun/dayjs/issues/623)) ([f6bfae0](https://github.com/iamkun/dayjs/commit/f6bfae0))
+* Update  nb (Norsk Bokmål) locale ([#604](https://github.com/iamkun/dayjs/issues/604)) ([907f5c9](https://github.com/iamkun/dayjs/commit/907f5c9))
+* Update types of `.diff` API ([#617](https://github.com/iamkun/dayjs/issues/617)) ([f0f43d2](https://github.com/iamkun/dayjs/commit/f0f43d2))
+
+## [1.8.14](https://github.com/iamkun/dayjs/compare/v1.8.13...v1.8.14) (2019-05-07)
+
+
+### Bug Fixes
+
+* Fix `.format` API returns UTC offset when value is 0 bug ([b254964](https://github.com/iamkun/dayjs/commit/b254964))
+* Fix QuarterOfYear plugin bug ([#591](https://github.com/iamkun/dayjs/issues/591)) ([434f774](https://github.com/iamkun/dayjs/commit/434f774))
+* Fix UTC plugin add day DST bug ([#590](https://github.com/iamkun/dayjs/issues/590)) ([86cd839](https://github.com/iamkun/dayjs/commit/86cd839))
+
+## [1.8.13](https://github.com/iamkun/dayjs/compare/v1.8.12...v1.8.13) (2019-04-26)
+
+
+### Bug Fixes
+
+* Add missing relativeTime and formats for some locales ([#560](https://github.com/iamkun/dayjs/issues/560)) ([96b917e](https://github.com/iamkun/dayjs/commit/96b917e))
+* Add weekday (locale aware day of the week) plugin ([#569](https://github.com/iamkun/dayjs/issues/569)) ([9007cc5](https://github.com/iamkun/dayjs/commit/9007cc5)), closes [#559](https://github.com/iamkun/dayjs/issues/559)
+* Allow customizing "am" / "pm" strings with locale meridiem function ([#580](https://github.com/iamkun/dayjs/issues/580)) ([576e93e](https://github.com/iamkun/dayjs/commit/576e93e)), closes [#578](https://github.com/iamkun/dayjs/issues/578)
+* Fix `.add` day/week decimal rouding bug ([800f6c9](https://github.com/iamkun/dayjs/commit/800f6c9))
+* Fix `.diff` type definition error ([#565](https://github.com/iamkun/dayjs/issues/565)) ([c4921ae](https://github.com/iamkun/dayjs/commit/c4921ae)), closes [#561](https://github.com/iamkun/dayjs/issues/561)
+* Fix CustomParseFormat plugin bug ([#568](https://github.com/iamkun/dayjs/issues/568)) ([1f5a9db](https://github.com/iamkun/dayjs/commit/1f5a9db)), closes [#555](https://github.com/iamkun/dayjs/issues/555)
+* Fix relativeTime plugin Math.round bug ([40bea40](https://github.com/iamkun/dayjs/commit/40bea40))
+* skip square brackets in  buddhistEra, advancedFormat plugins ([#556](https://github.com/iamkun/dayjs/issues/556)) ([9279718](https://github.com/iamkun/dayjs/commit/9279718)), closes [#554](https://github.com/iamkun/dayjs/issues/554)
+* Update Indonesian locale([#574](https://github.com/iamkun/dayjs/issues/574)) ([0aa7143](https://github.com/iamkun/dayjs/commit/0aa7143))
+* Update locale month to support both array and function ([#581](https://github.com/iamkun/dayjs/issues/581)) ([b6599d3](https://github.com/iamkun/dayjs/commit/b6599d3))
+* Update LocalizedFormat plugin lowercase formats logic ([#557](https://github.com/iamkun/dayjs/issues/557)) ([d409304](https://github.com/iamkun/dayjs/commit/d409304))
+
+## [1.8.12](https://github.com/iamkun/dayjs/compare/v1.8.11...v1.8.12) (2019-04-02)
+
+
+### Bug Fixes
+
+* Add .get API ([7318797](https://github.com/iamkun/dayjs/commit/7318797))
+* Add 79 locales ([#541](https://github.com/iamkun/dayjs/issues/541)) ([f75a125](https://github.com/iamkun/dayjs/commit/f75a125))
+* Add Calendar plugin ([d1b9cf9](https://github.com/iamkun/dayjs/commit/d1b9cf9))
+* Add isoWeeksInYear plugin ([2db8631](https://github.com/iamkun/dayjs/commit/2db8631))
+* Add Occitan (oc-lnc) locale file ([#551](https://github.com/iamkun/dayjs/issues/551)) ([c30b715](https://github.com/iamkun/dayjs/commit/c30b715))
+* Add plugin minMax to sopport .max .min ([2870a23](https://github.com/iamkun/dayjs/commit/2870a23))
+* Fix set Month Year error in last day of the month ([d058f4a](https://github.com/iamkun/dayjs/commit/d058f4a))
+* Update ko locale weekdaysShort  ([#543](https://github.com/iamkun/dayjs/issues/543)) ([317fd3e](https://github.com/iamkun/dayjs/commit/317fd3e))
+* Update localizedFormat plugin to support lowercase localizable formats (l, ll, lll, llll) ([#546](https://github.com/iamkun/dayjs/issues/546)) ([f2b5ebf](https://github.com/iamkun/dayjs/commit/f2b5ebf))
+
+## [1.8.11](https://github.com/iamkun/dayjs/compare/v1.8.10...v1.8.11) (2019-03-21)
+
+
+### Bug Fixes
+
+* Add .add('quarter') .startOf('quarter') through plugin quarterOfYear ([dde39e9](https://github.com/iamkun/dayjs/commit/dde39e9)), closes [#537](https://github.com/iamkun/dayjs/issues/537) [#531](https://github.com/iamkun/dayjs/issues/531)
+* Add locale support for Azerbaijani language (az) ([#535](https://github.com/iamkun/dayjs/issues/535)) ([eeb20fa](https://github.com/iamkun/dayjs/commit/eeb20fa))
+* Correct typescript definition `add` ([22a249c](https://github.com/iamkun/dayjs/commit/22a249c)), closes [#531](https://github.com/iamkun/dayjs/issues/531)
+* Fix CustomParseFormat plugin formatting bug ([#536](https://github.com/iamkun/dayjs/issues/536)) ([8578546](https://github.com/iamkun/dayjs/commit/8578546)), closes [#533](https://github.com/iamkun/dayjs/issues/533)
+* Update pt locale ([#538](https://github.com/iamkun/dayjs/issues/538)) ([1ac9e1e](https://github.com/iamkun/dayjs/commit/1ac9e1e))
+
+## [1.8.10](https://github.com/iamkun/dayjs/compare/v1.8.9...v1.8.10) (2019-03-10)
+
+
+### Bug Fixes
+
+* **locale:** Add nepali (ne) locale ([#524](https://github.com/iamkun/dayjs/issues/524)) ([bdbec01](https://github.com/iamkun/dayjs/commit/bdbec01))
+* Add WeekYear plugin ([a892608](https://github.com/iamkun/dayjs/commit/a892608))
+* API .locale() with no argument should return current locale name string ([8d63d88](https://github.com/iamkun/dayjs/commit/8d63d88))
+* CustomParseFormat correct parse HH:mm:ss with only one digit like 0:12:10 ([600d547](https://github.com/iamkun/dayjs/commit/600d547))
+* CustomParseFormat plugin parse Do format string ([bf27fda](https://github.com/iamkun/dayjs/commit/bf27fda)), closes [#522](https://github.com/iamkun/dayjs/issues/522)
+* Expand setters like .year(2000) .hour(12) ([ac532a0](https://github.com/iamkun/dayjs/commit/ac532a0))
+* Move toObject, toArray API to separate plugin from core ([40a3431](https://github.com/iamkun/dayjs/commit/40a3431))
+
+## [1.8.9](https://github.com/iamkun/dayjs/compare/v1.8.8...v1.8.9) (2019-03-06)
+
+
+### Features
+
+* Add UTC mode with UTC plugin ([#517](https://github.com/iamkun/dayjs/issues/517)) ([caf335c](https://github.com/iamkun/dayjs/commit/caf335c))
+
+> For plugin developers: Please note, we have changed the name of some method in `Utils` in order to reduce the file size. ([#517](https://github.com/iamkun/dayjs/issues/517)) ([detail](https://github.com/iamkun/dayjs/pull/517/files#diff-2b4ca49d4bb0a774c4d4c1672d7aa781R46))
+
+### Bug Fixes
+
+* Add locale de-AT ([#515](https://github.com/iamkun/dayjs/issues/515)) ([d93f7b6](https://github.com/iamkun/dayjs/commit/d93f7b6))
+* Add locale zh-hk ([#516](https://github.com/iamkun/dayjs/issues/516)) ([5fc05a6](https://github.com/iamkun/dayjs/commit/5fc05a6))
+
+## [1.8.8](https://github.com/iamkun/dayjs/compare/v1.8.7...v1.8.8) (2019-02-25)
+
+
+### Bug Fixes
+
+* Update relativeTime plugin type definition ([de56f2c](https://github.com/iamkun/dayjs/commit/de56f2c))
+
+## [1.8.7](https://github.com/iamkun/dayjs/compare/v1.8.6...v1.8.7) (2019-02-24)
+
+
+### Bug Fixes
+
+* Add plugin type definitions ([#418](https://github.com/iamkun/dayjs/issues/418)) ([361d437](https://github.com/iamkun/dayjs/commit/361d437))
+* Add Swahili locale ([#508](https://github.com/iamkun/dayjs/issues/508)) ([b9cee84](https://github.com/iamkun/dayjs/commit/b9cee84))
+* Parse month string 'MMMM MMM (February, Feb)' in customParseFormat ([#457](https://github.com/iamkun/dayjs/issues/457)) ([f343206](https://github.com/iamkun/dayjs/commit/f343206))
+* Update declaration file .diff .isBefore .isSame .isAfter ([#496](https://github.com/iamkun/dayjs/issues/496)) ([4523275](https://github.com/iamkun/dayjs/commit/4523275))
+* Word orders corrections for locale 'fa' ([#491](https://github.com/iamkun/dayjs/issues/491)) ([56050c2](https://github.com/iamkun/dayjs/commit/56050c2))
+
+## [1.8.6](https://github.com/iamkun/dayjs/compare/v1.8.5...v1.8.6) (2019-02-14)
+
+
+### Bug Fixes
+
+* Add Bahasa Melayu (Malaysia) locale ([#485](https://github.com/iamkun/dayjs/issues/485)) ([cb208b0](https://github.com/iamkun/dayjs/commit/cb208b0))
+* Copy & export built-in en locale to /locale folder as a separate file ([a7e05e0](https://github.com/iamkun/dayjs/commit/a7e05e0))
+* Fix bug in customParseFormat plugin while month(MM) is '01' ([9884ca5](https://github.com/iamkun/dayjs/commit/9884ca5)), closes [#494](https://github.com/iamkun/dayjs/issues/494)
+* Fix startOf week bug while week start is not Sunday ([5eaf77b](https://github.com/iamkun/dayjs/commit/5eaf77b))
+* Implemented isBetween inclusivity ([#464](https://github.com/iamkun/dayjs/issues/464)) ([af2f4f1](https://github.com/iamkun/dayjs/commit/af2f4f1))
+* Update Swedish and Finnish locales ([#488](https://github.com/iamkun/dayjs/issues/488)) ([f142082](https://github.com/iamkun/dayjs/commit/f142082))
+* Fix commonJS require ES Module bug in webpack4 ([23f9f3d](https://github.com/iamkun/dayjs/commit/23f9f3d)), check [#492](https://github.com/iamkun/dayjs/issues/492)
+
+> Get access to ESM code with `import dayjs from 'dayjs/esm'`
+
+## [1.8.5](https://github.com/iamkun/dayjs/compare/v1.8.4...v1.8.5) (2019-02-07)
+
+
+### Bug Fixes
+
+* Add en-gb locale ([#478](https://github.com/iamkun/dayjs/issues/478)) ([508c3a7](https://github.com/iamkun/dayjs/commit/508c3a7))
+* **module:** transpile everything except ES6 modules in the 'module' entrypoint ([#477](https://github.com/iamkun/dayjs/issues/477)) ([#480](https://github.com/iamkun/dayjs/issues/480)) ([#482](https://github.com/iamkun/dayjs/issues/482)) ([767017d](https://github.com/iamkun/dayjs/commit/767017d))
+* update customParseFormat plugin support hh:mm ([54947cc](https://github.com/iamkun/dayjs/commit/54947cc)), closes [#484](https://github.com/iamkun/dayjs/issues/484)
+* Update module in package.json ([5c5a7a0](https://github.com/iamkun/dayjs/commit/5c5a7a0))
+
+## [1.8.4](https://github.com/iamkun/dayjs/compare/v1.8.3...v1.8.4) (2019-02-05)
+
+* Allow set start day of week in locale && Allow set week in weekOfYear plugin ([1295591](https://github.com/iamkun/dayjs/commit/1295591))
+### Bug Fixes
+* update all locale files with correct week start ([5b03412](https://github.com/iamkun/dayjs/commit/5b03412))
+* update es es-do locale adding weekStart && update weekStart test ([66e42ec](https://github.com/iamkun/dayjs/commit/66e42ec))
+* Revert default export ([b00da1b](https://github.com/iamkun/dayjs/commit/b00da1b))
+
+## [1.8.3](https://github.com/iamkun/dayjs/compare/v1.8.2...v1.8.3) (2019-02-04)
+
+
+### Bug Fixes
+
+* fix ios safari YYYY-MM-DD HH:mm parse BUG ([e02ae82](https://github.com/iamkun/dayjs/commit/e02ae82)), closes [#254](https://github.com/iamkun/dayjs/issues/254)
+
+## [1.8.2](https://github.com/iamkun/dayjs/compare/v1.8.1...v1.8.2) (2019-02-02)
+
+
+### Bug Fixes
+
+* Add missing czech language locale ([#461](https://github.com/iamkun/dayjs/issues/461)) ([7e04004](https://github.com/iamkun/dayjs/commit/7e04004))
+* Add utcOffset api method and fix calculating diff error in DST ([#453](https://github.com/iamkun/dayjs/issues/453)) ([ce2e30e](https://github.com/iamkun/dayjs/commit/ce2e30e))
+* Fix it locale error ([#458](https://github.com/iamkun/dayjs/issues/458)) ([f6d9a64](https://github.com/iamkun/dayjs/commit/f6d9a64))
+* Add DayOfYear plugin (#454)
+* Fix es locale monthsShort error
+
+## [1.8.1](https://github.com/iamkun/dayjs/compare/v1.8.0...v1.8.1) (2019-02-02)
+
+* Add LocalizedFormat plugin supplying format like LTS, LT, LLLL 
+
+* <del>update declaration File with default export (#278)</del>
+> <del>From v1.8.1, in TypeScript Project, just `import from dayjs from 'dayjs'`</del>
+* add ES2015 module support (#451)
+
+### Performance Improvements
+
+* **format:** reuse matches instead of created when replacing ([#441](https://github.com/iamkun/dayjs/issues/441)) ([10b79d8](https://github.com/iamkun/dayjs/commit/10b79d8))
+
+# [1.8.0](https://github.com/iamkun/dayjs/compare/v1.7.8...v1.8.0) (2019-01-14)
+
+
+### Features
+
+* add CustomParseFormat plugin  and QuarterOfYear plugin ([#450](https://github.com/iamkun/dayjs/issues/450)) ([8f6f63c](https://github.com/iamkun/dayjs/commit/8f6f63c))
+
+## [1.7.8](https://github.com/iamkun/dayjs/compare/v1.7.7...v1.7.8) (2018-12-13)
+
+
+### Feature
+
+* update isSame isBefore isAfter supports units ([fd65464](https://github.com/iamkun/dayjs/commit/fd65464))
+
+* add greek lithuanian locales 
+
+## [1.7.7](https://github.com/iamkun/dayjs/compare/v1.7.6...v1.7.7) (2018-09-26)
+
+
+### Bug Fixes
+
+* **DST:** fix daylight saving time DST bug && add test ([#354](https://github.com/iamkun/dayjs/issues/354)) ([6fca6d5](https://github.com/iamkun/dayjs/commit/6fca6d5))
+
+## [1.7.6](https://github.com/iamkun/dayjs/compare/v1.7.5...v1.7.6) (2018-09-25)
+
+
+### Bug Fixes
+
+* **add dayjs.unix:** add dayjs.unix to parse timestamp in seconds && locale update ([5711c5e](https://github.com/iamkun/dayjs/commit/5711c5e))
+
+## [1.7.5](https://github.com/iamkun/dayjs/compare/v1.7.4...v1.7.5) (2018-08-10)
+
+
+### Bug Fixes
+
+* add isBetween API & update ([b5fc3d1](https://github.com/iamkun/dayjs/commit/b5fc3d1))
+
+## [1.7.4](https://github.com/iamkun/dayjs/compare/v1.7.3...v1.7.4) (2018-07-11)
+
+
+### Bug Fixes
+
+* update set week logic ([60b6325](https://github.com/iamkun/dayjs/commit/60b6325)), closes [#276](https://github.com/iamkun/dayjs/issues/276)
+
+## [1.7.3](https://github.com/iamkun/dayjs/compare/v1.7.2...v1.7.3) (2018-07-10)
+
+
+### Bug Fixes
+
+* **locale-nl:** set correct weekdays and months ([6d089d7](https://github.com/iamkun/dayjs/commit/6d089d7))
+
+## [1.7.2](https://github.com/iamkun/dayjs/compare/v1.7.1...v1.7.2) (2018-07-04)
+
+
+### Bug Fixes
+
+* DEPRECATED isLeapYear, use IsLeapYear plugin instead ([e2e5116](https://github.com/iamkun/dayjs/commit/e2e5116))
+
+## [1.7.1](https://github.com/iamkun/dayjs/compare/v1.7.0...v1.7.1) (2018-07-03)
+
+
+### Bug Fixes
+
+* fix week() error near the end of the year ([fa03689](https://github.com/iamkun/dayjs/commit/fa03689))
+
+# [1.7.0](https://github.com/iamkun/dayjs/compare/v1.6.10...v1.7.0) (2018-07-02)
+
+
+### Features
+
+* Added method `.week()` to retrieve week of the year ([e1c1b1c](https://github.com/iamkun/dayjs/commit/e1c1b1c))
+* Updated Japanese locae
+
+## [1.6.10](https://github.com/iamkun/dayjs/compare/v1.6.9...v1.6.10) (2018-06-25)
+
+
+### Bug Fixes
+
+* Add relative locales to russian language ([c7e9898](https://github.com/iamkun/dayjs/commit/c7e9898)), closes [#256](https://github.com/iamkun/dayjs/issues/256)
+
+## [1.6.9](https://github.com/iamkun/dayjs/compare/v1.6.8...v1.6.9) (2018-06-14)
+
+
+### Bug Fixes
+
+* add isDayjs => boolean API ([6227c8b](https://github.com/iamkun/dayjs/commit/6227c8b))
+
+## [1.6.8](https://github.com/iamkun/dayjs/compare/v1.6.7...v1.6.8) (2018-06-14)
+
+
+### Bug Fixes
+
+* fix  Advanced format bug in zh-cn ([0c07874](https://github.com/iamkun/dayjs/commit/0c07874)), closes [#242](https://github.com/iamkun/dayjs/issues/242)
+
+## [1.6.7](https://github.com/iamkun/dayjs/compare/v1.6.6...v1.6.7) (2018-06-11)
+
+
+### Bug Fixes
+
+* fix id locale ([1ebbeb8](https://github.com/iamkun/dayjs/commit/1ebbeb8)), closes [#234](https://github.com/iamkun/dayjs/issues/234)
+
+<a name="1.6.6"></a>
+## [1.6.6](https://github.com/iamkun/dayjs/compare/v1.6.5...v1.6.6) (2018-06-06)
+
+
+### Bug Fixes
+
+*  format API update and locale file update ([5ca48f0](https://github.com/iamkun/dayjs/commit/5ca48f0)), closes [#228](https://github.com/iamkun/dayjs/issues/228)
+
+<a name="1.6.5"></a>
+## [1.6.5](https://github.com/iamkun/dayjs/compare/v1.6.4...v1.6.5) (2018-05-31)
+
+
+### Bug Fixes
+
+* bugfix, utils update and  locale file update ([ebcb6d5](https://github.com/iamkun/dayjs/commit/ebcb6d5)), closes [#214](https://github.com/iamkun/dayjs/issues/214)
+
+<a name="1.6.4"></a>
+## [1.6.4](https://github.com/iamkun/dayjs/compare/v1.6.3...v1.6.4) (2018-05-25)
+
+
+### Bug Fixes
+
+* add RelativeTime plugin and locale file update ([c1fbbca](https://github.com/iamkun/dayjs/commit/c1fbbca)), closes [#198](https://github.com/iamkun/dayjs/issues/198)
+
+<a name="1.6.3"></a>
+## [1.6.3](https://github.com/iamkun/dayjs/compare/v1.6.2...v1.6.3) (2018-05-21)
+
+
+### Bug Fixes
+
+* Changing locales locally is immutable from this release ([2cce729](https://github.com/iamkun/dayjs/commit/2cce729)), closes [#182](https://github.com/iamkun/dayjs/issues/182)
+* instance locale change should be immutable ([84597c9](https://github.com/iamkun/dayjs/commit/84597c9))
+* Add more locales
+* english ordinal fix
+
+<a name="1.6.2"></a>
+## [1.6.2](https://github.com/iamkun/dayjs/compare/v1.6.1...v1.6.2) (2018-05-18)
+
+
+### Bug Fixes
+
+* change-log update && test new npm release ([aa49cba](https://github.com/iamkun/dayjs/commit/aa49cba)), closes [#163](https://github.com/iamkun/dayjs/issues/163)
+
+<a name="1.6.1"></a>
+## [1.6.1](https://github.com/iamkun/dayjs/compare/v1.6.0...v1.6.1) (2018-05-18)
+
+
+### Bug Fixes
+
+* Add German, Brazilian Portuguese locales
+* add() & parse() bug fix & add locale de, pt-br ([bf1331e](https://github.com/iamkun/dayjs/commit/bf1331e))
+
+<a name="1.6.0"></a>
+# [1.6.0](https://github.com/iamkun/dayjs/compare/v1.5.24...v1.6.0) (2018-05-15)
+
+
+### Features
+
+* Locale && Plugin ([2342c55](https://github.com/iamkun/dayjs/commit/2342c55)), closes [#141](https://github.com/iamkun/dayjs/issues/141)
diff --git a/node_modules/dayjs/LICENSE b/node_modules/dayjs/LICENSE
new file mode 100644
index 0000000..caf9315
--- /dev/null
+++ b/node_modules/dayjs/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018-present, iamkun
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/node_modules/dayjs/README.md b/node_modules/dayjs/README.md
new file mode 100644
index 0000000..3e514dc
--- /dev/null
+++ b/node_modules/dayjs/README.md
@@ -0,0 +1,149 @@
+English | [简体中文](./docs/zh-cn/README.zh-CN.md) | [日本語](./docs/ja/README-ja.md) | [Português Brasileiro](./docs/pt-br/README-pt-br.md) | [한국어](./docs/ko/README-ko.md) | [Español (España)](./docs/es-es/README-es-es.md) | [Русский](./docs/ru/README-ru.md) | [Türkçe](./docs/tr/README-tr.md) | [සිංහල](./docs/si/README-si.md) | [עברית](./docs/he/README-he.md)
+
+<p align="center"><a href="https://day.js.org/" target="_blank" rel="noopener noreferrer"><img width="550"
+                                                                             src="https://user-images.githubusercontent.com/17680888/39081119-3057bbe2-456e-11e8-862c-646133ad4b43.png"
+                                                                             alt="Day.js" /></a></p>
+<p align="center">Fast <b>2kB</b> alternative to Moment.js with the same modern API</p>
+<p align="center">
+    <a href="https://unpkg.com/dayjs/dayjs.min.js"><img
+            src="https://img.badgesize.io/https://unpkg.com/dayjs/dayjs.min.js?compression=gzip&style=flat-square"
+            alt="Gzip Size"></a>
+    <a href="https://www.npmjs.com/package/dayjs"><img src="https://img.shields.io/npm/v/dayjs.svg?style=flat-square&colorB=51C838"
+                                                       alt="NPM Version"></a>
+    <a href="https://travis-ci.com/iamkun/dayjs"><img
+            src="https://img.shields.io/travis/iamkun/dayjs/master.svg?style=flat-square" alt="Build Status"></a>
+    <a href="https://codecov.io/gh/iamkun/dayjs"><img
+            src="https://img.shields.io/codecov/c/github/iamkun/dayjs/master.svg?style=flat-square" alt="Codecov"></a>
+    <a href="https://github.com/iamkun/dayjs/blob/master/LICENSE"><img
+            src="https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square" alt="License"></a>
+    <br>
+    <a href="https://saucelabs.com/u/dayjs">
+        <img width="750" src="https://user-images.githubusercontent.com/17680888/40040137-8e3323a6-584b-11e8-9dba-bbe577ee8a7b.png" alt="Sauce Test Status">
+    </a>
+</p>
+
+> Day.js is a minimalist JavaScript library that parses, validates, manipulates, and displays dates and times for modern browsers with a largely Moment.js-compatible API. If you use Moment.js, you already know how to use Day.js.
+
+```js
+dayjs().startOf('month').add(1, 'day').set('year', 2018).format('YYYY-MM-DD HH:mm:ss');
+```
+
+* 🕒 Familiar Moment.js API & patterns
+* 💪 Immutable
+* 🔥 Chainable
+* 🌐 I18n support
+* 📦 2kb mini library
+* 👫 All browsers supported
+
+---
+
+## Getting Started
+
+### Documentation
+
+You can find more details, API, and other docs on [day.js.org](https://day.js.org/) website.
+
+### Installation
+
+```console
+npm install dayjs --save
+```
+
+📚[Installation Guide](https://day.js.org/docs/en/installation/installation)
+
+### API
+
+It's easy to use Day.js APIs to parse, validate, manipulate, and display dates and times.
+
+```javascript
+dayjs('2018-08-08') // parse
+
+dayjs().format('{YYYY} MM-DDTHH:mm:ss SSS [Z] A') // display
+
+dayjs().set('month', 3).month() // get & set
+
+dayjs().add(1, 'year') // manipulate
+
+dayjs().isBefore(dayjs()) // query
+```
+
+📚[API Reference](https://day.js.org/docs/en/parse/parse)
+
+### I18n
+
+Day.js has great support for internationalization.
+
+But none of them will be included in your build unless you use it.
+
+```javascript
+import 'dayjs/locale/es' // load on demand
+
+dayjs.locale('es') // use Spanish locale globally
+
+dayjs('2018-05-05').locale('zh-cn').format() // use Chinese Simplified locale in a specific instance
+```
+
+📚[Internationalization](https://day.js.org/docs/en/i18n/i18n)
+
+### Plugin
+
+A plugin is an independent module that can be added to Day.js to extend functionality or add new features.
+
+```javascript
+import advancedFormat from 'dayjs/plugin/advancedFormat' // load on demand
+
+dayjs.extend(advancedFormat) // use plugin
+
+dayjs().format('Q Do k kk X x') // more available formats
+```
+
+📚[Plugin List](https://day.js.org/docs/en/plugin/plugin)
+
+## Sponsors
+
+Support this project by becoming a sponsor. Your logo will show up here with a link to your website.
+
+[[Become a sponsor via Github](https://github.com/sponsors/iamkun/)] [[Become a sponsor via OpenCollective](https://opencollective.com/dayjs#sponsor)]
+
+<a href="https://toyokumo.co.jp" target="_blank">
+  <img width="70" src="https://user-images.githubusercontent.com/17680888/197092231-2367b5eb-1e43-467e-a311-23f7cd97b086.png">
+</a>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<a href="https://github.com/alan-eu" target="_blank">
+  <img width="70" src="https://avatars.githubusercontent.com/u/18175329?s=52&v=4">
+</a>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<a href="https://opencollective.com/sight-and-sound-ministries" target="_blank">
+  <img width="70" src="https://user-images.githubusercontent.com/17680888/232316426-cb99b4cf-0ccb-4e73-a6ce-e16dba6aadf4.png">
+</a>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<a href="https://www.exoflare.com/open-source/?utm_source=dayjs&utm_campaign=open_source" target="_blank">
+  <img width="70" src="https://user-images.githubusercontent.com/17680888/162761622-1407a849-0c41-4591-8aa9-f98114ec2092.png">
+</a>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<a href="https://rxdb.info/?utm_source=day.js.org&utm_medium=banner&utm_campaign=day.js.org-sponsored" target="_blank"><img width="70" src="https://user-images.githubusercontent.com/17680888/200301812-9c9bd523-5dc4-4cab-b380-543fbcd3802c.svg"></a>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<a href="https://github.com/vendure-ecommerce" target="_blank"><img width="70" src="https://avatars.githubusercontent.com/u/39629390?s=52&v=4"></a>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<a href="https://opencollective.com/docbot" target="_blank"><img width="70" src="https://images.opencollective.com/docbot/457761e/logo.png"></a>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<a href="https://opencollective.com/datawrapper" target="_blank"><img width="70" src="https://images.opencollective.com/datawrapper/c13e229/logo.png"></a>
+
+## Contributors
+
+This project exists thanks to all the people who contribute.
+
+Please give us a 💖 star 💖 to support us. Thank you.
+
+And thank you to all our backers! 🙏
+
+<a href="https://opencollective.com/dayjs/backer/0/website?requireActive=false" target="_blank"><img width="35" src="https://opencollective.com/dayjs/backer/0/avatar.svg?requireActive=false"></a>
+<a href="https://opencollective.com/dayjs/backer/1/website?requireActive=false" target="_blank"><img width="35" src="https://opencollective.com/dayjs/backer/1/avatar.svg?requireActive=false"></a>
+<a href="https://opencollective.com/dayjs/backer/2/website?requireActive=false" target="_blank"><img width="35" src="https://opencollective.com/dayjs/backer/2/avatar.svg?requireActive=false"></a>
+<a href="https://opencollective.com/dayjs/backer/3/website?requireActive=false" target="_blank"><img width="35" src="https://opencollective.com/dayjs/backer/3/avatar.svg?requireActive=false"></a>
+<br />
+<a href="https://opencollective.com/dayjs#backers" target="_blank"><img src="https://opencollective.com/dayjs/contributors.svg?width=890" /></a>
+
+## License
+
+Day.js is licensed under a [MIT License](./LICENSE).
diff --git a/node_modules/dayjs/dayjs.min.js b/node_modules/dayjs/dayjs.min.js
new file mode 100644
index 0000000..61916d8
--- /dev/null
+++ b/node_modules/dayjs/dayjs.min.js
@@ -0,0 +1 @@
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).dayjs=e()}(this,(function(){"use strict";var t=1e3,e=6e4,n=36e5,r="millisecond",i="second",s="minute",u="hour",a="day",o="week",c="month",f="quarter",h="year",d="date",l="Invalid Date",$=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,y=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,M={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(t){var e=["th","st","nd","rd"],n=t%100;return"["+t+(e[(n-20)%10]||e[n]||e[0])+"]"}},m=function(t,e,n){var r=String(t);return!r||r.length>=e?t:""+Array(e+1-r.length).join(n)+t},v={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?"+":"-")+m(r,2,"0")+":"+m(i,2,"0")},m:function t(e,n){if(e.date()<n.date())return-t(n,e);var r=12*(n.year()-e.year())+(n.month()-e.month()),i=e.clone().add(r,c),s=n-i<0,u=e.clone().add(r+(s?-1:1),c);return+(-(r+(n-i)/(s?i-u:u-i))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return{M:c,y:h,w:o,d:a,D:d,h:u,m:s,s:i,ms:r,Q:f}[t]||String(t||"").toLowerCase().replace(/s$/,"")},u:function(t){return void 0===t}},g="en",D={};D[g]=M;var p="$isDayjsObject",S=function(t){return t instanceof _||!(!t||!t[p])},w=function t(e,n,r){var i;if(!e)return g;if("string"==typeof e){var s=e.toLowerCase();D[s]&&(i=s),n&&(D[s]=n,i=s);var u=e.split("-");if(!i&&u.length>1)return t(u[0])}else{var a=e.name;D[a]=e,i=a}return!r&&i&&(g=i),i||!r&&g},O=function(t,e){if(S(t))return t.clone();var n="object"==typeof e?e:{};return n.date=t,n.args=arguments,new _(n)},b=v;b.l=w,b.i=S,b.w=function(t,e){return O(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var _=function(){function M(t){this.$L=w(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[p]=!0}var m=M.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(b.u(e))return new Date;if(e instanceof Date)return new Date(e);if("string"==typeof e&&!/Z$/i.test(e)){var r=e.match($);if(r){var i=r[2]-1||0,s=(r[7]||"0").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)}}return new Date(e)}(t),this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return b},m.isValid=function(){return!(this.$d.toString()===l)},m.isSame=function(t,e){var n=O(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return O(t)<this.startOf(e)},m.isBefore=function(t,e){return this.endOf(e)<O(t)},m.$g=function(t,e,n){return b.u(t)?this[e]:this.set(n,t)},m.unix=function(){return Math.floor(this.valueOf()/1e3)},m.valueOf=function(){return this.$d.getTime()},m.startOf=function(t,e){var n=this,r=!!b.u(e)||e,f=b.p(t),l=function(t,e){var i=b.w(n.$u?Date.UTC(n.$y,e,t):new Date(n.$y,e,t),n);return r?i:i.endOf(a)},$=function(t,e){return b.w(n.toDate()[t].apply(n.toDate("s"),(r?[0,0,0,0]:[23,59,59,999]).slice(e)),n)},y=this.$W,M=this.$M,m=this.$D,v="set"+(this.$u?"UTC":"");switch(f){case h:return r?l(1,0):l(31,11);case c:return r?l(1,M):l(0,M+1);case o:var g=this.$locale().weekStart||0,D=(y<g?y+7:y)-g;return l(r?m-D:m+(6-D),M);case a:case d:return $(v+"Hours",0);case u:return $(v+"Minutes",1);case s:return $(v+"Seconds",2);case i:return $(v+"Milliseconds",3);default:return this.clone()}},m.endOf=function(t){return this.startOf(t,!1)},m.$set=function(t,e){var n,o=b.p(t),f="set"+(this.$u?"UTC":""),l=(n={},n[a]=f+"Date",n[d]=f+"Date",n[c]=f+"Month",n[h]=f+"FullYear",n[u]=f+"Hours",n[s]=f+"Minutes",n[i]=f+"Seconds",n[r]=f+"Milliseconds",n)[o],$=o===a?this.$D+(e-this.$W):e;if(o===c||o===h){var y=this.clone().set(d,1);y.$d[l]($),y.init(),this.$d=y.set(d,Math.min(this.$D,y.daysInMonth())).$d}else l&&this.$d[l]($);return this.init(),this},m.set=function(t,e){return this.clone().$set(t,e)},m.get=function(t){return this[b.p(t)]()},m.add=function(r,f){var d,l=this;r=Number(r);var $=b.p(f),y=function(t){var e=O(l);return b.w(e.date(e.date()+Math.round(t*r)),l)};if($===c)return this.set(c,this.$M+r);if($===h)return this.set(h,this.$y+r);if($===a)return y(1);if($===o)return y(7);var M=(d={},d[s]=e,d[u]=n,d[i]=t,d)[$]||1,m=this.$d.getTime()+r*M;return b.w(m,this)},m.subtract=function(t,e){return this.add(-1*t,e)},m.format=function(t){var e=this,n=this.$locale();if(!this.isValid())return n.invalidDate||l;var r=t||"YYYY-MM-DDTHH:mm:ssZ",i=b.z(this),s=this.$H,u=this.$m,a=this.$M,o=n.weekdays,c=n.months,f=n.meridiem,h=function(t,n,i,s){return t&&(t[n]||t(e,r))||i[n].slice(0,s)},d=function(t){return b.s(s%12||12,t,"0")},$=f||function(t,e,n){var r=t<12?"AM":"PM";return n?r.toLowerCase():r};return r.replace(y,(function(t,r){return r||function(t){switch(t){case"YY":return String(e.$y).slice(-2);case"YYYY":return b.s(e.$y,4,"0");case"M":return a+1;case"MM":return b.s(a+1,2,"0");case"MMM":return h(n.monthsShort,a,c,3);case"MMMM":return h(c,a);case"D":return e.$D;case"DD":return b.s(e.$D,2,"0");case"d":return String(e.$W);case"dd":return h(n.weekdaysMin,e.$W,o,2);case"ddd":return h(n.weekdaysShort,e.$W,o,3);case"dddd":return o[e.$W];case"H":return String(s);case"HH":return b.s(s,2,"0");case"h":return d(1);case"hh":return d(2);case"a":return $(s,u,!0);case"A":return $(s,u,!1);case"m":return String(u);case"mm":return b.s(u,2,"0");case"s":return String(e.$s);case"ss":return b.s(e.$s,2,"0");case"SSS":return b.s(e.$ms,3,"0");case"Z":return i}return null}(t)||i.replace(":","")}))},m.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},m.diff=function(r,d,l){var $,y=this,M=b.p(d),m=O(r),v=(m.utcOffset()-this.utcOffset())*e,g=this-m,D=function(){return b.m(y,m)};switch(M){case h:$=D()/12;break;case c:$=D();break;case f:$=D()/3;break;case o:$=(g-v)/6048e5;break;case a:$=(g-v)/864e5;break;case u:$=g/n;break;case s:$=g/e;break;case i:$=g/t;break;default:$=g}return l?$:b.a($)},m.daysInMonth=function(){return this.endOf(c).$D},m.$locale=function(){return D[this.$L]},m.locale=function(t,e){if(!t)return this.$L;var n=this.clone(),r=w(t,e,!0);return r&&(n.$L=r),n},m.clone=function(){return b.w(this.$d,this)},m.toDate=function(){return new Date(this.valueOf())},m.toJSON=function(){return this.isValid()?this.toISOString():null},m.toISOString=function(){return this.$d.toISOString()},m.toString=function(){return this.$d.toUTCString()},M}(),k=_.prototype;return O.prototype=k,[["$ms",r],["$s",i],["$m",s],["$H",u],["$W",a],["$M",c],["$y",h],["$D",d]].forEach((function(t){k[t[1]]=function(e){return this.$g(e,t[0],t[1])}})),O.extend=function(t,e){return t.$i||(t(e,_,O),t.$i=!0),O},O.locale=w,O.isDayjs=S,O.unix=function(t){return O(1e3*t)},O.en=D[g],O.Ls=D,O.p={},O}));
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/constant.js b/node_modules/dayjs/esm/constant.js
new file mode 100644
index 0000000..02ffe1b
--- /dev/null
+++ b/node_modules/dayjs/esm/constant.js
@@ -0,0 +1,25 @@
+export var SECONDS_A_MINUTE = 60;
+export var SECONDS_A_HOUR = SECONDS_A_MINUTE * 60;
+export var SECONDS_A_DAY = SECONDS_A_HOUR * 24;
+export var SECONDS_A_WEEK = SECONDS_A_DAY * 7;
+export var MILLISECONDS_A_SECOND = 1e3;
+export var MILLISECONDS_A_MINUTE = SECONDS_A_MINUTE * MILLISECONDS_A_SECOND;
+export var MILLISECONDS_A_HOUR = SECONDS_A_HOUR * MILLISECONDS_A_SECOND;
+export var MILLISECONDS_A_DAY = SECONDS_A_DAY * MILLISECONDS_A_SECOND;
+export var MILLISECONDS_A_WEEK = SECONDS_A_WEEK * MILLISECONDS_A_SECOND; // English locales
+
+export var MS = 'millisecond';
+export var S = 'second';
+export var MIN = 'minute';
+export var H = 'hour';
+export var D = 'day';
+export var W = 'week';
+export var M = 'month';
+export var Q = 'quarter';
+export var Y = 'year';
+export var DATE = 'date';
+export var FORMAT_DEFAULT = 'YYYY-MM-DDTHH:mm:ssZ';
+export var INVALID_DATE_STRING = 'Invalid Date'; // regex
+
+export var REGEX_PARSE = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/;
+export var REGEX_FORMAT = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/index.d.ts b/node_modules/dayjs/esm/index.d.ts
new file mode 100644
index 0000000..766bd79
--- /dev/null
+++ b/node_modules/dayjs/esm/index.d.ts
@@ -0,0 +1,429 @@
+/// <reference path="./locale/index.d.ts" />
+
+export = dayjs;
+
+declare function dayjs (date?: dayjs.ConfigType): dayjs.Dayjs
+
+declare function dayjs (date?: dayjs.ConfigType, format?: dayjs.OptionType, strict?: boolean): dayjs.Dayjs
+
+declare function dayjs (date?: dayjs.ConfigType, format?: dayjs.OptionType, locale?: string, strict?: boolean): dayjs.Dayjs
+
+declare namespace dayjs {
+  interface ConfigTypeMap {
+    default: string | number | Date | Dayjs | null | undefined
+  }
+
+  export type ConfigType = ConfigTypeMap[keyof ConfigTypeMap]
+
+  export interface FormatObject { locale?: string, format?: string, utc?: boolean }
+
+  export type OptionType = FormatObject | string | string[]
+
+  export type UnitTypeShort = 'd' | 'D' | 'M' | 'y' | 'h' | 'm' | 's' | 'ms'
+
+  export type UnitTypeLong = 'millisecond' | 'second' | 'minute' | 'hour' | 'day' | 'month' | 'year' | 'date'
+
+  export type UnitTypeLongPlural = 'milliseconds' | 'seconds' | 'minutes' | 'hours' | 'days' | 'months' | 'years' | 'dates'
+  
+  export type UnitType = UnitTypeLong | UnitTypeLongPlural | UnitTypeShort;
+
+  export type OpUnitType = UnitType | "week" | "weeks" | 'w';
+  export type QUnitType = UnitType | "quarter" | "quarters" | 'Q';
+  export type ManipulateType = Exclude<OpUnitType, 'date' | 'dates'>;
+  class Dayjs {
+    constructor (config?: ConfigType)
+    /**
+     * All Day.js objects are immutable. Still, `dayjs#clone` can create a clone of the current object if you need one.
+     * ```
+     * dayjs().clone()// => Dayjs
+     * dayjs(dayjs('2019-01-25')) // passing a Dayjs object to a constructor will also clone it
+     * ```
+     * Docs: https://day.js.org/docs/en/parse/dayjs-clone
+     */
+    clone(): Dayjs
+    /**
+     * This returns a `boolean` indicating whether the Day.js object contains a valid date or not.
+     * ```
+     * dayjs().isValid()// => boolean
+     * ```
+     * Docs: https://day.js.org/docs/en/parse/is-valid
+     */
+    isValid(): boolean
+    /**
+     * Get the year.
+     * ```
+     * dayjs().year()// => 2020
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/year
+     */
+    year(): number
+    /**
+     * Set the year.
+     * ```
+     * dayjs().year(2000)// => Dayjs
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/year
+     */
+    year(value: number): Dayjs
+    /**
+     * Get the month.
+     *
+     * Months are zero indexed, so January is month 0.
+     * ```
+     * dayjs().month()// => 0-11
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/month
+     */
+    month(): number
+    /**
+     * Set the month.
+     *
+     * Months are zero indexed, so January is month 0.
+     *
+     * Accepts numbers from 0 to 11. If the range is exceeded, it will bubble up to the next year.
+     * ```
+     * dayjs().month(0)// => Dayjs
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/month
+     */
+    month(value: number): Dayjs
+    /**
+     * Get the date of the month.
+     * ```
+     * dayjs().date()// => 1-31
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/date
+     */
+    date(): number
+    /**
+     * Set the date of the month.
+     *
+     * Accepts numbers from 1 to 31. If the range is exceeded, it will bubble up to the next months.
+     * ```
+     * dayjs().date(1)// => Dayjs
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/date
+     */
+    date(value: number): Dayjs
+    /**
+     * Get the day of the week.
+     *
+     * Returns numbers from 0 (Sunday) to 6 (Saturday).
+     * ```
+     * dayjs().day()// 0-6
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/day
+     */
+    day(): number
+    /**
+     * Set the day of the week.
+     *
+     * Accepts numbers from 0 (Sunday) to 6 (Saturday). If the range is exceeded, it will bubble up to next weeks.
+     * ```
+     * dayjs().day(0)// => Dayjs
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/day
+     */
+    day(value: number): Dayjs
+    /**
+     * Get the hour.
+     * ```
+     * dayjs().hour()// => 0-23
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/hour
+     */
+    hour(): number
+    /**
+     * Set the hour.
+     *
+     * Accepts numbers from 0 to 23. If the range is exceeded, it will bubble up to the next day.
+     * ```
+     * dayjs().hour(12)// => Dayjs
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/hour
+     */
+    hour(value: number): Dayjs
+    /**
+     * Get the minutes.
+     * ```
+     * dayjs().minute()// => 0-59
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/minute
+     */
+    minute(): number
+    /**
+     * Set the minutes.
+     *
+     * Accepts numbers from 0 to 59. If the range is exceeded, it will bubble up to the next hour.
+     * ```
+     * dayjs().minute(59)// => Dayjs
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/minute
+     */
+    minute(value: number): Dayjs
+    /**
+     * Get the seconds.
+     * ```
+     * dayjs().second()// => 0-59
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/second
+     */
+    second(): number
+    /**
+     * Set the seconds.
+     *
+     * Accepts numbers from 0 to 59. If the range is exceeded, it will bubble up to the next minutes.
+     * ```
+     * dayjs().second(1)// Dayjs
+     * ```
+     */
+    second(value: number): Dayjs
+    /**
+     * Get the milliseconds.
+     * ```
+     * dayjs().millisecond()// => 0-999
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/millisecond
+     */
+    millisecond(): number
+    /**
+     * Set the milliseconds.
+     *
+     * Accepts numbers from 0 to 999. If the range is exceeded, it will bubble up to the next seconds.
+     * ```
+     * dayjs().millisecond(1)// => Dayjs
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/millisecond
+     */
+    millisecond(value: number): Dayjs
+    /**
+     * Generic setter, accepting unit as first argument, and value as second, returns a new instance with the applied changes.
+     *
+     * In general:
+     * ```
+     * dayjs().set(unit, value) === dayjs()[unit](value)
+     * ```
+     * Units are case insensitive, and support plural and short forms.
+     * ```
+     * dayjs().set('date', 1)
+     * dayjs().set('month', 3) // April
+     * dayjs().set('second', 30)
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/set
+     */
+    set(unit: UnitType, value: number): Dayjs
+    /**
+     * String getter, returns the corresponding information getting from Day.js object.
+     *
+     * In general:
+     * ```
+     * dayjs().get(unit) === dayjs()[unit]()
+     * ```
+     * Units are case insensitive, and support plural and short forms.
+     * ```
+     * dayjs().get('year')
+     * dayjs().get('month') // start 0
+     * dayjs().get('date')
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/get
+     */
+    get(unit: UnitType): number
+    /**
+     * Returns a cloned Day.js object with a specified amount of time added.
+     * ```
+     * dayjs().add(7, 'day')// => Dayjs
+     * ```
+     * Units are case insensitive, and support plural and short forms.
+     *
+     * Docs: https://day.js.org/docs/en/manipulate/add
+     */
+    add(value: number, unit?: ManipulateType): Dayjs
+    /**
+     * Returns a cloned Day.js object with a specified amount of time subtracted.
+     * ```
+     * dayjs().subtract(7, 'year')// => Dayjs
+     * ```
+     * Units are case insensitive, and support plural and short forms.
+     *
+     * Docs: https://day.js.org/docs/en/manipulate/subtract
+     */
+    subtract(value: number, unit?: ManipulateType): Dayjs
+    /**
+     * Returns a cloned Day.js object and set it to the start of a unit of time.
+     * ```
+     * dayjs().startOf('year')// => Dayjs
+     * ```
+     * Units are case insensitive, and support plural and short forms.
+     *
+     * Docs: https://day.js.org/docs/en/manipulate/start-of
+     */
+    startOf(unit: OpUnitType): Dayjs
+    /**
+     * Returns a cloned Day.js object and set it to the end of a unit of time.
+     * ```
+     * dayjs().endOf('month')// => Dayjs
+     * ```
+     * Units are case insensitive, and support plural and short forms.
+     *
+     * Docs: https://day.js.org/docs/en/manipulate/end-of
+     */
+    endOf(unit: OpUnitType): Dayjs
+    /**
+     * Get the formatted date according to the string of tokens passed in.
+     *
+     * To escape characters, wrap them in square brackets (e.g. [MM]).
+     * ```
+     * dayjs().format()// => current date in ISO8601, without fraction seconds e.g. '2020-04-02T08:02:17-05:00'
+     * dayjs('2019-01-25').format('[YYYYescape] YYYY-MM-DDTHH:mm:ssZ[Z]')// 'YYYYescape 2019-01-25T00:00:00-02:00Z'
+     * dayjs('2019-01-25').format('DD/MM/YYYY') // '25/01/2019'
+     * ```
+     * Docs: https://day.js.org/docs/en/display/format
+     */
+    format(template?: string): string
+    /**
+     * This indicates the difference between two date-time in the specified unit.
+     *
+     * To get the difference in milliseconds, use `dayjs#diff`
+     * ```
+     * const date1 = dayjs('2019-01-25')
+     * const date2 = dayjs('2018-06-05')
+     * date1.diff(date2) // 20214000000 default milliseconds
+     * date1.diff() // milliseconds to current time
+     * ```
+     *
+     * To get the difference in another unit of measurement, pass that measurement as the second argument.
+     * ```
+     * const date1 = dayjs('2019-01-25')
+     * date1.diff('2018-06-05', 'month') // 7
+     * ```
+     * Units are case insensitive, and support plural and short forms.
+     *
+     * Docs: https://day.js.org/docs/en/display/difference
+     */
+    diff(date?: ConfigType, unit?: QUnitType | OpUnitType, float?: boolean): number
+    /**
+     * This returns the number of **milliseconds** since the Unix Epoch of the Day.js object.
+     * ```
+     * dayjs('2019-01-25').valueOf() // 1548381600000
+     * +dayjs(1548381600000) // 1548381600000
+     * ```
+     * To get a Unix timestamp (the number of seconds since the epoch) from a Day.js object, you should use Unix Timestamp `dayjs#unix()`.
+     *
+     * Docs: https://day.js.org/docs/en/display/unix-timestamp-milliseconds
+     */
+    valueOf(): number
+    /**
+     * This returns the Unix timestamp (the number of **seconds** since the Unix Epoch) of the Day.js object.
+     * ```
+     * dayjs('2019-01-25').unix() // 1548381600
+     * ```
+     * This value is floored to the nearest second, and does not include a milliseconds component.
+     *
+     * Docs: https://day.js.org/docs/en/display/unix-timestamp
+     */
+    unix(): number
+    /**
+     * Get the number of days in the current month.
+     * ```
+     * dayjs('2019-01-25').daysInMonth() // 31
+     * ```
+     * Docs: https://day.js.org/docs/en/display/days-in-month
+     */
+    daysInMonth(): number
+    /**
+     * To get a copy of the native `Date` object parsed from the Day.js object use `dayjs#toDate`.
+     * ```
+     * dayjs('2019-01-25').toDate()// => Date
+     * ```
+     */
+    toDate(): Date
+    /**
+     * To serialize as an ISO 8601 string.
+     * ```
+     * dayjs('2019-01-25').toJSON() // '2019-01-25T02:00:00.000Z'
+     * ```
+     * Docs: https://day.js.org/docs/en/display/as-json
+     */
+    toJSON(): string
+    /**
+     * To format as an ISO 8601 string.
+     * ```
+     * dayjs('2019-01-25').toISOString() // '2019-01-25T02:00:00.000Z'
+     * ```
+     * Docs: https://day.js.org/docs/en/display/as-iso-string
+     */
+    toISOString(): string
+    /**
+     * Returns a string representation of the date.
+     * ```
+     * dayjs('2019-01-25').toString() // 'Fri, 25 Jan 2019 02:00:00 GMT'
+     * ```
+     * Docs: https://day.js.org/docs/en/display/as-string
+     */
+    toString(): string
+    /**
+     * Get the UTC offset in minutes.
+     * ```
+     * dayjs().utcOffset()
+     * ```
+     * Docs: https://day.js.org/docs/en/manipulate/utc-offset
+     */
+    utcOffset(): number
+    /**
+     * This indicates whether the Day.js object is before the other supplied date-time.
+     * ```
+     * dayjs().isBefore(dayjs('2011-01-01')) // default milliseconds
+     * ```
+     * If you want to limit the granularity to a unit other than milliseconds, pass it as the second parameter.
+     * ```
+     * dayjs().isBefore('2011-01-01', 'year')// => boolean
+     * ```
+     * Units are case insensitive, and support plural and short forms.
+     *
+     * Docs: https://day.js.org/docs/en/query/is-before
+     */
+    isBefore(date?: ConfigType, unit?: OpUnitType): boolean
+    /**
+     * This indicates whether the Day.js object is the same as the other supplied date-time.
+     * ```
+     * dayjs().isSame(dayjs('2011-01-01')) // default milliseconds
+     * ```
+     * If you want to limit the granularity to a unit other than milliseconds, pass it as the second parameter.
+     * ```
+     * dayjs().isSame('2011-01-01', 'year')// => boolean
+     * ```
+     * Docs: https://day.js.org/docs/en/query/is-same
+     */
+    isSame(date?: ConfigType, unit?: OpUnitType): boolean
+    /**
+     * This indicates whether the Day.js object is after the other supplied date-time.
+     * ```
+     * dayjs().isAfter(dayjs('2011-01-01')) // default milliseconds
+     * ```
+     * If you want to limit the granularity to a unit other than milliseconds, pass it as the second parameter.
+     * ```
+     * dayjs().isAfter('2011-01-01', 'year')// => boolean
+     * ```
+     * Units are case insensitive, and support plural and short forms.
+     *
+     * Docs: https://day.js.org/docs/en/query/is-after
+     */
+    isAfter(date?: ConfigType, unit?: OpUnitType): boolean
+
+    locale(): string
+
+    locale(preset: string | ILocale, object?: Partial<ILocale>): Dayjs
+  }
+
+  export type PluginFunc<T = unknown> = (option: T, c: typeof Dayjs, d: typeof dayjs) => void
+
+  export function extend<T = unknown>(plugin: PluginFunc<T>, option?: T): Dayjs
+
+  export function locale(preset?: string | ILocale, object?: Partial<ILocale>, isLocal?: boolean): string
+
+  export function isDayjs(d: any): d is Dayjs
+
+  export function unix(t: number): Dayjs
+
+  const Ls : { [key: string] :  ILocale }
+}
diff --git a/node_modules/dayjs/esm/index.js b/node_modules/dayjs/esm/index.js
new file mode 100644
index 0000000..a82986b
--- /dev/null
+++ b/node_modules/dayjs/esm/index.js
@@ -0,0 +1,541 @@
+import * as C from './constant';
+import en from './locale/en';
+import U from './utils';
+var L = 'en'; // global locale
+
+var Ls = {}; // global loaded locale
+
+Ls[L] = en;
+var IS_DAYJS = '$isDayjsObject'; // eslint-disable-next-line no-use-before-define
+
+var isDayjs = function isDayjs(d) {
+  return d instanceof Dayjs || !!(d && d[IS_DAYJS]);
+};
+
+var parseLocale = function parseLocale(preset, object, isLocal) {
+  var l;
+  if (!preset) return L;
+
+  if (typeof preset === 'string') {
+    var presetLower = preset.toLowerCase();
+
+    if (Ls[presetLower]) {
+      l = presetLower;
+    }
+
+    if (object) {
+      Ls[presetLower] = object;
+      l = presetLower;
+    }
+
+    var presetSplit = preset.split('-');
+
+    if (!l && presetSplit.length > 1) {
+      return parseLocale(presetSplit[0]);
+    }
+  } else {
+    var name = preset.name;
+    Ls[name] = preset;
+    l = name;
+  }
+
+  if (!isLocal && l) L = l;
+  return l || !isLocal && L;
+};
+
+var dayjs = function dayjs(date, c) {
+  if (isDayjs(date)) {
+    return date.clone();
+  } // eslint-disable-next-line no-nested-ternary
+
+
+  var cfg = typeof c === 'object' ? c : {};
+  cfg.date = date;
+  cfg.args = arguments; // eslint-disable-line prefer-rest-params
+
+  return new Dayjs(cfg); // eslint-disable-line no-use-before-define
+};
+
+var wrapper = function wrapper(date, instance) {
+  return dayjs(date, {
+    locale: instance.$L,
+    utc: instance.$u,
+    x: instance.$x,
+    $offset: instance.$offset // todo: refactor; do not use this.$offset in you code
+
+  });
+};
+
+var Utils = U; // for plugin use
+
+Utils.l = parseLocale;
+Utils.i = isDayjs;
+Utils.w = wrapper;
+
+var parseDate = function parseDate(cfg) {
+  var date = cfg.date,
+      utc = cfg.utc;
+  if (date === null) return new Date(NaN); // null is invalid
+
+  if (Utils.u(date)) return new Date(); // today
+
+  if (date instanceof Date) return new Date(date);
+
+  if (typeof date === 'string' && !/Z$/i.test(date)) {
+    var d = date.match(C.REGEX_PARSE);
+
+    if (d) {
+      var m = d[2] - 1 || 0;
+      var ms = (d[7] || '0').substring(0, 3);
+
+      if (utc) {
+        return new Date(Date.UTC(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms));
+      }
+
+      return new Date(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms);
+    }
+  }
+
+  return new Date(date); // everything else
+};
+
+var Dayjs = /*#__PURE__*/function () {
+  function Dayjs(cfg) {
+    this.$L = parseLocale(cfg.locale, null, true);
+    this.parse(cfg); // for plugin
+
+    this.$x = this.$x || cfg.x || {};
+    this[IS_DAYJS] = true;
+  }
+
+  var _proto = Dayjs.prototype;
+
+  _proto.parse = function parse(cfg) {
+    this.$d = parseDate(cfg);
+    this.init();
+  };
+
+  _proto.init = function init() {
+    var $d = this.$d;
+    this.$y = $d.getFullYear();
+    this.$M = $d.getMonth();
+    this.$D = $d.getDate();
+    this.$W = $d.getDay();
+    this.$H = $d.getHours();
+    this.$m = $d.getMinutes();
+    this.$s = $d.getSeconds();
+    this.$ms = $d.getMilliseconds();
+  } // eslint-disable-next-line class-methods-use-this
+  ;
+
+  _proto.$utils = function $utils() {
+    return Utils;
+  };
+
+  _proto.isValid = function isValid() {
+    return !(this.$d.toString() === C.INVALID_DATE_STRING);
+  };
+
+  _proto.isSame = function isSame(that, units) {
+    var other = dayjs(that);
+    return this.startOf(units) <= other && other <= this.endOf(units);
+  };
+
+  _proto.isAfter = function isAfter(that, units) {
+    return dayjs(that) < this.startOf(units);
+  };
+
+  _proto.isBefore = function isBefore(that, units) {
+    return this.endOf(units) < dayjs(that);
+  };
+
+  _proto.$g = function $g(input, get, set) {
+    if (Utils.u(input)) return this[get];
+    return this.set(set, input);
+  };
+
+  _proto.unix = function unix() {
+    return Math.floor(this.valueOf() / 1000);
+  };
+
+  _proto.valueOf = function valueOf() {
+    // timezone(hour) * 60 * 60 * 1000 => ms
+    return this.$d.getTime();
+  };
+
+  _proto.startOf = function startOf(units, _startOf) {
+    var _this = this;
+
+    // startOf -> endOf
+    var isStartOf = !Utils.u(_startOf) ? _startOf : true;
+    var unit = Utils.p(units);
+
+    var instanceFactory = function instanceFactory(d, m) {
+      var ins = Utils.w(_this.$u ? Date.UTC(_this.$y, m, d) : new Date(_this.$y, m, d), _this);
+      return isStartOf ? ins : ins.endOf(C.D);
+    };
+
+    var instanceFactorySet = function instanceFactorySet(method, slice) {
+      var argumentStart = [0, 0, 0, 0];
+      var argumentEnd = [23, 59, 59, 999];
+      return Utils.w(_this.toDate()[method].apply( // eslint-disable-line prefer-spread
+      _this.toDate('s'), (isStartOf ? argumentStart : argumentEnd).slice(slice)), _this);
+    };
+
+    var $W = this.$W,
+        $M = this.$M,
+        $D = this.$D;
+    var utcPad = "set" + (this.$u ? 'UTC' : '');
+
+    switch (unit) {
+      case C.Y:
+        return isStartOf ? instanceFactory(1, 0) : instanceFactory(31, 11);
+
+      case C.M:
+        return isStartOf ? instanceFactory(1, $M) : instanceFactory(0, $M + 1);
+
+      case C.W:
+        {
+          var weekStart = this.$locale().weekStart || 0;
+          var gap = ($W < weekStart ? $W + 7 : $W) - weekStart;
+          return instanceFactory(isStartOf ? $D - gap : $D + (6 - gap), $M);
+        }
+
+      case C.D:
+      case C.DATE:
+        return instanceFactorySet(utcPad + "Hours", 0);
+
+      case C.H:
+        return instanceFactorySet(utcPad + "Minutes", 1);
+
+      case C.MIN:
+        return instanceFactorySet(utcPad + "Seconds", 2);
+
+      case C.S:
+        return instanceFactorySet(utcPad + "Milliseconds", 3);
+
+      default:
+        return this.clone();
+    }
+  };
+
+  _proto.endOf = function endOf(arg) {
+    return this.startOf(arg, false);
+  };
+
+  _proto.$set = function $set(units, _int) {
+    var _C$D$C$DATE$C$M$C$Y$C;
+
+    // private set
+    var unit = Utils.p(units);
+    var utcPad = "set" + (this.$u ? 'UTC' : '');
+    var name = (_C$D$C$DATE$C$M$C$Y$C = {}, _C$D$C$DATE$C$M$C$Y$C[C.D] = utcPad + "Date", _C$D$C$DATE$C$M$C$Y$C[C.DATE] = utcPad + "Date", _C$D$C$DATE$C$M$C$Y$C[C.M] = utcPad + "Month", _C$D$C$DATE$C$M$C$Y$C[C.Y] = utcPad + "FullYear", _C$D$C$DATE$C$M$C$Y$C[C.H] = utcPad + "Hours", _C$D$C$DATE$C$M$C$Y$C[C.MIN] = utcPad + "Minutes", _C$D$C$DATE$C$M$C$Y$C[C.S] = utcPad + "Seconds", _C$D$C$DATE$C$M$C$Y$C[C.MS] = utcPad + "Milliseconds", _C$D$C$DATE$C$M$C$Y$C)[unit];
+    var arg = unit === C.D ? this.$D + (_int - this.$W) : _int;
+
+    if (unit === C.M || unit === C.Y) {
+      // clone is for badMutable plugin
+      var date = this.clone().set(C.DATE, 1);
+      date.$d[name](arg);
+      date.init();
+      this.$d = date.set(C.DATE, Math.min(this.$D, date.daysInMonth())).$d;
+    } else if (name) this.$d[name](arg);
+
+    this.init();
+    return this;
+  };
+
+  _proto.set = function set(string, _int2) {
+    return this.clone().$set(string, _int2);
+  };
+
+  _proto.get = function get(unit) {
+    return this[Utils.p(unit)]();
+  };
+
+  _proto.add = function add(number, units) {
+    var _this2 = this,
+        _C$MIN$C$H$C$S$unit;
+
+    number = Number(number); // eslint-disable-line no-param-reassign
+
+    var unit = Utils.p(units);
+
+    var instanceFactorySet = function instanceFactorySet(n) {
+      var d = dayjs(_this2);
+      return Utils.w(d.date(d.date() + Math.round(n * number)), _this2);
+    };
+
+    if (unit === C.M) {
+      return this.set(C.M, this.$M + number);
+    }
+
+    if (unit === C.Y) {
+      return this.set(C.Y, this.$y + number);
+    }
+
+    if (unit === C.D) {
+      return instanceFactorySet(1);
+    }
+
+    if (unit === C.W) {
+      return instanceFactorySet(7);
+    }
+
+    var step = (_C$MIN$C$H$C$S$unit = {}, _C$MIN$C$H$C$S$unit[C.MIN] = C.MILLISECONDS_A_MINUTE, _C$MIN$C$H$C$S$unit[C.H] = C.MILLISECONDS_A_HOUR, _C$MIN$C$H$C$S$unit[C.S] = C.MILLISECONDS_A_SECOND, _C$MIN$C$H$C$S$unit)[unit] || 1; // ms
+
+    var nextTimeStamp = this.$d.getTime() + number * step;
+    return Utils.w(nextTimeStamp, this);
+  };
+
+  _proto.subtract = function subtract(number, string) {
+    return this.add(number * -1, string);
+  };
+
+  _proto.format = function format(formatStr) {
+    var _this3 = this;
+
+    var locale = this.$locale();
+    if (!this.isValid()) return locale.invalidDate || C.INVALID_DATE_STRING;
+    var str = formatStr || C.FORMAT_DEFAULT;
+    var zoneStr = Utils.z(this);
+    var $H = this.$H,
+        $m = this.$m,
+        $M = this.$M;
+    var weekdays = locale.weekdays,
+        months = locale.months,
+        meridiem = locale.meridiem;
+
+    var getShort = function getShort(arr, index, full, length) {
+      return arr && (arr[index] || arr(_this3, str)) || full[index].slice(0, length);
+    };
+
+    var get$H = function get$H(num) {
+      return Utils.s($H % 12 || 12, num, '0');
+    };
+
+    var meridiemFunc = meridiem || function (hour, minute, isLowercase) {
+      var m = hour < 12 ? 'AM' : 'PM';
+      return isLowercase ? m.toLowerCase() : m;
+    };
+
+    var matches = function matches(match) {
+      switch (match) {
+        case 'YY':
+          return String(_this3.$y).slice(-2);
+
+        case 'YYYY':
+          return Utils.s(_this3.$y, 4, '0');
+
+        case 'M':
+          return $M + 1;
+
+        case 'MM':
+          return Utils.s($M + 1, 2, '0');
+
+        case 'MMM':
+          return getShort(locale.monthsShort, $M, months, 3);
+
+        case 'MMMM':
+          return getShort(months, $M);
+
+        case 'D':
+          return _this3.$D;
+
+        case 'DD':
+          return Utils.s(_this3.$D, 2, '0');
+
+        case 'd':
+          return String(_this3.$W);
+
+        case 'dd':
+          return getShort(locale.weekdaysMin, _this3.$W, weekdays, 2);
+
+        case 'ddd':
+          return getShort(locale.weekdaysShort, _this3.$W, weekdays, 3);
+
+        case 'dddd':
+          return weekdays[_this3.$W];
+
+        case 'H':
+          return String($H);
+
+        case 'HH':
+          return Utils.s($H, 2, '0');
+
+        case 'h':
+          return get$H(1);
+
+        case 'hh':
+          return get$H(2);
+
+        case 'a':
+          return meridiemFunc($H, $m, true);
+
+        case 'A':
+          return meridiemFunc($H, $m, false);
+
+        case 'm':
+          return String($m);
+
+        case 'mm':
+          return Utils.s($m, 2, '0');
+
+        case 's':
+          return String(_this3.$s);
+
+        case 'ss':
+          return Utils.s(_this3.$s, 2, '0');
+
+        case 'SSS':
+          return Utils.s(_this3.$ms, 3, '0');
+
+        case 'Z':
+          return zoneStr;
+        // 'ZZ' logic below
+
+        default:
+          break;
+      }
+
+      return null;
+    };
+
+    return str.replace(C.REGEX_FORMAT, function (match, $1) {
+      return $1 || matches(match) || zoneStr.replace(':', '');
+    }); // 'ZZ'
+  };
+
+  _proto.utcOffset = function utcOffset() {
+    // Because a bug at FF24, we're rounding the timezone offset around 15 minutes
+    // https://github.com/moment/moment/pull/1871
+    return -Math.round(this.$d.getTimezoneOffset() / 15) * 15;
+  };
+
+  _proto.diff = function diff(input, units, _float) {
+    var _this4 = this;
+
+    var unit = Utils.p(units);
+    var that = dayjs(input);
+    var zoneDelta = (that.utcOffset() - this.utcOffset()) * C.MILLISECONDS_A_MINUTE;
+    var diff = this - that;
+
+    var getMonth = function getMonth() {
+      return Utils.m(_this4, that);
+    };
+
+    var result;
+
+    switch (unit) {
+      case C.Y:
+        result = getMonth() / 12;
+        break;
+
+      case C.M:
+        result = getMonth();
+        break;
+
+      case C.Q:
+        result = getMonth() / 3;
+        break;
+
+      case C.W:
+        result = (diff - zoneDelta) / C.MILLISECONDS_A_WEEK;
+        break;
+
+      case C.D:
+        result = (diff - zoneDelta) / C.MILLISECONDS_A_DAY;
+        break;
+
+      case C.H:
+        result = diff / C.MILLISECONDS_A_HOUR;
+        break;
+
+      case C.MIN:
+        result = diff / C.MILLISECONDS_A_MINUTE;
+        break;
+
+      case C.S:
+        result = diff / C.MILLISECONDS_A_SECOND;
+        break;
+
+      default:
+        result = diff; // milliseconds
+
+        break;
+    }
+
+    return _float ? result : Utils.a(result);
+  };
+
+  _proto.daysInMonth = function daysInMonth() {
+    return this.endOf(C.M).$D;
+  };
+
+  _proto.$locale = function $locale() {
+    // get locale object
+    return Ls[this.$L];
+  };
+
+  _proto.locale = function locale(preset, object) {
+    if (!preset) return this.$L;
+    var that = this.clone();
+    var nextLocaleName = parseLocale(preset, object, true);
+    if (nextLocaleName) that.$L = nextLocaleName;
+    return that;
+  };
+
+  _proto.clone = function clone() {
+    return Utils.w(this.$d, this);
+  };
+
+  _proto.toDate = function toDate() {
+    return new Date(this.valueOf());
+  };
+
+  _proto.toJSON = function toJSON() {
+    return this.isValid() ? this.toISOString() : null;
+  };
+
+  _proto.toISOString = function toISOString() {
+    // ie 8 return
+    // new Dayjs(this.valueOf() + this.$d.getTimezoneOffset() * 60000)
+    // .format('YYYY-MM-DDTHH:mm:ss.SSS[Z]')
+    return this.$d.toISOString();
+  };
+
+  _proto.toString = function toString() {
+    return this.$d.toUTCString();
+  };
+
+  return Dayjs;
+}();
+
+var proto = Dayjs.prototype;
+dayjs.prototype = proto;
+[['$ms', C.MS], ['$s', C.S], ['$m', C.MIN], ['$H', C.H], ['$W', C.D], ['$M', C.M], ['$y', C.Y], ['$D', C.DATE]].forEach(function (g) {
+  proto[g[1]] = function (input) {
+    return this.$g(input, g[0], g[1]);
+  };
+});
+
+dayjs.extend = function (plugin, option) {
+  if (!plugin.$i) {
+    // install plugin only once
+    plugin(option, Dayjs, dayjs);
+    plugin.$i = true;
+  }
+
+  return dayjs;
+};
+
+dayjs.locale = parseLocale;
+dayjs.isDayjs = isDayjs;
+
+dayjs.unix = function (timestamp) {
+  return dayjs(timestamp * 1e3);
+};
+
+dayjs.en = Ls[L];
+dayjs.Ls = Ls;
+dayjs.p = {};
+export default dayjs;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/af.js b/node_modules/dayjs/esm/locale/af.js
new file mode 100644
index 0000000..ce0c285
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/af.js
@@ -0,0 +1,39 @@
+// Afrikaans [af]
+import dayjs from '../index';
+var locale = {
+  name: 'af',
+  weekdays: 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'),
+  months: 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'),
+  monthsShort: 'Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'),
+  weekdaysMin: 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd, D MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: 'oor %s',
+    past: '%s gelede',
+    s: "'n paar sekondes",
+    m: "'n minuut",
+    mm: '%d minute',
+    h: "'n uur",
+    hh: '%d ure',
+    d: "'n dag",
+    dd: '%d dae',
+    M: "'n maand",
+    MM: '%d maande',
+    y: "'n jaar",
+    yy: '%d jaar'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/am.js b/node_modules/dayjs/esm/locale/am.js
new file mode 100644
index 0000000..cf25510
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/am.js
@@ -0,0 +1,40 @@
+// Amharic [am]
+import dayjs from '../index';
+var locale = {
+  name: 'am',
+  weekdays: 'እሑድ_ሰኞ_ማክሰኞ_ረቡዕ_ሐሙስ_አርብ_ቅዳሜ'.split('_'),
+  weekdaysShort: 'እሑድ_ሰኞ_ማክሰ_ረቡዕ_ሐሙስ_አርብ_ቅዳሜ'.split('_'),
+  weekdaysMin: 'እሑ_ሰኞ_ማክ_ረቡ_ሐሙ_አር_ቅዳ'.split('_'),
+  months: 'ጃንዋሪ_ፌብሯሪ_ማርች_ኤፕሪል_ሜይ_ጁን_ጁላይ_ኦገስት_ሴፕቴምበር_ኦክቶበር_ኖቬምበር_ዲሴምበር'.split('_'),
+  monthsShort: 'ጃንዋ_ፌብሯ_ማርች_ኤፕሪ_ሜይ_ጁን_ጁላይ_ኦገስ_ሴፕቴ_ኦክቶ_ኖቬም_ዲሴም'.split('_'),
+  weekStart: 1,
+  yearStart: 4,
+  relativeTime: {
+    future: 'በ%s',
+    past: '%s በፊት',
+    s: 'ጥቂት ሰከንዶች',
+    m: 'አንድ ደቂቃ',
+    mm: '%d ደቂቃዎች',
+    h: 'አንድ ሰዓት',
+    hh: '%d ሰዓታት',
+    d: 'አንድ ቀን',
+    dd: '%d ቀናት',
+    M: 'አንድ ወር',
+    MM: '%d ወራት',
+    y: 'አንድ ዓመት',
+    yy: '%d ዓመታት'
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'MMMM D ፣ YYYY',
+    LLL: 'MMMM D ፣ YYYY HH:mm',
+    LLLL: 'dddd ፣ MMMM D ፣ YYYY HH:mm'
+  },
+  ordinal: function ordinal(n) {
+    return n + "\u129B";
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/ar-dz.js b/node_modules/dayjs/esm/locale/ar-dz.js
new file mode 100644
index 0000000..3ecc04f
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/ar-dz.js
@@ -0,0 +1,41 @@
+// Arabic (Algeria) [ar-dz]
+import dayjs from '../index';
+var locale = {
+  name: 'ar-dz',
+  weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+  months: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+  weekdaysShort: 'احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),
+  monthsShort: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+  weekdaysMin: 'أح_إث_ثلا_أر_خم_جم_سب'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd D MMMM YYYY HH:mm'
+  },
+  meridiem: function meridiem(hour) {
+    return hour > 12 ? 'م' : 'ص';
+  },
+  relativeTime: {
+    future: 'في %s',
+    past: 'منذ %s',
+    s: 'ثوان',
+    m: 'دقيقة',
+    mm: '%d دقائق',
+    h: 'ساعة',
+    hh: '%d ساعات',
+    d: 'يوم',
+    dd: '%d أيام',
+    M: 'شهر',
+    MM: '%d أشهر',
+    y: 'سنة',
+    yy: '%d سنوات'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/ar-iq.js b/node_modules/dayjs/esm/locale/ar-iq.js
new file mode 100644
index 0000000..dfe31bf
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/ar-iq.js
@@ -0,0 +1,42 @@
+//  Arabic (Iraq) [ar-iq]
+import dayjs from '../index';
+var locale = {
+  name: 'ar-iq',
+  weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+  months: 'كانون الثاني_شباط_آذار_نيسان_أيار_حزيران_تموز_آب_أيلول_تشرين الأول_ تشرين الثاني_كانون الأول'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+  monthsShort: 'كانون الثاني_شباط_آذار_نيسان_أيار_حزيران_تموز_آب_أيلول_تشرين الأول_ تشرين الثاني_كانون الأول'.split('_'),
+  weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd D MMMM YYYY HH:mm'
+  },
+  meridiem: function meridiem(hour) {
+    return hour > 12 ? 'م' : 'ص';
+  },
+  relativeTime: {
+    future: 'في %s',
+    past: 'منذ %s',
+    s: 'ثوان',
+    m: 'دقيقة',
+    mm: '%d دقائق',
+    h: 'ساعة',
+    hh: '%d ساعات',
+    d: 'يوم',
+    dd: '%d أيام',
+    M: 'شهر',
+    MM: '%d أشهر',
+    y: 'سنة',
+    yy: '%d سنوات'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/ar-kw.js b/node_modules/dayjs/esm/locale/ar-kw.js
new file mode 100644
index 0000000..73bf90a
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/ar-kw.js
@@ -0,0 +1,41 @@
+// Arabic (Kuwait) [ar-kw]
+import dayjs from '../index';
+var locale = {
+  name: 'ar-kw',
+  weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+  months: 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),
+  weekdaysShort: 'احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),
+  monthsShort: 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),
+  weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd D MMMM YYYY HH:mm'
+  },
+  meridiem: function meridiem(hour) {
+    return hour > 12 ? 'م' : 'ص';
+  },
+  relativeTime: {
+    future: 'في %s',
+    past: 'منذ %s',
+    s: 'ثوان',
+    m: 'دقيقة',
+    mm: '%d دقائق',
+    h: 'ساعة',
+    hh: '%d ساعات',
+    d: 'يوم',
+    dd: '%d أيام',
+    M: 'شهر',
+    MM: '%d أشهر',
+    y: 'سنة',
+    yy: '%d سنوات'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/ar-ly.js b/node_modules/dayjs/esm/locale/ar-ly.js
new file mode 100644
index 0000000..5caa869
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/ar-ly.js
@@ -0,0 +1,27 @@
+// Arabic (Lybia) [ar-ly]
+import dayjs from '../index';
+var locale = {
+  name: 'ar-ly',
+  weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+  months: 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+  weekStart: 6,
+  weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+  monthsShort: 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+  weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  meridiem: function meridiem(hour) {
+    return hour > 12 ? 'م' : 'ص';
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'D/‏M/‏YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd D MMMM YYYY HH:mm'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/ar-ma.js b/node_modules/dayjs/esm/locale/ar-ma.js
new file mode 100644
index 0000000..ed6dfef
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/ar-ma.js
@@ -0,0 +1,42 @@
+// Arabic (Morocco) [ar-ma]
+import dayjs from '../index';
+var locale = {
+  name: 'ar-ma',
+  weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+  months: 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),
+  weekStart: 6,
+  weekdaysShort: 'احد_إثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),
+  monthsShort: 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),
+  weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd D MMMM YYYY HH:mm'
+  },
+  meridiem: function meridiem(hour) {
+    return hour > 12 ? 'م' : 'ص';
+  },
+  relativeTime: {
+    future: 'في %s',
+    past: 'منذ %s',
+    s: 'ثوان',
+    m: 'دقيقة',
+    mm: '%d دقائق',
+    h: 'ساعة',
+    hh: '%d ساعات',
+    d: 'يوم',
+    dd: '%d أيام',
+    M: 'شهر',
+    MM: '%d أشهر',
+    y: 'سنة',
+    yy: '%d سنوات'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/ar-sa.js b/node_modules/dayjs/esm/locale/ar-sa.js
new file mode 100644
index 0000000..8eb9687
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/ar-sa.js
@@ -0,0 +1,41 @@
+// Arabic (Saudi Arabia) [ar-sa]
+import dayjs from '../index';
+var locale = {
+  name: 'ar-sa',
+  weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+  months: 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+  weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+  monthsShort: 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+  weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd D MMMM YYYY HH:mm'
+  },
+  meridiem: function meridiem(hour) {
+    return hour > 12 ? 'م' : 'ص';
+  },
+  relativeTime: {
+    future: 'في %s',
+    past: 'منذ %s',
+    s: 'ثوان',
+    m: 'دقيقة',
+    mm: '%d دقائق',
+    h: 'ساعة',
+    hh: '%d ساعات',
+    d: 'يوم',
+    dd: '%d أيام',
+    M: 'شهر',
+    MM: '%d أشهر',
+    y: 'سنة',
+    yy: '%d سنوات'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/ar-tn.js b/node_modules/dayjs/esm/locale/ar-tn.js
new file mode 100644
index 0000000..3c1f2b0
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/ar-tn.js
@@ -0,0 +1,42 @@
+//  Arabic (Tunisia) [ar-tn]
+import dayjs from '../index';
+var locale = {
+  name: 'ar-tn',
+  weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+  months: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+  monthsShort: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+  weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd D MMMM YYYY HH:mm'
+  },
+  meridiem: function meridiem(hour) {
+    return hour > 12 ? 'م' : 'ص';
+  },
+  relativeTime: {
+    future: 'في %s',
+    past: 'منذ %s',
+    s: 'ثوان',
+    m: 'دقيقة',
+    mm: '%d دقائق',
+    h: 'ساعة',
+    hh: '%d ساعات',
+    d: 'يوم',
+    dd: '%d أيام',
+    M: 'شهر',
+    MM: '%d أشهر',
+    y: 'سنة',
+    yy: '%d سنوات'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/ar.js b/node_modules/dayjs/esm/locale/ar.js
new file mode 100644
index 0000000..78b99b8
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/ar.js
@@ -0,0 +1,77 @@
+// Arabic [ar]
+import dayjs from '../index';
+var months = 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_');
+var symbolMap = {
+  1: '١',
+  2: '٢',
+  3: '٣',
+  4: '٤',
+  5: '٥',
+  6: '٦',
+  7: '٧',
+  8: '٨',
+  9: '٩',
+  0: '٠'
+};
+var numberMap = {
+  '١': '1',
+  '٢': '2',
+  '٣': '3',
+  '٤': '4',
+  '٥': '5',
+  '٦': '6',
+  '٧': '7',
+  '٨': '8',
+  '٩': '9',
+  '٠': '0'
+};
+var locale = {
+  name: 'ar',
+  weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+  weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+  weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+  months: months,
+  monthsShort: months,
+  weekStart: 6,
+  meridiem: function meridiem(hour) {
+    return hour > 12 ? 'م' : 'ص';
+  },
+  relativeTime: {
+    future: 'بعد %s',
+    past: 'منذ %s',
+    s: 'ثانية واحدة',
+    m: 'دقيقة واحدة',
+    mm: '%d دقائق',
+    h: 'ساعة واحدة',
+    hh: '%d ساعات',
+    d: 'يوم واحد',
+    dd: '%d أيام',
+    M: 'شهر واحد',
+    MM: '%d أشهر',
+    y: 'عام واحد',
+    yy: '%d أعوام'
+  },
+  preparse: function preparse(string) {
+    return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
+      return numberMap[match];
+    }).replace(/،/g, ',');
+  },
+  postformat: function postformat(string) {
+    return string.replace(/\d/g, function (match) {
+      return symbolMap[match];
+    }).replace(/,/g, '،');
+  },
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'D/‏M/‏YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd D MMMM YYYY HH:mm'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/az.js b/node_modules/dayjs/esm/locale/az.js
new file mode 100644
index 0000000..3505c8a
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/az.js
@@ -0,0 +1,39 @@
+// Azerbaijani [az]
+import dayjs from '../index';
+var locale = {
+  name: 'az',
+  weekdays: 'Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə'.split('_'),
+  weekdaysShort: 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'),
+  weekdaysMin: 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'),
+  months: 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split('_'),
+  monthsShort: 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'),
+  weekStart: 1,
+  formats: {
+    LT: 'H:mm',
+    LTS: 'H:mm:ss',
+    L: 'DD.MM.YYYY',
+    LL: 'D MMMM YYYY г.',
+    LLL: 'D MMMM YYYY г., H:mm',
+    LLLL: 'dddd, D MMMM YYYY г., H:mm'
+  },
+  relativeTime: {
+    future: '%s sonra',
+    past: '%s əvvəl',
+    s: 'bir neçə saniyə',
+    m: 'bir dəqiqə',
+    mm: '%d dəqiqə',
+    h: 'bir saat',
+    hh: '%d saat',
+    d: 'bir gün',
+    dd: '%d gün',
+    M: 'bir ay',
+    MM: '%d ay',
+    y: 'bir il',
+    yy: '%d il'
+  },
+  ordinal: function ordinal(n) {
+    return n;
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/be.js b/node_modules/dayjs/esm/locale/be.js
new file mode 100644
index 0000000..5642e39
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/be.js
@@ -0,0 +1,24 @@
+// Belarusian [be]
+import dayjs from '../index';
+var locale = {
+  name: 'be',
+  weekdays: 'нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу'.split('_'),
+  months: 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
+  monthsShort: 'студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж'.split('_'),
+  weekdaysMin: 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD.MM.YYYY',
+    LL: 'D MMMM YYYY г.',
+    LLL: 'D MMMM YYYY г., HH:mm',
+    LLLL: 'dddd, D MMMM YYYY г., HH:mm'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/bg.js b/node_modules/dayjs/esm/locale/bg.js
new file mode 100644
index 0000000..e60a2a3
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/bg.js
@@ -0,0 +1,55 @@
+// Bulgarian [bg]
+import dayjs from '../index';
+var locale = {
+  name: 'bg',
+  weekdays: 'неделя_понеделник_вторник_сряда_четвъртък_петък_събота'.split('_'),
+  weekdaysShort: 'нед_пон_вто_сря_чет_пет_съб'.split('_'),
+  weekdaysMin: 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
+  months: 'януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември'.split('_'),
+  monthsShort: 'янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек'.split('_'),
+  weekStart: 1,
+  ordinal: function ordinal(n) {
+    var last2Digits = n % 100;
+
+    if (last2Digits > 10 && last2Digits < 20) {
+      return n + "-\u0442\u0438";
+    }
+
+    var lastDigit = n % 10;
+
+    if (lastDigit === 1) {
+      return n + "-\u0432\u0438";
+    } else if (lastDigit === 2) {
+      return n + "-\u0440\u0438";
+    } else if (lastDigit === 7 || lastDigit === 8) {
+      return n + "-\u043C\u0438";
+    }
+
+    return n + "-\u0442\u0438";
+  },
+  formats: {
+    LT: 'H:mm',
+    LTS: 'H:mm:ss',
+    L: 'D.MM.YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY H:mm',
+    LLLL: 'dddd, D MMMM YYYY H:mm'
+  },
+  relativeTime: {
+    future: 'след %s',
+    past: 'преди %s',
+    s: 'няколко секунди',
+    m: 'минута',
+    mm: '%d минути',
+    h: 'час',
+    hh: '%d часа',
+    d: 'ден',
+    dd: '%d дена',
+    M: 'месец',
+    MM: '%d месеца',
+    y: 'година',
+    yy: '%d години'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/bi.js b/node_modules/dayjs/esm/locale/bi.js
new file mode 100644
index 0000000..6230f25
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/bi.js
@@ -0,0 +1,39 @@
+// Bislama [bi]
+import dayjs from '../index';
+var locale = {
+  name: 'bi',
+  weekdays: 'Sande_Mande_Tusde_Wenesde_Tosde_Fraede_Sarade'.split('_'),
+  months: 'Januari_Februari_Maj_Eprel_Mei_Jun_Julae_Okis_Septemba_Oktoba_Novemba_Disemba'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'San_Man_Tus_Wen_Tos_Frae_Sar'.split('_'),
+  monthsShort: 'Jan_Feb_Maj_Epr_Mai_Jun_Jul_Oki_Sep_Okt_Nov_Dis'.split('_'),
+  weekdaysMin: 'San_Ma_Tu_We_To_Fr_Sar'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'h:mm A',
+    LTS: 'h:mm:ss A',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY h:mm A',
+    LLLL: 'dddd, D MMMM YYYY h:mm A'
+  },
+  relativeTime: {
+    future: 'lo %s',
+    past: '%s bifo',
+    s: 'sam seken',
+    m: 'wan minit',
+    mm: '%d minit',
+    h: 'wan haoa',
+    hh: '%d haoa',
+    d: 'wan dei',
+    dd: '%d dei',
+    M: 'wan manis',
+    MM: '%d manis',
+    y: 'wan yia',
+    yy: '%d yia'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/bm.js b/node_modules/dayjs/esm/locale/bm.js
new file mode 100644
index 0000000..0d61093
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/bm.js
@@ -0,0 +1,39 @@
+// Bambara [bm]
+import dayjs from '../index';
+var locale = {
+  name: 'bm',
+  weekdays: 'Kari_Ntɛnɛn_Tarata_Araba_Alamisa_Juma_Sibiri'.split('_'),
+  months: 'Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_Mɛkalo_Zuwɛnkalo_Zuluyekalo_Utikalo_Sɛtanburukalo_ɔkutɔburukalo_Nowanburukalo_Desanburukalo'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'Kar_Ntɛ_Tar_Ara_Ala_Jum_Sib'.split('_'),
+  monthsShort: 'Zan_Few_Mar_Awi_Mɛ_Zuw_Zul_Uti_Sɛt_ɔku_Now_Des'.split('_'),
+  weekdaysMin: 'Ka_Nt_Ta_Ar_Al_Ju_Si'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'MMMM [tile] D [san] YYYY',
+    LLL: 'MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm',
+    LLLL: 'dddd MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm'
+  },
+  relativeTime: {
+    future: '%s kɔnɔ',
+    past: 'a bɛ %s bɔ',
+    s: 'sanga dama dama',
+    m: 'miniti kelen',
+    mm: 'miniti %d',
+    h: 'lɛrɛ kelen',
+    hh: 'lɛrɛ %d',
+    d: 'tile kelen',
+    dd: 'tile %d',
+    M: 'kalo kelen',
+    MM: 'kalo %d',
+    y: 'san kelen',
+    yy: 'san %d'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/bn-bd.js b/node_modules/dayjs/esm/locale/bn-bd.js
new file mode 100644
index 0000000..f13b660
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/bn-bd.js
@@ -0,0 +1,81 @@
+// Bengali (Bangladesh) [bn-bd]
+import dayjs from '../index';
+var symbolMap = {
+  1: '১',
+  2: '২',
+  3: '৩',
+  4: '৪',
+  5: '৫',
+  6: '৬',
+  7: '৭',
+  8: '৮',
+  9: '৯',
+  0: '০'
+};
+var numberMap = {
+  '১': '1',
+  '২': '2',
+  '৩': '3',
+  '৪': '4',
+  '৫': '5',
+  '৬': '6',
+  '৭': '7',
+  '৮': '8',
+  '৯': '9',
+  '০': '0'
+};
+var locale = {
+  name: 'bn-bd',
+  weekdays: 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split('_'),
+  months: 'জানুয়ারি_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split('_'),
+  weekdaysShort: 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'),
+  monthsShort: 'জানু_ফেব্রু_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্ট_অক্টো_নভে_ডিসে'.split('_'),
+  weekdaysMin: 'রবি_সোম_মঙ্গ_বুধ_বৃহঃ_শুক্র_শনি'.split('_'),
+  weekStart: 0,
+  preparse: function preparse(string) {
+    return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) {
+      return numberMap[match];
+    });
+  },
+  postformat: function postformat(string) {
+    return string.replace(/\d/g, function (match) {
+      return symbolMap[match];
+    });
+  },
+  ordinal: function ordinal(n) {
+    var s = ['ই', 'লা', 'রা', 'ঠা', 'শে'];
+    var v = n % 100;
+    return "[" + n + (s[(v - 20) % 10] || s[v] || s[0]) + "]";
+  },
+  formats: {
+    LT: 'A h:mm সময়',
+    LTS: 'A h:mm:ss সময়',
+    L: 'DD/MM/YYYY খ্রিস্টাব্দ',
+    LL: 'D MMMM YYYY খ্রিস্টাব্দ',
+    LLL: 'D MMMM YYYY খ্রিস্টাব্দ, A h:mm সময়',
+    LLLL: 'dddd, D MMMM YYYY খ্রিস্টাব্দ, A h:mm সময়'
+  },
+  meridiem: function meridiem(hour) {
+    return (
+      /* eslint-disable no-nested-ternary */
+      hour < 4 ? 'রাত' : hour < 6 ? 'ভোর' : hour < 12 ? 'সকাল' : hour < 15 ? 'দুপুর' : hour < 18 ? 'বিকাল' : hour < 20 ? 'সন্ধ্যা' : 'রাত'
+    );
+  },
+  relativeTime: {
+    future: '%s পরে',
+    past: '%s আগে',
+    s: 'কয়েক সেকেন্ড',
+    m: 'এক মিনিট',
+    mm: '%d মিনিট',
+    h: 'এক ঘন্টা',
+    hh: '%d ঘন্টা',
+    d: 'এক দিন',
+    dd: '%d দিন',
+    M: 'এক মাস',
+    MM: '%d মাস',
+    y: 'এক বছর',
+    yy: '%d বছর'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/bn.js b/node_modules/dayjs/esm/locale/bn.js
new file mode 100644
index 0000000..25fc170
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/bn.js
@@ -0,0 +1,72 @@
+// Bengali [bn]
+import dayjs from '../index';
+var symbolMap = {
+  1: '১',
+  2: '২',
+  3: '৩',
+  4: '৪',
+  5: '৫',
+  6: '৬',
+  7: '৭',
+  8: '৮',
+  9: '৯',
+  0: '০'
+};
+var numberMap = {
+  '১': '1',
+  '২': '2',
+  '৩': '3',
+  '৪': '4',
+  '৫': '5',
+  '৬': '6',
+  '৭': '7',
+  '৮': '8',
+  '৯': '9',
+  '০': '0'
+};
+var locale = {
+  name: 'bn',
+  weekdays: 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split('_'),
+  months: 'জানুয়ারি_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split('_'),
+  weekdaysShort: 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'),
+  monthsShort: 'জানু_ফেব্রু_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্ট_অক্টো_নভে_ডিসে'.split('_'),
+  weekdaysMin: 'রবি_সোম_মঙ্গ_বুধ_বৃহঃ_শুক্র_শনি'.split('_'),
+  preparse: function preparse(string) {
+    return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) {
+      return numberMap[match];
+    });
+  },
+  postformat: function postformat(string) {
+    return string.replace(/\d/g, function (match) {
+      return symbolMap[match];
+    });
+  },
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'A h:mm সময়',
+    LTS: 'A h:mm:ss সময়',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY, A h:mm সময়',
+    LLLL: 'dddd, D MMMM YYYY, A h:mm সময়'
+  },
+  relativeTime: {
+    future: '%s পরে',
+    past: '%s আগে',
+    s: 'কয়েক সেকেন্ড',
+    m: 'এক মিনিট',
+    mm: '%d মিনিট',
+    h: 'এক ঘন্টা',
+    hh: '%d ঘন্টা',
+    d: 'এক দিন',
+    dd: '%d দিন',
+    M: 'এক মাস',
+    MM: '%d মাস',
+    y: 'এক বছর',
+    yy: '%d বছর'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/bo.js b/node_modules/dayjs/esm/locale/bo.js
new file mode 100644
index 0000000..fce3344
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/bo.js
@@ -0,0 +1,38 @@
+// Tibetan [bo]
+import dayjs from '../index';
+var locale = {
+  name: 'bo',
+  weekdays: 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'),
+  weekdaysShort: 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'),
+  weekdaysMin: 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'),
+  months: 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'),
+  monthsShort: 'ཟླ་དང་པོ_ཟླ་གཉིས་པ_ཟླ་གསུམ་པ_ཟླ་བཞི་པ_ཟླ་ལྔ་པ_ཟླ་དྲུག་པ_ཟླ་བདུན་པ_ཟླ་བརྒྱད་པ_ཟླ་དགུ་པ_ཟླ་བཅུ་པ_ཟླ་བཅུ་གཅིག་པ_ཟླ་བཅུ་གཉིས་པ'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'A h:mm',
+    LTS: 'A h:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY, A h:mm',
+    LLLL: 'dddd, D MMMM YYYY, A h:mm'
+  },
+  relativeTime: {
+    future: '%s ལ་',
+    past: '%s སྔོན་ལ་',
+    s: 'ཏོག་ཙམ་',
+    m: 'སྐར་མ་གཅིག་',
+    mm: 'སྐར་མ་ %d',
+    h: 'ཆུ་ཚོད་གཅིག་',
+    hh: 'ཆུ་ཚོད་ %d',
+    d: 'ཉིན་གཅིག་',
+    dd: 'ཉིན་ %d',
+    M: 'ཟླ་བ་གཅིག་',
+    MM: 'ཟླ་བ་ %d',
+    y: 'ལོ་གཅིག་',
+    yy: 'ལོ་ %d'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/br.js b/node_modules/dayjs/esm/locale/br.js
new file mode 100644
index 0000000..d18b4fe
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/br.js
@@ -0,0 +1,93 @@
+// Breton [br]
+import dayjs from '../index';
+
+function lastNumber(number) {
+  if (number > 9) {
+    return lastNumber(number % 10);
+  }
+
+  return number;
+}
+
+function softMutation(text) {
+  var mutationTable = {
+    m: 'v',
+    b: 'v',
+    d: 'z'
+  };
+  return mutationTable[text.charAt(0)] + text.substring(1);
+}
+
+function mutation(text, number) {
+  if (number === 2) {
+    return softMutation(text);
+  }
+
+  return text;
+}
+
+function relativeTimeWithMutation(number, withoutSuffix, key) {
+  var format = {
+    mm: 'munutenn',
+    MM: 'miz',
+    dd: 'devezh'
+  };
+  return number + " " + mutation(format[key], number);
+}
+
+function specialMutationForYears(number) {
+  /* istanbul ignore next line */
+  switch (lastNumber(number)) {
+    case 1:
+    case 3:
+    case 4:
+    case 5:
+    case 9:
+      return number + " bloaz";
+
+    default:
+      return number + " vloaz";
+  }
+}
+
+var locale = {
+  name: 'br',
+  weekdays: 'Sul_Lun_Meurzh_Mercʼher_Yaou_Gwener_Sadorn'.split('_'),
+  months: 'Genver_Cʼhwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'),
+  monthsShort: 'Gen_Cʼhwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'),
+  weekdaysMin: 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'h[e]mm A',
+    LTS: 'h[e]mm:ss A',
+    L: 'DD/MM/YYYY',
+    LL: 'D [a viz] MMMM YYYY',
+    LLL: 'D [a viz] MMMM YYYY h[e]mm A',
+    LLLL: 'dddd, D [a viz] MMMM YYYY h[e]mm A'
+  },
+  relativeTime: {
+    future: 'a-benn %s',
+    past: '%s ʼzo',
+    s: 'un nebeud segondennoù',
+    m: 'ur vunutenn',
+    mm: relativeTimeWithMutation,
+    h: 'un eur',
+    hh: '%d eur',
+    d: 'un devezh',
+    dd: relativeTimeWithMutation,
+    M: 'ur miz',
+    MM: relativeTimeWithMutation,
+    y: 'ur bloaz',
+    yy: specialMutationForYears
+  },
+  meridiem: function meridiem(hour) {
+    return hour < 12 ? 'a.m.' : 'g.m.';
+  } // a-raok merenn | goude merenn
+
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/bs.js b/node_modules/dayjs/esm/locale/bs.js
new file mode 100644
index 0000000..328a1fe
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/bs.js
@@ -0,0 +1,24 @@
+// Bosnian [bs]
+import dayjs from '../index';
+var locale = {
+  name: 'bs',
+  weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),
+  months: 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
+  monthsShort: 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split('_'),
+  weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'H:mm',
+    LTS: 'H:mm:ss',
+    L: 'DD.MM.YYYY',
+    LL: 'D. MMMM YYYY',
+    LLL: 'D. MMMM YYYY H:mm',
+    LLLL: 'dddd, D. MMMM YYYY H:mm'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/ca.js b/node_modules/dayjs/esm/locale/ca.js
new file mode 100644
index 0000000..94fc0b9
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/ca.js
@@ -0,0 +1,44 @@
+// Catalan [ca]
+import dayjs from '../index';
+var locale = {
+  name: 'ca',
+  weekdays: 'Diumenge_Dilluns_Dimarts_Dimecres_Dijous_Divendres_Dissabte'.split('_'),
+  weekdaysShort: 'Dg._Dl._Dt._Dc._Dj._Dv._Ds.'.split('_'),
+  weekdaysMin: 'Dg_Dl_Dt_Dc_Dj_Dv_Ds'.split('_'),
+  months: 'Gener_Febrer_Març_Abril_Maig_Juny_Juliol_Agost_Setembre_Octubre_Novembre_Desembre'.split('_'),
+  monthsShort: 'Gen._Febr._Març_Abr._Maig_Juny_Jul._Ag._Set._Oct._Nov._Des.'.split('_'),
+  weekStart: 1,
+  formats: {
+    LT: 'H:mm',
+    LTS: 'H:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM [de] YYYY',
+    LLL: 'D MMMM [de] YYYY [a les] H:mm',
+    LLLL: 'dddd D MMMM [de] YYYY [a les] H:mm',
+    ll: 'D MMM YYYY',
+    lll: 'D MMM YYYY, H:mm',
+    llll: 'ddd D MMM YYYY, H:mm'
+  },
+  relativeTime: {
+    future: 'd\'aquí %s',
+    past: 'fa %s',
+    s: 'uns segons',
+    m: 'un minut',
+    mm: '%d minuts',
+    h: 'una hora',
+    hh: '%d hores',
+    d: 'un dia',
+    dd: '%d dies',
+    M: 'un mes',
+    MM: '%d mesos',
+    y: 'un any',
+    yy: '%d anys'
+  },
+  ordinal: function ordinal(n) {
+    var ord;
+    if (n === 1 || n === 3) ord = 'r';else if (n === 2) ord = 'n';else if (n === 4) ord = 't';else ord = 'è';
+    return "" + n + ord;
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/cs.js b/node_modules/dayjs/esm/locale/cs.js
new file mode 100644
index 0000000..165b662
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/cs.js
@@ -0,0 +1,120 @@
+// Czech [cs]
+import dayjs from '../index';
+
+function plural(n) {
+  return n > 1 && n < 5 && ~~(n / 10) !== 1; // eslint-disable-line
+}
+/* eslint-disable */
+
+
+function translate(number, withoutSuffix, key, isFuture) {
+  var result = number + " ";
+
+  switch (key) {
+    case 's':
+      // a few seconds / in a few seconds / a few seconds ago
+      return withoutSuffix || isFuture ? 'pár sekund' : 'pár sekundami';
+
+    case 'm':
+      // a minute / in a minute / a minute ago
+      return withoutSuffix ? 'minuta' : isFuture ? 'minutu' : 'minutou';
+
+    case 'mm':
+      // 9 minutes / in 9 minutes / 9 minutes ago
+      if (withoutSuffix || isFuture) {
+        return result + (plural(number) ? 'minuty' : 'minut');
+      }
+
+      return result + "minutami";
+
+    case 'h':
+      // an hour / in an hour / an hour ago
+      return withoutSuffix ? 'hodina' : isFuture ? 'hodinu' : 'hodinou';
+
+    case 'hh':
+      // 9 hours / in 9 hours / 9 hours ago
+      if (withoutSuffix || isFuture) {
+        return result + (plural(number) ? 'hodiny' : 'hodin');
+      }
+
+      return result + "hodinami";
+
+    case 'd':
+      // a day / in a day / a day ago
+      return withoutSuffix || isFuture ? 'den' : 'dnem';
+
+    case 'dd':
+      // 9 days / in 9 days / 9 days ago
+      if (withoutSuffix || isFuture) {
+        return result + (plural(number) ? 'dny' : 'dní');
+      }
+
+      return result + "dny";
+
+    case 'M':
+      // a month / in a month / a month ago
+      return withoutSuffix || isFuture ? 'měsíc' : 'měsícem';
+
+    case 'MM':
+      // 9 months / in 9 months / 9 months ago
+      if (withoutSuffix || isFuture) {
+        return result + (plural(number) ? 'měsíce' : 'měsíců');
+      }
+
+      return result + "m\u011Bs\xEDci";
+
+    case 'y':
+      // a year / in a year / a year ago
+      return withoutSuffix || isFuture ? 'rok' : 'rokem';
+
+    case 'yy':
+      // 9 years / in 9 years / 9 years ago
+      if (withoutSuffix || isFuture) {
+        return result + (plural(number) ? 'roky' : 'let');
+      }
+
+      return result + "lety";
+  }
+}
+/* eslint-enable */
+
+
+var locale = {
+  name: 'cs',
+  weekdays: 'neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota'.split('_'),
+  weekdaysShort: 'ne_po_út_st_čt_pá_so'.split('_'),
+  weekdaysMin: 'ne_po_út_st_čt_pá_so'.split('_'),
+  months: 'leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec'.split('_'),
+  monthsShort: 'led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro'.split('_'),
+  weekStart: 1,
+  yearStart: 4,
+  ordinal: function ordinal(n) {
+    return n + ".";
+  },
+  formats: {
+    LT: 'H:mm',
+    LTS: 'H:mm:ss',
+    L: 'DD.MM.YYYY',
+    LL: 'D. MMMM YYYY',
+    LLL: 'D. MMMM YYYY H:mm',
+    LLLL: 'dddd D. MMMM YYYY H:mm',
+    l: 'D. M. YYYY'
+  },
+  relativeTime: {
+    future: 'za %s',
+    past: 'před %s',
+    s: translate,
+    m: translate,
+    mm: translate,
+    h: translate,
+    hh: translate,
+    d: translate,
+    dd: translate,
+    M: translate,
+    MM: translate,
+    y: translate,
+    yy: translate
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/cv.js b/node_modules/dayjs/esm/locale/cv.js
new file mode 100644
index 0000000..7dc41f7
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/cv.js
@@ -0,0 +1,24 @@
+// Chuvash [cv]
+import dayjs from '../index';
+var locale = {
+  name: 'cv',
+  weekdays: 'вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун'.split('_'),
+  months: 'кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'выр_тун_ытл_юн_кӗҫ_эрн_шӑм'.split('_'),
+  monthsShort: 'кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш'.split('_'),
+  weekdaysMin: 'вр_тн_ыт_юн_кҫ_эр_шм'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD-MM-YYYY',
+    LL: 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]',
+    LLL: 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm',
+    LLLL: 'dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/cy.js b/node_modules/dayjs/esm/locale/cy.js
new file mode 100644
index 0000000..63e6c33
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/cy.js
@@ -0,0 +1,39 @@
+// Welsh [cy]
+import dayjs from '../index';
+var locale = {
+  name: 'cy',
+  weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split('_'),
+  months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'),
+  monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split('_'),
+  weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd, D MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: 'mewn %s',
+    past: '%s yn ôl',
+    s: 'ychydig eiliadau',
+    m: 'munud',
+    mm: '%d munud',
+    h: 'awr',
+    hh: '%d awr',
+    d: 'diwrnod',
+    dd: '%d diwrnod',
+    M: 'mis',
+    MM: '%d mis',
+    y: 'blwyddyn',
+    yy: '%d flynedd'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/da.js b/node_modules/dayjs/esm/locale/da.js
new file mode 100644
index 0000000..38fd134
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/da.js
@@ -0,0 +1,39 @@
+// Danish [da]
+import dayjs from '../index';
+var locale = {
+  name: 'da',
+  weekdays: 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),
+  weekdaysShort: 'søn._man._tirs._ons._tors._fre._lør.'.split('_'),
+  weekdaysMin: 'sø._ma._ti._on._to._fr._lø.'.split('_'),
+  months: 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split('_'),
+  monthsShort: 'jan._feb._mar._apr._maj_juni_juli_aug._sept._okt._nov._dec.'.split('_'),
+  weekStart: 1,
+  ordinal: function ordinal(n) {
+    return n + ".";
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD.MM.YYYY',
+    LL: 'D. MMMM YYYY',
+    LLL: 'D. MMMM YYYY HH:mm',
+    LLLL: 'dddd [d.] D. MMMM YYYY [kl.] HH:mm'
+  },
+  relativeTime: {
+    future: 'om %s',
+    past: '%s siden',
+    s: 'få sekunder',
+    m: 'et minut',
+    mm: '%d minutter',
+    h: 'en time',
+    hh: '%d timer',
+    d: 'en dag',
+    dd: '%d dage',
+    M: 'en måned',
+    MM: '%d måneder',
+    y: 'et år',
+    yy: '%d år'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/de-at.js b/node_modules/dayjs/esm/locale/de-at.js
new file mode 100644
index 0000000..e109d97
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/de-at.js
@@ -0,0 +1,63 @@
+// German (Austria) [de-at]
+import dayjs from '../index';
+var texts = {
+  s: 'ein paar Sekunden',
+  m: ['eine Minute', 'einer Minute'],
+  mm: '%d Minuten',
+  h: ['eine Stunde', 'einer Stunde'],
+  hh: '%d Stunden',
+  d: ['ein Tag', 'einem Tag'],
+  dd: ['%d Tage', '%d Tagen'],
+  M: ['ein Monat', 'einem Monat'],
+  MM: ['%d Monate', '%d Monaten'],
+  y: ['ein Jahr', 'einem Jahr'],
+  yy: ['%d Jahre', '%d Jahren']
+};
+
+function relativeTimeFormatter(number, withoutSuffix, key) {
+  var l = texts[key];
+
+  if (Array.isArray(l)) {
+    l = l[withoutSuffix ? 0 : 1];
+  }
+
+  return l.replace('%d', number);
+}
+
+var locale = {
+  name: 'de-at',
+  weekdays: 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'),
+  weekdaysShort: 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),
+  weekdaysMin: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
+  months: 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
+  monthsShort: 'Jän._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),
+  ordinal: function ordinal(n) {
+    return n + ".";
+  },
+  weekStart: 1,
+  formats: {
+    LTS: 'HH:mm:ss',
+    LT: 'HH:mm',
+    L: 'DD.MM.YYYY',
+    LL: 'D. MMMM YYYY',
+    LLL: 'D. MMMM YYYY HH:mm',
+    LLLL: 'dddd, D. MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: 'in %s',
+    past: 'vor %s',
+    s: relativeTimeFormatter,
+    m: relativeTimeFormatter,
+    mm: relativeTimeFormatter,
+    h: relativeTimeFormatter,
+    hh: relativeTimeFormatter,
+    d: relativeTimeFormatter,
+    dd: relativeTimeFormatter,
+    M: relativeTimeFormatter,
+    MM: relativeTimeFormatter,
+    y: relativeTimeFormatter,
+    yy: relativeTimeFormatter
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/de-ch.js b/node_modules/dayjs/esm/locale/de-ch.js
new file mode 100644
index 0000000..1ffbbf7
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/de-ch.js
@@ -0,0 +1,63 @@
+// German (Switzerland) [de-ch]
+import dayjs from '../index';
+var texts = {
+  s: 'ein paar Sekunden',
+  m: ['eine Minute', 'einer Minute'],
+  mm: '%d Minuten',
+  h: ['eine Stunde', 'einer Stunde'],
+  hh: '%d Stunden',
+  d: ['ein Tag', 'einem Tag'],
+  dd: ['%d Tage', '%d Tagen'],
+  M: ['ein Monat', 'einem Monat'],
+  MM: ['%d Monate', '%d Monaten'],
+  y: ['ein Jahr', 'einem Jahr'],
+  yy: ['%d Jahre', '%d Jahren']
+};
+
+function relativeTimeFormatter(number, withoutSuffix, key) {
+  var l = texts[key];
+
+  if (Array.isArray(l)) {
+    l = l[withoutSuffix ? 0 : 1];
+  }
+
+  return l.replace('%d', number);
+}
+
+var locale = {
+  name: 'de-ch',
+  weekdays: 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'),
+  weekdaysShort: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
+  weekdaysMin: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
+  months: 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
+  monthsShort: 'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),
+  ordinal: function ordinal(n) {
+    return n + ".";
+  },
+  weekStart: 1,
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD.MM.YYYY',
+    LL: 'D. MMMM YYYY',
+    LLL: 'D. MMMM YYYY HH:mm',
+    LLLL: 'dddd, D. MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: 'in %s',
+    past: 'vor %s',
+    s: relativeTimeFormatter,
+    m: relativeTimeFormatter,
+    mm: relativeTimeFormatter,
+    h: relativeTimeFormatter,
+    hh: relativeTimeFormatter,
+    d: relativeTimeFormatter,
+    dd: relativeTimeFormatter,
+    M: relativeTimeFormatter,
+    MM: relativeTimeFormatter,
+    y: relativeTimeFormatter,
+    yy: relativeTimeFormatter
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/de.js b/node_modules/dayjs/esm/locale/de.js
new file mode 100644
index 0000000..8ccd483
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/de.js
@@ -0,0 +1,64 @@
+// German [de]
+import dayjs from '../index';
+var texts = {
+  s: 'ein paar Sekunden',
+  m: ['eine Minute', 'einer Minute'],
+  mm: '%d Minuten',
+  h: ['eine Stunde', 'einer Stunde'],
+  hh: '%d Stunden',
+  d: ['ein Tag', 'einem Tag'],
+  dd: ['%d Tage', '%d Tagen'],
+  M: ['ein Monat', 'einem Monat'],
+  MM: ['%d Monate', '%d Monaten'],
+  y: ['ein Jahr', 'einem Jahr'],
+  yy: ['%d Jahre', '%d Jahren']
+};
+
+function relativeTimeFormatter(number, withoutSuffix, key) {
+  var l = texts[key];
+
+  if (Array.isArray(l)) {
+    l = l[withoutSuffix ? 0 : 1];
+  }
+
+  return l.replace('%d', number);
+}
+
+var locale = {
+  name: 'de',
+  weekdays: 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'),
+  weekdaysShort: 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),
+  weekdaysMin: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
+  months: 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
+  monthsShort: 'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sept._Okt._Nov._Dez.'.split('_'),
+  ordinal: function ordinal(n) {
+    return n + ".";
+  },
+  weekStart: 1,
+  yearStart: 4,
+  formats: {
+    LTS: 'HH:mm:ss',
+    LT: 'HH:mm',
+    L: 'DD.MM.YYYY',
+    LL: 'D. MMMM YYYY',
+    LLL: 'D. MMMM YYYY HH:mm',
+    LLLL: 'dddd, D. MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: 'in %s',
+    past: 'vor %s',
+    s: relativeTimeFormatter,
+    m: relativeTimeFormatter,
+    mm: relativeTimeFormatter,
+    h: relativeTimeFormatter,
+    hh: relativeTimeFormatter,
+    d: relativeTimeFormatter,
+    dd: relativeTimeFormatter,
+    M: relativeTimeFormatter,
+    MM: relativeTimeFormatter,
+    y: relativeTimeFormatter,
+    yy: relativeTimeFormatter
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/dv.js b/node_modules/dayjs/esm/locale/dv.js
new file mode 100644
index 0000000..8943fdd
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/dv.js
@@ -0,0 +1,39 @@
+// Maldivian [dv]
+import dayjs from '../index';
+var locale = {
+  name: 'dv',
+  weekdays: 'އާދިއްތަ_ހޯމަ_އަންގާރަ_ބުދަ_ބުރާސްފަތި_ހުކުރު_ހޮނިހިރު'.split('_'),
+  months: 'ޖެނުއަރީ_ފެބްރުއަރީ_މާރިޗު_އޭޕްރީލު_މޭ_ޖޫން_ޖުލައި_އޯގަސްޓު_ސެޕްޓެމްބަރު_އޮކްޓޯބަރު_ނޮވެމްބަރު_ޑިސެމްބަރު'.split('_'),
+  weekStart: 7,
+  weekdaysShort: 'އާދިއްތަ_ހޯމަ_އަންގާރަ_ބުދަ_ބުރާސްފަތި_ހުކުރު_ހޮނިހިރު'.split('_'),
+  monthsShort: 'ޖެނުއަރީ_ފެބްރުއަރީ_މާރިޗު_އޭޕްރީލު_މޭ_ޖޫން_ޖުލައި_އޯގަސްޓު_ސެޕްޓެމްބަރު_އޮކްޓޯބަރު_ނޮވެމްބަރު_ޑިސެމްބަރު'.split('_'),
+  weekdaysMin: 'އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'D/M/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd D MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: 'ތެރޭގައި %s',
+    past: 'ކުރިން %s',
+    s: 'ސިކުންތުކޮޅެއް',
+    m: 'މިނިޓެއް',
+    mm: 'މިނިޓު %d',
+    h: 'ގަޑިއިރެއް',
+    hh: 'ގަޑިއިރު %d',
+    d: 'ދުވަހެއް',
+    dd: 'ދުވަސް %d',
+    M: 'މަހެއް',
+    MM: 'މަސް %d',
+    y: 'އަހަރެއް',
+    yy: 'އަހަރު %d'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/el.js b/node_modules/dayjs/esm/locale/el.js
new file mode 100644
index 0000000..2aa9917
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/el.js
@@ -0,0 +1,39 @@
+// Greek [el]
+import dayjs from '../index';
+var locale = {
+  name: 'el',
+  weekdays: 'Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο'.split('_'),
+  weekdaysShort: 'Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ'.split('_'),
+  weekdaysMin: 'Κυ_Δε_Τρ_Τε_Πε_Πα_Σα'.split('_'),
+  months: 'Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος'.split('_'),
+  monthsShort: 'Ιαν_Φεβ_Μαρ_Απρ_Μαι_Ιουν_Ιουλ_Αυγ_Σεπτ_Οκτ_Νοε_Δεκ'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  weekStart: 1,
+  relativeTime: {
+    future: 'σε %s',
+    past: 'πριν %s',
+    s: 'μερικά δευτερόλεπτα',
+    m: 'ένα λεπτό',
+    mm: '%d λεπτά',
+    h: 'μία ώρα',
+    hh: '%d ώρες',
+    d: 'μία μέρα',
+    dd: '%d μέρες',
+    M: 'ένα μήνα',
+    MM: '%d μήνες',
+    y: 'ένα χρόνο',
+    yy: '%d χρόνια'
+  },
+  formats: {
+    LT: 'h:mm A',
+    LTS: 'h:mm:ss A',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY h:mm A',
+    LLLL: 'dddd, D MMMM YYYY h:mm A'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/en-au.js b/node_modules/dayjs/esm/locale/en-au.js
new file mode 100644
index 0000000..f9dde03
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/en-au.js
@@ -0,0 +1,39 @@
+// English (Australia) [en-au]
+import dayjs from '../index';
+var locale = {
+  name: 'en-au',
+  weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
+  months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+  monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+  weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'h:mm A',
+    LTS: 'h:mm:ss A',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY h:mm A',
+    LLLL: 'dddd, D MMMM YYYY h:mm A'
+  },
+  relativeTime: {
+    future: 'in %s',
+    past: '%s ago',
+    s: 'a few seconds',
+    m: 'a minute',
+    mm: '%d minutes',
+    h: 'an hour',
+    hh: '%d hours',
+    d: 'a day',
+    dd: '%d days',
+    M: 'a month',
+    MM: '%d months',
+    y: 'a year',
+    yy: '%d years'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/en-ca.js b/node_modules/dayjs/esm/locale/en-ca.js
new file mode 100644
index 0000000..8e416c9
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/en-ca.js
@@ -0,0 +1,38 @@
+// English (Canada) [en-ca]
+import dayjs from '../index';
+var locale = {
+  name: 'en-ca',
+  weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
+  months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
+  weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+  monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+  weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'h:mm A',
+    LTS: 'h:mm:ss A',
+    L: 'YYYY-MM-DD',
+    LL: 'MMMM D, YYYY',
+    LLL: 'MMMM D, YYYY h:mm A',
+    LLLL: 'dddd, MMMM D, YYYY h:mm A'
+  },
+  relativeTime: {
+    future: 'in %s',
+    past: '%s ago',
+    s: 'a few seconds',
+    m: 'a minute',
+    mm: '%d minutes',
+    h: 'an hour',
+    hh: '%d hours',
+    d: 'a day',
+    dd: '%d days',
+    M: 'a month',
+    MM: '%d months',
+    y: 'a year',
+    yy: '%d years'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/en-gb.js b/node_modules/dayjs/esm/locale/en-gb.js
new file mode 100644
index 0000000..f979b44
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/en-gb.js
@@ -0,0 +1,42 @@
+// English (United Kingdom) [en-gb]
+import dayjs from '../index';
+var locale = {
+  name: 'en-gb',
+  weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
+  weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+  weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+  months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
+  monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+  weekStart: 1,
+  yearStart: 4,
+  relativeTime: {
+    future: 'in %s',
+    past: '%s ago',
+    s: 'a few seconds',
+    m: 'a minute',
+    mm: '%d minutes',
+    h: 'an hour',
+    hh: '%d hours',
+    d: 'a day',
+    dd: '%d days',
+    M: 'a month',
+    MM: '%d months',
+    y: 'a year',
+    yy: '%d years'
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd, D MMMM YYYY HH:mm'
+  },
+  ordinal: function ordinal(n) {
+    var s = ['th', 'st', 'nd', 'rd'];
+    var v = n % 100;
+    return "[" + n + (s[(v - 20) % 10] || s[v] || s[0]) + "]";
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/en-ie.js b/node_modules/dayjs/esm/locale/en-ie.js
new file mode 100644
index 0000000..8098d2f
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/en-ie.js
@@ -0,0 +1,39 @@
+// English (Ireland) [en-ie]
+import dayjs from '../index';
+var locale = {
+  name: 'en-ie',
+  weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
+  months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+  monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+  weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd D MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: 'in %s',
+    past: '%s ago',
+    s: 'a few seconds',
+    m: 'a minute',
+    mm: '%d minutes',
+    h: 'an hour',
+    hh: '%d hours',
+    d: 'a day',
+    dd: '%d days',
+    M: 'a month',
+    MM: '%d months',
+    y: 'a year',
+    yy: '%d years'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/en-il.js b/node_modules/dayjs/esm/locale/en-il.js
new file mode 100644
index 0000000..56c241a
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/en-il.js
@@ -0,0 +1,38 @@
+// English (Israel) [en-il]
+import dayjs from '../index';
+var locale = {
+  name: 'en-il',
+  weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
+  months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
+  weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+  monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+  weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd, D MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: 'in %s',
+    past: '%s ago',
+    s: 'a few seconds',
+    m: 'a minute',
+    mm: '%d minutes',
+    h: 'an hour',
+    hh: '%d hours',
+    d: 'a day',
+    dd: '%d days',
+    M: 'a month',
+    MM: '%d months',
+    y: 'a year',
+    yy: '%d years'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/en-in.js b/node_modules/dayjs/esm/locale/en-in.js
new file mode 100644
index 0000000..7ccb206
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/en-in.js
@@ -0,0 +1,42 @@
+// English (India) [en-in]
+import dayjs from '../index';
+var locale = {
+  name: 'en-in',
+  weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
+  weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+  weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+  months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
+  monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+  weekStart: 1,
+  yearStart: 4,
+  relativeTime: {
+    future: 'in %s',
+    past: '%s ago',
+    s: 'a few seconds',
+    m: 'a minute',
+    mm: '%d minutes',
+    h: 'an hour',
+    hh: '%d hours',
+    d: 'a day',
+    dd: '%d days',
+    M: 'a month',
+    MM: '%d months',
+    y: 'a year',
+    yy: '%d years'
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd, D MMMM YYYY HH:mm'
+  },
+  ordinal: function ordinal(n) {
+    var s = ['th', 'st', 'nd', 'rd'];
+    var v = n % 100;
+    return "[" + n + (s[(v - 20) % 10] || s[v] || s[0]) + "]";
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/en-nz.js b/node_modules/dayjs/esm/locale/en-nz.js
new file mode 100644
index 0000000..08c562e
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/en-nz.js
@@ -0,0 +1,41 @@
+// English (New Zealand) [en-nz]
+import dayjs from '../index';
+var locale = {
+  name: 'en-nz',
+  weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
+  months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+  monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+  weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+  ordinal: function ordinal(n) {
+    var s = ['th', 'st', 'nd', 'rd'];
+    var v = n % 100;
+    return "[" + n + (s[(v - 20) % 10] || s[v] || s[0]) + "]";
+  },
+  formats: {
+    LT: 'h:mm A',
+    LTS: 'h:mm:ss A',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY h:mm A',
+    LLLL: 'dddd, D MMMM YYYY h:mm A'
+  },
+  relativeTime: {
+    future: 'in %s',
+    past: '%s ago',
+    s: 'a few seconds',
+    m: 'a minute',
+    mm: '%d minutes',
+    h: 'an hour',
+    hh: '%d hours',
+    d: 'a day',
+    dd: '%d days',
+    M: 'a month',
+    MM: '%d months',
+    y: 'a year',
+    yy: '%d years'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/en-sg.js b/node_modules/dayjs/esm/locale/en-sg.js
new file mode 100644
index 0000000..3c5edce
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/en-sg.js
@@ -0,0 +1,39 @@
+// English (Singapore) [en-sg]
+import dayjs from '../index';
+var locale = {
+  name: 'en-sg',
+  weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
+  months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+  monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+  weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd, D MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: 'in %s',
+    past: '%s ago',
+    s: 'a few seconds',
+    m: 'a minute',
+    mm: '%d minutes',
+    h: 'an hour',
+    hh: '%d hours',
+    d: 'a day',
+    dd: '%d days',
+    M: 'a month',
+    MM: '%d months',
+    y: 'a year',
+    yy: '%d years'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/en-tt.js b/node_modules/dayjs/esm/locale/en-tt.js
new file mode 100644
index 0000000..ef47eeb
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/en-tt.js
@@ -0,0 +1,42 @@
+// English (Trinidad & Tobago) [en-tt]
+import dayjs from '../index';
+var locale = {
+  name: 'en-tt',
+  weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
+  weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
+  weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
+  months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
+  monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
+  weekStart: 1,
+  yearStart: 4,
+  relativeTime: {
+    future: 'in %s',
+    past: '%s ago',
+    s: 'a few seconds',
+    m: 'a minute',
+    mm: '%d minutes',
+    h: 'an hour',
+    hh: '%d hours',
+    d: 'a day',
+    dd: '%d days',
+    M: 'a month',
+    MM: '%d months',
+    y: 'a year',
+    yy: '%d years'
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd, D MMMM YYYY HH:mm'
+  },
+  ordinal: function ordinal(n) {
+    var s = ['th', 'st', 'nd', 'rd'];
+    var v = n % 100;
+    return "[" + n + (s[(v - 20) % 10] || s[v] || s[0]) + "]";
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/en.js b/node_modules/dayjs/esm/locale/en.js
new file mode 100644
index 0000000..8ba6107
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/en.js
@@ -0,0 +1,12 @@
+// English [en]
+// We don't need weekdaysShort, weekdaysMin, monthsShort in en.js locale
+export default {
+  name: 'en',
+  weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
+  months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
+  ordinal: function ordinal(n) {
+    var s = ['th', 'st', 'nd', 'rd'];
+    var v = n % 100;
+    return "[" + n + (s[(v - 20) % 10] || s[v] || s[0]) + "]";
+  }
+};
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/eo.js b/node_modules/dayjs/esm/locale/eo.js
new file mode 100644
index 0000000..e62599a
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/eo.js
@@ -0,0 +1,39 @@
+// Esperanto [eo]
+import dayjs from '../index';
+var locale = {
+  name: 'eo',
+  weekdays: 'dimanĉo_lundo_mardo_merkredo_ĵaŭdo_vendredo_sabato'.split('_'),
+  months: 'januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'dim_lun_mard_merk_ĵaŭ_ven_sab'.split('_'),
+  monthsShort: 'jan_feb_mar_apr_maj_jun_jul_aŭg_sep_okt_nov_dec'.split('_'),
+  weekdaysMin: 'di_lu_ma_me_ĵa_ve_sa'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'YYYY-MM-DD',
+    LL: 'D[-a de] MMMM, YYYY',
+    LLL: 'D[-a de] MMMM, YYYY HH:mm',
+    LLLL: 'dddd, [la] D[-a de] MMMM, YYYY HH:mm'
+  },
+  relativeTime: {
+    future: 'post %s',
+    past: 'antaŭ %s',
+    s: 'sekundoj',
+    m: 'minuto',
+    mm: '%d minutoj',
+    h: 'horo',
+    hh: '%d horoj',
+    d: 'tago',
+    dd: '%d tagoj',
+    M: 'monato',
+    MM: '%d monatoj',
+    y: 'jaro',
+    yy: '%d jaroj'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/es-do.js b/node_modules/dayjs/esm/locale/es-do.js
new file mode 100644
index 0000000..09410cf
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/es-do.js
@@ -0,0 +1,39 @@
+// Spanish (Dominican Republic) [es-do]
+import dayjs from '../index';
+var locale = {
+  name: 'es-do',
+  weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
+  weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
+  weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),
+  months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'),
+  monthsShort: 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),
+  weekStart: 1,
+  relativeTime: {
+    future: 'en %s',
+    past: 'hace %s',
+    s: 'unos segundos',
+    m: 'un minuto',
+    mm: '%d minutos',
+    h: 'una hora',
+    hh: '%d horas',
+    d: 'un día',
+    dd: '%d días',
+    M: 'un mes',
+    MM: '%d meses',
+    y: 'un año',
+    yy: '%d años'
+  },
+  ordinal: function ordinal(n) {
+    return n + "\xBA";
+  },
+  formats: {
+    LT: 'h:mm A',
+    LTS: 'h:mm:ss A',
+    L: 'DD/MM/YYYY',
+    LL: 'D [de] MMMM [de] YYYY',
+    LLL: 'D [de] MMMM [de] YYYY h:mm A',
+    LLLL: 'dddd, D [de] MMMM [de] YYYY h:mm A'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/es-mx.js b/node_modules/dayjs/esm/locale/es-mx.js
new file mode 100644
index 0000000..0207f83
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/es-mx.js
@@ -0,0 +1,38 @@
+// Spanish (Mexico) [es-mx]
+import dayjs from '../index';
+var locale = {
+  name: 'es-mx',
+  weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
+  weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
+  weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),
+  months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'),
+  monthsShort: 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),
+  relativeTime: {
+    future: 'en %s',
+    past: 'hace %s',
+    s: 'unos segundos',
+    m: 'un minuto',
+    mm: '%d minutos',
+    h: 'una hora',
+    hh: '%d horas',
+    d: 'un día',
+    dd: '%d días',
+    M: 'un mes',
+    MM: '%d meses',
+    y: 'un año',
+    yy: '%d años'
+  },
+  ordinal: function ordinal(n) {
+    return n + "\xBA";
+  },
+  formats: {
+    LT: 'H:mm',
+    LTS: 'H:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D [de] MMMM [de] YYYY',
+    LLL: 'D [de] MMMM [de] YYYY H:mm',
+    LLLL: 'dddd, D [de] MMMM [de] YYYY H:mm'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/es-pr.js b/node_modules/dayjs/esm/locale/es-pr.js
new file mode 100644
index 0000000..5edc359
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/es-pr.js
@@ -0,0 +1,39 @@
+// Spanish (Puerto Rico) [es-PR]
+import dayjs from '../index';
+var locale = {
+  name: 'es-pr',
+  monthsShort: 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),
+  weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
+  weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
+  weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),
+  months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'),
+  weekStart: 1,
+  formats: {
+    LT: 'h:mm A',
+    LTS: 'h:mm:ss A',
+    L: 'MM/DD/YYYY',
+    LL: 'D [de] MMMM [de] YYYY',
+    LLL: 'D [de] MMMM [de] YYYY h:mm A',
+    LLLL: 'dddd, D [de] MMMM [de] YYYY h:mm A'
+  },
+  relativeTime: {
+    future: 'en %s',
+    past: 'hace %s',
+    s: 'unos segundos',
+    m: 'un minuto',
+    mm: '%d minutos',
+    h: 'una hora',
+    hh: '%d horas',
+    d: 'un día',
+    dd: '%d días',
+    M: 'un mes',
+    MM: '%d meses',
+    y: 'un año',
+    yy: '%d años'
+  },
+  ordinal: function ordinal(n) {
+    return n + "\xBA";
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/es-us.js b/node_modules/dayjs/esm/locale/es-us.js
new file mode 100644
index 0000000..f9b01a0
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/es-us.js
@@ -0,0 +1,38 @@
+// Spanish (United States) [es-us]
+import dayjs from '../index';
+var locale = {
+  name: 'es-us',
+  weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
+  weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
+  weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),
+  months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'),
+  monthsShort: 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),
+  relativeTime: {
+    future: 'en %s',
+    past: 'hace %s',
+    s: 'unos segundos',
+    m: 'un minuto',
+    mm: '%d minutos',
+    h: 'una hora',
+    hh: '%d horas',
+    d: 'un día',
+    dd: '%d días',
+    M: 'un mes',
+    MM: '%d meses',
+    y: 'un año',
+    yy: '%d años'
+  },
+  ordinal: function ordinal(n) {
+    return n + "\xBA";
+  },
+  formats: {
+    LT: 'h:mm A',
+    LTS: 'h:mm:ss A',
+    L: 'MM/DD/YYYY',
+    LL: 'D [de] MMMM [de] YYYY',
+    LLL: 'D [de] MMMM [de] YYYY h:mm A',
+    LLLL: 'dddd, D [de] MMMM [de] YYYY h:mm A'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/es.js b/node_modules/dayjs/esm/locale/es.js
new file mode 100644
index 0000000..84bdfbe
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/es.js
@@ -0,0 +1,39 @@
+// Spanish [es]
+import dayjs from '../index';
+var locale = {
+  name: 'es',
+  monthsShort: 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),
+  weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
+  weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
+  weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),
+  months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'),
+  weekStart: 1,
+  formats: {
+    LT: 'H:mm',
+    LTS: 'H:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D [de] MMMM [de] YYYY',
+    LLL: 'D [de] MMMM [de] YYYY H:mm',
+    LLLL: 'dddd, D [de] MMMM [de] YYYY H:mm'
+  },
+  relativeTime: {
+    future: 'en %s',
+    past: 'hace %s',
+    s: 'unos segundos',
+    m: 'un minuto',
+    mm: '%d minutos',
+    h: 'una hora',
+    hh: '%d horas',
+    d: 'un día',
+    dd: '%d días',
+    M: 'un mes',
+    MM: '%d meses',
+    y: 'un año',
+    yy: '%d años'
+  },
+  ordinal: function ordinal(n) {
+    return n + "\xBA";
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/et.js b/node_modules/dayjs/esm/locale/et.js
new file mode 100644
index 0000000..7f7c5ff
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/et.js
@@ -0,0 +1,65 @@
+// Estonian [et]
+import dayjs from '../index';
+
+function relativeTimeWithTense(number, withoutSuffix, key, isFuture) {
+  var format = {
+    s: ['mõne sekundi', 'mõni sekund', 'paar sekundit'],
+    m: ['ühe minuti', 'üks minut'],
+    mm: ['%d minuti', '%d minutit'],
+    h: ['ühe tunni', 'tund aega', 'üks tund'],
+    hh: ['%d tunni', '%d tundi'],
+    d: ['ühe päeva', 'üks päev'],
+    M: ['kuu aja', 'kuu aega', 'üks kuu'],
+    MM: ['%d kuu', '%d kuud'],
+    y: ['ühe aasta', 'aasta', 'üks aasta'],
+    yy: ['%d aasta', '%d aastat']
+  };
+
+  if (withoutSuffix) {
+    return (format[key][2] ? format[key][2] : format[key][1]).replace('%d', number);
+  }
+
+  return (isFuture ? format[key][0] : format[key][1]).replace('%d', number);
+}
+
+var locale = {
+  name: 'et',
+  // Estonian
+  weekdays: 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'),
+  // Note weekdays are not capitalized in Estonian
+  weekdaysShort: 'P_E_T_K_N_R_L'.split('_'),
+  // There is no short form of weekdays in Estonian except this 1 letter format so it is used for both 'weekdaysShort' and 'weekdaysMin'
+  weekdaysMin: 'P_E_T_K_N_R_L'.split('_'),
+  months: 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'),
+  // Note month names are not capitalized in Estonian
+  monthsShort: 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'),
+  ordinal: function ordinal(n) {
+    return n + ".";
+  },
+  weekStart: 1,
+  relativeTime: {
+    future: '%s pärast',
+    past: '%s tagasi',
+    s: relativeTimeWithTense,
+    m: relativeTimeWithTense,
+    mm: relativeTimeWithTense,
+    h: relativeTimeWithTense,
+    hh: relativeTimeWithTense,
+    d: relativeTimeWithTense,
+    dd: '%d päeva',
+    M: relativeTimeWithTense,
+    MM: relativeTimeWithTense,
+    y: relativeTimeWithTense,
+    yy: relativeTimeWithTense
+  },
+  formats: {
+    LT: 'H:mm',
+    LTS: 'H:mm:ss',
+    L: 'DD.MM.YYYY',
+    LL: 'D. MMMM YYYY',
+    LLL: 'D. MMMM YYYY H:mm',
+    LLLL: 'dddd, D. MMMM YYYY H:mm'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/eu.js b/node_modules/dayjs/esm/locale/eu.js
new file mode 100644
index 0000000..5cb73d0
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/eu.js
@@ -0,0 +1,43 @@
+// Basque [eu]
+import dayjs from '../index';
+var locale = {
+  name: 'eu',
+  weekdays: 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'),
+  months: 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'ig._al._ar._az._og._ol._lr.'.split('_'),
+  monthsShort: 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'),
+  weekdaysMin: 'ig_al_ar_az_og_ol_lr'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'YYYY-MM-DD',
+    LL: 'YYYY[ko] MMMM[ren] D[a]',
+    LLL: 'YYYY[ko] MMMM[ren] D[a] HH:mm',
+    LLLL: 'dddd, YYYY[ko] MMMM[ren] D[a] HH:mm',
+    l: 'YYYY-M-D',
+    ll: 'YYYY[ko] MMM D[a]',
+    lll: 'YYYY[ko] MMM D[a] HH:mm',
+    llll: 'ddd, YYYY[ko] MMM D[a] HH:mm'
+  },
+  relativeTime: {
+    future: '%s barru',
+    past: 'duela %s',
+    s: 'segundo batzuk',
+    m: 'minutu bat',
+    mm: '%d minutu',
+    h: 'ordu bat',
+    hh: '%d ordu',
+    d: 'egun bat',
+    dd: '%d egun',
+    M: 'hilabete bat',
+    MM: '%d hilabete',
+    y: 'urte bat',
+    yy: '%d urte'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/fa.js b/node_modules/dayjs/esm/locale/fa.js
new file mode 100644
index 0000000..089459e
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/fa.js
@@ -0,0 +1,39 @@
+// Persian [fa]
+import dayjs from '../index';
+var locale = {
+  name: 'fa',
+  weekdays: 'یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه'.split('_'),
+  weekdaysShort: "\u06CC\u06A9\u200C\u0634\u0646\u0628\u0647_\u062F\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200C\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067E\u0646\u062C\u200C\u0634\u0646\u0628\u0647_\u062C\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split('_'),
+  weekdaysMin: 'ی_د_س_چ_پ_ج_ش'.split('_'),
+  weekStart: 6,
+  months: 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
+  monthsShort: 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd, D MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: 'در %s',
+    past: '%s پیش',
+    s: 'چند ثانیه',
+    m: 'یک دقیقه',
+    mm: '%d دقیقه',
+    h: 'یک ساعت',
+    hh: '%d ساعت',
+    d: 'یک روز',
+    dd: '%d روز',
+    M: 'یک ماه',
+    MM: '%d ماه',
+    y: 'یک سال',
+    yy: '%d سال'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/fi.js b/node_modules/dayjs/esm/locale/fi.js
new file mode 100644
index 0000000..1ded894
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/fi.js
@@ -0,0 +1,88 @@
+// Finnish [fi]
+import dayjs from '../index';
+
+function relativeTimeFormatter(number, withoutSuffix, key, isFuture) {
+  var past = {
+    s: 'muutama sekunti',
+    m: 'minuutti',
+    mm: '%d minuuttia',
+    h: 'tunti',
+    hh: '%d tuntia',
+    d: 'päivä',
+    dd: '%d päivää',
+    M: 'kuukausi',
+    MM: '%d kuukautta',
+    y: 'vuosi',
+    yy: '%d vuotta',
+    numbers: 'nolla_yksi_kaksi_kolme_neljä_viisi_kuusi_seitsemän_kahdeksan_yhdeksän'.split('_')
+  };
+  var future = {
+    s: 'muutaman sekunnin',
+    m: 'minuutin',
+    mm: '%d minuutin',
+    h: 'tunnin',
+    hh: '%d tunnin',
+    d: 'päivän',
+    dd: '%d päivän',
+    M: 'kuukauden',
+    MM: '%d kuukauden',
+    y: 'vuoden',
+    yy: '%d vuoden',
+    numbers: 'nollan_yhden_kahden_kolmen_neljän_viiden_kuuden_seitsemän_kahdeksan_yhdeksän'.split('_')
+  };
+  var words = isFuture && !withoutSuffix ? future : past;
+  var result = words[key];
+
+  if (number < 10) {
+    return result.replace('%d', words.numbers[number]);
+  }
+
+  return result.replace('%d', number);
+}
+
+var locale = {
+  name: 'fi',
+  // Finnish
+  weekdays: 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'),
+  // Note weekdays are not capitalized in Finnish
+  weekdaysShort: 'su_ma_ti_ke_to_pe_la'.split('_'),
+  // There is no short form of weekdays in Finnish except this 2 letter format so it is used for both 'weekdaysShort' and 'weekdaysMin'
+  weekdaysMin: 'su_ma_ti_ke_to_pe_la'.split('_'),
+  months: 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'),
+  // Note month names are not capitalized in Finnish
+  monthsShort: 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'),
+  ordinal: function ordinal(n) {
+    return n + ".";
+  },
+  weekStart: 1,
+  yearStart: 4,
+  relativeTime: {
+    future: '%s päästä',
+    past: '%s sitten',
+    s: relativeTimeFormatter,
+    m: relativeTimeFormatter,
+    mm: relativeTimeFormatter,
+    h: relativeTimeFormatter,
+    hh: relativeTimeFormatter,
+    d: relativeTimeFormatter,
+    dd: relativeTimeFormatter,
+    M: relativeTimeFormatter,
+    MM: relativeTimeFormatter,
+    y: relativeTimeFormatter,
+    yy: relativeTimeFormatter
+  },
+  formats: {
+    LT: 'HH.mm',
+    LTS: 'HH.mm.ss',
+    L: 'DD.MM.YYYY',
+    LL: 'D. MMMM[ta] YYYY',
+    LLL: 'D. MMMM[ta] YYYY, [klo] HH.mm',
+    LLLL: 'dddd, D. MMMM[ta] YYYY, [klo] HH.mm',
+    l: 'D.M.YYYY',
+    ll: 'D. MMM YYYY',
+    lll: 'D. MMM YYYY, [klo] HH.mm',
+    llll: 'ddd, D. MMM YYYY, [klo] HH.mm'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/fo.js b/node_modules/dayjs/esm/locale/fo.js
new file mode 100644
index 0000000..07c3761
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/fo.js
@@ -0,0 +1,39 @@
+// Faroese [fo]
+import dayjs from '../index';
+var locale = {
+  name: 'fo',
+  weekdays: 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'),
+  months: 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'sun_mán_týs_mik_hós_frí_ley'.split('_'),
+  monthsShort: 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),
+  weekdaysMin: 'su_má_tý_mi_hó_fr_le'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd D. MMMM, YYYY HH:mm'
+  },
+  relativeTime: {
+    future: 'um %s',
+    past: '%s síðani',
+    s: 'fá sekund',
+    m: 'ein minuttur',
+    mm: '%d minuttir',
+    h: 'ein tími',
+    hh: '%d tímar',
+    d: 'ein dagur',
+    dd: '%d dagar',
+    M: 'ein mánaður',
+    MM: '%d mánaðir',
+    y: 'eitt ár',
+    yy: '%d ár'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/fr-ca.js b/node_modules/dayjs/esm/locale/fr-ca.js
new file mode 100644
index 0000000..688d695
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/fr-ca.js
@@ -0,0 +1,38 @@
+// French (Canada) [fr-ca]
+import dayjs from '../index';
+var locale = {
+  name: 'fr-ca',
+  weekdays: 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
+  months: 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),
+  weekdaysShort: 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
+  monthsShort: 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),
+  weekdaysMin: 'di_lu_ma_me_je_ve_sa'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'YYYY-MM-DD',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd D MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: 'dans %s',
+    past: 'il y a %s',
+    s: 'quelques secondes',
+    m: 'une minute',
+    mm: '%d minutes',
+    h: 'une heure',
+    hh: '%d heures',
+    d: 'un jour',
+    dd: '%d jours',
+    M: 'un mois',
+    MM: '%d mois',
+    y: 'un an',
+    yy: '%d ans'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/fr-ch.js b/node_modules/dayjs/esm/locale/fr-ch.js
new file mode 100644
index 0000000..593dba8
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/fr-ch.js
@@ -0,0 +1,39 @@
+// French (Switzerland) [fr-ch]
+import dayjs from '../index';
+var locale = {
+  name: 'fr-ch',
+  weekdays: 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
+  months: 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
+  monthsShort: 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),
+  weekdaysMin: 'di_lu_ma_me_je_ve_sa'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD.MM.YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd D MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: 'dans %s',
+    past: 'il y a %s',
+    s: 'quelques secondes',
+    m: 'une minute',
+    mm: '%d minutes',
+    h: 'une heure',
+    hh: '%d heures',
+    d: 'un jour',
+    dd: '%d jours',
+    M: 'un mois',
+    MM: '%d mois',
+    y: 'un an',
+    yy: '%d ans'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/fr.js b/node_modules/dayjs/esm/locale/fr.js
new file mode 100644
index 0000000..b31c11d
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/fr.js
@@ -0,0 +1,41 @@
+// French [fr]
+import dayjs from '../index';
+var locale = {
+  name: 'fr',
+  weekdays: 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
+  weekdaysShort: 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
+  weekdaysMin: 'di_lu_ma_me_je_ve_sa'.split('_'),
+  months: 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),
+  monthsShort: 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),
+  weekStart: 1,
+  yearStart: 4,
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd D MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: 'dans %s',
+    past: 'il y a %s',
+    s: 'quelques secondes',
+    m: 'une minute',
+    mm: '%d minutes',
+    h: 'une heure',
+    hh: '%d heures',
+    d: 'un jour',
+    dd: '%d jours',
+    M: 'un mois',
+    MM: '%d mois',
+    y: 'un an',
+    yy: '%d ans'
+  },
+  ordinal: function ordinal(n) {
+    var o = n === 1 ? 'er' : '';
+    return "" + n + o;
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/fy.js b/node_modules/dayjs/esm/locale/fy.js
new file mode 100644
index 0000000..4b9f9de
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/fy.js
@@ -0,0 +1,39 @@
+// Frisian [fy]
+import dayjs from '../index';
+var locale = {
+  name: 'fy',
+  weekdays: 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split('_'),
+  months: 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split('_'),
+  monthsShort: 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'si._mo._ti._wo._to._fr._so.'.split('_'),
+  weekdaysMin: 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD-MM-YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd D MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: 'oer %s',
+    past: '%s lyn',
+    s: 'in pear sekonden',
+    m: 'ien minút',
+    mm: '%d minuten',
+    h: 'ien oere',
+    hh: '%d oeren',
+    d: 'ien dei',
+    dd: '%d dagen',
+    M: 'ien moanne',
+    MM: '%d moannen',
+    y: 'ien jier',
+    yy: '%d jierren'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/ga.js b/node_modules/dayjs/esm/locale/ga.js
new file mode 100644
index 0000000..8cdfa9f
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/ga.js
@@ -0,0 +1,39 @@
+// Irish or Irish Gaelic [ga]
+import dayjs from '../index';
+var locale = {
+  name: 'ga',
+  weekdays: 'Dé Domhnaigh_Dé Luain_Dé Máirt_Dé Céadaoin_Déardaoin_Dé hAoine_Dé Satharn'.split('_'),
+  months: 'Eanáir_Feabhra_Márta_Aibreán_Bealtaine_Méitheamh_Iúil_Lúnasa_Meán Fómhair_Deaireadh Fómhair_Samhain_Nollaig'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'Dom_Lua_Mái_Céa_Déa_hAo_Sat'.split('_'),
+  monthsShort: 'Eaná_Feab_Márt_Aibr_Beal_Méit_Iúil_Lúna_Meán_Deai_Samh_Noll'.split('_'),
+  weekdaysMin: 'Do_Lu_Má_Ce_Dé_hA_Sa'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd, D MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: 'i %s',
+    past: '%s ó shin',
+    s: 'cúpla soicind',
+    m: 'nóiméad',
+    mm: '%d nóiméad',
+    h: 'uair an chloig',
+    hh: '%d uair an chloig',
+    d: 'lá',
+    dd: '%d lá',
+    M: 'mí',
+    MM: '%d mí',
+    y: 'bliain',
+    yy: '%d bliain'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/gd.js b/node_modules/dayjs/esm/locale/gd.js
new file mode 100644
index 0000000..fcf62cd
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/gd.js
@@ -0,0 +1,39 @@
+// Scottish Gaelic [gd]
+import dayjs from '../index';
+var locale = {
+  name: 'gd',
+  weekdays: 'Didòmhnaich_Diluain_Dimàirt_Diciadain_Diardaoin_Dihaoine_Disathairne'.split('_'),
+  months: 'Am Faoilleach_An Gearran_Am Màrt_An Giblean_An Cèitean_An t-Ògmhios_An t-Iuchar_An Lùnastal_An t-Sultain_An Dàmhair_An t-Samhain_An Dùbhlachd'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'Did_Dil_Dim_Dic_Dia_Dih_Dis'.split('_'),
+  monthsShort: 'Faoi_Gear_Màrt_Gibl_Cèit_Ògmh_Iuch_Lùn_Sult_Dàmh_Samh_Dùbh'.split('_'),
+  weekdaysMin: 'Dò_Lu_Mà_Ci_Ar_Ha_Sa'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd, D MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: 'ann an %s',
+    past: 'bho chionn %s',
+    s: 'beagan diogan',
+    m: 'mionaid',
+    mm: '%d mionaidean',
+    h: 'uair',
+    hh: '%d uairean',
+    d: 'latha',
+    dd: '%d latha',
+    M: 'mìos',
+    MM: '%d mìosan',
+    y: 'bliadhna',
+    yy: '%d bliadhna'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/gl.js b/node_modules/dayjs/esm/locale/gl.js
new file mode 100644
index 0000000..23d687f
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/gl.js
@@ -0,0 +1,39 @@
+// Galician [gl]
+import dayjs from '../index';
+var locale = {
+  name: 'gl',
+  weekdays: 'domingo_luns_martes_mércores_xoves_venres_sábado'.split('_'),
+  months: 'xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'dom._lun._mar._mér._xov._ven._sáb.'.split('_'),
+  monthsShort: 'xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.'.split('_'),
+  weekdaysMin: 'do_lu_ma_mé_xo_ve_sá'.split('_'),
+  ordinal: function ordinal(n) {
+    return n + "\xBA";
+  },
+  formats: {
+    LT: 'H:mm',
+    LTS: 'H:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D [de] MMMM [de] YYYY',
+    LLL: 'D [de] MMMM [de] YYYY H:mm',
+    LLLL: 'dddd, D [de] MMMM [de] YYYY H:mm'
+  },
+  relativeTime: {
+    future: 'en %s',
+    past: 'fai %s',
+    s: 'uns segundos',
+    m: 'un minuto',
+    mm: '%d minutos',
+    h: 'unha hora',
+    hh: '%d horas',
+    d: 'un día',
+    dd: '%d días',
+    M: 'un mes',
+    MM: '%d meses',
+    y: 'un ano',
+    yy: '%d anos'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/gom-latn.js b/node_modules/dayjs/esm/locale/gom-latn.js
new file mode 100644
index 0000000..d621f5b
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/gom-latn.js
@@ -0,0 +1,25 @@
+// Konkani Latin script [gom-latn]
+import dayjs from '../index';
+var locale = {
+  name: 'gom-latn',
+  weekdays: "Aitar_Somar_Mongllar_Budvar_Brestar_Sukrar_Son'var".split('_'),
+  months: 'Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'Ait._Som._Mon._Bud._Bre._Suk._Son.'.split('_'),
+  monthsShort: 'Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.'.split('_'),
+  weekdaysMin: 'Ai_Sm_Mo_Bu_Br_Su_Sn'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'A h:mm [vazta]',
+    LTS: 'A h:mm:ss [vazta]',
+    L: 'DD-MM-YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY A h:mm [vazta]',
+    LLLL: 'dddd, MMMM[achea] Do, YYYY, A h:mm [vazta]',
+    llll: 'ddd, D MMM YYYY, A h:mm [vazta]'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/gu.js b/node_modules/dayjs/esm/locale/gu.js
new file mode 100644
index 0000000..e05f44b
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/gu.js
@@ -0,0 +1,38 @@
+// Gujarati [gu]
+import dayjs from '../index';
+var locale = {
+  name: 'gu',
+  weekdays: 'રવિવાર_સોમવાર_મંગળવાર_બુધ્વાર_ગુરુવાર_શુક્રવાર_શનિવાર'.split('_'),
+  months: 'જાન્યુઆરી_ફેબ્રુઆરી_માર્ચ_એપ્રિલ_મે_જૂન_જુલાઈ_ઑગસ્ટ_સપ્ટેમ્બર_ઑક્ટ્બર_નવેમ્બર_ડિસેમ્બર'.split('_'),
+  weekdaysShort: 'રવિ_સોમ_મંગળ_બુધ્_ગુરુ_શુક્ર_શનિ'.split('_'),
+  monthsShort: 'જાન્યુ._ફેબ્રુ._માર્ચ_એપ્રિ._મે_જૂન_જુલા._ઑગ._સપ્ટે._ઑક્ટ્._નવે._ડિસે.'.split('_'),
+  weekdaysMin: 'ર_સો_મં_બુ_ગુ_શુ_શ'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'A h:mm વાગ્યે',
+    LTS: 'A h:mm:ss વાગ્યે',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY, A h:mm વાગ્યે',
+    LLLL: 'dddd, D MMMM YYYY, A h:mm વાગ્યે'
+  },
+  relativeTime: {
+    future: '%s મા',
+    past: '%s પેહલા',
+    s: 'અમુક પળો',
+    m: 'એક મિનિટ',
+    mm: '%d મિનિટ',
+    h: 'એક કલાક',
+    hh: '%d કલાક',
+    d: 'એક દિવસ',
+    dd: '%d દિવસ',
+    M: 'એક મહિનો',
+    MM: '%d મહિનો',
+    y: 'એક વર્ષ',
+    yy: '%d વર્ષ'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/he.js b/node_modules/dayjs/esm/locale/he.js
new file mode 100644
index 0000000..a8868ff
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/he.js
@@ -0,0 +1,78 @@
+// Hebrew [he]
+import dayjs from '../index';
+var texts = {
+  s: 'מספר שניות',
+  ss: '%d שניות',
+  m: 'דקה',
+  mm: '%d דקות',
+  h: 'שעה',
+  hh: '%d שעות',
+  hh2: 'שעתיים',
+  d: 'יום',
+  dd: '%d ימים',
+  dd2: 'יומיים',
+  M: 'חודש',
+  MM: '%d חודשים',
+  MM2: 'חודשיים',
+  y: 'שנה',
+  yy: '%d שנים',
+  yy2: 'שנתיים'
+};
+
+function relativeTimeFormatter(number, withoutSuffix, key) {
+  var text = texts[key + (number === 2 ? '2' : '')] || texts[key];
+  return text.replace('%d', number);
+}
+
+var locale = {
+  name: 'he',
+  weekdays: 'ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'),
+  weekdaysShort: 'א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'),
+  weekdaysMin: 'א׳_ב׳_ג׳_ד׳_ה׳_ו_ש׳'.split('_'),
+  months: 'ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר'.split('_'),
+  monthsShort: 'ינו_פבר_מרץ_אפר_מאי_יונ_יול_אוג_ספט_אוק_נוב_דצמ'.split('_'),
+  relativeTime: {
+    future: 'בעוד %s',
+    past: 'לפני %s',
+    s: relativeTimeFormatter,
+    m: relativeTimeFormatter,
+    mm: relativeTimeFormatter,
+    h: relativeTimeFormatter,
+    hh: relativeTimeFormatter,
+    d: relativeTimeFormatter,
+    dd: relativeTimeFormatter,
+    M: relativeTimeFormatter,
+    MM: relativeTimeFormatter,
+    y: relativeTimeFormatter,
+    yy: relativeTimeFormatter
+  },
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  format: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D [ב]MMMM YYYY',
+    LLL: 'D [ב]MMMM YYYY HH:mm',
+    LLLL: 'dddd, D [ב]MMMM YYYY HH:mm',
+    l: 'D/M/YYYY',
+    ll: 'D MMM YYYY',
+    lll: 'D MMM YYYY HH:mm',
+    llll: 'ddd, D MMM YYYY HH:mm'
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D [ב]MMMM YYYY',
+    LLL: 'D [ב]MMMM YYYY HH:mm',
+    LLLL: 'dddd, D [ב]MMMM YYYY HH:mm',
+    l: 'D/M/YYYY',
+    ll: 'D MMM YYYY',
+    lll: 'D MMM YYYY HH:mm',
+    llll: 'ddd, D MMM YYYY HH:mm'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/hi.js b/node_modules/dayjs/esm/locale/hi.js
new file mode 100644
index 0000000..e877ed6
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/hi.js
@@ -0,0 +1,38 @@
+// Hindi [hi]
+import dayjs from '../index';
+var locale = {
+  name: 'hi',
+  weekdays: 'रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),
+  months: 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split('_'),
+  weekdaysShort: 'रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि'.split('_'),
+  monthsShort: 'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split('_'),
+  weekdaysMin: 'र_सो_मं_बु_गु_शु_श'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'A h:mm बजे',
+    LTS: 'A h:mm:ss बजे',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY, A h:mm बजे',
+    LLLL: 'dddd, D MMMM YYYY, A h:mm बजे'
+  },
+  relativeTime: {
+    future: '%s में',
+    past: '%s पहले',
+    s: 'कुछ ही क्षण',
+    m: 'एक मिनट',
+    mm: '%d मिनट',
+    h: 'एक घंटा',
+    hh: '%d घंटे',
+    d: 'एक दिन',
+    dd: '%d दिन',
+    M: 'एक महीने',
+    MM: '%d महीने',
+    y: 'एक वर्ष',
+    yy: '%d वर्ष'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/hr.js b/node_modules/dayjs/esm/locale/hr.js
new file mode 100644
index 0000000..a760fe3
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/hr.js
@@ -0,0 +1,53 @@
+// Croatian [hr]
+import dayjs from '../index';
+var monthFormat = 'siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca'.split('_');
+var monthStandalone = 'siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_');
+var MONTHS_IN_FORMAT = /D[oD]?(\[[^[\]]*\]|\s)+MMMM?/;
+
+var months = function months(dayjsInstance, format) {
+  if (MONTHS_IN_FORMAT.test(format)) {
+    return monthFormat[dayjsInstance.month()];
+  }
+
+  return monthStandalone[dayjsInstance.month()];
+};
+
+months.s = monthStandalone;
+months.f = monthFormat;
+var locale = {
+  name: 'hr',
+  weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),
+  weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
+  weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
+  months: months,
+  monthsShort: 'sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'),
+  weekStart: 1,
+  formats: {
+    LT: 'H:mm',
+    LTS: 'H:mm:ss',
+    L: 'DD.MM.YYYY',
+    LL: 'D. MMMM YYYY',
+    LLL: 'D. MMMM YYYY H:mm',
+    LLLL: 'dddd, D. MMMM YYYY H:mm'
+  },
+  relativeTime: {
+    future: 'za %s',
+    past: 'prije %s',
+    s: 'sekunda',
+    m: 'minuta',
+    mm: '%d minuta',
+    h: 'sat',
+    hh: '%d sati',
+    d: 'dan',
+    dd: '%d dana',
+    M: 'mjesec',
+    MM: '%d mjeseci',
+    y: 'godina',
+    yy: '%d godine'
+  },
+  ordinal: function ordinal(n) {
+    return n + ".";
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/ht.js b/node_modules/dayjs/esm/locale/ht.js
new file mode 100644
index 0000000..896739e
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/ht.js
@@ -0,0 +1,38 @@
+// Haitian Creole (Haiti) [ht]
+import dayjs from '../index';
+var locale = {
+  name: 'ht',
+  weekdays: 'dimanch_lendi_madi_mèkredi_jedi_vandredi_samdi'.split('_'),
+  months: 'janvye_fevriye_mas_avril_me_jen_jiyè_out_septanm_oktòb_novanm_desanm'.split('_'),
+  weekdaysShort: 'dim._len._mad._mèk._jed._van._sam.'.split('_'),
+  monthsShort: 'jan._fev._mas_avr._me_jen_jiyè._out_sept._okt._nov._des.'.split('_'),
+  weekdaysMin: 'di_le_ma_mè_je_va_sa'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd D MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: 'nan %s',
+    past: 'sa gen %s',
+    s: 'kèk segond',
+    m: 'yon minit',
+    mm: '%d minit',
+    h: 'inèdtan',
+    hh: '%d zè',
+    d: 'yon jou',
+    dd: '%d jou',
+    M: 'yon mwa',
+    MM: '%d mwa',
+    y: 'yon ane',
+    yy: '%d ane'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/hu.js b/node_modules/dayjs/esm/locale/hu.js
new file mode 100644
index 0000000..18df6e4
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/hu.js
@@ -0,0 +1,61 @@
+// Hungarian [hu]
+import dayjs from '../index';
+var locale = {
+  name: 'hu',
+  weekdays: 'vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat'.split('_'),
+  weekdaysShort: 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'),
+  weekdaysMin: 'v_h_k_sze_cs_p_szo'.split('_'),
+  months: 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'),
+  monthsShort: 'jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec'.split('_'),
+  ordinal: function ordinal(n) {
+    return n + ".";
+  },
+  weekStart: 1,
+  relativeTime: {
+    future: '%s múlva',
+    past: '%s',
+    s: function s(_, _s, ___, isFuture) {
+      return "n\xE9h\xE1ny m\xE1sodperc" + (isFuture || _s ? '' : 'e');
+    },
+    m: function m(_, s, ___, isFuture) {
+      return "egy perc" + (isFuture || s ? '' : 'e');
+    },
+    mm: function mm(n, s, ___, isFuture) {
+      return n + " perc" + (isFuture || s ? '' : 'e');
+    },
+    h: function h(_, s, ___, isFuture) {
+      return "egy " + (isFuture || s ? 'óra' : 'órája');
+    },
+    hh: function hh(n, s, ___, isFuture) {
+      return n + " " + (isFuture || s ? 'óra' : 'órája');
+    },
+    d: function d(_, s, ___, isFuture) {
+      return "egy " + (isFuture || s ? 'nap' : 'napja');
+    },
+    dd: function dd(n, s, ___, isFuture) {
+      return n + " " + (isFuture || s ? 'nap' : 'napja');
+    },
+    M: function M(_, s, ___, isFuture) {
+      return "egy " + (isFuture || s ? 'hónap' : 'hónapja');
+    },
+    MM: function MM(n, s, ___, isFuture) {
+      return n + " " + (isFuture || s ? 'hónap' : 'hónapja');
+    },
+    y: function y(_, s, ___, isFuture) {
+      return "egy " + (isFuture || s ? 'év' : 'éve');
+    },
+    yy: function yy(n, s, ___, isFuture) {
+      return n + " " + (isFuture || s ? 'év' : 'éve');
+    }
+  },
+  formats: {
+    LT: 'H:mm',
+    LTS: 'H:mm:ss',
+    L: 'YYYY.MM.DD.',
+    LL: 'YYYY. MMMM D.',
+    LLL: 'YYYY. MMMM D. H:mm',
+    LLLL: 'YYYY. MMMM D., dddd H:mm'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/hy-am.js b/node_modules/dayjs/esm/locale/hy-am.js
new file mode 100644
index 0000000..937f2be
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/hy-am.js
@@ -0,0 +1,39 @@
+// Armenian [hy-am]
+import dayjs from '../index';
+var locale = {
+  name: 'hy-am',
+  weekdays: 'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split('_'),
+  months: 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),
+  monthsShort: 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_'),
+  weekdaysMin: 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD.MM.YYYY',
+    LL: 'D MMMM YYYY թ.',
+    LLL: 'D MMMM YYYY թ., HH:mm',
+    LLLL: 'dddd, D MMMM YYYY թ., HH:mm'
+  },
+  relativeTime: {
+    future: '%s հետո',
+    past: '%s առաջ',
+    s: 'մի քանի վայրկյան',
+    m: 'րոպե',
+    mm: '%d րոպե',
+    h: 'ժամ',
+    hh: '%d ժամ',
+    d: 'օր',
+    dd: '%d օր',
+    M: 'ամիս',
+    MM: '%d ամիս',
+    y: 'տարի',
+    yy: '%d տարի'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/id.js b/node_modules/dayjs/esm/locale/id.js
new file mode 100644
index 0000000..f743a12
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/id.js
@@ -0,0 +1,39 @@
+// Indonesian [id]
+import dayjs from '../index';
+var locale = {
+  name: 'id',
+  weekdays: 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'),
+  months: 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'),
+  weekdaysShort: 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'),
+  monthsShort: 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des'.split('_'),
+  weekdaysMin: 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'),
+  weekStart: 1,
+  formats: {
+    LT: 'HH.mm',
+    LTS: 'HH.mm.ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY [pukul] HH.mm',
+    LLLL: 'dddd, D MMMM YYYY [pukul] HH.mm'
+  },
+  relativeTime: {
+    future: 'dalam %s',
+    past: '%s yang lalu',
+    s: 'beberapa detik',
+    m: 'semenit',
+    mm: '%d menit',
+    h: 'sejam',
+    hh: '%d jam',
+    d: 'sehari',
+    dd: '%d hari',
+    M: 'sebulan',
+    MM: '%d bulan',
+    y: 'setahun',
+    yy: '%d tahun'
+  },
+  ordinal: function ordinal(n) {
+    return n + ".";
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/index.d.ts b/node_modules/dayjs/esm/locale/index.d.ts
new file mode 100644
index 0000000..beb0d36
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/index.d.ts
@@ -0,0 +1,11 @@
+/// <reference path="./types.d.ts" />
+
+declare module 'dayjs/esm/locale/*' {
+  namespace locale {
+    interface Locale extends ILocale {}
+  }
+
+  const locale: locale.Locale
+
+  export = locale
+}
diff --git a/node_modules/dayjs/esm/locale/is.js b/node_modules/dayjs/esm/locale/is.js
new file mode 100644
index 0000000..22d8121
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/is.js
@@ -0,0 +1,68 @@
+// Icelandic [is]
+import dayjs from '../index';
+var texts = {
+  s: ['nokkrar sekúndur', 'nokkrar sekúndur', 'nokkrum sekúndum'],
+  m: ['mínúta', 'mínútu', 'mínútu'],
+  mm: ['mínútur', 'mínútur', 'mínútum'],
+  h: ['klukkustund', 'klukkustund', 'klukkustund'],
+  hh: ['klukkustundir', 'klukkustundir', 'klukkustundum'],
+  d: ['dagur', 'dag', 'degi'],
+  dd: ['dagar', 'daga', 'dögum'],
+  M: ['mánuður', 'mánuð', 'mánuði'],
+  MM: ['mánuðir', 'mánuði', 'mánuðum'],
+  y: ['ár', 'ár', 'ári'],
+  yy: ['ár', 'ár', 'árum']
+};
+
+function resolveTemplate(key, number, isFuture, withoutSuffix) {
+  var suffixIndex = isFuture ? 1 : 2;
+  var index = withoutSuffix ? 0 : suffixIndex;
+  var keyShouldBeSingular = key.length === 2 && number % 10 === 1;
+  var correctedKey = keyShouldBeSingular ? key[0] : key;
+  var unitText = texts[correctedKey];
+  var text = unitText[index];
+  return key.length === 1 ? text : "%d " + text;
+}
+
+function relativeTimeFormatter(number, withoutSuffix, key, isFuture) {
+  var template = resolveTemplate(key, number, isFuture, withoutSuffix);
+  return template.replace('%d', number);
+}
+
+var locale = {
+  name: 'is',
+  weekdays: 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'),
+  months: 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'sun_mán_þri_mið_fim_fös_lau'.split('_'),
+  monthsShort: 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'),
+  weekdaysMin: 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'H:mm',
+    LTS: 'H:mm:ss',
+    L: 'DD.MM.YYYY',
+    LL: 'D. MMMM YYYY',
+    LLL: 'D. MMMM YYYY [kl.] H:mm',
+    LLLL: 'dddd, D. MMMM YYYY [kl.] H:mm'
+  },
+  relativeTime: {
+    future: 'eftir %s',
+    past: 'fyrir %s síðan',
+    s: relativeTimeFormatter,
+    m: relativeTimeFormatter,
+    mm: relativeTimeFormatter,
+    h: relativeTimeFormatter,
+    hh: relativeTimeFormatter,
+    d: relativeTimeFormatter,
+    dd: relativeTimeFormatter,
+    M: relativeTimeFormatter,
+    MM: relativeTimeFormatter,
+    y: relativeTimeFormatter,
+    yy: relativeTimeFormatter
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/it-ch.js b/node_modules/dayjs/esm/locale/it-ch.js
new file mode 100644
index 0000000..cfbb94d
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/it-ch.js
@@ -0,0 +1,39 @@
+// Italian (Switzerland) [it-ch]
+import dayjs from '../index';
+var locale = {
+  name: 'it-ch',
+  weekdays: 'domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato'.split('_'),
+  months: 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'dom_lun_mar_mer_gio_ven_sab'.split('_'),
+  monthsShort: 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'),
+  weekdaysMin: 'do_lu_ma_me_gi_ve_sa'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD.MM.YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd D MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: 'tra %s',
+    past: '%s fa',
+    s: 'alcuni secondi',
+    m: 'un minuto',
+    mm: '%d minuti',
+    h: 'un\'ora',
+    hh: '%d ore',
+    d: 'un giorno',
+    dd: '%d giorni',
+    M: 'un mese',
+    MM: '%d mesi',
+    y: 'un anno',
+    yy: '%d anni'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/it.js b/node_modules/dayjs/esm/locale/it.js
new file mode 100644
index 0000000..e8d2490
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/it.js
@@ -0,0 +1,39 @@
+// Italian [it]
+import dayjs from '../index';
+var locale = {
+  name: 'it',
+  weekdays: 'domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato'.split('_'),
+  weekdaysShort: 'dom_lun_mar_mer_gio_ven_sab'.split('_'),
+  weekdaysMin: 'do_lu_ma_me_gi_ve_sa'.split('_'),
+  months: 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'),
+  weekStart: 1,
+  monthsShort: 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'),
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd D MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: 'tra %s',
+    past: '%s fa',
+    s: 'qualche secondo',
+    m: 'un minuto',
+    mm: '%d minuti',
+    h: 'un\' ora',
+    hh: '%d ore',
+    d: 'un giorno',
+    dd: '%d giorni',
+    M: 'un mese',
+    MM: '%d mesi',
+    y: 'un anno',
+    yy: '%d anni'
+  },
+  ordinal: function ordinal(n) {
+    return n + "\xBA";
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/ja.js b/node_modules/dayjs/esm/locale/ja.js
new file mode 100644
index 0000000..6568e13
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/ja.js
@@ -0,0 +1,45 @@
+// Japanese [ja]
+import dayjs from '../index';
+var locale = {
+  name: 'ja',
+  weekdays: '日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日'.split('_'),
+  weekdaysShort: '日_月_火_水_木_金_土'.split('_'),
+  weekdaysMin: '日_月_火_水_木_金_土'.split('_'),
+  months: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
+  monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
+  ordinal: function ordinal(n) {
+    return n + "\u65E5";
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'YYYY/MM/DD',
+    LL: 'YYYY年M月D日',
+    LLL: 'YYYY年M月D日 HH:mm',
+    LLLL: 'YYYY年M月D日 dddd HH:mm',
+    l: 'YYYY/MM/DD',
+    ll: 'YYYY年M月D日',
+    lll: 'YYYY年M月D日 HH:mm',
+    llll: 'YYYY年M月D日(ddd) HH:mm'
+  },
+  meridiem: function meridiem(hour) {
+    return hour < 12 ? '午前' : '午後';
+  },
+  relativeTime: {
+    future: '%s後',
+    past: '%s前',
+    s: '数秒',
+    m: '1分',
+    mm: '%d分',
+    h: '1時間',
+    hh: '%d時間',
+    d: '1日',
+    dd: '%d日',
+    M: '1ヶ月',
+    MM: '%dヶ月',
+    y: '1年',
+    yy: '%d年'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/jv.js b/node_modules/dayjs/esm/locale/jv.js
new file mode 100644
index 0000000..81a3f66
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/jv.js
@@ -0,0 +1,39 @@
+// Javanese [jv]
+import dayjs from '../index';
+var locale = {
+  name: 'jv',
+  weekdays: 'Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu'.split('_'),
+  months: 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'Min_Sen_Sel_Reb_Kem_Jem_Sep'.split('_'),
+  monthsShort: 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des'.split('_'),
+  weekdaysMin: 'Mg_Sn_Sl_Rb_Km_Jm_Sp'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH.mm',
+    LTS: 'HH.mm.ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY [pukul] HH.mm',
+    LLLL: 'dddd, D MMMM YYYY [pukul] HH.mm'
+  },
+  relativeTime: {
+    future: 'wonten ing %s',
+    past: '%s ingkang kepengker',
+    s: 'sawetawis detik',
+    m: 'setunggal menit',
+    mm: '%d menit',
+    h: 'setunggal jam',
+    hh: '%d jam',
+    d: 'sedinten',
+    dd: '%d dinten',
+    M: 'sewulan',
+    MM: '%d wulan',
+    y: 'setaun',
+    yy: '%d taun'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/ka.js b/node_modules/dayjs/esm/locale/ka.js
new file mode 100644
index 0000000..381fffa
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/ka.js
@@ -0,0 +1,39 @@
+// Georgian [ka]
+import dayjs from '../index';
+var locale = {
+  name: 'ka',
+  weekdays: 'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split('_'),
+  weekdaysShort: 'კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ'.split('_'),
+  weekdaysMin: 'კვ_ორ_სა_ოთ_ხუ_პა_შა'.split('_'),
+  months: 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split('_'),
+  monthsShort: 'იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ'.split('_'),
+  weekStart: 1,
+  formats: {
+    LT: 'h:mm A',
+    LTS: 'h:mm:ss A',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY h:mm A',
+    LLLL: 'dddd, D MMMM YYYY h:mm A'
+  },
+  relativeTime: {
+    future: '%s შემდეგ',
+    past: '%s წინ',
+    s: 'წამი',
+    m: 'წუთი',
+    mm: '%d წუთი',
+    h: 'საათი',
+    hh: '%d საათის',
+    d: 'დღეს',
+    dd: '%d დღის განმავლობაში',
+    M: 'თვის',
+    MM: '%d თვის',
+    y: 'წელი',
+    yy: '%d წლის'
+  },
+  ordinal: function ordinal(n) {
+    return n;
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/kk.js b/node_modules/dayjs/esm/locale/kk.js
new file mode 100644
index 0000000..f2ca045
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/kk.js
@@ -0,0 +1,39 @@
+// Kazakh [kk]
+import dayjs from '../index';
+var locale = {
+  name: 'kk',
+  weekdays: 'жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі'.split('_'),
+  weekdaysShort: 'жек_дүй_сей_сәр_бей_жұм_сен'.split('_'),
+  weekdaysMin: 'жк_дй_сй_ср_бй_жм_сн'.split('_'),
+  months: 'қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан'.split('_'),
+  monthsShort: 'қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел'.split('_'),
+  weekStart: 1,
+  relativeTime: {
+    future: '%s ішінде',
+    past: '%s бұрын',
+    s: 'бірнеше секунд',
+    m: 'бір минут',
+    mm: '%d минут',
+    h: 'бір сағат',
+    hh: '%d сағат',
+    d: 'бір күн',
+    dd: '%d күн',
+    M: 'бір ай',
+    MM: '%d ай',
+    y: 'бір жыл',
+    yy: '%d жыл'
+  },
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD.MM.YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd, D MMMM YYYY HH:mm'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/km.js b/node_modules/dayjs/esm/locale/km.js
new file mode 100644
index 0000000..7fd185b
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/km.js
@@ -0,0 +1,39 @@
+// Cambodian [km]
+import dayjs from '../index';
+var locale = {
+  name: 'km',
+  weekdays: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),
+  months: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'អា_ច_អ_ព_ព្រ_សុ_ស'.split('_'),
+  monthsShort: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'),
+  weekdaysMin: 'អា_ច_អ_ព_ព្រ_សុ_ស'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd, D MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: '%sទៀត',
+    past: '%sមុន',
+    s: 'ប៉ុន្មានវិនាទី',
+    m: 'មួយនាទី',
+    mm: '%d នាទី',
+    h: 'មួយម៉ោង',
+    hh: '%d ម៉ោង',
+    d: 'មួយថ្ងៃ',
+    dd: '%d ថ្ងៃ',
+    M: 'មួយខែ',
+    MM: '%d ខែ',
+    y: 'មួយឆ្នាំ',
+    yy: '%d ឆ្នាំ'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/kn.js b/node_modules/dayjs/esm/locale/kn.js
new file mode 100644
index 0000000..b9ca9b9
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/kn.js
@@ -0,0 +1,38 @@
+// Kannada [kn]
+import dayjs from '../index';
+var locale = {
+  name: 'kn',
+  weekdays: 'ಭಾನುವಾರ_ಸೋಮವಾರ_ಮಂಗಳವಾರ_ಬುಧವಾರ_ಗುರುವಾರ_ಶುಕ್ರವಾರ_ಶನಿವಾರ'.split('_'),
+  months: 'ಜನವರಿ_ಫೆಬ್ರವರಿ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂಬರ್_ಅಕ್ಟೋಬರ್_ನವೆಂಬರ್_ಡಿಸೆಂಬರ್'.split('_'),
+  weekdaysShort: 'ಭಾನು_ಸೋಮ_ಮಂಗಳ_ಬುಧ_ಗುರು_ಶುಕ್ರ_ಶನಿ'.split('_'),
+  monthsShort: 'ಜನ_ಫೆಬ್ರ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂ_ಅಕ್ಟೋ_ನವೆಂ_ಡಿಸೆಂ'.split('_'),
+  weekdaysMin: 'ಭಾ_ಸೋ_ಮಂ_ಬು_ಗು_ಶು_ಶ'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'A h:mm',
+    LTS: 'A h:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY, A h:mm',
+    LLLL: 'dddd, D MMMM YYYY, A h:mm'
+  },
+  relativeTime: {
+    future: '%s ನಂತರ',
+    past: '%s ಹಿಂದೆ',
+    s: 'ಕೆಲವು ಕ್ಷಣಗಳು',
+    m: 'ಒಂದು ನಿಮಿಷ',
+    mm: '%d ನಿಮಿಷ',
+    h: 'ಒಂದು ಗಂಟೆ',
+    hh: '%d ಗಂಟೆ',
+    d: 'ಒಂದು ದಿನ',
+    dd: '%d ದಿನ',
+    M: 'ಒಂದು ತಿಂಗಳು',
+    MM: '%d ತಿಂಗಳು',
+    y: 'ಒಂದು ವರ್ಷ',
+    yy: '%d ವರ್ಷ'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/ko.js b/node_modules/dayjs/esm/locale/ko.js
new file mode 100644
index 0000000..cfad49d
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/ko.js
@@ -0,0 +1,45 @@
+// Korean [ko]
+import dayjs from '../index';
+var locale = {
+  name: 'ko',
+  weekdays: '일요일_월요일_화요일_수요일_목요일_금요일_토요일'.split('_'),
+  weekdaysShort: '일_월_화_수_목_금_토'.split('_'),
+  weekdaysMin: '일_월_화_수_목_금_토'.split('_'),
+  months: '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),
+  monthsShort: '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),
+  ordinal: function ordinal(n) {
+    return n + "\uC77C";
+  },
+  formats: {
+    LT: 'A h:mm',
+    LTS: 'A h:mm:ss',
+    L: 'YYYY.MM.DD.',
+    LL: 'YYYY년 MMMM D일',
+    LLL: 'YYYY년 MMMM D일 A h:mm',
+    LLLL: 'YYYY년 MMMM D일 dddd A h:mm',
+    l: 'YYYY.MM.DD.',
+    ll: 'YYYY년 MMMM D일',
+    lll: 'YYYY년 MMMM D일 A h:mm',
+    llll: 'YYYY년 MMMM D일 dddd A h:mm'
+  },
+  meridiem: function meridiem(hour) {
+    return hour < 12 ? '오전' : '오후';
+  },
+  relativeTime: {
+    future: '%s 후',
+    past: '%s 전',
+    s: '몇 초',
+    m: '1분',
+    mm: '%d분',
+    h: '한 시간',
+    hh: '%d시간',
+    d: '하루',
+    dd: '%d일',
+    M: '한 달',
+    MM: '%d달',
+    y: '일 년',
+    yy: '%d년'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/ku.js b/node_modules/dayjs/esm/locale/ku.js
new file mode 100644
index 0000000..e56664e
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/ku.js
@@ -0,0 +1,77 @@
+// Kurdish [ku]
+import dayjs from '../index';
+export var englishToArabicNumbersMap = {
+  1: '١',
+  2: '٢',
+  3: '٣',
+  4: '٤',
+  5: '٥',
+  6: '٦',
+  7: '٧',
+  8: '٨',
+  9: '٩',
+  0: '٠'
+};
+var arabicToEnglishNumbersMap = {
+  '١': '1',
+  '٢': '2',
+  '٣': '3',
+  '٤': '4',
+  '٥': '5',
+  '٦': '6',
+  '٧': '7',
+  '٨': '8',
+  '٩': '9',
+  '٠': '0'
+};
+var months = ['کانوونی دووەم', 'شوبات', 'ئادار', 'نیسان', 'ئایار', 'حوزەیران', 'تەممووز', 'ئاب', 'ئەیلوول', 'تشرینی یەکەم', 'تشرینی دووەم', 'کانوونی یەکەم'];
+var locale = {
+  name: 'ku',
+  months: months,
+  monthsShort: months,
+  weekdays: 'یەکشەممە_دووشەممە_سێشەممە_چوارشەممە_پێنجشەممە_هەینی_شەممە'.split('_'),
+  weekdaysShort: 'یەکشەم_دووشەم_سێشەم_چوارشەم_پێنجشەم_هەینی_شەممە'.split('_'),
+  weekStart: 6,
+  weekdaysMin: 'ی_د_س_چ_پ_هـ_ش'.split('_'),
+  preparse: function preparse(string) {
+    return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
+      return arabicToEnglishNumbersMap[match];
+    }).replace(/،/g, ',');
+  },
+  postformat: function postformat(string) {
+    return string.replace(/\d/g, function (match) {
+      return englishToArabicNumbersMap[match];
+    }).replace(/,/g, '،');
+  },
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd, D MMMM YYYY HH:mm'
+  },
+  meridiem: function meridiem(hour) {
+    return hour < 12 ? 'پ.ن' : 'د.ن';
+  },
+  relativeTime: {
+    future: 'لە %s',
+    past: 'لەمەوپێش %s',
+    s: 'چەند چرکەیەک',
+    m: 'یەک خولەک',
+    mm: '%d خولەک',
+    h: 'یەک کاتژمێر',
+    hh: '%d کاتژمێر',
+    d: 'یەک ڕۆژ',
+    dd: '%d ڕۆژ',
+    M: 'یەک مانگ',
+    MM: '%d مانگ',
+    y: 'یەک ساڵ',
+    yy: '%d ساڵ'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/ky.js b/node_modules/dayjs/esm/locale/ky.js
new file mode 100644
index 0000000..fd04477
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/ky.js
@@ -0,0 +1,39 @@
+// Kyrgyz [ky]
+import dayjs from '../index';
+var locale = {
+  name: 'ky',
+  weekdays: 'Жекшемби_Дүйшөмбү_Шейшемби_Шаршемби_Бейшемби_Жума_Ишемби'.split('_'),
+  months: 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'Жек_Дүй_Шей_Шар_Бей_Жум_Ише'.split('_'),
+  monthsShort: 'янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split('_'),
+  weekdaysMin: 'Жк_Дй_Шй_Шр_Бй_Жм_Иш'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD.MM.YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd, D MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: '%s ичинде',
+    past: '%s мурун',
+    s: 'бирнече секунд',
+    m: 'бир мүнөт',
+    mm: '%d мүнөт',
+    h: 'бир саат',
+    hh: '%d саат',
+    d: 'бир күн',
+    dd: '%d күн',
+    M: 'бир ай',
+    MM: '%d ай',
+    y: 'бир жыл',
+    yy: '%d жыл'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/lb.js b/node_modules/dayjs/esm/locale/lb.js
new file mode 100644
index 0000000..21ef4aa
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/lb.js
@@ -0,0 +1,24 @@
+// Luxembourgish [lb]
+import dayjs from '../index';
+var locale = {
+  name: 'lb',
+  weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'),
+  months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'),
+  monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'),
+  weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'H:mm [Auer]',
+    LTS: 'H:mm:ss [Auer]',
+    L: 'DD.MM.YYYY',
+    LL: 'D. MMMM YYYY',
+    LLL: 'D. MMMM YYYY H:mm [Auer]',
+    LLLL: 'dddd, D. MMMM YYYY H:mm [Auer]'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/lo.js b/node_modules/dayjs/esm/locale/lo.js
new file mode 100644
index 0000000..7732ec4
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/lo.js
@@ -0,0 +1,38 @@
+// Lao [lo]
+import dayjs from '../index';
+var locale = {
+  name: 'lo',
+  weekdays: 'ອາທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),
+  months: 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'),
+  weekdaysShort: 'ທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),
+  monthsShort: 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'),
+  weekdaysMin: 'ທ_ຈ_ອຄ_ພ_ພຫ_ສກ_ສ'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'ວັນdddd D MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: 'ອີກ %s',
+    past: '%sຜ່ານມາ',
+    s: 'ບໍ່ເທົ່າໃດວິນາທີ',
+    m: '1 ນາທີ',
+    mm: '%d ນາທີ',
+    h: '1 ຊົ່ວໂມງ',
+    hh: '%d ຊົ່ວໂມງ',
+    d: '1 ມື້',
+    dd: '%d ມື້',
+    M: '1 ເດືອນ',
+    MM: '%d ເດືອນ',
+    y: '1 ປີ',
+    yy: '%d ປີ'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/lt.js b/node_modules/dayjs/esm/locale/lt.js
new file mode 100644
index 0000000..cb46ca9
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/lt.js
@@ -0,0 +1,70 @@
+// Lithuanian [lt]
+import dayjs from '../index';
+var monthFormat = 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio'.split('_');
+var monthStandalone = 'sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis'.split('_'); // eslint-disable-next-line no-useless-escape
+
+var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/;
+
+var months = function months(dayjsInstance, format) {
+  if (MONTHS_IN_FORMAT.test(format)) {
+    return monthFormat[dayjsInstance.month()];
+  }
+
+  return monthStandalone[dayjsInstance.month()];
+};
+
+months.s = monthStandalone;
+months.f = monthFormat;
+var locale = {
+  name: 'lt',
+  weekdays: 'sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis'.split('_'),
+  weekdaysShort: 'sek_pir_ant_tre_ket_pen_šeš'.split('_'),
+  weekdaysMin: 's_p_a_t_k_pn_š'.split('_'),
+  months: months,
+  monthsShort: 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'),
+  ordinal: function ordinal(n) {
+    return n + ".";
+  },
+  weekStart: 1,
+  relativeTime: {
+    future: 'už %s',
+    past: 'prieš %s',
+    s: 'kelias sekundes',
+    m: 'minutę',
+    mm: '%d minutes',
+    h: 'valandą',
+    hh: '%d valandas',
+    d: 'dieną',
+    dd: '%d dienas',
+    M: 'mėnesį',
+    MM: '%d mėnesius',
+    y: 'metus',
+    yy: '%d metus'
+  },
+  format: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'YYYY-MM-DD',
+    LL: 'YYYY [m.] MMMM D [d.]',
+    LLL: 'YYYY [m.] MMMM D [d.], HH:mm [val.]',
+    LLLL: 'YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]',
+    l: 'YYYY-MM-DD',
+    ll: 'YYYY [m.] MMMM D [d.]',
+    lll: 'YYYY [m.] MMMM D [d.], HH:mm [val.]',
+    llll: 'YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]'
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'YYYY-MM-DD',
+    LL: 'YYYY [m.] MMMM D [d.]',
+    LLL: 'YYYY [m.] MMMM D [d.], HH:mm [val.]',
+    LLLL: 'YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]',
+    l: 'YYYY-MM-DD',
+    ll: 'YYYY [m.] MMMM D [d.]',
+    lll: 'YYYY [m.] MMMM D [d.], HH:mm [val.]',
+    llll: 'YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/lv.js b/node_modules/dayjs/esm/locale/lv.js
new file mode 100644
index 0000000..4b18a61
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/lv.js
@@ -0,0 +1,39 @@
+// Latvian [lv]
+import dayjs from '../index';
+var locale = {
+  name: 'lv',
+  weekdays: 'svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena'.split('_'),
+  months: 'janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'Sv_P_O_T_C_Pk_S'.split('_'),
+  monthsShort: 'jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec'.split('_'),
+  weekdaysMin: 'Sv_P_O_T_C_Pk_S'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD.MM.YYYY.',
+    LL: 'YYYY. [gada] D. MMMM',
+    LLL: 'YYYY. [gada] D. MMMM, HH:mm',
+    LLLL: 'YYYY. [gada] D. MMMM, dddd, HH:mm'
+  },
+  relativeTime: {
+    future: 'pēc %s',
+    past: 'pirms %s',
+    s: 'dažām sekundēm',
+    m: 'minūtes',
+    mm: '%d minūtēm',
+    h: 'stundas',
+    hh: '%d stundām',
+    d: 'dienas',
+    dd: '%d dienām',
+    M: 'mēneša',
+    MM: '%d mēnešiem',
+    y: 'gada',
+    yy: '%d gadiem'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/me.js b/node_modules/dayjs/esm/locale/me.js
new file mode 100644
index 0000000..465c0ff
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/me.js
@@ -0,0 +1,24 @@
+// Montenegrin [me]
+import dayjs from '../index';
+var locale = {
+  name: 'me',
+  weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),
+  months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
+  monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'),
+  weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'H:mm',
+    LTS: 'H:mm:ss',
+    L: 'DD.MM.YYYY',
+    LL: 'D. MMMM YYYY',
+    LLL: 'D. MMMM YYYY H:mm',
+    LLLL: 'dddd, D. MMMM YYYY H:mm'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/mi.js b/node_modules/dayjs/esm/locale/mi.js
new file mode 100644
index 0000000..3b56f0e
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/mi.js
@@ -0,0 +1,39 @@
+// Maori [mi]
+import dayjs from '../index';
+var locale = {
+  name: 'mi',
+  weekdays: 'Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei'.split('_'),
+  months: 'Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),
+  monthsShort: 'Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki'.split('_'),
+  weekdaysMin: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY [i] HH:mm',
+    LLLL: 'dddd, D MMMM YYYY [i] HH:mm'
+  },
+  relativeTime: {
+    future: 'i roto i %s',
+    past: '%s i mua',
+    s: 'te hēkona ruarua',
+    m: 'he meneti',
+    mm: '%d meneti',
+    h: 'te haora',
+    hh: '%d haora',
+    d: 'he ra',
+    dd: '%d ra',
+    M: 'he marama',
+    MM: '%d marama',
+    y: 'he tau',
+    yy: '%d tau'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/mk.js b/node_modules/dayjs/esm/locale/mk.js
new file mode 100644
index 0000000..8522c26
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/mk.js
@@ -0,0 +1,39 @@
+// Macedonian [mk]
+import dayjs from '../index';
+var locale = {
+  name: 'mk',
+  weekdays: 'недела_понеделник_вторник_среда_четврток_петок_сабота'.split('_'),
+  months: 'јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'нед_пон_вто_сре_чет_пет_саб'.split('_'),
+  monthsShort: 'јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек'.split('_'),
+  weekdaysMin: 'нe_пo_вт_ср_че_пе_сa'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'H:mm',
+    LTS: 'H:mm:ss',
+    L: 'D.MM.YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY H:mm',
+    LLLL: 'dddd, D MMMM YYYY H:mm'
+  },
+  relativeTime: {
+    future: 'после %s',
+    past: 'пред %s',
+    s: 'неколку секунди',
+    m: 'минута',
+    mm: '%d минути',
+    h: 'час',
+    hh: '%d часа',
+    d: 'ден',
+    dd: '%d дена',
+    M: 'месец',
+    MM: '%d месеци',
+    y: 'година',
+    yy: '%d години'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/ml.js b/node_modules/dayjs/esm/locale/ml.js
new file mode 100644
index 0000000..bfcc277
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/ml.js
@@ -0,0 +1,38 @@
+// Malayalam [ml]
+import dayjs from '../index';
+var locale = {
+  name: 'ml',
+  weekdays: 'ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച'.split('_'),
+  months: 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split('_'),
+  weekdaysShort: 'ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി'.split('_'),
+  monthsShort: 'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split('_'),
+  weekdaysMin: 'ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'A h:mm -നു',
+    LTS: 'A h:mm:ss -നു',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY, A h:mm -നു',
+    LLLL: 'dddd, D MMMM YYYY, A h:mm -നു'
+  },
+  relativeTime: {
+    future: '%s കഴിഞ്ഞ്',
+    past: '%s മുൻപ്',
+    s: 'അൽപ നിമിഷങ്ങൾ',
+    m: 'ഒരു മിനിറ്റ്',
+    mm: '%d മിനിറ്റ്',
+    h: 'ഒരു മണിക്കൂർ',
+    hh: '%d മണിക്കൂർ',
+    d: 'ഒരു ദിവസം',
+    dd: '%d ദിവസം',
+    M: 'ഒരു മാസം',
+    MM: '%d മാസം',
+    y: 'ഒരു വർഷം',
+    yy: '%d വർഷം'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/mn.js b/node_modules/dayjs/esm/locale/mn.js
new file mode 100644
index 0000000..d93cae2
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/mn.js
@@ -0,0 +1,38 @@
+// Mongolian [mn]
+import dayjs from '../index';
+var locale = {
+  name: 'mn',
+  weekdays: 'Ням_Даваа_Мягмар_Лхагва_Пүрэв_Баасан_Бямба'.split('_'),
+  months: 'Нэгдүгээр сар_Хоёрдугаар сар_Гуравдугаар сар_Дөрөвдүгээр сар_Тавдугаар сар_Зургадугаар сар_Долдугаар сар_Наймдугаар сар_Есдүгээр сар_Аравдугаар сар_Арван нэгдүгээр сар_Арван хоёрдугаар сар'.split('_'),
+  weekdaysShort: 'Ням_Дав_Мяг_Лха_Пүр_Баа_Бям'.split('_'),
+  monthsShort: '1 сар_2 сар_3 сар_4 сар_5 сар_6 сар_7 сар_8 сар_9 сар_10 сар_11 сар_12 сар'.split('_'),
+  weekdaysMin: 'Ня_Да_Мя_Лх_Пү_Ба_Бя'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'YYYY-MM-DD',
+    LL: 'YYYY оны MMMMын D',
+    LLL: 'YYYY оны MMMMын D HH:mm',
+    LLLL: 'dddd, YYYY оны MMMMын D HH:mm'
+  },
+  relativeTime: {
+    future: '%s',
+    past: '%s',
+    s: 'саяхан',
+    m: 'м',
+    mm: '%dм',
+    h: '1ц',
+    hh: '%dц',
+    d: '1ө',
+    dd: '%dө',
+    M: '1с',
+    MM: '%dс',
+    y: '1ж',
+    yy: '%dж'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/mr.js b/node_modules/dayjs/esm/locale/mr.js
new file mode 100644
index 0000000..9eac8a7
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/mr.js
@@ -0,0 +1,23 @@
+// Marathi [mr]
+import dayjs from '../index';
+var locale = {
+  name: 'mr',
+  weekdays: 'रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),
+  months: 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split('_'),
+  weekdaysShort: 'रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि'.split('_'),
+  monthsShort: 'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split('_'),
+  weekdaysMin: 'र_सो_मं_बु_गु_शु_श'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'A h:mm वाजता',
+    LTS: 'A h:mm:ss वाजता',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY, A h:mm वाजता',
+    LLLL: 'dddd, D MMMM YYYY, A h:mm वाजता'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/ms-my.js b/node_modules/dayjs/esm/locale/ms-my.js
new file mode 100644
index 0000000..5138219
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/ms-my.js
@@ -0,0 +1,39 @@
+// Malay [ms-my]
+import dayjs from '../index';
+var locale = {
+  name: 'ms-my',
+  weekdays: 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),
+  months: 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'),
+  monthsShort: 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),
+  weekdaysMin: 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH.mm',
+    LTS: 'HH.mm.ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY [pukul] HH.mm',
+    LLLL: 'dddd, D MMMM YYYY [pukul] HH.mm'
+  },
+  relativeTime: {
+    future: 'dalam %s',
+    past: '%s yang lepas',
+    s: 'beberapa saat',
+    m: 'seminit',
+    mm: '%d minit',
+    h: 'sejam',
+    hh: '%d jam',
+    d: 'sehari',
+    dd: '%d hari',
+    M: 'sebulan',
+    MM: '%d bulan',
+    y: 'setahun',
+    yy: '%d tahun'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/ms.js b/node_modules/dayjs/esm/locale/ms.js
new file mode 100644
index 0000000..86349f3
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/ms.js
@@ -0,0 +1,39 @@
+// Malay [ms]
+import dayjs from '../index';
+var locale = {
+  name: 'ms',
+  weekdays: 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),
+  weekdaysShort: 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'),
+  weekdaysMin: 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),
+  months: 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'),
+  monthsShort: 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),
+  weekStart: 1,
+  formats: {
+    LT: 'HH.mm',
+    LTS: 'HH.mm.ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH.mm',
+    LLLL: 'dddd, D MMMM YYYY HH.mm'
+  },
+  relativeTime: {
+    future: 'dalam %s',
+    past: '%s yang lepas',
+    s: 'beberapa saat',
+    m: 'seminit',
+    mm: '%d minit',
+    h: 'sejam',
+    hh: '%d jam',
+    d: 'sehari',
+    dd: '%d hari',
+    M: 'sebulan',
+    MM: '%d bulan',
+    y: 'setahun',
+    yy: '%d tahun'
+  },
+  ordinal: function ordinal(n) {
+    return n + ".";
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/mt.js b/node_modules/dayjs/esm/locale/mt.js
new file mode 100644
index 0000000..9c90953
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/mt.js
@@ -0,0 +1,39 @@
+// Maltese (Malta) [mt]
+import dayjs from '../index';
+var locale = {
+  name: 'mt',
+  weekdays: 'Il-Ħadd_It-Tnejn_It-Tlieta_L-Erbgħa_Il-Ħamis_Il-Ġimgħa_Is-Sibt'.split('_'),
+  months: 'Jannar_Frar_Marzu_April_Mejju_Ġunju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Diċembru'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'Ħad_Tne_Tli_Erb_Ħam_Ġim_Sib'.split('_'),
+  monthsShort: 'Jan_Fra_Mar_Apr_Mej_Ġun_Lul_Aww_Set_Ott_Nov_Diċ'.split('_'),
+  weekdaysMin: 'Ħa_Tn_Tl_Er_Ħa_Ġi_Si'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd, D MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: 'f’ %s',
+    past: '%s ilu',
+    s: 'ftit sekondi',
+    m: 'minuta',
+    mm: '%d minuti',
+    h: 'siegħa',
+    hh: '%d siegħat',
+    d: 'ġurnata',
+    dd: '%d ġranet',
+    M: 'xahar',
+    MM: '%d xhur',
+    y: 'sena',
+    yy: '%d sni'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/my.js b/node_modules/dayjs/esm/locale/my.js
new file mode 100644
index 0000000..73b2633
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/my.js
@@ -0,0 +1,39 @@
+// Burmese [my]
+import dayjs from '../index';
+var locale = {
+  name: 'my',
+  weekdays: 'တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ'.split('_'),
+  months: 'ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),
+  monthsShort: 'ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'),
+  weekdaysMin: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd D MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: 'လာမည့် %s မှာ',
+    past: 'လွန်ခဲ့သော %s က',
+    s: 'စက္ကန်.အနည်းငယ်',
+    m: 'တစ်မိနစ်',
+    mm: '%d မိနစ်',
+    h: 'တစ်နာရီ',
+    hh: '%d နာရီ',
+    d: 'တစ်ရက်',
+    dd: '%d ရက်',
+    M: 'တစ်လ',
+    MM: '%d လ',
+    y: 'တစ်နှစ်',
+    yy: '%d နှစ်'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/nb.js b/node_modules/dayjs/esm/locale/nb.js
new file mode 100644
index 0000000..1d7b1eb
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/nb.js
@@ -0,0 +1,40 @@
+// Norwegian Bokmål [nb]
+import dayjs from '../index';
+var locale = {
+  name: 'nb',
+  weekdays: 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),
+  weekdaysShort: 'sø._ma._ti._on._to._fr._lø.'.split('_'),
+  weekdaysMin: 'sø_ma_ti_on_to_fr_lø'.split('_'),
+  months: 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'),
+  monthsShort: 'jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.'.split('_'),
+  ordinal: function ordinal(n) {
+    return n + ".";
+  },
+  weekStart: 1,
+  yearStart: 4,
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD.MM.YYYY',
+    LL: 'D. MMMM YYYY',
+    LLL: 'D. MMMM YYYY [kl.] HH:mm',
+    LLLL: 'dddd D. MMMM YYYY [kl.] HH:mm'
+  },
+  relativeTime: {
+    future: 'om %s',
+    past: '%s siden',
+    s: 'noen sekunder',
+    m: 'ett minutt',
+    mm: '%d minutter',
+    h: 'en time',
+    hh: '%d timer',
+    d: 'en dag',
+    dd: '%d dager',
+    M: 'en måned',
+    MM: '%d måneder',
+    y: 'ett år',
+    yy: '%d år'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/ne.js b/node_modules/dayjs/esm/locale/ne.js
new file mode 100644
index 0000000..4f5a004
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/ne.js
@@ -0,0 +1,40 @@
+// Nepalese [ne]
+import dayjs from '../index';
+var locale = {
+  name: 'ne',
+  weekdays: 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split('_'),
+  weekdaysShort: 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split('_'),
+  weekdaysMin: 'आ._सो._मं._बु._बि._शु._श.'.split('_'),
+  months: 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मे_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split('_'),
+  monthsShort: 'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split('_'),
+  relativeTime: {
+    future: '%s पछि',
+    past: '%s अघि',
+    s: 'सेकेन्ड',
+    m: 'एक मिनेट',
+    mm: '%d मिनेट',
+    h: 'घन्टा',
+    hh: '%d घन्टा',
+    d: 'एक दिन',
+    dd: '%d दिन',
+    M: 'एक महिना',
+    MM: '%d महिना',
+    y: 'एक वर्ष',
+    yy: '%d वर्ष'
+  },
+  ordinal: function ordinal(n) {
+    return ("" + n).replace(/\d/g, function (i) {
+      return '०१२३४५६७८९'[i];
+    });
+  },
+  formats: {
+    LT: 'Aको h:mm बजे',
+    LTS: 'Aको h:mm:ss बजे',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY, Aको h:mm बजे',
+    LLLL: 'dddd, D MMMM YYYY, Aको h:mm बजे'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/nl-be.js b/node_modules/dayjs/esm/locale/nl-be.js
new file mode 100644
index 0000000..51465b7
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/nl-be.js
@@ -0,0 +1,39 @@
+// Dutch (Belgium) [nl-be]
+import dayjs from '../index';
+var locale = {
+  name: 'nl-be',
+  weekdays: 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),
+  months: 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'),
+  monthsShort: 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'zo._ma._di._wo._do._vr._za.'.split('_'),
+  weekdaysMin: 'zo_ma_di_wo_do_vr_za'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd D MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: 'over %s',
+    past: '%s geleden',
+    s: 'een paar seconden',
+    m: 'één minuut',
+    mm: '%d minuten',
+    h: 'één uur',
+    hh: '%d uur',
+    d: 'één dag',
+    dd: '%d dagen',
+    M: 'één maand',
+    MM: '%d maanden',
+    y: 'één jaar',
+    yy: '%d jaar'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/nl.js b/node_modules/dayjs/esm/locale/nl.js
new file mode 100644
index 0000000..ee1ac74
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/nl.js
@@ -0,0 +1,40 @@
+// Dutch [nl]
+import dayjs from '../index';
+var locale = {
+  name: 'nl',
+  weekdays: 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),
+  weekdaysShort: 'zo._ma._di._wo._do._vr._za.'.split('_'),
+  weekdaysMin: 'zo_ma_di_wo_do_vr_za'.split('_'),
+  months: 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'),
+  monthsShort: 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'),
+  ordinal: function ordinal(n) {
+    return "[" + n + (n === 1 || n === 8 || n >= 20 ? 'ste' : 'de') + "]";
+  },
+  weekStart: 1,
+  yearStart: 4,
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD-MM-YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd D MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: 'over %s',
+    past: '%s geleden',
+    s: 'een paar seconden',
+    m: 'een minuut',
+    mm: '%d minuten',
+    h: 'een uur',
+    hh: '%d uur',
+    d: 'een dag',
+    dd: '%d dagen',
+    M: 'een maand',
+    MM: '%d maanden',
+    y: 'een jaar',
+    yy: '%d jaar'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/nn.js b/node_modules/dayjs/esm/locale/nn.js
new file mode 100644
index 0000000..43767a4
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/nn.js
@@ -0,0 +1,39 @@
+// Nynorsk [nn]
+import dayjs from '../index';
+var locale = {
+  name: 'nn',
+  weekdays: 'sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'),
+  weekdaysShort: 'sun_mån_tys_ons_tor_fre_lau'.split('_'),
+  weekdaysMin: 'su_må_ty_on_to_fr_la'.split('_'),
+  months: 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'),
+  monthsShort: 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),
+  ordinal: function ordinal(n) {
+    return n + ".";
+  },
+  weekStart: 1,
+  relativeTime: {
+    future: 'om %s',
+    past: 'for %s sidan',
+    s: 'nokre sekund',
+    m: 'eitt minutt',
+    mm: '%d minutt',
+    h: 'ein time',
+    hh: '%d timar',
+    d: 'ein dag',
+    dd: '%d dagar',
+    M: 'ein månad',
+    MM: '%d månadar',
+    y: 'eitt år',
+    yy: '%d år'
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD.MM.YYYY',
+    LL: 'D. MMMM YYYY',
+    LLL: 'D. MMMM YYYY [kl.] H:mm',
+    LLLL: 'dddd D. MMMM YYYY [kl.] HH:mm'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/oc-lnc.js b/node_modules/dayjs/esm/locale/oc-lnc.js
new file mode 100644
index 0000000..91e2f0d
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/oc-lnc.js
@@ -0,0 +1,39 @@
+// Occitan, lengadocian dialecte [oc-lnc]
+import dayjs from '../index';
+var locale = {
+  name: 'oc-lnc',
+  weekdays: 'dimenge_diluns_dimars_dimècres_dijòus_divendres_dissabte'.split('_'),
+  weekdaysShort: 'Dg_Dl_Dm_Dc_Dj_Dv_Ds'.split('_'),
+  weekdaysMin: 'dg_dl_dm_dc_dj_dv_ds'.split('_'),
+  months: 'genièr_febrièr_març_abrial_mai_junh_julhet_agost_setembre_octòbre_novembre_decembre'.split('_'),
+  monthsShort: 'gen_feb_març_abr_mai_junh_julh_ago_set_oct_nov_dec'.split('_'),
+  weekStart: 1,
+  formats: {
+    LT: 'H:mm',
+    LTS: 'H:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM [de] YYYY',
+    LLL: 'D MMMM [de] YYYY [a] H:mm',
+    LLLL: 'dddd D MMMM [de] YYYY [a] H:mm'
+  },
+  relativeTime: {
+    future: 'd\'aquí %s',
+    past: 'fa %s',
+    s: 'unas segondas',
+    m: 'una minuta',
+    mm: '%d minutas',
+    h: 'una ora',
+    hh: '%d oras',
+    d: 'un jorn',
+    dd: '%d jorns',
+    M: 'un mes',
+    MM: '%d meses',
+    y: 'un an',
+    yy: '%d ans'
+  },
+  ordinal: function ordinal(n) {
+    return n + "\xBA";
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/pa-in.js b/node_modules/dayjs/esm/locale/pa-in.js
new file mode 100644
index 0000000..624a852
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/pa-in.js
@@ -0,0 +1,38 @@
+// Punjabi (India) [pa-in]
+import dayjs from '../index';
+var locale = {
+  name: 'pa-in',
+  weekdays: 'ਐਤਵਾਰ_ਸੋਮਵਾਰ_ਮੰਗਲਵਾਰ_ਬੁਧਵਾਰ_ਵੀਰਵਾਰ_ਸ਼ੁੱਕਰਵਾਰ_ਸ਼ਨੀਚਰਵਾਰ'.split('_'),
+  months: 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'),
+  weekdaysShort: 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),
+  monthsShort: 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'),
+  weekdaysMin: 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'A h:mm ਵਜੇ',
+    LTS: 'A h:mm:ss ਵਜੇ',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY, A h:mm ਵਜੇ',
+    LLLL: 'dddd, D MMMM YYYY, A h:mm ਵਜੇ'
+  },
+  relativeTime: {
+    future: '%s ਵਿੱਚ',
+    past: '%s ਪਿਛਲੇ',
+    s: 'ਕੁਝ ਸਕਿੰਟ',
+    m: 'ਇਕ ਮਿੰਟ',
+    mm: '%d ਮਿੰਟ',
+    h: 'ਇੱਕ ਘੰਟਾ',
+    hh: '%d ਘੰਟੇ',
+    d: 'ਇੱਕ ਦਿਨ',
+    dd: '%d ਦਿਨ',
+    M: 'ਇੱਕ ਮਹੀਨਾ',
+    MM: '%d ਮਹੀਨੇ',
+    y: 'ਇੱਕ ਸਾਲ',
+    yy: '%d ਸਾਲ'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/pl.js b/node_modules/dayjs/esm/locale/pl.js
new file mode 100644
index 0000000..368b2a5
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/pl.js
@@ -0,0 +1,87 @@
+// Polish [pl]
+import dayjs from '../index';
+
+function plural(n) {
+  return n % 10 < 5 && n % 10 > 1 && ~~(n / 10) % 10 !== 1; // eslint-disable-line
+}
+/* eslint-disable */
+
+
+function translate(number, withoutSuffix, key) {
+  var result = number + " ";
+
+  switch (key) {
+    case 'm':
+      return withoutSuffix ? 'minuta' : 'minutę';
+
+    case 'mm':
+      return result + (plural(number) ? 'minuty' : 'minut');
+
+    case 'h':
+      return withoutSuffix ? 'godzina' : 'godzinę';
+
+    case 'hh':
+      return result + (plural(number) ? 'godziny' : 'godzin');
+
+    case 'MM':
+      return result + (plural(number) ? 'miesiące' : 'miesięcy');
+
+    case 'yy':
+      return result + (plural(number) ? 'lata' : 'lat');
+  }
+}
+/* eslint-enable */
+
+
+var monthFormat = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia'.split('_');
+var monthStandalone = 'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split('_');
+var MONTHS_IN_FORMAT = /D MMMM/;
+
+var months = function months(dayjsInstance, format) {
+  if (MONTHS_IN_FORMAT.test(format)) {
+    return monthFormat[dayjsInstance.month()];
+  }
+
+  return monthStandalone[dayjsInstance.month()];
+};
+
+months.s = monthStandalone;
+months.f = monthFormat;
+var locale = {
+  name: 'pl',
+  weekdays: 'niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota'.split('_'),
+  weekdaysShort: 'ndz_pon_wt_śr_czw_pt_sob'.split('_'),
+  weekdaysMin: 'Nd_Pn_Wt_Śr_Cz_Pt_So'.split('_'),
+  months: months,
+  monthsShort: 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'),
+  ordinal: function ordinal(n) {
+    return n + ".";
+  },
+  weekStart: 1,
+  yearStart: 4,
+  relativeTime: {
+    future: 'za %s',
+    past: '%s temu',
+    s: 'kilka sekund',
+    m: translate,
+    mm: translate,
+    h: translate,
+    hh: translate,
+    d: '1 dzień',
+    dd: '%d dni',
+    M: 'miesiąc',
+    MM: translate,
+    y: 'rok',
+    yy: translate
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD.MM.YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd, D MMMM YYYY HH:mm'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/pt-br.js b/node_modules/dayjs/esm/locale/pt-br.js
new file mode 100644
index 0000000..0635cd8
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/pt-br.js
@@ -0,0 +1,38 @@
+// Portuguese (Brazil) [pt-br]
+import dayjs from '../index';
+var locale = {
+  name: 'pt-br',
+  weekdays: 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'),
+  weekdaysShort: 'dom_seg_ter_qua_qui_sex_sáb'.split('_'),
+  weekdaysMin: 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'),
+  months: 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'),
+  monthsShort: 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),
+  ordinal: function ordinal(n) {
+    return n + "\xBA";
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D [de] MMMM [de] YYYY',
+    LLL: 'D [de] MMMM [de] YYYY [às] HH:mm',
+    LLLL: 'dddd, D [de] MMMM [de] YYYY [às] HH:mm'
+  },
+  relativeTime: {
+    future: 'em %s',
+    past: 'há %s',
+    s: 'poucos segundos',
+    m: 'um minuto',
+    mm: '%d minutos',
+    h: 'uma hora',
+    hh: '%d horas',
+    d: 'um dia',
+    dd: '%d dias',
+    M: 'um mês',
+    MM: '%d meses',
+    y: 'um ano',
+    yy: '%d anos'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/pt.js b/node_modules/dayjs/esm/locale/pt.js
new file mode 100644
index 0000000..cba2331
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/pt.js
@@ -0,0 +1,40 @@
+// Portuguese [pt]
+import dayjs from '../index';
+var locale = {
+  name: 'pt',
+  weekdays: 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'),
+  weekdaysShort: 'dom_seg_ter_qua_qui_sex_sab'.split('_'),
+  weekdaysMin: 'Do_2ª_3ª_4ª_5ª_6ª_Sa'.split('_'),
+  months: 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'),
+  monthsShort: 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),
+  ordinal: function ordinal(n) {
+    return n + "\xBA";
+  },
+  weekStart: 1,
+  yearStart: 4,
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D [de] MMMM [de] YYYY',
+    LLL: 'D [de] MMMM [de] YYYY [às] HH:mm',
+    LLLL: 'dddd, D [de] MMMM [de] YYYY [às] HH:mm'
+  },
+  relativeTime: {
+    future: 'em %s',
+    past: 'há %s',
+    s: 'alguns segundos',
+    m: 'um minuto',
+    mm: '%d minutos',
+    h: 'uma hora',
+    hh: '%d horas',
+    d: 'um dia',
+    dd: '%d dias',
+    M: 'um mês',
+    MM: '%d meses',
+    y: 'um ano',
+    yy: '%d anos'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/rn.js b/node_modules/dayjs/esm/locale/rn.js
new file mode 100644
index 0000000..21b3cdb
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/rn.js
@@ -0,0 +1,39 @@
+// Kirundi [rn]
+import dayjs from '../index';
+var locale = {
+  name: 'rn',
+  weekdays: 'Ku wa Mungu_Ku wa Mbere_Ku wa Kabiri_Ku wa Gatatu_Ku wa Kane_Ku wa Gatanu_Ku wa Gatandatu'.split('_'),
+  weekdaysShort: 'Kngu_Kmbr_Kbri_Ktat_Kkan_Ktan_Kdat'.split('_'),
+  weekdaysMin: 'K7_K1_K2_K3_K4_K5_K6'.split('_'),
+  months: 'Nzero_Ruhuhuma_Ntwarante_Ndamukiza_Rusama_Ruhenshi_Mukakaro_Myandagaro_Nyakanga_Gitugutu_Munyonyo_Kigarama'.split('_'),
+  monthsShort: 'Nzer_Ruhuh_Ntwar_Ndam_Rus_Ruhen_Muk_Myand_Nyak_Git_Muny_Kig'.split('_'),
+  weekStart: 1,
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  relativeTime: {
+    future: 'mu %s',
+    past: '%s',
+    s: 'amasegonda',
+    m: 'Umunota',
+    mm: '%d iminota',
+    h: 'isaha',
+    hh: '%d amasaha',
+    d: 'Umunsi',
+    dd: '%d iminsi',
+    M: 'ukwezi',
+    MM: '%d amezi',
+    y: 'umwaka',
+    yy: '%d imyaka'
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd, D MMMM YYYY HH:mm'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/ro.js b/node_modules/dayjs/esm/locale/ro.js
new file mode 100644
index 0000000..93ef6bf
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/ro.js
@@ -0,0 +1,39 @@
+// Romanian [ro]
+import dayjs from '../index';
+var locale = {
+  name: 'ro',
+  weekdays: 'Duminică_Luni_Marți_Miercuri_Joi_Vineri_Sâmbătă'.split('_'),
+  weekdaysShort: 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'),
+  weekdaysMin: 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'),
+  months: 'Ianuarie_Februarie_Martie_Aprilie_Mai_Iunie_Iulie_August_Septembrie_Octombrie_Noiembrie_Decembrie'.split('_'),
+  monthsShort: 'Ian._Febr._Mart._Apr._Mai_Iun._Iul._Aug._Sept._Oct._Nov._Dec.'.split('_'),
+  weekStart: 1,
+  formats: {
+    LT: 'H:mm',
+    LTS: 'H:mm:ss',
+    L: 'DD.MM.YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY H:mm',
+    LLLL: 'dddd, D MMMM YYYY H:mm'
+  },
+  relativeTime: {
+    future: 'peste %s',
+    past: 'acum %s',
+    s: 'câteva secunde',
+    m: 'un minut',
+    mm: '%d minute',
+    h: 'o oră',
+    hh: '%d ore',
+    d: 'o zi',
+    dd: '%d zile',
+    M: 'o lună',
+    MM: '%d luni',
+    y: 'un an',
+    yy: '%d ani'
+  },
+  ordinal: function ordinal(n) {
+    return n;
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/ru.js b/node_modules/dayjs/esm/locale/ru.js
new file mode 100644
index 0000000..fbb1b35
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/ru.js
@@ -0,0 +1,99 @@
+// Russian [ru]
+import dayjs from '../index';
+var monthFormat = 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split('_');
+var monthStandalone = 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_');
+var monthShortFormat = 'янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.'.split('_');
+var monthShortStandalone = 'янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.'.split('_');
+var MONTHS_IN_FORMAT = /D[oD]?(\[[^[\]]*\]|\s)+MMMM?/;
+
+function plural(word, num) {
+  var forms = word.split('_');
+  return num % 10 === 1 && num % 100 !== 11 ? forms[0] : num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]; // eslint-disable-line
+}
+
+function relativeTimeWithPlural(number, withoutSuffix, key) {
+  var format = {
+    mm: withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут',
+    hh: 'час_часа_часов',
+    dd: 'день_дня_дней',
+    MM: 'месяц_месяца_месяцев',
+    yy: 'год_года_лет'
+  };
+
+  if (key === 'm') {
+    return withoutSuffix ? 'минута' : 'минуту';
+  }
+
+  return number + " " + plural(format[key], +number);
+}
+
+var months = function months(dayjsInstance, format) {
+  if (MONTHS_IN_FORMAT.test(format)) {
+    return monthFormat[dayjsInstance.month()];
+  }
+
+  return monthStandalone[dayjsInstance.month()];
+};
+
+months.s = monthStandalone;
+months.f = monthFormat;
+
+var monthsShort = function monthsShort(dayjsInstance, format) {
+  if (MONTHS_IN_FORMAT.test(format)) {
+    return monthShortFormat[dayjsInstance.month()];
+  }
+
+  return monthShortStandalone[dayjsInstance.month()];
+};
+
+monthsShort.s = monthShortStandalone;
+monthsShort.f = monthShortFormat;
+var locale = {
+  name: 'ru',
+  weekdays: 'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split('_'),
+  weekdaysShort: 'вск_пнд_втр_срд_чтв_птн_сбт'.split('_'),
+  weekdaysMin: 'вс_пн_вт_ср_чт_пт_сб'.split('_'),
+  months: months,
+  monthsShort: monthsShort,
+  weekStart: 1,
+  yearStart: 4,
+  formats: {
+    LT: 'H:mm',
+    LTS: 'H:mm:ss',
+    L: 'DD.MM.YYYY',
+    LL: 'D MMMM YYYY г.',
+    LLL: 'D MMMM YYYY г., H:mm',
+    LLLL: 'dddd, D MMMM YYYY г., H:mm'
+  },
+  relativeTime: {
+    future: 'через %s',
+    past: '%s назад',
+    s: 'несколько секунд',
+    m: relativeTimeWithPlural,
+    mm: relativeTimeWithPlural,
+    h: 'час',
+    hh: relativeTimeWithPlural,
+    d: 'день',
+    dd: relativeTimeWithPlural,
+    M: 'месяц',
+    MM: relativeTimeWithPlural,
+    y: 'год',
+    yy: relativeTimeWithPlural
+  },
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  meridiem: function meridiem(hour) {
+    if (hour < 4) {
+      return 'ночи';
+    } else if (hour < 12) {
+      return 'утра';
+    } else if (hour < 17) {
+      return 'дня';
+    }
+
+    return 'вечера';
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/rw.js b/node_modules/dayjs/esm/locale/rw.js
new file mode 100644
index 0000000..1e53ac7
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/rw.js
@@ -0,0 +1,35 @@
+// Kinyarwanda (Rwanda) [rw]
+import dayjs from '../index';
+var locale = {
+  name: 'rw',
+  weekdays: 'Ku Cyumweru_Kuwa Mbere_Kuwa Kabiri_Kuwa Gatatu_Kuwa Kane_Kuwa Gatanu_Kuwa Gatandatu'.split('_'),
+  months: 'Mutarama_Gashyantare_Werurwe_Mata_Gicurasi_Kamena_Nyakanga_Kanama_Nzeri_Ukwakira_Ugushyingo_Ukuboza'.split('_'),
+  relativeTime: {
+    future: 'mu %s',
+    past: '%s',
+    s: 'amasegonda',
+    m: 'Umunota',
+    mm: '%d iminota',
+    h: 'isaha',
+    hh: '%d amasaha',
+    d: 'Umunsi',
+    dd: '%d iminsi',
+    M: 'ukwezi',
+    MM: '%d amezi',
+    y: 'umwaka',
+    yy: '%d imyaka'
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd, D MMMM YYYY HH:mm'
+  },
+  ordinal: function ordinal(n) {
+    return n;
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/sd.js b/node_modules/dayjs/esm/locale/sd.js
new file mode 100644
index 0000000..a429f8d
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/sd.js
@@ -0,0 +1,39 @@
+// Sindhi [sd]
+import dayjs from '../index';
+var locale = {
+  name: 'sd',
+  weekdays: 'آچر_سومر_اڱارو_اربع_خميس_جمع_ڇنڇر'.split('_'),
+  months: 'جنوري_فيبروري_مارچ_اپريل_مئي_جون_جولاءِ_آگسٽ_سيپٽمبر_آڪٽوبر_نومبر_ڊسمبر'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'آچر_سومر_اڱارو_اربع_خميس_جمع_ڇنڇر'.split('_'),
+  monthsShort: 'جنوري_فيبروري_مارچ_اپريل_مئي_جون_جولاءِ_آگسٽ_سيپٽمبر_آڪٽوبر_نومبر_ڊسمبر'.split('_'),
+  weekdaysMin: 'آچر_سومر_اڱارو_اربع_خميس_جمع_ڇنڇر'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd، D MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: '%s پوء',
+    past: '%s اڳ',
+    s: 'چند سيڪنڊ',
+    m: 'هڪ منٽ',
+    mm: '%d منٽ',
+    h: 'هڪ ڪلاڪ',
+    hh: '%d ڪلاڪ',
+    d: 'هڪ ڏينهن',
+    dd: '%d ڏينهن',
+    M: 'هڪ مهينو',
+    MM: '%d مهينا',
+    y: 'هڪ سال',
+    yy: '%d سال'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/se.js b/node_modules/dayjs/esm/locale/se.js
new file mode 100644
index 0000000..691099c
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/se.js
@@ -0,0 +1,39 @@
+// Northern Sami [se]
+import dayjs from '../index';
+var locale = {
+  name: 'se',
+  weekdays: 'sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat'.split('_'),
+  months: 'ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'sotn_vuos_maŋ_gask_duor_bear_láv'.split('_'),
+  monthsShort: 'ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov'.split('_'),
+  weekdaysMin: 's_v_m_g_d_b_L'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD.MM.YYYY',
+    LL: 'MMMM D. [b.] YYYY',
+    LLL: 'MMMM D. [b.] YYYY [ti.] HH:mm',
+    LLLL: 'dddd, MMMM D. [b.] YYYY [ti.] HH:mm'
+  },
+  relativeTime: {
+    future: '%s geažes',
+    past: 'maŋit %s',
+    s: 'moadde sekunddat',
+    m: 'okta minuhta',
+    mm: '%d minuhtat',
+    h: 'okta diimmu',
+    hh: '%d diimmut',
+    d: 'okta beaivi',
+    dd: '%d beaivvit',
+    M: 'okta mánnu',
+    MM: '%d mánut',
+    y: 'okta jahki',
+    yy: '%d jagit'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/si.js b/node_modules/dayjs/esm/locale/si.js
new file mode 100644
index 0000000..89b67bf
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/si.js
@@ -0,0 +1,38 @@
+// Sinhalese [si]
+import dayjs from '../index';
+var locale = {
+  name: 'si',
+  weekdays: 'ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා'.split('_'),
+  months: 'දුරුතු_නවම්_මැදින්_බක්_වෙසක්_පොසොන්_ඇසළ_නිකිණි_බිනර_වප්_ඉල්_උඳුවප්'.split('_'),
+  weekdaysShort: 'ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන'.split('_'),
+  monthsShort: 'දුරු_නව_මැදි_බක්_වෙස_පොසො_ඇස_නිකි_බින_වප්_ඉල්_උඳු'.split('_'),
+  weekdaysMin: 'ඉ_ස_අ_බ_බ්‍ර_සි_සෙ'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'a h:mm',
+    LTS: 'a h:mm:ss',
+    L: 'YYYY/MM/DD',
+    LL: 'YYYY MMMM D',
+    LLL: 'YYYY MMMM D, a h:mm',
+    LLLL: 'YYYY MMMM D [වැනි] dddd, a h:mm:ss'
+  },
+  relativeTime: {
+    future: '%sකින්',
+    past: '%sකට පෙර',
+    s: 'තත්පර කිහිපය',
+    m: 'විනාඩිය',
+    mm: 'විනාඩි %d',
+    h: 'පැය',
+    hh: 'පැය %d',
+    d: 'දිනය',
+    dd: 'දින %d',
+    M: 'මාසය',
+    MM: 'මාස %d',
+    y: 'වසර',
+    yy: 'වසර %d'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/sk.js b/node_modules/dayjs/esm/locale/sk.js
new file mode 100644
index 0000000..222401f
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/sk.js
@@ -0,0 +1,121 @@
+// Slovak [sk]
+import dayjs from '../index';
+
+function plural(n) {
+  return n > 1 && n < 5 && ~~(n / 10) !== 1; // eslint-disable-line
+}
+/* eslint-disable */
+
+
+function translate(number, withoutSuffix, key, isFuture) {
+  var result = number + " ";
+
+  switch (key) {
+    case 's':
+      // a few seconds / in a few seconds / a few seconds ago
+      return withoutSuffix || isFuture ? 'pár sekúnd' : 'pár sekundami';
+
+    case 'm':
+      // a minute / in a minute / a minute ago
+      return withoutSuffix ? 'minúta' : isFuture ? 'minútu' : 'minútou';
+
+    case 'mm':
+      // 9 minutes / in 9 minutes / 9 minutes ago
+      if (withoutSuffix || isFuture) {
+        return result + (plural(number) ? 'minúty' : 'minút');
+      }
+
+      return result + "min\xFAtami";
+
+    case 'h':
+      // an hour / in an hour / an hour ago
+      return withoutSuffix ? 'hodina' : isFuture ? 'hodinu' : 'hodinou';
+
+    case 'hh':
+      // 9 hours / in 9 hours / 9 hours ago
+      if (withoutSuffix || isFuture) {
+        return result + (plural(number) ? 'hodiny' : 'hodín');
+      }
+
+      return result + "hodinami";
+
+    case 'd':
+      // a day / in a day / a day ago
+      return withoutSuffix || isFuture ? 'deň' : 'dňom';
+
+    case 'dd':
+      // 9 days / in 9 days / 9 days ago
+      if (withoutSuffix || isFuture) {
+        return result + (plural(number) ? 'dni' : 'dní');
+      }
+
+      return result + "d\u0148ami";
+
+    case 'M':
+      // a month / in a month / a month ago
+      return withoutSuffix || isFuture ? 'mesiac' : 'mesiacom';
+
+    case 'MM':
+      // 9 months / in 9 months / 9 months ago
+      if (withoutSuffix || isFuture) {
+        return result + (plural(number) ? 'mesiace' : 'mesiacov');
+      }
+
+      return result + "mesiacmi";
+
+    case 'y':
+      // a year / in a year / a year ago
+      return withoutSuffix || isFuture ? 'rok' : 'rokom';
+
+    case 'yy':
+      // 9 years / in 9 years / 9 years ago
+      if (withoutSuffix || isFuture) {
+        return result + (plural(number) ? 'roky' : 'rokov');
+      }
+
+      return result + "rokmi";
+  }
+}
+/* eslint-enable */
+
+
+var locale = {
+  name: 'sk',
+  weekdays: 'nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota'.split('_'),
+  weekdaysShort: 'ne_po_ut_st_št_pi_so'.split('_'),
+  weekdaysMin: 'ne_po_ut_st_št_pi_so'.split('_'),
+  months: 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_'),
+  monthsShort: 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_'),
+  weekStart: 1,
+  yearStart: 4,
+  ordinal: function ordinal(n) {
+    return n + ".";
+  },
+  formats: {
+    LT: 'H:mm',
+    LTS: 'H:mm:ss',
+    L: 'DD.MM.YYYY',
+    LL: 'D. MMMM YYYY',
+    LLL: 'D. MMMM YYYY H:mm',
+    LLLL: 'dddd D. MMMM YYYY H:mm',
+    l: 'D. M. YYYY'
+  },
+  relativeTime: {
+    future: 'za %s',
+    // Should be `o %s` (change when moment/moment#5408 is fixed)
+    past: 'pred %s',
+    s: translate,
+    m: translate,
+    mm: translate,
+    h: translate,
+    hh: translate,
+    d: translate,
+    dd: translate,
+    M: translate,
+    MM: translate,
+    y: translate,
+    yy: translate
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/sl.js b/node_modules/dayjs/esm/locale/sl.js
new file mode 100644
index 0000000..e3c5839
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/sl.js
@@ -0,0 +1,141 @@
+// Slovenian [sl]
+import dayjs from '../index';
+
+function dual(n) {
+  return n % 100 == 2; // eslint-disable-line
+}
+
+function threeFour(n) {
+  return n % 100 == 3 || n % 100 == 4; // eslint-disable-line
+}
+/* eslint-disable */
+
+
+function translate(number, withoutSuffix, key, isFuture) {
+  var result = number + " ";
+
+  switch (key) {
+    case 's':
+      // a few seconds / in a few seconds / a few seconds ago
+      return withoutSuffix || isFuture ? 'nekaj sekund' : 'nekaj sekundami';
+
+    case 'm':
+      // a minute / in a minute / a minute ago
+      return withoutSuffix ? 'ena minuta' : 'eno minuto';
+
+    case 'mm':
+      // 9 minutes / in 9 minutes / 9 minutes ago
+      if (dual(number)) {
+        return result + (withoutSuffix || isFuture ? 'minuti' : 'minutama');
+      }
+
+      if (threeFour(number)) {
+        return result + (withoutSuffix || isFuture ? 'minute' : 'minutami');
+      }
+
+      return result + (withoutSuffix || isFuture ? 'minut' : 'minutami');
+
+    case 'h':
+      // an hour / in an hour / an hour ago
+      return withoutSuffix ? 'ena ura' : isFuture ? 'eno uro' : 'eno uro';
+
+    case 'hh':
+      // 9 hours / in 9 hours / 9 hours ago
+      if (dual(number)) {
+        return result + (withoutSuffix || isFuture ? 'uri' : 'urama');
+      }
+
+      if (threeFour(number)) {
+        return result + (withoutSuffix || isFuture ? 'ure' : 'urami');
+      }
+
+      return result + (withoutSuffix || isFuture ? 'ur' : 'urami');
+
+    case 'd':
+      // a day / in a day / a day ago
+      return withoutSuffix || isFuture ? 'en dan' : 'enim dnem';
+
+    case 'dd':
+      // 9 days / in 9 days / 9 days ago
+      if (dual(number)) {
+        return result + (withoutSuffix || isFuture ? 'dneva' : 'dnevoma');
+      }
+
+      return result + (withoutSuffix || isFuture ? 'dni' : 'dnevi');
+
+    case 'M':
+      // a month / in a month / a month ago
+      return withoutSuffix || isFuture ? 'en mesec' : 'enim mesecem';
+
+    case 'MM':
+      // 9 months / in 9 months / 9 months ago
+      if (dual(number)) {
+        // 2 minutes / in 2 minutes
+        return result + (withoutSuffix || isFuture ? 'meseca' : 'mesecema');
+      }
+
+      if (threeFour(number)) {
+        return result + (withoutSuffix || isFuture ? 'mesece' : 'meseci');
+      }
+
+      return result + (withoutSuffix || isFuture ? 'mesecev' : 'meseci');
+
+    case 'y':
+      // a year / in a year / a year ago
+      return withoutSuffix || isFuture ? 'eno leto' : 'enim letom';
+
+    case 'yy':
+      // 9 years / in 9 years / 9 years ago
+      if (dual(number)) {
+        // 2 minutes / in 2 minutes
+        return result + (withoutSuffix || isFuture ? 'leti' : 'letoma');
+      }
+
+      if (threeFour(number)) {
+        return result + (withoutSuffix || isFuture ? 'leta' : 'leti');
+      }
+
+      return result + (withoutSuffix || isFuture ? 'let' : 'leti');
+  }
+}
+/* eslint-enable */
+
+
+var locale = {
+  name: 'sl',
+  weekdays: 'nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota'.split('_'),
+  months: 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'ned._pon._tor._sre._čet._pet._sob.'.split('_'),
+  monthsShort: 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'),
+  weekdaysMin: 'ne_po_to_sr_če_pe_so'.split('_'),
+  ordinal: function ordinal(n) {
+    return n + ".";
+  },
+  formats: {
+    LT: 'H:mm',
+    LTS: 'H:mm:ss',
+    L: 'DD.MM.YYYY',
+    LL: 'D. MMMM YYYY',
+    LLL: 'D. MMMM YYYY H:mm',
+    LLLL: 'dddd, D. MMMM YYYY H:mm',
+    l: 'D. M. YYYY'
+  },
+  relativeTime: {
+    future: 'čez %s',
+    past: 'pred %s',
+    s: translate,
+    m: translate,
+    mm: translate,
+    h: translate,
+    hh: translate,
+    d: translate,
+    dd: translate,
+    M: translate,
+    MM: translate,
+    y: translate,
+    yy: translate
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/sq.js b/node_modules/dayjs/esm/locale/sq.js
new file mode 100644
index 0000000..625b701
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/sq.js
@@ -0,0 +1,39 @@
+// Albanian [sq]
+import dayjs from '../index';
+var locale = {
+  name: 'sq',
+  weekdays: 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'),
+  months: 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'),
+  monthsShort: 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'),
+  weekdaysMin: 'D_H_Ma_Më_E_P_Sh'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd, D MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: 'në %s',
+    past: '%s më parë',
+    s: 'disa sekonda',
+    m: 'një minutë',
+    mm: '%d minuta',
+    h: 'një orë',
+    hh: '%d orë',
+    d: 'një ditë',
+    dd: '%d ditë',
+    M: 'një muaj',
+    MM: '%d muaj',
+    y: 'një vit',
+    yy: '%d vite'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/sr-cyrl.js b/node_modules/dayjs/esm/locale/sr-cyrl.js
new file mode 100644
index 0000000..2e40d51
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/sr-cyrl.js
@@ -0,0 +1,74 @@
+// Serbian Cyrillic [sr-cyrl]
+import dayjs from '../index';
+var translator = {
+  words: {
+    m: ['један минут', 'једног минута'],
+    mm: ['%d минут', '%d минута', '%d минута'],
+    h: ['један сат', 'једног сата'],
+    hh: ['%d сат', '%d сата', '%d сати'],
+    d: ['један дан', 'једног дана'],
+    dd: ['%d дан', '%d дана', '%d дана'],
+    M: ['један месец', 'једног месеца'],
+    MM: ['%d месец', '%d месеца', '%d месеци'],
+    y: ['једну годину', 'једне године'],
+    yy: ['%d годину', '%d године', '%d година']
+  },
+  correctGrammarCase: function correctGrammarCase(number, wordKey) {
+    if (number % 10 >= 1 && number % 10 <= 4 && (number % 100 < 10 || number % 100 >= 20)) {
+      return number % 10 === 1 ? wordKey[0] : wordKey[1];
+    }
+
+    return wordKey[2];
+  },
+  relativeTimeFormatter: function relativeTimeFormatter(number, withoutSuffix, key, isFuture) {
+    var wordKey = translator.words[key];
+
+    if (key.length === 1) {
+      // Nominativ
+      if (key === 'y' && withoutSuffix) return 'једна година';
+      return isFuture || withoutSuffix ? wordKey[0] : wordKey[1];
+    }
+
+    var word = translator.correctGrammarCase(number, wordKey); // Nominativ
+
+    if (key === 'yy' && withoutSuffix && word === '%d годину') return number + " \u0433\u043E\u0434\u0438\u043D\u0430";
+    return word.replace('%d', number);
+  }
+};
+var locale = {
+  name: 'sr-cyrl',
+  weekdays: 'Недеља_Понедељак_Уторак_Среда_Четвртак_Петак_Субота'.split('_'),
+  weekdaysShort: 'Нед._Пон._Уто._Сре._Чет._Пет._Суб.'.split('_'),
+  weekdaysMin: 'не_по_ут_ср_че_пе_су'.split('_'),
+  months: 'Јануар_Фебруар_Март_Април_Мај_Јун_Јул_Август_Септембар_Октобар_Новембар_Децембар'.split('_'),
+  monthsShort: 'Јан._Феб._Мар._Апр._Мај_Јун_Јул_Авг._Сеп._Окт._Нов._Дец.'.split('_'),
+  weekStart: 1,
+  relativeTime: {
+    future: 'за %s',
+    past: 'пре %s',
+    s: 'неколико секунди',
+    m: translator.relativeTimeFormatter,
+    mm: translator.relativeTimeFormatter,
+    h: translator.relativeTimeFormatter,
+    hh: translator.relativeTimeFormatter,
+    d: translator.relativeTimeFormatter,
+    dd: translator.relativeTimeFormatter,
+    M: translator.relativeTimeFormatter,
+    MM: translator.relativeTimeFormatter,
+    y: translator.relativeTimeFormatter,
+    yy: translator.relativeTimeFormatter
+  },
+  ordinal: function ordinal(n) {
+    return n + ".";
+  },
+  formats: {
+    LT: 'H:mm',
+    LTS: 'H:mm:ss',
+    L: 'D. M. YYYY.',
+    LL: 'D. MMMM YYYY.',
+    LLL: 'D. MMMM YYYY. H:mm',
+    LLLL: 'dddd, D. MMMM YYYY. H:mm'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/sr.js b/node_modules/dayjs/esm/locale/sr.js
new file mode 100644
index 0000000..f5174ce
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/sr.js
@@ -0,0 +1,74 @@
+// Serbian [sr]
+import dayjs from '../index';
+var translator = {
+  words: {
+    m: ['jedan minut', 'jednog minuta'],
+    mm: ['%d minut', '%d minuta', '%d minuta'],
+    h: ['jedan sat', 'jednog sata'],
+    hh: ['%d sat', '%d sata', '%d sati'],
+    d: ['jedan dan', 'jednog dana'],
+    dd: ['%d dan', '%d dana', '%d dana'],
+    M: ['jedan mesec', 'jednog meseca'],
+    MM: ['%d mesec', '%d meseca', '%d meseci'],
+    y: ['jednu godinu', 'jedne godine'],
+    yy: ['%d godinu', '%d godine', '%d godina']
+  },
+  correctGrammarCase: function correctGrammarCase(number, wordKey) {
+    if (number % 10 >= 1 && number % 10 <= 4 && (number % 100 < 10 || number % 100 >= 20)) {
+      return number % 10 === 1 ? wordKey[0] : wordKey[1];
+    }
+
+    return wordKey[2];
+  },
+  relativeTimeFormatter: function relativeTimeFormatter(number, withoutSuffix, key, isFuture) {
+    var wordKey = translator.words[key];
+
+    if (key.length === 1) {
+      // Nominativ
+      if (key === 'y' && withoutSuffix) return 'jedna godina';
+      return isFuture || withoutSuffix ? wordKey[0] : wordKey[1];
+    }
+
+    var word = translator.correctGrammarCase(number, wordKey); // Nominativ
+
+    if (key === 'yy' && withoutSuffix && word === '%d godinu') return number + " godina";
+    return word.replace('%d', number);
+  }
+};
+var locale = {
+  name: 'sr',
+  weekdays: 'Nedelja_Ponedeljak_Utorak_Sreda_Četvrtak_Petak_Subota'.split('_'),
+  weekdaysShort: 'Ned._Pon._Uto._Sre._Čet._Pet._Sub.'.split('_'),
+  weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
+  months: 'Januar_Februar_Mart_April_Maj_Jun_Jul_Avgust_Septembar_Oktobar_Novembar_Decembar'.split('_'),
+  monthsShort: 'Jan._Feb._Mar._Apr._Maj_Jun_Jul_Avg._Sep._Okt._Nov._Dec.'.split('_'),
+  weekStart: 1,
+  relativeTime: {
+    future: 'za %s',
+    past: 'pre %s',
+    s: 'nekoliko sekundi',
+    m: translator.relativeTimeFormatter,
+    mm: translator.relativeTimeFormatter,
+    h: translator.relativeTimeFormatter,
+    hh: translator.relativeTimeFormatter,
+    d: translator.relativeTimeFormatter,
+    dd: translator.relativeTimeFormatter,
+    M: translator.relativeTimeFormatter,
+    MM: translator.relativeTimeFormatter,
+    y: translator.relativeTimeFormatter,
+    yy: translator.relativeTimeFormatter
+  },
+  ordinal: function ordinal(n) {
+    return n + ".";
+  },
+  formats: {
+    LT: 'H:mm',
+    LTS: 'H:mm:ss',
+    L: 'D. M. YYYY.',
+    LL: 'D. MMMM YYYY.',
+    LLL: 'D. MMMM YYYY. H:mm',
+    LLLL: 'dddd, D. MMMM YYYY. H:mm'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/ss.js b/node_modules/dayjs/esm/locale/ss.js
new file mode 100644
index 0000000..4354a48
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/ss.js
@@ -0,0 +1,39 @@
+// siSwati [ss]
+import dayjs from '../index';
+var locale = {
+  name: 'ss',
+  weekdays: 'Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo'.split('_'),
+  months: "Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split('_'),
+  weekStart: 1,
+  weekdaysShort: 'Lis_Umb_Lsb_Les_Lsi_Lsh_Umg'.split('_'),
+  monthsShort: 'Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo'.split('_'),
+  weekdaysMin: 'Li_Us_Lb_Lt_Ls_Lh_Ug'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'h:mm A',
+    LTS: 'h:mm:ss A',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY h:mm A',
+    LLLL: 'dddd, D MMMM YYYY h:mm A'
+  },
+  relativeTime: {
+    future: 'nga %s',
+    past: 'wenteka nga %s',
+    s: 'emizuzwana lomcane',
+    m: 'umzuzu',
+    mm: '%d emizuzu',
+    h: 'lihora',
+    hh: '%d emahora',
+    d: 'lilanga',
+    dd: '%d emalanga',
+    M: 'inyanga',
+    MM: '%d tinyanga',
+    y: 'umnyaka',
+    yy: '%d iminyaka'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/sv-fi.js b/node_modules/dayjs/esm/locale/sv-fi.js
new file mode 100644
index 0000000..a18977f
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/sv-fi.js
@@ -0,0 +1,46 @@
+// Finland Swedish [sv-fi]
+import dayjs from '../index';
+var locale = {
+  name: 'sv-fi',
+  weekdays: 'söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'),
+  weekdaysShort: 'sön_mån_tis_ons_tor_fre_lör'.split('_'),
+  weekdaysMin: 'sö_må_ti_on_to_fr_lö'.split('_'),
+  months: 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'),
+  monthsShort: 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),
+  weekStart: 1,
+  yearStart: 4,
+  ordinal: function ordinal(n) {
+    var b = n % 10;
+    var o = b === 1 || b === 2 ? 'a' : 'e';
+    return "[" + n + o + "]";
+  },
+  formats: {
+    LT: 'HH.mm',
+    LTS: 'HH.mm.ss',
+    L: 'DD.MM.YYYY',
+    LL: 'D. MMMM YYYY',
+    LLL: 'D. MMMM YYYY, [kl.] HH.mm',
+    LLLL: 'dddd, D. MMMM YYYY, [kl.] HH.mm',
+    l: 'D.M.YYYY',
+    ll: 'D. MMM YYYY',
+    lll: 'D. MMM YYYY, [kl.] HH.mm',
+    llll: 'ddd, D. MMM YYYY, [kl.] HH.mm'
+  },
+  relativeTime: {
+    future: 'om %s',
+    past: 'för %s sedan',
+    s: 'några sekunder',
+    m: 'en minut',
+    mm: '%d minuter',
+    h: 'en timme',
+    hh: '%d timmar',
+    d: 'en dag',
+    dd: '%d dagar',
+    M: 'en månad',
+    MM: '%d månader',
+    y: 'ett år',
+    yy: '%d år'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/sv.js b/node_modules/dayjs/esm/locale/sv.js
new file mode 100644
index 0000000..2563ee7
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/sv.js
@@ -0,0 +1,44 @@
+// Swedish [sv]
+import dayjs from '../index';
+var locale = {
+  name: 'sv',
+  weekdays: 'söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'),
+  weekdaysShort: 'sön_mån_tis_ons_tor_fre_lör'.split('_'),
+  weekdaysMin: 'sö_må_ti_on_to_fr_lö'.split('_'),
+  months: 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'),
+  monthsShort: 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),
+  weekStart: 1,
+  yearStart: 4,
+  ordinal: function ordinal(n) {
+    var b = n % 10;
+    var o = b === 1 || b === 2 ? 'a' : 'e';
+    return "[" + n + o + "]";
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'YYYY-MM-DD',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY [kl.] HH:mm',
+    LLLL: 'dddd D MMMM YYYY [kl.] HH:mm',
+    lll: 'D MMM YYYY HH:mm',
+    llll: 'ddd D MMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: 'om %s',
+    past: 'för %s sedan',
+    s: 'några sekunder',
+    m: 'en minut',
+    mm: '%d minuter',
+    h: 'en timme',
+    hh: '%d timmar',
+    d: 'en dag',
+    dd: '%d dagar',
+    M: 'en månad',
+    MM: '%d månader',
+    y: 'ett år',
+    yy: '%d år'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/sw.js b/node_modules/dayjs/esm/locale/sw.js
new file mode 100644
index 0000000..287bf33
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/sw.js
@@ -0,0 +1,39 @@
+// Swahili [sw]
+import dayjs from '../index';
+var locale = {
+  name: 'sw',
+  weekdays: 'Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi'.split('_'),
+  weekdaysShort: 'Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos'.split('_'),
+  weekdaysMin: 'J2_J3_J4_J5_Al_Ij_J1'.split('_'),
+  months: 'Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba'.split('_'),
+  monthsShort: 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des'.split('_'),
+  weekStart: 1,
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  relativeTime: {
+    future: '%s baadaye',
+    past: 'tokea %s',
+    s: 'hivi punde',
+    m: 'dakika moja',
+    mm: 'dakika %d',
+    h: 'saa limoja',
+    hh: 'masaa %d',
+    d: 'siku moja',
+    dd: 'masiku %d',
+    M: 'mwezi mmoja',
+    MM: 'miezi %d',
+    y: 'mwaka mmoja',
+    yy: 'miaka %d'
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD.MM.YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd, D MMMM YYYY HH:mm'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/ta.js b/node_modules/dayjs/esm/locale/ta.js
new file mode 100644
index 0000000..6df25f8
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/ta.js
@@ -0,0 +1,38 @@
+// Tamil [ta]
+import dayjs from '../index';
+var locale = {
+  name: 'ta',
+  weekdays: 'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split('_'),
+  months: 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'),
+  weekdaysShort: 'ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி'.split('_'),
+  monthsShort: 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'),
+  weekdaysMin: 'ஞா_தி_செ_பு_வி_வெ_ச'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY, HH:mm',
+    LLLL: 'dddd, D MMMM YYYY, HH:mm'
+  },
+  relativeTime: {
+    future: '%s இல்',
+    past: '%s முன்',
+    s: 'ஒரு சில விநாடிகள்',
+    m: 'ஒரு நிமிடம்',
+    mm: '%d நிமிடங்கள்',
+    h: 'ஒரு மணி நேரம்',
+    hh: '%d மணி நேரம்',
+    d: 'ஒரு நாள்',
+    dd: '%d நாட்கள்',
+    M: 'ஒரு மாதம்',
+    MM: '%d மாதங்கள்',
+    y: 'ஒரு வருடம்',
+    yy: '%d ஆண்டுகள்'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/te.js b/node_modules/dayjs/esm/locale/te.js
new file mode 100644
index 0000000..392a247
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/te.js
@@ -0,0 +1,38 @@
+// Telugu [te]
+import dayjs from '../index';
+var locale = {
+  name: 'te',
+  weekdays: 'ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం'.split('_'),
+  months: 'జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జులై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్'.split('_'),
+  weekdaysShort: 'ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని'.split('_'),
+  monthsShort: 'జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జులై_ఆగ._సెప్._అక్టో._నవ._డిసె.'.split('_'),
+  weekdaysMin: 'ఆ_సో_మం_బు_గు_శు_శ'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'A h:mm',
+    LTS: 'A h:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY, A h:mm',
+    LLLL: 'dddd, D MMMM YYYY, A h:mm'
+  },
+  relativeTime: {
+    future: '%s లో',
+    past: '%s క్రితం',
+    s: 'కొన్ని క్షణాలు',
+    m: 'ఒక నిమిషం',
+    mm: '%d నిమిషాలు',
+    h: 'ఒక గంట',
+    hh: '%d గంటలు',
+    d: 'ఒక రోజు',
+    dd: '%d రోజులు',
+    M: 'ఒక నెల',
+    MM: '%d నెలలు',
+    y: 'ఒక సంవత్సరం',
+    yy: '%d సంవత్సరాలు'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/tet.js b/node_modules/dayjs/esm/locale/tet.js
new file mode 100644
index 0000000..ff83eea
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/tet.js
@@ -0,0 +1,39 @@
+// Tetun Dili (East Timor) [tet]
+import dayjs from '../index';
+var locale = {
+  name: 'tet',
+  weekdays: 'Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu'.split('_'),
+  months: 'Janeiru_Fevereiru_Marsu_Abril_Maiu_Juñu_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'Dom_Seg_Ters_Kua_Kint_Sest_Sab'.split('_'),
+  monthsShort: 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'),
+  weekdaysMin: 'Do_Seg_Te_Ku_Ki_Ses_Sa'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd, D MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: 'iha %s',
+    past: '%s liuba',
+    s: 'minutu balun',
+    m: 'minutu ida',
+    mm: 'minutu %d',
+    h: 'oras ida',
+    hh: 'oras %d',
+    d: 'loron ida',
+    dd: 'loron %d',
+    M: 'fulan ida',
+    MM: 'fulan %d',
+    y: 'tinan ida',
+    yy: 'tinan %d'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/tg.js b/node_modules/dayjs/esm/locale/tg.js
new file mode 100644
index 0000000..536df0b
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/tg.js
@@ -0,0 +1,39 @@
+// Tajik [tg]
+import dayjs from '../index';
+var locale = {
+  name: 'tg',
+  weekdays: 'якшанбе_душанбе_сешанбе_чоршанбе_панҷшанбе_ҷумъа_шанбе'.split('_'),
+  months: 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'яшб_дшб_сшб_чшб_пшб_ҷум_шнб'.split('_'),
+  monthsShort: 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'),
+  weekdaysMin: 'яш_дш_сш_чш_пш_ҷм_шб'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd, D MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: 'баъди %s',
+    past: '%s пеш',
+    s: 'якчанд сония',
+    m: 'як дақиқа',
+    mm: '%d дақиқа',
+    h: 'як соат',
+    hh: '%d соат',
+    d: 'як рӯз',
+    dd: '%d рӯз',
+    M: 'як моҳ',
+    MM: '%d моҳ',
+    y: 'як сол',
+    yy: '%d сол'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/th.js b/node_modules/dayjs/esm/locale/th.js
new file mode 100644
index 0000000..5cbcdf2
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/th.js
@@ -0,0 +1,38 @@
+// Thai [th]
+import dayjs from '../index';
+var locale = {
+  name: 'th',
+  weekdays: 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์'.split('_'),
+  weekdaysShort: 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์'.split('_'),
+  weekdaysMin: 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'),
+  months: 'มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม'.split('_'),
+  monthsShort: 'ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.'.split('_'),
+  formats: {
+    LT: 'H:mm',
+    LTS: 'H:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY เวลา H:mm',
+    LLLL: 'วันddddที่ D MMMM YYYY เวลา H:mm'
+  },
+  relativeTime: {
+    future: 'อีก %s',
+    past: '%sที่แล้ว',
+    s: 'ไม่กี่วินาที',
+    m: '1 นาที',
+    mm: '%d นาที',
+    h: '1 ชั่วโมง',
+    hh: '%d ชั่วโมง',
+    d: '1 วัน',
+    dd: '%d วัน',
+    M: '1 เดือน',
+    MM: '%d เดือน',
+    y: '1 ปี',
+    yy: '%d ปี'
+  },
+  ordinal: function ordinal(n) {
+    return n + ".";
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/tk.js b/node_modules/dayjs/esm/locale/tk.js
new file mode 100644
index 0000000..93390f1
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/tk.js
@@ -0,0 +1,39 @@
+// Turkmen [tk]
+import dayjs from '../index';
+var locale = {
+  name: 'tk',
+  weekdays: 'Ýekşenbe_Duşenbe_Sişenbe_Çarşenbe_Penşenbe_Anna_Şenbe'.split('_'),
+  weekdaysShort: 'Ýek_Duş_Siş_Çar_Pen_Ann_Şen'.split('_'),
+  weekdaysMin: 'Ýk_Dş_Sş_Çr_Pn_An_Şn'.split('_'),
+  months: 'Ýanwar_Fewral_Mart_Aprel_Maý_Iýun_Iýul_Awgust_Sentýabr_Oktýabr_Noýabr_Dekabr'.split('_'),
+  monthsShort: 'Ýan_Few_Mar_Apr_Maý_Iýn_Iýl_Awg_Sen_Okt_Noý_Dek'.split('_'),
+  weekStart: 1,
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD.MM.YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd, D MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: '%s soň',
+    past: '%s öň',
+    s: 'birnäçe sekunt',
+    m: 'bir minut',
+    mm: '%d minut',
+    h: 'bir sagat',
+    hh: '%d sagat',
+    d: 'bir gün',
+    dd: '%d gün',
+    M: 'bir aý',
+    MM: '%d aý',
+    y: 'bir ýyl',
+    yy: '%d ýyl'
+  },
+  ordinal: function ordinal(n) {
+    return n + ".";
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/tl-ph.js b/node_modules/dayjs/esm/locale/tl-ph.js
new file mode 100644
index 0000000..0fa84f3
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/tl-ph.js
@@ -0,0 +1,39 @@
+// Tagalog (Philippines) [tl-ph]
+import dayjs from '../index';
+var locale = {
+  name: 'tl-ph',
+  weekdays: 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'),
+  months: 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'),
+  monthsShort: 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'),
+  weekdaysMin: 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'MM/D/YYYY',
+    LL: 'MMMM D, YYYY',
+    LLL: 'MMMM D, YYYY HH:mm',
+    LLLL: 'dddd, MMMM DD, YYYY HH:mm'
+  },
+  relativeTime: {
+    future: 'sa loob ng %s',
+    past: '%s ang nakalipas',
+    s: 'ilang segundo',
+    m: 'isang minuto',
+    mm: '%d minuto',
+    h: 'isang oras',
+    hh: '%d oras',
+    d: 'isang araw',
+    dd: '%d araw',
+    M: 'isang buwan',
+    MM: '%d buwan',
+    y: 'isang taon',
+    yy: '%d taon'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/tlh.js b/node_modules/dayjs/esm/locale/tlh.js
new file mode 100644
index 0000000..30f52fe
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/tlh.js
@@ -0,0 +1,24 @@
+// Klingon [tlh]
+import dayjs from '../index';
+var locale = {
+  name: 'tlh',
+  weekdays: 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),
+  months: 'tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),
+  monthsShort: 'jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’'.split('_'),
+  weekdaysMin: 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD.MM.YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd, D MMMM YYYY HH:mm'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/tr.js b/node_modules/dayjs/esm/locale/tr.js
new file mode 100644
index 0000000..e7fe24f
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/tr.js
@@ -0,0 +1,39 @@
+// Turkish [tr]
+import dayjs from '../index';
+var locale = {
+  name: 'tr',
+  weekdays: 'Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi'.split('_'),
+  weekdaysShort: 'Paz_Pts_Sal_Çar_Per_Cum_Cts'.split('_'),
+  weekdaysMin: 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'),
+  months: 'Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık'.split('_'),
+  monthsShort: 'Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara'.split('_'),
+  weekStart: 1,
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD.MM.YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd, D MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: '%s sonra',
+    past: '%s önce',
+    s: 'birkaç saniye',
+    m: 'bir dakika',
+    mm: '%d dakika',
+    h: 'bir saat',
+    hh: '%d saat',
+    d: 'bir gün',
+    dd: '%d gün',
+    M: 'bir ay',
+    MM: '%d ay',
+    y: 'bir yıl',
+    yy: '%d yıl'
+  },
+  ordinal: function ordinal(n) {
+    return n + ".";
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/types.d.ts b/node_modules/dayjs/esm/locale/types.d.ts
new file mode 100644
index 0000000..2c24a64
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/types.d.ts
@@ -0,0 +1,33 @@
+declare interface ILocale {
+  name: string
+  weekdays?: string[]
+  months?: string[]
+  weekStart?: number
+  weekdaysShort?: string[]
+  monthsShort?: string[]
+  weekdaysMin?: string[]
+  ordinal?: (n: number) => number | string
+  formats: Partial<{
+    LT: string
+    LTS: string
+    L: string
+    LL: string
+    LLL: string
+    LLLL: string
+  }>
+  relativeTime: Partial<{
+    future: string
+    past: string
+    s: string
+    m: string
+    mm: string
+    h: string
+    hh: string
+    d: string
+    dd: string
+    M: string
+    MM: string
+    y: string
+    yy: string
+  }>
+}
diff --git a/node_modules/dayjs/esm/locale/tzl.js b/node_modules/dayjs/esm/locale/tzl.js
new file mode 100644
index 0000000..9fa0cd2
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/tzl.js
@@ -0,0 +1,24 @@
+// Talossan [tzl]
+import dayjs from '../index';
+var locale = {
+  name: 'tzl',
+  weekdays: 'Súladi_Lúneçi_Maitzi_Márcuri_Xhúadi_Viénerçi_Sáturi'.split('_'),
+  months: 'Januar_Fevraglh_Març_Avrïu_Mai_Gün_Julia_Guscht_Setemvar_Listopäts_Noemvar_Zecemvar'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'Súl_Lún_Mai_Már_Xhú_Vié_Sát'.split('_'),
+  monthsShort: 'Jan_Fev_Mar_Avr_Mai_Gün_Jul_Gus_Set_Lis_Noe_Zec'.split('_'),
+  weekdaysMin: 'Sú_Lú_Ma_Má_Xh_Vi_Sá'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH.mm',
+    LTS: 'HH.mm.ss',
+    L: 'DD.MM.YYYY',
+    LL: 'D. MMMM [dallas] YYYY',
+    LLL: 'D. MMMM [dallas] YYYY HH.mm',
+    LLLL: 'dddd, [li] D. MMMM [dallas] YYYY HH.mm'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/tzm-latn.js b/node_modules/dayjs/esm/locale/tzm-latn.js
new file mode 100644
index 0000000..e5ac6af
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/tzm-latn.js
@@ -0,0 +1,39 @@
+// Central Atlas Tamazight Latin [tzm-latn]
+import dayjs from '../index';
+var locale = {
+  name: 'tzm-latn',
+  weekdays: 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
+  months: 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'),
+  weekStart: 6,
+  weekdaysShort: 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
+  monthsShort: 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'),
+  weekdaysMin: 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd D MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: 'dadkh s yan %s',
+    past: 'yan %s',
+    s: 'imik',
+    m: 'minuḍ',
+    mm: '%d minuḍ',
+    h: 'saɛa',
+    hh: '%d tassaɛin',
+    d: 'ass',
+    dd: '%d ossan',
+    M: 'ayowr',
+    MM: '%d iyyirn',
+    y: 'asgas',
+    yy: '%d isgasn'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/tzm.js b/node_modules/dayjs/esm/locale/tzm.js
new file mode 100644
index 0000000..d94a6c0
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/tzm.js
@@ -0,0 +1,39 @@
+// Central Atlas Tamazight [tzm]
+import dayjs from '../index';
+var locale = {
+  name: 'tzm',
+  weekdays: 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
+  months: 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'),
+  weekStart: 6,
+  weekdaysShort: 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
+  monthsShort: 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'),
+  weekdaysMin: 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd D MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: 'ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s',
+    past: 'ⵢⴰⵏ %s',
+    s: 'ⵉⵎⵉⴽ',
+    m: 'ⵎⵉⵏⵓⴺ',
+    mm: '%d ⵎⵉⵏⵓⴺ',
+    h: 'ⵙⴰⵄⴰ',
+    hh: '%d ⵜⴰⵙⵙⴰⵄⵉⵏ',
+    d: 'ⴰⵙⵙ',
+    dd: '%d oⵙⵙⴰⵏ',
+    M: 'ⴰⵢoⵓⵔ',
+    MM: '%d ⵉⵢⵢⵉⵔⵏ',
+    y: 'ⴰⵙⴳⴰⵙ',
+    yy: '%d ⵉⵙⴳⴰⵙⵏ'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/ug-cn.js b/node_modules/dayjs/esm/locale/ug-cn.js
new file mode 100644
index 0000000..d3d6392
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/ug-cn.js
@@ -0,0 +1,39 @@
+// Uyghur (China) [ug-cn]
+import dayjs from '../index';
+var locale = {
+  name: 'ug-cn',
+  weekdays: 'يەكشەنبە_دۈشەنبە_سەيشەنبە_چارشەنبە_پەيشەنبە_جۈمە_شەنبە'.split('_'),
+  months: 'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'),
+  monthsShort: 'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split('_'),
+  weekdaysMin: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'YYYY-MM-DD',
+    LL: 'YYYY-يىلىM-ئاينىڭD-كۈنى',
+    LLL: 'YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm',
+    LLLL: 'dddd، YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm'
+  },
+  relativeTime: {
+    future: '%s كېيىن',
+    past: '%s بۇرۇن',
+    s: 'نەچچە سېكونت',
+    m: 'بىر مىنۇت',
+    mm: '%d مىنۇت',
+    h: 'بىر سائەت',
+    hh: '%d سائەت',
+    d: 'بىر كۈن',
+    dd: '%d كۈن',
+    M: 'بىر ئاي',
+    MM: '%d ئاي',
+    y: 'بىر يىل',
+    yy: '%d يىل'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/uk.js b/node_modules/dayjs/esm/locale/uk.js
new file mode 100644
index 0000000..3c70b13
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/uk.js
@@ -0,0 +1,77 @@
+// Ukrainian [uk]
+import dayjs from '../index';
+var monthFormat = 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split('_');
+var monthStandalone = 'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split('_');
+var MONTHS_IN_FORMAT = /D[oD]?(\[[^[\]]*\]|\s)+MMMM?/;
+
+function plural(word, num) {
+  var forms = word.split('_');
+  return num % 10 === 1 && num % 100 !== 11 ? forms[0] : num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]; // eslint-disable-line
+}
+
+function relativeTimeWithPlural(number, withoutSuffix, key) {
+  var format = {
+    ss: withoutSuffix ? 'секунда_секунди_секунд' : 'секунду_секунди_секунд',
+    mm: withoutSuffix ? 'хвилина_хвилини_хвилин' : 'хвилину_хвилини_хвилин',
+    hh: withoutSuffix ? 'година_години_годин' : 'годину_години_годин',
+    dd: 'день_дні_днів',
+    MM: 'місяць_місяці_місяців',
+    yy: 'рік_роки_років'
+  };
+
+  if (key === 'm') {
+    return withoutSuffix ? 'хвилина' : 'хвилину';
+  } else if (key === 'h') {
+    return withoutSuffix ? 'година' : 'годину';
+  }
+
+  return number + " " + plural(format[key], +number);
+}
+
+var months = function months(dayjsInstance, format) {
+  if (MONTHS_IN_FORMAT.test(format)) {
+    return monthFormat[dayjsInstance.month()];
+  }
+
+  return monthStandalone[dayjsInstance.month()];
+};
+
+months.s = monthStandalone;
+months.f = monthFormat;
+var locale = {
+  name: 'uk',
+  weekdays: 'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split('_'),
+  weekdaysShort: 'ндл_пнд_втр_срд_чтв_птн_сбт'.split('_'),
+  weekdaysMin: 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
+  months: months,
+  monthsShort: 'січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд'.split('_'),
+  weekStart: 1,
+  relativeTime: {
+    future: 'за %s',
+    past: '%s тому',
+    s: 'декілька секунд',
+    m: relativeTimeWithPlural,
+    mm: relativeTimeWithPlural,
+    h: relativeTimeWithPlural,
+    hh: relativeTimeWithPlural,
+    d: 'день',
+    dd: relativeTimeWithPlural,
+    M: 'місяць',
+    MM: relativeTimeWithPlural,
+    y: 'рік',
+    yy: relativeTimeWithPlural
+  },
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD.MM.YYYY',
+    LL: 'D MMMM YYYY р.',
+    LLL: 'D MMMM YYYY р., HH:mm',
+    LLLL: 'dddd, D MMMM YYYY р., HH:mm'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/ur.js b/node_modules/dayjs/esm/locale/ur.js
new file mode 100644
index 0000000..7464c1e
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/ur.js
@@ -0,0 +1,39 @@
+// Urdu [ur]
+import dayjs from '../index';
+var locale = {
+  name: 'ur',
+  weekdays: 'اتوار_پیر_منگل_بدھ_جمعرات_جمعہ_ہفتہ'.split('_'),
+  months: 'جنوری_فروری_مارچ_اپریل_مئی_جون_جولائی_اگست_ستمبر_اکتوبر_نومبر_دسمبر'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'اتوار_پیر_منگل_بدھ_جمعرات_جمعہ_ہفتہ'.split('_'),
+  monthsShort: 'جنوری_فروری_مارچ_اپریل_مئی_جون_جولائی_اگست_ستمبر_اکتوبر_نومبر_دسمبر'.split('_'),
+  weekdaysMin: 'اتوار_پیر_منگل_بدھ_جمعرات_جمعہ_ہفتہ'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd، D MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: '%s بعد',
+    past: '%s قبل',
+    s: 'چند سیکنڈ',
+    m: 'ایک منٹ',
+    mm: '%d منٹ',
+    h: 'ایک گھنٹہ',
+    hh: '%d گھنٹے',
+    d: 'ایک دن',
+    dd: '%d دن',
+    M: 'ایک ماہ',
+    MM: '%d ماہ',
+    y: 'ایک سال',
+    yy: '%d سال'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/uz-latn.js b/node_modules/dayjs/esm/locale/uz-latn.js
new file mode 100644
index 0000000..befdfee
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/uz-latn.js
@@ -0,0 +1,39 @@
+// Uzbek Latin [uz-latn]
+import dayjs from '../index';
+var locale = {
+  name: 'uz-latn',
+  weekdays: 'Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba'.split('_'),
+  months: 'Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'Yak_Dush_Sesh_Chor_Pay_Jum_Shan'.split('_'),
+  monthsShort: 'Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek'.split('_'),
+  weekdaysMin: 'Ya_Du_Se_Cho_Pa_Ju_Sha'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'D MMMM YYYY, dddd HH:mm'
+  },
+  relativeTime: {
+    future: 'Yaqin %s ichida',
+    past: '%s oldin',
+    s: 'soniya',
+    m: 'bir daqiqa',
+    mm: '%d daqiqa',
+    h: 'bir soat',
+    hh: '%d soat',
+    d: 'bir kun',
+    dd: '%d kun',
+    M: 'bir oy',
+    MM: '%d oy',
+    y: 'bir yil',
+    yy: '%d yil'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/uz.js b/node_modules/dayjs/esm/locale/uz.js
new file mode 100644
index 0000000..4433263
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/uz.js
@@ -0,0 +1,39 @@
+// Uzbek [uz]
+import dayjs from '../index';
+var locale = {
+  name: 'uz',
+  weekdays: 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'),
+  months: 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'),
+  monthsShort: 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'),
+  weekdaysMin: 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'D MMMM YYYY, dddd HH:mm'
+  },
+  relativeTime: {
+    future: 'Якин %s ичида',
+    past: '%s олдин',
+    s: 'фурсат',
+    m: 'бир дакика',
+    mm: '%d дакика',
+    h: 'бир соат',
+    hh: '%d соат',
+    d: 'бир кун',
+    dd: '%d кун',
+    M: 'бир ой',
+    MM: '%d ой',
+    y: 'бир йил',
+    yy: '%d йил'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/vi.js b/node_modules/dayjs/esm/locale/vi.js
new file mode 100644
index 0000000..f55cc73
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/vi.js
@@ -0,0 +1,43 @@
+// Vietnamese [vi]
+import dayjs from '../index';
+var locale = {
+  name: 'vi',
+  weekdays: 'chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy'.split('_'),
+  months: 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'CN_T2_T3_T4_T5_T6_T7'.split('_'),
+  monthsShort: 'Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12'.split('_'),
+  weekdaysMin: 'CN_T2_T3_T4_T5_T6_T7'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM [năm] YYYY',
+    LLL: 'D MMMM [năm] YYYY HH:mm',
+    LLLL: 'dddd, D MMMM [năm] YYYY HH:mm',
+    l: 'DD/M/YYYY',
+    ll: 'D MMM YYYY',
+    lll: 'D MMM YYYY HH:mm',
+    llll: 'ddd, D MMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: '%s tới',
+    past: '%s trước',
+    s: 'vài giây',
+    m: 'một phút',
+    mm: '%d phút',
+    h: 'một giờ',
+    hh: '%d giờ',
+    d: 'một ngày',
+    dd: '%d ngày',
+    M: 'một tháng',
+    MM: '%d tháng',
+    y: 'một năm',
+    yy: '%d năm'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/x-pseudo.js b/node_modules/dayjs/esm/locale/x-pseudo.js
new file mode 100644
index 0000000..ceb6782
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/x-pseudo.js
@@ -0,0 +1,39 @@
+// Pseudo [x-pseudo]
+import dayjs from '../index';
+var locale = {
+  name: 'x-pseudo',
+  weekdays: 'S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý'.split('_'),
+  months: 'J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát'.split('_'),
+  monthsShort: 'J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc'.split('_'),
+  weekdaysMin: 'S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd, D MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: 'í~ñ %s',
+    past: '%s á~gó',
+    s: 'á ~féw ~sécó~ñds',
+    m: 'á ~míñ~úté',
+    mm: '%d m~íñú~tés',
+    h: 'á~ñ hó~úr',
+    hh: '%d h~óúrs',
+    d: 'á ~dáý',
+    dd: '%d d~áýs',
+    M: 'á ~móñ~th',
+    MM: '%d m~óñt~hs',
+    y: 'á ~ýéár',
+    yy: '%d ý~éárs'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/yo.js b/node_modules/dayjs/esm/locale/yo.js
new file mode 100644
index 0000000..1f79468
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/yo.js
@@ -0,0 +1,39 @@
+// Yoruba Nigeria [yo]
+import dayjs from '../index';
+var locale = {
+  name: 'yo',
+  weekdays: 'Àìkú_Ajé_Ìsẹ́gun_Ọjọ́rú_Ọjọ́bọ_Ẹtì_Àbámẹ́ta'.split('_'),
+  months: 'Sẹ́rẹ́_Èrèlè_Ẹrẹ̀nà_Ìgbé_Èbibi_Òkùdu_Agẹmo_Ògún_Owewe_Ọ̀wàrà_Bélú_Ọ̀pẹ̀̀'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'Àìk_Ajé_Ìsẹ́_Ọjr_Ọjb_Ẹtì_Àbá'.split('_'),
+  monthsShort: 'Sẹ́r_Èrl_Ẹrn_Ìgb_Èbi_Òkù_Agẹ_Ògú_Owe_Ọ̀wà_Bél_Ọ̀pẹ̀̀'.split('_'),
+  weekdaysMin: 'Àì_Aj_Ìs_Ọr_Ọb_Ẹt_Àb'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'h:mm A',
+    LTS: 'h:mm:ss A',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY h:mm A',
+    LLLL: 'dddd, D MMMM YYYY h:mm A'
+  },
+  relativeTime: {
+    future: 'ní %s',
+    past: '%s kọjá',
+    s: 'ìsẹjú aayá die',
+    m: 'ìsẹjú kan',
+    mm: 'ìsẹjú %d',
+    h: 'wákati kan',
+    hh: 'wákati %d',
+    d: 'ọjọ́ kan',
+    dd: 'ọjọ́ %d',
+    M: 'osù kan',
+    MM: 'osù %d',
+    y: 'ọdún kan',
+    yy: 'ọdún %d'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/zh-cn.js b/node_modules/dayjs/esm/locale/zh-cn.js
new file mode 100644
index 0000000..1a7ebf4
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/zh-cn.js
@@ -0,0 +1,67 @@
+// Chinese (China) [zh-cn]
+import dayjs from '../index';
+var locale = {
+  name: 'zh-cn',
+  weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
+  weekdaysShort: '周日_周一_周二_周三_周四_周五_周六'.split('_'),
+  weekdaysMin: '日_一_二_三_四_五_六'.split('_'),
+  months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
+  monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
+  ordinal: function ordinal(number, period) {
+    switch (period) {
+      case 'W':
+        return number + "\u5468";
+
+      default:
+        return number + "\u65E5";
+    }
+  },
+  weekStart: 1,
+  yearStart: 4,
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'YYYY/MM/DD',
+    LL: 'YYYY年M月D日',
+    LLL: 'YYYY年M月D日Ah点mm分',
+    LLLL: 'YYYY年M月D日ddddAh点mm分',
+    l: 'YYYY/M/D',
+    ll: 'YYYY年M月D日',
+    lll: 'YYYY年M月D日 HH:mm',
+    llll: 'YYYY年M月D日dddd HH:mm'
+  },
+  relativeTime: {
+    future: '%s内',
+    past: '%s前',
+    s: '几秒',
+    m: '1 分钟',
+    mm: '%d 分钟',
+    h: '1 小时',
+    hh: '%d 小时',
+    d: '1 天',
+    dd: '%d 天',
+    M: '1 个月',
+    MM: '%d 个月',
+    y: '1 年',
+    yy: '%d 年'
+  },
+  meridiem: function meridiem(hour, minute) {
+    var hm = hour * 100 + minute;
+
+    if (hm < 600) {
+      return '凌晨';
+    } else if (hm < 900) {
+      return '早上';
+    } else if (hm < 1100) {
+      return '上午';
+    } else if (hm < 1300) {
+      return '中午';
+    } else if (hm < 1800) {
+      return '下午';
+    }
+
+    return '晚上';
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/zh-hk.js b/node_modules/dayjs/esm/locale/zh-hk.js
new file mode 100644
index 0000000..3896747
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/zh-hk.js
@@ -0,0 +1,44 @@
+// Chinese (Hong Kong) [zh-hk]
+import dayjs from '../index';
+var locale = {
+  name: 'zh-hk',
+  months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
+  monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
+  weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
+  weekdaysShort: '週日_週一_週二_週三_週四_週五_週六'.split('_'),
+  weekdaysMin: '日_一_二_三_四_五_六'.split('_'),
+  ordinal: function ordinal(number, period) {
+    switch (period) {
+      case 'W':
+        return number + "\u9031";
+
+      default:
+        return number + "\u65E5";
+    }
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'YYYY/MM/DD',
+    LL: 'YYYY年M月D日',
+    LLL: 'YYYY年M月D日 HH:mm',
+    LLLL: 'YYYY年M月D日dddd HH:mm'
+  },
+  relativeTime: {
+    future: '%s內',
+    past: '%s前',
+    s: '幾秒',
+    m: '一分鐘',
+    mm: '%d 分鐘',
+    h: '一小時',
+    hh: '%d 小時',
+    d: '一天',
+    dd: '%d 天',
+    M: '一個月',
+    MM: '%d 個月',
+    y: '一年',
+    yy: '%d 年'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/zh-tw.js b/node_modules/dayjs/esm/locale/zh-tw.js
new file mode 100644
index 0000000..ada89ee
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/zh-tw.js
@@ -0,0 +1,65 @@
+// Chinese (Taiwan) [zh-tw]
+import dayjs from '../index';
+var locale = {
+  name: 'zh-tw',
+  weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
+  weekdaysShort: '週日_週一_週二_週三_週四_週五_週六'.split('_'),
+  weekdaysMin: '日_一_二_三_四_五_六'.split('_'),
+  months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
+  monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
+  ordinal: function ordinal(number, period) {
+    switch (period) {
+      case 'W':
+        return number + "\u9031";
+
+      default:
+        return number + "\u65E5";
+    }
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'YYYY/MM/DD',
+    LL: 'YYYY年M月D日',
+    LLL: 'YYYY年M月D日 HH:mm',
+    LLLL: 'YYYY年M月D日dddd HH:mm',
+    l: 'YYYY/M/D',
+    ll: 'YYYY年M月D日',
+    lll: 'YYYY年M月D日 HH:mm',
+    llll: 'YYYY年M月D日dddd HH:mm'
+  },
+  relativeTime: {
+    future: '%s內',
+    past: '%s前',
+    s: '幾秒',
+    m: '1 分鐘',
+    mm: '%d 分鐘',
+    h: '1 小時',
+    hh: '%d 小時',
+    d: '1 天',
+    dd: '%d 天',
+    M: '1 個月',
+    MM: '%d 個月',
+    y: '1 年',
+    yy: '%d 年'
+  },
+  meridiem: function meridiem(hour, minute) {
+    var hm = hour * 100 + minute;
+
+    if (hm < 600) {
+      return '凌晨';
+    } else if (hm < 900) {
+      return '早上';
+    } else if (hm < 1100) {
+      return '上午';
+    } else if (hm < 1300) {
+      return '中午';
+    } else if (hm < 1800) {
+      return '下午';
+    }
+
+    return '晚上';
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/locale/zh.js b/node_modules/dayjs/esm/locale/zh.js
new file mode 100644
index 0000000..b98ab70
--- /dev/null
+++ b/node_modules/dayjs/esm/locale/zh.js
@@ -0,0 +1,67 @@
+// Chinese [zh]
+import dayjs from '../index';
+var locale = {
+  name: 'zh',
+  weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
+  weekdaysShort: '周日_周一_周二_周三_周四_周五_周六'.split('_'),
+  weekdaysMin: '日_一_二_三_四_五_六'.split('_'),
+  months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
+  monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
+  ordinal: function ordinal(number, period) {
+    switch (period) {
+      case 'W':
+        return number + "\u5468";
+
+      default:
+        return number + "\u65E5";
+    }
+  },
+  weekStart: 1,
+  yearStart: 4,
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'YYYY/MM/DD',
+    LL: 'YYYY年M月D日',
+    LLL: 'YYYY年M月D日Ah点mm分',
+    LLLL: 'YYYY年M月D日ddddAh点mm分',
+    l: 'YYYY/M/D',
+    ll: 'YYYY年M月D日',
+    lll: 'YYYY年M月D日 HH:mm',
+    llll: 'YYYY年M月D日dddd HH:mm'
+  },
+  relativeTime: {
+    future: '%s后',
+    past: '%s前',
+    s: '几秒',
+    m: '1 分钟',
+    mm: '%d 分钟',
+    h: '1 小时',
+    hh: '%d 小时',
+    d: '1 天',
+    dd: '%d 天',
+    M: '1 个月',
+    MM: '%d 个月',
+    y: '1 年',
+    yy: '%d 年'
+  },
+  meridiem: function meridiem(hour, minute) {
+    var hm = hour * 100 + minute;
+
+    if (hm < 600) {
+      return '凌晨';
+    } else if (hm < 900) {
+      return '早上';
+    } else if (hm < 1100) {
+      return '上午';
+    } else if (hm < 1300) {
+      return '中午';
+    } else if (hm < 1800) {
+      return '下午';
+    }
+
+    return '晚上';
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/advancedFormat/index.d.ts b/node_modules/dayjs/esm/plugin/advancedFormat/index.d.ts
new file mode 100644
index 0000000..a17c896
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/advancedFormat/index.d.ts
@@ -0,0 +1,4 @@
+import { PluginFunc } from 'dayjs/esm'
+
+declare const plugin: PluginFunc
+export = plugin
diff --git a/node_modules/dayjs/esm/plugin/advancedFormat/index.js b/node_modules/dayjs/esm/plugin/advancedFormat/index.js
new file mode 100644
index 0000000..f45e4e0
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/advancedFormat/index.js
@@ -0,0 +1,66 @@
+import { FORMAT_DEFAULT } from '../../constant';
+export default (function (o, c) {
+  // locale needed later
+  var proto = c.prototype;
+  var oldFormat = proto.format;
+
+  proto.format = function (formatStr) {
+    var _this = this;
+
+    var locale = this.$locale();
+
+    if (!this.isValid()) {
+      return oldFormat.bind(this)(formatStr);
+    }
+
+    var utils = this.$utils();
+    var str = formatStr || FORMAT_DEFAULT;
+    var result = str.replace(/\[([^\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g, function (match) {
+      switch (match) {
+        case 'Q':
+          return Math.ceil((_this.$M + 1) / 3);
+
+        case 'Do':
+          return locale.ordinal(_this.$D);
+
+        case 'gggg':
+          return _this.weekYear();
+
+        case 'GGGG':
+          return _this.isoWeekYear();
+
+        case 'wo':
+          return locale.ordinal(_this.week(), 'W');
+        // W for week
+
+        case 'w':
+        case 'ww':
+          return utils.s(_this.week(), match === 'w' ? 1 : 2, '0');
+
+        case 'W':
+        case 'WW':
+          return utils.s(_this.isoWeek(), match === 'W' ? 1 : 2, '0');
+
+        case 'k':
+        case 'kk':
+          return utils.s(String(_this.$H === 0 ? 24 : _this.$H), match === 'k' ? 1 : 2, '0');
+
+        case 'X':
+          return Math.floor(_this.$d.getTime() / 1000);
+
+        case 'x':
+          return _this.$d.getTime();
+
+        case 'z':
+          return "[" + _this.offsetName() + "]";
+
+        case 'zzz':
+          return "[" + _this.offsetName('long') + "]";
+
+        default:
+          return match;
+      }
+    });
+    return oldFormat.bind(this)(result);
+  };
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/arraySupport/index.d.ts b/node_modules/dayjs/esm/plugin/arraySupport/index.d.ts
new file mode 100644
index 0000000..30f8d9c
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/arraySupport/index.d.ts
@@ -0,0 +1,10 @@
+import { PluginFunc } from 'dayjs/esm'
+
+declare module 'dayjs/esm' {
+  interface ConfigTypeMap {
+    arraySupport: [number?, number?, number?, number?, number?, number?, number?]
+  }
+}
+
+declare const plugin: PluginFunc
+export = plugin
diff --git a/node_modules/dayjs/esm/plugin/arraySupport/index.js b/node_modules/dayjs/esm/plugin/arraySupport/index.js
new file mode 100644
index 0000000..c7edc79
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/arraySupport/index.js
@@ -0,0 +1,33 @@
+export default (function (o, c, dayjs) {
+  var proto = c.prototype;
+
+  var parseDate = function parseDate(cfg) {
+    var date = cfg.date,
+        utc = cfg.utc;
+
+    if (Array.isArray(date)) {
+      if (utc) {
+        if (!date.length) {
+          return new Date();
+        }
+
+        return new Date(Date.UTC.apply(null, date));
+      }
+
+      if (date.length === 1) {
+        return dayjs(String(date[0])).toDate();
+      }
+
+      return new (Function.prototype.bind.apply(Date, [null].concat(date)))();
+    }
+
+    return date;
+  };
+
+  var oldParse = proto.parse;
+
+  proto.parse = function (cfg) {
+    cfg.date = parseDate.bind(this)(cfg);
+    oldParse.bind(this)(cfg);
+  };
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/badMutable/index.d.ts b/node_modules/dayjs/esm/plugin/badMutable/index.d.ts
new file mode 100644
index 0000000..a17c896
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/badMutable/index.d.ts
@@ -0,0 +1,4 @@
+import { PluginFunc } from 'dayjs/esm'
+
+declare const plugin: PluginFunc
+export = plugin
diff --git a/node_modules/dayjs/esm/plugin/badMutable/index.js b/node_modules/dayjs/esm/plugin/badMutable/index.js
new file mode 100644
index 0000000..679edee
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/badMutable/index.js
@@ -0,0 +1,61 @@
+export default (function (o, c) {
+  // locale needed later
+  var proto = c.prototype;
+
+  proto.$g = function (input, get, set) {
+    if (this.$utils().u(input)) return this[get];
+    return this.$set(set, input);
+  };
+
+  proto.set = function (string, _int) {
+    return this.$set(string, _int);
+  };
+
+  var oldStartOf = proto.startOf;
+
+  proto.startOf = function (units, startOf) {
+    this.$d = oldStartOf.bind(this)(units, startOf).toDate();
+    this.init();
+    return this;
+  };
+
+  var oldAdd = proto.add;
+
+  proto.add = function (number, units) {
+    this.$d = oldAdd.bind(this)(number, units).toDate();
+    this.init();
+    return this;
+  };
+
+  var oldLocale = proto.locale;
+
+  proto.locale = function (preset, object) {
+    if (!preset) return this.$L;
+    this.$L = oldLocale.bind(this)(preset, object).$L;
+    return this;
+  };
+
+  var oldDaysInMonth = proto.daysInMonth;
+
+  proto.daysInMonth = function () {
+    return oldDaysInMonth.bind(this.clone())();
+  };
+
+  var oldIsSame = proto.isSame;
+
+  proto.isSame = function (that, units) {
+    return oldIsSame.bind(this.clone())(that, units);
+  };
+
+  var oldIsBefore = proto.isBefore;
+
+  proto.isBefore = function (that, units) {
+    return oldIsBefore.bind(this.clone())(that, units);
+  };
+
+  var oldIsAfter = proto.isAfter;
+
+  proto.isAfter = function (that, units) {
+    return oldIsAfter.bind(this.clone())(that, units);
+  };
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/bigIntSupport/index.d.ts b/node_modules/dayjs/esm/plugin/bigIntSupport/index.d.ts
new file mode 100644
index 0000000..0829ead
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/bigIntSupport/index.d.ts
@@ -0,0 +1,11 @@
+import { PluginFunc } from 'dayjs/esm'
+
+declare module 'dayjs/esm' {
+  interface ConfigTypeMap {
+    bigIntSupport: BigInt
+  }
+  export function unix(t: BigInt): Dayjs
+}
+
+declare const plugin: PluginFunc
+export = plugin
diff --git a/node_modules/dayjs/esm/plugin/bigIntSupport/index.js b/node_modules/dayjs/esm/plugin/bigIntSupport/index.js
new file mode 100644
index 0000000..fa93982
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/bigIntSupport/index.js
@@ -0,0 +1,32 @@
+// eslint-disable-next-line valid-typeof
+var isBigInt = function isBigInt(num) {
+  return typeof num === 'bigint';
+};
+
+export default (function (o, c, dayjs) {
+  var proto = c.prototype;
+
+  var parseDate = function parseDate(cfg) {
+    var date = cfg.date;
+
+    if (isBigInt(date)) {
+      return Number(date);
+    }
+
+    return date;
+  };
+
+  var oldParse = proto.parse;
+
+  proto.parse = function (cfg) {
+    cfg.date = parseDate.bind(this)(cfg);
+    oldParse.bind(this)(cfg);
+  };
+
+  var oldUnix = dayjs.unix;
+
+  dayjs.unix = function (timestamp) {
+    var ts = isBigInt(timestamp) ? Number(timestamp) : timestamp;
+    return oldUnix(ts);
+  };
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/buddhistEra/index.d.ts b/node_modules/dayjs/esm/plugin/buddhistEra/index.d.ts
new file mode 100644
index 0000000..a17c896
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/buddhistEra/index.d.ts
@@ -0,0 +1,4 @@
+import { PluginFunc } from 'dayjs/esm'
+
+declare const plugin: PluginFunc
+export = plugin
diff --git a/node_modules/dayjs/esm/plugin/buddhistEra/index.js b/node_modules/dayjs/esm/plugin/buddhistEra/index.js
new file mode 100644
index 0000000..76ce44c
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/buddhistEra/index.js
@@ -0,0 +1,21 @@
+import { FORMAT_DEFAULT } from '../../constant';
+export default (function (o, c) {
+  // locale needed later
+  var proto = c.prototype;
+  var oldFormat = proto.format; // extend en locale here
+
+  proto.format = function (formatStr) {
+    var _this = this;
+
+    var yearBias = 543;
+    var str = formatStr || FORMAT_DEFAULT;
+    var result = str.replace(/(\[[^\]]+])|BBBB|BB/g, function (match, a) {
+      var _this$$utils;
+
+      var year = String(_this.$y + yearBias);
+      var args = match === 'BB' ? [year.slice(-2), 2] : [year, 4];
+      return a || (_this$$utils = _this.$utils()).s.apply(_this$$utils, args.concat(['0']));
+    });
+    return oldFormat.bind(this)(result);
+  };
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/calendar/index.d.ts b/node_modules/dayjs/esm/plugin/calendar/index.d.ts
new file mode 100644
index 0000000..42bff4b
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/calendar/index.d.ts
@@ -0,0 +1,10 @@
+import { PluginFunc, ConfigType } from 'dayjs/esm'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs/esm' {
+  interface Dayjs {
+    calendar(referenceTime?: ConfigType, formats?: object): string
+  }
+}
diff --git a/node_modules/dayjs/esm/plugin/calendar/index.js b/node_modules/dayjs/esm/plugin/calendar/index.js
new file mode 100644
index 0000000..9abf1e9
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/calendar/index.js
@@ -0,0 +1,32 @@
+export default (function (o, c, d) {
+  var LT = 'h:mm A';
+  var L = 'MM/DD/YYYY';
+  var calendarFormat = {
+    lastDay: "[Yesterday at] " + LT,
+    sameDay: "[Today at] " + LT,
+    nextDay: "[Tomorrow at] " + LT,
+    nextWeek: "dddd [at] " + LT,
+    lastWeek: "[Last] dddd [at] " + LT,
+    sameElse: L
+  };
+  var proto = c.prototype;
+
+  proto.calendar = function (referenceTime, formats) {
+    var format = formats || this.$locale().calendar || calendarFormat;
+    var referenceStartOfDay = d(referenceTime || undefined).startOf('d');
+    var diff = this.diff(referenceStartOfDay, 'd', true);
+    var sameElse = 'sameElse';
+    /* eslint-disable no-nested-ternary */
+
+    var retVal = diff < -6 ? sameElse : diff < -1 ? 'lastWeek' : diff < 0 ? 'lastDay' : diff < 1 ? 'sameDay' : diff < 2 ? 'nextDay' : diff < 7 ? 'nextWeek' : sameElse;
+    /* eslint-enable no-nested-ternary */
+
+    var currentFormat = format[retVal] || calendarFormat[retVal];
+
+    if (typeof currentFormat === 'function') {
+      return currentFormat.call(this, d());
+    }
+
+    return this.format(currentFormat);
+  };
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/customParseFormat/index.d.ts b/node_modules/dayjs/esm/plugin/customParseFormat/index.d.ts
new file mode 100644
index 0000000..7da585e
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/customParseFormat/index.d.ts
@@ -0,0 +1,8 @@
+import { PluginFunc } from 'dayjs/esm'
+
+declare interface PluginOptions {
+    parseTwoDigitYear?: (yearString: string) => number
+}
+
+declare const plugin: PluginFunc<PluginOptions>
+export = plugin
diff --git a/node_modules/dayjs/esm/plugin/customParseFormat/index.js b/node_modules/dayjs/esm/plugin/customParseFormat/index.js
new file mode 100644
index 0000000..1fd5936
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/customParseFormat/index.js
@@ -0,0 +1,320 @@
+import { u } from '../localizedFormat/utils';
+var formattingTokens = /(\[[^[]*\])|([-_:/.,()\s]+)|(A|a|YYYY|YY?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g;
+var match1 = /\d/; // 0 - 9
+
+var match2 = /\d\d/; // 00 - 99
+
+var match3 = /\d{3}/; // 000 - 999
+
+var match4 = /\d{4}/; // 0000 - 9999
+
+var match1to2 = /\d\d?/; // 0 - 99
+
+var matchSigned = /[+-]?\d+/; // -inf - inf
+
+var matchOffset = /[+-]\d\d:?(\d\d)?|Z/; // +00:00 -00:00 +0000 or -0000 +00 or Z
+
+var matchWord = /\d*[^-_:/,()\s\d]+/; // Word
+
+var locale = {};
+
+var parseTwoDigitYear = function parseTwoDigitYear(input) {
+  input = +input;
+  return input + (input > 68 ? 1900 : 2000);
+};
+
+function offsetFromString(string) {
+  if (!string) return 0;
+  if (string === 'Z') return 0;
+  var parts = string.match(/([+-]|\d\d)/g);
+  var minutes = +(parts[1] * 60) + (+parts[2] || 0);
+  return minutes === 0 ? 0 : parts[0] === '+' ? -minutes : minutes; // eslint-disable-line no-nested-ternary
+}
+
+var addInput = function addInput(property) {
+  return function (input) {
+    this[property] = +input;
+  };
+};
+
+var zoneExpressions = [matchOffset, function (input) {
+  var zone = this.zone || (this.zone = {});
+  zone.offset = offsetFromString(input);
+}];
+
+var getLocalePart = function getLocalePart(name) {
+  var part = locale[name];
+  return part && (part.indexOf ? part : part.s.concat(part.f));
+};
+
+var meridiemMatch = function meridiemMatch(input, isLowerCase) {
+  var isAfternoon;
+  var _locale = locale,
+      meridiem = _locale.meridiem;
+
+  if (!meridiem) {
+    isAfternoon = input === (isLowerCase ? 'pm' : 'PM');
+  } else {
+    for (var i = 1; i <= 24; i += 1) {
+      // todo: fix input === meridiem(i, 0, isLowerCase)
+      if (input.indexOf(meridiem(i, 0, isLowerCase)) > -1) {
+        isAfternoon = i > 12;
+        break;
+      }
+    }
+  }
+
+  return isAfternoon;
+};
+
+var expressions = {
+  A: [matchWord, function (input) {
+    this.afternoon = meridiemMatch(input, false);
+  }],
+  a: [matchWord, function (input) {
+    this.afternoon = meridiemMatch(input, true);
+  }],
+  S: [match1, function (input) {
+    this.milliseconds = +input * 100;
+  }],
+  SS: [match2, function (input) {
+    this.milliseconds = +input * 10;
+  }],
+  SSS: [match3, function (input) {
+    this.milliseconds = +input;
+  }],
+  s: [match1to2, addInput('seconds')],
+  ss: [match1to2, addInput('seconds')],
+  m: [match1to2, addInput('minutes')],
+  mm: [match1to2, addInput('minutes')],
+  H: [match1to2, addInput('hours')],
+  h: [match1to2, addInput('hours')],
+  HH: [match1to2, addInput('hours')],
+  hh: [match1to2, addInput('hours')],
+  D: [match1to2, addInput('day')],
+  DD: [match2, addInput('day')],
+  Do: [matchWord, function (input) {
+    var _locale2 = locale,
+        ordinal = _locale2.ordinal;
+
+    var _input$match = input.match(/\d+/);
+
+    this.day = _input$match[0];
+    if (!ordinal) return;
+
+    for (var i = 1; i <= 31; i += 1) {
+      if (ordinal(i).replace(/\[|\]/g, '') === input) {
+        this.day = i;
+      }
+    }
+  }],
+  M: [match1to2, addInput('month')],
+  MM: [match2, addInput('month')],
+  MMM: [matchWord, function (input) {
+    var months = getLocalePart('months');
+    var monthsShort = getLocalePart('monthsShort');
+    var matchIndex = (monthsShort || months.map(function (_) {
+      return _.slice(0, 3);
+    })).indexOf(input) + 1;
+
+    if (matchIndex < 1) {
+      throw new Error();
+    }
+
+    this.month = matchIndex % 12 || matchIndex;
+  }],
+  MMMM: [matchWord, function (input) {
+    var months = getLocalePart('months');
+    var matchIndex = months.indexOf(input) + 1;
+
+    if (matchIndex < 1) {
+      throw new Error();
+    }
+
+    this.month = matchIndex % 12 || matchIndex;
+  }],
+  Y: [matchSigned, addInput('year')],
+  YY: [match2, function (input) {
+    this.year = parseTwoDigitYear(input);
+  }],
+  YYYY: [match4, addInput('year')],
+  Z: zoneExpressions,
+  ZZ: zoneExpressions
+};
+
+function correctHours(time) {
+  var afternoon = time.afternoon;
+
+  if (afternoon !== undefined) {
+    var hours = time.hours;
+
+    if (afternoon) {
+      if (hours < 12) {
+        time.hours += 12;
+      }
+    } else if (hours === 12) {
+      time.hours = 0;
+    }
+
+    delete time.afternoon;
+  }
+}
+
+function makeParser(format) {
+  format = u(format, locale && locale.formats);
+  var array = format.match(formattingTokens);
+  var length = array.length;
+
+  for (var i = 0; i < length; i += 1) {
+    var token = array[i];
+    var parseTo = expressions[token];
+    var regex = parseTo && parseTo[0];
+    var parser = parseTo && parseTo[1];
+
+    if (parser) {
+      array[i] = {
+        regex: regex,
+        parser: parser
+      };
+    } else {
+      array[i] = token.replace(/^\[|\]$/g, '');
+    }
+  }
+
+  return function (input) {
+    var time = {};
+
+    for (var _i = 0, start = 0; _i < length; _i += 1) {
+      var _token = array[_i];
+
+      if (typeof _token === 'string') {
+        start += _token.length;
+      } else {
+        var _regex = _token.regex,
+            _parser = _token.parser;
+        var part = input.slice(start);
+
+        var match = _regex.exec(part);
+
+        var value = match[0];
+
+        _parser.call(time, value);
+
+        input = input.replace(value, '');
+      }
+    }
+
+    correctHours(time);
+    return time;
+  };
+}
+
+var parseFormattedInput = function parseFormattedInput(input, format, utc) {
+  try {
+    if (['x', 'X'].indexOf(format) > -1) return new Date((format === 'X' ? 1000 : 1) * input);
+    var parser = makeParser(format);
+
+    var _parser2 = parser(input),
+        year = _parser2.year,
+        month = _parser2.month,
+        day = _parser2.day,
+        hours = _parser2.hours,
+        minutes = _parser2.minutes,
+        seconds = _parser2.seconds,
+        milliseconds = _parser2.milliseconds,
+        zone = _parser2.zone;
+
+    var now = new Date();
+    var d = day || (!year && !month ? now.getDate() : 1);
+    var y = year || now.getFullYear();
+    var M = 0;
+
+    if (!(year && !month)) {
+      M = month > 0 ? month - 1 : now.getMonth();
+    }
+
+    var h = hours || 0;
+    var m = minutes || 0;
+    var s = seconds || 0;
+    var ms = milliseconds || 0;
+
+    if (zone) {
+      return new Date(Date.UTC(y, M, d, h, m, s, ms + zone.offset * 60 * 1000));
+    }
+
+    if (utc) {
+      return new Date(Date.UTC(y, M, d, h, m, s, ms));
+    }
+
+    return new Date(y, M, d, h, m, s, ms);
+  } catch (e) {
+    return new Date(''); // Invalid Date
+  }
+};
+
+export default (function (o, C, d) {
+  d.p.customParseFormat = true;
+
+  if (o && o.parseTwoDigitYear) {
+    parseTwoDigitYear = o.parseTwoDigitYear;
+  }
+
+  var proto = C.prototype;
+  var oldParse = proto.parse;
+
+  proto.parse = function (cfg) {
+    var date = cfg.date,
+        utc = cfg.utc,
+        args = cfg.args;
+    this.$u = utc;
+    var format = args[1];
+
+    if (typeof format === 'string') {
+      var isStrictWithoutLocale = args[2] === true;
+      var isStrictWithLocale = args[3] === true;
+      var isStrict = isStrictWithoutLocale || isStrictWithLocale;
+      var pl = args[2];
+
+      if (isStrictWithLocale) {
+        pl = args[2];
+      }
+
+      locale = this.$locale();
+
+      if (!isStrictWithoutLocale && pl) {
+        locale = d.Ls[pl];
+      }
+
+      this.$d = parseFormattedInput(date, format, utc);
+      this.init();
+      if (pl && pl !== true) this.$L = this.locale(pl).$L; // use != to treat
+      // input number 1410715640579 and format string '1410715640579' equal
+      // eslint-disable-next-line eqeqeq
+
+      if (isStrict && date != this.format(format)) {
+        this.$d = new Date('');
+      } // reset global locale to make parallel unit test
+
+
+      locale = {};
+    } else if (format instanceof Array) {
+      var len = format.length;
+
+      for (var i = 1; i <= len; i += 1) {
+        args[1] = format[i - 1];
+        var result = d.apply(this, args);
+
+        if (result.isValid()) {
+          this.$d = result.$d;
+          this.$L = result.$L;
+          this.init();
+          break;
+        }
+
+        if (i === len) this.$d = new Date('');
+      }
+    } else {
+      oldParse.call(this, cfg);
+    }
+  };
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/dayOfYear/index.d.ts b/node_modules/dayjs/esm/plugin/dayOfYear/index.d.ts
new file mode 100644
index 0000000..4b9601e
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/dayOfYear/index.d.ts
@@ -0,0 +1,11 @@
+import { PluginFunc } from 'dayjs/esm'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs/esm' {
+  interface Dayjs {
+    dayOfYear(): number
+    dayOfYear(value: number): Dayjs
+  }
+}
diff --git a/node_modules/dayjs/esm/plugin/dayOfYear/index.js b/node_modules/dayjs/esm/plugin/dayOfYear/index.js
new file mode 100644
index 0000000..0cb1158
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/dayOfYear/index.js
@@ -0,0 +1,9 @@
+export default (function (o, c, d) {
+  var proto = c.prototype;
+
+  proto.dayOfYear = function (input) {
+    // d(this) is for badMutable
+    var dayOfYear = Math.round((d(this).startOf('day') - d(this).startOf('year')) / 864e5) + 1;
+    return input == null ? dayOfYear : this.add(input - dayOfYear, 'day');
+  };
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/devHelper/index.d.ts b/node_modules/dayjs/esm/plugin/devHelper/index.d.ts
new file mode 100644
index 0000000..a17c896
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/devHelper/index.d.ts
@@ -0,0 +1,4 @@
+import { PluginFunc } from 'dayjs/esm'
+
+declare const plugin: PluginFunc
+export = plugin
diff --git a/node_modules/dayjs/esm/plugin/devHelper/index.js b/node_modules/dayjs/esm/plugin/devHelper/index.js
new file mode 100644
index 0000000..9e2af82
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/devHelper/index.js
@@ -0,0 +1,38 @@
+/* eslint-disable no-console */
+export default (function (o, c, d) {
+  /* istanbul ignore next line */
+  if (!process || process.env.NODE_ENV !== 'production') {
+    var proto = c.prototype;
+    var oldParse = proto.parse;
+
+    proto.parse = function (cfg) {
+      var date = cfg.date;
+
+      if (typeof date === 'string' && date.length === 13) {
+        console.warn("To parse a Unix timestamp like " + date + ", you should pass it as a Number. https://day.js.org/docs/en/parse/unix-timestamp-milliseconds");
+      }
+
+      if (typeof date === 'number' && String(date).length === 4) {
+        console.warn("Guessing you may want to parse the Year " + date + ", you should pass it as a String " + date + ", not a Number. Otherwise, " + date + " will be treated as a Unix timestamp");
+      }
+
+      if (cfg.args.length >= 2 && !d.p.customParseFormat) {
+        console.warn("To parse a date-time string like " + date + " using the given format, you should enable customParseFormat plugin first. https://day.js.org/docs/en/parse/string-format");
+      }
+
+      return oldParse.bind(this)(cfg);
+    };
+
+    var oldLocale = d.locale;
+
+    d.locale = function (preset, object, isLocal) {
+      if (typeof object === 'undefined' && typeof preset === 'string') {
+        if (!d.Ls[preset]) {
+          console.warn("Guessing you may want to use locale " + preset + ", you have to load it before using it. https://day.js.org/docs/en/i18n/loading-into-nodejs");
+        }
+      }
+
+      return oldLocale(preset, object, isLocal);
+    };
+  }
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/duration/index.d.ts b/node_modules/dayjs/esm/plugin/duration/index.d.ts
new file mode 100644
index 0000000..dc974a5
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/duration/index.d.ts
@@ -0,0 +1,88 @@
+import { PluginFunc } from 'dayjs/esm'
+import { OpUnitType, UnitTypeLongPlural } from 'dayjs/esm';
+
+declare const plugin: PluginFunc
+export as namespace plugin;
+export = plugin
+
+declare namespace plugin {
+  /**
+   * @deprecated Please use more strict types
+   */
+  type DurationInputType = string | number | object
+  /**
+   * @deprecated Please use more strict types
+   */
+  type DurationAddType = number | object | Duration
+  
+  type DurationUnitsObjectType = Partial<{
+    [unit in Exclude<UnitTypeLongPlural, "dates"> | "weeks"]: number
+  }>;
+  type DurationUnitType = Exclude<OpUnitType, "date" | "dates">
+  type CreateDurationType = 
+    ((units: DurationUnitsObjectType) => Duration)
+    & ((time: number, unit?: DurationUnitType) => Duration)
+    & ((ISO_8601: string) => Duration)
+  type AddDurationType = CreateDurationType & ((duration: Duration) => Duration)
+
+  interface Duration {
+    new (input: string | number | object, unit?: string, locale?: string): Duration
+
+    clone(): Duration
+
+    humanize(withSuffix?: boolean): string
+
+    milliseconds(): number
+    asMilliseconds(): number
+
+    seconds(): number
+    asSeconds(): number
+
+    minutes(): number
+    asMinutes(): number
+
+    hours(): number
+    asHours(): number
+
+    days(): number
+    asDays(): number
+
+    weeks(): number
+    asWeeks(): number
+
+    months(): number
+    asMonths(): number
+
+    years(): number
+    asYears(): number
+
+    as(unit: DurationUnitType): number
+
+    get(unit: DurationUnitType): number
+
+    add: AddDurationType
+    
+    subtract: AddDurationType
+
+    toJSON(): string
+
+    toISOString(): string
+
+    format(formatStr?: string): string
+
+    locale(locale: string): Duration
+  }
+}
+
+declare module 'dayjs/esm' {
+  interface Dayjs {
+    add(duration: plugin.Duration): Dayjs
+    subtract(duration: plugin.Duration): Dayjs
+  }
+
+  /**
+   * @param time If unit is not present, time treated as number of milliseconds
+   */
+  export const duration: plugin.CreateDurationType;
+  export function isDuration(d: any): d is plugin.Duration
+}
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/duration/index.js b/node_modules/dayjs/esm/plugin/duration/index.js
new file mode 100644
index 0000000..a241d4b
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/duration/index.js
@@ -0,0 +1,356 @@
+import { MILLISECONDS_A_DAY, MILLISECONDS_A_HOUR, MILLISECONDS_A_MINUTE, MILLISECONDS_A_SECOND, MILLISECONDS_A_WEEK, REGEX_FORMAT } from '../../constant';
+var MILLISECONDS_A_YEAR = MILLISECONDS_A_DAY * 365;
+var MILLISECONDS_A_MONTH = MILLISECONDS_A_YEAR / 12;
+var durationRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;
+var unitToMS = {
+  years: MILLISECONDS_A_YEAR,
+  months: MILLISECONDS_A_MONTH,
+  days: MILLISECONDS_A_DAY,
+  hours: MILLISECONDS_A_HOUR,
+  minutes: MILLISECONDS_A_MINUTE,
+  seconds: MILLISECONDS_A_SECOND,
+  milliseconds: 1,
+  weeks: MILLISECONDS_A_WEEK
+};
+
+var isDuration = function isDuration(d) {
+  return d instanceof Duration;
+}; // eslint-disable-line no-use-before-define
+
+
+var $d;
+var $u;
+
+var wrapper = function wrapper(input, instance, unit) {
+  return new Duration(input, unit, instance.$l);
+}; // eslint-disable-line no-use-before-define
+
+
+var prettyUnit = function prettyUnit(unit) {
+  return $u.p(unit) + "s";
+};
+
+var isNegative = function isNegative(number) {
+  return number < 0;
+};
+
+var roundNumber = function roundNumber(number) {
+  return isNegative(number) ? Math.ceil(number) : Math.floor(number);
+};
+
+var absolute = function absolute(number) {
+  return Math.abs(number);
+};
+
+var getNumberUnitFormat = function getNumberUnitFormat(number, unit) {
+  if (!number) {
+    return {
+      negative: false,
+      format: ''
+    };
+  }
+
+  if (isNegative(number)) {
+    return {
+      negative: true,
+      format: "" + absolute(number) + unit
+    };
+  }
+
+  return {
+    negative: false,
+    format: "" + number + unit
+  };
+};
+
+var Duration = /*#__PURE__*/function () {
+  function Duration(input, unit, locale) {
+    var _this = this;
+
+    this.$d = {};
+    this.$l = locale;
+
+    if (input === undefined) {
+      this.$ms = 0;
+      this.parseFromMilliseconds();
+    }
+
+    if (unit) {
+      return wrapper(input * unitToMS[prettyUnit(unit)], this);
+    }
+
+    if (typeof input === 'number') {
+      this.$ms = input;
+      this.parseFromMilliseconds();
+      return this;
+    }
+
+    if (typeof input === 'object') {
+      Object.keys(input).forEach(function (k) {
+        _this.$d[prettyUnit(k)] = input[k];
+      });
+      this.calMilliseconds();
+      return this;
+    }
+
+    if (typeof input === 'string') {
+      var d = input.match(durationRegex);
+
+      if (d) {
+        var properties = d.slice(2);
+        var numberD = properties.map(function (value) {
+          return value != null ? Number(value) : 0;
+        });
+        this.$d.years = numberD[0];
+        this.$d.months = numberD[1];
+        this.$d.weeks = numberD[2];
+        this.$d.days = numberD[3];
+        this.$d.hours = numberD[4];
+        this.$d.minutes = numberD[5];
+        this.$d.seconds = numberD[6];
+        this.calMilliseconds();
+        return this;
+      }
+    }
+
+    return this;
+  }
+
+  var _proto = Duration.prototype;
+
+  _proto.calMilliseconds = function calMilliseconds() {
+    var _this2 = this;
+
+    this.$ms = Object.keys(this.$d).reduce(function (total, unit) {
+      return total + (_this2.$d[unit] || 0) * unitToMS[unit];
+    }, 0);
+  };
+
+  _proto.parseFromMilliseconds = function parseFromMilliseconds() {
+    var $ms = this.$ms;
+    this.$d.years = roundNumber($ms / MILLISECONDS_A_YEAR);
+    $ms %= MILLISECONDS_A_YEAR;
+    this.$d.months = roundNumber($ms / MILLISECONDS_A_MONTH);
+    $ms %= MILLISECONDS_A_MONTH;
+    this.$d.days = roundNumber($ms / MILLISECONDS_A_DAY);
+    $ms %= MILLISECONDS_A_DAY;
+    this.$d.hours = roundNumber($ms / MILLISECONDS_A_HOUR);
+    $ms %= MILLISECONDS_A_HOUR;
+    this.$d.minutes = roundNumber($ms / MILLISECONDS_A_MINUTE);
+    $ms %= MILLISECONDS_A_MINUTE;
+    this.$d.seconds = roundNumber($ms / MILLISECONDS_A_SECOND);
+    $ms %= MILLISECONDS_A_SECOND;
+    this.$d.milliseconds = $ms;
+  };
+
+  _proto.toISOString = function toISOString() {
+    var Y = getNumberUnitFormat(this.$d.years, 'Y');
+    var M = getNumberUnitFormat(this.$d.months, 'M');
+    var days = +this.$d.days || 0;
+
+    if (this.$d.weeks) {
+      days += this.$d.weeks * 7;
+    }
+
+    var D = getNumberUnitFormat(days, 'D');
+    var H = getNumberUnitFormat(this.$d.hours, 'H');
+    var m = getNumberUnitFormat(this.$d.minutes, 'M');
+    var seconds = this.$d.seconds || 0;
+
+    if (this.$d.milliseconds) {
+      seconds += this.$d.milliseconds / 1000;
+      seconds = Math.round(seconds * 1000) / 1000;
+    }
+
+    var S = getNumberUnitFormat(seconds, 'S');
+    var negativeMode = Y.negative || M.negative || D.negative || H.negative || m.negative || S.negative;
+    var T = H.format || m.format || S.format ? 'T' : '';
+    var P = negativeMode ? '-' : '';
+    var result = P + "P" + Y.format + M.format + D.format + T + H.format + m.format + S.format;
+    return result === 'P' || result === '-P' ? 'P0D' : result;
+  };
+
+  _proto.toJSON = function toJSON() {
+    return this.toISOString();
+  };
+
+  _proto.format = function format(formatStr) {
+    var str = formatStr || 'YYYY-MM-DDTHH:mm:ss';
+    var matches = {
+      Y: this.$d.years,
+      YY: $u.s(this.$d.years, 2, '0'),
+      YYYY: $u.s(this.$d.years, 4, '0'),
+      M: this.$d.months,
+      MM: $u.s(this.$d.months, 2, '0'),
+      D: this.$d.days,
+      DD: $u.s(this.$d.days, 2, '0'),
+      H: this.$d.hours,
+      HH: $u.s(this.$d.hours, 2, '0'),
+      m: this.$d.minutes,
+      mm: $u.s(this.$d.minutes, 2, '0'),
+      s: this.$d.seconds,
+      ss: $u.s(this.$d.seconds, 2, '0'),
+      SSS: $u.s(this.$d.milliseconds, 3, '0')
+    };
+    return str.replace(REGEX_FORMAT, function (match, $1) {
+      return $1 || String(matches[match]);
+    });
+  };
+
+  _proto.as = function as(unit) {
+    return this.$ms / unitToMS[prettyUnit(unit)];
+  };
+
+  _proto.get = function get(unit) {
+    var base = this.$ms;
+    var pUnit = prettyUnit(unit);
+
+    if (pUnit === 'milliseconds') {
+      base %= 1000;
+    } else if (pUnit === 'weeks') {
+      base = roundNumber(base / unitToMS[pUnit]);
+    } else {
+      base = this.$d[pUnit];
+    }
+
+    return base || 0; // a === 0 will be true on both 0 and -0
+  };
+
+  _proto.add = function add(input, unit, isSubtract) {
+    var another;
+
+    if (unit) {
+      another = input * unitToMS[prettyUnit(unit)];
+    } else if (isDuration(input)) {
+      another = input.$ms;
+    } else {
+      another = wrapper(input, this).$ms;
+    }
+
+    return wrapper(this.$ms + another * (isSubtract ? -1 : 1), this);
+  };
+
+  _proto.subtract = function subtract(input, unit) {
+    return this.add(input, unit, true);
+  };
+
+  _proto.locale = function locale(l) {
+    var that = this.clone();
+    that.$l = l;
+    return that;
+  };
+
+  _proto.clone = function clone() {
+    return wrapper(this.$ms, this);
+  };
+
+  _proto.humanize = function humanize(withSuffix) {
+    return $d().add(this.$ms, 'ms').locale(this.$l).fromNow(!withSuffix);
+  };
+
+  _proto.valueOf = function valueOf() {
+    return this.asMilliseconds();
+  };
+
+  _proto.milliseconds = function milliseconds() {
+    return this.get('milliseconds');
+  };
+
+  _proto.asMilliseconds = function asMilliseconds() {
+    return this.as('milliseconds');
+  };
+
+  _proto.seconds = function seconds() {
+    return this.get('seconds');
+  };
+
+  _proto.asSeconds = function asSeconds() {
+    return this.as('seconds');
+  };
+
+  _proto.minutes = function minutes() {
+    return this.get('minutes');
+  };
+
+  _proto.asMinutes = function asMinutes() {
+    return this.as('minutes');
+  };
+
+  _proto.hours = function hours() {
+    return this.get('hours');
+  };
+
+  _proto.asHours = function asHours() {
+    return this.as('hours');
+  };
+
+  _proto.days = function days() {
+    return this.get('days');
+  };
+
+  _proto.asDays = function asDays() {
+    return this.as('days');
+  };
+
+  _proto.weeks = function weeks() {
+    return this.get('weeks');
+  };
+
+  _proto.asWeeks = function asWeeks() {
+    return this.as('weeks');
+  };
+
+  _proto.months = function months() {
+    return this.get('months');
+  };
+
+  _proto.asMonths = function asMonths() {
+    return this.as('months');
+  };
+
+  _proto.years = function years() {
+    return this.get('years');
+  };
+
+  _proto.asYears = function asYears() {
+    return this.as('years');
+  };
+
+  return Duration;
+}();
+
+var manipulateDuration = function manipulateDuration(date, duration, k) {
+  return date.add(duration.years() * k, 'y').add(duration.months() * k, 'M').add(duration.days() * k, 'd').add(duration.hours() * k, 'h').add(duration.minutes() * k, 'm').add(duration.seconds() * k, 's').add(duration.milliseconds() * k, 'ms');
+};
+
+export default (function (option, Dayjs, dayjs) {
+  $d = dayjs;
+  $u = dayjs().$utils();
+
+  dayjs.duration = function (input, unit) {
+    var $l = dayjs.locale();
+    return wrapper(input, {
+      $l: $l
+    }, unit);
+  };
+
+  dayjs.isDuration = isDuration;
+  var oldAdd = Dayjs.prototype.add;
+  var oldSubtract = Dayjs.prototype.subtract;
+
+  Dayjs.prototype.add = function (value, unit) {
+    if (isDuration(value)) {
+      return manipulateDuration(this, value, 1);
+    }
+
+    return oldAdd.bind(this)(value, unit);
+  };
+
+  Dayjs.prototype.subtract = function (value, unit) {
+    if (isDuration(value)) {
+      return manipulateDuration(this, value, -1);
+    }
+
+    return oldSubtract.bind(this)(value, unit);
+  };
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/isBetween/index.d.ts b/node_modules/dayjs/esm/plugin/isBetween/index.d.ts
new file mode 100644
index 0000000..1c62711
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/isBetween/index.d.ts
@@ -0,0 +1,10 @@
+import { PluginFunc, ConfigType, OpUnitType } from 'dayjs/esm'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs/esm' {
+  interface Dayjs {
+    isBetween(a: ConfigType, b: ConfigType, c?: OpUnitType | null, d?: '()' | '[]' | '[)' | '(]'): boolean
+  }
+}
diff --git a/node_modules/dayjs/esm/plugin/isBetween/index.js b/node_modules/dayjs/esm/plugin/isBetween/index.js
new file mode 100644
index 0000000..2182a89
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/isBetween/index.js
@@ -0,0 +1,10 @@
+export default (function (o, c, d) {
+  c.prototype.isBetween = function (a, b, u, i) {
+    var dA = d(a);
+    var dB = d(b);
+    i = i || '()';
+    var dAi = i[0] === '(';
+    var dBi = i[1] === ')';
+    return (dAi ? this.isAfter(dA, u) : !this.isBefore(dA, u)) && (dBi ? this.isBefore(dB, u) : !this.isAfter(dB, u)) || (dAi ? this.isBefore(dA, u) : !this.isAfter(dA, u)) && (dBi ? this.isAfter(dB, u) : !this.isBefore(dB, u));
+  };
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/isLeapYear/index.d.ts b/node_modules/dayjs/esm/plugin/isLeapYear/index.d.ts
new file mode 100644
index 0000000..627ec5a
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/isLeapYear/index.d.ts
@@ -0,0 +1,10 @@
+import { PluginFunc } from 'dayjs/esm'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs/esm' {
+  interface Dayjs {
+    isLeapYear(): boolean
+  }
+}
diff --git a/node_modules/dayjs/esm/plugin/isLeapYear/index.js b/node_modules/dayjs/esm/plugin/isLeapYear/index.js
new file mode 100644
index 0000000..bf1309d
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/isLeapYear/index.js
@@ -0,0 +1,7 @@
+export default (function (o, c) {
+  var proto = c.prototype;
+
+  proto.isLeapYear = function () {
+    return this.$y % 4 === 0 && this.$y % 100 !== 0 || this.$y % 400 === 0;
+  };
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/isMoment/index.d.ts b/node_modules/dayjs/esm/plugin/isMoment/index.d.ts
new file mode 100644
index 0000000..6e3a69f
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/isMoment/index.d.ts
@@ -0,0 +1,10 @@
+import { PluginFunc } from 'dayjs/esm'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs/esm' {
+
+  export function isMoment(input: any): boolean
+
+}
diff --git a/node_modules/dayjs/esm/plugin/isMoment/index.js b/node_modules/dayjs/esm/plugin/isMoment/index.js
new file mode 100644
index 0000000..48c8a89
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/isMoment/index.js
@@ -0,0 +1,5 @@
+export default (function (o, c, f) {
+  f.isMoment = function (input) {
+    return f.isDayjs(input);
+  };
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/isSameOrAfter/index.d.ts b/node_modules/dayjs/esm/plugin/isSameOrAfter/index.d.ts
new file mode 100644
index 0000000..7b6d239
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/isSameOrAfter/index.d.ts
@@ -0,0 +1,10 @@
+import { PluginFunc, ConfigType, OpUnitType } from 'dayjs/esm'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs/esm' {
+  interface Dayjs {
+    isSameOrAfter(date?: ConfigType, unit?: OpUnitType): boolean
+  }
+}
diff --git a/node_modules/dayjs/esm/plugin/isSameOrAfter/index.js b/node_modules/dayjs/esm/plugin/isSameOrAfter/index.js
new file mode 100644
index 0000000..6a5c56f
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/isSameOrAfter/index.js
@@ -0,0 +1,5 @@
+export default (function (o, c) {
+  c.prototype.isSameOrAfter = function (that, units) {
+    return this.isSame(that, units) || this.isAfter(that, units);
+  };
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/isSameOrBefore/index.d.ts b/node_modules/dayjs/esm/plugin/isSameOrBefore/index.d.ts
new file mode 100644
index 0000000..7ec009f
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/isSameOrBefore/index.d.ts
@@ -0,0 +1,10 @@
+import { PluginFunc, ConfigType, OpUnitType } from 'dayjs/esm'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs/esm' {
+  interface Dayjs {
+    isSameOrBefore(date?: ConfigType, unit?: OpUnitType): boolean
+  }
+}
diff --git a/node_modules/dayjs/esm/plugin/isSameOrBefore/index.js b/node_modules/dayjs/esm/plugin/isSameOrBefore/index.js
new file mode 100644
index 0000000..18d526a
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/isSameOrBefore/index.js
@@ -0,0 +1,5 @@
+export default (function (o, c) {
+  c.prototype.isSameOrBefore = function (that, units) {
+    return this.isSame(that, units) || this.isBefore(that, units);
+  };
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/isToday/index.d.ts b/node_modules/dayjs/esm/plugin/isToday/index.d.ts
new file mode 100644
index 0000000..8d55da8
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/isToday/index.d.ts
@@ -0,0 +1,10 @@
+import { PluginFunc } from 'dayjs/esm'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs/esm' {
+  interface Dayjs {
+    isToday(): boolean
+  }
+}
diff --git a/node_modules/dayjs/esm/plugin/isToday/index.js b/node_modules/dayjs/esm/plugin/isToday/index.js
new file mode 100644
index 0000000..93b36c8
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/isToday/index.js
@@ -0,0 +1,9 @@
+export default (function (o, c, d) {
+  var proto = c.prototype;
+
+  proto.isToday = function () {
+    var comparisonTemplate = 'YYYY-MM-DD';
+    var now = d();
+    return this.format(comparisonTemplate) === now.format(comparisonTemplate);
+  };
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/isTomorrow/index.d.ts b/node_modules/dayjs/esm/plugin/isTomorrow/index.d.ts
new file mode 100644
index 0000000..7652237
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/isTomorrow/index.d.ts
@@ -0,0 +1,10 @@
+import { PluginFunc } from 'dayjs/esm'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs/esm' {
+  interface Dayjs {
+    isTomorrow(): boolean
+  }
+}
diff --git a/node_modules/dayjs/esm/plugin/isTomorrow/index.js b/node_modules/dayjs/esm/plugin/isTomorrow/index.js
new file mode 100644
index 0000000..8cc7238
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/isTomorrow/index.js
@@ -0,0 +1,9 @@
+export default (function (o, c, d) {
+  var proto = c.prototype;
+
+  proto.isTomorrow = function () {
+    var comparisonTemplate = 'YYYY-MM-DD';
+    var tomorrow = d().add(1, 'day');
+    return this.format(comparisonTemplate) === tomorrow.format(comparisonTemplate);
+  };
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/isYesterday/index.d.ts b/node_modules/dayjs/esm/plugin/isYesterday/index.d.ts
new file mode 100644
index 0000000..f4370dc
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/isYesterday/index.d.ts
@@ -0,0 +1,10 @@
+import { PluginFunc } from 'dayjs/esm'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs/esm' {
+  interface Dayjs {
+    isYesterday(): boolean
+  }
+}
diff --git a/node_modules/dayjs/esm/plugin/isYesterday/index.js b/node_modules/dayjs/esm/plugin/isYesterday/index.js
new file mode 100644
index 0000000..fa55373
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/isYesterday/index.js
@@ -0,0 +1,9 @@
+export default (function (o, c, d) {
+  var proto = c.prototype;
+
+  proto.isYesterday = function () {
+    var comparisonTemplate = 'YYYY-MM-DD';
+    var yesterday = d().subtract(1, 'day');
+    return this.format(comparisonTemplate) === yesterday.format(comparisonTemplate);
+  };
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/isoWeek/index.d.ts b/node_modules/dayjs/esm/plugin/isoWeek/index.d.ts
new file mode 100644
index 0000000..6e6a75a
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/isoWeek/index.d.ts
@@ -0,0 +1,27 @@
+import { PluginFunc, OpUnitType, ConfigType } from 'dayjs/esm'
+
+declare const plugin: PluginFunc
+export = plugin
+
+type ISOUnitType = OpUnitType | 'isoWeek';
+
+declare module 'dayjs/esm' {
+  interface Dayjs {
+    isoWeekYear(): number
+    isoWeek(): number
+    isoWeek(value: number): Dayjs
+
+    isoWeekday(): number
+    isoWeekday(value: number): Dayjs
+
+    startOf(unit: ISOUnitType): Dayjs
+
+    endOf(unit: ISOUnitType): Dayjs
+
+    isSame(date?: ConfigType, unit?: ISOUnitType): boolean
+
+    isBefore(date?: ConfigType, unit?: ISOUnitType): boolean
+
+    isAfter(date?: ConfigType, unit?: ISOUnitType): boolean
+  }
+}
diff --git a/node_modules/dayjs/esm/plugin/isoWeek/index.js b/node_modules/dayjs/esm/plugin/isoWeek/index.js
new file mode 100644
index 0000000..289ea7c
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/isoWeek/index.js
@@ -0,0 +1,57 @@
+import { D, W, Y } from '../../constant';
+var isoWeekPrettyUnit = 'isoweek';
+export default (function (o, c, d) {
+  var getYearFirstThursday = function getYearFirstThursday(year, isUtc) {
+    var yearFirstDay = (isUtc ? d.utc : d)().year(year).startOf(Y);
+    var addDiffDays = 4 - yearFirstDay.isoWeekday();
+
+    if (yearFirstDay.isoWeekday() > 4) {
+      addDiffDays += 7;
+    }
+
+    return yearFirstDay.add(addDiffDays, D);
+  };
+
+  var getCurrentWeekThursday = function getCurrentWeekThursday(ins) {
+    return ins.add(4 - ins.isoWeekday(), D);
+  };
+
+  var proto = c.prototype;
+
+  proto.isoWeekYear = function () {
+    var nowWeekThursday = getCurrentWeekThursday(this);
+    return nowWeekThursday.year();
+  };
+
+  proto.isoWeek = function (week) {
+    if (!this.$utils().u(week)) {
+      return this.add((week - this.isoWeek()) * 7, D);
+    }
+
+    var nowWeekThursday = getCurrentWeekThursday(this);
+    var diffWeekThursday = getYearFirstThursday(this.isoWeekYear(), this.$u);
+    return nowWeekThursday.diff(diffWeekThursday, W) + 1;
+  };
+
+  proto.isoWeekday = function (week) {
+    if (!this.$utils().u(week)) {
+      return this.day(this.day() % 7 ? week : week - 7);
+    }
+
+    return this.day() || 7;
+  };
+
+  var oldStartOf = proto.startOf;
+
+  proto.startOf = function (units, startOf) {
+    var utils = this.$utils();
+    var isStartOf = !utils.u(startOf) ? startOf : true;
+    var unit = utils.p(units);
+
+    if (unit === isoWeekPrettyUnit) {
+      return isStartOf ? this.date(this.date() - (this.isoWeekday() - 1)).startOf('day') : this.date(this.date() - 1 - (this.isoWeekday() - 1) + 7).endOf('day');
+    }
+
+    return oldStartOf.bind(this)(units, startOf);
+  };
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/isoWeeksInYear/index.d.ts b/node_modules/dayjs/esm/plugin/isoWeeksInYear/index.d.ts
new file mode 100644
index 0000000..986360f
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/isoWeeksInYear/index.d.ts
@@ -0,0 +1,10 @@
+import { PluginFunc } from 'dayjs/esm'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs/esm' {
+  interface Dayjs {
+    isoWeeksInYear(): number
+  }
+}
diff --git a/node_modules/dayjs/esm/plugin/isoWeeksInYear/index.js b/node_modules/dayjs/esm/plugin/isoWeeksInYear/index.js
new file mode 100644
index 0000000..7161894
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/isoWeeksInYear/index.js
@@ -0,0 +1,15 @@
+export default (function (o, c) {
+  var proto = c.prototype;
+
+  proto.isoWeeksInYear = function () {
+    var isLeapYear = this.isLeapYear();
+    var last = this.endOf('y');
+    var day = last.day();
+
+    if (day === 4 || isLeapYear && day === 5) {
+      return 53;
+    }
+
+    return 52;
+  };
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/localeData/index.d.ts b/node_modules/dayjs/esm/plugin/localeData/index.d.ts
new file mode 100644
index 0000000..9f8762e
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/localeData/index.d.ts
@@ -0,0 +1,44 @@
+import { PluginFunc } from 'dayjs/esm'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs/esm' {
+  type WeekdayNames = [string, string, string, string, string, string, string];
+  type MonthNames = [string, string, string, string, string, string, string, string, string, string, string, string];
+
+  interface InstanceLocaleDataReturn {
+    firstDayOfWeek(): number;
+    weekdays(instance?: Dayjs): WeekdayNames;
+    weekdaysShort(instance?: Dayjs): WeekdayNames;
+    weekdaysMin(instance?: Dayjs): WeekdayNames;
+    months(instance?: Dayjs): MonthNames;
+    monthsShort(instance?: Dayjs): MonthNames;
+    longDateFormat(format: string): string;
+    meridiem(hour?: number, minute?: number, isLower?: boolean): string;
+    ordinal(n: number): string
+  }
+
+  interface GlobalLocaleDataReturn {
+    firstDayOfWeek(): number;
+    weekdays(): WeekdayNames;
+    weekdaysShort(): WeekdayNames;
+    weekdaysMin(): WeekdayNames;
+    months(): MonthNames;
+    monthsShort(): MonthNames;
+    longDateFormat(format: string): string;
+    meridiem(hour?: number, minute?: number, isLower?: boolean): string;
+    ordinal(n: number): string
+  }
+
+  interface Dayjs {
+    localeData(): InstanceLocaleDataReturn;
+  }
+
+  export function weekdays(localOrder?: boolean): WeekdayNames;
+  export function weekdaysShort(localOrder?: boolean): WeekdayNames;
+  export function weekdaysMin(localOrder?: boolean): WeekdayNames;
+  export function monthsShort(): MonthNames;
+  export function months(): MonthNames;
+  export function localeData(): GlobalLocaleDataReturn;
+}
diff --git a/node_modules/dayjs/esm/plugin/localeData/index.js b/node_modules/dayjs/esm/plugin/localeData/index.js
new file mode 100644
index 0000000..c48d92c
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/localeData/index.js
@@ -0,0 +1,114 @@
+import { t } from '../localizedFormat/utils';
+export default (function (o, c, dayjs) {
+  // locale needed later
+  var proto = c.prototype;
+
+  var getLocalePart = function getLocalePart(part) {
+    return part && (part.indexOf ? part : part.s);
+  };
+
+  var getShort = function getShort(ins, target, full, num, localeOrder) {
+    var locale = ins.name ? ins : ins.$locale();
+    var targetLocale = getLocalePart(locale[target]);
+    var fullLocale = getLocalePart(locale[full]);
+    var result = targetLocale || fullLocale.map(function (f) {
+      return f.slice(0, num);
+    });
+    if (!localeOrder) return result;
+    var weekStart = locale.weekStart;
+    return result.map(function (_, index) {
+      return result[(index + (weekStart || 0)) % 7];
+    });
+  };
+
+  var getDayjsLocaleObject = function getDayjsLocaleObject() {
+    return dayjs.Ls[dayjs.locale()];
+  };
+
+  var getLongDateFormat = function getLongDateFormat(l, format) {
+    return l.formats[format] || t(l.formats[format.toUpperCase()]);
+  };
+
+  var localeData = function localeData() {
+    var _this = this;
+
+    return {
+      months: function months(instance) {
+        return instance ? instance.format('MMMM') : getShort(_this, 'months');
+      },
+      monthsShort: function monthsShort(instance) {
+        return instance ? instance.format('MMM') : getShort(_this, 'monthsShort', 'months', 3);
+      },
+      firstDayOfWeek: function firstDayOfWeek() {
+        return _this.$locale().weekStart || 0;
+      },
+      weekdays: function weekdays(instance) {
+        return instance ? instance.format('dddd') : getShort(_this, 'weekdays');
+      },
+      weekdaysMin: function weekdaysMin(instance) {
+        return instance ? instance.format('dd') : getShort(_this, 'weekdaysMin', 'weekdays', 2);
+      },
+      weekdaysShort: function weekdaysShort(instance) {
+        return instance ? instance.format('ddd') : getShort(_this, 'weekdaysShort', 'weekdays', 3);
+      },
+      longDateFormat: function longDateFormat(format) {
+        return getLongDateFormat(_this.$locale(), format);
+      },
+      meridiem: this.$locale().meridiem,
+      ordinal: this.$locale().ordinal
+    };
+  };
+
+  proto.localeData = function () {
+    return localeData.bind(this)();
+  };
+
+  dayjs.localeData = function () {
+    var localeObject = getDayjsLocaleObject();
+    return {
+      firstDayOfWeek: function firstDayOfWeek() {
+        return localeObject.weekStart || 0;
+      },
+      weekdays: function weekdays() {
+        return dayjs.weekdays();
+      },
+      weekdaysShort: function weekdaysShort() {
+        return dayjs.weekdaysShort();
+      },
+      weekdaysMin: function weekdaysMin() {
+        return dayjs.weekdaysMin();
+      },
+      months: function months() {
+        return dayjs.months();
+      },
+      monthsShort: function monthsShort() {
+        return dayjs.monthsShort();
+      },
+      longDateFormat: function longDateFormat(format) {
+        return getLongDateFormat(localeObject, format);
+      },
+      meridiem: localeObject.meridiem,
+      ordinal: localeObject.ordinal
+    };
+  };
+
+  dayjs.months = function () {
+    return getShort(getDayjsLocaleObject(), 'months');
+  };
+
+  dayjs.monthsShort = function () {
+    return getShort(getDayjsLocaleObject(), 'monthsShort', 'months', 3);
+  };
+
+  dayjs.weekdays = function (localeOrder) {
+    return getShort(getDayjsLocaleObject(), 'weekdays', null, null, localeOrder);
+  };
+
+  dayjs.weekdaysShort = function (localeOrder) {
+    return getShort(getDayjsLocaleObject(), 'weekdaysShort', 'weekdays', 3, localeOrder);
+  };
+
+  dayjs.weekdaysMin = function (localeOrder) {
+    return getShort(getDayjsLocaleObject(), 'weekdaysMin', 'weekdays', 2, localeOrder);
+  };
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/localizedFormat/index.d.ts b/node_modules/dayjs/esm/plugin/localizedFormat/index.d.ts
new file mode 100644
index 0000000..a17c896
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/localizedFormat/index.d.ts
@@ -0,0 +1,4 @@
+import { PluginFunc } from 'dayjs/esm'
+
+declare const plugin: PluginFunc
+export = plugin
diff --git a/node_modules/dayjs/esm/plugin/localizedFormat/index.js b/node_modules/dayjs/esm/plugin/localizedFormat/index.js
new file mode 100644
index 0000000..9defb1f
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/localizedFormat/index.js
@@ -0,0 +1,20 @@
+import { FORMAT_DEFAULT } from '../../constant';
+import { u, englishFormats } from './utils';
+export default (function (o, c, d) {
+  var proto = c.prototype;
+  var oldFormat = proto.format;
+  d.en.formats = englishFormats;
+
+  proto.format = function (formatStr) {
+    if (formatStr === void 0) {
+      formatStr = FORMAT_DEFAULT;
+    }
+
+    var _this$$locale = this.$locale(),
+        _this$$locale$formats = _this$$locale.formats,
+        formats = _this$$locale$formats === void 0 ? {} : _this$$locale$formats;
+
+    var result = u(formatStr, formats);
+    return oldFormat.call(this, result);
+  };
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/localizedFormat/utils.js b/node_modules/dayjs/esm/plugin/localizedFormat/utils.js
new file mode 100644
index 0000000..1f48eff
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/localizedFormat/utils.js
@@ -0,0 +1,20 @@
+// eslint-disable-next-line import/prefer-default-export
+export var t = function t(format) {
+  return format.replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g, function (_, a, b) {
+    return a || b.slice(1);
+  });
+};
+export var englishFormats = {
+  LTS: 'h:mm:ss A',
+  LT: 'h:mm A',
+  L: 'MM/DD/YYYY',
+  LL: 'MMMM D, YYYY',
+  LLL: 'MMMM D, YYYY h:mm A',
+  LLLL: 'dddd, MMMM D, YYYY h:mm A'
+};
+export var u = function u(formatStr, formats) {
+  return formatStr.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g, function (_, a, b) {
+    var B = b && b.toUpperCase();
+    return a || formats[b] || englishFormats[b] || t(formats[B]);
+  });
+};
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/minMax/index.d.ts b/node_modules/dayjs/esm/plugin/minMax/index.d.ts
new file mode 100644
index 0000000..143370c
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/minMax/index.d.ts
@@ -0,0 +1,11 @@
+import { PluginFunc } from 'dayjs/esm'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs/esm' {
+  export function max(dayjs: Dayjs[]): Dayjs | null
+  export function max(...dayjs: Dayjs[]): Dayjs | null
+  export function min(dayjs: Dayjs[]): Dayjs | null
+  export function min(...dayjs: Dayjs[]): Dayjs | null
+}
diff --git a/node_modules/dayjs/esm/plugin/minMax/index.js b/node_modules/dayjs/esm/plugin/minMax/index.js
new file mode 100644
index 0000000..0fd68e9
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/minMax/index.js
@@ -0,0 +1,39 @@
+export default (function (o, c, d) {
+  var sortBy = function sortBy(method, dates) {
+    if (!dates || !dates.length || dates.length === 1 && !dates[0] || dates.length === 1 && Array.isArray(dates[0]) && !dates[0].length) {
+      return null;
+    }
+
+    if (dates.length === 1 && dates[0].length > 0) {
+      var _dates = dates;
+      dates = _dates[0];
+    }
+
+    dates = dates.filter(function (date) {
+      return date;
+    });
+    var result;
+    var _dates2 = dates;
+    result = _dates2[0];
+
+    for (var i = 1; i < dates.length; i += 1) {
+      if (!dates[i].isValid() || dates[i][method](result)) {
+        result = dates[i];
+      }
+    }
+
+    return result;
+  };
+
+  d.max = function () {
+    var args = [].slice.call(arguments, 0); // eslint-disable-line prefer-rest-params
+
+    return sortBy('isAfter', args);
+  };
+
+  d.min = function () {
+    var args = [].slice.call(arguments, 0); // eslint-disable-line prefer-rest-params
+
+    return sortBy('isBefore', args);
+  };
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/objectSupport/index.d.ts b/node_modules/dayjs/esm/plugin/objectSupport/index.d.ts
new file mode 100644
index 0000000..03b8b7c
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/objectSupport/index.d.ts
@@ -0,0 +1,48 @@
+import { PluginFunc } from 'dayjs/esm'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs/esm' {
+    interface Dayjs {
+        set(argument: object): Dayjs
+        add(argument: object): Dayjs
+        subtract(argument: object): Dayjs
+    }
+
+    interface ConfigTypeMap {
+        objectSupport: {
+            years?: number | string;
+            year?: number | string;
+            y?: number | string;
+
+            months?: number | string;
+            month?: number | string;
+            M?: number | string;
+
+            days?: number | string;
+            day?: number | string;
+            d?: number | string;
+
+            dates?: number | string;
+            date?: number | string;
+            D?: number | string;
+
+            hours?: number | string;
+            hour?: number | string;
+            h?: number | string;
+
+            minutes?: number | string;
+            minute?: number | string;
+            m?: number | string;
+
+            seconds?: number | string;
+            second?: number | string;
+            s?: number | string;
+
+            milliseconds?: number | string;
+            millisecond?: number | string;
+            ms?: number | string;
+        }
+    }
+}
diff --git a/node_modules/dayjs/esm/plugin/objectSupport/index.js b/node_modules/dayjs/esm/plugin/objectSupport/index.js
new file mode 100644
index 0000000..61636e7
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/objectSupport/index.js
@@ -0,0 +1,97 @@
+export default (function (o, c, dayjs) {
+  var proto = c.prototype;
+
+  var isObject = function isObject(obj) {
+    return obj !== null && !(obj instanceof Date) && !(obj instanceof Array) && !proto.$utils().u(obj) && obj.constructor.name === 'Object';
+  };
+
+  var prettyUnit = function prettyUnit(u) {
+    var unit = proto.$utils().p(u);
+    return unit === 'date' ? 'day' : unit;
+  };
+
+  var parseDate = function parseDate(cfg) {
+    var date = cfg.date,
+        utc = cfg.utc;
+    var $d = {};
+
+    if (isObject(date)) {
+      if (!Object.keys(date).length) {
+        return new Date();
+      }
+
+      var now = utc ? dayjs.utc() : dayjs();
+      Object.keys(date).forEach(function (k) {
+        $d[prettyUnit(k)] = date[k];
+      });
+      var d = $d.day || (!$d.year && !($d.month >= 0) ? now.date() : 1);
+      var y = $d.year || now.year();
+      var M = $d.month >= 0 ? $d.month : !$d.year && !$d.day ? now.month() : 0; // eslint-disable-line no-nested-ternary,max-len
+
+      var h = $d.hour || 0;
+      var m = $d.minute || 0;
+      var s = $d.second || 0;
+      var ms = $d.millisecond || 0;
+
+      if (utc) {
+        return new Date(Date.UTC(y, M, d, h, m, s, ms));
+      }
+
+      return new Date(y, M, d, h, m, s, ms);
+    }
+
+    return date;
+  };
+
+  var oldParse = proto.parse;
+
+  proto.parse = function (cfg) {
+    cfg.date = parseDate.bind(this)(cfg);
+    oldParse.bind(this)(cfg);
+  };
+
+  var oldSet = proto.set;
+  var oldAdd = proto.add;
+  var oldSubtract = proto.subtract;
+
+  var callObject = function callObject(call, argument, string, offset) {
+    if (offset === void 0) {
+      offset = 1;
+    }
+
+    var keys = Object.keys(argument);
+    var chain = this;
+    keys.forEach(function (key) {
+      chain = call.bind(chain)(argument[key] * offset, key);
+    });
+    return chain;
+  };
+
+  proto.set = function (unit, value) {
+    value = value === undefined ? unit : value;
+
+    if (unit.constructor.name === 'Object') {
+      return callObject.bind(this)(function (i, s) {
+        return oldSet.bind(this)(s, i);
+      }, value, unit);
+    }
+
+    return oldSet.bind(this)(unit, value);
+  };
+
+  proto.add = function (value, unit) {
+    if (value.constructor.name === 'Object') {
+      return callObject.bind(this)(oldAdd, value, unit);
+    }
+
+    return oldAdd.bind(this)(value, unit);
+  };
+
+  proto.subtract = function (value, unit) {
+    if (value.constructor.name === 'Object') {
+      return callObject.bind(this)(oldAdd, value, unit, -1);
+    }
+
+    return oldSubtract.bind(this)(value, unit);
+  };
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/pluralGetSet/index.d.ts b/node_modules/dayjs/esm/plugin/pluralGetSet/index.d.ts
new file mode 100644
index 0000000..7ef7167
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/pluralGetSet/index.d.ts
@@ -0,0 +1,44 @@
+import { PluginFunc, UnitType, ConfigType } from 'dayjs/esm'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs/esm' {
+  interface Dayjs {
+    years(): number
+
+    years(value: number): Dayjs
+
+    months(): number
+
+    months(value: number): Dayjs
+
+    dates(): number
+
+    dates(value: number): Dayjs
+
+    weeks(): number
+
+    weeks(value: number): Dayjs
+
+    days(): number
+
+    days(value: number): Dayjs
+
+    hours(): number
+
+    hours(value: number): Dayjs
+
+    minutes(): number
+
+    minutes(value: number): Dayjs
+
+    seconds(): number
+
+    seconds(value: number): Dayjs
+
+    milliseconds(): number
+
+    milliseconds(value: number): Dayjs
+  }
+}
diff --git a/node_modules/dayjs/esm/plugin/pluralGetSet/index.js b/node_modules/dayjs/esm/plugin/pluralGetSet/index.js
new file mode 100644
index 0000000..d8214d6
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/pluralGetSet/index.js
@@ -0,0 +1,7 @@
+export default (function (o, c) {
+  var proto = c.prototype;
+  var pluralAliases = ['milliseconds', 'seconds', 'minutes', 'hours', 'days', 'weeks', 'isoWeeks', 'months', 'quarters', 'years', 'dates'];
+  pluralAliases.forEach(function (alias) {
+    proto[alias] = proto[alias.replace(/s$/, '')];
+  });
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/preParsePostFormat/index.d.ts b/node_modules/dayjs/esm/plugin/preParsePostFormat/index.d.ts
new file mode 100644
index 0000000..a17c896
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/preParsePostFormat/index.d.ts
@@ -0,0 +1,4 @@
+import { PluginFunc } from 'dayjs/esm'
+
+declare const plugin: PluginFunc
+export = plugin
diff --git a/node_modules/dayjs/esm/plugin/preParsePostFormat/index.js b/node_modules/dayjs/esm/plugin/preParsePostFormat/index.js
new file mode 100644
index 0000000..7654ccb
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/preParsePostFormat/index.js
@@ -0,0 +1,40 @@
+// Plugin template from https://day.js.org/docs/en/plugin/plugin
+export default (function (option, dayjsClass) {
+  var oldParse = dayjsClass.prototype.parse;
+
+  dayjsClass.prototype.parse = function (cfg) {
+    if (typeof cfg.date === 'string') {
+      var locale = this.$locale();
+      cfg.date = locale && locale.preparse ? locale.preparse(cfg.date) : cfg.date;
+    } // original parse result
+
+
+    return oldParse.bind(this)(cfg);
+  }; // // overriding existing API
+  // // e.g. extend dayjs().format()
+
+
+  var oldFormat = dayjsClass.prototype.format;
+
+  dayjsClass.prototype.format = function () {
+    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
+      args[_key] = arguments[_key];
+    }
+
+    // original format result
+    var result = oldFormat.call.apply(oldFormat, [this].concat(args)); // return modified result
+
+    var locale = this.$locale();
+    return locale && locale.postformat ? locale.postformat(result) : result;
+  };
+
+  var oldFromTo = dayjsClass.prototype.fromToBase;
+
+  if (oldFromTo) {
+    dayjsClass.prototype.fromToBase = function (input, withoutSuffix, instance, isFrom) {
+      var locale = this.$locale() || instance.$locale(); // original format result
+
+      return oldFromTo.call(this, input, withoutSuffix, instance, isFrom, locale && locale.postformat);
+    };
+  }
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/quarterOfYear/index.d.ts b/node_modules/dayjs/esm/plugin/quarterOfYear/index.d.ts
new file mode 100644
index 0000000..37691c1
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/quarterOfYear/index.d.ts
@@ -0,0 +1,26 @@
+import { PluginFunc, ConfigType, QUnitType, OpUnitType } from 'dayjs/esm'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs/esm' {
+  interface Dayjs {
+    quarter(): number
+
+    quarter(quarter: number): Dayjs
+
+    add(value: number, unit: QUnitType): Dayjs
+
+    subtract(value: number, unit: QUnitType): Dayjs
+
+    startOf(unit: QUnitType | OpUnitType): Dayjs
+
+    endOf(unit: QUnitType | OpUnitType): Dayjs
+
+    isSame(date?: ConfigType, unit?: QUnitType): boolean
+
+    isBefore(date?: ConfigType, unit?: QUnitType): boolean
+
+    isAfter(date?: ConfigType, unit?: QUnitType): boolean
+  }
+}
diff --git a/node_modules/dayjs/esm/plugin/quarterOfYear/index.js b/node_modules/dayjs/esm/plugin/quarterOfYear/index.js
new file mode 100644
index 0000000..e376889
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/quarterOfYear/index.js
@@ -0,0 +1,41 @@
+import { Q, M, D } from '../../constant';
+export default (function (o, c) {
+  var proto = c.prototype;
+
+  proto.quarter = function (quarter) {
+    if (!this.$utils().u(quarter)) {
+      return this.month(this.month() % 3 + (quarter - 1) * 3);
+    }
+
+    return Math.ceil((this.month() + 1) / 3);
+  };
+
+  var oldAdd = proto.add;
+
+  proto.add = function (number, units) {
+    number = Number(number); // eslint-disable-line no-param-reassign
+
+    var unit = this.$utils().p(units);
+
+    if (unit === Q) {
+      return this.add(number * 3, M);
+    }
+
+    return oldAdd.bind(this)(number, units);
+  };
+
+  var oldStartOf = proto.startOf;
+
+  proto.startOf = function (units, startOf) {
+    var utils = this.$utils();
+    var isStartOf = !utils.u(startOf) ? startOf : true;
+    var unit = utils.p(units);
+
+    if (unit === Q) {
+      var quarter = this.quarter() - 1;
+      return isStartOf ? this.month(quarter * 3).startOf(M).startOf(D) : this.month(quarter * 3 + 2).endOf(M).endOf(D);
+    }
+
+    return oldStartOf.bind(this)(units, startOf);
+  };
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/relativeTime/index.d.ts b/node_modules/dayjs/esm/plugin/relativeTime/index.d.ts
new file mode 100644
index 0000000..e1b17cf
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/relativeTime/index.d.ts
@@ -0,0 +1,24 @@
+import { PluginFunc, ConfigType } from 'dayjs/esm'
+
+declare interface RelativeTimeThreshold {
+  l: string
+  r?: number
+  d?: string
+}
+
+declare interface RelativeTimeOptions {
+  rounding?: (num: number) => number
+  thresholds?: RelativeTimeThreshold[]
+}
+
+declare const plugin: PluginFunc<RelativeTimeOptions>
+export = plugin
+
+declare module 'dayjs/esm' {
+  interface Dayjs {
+    fromNow(withoutSuffix?: boolean): string
+    from(compared: ConfigType, withoutSuffix?: boolean): string
+    toNow(withoutSuffix?: boolean): string
+    to(compared: ConfigType, withoutSuffix?: boolean): string
+  }
+}
diff --git a/node_modules/dayjs/esm/plugin/relativeTime/index.js b/node_modules/dayjs/esm/plugin/relativeTime/index.js
new file mode 100644
index 0000000..88fdbbe
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/relativeTime/index.js
@@ -0,0 +1,130 @@
+import * as C from '../../constant';
+export default (function (o, c, d) {
+  o = o || {};
+  var proto = c.prototype;
+  var relObj = {
+    future: 'in %s',
+    past: '%s ago',
+    s: 'a few seconds',
+    m: 'a minute',
+    mm: '%d minutes',
+    h: 'an hour',
+    hh: '%d hours',
+    d: 'a day',
+    dd: '%d days',
+    M: 'a month',
+    MM: '%d months',
+    y: 'a year',
+    yy: '%d years'
+  };
+  d.en.relativeTime = relObj;
+
+  proto.fromToBase = function (input, withoutSuffix, instance, isFrom, postFormat) {
+    var loc = instance.$locale().relativeTime || relObj;
+    var T = o.thresholds || [{
+      l: 's',
+      r: 44,
+      d: C.S
+    }, {
+      l: 'm',
+      r: 89
+    }, {
+      l: 'mm',
+      r: 44,
+      d: C.MIN
+    }, {
+      l: 'h',
+      r: 89
+    }, {
+      l: 'hh',
+      r: 21,
+      d: C.H
+    }, {
+      l: 'd',
+      r: 35
+    }, {
+      l: 'dd',
+      r: 25,
+      d: C.D
+    }, {
+      l: 'M',
+      r: 45
+    }, {
+      l: 'MM',
+      r: 10,
+      d: C.M
+    }, {
+      l: 'y',
+      r: 17
+    }, {
+      l: 'yy',
+      d: C.Y
+    }];
+    var Tl = T.length;
+    var result;
+    var out;
+    var isFuture;
+
+    for (var i = 0; i < Tl; i += 1) {
+      var t = T[i];
+
+      if (t.d) {
+        result = isFrom ? d(input).diff(instance, t.d, true) : instance.diff(input, t.d, true);
+      }
+
+      var abs = (o.rounding || Math.round)(Math.abs(result));
+      isFuture = result > 0;
+
+      if (abs <= t.r || !t.r) {
+        if (abs <= 1 && i > 0) t = T[i - 1]; // 1 minutes -> a minute, 0 seconds -> 0 second
+
+        var format = loc[t.l];
+
+        if (postFormat) {
+          abs = postFormat("" + abs);
+        }
+
+        if (typeof format === 'string') {
+          out = format.replace('%d', abs);
+        } else {
+          out = format(abs, withoutSuffix, t.l, isFuture);
+        }
+
+        break;
+      }
+    }
+
+    if (withoutSuffix) return out;
+    var pastOrFuture = isFuture ? loc.future : loc.past;
+
+    if (typeof pastOrFuture === 'function') {
+      return pastOrFuture(out);
+    }
+
+    return pastOrFuture.replace('%s', out);
+  };
+
+  function fromTo(input, withoutSuffix, instance, isFrom) {
+    return proto.fromToBase(input, withoutSuffix, instance, isFrom);
+  }
+
+  proto.to = function (input, withoutSuffix) {
+    return fromTo(input, withoutSuffix, this, true);
+  };
+
+  proto.from = function (input, withoutSuffix) {
+    return fromTo(input, withoutSuffix, this);
+  };
+
+  var makeNow = function makeNow(thisDay) {
+    return thisDay.$u ? d.utc() : d();
+  };
+
+  proto.toNow = function (withoutSuffix) {
+    return this.to(makeNow(this), withoutSuffix);
+  };
+
+  proto.fromNow = function (withoutSuffix) {
+    return this.from(makeNow(this), withoutSuffix);
+  };
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/timezone/index.d.ts b/node_modules/dayjs/esm/plugin/timezone/index.d.ts
new file mode 100644
index 0000000..5a2d9f2
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/timezone/index.d.ts
@@ -0,0 +1,20 @@
+import { PluginFunc, ConfigType } from 'dayjs/esm'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs/esm' {
+  interface Dayjs {
+    tz(timezone?: string, keepLocalTime?: boolean): Dayjs
+    offsetName(type?: 'short' | 'long'): string | undefined
+  }
+
+  interface DayjsTimezone {
+    (date?: ConfigType, timezone?: string): Dayjs
+    (date: ConfigType, format: string, timezone?: string): Dayjs
+    guess(): string
+    setDefault(timezone?: string): void
+  }
+
+  const tz: DayjsTimezone
+}
diff --git a/node_modules/dayjs/esm/plugin/timezone/index.js b/node_modules/dayjs/esm/plugin/timezone/index.js
new file mode 100644
index 0000000..490aff2
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/timezone/index.js
@@ -0,0 +1,189 @@
+import { MIN, MS } from '../../constant';
+var typeToPos = {
+  year: 0,
+  month: 1,
+  day: 2,
+  hour: 3,
+  minute: 4,
+  second: 5
+}; // Cache time-zone lookups from Intl.DateTimeFormat,
+// as it is a *very* slow method.
+
+var dtfCache = {};
+
+var getDateTimeFormat = function getDateTimeFormat(timezone, options) {
+  if (options === void 0) {
+    options = {};
+  }
+
+  var timeZoneName = options.timeZoneName || 'short';
+  var key = timezone + "|" + timeZoneName;
+  var dtf = dtfCache[key];
+
+  if (!dtf) {
+    dtf = new Intl.DateTimeFormat('en-US', {
+      hour12: false,
+      timeZone: timezone,
+      year: 'numeric',
+      month: '2-digit',
+      day: '2-digit',
+      hour: '2-digit',
+      minute: '2-digit',
+      second: '2-digit',
+      timeZoneName: timeZoneName
+    });
+    dtfCache[key] = dtf;
+  }
+
+  return dtf;
+};
+
+export default (function (o, c, d) {
+  var defaultTimezone;
+
+  var makeFormatParts = function makeFormatParts(timestamp, timezone, options) {
+    if (options === void 0) {
+      options = {};
+    }
+
+    var date = new Date(timestamp);
+    var dtf = getDateTimeFormat(timezone, options);
+    return dtf.formatToParts(date);
+  };
+
+  var tzOffset = function tzOffset(timestamp, timezone) {
+    var formatResult = makeFormatParts(timestamp, timezone);
+    var filled = [];
+
+    for (var i = 0; i < formatResult.length; i += 1) {
+      var _formatResult$i = formatResult[i],
+          type = _formatResult$i.type,
+          value = _formatResult$i.value;
+      var pos = typeToPos[type];
+
+      if (pos >= 0) {
+        filled[pos] = parseInt(value, 10);
+      }
+    }
+
+    var hour = filled[3]; // Workaround for the same behavior in different node version
+    // https://github.com/nodejs/node/issues/33027
+
+    /* istanbul ignore next */
+
+    var fixedHour = hour === 24 ? 0 : hour;
+    var utcString = filled[0] + "-" + filled[1] + "-" + filled[2] + " " + fixedHour + ":" + filled[4] + ":" + filled[5] + ":000";
+    var utcTs = d.utc(utcString).valueOf();
+    var asTS = +timestamp;
+    var over = asTS % 1000;
+    asTS -= over;
+    return (utcTs - asTS) / (60 * 1000);
+  }; // find the right offset a given local time. The o input is our guess, which determines which
+  // offset we'll pick in ambiguous cases (e.g. there are two 3 AMs b/c Fallback DST)
+  // https://github.com/moment/luxon/blob/master/src/datetime.js#L76
+
+
+  var fixOffset = function fixOffset(localTS, o0, tz) {
+    // Our UTC time is just a guess because our offset is just a guess
+    var utcGuess = localTS - o0 * 60 * 1000; // Test whether the zone matches the offset for this ts
+
+    var o2 = tzOffset(utcGuess, tz); // If so, offset didn't change and we're done
+
+    if (o0 === o2) {
+      return [utcGuess, o0];
+    } // If not, change the ts by the difference in the offset
+
+
+    utcGuess -= (o2 - o0) * 60 * 1000; // If that gives us the local time we want, we're done
+
+    var o3 = tzOffset(utcGuess, tz);
+
+    if (o2 === o3) {
+      return [utcGuess, o2];
+    } // If it's different, we're in a hole time.
+    // The offset has changed, but the we don't adjust the time
+
+
+    return [localTS - Math.min(o2, o3) * 60 * 1000, Math.max(o2, o3)];
+  };
+
+  var proto = c.prototype;
+
+  proto.tz = function (timezone, keepLocalTime) {
+    if (timezone === void 0) {
+      timezone = defaultTimezone;
+    }
+
+    var oldOffset = this.utcOffset();
+    var date = this.toDate();
+    var target = date.toLocaleString('en-US', {
+      timeZone: timezone
+    });
+    var diff = Math.round((date - new Date(target)) / 1000 / 60);
+    var ins = d(target, {
+      locale: this.$L
+    }).$set(MS, this.$ms).utcOffset(-Math.round(date.getTimezoneOffset() / 15) * 15 - diff, true);
+
+    if (keepLocalTime) {
+      var newOffset = ins.utcOffset();
+      ins = ins.add(oldOffset - newOffset, MIN);
+    }
+
+    ins.$x.$timezone = timezone;
+    return ins;
+  };
+
+  proto.offsetName = function (type) {
+    // type: short(default) / long
+    var zone = this.$x.$timezone || d.tz.guess();
+    var result = makeFormatParts(this.valueOf(), zone, {
+      timeZoneName: type
+    }).find(function (m) {
+      return m.type.toLowerCase() === 'timezonename';
+    });
+    return result && result.value;
+  };
+
+  var oldStartOf = proto.startOf;
+
+  proto.startOf = function (units, startOf) {
+    if (!this.$x || !this.$x.$timezone) {
+      return oldStartOf.call(this, units, startOf);
+    }
+
+    var withoutTz = d(this.format('YYYY-MM-DD HH:mm:ss:SSS'), {
+      locale: this.$L
+    });
+    var startOfWithoutTz = oldStartOf.call(withoutTz, units, startOf);
+    return startOfWithoutTz.tz(this.$x.$timezone, true);
+  };
+
+  d.tz = function (input, arg1, arg2) {
+    var parseFormat = arg2 && arg1;
+    var timezone = arg2 || arg1 || defaultTimezone;
+    var previousOffset = tzOffset(+d(), timezone);
+
+    if (typeof input !== 'string') {
+      // timestamp number || js Date || Day.js
+      return d(input).tz(timezone);
+    }
+
+    var localTs = d.utc(input, parseFormat).valueOf();
+
+    var _fixOffset = fixOffset(localTs, previousOffset, timezone),
+        targetTs = _fixOffset[0],
+        targetOffset = _fixOffset[1];
+
+    var ins = d(targetTs).utcOffset(targetOffset);
+    ins.$x.$timezone = timezone;
+    return ins;
+  };
+
+  d.tz.guess = function () {
+    return Intl.DateTimeFormat().resolvedOptions().timeZone;
+  };
+
+  d.tz.setDefault = function (timezone) {
+    defaultTimezone = timezone;
+  };
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/toArray/index.d.ts b/node_modules/dayjs/esm/plugin/toArray/index.d.ts
new file mode 100644
index 0000000..5033831
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/toArray/index.d.ts
@@ -0,0 +1,10 @@
+import { PluginFunc } from 'dayjs/esm'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs/esm' {
+  interface Dayjs {
+    toArray(): number[]
+  }
+}
diff --git a/node_modules/dayjs/esm/plugin/toArray/index.js b/node_modules/dayjs/esm/plugin/toArray/index.js
new file mode 100644
index 0000000..2b795f4
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/toArray/index.js
@@ -0,0 +1,7 @@
+export default (function (o, c) {
+  var proto = c.prototype;
+
+  proto.toArray = function () {
+    return [this.$y, this.$M, this.$D, this.$H, this.$m, this.$s, this.$ms];
+  };
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/toObject/index.d.ts b/node_modules/dayjs/esm/plugin/toObject/index.d.ts
new file mode 100644
index 0000000..ad21520
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/toObject/index.d.ts
@@ -0,0 +1,20 @@
+import { PluginFunc } from 'dayjs/esm'
+
+declare const plugin: PluginFunc
+export = plugin
+
+interface DayjsObject {
+  years: number
+  months: number
+  date: number
+  hours: number
+  minutes: number
+  seconds: number
+  milliseconds: number
+}
+
+declare module 'dayjs/esm' {
+  interface Dayjs {
+    toObject(): DayjsObject
+  }
+}
diff --git a/node_modules/dayjs/esm/plugin/toObject/index.js b/node_modules/dayjs/esm/plugin/toObject/index.js
new file mode 100644
index 0000000..e35d93f
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/toObject/index.js
@@ -0,0 +1,15 @@
+export default (function (o, c) {
+  var proto = c.prototype;
+
+  proto.toObject = function () {
+    return {
+      years: this.$y,
+      months: this.$M,
+      date: this.$D,
+      hours: this.$H,
+      minutes: this.$m,
+      seconds: this.$s,
+      milliseconds: this.$ms
+    };
+  };
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/updateLocale/index.d.ts b/node_modules/dayjs/esm/plugin/updateLocale/index.d.ts
new file mode 100644
index 0000000..994a884
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/updateLocale/index.d.ts
@@ -0,0 +1,8 @@
+import { PluginFunc } from 'dayjs/esm'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs/esm' {
+  export function updateLocale(localeName: string, customConfig: Record<string, unknown>): Record<string, unknown>
+}
diff --git a/node_modules/dayjs/esm/plugin/updateLocale/index.js b/node_modules/dayjs/esm/plugin/updateLocale/index.js
new file mode 100644
index 0000000..1b9965c
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/updateLocale/index.js
@@ -0,0 +1,12 @@
+export default (function (option, Dayjs, dayjs) {
+  dayjs.updateLocale = function (locale, customConfig) {
+    var localeList = dayjs.Ls;
+    var localeConfig = localeList[locale];
+    if (!localeConfig) return;
+    var customConfigKeys = customConfig ? Object.keys(customConfig) : [];
+    customConfigKeys.forEach(function (c) {
+      localeConfig[c] = customConfig[c];
+    });
+    return localeConfig; // eslint-disable-line consistent-return
+  };
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/utc/index.d.ts b/node_modules/dayjs/esm/plugin/utc/index.d.ts
new file mode 100644
index 0000000..15c61fe
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/utc/index.d.ts
@@ -0,0 +1,19 @@
+import { PluginFunc, ConfigType } from 'dayjs/esm'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs/esm' {
+  interface Dayjs {
+    
+    utc(keepLocalTime?: boolean): Dayjs
+    
+    local(): Dayjs
+
+    isUTC(): boolean
+
+    utcOffset(offset: number | string, keepLocalTime?: boolean): Dayjs
+  }
+
+  export function utc(config?: ConfigType, format?: string, strict?: boolean): Dayjs
+}
diff --git a/node_modules/dayjs/esm/plugin/utc/index.js b/node_modules/dayjs/esm/plugin/utc/index.js
new file mode 100644
index 0000000..a8a05f5
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/utc/index.js
@@ -0,0 +1,188 @@
+import { MILLISECONDS_A_MINUTE, MIN } from '../../constant';
+var REGEX_VALID_OFFSET_FORMAT = /[+-]\d\d(?::?\d\d)?/g;
+var REGEX_OFFSET_HOURS_MINUTES_FORMAT = /([+-]|\d\d)/g;
+
+function offsetFromString(value) {
+  if (value === void 0) {
+    value = '';
+  }
+
+  var offset = value.match(REGEX_VALID_OFFSET_FORMAT);
+
+  if (!offset) {
+    return null;
+  }
+
+  var _ref = ("" + offset[0]).match(REGEX_OFFSET_HOURS_MINUTES_FORMAT) || ['-', 0, 0],
+      indicator = _ref[0],
+      hoursOffset = _ref[1],
+      minutesOffset = _ref[2];
+
+  var totalOffsetInMinutes = +hoursOffset * 60 + +minutesOffset;
+
+  if (totalOffsetInMinutes === 0) {
+    return 0;
+  }
+
+  return indicator === '+' ? totalOffsetInMinutes : -totalOffsetInMinutes;
+}
+
+export default (function (option, Dayjs, dayjs) {
+  var proto = Dayjs.prototype;
+
+  dayjs.utc = function (date) {
+    var cfg = {
+      date: date,
+      utc: true,
+      args: arguments
+    }; // eslint-disable-line prefer-rest-params
+
+    return new Dayjs(cfg); // eslint-disable-line no-use-before-define
+  };
+
+  proto.utc = function (keepLocalTime) {
+    var ins = dayjs(this.toDate(), {
+      locale: this.$L,
+      utc: true
+    });
+
+    if (keepLocalTime) {
+      return ins.add(this.utcOffset(), MIN);
+    }
+
+    return ins;
+  };
+
+  proto.local = function () {
+    return dayjs(this.toDate(), {
+      locale: this.$L,
+      utc: false
+    });
+  };
+
+  var oldParse = proto.parse;
+
+  proto.parse = function (cfg) {
+    if (cfg.utc) {
+      this.$u = true;
+    }
+
+    if (!this.$utils().u(cfg.$offset)) {
+      this.$offset = cfg.$offset;
+    }
+
+    oldParse.call(this, cfg);
+  };
+
+  var oldInit = proto.init;
+
+  proto.init = function () {
+    if (this.$u) {
+      var $d = this.$d;
+      this.$y = $d.getUTCFullYear();
+      this.$M = $d.getUTCMonth();
+      this.$D = $d.getUTCDate();
+      this.$W = $d.getUTCDay();
+      this.$H = $d.getUTCHours();
+      this.$m = $d.getUTCMinutes();
+      this.$s = $d.getUTCSeconds();
+      this.$ms = $d.getUTCMilliseconds();
+    } else {
+      oldInit.call(this);
+    }
+  };
+
+  var oldUtcOffset = proto.utcOffset;
+
+  proto.utcOffset = function (input, keepLocalTime) {
+    var _this$$utils = this.$utils(),
+        u = _this$$utils.u;
+
+    if (u(input)) {
+      if (this.$u) {
+        return 0;
+      }
+
+      if (!u(this.$offset)) {
+        return this.$offset;
+      }
+
+      return oldUtcOffset.call(this);
+    }
+
+    if (typeof input === 'string') {
+      input = offsetFromString(input);
+
+      if (input === null) {
+        return this;
+      }
+    }
+
+    var offset = Math.abs(input) <= 16 ? input * 60 : input;
+    var ins = this;
+
+    if (keepLocalTime) {
+      ins.$offset = offset;
+      ins.$u = input === 0;
+      return ins;
+    }
+
+    if (input !== 0) {
+      var localTimezoneOffset = this.$u ? this.toDate().getTimezoneOffset() : -1 * this.utcOffset();
+      ins = this.local().add(offset + localTimezoneOffset, MIN);
+      ins.$offset = offset;
+      ins.$x.$localOffset = localTimezoneOffset;
+    } else {
+      ins = this.utc();
+    }
+
+    return ins;
+  };
+
+  var oldFormat = proto.format;
+  var UTC_FORMAT_DEFAULT = 'YYYY-MM-DDTHH:mm:ss[Z]';
+
+  proto.format = function (formatStr) {
+    var str = formatStr || (this.$u ? UTC_FORMAT_DEFAULT : '');
+    return oldFormat.call(this, str);
+  };
+
+  proto.valueOf = function () {
+    var addedOffset = !this.$utils().u(this.$offset) ? this.$offset + (this.$x.$localOffset || this.$d.getTimezoneOffset()) : 0;
+    return this.$d.valueOf() - addedOffset * MILLISECONDS_A_MINUTE;
+  };
+
+  proto.isUTC = function () {
+    return !!this.$u;
+  };
+
+  proto.toISOString = function () {
+    return this.toDate().toISOString();
+  };
+
+  proto.toString = function () {
+    return this.toDate().toUTCString();
+  };
+
+  var oldToDate = proto.toDate;
+
+  proto.toDate = function (type) {
+    if (type === 's' && this.$offset) {
+      return dayjs(this.format('YYYY-MM-DD HH:mm:ss:SSS')).toDate();
+    }
+
+    return oldToDate.call(this);
+  };
+
+  var oldDiff = proto.diff;
+
+  proto.diff = function (input, units, _float) {
+    if (input && this.$u === input.$u) {
+      return oldDiff.call(this, input, units, _float);
+    }
+
+    var localThis = this.local();
+    var localInput = dayjs(input).local();
+    return oldDiff.call(localThis, localInput, units, _float);
+  };
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/weekOfYear/index.d.ts b/node_modules/dayjs/esm/plugin/weekOfYear/index.d.ts
new file mode 100644
index 0000000..340051b
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/weekOfYear/index.d.ts
@@ -0,0 +1,12 @@
+import { PluginFunc } from 'dayjs/esm'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs/esm' {
+  interface Dayjs {
+    week(): number
+
+    week(value : number): Dayjs
+  }
+}
diff --git a/node_modules/dayjs/esm/plugin/weekOfYear/index.js b/node_modules/dayjs/esm/plugin/weekOfYear/index.js
new file mode 100644
index 0000000..c92406e
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/weekOfYear/index.js
@@ -0,0 +1,44 @@
+import { MS, Y, D, W } from '../../constant';
+export default (function (o, c, d) {
+  var proto = c.prototype;
+
+  proto.week = function (week) {
+    if (week === void 0) {
+      week = null;
+    }
+
+    if (week !== null) {
+      return this.add((week - this.week()) * 7, D);
+    }
+
+    var yearStart = this.$locale().yearStart || 1;
+
+    if (this.month() === 11 && this.date() > 25) {
+      // d(this) is for badMutable
+      var nextYearStartDay = d(this).startOf(Y).add(1, Y).date(yearStart);
+      var thisEndOfWeek = d(this).endOf(W);
+
+      if (nextYearStartDay.isBefore(thisEndOfWeek)) {
+        return 1;
+      }
+    }
+
+    var yearStartDay = d(this).startOf(Y).date(yearStart);
+    var yearStartWeek = yearStartDay.startOf(W).subtract(1, MS);
+    var diffInWeek = this.diff(yearStartWeek, W, true);
+
+    if (diffInWeek < 0) {
+      return d(this).startOf('week').week();
+    }
+
+    return Math.ceil(diffInWeek);
+  };
+
+  proto.weeks = function (week) {
+    if (week === void 0) {
+      week = null;
+    }
+
+    return this.week(week);
+  };
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/weekYear/index.d.ts b/node_modules/dayjs/esm/plugin/weekYear/index.d.ts
new file mode 100644
index 0000000..5b713e5
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/weekYear/index.d.ts
@@ -0,0 +1,10 @@
+import { PluginFunc } from 'dayjs/esm'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs/esm' {
+  interface Dayjs {
+    weekYear(): number
+  }
+}
diff --git a/node_modules/dayjs/esm/plugin/weekYear/index.js b/node_modules/dayjs/esm/plugin/weekYear/index.js
new file mode 100644
index 0000000..140dcd4
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/weekYear/index.js
@@ -0,0 +1,19 @@
+export default (function (o, c) {
+  var proto = c.prototype;
+
+  proto.weekYear = function () {
+    var month = this.month();
+    var weekOfYear = this.week();
+    var year = this.year();
+
+    if (weekOfYear === 1 && month === 11) {
+      return year + 1;
+    }
+
+    if (month === 0 && weekOfYear >= 52) {
+      return year - 1;
+    }
+
+    return year;
+  };
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/plugin/weekday/index.d.ts b/node_modules/dayjs/esm/plugin/weekday/index.d.ts
new file mode 100644
index 0000000..41945e7
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/weekday/index.d.ts
@@ -0,0 +1,12 @@
+import { PluginFunc } from 'dayjs/esm'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs/esm' {
+  interface Dayjs {
+    weekday(): number
+
+    weekday(value: number): Dayjs
+  }
+}
diff --git a/node_modules/dayjs/esm/plugin/weekday/index.js b/node_modules/dayjs/esm/plugin/weekday/index.js
new file mode 100644
index 0000000..18032b3
--- /dev/null
+++ b/node_modules/dayjs/esm/plugin/weekday/index.js
@@ -0,0 +1,15 @@
+export default (function (o, c) {
+  var proto = c.prototype;
+
+  proto.weekday = function (input) {
+    var weekStart = this.$locale().weekStart || 0;
+    var $W = this.$W;
+    var weekday = ($W < weekStart ? $W + 7 : $W) - weekStart;
+
+    if (this.$utils().u(input)) {
+      return weekday;
+    }
+
+    return this.subtract(weekday, 'day').add(input, 'day');
+  };
+});
\ No newline at end of file
diff --git a/node_modules/dayjs/esm/utils.js b/node_modules/dayjs/esm/utils.js
new file mode 100644
index 0000000..b5a8131
--- /dev/null
+++ b/node_modules/dayjs/esm/utils.js
@@ -0,0 +1,58 @@
+import * as C from './constant';
+
+var padStart = function padStart(string, length, pad) {
+  var s = String(string);
+  if (!s || s.length >= length) return string;
+  return "" + Array(length + 1 - s.length).join(pad) + string;
+};
+
+var padZoneStr = function padZoneStr(instance) {
+  var negMinutes = -instance.utcOffset();
+  var minutes = Math.abs(negMinutes);
+  var hourOffset = Math.floor(minutes / 60);
+  var minuteOffset = minutes % 60;
+  return "" + (negMinutes <= 0 ? '+' : '-') + padStart(hourOffset, 2, '0') + ":" + padStart(minuteOffset, 2, '0');
+};
+
+var monthDiff = function monthDiff(a, b) {
+  // function from moment.js in order to keep the same result
+  if (a.date() < b.date()) return -monthDiff(b, a);
+  var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month());
+  var anchor = a.clone().add(wholeMonthDiff, C.M);
+  var c = b - anchor < 0;
+  var anchor2 = a.clone().add(wholeMonthDiff + (c ? -1 : 1), C.M);
+  return +(-(wholeMonthDiff + (b - anchor) / (c ? anchor - anchor2 : anchor2 - anchor)) || 0);
+};
+
+var absFloor = function absFloor(n) {
+  return n < 0 ? Math.ceil(n) || 0 : Math.floor(n);
+};
+
+var prettyUnit = function prettyUnit(u) {
+  var special = {
+    M: C.M,
+    y: C.Y,
+    w: C.W,
+    d: C.D,
+    D: C.DATE,
+    h: C.H,
+    m: C.MIN,
+    s: C.S,
+    ms: C.MS,
+    Q: C.Q
+  };
+  return special[u] || String(u || '').toLowerCase().replace(/s$/, '');
+};
+
+var isUndefined = function isUndefined(s) {
+  return s === undefined;
+};
+
+export default {
+  s: padStart,
+  z: padZoneStr,
+  m: monthDiff,
+  a: absFloor,
+  p: prettyUnit,
+  u: isUndefined
+};
\ No newline at end of file
diff --git a/node_modules/dayjs/index.d.ts b/node_modules/dayjs/index.d.ts
new file mode 100644
index 0000000..766bd79
--- /dev/null
+++ b/node_modules/dayjs/index.d.ts
@@ -0,0 +1,429 @@
+/// <reference path="./locale/index.d.ts" />
+
+export = dayjs;
+
+declare function dayjs (date?: dayjs.ConfigType): dayjs.Dayjs
+
+declare function dayjs (date?: dayjs.ConfigType, format?: dayjs.OptionType, strict?: boolean): dayjs.Dayjs
+
+declare function dayjs (date?: dayjs.ConfigType, format?: dayjs.OptionType, locale?: string, strict?: boolean): dayjs.Dayjs
+
+declare namespace dayjs {
+  interface ConfigTypeMap {
+    default: string | number | Date | Dayjs | null | undefined
+  }
+
+  export type ConfigType = ConfigTypeMap[keyof ConfigTypeMap]
+
+  export interface FormatObject { locale?: string, format?: string, utc?: boolean }
+
+  export type OptionType = FormatObject | string | string[]
+
+  export type UnitTypeShort = 'd' | 'D' | 'M' | 'y' | 'h' | 'm' | 's' | 'ms'
+
+  export type UnitTypeLong = 'millisecond' | 'second' | 'minute' | 'hour' | 'day' | 'month' | 'year' | 'date'
+
+  export type UnitTypeLongPlural = 'milliseconds' | 'seconds' | 'minutes' | 'hours' | 'days' | 'months' | 'years' | 'dates'
+  
+  export type UnitType = UnitTypeLong | UnitTypeLongPlural | UnitTypeShort;
+
+  export type OpUnitType = UnitType | "week" | "weeks" | 'w';
+  export type QUnitType = UnitType | "quarter" | "quarters" | 'Q';
+  export type ManipulateType = Exclude<OpUnitType, 'date' | 'dates'>;
+  class Dayjs {
+    constructor (config?: ConfigType)
+    /**
+     * All Day.js objects are immutable. Still, `dayjs#clone` can create a clone of the current object if you need one.
+     * ```
+     * dayjs().clone()// => Dayjs
+     * dayjs(dayjs('2019-01-25')) // passing a Dayjs object to a constructor will also clone it
+     * ```
+     * Docs: https://day.js.org/docs/en/parse/dayjs-clone
+     */
+    clone(): Dayjs
+    /**
+     * This returns a `boolean` indicating whether the Day.js object contains a valid date or not.
+     * ```
+     * dayjs().isValid()// => boolean
+     * ```
+     * Docs: https://day.js.org/docs/en/parse/is-valid
+     */
+    isValid(): boolean
+    /**
+     * Get the year.
+     * ```
+     * dayjs().year()// => 2020
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/year
+     */
+    year(): number
+    /**
+     * Set the year.
+     * ```
+     * dayjs().year(2000)// => Dayjs
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/year
+     */
+    year(value: number): Dayjs
+    /**
+     * Get the month.
+     *
+     * Months are zero indexed, so January is month 0.
+     * ```
+     * dayjs().month()// => 0-11
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/month
+     */
+    month(): number
+    /**
+     * Set the month.
+     *
+     * Months are zero indexed, so January is month 0.
+     *
+     * Accepts numbers from 0 to 11. If the range is exceeded, it will bubble up to the next year.
+     * ```
+     * dayjs().month(0)// => Dayjs
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/month
+     */
+    month(value: number): Dayjs
+    /**
+     * Get the date of the month.
+     * ```
+     * dayjs().date()// => 1-31
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/date
+     */
+    date(): number
+    /**
+     * Set the date of the month.
+     *
+     * Accepts numbers from 1 to 31. If the range is exceeded, it will bubble up to the next months.
+     * ```
+     * dayjs().date(1)// => Dayjs
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/date
+     */
+    date(value: number): Dayjs
+    /**
+     * Get the day of the week.
+     *
+     * Returns numbers from 0 (Sunday) to 6 (Saturday).
+     * ```
+     * dayjs().day()// 0-6
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/day
+     */
+    day(): number
+    /**
+     * Set the day of the week.
+     *
+     * Accepts numbers from 0 (Sunday) to 6 (Saturday). If the range is exceeded, it will bubble up to next weeks.
+     * ```
+     * dayjs().day(0)// => Dayjs
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/day
+     */
+    day(value: number): Dayjs
+    /**
+     * Get the hour.
+     * ```
+     * dayjs().hour()// => 0-23
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/hour
+     */
+    hour(): number
+    /**
+     * Set the hour.
+     *
+     * Accepts numbers from 0 to 23. If the range is exceeded, it will bubble up to the next day.
+     * ```
+     * dayjs().hour(12)// => Dayjs
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/hour
+     */
+    hour(value: number): Dayjs
+    /**
+     * Get the minutes.
+     * ```
+     * dayjs().minute()// => 0-59
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/minute
+     */
+    minute(): number
+    /**
+     * Set the minutes.
+     *
+     * Accepts numbers from 0 to 59. If the range is exceeded, it will bubble up to the next hour.
+     * ```
+     * dayjs().minute(59)// => Dayjs
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/minute
+     */
+    minute(value: number): Dayjs
+    /**
+     * Get the seconds.
+     * ```
+     * dayjs().second()// => 0-59
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/second
+     */
+    second(): number
+    /**
+     * Set the seconds.
+     *
+     * Accepts numbers from 0 to 59. If the range is exceeded, it will bubble up to the next minutes.
+     * ```
+     * dayjs().second(1)// Dayjs
+     * ```
+     */
+    second(value: number): Dayjs
+    /**
+     * Get the milliseconds.
+     * ```
+     * dayjs().millisecond()// => 0-999
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/millisecond
+     */
+    millisecond(): number
+    /**
+     * Set the milliseconds.
+     *
+     * Accepts numbers from 0 to 999. If the range is exceeded, it will bubble up to the next seconds.
+     * ```
+     * dayjs().millisecond(1)// => Dayjs
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/millisecond
+     */
+    millisecond(value: number): Dayjs
+    /**
+     * Generic setter, accepting unit as first argument, and value as second, returns a new instance with the applied changes.
+     *
+     * In general:
+     * ```
+     * dayjs().set(unit, value) === dayjs()[unit](value)
+     * ```
+     * Units are case insensitive, and support plural and short forms.
+     * ```
+     * dayjs().set('date', 1)
+     * dayjs().set('month', 3) // April
+     * dayjs().set('second', 30)
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/set
+     */
+    set(unit: UnitType, value: number): Dayjs
+    /**
+     * String getter, returns the corresponding information getting from Day.js object.
+     *
+     * In general:
+     * ```
+     * dayjs().get(unit) === dayjs()[unit]()
+     * ```
+     * Units are case insensitive, and support plural and short forms.
+     * ```
+     * dayjs().get('year')
+     * dayjs().get('month') // start 0
+     * dayjs().get('date')
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/get
+     */
+    get(unit: UnitType): number
+    /**
+     * Returns a cloned Day.js object with a specified amount of time added.
+     * ```
+     * dayjs().add(7, 'day')// => Dayjs
+     * ```
+     * Units are case insensitive, and support plural and short forms.
+     *
+     * Docs: https://day.js.org/docs/en/manipulate/add
+     */
+    add(value: number, unit?: ManipulateType): Dayjs
+    /**
+     * Returns a cloned Day.js object with a specified amount of time subtracted.
+     * ```
+     * dayjs().subtract(7, 'year')// => Dayjs
+     * ```
+     * Units are case insensitive, and support plural and short forms.
+     *
+     * Docs: https://day.js.org/docs/en/manipulate/subtract
+     */
+    subtract(value: number, unit?: ManipulateType): Dayjs
+    /**
+     * Returns a cloned Day.js object and set it to the start of a unit of time.
+     * ```
+     * dayjs().startOf('year')// => Dayjs
+     * ```
+     * Units are case insensitive, and support plural and short forms.
+     *
+     * Docs: https://day.js.org/docs/en/manipulate/start-of
+     */
+    startOf(unit: OpUnitType): Dayjs
+    /**
+     * Returns a cloned Day.js object and set it to the end of a unit of time.
+     * ```
+     * dayjs().endOf('month')// => Dayjs
+     * ```
+     * Units are case insensitive, and support plural and short forms.
+     *
+     * Docs: https://day.js.org/docs/en/manipulate/end-of
+     */
+    endOf(unit: OpUnitType): Dayjs
+    /**
+     * Get the formatted date according to the string of tokens passed in.
+     *
+     * To escape characters, wrap them in square brackets (e.g. [MM]).
+     * ```
+     * dayjs().format()// => current date in ISO8601, without fraction seconds e.g. '2020-04-02T08:02:17-05:00'
+     * dayjs('2019-01-25').format('[YYYYescape] YYYY-MM-DDTHH:mm:ssZ[Z]')// 'YYYYescape 2019-01-25T00:00:00-02:00Z'
+     * dayjs('2019-01-25').format('DD/MM/YYYY') // '25/01/2019'
+     * ```
+     * Docs: https://day.js.org/docs/en/display/format
+     */
+    format(template?: string): string
+    /**
+     * This indicates the difference between two date-time in the specified unit.
+     *
+     * To get the difference in milliseconds, use `dayjs#diff`
+     * ```
+     * const date1 = dayjs('2019-01-25')
+     * const date2 = dayjs('2018-06-05')
+     * date1.diff(date2) // 20214000000 default milliseconds
+     * date1.diff() // milliseconds to current time
+     * ```
+     *
+     * To get the difference in another unit of measurement, pass that measurement as the second argument.
+     * ```
+     * const date1 = dayjs('2019-01-25')
+     * date1.diff('2018-06-05', 'month') // 7
+     * ```
+     * Units are case insensitive, and support plural and short forms.
+     *
+     * Docs: https://day.js.org/docs/en/display/difference
+     */
+    diff(date?: ConfigType, unit?: QUnitType | OpUnitType, float?: boolean): number
+    /**
+     * This returns the number of **milliseconds** since the Unix Epoch of the Day.js object.
+     * ```
+     * dayjs('2019-01-25').valueOf() // 1548381600000
+     * +dayjs(1548381600000) // 1548381600000
+     * ```
+     * To get a Unix timestamp (the number of seconds since the epoch) from a Day.js object, you should use Unix Timestamp `dayjs#unix()`.
+     *
+     * Docs: https://day.js.org/docs/en/display/unix-timestamp-milliseconds
+     */
+    valueOf(): number
+    /**
+     * This returns the Unix timestamp (the number of **seconds** since the Unix Epoch) of the Day.js object.
+     * ```
+     * dayjs('2019-01-25').unix() // 1548381600
+     * ```
+     * This value is floored to the nearest second, and does not include a milliseconds component.
+     *
+     * Docs: https://day.js.org/docs/en/display/unix-timestamp
+     */
+    unix(): number
+    /**
+     * Get the number of days in the current month.
+     * ```
+     * dayjs('2019-01-25').daysInMonth() // 31
+     * ```
+     * Docs: https://day.js.org/docs/en/display/days-in-month
+     */
+    daysInMonth(): number
+    /**
+     * To get a copy of the native `Date` object parsed from the Day.js object use `dayjs#toDate`.
+     * ```
+     * dayjs('2019-01-25').toDate()// => Date
+     * ```
+     */
+    toDate(): Date
+    /**
+     * To serialize as an ISO 8601 string.
+     * ```
+     * dayjs('2019-01-25').toJSON() // '2019-01-25T02:00:00.000Z'
+     * ```
+     * Docs: https://day.js.org/docs/en/display/as-json
+     */
+    toJSON(): string
+    /**
+     * To format as an ISO 8601 string.
+     * ```
+     * dayjs('2019-01-25').toISOString() // '2019-01-25T02:00:00.000Z'
+     * ```
+     * Docs: https://day.js.org/docs/en/display/as-iso-string
+     */
+    toISOString(): string
+    /**
+     * Returns a string representation of the date.
+     * ```
+     * dayjs('2019-01-25').toString() // 'Fri, 25 Jan 2019 02:00:00 GMT'
+     * ```
+     * Docs: https://day.js.org/docs/en/display/as-string
+     */
+    toString(): string
+    /**
+     * Get the UTC offset in minutes.
+     * ```
+     * dayjs().utcOffset()
+     * ```
+     * Docs: https://day.js.org/docs/en/manipulate/utc-offset
+     */
+    utcOffset(): number
+    /**
+     * This indicates whether the Day.js object is before the other supplied date-time.
+     * ```
+     * dayjs().isBefore(dayjs('2011-01-01')) // default milliseconds
+     * ```
+     * If you want to limit the granularity to a unit other than milliseconds, pass it as the second parameter.
+     * ```
+     * dayjs().isBefore('2011-01-01', 'year')// => boolean
+     * ```
+     * Units are case insensitive, and support plural and short forms.
+     *
+     * Docs: https://day.js.org/docs/en/query/is-before
+     */
+    isBefore(date?: ConfigType, unit?: OpUnitType): boolean
+    /**
+     * This indicates whether the Day.js object is the same as the other supplied date-time.
+     * ```
+     * dayjs().isSame(dayjs('2011-01-01')) // default milliseconds
+     * ```
+     * If you want to limit the granularity to a unit other than milliseconds, pass it as the second parameter.
+     * ```
+     * dayjs().isSame('2011-01-01', 'year')// => boolean
+     * ```
+     * Docs: https://day.js.org/docs/en/query/is-same
+     */
+    isSame(date?: ConfigType, unit?: OpUnitType): boolean
+    /**
+     * This indicates whether the Day.js object is after the other supplied date-time.
+     * ```
+     * dayjs().isAfter(dayjs('2011-01-01')) // default milliseconds
+     * ```
+     * If you want to limit the granularity to a unit other than milliseconds, pass it as the second parameter.
+     * ```
+     * dayjs().isAfter('2011-01-01', 'year')// => boolean
+     * ```
+     * Units are case insensitive, and support plural and short forms.
+     *
+     * Docs: https://day.js.org/docs/en/query/is-after
+     */
+    isAfter(date?: ConfigType, unit?: OpUnitType): boolean
+
+    locale(): string
+
+    locale(preset: string | ILocale, object?: Partial<ILocale>): Dayjs
+  }
+
+  export type PluginFunc<T = unknown> = (option: T, c: typeof Dayjs, d: typeof dayjs) => void
+
+  export function extend<T = unknown>(plugin: PluginFunc<T>, option?: T): Dayjs
+
+  export function locale(preset?: string | ILocale, object?: Partial<ILocale>, isLocal?: boolean): string
+
+  export function isDayjs(d: any): d is Dayjs
+
+  export function unix(t: number): Dayjs
+
+  const Ls : { [key: string] :  ILocale }
+}
diff --git a/node_modules/dayjs/locale.json b/node_modules/dayjs/locale.json
new file mode 100644
index 0000000..45a01c4
--- /dev/null
+++ b/node_modules/dayjs/locale.json
@@ -0,0 +1 @@
+[{"key":"af","name":"Afrikaans"},{"key":"am","name":"Amharic"},{"key":"ar-dz","name":"Arabic (Algeria)"},{"key":"ar-iq","name":" Arabic (Iraq)"},{"key":"ar-kw","name":"Arabic (Kuwait)"},{"key":"ar-ly","name":"Arabic (Lybia)"},{"key":"ar-ma","name":"Arabic (Morocco)"},{"key":"ar-sa","name":"Arabic (Saudi Arabia)"},{"key":"ar-tn","name":" Arabic (Tunisia)"},{"key":"ar","name":"Arabic"},{"key":"az","name":"Azerbaijani"},{"key":"be","name":"Belarusian"},{"key":"bg","name":"Bulgarian"},{"key":"bi","name":"Bislama"},{"key":"bm","name":"Bambara"},{"key":"bn-bd","name":"Bengali (Bangladesh)"},{"key":"bn","name":"Bengali"},{"key":"bo","name":"Tibetan"},{"key":"br","name":"Breton"},{"key":"bs","name":"Bosnian"},{"key":"ca","name":"Catalan"},{"key":"cs","name":"Czech"},{"key":"cv","name":"Chuvash"},{"key":"cy","name":"Welsh"},{"key":"da","name":"Danish"},{"key":"de-at","name":"German (Austria)"},{"key":"de-ch","name":"German (Switzerland)"},{"key":"de","name":"German"},{"key":"dv","name":"Maldivian"},{"key":"el","name":"Greek"},{"key":"en-au","name":"English (Australia)"},{"key":"en-ca","name":"English (Canada)"},{"key":"en-gb","name":"English (United Kingdom)"},{"key":"en-ie","name":"English (Ireland)"},{"key":"en-il","name":"English (Israel)"},{"key":"en-in","name":"English (India)"},{"key":"en-nz","name":"English (New Zealand)"},{"key":"en-sg","name":"English (Singapore)"},{"key":"en-tt","name":"English (Trinidad & Tobago)"},{"key":"en","name":"English"},{"key":"eo","name":"Esperanto"},{"key":"es-do","name":"Spanish (Dominican Republic)"},{"key":"es-mx","name":"Spanish (Mexico)"},{"key":"es-pr","name":"Spanish (Puerto Rico)"},{"key":"es-us","name":"Spanish (United States)"},{"key":"es","name":"Spanish"},{"key":"et","name":"Estonian"},{"key":"eu","name":"Basque"},{"key":"fa","name":"Persian"},{"key":"fi","name":"Finnish"},{"key":"fo","name":"Faroese"},{"key":"fr-ca","name":"French (Canada)"},{"key":"fr-ch","name":"French (Switzerland)"},{"key":"fr","name":"French"},{"key":"fy","name":"Frisian"},{"key":"ga","name":"Irish or Irish Gaelic"},{"key":"gd","name":"Scottish Gaelic"},{"key":"gl","name":"Galician"},{"key":"gom-latn","name":"Konkani Latin script"},{"key":"gu","name":"Gujarati"},{"key":"hi","name":"Hindi"},{"key":"he","name":"Hebrew"},{"key":"hr","name":"Croatian"},{"key":"ht","name":"Haitian Creole (Haiti)"},{"key":"hu","name":"Hungarian"},{"key":"hy-am","name":"Armenian"},{"key":"id","name":"Indonesian"},{"key":"is","name":"Icelandic"},{"key":"it-ch","name":"Italian (Switzerland)"},{"key":"it","name":"Italian"},{"key":"ja","name":"Japanese"},{"key":"jv","name":"Javanese"},{"key":"ka","name":"Georgian"},{"key":"kk","name":"Kazakh"},{"key":"km","name":"Cambodian"},{"key":"kn","name":"Kannada"},{"key":"ko","name":"Korean"},{"key":"ku","name":"Kurdish"},{"key":"ky","name":"Kyrgyz"},{"key":"lb","name":"Luxembourgish"},{"key":"lo","name":"Lao"},{"key":"lt","name":"Lithuanian"},{"key":"lv","name":"Latvian"},{"key":"me","name":"Montenegrin"},{"key":"mi","name":"Maori"},{"key":"mk","name":"Macedonian"},{"key":"ml","name":"Malayalam"},{"key":"mn","name":"Mongolian"},{"key":"mr","name":"Marathi"},{"key":"ms-my","name":"Malay"},{"key":"ms","name":"Malay"},{"key":"mt","name":"Maltese (Malta)"},{"key":"my","name":"Burmese"},{"key":"nb","name":"Norwegian Bokmål"},{"key":"ne","name":"Nepalese"},{"key":"nl-be","name":"Dutch (Belgium)"},{"key":"nl","name":"Dutch"},{"key":"nn","name":"Nynorsk"},{"key":"oc-lnc","name":"Occitan, lengadocian dialecte"},{"key":"pa-in","name":"Punjabi (India)"},{"key":"pl","name":"Polish"},{"key":"pt-br","name":"Portuguese (Brazil)"},{"key":"pt","name":"Portuguese"},{"key":"rn","name":"Kirundi"},{"key":"ro","name":"Romanian"},{"key":"sd","name":"Sindhi"},{"key":"si","name":"Sinhalese"},{"key":"se","name":"Northern Sami"},{"key":"sk","name":"Slovak"},{"key":"sl","name":"Slovenian"},{"key":"sq","name":"Albanian"},{"key":"sr-cyrl","name":"Serbian Cyrillic"},{"key":"sr","name":"Serbian"},{"key":"ss","name":"siSwati"},{"key":"sv-fi","name":"Finland Swedish"},{"key":"sv","name":"Swedish"},{"key":"sw","name":"Swahili"},{"key":"ta","name":"Tamil"},{"key":"te","name":"Telugu"},{"key":"tg","name":"Tajik"},{"key":"tet","name":"Tetun Dili (East Timor)"},{"key":"th","name":"Thai"},{"key":"tk","name":"Turkmen"},{"key":"tl-ph","name":"Tagalog (Philippines)"},{"key":"tlh","name":"Klingon"},{"key":"tr","name":"Turkish"},{"key":"tzl","name":"Talossan"},{"key":"tzm-latn","name":"Central Atlas Tamazight Latin"},{"key":"ug-cn","name":"Uyghur (China)"},{"key":"tzm","name":"Central Atlas Tamazight"},{"key":"uk","name":"Ukrainian"},{"key":"ur","name":"Urdu"},{"key":"uz-latn","name":"Uzbek Latin"},{"key":"vi","name":"Vietnamese"},{"key":"uz","name":"Uzbek"},{"key":"yo","name":"Yoruba Nigeria"},{"key":"x-pseudo","name":"Pseudo"},{"key":"zh-cn","name":"Chinese (China)"},{"key":"zh-hk","name":"Chinese (Hong Kong)"},{"key":"zh-tw","name":"Chinese (Taiwan)"},{"key":"zh","name":"Chinese"},{"key":"rw","name":"Kinyarwanda (Rwanda)"},{"key":"ru","name":"Russian"}]
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/af.js b/node_modules/dayjs/locale/af.js
new file mode 100644
index 0000000..62c75e4
--- /dev/null
+++ b/node_modules/dayjs/locale/af.js
@@ -0,0 +1 @@
+!function(e,a){"object"==typeof exports&&"undefined"!=typeof module?module.exports=a(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],a):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_af=a(e.dayjs)}(this,(function(e){"use strict";function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=a(e),t={name:"af",weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),weekStart:1,weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),monthsShort:"Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"}};return n.default.locale(t,null,!0),t}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/am.js b/node_modules/dayjs/locale/am.js
new file mode 100644
index 0000000..7b588a8
--- /dev/null
+++ b/node_modules/dayjs/locale/am.js
@@ -0,0 +1 @@
+!function(e,_){"object"==typeof exports&&"undefined"!=typeof module?module.exports=_(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],_):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_am=_(e.dayjs)}(this,(function(e){"use strict";function _(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=_(e),d={name:"am",weekdays:"እሑድ_ሰኞ_ማክሰኞ_ረቡዕ_ሐሙስ_አርብ_ቅዳሜ".split("_"),weekdaysShort:"እሑድ_ሰኞ_ማክሰ_ረቡዕ_ሐሙስ_አርብ_ቅዳሜ".split("_"),weekdaysMin:"እሑ_ሰኞ_ማክ_ረቡ_ሐሙ_አር_ቅዳ".split("_"),months:"ጃንዋሪ_ፌብሯሪ_ማርች_ኤፕሪል_ሜይ_ጁን_ጁላይ_ኦገስት_ሴፕቴምበር_ኦክቶበር_ኖቬምበር_ዲሴምበር".split("_"),monthsShort:"ጃንዋ_ፌብሯ_ማርች_ኤፕሪ_ሜይ_ጁን_ጁላይ_ኦገስ_ሴፕቴ_ኦክቶ_ኖቬም_ዲሴም".split("_"),weekStart:1,yearStart:4,relativeTime:{future:"በ%s",past:"%s በፊት",s:"ጥቂት ሰከንዶች",m:"አንድ ደቂቃ",mm:"%d ደቂቃዎች",h:"አንድ ሰዓት",hh:"%d ሰዓታት",d:"አንድ ቀን",dd:"%d ቀናት",M:"አንድ ወር",MM:"%d ወራት",y:"አንድ ዓመት",yy:"%d ዓመታት"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"MMMM D ፣ YYYY",LLL:"MMMM D ፣ YYYY HH:mm",LLLL:"dddd ፣ MMMM D ፣ YYYY HH:mm"},ordinal:function(e){return e+"ኛ"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/ar-dz.js b/node_modules/dayjs/locale/ar-dz.js
new file mode 100644
index 0000000..5522790
--- /dev/null
+++ b/node_modules/dayjs/locale/ar-dz.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_ar_dz=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),d={name:"ar-dz",weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),months:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdaysShort:"احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),monthsShort:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdaysMin:"أح_إث_ثلا_أر_خم_جم_سب".split("_"),ordinal:function(_){return _},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiem:function(_){return _>12?"م":"ص"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/ar-iq.js b/node_modules/dayjs/locale/ar-iq.js
new file mode 100644
index 0000000..07e8c71
--- /dev/null
+++ b/node_modules/dayjs/locale/ar-iq.js
@@ -0,0 +1 @@
+!function(e,_){"object"==typeof exports&&"undefined"!=typeof module?module.exports=_(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],_):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_ar_iq=_(e.dayjs)}(this,(function(e){"use strict";function _(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=_(e),d={name:"ar-iq",weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),months:"كانون الثاني_شباط_آذار_نيسان_أيار_حزيران_تموز_آب_أيلول_تشرين الأول_ تشرين الثاني_كانون الأول".split("_"),weekStart:1,weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),monthsShort:"كانون الثاني_شباط_آذار_نيسان_أيار_حزيران_تموز_آب_أيلول_تشرين الأول_ تشرين الثاني_كانون الأول".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiem:function(e){return e>12?"م":"ص"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/ar-kw.js b/node_modules/dayjs/locale/ar-kw.js
new file mode 100644
index 0000000..a876ca0
--- /dev/null
+++ b/node_modules/dayjs/locale/ar-kw.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_ar_kw=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),d={name:"ar-kw",weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),months:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdaysShort:"احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),ordinal:function(_){return _},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiem:function(_){return _>12?"م":"ص"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/ar-ly.js b/node_modules/dayjs/locale/ar-ly.js
new file mode 100644
index 0000000..9dbe09b
--- /dev/null
+++ b/node_modules/dayjs/locale/ar-ly.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_ar_ly=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),n={name:"ar-ly",weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),months:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekStart:6,weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),ordinal:function(_){return _},meridiem:function(_){return _>12?"م":"ص"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/‏M/‏YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"}};return t.default.locale(n,null,!0),n}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/ar-ma.js b/node_modules/dayjs/locale/ar-ma.js
new file mode 100644
index 0000000..dbb77cc
--- /dev/null
+++ b/node_modules/dayjs/locale/ar-ma.js
@@ -0,0 +1 @@
+!function(e,_){"object"==typeof exports&&"undefined"!=typeof module?module.exports=_(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],_):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_ar_ma=_(e.dayjs)}(this,(function(e){"use strict";function _(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=_(e),d={name:"ar-ma",weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),months:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekStart:6,weekdaysShort:"احد_إثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiem:function(e){return e>12?"م":"ص"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/ar-sa.js b/node_modules/dayjs/locale/ar-sa.js
new file mode 100644
index 0000000..9c2c0d4
--- /dev/null
+++ b/node_modules/dayjs/locale/ar-sa.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_ar_sa=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),d={name:"ar-sa",weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),months:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),ordinal:function(_){return _},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiem:function(_){return _>12?"م":"ص"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/ar-tn.js b/node_modules/dayjs/locale/ar-tn.js
new file mode 100644
index 0000000..944b46d
--- /dev/null
+++ b/node_modules/dayjs/locale/ar-tn.js
@@ -0,0 +1 @@
+!function(e,_){"object"==typeof exports&&"undefined"!=typeof module?module.exports=_(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],_):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_ar_tn=_(e.dayjs)}(this,(function(e){"use strict";function _(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=_(e),d={name:"ar-tn",weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),months:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekStart:1,weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),monthsShort:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiem:function(e){return e>12?"م":"ص"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/ar.js b/node_modules/dayjs/locale/ar.js
new file mode 100644
index 0000000..517c49e
--- /dev/null
+++ b/node_modules/dayjs/locale/ar.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_ar=t(e.dayjs)}(this,(function(e){"use strict";function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=t(e),r="يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),d={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},_={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"},o={name:"ar",weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),months:r,monthsShort:r,weekStart:6,meridiem:function(e){return e>12?"م":"ص"},relativeTime:{future:"بعد %s",past:"منذ %s",s:"ثانية واحدة",m:"دقيقة واحدة",mm:"%d دقائق",h:"ساعة واحدة",hh:"%d ساعات",d:"يوم واحد",dd:"%d أيام",M:"شهر واحد",MM:"%d أشهر",y:"عام واحد",yy:"%d أعوام"},preparse:function(e){return e.replace(/[١٢٣٤٥٦٧٨٩٠]/g,(function(e){return _[e]})).replace(/،/g,",")},postformat:function(e){return e.replace(/\d/g,(function(e){return d[e]})).replace(/,/g,"،")},ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/‏M/‏YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"}};return n.default.locale(o,null,!0),o}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/az.js b/node_modules/dayjs/locale/az.js
new file mode 100644
index 0000000..d63ed1f
--- /dev/null
+++ b/node_modules/dayjs/locale/az.js
@@ -0,0 +1 @@
+!function(a,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(a="undefined"!=typeof globalThis?globalThis:a||self).dayjs_locale_az=e(a.dayjs)}(this,(function(a){"use strict";function e(a){return a&&"object"==typeof a&&"default"in a?a:{default:a}}var _=e(a),t={name:"az",weekdays:"Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə".split("_"),weekdaysShort:"Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən".split("_"),weekdaysMin:"Bz_BE_ÇA_Çə_CA_Cü_Şə".split("_"),months:"yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr".split("_"),monthsShort:"yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek".split("_"),weekStart:1,formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., H:mm",LLLL:"dddd, D MMMM YYYY г., H:mm"},relativeTime:{future:"%s sonra",past:"%s əvvəl",s:"bir neçə saniyə",m:"bir dəqiqə",mm:"%d dəqiqə",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir il",yy:"%d il"},ordinal:function(a){return a}};return _.default.locale(t,null,!0),t}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/be.js b/node_modules/dayjs/locale/be.js
new file mode 100644
index 0000000..704a87d
--- /dev/null
+++ b/node_modules/dayjs/locale/be.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_be=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),n={name:"be",weekdays:"нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу".split("_"),months:"студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня".split("_"),weekStart:1,weekdaysShort:"нд_пн_ат_ср_чц_пт_сб".split("_"),monthsShort:"студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж".split("_"),weekdaysMin:"нд_пн_ат_ср_чц_пт_сб".split("_"),ordinal:function(_){return _},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., HH:mm",LLLL:"dddd, D MMMM YYYY г., HH:mm"}};return t.default.locale(n,null,!0),n}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/bg.js b/node_modules/dayjs/locale/bg.js
new file mode 100644
index 0000000..4a3d316
--- /dev/null
+++ b/node_modules/dayjs/locale/bg.js
@@ -0,0 +1 @@
+!function(e,_){"object"==typeof exports&&"undefined"!=typeof module?module.exports=_(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],_):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_bg=_(e.dayjs)}(this,(function(e){"use strict";function _(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=_(e),d={name:"bg",weekdays:"неделя_понеделник_вторник_сряда_четвъртък_петък_събота".split("_"),weekdaysShort:"нед_пон_вто_сря_чет_пет_съб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),months:"януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември".split("_"),monthsShort:"янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек".split("_"),weekStart:1,ordinal:function(e){var _=e%100;if(_>10&&_<20)return e+"-ти";var t=e%10;return 1===t?e+"-ви":2===t?e+"-ри":7===t||8===t?e+"-ми":e+"-ти"},formats:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},relativeTime:{future:"след %s",past:"преди %s",s:"няколко секунди",m:"минута",mm:"%d минути",h:"час",hh:"%d часа",d:"ден",dd:"%d дена",M:"месец",MM:"%d месеца",y:"година",yy:"%d години"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/bi.js b/node_modules/dayjs/locale/bi.js
new file mode 100644
index 0000000..e457dff
--- /dev/null
+++ b/node_modules/dayjs/locale/bi.js
@@ -0,0 +1 @@
+!function(e,a){"object"==typeof exports&&"undefined"!=typeof module?module.exports=a(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],a):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_bi=a(e.dayjs)}(this,(function(e){"use strict";function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=a(e),_={name:"bi",weekdays:"Sande_Mande_Tusde_Wenesde_Tosde_Fraede_Sarade".split("_"),months:"Januari_Februari_Maj_Eprel_Mei_Jun_Julae_Okis_Septemba_Oktoba_Novemba_Disemba".split("_"),weekStart:1,weekdaysShort:"San_Man_Tus_Wen_Tos_Frae_Sar".split("_"),monthsShort:"Jan_Feb_Maj_Epr_Mai_Jun_Jul_Oki_Sep_Okt_Nov_Dis".split("_"),weekdaysMin:"San_Ma_Tu_We_To_Fr_Sar".split("_"),ordinal:function(e){return e},formats:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},relativeTime:{future:"lo %s",past:"%s bifo",s:"sam seken",m:"wan minit",mm:"%d minit",h:"wan haoa",hh:"%d haoa",d:"wan dei",dd:"%d dei",M:"wan manis",MM:"%d manis",y:"wan yia",yy:"%d yia"}};return n.default.locale(_,null,!0),_}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/bm.js b/node_modules/dayjs/locale/bm.js
new file mode 100644
index 0000000..3c4fbdd
--- /dev/null
+++ b/node_modules/dayjs/locale/bm.js
@@ -0,0 +1 @@
+!function(a,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(a="undefined"!=typeof globalThis?globalThis:a||self).dayjs_locale_bm=e(a.dayjs)}(this,(function(a){"use strict";function e(a){return a&&"object"==typeof a&&"default"in a?a:{default:a}}var l=e(a),t={name:"bm",weekdays:"Kari_Ntɛnɛn_Tarata_Araba_Alamisa_Juma_Sibiri".split("_"),months:"Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_Mɛkalo_Zuwɛnkalo_Zuluyekalo_Utikalo_Sɛtanburukalo_ɔkutɔburukalo_Nowanburukalo_Desanburukalo".split("_"),weekStart:1,weekdaysShort:"Kar_Ntɛ_Tar_Ara_Ala_Jum_Sib".split("_"),monthsShort:"Zan_Few_Mar_Awi_Mɛ_Zuw_Zul_Uti_Sɛt_ɔku_Now_Des".split("_"),weekdaysMin:"Ka_Nt_Ta_Ar_Al_Ju_Si".split("_"),ordinal:function(a){return a},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"MMMM [tile] D [san] YYYY",LLL:"MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm",LLLL:"dddd MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm"},relativeTime:{future:"%s kɔnɔ",past:"a bɛ %s bɔ",s:"sanga dama dama",m:"miniti kelen",mm:"miniti %d",h:"lɛrɛ kelen",hh:"lɛrɛ %d",d:"tile kelen",dd:"tile %d",M:"kalo kelen",MM:"kalo %d",y:"san kelen",yy:"san %d"}};return l.default.locale(t,null,!0),t}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/bn-bd.js b/node_modules/dayjs/locale/bn-bd.js
new file mode 100644
index 0000000..ae76f9f
--- /dev/null
+++ b/node_modules/dayjs/locale/bn-bd.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_bn_bd=t(e.dayjs)}(this,(function(e){"use strict";function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var _=t(e),n={1:"১",2:"২",3:"৩",4:"৪",5:"৫",6:"৬",7:"৭",8:"৮",9:"৯",0:"০"},d={"১":"1","২":"2","৩":"3","৪":"4","৫":"5","৬":"6","৭":"7","৮":"8","৯":"9","০":"0"},r={name:"bn-bd",weekdays:"রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার".split("_"),months:"জানুয়ারি_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর".split("_"),weekdaysShort:"রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি".split("_"),monthsShort:"জানু_ফেব্রু_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্ট_অক্টো_নভে_ডিসে".split("_"),weekdaysMin:"রবি_সোম_মঙ্গ_বুধ_বৃহঃ_শুক্র_শনি".split("_"),weekStart:0,preparse:function(e){return e.replace(/[১২৩৪৫৬৭৮৯০]/g,(function(e){return d[e]}))},postformat:function(e){return e.replace(/\d/g,(function(e){return n[e]}))},ordinal:function(e){var t=["ই","লা","রা","ঠা","শে"],_=e%100;return"["+e+(t[(_-20)%10]||t[_]||t[0])+"]"},formats:{LT:"A h:mm সময়",LTS:"A h:mm:ss সময়",L:"DD/MM/YYYY খ্রিস্টাব্দ",LL:"D MMMM YYYY খ্রিস্টাব্দ",LLL:"D MMMM YYYY খ্রিস্টাব্দ, A h:mm সময়",LLLL:"dddd, D MMMM YYYY খ্রিস্টাব্দ, A h:mm সময়"},meridiem:function(e){return e<4?"রাত":e<6?"ভোর":e<12?"সকাল":e<15?"দুপুর":e<18?"বিকাল":e<20?"সন্ধ্যা":"রাত"},relativeTime:{future:"%s পরে",past:"%s আগে",s:"কয়েক সেকেন্ড",m:"এক মিনিট",mm:"%d মিনিট",h:"এক ঘন্টা",hh:"%d ঘন্টা",d:"এক দিন",dd:"%d দিন",M:"এক মাস",MM:"%d মাস",y:"এক বছর",yy:"%d বছর"}};return _.default.locale(r,null,!0),r}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/bn.js b/node_modules/dayjs/locale/bn.js
new file mode 100644
index 0000000..30ffa02
--- /dev/null
+++ b/node_modules/dayjs/locale/bn.js
@@ -0,0 +1 @@
+!function(e,_){"object"==typeof exports&&"undefined"!=typeof module?module.exports=_(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],_):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_bn=_(e.dayjs)}(this,(function(e){"use strict";function _(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=_(e),n={1:"১",2:"২",3:"৩",4:"৪",5:"৫",6:"৬",7:"৭",8:"৮",9:"৯",0:"০"},d={"১":"1","২":"2","৩":"3","৪":"4","৫":"5","৬":"6","৭":"7","৮":"8","৯":"9","০":"0"},o={name:"bn",weekdays:"রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার".split("_"),months:"জানুয়ারি_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর".split("_"),weekdaysShort:"রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি".split("_"),monthsShort:"জানু_ফেব্রু_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্ট_অক্টো_নভে_ডিসে".split("_"),weekdaysMin:"রবি_সোম_মঙ্গ_বুধ_বৃহঃ_শুক্র_শনি".split("_"),preparse:function(e){return e.replace(/[১২৩৪৫৬৭৮৯০]/g,(function(e){return d[e]}))},postformat:function(e){return e.replace(/\d/g,(function(e){return n[e]}))},ordinal:function(e){return e},formats:{LT:"A h:mm সময়",LTS:"A h:mm:ss সময়",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm সময়",LLLL:"dddd, D MMMM YYYY, A h:mm সময়"},relativeTime:{future:"%s পরে",past:"%s আগে",s:"কয়েক সেকেন্ড",m:"এক মিনিট",mm:"%d মিনিট",h:"এক ঘন্টা",hh:"%d ঘন্টা",d:"এক দিন",dd:"%d দিন",M:"এক মাস",MM:"%d মাস",y:"এক বছর",yy:"%d বছর"}};return t.default.locale(o,null,!0),o}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/bo.js b/node_modules/dayjs/locale/bo.js
new file mode 100644
index 0000000..92bb7cc
--- /dev/null
+++ b/node_modules/dayjs/locale/bo.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_bo=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),d={name:"bo",weekdays:"གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་".split("_"),weekdaysShort:"ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་".split("_"),weekdaysMin:"ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་".split("_"),months:"ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ".split("_"),monthsShort:"ཟླ་དང་པོ_ཟླ་གཉིས་པ_ཟླ་གསུམ་པ_ཟླ་བཞི་པ_ཟླ་ལྔ་པ_ཟླ་དྲུག་པ_ཟླ་བདུན་པ_ཟླ་བརྒྱད་པ_ཟླ་དགུ་པ_ཟླ་བཅུ་པ_ཟླ་བཅུ་གཅིག་པ_ཟླ་བཅུ་གཉིས་པ".split("_"),ordinal:function(_){return _},formats:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},relativeTime:{future:"%s ལ་",past:"%s སྔོན་ལ་",s:"ཏོག་ཙམ་",m:"སྐར་མ་གཅིག་",mm:"སྐར་མ་ %d",h:"ཆུ་ཚོད་གཅིག་",hh:"ཆུ་ཚོད་ %d",d:"ཉིན་གཅིག་",dd:"ཉིན་ %d",M:"ཟླ་བ་གཅིག་",MM:"ཟླ་བ་ %d",y:"ལོ་གཅིག་",yy:"ལོ་ %d"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/br.js b/node_modules/dayjs/locale/br.js
new file mode 100644
index 0000000..0b2317f
--- /dev/null
+++ b/node_modules/dayjs/locale/br.js
@@ -0,0 +1 @@
+!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],n):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_br=n(e.dayjs)}(this,(function(e){"use strict";function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var u=n(e);function r(e){return e>9?r(e%10):e}function t(e,n,u){return e+" "+function(e,n){return 2===n?function(e){return{m:"v",b:"v",d:"z"}[e.charAt(0)]+e.substring(1)}(e):e}({mm:"munutenn",MM:"miz",dd:"devezh"}[u],e)}var o={name:"br",weekdays:"Sul_Lun_Meurzh_Mercʼher_Yaou_Gwener_Sadorn".split("_"),months:"Genver_Cʼhwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),weekStart:1,weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),monthsShort:"Gen_Cʼhwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),ordinal:function(e){return e},formats:{LT:"h[e]mm A",LTS:"h[e]mm:ss A",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY h[e]mm A",LLLL:"dddd, D [a viz] MMMM YYYY h[e]mm A"},relativeTime:{future:"a-benn %s",past:"%s ʼzo",s:"un nebeud segondennoù",m:"ur vunutenn",mm:t,h:"un eur",hh:"%d eur",d:"un devezh",dd:t,M:"ur miz",MM:t,y:"ur bloaz",yy:function(e){switch(r(e)){case 1:case 3:case 4:case 5:case 9:return e+" bloaz";default:return e+" vloaz"}}},meridiem:function(e){return e<12?"a.m.":"g.m."}};return u.default.locale(o,null,!0),o}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/bs.js b/node_modules/dayjs/locale/bs.js
new file mode 100644
index 0000000..25dcd6d
--- /dev/null
+++ b/node_modules/dayjs/locale/bs.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_bs=t(e.dayjs)}(this,(function(e){"use strict";function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var _=t(e),a={name:"bs",weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),months:"januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar".split("_"),weekStart:1,weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),ordinal:function(e){return e},formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"}};return _.default.locale(a,null,!0),a}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/ca.js b/node_modules/dayjs/locale/ca.js
new file mode 100644
index 0000000..1614cc2
--- /dev/null
+++ b/node_modules/dayjs/locale/ca.js
@@ -0,0 +1 @@
+!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?module.exports=s(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],s):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_ca=s(e.dayjs)}(this,(function(e){"use strict";function s(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=s(e),_={name:"ca",weekdays:"Diumenge_Dilluns_Dimarts_Dimecres_Dijous_Divendres_Dissabte".split("_"),weekdaysShort:"Dg._Dl._Dt._Dc._Dj._Dv._Ds.".split("_"),weekdaysMin:"Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"),months:"Gener_Febrer_Març_Abril_Maig_Juny_Juliol_Agost_Setembre_Octubre_Novembre_Desembre".split("_"),monthsShort:"Gen._Febr._Març_Abr._Maig_Juny_Jul._Ag._Set._Oct._Nov._Des.".split("_"),weekStart:1,formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",LLL:"D MMMM [de] YYYY [a les] H:mm",LLLL:"dddd D MMMM [de] YYYY [a les] H:mm",ll:"D MMM YYYY",lll:"D MMM YYYY, H:mm",llll:"ddd D MMM YYYY, H:mm"},relativeTime:{future:"d'aquí %s",past:"fa %s",s:"uns segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},ordinal:function(e){return""+e+(1===e||3===e?"r":2===e?"n":4===e?"t":"è")}};return t.default.locale(_,null,!0),_}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/cs.js b/node_modules/dayjs/locale/cs.js
new file mode 100644
index 0000000..43bddb9
--- /dev/null
+++ b/node_modules/dayjs/locale/cs.js
@@ -0,0 +1 @@
+!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],n):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_cs=n(e.dayjs)}(this,(function(e){"use strict";function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=n(e);function s(e){return e>1&&e<5&&1!=~~(e/10)}function r(e,n,t,r){var d=e+" ";switch(t){case"s":return n||r?"pár sekund":"pár sekundami";case"m":return n?"minuta":r?"minutu":"minutou";case"mm":return n||r?d+(s(e)?"minuty":"minut"):d+"minutami";case"h":return n?"hodina":r?"hodinu":"hodinou";case"hh":return n||r?d+(s(e)?"hodiny":"hodin"):d+"hodinami";case"d":return n||r?"den":"dnem";case"dd":return n||r?d+(s(e)?"dny":"dní"):d+"dny";case"M":return n||r?"měsíc":"měsícem";case"MM":return n||r?d+(s(e)?"měsíce":"měsíců"):d+"měsíci";case"y":return n||r?"rok":"rokem";case"yy":return n||r?d+(s(e)?"roky":"let"):d+"lety"}}var d={name:"cs",weekdays:"neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota".split("_"),weekdaysShort:"ne_po_út_st_čt_pá_so".split("_"),weekdaysMin:"ne_po_út_st_čt_pá_so".split("_"),months:"leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec".split("_"),monthsShort:"led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro".split("_"),weekStart:1,yearStart:4,ordinal:function(e){return e+"."},formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm",l:"D. M. YYYY"},relativeTime:{future:"za %s",past:"před %s",s:r,m:r,mm:r,h:r,hh:r,d:r,dd:r,M:r,MM:r,y:r,yy:r}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/cv.js b/node_modules/dayjs/locale/cv.js
new file mode 100644
index 0000000..a30efe0
--- /dev/null
+++ b/node_modules/dayjs/locale/cv.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_cv=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),n={name:"cv",weekdays:"вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун".split("_"),months:"кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав".split("_"),weekStart:1,weekdaysShort:"выр_тун_ытл_юн_кӗҫ_эрн_шӑм".split("_"),monthsShort:"кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш".split("_"),weekdaysMin:"вр_тн_ыт_юн_кҫ_эр_шм".split("_"),ordinal:function(_){return _},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]",LLL:"YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm",LLLL:"dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm"}};return t.default.locale(n,null,!0),n}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/cy.js b/node_modules/dayjs/locale/cy.js
new file mode 100644
index 0000000..ee1910f
--- /dev/null
+++ b/node_modules/dayjs/locale/cy.js
@@ -0,0 +1 @@
+!function(d,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(d="undefined"!=typeof globalThis?globalThis:d||self).dayjs_locale_cy=e(d.dayjs)}(this,(function(d){"use strict";function e(d){return d&&"object"==typeof d&&"default"in d?d:{default:d}}var _=e(d),a={name:"cy",weekdays:"Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),months:"Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),weekStart:1,weekdaysShort:"Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),monthsShort:"Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),weekdaysMin:"Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),ordinal:function(d){return d},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},relativeTime:{future:"mewn %s",past:"%s yn ôl",s:"ychydig eiliadau",m:"munud",mm:"%d munud",h:"awr",hh:"%d awr",d:"diwrnod",dd:"%d diwrnod",M:"mis",MM:"%d mis",y:"blwyddyn",yy:"%d flynedd"}};return _.default.locale(a,null,!0),a}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/da.js b/node_modules/dayjs/locale/da.js
new file mode 100644
index 0000000..fd45a45
--- /dev/null
+++ b/node_modules/dayjs/locale/da.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_da=t(e.dayjs)}(this,(function(e){"use strict";function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var d=t(e),n={name:"da",weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn._man._tirs._ons._tors._fre._lør.".split("_"),weekdaysMin:"sø._ma._ti._on._to._fr._lø.".split("_"),months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj_juni_juli_aug._sept._okt._nov._dec.".split("_"),weekStart:1,ordinal:function(e){return e+"."},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd [d.] D. MMMM YYYY [kl.] HH:mm"},relativeTime:{future:"om %s",past:"%s siden",s:"få sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en måned",MM:"%d måneder",y:"et år",yy:"%d år"}};return d.default.locale(n,null,!0),n}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/de-at.js b/node_modules/dayjs/locale/de-at.js
new file mode 100644
index 0000000..ca51ef5
--- /dev/null
+++ b/node_modules/dayjs/locale/de-at.js
@@ -0,0 +1 @@
+!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],n):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_de_at=n(e.dayjs)}(this,(function(e){"use strict";function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=n(e),i={s:"ein paar Sekunden",m:["eine Minute","einer Minute"],mm:"%d Minuten",h:["eine Stunde","einer Stunde"],hh:"%d Stunden",d:["ein Tag","einem Tag"],dd:["%d Tage","%d Tagen"],M:["ein Monat","einem Monat"],MM:["%d Monate","%d Monaten"],y:["ein Jahr","einem Jahr"],yy:["%d Jahre","%d Jahren"]};function a(e,n,t){var a=i[t];return Array.isArray(a)&&(a=a[n?0:1]),a.replace("%d",e)}var r={name:"de-at",weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),months:"Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jän._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),ordinal:function(e){return e+"."},weekStart:1,formats:{LTS:"HH:mm:ss",LT:"HH:mm",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},relativeTime:{future:"in %s",past:"vor %s",s:a,m:a,mm:a,h:a,hh:a,d:a,dd:a,M:a,MM:a,y:a,yy:a}};return t.default.locale(r,null,!0),r}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/de-ch.js b/node_modules/dayjs/locale/de-ch.js
new file mode 100644
index 0000000..3fef218
--- /dev/null
+++ b/node_modules/dayjs/locale/de-ch.js
@@ -0,0 +1 @@
+!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],n):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_de_ch=n(e.dayjs)}(this,(function(e){"use strict";function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=n(e),a={s:"ein paar Sekunden",m:["eine Minute","einer Minute"],mm:"%d Minuten",h:["eine Stunde","einer Stunde"],hh:"%d Stunden",d:["ein Tag","einem Tag"],dd:["%d Tage","%d Tagen"],M:["ein Monat","einem Monat"],MM:["%d Monate","%d Monaten"],y:["ein Jahr","einem Jahr"],yy:["%d Jahre","%d Jahren"]};function i(e,n,t){var i=a[t];return Array.isArray(i)&&(i=i[n?0:1]),i.replace("%d",e)}var r={name:"de-ch",weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),ordinal:function(e){return e+"."},weekStart:1,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},relativeTime:{future:"in %s",past:"vor %s",s:i,m:i,mm:i,h:i,hh:i,d:i,dd:i,M:i,MM:i,y:i,yy:i}};return t.default.locale(r,null,!0),r}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/de.js b/node_modules/dayjs/locale/de.js
new file mode 100644
index 0000000..35f05ec
--- /dev/null
+++ b/node_modules/dayjs/locale/de.js
@@ -0,0 +1 @@
+!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],n):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_de=n(e.dayjs)}(this,(function(e){"use strict";function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=n(e),a={s:"ein paar Sekunden",m:["eine Minute","einer Minute"],mm:"%d Minuten",h:["eine Stunde","einer Stunde"],hh:"%d Stunden",d:["ein Tag","einem Tag"],dd:["%d Tage","%d Tagen"],M:["ein Monat","einem Monat"],MM:["%d Monate","%d Monaten"],y:["ein Jahr","einem Jahr"],yy:["%d Jahre","%d Jahren"]};function i(e,n,t){var i=a[t];return Array.isArray(i)&&(i=i[n?0:1]),i.replace("%d",e)}var r={name:"de",weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sept._Okt._Nov._Dez.".split("_"),ordinal:function(e){return e+"."},weekStart:1,yearStart:4,formats:{LTS:"HH:mm:ss",LT:"HH:mm",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},relativeTime:{future:"in %s",past:"vor %s",s:i,m:i,mm:i,h:i,hh:i,d:i,dd:i,M:i,MM:i,y:i,yy:i}};return t.default.locale(r,null,!0),r}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/dv.js b/node_modules/dayjs/locale/dv.js
new file mode 100644
index 0000000..b0bd8f9
--- /dev/null
+++ b/node_modules/dayjs/locale/dv.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_dv=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),d={name:"dv",weekdays:"އާދިއްތަ_ހޯމަ_އަންގާރަ_ބުދަ_ބުރާސްފަތި_ހުކުރު_ހޮނިހިރު".split("_"),months:"ޖެނުއަރީ_ފެބްރުއަރީ_މާރިޗު_އޭޕްރީލު_މޭ_ޖޫން_ޖުލައި_އޯގަސްޓު_ސެޕްޓެމްބަރު_އޮކްޓޯބަރު_ނޮވެމްބަރު_ޑިސެމްބަރު".split("_"),weekStart:7,weekdaysShort:"އާދިއްތަ_ހޯމަ_އަންގާރަ_ބުދަ_ބުރާސްފަތި_ހުކުރު_ހޮނިހިރު".split("_"),monthsShort:"ޖެނުއަރީ_ފެބްރުއަރީ_މާރިޗު_އޭޕްރީލު_މޭ_ޖޫން_ޖުލައި_އޯގަސްޓު_ސެޕްޓެމްބަރު_އޮކްޓޯބަރު_ނޮވެމްބަރު_ޑިސެމްބަރު".split("_"),weekdaysMin:"އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި".split("_"),ordinal:function(_){return _},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/M/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},relativeTime:{future:"ތެރޭގައި %s",past:"ކުރިން %s",s:"ސިކުންތުކޮޅެއް",m:"މިނިޓެއް",mm:"މިނިޓު %d",h:"ގަޑިއިރެއް",hh:"ގަޑިއިރު %d",d:"ދުވަހެއް",dd:"ދުވަސް %d",M:"މަހެއް",MM:"މަސް %d",y:"އަހަރެއް",yy:"އަހަރު %d"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/el.js b/node_modules/dayjs/locale/el.js
new file mode 100644
index 0000000..1488034
--- /dev/null
+++ b/node_modules/dayjs/locale/el.js
@@ -0,0 +1 @@
+!function(e,_){"object"==typeof exports&&"undefined"!=typeof module?module.exports=_(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],_):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_el=_(e.dayjs)}(this,(function(e){"use strict";function _(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=_(e),d={name:"el",weekdays:"Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο".split("_"),weekdaysShort:"Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ".split("_"),weekdaysMin:"Κυ_Δε_Τρ_Τε_Πε_Πα_Σα".split("_"),months:"Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος".split("_"),monthsShort:"Ιαν_Φεβ_Μαρ_Απρ_Μαι_Ιουν_Ιουλ_Αυγ_Σεπτ_Οκτ_Νοε_Δεκ".split("_"),ordinal:function(e){return e},weekStart:1,relativeTime:{future:"σε %s",past:"πριν %s",s:"μερικά δευτερόλεπτα",m:"ένα λεπτό",mm:"%d λεπτά",h:"μία ώρα",hh:"%d ώρες",d:"μία μέρα",dd:"%d μέρες",M:"ένα μήνα",MM:"%d μήνες",y:"ένα χρόνο",yy:"%d χρόνια"},formats:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/en-au.js b/node_modules/dayjs/locale/en-au.js
new file mode 100644
index 0000000..b952cdb
--- /dev/null
+++ b/node_modules/dayjs/locale/en-au.js
@@ -0,0 +1 @@
+!function(e,a){"object"==typeof exports&&"undefined"!=typeof module?module.exports=a(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],a):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_en_au=a(e.dayjs)}(this,(function(e){"use strict";function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=a(e),_={name:"en-au",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),weekStart:1,weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),ordinal:function(e){return e},formats:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"}};return t.default.locale(_,null,!0),_}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/en-ca.js b/node_modules/dayjs/locale/en-ca.js
new file mode 100644
index 0000000..bf76621
--- /dev/null
+++ b/node_modules/dayjs/locale/en-ca.js
@@ -0,0 +1 @@
+!function(e,a){"object"==typeof exports&&"undefined"!=typeof module?module.exports=a(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],a):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_en_ca=a(e.dayjs)}(this,(function(e){"use strict";function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var _=a(e),t={name:"en-ca",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),ordinal:function(e){return e},formats:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"}};return _.default.locale(t,null,!0),t}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/en-gb.js b/node_modules/dayjs/locale/en-gb.js
new file mode 100644
index 0000000..7fc7c3f
--- /dev/null
+++ b/node_modules/dayjs/locale/en-gb.js
@@ -0,0 +1 @@
+!function(e,a){"object"==typeof exports&&"undefined"!=typeof module?module.exports=a(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],a):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_en_gb=a(e.dayjs)}(this,(function(e){"use strict";function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=a(e),_={name:"en-gb",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekStart:1,yearStart:4,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},ordinal:function(e){var a=["th","st","nd","rd"],t=e%100;return"["+e+(a[(t-20)%10]||a[t]||a[0])+"]"}};return t.default.locale(_,null,!0),_}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/en-ie.js b/node_modules/dayjs/locale/en-ie.js
new file mode 100644
index 0000000..b0ad3f9
--- /dev/null
+++ b/node_modules/dayjs/locale/en-ie.js
@@ -0,0 +1 @@
+!function(e,a){"object"==typeof exports&&"undefined"!=typeof module?module.exports=a(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],a):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_en_ie=a(e.dayjs)}(this,(function(e){"use strict";function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=a(e),_={name:"en-ie",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),weekStart:1,weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"}};return t.default.locale(_,null,!0),_}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/en-il.js b/node_modules/dayjs/locale/en-il.js
new file mode 100644
index 0000000..d8bea62
--- /dev/null
+++ b/node_modules/dayjs/locale/en-il.js
@@ -0,0 +1 @@
+!function(e,a){"object"==typeof exports&&"undefined"!=typeof module?module.exports=a(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],a):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_en_il=a(e.dayjs)}(this,(function(e){"use strict";function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var _=a(e),t={name:"en-il",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"}};return _.default.locale(t,null,!0),t}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/en-in.js b/node_modules/dayjs/locale/en-in.js
new file mode 100644
index 0000000..af8cff3
--- /dev/null
+++ b/node_modules/dayjs/locale/en-in.js
@@ -0,0 +1 @@
+!function(e,a){"object"==typeof exports&&"undefined"!=typeof module?module.exports=a(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],a):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_en_in=a(e.dayjs)}(this,(function(e){"use strict";function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=a(e),n={name:"en-in",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekStart:1,yearStart:4,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},ordinal:function(e){var a=["th","st","nd","rd"],t=e%100;return"["+e+(a[(t-20)%10]||a[t]||a[0])+"]"}};return t.default.locale(n,null,!0),n}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/en-nz.js b/node_modules/dayjs/locale/en-nz.js
new file mode 100644
index 0000000..058abbe
--- /dev/null
+++ b/node_modules/dayjs/locale/en-nz.js
@@ -0,0 +1 @@
+!function(e,a){"object"==typeof exports&&"undefined"!=typeof module?module.exports=a(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],a):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_en_nz=a(e.dayjs)}(this,(function(e){"use strict";function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=a(e),n={name:"en-nz",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),weekStart:1,weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),ordinal:function(e){var a=["th","st","nd","rd"],t=e%100;return"["+e+(a[(t-20)%10]||a[t]||a[0])+"]"},formats:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"}};return t.default.locale(n,null,!0),n}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/en-sg.js b/node_modules/dayjs/locale/en-sg.js
new file mode 100644
index 0000000..787fa84
--- /dev/null
+++ b/node_modules/dayjs/locale/en-sg.js
@@ -0,0 +1 @@
+!function(e,a){"object"==typeof exports&&"undefined"!=typeof module?module.exports=a(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],a):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_en_sg=a(e.dayjs)}(this,(function(e){"use strict";function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=a(e),_={name:"en-sg",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),weekStart:1,weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"}};return t.default.locale(_,null,!0),_}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/en-tt.js b/node_modules/dayjs/locale/en-tt.js
new file mode 100644
index 0000000..afc4d36
--- /dev/null
+++ b/node_modules/dayjs/locale/en-tt.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_en_tt=t(e.dayjs)}(this,(function(e){"use strict";function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=t(e),_={name:"en-tt",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekStart:1,yearStart:4,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},ordinal:function(e){var t=["th","st","nd","rd"],a=e%100;return"["+e+(t[(a-20)%10]||t[a]||t[0])+"]"}};return a.default.locale(_,null,!0),_}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/en.js b/node_modules/dayjs/locale/en.js
new file mode 100644
index 0000000..847cbfd
--- /dev/null
+++ b/node_modules/dayjs/locale/en.js
@@ -0,0 +1 @@
+!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_en=n()}(this,(function(){"use strict";return{name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(e){var n=["th","st","nd","rd"],t=e%100;return"["+e+(n[(t-20)%10]||n[t]||n[0])+"]"}}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/eo.js b/node_modules/dayjs/locale/eo.js
new file mode 100644
index 0000000..2dcbe01
--- /dev/null
+++ b/node_modules/dayjs/locale/eo.js
@@ -0,0 +1 @@
+!function(e,o){"object"==typeof exports&&"undefined"!=typeof module?module.exports=o(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],o):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_eo=o(e.dayjs)}(this,(function(e){"use strict";function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=o(e),t={name:"eo",weekdays:"dimanĉo_lundo_mardo_merkredo_ĵaŭdo_vendredo_sabato".split("_"),months:"januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro".split("_"),weekStart:1,weekdaysShort:"dim_lun_mard_merk_ĵaŭ_ven_sab".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aŭg_sep_okt_nov_dec".split("_"),weekdaysMin:"di_lu_ma_me_ĵa_ve_sa".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D[-a de] MMMM, YYYY",LLL:"D[-a de] MMMM, YYYY HH:mm",LLLL:"dddd, [la] D[-a de] MMMM, YYYY HH:mm"},relativeTime:{future:"post %s",past:"antaŭ %s",s:"sekundoj",m:"minuto",mm:"%d minutoj",h:"horo",hh:"%d horoj",d:"tago",dd:"%d tagoj",M:"monato",MM:"%d monatoj",y:"jaro",yy:"%d jaroj"}};return a.default.locale(t,null,!0),t}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/es-do.js b/node_modules/dayjs/locale/es-do.js
new file mode 100644
index 0000000..07907ad
--- /dev/null
+++ b/node_modules/dayjs/locale/es-do.js
@@ -0,0 +1 @@
+!function(e,o){"object"==typeof exports&&"undefined"!=typeof module?module.exports=o(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],o):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_es_do=o(e.dayjs)}(this,(function(e){"use strict";function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var s=o(e),d={name:"es-do",weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:"ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),weekStart:1,relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinal:function(e){return e+"º"},formats:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"}};return s.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/es-mx.js b/node_modules/dayjs/locale/es-mx.js
new file mode 100644
index 0000000..f865a2d
--- /dev/null
+++ b/node_modules/dayjs/locale/es-mx.js
@@ -0,0 +1 @@
+!function(e,o){"object"==typeof exports&&"undefined"!=typeof module?module.exports=o(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],o):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_es_mx=o(e.dayjs)}(this,(function(e){"use strict";function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var s=o(e),d={name:"es-mx",weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:"ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinal:function(e){return e+"º"},formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"}};return s.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/es-pr.js b/node_modules/dayjs/locale/es-pr.js
new file mode 100644
index 0000000..56fdeb4
--- /dev/null
+++ b/node_modules/dayjs/locale/es-pr.js
@@ -0,0 +1 @@
+!function(e,o){"object"==typeof exports&&"undefined"!=typeof module?module.exports=o(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],o):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_es_pr=o(e.dayjs)}(this,(function(e){"use strict";function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var s=o(e),d={name:"es-pr",monthsShort:"ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),weekStart:1,formats:{LT:"h:mm A",LTS:"h:mm:ss A",L:"MM/DD/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinal:function(e){return e+"º"}};return s.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/es-us.js b/node_modules/dayjs/locale/es-us.js
new file mode 100644
index 0000000..35f5535
--- /dev/null
+++ b/node_modules/dayjs/locale/es-us.js
@@ -0,0 +1 @@
+!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?module.exports=s(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],s):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_es_us=s(e.dayjs)}(this,(function(e){"use strict";function s(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var o=s(e),d={name:"es-us",weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:"ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinal:function(e){return e+"º"},formats:{LT:"h:mm A",LTS:"h:mm:ss A",L:"MM/DD/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"}};return o.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/es.js b/node_modules/dayjs/locale/es.js
new file mode 100644
index 0000000..eb33b81
--- /dev/null
+++ b/node_modules/dayjs/locale/es.js
@@ -0,0 +1 @@
+!function(e,o){"object"==typeof exports&&"undefined"!=typeof module?module.exports=o(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],o):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_es=o(e.dayjs)}(this,(function(e){"use strict";function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var s=o(e),d={name:"es",monthsShort:"ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),weekStart:1,formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinal:function(e){return e+"º"}};return s.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/et.js b/node_modules/dayjs/locale/et.js
new file mode 100644
index 0000000..4158d13
--- /dev/null
+++ b/node_modules/dayjs/locale/et.js
@@ -0,0 +1 @@
+!function(e,a){"object"==typeof exports&&"undefined"!=typeof module?module.exports=a(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],a):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_et=a(e.dayjs)}(this,(function(e){"use strict";function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=a(e);function u(e,a,t,u){var s={s:["mõne sekundi","mõni sekund","paar sekundit"],m:["ühe minuti","üks minut"],mm:["%d minuti","%d minutit"],h:["ühe tunni","tund aega","üks tund"],hh:["%d tunni","%d tundi"],d:["ühe päeva","üks päev"],M:["kuu aja","kuu aega","üks kuu"],MM:["%d kuu","%d kuud"],y:["ühe aasta","aasta","üks aasta"],yy:["%d aasta","%d aastat"]};return a?(s[t][2]?s[t][2]:s[t][1]).replace("%d",e):(u?s[t][0]:s[t][1]).replace("%d",e)}var s={name:"et",weekdays:"pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev".split("_"),weekdaysShort:"P_E_T_K_N_R_L".split("_"),weekdaysMin:"P_E_T_K_N_R_L".split("_"),months:"jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),monthsShort:"jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),ordinal:function(e){return e+"."},weekStart:1,relativeTime:{future:"%s pärast",past:"%s tagasi",s:u,m:u,mm:u,h:u,hh:u,d:u,dd:"%d päeva",M:u,MM:u,y:u,yy:u},formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"}};return t.default.locale(s,null,!0),s}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/eu.js b/node_modules/dayjs/locale/eu.js
new file mode 100644
index 0000000..ed8e228
--- /dev/null
+++ b/node_modules/dayjs/locale/eu.js
@@ -0,0 +1 @@
+!function(a,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(a="undefined"!=typeof globalThis?globalThis:a||self).dayjs_locale_eu=e(a.dayjs)}(this,(function(a){"use strict";function e(a){return a&&"object"==typeof a&&"default"in a?a:{default:a}}var t=e(a),l={name:"eu",weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),weekStart:1,weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),ordinal:function(a){return a},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] HH:mm",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] HH:mm",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] HH:mm",llll:"ddd, YYYY[ko] MMM D[a] HH:mm"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"}};return t.default.locale(l,null,!0),l}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/fa.js b/node_modules/dayjs/locale/fa.js
new file mode 100644
index 0000000..648bb4e
--- /dev/null
+++ b/node_modules/dayjs/locale/fa.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_fa=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),d={name:"fa",weekdays:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysShort:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysMin:"ی_د_س_چ_پ_ج_ش".split("_"),weekStart:6,months:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),monthsShort:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),ordinal:function(_){return _},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},relativeTime:{future:"در %s",past:"%s پیش",s:"چند ثانیه",m:"یک دقیقه",mm:"%d دقیقه",h:"یک ساعت",hh:"%d ساعت",d:"یک روز",dd:"%d روز",M:"یک ماه",MM:"%d ماه",y:"یک سال",yy:"%d سال"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/fi.js b/node_modules/dayjs/locale/fi.js
new file mode 100644
index 0000000..2681ebd
--- /dev/null
+++ b/node_modules/dayjs/locale/fi.js
@@ -0,0 +1 @@
+!function(u,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(u="undefined"!=typeof globalThis?globalThis:u||self).dayjs_locale_fi=e(u.dayjs)}(this,(function(u){"use strict";function e(u){return u&&"object"==typeof u&&"default"in u?u:{default:u}}var t=e(u);function n(u,e,t,n){var i={s:"muutama sekunti",m:"minuutti",mm:"%d minuuttia",h:"tunti",hh:"%d tuntia",d:"päivä",dd:"%d päivää",M:"kuukausi",MM:"%d kuukautta",y:"vuosi",yy:"%d vuotta",numbers:"nolla_yksi_kaksi_kolme_neljä_viisi_kuusi_seitsemän_kahdeksan_yhdeksän".split("_")},a={s:"muutaman sekunnin",m:"minuutin",mm:"%d minuutin",h:"tunnin",hh:"%d tunnin",d:"päivän",dd:"%d päivän",M:"kuukauden",MM:"%d kuukauden",y:"vuoden",yy:"%d vuoden",numbers:"nollan_yhden_kahden_kolmen_neljän_viiden_kuuden_seitsemän_kahdeksan_yhdeksän".split("_")},s=n&&!e?a:i,_=s[t];return u<10?_.replace("%d",s.numbers[u]):_.replace("%d",u)}var i={name:"fi",weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),ordinal:function(u){return u+"."},weekStart:1,yearStart:4,relativeTime:{future:"%s päästä",past:"%s sitten",s:n,m:n,mm:n,h:n,hh:n,d:n,dd:n,M:n,MM:n,y:n,yy:n},formats:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"D. MMMM[ta] YYYY",LLL:"D. MMMM[ta] YYYY, [klo] HH.mm",LLLL:"dddd, D. MMMM[ta] YYYY, [klo] HH.mm",l:"D.M.YYYY",ll:"D. MMM YYYY",lll:"D. MMM YYYY, [klo] HH.mm",llll:"ddd, D. MMM YYYY, [klo] HH.mm"}};return t.default.locale(i,null,!0),i}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/fo.js b/node_modules/dayjs/locale/fo.js
new file mode 100644
index 0000000..ff6f8d8
--- /dev/null
+++ b/node_modules/dayjs/locale/fo.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_fo=t(e.dayjs)}(this,(function(e){"use strict";function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=t(e),r={name:"fo",weekdays:"sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur".split("_"),months:"januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember".split("_"),weekStart:1,weekdaysShort:"sun_mán_týs_mik_hós_frí_ley".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdaysMin:"su_má_tý_mi_hó_fr_le".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D. MMMM, YYYY HH:mm"},relativeTime:{future:"um %s",past:"%s síðani",s:"fá sekund",m:"ein minuttur",mm:"%d minuttir",h:"ein tími",hh:"%d tímar",d:"ein dagur",dd:"%d dagar",M:"ein mánaður",MM:"%d mánaðir",y:"eitt ár",yy:"%d ár"}};return a.default.locale(r,null,!0),r}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/fr-ca.js b/node_modules/dayjs/locale/fr-ca.js
new file mode 100644
index 0000000..9cc0d03
--- /dev/null
+++ b/node_modules/dayjs/locale/fr-ca.js
@@ -0,0 +1 @@
+!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],n):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_fr_ca=n(e.dayjs)}(this,(function(e){"use strict";function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var i=n(e),_={name:"fr-ca",weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"}};return i.default.locale(_,null,!0),_}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/fr-ch.js b/node_modules/dayjs/locale/fr-ch.js
new file mode 100644
index 0000000..1308de9
--- /dev/null
+++ b/node_modules/dayjs/locale/fr-ch.js
@@ -0,0 +1 @@
+!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],n):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_fr_ch=n(e.dayjs)}(this,(function(e){"use strict";function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var i=n(e),_={name:"fr-ch",weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),weekStart:1,weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"}};return i.default.locale(_,null,!0),_}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/fr.js b/node_modules/dayjs/locale/fr.js
new file mode 100644
index 0000000..8c42be4
--- /dev/null
+++ b/node_modules/dayjs/locale/fr.js
@@ -0,0 +1 @@
+!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],n):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_fr=n(e.dayjs)}(this,(function(e){"use strict";function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=n(e),i={name:"fr",weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekStart:1,yearStart:4,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinal:function(e){return""+e+(1===e?"er":"")}};return t.default.locale(i,null,!0),i}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/fy.js b/node_modules/dayjs/locale/fy.js
new file mode 100644
index 0000000..291dd5f
--- /dev/null
+++ b/node_modules/dayjs/locale/fy.js
@@ -0,0 +1 @@
+!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],n):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_fy=n(e.dayjs)}(this,(function(e){"use strict";function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var i=n(e),t={name:"fy",weekdays:"snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon".split("_"),months:"jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber".split("_"),monthsShort:"jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.".split("_"),weekStart:1,weekdaysShort:"si._mo._ti._wo._to._fr._so.".split("_"),weekdaysMin:"Si_Mo_Ti_Wo_To_Fr_So".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},relativeTime:{future:"oer %s",past:"%s lyn",s:"in pear sekonden",m:"ien minút",mm:"%d minuten",h:"ien oere",hh:"%d oeren",d:"ien dei",dd:"%d dagen",M:"ien moanne",MM:"%d moannen",y:"ien jier",yy:"%d jierren"}};return i.default.locale(t,null,!0),t}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/ga.js b/node_modules/dayjs/locale/ga.js
new file mode 100644
index 0000000..0b2489f
--- /dev/null
+++ b/node_modules/dayjs/locale/ga.js
@@ -0,0 +1 @@
+!function(a,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(a="undefined"!=typeof globalThis?globalThis:a||self).dayjs_locale_ga=e(a.dayjs)}(this,(function(a){"use strict";function e(a){return a&&"object"==typeof a&&"default"in a?a:{default:a}}var i=e(a),n={name:"ga",weekdays:"Dé Domhnaigh_Dé Luain_Dé Máirt_Dé Céadaoin_Déardaoin_Dé hAoine_Dé Satharn".split("_"),months:"Eanáir_Feabhra_Márta_Aibreán_Bealtaine_Méitheamh_Iúil_Lúnasa_Meán Fómhair_Deaireadh Fómhair_Samhain_Nollaig".split("_"),weekStart:1,weekdaysShort:"Dom_Lua_Mái_Céa_Déa_hAo_Sat".split("_"),monthsShort:"Eaná_Feab_Márt_Aibr_Beal_Méit_Iúil_Lúna_Meán_Deai_Samh_Noll".split("_"),weekdaysMin:"Do_Lu_Má_Ce_Dé_hA_Sa".split("_"),ordinal:function(a){return a},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},relativeTime:{future:"i %s",past:"%s ó shin",s:"cúpla soicind",m:"nóiméad",mm:"%d nóiméad",h:"uair an chloig",hh:"%d uair an chloig",d:"lá",dd:"%d lá",M:"mí",MM:"%d mí",y:"bliain",yy:"%d bliain"}};return i.default.locale(n,null,!0),n}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/gd.js b/node_modules/dayjs/locale/gd.js
new file mode 100644
index 0000000..c7e47ab
--- /dev/null
+++ b/node_modules/dayjs/locale/gd.js
@@ -0,0 +1 @@
+!function(a,i){"object"==typeof exports&&"undefined"!=typeof module?module.exports=i(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],i):(a="undefined"!=typeof globalThis?globalThis:a||self).dayjs_locale_gd=i(a.dayjs)}(this,(function(a){"use strict";function i(a){return a&&"object"==typeof a&&"default"in a?a:{default:a}}var n=i(a),e={name:"gd",weekdays:"Didòmhnaich_Diluain_Dimàirt_Diciadain_Diardaoin_Dihaoine_Disathairne".split("_"),months:"Am Faoilleach_An Gearran_Am Màrt_An Giblean_An Cèitean_An t-Ògmhios_An t-Iuchar_An Lùnastal_An t-Sultain_An Dàmhair_An t-Samhain_An Dùbhlachd".split("_"),weekStart:1,weekdaysShort:"Did_Dil_Dim_Dic_Dia_Dih_Dis".split("_"),monthsShort:"Faoi_Gear_Màrt_Gibl_Cèit_Ògmh_Iuch_Lùn_Sult_Dàmh_Samh_Dùbh".split("_"),weekdaysMin:"Dò_Lu_Mà_Ci_Ar_Ha_Sa".split("_"),ordinal:function(a){return a},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},relativeTime:{future:"ann an %s",past:"bho chionn %s",s:"beagan diogan",m:"mionaid",mm:"%d mionaidean",h:"uair",hh:"%d uairean",d:"latha",dd:"%d latha",M:"mìos",MM:"%d mìosan",y:"bliadhna",yy:"%d bliadhna"}};return n.default.locale(e,null,!0),e}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/gl.js b/node_modules/dayjs/locale/gl.js
new file mode 100644
index 0000000..f5cf483
--- /dev/null
+++ b/node_modules/dayjs/locale/gl.js
@@ -0,0 +1 @@
+!function(e,o){"object"==typeof exports&&"undefined"!=typeof module?module.exports=o(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],o):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_gl=o(e.dayjs)}(this,(function(e){"use strict";function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var s=o(e),d={name:"gl",weekdays:"domingo_luns_martes_mércores_xoves_venres_sábado".split("_"),months:"xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro".split("_"),weekStart:1,weekdaysShort:"dom._lun._mar._mér._xov._ven._sáb.".split("_"),monthsShort:"xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.".split("_"),weekdaysMin:"do_lu_ma_mé_xo_ve_sá".split("_"),ordinal:function(e){return e+"º"},formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},relativeTime:{future:"en %s",past:"fai %s",s:"uns segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"}};return s.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/gom-latn.js b/node_modules/dayjs/locale/gom-latn.js
new file mode 100644
index 0000000..1596618
--- /dev/null
+++ b/node_modules/dayjs/locale/gom-latn.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_gom_latn=t(e.dayjs)}(this,(function(e){"use strict";function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=t(e),_={name:"gom-latn",weekdays:"Aitar_Somar_Mongllar_Budvar_Brestar_Sukrar_Son'var".split("_"),months:"Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr".split("_"),weekStart:1,weekdaysShort:"Ait._Som._Mon._Bud._Bre._Suk._Son.".split("_"),monthsShort:"Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.".split("_"),weekdaysMin:"Ai_Sm_Mo_Bu_Br_Su_Sn".split("_"),ordinal:function(e){return e},formats:{LT:"A h:mm [vazta]",LTS:"A h:mm:ss [vazta]",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY A h:mm [vazta]",LLLL:"dddd, MMMM[achea] Do, YYYY, A h:mm [vazta]",llll:"ddd, D MMM YYYY, A h:mm [vazta]"}};return a.default.locale(_,null,!0),_}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/gu.js b/node_modules/dayjs/locale/gu.js
new file mode 100644
index 0000000..f42a17c
--- /dev/null
+++ b/node_modules/dayjs/locale/gu.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_gu=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),d={name:"gu",weekdays:"રવિવાર_સોમવાર_મંગળવાર_બુધ્વાર_ગુરુવાર_શુક્રવાર_શનિવાર".split("_"),months:"જાન્યુઆરી_ફેબ્રુઆરી_માર્ચ_એપ્રિલ_મે_જૂન_જુલાઈ_ઑગસ્ટ_સપ્ટેમ્બર_ઑક્ટ્બર_નવેમ્બર_ડિસેમ્બર".split("_"),weekdaysShort:"રવિ_સોમ_મંગળ_બુધ્_ગુરુ_શુક્ર_શનિ".split("_"),monthsShort:"જાન્યુ._ફેબ્રુ._માર્ચ_એપ્રિ._મે_જૂન_જુલા._ઑગ._સપ્ટે._ઑક્ટ્._નવે._ડિસે.".split("_"),weekdaysMin:"ર_સો_મં_બુ_ગુ_શુ_શ".split("_"),ordinal:function(_){return _},formats:{LT:"A h:mm વાગ્યે",LTS:"A h:mm:ss વાગ્યે",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm વાગ્યે",LLLL:"dddd, D MMMM YYYY, A h:mm વાગ્યે"},relativeTime:{future:"%s મા",past:"%s પેહલા",s:"અમુક પળો",m:"એક મિનિટ",mm:"%d મિનિટ",h:"એક કલાક",hh:"%d કલાક",d:"એક દિવસ",dd:"%d દિવસ",M:"એક મહિનો",MM:"%d મહિનો",y:"એક વર્ષ",yy:"%d વર્ષ"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/he.js b/node_modules/dayjs/locale/he.js
new file mode 100644
index 0000000..3e4062e
--- /dev/null
+++ b/node_modules/dayjs/locale/he.js
@@ -0,0 +1 @@
+!function(Y,M){"object"==typeof exports&&"undefined"!=typeof module?module.exports=M(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],M):(Y="undefined"!=typeof globalThis?globalThis:Y||self).dayjs_locale_he=M(Y.dayjs)}(this,(function(Y){"use strict";function M(Y){return Y&&"object"==typeof Y&&"default"in Y?Y:{default:Y}}var d=M(Y),e={s:"מספר שניות",ss:"%d שניות",m:"דקה",mm:"%d דקות",h:"שעה",hh:"%d שעות",hh2:"שעתיים",d:"יום",dd:"%d ימים",dd2:"יומיים",M:"חודש",MM:"%d חודשים",MM2:"חודשיים",y:"שנה",yy:"%d שנים",yy2:"שנתיים"};function _(Y,M,d){return(e[d+(2===Y?"2":"")]||e[d]).replace("%d",Y)}var l={name:"he",weekdays:"ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),weekdaysShort:"א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),weekdaysMin:"א׳_ב׳_ג׳_ד׳_ה׳_ו_ש׳".split("_"),months:"ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר".split("_"),monthsShort:"ינו_פבר_מרץ_אפר_מאי_יונ_יול_אוג_ספט_אוק_נוב_דצמ".split("_"),relativeTime:{future:"בעוד %s",past:"לפני %s",s:_,m:_,mm:_,h:_,hh:_,d:_,dd:_,M:_,MM:_,y:_,yy:_},ordinal:function(Y){return Y},format:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [ב]MMMM YYYY",LLL:"D [ב]MMMM YYYY HH:mm",LLLL:"dddd, D [ב]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [ב]MMMM YYYY",LLL:"D [ב]MMMM YYYY HH:mm",LLLL:"dddd, D [ב]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"}};return d.default.locale(l,null,!0),l}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/hi.js b/node_modules/dayjs/locale/hi.js
new file mode 100644
index 0000000..9dca3cf
--- /dev/null
+++ b/node_modules/dayjs/locale/hi.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_hi=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),d={name:"hi",weekdays:"रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार".split("_"),months:"जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर".split("_"),weekdaysShort:"रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि".split("_"),monthsShort:"जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.".split("_"),weekdaysMin:"र_सो_मं_बु_गु_शु_श".split("_"),ordinal:function(_){return _},formats:{LT:"A h:mm बजे",LTS:"A h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm बजे",LLLL:"dddd, D MMMM YYYY, A h:mm बजे"},relativeTime:{future:"%s में",past:"%s पहले",s:"कुछ ही क्षण",m:"एक मिनट",mm:"%d मिनट",h:"एक घंटा",hh:"%d घंटे",d:"एक दिन",dd:"%d दिन",M:"एक महीने",MM:"%d महीने",y:"एक वर्ष",yy:"%d वर्ष"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/hr.js b/node_modules/dayjs/locale/hr.js
new file mode 100644
index 0000000..12e8387
--- /dev/null
+++ b/node_modules/dayjs/locale/hr.js
@@ -0,0 +1 @@
+!function(e,a){"object"==typeof exports&&"undefined"!=typeof module?module.exports=a(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],a):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_hr=a(e.dayjs)}(this,(function(e){"use strict";function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=a(e),s="siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca".split("_"),n="siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_"),_=/D[oD]?(\[[^[\]]*\]|\s)+MMMM?/,o=function(e,a){return _.test(a)?s[e.month()]:n[e.month()]};o.s=n,o.f=s;var i={name:"hr",weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),months:o,monthsShort:"sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),weekStart:1,formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},relativeTime:{future:"za %s",past:"prije %s",s:"sekunda",m:"minuta",mm:"%d minuta",h:"sat",hh:"%d sati",d:"dan",dd:"%d dana",M:"mjesec",MM:"%d mjeseci",y:"godina",yy:"%d godine"},ordinal:function(e){return e+"."}};return t.default.locale(i,null,!0),i}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/ht.js b/node_modules/dayjs/locale/ht.js
new file mode 100644
index 0000000..3b2d9a3
--- /dev/null
+++ b/node_modules/dayjs/locale/ht.js
@@ -0,0 +1 @@
+!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],n):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_ht=n(e.dayjs)}(this,(function(e){"use strict";function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var d=n(e),a={name:"ht",weekdays:"dimanch_lendi_madi_mèkredi_jedi_vandredi_samdi".split("_"),months:"janvye_fevriye_mas_avril_me_jen_jiyè_out_septanm_oktòb_novanm_desanm".split("_"),weekdaysShort:"dim._len._mad._mèk._jed._van._sam.".split("_"),monthsShort:"jan._fev._mas_avr._me_jen_jiyè._out_sept._okt._nov._des.".split("_"),weekdaysMin:"di_le_ma_mè_je_va_sa".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},relativeTime:{future:"nan %s",past:"sa gen %s",s:"kèk segond",m:"yon minit",mm:"%d minit",h:"inèdtan",hh:"%d zè",d:"yon jou",dd:"%d jou",M:"yon mwa",MM:"%d mwa",y:"yon ane",yy:"%d ane"}};return d.default.locale(a,null,!0),a}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/hu.js b/node_modules/dayjs/locale/hu.js
new file mode 100644
index 0000000..e2aff04
--- /dev/null
+++ b/node_modules/dayjs/locale/hu.js
@@ -0,0 +1 @@
+!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],n):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_hu=n(e.dayjs)}(this,(function(e){"use strict";function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=n(e),r={name:"hu",weekdays:"vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),ordinal:function(e){return e+"."},weekStart:1,relativeTime:{future:"%s múlva",past:"%s",s:function(e,n,t,r){return"néhány másodperc"+(r||n?"":"e")},m:function(e,n,t,r){return"egy perc"+(r||n?"":"e")},mm:function(e,n,t,r){return e+" perc"+(r||n?"":"e")},h:function(e,n,t,r){return"egy "+(r||n?"óra":"órája")},hh:function(e,n,t,r){return e+" "+(r||n?"óra":"órája")},d:function(e,n,t,r){return"egy "+(r||n?"nap":"napja")},dd:function(e,n,t,r){return e+" "+(r||n?"nap":"napja")},M:function(e,n,t,r){return"egy "+(r||n?"hónap":"hónapja")},MM:function(e,n,t,r){return e+" "+(r||n?"hónap":"hónapja")},y:function(e,n,t,r){return"egy "+(r||n?"év":"éve")},yy:function(e,n,t,r){return e+" "+(r||n?"év":"éve")}},formats:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D. H:mm",LLLL:"YYYY. MMMM D., dddd H:mm"}};return t.default.locale(r,null,!0),r}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/hy-am.js b/node_modules/dayjs/locale/hy-am.js
new file mode 100644
index 0000000..44daa15
--- /dev/null
+++ b/node_modules/dayjs/locale/hy-am.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_hy_am=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),d={name:"hy-am",weekdays:"կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ".split("_"),months:"հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի".split("_"),weekStart:1,weekdaysShort:"կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ".split("_"),monthsShort:"հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ".split("_"),weekdaysMin:"կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ".split("_"),ordinal:function(_){return _},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY թ.",LLL:"D MMMM YYYY թ., HH:mm",LLLL:"dddd, D MMMM YYYY թ., HH:mm"},relativeTime:{future:"%s հետո",past:"%s առաջ",s:"մի քանի վայրկյան",m:"րոպե",mm:"%d րոպե",h:"ժամ",hh:"%d ժամ",d:"օր",dd:"%d օր",M:"ամիս",MM:"%d ամիս",y:"տարի",yy:"%d տարի"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/id.js b/node_modules/dayjs/locale/id.js
new file mode 100644
index 0000000..0637a65
--- /dev/null
+++ b/node_modules/dayjs/locale/id.js
@@ -0,0 +1 @@
+!function(e,a){"object"==typeof exports&&"undefined"!=typeof module?module.exports=a(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],a):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_id=a(e.dayjs)}(this,(function(e){"use strict";function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=a(e),_={name:"id",weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),weekStart:1,formats:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},ordinal:function(e){return e+"."}};return t.default.locale(_,null,!0),_}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/index.d.ts b/node_modules/dayjs/locale/index.d.ts
new file mode 100644
index 0000000..bd2dca2
--- /dev/null
+++ b/node_modules/dayjs/locale/index.d.ts
@@ -0,0 +1,11 @@
+/// <reference path="./types.d.ts" />
+
+declare module 'dayjs/locale/*' {
+  namespace locale {
+    interface Locale extends ILocale {}
+  }
+
+  const locale: locale.Locale
+
+  export = locale
+}
diff --git a/node_modules/dayjs/locale/is.js b/node_modules/dayjs/locale/is.js
new file mode 100644
index 0000000..de6799b
--- /dev/null
+++ b/node_modules/dayjs/locale/is.js
@@ -0,0 +1 @@
+!function(u,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],r):(u="undefined"!=typeof globalThis?globalThis:u||self).dayjs_locale_is=r(u.dayjs)}(this,(function(u){"use strict";function r(u){return u&&"object"==typeof u&&"default"in u?u:{default:u}}var n=r(u),e={s:["nokkrar sekúndur","nokkrar sekúndur","nokkrum sekúndum"],m:["mínúta","mínútu","mínútu"],mm:["mínútur","mínútur","mínútum"],h:["klukkustund","klukkustund","klukkustund"],hh:["klukkustundir","klukkustundir","klukkustundum"],d:["dagur","dag","degi"],dd:["dagar","daga","dögum"],M:["mánuður","mánuð","mánuði"],MM:["mánuðir","mánuði","mánuðum"],y:["ár","ár","ári"],yy:["ár","ár","árum"]};function t(u,r,n,t){var a=function(u,r,n,t){var a=t?0:n?1:2,d=2===u.length&&r%10==1?u[0]:u,m=e[d][a];return 1===u.length?m:"%d "+m}(n,u,t,r);return a.replace("%d",u)}var a={name:"is",weekdays:"sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),months:"janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),weekStart:1,weekdaysShort:"sun_mán_þri_mið_fim_fös_lau".split("_"),monthsShort:"jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),weekdaysMin:"Su_Má_Þr_Mi_Fi_Fö_La".split("_"),ordinal:function(u){return u},formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd, D. MMMM YYYY [kl.] H:mm"},relativeTime:{future:"eftir %s",past:"fyrir %s síðan",s:t,m:t,mm:t,h:t,hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t}};return n.default.locale(a,null,!0),a}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/it-ch.js b/node_modules/dayjs/locale/it-ch.js
new file mode 100644
index 0000000..7e1c92f
--- /dev/null
+++ b/node_modules/dayjs/locale/it-ch.js
@@ -0,0 +1 @@
+!function(e,o){"object"==typeof exports&&"undefined"!=typeof module?module.exports=o(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],o):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_it_ch=o(e.dayjs)}(this,(function(e){"use strict";function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=o(e),t={name:"it-ch",weekdays:"domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato".split("_"),months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),weekStart:1,weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},relativeTime:{future:"tra %s",past:"%s fa",s:"alcuni secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"}};return n.default.locale(t,null,!0),t}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/it.js b/node_modules/dayjs/locale/it.js
new file mode 100644
index 0000000..2ddf44b
--- /dev/null
+++ b/node_modules/dayjs/locale/it.js
@@ -0,0 +1 @@
+!function(e,o){"object"==typeof exports&&"undefined"!=typeof module?module.exports=o(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],o):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_it=o(e.dayjs)}(this,(function(e){"use strict";function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=o(e),n={name:"it",weekdays:"domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),weekStart:1,monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},relativeTime:{future:"tra %s",past:"%s fa",s:"qualche secondo",m:"un minuto",mm:"%d minuti",h:"un' ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},ordinal:function(e){return e+"º"}};return t.default.locale(n,null,!0),n}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/ja.js b/node_modules/dayjs/locale/ja.js
new file mode 100644
index 0000000..cd52f36
--- /dev/null
+++ b/node_modules/dayjs/locale/ja.js
@@ -0,0 +1 @@
+!function(e,_){"object"==typeof exports&&"undefined"!=typeof module?module.exports=_(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],_):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_ja=_(e.dayjs)}(this,(function(e){"use strict";function _(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=_(e),d={name:"ja",weekdays:"日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"日_月_火_水_木_金_土".split("_"),weekdaysMin:"日_月_火_水_木_金_土".split("_"),months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),ordinal:function(e){return e+"日"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日 HH:mm",LLLL:"YYYY年M月D日 dddd HH:mm",l:"YYYY/MM/DD",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日(ddd) HH:mm"},meridiem:function(e){return e<12?"午前":"午後"},relativeTime:{future:"%s後",past:"%s前",s:"数秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1日",dd:"%d日",M:"1ヶ月",MM:"%dヶ月",y:"1年",yy:"%d年"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/jv.js b/node_modules/dayjs/locale/jv.js
new file mode 100644
index 0000000..7566308
--- /dev/null
+++ b/node_modules/dayjs/locale/jv.js
@@ -0,0 +1 @@
+!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],n):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_jv=n(e.dayjs)}(this,(function(e){"use strict";function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=n(e),_={name:"jv",weekdays:"Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu".split("_"),months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember".split("_"),weekStart:1,weekdaysShort:"Min_Sen_Sel_Reb_Kem_Jem_Sep".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sp".split("_"),ordinal:function(e){return e},formats:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},relativeTime:{future:"wonten ing %s",past:"%s ingkang kepengker",s:"sawetawis detik",m:"setunggal menit",mm:"%d menit",h:"setunggal jam",hh:"%d jam",d:"sedinten",dd:"%d dinten",M:"sewulan",MM:"%d wulan",y:"setaun",yy:"%d taun"}};return t.default.locale(_,null,!0),_}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/ka.js b/node_modules/dayjs/locale/ka.js
new file mode 100644
index 0000000..7b2ce53
--- /dev/null
+++ b/node_modules/dayjs/locale/ka.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_ka=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),d={name:"ka",weekdays:"კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი".split("_"),weekdaysShort:"კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ".split("_"),weekdaysMin:"კვ_ორ_სა_ოთ_ხუ_პა_შა".split("_"),months:"იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი".split("_"),monthsShort:"იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ".split("_"),weekStart:1,formats:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},relativeTime:{future:"%s შემდეგ",past:"%s წინ",s:"წამი",m:"წუთი",mm:"%d წუთი",h:"საათი",hh:"%d საათის",d:"დღეს",dd:"%d დღის განმავლობაში",M:"თვის",MM:"%d თვის",y:"წელი",yy:"%d წლის"},ordinal:function(_){return _}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/kk.js b/node_modules/dayjs/locale/kk.js
new file mode 100644
index 0000000..a2f17a3
--- /dev/null
+++ b/node_modules/dayjs/locale/kk.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_kk=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),d={name:"kk",weekdays:"жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі".split("_"),weekdaysShort:"жек_дүй_сей_сәр_бей_жұм_сен".split("_"),weekdaysMin:"жк_дй_сй_ср_бй_жм_сн".split("_"),months:"қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан".split("_"),monthsShort:"қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел".split("_"),weekStart:1,relativeTime:{future:"%s ішінде",past:"%s бұрын",s:"бірнеше секунд",m:"бір минут",mm:"%d минут",h:"бір сағат",hh:"%d сағат",d:"бір күн",dd:"%d күн",M:"бір ай",MM:"%d ай",y:"бір жыл",yy:"%d жыл"},ordinal:function(_){return _},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/km.js b/node_modules/dayjs/locale/km.js
new file mode 100644
index 0000000..528923e
--- /dev/null
+++ b/node_modules/dayjs/locale/km.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_km=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),d={name:"km",weekdays:"អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍".split("_"),months:"មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ".split("_"),weekStart:1,weekdaysShort:"អា_ច_អ_ព_ព្រ_សុ_ស".split("_"),monthsShort:"មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ".split("_"),weekdaysMin:"អា_ច_អ_ព_ព្រ_សុ_ស".split("_"),ordinal:function(_){return _},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},relativeTime:{future:"%sទៀត",past:"%sមុន",s:"ប៉ុន្មានវិនាទី",m:"មួយនាទី",mm:"%d នាទី",h:"មួយម៉ោង",hh:"%d ម៉ោង",d:"មួយថ្ងៃ",dd:"%d ថ្ងៃ",M:"មួយខែ",MM:"%d ខែ",y:"មួយឆ្នាំ",yy:"%d ឆ្នាំ"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/kn.js b/node_modules/dayjs/locale/kn.js
new file mode 100644
index 0000000..e040eba
--- /dev/null
+++ b/node_modules/dayjs/locale/kn.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_kn=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),d={name:"kn",weekdays:"ಭಾನುವಾರ_ಸೋಮವಾರ_ಮಂಗಳವಾರ_ಬುಧವಾರ_ಗುರುವಾರ_ಶುಕ್ರವಾರ_ಶನಿವಾರ".split("_"),months:"ಜನವರಿ_ಫೆಬ್ರವರಿ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂಬರ್_ಅಕ್ಟೋಬರ್_ನವೆಂಬರ್_ಡಿಸೆಂಬರ್".split("_"),weekdaysShort:"ಭಾನು_ಸೋಮ_ಮಂಗಳ_ಬುಧ_ಗುರು_ಶುಕ್ರ_ಶನಿ".split("_"),monthsShort:"ಜನ_ಫೆಬ್ರ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂ_ಅಕ್ಟೋ_ನವೆಂ_ಡಿಸೆಂ".split("_"),weekdaysMin:"ಭಾ_ಸೋ_ಮಂ_ಬು_ಗು_ಶು_ಶ".split("_"),ordinal:function(_){return _},formats:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},relativeTime:{future:"%s ನಂತರ",past:"%s ಹಿಂದೆ",s:"ಕೆಲವು ಕ್ಷಣಗಳು",m:"ಒಂದು ನಿಮಿಷ",mm:"%d ನಿಮಿಷ",h:"ಒಂದು ಗಂಟೆ",hh:"%d ಗಂಟೆ",d:"ಒಂದು ದಿನ",dd:"%d ದಿನ",M:"ಒಂದು ತಿಂಗಳು",MM:"%d ತಿಂಗಳು",y:"ಒಂದು ವರ್ಷ",yy:"%d ವರ್ಷ"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/ko.js b/node_modules/dayjs/locale/ko.js
new file mode 100644
index 0000000..cfe8b37
--- /dev/null
+++ b/node_modules/dayjs/locale/ko.js
@@ -0,0 +1 @@
+!function(e,_){"object"==typeof exports&&"undefined"!=typeof module?module.exports=_(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],_):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_ko=_(e.dayjs)}(this,(function(e){"use strict";function _(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var d=_(e),t={name:"ko",weekdays:"일요일_월요일_화요일_수요일_목요일_금요일_토요일".split("_"),weekdaysShort:"일_월_화_수_목_금_토".split("_"),weekdaysMin:"일_월_화_수_목_금_토".split("_"),months:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),monthsShort:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),ordinal:function(e){return e+"일"},formats:{LT:"A h:mm",LTS:"A h:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY년 MMMM D일",LLL:"YYYY년 MMMM D일 A h:mm",LLLL:"YYYY년 MMMM D일 dddd A h:mm",l:"YYYY.MM.DD.",ll:"YYYY년 MMMM D일",lll:"YYYY년 MMMM D일 A h:mm",llll:"YYYY년 MMMM D일 dddd A h:mm"},meridiem:function(e){return e<12?"오전":"오후"},relativeTime:{future:"%s 후",past:"%s 전",s:"몇 초",m:"1분",mm:"%d분",h:"한 시간",hh:"%d시간",d:"하루",dd:"%d일",M:"한 달",MM:"%d달",y:"일 년",yy:"%d년"}};return d.default.locale(t,null,!0),t}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/ku.js b/node_modules/dayjs/locale/ku.js
new file mode 100644
index 0000000..cd98fc2
--- /dev/null
+++ b/node_modules/dayjs/locale/ku.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("dayjs")):"function"==typeof define&&define.amd?define(["exports","dayjs"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_ku={},e.dayjs)}(this,(function(e,t){"use strict";function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var r=n(t),d={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},o={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"},u=["کانوونی دووەم","شوبات","ئادار","نیسان","ئایار","حوزەیران","تەممووز","ئاب","ئەیلوول","تشرینی یەکەم","تشرینی دووەم","کانوونی یەکەم"],i={name:"ku",months:u,monthsShort:u,weekdays:"یەکشەممە_دووشەممە_سێشەممە_چوارشەممە_پێنجشەممە_هەینی_شەممە".split("_"),weekdaysShort:"یەکشەم_دووشەم_سێشەم_چوارشەم_پێنجشەم_هەینی_شەممە".split("_"),weekStart:6,weekdaysMin:"ی_د_س_چ_پ_هـ_ش".split("_"),preparse:function(e){return e.replace(/[١٢٣٤٥٦٧٨٩٠]/g,(function(e){return o[e]})).replace(/،/g,",")},postformat:function(e){return e.replace(/\d/g,(function(e){return d[e]})).replace(/,/g,"،")},ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiem:function(e){return e<12?"پ.ن":"د.ن"},relativeTime:{future:"لە %s",past:"لەمەوپێش %s",s:"چەند چرکەیەک",m:"یەک خولەک",mm:"%d خولەک",h:"یەک کاتژمێر",hh:"%d کاتژمێر",d:"یەک ڕۆژ",dd:"%d ڕۆژ",M:"یەک مانگ",MM:"%d مانگ",y:"یەک ساڵ",yy:"%d ساڵ"}};r.default.locale(i,null,!0),e.default=i,e.englishToArabicNumbersMap=d,Object.defineProperty(e,"__esModule",{value:!0})}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/ky.js b/node_modules/dayjs/locale/ky.js
new file mode 100644
index 0000000..1fdc40e
--- /dev/null
+++ b/node_modules/dayjs/locale/ky.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_ky=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),d={name:"ky",weekdays:"Жекшемби_Дүйшөмбү_Шейшемби_Шаршемби_Бейшемби_Жума_Ишемби".split("_"),months:"январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_"),weekStart:1,weekdaysShort:"Жек_Дүй_Шей_Шар_Бей_Жум_Ише".split("_"),monthsShort:"янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек".split("_"),weekdaysMin:"Жк_Дй_Шй_Шр_Бй_Жм_Иш".split("_"),ordinal:function(_){return _},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},relativeTime:{future:"%s ичинде",past:"%s мурун",s:"бирнече секунд",m:"бир мүнөт",mm:"%d мүнөт",h:"бир саат",hh:"%d саат",d:"бир күн",dd:"%d күн",M:"бир ай",MM:"%d ай",y:"бир жыл",yy:"%d жыл"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/lb.js b/node_modules/dayjs/locale/lb.js
new file mode 100644
index 0000000..b6895f2
--- /dev/null
+++ b/node_modules/dayjs/locale/lb.js
@@ -0,0 +1 @@
+!function(e,_){"object"==typeof exports&&"undefined"!=typeof module?module.exports=_(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],_):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_lb=_(e.dayjs)}(this,(function(e){"use strict";function _(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=_(e),n={name:"lb",weekdays:"Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),months:"Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),weekStart:1,weekdaysShort:"So._Mé._Dë._Më._Do._Fr._Sa.".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdaysMin:"So_Mé_Dë_Më_Do_Fr_Sa".split("_"),ordinal:function(e){return e},formats:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm [Auer]",LLLL:"dddd, D. MMMM YYYY H:mm [Auer]"}};return t.default.locale(n,null,!0),n}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/lo.js b/node_modules/dayjs/locale/lo.js
new file mode 100644
index 0000000..1bf09d1
--- /dev/null
+++ b/node_modules/dayjs/locale/lo.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_lo=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),d={name:"lo",weekdays:"ອາທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ".split("_"),months:"ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ".split("_"),weekdaysShort:"ທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ".split("_"),monthsShort:"ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ".split("_"),weekdaysMin:"ທ_ຈ_ອຄ_ພ_ພຫ_ສກ_ສ".split("_"),ordinal:function(_){return _},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"ວັນdddd D MMMM YYYY HH:mm"},relativeTime:{future:"ອີກ %s",past:"%sຜ່ານມາ",s:"ບໍ່ເທົ່າໃດວິນາທີ",m:"1 ນາທີ",mm:"%d ນາທີ",h:"1 ຊົ່ວໂມງ",hh:"%d ຊົ່ວໂມງ",d:"1 ມື້",dd:"%d ມື້",M:"1 ເດືອນ",MM:"%d ເດືອນ",y:"1 ປີ",yy:"%d ປີ"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/lt.js b/node_modules/dayjs/locale/lt.js
new file mode 100644
index 0000000..52f2225
--- /dev/null
+++ b/node_modules/dayjs/locale/lt.js
@@ -0,0 +1 @@
+!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?module.exports=s(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],s):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_lt=s(e.dayjs)}(this,(function(e){"use strict";function s(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var i=s(e),d="sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio".split("_"),a="sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis".split("_"),l=/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/,M=function(e,s){return l.test(s)?d[e.month()]:a[e.month()]};M.s=a,M.f=d;var t={name:"lt",weekdays:"sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis".split("_"),weekdaysShort:"sek_pir_ant_tre_ket_pen_šeš".split("_"),weekdaysMin:"s_p_a_t_k_pn_š".split("_"),months:M,monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),ordinal:function(e){return e+"."},weekStart:1,relativeTime:{future:"už %s",past:"prieš %s",s:"kelias sekundes",m:"minutę",mm:"%d minutes",h:"valandą",hh:"%d valandas",d:"dieną",dd:"%d dienas",M:"mėnesį",MM:"%d mėnesius",y:"metus",yy:"%d metus"},format:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"}};return i.default.locale(t,null,!0),t}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/lv.js b/node_modules/dayjs/locale/lv.js
new file mode 100644
index 0000000..98fc126
--- /dev/null
+++ b/node_modules/dayjs/locale/lv.js
@@ -0,0 +1 @@
+!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?module.exports=s(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],s):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_lv=s(e.dayjs)}(this,(function(e){"use strict";function s(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=s(e),d={name:"lv",weekdays:"svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena".split("_"),months:"janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris".split("_"),weekStart:1,weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),monthsShort:"jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY.",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, HH:mm",LLLL:"YYYY. [gada] D. MMMM, dddd, HH:mm"},relativeTime:{future:"pēc %s",past:"pirms %s",s:"dažām sekundēm",m:"minūtes",mm:"%d minūtēm",h:"stundas",hh:"%d stundām",d:"dienas",dd:"%d dienām",M:"mēneša",MM:"%d mēnešiem",y:"gada",yy:"%d gadiem"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/me.js b/node_modules/dayjs/locale/me.js
new file mode 100644
index 0000000..ecb22ae
--- /dev/null
+++ b/node_modules/dayjs/locale/me.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_me=t(e.dayjs)}(this,(function(e){"use strict";function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var _=t(e),a={name:"me",weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),weekStart:1,weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),ordinal:function(e){return e},formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"}};return _.default.locale(a,null,!0),a}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/mi.js b/node_modules/dayjs/locale/mi.js
new file mode 100644
index 0000000..1b328f0
--- /dev/null
+++ b/node_modules/dayjs/locale/mi.js
@@ -0,0 +1 @@
+!function(e,a){"object"==typeof exports&&"undefined"!=typeof module?module.exports=a(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],a):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_mi=a(e.dayjs)}(this,(function(e){"use strict";function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var i=a(e),t={name:"mi",weekdays:"Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei".split("_"),months:"Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea".split("_"),weekStart:1,weekdaysShort:"Ta_Ma_Tū_We_Tāi_Pa_Hā".split("_"),monthsShort:"Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki".split("_"),weekdaysMin:"Ta_Ma_Tū_We_Tāi_Pa_Hā".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [i] HH:mm",LLLL:"dddd, D MMMM YYYY [i] HH:mm"},relativeTime:{future:"i roto i %s",past:"%s i mua",s:"te hēkona ruarua",m:"he meneti",mm:"%d meneti",h:"te haora",hh:"%d haora",d:"he ra",dd:"%d ra",M:"he marama",MM:"%d marama",y:"he tau",yy:"%d tau"}};return i.default.locale(t,null,!0),t}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/mk.js b/node_modules/dayjs/locale/mk.js
new file mode 100644
index 0000000..0f2ece1
--- /dev/null
+++ b/node_modules/dayjs/locale/mk.js
@@ -0,0 +1 @@
+!function(e,_){"object"==typeof exports&&"undefined"!=typeof module?module.exports=_(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],_):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_mk=_(e.dayjs)}(this,(function(e){"use strict";function _(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=_(e),d={name:"mk",weekdays:"недела_понеделник_вторник_среда_четврток_петок_сабота".split("_"),months:"јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември".split("_"),weekStart:1,weekdaysShort:"нед_пон_вто_сре_чет_пет_саб".split("_"),monthsShort:"јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек".split("_"),weekdaysMin:"нe_пo_вт_ср_че_пе_сa".split("_"),ordinal:function(e){return e},formats:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},relativeTime:{future:"после %s",past:"пред %s",s:"неколку секунди",m:"минута",mm:"%d минути",h:"час",hh:"%d часа",d:"ден",dd:"%d дена",M:"месец",MM:"%d месеци",y:"година",yy:"%d години"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/ml.js b/node_modules/dayjs/locale/ml.js
new file mode 100644
index 0000000..8e7db4f
--- /dev/null
+++ b/node_modules/dayjs/locale/ml.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_ml=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),d={name:"ml",weekdays:"ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച".split("_"),months:"ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ".split("_"),weekdaysShort:"ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി".split("_"),monthsShort:"ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.".split("_"),weekdaysMin:"ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ".split("_"),ordinal:function(_){return _},formats:{LT:"A h:mm -നു",LTS:"A h:mm:ss -നു",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm -നു",LLLL:"dddd, D MMMM YYYY, A h:mm -നു"},relativeTime:{future:"%s കഴിഞ്ഞ്",past:"%s മുൻപ്",s:"അൽപ നിമിഷങ്ങൾ",m:"ഒരു മിനിറ്റ്",mm:"%d മിനിറ്റ്",h:"ഒരു മണിക്കൂർ",hh:"%d മണിക്കൂർ",d:"ഒരു ദിവസം",dd:"%d ദിവസം",M:"ഒരു മാസം",MM:"%d മാസം",y:"ഒരു വർഷം",yy:"%d വർഷം"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/mn.js b/node_modules/dayjs/locale/mn.js
new file mode 100644
index 0000000..4de299b
--- /dev/null
+++ b/node_modules/dayjs/locale/mn.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_mn=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),d={name:"mn",weekdays:"Ням_Даваа_Мягмар_Лхагва_Пүрэв_Баасан_Бямба".split("_"),months:"Нэгдүгээр сар_Хоёрдугаар сар_Гуравдугаар сар_Дөрөвдүгээр сар_Тавдугаар сар_Зургадугаар сар_Долдугаар сар_Наймдугаар сар_Есдүгээр сар_Аравдугаар сар_Арван нэгдүгээр сар_Арван хоёрдугаар сар".split("_"),weekdaysShort:"Ням_Дав_Мяг_Лха_Пүр_Баа_Бям".split("_"),monthsShort:"1 сар_2 сар_3 сар_4 сар_5 сар_6 сар_7 сар_8 сар_9 сар_10 сар_11 сар_12 сар".split("_"),weekdaysMin:"Ня_Да_Мя_Лх_Пү_Ба_Бя".split("_"),ordinal:function(_){return _},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY оны MMMMын D",LLL:"YYYY оны MMMMын D HH:mm",LLLL:"dddd, YYYY оны MMMMын D HH:mm"},relativeTime:{future:"%s",past:"%s",s:"саяхан",m:"м",mm:"%dм",h:"1ц",hh:"%dц",d:"1ө",dd:"%dө",M:"1с",MM:"%dс",y:"1ж",yy:"%dж"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/mr.js b/node_modules/dayjs/locale/mr.js
new file mode 100644
index 0000000..af6bb3a
--- /dev/null
+++ b/node_modules/dayjs/locale/mr.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_mr=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),n={name:"mr",weekdays:"रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार".split("_"),months:"जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर".split("_"),weekdaysShort:"रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि".split("_"),monthsShort:"जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.".split("_"),weekdaysMin:"र_सो_मं_बु_गु_शु_श".split("_"),ordinal:function(_){return _},formats:{LT:"A h:mm वाजता",LTS:"A h:mm:ss वाजता",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm वाजता",LLLL:"dddd, D MMMM YYYY, A h:mm वाजता"}};return t.default.locale(n,null,!0),n}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/ms-my.js b/node_modules/dayjs/locale/ms-my.js
new file mode 100644
index 0000000..1917d7a
--- /dev/null
+++ b/node_modules/dayjs/locale/ms-my.js
@@ -0,0 +1 @@
+!function(e,a){"object"==typeof exports&&"undefined"!=typeof module?module.exports=a(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],a):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_ms_my=a(e.dayjs)}(this,(function(e){"use strict";function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=a(e),_={name:"ms-my",weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),weekStart:1,weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),ordinal:function(e){return e},formats:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"}};return t.default.locale(_,null,!0),_}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/ms.js b/node_modules/dayjs/locale/ms.js
new file mode 100644
index 0000000..be4f88e
--- /dev/null
+++ b/node_modules/dayjs/locale/ms.js
@@ -0,0 +1 @@
+!function(e,a){"object"==typeof exports&&"undefined"!=typeof module?module.exports=a(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],a):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_ms=a(e.dayjs)}(this,(function(e){"use strict";function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=a(e),s={name:"ms",weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekStart:1,formats:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH.mm",LLLL:"dddd, D MMMM YYYY HH.mm"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},ordinal:function(e){return e+"."}};return t.default.locale(s,null,!0),s}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/mt.js b/node_modules/dayjs/locale/mt.js
new file mode 100644
index 0000000..43d481a
--- /dev/null
+++ b/node_modules/dayjs/locale/mt.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_mt=t(e.dayjs)}(this,(function(e){"use strict";function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=t(e),i={name:"mt",weekdays:"Il-Ħadd_It-Tnejn_It-Tlieta_L-Erbgħa_Il-Ħamis_Il-Ġimgħa_Is-Sibt".split("_"),months:"Jannar_Frar_Marzu_April_Mejju_Ġunju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Diċembru".split("_"),weekStart:1,weekdaysShort:"Ħad_Tne_Tli_Erb_Ħam_Ġim_Sib".split("_"),monthsShort:"Jan_Fra_Mar_Apr_Mej_Ġun_Lul_Aww_Set_Ott_Nov_Diċ".split("_"),weekdaysMin:"Ħa_Tn_Tl_Er_Ħa_Ġi_Si".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},relativeTime:{future:"f’ %s",past:"%s ilu",s:"ftit sekondi",m:"minuta",mm:"%d minuti",h:"siegħa",hh:"%d siegħat",d:"ġurnata",dd:"%d ġranet",M:"xahar",MM:"%d xhur",y:"sena",yy:"%d sni"}};return a.default.locale(i,null,!0),i}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/my.js b/node_modules/dayjs/locale/my.js
new file mode 100644
index 0000000..95adead
--- /dev/null
+++ b/node_modules/dayjs/locale/my.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_my=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),d={name:"my",weekdays:"တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ".split("_"),months:"ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ".split("_"),weekStart:1,weekdaysShort:"နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),monthsShort:"ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ".split("_"),weekdaysMin:"နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),ordinal:function(_){return _},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},relativeTime:{future:"လာမည့် %s မှာ",past:"လွန်ခဲ့သော %s က",s:"စက္ကန်.အနည်းငယ်",m:"တစ်မိနစ်",mm:"%d မိနစ်",h:"တစ်နာရီ",hh:"%d နာရီ",d:"တစ်ရက်",dd:"%d ရက်",M:"တစ်လ",MM:"%d လ",y:"တစ်နှစ်",yy:"%d နှစ်"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/nb.js b/node_modules/dayjs/locale/nb.js
new file mode 100644
index 0000000..ece1f31
--- /dev/null
+++ b/node_modules/dayjs/locale/nb.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_nb=t(e.dayjs)}(this,(function(e){"use strict";function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=t(e),a={name:"nb",weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"sø._ma._ti._on._to._fr._lø.".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"),ordinal:function(e){return e+"."},weekStart:1,yearStart:4,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] HH:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},relativeTime:{future:"om %s",past:"%s siden",s:"noen sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en måned",MM:"%d måneder",y:"ett år",yy:"%d år"}};return n.default.locale(a,null,!0),a}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/ne.js b/node_modules/dayjs/locale/ne.js
new file mode 100644
index 0000000..3d166bc
--- /dev/null
+++ b/node_modules/dayjs/locale/ne.js
@@ -0,0 +1 @@
+!function(e,_){"object"==typeof exports&&"undefined"!=typeof module?module.exports=_(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],_):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_ne=_(e.dayjs)}(this,(function(e){"use strict";function _(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=_(e),d={name:"ne",weekdays:"आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार".split("_"),weekdaysShort:"आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.".split("_"),weekdaysMin:"आ._सो._मं._बु._बि._शु._श.".split("_"),months:"जनवरी_फेब्रुवरी_मार्च_अप्रिल_मे_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर".split("_"),monthsShort:"जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.".split("_"),relativeTime:{future:"%s पछि",past:"%s अघि",s:"सेकेन्ड",m:"एक मिनेट",mm:"%d मिनेट",h:"घन्टा",hh:"%d घन्टा",d:"एक दिन",dd:"%d दिन",M:"एक महिना",MM:"%d महिना",y:"एक वर्ष",yy:"%d वर्ष"},ordinal:function(e){return(""+e).replace(/\d/g,(function(e){return"०१२३४५६७८९"[e]}))},formats:{LT:"Aको h:mm बजे",LTS:"Aको h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, Aको h:mm बजे",LLLL:"dddd, D MMMM YYYY, Aको h:mm बजे"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/nl-be.js b/node_modules/dayjs/locale/nl-be.js
new file mode 100644
index 0000000..7a2f60f
--- /dev/null
+++ b/node_modules/dayjs/locale/nl-be.js
@@ -0,0 +1 @@
+!function(e,a){"object"==typeof exports&&"undefined"!=typeof module?module.exports=a(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],a):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_nl_be=a(e.dayjs)}(this,(function(e){"use strict";function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=a(e),d={name:"nl-be",weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),weekStart:1,weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"}};return n.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/nl.js b/node_modules/dayjs/locale/nl.js
new file mode 100644
index 0000000..47e789f
--- /dev/null
+++ b/node_modules/dayjs/locale/nl.js
@@ -0,0 +1 @@
+!function(e,a){"object"==typeof exports&&"undefined"!=typeof module?module.exports=a(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],a):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_nl=a(e.dayjs)}(this,(function(e){"use strict";function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var d=a(e),n={name:"nl",weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),ordinal:function(e){return"["+e+(1===e||8===e||e>=20?"ste":"de")+"]"},weekStart:1,yearStart:4,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"een minuut",mm:"%d minuten",h:"een uur",hh:"%d uur",d:"een dag",dd:"%d dagen",M:"een maand",MM:"%d maanden",y:"een jaar",yy:"%d jaar"}};return d.default.locale(n,null,!0),n}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/nn.js b/node_modules/dayjs/locale/nn.js
new file mode 100644
index 0000000..eba3c24
--- /dev/null
+++ b/node_modules/dayjs/locale/nn.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_nn=t(e.dayjs)}(this,(function(e){"use strict";function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=t(e),a={name:"nn",weekdays:"sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"sun_mån_tys_ons_tor_fre_lau".split("_"),weekdaysMin:"su_må_ty_on_to_fr_la".split("_"),months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),ordinal:function(e){return e+"."},weekStart:1,relativeTime:{future:"om %s",past:"for %s sidan",s:"nokre sekund",m:"eitt minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",M:"ein månad",MM:"%d månadar",y:"eitt år",yy:"%d år"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"}};return n.default.locale(a,null,!0),a}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/oc-lnc.js b/node_modules/dayjs/locale/oc-lnc.js
new file mode 100644
index 0000000..12e162c
--- /dev/null
+++ b/node_modules/dayjs/locale/oc-lnc.js
@@ -0,0 +1 @@
+!function(e,d){"object"==typeof exports&&"undefined"!=typeof module?module.exports=d(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],d):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_oc_lnc=d(e.dayjs)}(this,(function(e){"use strict";function d(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=d(e),s={name:"oc-lnc",weekdays:"dimenge_diluns_dimars_dimècres_dijòus_divendres_dissabte".split("_"),weekdaysShort:"Dg_Dl_Dm_Dc_Dj_Dv_Ds".split("_"),weekdaysMin:"dg_dl_dm_dc_dj_dv_ds".split("_"),months:"genièr_febrièr_març_abrial_mai_junh_julhet_agost_setembre_octòbre_novembre_decembre".split("_"),monthsShort:"gen_feb_març_abr_mai_junh_julh_ago_set_oct_nov_dec".split("_"),weekStart:1,formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",LLL:"D MMMM [de] YYYY [a] H:mm",LLLL:"dddd D MMMM [de] YYYY [a] H:mm"},relativeTime:{future:"d'aquí %s",past:"fa %s",s:"unas segondas",m:"una minuta",mm:"%d minutas",h:"una ora",hh:"%d oras",d:"un jorn",dd:"%d jorns",M:"un mes",MM:"%d meses",y:"un an",yy:"%d ans"},ordinal:function(e){return e+"º"}};return n.default.locale(s,null,!0),s}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/pa-in.js b/node_modules/dayjs/locale/pa-in.js
new file mode 100644
index 0000000..4ee3884
--- /dev/null
+++ b/node_modules/dayjs/locale/pa-in.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_pa_in=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),d={name:"pa-in",weekdays:"ਐਤਵਾਰ_ਸੋਮਵਾਰ_ਮੰਗਲਵਾਰ_ਬੁਧਵਾਰ_ਵੀਰਵਾਰ_ਸ਼ੁੱਕਰਵਾਰ_ਸ਼ਨੀਚਰਵਾਰ".split("_"),months:"ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ".split("_"),weekdaysShort:"ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ".split("_"),monthsShort:"ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ".split("_"),weekdaysMin:"ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ".split("_"),ordinal:function(_){return _},formats:{LT:"A h:mm ਵਜੇ",LTS:"A h:mm:ss ਵਜੇ",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm ਵਜੇ",LLLL:"dddd, D MMMM YYYY, A h:mm ਵਜੇ"},relativeTime:{future:"%s ਵਿੱਚ",past:"%s ਪਿਛਲੇ",s:"ਕੁਝ ਸਕਿੰਟ",m:"ਇਕ ਮਿੰਟ",mm:"%d ਮਿੰਟ",h:"ਇੱਕ ਘੰਟਾ",hh:"%d ਘੰਟੇ",d:"ਇੱਕ ਦਿਨ",dd:"%d ਦਿਨ",M:"ਇੱਕ ਮਹੀਨਾ",MM:"%d ਮਹੀਨੇ",y:"ਇੱਕ ਸਾਲ",yy:"%d ਸਾਲ"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/pl.js b/node_modules/dayjs/locale/pl.js
new file mode 100644
index 0000000..3f5148c
--- /dev/null
+++ b/node_modules/dayjs/locale/pl.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_pl=t(e.dayjs)}(this,(function(e){"use strict";function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var i=t(e);function a(e){return e%10<5&&e%10>1&&~~(e/10)%10!=1}function n(e,t,i){var n=e+" ";switch(i){case"m":return t?"minuta":"minutę";case"mm":return n+(a(e)?"minuty":"minut");case"h":return t?"godzina":"godzinę";case"hh":return n+(a(e)?"godziny":"godzin");case"MM":return n+(a(e)?"miesiące":"miesięcy");case"yy":return n+(a(e)?"lata":"lat")}}var r="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia".split("_"),_="styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień".split("_"),s=/D MMMM/,d=function(e,t){return s.test(t)?r[e.month()]:_[e.month()]};d.s=_,d.f=r;var o={name:"pl",weekdays:"niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota".split("_"),weekdaysShort:"ndz_pon_wt_śr_czw_pt_sob".split("_"),weekdaysMin:"Nd_Pn_Wt_Śr_Cz_Pt_So".split("_"),months:d,monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),ordinal:function(e){return e+"."},weekStart:1,yearStart:4,relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",m:n,mm:n,h:n,hh:n,d:"1 dzień",dd:"%d dni",M:"miesiąc",MM:n,y:"rok",yy:n},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"}};return i.default.locale(o,null,!0),o}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/pt-br.js b/node_modules/dayjs/locale/pt-br.js
new file mode 100644
index 0000000..629c2f1
--- /dev/null
+++ b/node_modules/dayjs/locale/pt-br.js
@@ -0,0 +1 @@
+!function(e,o){"object"==typeof exports&&"undefined"!=typeof module?module.exports=o(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],o):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_pt_br=o(e.dayjs)}(this,(function(e){"use strict";function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=o(e),s={name:"pt-br",weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"Do_2ª_3ª_4ª_5ª_6ª_Sá".split("_"),months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),ordinal:function(e){return e+"º"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [às] HH:mm"},relativeTime:{future:"em %s",past:"há %s",s:"poucos segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"}};return a.default.locale(s,null,!0),s}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/pt.js b/node_modules/dayjs/locale/pt.js
new file mode 100644
index 0000000..91652e8
--- /dev/null
+++ b/node_modules/dayjs/locale/pt.js
@@ -0,0 +1 @@
+!function(e,a){"object"==typeof exports&&"undefined"!=typeof module?module.exports=a(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],a):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_pt=a(e.dayjs)}(this,(function(e){"use strict";function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var o=a(e),t={name:"pt",weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sab".split("_"),weekdaysMin:"Do_2ª_3ª_4ª_5ª_6ª_Sa".split("_"),months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),ordinal:function(e){return e+"º"},weekStart:1,yearStart:4,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [às] HH:mm"},relativeTime:{future:"em %s",past:"há %s",s:"alguns segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"}};return o.default.locale(t,null,!0),t}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/rn.js b/node_modules/dayjs/locale/rn.js
new file mode 100644
index 0000000..a093364
--- /dev/null
+++ b/node_modules/dayjs/locale/rn.js
@@ -0,0 +1 @@
+!function(a,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(a="undefined"!=typeof globalThis?globalThis:a||self).dayjs_locale_rn=e(a.dayjs)}(this,(function(a){"use strict";function e(a){return a&&"object"==typeof a&&"default"in a?a:{default:a}}var t=e(a),u={name:"rn",weekdays:"Ku wa Mungu_Ku wa Mbere_Ku wa Kabiri_Ku wa Gatatu_Ku wa Kane_Ku wa Gatanu_Ku wa Gatandatu".split("_"),weekdaysShort:"Kngu_Kmbr_Kbri_Ktat_Kkan_Ktan_Kdat".split("_"),weekdaysMin:"K7_K1_K2_K3_K4_K5_K6".split("_"),months:"Nzero_Ruhuhuma_Ntwarante_Ndamukiza_Rusama_Ruhenshi_Mukakaro_Myandagaro_Nyakanga_Gitugutu_Munyonyo_Kigarama".split("_"),monthsShort:"Nzer_Ruhuh_Ntwar_Ndam_Rus_Ruhen_Muk_Myand_Nyak_Git_Muny_Kig".split("_"),weekStart:1,ordinal:function(a){return a},relativeTime:{future:"mu %s",past:"%s",s:"amasegonda",m:"Umunota",mm:"%d iminota",h:"isaha",hh:"%d amasaha",d:"Umunsi",dd:"%d iminsi",M:"ukwezi",MM:"%d amezi",y:"umwaka",yy:"%d imyaka"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"}};return t.default.locale(u,null,!0),u}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/ro.js b/node_modules/dayjs/locale/ro.js
new file mode 100644
index 0000000..445af3d
--- /dev/null
+++ b/node_modules/dayjs/locale/ro.js
@@ -0,0 +1 @@
+!function(e,i){"object"==typeof exports&&"undefined"!=typeof module?module.exports=i(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],i):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_ro=i(e.dayjs)}(this,(function(e){"use strict";function i(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=i(e),_={name:"ro",weekdays:"Duminică_Luni_Marți_Miercuri_Joi_Vineri_Sâmbătă".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),months:"Ianuarie_Februarie_Martie_Aprilie_Mai_Iunie_Iulie_August_Septembrie_Octombrie_Noiembrie_Decembrie".split("_"),monthsShort:"Ian._Febr._Mart._Apr._Mai_Iun._Iul._Aug._Sept._Oct._Nov._Dec.".split("_"),weekStart:1,formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},relativeTime:{future:"peste %s",past:"acum %s",s:"câteva secunde",m:"un minut",mm:"%d minute",h:"o oră",hh:"%d ore",d:"o zi",dd:"%d zile",M:"o lună",MM:"%d luni",y:"un an",yy:"%d ani"},ordinal:function(e){return e}};return t.default.locale(_,null,!0),_}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/ru.js b/node_modules/dayjs/locale/ru.js
new file mode 100644
index 0000000..f896790
--- /dev/null
+++ b/node_modules/dayjs/locale/ru.js
@@ -0,0 +1 @@
+!function(_,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],t):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_ru=t(_.dayjs)}(this,(function(_){"use strict";function t(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var e=t(_),n="января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря".split("_"),s="январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_"),r="янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.".split("_"),o="янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.".split("_"),i=/D[oD]?(\[[^[\]]*\]|\s)+MMMM?/;function d(_,t,e){var n,s;return"m"===e?t?"минута":"минуту":_+" "+(n=+_,s={mm:t?"минута_минуты_минут":"минуту_минуты_минут",hh:"час_часа_часов",dd:"день_дня_дней",MM:"месяц_месяца_месяцев",yy:"год_года_лет"}[e].split("_"),n%10==1&&n%100!=11?s[0]:n%10>=2&&n%10<=4&&(n%100<10||n%100>=20)?s[1]:s[2])}var u=function(_,t){return i.test(t)?n[_.month()]:s[_.month()]};u.s=s,u.f=n;var a=function(_,t){return i.test(t)?r[_.month()]:o[_.month()]};a.s=o,a.f=r;var m={name:"ru",weekdays:"воскресенье_понедельник_вторник_среда_четверг_пятница_суббота".split("_"),weekdaysShort:"вск_пнд_втр_срд_чтв_птн_сбт".split("_"),weekdaysMin:"вс_пн_вт_ср_чт_пт_сб".split("_"),months:u,monthsShort:a,weekStart:1,yearStart:4,formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., H:mm",LLLL:"dddd, D MMMM YYYY г., H:mm"},relativeTime:{future:"через %s",past:"%s назад",s:"несколько секунд",m:d,mm:d,h:"час",hh:d,d:"день",dd:d,M:"месяц",MM:d,y:"год",yy:d},ordinal:function(_){return _},meridiem:function(_){return _<4?"ночи":_<12?"утра":_<17?"дня":"вечера"}};return e.default.locale(m,null,!0),m}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/rw.js b/node_modules/dayjs/locale/rw.js
new file mode 100644
index 0000000..bf4c280
--- /dev/null
+++ b/node_modules/dayjs/locale/rw.js
@@ -0,0 +1 @@
+!function(a,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(a="undefined"!=typeof globalThis?globalThis:a||self).dayjs_locale_rw=e(a.dayjs)}(this,(function(a){"use strict";function e(a){return a&&"object"==typeof a&&"default"in a?a:{default:a}}var u=e(a),t={name:"rw",weekdays:"Ku Cyumweru_Kuwa Mbere_Kuwa Kabiri_Kuwa Gatatu_Kuwa Kane_Kuwa Gatanu_Kuwa Gatandatu".split("_"),months:"Mutarama_Gashyantare_Werurwe_Mata_Gicurasi_Kamena_Nyakanga_Kanama_Nzeri_Ukwakira_Ugushyingo_Ukuboza".split("_"),relativeTime:{future:"mu %s",past:"%s",s:"amasegonda",m:"Umunota",mm:"%d iminota",h:"isaha",hh:"%d amasaha",d:"Umunsi",dd:"%d iminsi",M:"ukwezi",MM:"%d amezi",y:"umwaka",yy:"%d imyaka"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},ordinal:function(a){return a}};return u.default.locale(t,null,!0),t}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/sd.js b/node_modules/dayjs/locale/sd.js
new file mode 100644
index 0000000..b1e1ee4
--- /dev/null
+++ b/node_modules/dayjs/locale/sd.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_sd=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),d={name:"sd",weekdays:"آچر_سومر_اڱارو_اربع_خميس_جمع_ڇنڇر".split("_"),months:"جنوري_فيبروري_مارچ_اپريل_مئي_جون_جولاءِ_آگسٽ_سيپٽمبر_آڪٽوبر_نومبر_ڊسمبر".split("_"),weekStart:1,weekdaysShort:"آچر_سومر_اڱارو_اربع_خميس_جمع_ڇنڇر".split("_"),monthsShort:"جنوري_فيبروري_مارچ_اپريل_مئي_جون_جولاءِ_آگسٽ_سيپٽمبر_آڪٽوبر_نومبر_ڊسمبر".split("_"),weekdaysMin:"آچر_سومر_اڱارو_اربع_خميس_جمع_ڇنڇر".split("_"),ordinal:function(_){return _},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd، D MMMM YYYY HH:mm"},relativeTime:{future:"%s پوء",past:"%s اڳ",s:"چند سيڪنڊ",m:"هڪ منٽ",mm:"%d منٽ",h:"هڪ ڪلاڪ",hh:"%d ڪلاڪ",d:"هڪ ڏينهن",dd:"%d ڏينهن",M:"هڪ مهينو",MM:"%d مهينا",y:"هڪ سال",yy:"%d سال"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/se.js b/node_modules/dayjs/locale/se.js
new file mode 100644
index 0000000..2cbb224
--- /dev/null
+++ b/node_modules/dayjs/locale/se.js
@@ -0,0 +1 @@
+!function(e,a){"object"==typeof exports&&"undefined"!=typeof module?module.exports=a(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],a):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_se=a(e.dayjs)}(this,(function(e){"use strict";function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=a(e),t={name:"se",weekdays:"sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat".split("_"),months:"ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu".split("_"),weekStart:1,weekdaysShort:"sotn_vuos_maŋ_gask_duor_bear_láv".split("_"),monthsShort:"ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov".split("_"),weekdaysMin:"s_v_m_g_d_b_L".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"MMMM D. [b.] YYYY",LLL:"MMMM D. [b.] YYYY [ti.] HH:mm",LLLL:"dddd, MMMM D. [b.] YYYY [ti.] HH:mm"},relativeTime:{future:"%s geažes",past:"maŋit %s",s:"moadde sekunddat",m:"okta minuhta",mm:"%d minuhtat",h:"okta diimmu",hh:"%d diimmut",d:"okta beaivi",dd:"%d beaivvit",M:"okta mánnu",MM:"%d mánut",y:"okta jahki",yy:"%d jagit"}};return n.default.locale(t,null,!0),t}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/si.js b/node_modules/dayjs/locale/si.js
new file mode 100644
index 0000000..216ae8a
--- /dev/null
+++ b/node_modules/dayjs/locale/si.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_si=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),d={name:"si",weekdays:"ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා".split("_"),months:"දුරුතු_නවම්_මැදින්_බක්_වෙසක්_පොසොන්_ඇසළ_නිකිණි_බිනර_වප්_ඉල්_උඳුවප්".split("_"),weekdaysShort:"ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන".split("_"),monthsShort:"දුරු_නව_මැදි_බක්_වෙස_පොසො_ඇස_නිකි_බින_වප්_ඉල්_උඳු".split("_"),weekdaysMin:"ඉ_ස_අ_බ_බ්‍ර_සි_සෙ".split("_"),ordinal:function(_){return _},formats:{LT:"a h:mm",LTS:"a h:mm:ss",L:"YYYY/MM/DD",LL:"YYYY MMMM D",LLL:"YYYY MMMM D, a h:mm",LLLL:"YYYY MMMM D [වැනි] dddd, a h:mm:ss"},relativeTime:{future:"%sකින්",past:"%sකට පෙර",s:"තත්පර කිහිපය",m:"විනාඩිය",mm:"විනාඩි %d",h:"පැය",hh:"පැය %d",d:"දිනය",dd:"දින %d",M:"මාසය",MM:"මාස %d",y:"වසර",yy:"වසර %d"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/sk.js b/node_modules/dayjs/locale/sk.js
new file mode 100644
index 0000000..b2707e3
--- /dev/null
+++ b/node_modules/dayjs/locale/sk.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_sk=t(e.dayjs)}(this,(function(e){"use strict";function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=t(e);function r(e){return e>1&&e<5&&1!=~~(e/10)}function o(e,t,n,o){var a=e+" ";switch(n){case"s":return t||o?"pár sekúnd":"pár sekundami";case"m":return t?"minúta":o?"minútu":"minútou";case"mm":return t||o?a+(r(e)?"minúty":"minút"):a+"minútami";case"h":return t?"hodina":o?"hodinu":"hodinou";case"hh":return t||o?a+(r(e)?"hodiny":"hodín"):a+"hodinami";case"d":return t||o?"deň":"dňom";case"dd":return t||o?a+(r(e)?"dni":"dní"):a+"dňami";case"M":return t||o?"mesiac":"mesiacom";case"MM":return t||o?a+(r(e)?"mesiace":"mesiacov"):a+"mesiacmi";case"y":return t||o?"rok":"rokom";case"yy":return t||o?a+(r(e)?"roky":"rokov"):a+"rokmi"}}var a={name:"sk",weekdays:"nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_št_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_št_pi_so".split("_"),months:"január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),monthsShort:"jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_"),weekStart:1,yearStart:4,ordinal:function(e){return e+"."},formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm",l:"D. M. YYYY"},relativeTime:{future:"za %s",past:"pred %s",s:o,m:o,mm:o,h:o,hh:o,d:o,dd:o,M:o,MM:o,y:o,yy:o}};return n.default.locale(a,null,!0),a}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/sl.js b/node_modules/dayjs/locale/sl.js
new file mode 100644
index 0000000..162d2ec
--- /dev/null
+++ b/node_modules/dayjs/locale/sl.js
@@ -0,0 +1 @@
+!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],n):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_sl=n(e.dayjs)}(this,(function(e){"use strict";function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=n(e);function r(e){return e%100==2}function a(e){return e%100==3||e%100==4}function s(e,n,t,s){var m=e+" ";switch(t){case"s":return n||s?"nekaj sekund":"nekaj sekundami";case"m":return n?"ena minuta":"eno minuto";case"mm":return r(e)?m+(n||s?"minuti":"minutama"):a(e)?m+(n||s?"minute":"minutami"):m+(n||s?"minut":"minutami");case"h":return n?"ena ura":"eno uro";case"hh":return r(e)?m+(n||s?"uri":"urama"):a(e)?m+(n||s?"ure":"urami"):m+(n||s?"ur":"urami");case"d":return n||s?"en dan":"enim dnem";case"dd":return r(e)?m+(n||s?"dneva":"dnevoma"):m+(n||s?"dni":"dnevi");case"M":return n||s?"en mesec":"enim mesecem";case"MM":return r(e)?m+(n||s?"meseca":"mesecema"):a(e)?m+(n||s?"mesece":"meseci"):m+(n||s?"mesecev":"meseci");case"y":return n||s?"eno leto":"enim letom";case"yy":return r(e)?m+(n||s?"leti":"letoma"):a(e)?m+(n||s?"leta":"leti"):m+(n||s?"let":"leti")}}var m={name:"sl",weekdays:"nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota".split("_"),months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),weekStart:1,weekdaysShort:"ned._pon._tor._sre._čet._pet._sob.".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),weekdaysMin:"ne_po_to_sr_če_pe_so".split("_"),ordinal:function(e){return e+"."},formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm",l:"D. M. YYYY"},relativeTime:{future:"čez %s",past:"pred %s",s:s,m:s,mm:s,h:s,hh:s,d:s,dd:s,M:s,MM:s,y:s,yy:s}};return t.default.locale(m,null,!0),m}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/sq.js b/node_modules/dayjs/locale/sq.js
new file mode 100644
index 0000000..99bca9a
--- /dev/null
+++ b/node_modules/dayjs/locale/sq.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_sq=t(e.dayjs)}(this,(function(e){"use strict";function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var _=t(e),n={name:"sq",weekdays:"E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë".split("_"),months:"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor".split("_"),weekStart:1,weekdaysShort:"Die_Hën_Mar_Mër_Enj_Pre_Sht".split("_"),monthsShort:"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj".split("_"),weekdaysMin:"D_H_Ma_Më_E_P_Sh".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},relativeTime:{future:"në %s",past:"%s më parë",s:"disa sekonda",m:"një minutë",mm:"%d minuta",h:"një orë",hh:"%d orë",d:"një ditë",dd:"%d ditë",M:"një muaj",MM:"%d muaj",y:"një vit",yy:"%d vite"}};return _.default.locale(n,null,!0),n}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/sr-cyrl.js b/node_modules/dayjs/locale/sr-cyrl.js
new file mode 100644
index 0000000..90daeeb
--- /dev/null
+++ b/node_modules/dayjs/locale/sr-cyrl.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_sr_cyrl=t(e.dayjs)}(this,(function(e){"use strict";function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var r=t(e),a={words:{m:["један минут","једног минута"],mm:["%d минут","%d минута","%d минута"],h:["један сат","једног сата"],hh:["%d сат","%d сата","%d сати"],d:["један дан","једног дана"],dd:["%d дан","%d дана","%d дана"],M:["један месец","једног месеца"],MM:["%d месец","%d месеца","%d месеци"],y:["једну годину","једне године"],yy:["%d годину","%d године","%d година"]},correctGrammarCase:function(e,t){return e%10>=1&&e%10<=4&&(e%100<10||e%100>=20)?e%10==1?t[0]:t[1]:t[2]},relativeTimeFormatter:function(e,t,r,d){var i=a.words[r];if(1===r.length)return"y"===r&&t?"једна година":d||t?i[0]:i[1];var m=a.correctGrammarCase(e,i);return"yy"===r&&t&&"%d годину"===m?e+" година":m.replace("%d",e)}},d={name:"sr-cyrl",weekdays:"Недеља_Понедељак_Уторак_Среда_Четвртак_Петак_Субота".split("_"),weekdaysShort:"Нед._Пон._Уто._Сре._Чет._Пет._Суб.".split("_"),weekdaysMin:"не_по_ут_ср_че_пе_су".split("_"),months:"Јануар_Фебруар_Март_Април_Мај_Јун_Јул_Август_Септембар_Октобар_Новембар_Децембар".split("_"),monthsShort:"Јан._Феб._Мар._Апр._Мај_Јун_Јул_Авг._Сеп._Окт._Нов._Дец.".split("_"),weekStart:1,relativeTime:{future:"за %s",past:"пре %s",s:"неколико секунди",m:a.relativeTimeFormatter,mm:a.relativeTimeFormatter,h:a.relativeTimeFormatter,hh:a.relativeTimeFormatter,d:a.relativeTimeFormatter,dd:a.relativeTimeFormatter,M:a.relativeTimeFormatter,MM:a.relativeTimeFormatter,y:a.relativeTimeFormatter,yy:a.relativeTimeFormatter},ordinal:function(e){return e+"."},formats:{LT:"H:mm",LTS:"H:mm:ss",L:"D. M. YYYY.",LL:"D. MMMM YYYY.",LLL:"D. MMMM YYYY. H:mm",LLLL:"dddd, D. MMMM YYYY. H:mm"}};return r.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/sr.js b/node_modules/dayjs/locale/sr.js
new file mode 100644
index 0000000..35a5b55
--- /dev/null
+++ b/node_modules/dayjs/locale/sr.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_sr=t(e.dayjs)}(this,(function(e){"use strict";function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=t(e),r={words:{m:["jedan minut","jednog minuta"],mm:["%d minut","%d minuta","%d minuta"],h:["jedan sat","jednog sata"],hh:["%d sat","%d sata","%d sati"],d:["jedan dan","jednog dana"],dd:["%d dan","%d dana","%d dana"],M:["jedan mesec","jednog meseca"],MM:["%d mesec","%d meseca","%d meseci"],y:["jednu godinu","jedne godine"],yy:["%d godinu","%d godine","%d godina"]},correctGrammarCase:function(e,t){return e%10>=1&&e%10<=4&&(e%100<10||e%100>=20)?e%10==1?t[0]:t[1]:t[2]},relativeTimeFormatter:function(e,t,a,d){var n=r.words[a];if(1===a.length)return"y"===a&&t?"jedna godina":d||t?n[0]:n[1];var i=r.correctGrammarCase(e,n);return"yy"===a&&t&&"%d godinu"===i?e+" godina":i.replace("%d",e)}},d={name:"sr",weekdays:"Nedelja_Ponedeljak_Utorak_Sreda_Četvrtak_Petak_Subota".split("_"),weekdaysShort:"Ned._Pon._Uto._Sre._Čet._Pet._Sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),months:"Januar_Februar_Mart_April_Maj_Jun_Jul_Avgust_Septembar_Oktobar_Novembar_Decembar".split("_"),monthsShort:"Jan._Feb._Mar._Apr._Maj_Jun_Jul_Avg._Sep._Okt._Nov._Dec.".split("_"),weekStart:1,relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",m:r.relativeTimeFormatter,mm:r.relativeTimeFormatter,h:r.relativeTimeFormatter,hh:r.relativeTimeFormatter,d:r.relativeTimeFormatter,dd:r.relativeTimeFormatter,M:r.relativeTimeFormatter,MM:r.relativeTimeFormatter,y:r.relativeTimeFormatter,yy:r.relativeTimeFormatter},ordinal:function(e){return e+"."},formats:{LT:"H:mm",LTS:"H:mm:ss",L:"D. M. YYYY.",LL:"D. MMMM YYYY.",LLL:"D. MMMM YYYY. H:mm",LLLL:"dddd, D. MMMM YYYY. H:mm"}};return a.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/ss.js b/node_modules/dayjs/locale/ss.js
new file mode 100644
index 0000000..4df16a5
--- /dev/null
+++ b/node_modules/dayjs/locale/ss.js
@@ -0,0 +1 @@
+!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],n):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_ss=n(e.dayjs)}(this,(function(e){"use strict";function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=n(e),i={name:"ss",weekdays:"Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo".split("_"),months:"Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split("_"),weekStart:1,weekdaysShort:"Lis_Umb_Lsb_Les_Lsi_Lsh_Umg".split("_"),monthsShort:"Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo".split("_"),weekdaysMin:"Li_Us_Lb_Lt_Ls_Lh_Ug".split("_"),ordinal:function(e){return e},formats:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},relativeTime:{future:"nga %s",past:"wenteka nga %s",s:"emizuzwana lomcane",m:"umzuzu",mm:"%d emizuzu",h:"lihora",hh:"%d emahora",d:"lilanga",dd:"%d emalanga",M:"inyanga",MM:"%d tinyanga",y:"umnyaka",yy:"%d iminyaka"}};return a.default.locale(i,null,!0),i}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/sv-fi.js b/node_modules/dayjs/locale/sv-fi.js
new file mode 100644
index 0000000..5b2f8af
--- /dev/null
+++ b/node_modules/dayjs/locale/sv-fi.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_sv_fi=t(e.dayjs)}(this,(function(e){"use strict";function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=t(e),d={name:"sv-fi",weekdays:"söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),weekdaysShort:"sön_mån_tis_ons_tor_fre_lör".split("_"),weekdaysMin:"sö_må_ti_on_to_fr_lö".split("_"),months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekStart:1,yearStart:4,ordinal:function(e){var t=e%10;return"["+e+(1===t||2===t?"a":"e")+"]"},formats:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY, [kl.] HH.mm",LLLL:"dddd, D. MMMM YYYY, [kl.] HH.mm",l:"D.M.YYYY",ll:"D. MMM YYYY",lll:"D. MMM YYYY, [kl.] HH.mm",llll:"ddd, D. MMM YYYY, [kl.] HH.mm"},relativeTime:{future:"om %s",past:"för %s sedan",s:"några sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en månad",MM:"%d månader",y:"ett år",yy:"%d år"}};return a.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/sv.js b/node_modules/dayjs/locale/sv.js
new file mode 100644
index 0000000..16e6d37
--- /dev/null
+++ b/node_modules/dayjs/locale/sv.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_sv=t(e.dayjs)}(this,(function(e){"use strict";function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=t(e),d={name:"sv",weekdays:"söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),weekdaysShort:"sön_mån_tis_ons_tor_fre_lör".split("_"),weekdaysMin:"sö_må_ti_on_to_fr_lö".split("_"),months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekStart:1,yearStart:4,ordinal:function(e){var t=e%10;return"["+e+(1===t||2===t?"a":"e")+"]"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [kl.] HH:mm",LLLL:"dddd D MMMM YYYY [kl.] HH:mm",lll:"D MMM YYYY HH:mm",llll:"ddd D MMM YYYY HH:mm"},relativeTime:{future:"om %s",past:"för %s sedan",s:"några sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en månad",MM:"%d månader",y:"ett år",yy:"%d år"}};return a.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/sw.js b/node_modules/dayjs/locale/sw.js
new file mode 100644
index 0000000..a13bd44
--- /dev/null
+++ b/node_modules/dayjs/locale/sw.js
@@ -0,0 +1 @@
+!function(a,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(a="undefined"!=typeof globalThis?globalThis:a||self).dayjs_locale_sw=e(a.dayjs)}(this,(function(a){"use strict";function e(a){return a&&"object"==typeof a&&"default"in a?a:{default:a}}var i=e(a),t={name:"sw",weekdays:"Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi".split("_"),weekdaysShort:"Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos".split("_"),weekdaysMin:"J2_J3_J4_J5_Al_Ij_J1".split("_"),months:"Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des".split("_"),weekStart:1,ordinal:function(a){return a},relativeTime:{future:"%s baadaye",past:"tokea %s",s:"hivi punde",m:"dakika moja",mm:"dakika %d",h:"saa limoja",hh:"masaa %d",d:"siku moja",dd:"masiku %d",M:"mwezi mmoja",MM:"miezi %d",y:"mwaka mmoja",yy:"miaka %d"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"}};return i.default.locale(t,null,!0),t}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/ta.js b/node_modules/dayjs/locale/ta.js
new file mode 100644
index 0000000..406cf13
--- /dev/null
+++ b/node_modules/dayjs/locale/ta.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_ta=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),d={name:"ta",weekdays:"ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை".split("_"),months:"ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்".split("_"),weekdaysShort:"ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி".split("_"),monthsShort:"ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்".split("_"),weekdaysMin:"ஞா_தி_செ_பு_வி_வெ_ச".split("_"),ordinal:function(_){return _},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, HH:mm",LLLL:"dddd, D MMMM YYYY, HH:mm"},relativeTime:{future:"%s இல்",past:"%s முன்",s:"ஒரு சில விநாடிகள்",m:"ஒரு நிமிடம்",mm:"%d நிமிடங்கள்",h:"ஒரு மணி நேரம்",hh:"%d மணி நேரம்",d:"ஒரு நாள்",dd:"%d நாட்கள்",M:"ஒரு மாதம்",MM:"%d மாதங்கள்",y:"ஒரு வருடம்",yy:"%d ஆண்டுகள்"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/te.js b/node_modules/dayjs/locale/te.js
new file mode 100644
index 0000000..c7593db
--- /dev/null
+++ b/node_modules/dayjs/locale/te.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_te=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),d={name:"te",weekdays:"ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం".split("_"),months:"జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జులై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్".split("_"),weekdaysShort:"ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని".split("_"),monthsShort:"జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జులై_ఆగ._సెప్._అక్టో._నవ._డిసె.".split("_"),weekdaysMin:"ఆ_సో_మం_బు_గు_శు_శ".split("_"),ordinal:function(_){return _},formats:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},relativeTime:{future:"%s లో",past:"%s క్రితం",s:"కొన్ని క్షణాలు",m:"ఒక నిమిషం",mm:"%d నిమిషాలు",h:"ఒక గంట",hh:"%d గంటలు",d:"ఒక రోజు",dd:"%d రోజులు",M:"ఒక నెల",MM:"%d నెలలు",y:"ఒక సంవత్సరం",yy:"%d సంవత్సరాలు"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/tet.js b/node_modules/dayjs/locale/tet.js
new file mode 100644
index 0000000..aec6f68
--- /dev/null
+++ b/node_modules/dayjs/locale/tet.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_tet=t(e.dayjs)}(this,(function(e){"use strict";function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var u=t(e),a={name:"tet",weekdays:"Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu".split("_"),months:"Janeiru_Fevereiru_Marsu_Abril_Maiu_Juñu_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru".split("_"),weekStart:1,weekdaysShort:"Dom_Seg_Ters_Kua_Kint_Sest_Sab".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdaysMin:"Do_Seg_Te_Ku_Ki_Ses_Sa".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},relativeTime:{future:"iha %s",past:"%s liuba",s:"minutu balun",m:"minutu ida",mm:"minutu %d",h:"oras ida",hh:"oras %d",d:"loron ida",dd:"loron %d",M:"fulan ida",MM:"fulan %d",y:"tinan ida",yy:"tinan %d"}};return u.default.locale(a,null,!0),a}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/tg.js b/node_modules/dayjs/locale/tg.js
new file mode 100644
index 0000000..7643103
--- /dev/null
+++ b/node_modules/dayjs/locale/tg.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_tg=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),d={name:"tg",weekdays:"якшанбе_душанбе_сешанбе_чоршанбе_панҷшанбе_ҷумъа_шанбе".split("_"),months:"январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр".split("_"),weekStart:1,weekdaysShort:"яшб_дшб_сшб_чшб_пшб_ҷум_шнб".split("_"),monthsShort:"янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек".split("_"),weekdaysMin:"яш_дш_сш_чш_пш_ҷм_шб".split("_"),ordinal:function(_){return _},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},relativeTime:{future:"баъди %s",past:"%s пеш",s:"якчанд сония",m:"як дақиқа",mm:"%d дақиқа",h:"як соат",hh:"%d соат",d:"як рӯз",dd:"%d рӯз",M:"як моҳ",MM:"%d моҳ",y:"як сол",yy:"%d сол"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/th.js b/node_modules/dayjs/locale/th.js
new file mode 100644
index 0000000..185d4eb
--- /dev/null
+++ b/node_modules/dayjs/locale/th.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_th=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),d={name:"th",weekdays:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์".split("_"),weekdaysShort:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์".split("_"),weekdaysMin:"อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),months:"มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม".split("_"),monthsShort:"ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.".split("_"),formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY เวลา H:mm",LLLL:"วันddddที่ D MMMM YYYY เวลา H:mm"},relativeTime:{future:"อีก %s",past:"%sที่แล้ว",s:"ไม่กี่วินาที",m:"1 นาที",mm:"%d นาที",h:"1 ชั่วโมง",hh:"%d ชั่วโมง",d:"1 วัน",dd:"%d วัน",M:"1 เดือน",MM:"%d เดือน",y:"1 ปี",yy:"%d ปี"},ordinal:function(_){return _+"."}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/tk.js b/node_modules/dayjs/locale/tk.js
new file mode 100644
index 0000000..1e737b5
--- /dev/null
+++ b/node_modules/dayjs/locale/tk.js
@@ -0,0 +1 @@
+!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],n):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_tk=n(e.dayjs)}(this,(function(e){"use strict";function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=n(e),_={name:"tk",weekdays:"Ýekşenbe_Duşenbe_Sişenbe_Çarşenbe_Penşenbe_Anna_Şenbe".split("_"),weekdaysShort:"Ýek_Duş_Siş_Çar_Pen_Ann_Şen".split("_"),weekdaysMin:"Ýk_Dş_Sş_Çr_Pn_An_Şn".split("_"),months:"Ýanwar_Fewral_Mart_Aprel_Maý_Iýun_Iýul_Awgust_Sentýabr_Oktýabr_Noýabr_Dekabr".split("_"),monthsShort:"Ýan_Few_Mar_Apr_Maý_Iýn_Iýl_Awg_Sen_Okt_Noý_Dek".split("_"),weekStart:1,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},relativeTime:{future:"%s soň",past:"%s öň",s:"birnäçe sekunt",m:"bir minut",mm:"%d minut",h:"bir sagat",hh:"%d sagat",d:"bir gün",dd:"%d gün",M:"bir aý",MM:"%d aý",y:"bir ýyl",yy:"%d ýyl"},ordinal:function(e){return e+"."}};return t.default.locale(_,null,!0),_}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/tl-ph.js b/node_modules/dayjs/locale/tl-ph.js
new file mode 100644
index 0000000..885f8a9
--- /dev/null
+++ b/node_modules/dayjs/locale/tl-ph.js
@@ -0,0 +1 @@
+!function(e,a){"object"==typeof exports&&"undefined"!=typeof module?module.exports=a(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],a):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_tl_ph=a(e.dayjs)}(this,(function(e){"use strict";function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=a(e),t={name:"tl-ph",weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),weekStart:1,weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY HH:mm",LLLL:"dddd, MMMM DD, YYYY HH:mm"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"}};return n.default.locale(t,null,!0),t}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/tlh.js b/node_modules/dayjs/locale/tlh.js
new file mode 100644
index 0000000..03d8996
--- /dev/null
+++ b/node_modules/dayjs/locale/tlh.js
@@ -0,0 +1 @@
+!function(a,j){"object"==typeof exports&&"undefined"!=typeof module?module.exports=j(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],j):(a="undefined"!=typeof globalThis?globalThis:a||self).dayjs_locale_tlh=j(a.dayjs)}(this,(function(a){"use strict";function j(a){return a&&"object"==typeof a&&"default"in a?a:{default:a}}var t=j(a),e={name:"tlh",weekdays:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),months:"tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’".split("_"),weekStart:1,weekdaysShort:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),monthsShort:"jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’".split("_"),weekdaysMin:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),ordinal:function(a){return a},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"}};return t.default.locale(e,null,!0),e}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/tr.js b/node_modules/dayjs/locale/tr.js
new file mode 100644
index 0000000..9c7844a
--- /dev/null
+++ b/node_modules/dayjs/locale/tr.js
@@ -0,0 +1 @@
+!function(a,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(a="undefined"!=typeof globalThis?globalThis:a||self).dayjs_locale_tr=e(a.dayjs)}(this,(function(a){"use strict";function e(a){return a&&"object"==typeof a&&"default"in a?a:{default:a}}var t=e(a),_={name:"tr",weekdays:"Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),months:"Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık".split("_"),monthsShort:"Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara".split("_"),weekStart:1,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},relativeTime:{future:"%s sonra",past:"%s önce",s:"birkaç saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir yıl",yy:"%d yıl"},ordinal:function(a){return a+"."}};return t.default.locale(_,null,!0),_}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/types.d.ts b/node_modules/dayjs/locale/types.d.ts
new file mode 100644
index 0000000..2c24a64
--- /dev/null
+++ b/node_modules/dayjs/locale/types.d.ts
@@ -0,0 +1,33 @@
+declare interface ILocale {
+  name: string
+  weekdays?: string[]
+  months?: string[]
+  weekStart?: number
+  weekdaysShort?: string[]
+  monthsShort?: string[]
+  weekdaysMin?: string[]
+  ordinal?: (n: number) => number | string
+  formats: Partial<{
+    LT: string
+    LTS: string
+    L: string
+    LL: string
+    LLL: string
+    LLLL: string
+  }>
+  relativeTime: Partial<{
+    future: string
+    past: string
+    s: string
+    m: string
+    mm: string
+    h: string
+    hh: string
+    d: string
+    dd: string
+    M: string
+    MM: string
+    y: string
+    yy: string
+  }>
+}
diff --git a/node_modules/dayjs/locale/tzl.js b/node_modules/dayjs/locale/tzl.js
new file mode 100644
index 0000000..2b1d598
--- /dev/null
+++ b/node_modules/dayjs/locale/tzl.js
@@ -0,0 +1 @@
+!function(e,_){"object"==typeof exports&&"undefined"!=typeof module?module.exports=_(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],_):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_tzl=_(e.dayjs)}(this,(function(e){"use strict";function _(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=_(e),a={name:"tzl",weekdays:"Súladi_Lúneçi_Maitzi_Márcuri_Xhúadi_Viénerçi_Sáturi".split("_"),months:"Januar_Fevraglh_Març_Avrïu_Mai_Gün_Julia_Guscht_Setemvar_Listopäts_Noemvar_Zecemvar".split("_"),weekStart:1,weekdaysShort:"Súl_Lún_Mai_Már_Xhú_Vié_Sát".split("_"),monthsShort:"Jan_Fev_Mar_Avr_Mai_Gün_Jul_Gus_Set_Lis_Noe_Zec".split("_"),weekdaysMin:"Sú_Lú_Ma_Má_Xh_Vi_Sá".split("_"),ordinal:function(e){return e},formats:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"D. MMMM [dallas] YYYY",LLL:"D. MMMM [dallas] YYYY HH.mm",LLLL:"dddd, [li] D. MMMM [dallas] YYYY HH.mm"}};return t.default.locale(a,null,!0),a}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/tzm-latn.js b/node_modules/dayjs/locale/tzm-latn.js
new file mode 100644
index 0000000..3f7cdd4
--- /dev/null
+++ b/node_modules/dayjs/locale/tzm-latn.js
@@ -0,0 +1 @@
+!function(a,s){"object"==typeof exports&&"undefined"!=typeof module?module.exports=s(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],s):(a="undefined"!=typeof globalThis?globalThis:a||self).dayjs_locale_tzm_latn=s(a.dayjs)}(this,(function(a){"use strict";function s(a){return a&&"object"==typeof a&&"default"in a?a:{default:a}}var n=s(a),i={name:"tzm-latn",weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),months:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),weekStart:6,weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),monthsShort:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),ordinal:function(a){return a},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",m:"minuḍ",mm:"%d minuḍ",h:"saɛa",hh:"%d tassaɛin",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"}};return n.default.locale(i,null,!0),i}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/tzm.js b/node_modules/dayjs/locale/tzm.js
new file mode 100644
index 0000000..e4c4031
--- /dev/null
+++ b/node_modules/dayjs/locale/tzm.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_tzm=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),d={name:"tzm",weekdays:"ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),months:"ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ".split("_"),weekStart:6,weekdaysShort:"ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),monthsShort:"ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ".split("_"),weekdaysMin:"ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),ordinal:function(_){return _},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},relativeTime:{future:"ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s",past:"ⵢⴰⵏ %s",s:"ⵉⵎⵉⴽ",m:"ⵎⵉⵏⵓⴺ",mm:"%d ⵎⵉⵏⵓⴺ",h:"ⵙⴰⵄⴰ",hh:"%d ⵜⴰⵙⵙⴰⵄⵉⵏ",d:"ⴰⵙⵙ",dd:"%d oⵙⵙⴰⵏ",M:"ⴰⵢoⵓⵔ",MM:"%d ⵉⵢⵢⵉⵔⵏ",y:"ⴰⵙⴳⴰⵙ",yy:"%d ⵉⵙⴳⴰⵙⵏ"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/ug-cn.js b/node_modules/dayjs/locale/ug-cn.js
new file mode 100644
index 0000000..995c3b3
--- /dev/null
+++ b/node_modules/dayjs/locale/ug-cn.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_ug_cn=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),d={name:"ug-cn",weekdays:"يەكشەنبە_دۈشەنبە_سەيشەنبە_چارشەنبە_پەيشەنبە_جۈمە_شەنبە".split("_"),months:"يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر".split("_"),weekStart:1,weekdaysShort:"يە_دۈ_سە_چا_پە_جۈ_شە".split("_"),monthsShort:"يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر".split("_"),weekdaysMin:"يە_دۈ_سە_چا_پە_جۈ_شە".split("_"),ordinal:function(_){return _},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY-يىلىM-ئاينىڭD-كۈنى",LLL:"YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm",LLLL:"dddd، YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm"},relativeTime:{future:"%s كېيىن",past:"%s بۇرۇن",s:"نەچچە سېكونت",m:"بىر مىنۇت",mm:"%d مىنۇت",h:"بىر سائەت",hh:"%d سائەت",d:"بىر كۈن",dd:"%d كۈن",M:"بىر ئاي",MM:"%d ئاي",y:"بىر يىل",yy:"%d يىل"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/uk.js b/node_modules/dayjs/locale/uk.js
new file mode 100644
index 0000000..537afb1
--- /dev/null
+++ b/node_modules/dayjs/locale/uk.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_uk=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),s="січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня".split("_"),n="січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень".split("_"),o=/D[oD]?(\[[^[\]]*\]|\s)+MMMM?/;function d(_,e,t){var s,n;return"m"===t?e?"хвилина":"хвилину":"h"===t?e?"година":"годину":_+" "+(s=+_,n={ss:e?"секунда_секунди_секунд":"секунду_секунди_секунд",mm:e?"хвилина_хвилини_хвилин":"хвилину_хвилини_хвилин",hh:e?"година_години_годин":"годину_години_годин",dd:"день_дні_днів",MM:"місяць_місяці_місяців",yy:"рік_роки_років"}[t].split("_"),s%10==1&&s%100!=11?n[0]:s%10>=2&&s%10<=4&&(s%100<10||s%100>=20)?n[1]:n[2])}var i=function(_,e){return o.test(e)?s[_.month()]:n[_.month()]};i.s=n,i.f=s;var r={name:"uk",weekdays:"неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота".split("_"),weekdaysShort:"ндл_пнд_втр_срд_чтв_птн_сбт".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),months:i,monthsShort:"січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд".split("_"),weekStart:1,relativeTime:{future:"за %s",past:"%s тому",s:"декілька секунд",m:d,mm:d,h:d,hh:d,d:"день",dd:d,M:"місяць",MM:d,y:"рік",yy:d},ordinal:function(_){return _},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY р.",LLL:"D MMMM YYYY р., HH:mm",LLLL:"dddd, D MMMM YYYY р., HH:mm"}};return t.default.locale(r,null,!0),r}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/ur.js b/node_modules/dayjs/locale/ur.js
new file mode 100644
index 0000000..4f83c8b
--- /dev/null
+++ b/node_modules/dayjs/locale/ur.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_ur=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),d={name:"ur",weekdays:"اتوار_پیر_منگل_بدھ_جمعرات_جمعہ_ہفتہ".split("_"),months:"جنوری_فروری_مارچ_اپریل_مئی_جون_جولائی_اگست_ستمبر_اکتوبر_نومبر_دسمبر".split("_"),weekStart:1,weekdaysShort:"اتوار_پیر_منگل_بدھ_جمعرات_جمعہ_ہفتہ".split("_"),monthsShort:"جنوری_فروری_مارچ_اپریل_مئی_جون_جولائی_اگست_ستمبر_اکتوبر_نومبر_دسمبر".split("_"),weekdaysMin:"اتوار_پیر_منگل_بدھ_جمعرات_جمعہ_ہفتہ".split("_"),ordinal:function(_){return _},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd، D MMMM YYYY HH:mm"},relativeTime:{future:"%s بعد",past:"%s قبل",s:"چند سیکنڈ",m:"ایک منٹ",mm:"%d منٹ",h:"ایک گھنٹہ",hh:"%d گھنٹے",d:"ایک دن",dd:"%d دن",M:"ایک ماہ",MM:"%d ماہ",y:"ایک سال",yy:"%d سال"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/uz-latn.js b/node_modules/dayjs/locale/uz-latn.js
new file mode 100644
index 0000000..a8ebab4
--- /dev/null
+++ b/node_modules/dayjs/locale/uz-latn.js
@@ -0,0 +1 @@
+!function(a,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(a="undefined"!=typeof globalThis?globalThis:a||self).dayjs_locale_uz_latn=e(a.dayjs)}(this,(function(a){"use strict";function e(a){return a&&"object"==typeof a&&"default"in a?a:{default:a}}var _=e(a),n={name:"uz-latn",weekdays:"Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba".split("_"),months:"Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr".split("_"),weekStart:1,weekdaysShort:"Yak_Dush_Sesh_Chor_Pay_Jum_Shan".split("_"),monthsShort:"Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek".split("_"),weekdaysMin:"Ya_Du_Se_Cho_Pa_Ju_Sha".split("_"),ordinal:function(a){return a},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},relativeTime:{future:"Yaqin %s ichida",past:"%s oldin",s:"soniya",m:"bir daqiqa",mm:"%d daqiqa",h:"bir soat",hh:"%d soat",d:"bir kun",dd:"%d kun",M:"bir oy",MM:"%d oy",y:"bir yil",yy:"%d yil"}};return _.default.locale(n,null,!0),n}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/uz.js b/node_modules/dayjs/locale/uz.js
new file mode 100644
index 0000000..f6992b1
--- /dev/null
+++ b/node_modules/dayjs/locale/uz.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_uz=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),d={name:"uz",weekdays:"Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба".split("_"),months:"январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр".split("_"),weekStart:1,weekdaysShort:"Якш_Душ_Сеш_Чор_Пай_Жум_Шан".split("_"),monthsShort:"янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек".split("_"),weekdaysMin:"Як_Ду_Се_Чо_Па_Жу_Ша".split("_"),ordinal:function(_){return _},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},relativeTime:{future:"Якин %s ичида",past:"%s олдин",s:"фурсат",m:"бир дакика",mm:"%d дакика",h:"бир соат",hh:"%d соат",d:"бир кун",dd:"%d кун",M:"бир ой",MM:"%d ой",y:"бир йил",yy:"%d йил"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/vi.js b/node_modules/dayjs/locale/vi.js
new file mode 100644
index 0000000..ee33954
--- /dev/null
+++ b/node_modules/dayjs/locale/vi.js
@@ -0,0 +1 @@
+!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],n):(t="undefined"!=typeof globalThis?globalThis:t||self).dayjs_locale_vi=n(t.dayjs)}(this,(function(t){"use strict";function n(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var h=n(t),_={name:"vi",weekdays:"chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy".split("_"),months:"tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),weekStart:1,weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),ordinal:function(t){return t},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [năm] YYYY",LLL:"D MMMM [năm] YYYY HH:mm",LLLL:"dddd, D MMMM [năm] YYYY HH:mm",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},relativeTime:{future:"%s tới",past:"%s trước",s:"vài giây",m:"một phút",mm:"%d phút",h:"một giờ",hh:"%d giờ",d:"một ngày",dd:"%d ngày",M:"một tháng",MM:"%d tháng",y:"một năm",yy:"%d năm"}};return h.default.locale(_,null,!0),_}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/x-pseudo.js b/node_modules/dayjs/locale/x-pseudo.js
new file mode 100644
index 0000000..c1215d6
--- /dev/null
+++ b/node_modules/dayjs/locale/x-pseudo.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_x_pseudo=t(e.dayjs)}(this,(function(e){"use strict";function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var _=t(e),d={name:"x-pseudo",weekdays:"S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý".split("_"),months:"J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér".split("_"),weekStart:1,weekdaysShort:"S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát".split("_"),monthsShort:"J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc".split("_"),weekdaysMin:"S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},relativeTime:{future:"í~ñ %s",past:"%s á~gó",s:"á ~féw ~sécó~ñds",m:"á ~míñ~úté",mm:"%d m~íñú~tés",h:"á~ñ hó~úr",hh:"%d h~óúrs",d:"á ~dáý",dd:"%d d~áýs",M:"á ~móñ~th",MM:"%d m~óñt~hs",y:"á ~ýéár",yy:"%d ý~éárs"}};return _.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/yo.js b/node_modules/dayjs/locale/yo.js
new file mode 100644
index 0000000..b12b37b
--- /dev/null
+++ b/node_modules/dayjs/locale/yo.js
@@ -0,0 +1 @@
+!function(e,_){"object"==typeof exports&&"undefined"!=typeof module?module.exports=_(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],_):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_yo=_(e.dayjs)}(this,(function(e){"use strict";function _(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=_(e),a={name:"yo",weekdays:"Àìkú_Ajé_Ìsẹ́gun_Ọjọ́rú_Ọjọ́bọ_Ẹtì_Àbámẹ́ta".split("_"),months:"Sẹ́rẹ́_Èrèlè_Ẹrẹ̀nà_Ìgbé_Èbibi_Òkùdu_Agẹmo_Ògún_Owewe_Ọ̀wàrà_Bélú_Ọ̀pẹ̀̀".split("_"),weekStart:1,weekdaysShort:"Àìk_Ajé_Ìsẹ́_Ọjr_Ọjb_Ẹtì_Àbá".split("_"),monthsShort:"Sẹ́r_Èrl_Ẹrn_Ìgb_Èbi_Òkù_Agẹ_Ògú_Owe_Ọ̀wà_Bél_Ọ̀pẹ̀̀".split("_"),weekdaysMin:"Àì_Aj_Ìs_Ọr_Ọb_Ẹt_Àb".split("_"),ordinal:function(e){return e},formats:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},relativeTime:{future:"ní %s",past:"%s kọjá",s:"ìsẹjú aayá die",m:"ìsẹjú kan",mm:"ìsẹjú %d",h:"wákati kan",hh:"wákati %d",d:"ọjọ́ kan",dd:"ọjọ́ %d",M:"osù kan",MM:"osù %d",y:"ọdún kan",yy:"ọdún %d"}};return t.default.locale(a,null,!0),a}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/zh-cn.js b/node_modules/dayjs/locale/zh-cn.js
new file mode 100644
index 0000000..21cf228
--- /dev/null
+++ b/node_modules/dayjs/locale/zh-cn.js
@@ -0,0 +1 @@
+!function(e,_){"object"==typeof exports&&"undefined"!=typeof module?module.exports=_(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],_):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_zh_cn=_(e.dayjs)}(this,(function(e){"use strict";function _(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=_(e),d={name:"zh-cn",weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),ordinal:function(e,_){return"W"===_?e+"周":e+"日"},weekStart:1,yearStart:4,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日Ah点mm分",LLLL:"YYYY年M月D日ddddAh点mm分",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},relativeTime:{future:"%s内",past:"%s前",s:"几秒",m:"1 分钟",mm:"%d 分钟",h:"1 小时",hh:"%d 小时",d:"1 天",dd:"%d 天",M:"1 个月",MM:"%d 个月",y:"1 年",yy:"%d 年"},meridiem:function(e,_){var t=100*e+_;return t<600?"凌晨":t<900?"早上":t<1100?"上午":t<1300?"中午":t<1800?"下午":"晚上"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/zh-hk.js b/node_modules/dayjs/locale/zh-hk.js
new file mode 100644
index 0000000..f4b220d
--- /dev/null
+++ b/node_modules/dayjs/locale/zh-hk.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_zh_hk=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),d={name:"zh-hk",months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"週日_週一_週二_週三_週四_週五_週六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),ordinal:function(_,e){return"W"===e?_+"週":_+"日"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日 HH:mm",LLLL:"YYYY年M月D日dddd HH:mm"},relativeTime:{future:"%s內",past:"%s前",s:"幾秒",m:"一分鐘",mm:"%d 分鐘",h:"一小時",hh:"%d 小時",d:"一天",dd:"%d 天",M:"一個月",MM:"%d 個月",y:"一年",yy:"%d 年"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/zh-tw.js b/node_modules/dayjs/locale/zh-tw.js
new file mode 100644
index 0000000..5970f17
--- /dev/null
+++ b/node_modules/dayjs/locale/zh-tw.js
@@ -0,0 +1 @@
+!function(_,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],e):(_="undefined"!=typeof globalThis?globalThis:_||self).dayjs_locale_zh_tw=e(_.dayjs)}(this,(function(_){"use strict";function e(_){return _&&"object"==typeof _&&"default"in _?_:{default:_}}var t=e(_),d={name:"zh-tw",weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"週日_週一_週二_週三_週四_週五_週六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),ordinal:function(_,e){return"W"===e?_+"週":_+"日"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日 HH:mm",LLLL:"YYYY年M月D日dddd HH:mm",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},relativeTime:{future:"%s內",past:"%s前",s:"幾秒",m:"1 分鐘",mm:"%d 分鐘",h:"1 小時",hh:"%d 小時",d:"1 天",dd:"%d 天",M:"1 個月",MM:"%d 個月",y:"1 年",yy:"%d 年"},meridiem:function(_,e){var t=100*_+e;return t<600?"凌晨":t<900?"早上":t<1100?"上午":t<1300?"中午":t<1800?"下午":"晚上"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/locale/zh.js b/node_modules/dayjs/locale/zh.js
new file mode 100644
index 0000000..2e80015
--- /dev/null
+++ b/node_modules/dayjs/locale/zh.js
@@ -0,0 +1 @@
+!function(e,_){"object"==typeof exports&&"undefined"!=typeof module?module.exports=_(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],_):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_zh=_(e.dayjs)}(this,(function(e){"use strict";function _(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=_(e),d={name:"zh",weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),ordinal:function(e,_){return"W"===_?e+"周":e+"日"},weekStart:1,yearStart:4,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日Ah点mm分",LLLL:"YYYY年M月D日ddddAh点mm分",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},relativeTime:{future:"%s后",past:"%s前",s:"几秒",m:"1 分钟",mm:"%d 分钟",h:"1 小时",hh:"%d 小时",d:"1 天",dd:"%d 天",M:"1 个月",MM:"%d 个月",y:"1 年",yy:"%d 年"},meridiem:function(e,_){var t=100*e+_;return t<600?"凌晨":t<900?"早上":t<1100?"上午":t<1300?"中午":t<1800?"下午":"晚上"}};return t.default.locale(d,null,!0),d}));
\ No newline at end of file
diff --git a/node_modules/dayjs/package.json b/node_modules/dayjs/package.json
new file mode 100644
index 0000000..417c30b
--- /dev/null
+++ b/node_modules/dayjs/package.json
@@ -0,0 +1,84 @@
+{
+  "name": "dayjs",
+  "version": "1.11.10",
+  "description": "2KB immutable date time library alternative to Moment.js with the same modern API ",
+  "main": "dayjs.min.js",
+  "types": "index.d.ts",
+  "scripts": {
+    "test": "TZ=Pacific/Auckland npm run test-tz && TZ=Europe/London npm run test-tz && TZ=America/Whitehorse npm run test-tz && npm run test-tz && jest",
+    "test-tz": "date && jest test/timezone.test --coverage=false",
+    "lint": "./node_modules/.bin/eslint src/* test/* build/*",
+    "prettier": "prettier --write \"docs/**/*.md\"",
+    "babel": "cross-env BABEL_ENV=build babel src --out-dir esm --copy-files && node build/esm",
+    "build": "cross-env BABEL_ENV=build node build && npm run size",
+    "sauce": "npx karma start karma.sauce.conf.js",
+    "test:sauce": "npm run sauce -- 0 && npm run sauce -- 1 && npm run sauce -- 2  && npm run sauce -- 3",
+    "size": "size-limit && gzip-size dayjs.min.js"
+  },
+  "pre-commit": [
+    "lint"
+  ],
+  "size-limit": [
+    {
+      "limit": "2.99 KB",
+      "path": "dayjs.min.js"
+    }
+  ],
+  "jest": {
+    "roots": [
+      "test"
+    ],
+    "testRegex": "test/(.*?/)?.*test.js$",
+    "testURL": "http://localhost",
+    "coverageDirectory": "./coverage/",
+    "collectCoverage": true,
+    "collectCoverageFrom": [
+      "src/**/*"
+    ]
+  },
+  "keywords": [
+    "dayjs",
+    "date",
+    "time",
+    "immutable",
+    "moment"
+  ],
+  "author": "iamkun",
+  "license": "MIT",
+  "homepage": "https://day.js.org",
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/iamkun/dayjs.git"
+  },
+  "devDependencies": {
+    "@babel/cli": "^7.0.0-beta.44",
+    "@babel/core": "^7.0.0-beta.44",
+    "@babel/node": "^7.0.0-beta.44",
+    "@babel/preset-env": "^7.0.0-beta.44",
+    "babel-core": "^7.0.0-bridge.0",
+    "babel-jest": "^22.4.3",
+    "babel-plugin-external-helpers": "^6.22.0",
+    "cross-env": "^5.1.6",
+    "eslint": "^4.19.1",
+    "eslint-config-airbnb-base": "^12.1.0",
+    "eslint-plugin-import": "^2.10.0",
+    "eslint-plugin-jest": "^21.15.0",
+    "gzip-size-cli": "^2.1.0",
+    "jasmine-core": "^2.99.1",
+    "jest": "^22.4.3",
+    "karma": "^2.0.2",
+    "karma-jasmine": "^1.1.2",
+    "karma-sauce-launcher": "^1.1.0",
+    "mockdate": "^2.0.2",
+    "moment": "2.29.2",
+    "moment-timezone": "0.5.31",
+    "ncp": "^2.0.0",
+    "pre-commit": "^1.2.2",
+    "prettier": "^1.16.1",
+    "rollup": "^2.45.1",
+    "rollup-plugin-babel": "^4.4.0",
+    "rollup-plugin-terser": "^7.0.2",
+    "size-limit": "^0.18.0",
+    "typescript": "^2.8.3"
+  }
+}
diff --git a/node_modules/dayjs/plugin/advancedFormat.d.ts b/node_modules/dayjs/plugin/advancedFormat.d.ts
new file mode 100644
index 0000000..30ec75e
--- /dev/null
+++ b/node_modules/dayjs/plugin/advancedFormat.d.ts
@@ -0,0 +1,4 @@
+import { PluginFunc } from 'dayjs'
+
+declare const plugin: PluginFunc
+export = plugin
diff --git a/node_modules/dayjs/plugin/advancedFormat.js b/node_modules/dayjs/plugin/advancedFormat.js
new file mode 100644
index 0000000..88d62e7
--- /dev/null
+++ b/node_modules/dayjs/plugin/advancedFormat.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_plugin_advancedFormat=t()}(this,(function(){"use strict";return function(e,t){var r=t.prototype,n=r.format;r.format=function(e){var t=this,r=this.$locale();if(!this.isValid())return n.bind(this)(e);var s=this.$utils(),a=(e||"YYYY-MM-DDTHH:mm:ssZ").replace(/\[([^\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g,(function(e){switch(e){case"Q":return Math.ceil((t.$M+1)/3);case"Do":return r.ordinal(t.$D);case"gggg":return t.weekYear();case"GGGG":return t.isoWeekYear();case"wo":return r.ordinal(t.week(),"W");case"w":case"ww":return s.s(t.week(),"w"===e?1:2,"0");case"W":case"WW":return s.s(t.isoWeek(),"W"===e?1:2,"0");case"k":case"kk":return s.s(String(0===t.$H?24:t.$H),"k"===e?1:2,"0");case"X":return Math.floor(t.$d.getTime()/1e3);case"x":return t.$d.getTime();case"z":return"["+t.offsetName()+"]";case"zzz":return"["+t.offsetName("long")+"]";default:return e}}));return n.bind(this)(a)}}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/arraySupport.d.ts b/node_modules/dayjs/plugin/arraySupport.d.ts
new file mode 100644
index 0000000..e4e44b2
--- /dev/null
+++ b/node_modules/dayjs/plugin/arraySupport.d.ts
@@ -0,0 +1,10 @@
+import { PluginFunc } from 'dayjs'
+
+declare module 'dayjs' {
+  interface ConfigTypeMap {
+    arraySupport: [number?, number?, number?, number?, number?, number?, number?]
+  }
+}
+
+declare const plugin: PluginFunc
+export = plugin
diff --git a/node_modules/dayjs/plugin/arraySupport.js b/node_modules/dayjs/plugin/arraySupport.js
new file mode 100644
index 0000000..b16675f
--- /dev/null
+++ b/node_modules/dayjs/plugin/arraySupport.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_plugin_arraySupport=t()}(this,(function(){"use strict";return function(e,t,n){var o=t.prototype,i=function(e){var t=e.date,o=e.utc;return Array.isArray(t)?o?t.length?new Date(Date.UTC.apply(null,t)):new Date:1===t.length?n(String(t[0])).toDate():new(Function.prototype.bind.apply(Date,[null].concat(t))):t},a=o.parse;o.parse=function(e){e.date=i.bind(this)(e),a.bind(this)(e)}}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/badMutable.d.ts b/node_modules/dayjs/plugin/badMutable.d.ts
new file mode 100644
index 0000000..30ec75e
--- /dev/null
+++ b/node_modules/dayjs/plugin/badMutable.d.ts
@@ -0,0 +1,4 @@
+import { PluginFunc } from 'dayjs'
+
+declare const plugin: PluginFunc
+export = plugin
diff --git a/node_modules/dayjs/plugin/badMutable.js b/node_modules/dayjs/plugin/badMutable.js
new file mode 100644
index 0000000..68270cc
--- /dev/null
+++ b/node_modules/dayjs/plugin/badMutable.js
@@ -0,0 +1 @@
+!function(t,i){"object"==typeof exports&&"undefined"!=typeof module?module.exports=i():"function"==typeof define&&define.amd?define(i):(t="undefined"!=typeof globalThis?globalThis:t||self).dayjs_plugin_badMutable=i()}(this,(function(){"use strict";return function(t,i){var n=i.prototype;n.$g=function(t,i,n){return this.$utils().u(t)?this[i]:this.$set(n,t)},n.set=function(t,i){return this.$set(t,i)};var e=n.startOf;n.startOf=function(t,i){return this.$d=e.bind(this)(t,i).toDate(),this.init(),this};var s=n.add;n.add=function(t,i){return this.$d=s.bind(this)(t,i).toDate(),this.init(),this};var o=n.locale;n.locale=function(t,i){return t?(this.$L=o.bind(this)(t,i).$L,this):this.$L};var r=n.daysInMonth;n.daysInMonth=function(){return r.bind(this.clone())()};var u=n.isSame;n.isSame=function(t,i){return u.bind(this.clone())(t,i)};var f=n.isBefore;n.isBefore=function(t,i){return f.bind(this.clone())(t,i)};var d=n.isAfter;n.isAfter=function(t,i){return d.bind(this.clone())(t,i)}}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/bigIntSupport.d.ts b/node_modules/dayjs/plugin/bigIntSupport.d.ts
new file mode 100644
index 0000000..d9f2f39
--- /dev/null
+++ b/node_modules/dayjs/plugin/bigIntSupport.d.ts
@@ -0,0 +1,11 @@
+import { PluginFunc } from 'dayjs'
+
+declare module 'dayjs' {
+  interface ConfigTypeMap {
+    bigIntSupport: BigInt
+  }
+  export function unix(t: BigInt): Dayjs
+}
+
+declare const plugin: PluginFunc
+export = plugin
diff --git a/node_modules/dayjs/plugin/bigIntSupport.js b/node_modules/dayjs/plugin/bigIntSupport.js
new file mode 100644
index 0000000..0c7efac
--- /dev/null
+++ b/node_modules/dayjs/plugin/bigIntSupport.js
@@ -0,0 +1 @@
+!function(n,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(n="undefined"!=typeof globalThis?globalThis:n||self).dayjs_plugin_bigIntSupport=e()}(this,(function(){"use strict";var n=function(n){return"bigint"==typeof n};return function(e,t,i){var o=t.prototype,u=function(e){var t=e.date;return n(t)?Number(t):t},r=o.parse;o.parse=function(n){n.date=u.bind(this)(n),r.bind(this)(n)};var f=i.unix;i.unix=function(e){var t=n(e)?Number(e):e;return f(t)}}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/buddhistEra.d.ts b/node_modules/dayjs/plugin/buddhistEra.d.ts
new file mode 100644
index 0000000..30ec75e
--- /dev/null
+++ b/node_modules/dayjs/plugin/buddhistEra.d.ts
@@ -0,0 +1,4 @@
+import { PluginFunc } from 'dayjs'
+
+declare const plugin: PluginFunc
+export = plugin
diff --git a/node_modules/dayjs/plugin/buddhistEra.js b/node_modules/dayjs/plugin/buddhistEra.js
new file mode 100644
index 0000000..58b137c
--- /dev/null
+++ b/node_modules/dayjs/plugin/buddhistEra.js
@@ -0,0 +1 @@
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).dayjs_plugin_buddhistEra=e()}(this,(function(){"use strict";return function(t,e){var n=e.prototype,i=n.format;n.format=function(t){var e=this,n=(t||"YYYY-MM-DDTHH:mm:ssZ").replace(/(\[[^\]]+])|BBBB|BB/g,(function(t,n){var i,o=String(e.$y+543),f="BB"===t?[o.slice(-2),2]:[o,4];return n||(i=e.$utils()).s.apply(i,f.concat(["0"]))}));return i.bind(this)(n)}}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/calendar.d.ts b/node_modules/dayjs/plugin/calendar.d.ts
new file mode 100644
index 0000000..a8d064f
--- /dev/null
+++ b/node_modules/dayjs/plugin/calendar.d.ts
@@ -0,0 +1,10 @@
+import { PluginFunc, ConfigType } from 'dayjs'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs' {
+  interface Dayjs {
+    calendar(referenceTime?: ConfigType, formats?: object): string
+  }
+}
diff --git a/node_modules/dayjs/plugin/calendar.js b/node_modules/dayjs/plugin/calendar.js
new file mode 100644
index 0000000..c577098
--- /dev/null
+++ b/node_modules/dayjs/plugin/calendar.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_plugin_calendar=t()}(this,(function(){"use strict";return function(e,t,a){var n="h:mm A",d={lastDay:"[Yesterday at] "+n,sameDay:"[Today at] "+n,nextDay:"[Tomorrow at] "+n,nextWeek:"dddd [at] "+n,lastWeek:"[Last] dddd [at] "+n,sameElse:"MM/DD/YYYY"};t.prototype.calendar=function(e,t){var n=t||this.$locale().calendar||d,o=a(e||void 0).startOf("d"),s=this.diff(o,"d",!0),i="sameElse",f=s<-6?i:s<-1?"lastWeek":s<0?"lastDay":s<1?"sameDay":s<2?"nextDay":s<7?"nextWeek":i,l=n[f]||d[f];return"function"==typeof l?l.call(this,a()):this.format(l)}}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/customParseFormat.d.ts b/node_modules/dayjs/plugin/customParseFormat.d.ts
new file mode 100644
index 0000000..1b41c0d
--- /dev/null
+++ b/node_modules/dayjs/plugin/customParseFormat.d.ts
@@ -0,0 +1,8 @@
+import { PluginFunc } from 'dayjs'
+
+declare interface PluginOptions {
+    parseTwoDigitYear?: (yearString: string) => number
+}
+
+declare const plugin: PluginFunc<PluginOptions>
+export = plugin
diff --git a/node_modules/dayjs/plugin/customParseFormat.js b/node_modules/dayjs/plugin/customParseFormat.js
new file mode 100644
index 0000000..66d6089
--- /dev/null
+++ b/node_modules/dayjs/plugin/customParseFormat.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_plugin_customParseFormat=t()}(this,(function(){"use strict";var e={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},t=/(\[[^[]*\])|([-_:/.,()\s]+)|(A|a|YYYY|YY?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g,n=/\d\d/,r=/\d\d?/,i=/\d*[^-_:/,()\s\d]+/,o={},s=function(e){return(e=+e)+(e>68?1900:2e3)};var a=function(e){return function(t){this[e]=+t}},f=[/[+-]\d\d:?(\d\d)?|Z/,function(e){(this.zone||(this.zone={})).offset=function(e){if(!e)return 0;if("Z"===e)return 0;var t=e.match(/([+-]|\d\d)/g),n=60*t[1]+(+t[2]||0);return 0===n?0:"+"===t[0]?-n:n}(e)}],h=function(e){var t=o[e];return t&&(t.indexOf?t:t.s.concat(t.f))},u=function(e,t){var n,r=o.meridiem;if(r){for(var i=1;i<=24;i+=1)if(e.indexOf(r(i,0,t))>-1){n=i>12;break}}else n=e===(t?"pm":"PM");return n},d={A:[i,function(e){this.afternoon=u(e,!1)}],a:[i,function(e){this.afternoon=u(e,!0)}],S:[/\d/,function(e){this.milliseconds=100*+e}],SS:[n,function(e){this.milliseconds=10*+e}],SSS:[/\d{3}/,function(e){this.milliseconds=+e}],s:[r,a("seconds")],ss:[r,a("seconds")],m:[r,a("minutes")],mm:[r,a("minutes")],H:[r,a("hours")],h:[r,a("hours")],HH:[r,a("hours")],hh:[r,a("hours")],D:[r,a("day")],DD:[n,a("day")],Do:[i,function(e){var t=o.ordinal,n=e.match(/\d+/);if(this.day=n[0],t)for(var r=1;r<=31;r+=1)t(r).replace(/\[|\]/g,"")===e&&(this.day=r)}],M:[r,a("month")],MM:[n,a("month")],MMM:[i,function(e){var t=h("months"),n=(h("monthsShort")||t.map((function(e){return e.slice(0,3)}))).indexOf(e)+1;if(n<1)throw new Error;this.month=n%12||n}],MMMM:[i,function(e){var t=h("months").indexOf(e)+1;if(t<1)throw new Error;this.month=t%12||t}],Y:[/[+-]?\d+/,a("year")],YY:[n,function(e){this.year=s(e)}],YYYY:[/\d{4}/,a("year")],Z:f,ZZ:f};function c(n){var r,i;r=n,i=o&&o.formats;for(var s=(n=r.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g,(function(t,n,r){var o=r&&r.toUpperCase();return n||i[r]||e[r]||i[o].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,(function(e,t,n){return t||n.slice(1)}))}))).match(t),a=s.length,f=0;f<a;f+=1){var h=s[f],u=d[h],c=u&&u[0],l=u&&u[1];s[f]=l?{regex:c,parser:l}:h.replace(/^\[|\]$/g,"")}return function(e){for(var t={},n=0,r=0;n<a;n+=1){var i=s[n];if("string"==typeof i)r+=i.length;else{var o=i.regex,f=i.parser,h=e.slice(r),u=o.exec(h)[0];f.call(t,u),e=e.replace(u,"")}}return function(e){var t=e.afternoon;if(void 0!==t){var n=e.hours;t?n<12&&(e.hours+=12):12===n&&(e.hours=0),delete e.afternoon}}(t),t}}return function(e,t,n){n.p.customParseFormat=!0,e&&e.parseTwoDigitYear&&(s=e.parseTwoDigitYear);var r=t.prototype,i=r.parse;r.parse=function(e){var t=e.date,r=e.utc,s=e.args;this.$u=r;var a=s[1];if("string"==typeof a){var f=!0===s[2],h=!0===s[3],u=f||h,d=s[2];h&&(d=s[2]),o=this.$locale(),!f&&d&&(o=n.Ls[d]),this.$d=function(e,t,n){try{if(["x","X"].indexOf(t)>-1)return new Date(("X"===t?1e3:1)*e);var r=c(t)(e),i=r.year,o=r.month,s=r.day,a=r.hours,f=r.minutes,h=r.seconds,u=r.milliseconds,d=r.zone,l=new Date,m=s||(i||o?1:l.getDate()),M=i||l.getFullYear(),Y=0;i&&!o||(Y=o>0?o-1:l.getMonth());var p=a||0,v=f||0,D=h||0,g=u||0;return d?new Date(Date.UTC(M,Y,m,p,v,D,g+60*d.offset*1e3)):n?new Date(Date.UTC(M,Y,m,p,v,D,g)):new Date(M,Y,m,p,v,D,g)}catch(e){return new Date("")}}(t,a,r),this.init(),d&&!0!==d&&(this.$L=this.locale(d).$L),u&&t!=this.format(a)&&(this.$d=new Date("")),o={}}else if(a instanceof Array)for(var l=a.length,m=1;m<=l;m+=1){s[1]=a[m-1];var M=n.apply(this,s);if(M.isValid()){this.$d=M.$d,this.$L=M.$L,this.init();break}m===l&&(this.$d=new Date(""))}else i.call(this,e)}}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/dayOfYear.d.ts b/node_modules/dayjs/plugin/dayOfYear.d.ts
new file mode 100644
index 0000000..4fd6601
--- /dev/null
+++ b/node_modules/dayjs/plugin/dayOfYear.d.ts
@@ -0,0 +1,11 @@
+import { PluginFunc } from 'dayjs'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs' {
+  interface Dayjs {
+    dayOfYear(): number
+    dayOfYear(value: number): Dayjs
+  }
+}
diff --git a/node_modules/dayjs/plugin/dayOfYear.js b/node_modules/dayjs/plugin/dayOfYear.js
new file mode 100644
index 0000000..4a57000
--- /dev/null
+++ b/node_modules/dayjs/plugin/dayOfYear.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_plugin_dayOfYear=t()}(this,(function(){"use strict";return function(e,t,n){t.prototype.dayOfYear=function(e){var t=Math.round((n(this).startOf("day")-n(this).startOf("year"))/864e5)+1;return null==e?t:this.add(e-t,"day")}}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/devHelper.d.ts b/node_modules/dayjs/plugin/devHelper.d.ts
new file mode 100644
index 0000000..30ec75e
--- /dev/null
+++ b/node_modules/dayjs/plugin/devHelper.d.ts
@@ -0,0 +1,4 @@
+import { PluginFunc } from 'dayjs'
+
+declare const plugin: PluginFunc
+export = plugin
diff --git a/node_modules/dayjs/plugin/devHelper.js b/node_modules/dayjs/plugin/devHelper.js
new file mode 100644
index 0000000..a3f6daf
--- /dev/null
+++ b/node_modules/dayjs/plugin/devHelper.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_plugin_devHelper=t()}(this,(function(){"use strict";return function(e,t,o){if(!process||"production"!==process.env.NODE_ENV){var s=t.prototype,n=s.parse;s.parse=function(e){var t=e.date;return"string"==typeof t&&13===t.length&&console.warn("To parse a Unix timestamp like "+t+", you should pass it as a Number. https://day.js.org/docs/en/parse/unix-timestamp-milliseconds"),"number"==typeof t&&4===String(t).length&&console.warn("Guessing you may want to parse the Year "+t+", you should pass it as a String "+t+", not a Number. Otherwise, "+t+" will be treated as a Unix timestamp"),e.args.length>=2&&!o.p.customParseFormat&&console.warn("To parse a date-time string like "+t+" using the given format, you should enable customParseFormat plugin first. https://day.js.org/docs/en/parse/string-format"),n.bind(this)(e)};var a=o.locale;o.locale=function(e,t,s){return void 0===t&&"string"==typeof e&&(o.Ls[e]||console.warn("Guessing you may want to use locale "+e+", you have to load it before using it. https://day.js.org/docs/en/i18n/loading-into-nodejs")),a(e,t,s)}}}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/duration.d.ts b/node_modules/dayjs/plugin/duration.d.ts
new file mode 100644
index 0000000..9675a80
--- /dev/null
+++ b/node_modules/dayjs/plugin/duration.d.ts
@@ -0,0 +1,88 @@
+import { PluginFunc } from 'dayjs'
+import { OpUnitType, UnitTypeLongPlural } from 'dayjs';
+
+declare const plugin: PluginFunc
+export as namespace plugin;
+export = plugin
+
+declare namespace plugin {
+  /**
+   * @deprecated Please use more strict types
+   */
+  type DurationInputType = string | number | object
+  /**
+   * @deprecated Please use more strict types
+   */
+  type DurationAddType = number | object | Duration
+  
+  type DurationUnitsObjectType = Partial<{
+    [unit in Exclude<UnitTypeLongPlural, "dates"> | "weeks"]: number
+  }>;
+  type DurationUnitType = Exclude<OpUnitType, "date" | "dates">
+  type CreateDurationType = 
+    ((units: DurationUnitsObjectType) => Duration)
+    & ((time: number, unit?: DurationUnitType) => Duration)
+    & ((ISO_8601: string) => Duration)
+  type AddDurationType = CreateDurationType & ((duration: Duration) => Duration)
+
+  interface Duration {
+    new (input: string | number | object, unit?: string, locale?: string): Duration
+
+    clone(): Duration
+
+    humanize(withSuffix?: boolean): string
+
+    milliseconds(): number
+    asMilliseconds(): number
+
+    seconds(): number
+    asSeconds(): number
+
+    minutes(): number
+    asMinutes(): number
+
+    hours(): number
+    asHours(): number
+
+    days(): number
+    asDays(): number
+
+    weeks(): number
+    asWeeks(): number
+
+    months(): number
+    asMonths(): number
+
+    years(): number
+    asYears(): number
+
+    as(unit: DurationUnitType): number
+
+    get(unit: DurationUnitType): number
+
+    add: AddDurationType
+    
+    subtract: AddDurationType
+
+    toJSON(): string
+
+    toISOString(): string
+
+    format(formatStr?: string): string
+
+    locale(locale: string): Duration
+  }
+}
+
+declare module 'dayjs' {
+  interface Dayjs {
+    add(duration: plugin.Duration): Dayjs
+    subtract(duration: plugin.Duration): Dayjs
+  }
+
+  /**
+   * @param time If unit is not present, time treated as number of milliseconds
+   */
+  export const duration: plugin.CreateDurationType;
+  export function isDuration(d: any): d is plugin.Duration
+}
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/duration.js b/node_modules/dayjs/plugin/duration.js
new file mode 100644
index 0000000..4578f06
--- /dev/null
+++ b/node_modules/dayjs/plugin/duration.js
@@ -0,0 +1 @@
+!function(t,s){"object"==typeof exports&&"undefined"!=typeof module?module.exports=s():"function"==typeof define&&define.amd?define(s):(t="undefined"!=typeof globalThis?globalThis:t||self).dayjs_plugin_duration=s()}(this,(function(){"use strict";var t,s,n=1e3,i=6e4,e=36e5,r=864e5,o=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,u=31536e6,d=2628e6,a=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/,h={years:u,months:d,days:r,hours:e,minutes:i,seconds:n,milliseconds:1,weeks:6048e5},c=function(t){return t instanceof g},f=function(t,s,n){return new g(t,n,s.$l)},m=function(t){return s.p(t)+"s"},l=function(t){return t<0},$=function(t){return l(t)?Math.ceil(t):Math.floor(t)},y=function(t){return Math.abs(t)},v=function(t,s){return t?l(t)?{negative:!0,format:""+y(t)+s}:{negative:!1,format:""+t+s}:{negative:!1,format:""}},g=function(){function l(t,s,n){var i=this;if(this.$d={},this.$l=n,void 0===t&&(this.$ms=0,this.parseFromMilliseconds()),s)return f(t*h[m(s)],this);if("number"==typeof t)return this.$ms=t,this.parseFromMilliseconds(),this;if("object"==typeof t)return Object.keys(t).forEach((function(s){i.$d[m(s)]=t[s]})),this.calMilliseconds(),this;if("string"==typeof t){var e=t.match(a);if(e){var r=e.slice(2).map((function(t){return null!=t?Number(t):0}));return this.$d.years=r[0],this.$d.months=r[1],this.$d.weeks=r[2],this.$d.days=r[3],this.$d.hours=r[4],this.$d.minutes=r[5],this.$d.seconds=r[6],this.calMilliseconds(),this}}return this}var y=l.prototype;return y.calMilliseconds=function(){var t=this;this.$ms=Object.keys(this.$d).reduce((function(s,n){return s+(t.$d[n]||0)*h[n]}),0)},y.parseFromMilliseconds=function(){var t=this.$ms;this.$d.years=$(t/u),t%=u,this.$d.months=$(t/d),t%=d,this.$d.days=$(t/r),t%=r,this.$d.hours=$(t/e),t%=e,this.$d.minutes=$(t/i),t%=i,this.$d.seconds=$(t/n),t%=n,this.$d.milliseconds=t},y.toISOString=function(){var t=v(this.$d.years,"Y"),s=v(this.$d.months,"M"),n=+this.$d.days||0;this.$d.weeks&&(n+=7*this.$d.weeks);var i=v(n,"D"),e=v(this.$d.hours,"H"),r=v(this.$d.minutes,"M"),o=this.$d.seconds||0;this.$d.milliseconds&&(o+=this.$d.milliseconds/1e3,o=Math.round(1e3*o)/1e3);var u=v(o,"S"),d=t.negative||s.negative||i.negative||e.negative||r.negative||u.negative,a=e.format||r.format||u.format?"T":"",h=(d?"-":"")+"P"+t.format+s.format+i.format+a+e.format+r.format+u.format;return"P"===h||"-P"===h?"P0D":h},y.toJSON=function(){return this.toISOString()},y.format=function(t){var n=t||"YYYY-MM-DDTHH:mm:ss",i={Y:this.$d.years,YY:s.s(this.$d.years,2,"0"),YYYY:s.s(this.$d.years,4,"0"),M:this.$d.months,MM:s.s(this.$d.months,2,"0"),D:this.$d.days,DD:s.s(this.$d.days,2,"0"),H:this.$d.hours,HH:s.s(this.$d.hours,2,"0"),m:this.$d.minutes,mm:s.s(this.$d.minutes,2,"0"),s:this.$d.seconds,ss:s.s(this.$d.seconds,2,"0"),SSS:s.s(this.$d.milliseconds,3,"0")};return n.replace(o,(function(t,s){return s||String(i[t])}))},y.as=function(t){return this.$ms/h[m(t)]},y.get=function(t){var s=this.$ms,n=m(t);return"milliseconds"===n?s%=1e3:s="weeks"===n?$(s/h[n]):this.$d[n],s||0},y.add=function(t,s,n){var i;return i=s?t*h[m(s)]:c(t)?t.$ms:f(t,this).$ms,f(this.$ms+i*(n?-1:1),this)},y.subtract=function(t,s){return this.add(t,s,!0)},y.locale=function(t){var s=this.clone();return s.$l=t,s},y.clone=function(){return f(this.$ms,this)},y.humanize=function(s){return t().add(this.$ms,"ms").locale(this.$l).fromNow(!s)},y.valueOf=function(){return this.asMilliseconds()},y.milliseconds=function(){return this.get("milliseconds")},y.asMilliseconds=function(){return this.as("milliseconds")},y.seconds=function(){return this.get("seconds")},y.asSeconds=function(){return this.as("seconds")},y.minutes=function(){return this.get("minutes")},y.asMinutes=function(){return this.as("minutes")},y.hours=function(){return this.get("hours")},y.asHours=function(){return this.as("hours")},y.days=function(){return this.get("days")},y.asDays=function(){return this.as("days")},y.weeks=function(){return this.get("weeks")},y.asWeeks=function(){return this.as("weeks")},y.months=function(){return this.get("months")},y.asMonths=function(){return this.as("months")},y.years=function(){return this.get("years")},y.asYears=function(){return this.as("years")},l}(),p=function(t,s,n){return t.add(s.years()*n,"y").add(s.months()*n,"M").add(s.days()*n,"d").add(s.hours()*n,"h").add(s.minutes()*n,"m").add(s.seconds()*n,"s").add(s.milliseconds()*n,"ms")};return function(n,i,e){t=e,s=e().$utils(),e.duration=function(t,s){var n=e.locale();return f(t,{$l:n},s)},e.isDuration=c;var r=i.prototype.add,o=i.prototype.subtract;i.prototype.add=function(t,s){return c(t)?p(this,t,1):r.bind(this)(t,s)},i.prototype.subtract=function(t,s){return c(t)?p(this,t,-1):o.bind(this)(t,s)}}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/isBetween.d.ts b/node_modules/dayjs/plugin/isBetween.d.ts
new file mode 100644
index 0000000..431fff8
--- /dev/null
+++ b/node_modules/dayjs/plugin/isBetween.d.ts
@@ -0,0 +1,10 @@
+import { PluginFunc, ConfigType, OpUnitType } from 'dayjs'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs' {
+  interface Dayjs {
+    isBetween(a: ConfigType, b: ConfigType, c?: OpUnitType | null, d?: '()' | '[]' | '[)' | '(]'): boolean
+  }
+}
diff --git a/node_modules/dayjs/plugin/isBetween.js b/node_modules/dayjs/plugin/isBetween.js
new file mode 100644
index 0000000..68046cb
--- /dev/null
+++ b/node_modules/dayjs/plugin/isBetween.js
@@ -0,0 +1 @@
+!function(e,i){"object"==typeof exports&&"undefined"!=typeof module?module.exports=i():"function"==typeof define&&define.amd?define(i):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_plugin_isBetween=i()}(this,(function(){"use strict";return function(e,i,t){i.prototype.isBetween=function(e,i,s,f){var n=t(e),o=t(i),r="("===(f=f||"()")[0],u=")"===f[1];return(r?this.isAfter(n,s):!this.isBefore(n,s))&&(u?this.isBefore(o,s):!this.isAfter(o,s))||(r?this.isBefore(n,s):!this.isAfter(n,s))&&(u?this.isAfter(o,s):!this.isBefore(o,s))}}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/isLeapYear.d.ts b/node_modules/dayjs/plugin/isLeapYear.d.ts
new file mode 100644
index 0000000..5be7409
--- /dev/null
+++ b/node_modules/dayjs/plugin/isLeapYear.d.ts
@@ -0,0 +1,10 @@
+import { PluginFunc } from 'dayjs'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs' {
+  interface Dayjs {
+    isLeapYear(): boolean
+  }
+}
diff --git a/node_modules/dayjs/plugin/isLeapYear.js b/node_modules/dayjs/plugin/isLeapYear.js
new file mode 100644
index 0000000..030bd46
--- /dev/null
+++ b/node_modules/dayjs/plugin/isLeapYear.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_plugin_isLeapYear=t()}(this,(function(){"use strict";return function(e,t){t.prototype.isLeapYear=function(){return this.$y%4==0&&this.$y%100!=0||this.$y%400==0}}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/isMoment.d.ts b/node_modules/dayjs/plugin/isMoment.d.ts
new file mode 100644
index 0000000..dac24f6
--- /dev/null
+++ b/node_modules/dayjs/plugin/isMoment.d.ts
@@ -0,0 +1,10 @@
+import { PluginFunc } from 'dayjs'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs' {
+
+  export function isMoment(input: any): boolean
+
+}
diff --git a/node_modules/dayjs/plugin/isMoment.js b/node_modules/dayjs/plugin/isMoment.js
new file mode 100644
index 0000000..be26412
--- /dev/null
+++ b/node_modules/dayjs/plugin/isMoment.js
@@ -0,0 +1 @@
+!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_plugin_isMoment=n()}(this,(function(){"use strict";return function(e,n,t){t.isMoment=function(e){return t.isDayjs(e)}}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/isSameOrAfter.d.ts b/node_modules/dayjs/plugin/isSameOrAfter.d.ts
new file mode 100644
index 0000000..916bc80
--- /dev/null
+++ b/node_modules/dayjs/plugin/isSameOrAfter.d.ts
@@ -0,0 +1,10 @@
+import { PluginFunc, ConfigType, OpUnitType } from 'dayjs'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs' {
+  interface Dayjs {
+    isSameOrAfter(date?: ConfigType, unit?: OpUnitType): boolean
+  }
+}
diff --git a/node_modules/dayjs/plugin/isSameOrAfter.js b/node_modules/dayjs/plugin/isSameOrAfter.js
new file mode 100644
index 0000000..76f8a33
--- /dev/null
+++ b/node_modules/dayjs/plugin/isSameOrAfter.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_plugin_isSameOrAfter=t()}(this,(function(){"use strict";return function(e,t){t.prototype.isSameOrAfter=function(e,t){return this.isSame(e,t)||this.isAfter(e,t)}}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/isSameOrBefore.d.ts b/node_modules/dayjs/plugin/isSameOrBefore.d.ts
new file mode 100644
index 0000000..d52b095
--- /dev/null
+++ b/node_modules/dayjs/plugin/isSameOrBefore.d.ts
@@ -0,0 +1,10 @@
+import { PluginFunc, ConfigType, OpUnitType } from 'dayjs'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs' {
+  interface Dayjs {
+    isSameOrBefore(date?: ConfigType, unit?: OpUnitType): boolean
+  }
+}
diff --git a/node_modules/dayjs/plugin/isSameOrBefore.js b/node_modules/dayjs/plugin/isSameOrBefore.js
new file mode 100644
index 0000000..57a767e
--- /dev/null
+++ b/node_modules/dayjs/plugin/isSameOrBefore.js
@@ -0,0 +1 @@
+!function(e,i){"object"==typeof exports&&"undefined"!=typeof module?module.exports=i():"function"==typeof define&&define.amd?define(i):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_plugin_isSameOrBefore=i()}(this,(function(){"use strict";return function(e,i){i.prototype.isSameOrBefore=function(e,i){return this.isSame(e,i)||this.isBefore(e,i)}}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/isToday.d.ts b/node_modules/dayjs/plugin/isToday.d.ts
new file mode 100644
index 0000000..04ac581
--- /dev/null
+++ b/node_modules/dayjs/plugin/isToday.d.ts
@@ -0,0 +1,10 @@
+import { PluginFunc } from 'dayjs'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs' {
+  interface Dayjs {
+    isToday(): boolean
+  }
+}
diff --git a/node_modules/dayjs/plugin/isToday.js b/node_modules/dayjs/plugin/isToday.js
new file mode 100644
index 0000000..ee9f9cd
--- /dev/null
+++ b/node_modules/dayjs/plugin/isToday.js
@@ -0,0 +1 @@
+!function(e,o){"object"==typeof exports&&"undefined"!=typeof module?module.exports=o():"function"==typeof define&&define.amd?define(o):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_plugin_isToday=o()}(this,(function(){"use strict";return function(e,o,t){o.prototype.isToday=function(){var e="YYYY-MM-DD",o=t();return this.format(e)===o.format(e)}}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/isTomorrow.d.ts b/node_modules/dayjs/plugin/isTomorrow.d.ts
new file mode 100644
index 0000000..08110b6
--- /dev/null
+++ b/node_modules/dayjs/plugin/isTomorrow.d.ts
@@ -0,0 +1,10 @@
+import { PluginFunc } from 'dayjs'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs' {
+  interface Dayjs {
+    isTomorrow(): boolean
+  }
+}
diff --git a/node_modules/dayjs/plugin/isTomorrow.js b/node_modules/dayjs/plugin/isTomorrow.js
new file mode 100644
index 0000000..ca85044
--- /dev/null
+++ b/node_modules/dayjs/plugin/isTomorrow.js
@@ -0,0 +1 @@
+!function(o,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(o="undefined"!=typeof globalThis?globalThis:o||self).dayjs_plugin_isTomorrow=e()}(this,(function(){"use strict";return function(o,e,t){e.prototype.isTomorrow=function(){var o="YYYY-MM-DD",e=t().add(1,"day");return this.format(o)===e.format(o)}}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/isYesterday.d.ts b/node_modules/dayjs/plugin/isYesterday.d.ts
new file mode 100644
index 0000000..2d8ae9e
--- /dev/null
+++ b/node_modules/dayjs/plugin/isYesterday.d.ts
@@ -0,0 +1,10 @@
+import { PluginFunc } from 'dayjs'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs' {
+  interface Dayjs {
+    isYesterday(): boolean
+  }
+}
diff --git a/node_modules/dayjs/plugin/isYesterday.js b/node_modules/dayjs/plugin/isYesterday.js
new file mode 100644
index 0000000..b63b68a
--- /dev/null
+++ b/node_modules/dayjs/plugin/isYesterday.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_plugin_isYesterday=t()}(this,(function(){"use strict";return function(e,t,n){t.prototype.isYesterday=function(){var e="YYYY-MM-DD",t=n().subtract(1,"day");return this.format(e)===t.format(e)}}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/isoWeek.d.ts b/node_modules/dayjs/plugin/isoWeek.d.ts
new file mode 100644
index 0000000..3f4d88f
--- /dev/null
+++ b/node_modules/dayjs/plugin/isoWeek.d.ts
@@ -0,0 +1,27 @@
+import { PluginFunc, OpUnitType, ConfigType } from 'dayjs'
+
+declare const plugin: PluginFunc
+export = plugin
+
+type ISOUnitType = OpUnitType | 'isoWeek';
+
+declare module 'dayjs' {
+  interface Dayjs {
+    isoWeekYear(): number
+    isoWeek(): number
+    isoWeek(value: number): Dayjs
+
+    isoWeekday(): number
+    isoWeekday(value: number): Dayjs
+
+    startOf(unit: ISOUnitType): Dayjs
+
+    endOf(unit: ISOUnitType): Dayjs
+
+    isSame(date?: ConfigType, unit?: ISOUnitType): boolean
+
+    isBefore(date?: ConfigType, unit?: ISOUnitType): boolean
+
+    isAfter(date?: ConfigType, unit?: ISOUnitType): boolean
+  }
+}
diff --git a/node_modules/dayjs/plugin/isoWeek.js b/node_modules/dayjs/plugin/isoWeek.js
new file mode 100644
index 0000000..202ade7
--- /dev/null
+++ b/node_modules/dayjs/plugin/isoWeek.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_plugin_isoWeek=t()}(this,(function(){"use strict";var e="day";return function(t,i,s){var a=function(t){return t.add(4-t.isoWeekday(),e)},d=i.prototype;d.isoWeekYear=function(){return a(this).year()},d.isoWeek=function(t){if(!this.$utils().u(t))return this.add(7*(t-this.isoWeek()),e);var i,d,n,o,r=a(this),u=(i=this.isoWeekYear(),d=this.$u,n=(d?s.utc:s)().year(i).startOf("year"),o=4-n.isoWeekday(),n.isoWeekday()>4&&(o+=7),n.add(o,e));return r.diff(u,"week")+1},d.isoWeekday=function(e){return this.$utils().u(e)?this.day()||7:this.day(this.day()%7?e:e-7)};var n=d.startOf;d.startOf=function(e,t){var i=this.$utils(),s=!!i.u(t)||t;return"isoweek"===i.p(e)?s?this.date(this.date()-(this.isoWeekday()-1)).startOf("day"):this.date(this.date()-1-(this.isoWeekday()-1)+7).endOf("day"):n.bind(this)(e,t)}}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/isoWeeksInYear.d.ts b/node_modules/dayjs/plugin/isoWeeksInYear.d.ts
new file mode 100644
index 0000000..2bc02cd
--- /dev/null
+++ b/node_modules/dayjs/plugin/isoWeeksInYear.d.ts
@@ -0,0 +1,10 @@
+import { PluginFunc } from 'dayjs'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs' {
+  interface Dayjs {
+    isoWeeksInYear(): number
+  }
+}
diff --git a/node_modules/dayjs/plugin/isoWeeksInYear.js b/node_modules/dayjs/plugin/isoWeeksInYear.js
new file mode 100644
index 0000000..2bd20cd
--- /dev/null
+++ b/node_modules/dayjs/plugin/isoWeeksInYear.js
@@ -0,0 +1 @@
+!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_plugin_isoWeeksInYear=n()}(this,(function(){"use strict";return function(e,n){n.prototype.isoWeeksInYear=function(){var e=this.isLeapYear(),n=this.endOf("y").day();return 4===n||e&&5===n?53:52}}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/localeData.d.ts b/node_modules/dayjs/plugin/localeData.d.ts
new file mode 100644
index 0000000..ae9e557
--- /dev/null
+++ b/node_modules/dayjs/plugin/localeData.d.ts
@@ -0,0 +1,44 @@
+import { PluginFunc } from 'dayjs'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs' {
+  type WeekdayNames = [string, string, string, string, string, string, string];
+  type MonthNames = [string, string, string, string, string, string, string, string, string, string, string, string];
+
+  interface InstanceLocaleDataReturn {
+    firstDayOfWeek(): number;
+    weekdays(instance?: Dayjs): WeekdayNames;
+    weekdaysShort(instance?: Dayjs): WeekdayNames;
+    weekdaysMin(instance?: Dayjs): WeekdayNames;
+    months(instance?: Dayjs): MonthNames;
+    monthsShort(instance?: Dayjs): MonthNames;
+    longDateFormat(format: string): string;
+    meridiem(hour?: number, minute?: number, isLower?: boolean): string;
+    ordinal(n: number): string
+  }
+
+  interface GlobalLocaleDataReturn {
+    firstDayOfWeek(): number;
+    weekdays(): WeekdayNames;
+    weekdaysShort(): WeekdayNames;
+    weekdaysMin(): WeekdayNames;
+    months(): MonthNames;
+    monthsShort(): MonthNames;
+    longDateFormat(format: string): string;
+    meridiem(hour?: number, minute?: number, isLower?: boolean): string;
+    ordinal(n: number): string
+  }
+
+  interface Dayjs {
+    localeData(): InstanceLocaleDataReturn;
+  }
+
+  export function weekdays(localOrder?: boolean): WeekdayNames;
+  export function weekdaysShort(localOrder?: boolean): WeekdayNames;
+  export function weekdaysMin(localOrder?: boolean): WeekdayNames;
+  export function monthsShort(): MonthNames;
+  export function months(): MonthNames;
+  export function localeData(): GlobalLocaleDataReturn;
+}
diff --git a/node_modules/dayjs/plugin/localeData.js b/node_modules/dayjs/plugin/localeData.js
new file mode 100644
index 0000000..55e01ee
--- /dev/null
+++ b/node_modules/dayjs/plugin/localeData.js
@@ -0,0 +1 @@
+!function(n,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(n="undefined"!=typeof globalThis?globalThis:n||self).dayjs_plugin_localeData=e()}(this,(function(){"use strict";return function(n,e,t){var r=e.prototype,o=function(n){return n&&(n.indexOf?n:n.s)},u=function(n,e,t,r,u){var i=n.name?n:n.$locale(),a=o(i[e]),s=o(i[t]),f=a||s.map((function(n){return n.slice(0,r)}));if(!u)return f;var d=i.weekStart;return f.map((function(n,e){return f[(e+(d||0))%7]}))},i=function(){return t.Ls[t.locale()]},a=function(n,e){return n.formats[e]||function(n){return n.replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,(function(n,e,t){return e||t.slice(1)}))}(n.formats[e.toUpperCase()])},s=function(){var n=this;return{months:function(e){return e?e.format("MMMM"):u(n,"months")},monthsShort:function(e){return e?e.format("MMM"):u(n,"monthsShort","months",3)},firstDayOfWeek:function(){return n.$locale().weekStart||0},weekdays:function(e){return e?e.format("dddd"):u(n,"weekdays")},weekdaysMin:function(e){return e?e.format("dd"):u(n,"weekdaysMin","weekdays",2)},weekdaysShort:function(e){return e?e.format("ddd"):u(n,"weekdaysShort","weekdays",3)},longDateFormat:function(e){return a(n.$locale(),e)},meridiem:this.$locale().meridiem,ordinal:this.$locale().ordinal}};r.localeData=function(){return s.bind(this)()},t.localeData=function(){var n=i();return{firstDayOfWeek:function(){return n.weekStart||0},weekdays:function(){return t.weekdays()},weekdaysShort:function(){return t.weekdaysShort()},weekdaysMin:function(){return t.weekdaysMin()},months:function(){return t.months()},monthsShort:function(){return t.monthsShort()},longDateFormat:function(e){return a(n,e)},meridiem:n.meridiem,ordinal:n.ordinal}},t.months=function(){return u(i(),"months")},t.monthsShort=function(){return u(i(),"monthsShort","months",3)},t.weekdays=function(n){return u(i(),"weekdays",null,null,n)},t.weekdaysShort=function(n){return u(i(),"weekdaysShort","weekdays",3,n)},t.weekdaysMin=function(n){return u(i(),"weekdaysMin","weekdays",2,n)}}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/localizedFormat.d.ts b/node_modules/dayjs/plugin/localizedFormat.d.ts
new file mode 100644
index 0000000..30ec75e
--- /dev/null
+++ b/node_modules/dayjs/plugin/localizedFormat.d.ts
@@ -0,0 +1,4 @@
+import { PluginFunc } from 'dayjs'
+
+declare const plugin: PluginFunc
+export = plugin
diff --git a/node_modules/dayjs/plugin/localizedFormat.js b/node_modules/dayjs/plugin/localizedFormat.js
new file mode 100644
index 0000000..2aa4665
--- /dev/null
+++ b/node_modules/dayjs/plugin/localizedFormat.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_plugin_localizedFormat=t()}(this,(function(){"use strict";var e={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"};return function(t,o,n){var r=o.prototype,i=r.format;n.en.formats=e,r.format=function(t){void 0===t&&(t="YYYY-MM-DDTHH:mm:ssZ");var o=this.$locale().formats,n=function(t,o){return t.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g,(function(t,n,r){var i=r&&r.toUpperCase();return n||o[r]||e[r]||o[i].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,(function(e,t,o){return t||o.slice(1)}))}))}(t,void 0===o?{}:o);return i.call(this,n)}}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/minMax.d.ts b/node_modules/dayjs/plugin/minMax.d.ts
new file mode 100644
index 0000000..4c5f6dc
--- /dev/null
+++ b/node_modules/dayjs/plugin/minMax.d.ts
@@ -0,0 +1,11 @@
+import { PluginFunc } from 'dayjs'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs' {
+  export function max(dayjs: Dayjs[]): Dayjs | null
+  export function max(...dayjs: Dayjs[]): Dayjs | null
+  export function min(dayjs: Dayjs[]): Dayjs | null
+  export function min(...dayjs: Dayjs[]): Dayjs | null
+}
diff --git a/node_modules/dayjs/plugin/minMax.js b/node_modules/dayjs/plugin/minMax.js
new file mode 100644
index 0000000..ce06314
--- /dev/null
+++ b/node_modules/dayjs/plugin/minMax.js
@@ -0,0 +1 @@
+!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_plugin_minMax=n()}(this,(function(){"use strict";return function(e,n,t){var i=function(e,n){if(!n||!n.length||1===n.length&&!n[0]||1===n.length&&Array.isArray(n[0])&&!n[0].length)return null;var t;1===n.length&&n[0].length>0&&(n=n[0]);t=(n=n.filter((function(e){return e})))[0];for(var i=1;i<n.length;i+=1)n[i].isValid()&&!n[i][e](t)||(t=n[i]);return t};t.max=function(){var e=[].slice.call(arguments,0);return i("isAfter",e)},t.min=function(){var e=[].slice.call(arguments,0);return i("isBefore",e)}}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/objectSupport.d.ts b/node_modules/dayjs/plugin/objectSupport.d.ts
new file mode 100644
index 0000000..ad0e1ff
--- /dev/null
+++ b/node_modules/dayjs/plugin/objectSupport.d.ts
@@ -0,0 +1,48 @@
+import { PluginFunc } from 'dayjs'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs' {
+    interface Dayjs {
+        set(argument: object): Dayjs
+        add(argument: object): Dayjs
+        subtract(argument: object): Dayjs
+    }
+
+    interface ConfigTypeMap {
+        objectSupport: {
+            years?: number | string;
+            year?: number | string;
+            y?: number | string;
+
+            months?: number | string;
+            month?: number | string;
+            M?: number | string;
+
+            days?: number | string;
+            day?: number | string;
+            d?: number | string;
+
+            dates?: number | string;
+            date?: number | string;
+            D?: number | string;
+
+            hours?: number | string;
+            hour?: number | string;
+            h?: number | string;
+
+            minutes?: number | string;
+            minute?: number | string;
+            m?: number | string;
+
+            seconds?: number | string;
+            second?: number | string;
+            s?: number | string;
+
+            milliseconds?: number | string;
+            millisecond?: number | string;
+            ms?: number | string;
+        }
+    }
+}
diff --git a/node_modules/dayjs/plugin/objectSupport.js b/node_modules/dayjs/plugin/objectSupport.js
new file mode 100644
index 0000000..a9e1398
--- /dev/null
+++ b/node_modules/dayjs/plugin/objectSupport.js
@@ -0,0 +1 @@
+!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(t="undefined"!=typeof globalThis?globalThis:t||self).dayjs_plugin_objectSupport=n()}(this,(function(){"use strict";return function(t,n,e){var i=n.prototype,r=function(t){var n,r=t.date,o=t.utc,u={};if(!(null===(n=r)||n instanceof Date||n instanceof Array||i.$utils().u(n)||"Object"!==n.constructor.name)){if(!Object.keys(r).length)return new Date;var a=o?e.utc():e();Object.keys(r).forEach((function(t){var n,e;u[(n=t,e=i.$utils().p(n),"date"===e?"day":e)]=r[t]}));var c=u.day||(u.year||u.month>=0?1:a.date()),s=u.year||a.year(),d=u.month>=0?u.month:u.year||u.day?0:a.month(),f=u.hour||0,b=u.minute||0,h=u.second||0,y=u.millisecond||0;return o?new Date(Date.UTC(s,d,c,f,b,h,y)):new Date(s,d,c,f,b,h,y)}return r},o=i.parse;i.parse=function(t){t.date=r.bind(this)(t),o.bind(this)(t)};var u=i.set,a=i.add,c=i.subtract,s=function(t,n,e,i){void 0===i&&(i=1);var r=Object.keys(n),o=this;return r.forEach((function(e){o=t.bind(o)(n[e]*i,e)})),o};i.set=function(t,n){return n=void 0===n?t:n,"Object"===t.constructor.name?s.bind(this)((function(t,n){return u.bind(this)(n,t)}),n,t):u.bind(this)(t,n)},i.add=function(t,n){return"Object"===t.constructor.name?s.bind(this)(a,t,n):a.bind(this)(t,n)},i.subtract=function(t,n){return"Object"===t.constructor.name?s.bind(this)(a,t,n,-1):c.bind(this)(t,n)}}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/pluralGetSet.d.ts b/node_modules/dayjs/plugin/pluralGetSet.d.ts
new file mode 100644
index 0000000..ab2d89a
--- /dev/null
+++ b/node_modules/dayjs/plugin/pluralGetSet.d.ts
@@ -0,0 +1,44 @@
+import { PluginFunc, UnitType, ConfigType } from 'dayjs'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs' {
+  interface Dayjs {
+    years(): number
+
+    years(value: number): Dayjs
+
+    months(): number
+
+    months(value: number): Dayjs
+
+    dates(): number
+
+    dates(value: number): Dayjs
+
+    weeks(): number
+
+    weeks(value: number): Dayjs
+
+    days(): number
+
+    days(value: number): Dayjs
+
+    hours(): number
+
+    hours(value: number): Dayjs
+
+    minutes(): number
+
+    minutes(value: number): Dayjs
+
+    seconds(): number
+
+    seconds(value: number): Dayjs
+
+    milliseconds(): number
+
+    milliseconds(value: number): Dayjs
+  }
+}
diff --git a/node_modules/dayjs/plugin/pluralGetSet.js b/node_modules/dayjs/plugin/pluralGetSet.js
new file mode 100644
index 0000000..d758494
--- /dev/null
+++ b/node_modules/dayjs/plugin/pluralGetSet.js
@@ -0,0 +1 @@
+!function(e,o){"object"==typeof exports&&"undefined"!=typeof module?module.exports=o():"function"==typeof define&&define.amd?define(o):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_plugin_pluralGetSet=o()}(this,(function(){"use strict";return function(e,o){var s=o.prototype;["milliseconds","seconds","minutes","hours","days","weeks","isoWeeks","months","quarters","years","dates"].forEach((function(e){s[e]=s[e.replace(/s$/,"")]}))}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/preParsePostFormat.d.ts b/node_modules/dayjs/plugin/preParsePostFormat.d.ts
new file mode 100644
index 0000000..30ec75e
--- /dev/null
+++ b/node_modules/dayjs/plugin/preParsePostFormat.d.ts
@@ -0,0 +1,4 @@
+import { PluginFunc } from 'dayjs'
+
+declare const plugin: PluginFunc
+export = plugin
diff --git a/node_modules/dayjs/plugin/preParsePostFormat.js b/node_modules/dayjs/plugin/preParsePostFormat.js
new file mode 100644
index 0000000..5611d10
--- /dev/null
+++ b/node_modules/dayjs/plugin/preParsePostFormat.js
@@ -0,0 +1 @@
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).dayjs_plugin_preParsePostFormat=e()}(this,(function(){"use strict";return function(t,e){var o=e.prototype.parse;e.prototype.parse=function(t){if("string"==typeof t.date){var e=this.$locale();t.date=e&&e.preparse?e.preparse(t.date):t.date}return o.bind(this)(t)};var r=e.prototype.format;e.prototype.format=function(){for(var t=arguments.length,e=new Array(t),o=0;o<t;o++)e[o]=arguments[o];var a=r.call.apply(r,[this].concat(e)),p=this.$locale();return p&&p.postformat?p.postformat(a):a};var a=e.prototype.fromToBase;a&&(e.prototype.fromToBase=function(t,e,o,r){var p=this.$locale()||o.$locale();return a.call(this,t,e,o,r,p&&p.postformat)})}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/quarterOfYear.d.ts b/node_modules/dayjs/plugin/quarterOfYear.d.ts
new file mode 100644
index 0000000..317e0ad
--- /dev/null
+++ b/node_modules/dayjs/plugin/quarterOfYear.d.ts
@@ -0,0 +1,26 @@
+import { PluginFunc, ConfigType, QUnitType, OpUnitType } from 'dayjs'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs' {
+  interface Dayjs {
+    quarter(): number
+
+    quarter(quarter: number): Dayjs
+
+    add(value: number, unit: QUnitType): Dayjs
+
+    subtract(value: number, unit: QUnitType): Dayjs
+
+    startOf(unit: QUnitType | OpUnitType): Dayjs
+
+    endOf(unit: QUnitType | OpUnitType): Dayjs
+
+    isSame(date?: ConfigType, unit?: QUnitType): boolean
+
+    isBefore(date?: ConfigType, unit?: QUnitType): boolean
+
+    isAfter(date?: ConfigType, unit?: QUnitType): boolean
+  }
+}
diff --git a/node_modules/dayjs/plugin/quarterOfYear.js b/node_modules/dayjs/plugin/quarterOfYear.js
new file mode 100644
index 0000000..6bfe4c2
--- /dev/null
+++ b/node_modules/dayjs/plugin/quarterOfYear.js
@@ -0,0 +1 @@
+!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(t="undefined"!=typeof globalThis?globalThis:t||self).dayjs_plugin_quarterOfYear=n()}(this,(function(){"use strict";var t="month",n="quarter";return function(e,i){var r=i.prototype;r.quarter=function(t){return this.$utils().u(t)?Math.ceil((this.month()+1)/3):this.month(this.month()%3+3*(t-1))};var s=r.add;r.add=function(e,i){return e=Number(e),this.$utils().p(i)===n?this.add(3*e,t):s.bind(this)(e,i)};var u=r.startOf;r.startOf=function(e,i){var r=this.$utils(),s=!!r.u(i)||i;if(r.p(e)===n){var o=this.quarter()-1;return s?this.month(3*o).startOf(t).startOf("day"):this.month(3*o+2).endOf(t).endOf("day")}return u.bind(this)(e,i)}}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/relativeTime.d.ts b/node_modules/dayjs/plugin/relativeTime.d.ts
new file mode 100644
index 0000000..444b0c2
--- /dev/null
+++ b/node_modules/dayjs/plugin/relativeTime.d.ts
@@ -0,0 +1,24 @@
+import { PluginFunc, ConfigType } from 'dayjs'
+
+declare interface RelativeTimeThreshold {
+  l: string
+  r?: number
+  d?: string
+}
+
+declare interface RelativeTimeOptions {
+  rounding?: (num: number) => number
+  thresholds?: RelativeTimeThreshold[]
+}
+
+declare const plugin: PluginFunc<RelativeTimeOptions>
+export = plugin
+
+declare module 'dayjs' {
+  interface Dayjs {
+    fromNow(withoutSuffix?: boolean): string
+    from(compared: ConfigType, withoutSuffix?: boolean): string
+    toNow(withoutSuffix?: boolean): string
+    to(compared: ConfigType, withoutSuffix?: boolean): string
+  }
+}
diff --git a/node_modules/dayjs/plugin/relativeTime.js b/node_modules/dayjs/plugin/relativeTime.js
new file mode 100644
index 0000000..898eee6
--- /dev/null
+++ b/node_modules/dayjs/plugin/relativeTime.js
@@ -0,0 +1 @@
+!function(r,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(r="undefined"!=typeof globalThis?globalThis:r||self).dayjs_plugin_relativeTime=e()}(this,(function(){"use strict";return function(r,e,t){r=r||{};var n=e.prototype,o={future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function i(r,e,t,o){return n.fromToBase(r,e,t,o)}t.en.relativeTime=o,n.fromToBase=function(e,n,i,d,u){for(var f,a,s,l=i.$locale().relativeTime||o,h=r.thresholds||[{l:"s",r:44,d:"second"},{l:"m",r:89},{l:"mm",r:44,d:"minute"},{l:"h",r:89},{l:"hh",r:21,d:"hour"},{l:"d",r:35},{l:"dd",r:25,d:"day"},{l:"M",r:45},{l:"MM",r:10,d:"month"},{l:"y",r:17},{l:"yy",d:"year"}],m=h.length,c=0;c<m;c+=1){var y=h[c];y.d&&(f=d?t(e).diff(i,y.d,!0):i.diff(e,y.d,!0));var p=(r.rounding||Math.round)(Math.abs(f));if(s=f>0,p<=y.r||!y.r){p<=1&&c>0&&(y=h[c-1]);var v=l[y.l];u&&(p=u(""+p)),a="string"==typeof v?v.replace("%d",p):v(p,n,y.l,s);break}}if(n)return a;var M=s?l.future:l.past;return"function"==typeof M?M(a):M.replace("%s",a)},n.to=function(r,e){return i(r,e,this,!0)},n.from=function(r,e){return i(r,e,this)};var d=function(r){return r.$u?t.utc():t()};n.toNow=function(r){return this.to(d(this),r)},n.fromNow=function(r){return this.from(d(this),r)}}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/timezone.d.ts b/node_modules/dayjs/plugin/timezone.d.ts
new file mode 100644
index 0000000..049bb08
--- /dev/null
+++ b/node_modules/dayjs/plugin/timezone.d.ts
@@ -0,0 +1,20 @@
+import { PluginFunc, ConfigType } from 'dayjs'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs' {
+  interface Dayjs {
+    tz(timezone?: string, keepLocalTime?: boolean): Dayjs
+    offsetName(type?: 'short' | 'long'): string | undefined
+  }
+
+  interface DayjsTimezone {
+    (date?: ConfigType, timezone?: string): Dayjs
+    (date: ConfigType, format: string, timezone?: string): Dayjs
+    guess(): string
+    setDefault(timezone?: string): void
+  }
+
+  const tz: DayjsTimezone
+}
diff --git a/node_modules/dayjs/plugin/timezone.js b/node_modules/dayjs/plugin/timezone.js
new file mode 100644
index 0000000..b778bef
--- /dev/null
+++ b/node_modules/dayjs/plugin/timezone.js
@@ -0,0 +1 @@
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).dayjs_plugin_timezone=e()}(this,(function(){"use strict";var t={year:0,month:1,day:2,hour:3,minute:4,second:5},e={};return function(n,i,o){var r,a=function(t,n,i){void 0===i&&(i={});var o=new Date(t),r=function(t,n){void 0===n&&(n={});var i=n.timeZoneName||"short",o=t+"|"+i,r=e[o];return r||(r=new Intl.DateTimeFormat("en-US",{hour12:!1,timeZone:t,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",timeZoneName:i}),e[o]=r),r}(n,i);return r.formatToParts(o)},u=function(e,n){for(var i=a(e,n),r=[],u=0;u<i.length;u+=1){var f=i[u],s=f.type,m=f.value,c=t[s];c>=0&&(r[c]=parseInt(m,10))}var d=r[3],l=24===d?0:d,h=r[0]+"-"+r[1]+"-"+r[2]+" "+l+":"+r[4]+":"+r[5]+":000",v=+e;return(o.utc(h).valueOf()-(v-=v%1e3))/6e4},f=i.prototype;f.tz=function(t,e){void 0===t&&(t=r);var n=this.utcOffset(),i=this.toDate(),a=i.toLocaleString("en-US",{timeZone:t}),u=Math.round((i-new Date(a))/1e3/60),f=o(a,{locale:this.$L}).$set("millisecond",this.$ms).utcOffset(15*-Math.round(i.getTimezoneOffset()/15)-u,!0);if(e){var s=f.utcOffset();f=f.add(n-s,"minute")}return f.$x.$timezone=t,f},f.offsetName=function(t){var e=this.$x.$timezone||o.tz.guess(),n=a(this.valueOf(),e,{timeZoneName:t}).find((function(t){return"timezonename"===t.type.toLowerCase()}));return n&&n.value};var s=f.startOf;f.startOf=function(t,e){if(!this.$x||!this.$x.$timezone)return s.call(this,t,e);var n=o(this.format("YYYY-MM-DD HH:mm:ss:SSS"),{locale:this.$L});return s.call(n,t,e).tz(this.$x.$timezone,!0)},o.tz=function(t,e,n){var i=n&&e,a=n||e||r,f=u(+o(),a);if("string"!=typeof t)return o(t).tz(a);var s=function(t,e,n){var i=t-60*e*1e3,o=u(i,n);if(e===o)return[i,e];var r=u(i-=60*(o-e)*1e3,n);return o===r?[i,o]:[t-60*Math.min(o,r)*1e3,Math.max(o,r)]}(o.utc(t,i).valueOf(),f,a),m=s[0],c=s[1],d=o(m).utcOffset(c);return d.$x.$timezone=a,d},o.tz.guess=function(){return Intl.DateTimeFormat().resolvedOptions().timeZone},o.tz.setDefault=function(t){r=t}}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/toArray.d.ts b/node_modules/dayjs/plugin/toArray.d.ts
new file mode 100644
index 0000000..45f1f0c
--- /dev/null
+++ b/node_modules/dayjs/plugin/toArray.d.ts
@@ -0,0 +1,10 @@
+import { PluginFunc } from 'dayjs'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs' {
+  interface Dayjs {
+    toArray(): number[]
+  }
+}
diff --git a/node_modules/dayjs/plugin/toArray.js b/node_modules/dayjs/plugin/toArray.js
new file mode 100644
index 0000000..ac06750
--- /dev/null
+++ b/node_modules/dayjs/plugin/toArray.js
@@ -0,0 +1 @@
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).dayjs_plugin_toArray=e()}(this,(function(){"use strict";return function(t,e){e.prototype.toArray=function(){return[this.$y,this.$M,this.$D,this.$H,this.$m,this.$s,this.$ms]}}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/toObject.d.ts b/node_modules/dayjs/plugin/toObject.d.ts
new file mode 100644
index 0000000..ca12aaf
--- /dev/null
+++ b/node_modules/dayjs/plugin/toObject.d.ts
@@ -0,0 +1,20 @@
+import { PluginFunc } from 'dayjs'
+
+declare const plugin: PluginFunc
+export = plugin
+
+interface DayjsObject {
+  years: number
+  months: number
+  date: number
+  hours: number
+  minutes: number
+  seconds: number
+  milliseconds: number
+}
+
+declare module 'dayjs' {
+  interface Dayjs {
+    toObject(): DayjsObject
+  }
+}
diff --git a/node_modules/dayjs/plugin/toObject.js b/node_modules/dayjs/plugin/toObject.js
new file mode 100644
index 0000000..573b49e
--- /dev/null
+++ b/node_modules/dayjs/plugin/toObject.js
@@ -0,0 +1 @@
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).dayjs_plugin_toObject=e()}(this,(function(){"use strict";return function(t,e){e.prototype.toObject=function(){return{years:this.$y,months:this.$M,date:this.$D,hours:this.$H,minutes:this.$m,seconds:this.$s,milliseconds:this.$ms}}}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/updateLocale.d.ts b/node_modules/dayjs/plugin/updateLocale.d.ts
new file mode 100644
index 0000000..ef1c01d
--- /dev/null
+++ b/node_modules/dayjs/plugin/updateLocale.d.ts
@@ -0,0 +1,8 @@
+import { PluginFunc } from 'dayjs'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs' {
+  export function updateLocale(localeName: string, customConfig: Record<string, unknown>): Record<string, unknown>
+}
diff --git a/node_modules/dayjs/plugin/updateLocale.js b/node_modules/dayjs/plugin/updateLocale.js
new file mode 100644
index 0000000..811d9e9
--- /dev/null
+++ b/node_modules/dayjs/plugin/updateLocale.js
@@ -0,0 +1 @@
+!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_plugin_updateLocale=n()}(this,(function(){"use strict";return function(e,n,t){t.updateLocale=function(e,n){var o=t.Ls[e];if(o)return(n?Object.keys(n):[]).forEach((function(e){o[e]=n[e]})),o}}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/utc.d.ts b/node_modules/dayjs/plugin/utc.d.ts
new file mode 100644
index 0000000..544ea4e
--- /dev/null
+++ b/node_modules/dayjs/plugin/utc.d.ts
@@ -0,0 +1,19 @@
+import { PluginFunc, ConfigType } from 'dayjs'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs' {
+  interface Dayjs {
+    
+    utc(keepLocalTime?: boolean): Dayjs
+    
+    local(): Dayjs
+
+    isUTC(): boolean
+
+    utcOffset(offset: number | string, keepLocalTime?: boolean): Dayjs
+  }
+
+  export function utc(config?: ConfigType, format?: string, strict?: boolean): Dayjs
+}
diff --git a/node_modules/dayjs/plugin/utc.js b/node_modules/dayjs/plugin/utc.js
new file mode 100644
index 0000000..af07564
--- /dev/null
+++ b/node_modules/dayjs/plugin/utc.js
@@ -0,0 +1 @@
+!function(t,i){"object"==typeof exports&&"undefined"!=typeof module?module.exports=i():"function"==typeof define&&define.amd?define(i):(t="undefined"!=typeof globalThis?globalThis:t||self).dayjs_plugin_utc=i()}(this,(function(){"use strict";var t="minute",i=/[+-]\d\d(?::?\d\d)?/g,e=/([+-]|\d\d)/g;return function(s,f,n){var u=f.prototype;n.utc=function(t){var i={date:t,utc:!0,args:arguments};return new f(i)},u.utc=function(i){var e=n(this.toDate(),{locale:this.$L,utc:!0});return i?e.add(this.utcOffset(),t):e},u.local=function(){return n(this.toDate(),{locale:this.$L,utc:!1})};var o=u.parse;u.parse=function(t){t.utc&&(this.$u=!0),this.$utils().u(t.$offset)||(this.$offset=t.$offset),o.call(this,t)};var r=u.init;u.init=function(){if(this.$u){var t=this.$d;this.$y=t.getUTCFullYear(),this.$M=t.getUTCMonth(),this.$D=t.getUTCDate(),this.$W=t.getUTCDay(),this.$H=t.getUTCHours(),this.$m=t.getUTCMinutes(),this.$s=t.getUTCSeconds(),this.$ms=t.getUTCMilliseconds()}else r.call(this)};var a=u.utcOffset;u.utcOffset=function(s,f){var n=this.$utils().u;if(n(s))return this.$u?0:n(this.$offset)?a.call(this):this.$offset;if("string"==typeof s&&(s=function(t){void 0===t&&(t="");var s=t.match(i);if(!s)return null;var f=(""+s[0]).match(e)||["-",0,0],n=f[0],u=60*+f[1]+ +f[2];return 0===u?0:"+"===n?u:-u}(s),null===s))return this;var u=Math.abs(s)<=16?60*s:s,o=this;if(f)return o.$offset=u,o.$u=0===s,o;if(0!==s){var r=this.$u?this.toDate().getTimezoneOffset():-1*this.utcOffset();(o=this.local().add(u+r,t)).$offset=u,o.$x.$localOffset=r}else o=this.utc();return o};var h=u.format;u.format=function(t){var i=t||(this.$u?"YYYY-MM-DDTHH:mm:ss[Z]":"");return h.call(this,i)},u.valueOf=function(){var t=this.$utils().u(this.$offset)?0:this.$offset+(this.$x.$localOffset||this.$d.getTimezoneOffset());return this.$d.valueOf()-6e4*t},u.isUTC=function(){return!!this.$u},u.toISOString=function(){return this.toDate().toISOString()},u.toString=function(){return this.toDate().toUTCString()};var l=u.toDate;u.toDate=function(t){return"s"===t&&this.$offset?n(this.format("YYYY-MM-DD HH:mm:ss:SSS")).toDate():l.call(this)};var c=u.diff;u.diff=function(t,i,e){if(t&&this.$u===t.$u)return c.call(this,t,i,e);var s=this.local(),f=n(t).local();return c.call(s,f,i,e)}}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/weekOfYear.d.ts b/node_modules/dayjs/plugin/weekOfYear.d.ts
new file mode 100644
index 0000000..d988014
--- /dev/null
+++ b/node_modules/dayjs/plugin/weekOfYear.d.ts
@@ -0,0 +1,12 @@
+import { PluginFunc } from 'dayjs'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs' {
+  interface Dayjs {
+    week(): number
+
+    week(value : number): Dayjs
+  }
+}
diff --git a/node_modules/dayjs/plugin/weekOfYear.js b/node_modules/dayjs/plugin/weekOfYear.js
new file mode 100644
index 0000000..7e234c4
--- /dev/null
+++ b/node_modules/dayjs/plugin/weekOfYear.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_plugin_weekOfYear=t()}(this,(function(){"use strict";var e="week",t="year";return function(i,n,r){var f=n.prototype;f.week=function(i){if(void 0===i&&(i=null),null!==i)return this.add(7*(i-this.week()),"day");var n=this.$locale().yearStart||1;if(11===this.month()&&this.date()>25){var f=r(this).startOf(t).add(1,t).date(n),s=r(this).endOf(e);if(f.isBefore(s))return 1}var a=r(this).startOf(t).date(n).startOf(e).subtract(1,"millisecond"),o=this.diff(a,e,!0);return o<0?r(this).startOf("week").week():Math.ceil(o)},f.weeks=function(e){return void 0===e&&(e=null),this.week(e)}}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/weekYear.d.ts b/node_modules/dayjs/plugin/weekYear.d.ts
new file mode 100644
index 0000000..df25331
--- /dev/null
+++ b/node_modules/dayjs/plugin/weekYear.d.ts
@@ -0,0 +1,10 @@
+import { PluginFunc } from 'dayjs'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs' {
+  interface Dayjs {
+    weekYear(): number
+  }
+}
diff --git a/node_modules/dayjs/plugin/weekYear.js b/node_modules/dayjs/plugin/weekYear.js
new file mode 100644
index 0000000..d90d137
--- /dev/null
+++ b/node_modules/dayjs/plugin/weekYear.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_plugin_weekYear=t()}(this,(function(){"use strict";return function(e,t){t.prototype.weekYear=function(){var e=this.month(),t=this.week(),n=this.year();return 1===t&&11===e?n+1:0===e&&t>=52?n-1:n}}}));
\ No newline at end of file
diff --git a/node_modules/dayjs/plugin/weekday.d.ts b/node_modules/dayjs/plugin/weekday.d.ts
new file mode 100644
index 0000000..87a8025
--- /dev/null
+++ b/node_modules/dayjs/plugin/weekday.d.ts
@@ -0,0 +1,12 @@
+import { PluginFunc } from 'dayjs'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs' {
+  interface Dayjs {
+    weekday(): number
+
+    weekday(value: number): Dayjs
+  }
+}
diff --git a/node_modules/dayjs/plugin/weekday.js b/node_modules/dayjs/plugin/weekday.js
new file mode 100644
index 0000000..ae2276b
--- /dev/null
+++ b/node_modules/dayjs/plugin/weekday.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_plugin_weekday=t()}(this,(function(){"use strict";return function(e,t){t.prototype.weekday=function(e){var t=this.$locale().weekStart||0,i=this.$W,n=(i<t?i+7:i)-t;return this.$utils().u(e)?n:this.subtract(n,"day").add(e,"day")}}}));
\ No newline at end of file
diff --git a/node_modules/delegate/.editorconfig b/node_modules/delegate/.editorconfig
new file mode 100644
index 0000000..0f1d01b
--- /dev/null
+++ b/node_modules/delegate/.editorconfig
@@ -0,0 +1,22 @@
+# EditorConfig helps developers define and maintain consistent
+# coding styles between different editors and IDEs
+# http://editorconfig.org
+
+root = true
+
+[*]
+# Change these settings to your own preference
+indent_style = space
+indent_size = 4
+
+# We recommend you to keep these unchanged
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[*.md]
+trim_trailing_whitespace = false
+
+[{package.json,bower.json}]
+indent_size = 2
diff --git a/node_modules/delegate/.travis.yml b/node_modules/delegate/.travis.yml
new file mode 100644
index 0000000..833d09d
--- /dev/null
+++ b/node_modules/delegate/.travis.yml
@@ -0,0 +1,3 @@
+language: node_js
+node_js:
+  - stable
diff --git a/node_modules/delegate/demo/delegate.html b/node_modules/delegate/demo/delegate.html
new file mode 100644
index 0000000..3c09921
--- /dev/null
+++ b/node_modules/delegate/demo/delegate.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Delegate</title>
+</head>
+<body>
+    <!-- 1. Write some markup -->
+    <ul>
+        <li><button>Item 1</button></li>
+        <li><button>Item 2</button></li>
+        <li><button>Item 3</button></li>
+        <li><button>Item 4</button></li>
+        <li><button>Item 5</button></li>
+    </ul>
+
+    <!-- 2. Include library -->
+    <script src="../dist/delegate.js"></script>
+
+    <!-- 3. Add event delegation -->
+    <script>
+    var ul = document.querySelector('ul');
+
+    delegate(ul, 'button', 'click', function(e) {
+        console.log(e.target);
+    });
+    </script>
+</body>
+</html>
diff --git a/node_modules/delegate/demo/multiple.html b/node_modules/delegate/demo/multiple.html
new file mode 100644
index 0000000..af6ca88
--- /dev/null
+++ b/node_modules/delegate/demo/multiple.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Delegate</title>
+</head>
+<body>
+    <!-- 1. Write some markup -->
+    <ul>
+        <li><button>Item 1</button></li>
+        <li><button>Item 2</button></li>
+        <li><button>Item 3</button></li>
+        <li><button>Item 4</button></li>
+        <li><button>Item 5</button></li>
+    </ul>
+    <ul>
+        <li><span>Item 6</span></li>
+        <li><span>Item 7</span></li>
+    </ul>
+
+    <!-- 2. Include library -->
+    <script src="../dist/delegate.js"></script>
+
+    <!-- 3. Add event delegation -->
+    <script>
+    var ul = document.querySelector('ul');
+
+    delegate(ul, 'button', 'click', function(e) {
+        console.log(e.target);
+    });
+
+    delegate(document.body, 'span', 'click', function(e) {
+        console.log(e.target);
+    });
+    </script>
+</body>
+</html>
diff --git a/node_modules/delegate/demo/undelegate.html b/node_modules/delegate/demo/undelegate.html
new file mode 100644
index 0000000..60b5948
--- /dev/null
+++ b/node_modules/delegate/demo/undelegate.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Undelegate</title>
+</head>
+<body>
+    <!-- 1. Write some markup -->
+    <ul>
+        <li><button>Item 1</button></li>
+        <li><button>Item 2</button></li>
+        <li><button>Item 3</button></li>
+        <li><button>Item 4</button></li>
+        <li><button>Item 5</button></li>
+    </ul>
+
+    <!-- 2. Include library -->
+    <script src="../dist/delegate.js"></script>
+
+    <!-- 3. Remove event delegation -->
+    <script>
+    var ul = document.querySelector('ul');
+
+    var delegation = delegate(ul, 'li button', 'click', function(e) {
+        console.log(e.target);
+    });
+
+    delegation.destroy();
+    </script>
+</body>
+</html>
diff --git a/node_modules/delegate/dist/delegate.js b/node_modules/delegate/dist/delegate.js
new file mode 100644
index 0000000..5763dfe
--- /dev/null
+++ b/node_modules/delegate/dist/delegate.js
@@ -0,0 +1,80 @@
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.delegate = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+var DOCUMENT_NODE_TYPE = 9;
+
+/**
+ * A polyfill for Element.matches()
+ */
+if (typeof Element !== 'undefined' && !Element.prototype.matches) {
+    var proto = Element.prototype;
+
+    proto.matches = proto.matchesSelector ||
+                    proto.mozMatchesSelector ||
+                    proto.msMatchesSelector ||
+                    proto.oMatchesSelector ||
+                    proto.webkitMatchesSelector;
+}
+
+/**
+ * Finds the closest parent that matches a selector.
+ *
+ * @param {Element} element
+ * @param {String} selector
+ * @return {Function}
+ */
+function closest (element, selector) {
+    while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {
+        if (element.matches(selector)) return element;
+        element = element.parentNode;
+    }
+}
+
+module.exports = closest;
+
+},{}],2:[function(require,module,exports){
+var closest = require('./closest');
+
+/**
+ * Delegates event to a selector.
+ *
+ * @param {Element} element
+ * @param {String} selector
+ * @param {String} type
+ * @param {Function} callback
+ * @param {Boolean} useCapture
+ * @return {Object}
+ */
+function delegate(element, selector, type, callback, useCapture) {
+    var listenerFn = listener.apply(this, arguments);
+
+    element.addEventListener(type, listenerFn, useCapture);
+
+    return {
+        destroy: function() {
+            element.removeEventListener(type, listenerFn, useCapture);
+        }
+    }
+}
+
+/**
+ * Finds closest match and invokes callback.
+ *
+ * @param {Element} element
+ * @param {String} selector
+ * @param {String} type
+ * @param {Function} callback
+ * @return {Function}
+ */
+function listener(element, selector, type, callback) {
+    return function(e) {
+        e.delegateTarget = closest(e.target, selector);
+
+        if (e.delegateTarget) {
+            callback.call(element, e);
+        }
+    }
+}
+
+module.exports = delegate;
+
+},{"./closest":1}]},{},[2])(2)
+});
\ No newline at end of file
diff --git a/node_modules/delegate/karma.conf.js b/node_modules/delegate/karma.conf.js
new file mode 100644
index 0000000..62d108e
--- /dev/null
+++ b/node_modules/delegate/karma.conf.js
@@ -0,0 +1,24 @@
+module.exports = function(karma) {
+    karma.set({
+        plugins: ['karma-browserify', 'karma-chai', 'karma-sinon', 'karma-mocha', 'karma-phantomjs-launcher'],
+
+        frameworks: ['browserify', 'chai', 'sinon', 'mocha'],
+
+        files: [
+            'src/**/*.js',
+            'test/**/*.js',
+            './node_modules/phantomjs-polyfill/bind-polyfill.js'
+        ],
+
+        preprocessors: {
+            'src/**/*.js' : ['browserify'],
+            'test/**/*.js': ['browserify']
+        },
+
+        browserify: {
+            debug: true
+        },
+
+        browsers: ['PhantomJS']
+    });
+}
diff --git a/node_modules/delegate/package.json b/node_modules/delegate/package.json
new file mode 100644
index 0000000..08ad22a
--- /dev/null
+++ b/node_modules/delegate/package.json
@@ -0,0 +1,31 @@
+{
+  "name": "delegate",
+  "description": "Lightweight event delegation",
+  "version": "3.2.0",
+  "repository": "zenorocha/delegate",
+  "license": "MIT",
+  "main": "src/delegate.js",
+  "keywords": [
+    "event",
+    "delegate",
+    "delegation"
+  ],
+  "devDependencies": {
+    "browserify": "^13.1.0",
+    "chai": "^3.5.0",
+    "karma": "^1.3.0",
+    "karma-browserify": "^5.1.0",
+    "karma-chai": "^0.1.0",
+    "karma-mocha": "^1.2.0",
+    "karma-phantomjs-launcher": "^1.0.2",
+    "karma-sinon": "^1.0.4",
+    "mocha": "^3.1.2",
+    "phantomjs-polyfill": "0.0.2",
+    "simulant": "^0.2.2",
+    "sinon": "^1.17.6"
+  },
+  "scripts": {
+    "build": "browserify src/delegate.js -s delegate -o dist/delegate.js",
+    "test": "karma start --single-run"
+  }
+}
diff --git a/node_modules/delegate/readme.md b/node_modules/delegate/readme.md
new file mode 100644
index 0000000..cae433a
--- /dev/null
+++ b/node_modules/delegate/readme.md
@@ -0,0 +1,99 @@
+# delegate
+
+Lightweight event delegation.
+
+## Install
+
+You can get it on npm.
+
+```
+npm install delegate --save
+```
+
+If you're not into package management, just [download a ZIP](https://github.com/zenorocha/delegate/archive/master.zip) file.
+
+## Setup
+
+###### Node (Browserify)
+
+```js
+var delegate = require('delegate');
+```
+
+###### Browser (Standalone)
+
+```html
+<script src="dist/delegate.js"></script>
+```
+
+## Usage
+
+### Add event delegation
+
+#### With the default base (`document`)
+
+```js
+delegate('.btn', 'click', function(e) {
+    console.log(e.delegateTarget);
+}, false);
+```
+
+#### With an element as base
+
+```js
+delegate(document.body, '.btn', 'click', function(e) {
+    console.log(e.delegateTarget);
+}, false);
+```
+
+#### With a selector (of existing elements) as base
+
+```js
+delegate('.container', '.btn', 'click', function(e) {
+    console.log(e.delegateTarget);
+}, false);
+```
+
+#### With an array/array-like of elements as base
+
+```js
+delegate(document.querySelectorAll('.container'), '.btn', 'click', function(e) {
+    console.log(e.delegateTarget);
+}, false);
+```
+
+### Remove event delegation
+
+#### With a single base element (default or specified)
+
+```js
+var delegation = delegate(document.body, '.btn', 'click', function(e) {
+    console.log(e.delegateTarget);
+}, false);
+
+delegation.destroy();
+```
+
+#### With multiple elements (via selector or array)
+
+Note: selectors are always treated as multiple elements, even if one or none are matched. `delegate()` will return an array.
+
+```js
+var delegations = delegate('.container', '.btn', 'click', function(e) {
+    console.log(e.delegateTarget);
+}, false);
+
+delegations.forEach(function (delegation) {
+    delegation.destroy();
+});
+```
+
+## Browser Support
+
+| <img src="https://clipboardjs.com/assets/images/chrome.png" width="48px" height="48px" alt="Chrome logo"> | <img src="https://clipboardjs.com/assets/images/edge.png" width="48px" height="48px" alt="Edge logo"> | <img src="https://clipboardjs.com/assets/images/firefox.png" width="48px" height="48px" alt="Firefox logo"> | <img src="https://clipboardjs.com/assets/images/ie.png" width="48px" height="48px" alt="Internet Explorer logo"> | <img src="https://clipboardjs.com/assets/images/opera.png" width="48px" height="48px" alt="Opera logo"> | <img src="https://clipboardjs.com/assets/images/safari.png" width="48px" height="48px" alt="Safari logo"> |
+|:---:|:---:|:---:|:---:|:---:|:---:|
+| Latest ✔ | Latest ✔ | Latest ✔ | 9+ ✔ | Latest ✔ | Latest ✔ |
+
+## License
+
+[MIT License](http://zenorocha.mit-license.org/) © Zeno Rocha
diff --git a/node_modules/delegate/src/closest.js b/node_modules/delegate/src/closest.js
new file mode 100644
index 0000000..842ea07
--- /dev/null
+++ b/node_modules/delegate/src/closest.js
@@ -0,0 +1,33 @@
+var DOCUMENT_NODE_TYPE = 9;
+
+/**
+ * A polyfill for Element.matches()
+ */
+if (typeof Element !== 'undefined' && !Element.prototype.matches) {
+    var proto = Element.prototype;
+
+    proto.matches = proto.matchesSelector ||
+                    proto.mozMatchesSelector ||
+                    proto.msMatchesSelector ||
+                    proto.oMatchesSelector ||
+                    proto.webkitMatchesSelector;
+}
+
+/**
+ * Finds the closest parent that matches a selector.
+ *
+ * @param {Element} element
+ * @param {String} selector
+ * @return {Function}
+ */
+function closest (element, selector) {
+    while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {
+        if (typeof element.matches === 'function' &&
+            element.matches(selector)) {
+          return element;
+        }
+        element = element.parentNode;
+    }
+}
+
+module.exports = closest;
diff --git a/node_modules/delegate/src/delegate.js b/node_modules/delegate/src/delegate.js
new file mode 100644
index 0000000..9d9397d
--- /dev/null
+++ b/node_modules/delegate/src/delegate.js
@@ -0,0 +1,78 @@
+var closest = require('./closest');
+
+/**
+ * Delegates event to a selector.
+ *
+ * @param {Element} element
+ * @param {String} selector
+ * @param {String} type
+ * @param {Function} callback
+ * @param {Boolean} useCapture
+ * @return {Object}
+ */
+function _delegate(element, selector, type, callback, useCapture) {
+    var listenerFn = listener.apply(this, arguments);
+
+    element.addEventListener(type, listenerFn, useCapture);
+
+    return {
+        destroy: function() {
+            element.removeEventListener(type, listenerFn, useCapture);
+        }
+    }
+}
+
+/**
+ * Delegates event to a selector.
+ *
+ * @param {Element|String|Array} [elements]
+ * @param {String} selector
+ * @param {String} type
+ * @param {Function} callback
+ * @param {Boolean} useCapture
+ * @return {Object}
+ */
+function delegate(elements, selector, type, callback, useCapture) {
+    // Handle the regular Element usage
+    if (typeof elements.addEventListener === 'function') {
+        return _delegate.apply(null, arguments);
+    }
+
+    // Handle Element-less usage, it defaults to global delegation
+    if (typeof type === 'function') {
+        // Use `document` as the first parameter, then apply arguments
+        // This is a short way to .unshift `arguments` without running into deoptimizations
+        return _delegate.bind(null, document).apply(null, arguments);
+    }
+
+    // Handle Selector-based usage
+    if (typeof elements === 'string') {
+        elements = document.querySelectorAll(elements);
+    }
+
+    // Handle Array-like based usage
+    return Array.prototype.map.call(elements, function (element) {
+        return _delegate(element, selector, type, callback, useCapture);
+    });
+}
+
+/**
+ * Finds closest match and invokes callback.
+ *
+ * @param {Element} element
+ * @param {String} selector
+ * @param {String} type
+ * @param {Function} callback
+ * @return {Function}
+ */
+function listener(element, selector, type, callback) {
+    return function(e) {
+        e.delegateTarget = closest(e.target, selector);
+
+        if (e.delegateTarget) {
+            callback.call(element, e);
+        }
+    }
+}
+
+module.exports = delegate;
diff --git a/node_modules/delegate/test/closest.js b/node_modules/delegate/test/closest.js
new file mode 100644
index 0000000..6a9e25f
--- /dev/null
+++ b/node_modules/delegate/test/closest.js
@@ -0,0 +1,45 @@
+var closest = require('../src/closest');
+
+describe('closest', function() {
+    before(function() {
+        var html = '<div id="a">' +
+                        '<div id="b">' +
+                            '<div id="c"></div>' +
+                        '</div>' +
+                    '</div>';
+
+        document.body.innerHTML += html;
+
+        global.a = document.querySelector('#a');
+        global.b = document.querySelector('#b');
+        global.c = document.querySelector('#c');
+    });
+
+    after(function() {
+        document.body.innerHTML = '';
+    });
+
+    it('should return the closest parent based on the selector', function() {
+        assert.ok(closest(global.c, '#b'), global.b);
+        assert.ok(closest(global.c, '#a'), global.a);
+        assert.ok(closest(global.b, '#a'), global.a);
+    });
+
+    it('should return itself if the same selector is passed', function() {
+        assert.ok(closest(document.body, 'body'), document.body);
+    });
+
+    it('should not throw on elements without matches()', function() {
+        var fakeElement = {
+            nodeType: -1, // anything but DOCUMENT_NODE_TYPE
+            parentNode: null,
+            matches: undefined // undefined to emulate Elements without this function
+        };
+
+        try {
+            closest(fakeElement, '#a')
+        } catch (err) {
+            assert.fail();
+        }
+    });
+});
diff --git a/node_modules/delegate/test/delegate.js b/node_modules/delegate/test/delegate.js
new file mode 100644
index 0000000..669738f
--- /dev/null
+++ b/node_modules/delegate/test/delegate.js
@@ -0,0 +1,116 @@
+var delegate = require('../src/delegate');
+var simulant = require('simulant');
+
+describe('delegate', function() {
+    before(function() {
+        var html = '<ul>' +
+                        '<li><a>Item 1</a></li>' +
+                        '<li><a>Item 2</a></li>' +
+                        '<li><a>Item 3</a></li>' +
+                        '<li><a>Item 4</a></li>' +
+                        '<li><a>Item 5</a></li>' +
+                   '</ul>';
+
+        document.body.innerHTML += html;
+
+        global.container = document.querySelector('ul');
+        global.anchor = document.querySelector('a');
+
+        global.spy = sinon.spy(global.container, 'removeEventListener');
+    });
+
+    after(function() {
+        global.spy.restore();
+        document.body.innerHTML = '';
+    });
+
+    it('should add an event listener', function(done) {
+        delegate(global.container, 'a', 'click', function() {
+            done();
+        });
+
+        simulant.fire(global.anchor, simulant('click'));
+    });
+
+    it('should remove an event listener', function() {
+        var delegation = delegate(global.container, 'a', 'click', function() {});
+
+        delegation.destroy();
+        assert.ok(global.spy.calledOnce);
+    });
+
+    it('should use `document` if the element is unspecified', function(done) {
+        delegate('a', 'click', function() {
+            done();
+        });
+
+        simulant.fire(global.anchor, simulant('click'));
+    });
+
+    it('should remove an event listener the unspecified base (`document`)', function() {
+        var delegation = delegate('a', 'click', function() {});
+        var spy = sinon.spy(document, 'removeEventListener');
+
+        delegation.destroy();
+        assert.ok(spy.calledOnce);
+
+        spy.restore();
+    });
+
+    it('should add event listeners to all the elements in a base selector', function() {
+        var spy = sinon.spy();
+        delegate('li', 'a', 'click', spy);
+
+        var anchors = document.querySelectorAll('a');
+        simulant.fire(anchors[0], simulant('click'));
+        simulant.fire(anchors[1], simulant('click'));
+        assert.ok(spy.calledTwice);
+    });
+
+    it('should remove the event listeners from all the elements in a base selector', function() {
+        var items = document.querySelectorAll('li')
+        var spies = Array.prototype.map.call(items, function (li) {
+            return sinon.spy(li, 'removeEventListener');
+        });
+
+        var delegations = delegate('li', 'a', 'click', function() {});
+        delegations.forEach(function (delegation) {
+            delegation.destroy();
+        });
+
+        spies.every(function (spy) {
+            var success = spy.calledOnce;
+            spy.restore();
+            return success;
+        });
+    });
+
+    it('should add event listeners to all the elements in a base array', function() {
+        var spy = sinon.spy();
+        var items = document.querySelectorAll('li')
+        delegate(items, 'a', 'click', spy);
+
+        var anchors = document.querySelectorAll('a')
+        simulant.fire(anchors[0], simulant('click'));
+        simulant.fire(anchors[1], simulant('click'));
+        assert.ok(spy.calledTwice);
+    });
+
+    it('should remove the event listeners from all the elements in a base array', function() {
+        var items = document.querySelectorAll('li')
+        var spies = Array.prototype.map.call(items, function (li) {
+            return sinon.spy(li, 'removeEventListener');
+        });
+
+        var delegations = delegate(items, 'a', 'click', function() {});
+        delegations.forEach(function (delegation) {
+            delegation.destroy();
+        });
+
+        spies.every(function (spy) {
+            var success = spy.calledOnce;
+            spy.restore();
+            return success;
+        });
+    });
+});
diff --git a/node_modules/good-listener/.editorconfig b/node_modules/good-listener/.editorconfig
new file mode 100644
index 0000000..0f1d01b
--- /dev/null
+++ b/node_modules/good-listener/.editorconfig
@@ -0,0 +1,22 @@
+# EditorConfig helps developers define and maintain consistent
+# coding styles between different editors and IDEs
+# http://editorconfig.org
+
+root = true
+
+[*]
+# Change these settings to your own preference
+indent_style = space
+indent_size = 4
+
+# We recommend you to keep these unchanged
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[*.md]
+trim_trailing_whitespace = false
+
+[{package.json,bower.json}]
+indent_size = 2
diff --git a/node_modules/good-listener/.npmignore b/node_modules/good-listener/.npmignore
new file mode 100644
index 0000000..b512c09
--- /dev/null
+++ b/node_modules/good-listener/.npmignore
@@ -0,0 +1 @@
+node_modules
\ No newline at end of file
diff --git a/node_modules/good-listener/.travis.yml b/node_modules/good-listener/.travis.yml
new file mode 100644
index 0000000..833d09d
--- /dev/null
+++ b/node_modules/good-listener/.travis.yml
@@ -0,0 +1,3 @@
+language: node_js
+node_js:
+  - stable
diff --git a/node_modules/good-listener/bower.json b/node_modules/good-listener/bower.json
new file mode 100644
index 0000000..6ba1643
--- /dev/null
+++ b/node_modules/good-listener/bower.json
@@ -0,0 +1,11 @@
+{
+  "name": "good-listener",
+  "description": "A more versatile way of adding & removing event listeners",
+  "version": "1.2.1",
+  "license": "MIT",
+  "main": "dist/good-listener.js",
+  "keywords": [
+    "event",
+    "listener"
+  ]
+}
diff --git a/node_modules/good-listener/demo/destroy.html b/node_modules/good-listener/demo/destroy.html
new file mode 100644
index 0000000..8d50f54
--- /dev/null
+++ b/node_modules/good-listener/demo/destroy.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Destroy</title>
+</head>
+<body>
+    <!-- 1. Write some markup -->
+    <button class="target">Click me</button>
+    <button class="target">Click me</button>
+    <button class="target">Click me</button>
+
+    <!-- 2. Include library -->
+    <script src="../dist/good-listener.js"></script>
+
+    <!-- 3. Remove listener by calling the destroy function -->
+    <script>
+    var listener = listen('.target', 'click', function(e) {
+        console.info(e);
+    });
+
+    listener.destroy();
+    </script>
+</body>
+</html>
diff --git a/node_modules/good-listener/demo/multiple.html b/node_modules/good-listener/demo/multiple.html
new file mode 100644
index 0000000..564af32
--- /dev/null
+++ b/node_modules/good-listener/demo/multiple.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Selector</title>
+</head>
+<body>
+    <!-- 1. Write some markup -->
+    <button data-a>Click me</button>
+    <button data-a>Click me</button>
+    <button data-a>Click me</button>
+    <button data-b>Click me</button>
+    <button data-b>Click me</button>
+    <button data-b>Click me</button>
+
+    <!-- 2. Include library -->
+    <script src="../dist/good-listener.js"></script>
+
+    <!-- 3. Add listener by passing a string selector -->
+    <script>
+    listen('[data-a]', 'click', function(e) {
+        console.info(e);
+    });
+
+    listen('[data-b]', 'click', function(e) {
+        console.info(e);
+    });
+    </script>
+</body>
+</html>
diff --git a/node_modules/good-listener/demo/node.html b/node_modules/good-listener/demo/node.html
new file mode 100644
index 0000000..5901d0d
--- /dev/null
+++ b/node_modules/good-listener/demo/node.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Node</title>
+</head>
+<body>
+    <!-- 1. Write some markup -->
+    <button id="target">Click me</button>
+
+    <!-- 2. Include library -->
+    <script src="../dist/good-listener.js"></script>
+
+    <!-- 3. Add listener by passing a HTML element -->
+    <script>
+    var target = document.getElementById('target');
+
+    listen(target, 'click', function(e) {
+        console.info(e);
+    });
+    </script>
+</body>
+</html>
diff --git a/node_modules/good-listener/demo/nodelist.html b/node_modules/good-listener/demo/nodelist.html
new file mode 100644
index 0000000..fecd96f
--- /dev/null
+++ b/node_modules/good-listener/demo/nodelist.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>NodeList</title>
+</head>
+<body>
+    <!-- 1. Write some markup -->
+    <button>Click me</button>
+    <button>Click me</button>
+    <button>Click me</button>
+
+    <!-- 2. Include library -->
+    <script src="../dist/good-listener.js"></script>
+
+    <!-- 3. Add listener by passing a list of HTML elements -->
+    <script>
+    var targets = document.querySelectorAll('button');
+
+    listen(targets, 'click', function(e) {
+        console.info(e);
+    });
+    </script>
+</body>
+</html>
diff --git a/node_modules/good-listener/demo/selector.html b/node_modules/good-listener/demo/selector.html
new file mode 100644
index 0000000..6859c8d
--- /dev/null
+++ b/node_modules/good-listener/demo/selector.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Selector</title>
+</head>
+<body>
+    <!-- 1. Write some markup -->
+    <button class="target">Click me</button>
+    <button class="target">Click me</button>
+    <button class="target">Click me</button>
+
+    <!-- 2. Include library -->
+    <script src="../dist/good-listener.js"></script>
+
+    <!-- 3. Add listener by passing a string selector -->
+    <script>
+    listen('.target', 'click', function(e) {
+        console.info(e);
+    });
+    </script>
+</body>
+</html>
diff --git a/node_modules/good-listener/dist/good-listener.js b/node_modules/good-listener/dist/good-listener.js
new file mode 100644
index 0000000..354a2c9
--- /dev/null
+++ b/node_modules/good-listener/dist/good-listener.js
@@ -0,0 +1,228 @@
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.listen = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+var DOCUMENT_NODE_TYPE = 9;
+
+/**
+ * A polyfill for Element.matches()
+ */
+if (typeof Element !== 'undefined' && !Element.prototype.matches) {
+    var proto = Element.prototype;
+
+    proto.matches = proto.matchesSelector ||
+                    proto.mozMatchesSelector ||
+                    proto.msMatchesSelector ||
+                    proto.oMatchesSelector ||
+                    proto.webkitMatchesSelector;
+}
+
+/**
+ * Finds the closest parent that matches a selector.
+ *
+ * @param {Element} element
+ * @param {String} selector
+ * @return {Function}
+ */
+function closest (element, selector) {
+    while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {
+        if (element.matches(selector)) return element;
+        element = element.parentNode;
+    }
+}
+
+module.exports = closest;
+
+},{}],2:[function(require,module,exports){
+var closest = require('./closest');
+
+/**
+ * Delegates event to a selector.
+ *
+ * @param {Element} element
+ * @param {String} selector
+ * @param {String} type
+ * @param {Function} callback
+ * @param {Boolean} useCapture
+ * @return {Object}
+ */
+function delegate(element, selector, type, callback, useCapture) {
+    var listenerFn = listener.apply(this, arguments);
+
+    element.addEventListener(type, listenerFn, useCapture);
+
+    return {
+        destroy: function() {
+            element.removeEventListener(type, listenerFn, useCapture);
+        }
+    }
+}
+
+/**
+ * Finds closest match and invokes callback.
+ *
+ * @param {Element} element
+ * @param {String} selector
+ * @param {String} type
+ * @param {Function} callback
+ * @return {Function}
+ */
+function listener(element, selector, type, callback) {
+    return function(e) {
+        e.delegateTarget = closest(e.target, selector);
+
+        if (e.delegateTarget) {
+            callback.call(element, e);
+        }
+    }
+}
+
+module.exports = delegate;
+
+},{"./closest":1}],3:[function(require,module,exports){
+/**
+ * Check if argument is a HTML element.
+ *
+ * @param {Object} value
+ * @return {Boolean}
+ */
+exports.node = function(value) {
+    return value !== undefined
+        && value instanceof HTMLElement
+        && value.nodeType === 1;
+};
+
+/**
+ * Check if argument is a list of HTML elements.
+ *
+ * @param {Object} value
+ * @return {Boolean}
+ */
+exports.nodeList = function(value) {
+    var type = Object.prototype.toString.call(value);
+
+    return value !== undefined
+        && (type === '[object NodeList]' || type === '[object HTMLCollection]')
+        && ('length' in value)
+        && (value.length === 0 || exports.node(value[0]));
+};
+
+/**
+ * Check if argument is a string.
+ *
+ * @param {Object} value
+ * @return {Boolean}
+ */
+exports.string = function(value) {
+    return typeof value === 'string'
+        || value instanceof String;
+};
+
+/**
+ * Check if argument is a function.
+ *
+ * @param {Object} value
+ * @return {Boolean}
+ */
+exports.fn = function(value) {
+    var type = Object.prototype.toString.call(value);
+
+    return type === '[object Function]';
+};
+
+},{}],4:[function(require,module,exports){
+var is = require('./is');
+var delegate = require('delegate');
+
+/**
+ * Validates all params and calls the right
+ * listener function based on its target type.
+ *
+ * @param {String|HTMLElement|HTMLCollection|NodeList} target
+ * @param {String} type
+ * @param {Function} callback
+ * @return {Object}
+ */
+function listen(target, type, callback) {
+    if (!target && !type && !callback) {
+        throw new Error('Missing required arguments');
+    }
+
+    if (!is.string(type)) {
+        throw new TypeError('Second argument must be a String');
+    }
+
+    if (!is.fn(callback)) {
+        throw new TypeError('Third argument must be a Function');
+    }
+
+    if (is.node(target)) {
+        return listenNode(target, type, callback);
+    }
+    else if (is.nodeList(target)) {
+        return listenNodeList(target, type, callback);
+    }
+    else if (is.string(target)) {
+        return listenSelector(target, type, callback);
+    }
+    else {
+        throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');
+    }
+}
+
+/**
+ * Adds an event listener to a HTML element
+ * and returns a remove listener function.
+ *
+ * @param {HTMLElement} node
+ * @param {String} type
+ * @param {Function} callback
+ * @return {Object}
+ */
+function listenNode(node, type, callback) {
+    node.addEventListener(type, callback);
+
+    return {
+        destroy: function() {
+            node.removeEventListener(type, callback);
+        }
+    }
+}
+
+/**
+ * Add an event listener to a list of HTML elements
+ * and returns a remove listener function.
+ *
+ * @param {NodeList|HTMLCollection} nodeList
+ * @param {String} type
+ * @param {Function} callback
+ * @return {Object}
+ */
+function listenNodeList(nodeList, type, callback) {
+    Array.prototype.forEach.call(nodeList, function(node) {
+        node.addEventListener(type, callback);
+    });
+
+    return {
+        destroy: function() {
+            Array.prototype.forEach.call(nodeList, function(node) {
+                node.removeEventListener(type, callback);
+            });
+        }
+    }
+}
+
+/**
+ * Add an event listener to a selector
+ * and returns a remove listener function.
+ *
+ * @param {String} selector
+ * @param {String} type
+ * @param {Function} callback
+ * @return {Object}
+ */
+function listenSelector(selector, type, callback) {
+    return delegate(document.body, selector, type, callback);
+}
+
+module.exports = listen;
+
+},{"./is":3,"delegate":2}]},{},[4])(4)
+});
\ No newline at end of file
diff --git a/node_modules/good-listener/karma.conf.js b/node_modules/good-listener/karma.conf.js
new file mode 100644
index 0000000..62d108e
--- /dev/null
+++ b/node_modules/good-listener/karma.conf.js
@@ -0,0 +1,24 @@
+module.exports = function(karma) {
+    karma.set({
+        plugins: ['karma-browserify', 'karma-chai', 'karma-sinon', 'karma-mocha', 'karma-phantomjs-launcher'],
+
+        frameworks: ['browserify', 'chai', 'sinon', 'mocha'],
+
+        files: [
+            'src/**/*.js',
+            'test/**/*.js',
+            './node_modules/phantomjs-polyfill/bind-polyfill.js'
+        ],
+
+        preprocessors: {
+            'src/**/*.js' : ['browserify'],
+            'test/**/*.js': ['browserify']
+        },
+
+        browserify: {
+            debug: true
+        },
+
+        browsers: ['PhantomJS']
+    });
+}
diff --git a/node_modules/good-listener/package.json b/node_modules/good-listener/package.json
new file mode 100644
index 0000000..8e90979
--- /dev/null
+++ b/node_modules/good-listener/package.json
@@ -0,0 +1,35 @@
+{
+  "name": "good-listener",
+  "description": "A more versatile way of adding & removing event listeners",
+  "version": "1.2.2",
+  "repository": "zenorocha/good-listener",
+  "license": "MIT",
+  "main": "src/listen.js",
+  "keywords": [
+    "event",
+    "listener"
+  ],
+  "dependencies": {
+    "delegate": "^3.1.2"
+  },
+  "devDependencies": {
+    "browserify": "^13.0.0",
+    "chai": "^3.5.0",
+    "karma": "^1.3.0",
+    "karma-browserify": "^5.0.1",
+    "karma-chai": "^0.1.0",
+    "karma-mocha": "^1.2.0",
+    "karma-phantomjs-launcher": "^1.0.0",
+    "karma-sinon": "^1.0.4",
+    "mocha": "^3.1.2",
+    "phantomjs-polyfill": "0.0.2",
+    "phantomjs-prebuilt": "^2.1.3",
+    "simulant": "^0.2.2",
+    "sinon": "^1.17.3",
+    "watchify": "^3.7.0"
+  },
+  "scripts": {
+    "build": "browserify src/listen.js -s listen -o dist/good-listener.js",
+    "test": "karma start --single-run"
+  }
+}
diff --git a/node_modules/good-listener/readme.md b/node_modules/good-listener/readme.md
new file mode 100644
index 0000000..e01c174
--- /dev/null
+++ b/node_modules/good-listener/readme.md
@@ -0,0 +1,91 @@
+# good-listener
+
+[![Build Status](http://img.shields.io/travis/zenorocha/good-listener/master.svg?style=flat)](https://travis-ci.org/zenorocha/good-listener)
+
+> A more versatile way of adding & removing event listeners.
+
+![good listener](https://cloud.githubusercontent.com/assets/398893/10718224/dfc25f6c-7b2a-11e5-9d3d-75b35e8603c8.jpg)
+
+## Install
+
+You can get it on npm.
+
+```
+npm install good-listener --save
+```
+
+Or bower, too.
+
+```
+bower install good-listener --save
+```
+
+If you're not into package management, just [download a ZIP](https://github.com/zenorocha/good-listener/archive/master.zip) file.
+
+## Setup
+
+###### Node (Browserify)
+
+```js
+var listen = require('good-listener');
+```
+
+###### Browser (Standalone)
+
+```html
+<script src="dist/good-listener.js"></script>
+```
+
+## Usage
+
+### Add an event listener
+
+By passing a string selector [(see full demo)](https://github.com/zenorocha/good-listener/blob/master/demo/selector.html).
+
+```js
+listen('.btn', 'click', function(e) {
+    console.log(e);
+});
+```
+
+Or by passing a HTML element [(see full demo)](https://github.com/zenorocha/good-listener/blob/master/demo/node.html).
+
+```js
+var logo = document.getElementById('logo');
+
+listen(logo, 'click', function(e) {
+    console.log(e);
+});
+```
+
+Or by passing a list of HTML elements [(see full demo)](https://github.com/zenorocha/good-listener/blob/master/demo/nodelist.html).
+
+```js
+var anchors = document.querySelectorAll('a');
+
+listen(anchors, 'click', function(e) {
+    console.log(e);
+});
+```
+
+### Remove an event listener
+
+By calling the `destroy` function that returned from previous operation [(see full demo)](https://github.com/zenorocha/good-listener/blob/master/demo/destroy.html).
+
+```js
+var listener = listen('.btn', 'click', function(e) {
+    console.log(e);
+});
+
+listener.destroy();
+```
+
+## Browser Support
+
+| <img src="https://clipboardjs.com/assets/images/chrome.png" width="48px" height="48px" alt="Chrome logo"> | <img src="https://clipboardjs.com/assets/images/edge.png" width="48px" height="48px" alt="Edge logo"> | <img src="https://clipboardjs.com/assets/images/firefox.png" width="48px" height="48px" alt="Firefox logo"> | <img src="https://clipboardjs.com/assets/images/ie.png" width="48px" height="48px" alt="Internet Explorer logo"> | <img src="https://clipboardjs.com/assets/images/opera.png" width="48px" height="48px" alt="Opera logo"> | <img src="https://clipboardjs.com/assets/images/safari.png" width="48px" height="48px" alt="Safari logo"> |
+|:---:|:---:|:---:|:---:|:---:|:---:|
+| Latest ✔ | Latest ✔ | Latest ✔ | 9+ ✔ | Latest ✔ | Latest ✔ |
+
+## License
+
+[MIT License](http://zenorocha.mit-license.org/) © Zeno Rocha
diff --git a/node_modules/good-listener/src/is.js b/node_modules/good-listener/src/is.js
new file mode 100644
index 0000000..9087227
--- /dev/null
+++ b/node_modules/good-listener/src/is.js
@@ -0,0 +1,49 @@
+/**
+ * Check if argument is a HTML element.
+ *
+ * @param {Object} value
+ * @return {Boolean}
+ */
+exports.node = function(value) {
+    return value !== undefined
+        && value instanceof HTMLElement
+        && value.nodeType === 1;
+};
+
+/**
+ * Check if argument is a list of HTML elements.
+ *
+ * @param {Object} value
+ * @return {Boolean}
+ */
+exports.nodeList = function(value) {
+    var type = Object.prototype.toString.call(value);
+
+    return value !== undefined
+        && (type === '[object NodeList]' || type === '[object HTMLCollection]')
+        && ('length' in value)
+        && (value.length === 0 || exports.node(value[0]));
+};
+
+/**
+ * Check if argument is a string.
+ *
+ * @param {Object} value
+ * @return {Boolean}
+ */
+exports.string = function(value) {
+    return typeof value === 'string'
+        || value instanceof String;
+};
+
+/**
+ * Check if argument is a function.
+ *
+ * @param {Object} value
+ * @return {Boolean}
+ */
+exports.fn = function(value) {
+    var type = Object.prototype.toString.call(value);
+
+    return type === '[object Function]';
+};
diff --git a/node_modules/good-listener/src/listen.js b/node_modules/good-listener/src/listen.js
new file mode 100644
index 0000000..1d8fa63
--- /dev/null
+++ b/node_modules/good-listener/src/listen.js
@@ -0,0 +1,95 @@
+var is = require('./is');
+var delegate = require('delegate');
+
+/**
+ * Validates all params and calls the right
+ * listener function based on its target type.
+ *
+ * @param {String|HTMLElement|HTMLCollection|NodeList} target
+ * @param {String} type
+ * @param {Function} callback
+ * @return {Object}
+ */
+function listen(target, type, callback) {
+    if (!target && !type && !callback) {
+        throw new Error('Missing required arguments');
+    }
+
+    if (!is.string(type)) {
+        throw new TypeError('Second argument must be a String');
+    }
+
+    if (!is.fn(callback)) {
+        throw new TypeError('Third argument must be a Function');
+    }
+
+    if (is.node(target)) {
+        return listenNode(target, type, callback);
+    }
+    else if (is.nodeList(target)) {
+        return listenNodeList(target, type, callback);
+    }
+    else if (is.string(target)) {
+        return listenSelector(target, type, callback);
+    }
+    else {
+        throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');
+    }
+}
+
+/**
+ * Adds an event listener to a HTML element
+ * and returns a remove listener function.
+ *
+ * @param {HTMLElement} node
+ * @param {String} type
+ * @param {Function} callback
+ * @return {Object}
+ */
+function listenNode(node, type, callback) {
+    node.addEventListener(type, callback);
+
+    return {
+        destroy: function() {
+            node.removeEventListener(type, callback);
+        }
+    }
+}
+
+/**
+ * Add an event listener to a list of HTML elements
+ * and returns a remove listener function.
+ *
+ * @param {NodeList|HTMLCollection} nodeList
+ * @param {String} type
+ * @param {Function} callback
+ * @return {Object}
+ */
+function listenNodeList(nodeList, type, callback) {
+    Array.prototype.forEach.call(nodeList, function(node) {
+        node.addEventListener(type, callback);
+    });
+
+    return {
+        destroy: function() {
+            Array.prototype.forEach.call(nodeList, function(node) {
+                node.removeEventListener(type, callback);
+            });
+        }
+    }
+}
+
+/**
+ * Add an event listener to a selector
+ * and returns a remove listener function.
+ *
+ * @param {String} selector
+ * @param {String} type
+ * @param {Function} callback
+ * @return {Object}
+ */
+function listenSelector(selector, type, callback) {
+    return delegate(document.body, selector, type, callback);
+}
+
+module.exports = listen;
diff --git a/node_modules/good-listener/test/is.js b/node_modules/good-listener/test/is.js
new file mode 100644
index 0000000..40ae4bd
--- /dev/null
+++ b/node_modules/good-listener/test/is.js
@@ -0,0 +1,111 @@
+var is = require('../src/is');
+
+describe('is', function() {
+    before(function() {
+        global.node = document.createElement('div');
+        global.node.setAttribute('id', 'foo');
+        global.node.setAttribute('class', 'foo');
+        document.body.appendChild(global.node);
+    });
+
+    after(function() {
+        document.body.innerHTML = '';
+    });
+
+    describe('is.node', function() {
+        it('should be considered as node', function() {
+            assert.ok(is.node(document.getElementById('foo')));
+            assert.ok(is.node(document.getElementsByTagName('div')[0]));
+            assert.ok(is.node(document.getElementsByClassName('foo')[0]));
+            assert.ok(is.node(document.querySelector('.foo')));
+        });
+
+        it('should not be considered as node', function() {
+            assert.notOk(is.node(undefined));
+            assert.notOk(is.node(null));
+            assert.notOk(is.node(false));
+            assert.notOk(is.node(true));
+            assert.notOk(is.node(function () {}));
+            assert.notOk(is.node([]));
+            assert.notOk(is.node({}));
+            assert.notOk(is.node(/a/g));
+            assert.notOk(is.node(new RegExp('a', 'g')));
+            assert.notOk(is.node(new Date()));
+            assert.notOk(is.node(42));
+            assert.notOk(is.node(NaN));
+            assert.notOk(is.node(Infinity));
+            assert.notOk(is.node(new Number(42)));
+        });
+    });
+
+    describe('is.nodeList', function() {
+        it('should be considered as nodeList', function() {
+            assert.ok(is.nodeList(document.getElementsByTagName('div')));
+            assert.ok(is.nodeList(document.getElementsByClassName('foo')));
+            assert.ok(is.nodeList(document.querySelectorAll('.foo')));
+        });
+
+        it('should not be considered as nodeList', function() {
+            assert.notOk(is.nodeList(undefined));
+            assert.notOk(is.nodeList(null));
+            assert.notOk(is.nodeList(false));
+            assert.notOk(is.nodeList(true));
+            assert.notOk(is.nodeList(function () {}));
+            assert.notOk(is.nodeList([]));
+            assert.notOk(is.nodeList({}));
+            assert.notOk(is.nodeList(/a/g));
+            assert.notOk(is.nodeList(new RegExp('a', 'g')));
+            assert.notOk(is.nodeList(new Date()));
+            assert.notOk(is.nodeList(42));
+            assert.notOk(is.nodeList(NaN));
+            assert.notOk(is.nodeList(Infinity));
+            assert.notOk(is.nodeList(new Number(42)));
+        });
+    });
+
+    describe('is.string', function() {
+        it('should be considered as string', function() {
+            assert.ok(is.string('abc'));
+            assert.ok(is.string(new String('abc')));
+        });
+
+        it('should not be considered as string', function() {
+            assert.notOk(is.string(undefined));
+            assert.notOk(is.string(null));
+            assert.notOk(is.string(false));
+            assert.notOk(is.string(true));
+            assert.notOk(is.string(function () {}));
+            assert.notOk(is.string([]));
+            assert.notOk(is.string({}));
+            assert.notOk(is.string(/a/g));
+            assert.notOk(is.string(new RegExp('a', 'g')));
+            assert.notOk(is.string(new Date()));
+            assert.notOk(is.string(42));
+            assert.notOk(is.string(NaN));
+            assert.notOk(is.string(Infinity));
+            assert.notOk(is.string(new Number(42)));
+        });
+    });
+
+    describe('is.fn', function() {
+        it('should be considered as function', function() {
+            assert.ok(is.fn(function () {}));
+        });
+
+        it('should not be considered as function', function() {
+            assert.notOk(is.fn(undefined));
+            assert.notOk(is.fn(null));
+            assert.notOk(is.fn(false));
+            assert.notOk(is.fn(true));
+            assert.notOk(is.fn([]));
+            assert.notOk(is.fn({}));
+            assert.notOk(is.fn(/a/g));
+            assert.notOk(is.fn(new RegExp('a', 'g')));
+            assert.notOk(is.fn(new Date()));
+            assert.notOk(is.fn(42));
+            assert.notOk(is.fn(NaN));
+            assert.notOk(is.fn(Infinity));
+            assert.notOk(is.fn(new Number(42)));
+        });
+    });
+});
diff --git a/node_modules/good-listener/test/listen.js b/node_modules/good-listener/test/listen.js
new file mode 100644
index 0000000..c6d84d5
--- /dev/null
+++ b/node_modules/good-listener/test/listen.js
@@ -0,0 +1,135 @@
+var listen = require('../src/listen');
+var simulant = require('simulant');
+
+describe('good-listener', function() {
+    before(function() {
+        global.node = document.createElement('div');
+        global.node.setAttribute('id', 'foo');
+        global.node.setAttribute('class', 'foo');
+        document.body.appendChild(global.node);
+    });
+
+    after(function() {
+        document.body.innerHTML = '';
+    });
+
+    describe('listen', function() {
+        it('should throw an error since arguments were not passed', function(done) {
+            try {
+                listen();
+            }
+            catch(error) {
+                assert.equal(error.message, 'Missing required arguments');
+                done();
+            }
+        });
+
+        it('should throw an error since "target" was invalid', function(done) {
+            try {
+                listen(null, 'click', function() {});
+            }
+            catch(error) {
+                assert.equal(error.message, 'First argument must be a String, HTMLElement, HTMLCollection, or NodeList');
+                done();
+            }
+        });
+
+        it('should throw an error since "type" was invalid', function(done) {
+            try {
+                listen('.btn', false, function() {});
+            }
+            catch(error) {
+                assert.equal(error.message, 'Second argument must be a String');
+                done();
+            }
+        });
+
+        it('should throw an error since "callback" was invalid', function(done) {
+            try {
+                listen('.btn', 'click', []);
+            }
+            catch(error) {
+                assert.equal(error.message, 'Third argument must be a Function');
+                done();
+            }
+        });
+    });
+
+    describe('listenNode', function() {
+        before(function() {
+            global.target = document.querySelector('#foo');
+            global.spy = sinon.spy(global.target, 'removeEventListener');
+        });
+
+        after(function() {
+            global.spy.restore();
+        });
+
+        it('should add an event listener', function(done) {
+            listen(global.target, 'click', function() {
+                done();
+            });
+
+            simulant.fire(global.target, simulant('click'));
+        });
+
+        it('should remove an event listener', function() {
+            var listener = listen(global.target, 'click', function() {});
+
+            listener.destroy();
+            assert.ok(global.spy.calledOnce);
+        });
+    });
+
+    describe('listenNodeList', function() {
+        before(function() {
+            global.targets = document.querySelectorAll('.foo');
+            global.spy = sinon.spy(global.targets[0], 'removeEventListener');
+        });
+
+        after(function() {
+            global.spy.restore();
+        });
+
+        it('should add an event listener', function(done) {
+            listen(global.targets, 'click', function() {
+                done();
+            });
+
+            simulant.fire(global.targets[0], simulant('click'));
+        });
+
+        it('should remove an event listener', function() {
+            var listener = listen(global.targets, 'click', function() {});
+
+            listener.destroy();
+            assert.ok(global.spy.calledOnce);
+        });
+    });
+
+    describe('listenSelector', function() {
+        before(function() {
+            global.target = document.querySelector('.foo');
+            global.spy = sinon.spy(document.body, 'removeEventListener');
+        });
+
+        after(function() {
+            global.spy.restore();
+        });
+
+        it('should add an event listener', function(done) {
+            listen('.foo', 'click', function() {
+                done();
+            });
+
+            simulant.fire(global.target, simulant('click'));
+        });
+
+        it('should remove an event listener', function() {
+            var listener = listen('.foo', 'click', function() {});
+
+            listener.destroy();
+            assert.ok(global.spy.calledOnce);
+        });
+    });
+});
diff --git a/node_modules/select/.editorconfig b/node_modules/select/.editorconfig
new file mode 100644
index 0000000..0f1d01b
--- /dev/null
+++ b/node_modules/select/.editorconfig
@@ -0,0 +1,22 @@
+# EditorConfig helps developers define and maintain consistent
+# coding styles between different editors and IDEs
+# http://editorconfig.org
+
+root = true
+
+[*]
+# Change these settings to your own preference
+indent_style = space
+indent_size = 4
+
+# We recommend you to keep these unchanged
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[*.md]
+trim_trailing_whitespace = false
+
+[{package.json,bower.json}]
+indent_size = 2
diff --git a/node_modules/select/.npmignore b/node_modules/select/.npmignore
new file mode 100644
index 0000000..b512c09
--- /dev/null
+++ b/node_modules/select/.npmignore
@@ -0,0 +1 @@
+node_modules
\ No newline at end of file
diff --git a/node_modules/select/.travis.yml b/node_modules/select/.travis.yml
new file mode 100644
index 0000000..833d09d
--- /dev/null
+++ b/node_modules/select/.travis.yml
@@ -0,0 +1,3 @@
+language: node_js
+node_js:
+  - stable
diff --git a/node_modules/select/bower.json b/node_modules/select/bower.json
new file mode 100644
index 0000000..281b34c
--- /dev/null
+++ b/node_modules/select/bower.json
@@ -0,0 +1,13 @@
+{
+  "name": "select",
+  "version": "1.1.0",
+  "description": "Programmatically select the text of a HTML element",
+  "license": "MIT",
+  "main": "dist/select.js",
+  "keywords": [
+    "range",
+    "select",
+    "selecting",
+    "selection"
+  ]
+}
diff --git a/node_modules/select/demo/contenteditable.html b/node_modules/select/demo/contenteditable.html
new file mode 100644
index 0000000..47f9b99
--- /dev/null
+++ b/node_modules/select/demo/contenteditable.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>contenteditable</title>
+</head>
+<body>
+    <!-- 1. Define some markup -->
+    <button type="button">Select</button>
+    <p contenteditable>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Distinctio totam adipisci, saepe ad vero dignissimos laborum non eum eveniet aperiam, consequuntur repellendus architecto inventore iusto blanditiis quasi commodi voluptatum vitae!</p>
+
+    <!-- 2. Include library -->
+    <script src="../dist/select.js"></script>
+
+    <!-- 3. Select! -->
+    <script>
+    var p = document.querySelector('p');
+    var button = document.querySelector('button');
+
+    button.addEventListener('click', function(e) {
+        var selected = select(p);
+        console.log(selected);
+    });
+    </script>
+</body>
+</html>
diff --git a/node_modules/select/demo/dropdown.html b/node_modules/select/demo/dropdown.html
new file mode 100644
index 0000000..aa739d5
--- /dev/null
+++ b/node_modules/select/demo/dropdown.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>dropdown</title>
+</head>
+<body>
+    <!-- 1. Define some markup -->
+    <button type="button">Select</button>
+    <select>
+        <option>Option 1</option>
+        <option selected>Option 2</option>
+        <option>Option 3</option>
+    </select>
+
+    <!-- 2. Include library -->
+    <script src="../dist/select.js"></script>
+
+    <!-- 3. Select! -->
+    <script>
+    var dropdown = document.querySelector('select');
+    var button = document.querySelector('button');
+
+    button.addEventListener('click', function(e) {
+        var selected = select(dropdown);
+        console.log(selected);
+    });
+    </script>
+</body>
+</html>
diff --git a/node_modules/select/demo/editable.html b/node_modules/select/demo/editable.html
new file mode 100644
index 0000000..f51d9c2
--- /dev/null
+++ b/node_modules/select/demo/editable.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>editable</title>
+</head>
+<body>
+    <!-- 1. Define some markup -->
+    <button type="button">Select</button>
+    <input type="text" value="Lorem ipsum">
+
+    <!-- 2. Include library -->
+    <script src="../dist/select.js"></script>
+
+    <!-- 3. Select! -->
+    <script>
+    var input = document.querySelector('input');
+    var button = document.querySelector('button');
+
+    button.addEventListener('click', function(e) {
+        var selected = select(input);
+        console.log(selected);
+    });
+    </script>
+</body>
+</html>
diff --git a/node_modules/select/demo/multiple.html b/node_modules/select/demo/multiple.html
new file mode 100644
index 0000000..a19ae7d
--- /dev/null
+++ b/node_modules/select/demo/multiple.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>multiple</title>
+</head>
+<body>
+    <!-- 1. Define some markup -->
+    <button type="button">Select</button>
+    <input type="text" value="Lorem ipsum">
+    <textarea>Lorem ipsum</textarea>
+
+    <!-- 2. Include library -->
+    <script src="../dist/select.js"></script>
+
+    <!-- 3. Select! -->
+    <script>
+    var input = document.querySelector('input');
+    var textarea = document.querySelector('textarea');
+    var button = document.querySelector('button');
+
+    button.addEventListener('click', function(e) {
+        console.log(select(input));
+        console.log(select(textarea));
+    });
+    </script>
+</body>
+</html>
diff --git a/node_modules/select/demo/nested.html b/node_modules/select/demo/nested.html
new file mode 100644
index 0000000..11e11f3
--- /dev/null
+++ b/node_modules/select/demo/nested.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>non-editable</title>
+</head>
+<body>
+    <!-- 1. Define some markup -->
+    <button type="button">Select</button>
+    <div>
+        <p>Item 1</p>
+        <p>Item 2</p>
+        <ul>
+            <li>Item 3</li>
+            <li>Item 4</li>
+            <li>Item 5</li>
+        </ul>
+    </div>
+
+    <!-- 2. Include library -->
+    <script src="../dist/select.js"></script>
+
+    <!-- 3. Select! -->
+    <script>
+    var div = document.querySelector('div');
+    var button = document.querySelector('button');
+
+    button.addEventListener('click', function(e) {
+        var selected = select(div);
+        console.log(selected);
+    });
+    </script>
+</body>
+</html>
diff --git a/node_modules/select/demo/non-editable.html b/node_modules/select/demo/non-editable.html
new file mode 100644
index 0000000..2c34be9
--- /dev/null
+++ b/node_modules/select/demo/non-editable.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>non-editable</title>
+</head>
+<body>
+    <!-- 1. Define some markup -->
+    <button type="button">Select</button>
+    <p>Lorem ipsum</p>
+
+    <!-- 2. Include library -->
+    <script src="../dist/select.js"></script>
+
+    <!-- 3. Select! -->
+    <script>
+    var p = document.querySelector('p');
+    var button = document.querySelector('button');
+
+    button.addEventListener('click', function(e) {
+        var selected = select(p);
+        console.log(selected);
+    });
+    </script>
+</body>
+</html>
diff --git a/node_modules/select/dist/select.js b/node_modules/select/dist/select.js
new file mode 100644
index 0000000..c3bdfe2
--- /dev/null
+++ b/node_modules/select/dist/select.js
@@ -0,0 +1,47 @@
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.select = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+function select(element) {
+    var selectedText;
+
+    if (element.nodeName === 'SELECT') {
+        element.focus();
+
+        selectedText = element.value;
+    }
+    else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {
+        var isReadOnly = element.hasAttribute('readonly');
+
+        if (!isReadOnly) {
+            element.setAttribute('readonly', '');
+        }
+
+        element.select();
+        element.setSelectionRange(0, element.value.length);
+
+        if (!isReadOnly) {
+            element.removeAttribute('readonly');
+        }
+
+        selectedText = element.value;
+    }
+    else {
+        if (element.hasAttribute('contenteditable')) {
+            element.focus();
+        }
+
+        var selection = window.getSelection();
+        var range = document.createRange();
+
+        range.selectNodeContents(element);
+        selection.removeAllRanges();
+        selection.addRange(range);
+
+        selectedText = selection.toString();
+    }
+
+    return selectedText;
+}
+
+module.exports = select;
+
+},{}]},{},[1])(1)
+});
\ No newline at end of file
diff --git a/node_modules/select/karma.conf.js b/node_modules/select/karma.conf.js
new file mode 100644
index 0000000..e48b4c2
--- /dev/null
+++ b/node_modules/select/karma.conf.js
@@ -0,0 +1,23 @@
+module.exports = function(karma) {
+    karma.set({
+        plugins: ['karma-browserify', 'karma-chai', 'karma-mocha', 'karma-phantomjs-launcher'],
+
+        frameworks: ['browserify', 'chai', 'mocha'],
+
+        files: [
+            'src/**/*.js',
+            'test/**/*.js'
+        ],
+
+        preprocessors: {
+            'src/**/*.js' : ['browserify'],
+            'test/**/*.js': ['browserify']
+        },
+
+        browserify: {
+            debug: true
+        },
+
+        browsers: ['PhantomJS']
+    });
+}
diff --git a/node_modules/select/package.json b/node_modules/select/package.json
new file mode 100644
index 0000000..e4f218d
--- /dev/null
+++ b/node_modules/select/package.json
@@ -0,0 +1,29 @@
+{
+  "name": "select",
+  "description": "Programmatically select the text of a HTML element",
+  "version": "1.1.2",
+  "license": "MIT",
+  "main": "src/select.js",
+  "repository": "zenorocha/select",
+  "keywords": [
+    "range",
+    "select",
+    "selecting",
+    "selection"
+  ],
+  "devDependencies": {
+    "browserify": "^14.0.0",
+    "chai": "^3.3.0",
+    "karma": "^1.4.1",
+    "karma-browserify": "^5.1.1",
+    "karma-chai": "^0.1.0",
+    "karma-mocha": "^1.3.0",
+    "karma-phantomjs-launcher": "^1.0.2",
+    "mocha": "^3.2.0",
+    "phantomjs": "^2.1.7"
+  },
+  "scripts": {
+    "build": "browserify src/select.js -s select -o dist/select.js",
+    "test": "karma start --single-run"
+  }
+}
diff --git a/node_modules/select/readme.md b/node_modules/select/readme.md
new file mode 100644
index 0000000..abbc7a5
--- /dev/null
+++ b/node_modules/select/readme.md
@@ -0,0 +1,49 @@
+# select
+
+[![Build Status](http://img.shields.io/travis/zenorocha/select/master.svg?style=flat)](https://travis-ci.org/zenorocha/select)
+
+Programmatically select the text of a HTML element.
+
+## Install
+
+You can get it on npm.
+
+```
+npm install select --save
+```
+
+Or bower, too.
+
+```
+bower install select --save
+```
+
+If you're not into package management, just [download a ZIP](https://github.com/zenorocha/select/archive/master.zip) file.
+
+## Usage
+
+### Standalone
+
+```html
+<script src="dist/select.js"></script>
+```
+
+```js
+var input = document.querySelector('input');
+var result = select(input);
+```
+
+### Browserify
+
+```js
+var select = require('select');
+```
+
+```js
+var input = document.querySelector('input');
+var result = select(input);
+```
+
+## License
+
+[MIT License](http://zenorocha.mit-license.org/) © Zeno Rocha
diff --git a/node_modules/select/src/select.js b/node_modules/select/src/select.js
new file mode 100644
index 0000000..3e36485
--- /dev/null
+++ b/node_modules/select/src/select.js
@@ -0,0 +1,43 @@
+function select(element) {
+    var selectedText;
+
+    if (element.nodeName === 'SELECT') {
+        element.focus();
+
+        selectedText = element.value;
+    }
+    else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {
+        var isReadOnly = element.hasAttribute('readonly');
+
+        if (!isReadOnly) {
+            element.setAttribute('readonly', '');
+        }
+
+        element.select();
+        element.setSelectionRange(0, element.value.length);
+
+        if (!isReadOnly) {
+            element.removeAttribute('readonly');
+        }
+
+        selectedText = element.value;
+    }
+    else {
+        if (element.hasAttribute('contenteditable')) {
+            element.focus();
+        }
+
+        var selection = window.getSelection();
+        var range = document.createRange();
+
+        range.selectNodeContents(element);
+        selection.removeAllRanges();
+        selection.addRange(range);
+
+        selectedText = selection.toString();
+    }
+
+    return selectedText;
+}
+
+module.exports = select;
diff --git a/node_modules/select/test/select.js b/node_modules/select/test/select.js
new file mode 100644
index 0000000..604dc94
--- /dev/null
+++ b/node_modules/select/test/select.js
@@ -0,0 +1,93 @@
+var select = require('../src/select');
+
+describe('select editable elements', function() {
+    before(function() {
+        global.input = document.createElement('input');
+        global.input.value = 'lorem ipsum';
+
+        global.textarea = document.createElement('textarea');
+        global.textarea.value = 'lorem ipsum';
+
+        document.body.appendChild(global.input);
+        document.body.appendChild(global.textarea);
+    });
+
+    after(function() {
+        document.body.innerHTML = '';
+    });
+
+    it('should return the selected text on input', function() {
+        var result = select(global.input);
+        assert.equal(result, global.input.value);
+    });
+
+    it('should return the selected text on textarea', function() {
+        var result = select(global.textarea);
+        assert.equal(result, global.textarea.value);
+    });
+});
+
+describe('select non-editable element with no children', function() {
+    before(function() {
+        global.paragraph = document.createElement('p');
+        global.paragraph.textContent = 'lorem ipsum';
+
+        document.body.appendChild(global.paragraph);
+    });
+
+    after(function() {
+        document.body.innerHTML = '';
+    });
+
+    it('should return the selected text', function() {
+        var result = select(global.paragraph);
+        assert.equal(result, global.paragraph.textContent);
+    });
+});
+
+describe('select non-editable element with child node', function() {
+    before(function() {
+        global.li = document.createElement('li');
+        global.li.textContent = 'lorem ipsum';
+
+        global.ul = document.createElement('ul');
+        global.ul.appendChild(global.li);
+
+        document.body.appendChild(global.ul);
+    });
+
+    after(function() {
+        document.body.innerHTML = '';
+    });
+
+    it('should return the selected text', function() {
+        var result = select(global.ul);
+        assert.equal(result, global.ul.textContent);
+    });
+});
+
+describe('select non-editable svg element w/ multiple text children', function() {
+    before(function() {
+        global.text1 = document.createElement('text');
+        global.text1.textContent = 'lorem ipsum';
+
+        global.text2 = document.createElement('text');
+        global.text2.textContent = 'dolor zet';
+
+        global.svg = document.createElement('svg');
+        global.svg.appendChild(global.text1);
+        global.svg.appendChild(global.text2);
+
+        document.body.appendChild(global.svg);
+    });
+
+    after(function() {
+        document.body.innerHTML = '';
+    });
+
+    it('should return the selected text', function() {
+        var result = select(global.svg);
+        assert.equal(result, global.text1.textContent +
+                             global.text2.textContent);
+    });
+});
diff --git a/node_modules/tiny-emitter/LICENSE b/node_modules/tiny-emitter/LICENSE
new file mode 100644
index 0000000..24f1024
--- /dev/null
+++ b/node_modules/tiny-emitter/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2017 Scott Corgan
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/node_modules/tiny-emitter/README.md b/node_modules/tiny-emitter/README.md
new file mode 100644
index 0000000..cd474cd
--- /dev/null
+++ b/node_modules/tiny-emitter/README.md
@@ -0,0 +1,88 @@
+# tiny-emitter
+
+A tiny (less than 1k) event emitter library.
+
+## Install
+
+### npm
+
+```
+npm install tiny-emitter --save
+```
+
+## Usage
+
+```js
+var Emitter = require('tiny-emitter');
+var emitter = new Emitter();
+
+emitter.on('some-event', function (arg1, arg2, arg3) {
+ //
+});
+
+emitter.emit('some-event', 'arg1 value', 'arg2 value', 'arg3 value');
+```
+
+Alternatively, you can skip the initialization step by requiring `tiny-emitter/instance` instead. This pulls in an already initialized emitter.
+
+```js
+var emitter = require('tiny-emitter/instance');
+
+emitter.on('some-event', function (arg1, arg2, arg3) {
+ //
+});
+
+emitter.emit('some-event', 'arg1 value', 'arg2 value', 'arg3 value');
+```
+
+## Instance Methods
+
+### on(event, callback[, context])
+
+Subscribe to an event
+
+* `event` - the name of the event to subscribe to
+* `callback` - the function to call when event is emitted
+* `context` - (OPTIONAL) - the context to bind the event callback to
+
+### once(event, callback[, context])
+
+Subscribe to an event only **once**
+
+* `event` - the name of the event to subscribe to
+* `callback` - the function to call when event is emitted
+* `context` - (OPTIONAL) - the context to bind the event callback to
+
+### off(event[, callback])
+
+Unsubscribe from an event or all events. If no callback is provided, it unsubscribes you from all events.
+
+* `event` - the name of the event to unsubscribe from
+* `callback` - the function used when binding to the event
+
+### emit(event[, arguments...])
+
+Trigger a named event
+
+* `event` - the event name to emit
+* `arguments...` - any number of arguments to pass to the event subscribers
+
+## Test and Build
+
+Build (Tests, Browserifies, and minifies)
+
+```
+npm install
+npm run build
+```
+
+Test
+
+```
+npm install
+npm test
+```
+
+## License
+
+[MIT](https://github.com/scottcorgan/tiny-emitter/blob/master/LICENSE)
diff --git a/node_modules/tiny-emitter/dist/tinyemitter.js b/node_modules/tiny-emitter/dist/tinyemitter.js
new file mode 100644
index 0000000..6e25e05
--- /dev/null
+++ b/node_modules/tiny-emitter/dist/tinyemitter.js
@@ -0,0 +1,71 @@
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.TinyEmitter = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+function E () {
+  // Keep this empty so it's easier to inherit from
+  // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)
+}
+
+E.prototype = {
+  on: function (name, callback, ctx) {
+    var e = this.e || (this.e = {});
+
+    (e[name] || (e[name] = [])).push({
+      fn: callback,
+      ctx: ctx
+    });
+
+    return this;
+  },
+
+  once: function (name, callback, ctx) {
+    var self = this;
+    function listener () {
+      self.off(name, listener);
+      callback.apply(ctx, arguments);
+    };
+
+    listener._ = callback
+    return this.on(name, listener, ctx);
+  },
+
+  emit: function (name) {
+    var data = [].slice.call(arguments, 1);
+    var evtArr = ((this.e || (this.e = {}))[name] || []).slice();
+    var i = 0;
+    var len = evtArr.length;
+
+    for (i; i < len; i++) {
+      evtArr[i].fn.apply(evtArr[i].ctx, data);
+    }
+
+    return this;
+  },
+
+  off: function (name, callback) {
+    var e = this.e || (this.e = {});
+    var evts = e[name];
+    var liveEvents = [];
+
+    if (evts && callback) {
+      for (var i = 0, len = evts.length; i < len; i++) {
+        if (evts[i].fn !== callback && evts[i].fn._ !== callback)
+          liveEvents.push(evts[i]);
+      }
+    }
+
+    // Remove event from queue to prevent memory leak
+    // Suggested by https://github.com/lazd
+    // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910
+
+    (liveEvents.length)
+      ? e[name] = liveEvents
+      : delete e[name];
+
+    return this;
+  }
+};
+
+module.exports = E;
+module.exports.TinyEmitter = E;
+
+},{}]},{},[1])(1)
+});
\ No newline at end of file
diff --git a/node_modules/tiny-emitter/dist/tinyemitter.min.js b/node_modules/tiny-emitter/dist/tinyemitter.min.js
new file mode 100644
index 0000000..6340f09
--- /dev/null
+++ b/node_modules/tiny-emitter/dist/tinyemitter.min.js
@@ -0,0 +1 @@
+(function(e){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=e()}else if(typeof define==="function"&&define.amd){define([],e)}else{var n;if(typeof window!=="undefined"){n=window}else if(typeof global!=="undefined"){n=global}else if(typeof self!=="undefined"){n=self}else{n=this}n.TinyEmitter=e()}})(function(){var e,n,t;return function r(e,n,t){function i(o,u){if(!n[o]){if(!e[o]){var s=typeof require=="function"&&require;if(!u&&s)return s(o,!0);if(f)return f(o,!0);var a=new Error("Cannot find module '"+o+"'");throw a.code="MODULE_NOT_FOUND",a}var l=n[o]={exports:{}};e[o][0].call(l.exports,function(n){var t=e[o][1][n];return i(t?t:n)},l,l.exports,r,e,n,t)}return n[o].exports}var f=typeof require=="function"&&require;for(var o=0;o<t.length;o++)i(t[o]);return i}({1:[function(e,n,t){function r(){}r.prototype={on:function(e,n,t){var r=this.e||(this.e={});(r[e]||(r[e]=[])).push({fn:n,ctx:t});return this},once:function(e,n,t){var r=this;function i(){r.off(e,i);n.apply(t,arguments)}i._=n;return this.on(e,i,t)},emit:function(e){var n=[].slice.call(arguments,1);var t=((this.e||(this.e={}))[e]||[]).slice();var r=0;var i=t.length;for(r;r<i;r++){t[r].fn.apply(t[r].ctx,n)}return this},off:function(e,n){var t=this.e||(this.e={});var r=t[e];var i=[];if(r&&n){for(var f=0,o=r.length;f<o;f++){if(r[f].fn!==n&&r[f].fn._!==n)i.push(r[f])}}i.length?t[e]=i:delete t[e];return this}};n.exports=r;n.exports.TinyEmitter=r},{}]},{},[1])(1)});
\ No newline at end of file
diff --git a/node_modules/tiny-emitter/index.d.ts b/node_modules/tiny-emitter/index.d.ts
new file mode 100644
index 0000000..6640610
--- /dev/null
+++ b/node_modules/tiny-emitter/index.d.ts
@@ -0,0 +1,6 @@
+export declare class TinyEmitter {
+  on(event: string, callback: Function, ctx?: any): this;
+  once(event: string, callback: Function, ctx?: any): this;
+  emit(event: string, ...args: any[]): this;
+  off(event: string, callback?: Function): this;
+}
\ No newline at end of file
diff --git a/node_modules/tiny-emitter/index.js b/node_modules/tiny-emitter/index.js
new file mode 100644
index 0000000..7ca4a60
--- /dev/null
+++ b/node_modules/tiny-emitter/index.js
@@ -0,0 +1,67 @@
+function E () {
+  // Keep this empty so it's easier to inherit from
+  // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)
+}
+
+E.prototype = {
+  on: function (name, callback, ctx) {
+    var e = this.e || (this.e = {});
+
+    (e[name] || (e[name] = [])).push({
+      fn: callback,
+      ctx: ctx
+    });
+
+    return this;
+  },
+
+  once: function (name, callback, ctx) {
+    var self = this;
+    function listener () {
+      self.off(name, listener);
+      callback.apply(ctx, arguments);
+    };
+
+    listener._ = callback
+    return this.on(name, listener, ctx);
+  },
+
+  emit: function (name) {
+    var data = [].slice.call(arguments, 1);
+    var evtArr = ((this.e || (this.e = {}))[name] || []).slice();
+    var i = 0;
+    var len = evtArr.length;
+
+    for (i; i < len; i++) {
+      evtArr[i].fn.apply(evtArr[i].ctx, data);
+    }
+
+    return this;
+  },
+
+  off: function (name, callback) {
+    var e = this.e || (this.e = {});
+    var evts = e[name];
+    var liveEvents = [];
+
+    if (evts && callback) {
+      for (var i = 0, len = evts.length; i < len; i++) {
+        if (evts[i].fn !== callback && evts[i].fn._ !== callback)
+          liveEvents.push(evts[i]);
+      }
+    }
+
+    // Remove event from queue to prevent memory leak
+    // Suggested by https://github.com/lazd
+    // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910
+
+    (liveEvents.length)
+      ? e[name] = liveEvents
+      : delete e[name];
+
+    return this;
+  }
+};
+
+module.exports = E;
+module.exports.TinyEmitter = E;
diff --git a/node_modules/tiny-emitter/instance.js b/node_modules/tiny-emitter/instance.js
new file mode 100644
index 0000000..6dcdba2
--- /dev/null
+++ b/node_modules/tiny-emitter/instance.js
@@ -0,0 +1,2 @@
+var E = require('./index.js');
+module.exports = new E();
diff --git a/node_modules/tiny-emitter/package.json b/node_modules/tiny-emitter/package.json
new file mode 100644
index 0000000..5da6335
--- /dev/null
+++ b/node_modules/tiny-emitter/package.json
@@ -0,0 +1,53 @@
+{
+  "name": "tiny-emitter",
+  "version": "2.1.0",
+  "description": "A tiny (less than 1k) event emitter library",
+  "main": "index.js",
+  "scripts": {
+    "test-node": "tape test/index.js | tap-format-spec",
+    "test": "testling | tap-format-spec",
+    "bundle": "node_modules/.bin/browserify index.js > dist/tinyemitter.js -s TinyEmitter && echo 'Bundled'",
+    "minify": "node_modules/.bin/uglifyjs dist/tinyemitter.js -o dist/tinyemitter.min.js -m && echo 'Minified'",
+    "build": "npm test && npm run bundle && npm run minify",
+    "size": "node_modules/.bin/uglifyjs index.js -o minified.js -m && ls -l && rm minified.js"
+  },
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/scottcorgan/tiny-emitter.git"
+  },
+  "keywords": [
+    "event",
+    "emitter",
+    "pubsub",
+    "tiny",
+    "events",
+    "bind"
+  ],
+  "author": "Scott Corgan",
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/scottcorgan/tiny-emitter/issues"
+  },
+  "devDependencies": {
+    "@tap-format/spec": "0.2.0",
+    "browserify": "11.2.0",
+    "tape": "4.2.1",
+    "testling": "1.7.1",
+    "uglify-js": "2.5.0"
+  },
+  "testling": {
+    "files": [
+      "test/index.js"
+    ],
+    "browsers": [
+      "iexplore/10.0",
+      "iexplore/9.0",
+      "firefox/16..latest",
+      "chrome/22..latest",
+      "safari/5.1..latest",
+      "ipad/6.0..latest",
+      "iphone/6.0..latest",
+      "android-browser/4.2..latest"
+    ]
+  }
+}
diff --git a/node_modules/tiny-emitter/test/index.js b/node_modules/tiny-emitter/test/index.js
new file mode 100644
index 0000000..7f95f62
--- /dev/null
+++ b/node_modules/tiny-emitter/test/index.js
@@ -0,0 +1,217 @@
+var Emitter = require('../index');
+var emitter = require('../instance');
+var test = require('tape');
+
+test('subscribes to an event', function (t) {
+  var emitter = new Emitter();
+  emitter.on('test', function () {});
+
+  t.equal(emitter.e.test.length, 1, 'subscribed to event');
+  t.end();
+});
+
+test('subscribes to an event with context', function (t) {
+  var emitter = new Emitter();
+  var context = {
+    contextValue: true
+  };
+
+  emitter.on('test', function () {
+    t.ok(this.contextValue, 'is in context');
+    t.end();
+  }, context);
+
+  emitter.emit('test');
+});
+
+test('subscibes only once to an event', function (t) {
+  var emitter = new Emitter();
+
+  emitter.once('test', function () {
+    t.notOk(emitter.e.test, 'removed event from list');
+    t.end();
+  });
+
+  emitter.emit('test');
+});
+
+test('keeps context when subscribed only once', function (t) {
+  var emitter = new Emitter();
+  var context = {
+    contextValue: true
+  };
+
+  emitter.once('test', function () {
+    t.ok(this.contextValue, 'is in context');
+    t.notOk(emitter.e.test, 'not subscribed anymore');
+    t.end();
+  }, context);
+
+  emitter.emit('test');
+});
+
+test('emits an event', function (t) {
+  var emitter = new Emitter();
+
+  emitter.on('test', function () {
+    t.ok(true, 'triggered event');
+    t.end();
+  });
+
+  emitter.emit('test');
+});
+
+test('passes all arguments to event listener', function (t) {
+  var emitter = new Emitter();
+
+  emitter.on('test', function (arg1, arg2) {
+    t.equal(arg1, 'arg1', 'passed the first argument');
+    t.equal(arg2, 'arg2', 'passed the second argument');
+    t.end();
+  });
+
+  emitter.emit('test', 'arg1', 'arg2');
+});
+
+test('unsubscribes from all events with name', function (t) {
+  var emitter = new Emitter();
+  emitter.on('test', function () {
+    t.fail('should not get called');
+  });
+  emitter.off('test');
+  emitter.emit('test')
+
+  process.nextTick(function () {
+    t.end();
+  });
+});
+
+test('unsubscribes single event with name and callback', function (t) {
+  var emitter = new Emitter();
+  var fn = function () {
+    t.fail('should not get called');
+  }
+
+  emitter.on('test', fn);
+  emitter.off('test', fn);
+  emitter.emit('test')
+
+  process.nextTick(function () {
+    t.end();
+  });
+});
+
+// Test added by https://github.com/lazd
+// From PR: https://github.com/scottcorgan/tiny-emitter/pull/6
+test('unsubscribes single event with name and callback when subscribed twice', function (t) {
+  var emitter = new Emitter();
+  var fn = function () {
+    t.fail('should not get called');
+  };
+
+  emitter.on('test', fn);
+  emitter.on('test', fn);
+
+  emitter.off('test', fn);
+  emitter.emit('test');
+
+  process.nextTick(function () {
+    t.notOk(emitter.e['test'], 'removes all events');
+    t.end();
+  });
+});
+
+test('unsubscribes single event with name and callback when subscribed twice out of order', function (t) {
+  var emitter = new Emitter();
+  var calls = 0;
+  var fn = function () {
+    t.fail('should not get called');
+  };
+  var fn2 = function () {
+    calls++;
+  };
+
+  emitter.on('test', fn);
+  emitter.on('test', fn2);
+  emitter.on('test', fn);
+  emitter.off('test', fn);
+  emitter.emit('test');
+
+  process.nextTick(function () {
+    t.equal(calls, 1, 'callback was called');
+    t.end();
+  });
+});
+
+test('removes an event inside another event', function (t) {
+  var emitter = new Emitter();
+
+  emitter.on('test', function () {
+    t.equal(emitter.e.test.length, 1, 'event is still in list');
+
+    emitter.off('test');
+
+    t.notOk(emitter.e.test, 0, 'event is gone from list');
+    t.end();
+  });
+
+  emitter.emit('test');
+});
+
+test('event is emitted even if unsubscribed in the event callback', function (t) {
+  var emitter = new Emitter();
+  var calls = 0;
+  var fn = function () {
+    calls += 1;
+    emitter.off('test', fn);
+  };
+
+  emitter.on('test', fn);
+
+  emitter.on('test', function () {
+    calls += 1;
+  });
+
+  emitter.on('test', function () {
+    calls += 1;
+  });
+
+  process.nextTick(function () {
+    t.equal(calls, 3, 'all callbacks were called');
+    t.end();
+  });
+
+  emitter.emit('test');
+});
+
+test('calling off before any events added does nothing', function (t) {
+  var emitter = new Emitter();
+  emitter.off('test', function () {});
+  t.end();
+});
+
+test('emitting event that has not been subscribed to yet', function (t) {
+  var emitter = new Emitter();
+
+  emitter.emit('some-event', 'some message');
+  t.end();
+});
+
+test('unsubscribes single event with name and callback which was subscribed once', function (t) {
+  var emitter = new Emitter();
+  var fn = function () {
+    t.fail('event not unsubscribed');
+  }
+
+  emitter.once('test', fn);
+  emitter.off('test', fn);
+  emitter.emit('test');
+
+  t.end();
+});
+
+test('exports an instance', function (t) {
+  t.ok(emitter, 'exports an instance')
+  t.ok(emitter instanceof Emitter, 'an instance of the Emitter class');
+  t.end();
+});
diff --git a/node_modules/tiny-emitter/yarn.lock b/node_modules/tiny-emitter/yarn.lock
new file mode 100644
index 0000000..730a024
--- /dev/null
+++ b/node_modules/tiny-emitter/yarn.lock
@@ -0,0 +1,1857 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@tap-format/exit@0.2.0":
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/@tap-format/exit/-/exit-0.2.0.tgz#b58736bc55d30802c012c5adfca51b47040310cd"
+  dependencies:
+    ramda "^0.18.0"
+    rx "^4.0.7"
+
+"@tap-format/failures@0.2.0":
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/@tap-format/failures/-/failures-0.2.0.tgz#bb6f5edc3bc3c57c62885bc7c214cc7abdfc2a07"
+  dependencies:
+    chalk "^1.1.1"
+    diff "^2.2.1"
+    figures "^1.4.0"
+    ramda "^0.18.0"
+    rx "^4.0.7"
+
+"@tap-format/parser@0.2.0":
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/@tap-format/parser/-/parser-0.2.0.tgz#bdc1d95e694781157593283bb3c3fec132a3115d"
+  dependencies:
+    duplexer "^0.1.1"
+    js-yaml "^3.4.6"
+    ramda "^0.18.0"
+    readable-stream "^2.0.4"
+    rx "^4.0.7"
+    rx-node "^1.0.1"
+    split "^1.0.0"
+
+"@tap-format/results@0.2.0":
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/@tap-format/results/-/results-0.2.0.tgz#192d64ac41f146fa2722db1c0a22ed80478f54fd"
+  dependencies:
+    chalk "^1.1.1"
+    hirestime "^1.0.6"
+    pretty-ms "^2.1.0"
+    rx "^4.0.7"
+
+"@tap-format/spec@0.2.0":
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/@tap-format/spec/-/spec-0.2.0.tgz#93f7d2f0dcefe526b4776800b9bd7f80db5aaec7"
+  dependencies:
+    "@tap-format/exit" "0.2.0"
+    "@tap-format/failures" "0.2.0"
+    "@tap-format/parser" "0.2.0"
+    "@tap-format/results" "0.2.0"
+    chalk "^1.1.1"
+    figures "^1.4.0"
+    rx "^4.0.7"
+
+Base64@~0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/Base64/-/Base64-0.2.1.tgz#ba3a4230708e186705065e66babdd4c35cf60028"
+
+JSONStream@^1.0.3:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.2.tgz#c102371b6ec3a7cf3b847ca00c20bb0fce4c6dea"
+  dependencies:
+    jsonparse "^1.2.0"
+    through ">=2.2.7 <3"
+
+JSONStream@~0.6.4:
+  version "0.6.4"
+  resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-0.6.4.tgz#4b2c8063f8f512787b2375f7ee9db69208fa2dcb"
+  dependencies:
+    jsonparse "0.0.5"
+    through "~2.2.7"
+
+JSONStream@~0.7.1:
+  version "0.7.4"
+  resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-0.7.4.tgz#734290e41511eea7c2cfe151fbf9a563a97b9786"
+  dependencies:
+    jsonparse "0.0.5"
+    through ">=2.2.7 <3"
+
+acorn-node@^1.2.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.3.0.tgz#5f86d73346743810ef1269b901dbcbded020861b"
+  dependencies:
+    acorn "^5.4.1"
+    xtend "^4.0.1"
+
+acorn@^2.7.0:
+  version "2.7.0"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-2.7.0.tgz#ab6e7d9d886aaca8b085bc3312b79a198433f0e7"
+
+acorn@^4.0.3:
+  version "4.0.13"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
+
+acorn@^5.2.1, acorn@^5.4.1:
+  version "5.4.1"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.4.1.tgz#fdc58d9d17f4a4e98d102ded826a9b9759125102"
+
+amdefine@>=0.0.4:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
+
+ansi-regex@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+
+ansi-styles@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+
+argparse@^1.0.7:
+  version "1.0.10"
+  resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+  dependencies:
+    sprintf-js "~1.0.2"
+
+asn1.js@^4.0.0:
+  version "4.10.1"
+  resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
+  dependencies:
+    bn.js "^4.0.0"
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+
+assert@~1.1.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/assert/-/assert-1.1.2.tgz#adaa04c46bb58c6dd1f294da3eb26e6228eb6e44"
+  dependencies:
+    util "0.10.3"
+
+assert@~1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/assert/-/assert-1.3.0.tgz#03939a622582a812cc202320a0b9a56c9b815849"
+  dependencies:
+    util "0.10.3"
+
+astw@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/astw/-/astw-2.2.0.tgz#7bd41784d32493987aeb239b6b4e1c57a873b917"
+  dependencies:
+    acorn "^4.0.3"
+
+async@~0.2.6:
+  version "0.2.10"
+  resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1"
+
+balanced-match@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+
+base64-js@0.0.2:
+  version "0.0.2"
+  resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.2.tgz#024f0f72afa25b75f9c0ee73cd4f55ec1bed9784"
+
+base64-js@0.0.8, base64-js@~0.0.4:
+  version "0.0.8"
+  resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978"
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
+  version "4.11.8"
+  resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
+
+bops@0.0.6:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/bops/-/bops-0.0.6.tgz#082d1d55fa01e60dbdc2ebc2dba37f659554cf3a"
+  dependencies:
+    base64-js "0.0.2"
+    to-utf8 "0.0.1"
+
+bouncy@~3.2.0:
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/bouncy/-/bouncy-3.2.2.tgz#82ab4ad7beae05890eed54b9af3c45394b185dc7"
+  dependencies:
+    optimist "~0.3.5"
+    through "~2.3.4"
+
+brace-expansion@^1.0.0, brace-expansion@^1.1.7:
+  version "1.1.11"
+  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+  dependencies:
+    balanced-match "^1.0.0"
+    concat-map "0.0.1"
+
+brorand@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+
+browser-launcher@~0.3.2:
+  version "0.3.5"
+  resolved "https://registry.yarnpkg.com/browser-launcher/-/browser-launcher-0.3.5.tgz#d9a3663fa064d8155044991c00e61dbcb6730a16"
+  dependencies:
+    headless "~0.1.3"
+    merge "~1.0.0"
+    minimist "0.0.5"
+    mkdirp "~0.3.3"
+    plist "0.2.1"
+    xtend "^4.0.0"
+
+browser-pack@^5.0.0:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-5.0.1.tgz#4197719b20c6e0aaa09451c5111e53efb6fbc18d"
+  dependencies:
+    JSONStream "^1.0.3"
+    combine-source-map "~0.6.1"
+    defined "^1.0.0"
+    through2 "^1.0.0"
+    umd "^3.0.0"
+
+browser-pack@~2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-2.0.1.tgz#5d1c527f56c582677411c4db2a128648ff6bf150"
+  dependencies:
+    JSONStream "~0.6.4"
+    combine-source-map "~0.3.0"
+    through "~2.3.4"
+
+browser-resolve@^1.7.0, browser-resolve@^1.7.1:
+  version "1.11.2"
+  resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce"
+  dependencies:
+    resolve "1.1.7"
+
+browser-resolve@~1.2.1, browser-resolve@~1.2.4:
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.2.4.tgz#59ae7820a82955ecd32f5fb7c468ac21c4723806"
+  dependencies:
+    resolve "0.6.3"
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.1.1.tgz#38b7ab55edb806ff2dcda1a7f1620773a477c49f"
+  dependencies:
+    buffer-xor "^1.0.3"
+    cipher-base "^1.0.0"
+    create-hash "^1.1.0"
+    evp_bytestokey "^1.0.3"
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+browserify-cipher@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a"
+  dependencies:
+    browserify-aes "^1.0.4"
+    browserify-des "^1.0.0"
+    evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd"
+  dependencies:
+    cipher-base "^1.0.1"
+    des.js "^1.0.0"
+    inherits "^2.0.1"
+
+browserify-rsa@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
+  dependencies:
+    bn.js "^4.1.0"
+    randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+  version "4.0.4"
+  resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
+  dependencies:
+    bn.js "^4.1.1"
+    browserify-rsa "^4.0.0"
+    create-hash "^1.1.0"
+    create-hmac "^1.1.2"
+    elliptic "^6.0.0"
+    inherits "^2.0.1"
+    parse-asn1 "^5.0.0"
+
+browserify-zlib@~0.1.2:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d"
+  dependencies:
+    pako "~0.2.0"
+
+browserify@11.2.0:
+  version "11.2.0"
+  resolved "https://registry.yarnpkg.com/browserify/-/browserify-11.2.0.tgz#a11bb9dd209d79572b813f7eeeaf828a5f5c0e4e"
+  dependencies:
+    JSONStream "^1.0.3"
+    assert "~1.3.0"
+    browser-pack "^5.0.0"
+    browser-resolve "^1.7.1"
+    browserify-zlib "~0.1.2"
+    buffer "^3.0.0"
+    builtins "~0.0.3"
+    commondir "0.0.1"
+    concat-stream "~1.4.1"
+    console-browserify "^1.1.0"
+    constants-browserify "~0.0.1"
+    crypto-browserify "^3.0.0"
+    defined "^1.0.0"
+    deps-sort "^1.3.7"
+    domain-browser "~1.1.0"
+    duplexer2 "~0.0.2"
+    events "~1.0.0"
+    glob "^4.0.5"
+    has "^1.0.0"
+    htmlescape "^1.1.0"
+    https-browserify "~0.0.0"
+    inherits "~2.0.1"
+    insert-module-globals "^6.4.1"
+    isarray "0.0.1"
+    labeled-stream-splicer "^1.0.0"
+    module-deps "^3.7.11"
+    os-browserify "~0.1.1"
+    parents "^1.0.1"
+    path-browserify "~0.0.0"
+    process "~0.11.0"
+    punycode "^1.3.2"
+    querystring-es3 "~0.2.0"
+    read-only-stream "^1.1.1"
+    readable-stream "^2.0.2"
+    resolve "^1.1.4"
+    shasum "^1.0.0"
+    shell-quote "~0.0.1"
+    stream-browserify "^2.0.0"
+    stream-http "^1.2.0"
+    string_decoder "~0.10.0"
+    subarg "^1.0.0"
+    syntax-error "^1.1.1"
+    through2 "^1.0.0"
+    timers-browserify "^1.0.1"
+    tty-browserify "~0.0.0"
+    url "~0.10.1"
+    util "~0.10.1"
+    vm-browserify "~0.0.1"
+    xtend "^4.0.0"
+
+browserify@3.x.x:
+  version "3.46.1"
+  resolved "https://registry.yarnpkg.com/browserify/-/browserify-3.46.1.tgz#2c2e4a7f2f408178e78c223b5b57b37c2185ad8e"
+  dependencies:
+    JSONStream "~0.7.1"
+    assert "~1.1.0"
+    browser-pack "~2.0.0"
+    browser-resolve "~1.2.1"
+    browserify-zlib "~0.1.2"
+    buffer "~2.1.4"
+    builtins "~0.0.3"
+    commondir "0.0.1"
+    concat-stream "~1.4.1"
+    console-browserify "~1.0.1"
+    constants-browserify "~0.0.1"
+    crypto-browserify "~1.0.9"
+    deep-equal "~0.1.0"
+    defined "~0.0.0"
+    deps-sort "~0.1.1"
+    derequire "~0.8.0"
+    domain-browser "~1.1.0"
+    duplexer "~0.1.1"
+    events "~1.0.0"
+    glob "~3.2.8"
+    http-browserify "~1.3.1"
+    https-browserify "~0.0.0"
+    inherits "~2.0.1"
+    insert-module-globals "~6.0.0"
+    module-deps "~2.0.0"
+    os-browserify "~0.1.1"
+    parents "~0.0.1"
+    path-browserify "~0.0.0"
+    process "^0.7.0"
+    punycode "~1.2.3"
+    querystring-es3 "0.2.0"
+    resolve "~0.6.1"
+    shallow-copy "0.0.1"
+    shell-quote "~0.0.1"
+    stream-browserify "~0.1.0"
+    stream-combiner "~0.0.2"
+    string_decoder "~0.0.0"
+    subarg "0.0.1"
+    syntax-error "~1.1.0"
+    through2 "~0.4.1"
+    timers-browserify "~1.0.1"
+    tty-browserify "~0.0.0"
+    umd "~2.0.0"
+    url "~0.10.1"
+    util "~0.10.1"
+    vm-browserify "~0.0.1"
+    xtend "^3.0.0"
+
+buffer-xor@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+
+buffer@^3.0.0:
+  version "3.6.0"
+  resolved "https://registry.yarnpkg.com/buffer/-/buffer-3.6.0.tgz#a72c936f77b96bf52f5f7e7b467180628551defb"
+  dependencies:
+    base64-js "0.0.8"
+    ieee754 "^1.1.4"
+    isarray "^1.0.0"
+
+buffer@~2.1.4:
+  version "2.1.13"
+  resolved "https://registry.yarnpkg.com/buffer/-/buffer-2.1.13.tgz#c88838ebf79f30b8b4a707788470bea8a62c2355"
+  dependencies:
+    base64-js "~0.0.4"
+    ieee754 "~1.1.1"
+
+builtin-status-codes@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-1.0.0.tgz#30637ee262978ac07174e16d7f82f0ad06e085ad"
+
+builtins@~0.0.3:
+  version "0.0.7"
+  resolved "https://registry.yarnpkg.com/builtins/-/builtins-0.0.7.tgz#355219cd6cf18dbe7c01cc7fd2dce765cfdc549a"
+
+callsite@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20"
+
+camelcase@^1.0.2:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
+
+chalk@^1.1.1:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+  dependencies:
+    ansi-styles "^2.2.1"
+    escape-string-regexp "^1.0.2"
+    has-ansi "^2.0.0"
+    strip-ansi "^3.0.0"
+    supports-color "^2.0.0"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+combine-source-map@~0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.3.0.tgz#d9e74f593d9cd43807312cb5d846d451efaa9eb7"
+  dependencies:
+    convert-source-map "~0.3.0"
+    inline-source-map "~0.3.0"
+    source-map "~0.1.31"
+
+combine-source-map@~0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.6.1.tgz#9b4a09c316033d768e0f11e029fa2730e079ad96"
+  dependencies:
+    convert-source-map "~1.1.0"
+    inline-source-map "~0.5.0"
+    lodash.memoize "~3.0.3"
+    source-map "~0.4.2"
+
+commondir@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/commondir/-/commondir-0.0.1.tgz#89f00fdcd51b519c578733fec563e6a6da7f5be2"
+
+concat-map@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+
+concat-stream@~0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-0.1.1.tgz#d7f4e278b90cfc4f0f3ef77fe4c03b40eb3f7900"
+
+concat-stream@~1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.0.1.tgz#018b18bc1c7d073a2dc82aa48442341a2c4dd79f"
+  dependencies:
+    bops "0.0.6"
+
+concat-stream@~1.4.1, concat-stream@~1.4.5:
+  version "1.4.10"
+  resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.4.10.tgz#acc3bbf5602cb8cc980c6ac840fa7d8603e3ef36"
+  dependencies:
+    inherits "~2.0.1"
+    readable-stream "~1.1.9"
+    typedarray "~0.0.5"
+
+console-browserify@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
+  dependencies:
+    date-now "^0.1.4"
+
+console-browserify@~1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.0.3.tgz#d3898d2c3a93102f364197f8874b4f92b5286a8e"
+
+constants-browserify@~0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-0.0.1.tgz#92577db527ba6c4cf0a4568d84bc031f441e21f2"
+
+convert-source-map@~0.3.0:
+  version "0.3.5"
+  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190"
+
+convert-source-map@~1.1.0:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860"
+
+core-util-is@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+
+create-ecdh@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d"
+  dependencies:
+    bn.js "^4.1.0"
+    elliptic "^6.0.0"
+
+create-hash@^1.1.0, create-hash@^1.1.2:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd"
+  dependencies:
+    cipher-base "^1.0.1"
+    inherits "^2.0.1"
+    ripemd160 "^2.0.0"
+    sha.js "^2.4.0"
+
+create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06"
+  dependencies:
+    cipher-base "^1.0.3"
+    create-hash "^1.1.0"
+    inherits "^2.0.1"
+    ripemd160 "^2.0.0"
+    safe-buffer "^5.0.1"
+    sha.js "^2.4.8"
+
+crypto-browserify@^3.0.0:
+  version "3.12.0"
+  resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
+  dependencies:
+    browserify-cipher "^1.0.0"
+    browserify-sign "^4.0.0"
+    create-ecdh "^4.0.0"
+    create-hash "^1.1.0"
+    create-hmac "^1.1.0"
+    diffie-hellman "^5.0.0"
+    inherits "^2.0.1"
+    pbkdf2 "^3.0.3"
+    public-encrypt "^4.0.0"
+    randombytes "^2.0.0"
+    randomfill "^1.0.3"
+
+crypto-browserify@~1.0.9:
+  version "1.0.9"
+  resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-1.0.9.tgz#cc5449685dfb85eb11c9828acc7cb87ab5bbfcc0"
+
+date-now@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
+
+decamelize@^1.0.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+
+deep-equal@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-0.0.0.tgz#99679d3bbd047156fcd450d3d01eeb9068691e83"
+
+deep-equal@~0.1.0:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-0.1.2.tgz#b246c2b80a570a47c11be1d9bd1070ec878b87ce"
+
+deep-equal@~1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
+
+define-properties@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94"
+  dependencies:
+    foreach "^2.0.5"
+    object-keys "^1.0.8"
+
+defined@^1.0.0, defined@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
+
+defined@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/defined/-/defined-0.0.0.tgz#f35eea7d705e933baf13b2f03b3f83d921403b3e"
+
+deps-sort@^1.3.7:
+  version "1.3.9"
+  resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-1.3.9.tgz#29dfff53e17b36aecae7530adbbbf622c2ed1a71"
+  dependencies:
+    JSONStream "^1.0.3"
+    shasum "^1.0.0"
+    subarg "^1.0.0"
+    through2 "^1.0.0"
+
+deps-sort@~0.1.1:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-0.1.2.tgz#daa2fb614a17c9637d801e2f55339ae370f3611a"
+  dependencies:
+    JSONStream "~0.6.4"
+    minimist "~0.0.1"
+    through "~2.3.4"
+
+derequire@~0.8.0:
+  version "0.8.0"
+  resolved "https://registry.yarnpkg.com/derequire/-/derequire-0.8.0.tgz#c1f7f1da2cede44adede047378f03f444e9c4c0d"
+  dependencies:
+    esprima-fb "^3001.1.0-dev-harmony-fb"
+    esrefactor "~0.1.0"
+    estraverse "~1.5.0"
+
+des.js@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
+  dependencies:
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+
+detective@^4.0.0:
+  version "4.7.1"
+  resolved "https://registry.yarnpkg.com/detective/-/detective-4.7.1.tgz#0eca7314338442febb6d65da54c10bb1c82b246e"
+  dependencies:
+    acorn "^5.2.1"
+    defined "^1.0.0"
+
+detective@~3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/detective/-/detective-3.1.0.tgz#77782444ab752b88ca1be2e9d0a0395f1da25eed"
+  dependencies:
+    escodegen "~1.1.0"
+    esprima-fb "3001.1.0-dev-harmony-fb"
+
+diff@^2.2.1:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/diff/-/diff-2.2.3.tgz#60eafd0d28ee906e4e8ff0a52c1229521033bf99"
+
+diffie-hellman@^5.0.0:
+  version "5.0.2"
+  resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e"
+  dependencies:
+    bn.js "^4.1.0"
+    miller-rabin "^4.0.0"
+    randombytes "^2.0.0"
+
+domain-browser@~1.1.0:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc"
+
+duplexer2@0.0.2, duplexer2@~0.0.2:
+  version "0.0.2"
+  resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db"
+  dependencies:
+    readable-stream "~1.1.9"
+
+duplexer@^0.1.1, duplexer@~0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1"
+
+ecstatic@~0.4.5:
+  version "0.4.13"
+  resolved "https://registry.yarnpkg.com/ecstatic/-/ecstatic-0.4.13.tgz#9cb6eaffe211b9c84efb3f553cde2c3002717b29"
+  dependencies:
+    ent "0.0.x"
+    mime "1.2.x"
+    optimist "~0.3.5"
+
+elliptic@^6.0.0:
+  version "6.4.0"
+  resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df"
+  dependencies:
+    bn.js "^4.4.0"
+    brorand "^1.0.1"
+    hash.js "^1.0.0"
+    hmac-drbg "^1.0.0"
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+    minimalistic-crypto-utils "^1.0.0"
+
+ent@0.0.x, ent@~0.0.5:
+  version "0.0.7"
+  resolved "https://registry.yarnpkg.com/ent/-/ent-0.0.7.tgz#835d4e7f9e7a8d4921c692e9010ec976da5e9949"
+
+es-abstract@^1.5.0:
+  version "1.10.0"
+  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.10.0.tgz#1ecb36c197842a00d8ee4c2dfd8646bb97d60864"
+  dependencies:
+    es-to-primitive "^1.1.1"
+    function-bind "^1.1.1"
+    has "^1.0.1"
+    is-callable "^1.1.3"
+    is-regex "^1.0.4"
+
+es-to-primitive@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d"
+  dependencies:
+    is-callable "^1.1.1"
+    is-date-object "^1.0.1"
+    is-symbol "^1.0.1"
+
+escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+
+escodegen@~1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.1.0.tgz#c663923f6e20aad48d0c0fa49f31c6d4f49360cf"
+  dependencies:
+    esprima "~1.0.4"
+    estraverse "~1.5.0"
+    esutils "~1.0.0"
+  optionalDependencies:
+    source-map "~0.1.30"
+
+escope@~0.0.13:
+  version "0.0.16"
+  resolved "https://registry.yarnpkg.com/escope/-/escope-0.0.16.tgz#418c7a0afca721dafe659193fd986283e746538f"
+  dependencies:
+    estraverse ">= 0.0.2"
+
+esprima-fb@3001.1.0-dev-harmony-fb, esprima-fb@^3001.1.0-dev-harmony-fb:
+  version "3001.1.0-dev-harmony-fb"
+  resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-3001.0001.0000-dev-harmony-fb.tgz#b77d37abcd38ea0b77426bb8bc2922ce6b426411"
+
+esprima@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804"
+
+esprima@~1.0.2, esprima@~1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.0.4.tgz#9f557e08fc3b4d26ece9dd34f8fbf476b62585ad"
+
+esrefactor@~0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/esrefactor/-/esrefactor-0.1.0.tgz#d142795a282339ab81e936b5b7a21b11bf197b13"
+  dependencies:
+    escope "~0.0.13"
+    esprima "~1.0.2"
+    estraverse "~0.0.4"
+
+"estraverse@>= 0.0.2":
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
+
+estraverse@~0.0.4:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-0.0.4.tgz#01a0932dfee574684a598af5a67c3bf9b6428db2"
+
+estraverse@~1.5.0:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.5.1.tgz#867a3e8e58a9f84618afb6c2ddbcd916b7cbaf71"
+
+esutils@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/esutils/-/esutils-1.0.0.tgz#8151d358e20c8acc7fb745e7472c0025fe496570"
+
+events@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/events/-/events-1.0.2.tgz#75849dcfe93d10fb057c30055afdbd51d06a8e24"
+
+evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+  dependencies:
+    md5.js "^1.3.4"
+    safe-buffer "^5.1.1"
+
+figures@^1.4.0:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
+  dependencies:
+    escape-string-regexp "^1.0.5"
+    object-assign "^4.1.0"
+
+foreach@^2.0.5:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
+
+function-bind@^1.0.2, function-bind@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+
+function-bind@~1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.0.2.tgz#c2873b69c5e6d7cefae47d2555172926c8c2e05e"
+
+glob@^4.0.5:
+  version "4.5.3"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f"
+  dependencies:
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^2.0.1"
+    once "^1.3.0"
+
+glob@~3.2.1, glob@~3.2.8:
+  version "3.2.11"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d"
+  dependencies:
+    inherits "2"
+    minimatch "0.3"
+
+glob@~5.0.3:
+  version "5.0.15"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
+  dependencies:
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "2 || 3"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+has-ansi@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+  dependencies:
+    ansi-regex "^2.0.0"
+
+has@^1.0.0, has@^1.0.1, has@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28"
+  dependencies:
+    function-bind "^1.0.2"
+
+hash-base@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1"
+  dependencies:
+    inherits "^2.0.1"
+
+hash-base@^3.0.0:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846"
+  dependencies:
+    inherits "^2.0.3"
+    minimalistic-assert "^1.0.0"
+
+headless@~0.1.3:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/headless/-/headless-0.1.7.tgz#6e62fae668947f88184d5c156ede7c5695a7e9c8"
+
+hirestime@^1.0.6:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/hirestime/-/hirestime-1.0.7.tgz#2d5271ea84356cec3f25da8c56a9402f8fc0a700"
+
+hmac-drbg@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+  dependencies:
+    hash.js "^1.0.3"
+    minimalistic-assert "^1.0.0"
+    minimalistic-crypto-utils "^1.0.1"
+
+htmlescape@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351"
+
+http-browserify@~1.3.1:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/http-browserify/-/http-browserify-1.3.2.tgz#b562c34479349a690d7a6597df495aefa8c604f5"
+  dependencies:
+    Base64 "~0.2.0"
+    inherits "~2.0.1"
+
+https-browserify@~0.0.0:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82"
+
+ieee754@^1.1.4, ieee754@~1.1.1:
+  version "1.1.8"
+  resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"
+
+indexof@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
+
+inflight@^1.0.4:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+  dependencies:
+    once "^1.3.0"
+    wrappy "1"
+
+inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+
+inherits@2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+
+inline-source-map@~0.3.0:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.3.1.tgz#a528b514e689fce90db3089e870d92f527acb5eb"
+  dependencies:
+    source-map "~0.3.0"
+
+inline-source-map@~0.5.0:
+  version "0.5.0"
+  resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.5.0.tgz#4a4c5dd8e4fb5e9b3cda60c822dfadcaee66e0af"
+  dependencies:
+    source-map "~0.4.0"
+
+insert-module-globals@^6.4.1:
+  version "6.6.3"
+  resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-6.6.3.tgz#20638e29a30f9ed1ca2e3a825fbc2cba5246ddfc"
+  dependencies:
+    JSONStream "^1.0.3"
+    combine-source-map "~0.6.1"
+    concat-stream "~1.4.1"
+    is-buffer "^1.1.0"
+    lexical-scope "^1.2.0"
+    process "~0.11.0"
+    through2 "^1.0.0"
+    xtend "^4.0.0"
+
+insert-module-globals@~6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-6.0.0.tgz#ee8aeb9dee16819e33aa14588a558824af0c15dc"
+  dependencies:
+    JSONStream "~0.7.1"
+    concat-stream "~1.4.1"
+    lexical-scope "~1.1.0"
+    process "~0.6.0"
+    through "~2.3.4"
+    xtend "^3.0.0"
+
+is-buffer@^1.1.0:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+
+is-callable@^1.1.1, is-callable@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2"
+
+is-date-object@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
+
+is-finite@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
+  dependencies:
+    number-is-nan "^1.0.0"
+
+is-regex@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
+  dependencies:
+    has "^1.0.1"
+
+is-symbol@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572"
+
+isarray@0.0.1, isarray@~0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+
+isarray@^1.0.0, isarray@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+
+js-yaml@^3.4.6:
+  version "3.10.0"
+  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc"
+  dependencies:
+    argparse "^1.0.7"
+    esprima "^4.0.0"
+
+json-stable-stringify@~0.0.0:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz#611c23e814db375527df851193db59dd2af27f45"
+  dependencies:
+    jsonify "~0.0.0"
+
+jsonify@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
+
+jsonparse@0.0.5:
+  version "0.0.5"
+  resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-0.0.5.tgz#330542ad3f0a654665b778f3eb2d9a9fa507ac64"
+
+jsonparse@^1.2.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
+
+labeled-stream-splicer@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-1.0.2.tgz#4615331537784981e8fd264e1f3a434c4e0ddd65"
+  dependencies:
+    inherits "^2.0.1"
+    isarray "~0.0.1"
+    stream-splicer "^1.1.0"
+
+lexical-scope@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/lexical-scope/-/lexical-scope-1.2.0.tgz#fcea5edc704a4b3a8796cdca419c3a0afaf22df4"
+  dependencies:
+    astw "^2.0.0"
+
+lexical-scope@~1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/lexical-scope/-/lexical-scope-1.1.1.tgz#debac1067435f1359d90fcfd9e94bcb2ee47b2bf"
+  dependencies:
+    astw "^2.0.0"
+
+lodash.memoize@~3.0.3:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f"
+
+lru-cache@2:
+  version "2.7.3"
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952"
+
+md5.js@^1.3.4:
+  version "1.3.4"
+  resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d"
+  dependencies:
+    hash-base "^3.0.0"
+    inherits "^2.0.1"
+
+merge@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/merge/-/merge-1.0.0.tgz#b443ab46d837c491e6222056ab0f7933ecb3568f"
+
+miller-rabin@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+  dependencies:
+    bn.js "^4.0.0"
+    brorand "^1.0.1"
+
+mime@1.2.x:
+  version "1.2.11"
+  resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.11.tgz#58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10"
+
+minimalistic-assert@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3"
+
+minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+
+minimatch@0.3:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd"
+  dependencies:
+    lru-cache "2"
+    sigmund "~1.0.0"
+
+"minimatch@2 || 3":
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+  dependencies:
+    brace-expansion "^1.1.7"
+
+minimatch@^2.0.1:
+  version "2.0.10"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7"
+  dependencies:
+    brace-expansion "^1.0.0"
+
+minimist@0.0.5:
+  version "0.0.5"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.5.tgz#d7aa327bcecf518f9106ac6b8f003fa3bcea8566"
+
+minimist@^1.1.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+
+minimist@~0.0.1, minimist@~0.0.7, minimist@~0.0.9:
+  version "0.0.10"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
+
+mkdirp@~0.3.3:
+  version "0.3.5"
+  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7"
+
+module-deps@^3.7.11:
+  version "3.9.1"
+  resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-3.9.1.tgz#ea75caf9199090d25b0d5512b5acacb96e7f87f3"
+  dependencies:
+    JSONStream "^1.0.3"
+    browser-resolve "^1.7.0"
+    concat-stream "~1.4.5"
+    defined "^1.0.0"
+    detective "^4.0.0"
+    duplexer2 "0.0.2"
+    inherits "^2.0.1"
+    parents "^1.0.0"
+    readable-stream "^1.1.13"
+    resolve "^1.1.3"
+    stream-combiner2 "~1.0.0"
+    subarg "^1.0.0"
+    through2 "^1.0.0"
+    xtend "^4.0.0"
+
+module-deps@~2.0.0:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-2.0.6.tgz#b999321c73ac33580f00712c0f3075fdca42563f"
+  dependencies:
+    JSONStream "~0.7.1"
+    browser-resolve "~1.2.4"
+    concat-stream "~1.4.5"
+    detective "~3.1.0"
+    duplexer2 "0.0.2"
+    inherits "~2.0.1"
+    minimist "~0.0.9"
+    parents "0.0.2"
+    readable-stream "^1.0.27-1"
+    resolve "~0.6.3"
+    stream-combiner "~0.1.0"
+    through2 "~0.4.1"
+
+number-is-nan@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+
+object-assign@^4.1.0:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+
+object-inspect@~0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-0.1.3.tgz#d05a65c2e34fe8225d9fda2e484e4e47b7e2f490"
+  dependencies:
+    tape "~1.0.4"
+
+object-inspect@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.0.2.tgz#a97885b553e575eb4009ebc09bdda9b1cd21979a"
+
+object-keys@^1.0.4, object-keys@^1.0.8:
+  version "1.0.11"
+  resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d"
+
+object-keys@~0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336"
+
+once@^1.3.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+  dependencies:
+    wrappy "1"
+
+optimist@~0.3.5:
+  version "0.3.7"
+  resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.3.7.tgz#c90941ad59e4273328923074d2cf2e7cbc6ec0d9"
+  dependencies:
+    wordwrap "~0.0.2"
+
+optimist@~0.5.2:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.5.2.tgz#85c8c1454b3315e4a78947e857b1df033450bfbc"
+  dependencies:
+    wordwrap "~0.0.2"
+
+ordered-emitter@~0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/ordered-emitter/-/ordered-emitter-0.1.1.tgz#aa20bdafbdcc1631834a350f68b4ef8eb34eed7b"
+
+os-browserify@~0.1.1:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.1.2.tgz#49ca0293e0b19590a5f5de10c7f265a617d8fe54"
+
+pako@~0.2.0:
+  version "0.2.9"
+  resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75"
+
+parents@0.0.2:
+  version "0.0.2"
+  resolved "https://registry.yarnpkg.com/parents/-/parents-0.0.2.tgz#67147826e497d40759aaf5ba4c99659b6034d302"
+
+parents@^1.0.0, parents@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751"
+  dependencies:
+    path-platform "~0.11.15"
+
+parents@~0.0.1:
+  version "0.0.3"
+  resolved "https://registry.yarnpkg.com/parents/-/parents-0.0.3.tgz#fa212f024d9fa6318dbb6b4ce676c8be493b9c43"
+  dependencies:
+    path-platform "^0.0.1"
+
+parse-asn1@^5.0.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712"
+  dependencies:
+    asn1.js "^4.0.0"
+    browserify-aes "^1.0.0"
+    create-hash "^1.1.0"
+    evp_bytestokey "^1.0.0"
+    pbkdf2 "^3.0.3"
+
+parse-ms@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-1.0.1.tgz#56346d4749d78f23430ca0c713850aef91aa361d"
+
+path-browserify@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
+
+path-is-absolute@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+
+path-parse@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
+
+path-platform@^0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.0.1.tgz#b5585d7c3c463d89aa0060d86611cf1afd617e2a"
+
+path-platform@~0.11.15:
+  version "0.11.15"
+  resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2"
+
+pbkdf2@^3.0.3:
+  version "3.0.14"
+  resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade"
+  dependencies:
+    create-hash "^1.1.2"
+    create-hmac "^1.1.4"
+    ripemd160 "^2.0.1"
+    safe-buffer "^5.0.1"
+    sha.js "^2.4.8"
+
+plist@0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/plist/-/plist-0.2.1.tgz#f3a3de07885d773e66d8a96782f1bec28cf2b2d0"
+  dependencies:
+    sax "0.1.x"
+
+plur@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/plur/-/plur-1.0.0.tgz#db85c6814f5e5e5a3b49efc28d604fec62975156"
+
+pretty-ms@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-2.1.0.tgz#4257c256df3fb0b451d6affaab021884126981dc"
+  dependencies:
+    is-finite "^1.0.1"
+    parse-ms "^1.0.0"
+    plur "^1.0.0"
+
+process-nextick-args@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
+
+process@^0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/process/-/process-0.7.0.tgz#c52208161a34adf3812344ae85d3e6150469389d"
+
+process@~0.11.0:
+  version "0.11.10"
+  resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+
+process@~0.5.1:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf"
+
+process@~0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/process/-/process-0.6.0.tgz#7dd9be80ffaaedd4cb628f1827f1cbab6dc0918f"
+
+public-encrypt@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6"
+  dependencies:
+    bn.js "^4.1.0"
+    browserify-rsa "^4.0.0"
+    create-hash "^1.1.0"
+    parse-asn1 "^5.0.0"
+    randombytes "^2.0.1"
+
+punycode@1.3.2:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+
+punycode@^1.3.2:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+
+punycode@~1.2.3:
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.2.4.tgz#54008ac972aec74175def9cba6df7fa9d3918740"
+
+querystring-es3@0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.0.tgz#c365a08a69c443accfeb3a9deab35e3f0abaa476"
+
+querystring-es3@~0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
+
+querystring@0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+
+ramda@^0.18.0:
+  version "0.18.0"
+  resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.18.0.tgz#c6e3c5d4b9ab1f7906727fdeeb039152a85d4db3"
+
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80"
+  dependencies:
+    safe-buffer "^5.1.0"
+
+randomfill@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
+  dependencies:
+    randombytes "^2.0.5"
+    safe-buffer "^5.1.0"
+
+read-only-stream@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-1.1.1.tgz#5da77c799ed1388d3ef88a18471bb5924f8a0ba1"
+  dependencies:
+    readable-stream "^1.0.31"
+    readable-wrap "^1.0.0"
+
+"readable-stream@>=1.1.13-1 <1.2.0-0", readable-stream@^1.0.27-1, readable-stream@^1.0.31, readable-stream@^1.1.13, readable-stream@^1.1.13-1, readable-stream@~1.1.9:
+  version "1.1.14"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.1"
+    isarray "0.0.1"
+    string_decoder "~0.10.x"
+
+readable-stream@^2.0.2, readable-stream@^2.0.4:
+  version "2.3.4"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.4.tgz#c946c3f47fa7d8eabc0b6150f4a12f69a4574071"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.3"
+    isarray "~1.0.0"
+    process-nextick-args "~2.0.0"
+    safe-buffer "~5.1.1"
+    string_decoder "~1.0.3"
+    util-deprecate "~1.0.1"
+
+readable-stream@~1.0.17:
+  version "1.0.34"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.1"
+    isarray "0.0.1"
+    string_decoder "~0.10.x"
+
+readable-wrap@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/readable-wrap/-/readable-wrap-1.0.0.tgz#3b5a211c631e12303a54991c806c17e7ae206bff"
+  dependencies:
+    readable-stream "^1.1.13-1"
+
+resolve@0.6.3, resolve@~0.6.1, resolve@~0.6.3:
+  version "0.6.3"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-0.6.3.tgz#dd957982e7e736debdf53b58a4dd91754575dd46"
+
+resolve@1.1.7:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
+
+resolve@^1.1.3, resolve@^1.1.4:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36"
+  dependencies:
+    path-parse "^1.0.5"
+
+resolve@~0.3.0:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-0.3.1.tgz#34c63447c664c70598d1c9b126fc43b2a24310a4"
+
+resolve@~0.4.0:
+  version "0.4.3"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-0.4.3.tgz#dcadad202e7cacc2467e3a38800211f42f9c13df"
+
+resumer@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759"
+  dependencies:
+    through "~2.3.4"
+
+rfile@~1.0, rfile@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/rfile/-/rfile-1.0.0.tgz#59708cf90ca1e74c54c3cfc5c36fdb9810435261"
+  dependencies:
+    callsite "~1.0.0"
+    resolve "~0.3.0"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7"
+  dependencies:
+    hash-base "^2.0.0"
+    inherits "^2.0.1"
+
+ruglify@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/ruglify/-/ruglify-1.0.0.tgz#dc8930e2a9544a274301cc9972574c0d0986b675"
+  dependencies:
+    rfile "~1.0"
+    uglify-js "~2.2"
+
+rx-node@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/rx-node/-/rx-node-1.0.2.tgz#151240725a79e857360ab06cc626799965e094de"
+  dependencies:
+    rx "*"
+
+rx@*, rx@^4.0.7:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782"
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
+
+sax@0.1.x:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/sax/-/sax-0.1.5.tgz#d1829a6120fa01665eb4dbff6c43f29fd6d61471"
+
+sha.js@^2.4.0, sha.js@^2.4.8, sha.js@~2.4.4:
+  version "2.4.10"
+  resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.10.tgz#b1fde5cd7d11a5626638a07c604ab909cfa31f9b"
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+shallow-copy@0.0.1, shallow-copy@~0.0.0:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170"
+
+shasum@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/shasum/-/shasum-1.0.2.tgz#e7012310d8f417f4deb5712150e5678b87ae565f"
+  dependencies:
+    json-stable-stringify "~0.0.0"
+    sha.js "~2.4.4"
+
+shell-quote@~0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-0.0.1.tgz#1a41196f3c0333c482323593d6886ecf153dd986"
+
+shell-quote@~1.3.1:
+  version "1.3.3"
+  resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.3.3.tgz#07b8826f427c052511e8b5627639e172596e8e4b"
+
+sigmund@~1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
+
+source-map@0.1.34:
+  version "0.1.34"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.34.tgz#a7cfe89aec7b1682c3b198d0acfb47d7d090566b"
+  dependencies:
+    amdefine ">=0.0.4"
+
+source-map@~0.1.30, source-map@~0.1.31, source-map@~0.1.7:
+  version "0.1.43"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346"
+  dependencies:
+    amdefine ">=0.0.4"
+
+source-map@~0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.3.0.tgz#8586fb9a5a005e5b501e21cd18b6f21b457ad1f9"
+  dependencies:
+    amdefine ">=0.0.4"
+
+source-map@~0.4.0, source-map@~0.4.2:
+  version "0.4.4"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
+  dependencies:
+    amdefine ">=0.0.4"
+
+source-map@~0.5.1:
+  version "0.5.7"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+
+split@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9"
+  dependencies:
+    through "2"
+
+split@~0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/split/-/split-0.1.2.tgz#f0710744c453d551fc7143ead983da6014e336cc"
+  dependencies:
+    through "1"
+
+sprintf-js@~1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+
+stream-browserify@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"
+  dependencies:
+    inherits "~2.0.1"
+    readable-stream "^2.0.2"
+
+stream-browserify@~0.1.0:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-0.1.3.tgz#95cf1b369772e27adaf46352265152689c6c4be9"
+  dependencies:
+    inherits "~2.0.1"
+    process "~0.5.1"
+
+stream-combiner2@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.0.2.tgz#ba72a6b50cbfabfa950fc8bc87604bd01eb60671"
+  dependencies:
+    duplexer2 "~0.0.2"
+    through2 "~0.5.1"
+
+stream-combiner@~0.0.2:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14"
+  dependencies:
+    duplexer "~0.1.1"
+
+stream-combiner@~0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.1.0.tgz#0dc389a3c203f8f4d56368f95dde52eb9269b5be"
+  dependencies:
+    duplexer "~0.1.1"
+    through "~2.3.4"
+
+stream-http@^1.2.0:
+  version "1.7.1"
+  resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-1.7.1.tgz#d3d2a6e14c36a38b9dafb199aee7bbc570519978"
+  dependencies:
+    builtin-status-codes "^1.0.0"
+    foreach "^2.0.5"
+    indexof "0.0.1"
+    inherits "^2.0.1"
+    object-keys "^1.0.4"
+    xtend "^4.0.0"
+
+stream-splicer@^1.1.0:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-1.3.2.tgz#3c0441be15b9bf4e226275e6dc83964745546661"
+  dependencies:
+    indexof "0.0.1"
+    inherits "^2.0.1"
+    isarray "~0.0.1"
+    readable-stream "^1.1.13-1"
+    readable-wrap "^1.0.0"
+    through2 "^1.0.0"
+
+string.prototype.trim@^1.1.1:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea"
+  dependencies:
+    define-properties "^1.1.2"
+    es-abstract "^1.5.0"
+    function-bind "^1.0.2"
+
+string_decoder@~0.0.0:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.0.1.tgz#f5472d0a8d1650ec823752d24e6fd627b39bf141"
+
+string_decoder@~0.10.0, string_decoder@~0.10.x:
+  version "0.10.31"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+
+string_decoder@~1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab"
+  dependencies:
+    safe-buffer "~5.1.0"
+
+strip-ansi@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+  dependencies:
+    ansi-regex "^2.0.0"
+
+subarg@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/subarg/-/subarg-0.0.1.tgz#3d56b07dacfbc45bbb63f7672b43b63e46368e3a"
+  dependencies:
+    minimist "~0.0.7"
+
+subarg@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2"
+  dependencies:
+    minimist "^1.1.0"
+
+supports-color@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+
+syntax-error@^1.1.1:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.4.0.tgz#2d9d4ff5c064acb711594a3e3b95054ad51d907c"
+  dependencies:
+    acorn-node "^1.2.0"
+
+syntax-error@~1.1.0:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.1.6.tgz#b4549706d386cc1c1dc7c2423f18579b6cade710"
+  dependencies:
+    acorn "^2.7.0"
+
+tap-finished@~0.0.0:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/tap-finished/-/tap-finished-0.0.1.tgz#08b5b543fdc04830290c6c561279552e71c4bd67"
+  dependencies:
+    tap-parser "~0.2.0"
+    through "~2.3.4"
+
+tap-parser@~0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/tap-parser/-/tap-parser-0.2.1.tgz#8e1e823f2114ee21d032e2f31e4fb642a296f50b"
+  dependencies:
+    split "~0.1.2"
+
+tape@4.2.1:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/tape/-/tape-4.2.1.tgz#1a0ed63cc86bfaa84ebb3bb311f09d8520416216"
+  dependencies:
+    deep-equal "~1.0.0"
+    defined "~1.0.0"
+    function-bind "~1.0.2"
+    glob "~5.0.3"
+    has "~1.0.1"
+    inherits "~2.0.1"
+    object-inspect "~1.0.0"
+    resumer "~0.0.0"
+    string.prototype.trim "^1.1.1"
+    through "~2.3.4"
+
+tape@~1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/tape/-/tape-1.0.4.tgz#e2e8e5c6dd3f00fdc2a5e4514f62fc221e59f9c4"
+  dependencies:
+    deep-equal "~0.0.0"
+    defined "~0.0.0"
+    jsonify "~0.0.0"
+    through "~2.3.4"
+
+testling@1.7.1:
+  version "1.7.1"
+  resolved "https://registry.yarnpkg.com/testling/-/testling-1.7.1.tgz#bfcfa877c8b15dd28d920692c03d8d64ca47874e"
+  dependencies:
+    bouncy "~3.2.0"
+    browser-launcher "~0.3.2"
+    browserify "3.x.x"
+    concat-stream "~1.0.0"
+    ecstatic "~0.4.5"
+    ent "~0.0.5"
+    glob "~3.2.1"
+    jsonify "~0.0.0"
+    object-inspect "~0.1.3"
+    optimist "~0.5.2"
+    resolve "~0.4.0"
+    shallow-copy "~0.0.0"
+    shell-quote "~1.3.1"
+    tap-finished "~0.0.0"
+    win-spawn "~2.0.0"
+    xhr-write-stream "~0.1.2"
+
+through2@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/through2/-/through2-1.1.1.tgz#0847cbc4449f3405574dbdccd9bb841b83ac3545"
+  dependencies:
+    readable-stream ">=1.1.13-1 <1.2.0-0"
+    xtend ">=4.0.0 <4.1.0-0"
+
+through2@~0.4.1:
+  version "0.4.2"
+  resolved "https://registry.yarnpkg.com/through2/-/through2-0.4.2.tgz#dbf5866031151ec8352bb6c4db64a2292a840b9b"
+  dependencies:
+    readable-stream "~1.0.17"
+    xtend "~2.1.1"
+
+through2@~0.5.1:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/through2/-/through2-0.5.1.tgz#dfdd012eb9c700e2323fd334f38ac622ab372da7"
+  dependencies:
+    readable-stream "~1.0.17"
+    xtend "~3.0.0"
+
+through@1:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/through/-/through-1.1.2.tgz#344a5425a3773314ca7e0eb6512fbafaf76c0bfe"
+
+through@2, "through@>=2.2.7 <3", through@~2.3.4:
+  version "2.3.8"
+  resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+
+through@~2.2.7:
+  version "2.2.7"
+  resolved "https://registry.yarnpkg.com/through/-/through-2.2.7.tgz#6e8e21200191d4eb6a99f6f010df46aa1c6eb2bd"
+
+timers-browserify@^1.0.1:
+  version "1.4.2"
+  resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d"
+  dependencies:
+    process "~0.11.0"
+
+timers-browserify@~1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.0.3.tgz#ffba70c9c12eed916fd67318e629ac6f32295551"
+  dependencies:
+    process "~0.5.1"
+
+to-utf8@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/to-utf8/-/to-utf8-0.0.1.tgz#d17aea72ff2fba39b9e43601be7b3ff72e089852"
+
+tty-browserify@~0.0.0:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811"
+
+typedarray@~0.0.5:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+
+uglify-js@2.5.0:
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.5.0.tgz#4ab5d65a4730ecb7a4fb62d3f499e2054d98fba1"
+  dependencies:
+    async "~0.2.6"
+    source-map "~0.5.1"
+    uglify-to-browserify "~1.0.0"
+    yargs "~3.5.4"
+
+uglify-js@~2.2:
+  version "2.2.5"
+  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.2.5.tgz#a6e02a70d839792b9780488b7b8b184c095c99c7"
+  dependencies:
+    optimist "~0.3.5"
+    source-map "~0.1.7"
+
+uglify-js@~2.4.0:
+  version "2.4.24"
+  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.4.24.tgz#fad5755c1e1577658bb06ff9ab6e548c95bebd6e"
+  dependencies:
+    async "~0.2.6"
+    source-map "0.1.34"
+    uglify-to-browserify "~1.0.0"
+    yargs "~3.5.4"
+
+uglify-to-browserify@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
+
+umd@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.1.tgz#8ae556e11011f63c2596708a8837259f01b3d60e"
+
+umd@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/umd/-/umd-2.0.0.tgz#749683b0d514728ae0e1b6195f5774afc0ad4f8f"
+  dependencies:
+    rfile "~1.0.0"
+    ruglify "~1.0.0"
+    through "~2.3.4"
+    uglify-js "~2.4.0"
+
+url@~0.10.1:
+  version "0.10.3"
+  resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64"
+  dependencies:
+    punycode "1.3.2"
+    querystring "0.2.0"
+
+util-deprecate@~1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+
+util@0.10.3, util@~0.10.1:
+  version "0.10.3"
+  resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
+  dependencies:
+    inherits "2.0.1"
+
+vm-browserify@~0.0.1:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
+  dependencies:
+    indexof "0.0.1"
+
+win-spawn@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/win-spawn/-/win-spawn-2.0.0.tgz#397a29130ec98d0aa0bc86baa4621393effd0b07"
+
+window-size@0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
+
+wordwrap@0.0.2:
+  version "0.0.2"
+  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
+
+wordwrap@~0.0.2:
+  version "0.0.3"
+  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
+
+wrappy@1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+
+xhr-write-stream@~0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/xhr-write-stream/-/xhr-write-stream-0.1.2.tgz#e357848e0d039b411fdd5b3bf81be47ee5ce26aa"
+  dependencies:
+    concat-stream "~0.1.0"
+    ordered-emitter "~0.1.0"
+
+"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
+
+xtend@^3.0.0, xtend@~3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a"
+
+xtend@~2.1.1:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b"
+  dependencies:
+    object-keys "~0.4.0"
+
+yargs@~3.5.4:
+  version "3.5.4"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.5.4.tgz#d8aff8f665e94c34bd259bdebd1bfaf0ddd35361"
+  dependencies:
+    camelcase "^1.0.2"
+    decamelize "^1.0.0"
+    window-size "0.1.0"
+    wordwrap "0.0.2"
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..a22d4b0
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,51 @@
+{
+  "name": "purchase-let",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "dependencies": {
+        "clipboard": "^2.0.11",
+        "dayjs": "^1.11.10"
+      }
+    },
+    "node_modules/clipboard": {
+      "version": "2.0.11",
+      "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz",
+      "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==",
+      "dependencies": {
+        "good-listener": "^1.2.2",
+        "select": "^1.1.2",
+        "tiny-emitter": "^2.0.0"
+      }
+    },
+    "node_modules/dayjs": {
+      "version": "1.11.10",
+      "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz",
+      "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ=="
+    },
+    "node_modules/delegate": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
+      "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw=="
+    },
+    "node_modules/good-listener": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz",
+      "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==",
+      "dependencies": {
+        "delegate": "^3.1.2"
+      }
+    },
+    "node_modules/select": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz",
+      "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA=="
+    },
+    "node_modules/tiny-emitter": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
+      "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="
+    }
+  }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..39d10fb
--- /dev/null
+++ b/package.json
@@ -0,0 +1,6 @@
+{
+  "dependencies": {
+    "clipboard": "^2.0.11",
+    "dayjs": "^1.11.10"
+  }
+}
diff --git a/pages.json b/pages.json
new file mode 100644
index 0000000..cb5d847
--- /dev/null
+++ b/pages.json
@@ -0,0 +1,82 @@
+{
+  "easycom": {
+  		"autoscan": true,
+  		// 注意一定要放在custom里,否则无效,https://ask.dcloud.net.cn/question/131175
+  		"custom": {
+  			"^u--(.*)": "@/uni_modules/uview-plus/components/u-$1/u-$1.vue",
+  			"^up-(.*)": "@/uni_modules/uview-plus/components/u-$1/u-$1.vue",
+  	    "^u-([^-].*)": "@/uni_modules/uview-plus/components/u-$1/u-$1.vue"
+  		}
+  	},
+  "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
+    {
+      "path": "pages/index/index",
+      "style": {
+        "navigationBarTitleText": "购物",
+        "disableScroll": true ,
+        "navigationStyle": "custom"
+      }
+    },
+    {
+      "path": "pages/login/login",
+      "style": {
+        "navigationBarTitleText": "登录",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/cart/cart",
+      "style": {
+        "navigationBarTitleText": "购物车",
+        "enablePullDownRefresh": false,
+        "navigationStyle": "custom"
+      }
+    },
+    {
+      "path": "pages/my/my",
+      "style": {
+        "navigationBarTitleText": "个人中心",
+        "enablePullDownRefresh": false,
+        "navigationStyle": "custom"
+      }
+    },
+    {
+      "path": "pages/order/order",
+      "style": {
+        "navigationBarTitleText": "订单",
+        "enablePullDownRefresh": false
+      }
+    }
+  ],
+  "globalStyle": {
+    "navigationBarTextStyle": "black",
+    "navigationBarTitleText": "购物",
+    "navigationBarBackgroundColor": "#F8F8F8",
+    "backgroundColor": "#F8F8F8"
+  },
+  "tabBar": {
+    "color": "#999999",
+    "selectedColor": "#2b9939",
+    "borderStyle": "white",
+    "backgroundColor": "#FFFFFF",
+    // "iconWidth": "40px",
+    "list": [{
+        "pagePath": "pages/index/index",
+        "text": "首页"
+        // "iconPath": "static/main/index/sy.png",
+        // "selectedIconPath": "static/main/index/sydj.png"
+      },
+      {
+        "pagePath": "pages/cart/cart",
+        "text": "购物车"
+      },
+
+      {
+        "pagePath": "pages/my/my",
+        "text": "我的"
+      }
+
+    ]
+  },
+  "uniIdRouter": {}
+}
\ No newline at end of file
diff --git a/pages/cart/cart.vue b/pages/cart/cart.vue
new file mode 100644
index 0000000..2bae292
--- /dev/null
+++ b/pages/cart/cart.vue
@@ -0,0 +1,200 @@
+<template>
+  <view>
+    <up-navbar placeholder>
+      <template #left>
+        <view style="display: flex;">
+          <view class="tabs" :class="{'tabs-active': tabsActive==index}" v-for="(item, index) in list"
+            @click="changeTab(index)">
+            {{item}}
+          </view>
+        </view>
+      </template>
+    </up-navbar>
+    
+    <swiper class="swiper-box" :current="swiperCurrent" @animationfinish="animationfinish">
+      <swiper-item class="swiper-item">
+        <scroll-view scroll-y style="height: 100%;width: 100%;">
+          <view class="page-box1">
+            <view class="total">
+              <view>共计<text style="color: #20B128;">3</text>件</view>
+              <view v-if="true">管理</view>
+              <view v-else>完成</view>
+            </view>
+            <view class="list">
+              <view class="shop-item" v-for="(item, index) in 20" :key="index">
+                <view class="shop-check">
+                  <image v-if="index%3==0" src="@/static/icon/n-check.png"></image>
+                  <image v-else src="@/static/icon/check.png"></image>
+                </view>
+                <image class="shop-img" src="https://cdn.uviewui.com/uview/album/1.jpg"></image>
+                <view class="shop-content">
+                  <view class="title">
+                    <view class="name u-line-2">好吃的瓜果</view>
+                    <view class="tip u-line-1">香味辛辣|葱香味浓|调味增香香味辛辣|葱香味浓|调味增香</view>
+                  </view>
+                  <view class="price-btn">
+                    <view class="price">¥12.00</view>
+                    <view class="btn">
+                      <u--icon name="minus-circle-fill" size="20" color="#20b128"></u--icon>
+                      <view class="num">{{1}}</view>
+                      <u--icon name="plus-circle-fill" size="20" color="#20b128"></u--icon>
+                    </view>
+                  </view>
+                </view>
+              </view>
+            </view>
+            <view style="width: 100%;height: 200rpx;"></view>
+          </view>
+        </scroll-view>
+      </swiper-item>
+    </swiper>
+    
+    <view class="cart-btn">
+      
+    </view>
+  </view>
+</template>
+
+<script setup>
+  import { ref } from 'vue';
+
+  // 创建响应式数据  
+  const list = ref(['购物车', '常买', '收藏']);
+  const tabsActive = ref(0)
+  // 定义方法  
+  const changeTab = (e) => {
+    tabsActive.value = e;
+  }
+
+  const swiperCurrent = ref(0);
+  const animationfinish = ({ detail: { current } }) => {
+    swiperCurrent.value = current;
+    tabsActive.value = current;
+  }
+</script>
+
+<style lang="scss">
+  .tabs {
+    color: #444444;
+    font-size: 32rpx;
+    margin-right: 30rpx;
+  }
+
+  .tabs-active {
+    color: #20B128;
+    font-size: 34rpx;
+    transition: 300ms;
+  }
+
+  .swiper-box {
+    flex: 1;
+    height: calc(100vh - var(--window-top) - var(--window-bottom));
+    /* #ifdef H5 */
+    height: calc(100vh - 96px);
+    /* #endif */
+    width: 100%;
+    
+    .swiper-item {
+      height: 100%;
+    }
+  }
+
+  .page-box1{
+    position: relative;
+    .total{
+      padding: 0 20rpx;
+      display: flex;
+      justify-content: space-between;
+      position: fixed;
+      top: var(--window-top);
+      left: 0;
+      right: 0;
+      background-color: #eee;
+      z-index: 100;
+      height: 60rpx;
+      line-height: 60rpx;
+      font-size: 26rpx;
+      color: #444;
+    }
+    .list{
+      margin: 20rpx;
+      margin-top: 80rpx;
+      border-radius: 20rpx;
+      overflow: hidden;
+      
+      .shop-item {
+        padding: 20rpx;
+        border-bottom: 1rpx solid #eee;
+        background-color: #fff;
+        display: flex;
+        
+        .shop-check{
+          width: 60rpx;
+          height: 160rpx;
+          display: flex;
+          align-items: center;
+          image{
+            width: 40rpx;
+            height: 40rpx;
+          }
+        }
+      
+        .shop-img {
+          height: 160rpx;
+          width: 160rpx;
+          margin-right: 20rpx;
+          border-radius: 14rpx;
+        }
+      
+        .shop-content {
+          width: 430rpx;
+          display: flex;
+          flex-direction: column;
+          justify-content: space-between;
+      
+          .title {
+            .name {
+              font-size: 28rpx;
+            }
+      
+            .tip {
+              color: #999;
+              font-size: 24rpx;
+              margin: 12rpx 0;
+            }
+          }
+      
+          .price {
+            font-size: 30rpx;
+            font-weight: bold;
+            color: #F55726;
+          }
+      
+          .price-btn {
+            display: flex;
+            justify-content: space-between;
+      
+            .btn {
+              display: flex;
+              align-items: center;
+      
+              .num {
+                width: 60rpx;
+                text-align: center;
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  
+  .cart-btn{
+    // width: 100%;
+    // height: 50px;
+    // background-color: pink;
+    // position: fixed;
+    // left: 0;
+    // bottom: var(--window-bottom);
+  }
+</style>
\ No newline at end of file
diff --git a/pages/index/index.vue b/pages/index/index.vue
new file mode 100644
index 0000000..5562529
--- /dev/null
+++ b/pages/index/index.vue
@@ -0,0 +1,440 @@
+<template>
+  <view class="content">
+    <up-navbar placeholder style="z-index: 10080;">
+      <!-- #ifdef MP-WEIXIN -->
+      <template #left>
+        <view style="width: 540rpx;"><up-search placeholder="请输入商品" v-model="keyword" :showAction="false"></up-search>
+        </view>
+      </template>
+      <!-- #endif -->
+      <!-- #ifndef MP-WEIXIN -->
+      <template #left>
+        <view></view>
+      </template>
+      <template #center>
+        <view style="width: 700rpx;"><up-search placeholder="请输入商品" v-model="keyword" :showAction="false"></up-search>
+        </view>
+      </template>
+      <!-- #endif -->
+    </up-navbar>
+    <view style="position: relative;overflow: hidden;">
+      <scroll-view class="head-view" scroll-x>
+        <view class="list">
+          <view class="item" :class="{'item-active': topActive==index}" v-for="(item, index) in 10" :key="index">
+            <image class="c-img" src="https://cdn.uviewui.com/uview/album/1.jpg"></image>
+            <view class="c-text u-line-1">惠农生活{{item}}</view>
+          </view>
+          <view class="item" style="width: 80rpx;height: 20rpx;">
+          </view>
+        </view>
+      </scroll-view>
+      <view class="r-btn" @click="show=1">
+        <view>全</view>
+        <view>部</view>
+        <up-icon name="list"></up-icon>
+      </view>
+    </view>
+    <viewPopup nav v-if="show===1" @close="show=0">
+      <view class="cateOne">
+        <view class="head-title">全部分类</view>
+        <scroll-view scroll-y style="height: 60vh;">
+          <view class="list">
+            <view class="item" :class="{'item-active': topActive==index}" v-for="(item, index) in 55" :key="index">
+              <image class="c-img" src="https://cdn.uviewui.com/uview/album/1.jpg"></image>
+              <view class="c-text u-line-1">惠农生活{{item}}</view>
+            </view>
+          </view>
+        </scroll-view>
+      </view>
+    </viewPopup>
+    <view class="scroll-box">
+      <scroll-view class="left" scroll-y>
+        <view class="item u-line-1" :class="{'item-active': leftActive==index}" v-for="(item, index) in 20"
+          :key="index">惠农生活{{item}}</view>
+        <view style="width: 100%;height: 200rpx;"></view>
+      </scroll-view>
+      <view class="right">
+        <view class="classify">
+          <scroll-view style="height: 90rpx;" scroll-x>
+            <view class="classify-list">
+              <view class="classify-list-item u-line-1" :class="{'item-active': rightActive==index}"
+                v-for="(item, index) in 6" :key="index">
+                牛肉
+              </view>
+              <view style="width: 70rpx;flex-shrink: 0;"></view>
+            </view>
+          </scroll-view>
+          <view class="done" @click="show=2">
+            <up-icon name="arrow-down"></up-icon>
+          </view>
+          <view class="order-by">
+            <view class="item">综合</view>
+            <view class="item">价格</view>
+            <view class="item">销量</view>
+          </view>
+        </view>
+        <viewPopup v-if="show===2" @close="show=0">
+          <view class="cateOne">
+            <scroll-view scroll-y style="height: 230rpx;">
+              <view class="classify-list">
+                <view class="classify-list-item u-line-1" :class="{'item-active': rightActive==index}"
+                  v-for="(item, index) in 6" :key="index">
+                  牛肉
+                </view>
+              </view>
+            </scroll-view>
+          </view>
+        </viewPopup>
+        <scroll-view class="list" scroll-y>
+          <view class="shop-item" v-for="(item, index) in 20" :key="index">
+            <image class="shop-img" src="https://cdn.uviewui.com/uview/album/1.jpg"></image>
+            <view class="shop-content">
+              <view class="title">
+                <view class="name u-line-2">好吃的瓜果{{item}}</view>
+                <view class="tip u-line-1">香味辛辣|葱香味浓|调味增香香味辛辣|葱香味浓|调味增香</view>
+              </view>
+              <view class="price-btn">
+                <view class="price">¥12.00</view>
+                <view class="btn">
+                  <u--icon name="minus-circle-fill" size="20" color="#20b128"></u--icon>
+                  <view class="num">{{1}}</view>
+                  <u--icon name="plus-circle-fill" size="20" color="#20b128"></u--icon>
+                </view>
+              </view>
+            </view>
+          </view>
+          <view style="width: 100%;height: 200rpx;"></view>
+        </scroll-view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script setup>
+  import { ref } from "vue"
+  import viewPopup from "@/components/viewPopup/index.vue"
+
+  const topActive = ref(0);
+  const leftActive = ref(2);
+  const rightActive = ref(1);
+  const show = ref(0);
+  const keyword = ref('')
+</script>
+
+<style lang="scss">
+  .content {
+    background-color: #fff;
+  }
+
+  .head-view {
+    background-color: #fff;
+    height: 180rpx;
+    width: 750rpx;
+
+    .list {
+      height: 100%;
+      display: flex;
+      align-items: center;
+      padding: 0 20rpx;
+      font-size: 22rpx;
+
+      .item {
+        width: 120rpx;
+        flex-shrink: 0;
+        margin-right: 20rpx;
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+
+        .c-img {
+          height: 100rpx;
+          width: 100rpx;
+          flex-shrink: 0;
+          border-radius: 50%;
+          border: 2px solid transparent;
+        }
+
+        .c-text {
+          width: 100%;
+          text-align: center;
+          box-sizing: border-box;
+          padding: 2rpx 4rpx 3rpx 4rpx;
+          border-radius: 50rpx;
+          margin-top: 5rpx;
+        }
+      }
+
+      .item-active {
+        .c-img {
+          border: 2px solid #20b128;
+        }
+
+        .c-text {
+          background-color: #20b128;
+          color: #fff;
+        }
+      }
+    }
+  }
+
+  .r-btn {
+    position: absolute;
+    right: 0;
+    top: 0;
+    height: 100%;
+    width: 60rpx;
+    font-size: 24rpx;
+    background-color: #fff;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+    box-shadow: -10rpx 0 60rpx 1rpx rgba(0, 0, 0, 0.3);
+  }
+
+  .cateOne {
+    background-color: #fff;
+
+    .head-title {
+      color: #666666;
+      font-size: 30rpx;
+      height: 80rpx;
+      line-height: 80rpx;
+      padding-left: 30rpx;
+    }
+
+    .list {
+      padding: 20rpx 0;
+      font-size: 22rpx;
+      display: grid;
+      grid-template-columns: auto auto auto auto auto;
+      justify-content: center;
+      grid-gap: 20rpx;
+
+      .item {
+        width: 120rpx;
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+
+        .c-img {
+          height: 100rpx;
+          width: 100rpx;
+          flex-shrink: 0;
+          border-radius: 50%;
+          border: 2px solid transparent;
+        }
+
+        .c-text {
+          width: 100%;
+          text-align: center;
+          box-sizing: border-box;
+          padding: 2rpx 4rpx 3rpx 4rpx;
+          border-radius: 50rpx;
+          margin-top: 5rpx;
+        }
+      }
+
+      .item-active {
+        .c-img {
+          border: 2px solid #20b128;
+        }
+
+        .c-text {
+          background-color: #20b128;
+          color: #fff;
+        }
+      }
+    }
+
+    .classify-list {
+      padding: 20rpx 0;
+      font-size: 22rpx;
+      display: grid;
+      grid-template-columns: auto auto auto;
+      justify-content: center;
+      grid-gap: 20rpx;
+
+      .classify-list-item {
+        flex-shrink: 0;
+        text-align: center;
+        width: 150rpx;
+        height: 42rpx;
+        line-height: 42rpx;
+        background: #F6F6F6;
+        border-radius: 22rpx 22rpx 22rpx 22rpx;
+        border: 1rpx solid transparent;
+      }
+
+      .item-active {
+        border: 1rpx solid #20b128;
+        color: #20b128;
+        background-color: rgba(#20b128, 0.1);
+      }
+    }
+  }
+
+  .scroll-box {
+    // background-color: red;
+    display: flex;
+
+    .left {
+      height: calc(100vh - var(--window-top) - var(--window-bottom) - 180rpx);
+      /* #ifdef H5 */
+      height: calc(100vh - 96px - 180rpx);
+      /* #endif */
+      width: 170rpx;
+      box-sizing: border-box;
+      background-color: #eee;
+      font-size: 24rpx;
+
+      .item {
+        height: 96rpx;
+        line-height: 96rpx;
+        text-align: center;
+      }
+
+      .item-active {
+        background-color: #fff;
+        position: relative;
+        color: #20b128;
+
+        &::before {
+          content: '';
+          background-color: #20b128;
+          width: 6rpx;
+          height: 48rpx;
+          border-radius: 10rpx;
+          position: absolute;
+          left: 0;
+          top: 50%;
+          transform: translate(0, -50%);
+        }
+      }
+    }
+
+    .right {
+      height: calc(100vh - var(--window-top) - var(--window-bottom) - 180rpx);
+      /* #ifdef H5 */
+      height: calc(100vh - 96px - 180rpx);
+      /* #endif */
+      width: 580rpx;
+      box-sizing: border-box;
+      position: relative;
+      overflow: hidden;
+
+      .classify {
+        height: 150rpx;
+        background-color: #fff;
+        border-bottom: 1rpx solid #eee;
+        position: relative;
+        font-size: 24rpx;
+
+        .classify-list {
+          display: flex;
+          padding: 20rpx;
+
+          .classify-list-item {
+            flex-shrink: 0;
+            text-align: center;
+            width: 108rpx;
+            height: 42rpx;
+            line-height: 42rpx;
+            background: #F6F6F6;
+            border-radius: 22rpx 22rpx 22rpx 22rpx;
+            margin-right: 20rpx;
+            border: 1rpx solid transparent;
+          }
+
+          .item-active {
+            border: 1rpx solid #20b128;
+            color: #20b128;
+            background-color: rgba(#20b128, 0.1);
+          }
+        }
+
+        .done {
+          height: 90rpx;
+          width: 60rpx;
+          position: absolute;
+          top: 0;
+          right: 0;
+          display: flex;
+          justify-content: center;
+          align-items: center;
+          background-color: #fff;
+        }
+
+        .order-by {
+          display: flex;
+          justify-content: flex-end;
+          align-items: center;
+
+          .item {
+            padding-right: 20rpx;
+          }
+        }
+      }
+
+      .list {
+        height: calc(100vh - var(--window-top) - var(--window-bottom) - 180rpx - 150rpx);
+        /* #ifdef H5 */
+        height: calc(100vh - 96px - 180rpx);
+        /* #endif */
+        .shop-item {
+          padding: 20rpx;
+          border-bottom: 1rpx solid #eee;
+          background-color: #fff;
+          display: flex;
+
+          .shop-img {
+            height: 160rpx;
+            width: 160rpx;
+            margin-right: 20rpx;
+            border-radius: 14rpx;
+          }
+
+          .shop-content {
+            width: 380rpx;
+            display: flex;
+            flex-direction: column;
+            justify-content: space-between;
+
+            .title {
+              .name {
+                font-size: 28rpx;
+              }
+
+              .tip {
+                color: #999;
+                font-size: 24rpx;
+                margin: 12rpx 0;
+              }
+            }
+
+            .price {
+              font-size: 30rpx;
+              font-weight: bold;
+              color: #F55726;
+            }
+
+            .price-btn {
+              display: flex;
+              justify-content: space-between;
+
+              .btn {
+                display: flex;
+                align-items: center;
+
+                .num {
+                  width: 60rpx;
+                  text-align: center;
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+</style>
\ No newline at end of file
diff --git a/pages/login/login.vue b/pages/login/login.vue
new file mode 100644
index 0000000..07bba25
--- /dev/null
+++ b/pages/login/login.vue
@@ -0,0 +1,17 @@
+<template>
+	<view>
+		
+	</view>
+</template>
+
+<script setup>
+import useUserStore from "@/store/user.js"
+
+const userStore = useUserStore(); //使用pinia进行状态管理
+
+
+</script>
+
+<style lang="scss">
+  
+</style>
diff --git a/pages/my/my.vue b/pages/my/my.vue
new file mode 100644
index 0000000..01b2221
--- /dev/null
+++ b/pages/my/my.vue
@@ -0,0 +1,75 @@
+<template>
+	<view>
+		<up-navbar :fixed="false" :is-back="false" title="个人中心" :border-bottom="false">
+			<view class="u-flex u-row-right" style="width: 100%;">
+				<view class="camera u-flex u-row-center">
+					<up-icon name="camera-fill" color="#000000" size="48"></up-icon>
+				</view>
+			</view>
+		</up-navbar>
+		<view class="u-flex u-flex-y-center u-flex-around user-box u-p-l-30 u-p-r-20 u-p-b-30">
+			<view class="u-m-r-10">
+				<up-avatar src="https://cdn.uviewui.com/uview/album/1.jpg" size="140"></up-avatar>
+			</view>
+			<view class="u-flex-1">
+				<view class="u-font-18 u-p-b-20">uview plus</view>
+				<view class="u-font-14 u-tips-color">微信号:test</view>
+			</view>
+			<view class="u-m-l-10 u-p-10">
+				<up-icon name="scan" color="#969799" size="28"></up-icon>
+			</view>
+			<view class="u-m-l-10 u-p-10">
+				<up-icon name="arrow-right" color="#969799" size="28"></up-icon>
+			</view>
+		</view>
+		
+		<view class="u-m-t-20">
+			<up-cell-group>
+				<up-cell icon="rmb-circle" title="支付"></up-cell>
+			</up-cell-group>
+		</view>
+		
+		<view class="u-m-t-20">
+			<up-cell-group>
+				<up-cell icon="star" title="收藏"></up-cell>
+				<up-cell icon="photo" title="相册"></up-cell>
+				<up-cell icon="coupon" title="卡券"></up-cell>
+				<up-cell icon="heart" title="关注"></up-cell>
+			</up-cell-group>
+		</view>
+		
+		<view class="u-m-t-20">
+			<up-cell-group>
+				<up-cell icon="setting" title="设置"></up-cell>
+			</up-cell-group>
+		</view>
+	</view>
+</template>
+
+<script setup>
+import { ref } from "vue";
+
+const pic = ref('');
+const show = ref(true)
+</script>
+
+<style lang="scss">
+page{
+	background-color: #ededed;
+}
+
+.camera{
+	width: 54px;
+	height: 44px;
+	
+	&:active{
+		background-color: #ededed;
+	}
+}
+.user-box{
+	background-color: #fff;
+}
+.u-cell-group {
+	background-color: #fff;
+}
+</style>
diff --git a/pages/order/order.vue b/pages/order/order.vue
new file mode 100644
index 0000000..034deaa
--- /dev/null
+++ b/pages/order/order.vue
@@ -0,0 +1,507 @@
+<template>
+	<view>
+		<view class="wrap">
+			<view class="u-tabs-box">
+				<u-tabs activeColor="#f29100" ref="tabs" :list="list" :current="current" @change="change" :is-scroll="false" swiperWidth="750"></u-tabs>
+			</view>
+			<swiper class="swiper-box" :current="swiperCurrent" @transition="transition" @animationfinish="animationfinish">
+				<swiper-item class="swiper-item">
+					<scroll-view scroll-y style="height: 100%;width: 100%;" @scrolltolower="reachBottom">
+						<view class="page-box">
+							<view class="order" v-for="(res, index) in orderList[0]" :key="res.id">
+								<view class="top">
+									<view class="left">
+										<u-icon name="home" :size="30" color="rgb(94,94,94)"></u-icon>
+										<view class="store">{{ res.store }}</view>
+										<u-icon name="arrow-right" color="rgb(203,203,203)" :size="26"></u-icon>
+									</view>
+									<view class="right">{{ res.deal }}</view>
+								</view>
+								<view class="item" v-for="(item, index) in res.goodsList" :key="index">
+									<view class="left"><image :src="item.goodsUrl" mode="aspectFill"></image></view>
+									<view class="content">
+										<view class="title u-line-2">{{ item.title }}</view>
+										<view class="type">{{ item.type }}</view>
+										<view class="delivery-time">发货时间 {{ item.deliveryTime }}</view>
+									</view>
+									<view class="right">
+										<view class="price">
+											¥{{ priceInt(item.price) }}
+											<text class="decimal">.{{ priceDecimal(item.price) }}</text>
+										</view>
+										<view class="number">x{{ item.number }}</view>
+									</view>
+								</view>
+								<view class="total">
+									共{{ totalNum(res.goodsList) }}件商品 合计:
+									<text class="total-price">
+										¥{{ priceInt(totalPrice(res.goodsList)) }}.
+										<text class="decimal">{{ priceDecimal(totalPrice(res.goodsList)) }}</text>
+									</text>
+								</view>
+								<view class="bottom">
+									<view class="more"><u-icon name="more-dot-fill" color="rgb(203,203,203)"></u-icon></view>
+									<view class="logistics btn">查看物流</view>
+									<view class="exchange btn">卖了换钱</view>
+									<view class="evaluate btn">评价</view>
+								</view>
+							</view>
+							<u-loadmore :status="loadStatus[0]" bgColor="#f2f2f2"></u-loadmore>
+						</view>
+					</scroll-view>
+				</swiper-item>
+				<swiper-item class="swiper-item">
+					<scroll-view scroll-y style="height: 100%;width: 100%;" @scrolltolower="reachBottom">
+						<view class="page-box">
+							<view class="order" v-for="(res, index) in  orderList[1]" :key="res.id">
+								<view class="top">
+									<view class="left">
+										<u-icon name="home" :size="30" color="rgb(94,94,94)"></u-icon>
+										<view class="store">{{ res.store }}</view>
+										<u-icon name="arrow-right" color="rgb(203,203,203)" :size="26"></u-icon>
+									</view>
+									<view class="right">{{ res.deal }}</view>
+								</view>
+								<view class="item" v-for="(item, index) in res.goodsList" :key="index">
+									<view class="left"><image :src="item.goodsUrl" mode="aspectFill"></image></view>
+									<view class="content">
+										<view class="title u-line-2">{{ item.title }}</view>
+										<view class="type">{{ item.type }}</view>
+										<view class="delivery-time">发货时间 {{ item.deliveryTime }}</view>
+									</view>
+									<view class="right">
+										<view class="price">
+											¥{{ priceInt(item.price) }}
+											<text class="decimal">.{{ priceDecimal(item.price) }}</text>
+										</view>
+										<view class="number">x{{ item.number }}</view>
+									</view>
+								</view>
+								<view class="total">
+									共{{ totalNum(res.goodsList) }}件商品 合计:
+									<text class="total-price">
+										¥{{ priceInt(totalPrice(res.goodsList)) }}.
+										<text class="decimal">{{ priceDecimal(totalPrice(res.goodsList)) }}</text>
+									</text>
+								</view>
+								<view class="bottom">
+									<view class="more"><u-icon name="more-dot-fill" color="rgb(203,203,203)"></u-icon></view>
+									<view class="logistics btn">查看物流</view>
+									<view class="exchange btn">卖了换钱</view>
+									<view class="evaluate btn">评价</view>
+								</view>
+							</view>
+							<u-loadmore :status="loadStatus[1]" bgColor="#f2f2f2"></u-loadmore>
+						</view>
+					</scroll-view>
+				</swiper-item>
+				<swiper-item class="swiper-item">
+					<scroll-view scroll-y style="height: 100%;width: 100%;">
+						<view class="page-box">
+							<view>
+								<view class="centre">
+									<image src="https://cdn.uviewui.com/uview/template/taobao-order.png" mode=""></image>
+									<view class="explain">
+										您还没有相关的订单
+										<view class="tips">可以去看看有那些想买的</view>
+									</view>
+									<view class="btn">随便逛逛</view>
+								</view>
+							</view>
+						</view>
+					</scroll-view>
+				</swiper-item>
+				<swiper-item class="swiper-item">
+					<scroll-view scroll-y style="height: 100%;width: 100%;" @scrolltolower="reachBottom">
+						<view class="page-box">
+							<view class="order" v-for="(res, index) in  orderList[3]" :key="res.id">
+								<view class="top">
+									<view class="left">
+										<u-icon name="home" :size="30" color="rgb(94,94,94)"></u-icon>
+										<view class="store">{{ res.store }}</view>
+										<u-icon name="arrow-right" color="rgb(203,203,203)" :size="26"></u-icon>
+									</view>
+									<view class="right">{{ res.deal }}</view>
+								</view>
+								<view class="item" v-for="(item, index) in res.goodsList" :key="index">
+									<view class="left"><image :src="item.goodsUrl" mode="aspectFill"></image></view>
+									<view class="content">
+										<view class="title u-line-2">{{ item.title }}</view>
+										<view class="type">{{ item.type }}</view>
+										<view class="delivery-time">发货时间 {{ item.deliveryTime }}</view>
+									</view>
+									<view class="right">
+										<view class="price">
+											¥{{ priceInt(item.price) }}
+											<text class="decimal">.{{ priceDecimal(item.price) }}</text>
+										</view>
+										<view class="number">x{{ item.number }}</view>
+									</view>
+								</view>
+								<view class="total">
+									共{{ totalNum(res.goodsList) }}件商品 合计:
+									<text class="total-price">
+										¥{{ priceInt(totalPrice(res.goodsList)) }}.
+										<text class="decimal">{{ priceDecimal(totalPrice(res.goodsList)) }}</text>
+									</text>
+								</view>
+								<view class="bottom">
+									<view class="more"><u-icon name="more-dot-fill" color="rgb(203,203,203)"></u-icon></view>
+									<view class="logistics btn">查看物流</view>
+									<view class="exchange btn">卖了换钱</view>
+									<view class="evaluate btn">评价</view>
+								</view>
+							</view>
+							<u-loadmore :status="loadStatus[3]" bgColor="#f2f2f2"></u-loadmore>
+						</view>
+					</scroll-view>
+				</swiper-item>
+			</swiper>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			orderList: [[], [], [], []],
+			dataList: [
+				{
+					id: 1,
+					store: '夏日流星限定贩卖',
+					deal: '交易成功',
+					goodsList: [
+						{
+							goodsUrl: '//img13.360buyimg.com/n7/jfs/t1/103005/7/17719/314825/5e8c19faEb7eed50d/5b81ae4b2f7f3bb7.jpg',
+							title: '【冬日限定】现货 原创jk制服女2020冬装新款小清新宽松软糯毛衣外套女开衫短款百搭日系甜美风',
+							type: '灰色;M',
+							deliveryTime: '付款后30天内发货',
+							price: '348.58',
+							number: 2
+						},
+						{
+							goodsUrl: '//img12.360buyimg.com/n7/jfs/t1/102191/19/9072/330688/5e0af7cfE17698872/c91c00d713bf729a.jpg',
+							title: '【葡萄藤】现货 小清新学院风制服格裙百褶裙女短款百搭日系甜美风原创jk制服女2020新款',
+							type: '45cm;S',
+							deliveryTime: '付款后30天内发货',
+							price: '135.00',
+							number: 1
+						}
+					]
+				},
+				{
+					id: 2,
+					store: '江南皮革厂',
+					deal: '交易失败',
+					goodsList: [
+						{
+							goodsUrl: '//img14.360buyimg.com/n7/jfs/t1/60319/15/6105/406802/5d43f68aE9f00db8c/0affb7ac46c345e2.jpg',
+							title: '【冬日限定】现货 原创jk制服女2020冬装新款小清新宽松软糯毛衣外套女开衫短款百搭日系甜美风',
+							type: '粉色;M',
+							deliveryTime: '付款后7天内发货',
+							price: '128.05',
+							number: 1
+						}
+					]
+				},
+				{
+					id: 3,
+					store: '三星旗舰店',
+					deal: '交易失败',
+					goodsList: [
+						{
+							goodsUrl: '//img11.360buyimg.com/n7/jfs/t1/94448/29/2734/524808/5dd4cc16E990dfb6b/59c256f85a8c3757.jpg',
+							title: '三星(SAMSUNG)京品家电 UA65RUF70AJXXZ 65英寸4K超高清 HDR 京东微联 智能语音 教育资源液晶电视机',
+							type: '4K,广色域',
+							deliveryTime: '保质5年',
+							price: '1998',
+							number: 3
+						},
+						{
+							goodsUrl: '//img14.360buyimg.com/n7/jfs/t6007/205/4099529191/294869/ae4e6d4f/595dcf19Ndce3227d.jpg!q90.jpg',
+							title: '美的(Midea)639升 对开门冰箱 19分钟急速净味 一级能效冷藏双开门杀菌智能家用双变频节能 BCD-639WKPZM(E)',
+							type: '容量大,速冻',
+							deliveryTime: '保质5年',
+							price: '2354',
+							number: 1
+						}
+					]
+				},
+				{
+					id: 4,
+					store: '三星旗舰店',
+					deal: '交易失败',
+					goodsList: [
+						{
+							goodsUrl: '//img10.360buyimg.com/n7/jfs/t22300/31/1505958241/171936/9e201a89/5b2b12ffNe6dbb594.jpg!q90.jpg',
+							title: '法国进口红酒 拉菲(LAFITE)传奇波尔多干红葡萄酒750ml*6整箱装',
+							type: '4K,广色域',
+							deliveryTime: '珍藏10年好酒',
+							price: '1543',
+							number: 3
+						},
+						{
+							goodsUrl: '//img10.360buyimg.com/n7/jfs/t1/107598/17/3766/525060/5e143aacE9a94d43c/03573ae60b8bf0ee.jpg',
+							title: '蓝妹(BLUE GIRL)酷爽啤酒 清啤 原装进口啤酒 罐装 500ml*9听 整箱装',
+							type: '一打',
+							deliveryTime: '口感好',
+							price: '120',
+							number: 1
+						}
+					]
+				},
+				{
+					id: 5,
+					store: '三星旗舰店',
+					deal: '交易成功',
+					goodsList: [
+						{
+							goodsUrl: '//img12.360buyimg.com/n7/jfs/t1/52408/35/3554/78293/5d12e9cfEfd118ba1/ba5995e62cbd747f.jpg!q90.jpg',
+							title: '企业微信 中控人脸指纹识别考勤机刷脸机 无线签到异地多店打卡机WX108',
+							type: '识别效率高',
+							deliveryTime: '使用方便',
+							price: '451',
+							number: 9
+						}
+					]
+				}
+			],
+			list: [
+				{
+					name: '待付款'
+				},
+				{
+					name: '待发货'
+				},
+				{
+					name: '待收货'
+				},
+				{
+					name: '待评价',
+					count: 12
+				}
+			],
+			current: 0,
+			swiperCurrent: 0,
+			tabsHeight: 0,
+			dx: 0,
+			loadStatus: ['loadmore','loadmore','loadmore','loadmore'],
+		};
+	},
+	onLoad() {
+		this.getOrderList(0);
+		this.getOrderList(1);
+		this.getOrderList(3);
+	},
+	computed: {
+		// 价格小数
+		priceDecimal() {
+			return val => {
+				if (val !== parseInt(val)) return val.slice(-2);
+				else return '00';
+			};
+		},
+		// 价格整数
+		priceInt() {
+			return val => {
+				if (val !== parseInt(val)) return val.split('.')[0];
+				else return val;
+			};
+		}
+	},
+	methods: {
+		reachBottom() {
+			// 此tab为空数据
+			if(this.current != 2) {
+				this.loadStatus.splice(this.current,1,"loading")
+				setTimeout(() => {
+					this.getOrderList(this.current);
+				}, 1200);
+			}
+		},
+		// 页面数据
+		getOrderList(idx) {
+			for(let i = 0; i < 5; i++) {
+				let index = this.$u.random(0, this.dataList.length - 1);
+				let data = JSON.parse(JSON.stringify(this.dataList[index]));
+				data.id = this.$u.guid();
+				this.orderList[idx].push(data);
+			}
+			this.loadStatus.splice(this.current,1,"loadmore")
+		},
+		// 总价
+		totalPrice(item) {
+			let price = 0;
+			item.map(val => {
+				price += parseFloat(val.price);
+			});
+			return price.toFixed(2);
+		},
+		// 总件数
+		totalNum(item) {
+			let num = 0;
+			item.map(val => {
+				num += val.number;
+			});
+			return num;
+		},
+		// tab栏切换
+		change(e) {
+			console.log(e)
+			this.swiperCurrent = e.index;
+			this.getOrderList(e.index);
+		},
+		transition({ detail: { dx } }) {
+			// this.$refs.tabs.setDx(dx);
+		},
+		animationfinish({ detail: { current } }) {
+			this.swiperCurrent = current;
+			this.current = current;
+		}
+	}
+};
+</script>
+
+<style>
+/* #ifndef H5 */
+page {
+	height: 100%;
+	background-color: #f2f2f2;
+}
+/* #endif */
+</style>
+
+<style lang="scss" scoped>
+.order {
+	width: 710rpx;
+	background-color: #ffffff;
+	margin: 20rpx auto;
+	border-radius: 20rpx;
+	box-sizing: border-box;
+	padding: 20rpx;
+	font-size: 28rpx;
+	.top {
+		display: flex;
+		justify-content: space-between;
+		.left {
+			display: flex;
+			align-items: center;
+			.store {
+				margin: 0 10rpx;
+				font-size: 32rpx;
+				font-weight: bold;
+			}
+		}
+		.right {
+			color: $u-warning-dark;
+		}
+	}
+	.item {
+		display: flex;
+		margin: 20rpx 0 0;
+		.left {
+			margin-right: 20rpx;
+			image {
+				width: 200rpx;
+				height: 200rpx;
+				border-radius: 10rpx;
+			}
+		}
+		.content {
+			.title {
+				font-size: 28rpx;
+				line-height: 50rpx;
+			}
+			.type {
+				margin: 10rpx 0;
+				font-size: 24rpx;
+				color: $u-tips-color;
+			}
+			.delivery-time {
+				color: #e5d001;
+				font-size: 24rpx;
+			}
+		}
+		.right {
+			margin-left: 10rpx;
+			padding-top: 20rpx;
+			text-align: right;
+			.decimal {
+				font-size: 24rpx;
+				margin-top: 4rpx;
+			}
+			.number {
+				color: $u-tips-color;
+				font-size: 24rpx;
+			}
+		}
+	}
+	.total {
+		margin-top: 20rpx;
+		text-align: right;
+		font-size: 24rpx;
+		.total-price {
+			font-size: 32rpx;
+		}
+	}
+	.bottom {
+		display: flex;
+		margin-top: 40rpx;
+		padding: 0 10rpx;
+		justify-content: space-between;
+		align-items: center;
+		.btn {
+			line-height: 52rpx;
+			width: 160rpx;
+			border-radius: 26rpx;
+			border: 2rpx solid $u-border-color;
+			font-size: 26rpx;
+			text-align: center;
+			color: $u-info-dark;
+		}
+		.evaluate {
+			color: $u-warning-dark;
+			border-color: $u-warning-dark;
+		}
+	}
+}
+.centre {
+	text-align: center;
+	margin: 200rpx auto;
+	font-size: 32rpx;
+	image {
+		width: 164rpx;
+		height: 164rpx;
+		border-radius: 50%;
+		margin-bottom: 20rpx;
+	}
+	.tips {
+		font-size: 24rpx;
+		color: #999999;
+		margin-top: 20rpx;
+	}
+	.btn {
+		margin: 80rpx auto;
+		width: 200rpx;
+		border-radius: 32rpx;
+		line-height: 64rpx;
+		color: #ffffff;
+		font-size: 26rpx;
+		background: linear-gradient(270deg, rgba(249, 116, 90, 1) 0%, rgba(255, 158, 1, 1) 100%);
+	}
+}
+.wrap {
+	display: flex;
+	flex-direction: column;
+	height: calc(100vh - var(--window-top));
+	width: 100%;
+}
+.swiper-box {
+	flex: 1;
+  height: calc(100vh - var(--window-top));
+}
+.swiper-item {
+	height: 100%;
+}
+</style>
\ No newline at end of file
diff --git a/static/icon/check.png b/static/icon/check.png
new file mode 100644
index 0000000..41ae5cd
Binary files /dev/null and b/static/icon/check.png differ
diff --git a/static/icon/n-check.png b/static/icon/n-check.png
new file mode 100644
index 0000000..1e9f45a
Binary files /dev/null and b/static/icon/n-check.png differ
diff --git a/static/logo.png b/static/logo.png
new file mode 100644
index 0000000..b5771e2
Binary files /dev/null and b/static/logo.png differ
diff --git a/store/user.js b/store/user.js
new file mode 100644
index 0000000..981d167
--- /dev/null
+++ b/store/user.js
@@ -0,0 +1,25 @@
+// 导入定义仓库的方法
+import { defineStore } from 'pinia';
+// 导入响应式和计算
+import { ref } from 'vue';
+
+const useUserStore = defineStore("user", () => {
+  
+  // 定义一个状态用户信息
+  const userInfo = ref(uni.getStorageSync('userInfo')||{});
+  // 定义一个设置状态的方法
+  const setUserInfo = (data) => {
+    userInfo.value = data;
+    uni.setStorageSync('userInfo', data)
+  }
+  
+  const token = ref(uni.getStorageSync('token')||'');
+  const setToken = (data) => {
+    token.value = data;
+    uni.setStorageSync('token', data)
+  }
+  
+  return { userInfo, setToken, token, setToken }
+})
+
+export default useUserStore;
\ No newline at end of file
diff --git a/uni.promisify.adaptor.js b/uni.promisify.adaptor.js
new file mode 100644
index 0000000..47fbce1
--- /dev/null
+++ b/uni.promisify.adaptor.js
@@ -0,0 +1,10 @@
+uni.addInterceptor({
+  returnValue (res) {
+    if (!(!!res && (typeof res === "object" || typeof res === "function") && typeof res.then === "function")) {
+      return res;
+    }
+    return new Promise((resolve, reject) => {
+      res.then((res) => res[0] ? reject(res[0]) : resolve(res[1]));
+    });
+  },
+});
\ No newline at end of file
diff --git a/uni.scss b/uni.scss
new file mode 100644
index 0000000..8f9b068
--- /dev/null
+++ b/uni.scss
@@ -0,0 +1,77 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+
+/* 颜色变量 */
+@import '@/uni_modules/uview-plus/theme.scss';
+
+/* 行为相关颜色 */
+$uni-color-primary: #007aff;
+$uni-color-success: #4cd964;
+$uni-color-warning: #f0ad4e;
+$uni-color-error: #dd524d;
+
+/* 文字基本颜色 */
+$uni-text-color:#333;//基本色
+$uni-text-color-inverse:#fff;//反色
+$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息
+$uni-text-color-placeholder: #808080;
+$uni-text-color-disable:#c0c0c0;
+
+/* 背景颜色 */
+$uni-bg-color:#ffffff;
+$uni-bg-color-grey:#f8f8f8;
+$uni-bg-color-hover:#f1f1f1;//点击状态颜色
+$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色
+
+/* 边框颜色 */
+$uni-border-color:#c8c7cc;
+
+/* 尺寸变量 */
+
+/* 文字尺寸 */
+$uni-font-size-sm:12px;
+$uni-font-size-base:14px;
+$uni-font-size-lg:16px;
+
+/* 图片尺寸 */
+$uni-img-size-sm:20px;
+$uni-img-size-base:26px;
+$uni-img-size-lg:40px;
+
+/* Border Radius */
+$uni-border-radius-sm: 2px;
+$uni-border-radius-base: 3px;
+$uni-border-radius-lg: 6px;
+$uni-border-radius-circle: 50%;
+
+/* 水平间距 */
+$uni-spacing-row-sm: 5px;
+$uni-spacing-row-base: 10px;
+$uni-spacing-row-lg: 15px;
+
+/* 垂直间距 */
+$uni-spacing-col-sm: 4px;
+$uni-spacing-col-base: 8px;
+$uni-spacing-col-lg: 12px;
+
+/* 透明度 */
+$uni-opacity-disabled: 0.3; // 组件禁用态的透明度
+
+/* 文章场景相关 */
+$uni-color-title: #2C405A; // 文章标题颜色
+$uni-font-size-title:20px;
+$uni-color-subtitle: #555555; // 二级标题颜色
+$uni-font-size-subtitle:26px;
+$uni-color-paragraph: #3F536E; // 文章段落颜色
+$uni-font-size-paragraph:15px;
diff --git a/uni_modules/uview-plus/LICENSE b/uni_modules/uview-plus/LICENSE
new file mode 100644
index 0000000..8e39ead
--- /dev/null
+++ b/uni_modules/uview-plus/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 www.uviewui.com
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/uni_modules/uview-plus/README.md b/uni_modules/uview-plus/README.md
new file mode 100644
index 0000000..427a3ee
--- /dev/null
+++ b/uni_modules/uview-plus/README.md
@@ -0,0 +1,64 @@
+<p align="center">
+    <img alt="logo" src="https://uviewui.com/common/logo.png" width="120" height="120" style="margin-bottom: 10px;">
+</p>
+<h3 align="center" style="margin: 30px 0 30px;font-weight: bold;font-size:40px;">uview-plus 3.0</h3>
+<h3 align="center">多平台快速开发的UI框架</h3>
+
+[![stars](https://img.shields.io/github/stars/ijry/uview-plus?style=flat-square&logo=GitHub)](https://github.com/ijry/uview-plus)
+[![forks](https://img.shields.io/github/forks/ijry/uview-plus?style=flat-square&logo=GitHub)](https://github.com/ijry/uview-plus)
+[![issues](https://img.shields.io/github/issues/ijry/uview-plus?style=flat-square&logo=GitHub)](https://github.com/ijry/uview-plus/issues)
+[![release](https://img.shields.io/github/v/release/ijry/uview-plus?style=flat-square)](https://gitee.com/jry/uview-plus/releases)
+[![license](https://img.shields.io/github/license/ijry/uview-plus?style=flat-square)](https://en.wikipedia.org/wiki/MIT_License)
+
+## 说明
+
+uview-plus,是uni-app全面兼容vue3/nvue的uni-app生态框架,全面的组件和便捷的工具会让您信手拈来,如鱼得水。uview-plus是基于uView2.x移植的支持vue3的版本,感谢uView。
+
+## [官方文档:https://uview-plus.jiangruyi.com](https://uview-plus.jiangruyi.com)
+
+
+## 预览
+
+您可以通过**微信**扫码,查看最佳的演示效果。
+<br>
+<br>
+<img src="https://uview-plus.jiangruyi.com/common/h5_qrcode.png" width="220" height="220" >
+
+## 链接
+
+- [官方文档](https://uview-plus.jiangruyi.com)
+- [更新日志](https://uview-plus.jiangruyi.com/components/changelog.html)
+- [升级指南](https://uview-plus.jiangruyi.com/components/changeGuide.html)
+- [关于我们](https://uview-plus.jiangruyi.com/cooperation/about.html)
+
+## 交流反馈
+
+欢迎加入我们的QQ群交流反馈:[点此跳转](https://uview-plus.jiangruyi.com/components/addQQGroup.html)
+
+## 关于PR
+
+> 我们非常乐意接受各位的优质PR,但在此之前我希望您了解uview-plus是一个需要兼容多个平台的(小程序、h5、ios app、android app)包括nvue页面、vue页面。
+> 所以希望在您修复bug并提交之前尽可能的去这些平台测试一下兼容性。最好能携带测试截图以方便审核。非常感谢!
+
+## 安装
+
+#### **uni-app插件市场链接** —— [https://ext.dcloud.net.cn/plugin?name=uview-plus](https://ext.dcloud.net.cn/plugin?name=uview-plus)
+
+请通过[官网安装文档](https://uview-plus.jiangruyi.com/components/install.html)了解更详细的内容
+
+## 快速上手
+
+请通过[快速上手](https://uview-plus.jiangruyi.com/components/quickstart.html)了解更详细的内容
+
+## 使用方法
+配置easycom规则后,自动按需引入,无需`import`组件,直接引用即可。
+
+```html
+<template>
+	<u-button text="按钮"></u-button>
+</template>
+```
+
+## 版权信息
+uview-plus遵循[MIT](https://en.wikipedia.org/wiki/MIT_License)开源协议,意味着您无需支付任何费用,也无需授权,即可将uview-plus应用到您的产品中。
+
diff --git a/uni_modules/uview-plus/changelog.md b/uni_modules/uview-plus/changelog.md
new file mode 100644
index 0000000..77f803f
--- /dev/null
+++ b/uni_modules/uview-plus/changelog.md
@@ -0,0 +1,159 @@
+## 3.2.14(2024-04-24)
+去除pleaseSetTranspileDependencies
+
+http采用useStore
+
+## 3.2.13(2024-04-22)
+修复modal标题样式
+
+优化日期选择器hasInput模式宽度
+
+## 3.2.12(2024-04-22)
+修复color应用
+## 3.2.11(2024-04-18)
+修复import化带来的问题
+## 3.2.10(2024-04-17)
+完善input清空事件App端失效的兼容性
+
+修复日历组件二次打开后当前月份显示不正确
+
+## 3.2.9(2024-04-16)
+组件内uni.$u用法改为import引入
+
+规范化及兼容性增强
+
+## 3.2.8(2024-04-15)
+修复up-tag语法错
+## 3.2.7(2024-04-15)
+修复下拉菜单背景色在支付宝小程序无效
+
+setConfig改为浅拷贝解决无法用import导入代替uni.$u.props设置
+
+## 3.2.6(2024-04-14)
+修复某些情况下滑动单元格默认右侧按钮是展开的问题
+## 3.2.5(2024-04-13)
+调整分段器尺寸及修复窗口大小改变时重新计算尺寸
+
+多个组件支持cursor-pointer增强PC端体验
+
+## 3.2.4(2024-04-12)
+初步支持typescript
+## 3.2.3(2024-04-12)
+fix: 修复square属性在小程序下无效问题
+
+fix:修复lastIndex异常导致的column异常问题
+
+fix: alipayapp picker style
+
+feat(button): 添加用户同意隐私协议事件回调
+
+fix: input switch password
+
+fix: 修复u-code组件keepRuning失效问题
+
+feat: form-item添加labelPosition属性
+
+新增dropdown组件
+
+分段器支持内部current值
+
+优化cell和action-sheet视觉大小
+
+修复tabs文字换行
+
+## 3.2.2(2024-04-11)
+修复换行符问题
+## 3.2.1(2024-04-11)
+修复演示H5二维码
+
+fix: #270 ReadMore 展开阅读更多内容变化兼容
+
+fix: #238Calendar组件maxDate修改为不能小于minDate
+
+checkbox支持独立使用
+
+修复popup中在微信小程序中真机调试滚动失效
+
+## 3.2.0(2024-04-10)
+修复轮播图在nvue显示
+修复疑似u-slider名称被占用导致slider在App下不显示
+解决微信小程序提示 Some selectors are not allowed in component wxss
+示例中u-前缀统一为up-
+增加瀑布流与图片懒加载组件
+fix: #308修复tag组件缺失iconColor参数
+fix: #297使用grid布局解决目前编译为抖音小程序无法开启virtualHost
+## 3.1.52(2024-04-07)
+工具类方法调用import化改造
+新增up-copy复制组件
+## 3.1.51(2024-04-07)
+优化时间选择器自带输入框格式化显示
+防止按钮文字换行
+修复订单列表模板滑动
+增加u-qrcode二维码组件
+## 3.1.49(2024-03-27)
+日期时间组件支持自带输入框
+fix: popup弹窗滚动穿透问题
+fix: 修复小程序numberbox bug
+## 3.1.48(2024-03-18)
+fix:[plugin:uni:pre-css] Unbalanced delimiter found in string
+## 3.1.47(2024-03-18)
+fix: setConfig设置组件默认参数无效问题
+fix: 修复自定义图标无效问题
+feat: 增加u-form-item单独设置规则变量
+fix:#293小程序是自定义导航栏的时候即传了customNavHeight的时候会出现跳转偏移的情况
+
+## 3.1.46(2024-01-29)
+beforeUnmount
+## 3.1.45(2024-01-24)
+fix: #262ext组件为超链接的情况下size属性不生效
+fix: #263最新版本3.1.42中微信小程序u-swipe-action-item报错
+fix: #224最新版本3.1.42中微信小程序u-swipe-action-item报错
+fix: #263支持支付宝小程序
+fix: #261u-input在直接修改v-model的绑定值时,每隔一次会无法出发change事件
+优化折叠面板兼容微信小程序
+## 3.1.42(2024-01-15)
+修复u-number-box默认值0时在小程序不显示值
+优化u-code的timer判断
+优化支付宝小程序下textarea字数统计兼容
+优化u-calendar
+## 3.1.41(2023-11-18)
+#215优化u-cell图标容器间距问题
+## 3.1.40(2023-11-16)
+修复u-slider双向绑定
+## 3.1.39(2023-11-10)
+修复头条小程序不支持env(safe-area-inset-bottom)
+优化#201u-grid 指定列数导致闪烁
+#193IndexList 索引列表 高度错误
+其他优化
+## 3.1.38(2023-10-08)
+修复u-slider
+## 3.1.37(2023-09-13)
+完善emits定义及修复code-input双向数据绑定
+## 3.1.36(2023-08-08)
+修复富文本事件名称大小写
+## 3.1.35(2023-08-02)
+修复编译到支付宝小程序u-form报错
+## 3.1.34(2023-07-27)
+修复App打包uni.$u.mpMixin方式sdk暂时不支持导致报错
+## 3.1.33(2023-07-13)
+修复弹窗进入动画、模板页面样式等
+## 3.1.31(2023-07-11)
+修复dayjs引用
+## 3.0.8(2022-07-12)
+修复u-tag默认宽度撑满容器
+## 3.0.7(2022-07-12)
+修复u-navbar自定义插槽演示示例
+## 3.0.6(2022-07-11)
+修复u-image缺少emits申明
+## 3.0.5(2022-07-11)
+修复u-upload缺少emits申明
+## 3.0.4(2022-07-10)
+修复u-textarea/u-input/u-datetime-picker/u-number-box/u-radio-group/u-switch/u-rate在vue3下数据绑定
+## 3.0.3(2022-07-09)
+启用自建演示二维码
+## 3.0.2(2022-07-09)
+修复dayjs/clipboard等导致打包报错
+## 3.0.1(2022-07-09)
+增加插件市场地址
+## 3.0.0(2022-07-09)
+# uview-plus(vue3)初步发布
diff --git a/uni_modules/uview-plus/components/u--form/u--form.vue b/uni_modules/uview-plus/components/u--form/u--form.vue
new file mode 100644
index 0000000..9279e62
--- /dev/null
+++ b/uni_modules/uview-plus/components/u--form/u--form.vue
@@ -0,0 +1,80 @@
+<template>
+	<uvForm
+		ref="uForm"
+		:model="model"
+		:rules="rules"
+		:errorType="errorType"
+		:borderBottom="borderBottom"
+		:labelPosition="labelPosition"
+		:labelWidth="labelWidth"
+		:labelAlign="labelAlign"
+		:labelStyle="labelStyle"
+		:customStyle="customStyle"
+	>
+		<slot />
+	</uvForm>
+</template>
+
+<script>
+	/**
+	 * 此组件存在的理由是,在nvue下,u-form被uni-app官方占用了,u-form在nvue中相当于form组件
+	 * 所以在nvue下,取名为u--form,内部其实还是u-form.vue,只不过做一层中转
+	 */
+	import uvForm from '../u-form/u-form.vue';
+	import props from '../u-form/props.js';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	export default {
+		// #ifdef MP-WEIXIN
+		name: 'u-form',
+		// #endif
+		// #ifndef MP-WEIXIN
+		name: 'u--form',
+		// #endif
+		mixins: [mpMixin, props, mixin],
+		components: {
+			uvForm
+		},
+		created() {
+			this.children = []
+		},
+		methods: {
+			// 手动设置校验的规则,如果规则中有函数的话,微信小程序中会过滤掉,所以只能手动调用设置规则
+			setRules(rules) {
+				this.$refs.uForm.setRules(rules)
+			},
+			validate() {
+				/**
+				 * 在微信小程序中,通过this.$parent拿到的父组件是u--form,而不是其内嵌的u-form
+				 * 导致在u-form组件中,拿不到对应的children数组,从而校验无效,所以这里每次调用u-form组件中的
+				 * 对应方法的时候,在小程序中都先将u--form的children赋值给u-form中的children
+				 */
+				// #ifdef MP-WEIXIN
+				this.setMpData()
+				// #endif
+				return this.$refs.uForm.validate()
+			},
+			validateField(value, callback) {
+				// #ifdef MP-WEIXIN
+				this.setMpData()
+				// #endif
+				return this.$refs.uForm.validateField(value, callback)
+			},
+			resetFields() {
+				// #ifdef MP-WEIXIN
+				this.setMpData()
+				// #endif
+				return this.$refs.uForm.resetFields()
+			},
+			clearValidate(props) {
+				// #ifdef MP-WEIXIN
+				this.setMpData()
+				// #endif
+				return this.$refs.uForm.clearValidate(props)
+			},
+			setMpData() {
+				this.$refs.uForm.children = this.children
+			}
+		},
+	}
+</script>
diff --git a/uni_modules/uview-plus/components/u--image/u--image.vue b/uni_modules/uview-plus/components/u--image/u--image.vue
new file mode 100644
index 0000000..ba8d6ca
--- /dev/null
+++ b/uni_modules/uview-plus/components/u--image/u--image.vue
@@ -0,0 +1,50 @@
+<template>
+	<uvImage 
+		:src="src"
+		:mode="mode"
+		:width="width"
+		:height="height"
+		:shape="shape"
+		:radius="radius"
+		:lazyLoad="lazyLoad"
+		:showMenuByLongpress="showMenuByLongpress"
+		:loadingIcon="loadingIcon"
+		:errorIcon="errorIcon"
+		:showLoading="showLoading"
+		:showError="showError"
+		:fade="fade"
+		:webp="webp"
+		:duration="duration"
+		:bgColor="bgColor"
+		:customStyle="customStyle"
+		@click="$emit('click')"
+		@error="$emit('error')"
+		@load="$emit('load')"
+	>
+		<template v-slot:loading>
+			<slot name="loading"></slot>
+		</template>
+		<template v-slot:error>
+			<slot name="error"></slot>
+		</template>
+	</uvImage>
+</template>
+
+<script>
+	/**
+	 * 此组件存在的理由是,在nvue下,u-image被uni-app官方占用了,u-image在nvue中相当于image组件
+	 * 所以在nvue下,取名为u--image,内部其实还是u-iamge.vue,只不过做一层中转
+	 */
+	import uvImage from '../u-image/u-image.vue';
+	import props from '../u-image/props.js';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	export default {
+		name: 'u--image',
+		mixins: [mpMixin, props, mixin],
+		components: {
+			uvImage
+		},
+		emits: ['click', 'error', 'load']
+	}
+</script>
\ No newline at end of file
diff --git a/uni_modules/uview-plus/components/u--input/u--input.vue b/uni_modules/uview-plus/components/u--input/u--input.vue
new file mode 100644
index 0000000..6b6f73b
--- /dev/null
+++ b/uni_modules/uview-plus/components/u--input/u--input.vue
@@ -0,0 +1,74 @@
+<template>
+	<uvInput 
+		<!-- #ifdef VUE2 -->
+		:value="value"
+		@input="e => $emit('input', e)"
+		<!-- #endif -->
+		<!-- #ifdef VUE3 -->
+		:modelValue="modelValue"
+		@update:modelValue="e => $emit('update:modelValue', e)"
+		<!-- #endif -->
+		:type="type"
+		:fixed="fixed"
+		:disabled="disabled"
+		:disabledColor="disabledColor"
+		:clearable="clearable"
+		:password="password"
+		:maxlength="maxlength"
+		:placeholder="placeholder"
+		:placeholderClass="placeholderClass"
+		:placeholderStyle="placeholderStyle"
+		:showWordLimit="showWordLimit"
+		:confirmType="confirmType"
+		:confirmHold="confirmHold"
+		:holdKeyboard="holdKeyboard"
+		:focus="focus"
+		:autoBlur="autoBlur"
+		:disableDefaultPadding="disableDefaultPadding"
+		:cursor="cursor"
+		:cursorSpacing="cursorSpacing"
+		:selectionStart="selectionStart"
+		:selectionEnd="selectionEnd"
+		:adjustPosition="adjustPosition"
+		:inputAlign="inputAlign"
+		:fontSize="fontSize"
+		:color="color"
+		:prefixIcon="prefixIcon"
+		:suffixIcon="suffixIcon"
+		:suffixIconStyle="suffixIconStyle"
+		:prefixIconStyle="prefixIconStyle"
+		:border="border"
+		:readonly="readonly"
+		:shape="shape"
+		:customStyle="customStyle"
+		:formatter="formatter"
+		:ignoreCompositionEvent="ignoreCompositionEvent"
+	>
+		<!-- #ifdef MP -->
+		<slot name="prefix"></slot>
+		<slot name="suffix"></slot>
+		<!-- #endif -->
+		<!-- #ifndef MP -->
+		<slot name="prefix" slot="prefix"></slot>
+		<slot name="suffix" slot="suffix"></slot>
+		<!-- #endif -->
+	</uvInput>
+</template>
+
+<script>
+	/**
+	 * 此组件存在的理由是,在nvue下,u-input被uni-app官方占用了,u-input在nvue中相当于input组件
+	 * 所以在nvue下,取名为u--input,内部其实还是u-input.vue,只不过做一层中转
+	 */
+	import uvInput from '../u-input/u-input.vue';
+	import props from '../u-input/props.js';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	export default {
+		name: 'u--input',
+		mixins: [mpMixin, props, mixin],
+		components: {
+			uvInput
+		},
+	}
+</script>
\ No newline at end of file
diff --git a/uni_modules/uview-plus/components/u--text/u--text.vue b/uni_modules/uview-plus/components/u--text/u--text.vue
new file mode 100644
index 0000000..bf40e18
--- /dev/null
+++ b/uni_modules/uview-plus/components/u--text/u--text.vue
@@ -0,0 +1,45 @@
+<template>
+    <uvText
+        :type="type"
+        :show="show"
+        :text="text"
+        :prefixIcon="prefixIcon"
+        :suffixIcon="suffixIcon"
+        :mode="mode"
+        :href="href"
+        :format="format"
+        :call="call"
+        :openType="openType"
+        :bold="bold"
+        :block="block"
+        :lines="lines"
+        :color="color"
+		:decoration="decoration"
+        :size="size"
+        :iconStyle="iconStyle"
+        :margin="margin"
+        :lineHeight="lineHeight"
+        :align="align"
+        :wordWrap="wordWrap"
+        :customStyle="customStyle"
+    ></uvText>
+</template>
+
+<script>
+/**
+ * 此组件存在的理由是,在nvue下,u-text被uni-app官方占用了,u-text在nvue中相当于input组件
+ * 所以在nvue下,取名为u--input,内部其实还是u-text.vue,只不过做一层中转
+ * 不使用v-bind="$attrs",而是分开独立写传参,是因为微信小程序不支持此写法
+ */
+import uvText from "../u-text/u-text.vue";
+import props from "../u-text/props.js";
+import mpMixin from '../../libs/mixin/mpMixin.js'
+import mixin from '../../libs/mixin/mixin.js'
+export default {
+    name: "u--text",
+    mixins: [mpMixin, mixin, props,],
+    components: {
+        uvText,
+    },
+};
+</script>
diff --git a/uni_modules/uview-plus/components/u--textarea/u--textarea.vue b/uni_modules/uview-plus/components/u--textarea/u--textarea.vue
new file mode 100644
index 0000000..096644e
--- /dev/null
+++ b/uni_modules/uview-plus/components/u--textarea/u--textarea.vue
@@ -0,0 +1,47 @@
+<template>
+	<uvTextarea
+		:value="value"
+		:modelValue="modelValue"
+		:placeholder="placeholder"
+		:height="height"
+		:confirmType="confirmType"
+		:disabled="disabled"
+		:count="count"
+		:focus="focus"
+		:autoHeight="autoHeight"
+		:fixed="fixed"
+		:cursorSpacing="cursorSpacing"
+		:cursor="cursor"
+		:showConfirmBar="showConfirmBar"
+		:selectionStart="selectionStart"
+		:selectionEnd="selectionEnd"
+		:adjustPosition="adjustPosition"
+		:disableDefaultPadding="disableDefaultPadding"
+		:holdKeyboard="holdKeyboard"
+		:maxlength="maxlength"
+		:border="border"
+		:customStyle="customStyle"
+		:formatter="formatter"
+		:ignoreCompositionEvent="ignoreCompositionEvent"
+		@input="e => $emit('input', e)"
+		@update:modelValue="e => $emit('update:modelValue', e)"
+	></uvTextarea>
+</template>
+
+<script>
+	/**
+	 * 此组件存在的理由是,在nvue下,u--textarea被uni-app官方占用了,u-textarea在nvue中相当于textarea组件
+	 * 所以在nvue下,取名为u--textarea,内部其实还是u-textarea.vue,只不过做一层中转
+	 */
+	import uvTextarea from '../u-textarea/u-textarea.vue';
+	import props from '../u-textarea/props.js';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	export default {
+		name: 'u--textarea',
+		mixins: [mpMixin, props, mixin],
+		components: {
+			uvTextarea
+		},
+	}
+</script>
diff --git a/uni_modules/uview-plus/components/u-action-sheet/props.js b/uni_modules/uview-plus/components/u-action-sheet/props.js
new file mode 100644
index 0000000..d278dac
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-action-sheet/props.js
@@ -0,0 +1,55 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 操作菜单是否展示 (默认false)
+        show: {
+            type: Boolean,
+            default: () => defProps.actionSheet.show
+        },
+        // 标题
+        title: {
+            type: String,
+            default: () => defProps.actionSheet.title
+        },
+        // 选项上方的描述信息
+        description: {
+            type: String,
+            default: () => defProps.actionSheet.description
+        },
+        // 数据
+        actions: {
+            type: Array,
+            default: () => defProps.actionSheet.actions
+        },
+        // 取消按钮的文字,不为空时显示按钮
+        cancelText: {
+            type: String,
+            default: () => defProps.actionSheet.cancelText
+        },
+        // 点击某个菜单项时是否关闭弹窗
+        closeOnClickAction: {
+            type: Boolean,
+            default: () => defProps.actionSheet.closeOnClickAction
+        },
+        // 处理底部安全区(默认true)
+        safeAreaInsetBottom: {
+            type: Boolean,
+            default: () => defProps.actionSheet.safeAreaInsetBottom
+        },
+        // 小程序的打开方式
+        openType: {
+            type: String,
+            default: () => defProps.actionSheet.openType
+        },
+        // 点击遮罩是否允许关闭 (默认true)
+        closeOnClickOverlay: {
+            type: Boolean,
+            default: () => defProps.actionSheet.closeOnClickOverlay
+        },
+        // 圆角值
+        round: {
+            type: [Boolean, String, Number],
+            default: () => defProps.actionSheet.round
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-action-sheet/u-action-sheet.vue b/uni_modules/uview-plus/components/u-action-sheet/u-action-sheet.vue
new file mode 100644
index 0000000..91c7eb3
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-action-sheet/u-action-sheet.vue
@@ -0,0 +1,281 @@
+
+<template>
+	<u-popup
+	    :show="show"
+	    mode="bottom"
+	    @close="closeHandler"
+	    :safeAreaInsetBottom="safeAreaInsetBottom"
+	    :round="round"
+	>
+		<view class="u-action-sheet">
+			<view
+			    class="u-action-sheet__header"
+			    v-if="title"
+			>
+				<text class="u-action-sheet__header__title u-line-1">{{title}}</text>
+				<view
+				    class="u-action-sheet__header__icon-wrap"
+				    @tap.stop="cancel"
+				>
+					<u-icon
+					    name="close"
+					    size="17"
+					    color="#c8c9cc"
+					    bold
+					></u-icon>
+				</view>
+			</view>
+			<text
+			    class="u-action-sheet__description"
+				:style="[{
+					marginTop: `${title && description ? 0 : '18px'}`
+				}]"
+			    v-if="description"
+			>{{description}}</text>
+			<slot>
+				<u-line v-if="description"></u-line>
+				<view class="u-action-sheet__item-wrap">
+					<view :key="index" v-for="(item, index) in actions">
+						<!-- #ifdef MP -->
+						<button
+						    class="u-reset-button"
+						    :openType="item.openType"
+						    @getuserinfo="onGetUserInfo"
+						    @contact="onContact"
+						    @getphonenumber="onGetPhoneNumber"
+						    @error="onError"
+						    @launchapp="onLaunchApp"
+						    @opensetting="onOpenSetting"
+						    :lang="lang"
+						    :session-from="sessionFrom"
+						    :send-message-title="sendMessageTitle"
+						    :send-message-path="sendMessagePath"
+						    :send-message-img="sendMessageImg"
+						    :show-message-card="showMessageCard"
+						    :app-parameter="appParameter"
+						    @tap="selectHandler(index)"
+						    :hover-class="!item.disabled && !item.loading ? 'u-action-sheet--hover' : ''"
+						>
+							<!-- #endif -->
+							<view
+							    class="u-action-sheet__item-wrap__item"
+							    @tap.stop="selectHandler(index)"
+							    :hover-class="!item.disabled && !item.loading ? 'u-action-sheet--hover' : ''"
+							    :hover-stay-time="150"
+							>
+								<template v-if="!item.loading">
+									<text
+									    class="u-action-sheet__item-wrap__item__name"
+									    :style="[itemStyle(index)]"
+									>{{ item.name }}</text>
+									<text
+									    v-if="item.subname"
+									    class="u-action-sheet__item-wrap__item__subname"
+									>{{ item.subname }}</text>
+								</template>
+								<u-loading-icon
+								    v-else
+								    custom-class="van-action-sheet__loading"
+								    size="18"
+								    mode="circle"
+								/>
+							</view>
+							<!-- #ifdef MP -->
+						</button>
+						<!-- #endif -->
+						<u-line v-if="index !== actions.length - 1"></u-line>
+					</view>
+				</view>
+			</slot>
+			<u-gap
+			    bgColor="#eaeaec"
+			    height="6"
+			    v-if="cancelText"
+			></u-gap>
+			<view hover-class="u-action-sheet--hover">
+				<text
+				    @touchmove.stop.prevent
+				    :hover-stay-time="150"
+				    v-if="cancelText"
+				    class="u-action-sheet__cancel-text"
+				    @tap="cancel"
+				>{{cancelText}}</text>
+			</view>
+		</view>
+	</u-popup>
+</template>
+
+<script>
+	import openType from '../../libs/mixin/openType'
+	import button from '../../libs/mixin/button'
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addUnit } from '../../libs/function/index';
+	/**
+	 * ActionSheet 操作菜单
+	 * @description 本组件用于从底部弹出一个操作菜单,供用户选择并返回结果。本组件功能类似于uni的uni.showActionSheetAPI,配置更加灵活,所有平台都表现一致。
+	 * @tutorial https://ijry.github.io/uview-plus/components/actionSheet.html
+	 * 
+	 * @property {Boolean}			show				操作菜单是否展示 (默认 false )
+	 * @property {String}			title				操作菜单标题
+	 * @property {String}			description			选项上方的描述信息
+	 * @property {Array<Object>}	actions				按钮的文字数组,见官方文档示例
+	 * @property {String}			cancelText			取消按钮的提示文字,不为空时显示按钮
+	 * @property {Boolean}			closeOnClickAction	点击某个菜单项时是否关闭弹窗 (默认 true )
+	 * @property {Boolean}			safeAreaInsetBottom	处理底部安全区 (默认 true )
+	 * @property {String}			openType			小程序的打开方式 (contact | launchApp | getUserInfo | openSetting |getPhoneNumber |error )
+	 * @property {Boolean}			closeOnClickOverlay	点击遮罩是否允许关闭  (默认 true )
+	 * @property {Number|String}	round				圆角值,默认无圆角  (默认 0 )
+	 * @property {String}			lang				指定返回用户信息的语言,zh_CN 简体中文,zh_TW 繁体中文,en 英文
+	 * @property {String}			sessionFrom			会话来源,openType="contact"时有效
+	 * @property {String}			sendMessageTitle	会话内消息卡片标题,openType="contact"时有效
+	 * @property {String}			sendMessagePath		会话内消息卡片点击跳转小程序路径,openType="contact"时有效
+	 * @property {String}			sendMessageImg		会话内消息卡片图片,openType="contact"时有效
+	 * @property {Boolean}			showMessageCard		是否显示会话内消息卡片,设置此参数为 true,用户进入客服会话会在右下角显示"可能要发送的小程序"提示,用户点击后可以快速发送小程序消息,openType="contact"时有效 (默认 false )
+	 * @property {String}			appParameter		打开 APP 时,向 APP 传递的参数,openType=launchApp 时有效
+	 * 
+	 * @event {Function} select			点击ActionSheet列表项时触发 
+	 * @event {Function} close			点击取消按钮时触发
+	 * @event {Function} getuserinfo	用户点击该按钮时,会返回获取到的用户信息,回调的 detail 数据与 wx.getUserInfo 返回的一致,openType="getUserInfo"时有效
+	 * @event {Function} contact		客服消息回调,openType="contact"时有效
+	 * @event {Function} getphonenumber	获取用户手机号回调,openType="getPhoneNumber"时有效
+	 * @event {Function} error			当使用开放能力时,发生错误的回调,openType="error"时有效
+	 * @event {Function} launchapp		打开 APP 成功的回调,openType="launchApp"时有效
+	 * @event {Function} opensetting	在打开授权设置页后回调,openType="openSetting"时有效
+	 * @example <u-action-sheet :actions="list" :title="title" :show="show"></u-action-sheet>
+	 */
+	export default {
+		name: "u-action-sheet",
+		// 一些props参数和methods方法,通过mixin混入,因为其他文件也会用到
+		mixins: [openType, button, mixin, props],
+		data() {
+			return {
+
+			}
+		},
+		computed: {
+			// 操作项目的样式
+			itemStyle() {
+				return (index) => {
+					let style = {};
+					if (this.actions[index].color) style.color = this.actions[index].color
+					if (this.actions[index].fontSize) style.fontSize = addUnit(this.actions[index].fontSize)
+					// 选项被禁用的样式
+					if (this.actions[index].disabled) style.color = '#c0c4cc'
+					return style;
+				}
+			},
+		},
+		emits: ["close", "select"],
+		methods: {
+			closeHandler() {
+				// 允许点击遮罩关闭时,才发出close事件
+				if(this.closeOnClickOverlay) {
+					this.$emit('close')
+				}
+			},
+			// 点击取消按钮
+			cancel() {
+				this.$emit('close')
+			},
+			selectHandler(index) {
+				const item = this.actions[index]
+				if (item && !item.disabled && !item.loading) {
+					this.$emit('select', item)
+					if (this.closeOnClickAction) {
+						this.$emit('close')
+					}
+				}
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+	$u-action-sheet-reset-button-width:100% !default;
+	$u-action-sheet-title-font-size: 16px !default;
+	$u-action-sheet-title-padding: 12px 30px !default;
+	$u-action-sheet-title-color: $u-main-color !default;
+	$u-action-sheet-header-icon-wrap-right:15px !default;
+	$u-action-sheet-header-icon-wrap-top:15px !default;
+	$u-action-sheet-description-font-size:13px !default;
+	$u-action-sheet-description-color:14px !default;
+	$u-action-sheet-description-margin: 18px 15px !default;
+	$u-action-sheet-item-wrap-item-padding:17px !default;
+	$u-action-sheet-item-wrap-name-font-size:16px !default;
+	$u-action-sheet-item-wrap-subname-font-size:13px !default;
+	$u-action-sheet-item-wrap-subname-color: #c0c4cc !default;
+	$u-action-sheet-item-wrap-subname-margin-top:10px !default;
+	$u-action-sheet-cancel-text-font-size:16px !default;
+	$u-action-sheet-cancel-text-color:$u-content-color !default;
+	$u-action-sheet-cancel-text-font-size:15px !default;
+	$u-action-sheet-cancel-text-hover-background-color:rgb(242, 243, 245) !default;
+
+	.u-reset-button {
+		width: $u-action-sheet-reset-button-width;
+	}
+
+	.u-action-sheet {
+		text-align: center;
+		&__header {
+			position: relative;
+			padding: $u-action-sheet-title-padding;
+			&__title {
+				font-size: $u-action-sheet-title-font-size;
+				color: $u-action-sheet-title-color;
+				font-weight: bold;
+				text-align: center;
+			}
+
+			&__icon-wrap {
+				position: absolute;
+				right: $u-action-sheet-header-icon-wrap-right;
+				top: $u-action-sheet-header-icon-wrap-top;
+			}
+		}
+
+		&__description {
+			font-size: $u-action-sheet-description-font-size;
+			color: $u-tips-color;
+			margin: $u-action-sheet-description-margin;
+			text-align: center;
+		}
+
+		&__item-wrap {
+
+			&__item {
+				padding: $u-action-sheet-item-wrap-item-padding;
+				@include flex;
+				align-items: center;
+				justify-content: center;
+				flex-direction: column;
+
+				&__name {
+					font-size: $u-action-sheet-item-wrap-name-font-size;
+					color: $u-main-color;
+					text-align: center;
+				}
+
+				&__subname {
+					font-size: $u-action-sheet-item-wrap-subname-font-size;
+					color: $u-action-sheet-item-wrap-subname-color;
+					margin-top: $u-action-sheet-item-wrap-subname-margin-top;
+					text-align: center;
+				}
+			}
+		}
+
+		&__cancel-text {
+			font-size: $u-action-sheet-cancel-text-font-size;
+			color: $u-action-sheet-cancel-text-color;
+			text-align: center;
+			padding: $u-action-sheet-cancel-text-font-size;
+		}
+
+		&--hover {
+			background-color: $u-action-sheet-cancel-text-hover-background-color;
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-album/props.js b/uni_modules/uview-plus/components/u-album/props.js
new file mode 100644
index 0000000..f092a34
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-album/props.js
@@ -0,0 +1,60 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 图片地址,Array<String>|Array<Object>形式
+        urls: {
+            type: Array,
+            default: () => defProps.album.urls
+        },
+        // 指定从数组的对象元素中读取哪个属性作为图片地址
+        keyName: {
+            type: String,
+            default: () => defProps.album.keyName
+        },
+        // 单图时,图片长边的长度
+        singleSize: {
+            type: [String, Number],
+            default: () => defProps.album.singleSize
+        },
+        // 多图时,图片边长
+        multipleSize: {
+            type: [String, Number],
+            default: () => defProps.album.multipleSize
+        },
+        // 多图时,图片水平和垂直之间的间隔
+        space: {
+            type: [String, Number],
+            default: () => defProps.album.space
+        },
+        // 单图时,图片缩放裁剪的模式
+        singleMode: {
+            type: String,
+            default: () => defProps.album.singleMode
+        },
+        // 多图时,图片缩放裁剪的模式
+        multipleMode: {
+            type: String,
+            default: () => defProps.album.multipleMode
+        },
+        // 最多展示的图片数量,超出时最后一个位置将会显示剩余图片数量
+        maxCount: {
+            type: [String, Number],
+            default: () => defProps.album.maxCount
+        },
+        // 是否可以预览图片
+        previewFullImage: {
+            type: Boolean,
+            default: () => defProps.album.previewFullImage
+        },
+        // 每行展示图片数量,如设置,singleSize和multipleSize将会无效
+        rowCount: {
+            type: [String, Number],
+            default: () => defProps.album.rowCount
+        },
+        // 超出maxCount时是否显示查看更多的提示
+        showMore: {
+            type: Boolean,
+            default: () => defProps.album.showMore
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-album/u-album.vue b/uni_modules/uview-plus/components/u-album/u-album.vue
new file mode 100644
index 0000000..e3f2493
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-album/u-album.vue
@@ -0,0 +1,264 @@
+<template>
+    <view class="u-album">
+        <view
+            class="u-album__row"
+            ref="u-album__row"
+            v-for="(arr, index) in showUrls"
+            :forComputedUse="albumWidth"
+            :key="index"
+        >
+            <view
+                class="u-album__row__wrapper"
+                v-for="(item, index1) in arr"
+                :key="index1"
+                :style="[imageStyle(index + 1, index1 + 1)]"
+                @tap="previewFullImage ? onPreviewTap(getSrc(item)) : ''"
+            >
+                <image
+                    :src="getSrc(item)"
+                    :mode="
+                        urls.length === 1
+                            ? imageHeight > 0
+                                ? singleMode
+                                : 'widthFix'
+                            : multipleMode
+                    "
+                    :style="[
+                        {
+                            width: imageWidth,
+                            height: imageHeight
+                        }
+                    ]"
+                ></image>
+                <view
+                    v-if="
+                        showMore &&
+                        urls.length > rowCount * showUrls.length &&
+                        index === showUrls.length - 1 &&
+                        index1 === showUrls[showUrls.length - 1].length - 1
+                    "
+                    class="u-album__row__wrapper__text"
+                >
+                    <up-text
+                        :text="`+${urls.length - maxCount}`"
+                        color="#fff"
+                        :size="multipleSize * 0.3"
+                        align="center"
+                        customStyle="justify-content: center"
+                    ></up-text>
+                </view>
+            </view>
+        </view>
+    </view>
+</template>
+
+<script>
+import props from './props';
+import mpMixin from '../../libs/mixin/mpMixin';
+import mixin from '../../libs/mixin/mixin';
+import { addUnit, sleep } from '../../libs/function/index';
+import test from '../../libs/function/test';
+// #ifdef APP-NVUE
+// 由于weex为阿里的KPI业绩考核的产物,所以不支持百分比单位,这里需要通过dom查询组件的宽度
+const dom = uni.requireNativePlugin('dom')
+// #endif
+
+/**
+ * Album 相册
+ * @description 本组件提供一个类似相册的功能,让开发者开发起来更加得心应手。减少重复的模板代码
+ * @tutorial https://ijry.github.io/uview-plus/components/album.html
+ *
+ * @property {Array}           urls             图片地址列表 Array<String>|Array<Object>形式
+ * @property {String}          keyName          指定从数组的对象元素中读取哪个属性作为图片地址
+ * @property {String | Number} singleSize       单图时,图片长边的长度  (默认 180 )
+ * @property {String | Number} multipleSize     多图时,图片边长 (默认 70 )
+ * @property {String | Number} space            多图时,图片水平和垂直之间的间隔 (默认 6 )
+ * @property {String}          singleMode       单图时,图片缩放裁剪的模式 (默认 'scaleToFill' )
+ * @property {String}          multipleMode     多图时,图片缩放裁剪的模式 (默认 'aspectFill' )
+ * @property {String | Number} maxCount         取消按钮的提示文字 (默认 9 )
+ * @property {Boolean}         previewFullImage 是否可以预览图片 (默认 true )
+ * @property {String | Number} rowCount         每行展示图片数量,如设置,singleSize和multipleSize将会无效	(默认 3 )
+ * @property {Boolean}         showMore         超出maxCount时是否显示查看更多的提示 (默认 true )
+ *
+ * @event    {Function}        albumWidth       某些特殊的情况下,需要让文字与相册的宽度相等,这里事件的形式对外发送  (回调参数 width )
+ * @example <u-album :urls="urls2" @albumWidth="width => albumWidth = width" multipleSize="68" ></u-album>
+ */
+export default {
+    name: 'u-album',
+    mixins: [mpMixin, mixin, props],
+    data() {
+        return {
+            // 单图的宽度
+            singleWidth: 0,
+            // 单图的高度
+            singleHeight: 0,
+            // 单图时,如果无法获取图片的尺寸信息,让图片宽度默认为容器的一定百分比
+            singlePercent: 0.6
+        }
+    },
+    watch: {
+        urls: {
+            immediate: true,
+            handler(newVal) {
+                if (newVal.length === 1) {
+                    this.getImageRect()
+                }
+            }
+        }
+    },
+	emits: ["albumWidth"],
+    computed: {
+        imageStyle() {
+            return (index1, index2) => {
+                const { space, rowCount, multipleSize, urls } = this,
+                    { addUnit, addStyle } = uni.$u,
+                    rowLen = this.showUrls.length,
+                    allLen = this.urls.length
+                const style = {
+                    marginRight: addUnit(space),
+                    marginBottom: addUnit(space)
+                }
+                // 如果为最后一行,则每个图片都无需下边框
+                if (index1 === rowLen) style.marginBottom = 0
+                // 每行的最右边一张和总长度的最后一张无需右边框
+                if (
+                    index2 === rowCount ||
+                    (index1 === rowLen &&
+                        index2 === this.showUrls[index1 - 1].length)
+                )
+                    style.marginRight = 0
+                return style
+            }
+        },
+        // 将数组划分为二维数组
+        showUrls() {
+            const arr = []
+            this.urls.map((item, index) => {
+                // 限制最大展示数量
+                if (index + 1 <= this.maxCount) {
+                    // 计算该元素为第几个素组内
+                    const itemIndex = Math.floor(index / this.rowCount)
+                    // 判断对应的索引是否存在
+                    if (!arr[itemIndex]) {
+                        arr[itemIndex] = []
+                    }
+                    arr[itemIndex].push(item)
+                }
+            })
+            return arr
+        },
+        imageWidth() {
+            return addUnit(
+                this.urls.length === 1 ? this.singleWidth : this.multipleSize
+            )
+        },
+        imageHeight() {
+            return addUnit(
+                this.urls.length === 1 ? this.singleHeight : this.multipleSize
+            )
+        },
+        // 此变量无实际用途,仅仅是为了利用computed特性,让其在urls长度等变化时,重新计算图片的宽度
+        // 因为用户在某些特殊的情况下,需要让文字与相册的宽度相等,所以这里事件的形式对外发送
+        albumWidth() {
+            let width = 0
+            if (this.urls.length === 1) {
+                width = this.singleWidth
+            } else {
+                width =
+                    this.showUrls[0].length * this.multipleSize +
+                    this.space * (this.showUrls[0].length - 1)
+            }
+            this.$emit('albumWidth', width)
+            return width
+        }
+    },
+    methods: {
+        // 预览图片
+        onPreviewTap(url) {
+            const urls = this.urls.map((item) => {
+                return this.getSrc(item)
+            })
+            uni.previewImage({
+                current: url,
+                urls
+            })
+        },
+        // 获取图片的路径
+        getSrc(item) {
+            return test.object(item)
+                ? (this.keyName && item[this.keyName]) || item.src
+                : item
+        },
+        // 单图时,获取图片的尺寸
+        // 在小程序中,需要将网络图片的的域名添加到小程序的download域名才可能获取尺寸
+        // 在没有添加的情况下,让单图宽度默认为盒子的一定宽度(singlePercent)
+        getImageRect() {
+            const src = this.getSrc(this.urls[0])
+            uni.getImageInfo({
+                src,
+                success: (res) => {
+                    // 判断图片横向还是竖向展示方式
+                    const isHorizotal = res.width >= res.height
+                    this.singleWidth = isHorizotal
+                        ? this.singleSize
+                        : (res.width / res.height) * this.singleSize
+                    this.singleHeight = !isHorizotal
+                        ? this.singleSize
+                        : (res.height / res.width) * this.singleWidth
+                },
+                fail: () => {
+                    this.getComponentWidth()
+                }
+            })
+        },
+        // 获取组件的宽度
+        async getComponentWidth() {
+            // 延时一定时间,以获取dom尺寸
+            await sleep(30)
+            // #ifndef APP-NVUE
+            this.$uGetRect('.u-album__row').then((size) => {
+                this.singleWidth = size.width * this.singlePercent
+            })
+            // #endif
+
+            // #ifdef APP-NVUE
+            // 这里ref="u-album__row"所在的标签为通过for循环出来,导致this.$refs['u-album__row']是一个数组
+            const ref = this.$refs['u-album__row'][0]
+            ref &&
+                dom.getComponentRect(ref, (res) => {
+                    this.singleWidth = res.size.width * this.singlePercent
+                })
+            // #endif
+        }
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+@import '../../libs/css/components.scss';
+
+.u-album {
+    @include flex(column);
+
+    &__row {
+        @include flex(row);
+        flex-wrap: wrap;
+
+        &__wrapper {
+            position: relative;
+
+            &__text {
+                position: absolute;
+                top: 0;
+                left: 0;
+                right: 0;
+                bottom: 0;
+                background-color: rgba(0, 0, 0, 0.3);
+                @include flex(row);
+                justify-content: center;
+                align-items: center;
+            }
+        }
+    }
+}
+</style>
\ No newline at end of file
diff --git a/uni_modules/uview-plus/components/u-alert/props.js b/uni_modules/uview-plus/components/u-alert/props.js
new file mode 100644
index 0000000..f3846e4
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-alert/props.js
@@ -0,0 +1,45 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 显示文字
+        title: {
+            type: String,
+            default: () => defProps.alert.title
+        },
+        // 主题,success/warning/info/error
+        type: {
+            type: String,
+            default: () => defProps.alert.type
+        },
+        // 辅助性文字
+        description: {
+            type: String,
+            default: () => defProps.alert.description
+        },
+        // 是否可关闭
+        closable: {
+            type: Boolean,
+            default: () => defProps.alert.closable
+        },
+        // 是否显示图标
+        showIcon: {
+            type: Boolean,
+            default: () => defProps.alert.showIcon
+        },
+        // 浅或深色调,light-浅色,dark-深色
+        effect: {
+            type: String,
+            default: () => defProps.alert.effect
+        },
+        // 文字是否居中
+        center: {
+            type: Boolean,
+            default: () => defProps.alert.center
+        },
+        // 字体大小
+        fontSize: {
+            type: [String, Number],
+            default: () => defProps.alert.fontSize
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-alert/u-alert.vue b/uni_modules/uview-plus/components/u-alert/u-alert.vue
new file mode 100644
index 0000000..e2d9456
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-alert/u-alert.vue
@@ -0,0 +1,249 @@
+<template>
+	<u-transition
+	    mode="fade"
+	    :show="show"
+	>
+		<view
+		    class="u-alert"
+		    :class="[`u-alert--${type}--${effect}`]"
+		    @tap.stop="clickHandler"
+		    :style="[addStyle(customStyle)]"
+		>
+			<view
+			    class="u-alert__icon"
+			    v-if="showIcon"
+			>
+				<u-icon
+				    :name="iconName"
+				    size="18"
+				    :color="iconColor"
+				></u-icon>
+			</view>
+			<view
+			    class="u-alert__content"
+			    :style="[{
+					paddingRight: closable ? '20px' : 0
+				}]"
+			>
+				<text
+				    class="u-alert__content__title"
+				    v-if="title"
+					:style="[{
+						fontSize: addUnit(fontSize),
+						textAlign: center ? 'center' : 'left'
+					}]"
+				    :class="[effect === 'dark' ? 'u-alert__text--dark' : `u-alert__text--${type}--light`]"
+				>{{ title }}</text>
+				<text
+				    class="u-alert__content__desc"
+					v-if="description"
+					:style="[{
+						fontSize: addUnit(fontSize),
+						textAlign: center ? 'center' : 'left'
+					}]"
+				    :class="[effect === 'dark' ? 'u-alert__text--dark' : `u-alert__text--${type}--light`]"
+				>{{ description }}</text>
+			</view>
+			<view
+			    class="u-alert__close"
+			    v-if="closable"
+			    @tap.stop="closeHandler"
+			>
+				<u-icon
+				    name="close"
+				    :color="iconColor"
+				    size="15"
+				></u-icon>
+			</view>
+		</view>
+	</u-transition>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addUnit, addStyle } from '../../libs/function/index';
+	/**
+	 * Alert  警告提示
+	 * @description 警告提示,展现需要关注的信息。
+	 * @tutorial https://ijry.github.io/uview-plus/components/alertTips.html
+	 * 
+	 * @property {String}			title       显示的文字 
+	 * @property {String}			type        使用预设的颜色  (默认 'warning' )
+	 * @property {String}			description 辅助性文字,颜色比title浅一点,字号也小一点,可选  
+	 * @property {Boolean}			closable    关闭按钮(默认为叉号icon图标)  (默认 false )
+	 * @property {Boolean}			showIcon    是否显示左边的辅助图标   ( 默认 false )
+	 * @property {String}			effect      多图时,图片缩放裁剪的模式  (默认 'light' )
+	 * @property {Boolean}			center		文字是否居中  (默认 false )
+	 * @property {String | Number}	fontSize    字体大小  (默认 14 )
+	 * @property {Object}			customStyle	定义需要用到的外部样式
+	 * @event    {Function}        click       点击组件时触发
+	 * @example  <u-alert :title="title"  type = "warning" :closable="closable" :description = "description"></u-alert>
+	 */
+	export default {
+		name: 'u-alert',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				show: true
+			}
+		},
+		computed: {
+			iconColor() {
+				return this.effect === 'light' ? this.type : '#fff'
+			},
+			// 不同主题对应不同的图标
+			iconName() {
+				switch (this.type) {
+					case 'success':
+						return 'checkmark-circle-fill';
+						break;
+					case 'error':
+						return 'close-circle-fill';
+						break;
+					case 'warning':
+						return 'error-circle-fill';
+						break;
+					case 'info':
+						return 'info-circle-fill';
+						break;
+					case 'primary':
+						return 'more-circle-fill';
+						break;
+					default: 
+						return 'error-circle-fill';
+				}
+			}
+		},
+		emits: ["click"],
+		methods: {
+			addUnit,
+			addStyle,
+			// 点击内容
+			clickHandler() {
+				this.$emit('click')
+			},
+			// 点击关闭按钮
+			closeHandler() {
+				this.show = false
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-alert {
+		position: relative;
+		background-color: $u-primary;
+		padding: 8px 10px;
+		@include flex(row);
+		align-items: center;
+		border-top-left-radius: 4px;
+		border-top-right-radius: 4px;
+		border-bottom-left-radius: 4px;
+		border-bottom-right-radius: 4px;
+
+		&--primary--dark {
+			background-color: $u-primary;
+		}
+
+		&--primary--light {
+			background-color: #ecf5ff;
+		}
+
+		&--error--dark {
+			background-color: $u-error;
+		}
+
+		&--error--light {
+			background-color: #FEF0F0;
+		}
+
+		&--success--dark {
+			background-color: $u-success;
+		}
+
+		&--success--light {
+			background-color: #f5fff0;
+		}
+
+		&--warning--dark {
+			background-color: $u-warning;
+		}
+
+		&--warning--light {
+			background-color: #FDF6EC;
+		}
+
+		&--info--dark {
+			background-color: $u-info;
+		}
+
+		&--info--light {
+			background-color: #f4f4f5;
+		}
+
+		&__icon {
+			margin-right: 5px;
+		}
+
+		&__content {
+			@include flex(column);
+			flex: 1;
+
+			&__title {
+				color: $u-main-color;
+				font-size: 14px;
+				font-weight: bold;
+				color: #fff;
+				margin-bottom: 2px;
+			}
+
+			&__desc {
+				color: $u-main-color;
+				font-size: 14px;
+				flex-wrap: wrap;
+				color: #fff;
+			}
+		}
+
+		&__title--dark,
+		&__desc--dark {
+			color: #FFFFFF;
+		}
+
+		&__text--primary--light,
+		&__text--primary--light {
+			color: $u-primary;
+		}
+
+		&__text--success--light,
+		&__text--success--light {
+			color: $u-success;
+		}
+
+		&__text--warning--light,
+		&__text--warning--light {
+			color: $u-warning;
+		}
+
+		&__text--error--light,
+		&__text--error--light {
+			color: $u-error;
+		}
+
+		&__text--info--light,
+		&__text--info--light {
+			color: $u-info;
+		}
+
+		&__close {
+			position: absolute;
+			top: 11px;
+			right: 10px;
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-avatar-group/props.js b/uni_modules/uview-plus/components/u-avatar-group/props.js
new file mode 100644
index 0000000..1f429ea
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-avatar-group/props.js
@@ -0,0 +1,53 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 头像图片组
+        urls: {
+            type: Array,
+            default: () => defProps.avatarGroup.urls
+        },
+        // 最多展示的头像数量
+        maxCount: {
+            type: [String, Number],
+            default: () => defProps.avatarGroup.maxCount
+        },
+        // 头像形状
+        shape: {
+            type: String,
+            default: () => defProps.avatarGroup.shape
+        },
+        // 图片裁剪模式
+        mode: {
+            type: String,
+            default: () => defProps.avatarGroup.mode
+        },
+        // 超出maxCount时是否显示查看更多的提示
+        showMore: {
+            type: Boolean,
+            default: () => defProps.avatarGroup.showMore
+        },
+        // 头像大小
+        size: {
+            type: [String, Number],
+            default: () => defProps.avatarGroup.size
+        },
+        // 指定从数组的对象元素中读取哪个属性作为图片地址
+        keyName: {
+            type: String,
+            default: () => defProps.avatarGroup.keyName
+        },
+		// 头像之间的遮挡比例
+        gap: {
+            type: [String, Number],
+            validator(value) {
+                return value >= 0 && value <= 1
+            },
+            default: () => defProps.avatarGroup.gap
+        },
+		// 需额外显示的值
+		extraValue: {
+			type: [Number, String],
+			default: () => defProps.avatarGroup.extraValue
+		}
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-avatar-group/u-avatar-group.vue b/uni_modules/uview-plus/components/u-avatar-group/u-avatar-group.vue
new file mode 100644
index 0000000..6570df3
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-avatar-group/u-avatar-group.vue
@@ -0,0 +1,110 @@
+<template>
+	<view class="u-avatar-group">
+		<view
+		    class="u-avatar-group__item"
+		    v-for="(item, index) in showUrl"
+		    :key="index"
+		    :style="{
+				marginLeft: index === 0 ? 0 : addUnit(-size * gap)
+			}"
+		>
+			<u-avatar
+			    :size="size"
+			    :shape="shape"
+			    :mode="mode"
+			    :src="testObject(item) ? keyName && item[keyName] || item.url : item"
+			></u-avatar>
+			<view
+			    class="u-avatar-group__item__show-more"
+			    v-if="showMore && index === showUrl.length - 1 && (urls.length > maxCount || extraValue > 0)"
+				@tap="clickHandler"
+			>
+				<up-text
+				    color="#ffffff"
+				    :size="size * 0.4"
+				    :text="`+${extraValue || urls.length - showUrl.length}`"
+					align="center"
+					customStyle="justify-content: center"
+				></up-text>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addUnit } from '../../libs/function/index';
+	import test from '../../libs/function/test';
+	/**
+	 * AvatarGroup  头像组
+	 * @description 本组件一般用于展示头像的地方,如个人中心,或者评论列表页的用户头像展示等场所。
+	 * @tutorial https://ijry.github.io/uview-plus/components/avatar.html
+	 * 
+	 * @property {Array}           urls     头像图片组 (默认 [] )
+	 * @property {String | Number} maxCount 最多展示的头像数量 ( 默认 5 )
+	 * @property {String}          shape    头像形状( 'circle' (默认) | 'square' )
+	 * @property {String}          mode     图片裁剪模式(默认 'scaleToFill' )
+	 * @property {Boolean}         showMore 超出maxCount时是否显示查看更多的提示 (默认 true )
+	 * @property {String | Number} size      头像大小 (默认 40 )
+	 * @property {String}          keyName  指定从数组的对象元素中读取哪个属性作为图片地址 
+	 * @property {String | Number} gap      头像之间的遮挡比例(0.4代表遮挡40%)  (默认 0.5 )
+	 * @property {String | Number} extraValue  需额外显示的值
+	 * @event    {Function}        showMore 头像组更多点击
+	 * @example  <u-avatar-group:urls="urls" size="35" gap="0.4" ></u-avatar-group:urls=>
+	 */
+	export default {
+		name: 'u-avatar-group',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+
+			}
+		},
+		computed: {
+			showUrl() {
+				return this.urls.slice(0, this.maxCount)
+			}
+		},
+		emits: ["showMore"],
+		methods: {
+			addUnit,
+			testObject: test.object,
+			clickHandler() {
+				this.$emit('showMore')
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-avatar-group {
+		@include flex;
+
+		&__item {
+			margin-left: -10px;
+			position: relative;
+
+			&--no-indent {
+				// 如果你想质疑作者不会使用:first-child,说明你太年轻,因为nvue不支持
+				margin-left: 0;
+			}
+
+			&__show-more {
+				position: absolute;
+				top: 0;
+				bottom: 0;
+				left: 0;
+				right: 0;
+				background-color: rgba(0, 0, 0, 0.3);
+				@include flex;
+				align-items: center;
+				justify-content: center;
+				border-radius: 100px;
+			}
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-avatar/props.js b/uni_modules/uview-plus/components/u-avatar/props.js
new file mode 100644
index 0000000..c0212e8
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-avatar/props.js
@@ -0,0 +1,80 @@
+import defProps from '../../libs/config/props.js';
+import test from '../../libs/function/test';
+export default {
+    props: {
+        // 头像图片路径(不能为相对路径)
+        src: {
+            type: String,
+            default: () => defProps.avatar.src
+        },
+        // 头像形状,circle-圆形,square-方形
+        shape: {
+            type: String,
+            default: () => defProps.avatar.shape
+        },
+        // 头像尺寸
+        size: {
+            type: [String, Number],
+            default: () => defProps.avatar.size
+        },
+        // 裁剪模式
+        mode: {
+            type: String,
+            default: () => defProps.avatar.mode
+        },
+        // 显示的文字
+        text: {
+            type: String,
+            default: () => defProps.avatar.text
+        },
+        // 背景色
+        bgColor: {
+            type: String,
+            default: () => defProps.avatar.bgColor
+        },
+        // 文字颜色
+        color: {
+            type: String,
+            default: () => defProps.avatar.color
+        },
+        // 文字大小
+        fontSize: {
+            type: [String, Number],
+            default: () => defProps.avatar.fontSize
+        },
+        // 显示的图标
+        icon: {
+            type: String,
+            default: () => defProps.avatar.icon
+        },
+        // 显示小程序头像,只对百度,微信,QQ小程序有效
+        mpAvatar: {
+            type: Boolean,
+            default: () => defProps.avatar.mpAvatar
+        },
+        // 是否使用随机背景色
+        randomBgColor: {
+            type: Boolean,
+            default: () => defProps.avatar.randomBgColor
+        },
+        // 加载失败的默认头像(组件有内置默认图片)
+        defaultUrl: {
+            type: String,
+            default: () => defProps.avatar.defaultUrl
+        },
+        // 如果配置了randomBgColor为true,且配置了此值,则从默认的背景色数组中取出对应索引的颜色值,取值0-19之间
+        colorIndex: {
+            type: [String, Number],
+            // 校验参数规则,索引在0-19之间
+            validator(n) {
+                return test.range(n, [0, 19]) || n === ''
+            },
+            default: () => defProps.avatar.colorIndex
+        },
+        // 组件标识符
+        name: {
+            type: String,
+            default: () => defProps.avatar.name
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-avatar/u-avatar.vue b/uni_modules/uview-plus/components/u-avatar/u-avatar.vue
new file mode 100644
index 0000000..e2e257c
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-avatar/u-avatar.vue
@@ -0,0 +1,180 @@
+<template>
+	<view
+		class="u-avatar"
+		:class="[`u-avatar--${shape}`]"
+		:style="[{
+			backgroundColor: (text || icon) ? (randomBgColor ? colors[colorIndex !== '' ? colorIndex : random(0, 19)] : bgColor) : 'transparent',
+			width: addUnit(size),
+			height: addUnit(size),
+		}, addStyle(customStyle)]"
+		@tap="clickHandler"
+	>
+		<slot>
+			<!-- #ifdef MP-WEIXIN || MP-QQ || MP-BAIDU  -->
+			<open-data
+				v-if="mpAvatar && allowMp"
+				type="userAvatarUrl"
+				:style="[{
+					width: addUnit(size),
+					height: addUnit(size)
+				}]"
+			/>
+			<!-- #endif -->
+			<!-- #ifndef MP-WEIXIN && MP-QQ && MP-BAIDU  -->
+			<template v-if="mpAvatar && allowMp"></template>
+			<!-- #endif -->
+			<u-icon
+				v-else-if="icon"
+				:name="icon"
+				:size="fontSize"
+				:color="color"
+			></u-icon>
+			<up-text
+				v-else-if="text"
+				:text="text"
+				:size="fontSize"
+				:color="color"
+				align="center"
+				customStyle="justify-content: center"
+			></up-text>
+			<image
+				class="u-avatar__image"
+				v-else
+				:class="[`u-avatar__image--${shape}`]"
+				:src="avatarUrl || defaultUrl"
+				:mode="mode"
+				@error="errorHandler"
+				:style="[{
+					width: addUnit(size),
+					height: addUnit(size)
+				}]"
+			></image>
+		</slot>
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addStyle, addUnit, random } from '../../libs/function/index';
+	const base64Avatar =
+		"data:image/jpg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAA8AAD/4QMraHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjMtYzAxMSA2Ni4xNDU2NjEsIDIwMTIvMDIvMDYtMTQ6NTY6MjcgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjREMEQwRkY0RjgwNDExRUE5OTY2RDgxODY3NkJFODMxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjREMEQwRkY1RjgwNDExRUE5OTY2RDgxODY3NkJFODMxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NEQwRDBGRjJGODA0MTFFQTk5NjZEODE4Njc2QkU4MzEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NEQwRDBGRjNGODA0MTFFQTk5NjZEODE4Njc2QkU4MzEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/7gAOQWRvYmUAZMAAAAAB/9sAhAAGBAQEBQQGBQUGCQYFBgkLCAYGCAsMCgoLCgoMEAwMDAwMDBAMDg8QDw4MExMUFBMTHBsbGxwfHx8fHx8fHx8fAQcHBw0MDRgQEBgaFREVGh8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx//wAARCADIAMgDAREAAhEBAxEB/8QAcQABAQEAAwEBAAAAAAAAAAAAAAUEAQMGAgcBAQAAAAAAAAAAAAAAAAAAAAAQAAIBAwICBgkDBQAAAAAAAAABAhEDBCEFMVFBYXGREiKBscHRMkJSEyOh4XLxYjNDFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8A/fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHbHFyZ/Dam+yLA+Z2L0Pjtyj2poD4AAAAAAAAAAAAAAAAAAAAAAAAKWFs9y6lcvvwQeqj8z9wFaziY1n/HbUX9XF97A7QAGXI23EvJ1goyfzR0YEfN269jeZ+a03pNe0DIAAAAAAAAAAAAAAAAAAAACvtO3RcVkXlWutuL9YFYAAAAAOJRjKLjJVi9GmB5/csH/mu1h/in8PU+QGMAAAAAAAAAAAAAAAAAAaMDG/6MmMH8C80+xAelSSVFolwQAAAAAAAHVlWI37ErUulaPk+hgeYnCUJuElSUXRrrQHAAAAAAAAAAAAAAAAABa2Oz4bM7r4zdF2ICmAAAAAAAAAg7zZ8GX41wuJP0rRgYAAAAAAAAAAAAAAAAAD0m2R8ODaXU33tsDSAAAAAAAAAlb9HyWZcnJd9PcBHAAAAAAAAAAAAAAAAAPS7e64Vn+KA0AAAAAAAAAJm+v8Ftf3ewCKAAAAAAAAAAAAAAAAAX9muqeGo9NttP06+0DcAAAAAAAAAjb7dTu2ra+VOT9P8AQCWAAAAAAAAAAAAAAAAAUNmyPt5Ltv4bui/kuAF0AAAAAAADiUlGLlJ0SVW+oDzOXfd/Ind6JPRdS0QHSAAAAAAAAAAAAAAAAAE2nVaNcGB6Lbs6OTao9LsF51z60BrAAAAAABJ3jOVHjW3r/sa9QEgAAAAAAAAAAAAAAAAAAAPu1duWriuW34ZR4MC9hbnZyEoy8l36XwfYBsAAADaSq9EuLAlZ+7xSdrGdW9Hc5dgEdtt1erfFgAAAAAAAAAAAAAAAAADVjbblX6NR8MH80tEBRs7HYivyzlN8lovaBPzduvY0m6eK10TXtAyAarO55lpJK54orolr+4GqO/Xaea1FvqbXvA+Z77kNeW3GPbV+4DJfzcm/pcm3H6Vou5AdAFLC2ed2Pjv1txa8sV8T6wOL+yZEKu1JXFy4MDBOE4ScZxcZLinoB8gAAAAAAAAAAAB242LeyJ+C3GvN9C7QLmJtePYpKS+5c+p8F2IDYAANJqj1T4oCfk7Nj3G5Wn9qXJax7gJ93Z82D8sVNc4v30A6Xg5i42Z+iLfqARwcyT0sz9MWvWBps7LlTf5Grce9/oBTxdtxseklHxT+uWr9AGoAB138ezfj4bsFJdD6V2MCPm7RdtJzs1uW1xXzL3gTgAAAAAAAAADRhYc8q74I6RWs5ckB6GxYtWLat21SK731sDsAAAAAAAAAAAAAAAASt021NO/YjrxuQXT1oCOAAAAAAABzGLlJRSq26JAelwsWONYjbXxcZvmwO8AAAAAAAAAAAAAAAAAAef3TEWPkVivx3NY9T6UBiAAAAAABo2+VmGXblddIJ8eivRUD0oAAAAAAAAAAAAAAAAAAAYt4tKeFKVNYNSXfRgefAAAAAAAAr7VuSSWPedKaW5v1MCsAAAAAAAAAAAAAAAAAAIe6bj96Ts2n+JPzSXzP3ATgAAAAAAAAFbbt1UUrOQ9FpC4/UwK6aaqtU+DAAAAAAAAAAAAAAA4lKMIuUmoxWrb4ARNx3R3q2rLpa4Sl0y/YCcAAAAAAAAAAANmFud7G8r89r6X0dgFvGzLGRGtuWvTF6NAdwAAAAAAAAAAAy5W442PVN+K59EePp5ARMvOv5MvO6QXCC4AZwAAAAAAAAAAAAAcxlKLUotprg1owN+PvORborq+7Hnwl3gUbO74VzRydt8pKn68ANcJwmqwkpLmnUDkAAAAfNy9atqtyagut0AxXt5xIV8Fbj6lRd7Am5G65V6qUvtwfyx94GMAAAAAAAAAAAAAAAAAAAOU2nVOj5gdsc3LiqRvTpyqwOxbnnrhdfpSfrQB7pnv/AGvuS9gHXPMy5/Fem1yq0v0A6W29XqwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//Z";
+	/**
+	 * Avatar  头像
+	 * @description 本组件一般用于展示头像的地方,如个人中心,或者评论列表页的用户头像展示等场所。
+	 * @tutorial https://ijry.github.io/uview-plus/components/avatar.html
+	 *
+	 * @property {String}			src				头像路径,如加载失败,将会显示默认头像(不能为相对路径)
+	 * @property {String}			shape			头像形状  ( circle (默认) | square)
+	 * @property {String | Number}	size			头像尺寸,可以为指定字符串(large, default, mini),或者数值 (默认 40 )
+	 * @property {String}			mode			头像图片的裁剪类型,与uni的image组件的mode参数一致,如效果达不到需求,可尝试传widthFix值 (默认 'scaleToFill' )
+	 * @property {String}			text			用文字替代图片,级别优先于src
+	 * @property {String}			bgColor			背景颜色,一般显示文字时用 (默认 '#c0c4cc' )
+	 * @property {String}			color			文字颜色 (默认 '#ffffff' )
+	 * @property {String | Number}	fontSize		文字大小  (默认 18 )
+	 * @property {String}			icon			显示的图标
+	 * @property {Boolean}			mpAvatar		显示小程序头像,只对百度,微信,QQ小程序有效  (默认 false )
+	 * @property {Boolean}			randomBgColor	是否使用随机背景色  (默认 false )
+	 * @property {String}			defaultUrl		加载失败的默认头像(组件有内置默认图片)
+	 * @property {String | Number}	colorIndex		如果配置了randomBgColor为true,且配置了此值,则从默认的背景色数组中取出对应索引的颜色值,取值0-19之间
+	 * @property {String}			name			组件标识符  (默认 'level' )
+	 * @property {Object}			customStyle		定义需要用到的外部样式
+	 *
+	 * @event    {Function}        click       点击组件时触发   index: 用户传递的标识符
+	 * @example  <u-avatar :src="src" mode="square"></u-avatar>
+	 */
+	export default {
+		name: 'u-avatar',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				// 如果配置randomBgColor参数为true,在图标或者文字的模式下,会随机从中取出一个颜色值当做背景色
+				colors: ['#ffb34b', '#f2bba9', '#f7a196', '#f18080', '#88a867', '#bfbf39', '#89c152', '#94d554', '#f19ec2',
+					'#afaae4', '#e1b0df', '#c38cc1', '#72dcdc', '#9acdcb', '#77b1cc', '#448aca', '#86cefa', '#98d1ee',
+					'#73d1f1',
+					'#80a7dc'
+				],
+				avatarUrl: this.src,
+				allowMp: false
+			}
+		},
+		watch: {
+			// 监听头像src的变化,赋值给内部的avatarUrl变量,因为图片加载失败时,需要修改图片的src为默认值
+			// 而组件内部不能直接修改props的值,所以需要一个中间变量
+			src: {
+				immediate: true,
+				handler(newVal) {
+					this.avatarUrl = newVal
+					// 如果没有传src,则主动触发error事件,用于显示默认的头像,否则src为''空字符等的时候,会无内容展示
+					if(!newVal) {
+						this.errorHandler()
+					}
+				}
+			}
+		},
+		computed: {
+			imageStyle() {
+				const style = {}
+				return style
+			}
+		},
+		created() {
+			this.init()
+		},
+		emits: ["click"],
+		methods: {
+			addStyle,
+			addUnit,
+			random,
+			init() {
+				// 目前只有这几个小程序平台具有open-data标签
+				// 其他平台可以通过uni.getUserInfo类似接口获取信息,但是需要弹窗授权(首次),不合符组件逻辑
+				// 故目前自动获取小程序头像只支持这几个平台
+				// #ifdef MP-WEIXIN || MP-QQ || MP-BAIDU
+				this.allowMp = true
+				// #endif
+			},
+			// 判断传入的name属性,是否图片路径,只要带有"/"均认为是图片形式
+			isImg() {
+				return this.src.indexOf('/') !== -1
+			},
+			// 图片加载时失败时触发
+			errorHandler() {
+				this.avatarUrl = this.defaultUrl || base64Avatar
+			},
+			clickHandler() {
+				this.$emit('click', this.name)
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-avatar {
+		@include flex;
+		align-items: center;
+		justify-content: center;
+
+		&--circle {
+			border-radius: 100px;
+		}
+
+		&--square {
+			border-radius: 4px;
+		}
+
+		&__image {
+			&--circle {
+				border-radius: 100px;
+                overflow: hidden;
+			}
+
+			&--square {
+				border-radius: 4px;
+			}
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-back-top/props.js b/uni_modules/uview-plus/components/u-back-top/props.js
new file mode 100644
index 0000000..1fca83f
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-back-top/props.js
@@ -0,0 +1,55 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 返回顶部的形状,circle-圆形,square-方形
+        mode: {
+            type: String,
+            default: () => defProps.backtop.mode
+        },
+        // 自定义图标
+        icon: {
+            type: String,
+            default: () => defProps.backtop.icon
+        },
+        // 提示文字
+        text: {
+            type: String,
+            default: () => defProps.backtop.text
+        },
+        // 返回顶部滚动时间
+        duration: {
+            type: [String, Number],
+            default: () => defProps.backtop.duration
+        },
+        // 滚动距离
+        scrollTop: {
+            type: [String, Number],
+            default: () => defProps.backtop.scrollTop
+        },
+        // 距离顶部多少距离显示,单位px
+        top: {
+            type: [String, Number],
+            default: () => defProps.backtop.top
+        },
+        // 返回顶部按钮到底部的距离,单位px
+        bottom: {
+            type: [String, Number],
+            default: () => defProps.backtop.bottom
+        },
+        // 返回顶部按钮到右边的距离,单位px
+        right: {
+            type: [String, Number],
+            default: () => defProps.backtop.right
+        },
+        // 层级
+        zIndex: {
+            type: [String, Number],
+            default: () => defProps.backtop.zIndex
+        },
+        // 图标的样式,对象形式
+        iconStyle: {
+            type: Object,
+            default: () => defProps.backtop.iconStyle
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-back-top/u-back-top.vue b/uni_modules/uview-plus/components/u-back-top/u-back-top.vue
new file mode 100644
index 0000000..af287d3
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-back-top/u-back-top.vue
@@ -0,0 +1,133 @@
+<template>
+	<u-transition
+	    mode="fade"
+	    :customStyle="backTopStyle"
+	    :show="show"
+	>
+		<view
+		    class="u-back-top"
+			:style="[contentStyle]"
+		    v-if="!$slots.default && !$slots.$default"
+			@click="backToTop"
+		>
+			<u-icon
+			    :name="icon"
+			    :custom-style="iconStyle"
+			></u-icon>
+			<text
+			    v-if="text"
+			    class="u-back-top__text"
+			>{{text}}</text>
+		</view>
+		<slot v-else />
+	</u-transition>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addUnit, addStyle, getPx, deepMerge, error } from '../../libs/function/index';
+	// #ifdef APP-NVUE
+	const dom = weex.requireModule('dom')
+	// #endif
+	/**
+	 * backTop 返回顶部
+	 * @description 本组件一个用于长页面,滑动一定距离后,出现返回顶部按钮,方便快速返回顶部的场景。
+	 * @tutorial https://uview-plus.jiangruyi.com/components/backTop.html
+	 * 
+	 * @property {String}			mode  		返回顶部的形状,circle-圆形,square-方形 (默认 'circle' )
+	 * @property {String} 			icon 		自定义图标 (默认 'arrow-upward' ) 见官方文档示例
+	 * @property {String} 			text 		提示文字 
+	 * @property {String | Number}  duration	返回顶部滚动时间 (默认 100)
+	 * @property {String | Number}  scrollTop	滚动距离 (默认 0 )
+	 * @property {String | Number}  top  		距离顶部多少距离显示,单位px (默认 400 )
+	 * @property {String | Number}  bottom  	返回顶部按钮到底部的距离,单位px (默认 100 )
+	 * @property {String | Number}  right  		返回顶部按钮到右边的距离,单位px (默认 20 )
+	 * @property {String | Number}  zIndex 		层级   (默认 9 )
+	 * @property {Object<Object>}  	iconStyle 	图标的样式,对象形式   (默认 {color: '#909399',fontSize: '19px'})
+	 * @property {Object}			customStyle	定义需要用到的外部样式
+	 * 
+	 * @example <u-back-top :scrollTop="scrollTop"></u-back-top>
+	 */
+	export default {
+		name: 'u-back-top',
+		mixins: [mpMixin, mixin, props],
+		computed: {
+			backTopStyle() {
+				// 动画组件样式
+				const style = {
+					bottom: addUnit(this.bottom),
+					right: addUnit(this.right),
+					width: '40px',
+					height: '40px',
+					position: 'fixed',
+					zIndex: 10,
+				}
+				return style
+			},
+			show() {
+				return getPx(this.scrollTop) > getPx(this.top)
+			},
+			contentStyle() {
+				const style = {}
+				let radius = 0
+				// 是否圆形
+				if(this.mode === 'circle') {
+					radius = '100px'
+				} else {
+					radius = '4px'
+				}
+				// 为了兼容安卓nvue,只能这么分开写
+				style.borderTopLeftRadius = radius
+				style.borderTopRightRadius = radius
+				style.borderBottomLeftRadius = radius
+				style.borderBottomRightRadius = radius
+				return deepMerge(style, addStyle(this.customStyle))
+			}
+		},
+		emits: ["click"],
+		methods: {
+			backToTop() {
+				// #ifdef APP-NVUE
+				if (!this.$parent.$refs['u-back-top']) {
+					error(`nvue页面需要给页面最外层元素设置"ref='u-back-top'`)
+				}
+				dom.scrollToElement(this.$parent.$refs['u-back-top'], {
+					offset: 0
+				})
+				// #endif
+				
+				// #ifndef APP-NVUE
+				uni.pageScrollTo({
+					scrollTop: 0,
+					duration: this.duration
+				});
+				// #endif
+				this.$emit('click')
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import '../../libs/css/components.scss';
+     $u-back-top-flex:1 !default;
+     $u-back-top-height:100% !default;
+     $u-back-top-background-color:#E1E1E1 !default;
+     $u-back-top-tips-font-size:12px !default;
+	.u-back-top {
+		@include flex;
+		flex-direction: column;
+		align-items: center;
+		flex:$u-back-top-flex;
+		height: $u-back-top-height;
+		justify-content: center;
+		background-color: $u-back-top-background-color;
+
+		&__tips {
+			font-size:$u-back-top-tips-font-size;
+			transform: scale(0.8);
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-badge/props.js b/uni_modules/uview-plus/components/u-badge/props.js
new file mode 100644
index 0000000..25a968a
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-badge/props.js
@@ -0,0 +1,78 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 是否显示圆点
+        isDot: {
+            type: Boolean,
+            default: () => defProps.badge.isDot
+        },
+        // 显示的内容
+        value: {
+            type: [Number, String],
+            default: () => defProps.badge.value
+        },
+        // 显示的内容
+        modelValue: {
+            type: [Number, String],
+            default: () => defProps.badge.modelValue
+        },
+        // 是否显示
+        show: {
+            type: Boolean,
+            default: () => defProps.badge.show
+        },
+        // 最大值,超过最大值会显示 '{max}+'
+        max: {
+            type: [Number, String],
+            default: () => defProps.badge.max
+        },
+        // 主题类型,error|warning|success|primary
+        type: {
+            type: String,
+            default: () => defProps.badge.type
+        },
+        // 当数值为 0 时,是否展示 Badge
+        showZero: {
+            type: Boolean,
+            default: () => defProps.badge.showZero
+        },
+        // 背景颜色,优先级比type高,如设置,type参数会失效
+        bgColor: {
+            type: [String, null],
+            default: () => defProps.badge.bgColor
+        },
+        // 字体颜色
+        color: {
+            type: [String, null],
+            default: () => defProps.badge.color
+        },
+        // 徽标形状,circle-四角均为圆角,horn-左下角为直角
+        shape: {
+            type: String,
+            default: () => defProps.badge.shape
+        },
+        // 设置数字的显示方式,overflow|ellipsis|limit
+        // overflow会根据max字段判断,超出显示`${max}+`
+        // ellipsis会根据max判断,超出显示`${max}...`
+        // limit会依据1000作为判断条件,超出1000,显示`${value/1000}K`,比如2.2k、3.34w,最多保留2位小数
+        numberType: {
+            type: String,
+            default: () => defProps.badge.numberType
+        },
+        // 设置badge的位置偏移,格式为 [x, y],也即设置的为top和right的值,absolute为true时有效
+        offset: {
+            type: Array,
+            default: () => defProps.badge.offset
+        },
+        // 是否反转背景和字体颜色
+        inverted: {
+            type: Boolean,
+            default: () => defProps.badge.inverted
+        },
+        // 是否绝对定位
+        absolute: {
+            type: Boolean,
+            default: () => defProps.badge.absolute
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-badge/u-badge.vue b/uni_modules/uview-plus/components/u-badge/u-badge.vue
new file mode 100644
index 0000000..060f3ad
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-badge/u-badge.vue
@@ -0,0 +1,177 @@
+<template>
+	<text
+		v-if="show && ((Number(value) === 0 ? showZero : true) || isDot)"
+		:class="[isDot ? 'u-badge--dot' : 'u-badge--not-dot', inverted && 'u-badge--inverted', shape === 'horn' && 'u-badge--horn', `u-badge--${type}${inverted ? '--inverted' : ''}`]"
+		:style="[addStyle(customStyle), badgeStyle]"
+		class="u-badge"
+	>{{ isDot ? '' :showValue }}</text>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addStyle, addUnit } from '../../libs/function/index';
+	/**
+	 * badge 徽标数
+	 * @description 该组件一般用于图标右上角显示未读的消息数量,提示用户点击,有圆点和圆包含文字两种形式。
+	 * @tutorial https://uview-plus.jiangruyi.com/components/badge.html
+	 * 
+	 * @property {Boolean} 			isDot 		是否显示圆点 (默认 false )
+	 * @property {String | Number} 	value 		显示的内容
+	 * @property {Boolean} 			show 		是否显示 (默认 true )
+	 * @property {String | Number} 	max 		最大值,超过最大值会显示 '{max}+'  (默认999)
+	 * @property {String} 			type 		主题类型,error|warning|success|primary (默认 'error' )
+	 * @property {Boolean} 			showZero	当数值为 0 时,是否展示 Badge (默认 false )
+	 * @property {String} 			bgColor 	背景颜色,优先级比type高,如设置,type参数会失效
+	 * @property {String} 			color 		字体颜色 (默认 '#ffffff' )
+	 * @property {String} 			shape 		徽标形状,circle-四角均为圆角,horn-左下角为直角 (默认 'circle' )
+	 * @property {String} 			numberType	设置数字的显示方式,overflow|ellipsis|limit  (默认 'overflow' )
+	 * @property {Array}} 			offset		设置badge的位置偏移,格式为 [x, y],也即设置的为top和right的值,absolute为true时有效
+	 * @property {Boolean} 			inverted	是否反转背景和字体颜色(默认 false )
+	 * @property {Boolean} 			absolute	是否绝对定位(默认 false )
+	 * @property {Object}			customStyle	定义需要用到的外部样式
+	 * @example <u-badge :type="type" :count="count"></u-badge>
+	 */
+	export default {
+		name: 'u-badge',
+		mixins: [mpMixin, props, mixin],
+		computed: {
+			// 是否将badge中心与父组件右上角重合
+			boxStyle() {
+				let style = {};
+				return style;
+			},
+			// 整个组件的样式
+			badgeStyle() {
+				const style = {}
+				if(this.color) {
+					style.color = this.color
+				}
+				if (this.bgColor && !this.inverted) {
+					style.backgroundColor = this.bgColor
+				}
+				if (this.absolute) {
+					style.position = 'absolute'
+					// 如果有设置offset参数
+					if(this.offset.length) {
+						// top和right分为为offset的第一个和第二个值,如果没有第二个值,则right等于top
+						const top = this.offset[0]
+						const right = this.offset[1] || top
+						style.top = addUnit(top)
+						style.right = addUnit(right)
+					}
+				}
+				return style
+			},
+			showValue() {
+				switch (this.numberType) {
+					case "overflow":
+						return Number(this.value) > Number(this.max) ? this.max + "+" : this.value
+						break;
+					case "ellipsis":
+						return Number(this.value) > Number(this.max) ? "..." : this.value
+						break;
+					case "limit":
+						return Number(this.value) > 999 ? Number(this.value) >= 9999 ?
+							Math.floor(this.value / 1e4 * 100) / 100 + "w" : Math.floor(this.value /
+								1e3 * 100) / 100 + "k" : this.value
+						break;
+					default:
+						return Number(this.value)
+				}
+			},
+		},
+		methods: {
+			addStyle
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	$u-badge-primary: $u-primary !default;
+	$u-badge-error: $u-error !default;
+	$u-badge-success: $u-success !default;
+	$u-badge-info: $u-info !default;
+	$u-badge-warning: $u-warning !default;
+	$u-badge-dot-radius: 100px !default;
+	$u-badge-dot-size: 8px !default;
+	$u-badge-dot-right: 4px !default;
+	$u-badge-dot-top: 0 !default;
+	$u-badge-text-font-size: 11px !default;
+	$u-badge-text-right: 10px !default;
+	$u-badge-text-padding: 2px 5px !default;
+	$u-badge-text-align: center !default;
+	$u-badge-text-color: #FFFFFF !default;
+
+	.u-badge {
+		border-top-right-radius: $u-badge-dot-radius;
+		border-top-left-radius: $u-badge-dot-radius;
+		border-bottom-left-radius: $u-badge-dot-radius;
+		border-bottom-right-radius: $u-badge-dot-radius;
+		@include flex;
+		line-height: $u-badge-text-font-size;
+		text-align: $u-badge-text-align;
+		font-size: $u-badge-text-font-size;
+		color: $u-badge-text-color;
+
+		&--dot {
+			height: $u-badge-dot-size;
+			width: $u-badge-dot-size;
+		}
+		
+		&--inverted {
+			font-size: 13px;
+		}
+		
+		&--not-dot {
+			padding: $u-badge-text-padding;
+		}
+
+		&--horn {
+			border-bottom-left-radius: 0;
+		}
+
+		&--primary {
+			background-color: $u-badge-primary;
+		}
+		
+		&--primary--inverted {
+			color: $u-badge-primary;
+		}
+
+		&--error {
+			background-color: $u-badge-error;
+		}
+		
+		&--error--inverted {
+			color: $u-badge-error;
+		}
+
+		&--success {
+			background-color: $u-badge-success;
+		}
+		
+		&--success--inverted {
+			color: $u-badge-success;
+		}
+
+		&--info {
+			background-color: $u-badge-info;
+		}
+		
+		&--info--inverted {
+			color: $u-badge-info;
+		}
+
+		&--warning {
+			background-color: $u-badge-warning;
+		}
+		
+		&--warning--inverted {
+			color: $u-badge-warning;
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-button/nvue.scss b/uni_modules/uview-plus/components/u-button/nvue.scss
new file mode 100644
index 0000000..490db7d
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-button/nvue.scss
@@ -0,0 +1,46 @@
+$u-button-active-opacity:0.75 !default;
+$u-button-loading-text-margin-left:4px !default;
+$u-button-text-color: #FFFFFF !default;
+$u-button-text-plain-error-color:$u-error !default;
+$u-button-text-plain-warning-color:$u-warning !default;
+$u-button-text-plain-success-color:$u-success !default;
+$u-button-text-plain-info-color:$u-info !default;
+$u-button-text-plain-primary-color:$u-primary !default;
+.u-button {
+	&--active {
+		opacity: $u-button-active-opacity;
+	}
+	
+	&--active--plain {
+		background-color: rgb(217, 217, 217);
+	}
+	
+	&__loading-text {
+		margin-left:$u-button-loading-text-margin-left;
+	}
+	
+	&__text,
+	&__loading-text {
+		color:$u-button-text-color;
+	}
+	
+	&__text--plain--error {
+		color:$u-button-text-plain-error-color;
+	}
+	
+	&__text--plain--warning {
+		color:$u-button-text-plain-warning-color;
+	}
+	
+	&__text--plain--success{
+		color:$u-button-text-plain-success-color;
+	}
+	
+	&__text--plain--info {
+		color:$u-button-text-plain-info-color;
+	}
+	
+	&__text--plain--primary {
+		color:$u-button-text-plain-primary-color;
+	}
+}
\ No newline at end of file
diff --git a/uni_modules/uview-plus/components/u-button/props.js b/uni_modules/uview-plus/components/u-button/props.js
new file mode 100644
index 0000000..c5e7743
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-button/props.js
@@ -0,0 +1,153 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 是否细边框
+        hairline: {
+            type: Boolean,
+            default: () => defProps.button.hairline
+        },
+        // 按钮的预置样式,info,primary,error,warning,success
+        type: {
+            type: String,
+            default: () => defProps.button.type
+        },
+        // 按钮尺寸,large,normal,small,mini
+        size: {
+            type: String,
+            default: () => defProps.button.size
+        },
+        // 按钮形状,circle(两边为半圆),square(带圆角)
+        shape: {
+            type: String,
+            default: () => defProps.button.shape
+        },
+        // 按钮是否镂空
+        plain: {
+            type: Boolean,
+            default: () => defProps.button.plain
+        },
+        // 是否禁止状态
+        disabled: {
+            type: Boolean,
+            default: () => defProps.button.disabled
+        },
+        // 是否加载中
+        loading: {
+            type: Boolean,
+            default: () => defProps.button.loading
+        },
+        // 加载中提示文字
+        loadingText: {
+            type: [String, Number],
+            default: () => defProps.button.loadingText
+        },
+        // 加载状态图标类型
+        loadingMode: {
+            type: String,
+            default: () => defProps.button.loadingMode
+        },
+        // 加载图标大小
+        loadingSize: {
+            type: [String, Number],
+            default: () => defProps.button.loadingSize
+        },
+        // 开放能力,具体请看uniapp稳定关于button组件部分说明
+        // https://uniapp.dcloud.io/component/button
+        openType: {
+            type: String,
+            default: () => defProps.button.openType
+        },
+        // 用于 <form> 组件,点击分别会触发 <form> 组件的 submit/reset 事件
+        // 取值为submit(提交表单),reset(重置表单)
+        formType: {
+            type: String,
+            default: () => defProps.button.formType
+        },
+        // 打开 APP 时,向 APP 传递的参数,open-type=launchApp时有效
+        // 只微信小程序、QQ小程序有效
+        appParameter: {
+            type: String,
+            default: () => defProps.button.appParameter
+        },
+        // 指定是否阻止本节点的祖先节点出现点击态,微信小程序有效
+        hoverStopPropagation: {
+            type: Boolean,
+            default: () => defProps.button.hoverStopPropagation
+        },
+        // 指定返回用户信息的语言,zh_CN 简体中文,zh_TW 繁体中文,en 英文。只微信小程序有效
+        lang: {
+            type: String,
+            default: () => defProps.button.lang
+        },
+        // 会话来源,open-type="contact"时有效。只微信小程序有效
+        sessionFrom: {
+            type: String,
+            default: () => defProps.button.sessionFrom
+        },
+        // 会话内消息卡片标题,open-type="contact"时有效
+        // 默认当前标题,只微信小程序有效
+        sendMessageTitle: {
+            type: String,
+            default: () => defProps.button.sendMessageTitle
+        },
+        // 会话内消息卡片点击跳转小程序路径,open-type="contact"时有效
+        // 默认当前分享路径,只微信小程序有效
+        sendMessagePath: {
+            type: String,
+            default: () => defProps.button.sendMessagePath
+        },
+        // 会话内消息卡片图片,open-type="contact"时有效
+        // 默认当前页面截图,只微信小程序有效
+        sendMessageImg: {
+            type: String,
+            default: () => defProps.button.sendMessageImg
+        },
+        // 是否显示会话内消息卡片,设置此参数为 true,用户进入客服会话会在右下角显示"可能要发送的小程序"提示,
+        // 用户点击后可以快速发送小程序消息,open-type="contact"时有效
+        showMessageCard: {
+            type: Boolean,
+            default: () => defProps.button.showMessageCard
+        },
+        // 额外传参参数,用于小程序的data-xxx属性,通过target.dataset.name获取
+        dataName: {
+            type: String,
+            default: () => defProps.button.dataName
+        },
+        // 节流,一定时间内只能触发一次
+        throttleTime: {
+            type: [String, Number],
+            default: () => defProps.button.throttleTime
+        },
+        // 按住后多久出现点击态,单位毫秒
+        hoverStartTime: {
+            type: [String, Number],
+            default: () => defProps.button.hoverStartTime
+        },
+        // 手指松开后点击态保留时间,单位毫秒
+        hoverStayTime: {
+            type: [String, Number],
+            default: () => defProps.button.hoverStayTime
+        },
+        // 按钮文字,之所以通过props传入,是因为slot传入的话
+        // nvue中无法控制文字的样式
+        text: {
+            type: [String, Number],
+            default: () => defProps.button.text
+        },
+        // 按钮图标
+        icon: {
+            type: String,
+            default: () => defProps.button.icon
+        },
+        // 按钮图标
+        iconColor: {
+            type: String,
+            default: () => defProps.button.icon
+        },
+        // 按钮颜色,支持传入linear-gradient渐变色
+        color: {
+            type: String,
+            default: () => defProps.button.color
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-button/u-button.vue b/uni_modules/uview-plus/components/u-button/u-button.vue
new file mode 100644
index 0000000..1f403f7
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-button/u-button.vue
@@ -0,0 +1,503 @@
+<template>
+    <!-- #ifndef APP-NVUE -->
+    <button
+        :hover-start-time="Number(hoverStartTime)"
+        :hover-stay-time="Number(hoverStayTime)"
+        :form-type="formType"
+        :open-type="openType"
+        :app-parameter="appParameter"
+        :hover-stop-propagation="hoverStopPropagation"
+        :send-message-title="sendMessageTitle"
+        :send-message-path="sendMessagePath"
+        :lang="lang"
+        :data-name="dataName"
+        :session-from="sessionFrom"
+        :send-message-img="sendMessageImg"
+        :show-message-card="showMessageCard"
+        @getphonenumber="getphonenumber"
+        @getuserinfo="getuserinfo"
+        @error="error"
+        @opensetting="opensetting"
+        @launchapp="launchapp"
+        @agreeprivacyauthorization="agreeprivacyauthorization"
+        :hover-class="!disabled && !loading ? 'u-button--active' : ''"
+        class="u-button u-reset-button"
+        :style="[baseColor, addStyle(customStyle)]"
+        @tap="clickHandler"
+        :class="bemClass"
+    >
+        <template v-if="loading">
+            <u-loading-icon
+                :mode="loadingMode"
+                :size="loadingSize * 1.15"
+                :color="loadingColor"
+            ></u-loading-icon>
+            <text
+                class="u-button__loading-text"
+                :style="[{ fontSize: textSize + 'px' }]"
+                >{{ loadingText || text }}</text
+            >
+        </template>
+        <template v-else>
+            <u-icon
+                v-if="icon"
+                :name="icon"
+                :color="iconColorCom"
+                :size="textSize * 1.35"
+                :customStyle="{ marginRight: '2px' }"
+            ></u-icon>
+            <slot>
+                <text
+                    class="u-button__text"
+                    :style="[{ fontSize: textSize + 'px' }]"
+                    >{{ text }}</text
+                >
+            </slot>
+        </template>
+    </button>
+    <!-- #endif -->
+
+    <!-- #ifdef APP-NVUE -->
+    <view
+        :hover-start-time="Number(hoverStartTime)"
+        :hover-stay-time="Number(hoverStayTime)"
+        class="u-button"
+        :hover-class="
+            !disabled && !loading && !color && (plain || type === 'info')
+                ? 'u-button--active--plain'
+                : !disabled && !loading && !plain
+                ? 'u-button--active'
+                : ''
+        "
+        @tap="clickHandler"
+        :class="bemClass"
+        :style="[baseColor, addStyle(customStyle)]"
+    >
+        <template v-if="loading">
+            <u-loading-icon
+                :mode="loadingMode"
+                :size="loadingSize * 1.15"
+                :color="loadingColor"
+            ></u-loading-icon>
+            <text
+                class="u-button__loading-text"
+                :style="[nvueTextStyle]"
+                :class="[plain && `u-button__text--plain--${type}`]"
+                >{{ loadingText || text }}</text
+            >
+        </template>
+        <template v-else>
+            <u-icon
+                v-if="icon"
+                :name="icon"
+                :color="iconColorCom"
+                :size="textSize * 1.35"
+            ></u-icon>
+            <text
+                class="u-button__text"
+                :style="[
+                    {
+                        marginLeft: icon ? '2px' : 0,
+                    },
+                    nvueTextStyle,
+                ]"
+                :class="[plain && `u-button__text--plain--${type}`]"
+                >{{ text }}</text
+            >
+        </template>
+    </view>
+    <!-- #endif -->
+</template>
+
+<script lang="ts">
+import button from "../../libs/mixin/button";
+import openType from "../../libs/mixin/openType";
+import mpMixin from '../../libs/mixin/mpMixin';
+import mixin from '../../libs/mixin/mixin';
+import props from "./props";
+import { addStyle } from '../../libs/function/index';
+import { throttle } from '../../libs/function/throttle';
+import color from '../../libs/config/color';
+/**
+ * button 按钮
+ * @description Button 按钮
+ * @tutorial https://ijry.github.io/uview-plus/components/button.html
+ *
+ * @property {Boolean}			hairline				是否显示按钮的细边框 (默认 true )
+ * @property {String}			type					按钮的预置样式,info,primary,error,warning,success (默认 'info' )
+ * @property {String}			size					按钮尺寸,large,normal,mini (默认 normal)
+ * @property {String}			shape					按钮形状,circle(两边为半圆),square(带圆角) (默认 'square' )
+ * @property {Boolean}			plain					按钮是否镂空,背景色透明 (默认 false)
+ * @property {Boolean}			disabled				是否禁用 (默认 false)
+ * @property {Boolean}			loading					按钮名称前是否带 loading 图标(App-nvue 平台,在 ios 上为雪花,Android上为圆圈) (默认 false)
+ * @property {String | Number}	loadingText				加载中提示文字
+ * @property {String}			loadingMode				加载状态图标类型 (默认 'spinner' )
+ * @property {String | Number}	loadingSize				加载图标大小 (默认 15 )
+ * @property {String}			openType				开放能力,具体请看uniapp稳定关于button组件部分说明
+ * @property {String}			formType				用于 <form> 组件,点击分别会触发 <form> 组件的 submit/reset 事件
+ * @property {String}			appParameter			打开 APP 时,向 APP 传递的参数,open-type=launchApp时有效 (注:只微信小程序、QQ小程序有效)
+ * @property {Boolean}			hoverStopPropagation	指定是否阻止本节点的祖先节点出现点击态,微信小程序有效(默认 true )
+ * @property {String}			lang					指定返回用户信息的语言,zh_CN 简体中文,zh_TW 繁体中文,en 英文(默认 en )
+ * @property {String}			sessionFrom				会话来源,openType="contact"时有效
+ * @property {String}			sendMessageTitle		会话内消息卡片标题,openType="contact"时有效
+ * @property {String}			sendMessagePath			会话内消息卡片点击跳转小程序路径,openType="contact"时有效
+ * @property {String}			sendMessageImg			会话内消息卡片图片,openType="contact"时有效
+ * @property {Boolean}			showMessageCard			是否显示会话内消息卡片,设置此参数为 true,用户进入客服会话会在右下角显示"可能要发送的小程序"提示,用户点击后可以快速发送小程序消息,openType="contact"时有效(默认false)
+ * @property {String}			dataName				额外传参参数,用于小程序的data-xxx属性,通过target.dataset.name获取
+ * @property {String | Number}	throttleTime			节流,一定时间内只能触发一次 (默认 0 )
+ * @property {String | Number}	hoverStartTime			按住后多久出现点击态,单位毫秒 (默认 0 )
+ * @property {String | Number}	hoverStayTime			手指松开后点击态保留时间,单位毫秒 (默认 200 )
+ * @property {String | Number}	text					按钮文字,之所以通过props传入,是因为slot传入的话(注:nvue中无法控制文字的样式)
+ * @property {String}			icon					按钮图标
+ * @property {String}			iconColor				按钮图标颜色
+ * @property {String}			color					按钮颜色,支持传入linear-gradient渐变色
+ * @property {Object}			customStyle				定义需要用到的外部样式
+ *
+ * @event {Function}	click			非禁止并且非加载中,才能点击
+ * @event {Function}	getphonenumber	open-type="getPhoneNumber"时有效
+ * @event {Function}	getuserinfo		用户点击该按钮时,会返回获取到的用户信息,从返回参数的detail中获取到的值同uni.getUserInfo
+ * @event {Function}	error			当使用开放能力时,发生错误的回调
+ * @event {Function}	opensetting		在打开授权设置页并关闭后回调
+ * @event {Function}	launchapp		打开 APP 成功的回调
+ * @event {Function}	agreeprivacyauthorization	用户同意隐私协议事件回调
+ * @example <u-button>月落</u-button>
+ */
+export default {
+    name: "u-button",
+    // #ifdef MP
+    mixins: [mpMixin, mixin, button, openType, props],
+    // #endif
+    // #ifndef MP
+    mixins: [mpMixin, mixin, props],
+    // #endif
+    data() {
+        return {};
+    },
+    computed: {
+        // 生成bem风格的类名
+        bemClass() {
+            // this.bem为一个computed变量,在mixin中
+            if (!this.color) {
+                return this.bem(
+                    "button",
+                    ["type", "shape", "size"],
+                    ["disabled", "plain", "hairline"]
+                );
+            } else {
+                // 由于nvue的原因,在有color参数时,不需要传入type,否则会生成type相关的类型,影响最终的样式
+                return this.bem(
+                    "button",
+                    ["shape", "size"],
+                    ["disabled", "plain", "hairline"]
+                );
+            }
+        },
+        loadingColor() {
+            if (this.plain) {
+                // 如果有设置color值,则用color值,否则使用type主题颜色
+                return this.color
+                    ? this.color
+                    : color[`u-${this.type}`];
+            }
+            if (this.type === "info") {
+                return "#c9c9c9";
+            }
+            return "rgb(200, 200, 200)";
+        },
+        iconColorCom() {
+            // 如果是镂空状态,设置了color就用color值,否则使用主题颜色,
+            // u-icon的color能接受一个主题颜色的值
+			if (this.iconColor) return this.iconColor;
+			if (this.plain) {
+                return this.color ? this.color : this.type;
+            } else {
+                return this.type === "info" ? "#000000" : "#ffffff";
+            }
+        },
+        baseColor() {
+            let style = {};
+            if (this.color) {
+                // 针对自定义了color颜色的情况,镂空状态下,就是用自定义的颜色
+                style.color = this.plain ? this.color : "white";
+                if (!this.plain) {
+                    // 非镂空,背景色使用自定义的颜色
+                    style["background-color"] = this.color;
+                }
+                if (this.color.indexOf("gradient") !== -1) {
+                    // 如果自定义的颜色为渐变色,不显示边框,以及通过backgroundImage设置渐变色
+                    // weex文档说明可以写borderWidth的形式,为什么这里需要分开写?
+                    // 因为weex是阿里巴巴为了部门业绩考核而做的你懂的东西,所以需要这么写才有效
+                    style.borderTopWidth = 0;
+                    style.borderRightWidth = 0;
+                    style.borderBottomWidth = 0;
+                    style.borderLeftWidth = 0;
+                    if (!this.plain) {
+                        style.backgroundImage = this.color;
+                    }
+                } else {
+                    // 非渐变色,则设置边框相关的属性
+                    style.borderColor = this.color;
+                    style.borderWidth = "1px";
+                    style.borderStyle = "solid";
+                }
+            }
+            return style;
+        },
+        // nvue版本按钮的字体不会继承父组件的颜色,需要对每一个text组件进行单独的设置
+        nvueTextStyle() {
+            let style = {};
+            // 针对自定义了color颜色的情况,镂空状态下,就是用自定义的颜色
+            if (this.type === "info") {
+                style.color = "#323233";
+            }
+            if (this.color) {
+                style.color = this.plain ? this.color : "white";
+            }
+            style.fontSize = this.textSize + "px";
+            return style;
+        },
+        // 字体大小
+        textSize() {
+            let fontSize = 14,
+                { size } = this;
+            if (size === "large") fontSize = 16;
+            if (size === "normal") fontSize = 14;
+            if (size === "small") fontSize = 12;
+            if (size === "mini") fontSize = 10;
+            return fontSize;
+        },
+    },
+	emits: ['click', 'getphonenumber', 'getuserinfo',
+		'error', 'opensetting', 'launchapp', 'agreeprivacyauthorization'],
+    methods: {
+        addStyle,
+        clickHandler() {
+            // 非禁止并且非加载中,才能点击
+            if (!this.disabled && !this.loading) {
+				// 进行节流控制,每this.throttle毫秒内,只在开始处执行
+				throttle(() => {
+					this.$emit("click");
+				}, this.throttleTime);
+            }
+        },
+        // 下面为对接uniapp官方按钮开放能力事件回调的对接
+        getphonenumber(res: any) {
+            this.$emit("getphonenumber", res);
+        },
+        getuserinfo(res: any) {
+            this.$emit("getuserinfo", res);
+        },
+        error(res: any) {
+            this.$emit("error", res);
+        },
+        opensetting(res: any) {
+            this.$emit("opensetting", res);
+        },
+        launchapp(res: any) {
+            this.$emit("launchapp", res);
+        },
+        agreeprivacyauthorization(res) {
+            this.$emit("agreeprivacyauthorization", res);
+        },
+    },
+};
+</script>
+
+<style lang="scss" scoped>
+@import "../../libs/css/components.scss";
+
+/* #ifndef APP-NVUE */
+@import "./vue.scss";
+/* #endif */
+
+/* #ifdef APP-NVUE */
+@import "./nvue.scss";
+/* #endif */
+
+$u-button-u-button-height: 40px !default;
+$u-button-text-font-size: 15px !default;
+$u-button-loading-text-font-size: 15px !default;
+$u-button-loading-text-margin-left: 4px !default;
+$u-button-large-width: 100% !default;
+$u-button-large-height: 50px !default;
+$u-button-normal-padding: 0 12px !default;
+$u-button-large-padding: 0 15px !default;
+$u-button-normal-font-size: 14px !default;
+$u-button-small-min-width: 60px !default;
+$u-button-small-height: 30px !default;
+$u-button-small-padding: 0px 8px !default;
+$u-button-mini-padding: 0px 8px !default;
+$u-button-small-font-size: 12px !default;
+$u-button-mini-height: 22px !default;
+$u-button-mini-font-size: 10px !default;
+$u-button-mini-min-width: 50px !default;
+$u-button-disabled-opacity: 0.5 !default;
+$u-button-info-color: #323233 !default;
+$u-button-info-background-color: #fff !default;
+$u-button-info-border-color: #ebedf0 !default;
+$u-button-info-border-width: 1px !default;
+$u-button-info-border-style: solid !default;
+$u-button-success-color: #fff !default;
+$u-button-success-background-color: $u-success !default;
+$u-button-success-border-color: $u-button-success-background-color !default;
+$u-button-success-border-width: 1px !default;
+$u-button-success-border-style: solid !default;
+$u-button-primary-color: #fff !default;
+$u-button-primary-background-color: $u-primary !default;
+$u-button-primary-border-color: $u-button-primary-background-color !default;
+$u-button-primary-border-width: 1px !default;
+$u-button-primary-border-style: solid !default;
+$u-button-error-color: #fff !default;
+$u-button-error-background-color: $u-error !default;
+$u-button-error-border-color: $u-button-error-background-color !default;
+$u-button-error-border-width: 1px !default;
+$u-button-error-border-style: solid !default;
+$u-button-warning-color: #fff !default;
+$u-button-warning-background-color: $u-warning !default;
+$u-button-warning-border-color: $u-button-warning-background-color !default;
+$u-button-warning-border-width: 1px !default;
+$u-button-warning-border-style: solid !default;
+$u-button-block-width: 100% !default;
+$u-button-circle-border-top-right-radius: 100px !default;
+$u-button-circle-border-top-left-radius: 100px !default;
+$u-button-circle-border-bottom-left-radius: 100px !default;
+$u-button-circle-border-bottom-right-radius: 100px !default;
+$u-button-square-border-top-right-radius: 3px !default;
+$u-button-square-border-top-left-radius: 3px !default;
+$u-button-square-border-bottom-left-radius: 3px !default;
+$u-button-square-border-bottom-right-radius: 3px !default;
+$u-button-icon-min-width: 1em !default;
+$u-button-plain-background-color: #fff !default;
+$u-button-hairline-border-width: 0.5px !default;
+
+.u-button {
+    height: $u-button-u-button-height;
+    position: relative;
+    align-items: center;
+    justify-content: center;
+    @include flex;
+    /* #ifndef APP-NVUE */
+    box-sizing: border-box;
+    /* #endif */
+    flex-direction: row;
+
+    &__text {
+        font-size: $u-button-text-font-size;
+    }
+
+    &__loading-text {
+        font-size: $u-button-loading-text-font-size;
+        margin-left: $u-button-loading-text-margin-left;
+    }
+
+    &--large {
+        /* #ifndef APP-NVUE */
+        width: $u-button-large-width;
+        /* #endif */
+        height: $u-button-large-height;
+        padding: $u-button-large-padding;
+    }
+
+    &--normal {
+        padding: $u-button-normal-padding;
+        font-size: $u-button-normal-font-size;
+    }
+
+    &--small {
+        /* #ifndef APP-NVUE */
+        min-width: $u-button-small-min-width;
+        /* #endif */
+        height: $u-button-small-height;
+        padding: $u-button-small-padding;
+        font-size: $u-button-small-font-size;
+    }
+
+    &--mini {
+        height: $u-button-mini-height;
+        font-size: $u-button-mini-font-size;
+        /* #ifndef APP-NVUE */
+        min-width: $u-button-mini-min-width;
+        /* #endif */
+        padding: $u-button-mini-padding;
+    }
+
+    &--disabled {
+        opacity: $u-button-disabled-opacity;
+    }
+
+    &--info {
+        color: $u-button-info-color;
+        background-color: $u-button-info-background-color;
+        border-color: $u-button-info-border-color;
+        border-width: $u-button-info-border-width;
+        border-style: $u-button-info-border-style;
+    }
+
+    &--success {
+        color: $u-button-success-color;
+        background-color: $u-button-success-background-color;
+        border-color: $u-button-success-border-color;
+        border-width: $u-button-success-border-width;
+        border-style: $u-button-success-border-style;
+    }
+
+    &--primary {
+        color: $u-button-primary-color;
+        background-color: $u-button-primary-background-color;
+        border-color: $u-button-primary-border-color;
+        border-width: $u-button-primary-border-width;
+        border-style: $u-button-primary-border-style;
+    }
+
+    &--error {
+        color: $u-button-error-color;
+        background-color: $u-button-error-background-color;
+        border-color: $u-button-error-border-color;
+        border-width: $u-button-error-border-width;
+        border-style: $u-button-error-border-style;
+    }
+
+    &--warning {
+        color: $u-button-warning-color;
+        background-color: $u-button-warning-background-color;
+        border-color: $u-button-warning-border-color;
+        border-width: $u-button-warning-border-width;
+        border-style: $u-button-warning-border-style;
+    }
+
+    &--block {
+        @include flex;
+        width: $u-button-block-width;
+    }
+
+    &--circle {
+        border-top-right-radius: $u-button-circle-border-top-right-radius;
+        border-top-left-radius: $u-button-circle-border-top-left-radius;
+        border-bottom-left-radius: $u-button-circle-border-bottom-left-radius;
+        border-bottom-right-radius: $u-button-circle-border-bottom-right-radius;
+    }
+
+    &--square {
+        border-bottom-left-radius: $u-button-square-border-top-right-radius;
+        border-bottom-right-radius: $u-button-square-border-top-left-radius;
+        border-top-left-radius: $u-button-square-border-bottom-left-radius;
+        border-top-right-radius: $u-button-square-border-bottom-right-radius;
+    }
+
+    &__icon {
+        /* #ifndef APP-NVUE */
+        min-width: $u-button-icon-min-width;
+        line-height: inherit !important;
+        vertical-align: top;
+        /* #endif */
+    }
+
+    &--plain {
+        background-color: $u-button-plain-background-color;
+    }
+
+    &--hairline {
+        border-width: $u-button-hairline-border-width !important;
+    }
+}
+</style>
diff --git a/uni_modules/uview-plus/components/u-button/vue.scss b/uni_modules/uview-plus/components/u-button/vue.scss
new file mode 100644
index 0000000..ceb6cea
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-button/vue.scss
@@ -0,0 +1,81 @@
+// nvue下hover-class无效
+$u-button-before-top:50% !default;
+$u-button-before-left:50% !default;
+$u-button-before-width:100% !default;
+$u-button-before-height:100% !default;
+$u-button-before-transform:translate(-50%, -50%) !default;
+$u-button-before-opacity:0 !default;
+$u-button-before-background-color:#000 !default;
+$u-button-before-border-color:#000 !default;
+$u-button-active-before-opacity:.15 !default;
+$u-button-icon-margin-left:4px !default;
+$u-button-plain-u-button-info-color:$u-info;
+$u-button-plain-u-button-success-color:$u-success;
+$u-button-plain-u-button-error-color:$u-error;
+$u-button-plain-u-button-warning-color:$u-error;
+
+.u-button {
+	width: 100%;
+	white-space: nowrap;
+	
+	&__text {
+		white-space: nowrap;
+		line-height: 1;
+	}
+	
+	&:before {
+		position: absolute;
+		top:$u-button-before-top;
+		left:$u-button-before-left;
+		width:$u-button-before-width;
+		height:$u-button-before-height;
+		border: inherit;
+		border-radius: inherit;
+		transform:$u-button-before-transform;
+		opacity:$u-button-before-opacity;
+		content: " ";
+		background-color:$u-button-before-background-color;
+		border-color:$u-button-before-border-color;
+	}
+	
+	&--active {
+		&:before {
+			opacity: .15
+		}
+	}
+	
+	&__icon+&__text:not(:empty),
+	&__loading-text {
+		margin-left:$u-button-icon-margin-left;
+	}
+	
+	&--plain {
+		&.u-button--primary {
+			color: $u-primary;
+		}
+	}
+	
+	&--plain {
+		&.u-button--info {
+			color:$u-button-plain-u-button-info-color;
+		}
+	}
+	
+	&--plain {
+		&.u-button--success {
+			color:$u-button-plain-u-button-success-color;
+		}
+	}
+	
+	&--plain {
+		&.u-button--error {
+			color:$u-button-plain-u-button-error-color;
+		}
+	}
+	
+	&--plain {
+		&.u-button--warning {
+			color:$u-button-plain-u-button-warning-color;
+		}
+	}
+}
diff --git a/uni_modules/uview-plus/components/u-calendar/header.vue b/uni_modules/uview-plus/components/u-calendar/header.vue
new file mode 100644
index 0000000..e29695c
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-calendar/header.vue
@@ -0,0 +1,101 @@
+<template>
+	<view class="u-calendar-header u-border-bottom">
+		<text
+			class="u-calendar-header__title"
+			v-if="showTitle"
+		>{{ title }}</text>
+		<text
+			class="u-calendar-header__subtitle"
+			v-if="showSubtitle"
+		>{{ subtitle }}</text>
+		<view class="u-calendar-header__weekdays">
+			<text class="u-calendar-header__weekdays__weekday">一</text>
+			<text class="u-calendar-header__weekdays__weekday">二</text>
+			<text class="u-calendar-header__weekdays__weekday">三</text>
+			<text class="u-calendar-header__weekdays__weekday">四</text>
+			<text class="u-calendar-header__weekdays__weekday">五</text>
+			<text class="u-calendar-header__weekdays__weekday">六</text>
+			<text class="u-calendar-header__weekdays__weekday">日</text>
+		</view>
+	</view>
+</template>
+
+<script>
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	export default {
+		name: 'u-calendar-header',
+		mixins: [mpMixin, mixin],
+		props: {
+			// 标题
+			title: {
+				type: String,
+				default: ''
+			},
+			// 副标题
+			subtitle: {
+				type: String,
+				default: ''
+			},
+			// 是否显示标题
+			showTitle: {
+				type: Boolean,
+				default: true
+			},
+			// 是否显示副标题
+			showSubtitle: {
+				type: Boolean,
+				default: true
+			},
+		},
+		data() {
+			return {
+
+			}
+		},
+		methods: {
+			name() {
+
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-calendar-header {
+		padding-bottom: 4px;
+
+		&__title {
+			font-size: 16px;
+			color: $u-main-color;
+			text-align: center;
+			height: 42px;
+			line-height: 42px;
+			font-weight: bold;
+		}
+
+		&__subtitle {
+			font-size: 14px;
+			color: $u-main-color;
+			height: 40px;
+			text-align: center;
+			line-height: 40px;
+			font-weight: bold;
+		}
+
+		&__weekdays {
+			@include flex;
+			justify-content: space-between;
+
+			&__weekday {
+				font-size: 13px;
+				color: $u-main-color;
+				line-height: 30px;
+				flex: 1;
+				text-align: center;
+			}
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-calendar/month.vue b/uni_modules/uview-plus/components/u-calendar/month.vue
new file mode 100644
index 0000000..df959f6
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-calendar/month.vue
@@ -0,0 +1,585 @@
+<template>
+	<view class="u-calendar-month-wrapper" ref="u-calendar-month-wrapper">
+		<view v-for="(item, index) in months" :key="index" :class="[`u-calendar-month-${index}`]"
+			:ref="`u-calendar-month-${index}`" :id="`month-${index}`">
+			<text v-if="index !== 0" class="u-calendar-month__title">{{ item.year }}年{{ item.month }}月</text>
+			<view class="u-calendar-month__days">
+				<view v-if="showMark" class="u-calendar-month__days__month-mark-wrapper">
+					<text class="u-calendar-month__days__month-mark-wrapper__text">{{ item.month }}</text>
+				</view>
+				<view class="u-calendar-month__days__day" v-for="(item1, index1) in item.date" :key="index1"
+					:style="[dayStyle(index, index1, item1)]" @tap="clickHandler(index, index1, item1)"
+					:class="[item1.selected && 'u-calendar-month__days__day__select--selected']">
+					<view class="u-calendar-month__days__day__select" :style="[daySelectStyle(index, index1, item1)]">
+						<text class="u-calendar-month__days__day__select__info"
+							:class="[item1.disabled && 'u-calendar-month__days__day__select__info--disabled']"
+							:style="[textStyle(item1)]">{{ item1.day }}</text>
+						<text v-if="getBottomInfo(index, index1, item1)"
+							class="u-calendar-month__days__day__select__buttom-info"
+							:class="[item1.disabled && 'u-calendar-month__days__day__select__buttom-info--disabled']"
+							:style="[textStyle(item1)]">{{ getBottomInfo(index, index1, item1) }}</text>
+						<text v-if="item1.dot" class="u-calendar-month__days__day__select__dot"></text>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	// #ifdef APP-NVUE
+	// 由于nvue不支持百分比单位,需要查询宽度来计算每个日期的宽度
+	const dom = uni.requireNativePlugin('dom')
+	// #endif
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addUnit, deepClone, toast, sleep } from '../../libs/function/index';
+	import { colorGradient } from '../../libs/function/colorGradient';
+	import test from '../../libs/function/test';
+	import defProps from '../../libs/config/props';
+	import dayjs from 'dayjs/esm/index'
+	export default {
+		name: 'u-calendar-month',
+		mixins: [mpMixin, mixin],
+		props: {
+			// 是否显示月份背景色
+			showMark: {
+				type: Boolean,
+				default: true
+			},
+			// 主题色,对底部按钮和选中日期有效
+			color: {
+				type: String,
+				default: '#3c9cff'
+			},
+			// 月份数据
+			months: {
+				type: Array,
+				default: () => []
+			},
+			// 日期选择类型
+			mode: {
+				type: String,
+				default: 'single'
+			},
+			// 日期行高
+			rowHeight: {
+				type: [String, Number],
+				default: 58
+			},
+			// mode=multiple时,最多可选多少个日期
+			maxCount: {
+				type: [String, Number],
+				default: Infinity
+			},
+			// mode=range时,第一个日期底部的提示文字
+			startText: {
+				type: String,
+				default: '开始'
+			},
+			// mode=range时,最后一个日期底部的提示文字
+			endText: {
+				type: String,
+				default: '结束'
+			},
+			// 默认选中的日期,mode为multiple或range是必须为数组格式
+			defaultDate: {
+				type: [Array, String, Date],
+				default: null
+			},
+			// 最小的可选日期
+			minDate: {
+				type: [String, Number],
+				default: 0
+			},
+			// 最大可选日期
+			maxDate: {
+				type: [String, Number],
+				default: 0
+			},
+			// 如果没有设置maxDate,则往后推多少个月
+			maxMonth: {
+				type: [String, Number],
+				default: 2
+			},
+			// 是否为只读状态,只读状态下禁止选择日期
+			readonly: {
+				type: Boolean,
+				default: () => defProps.calendar.readonly
+			},
+			// 日期区间最多可选天数,默认无限制,mode = range时有效
+			maxRange: {
+				type: [Number, String],
+				default: Infinity
+			},
+			// 范围选择超过最多可选天数时的提示文案,mode = range时有效
+			rangePrompt: {
+				type: String,
+				default: ''
+			},
+			// 范围选择超过最多可选天数时,是否展示提示文案,mode = range时有效
+			showRangePrompt: {
+				type: Boolean,
+				default: true
+			},
+			// 是否允许日期范围的起止时间为同一天,mode = range时有效
+			allowSameDay: {
+				type: Boolean,
+				default: false
+			}
+		},
+		data() {
+			return {
+				// 每个日期的宽度
+				width: 0,
+				// 当前选中的日期item
+				item: {},
+				selected: []
+			}
+		},
+		watch: {
+			selectedChange: {
+				immediate: true,
+				handler(n) {
+					this.setDefaultDate()
+				}
+			}
+		},
+		computed: {
+			// 多个条件的变化,会引起选中日期的变化,这里统一管理监听
+			selectedChange() {
+				return [this.minDate, this.maxDate, this.defaultDate]
+			},
+			dayStyle(index1, index2, item) {
+				return (index1, index2, item) => {
+					const style = {}
+					let week = item.week
+					// 不进行四舍五入的形式保留2位小数
+					const dayWidth = Number(parseFloat(this.width / 7).toFixed(3).slice(0, -1))
+					// 得出每个日期的宽度
+					// #ifdef APP-NVUE
+					style.width = addUnit(dayWidth)
+					// #endif
+					style.height = addUnit(this.rowHeight)
+					if (index2 === 0) {
+						// 获取当前为星期几,如果为0,则为星期天,减一为每月第一天时,需要向左偏移的item个数
+						week = (week === 0 ? 7 : week) - 1
+						style.marginLeft = addUnit(week * dayWidth)
+					}
+					if (this.mode === 'range') {
+						// 之所以需要这么写,是因为DCloud公司的iOS客户端的开发者能力有限导致的bug
+						style.paddingLeft = 0
+						style.paddingRight = 0
+						style.paddingBottom = 0
+						style.paddingTop = 0
+					}
+					return style
+				}
+			},
+			daySelectStyle() {
+				return (index1, index2, item) => {
+					let date = dayjs(item.date).format("YYYY-MM-DD"),
+						style = {}
+					// 判断date是否在selected数组中,因为月份可能会需要补0,所以使用dateSame判断,而不用数组的includes判断
+					if (this.selected.some(item => this.dateSame(item, date))) {
+						style.backgroundColor = this.color
+					}
+					if (this.mode === 'single') {
+						if (date === this.selected[0]) {
+							// 因为需要对nvue的兼容,只能这么写,无法缩写,也无法通过类名控制等等
+							style.borderTopLeftRadius = '3px'
+							style.borderBottomLeftRadius = '3px'
+							style.borderTopRightRadius = '3px'
+							style.borderBottomRightRadius = '3px'
+						}
+					} else if (this.mode === 'range') {
+						if (this.selected.length >= 2) {
+							const len = this.selected.length - 1
+							// 第一个日期设置左上角和左下角的圆角
+							if (this.dateSame(date, this.selected[0])) {
+								style.borderTopLeftRadius = '3px'
+								style.borderBottomLeftRadius = '3px'
+							}
+							// 最后一个日期设置右上角和右下角的圆角
+							if (this.dateSame(date, this.selected[len])) {
+								style.borderTopRightRadius = '3px'
+								style.borderBottomRightRadius = '3px'
+							}
+							// 处于第一和最后一个之间的日期,背景色设置为浅色,通过将对应颜色进行等分,再取其尾部的颜色值
+							if (dayjs(date).isAfter(dayjs(this.selected[0])) && dayjs(date).isBefore(dayjs(this
+									.selected[len]))) {
+								style.backgroundColor = colorGradient(this.color, '#ffffff', 100)[90]
+								// 增加一个透明度,让范围区间的背景色也能看到底部的mark水印字符
+								style.opacity = 0.7
+							}
+						} else if (this.selected.length === 1) {
+							// 之所以需要这么写,是因为DCloud公司的iOS客户端的开发者能力有限导致的bug
+							// 进行还原操作,否则在nvue的iOS,uni-app有bug,会导致诡异的表现
+							style.borderTopLeftRadius = '3px'
+							style.borderBottomLeftRadius = '3px'
+						}
+					} else {
+						if (this.selected.some(item => this.dateSame(item, date))) {
+							style.borderTopLeftRadius = '3px'
+							style.borderBottomLeftRadius = '3px'
+							style.borderTopRightRadius = '3px'
+							style.borderBottomRightRadius = '3px'
+						}
+					}
+					return style
+				}
+			},
+			// 某个日期是否被选中
+			textStyle() {
+				return (item) => {
+					const date = dayjs(item.date).format("YYYY-MM-DD"),
+						style = {}
+					// 选中的日期,提示文字设置白色
+					if (this.selected.some(item => this.dateSame(item, date))) {
+						style.color = '#ffffff'
+					}
+					if (this.mode === 'range') {
+						const len = this.selected.length - 1
+						// 如果是范围选择模式,第一个和最后一个之间的日期,文字颜色设置为高亮的主题色
+						if (dayjs(date).isAfter(dayjs(this.selected[0])) && dayjs(date).isBefore(dayjs(this
+								.selected[len]))) {
+							style.color = this.color
+						}
+					}
+					return style
+				}
+			},
+			// 获取底部的提示文字
+			getBottomInfo() {
+				return (index1, index2, item) => {
+					const date = dayjs(item.date).format("YYYY-MM-DD")
+					const bottomInfo = item.bottomInfo
+					// 当为日期范围模式时,且选择的日期个数大于0时
+					if (this.mode === 'range' && this.selected.length > 0) {
+						if (this.selected.length === 1) {
+							// 选择了一个日期时,如果当前日期为数组中的第一个日期,则显示底部文字为“开始”
+							if (this.dateSame(date, this.selected[0])) return this.startText
+							else return bottomInfo
+						} else {
+							const len = this.selected.length - 1
+							// 如果数组中的日期大于2个时,第一个和最后一个显示为开始和结束日期
+							if (this.dateSame(date, this.selected[0]) && this.dateSame(date, this.selected[1]) &&
+								len === 1) {
+								// 如果长度为2,且第一个等于第二个日期,则提示语放在同一个item中
+								return `${this.startText}/${this.endText}`
+							} else if (this.dateSame(date, this.selected[0])) {
+								return this.startText
+							} else if (this.dateSame(date, this.selected[len])) {
+								return this.endText
+							} else {
+								return bottomInfo
+							}
+						}
+					} else {
+						return bottomInfo
+					}
+				}
+			}
+		},
+		mounted() {
+			this.init()
+		},
+		methods: {
+			init() {
+				// 初始化默认选中
+				this.$emit('monthSelected', this.selected)
+				this.$nextTick(() => {
+					// 这里需要另一个延时,因为获取宽度后,会进行月份数据渲染,只有渲染完成之后,才有真正的高度
+					// 因为nvue下,$nextTick并不是100%可靠的
+					sleep(10).then(() => {
+						this.getWrapperWidth()
+						this.getMonthRect()
+					})
+				})
+			},
+			// 判断两个日期是否相等
+			dateSame(date1, date2) {
+				return dayjs(date1).isSame(dayjs(date2))
+			},
+			// 获取月份数据区域的宽度,因为nvue不支持百分比,所以无法通过css设置每个日期item的宽度
+			getWrapperWidth() {
+				// #ifdef APP-NVUE
+				dom.getComponentRect(this.$refs['u-calendar-month-wrapper'], res => {
+					this.width = res.size.width
+				})
+				// #endif
+				// #ifndef APP-NVUE
+				this.$uGetRect('.u-calendar-month-wrapper').then(size => {
+					this.width = size.width
+				})
+				// #endif
+			},
+			getMonthRect() {
+				// 获取每个月份数据的尺寸,用于父组件在scroll-view滚动事件中,监听当前滚动到了第几个月份
+				const promiseAllArr = this.months.map((item, index) => this.getMonthRectByPromise(
+					`u-calendar-month-${index}`))
+				// 一次性返回
+				Promise.all(promiseAllArr).then(
+					sizes => {
+						let height = 1
+						const topArr = []
+						for (let i = 0; i < this.months.length; i++) {
+							// 添加到months数组中,供scroll-view滚动事件中,判断当前滚动到哪个月份
+							topArr[i] = height
+							height += sizes[i].height
+						}
+						// 由于微信下,无法通过this.months[i].top的形式(引用类型)去修改父组件的month的top值,所以使用事件形式对外发出
+						this.$emit('updateMonthTop', topArr)
+					})
+			},
+			// 获取每个月份区域的尺寸
+			getMonthRectByPromise(el) {
+				// #ifndef APP-NVUE
+				// $uGetRect为uView自带的节点查询简化方法,详见文档介绍:https://ijry.github.io/uview-plus/js/getRect.html
+				// 组件内部一般用this.$uGetRect,对外的为uni.$u.getRect,二者功能一致,名称不同
+				return new Promise(resolve => {
+					this.$uGetRect(`.${el}`).then(size => {
+						resolve(size)
+					})
+				})
+				// #endif
+
+				// #ifdef APP-NVUE
+				// nvue下,使用dom模块查询元素高度
+				// 返回一个promise,让调用此方法的主体能使用then回调
+				return new Promise(resolve => {
+					dom.getComponentRect(this.$refs[el][0], res => {
+						resolve(res.size)
+					})
+				})
+				// #endif
+			},
+			// 点击某一个日期
+			clickHandler(index1, index2, item) {
+				if (this.readonly) {
+					return;
+				}
+				this.item = item
+				const date = dayjs(item.date).format("YYYY-MM-DD")
+				if (item.disabled) return
+				// 对上一次选择的日期数组进行深度克隆
+				let selected = deepClone(this.selected)
+				if (this.mode === 'single') {
+					// 单选情况下,让数组中的元素为当前点击的日期
+					selected = [date]
+				} else if (this.mode === 'multiple') {
+					if (selected.some(item => this.dateSame(item, date))) {
+						// 如果点击的日期已在数组中,则进行移除操作,也就是达到反选的效果
+						const itemIndex = selected.findIndex(item => item === date)
+						selected.splice(itemIndex, 1)
+					} else {
+						// 如果点击的日期不在数组中,且已有的长度小于总可选长度时,则添加到数组中去
+						if (selected.length < this.maxCount) selected.push(date)
+					}
+				} else {
+					// 选择区间形式
+					if (selected.length === 0 || selected.length >= 2) {
+						// 如果原来就为0或者大于2的长度,则当前点击的日期,就是开始日期
+						selected = [date]
+					} else if (selected.length === 1) {
+						// 如果已经选择了开始日期
+						const existsDate = selected[0]
+						// 如果当前选择的日期小于上一次选择的日期,则当前的日期定为开始日期
+						if (dayjs(date).isBefore(existsDate)) {
+							selected = [date]
+						} else if (dayjs(date).isAfter(existsDate)) {
+							// 当前日期减去最大可选的日期天数,如果大于起始时间,则进行提示
+							if(dayjs(dayjs(date).subtract(this.maxRange, 'day')).isAfter(dayjs(selected[0])) && this.showRangePrompt) {
+								if(this.rangePrompt) {
+									toast(this.rangePrompt)
+								} else {
+									toast(`选择天数不能超过 ${this.maxRange} 天`)
+								}
+								return
+							}
+							// 如果当前日期大于已有日期,将当前的添加到数组尾部
+							selected.push(date)
+							const startDate = selected[0]
+							const endDate = selected[1]
+							const arr = []
+							let i = 0
+							do {
+								// 将开始和结束日期之间的日期添加到数组中
+								arr.push(dayjs(startDate).add(i, 'day').format("YYYY-MM-DD"))
+								i++
+								// 累加的日期小于结束日期时,继续下一次的循环
+							} while (dayjs(startDate).add(i, 'day').isBefore(dayjs(endDate)))
+							// 为了一次性修改数组,避免computed中多次触发,这里才用arr变量一次性赋值的方式,同时将最后一个日期添加近来
+							arr.push(endDate)
+							selected = arr
+						} else {
+							// 选择区间时,只有一个日期的情况下,且不允许选择起止为同一天的话,不允许选择自己
+							if (selected[0] === date && !this.allowSameDay) return
+							selected.push(date)
+						}
+					}
+				}
+				this.setSelected(selected)
+			},
+			// 设置默认日期
+			setDefaultDate() {
+				if (!this.defaultDate) {
+					// 如果没有设置默认日期,则将当天日期设置为默认选中的日期
+					const selected = [dayjs().format("YYYY-MM-DD")]
+					return this.setSelected(selected, false)
+				}
+				let defaultDate = []
+				const minDate = this.minDate || dayjs().format("YYYY-MM-DD")
+				const maxDate = this.maxDate || dayjs(minDate).add(this.maxMonth - 1, 'month').format("YYYY-MM-DD")
+				if (this.mode === 'single') {
+					// 单选模式,可以是字符串或数组,Date对象等
+					if (!test.array(this.defaultDate)) {
+						defaultDate = [dayjs(this.defaultDate).format("YYYY-MM-DD")]
+					} else {
+						defaultDate = [this.defaultDate[0]]
+					}
+				} else {
+					// 如果为非数组,则不执行
+					if (!test.array(this.defaultDate)) return
+					defaultDate = this.defaultDate
+				}
+				// 过滤用户传递的默认数组,取出只在可允许最大值与最小值之间的元素
+				defaultDate = defaultDate.filter(item => {
+					return dayjs(item).isAfter(dayjs(minDate).subtract(1, 'day')) && dayjs(item).isBefore(dayjs(
+						maxDate).add(1, 'day'))
+				})
+				this.setSelected(defaultDate, false)
+			},
+			setSelected(selected, event = true) {
+				this.selected = selected
+				event && this.$emit('monthSelected', this.selected,'tap')
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-calendar-month-wrapper {
+		margin-top: 4px;
+	}
+
+	.u-calendar-month {
+
+		&__title {
+			font-size: 14px;
+			line-height: 42px;
+			height: 42px;
+			color: $u-main-color;
+			text-align: center;
+			font-weight: bold;
+		}
+
+		&__days {
+			position: relative;
+			@include flex;
+			flex-wrap: wrap;
+
+			&__month-mark-wrapper {
+				position: absolute;
+				top: 0;
+				bottom: 0;
+				left: 0;
+				right: 0;
+				@include flex;
+				justify-content: center;
+				align-items: center;
+
+				&__text {
+					font-size: 155px;
+					color: rgba(231, 232, 234, 0.83);
+				}
+			}
+
+			&__day {
+				@include flex;
+				padding: 2px;
+				/* #ifndef APP-NVUE */
+				// vue下使用css进行宽度计算,因为某些安卓机会无法进行js获取父元素宽度进行计算得出,会有偏移
+				width: calc(100% / 7);
+				box-sizing: border-box;
+				/* #endif */
+
+				&__select {
+					flex: 1;
+					@include flex;
+					align-items: center;
+					justify-content: center;
+					position: relative;
+
+					&__dot {
+						width: 7px;
+						height: 7px;
+						border-radius: 100px;
+						background-color: $u-error;
+						position: absolute;
+						top: 12px;
+						right: 7px;
+					}
+
+					&__buttom-info {
+						color: $u-content-color;
+						text-align: center;
+						position: absolute;
+						bottom: 5px;
+						font-size: 10px;
+						text-align: center;
+						left: 0;
+						right: 0;
+
+						&--selected {
+							color: #ffffff;
+						}
+
+						&--disabled {
+							color: #cacbcd;
+						}
+					}
+
+					&__info {
+						text-align: center;
+						font-size: 16px;
+
+						&--selected {
+							color: #ffffff;
+						}
+
+						&--disabled {
+							color: #cacbcd;
+						}
+					}
+
+					&--selected {
+						background-color: $u-primary;
+						@include flex;
+						justify-content: center;
+						align-items: center;
+						flex: 1;
+						border-radius: 3px;
+					}
+
+					&--range-selected {
+						opacity: 0.3;
+						border-radius: 0;
+					}
+
+					&--range-start-selected {
+						border-top-right-radius: 0;
+						border-bottom-right-radius: 0;
+					}
+
+					&--range-end-selected {
+						border-top-left-radius: 0;
+						border-bottom-left-radius: 0;
+					}
+				}
+			}
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-calendar/props.js b/uni_modules/uview-plus/components/u-calendar/props.js
new file mode 100644
index 0000000..03ff044
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-calendar/props.js
@@ -0,0 +1,145 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 日历顶部标题
+        title: {
+            type: String,
+            default: () => defProps.calendar.title
+        },
+        // 是否显示标题
+        showTitle: {
+            type: Boolean,
+            default: () => defProps.calendar.showTitle
+        },
+        // 是否显示副标题
+        showSubtitle: {
+            type: Boolean,
+            default: () => defProps.calendar.showSubtitle
+        },
+        // 日期类型选择,single-选择单个日期,multiple-可以选择多个日期,range-选择日期范围
+        mode: {
+            type: String,
+            default: () => defProps.calendar.mode
+        },
+        // mode=range时,第一个日期底部的提示文字
+        startText: {
+            type: String,
+            default: () => defProps.calendar.startText
+        },
+        // mode=range时,最后一个日期底部的提示文字
+        endText: {
+            type: String,
+            default: () => defProps.calendar.endText
+        },
+        // 自定义列表
+        customList: {
+            type: Array,
+            default: () => defProps.calendar.customList
+        },
+        // 主题色,对底部按钮和选中日期有效
+        color: {
+            type: String,
+            default: () => defProps.calendar.color
+        },
+        // 最小的可选日期
+        minDate: {
+            type: [String, Number],
+            default: () => defProps.calendar.minDate
+        },
+        // 最大可选日期
+        maxDate: {
+            type: [String, Number],
+            default: () => defProps.calendar.maxDate
+        },
+        // 默认选中的日期,mode为multiple或range是必须为数组格式
+        defaultDate: {
+            type: [Array, String, Date, null],
+            default: () => defProps.calendar.defaultDate
+        },
+        // mode=multiple时,最多可选多少个日期
+        maxCount: {
+            type: [String, Number],
+            default: () => defProps.calendar.maxCount
+        },
+        // 日期行高
+        rowHeight: {
+            type: [String, Number],
+            default: () => defProps.calendar.rowHeight
+        },
+        // 日期格式化函数
+        formatter: {
+            type: [Function, null],
+            default: () => defProps.calendar.formatter
+        },
+        // 是否显示农历
+        showLunar: {
+            type: Boolean,
+            default: () => defProps.calendar.showLunar
+        },
+        // 是否显示月份背景色
+        showMark: {
+            type: Boolean,
+            default: () => defProps.calendar.showMark
+        },
+        // 确定按钮的文字
+        confirmText: {
+            type: String,
+            default: () => defProps.calendar.confirmText
+        },
+        // 确认按钮处于禁用状态时的文字
+        confirmDisabledText: {
+            type: String,
+            default: () => defProps.calendar.confirmDisabledText
+        },
+        // 是否显示日历弹窗
+        show: {
+            type: Boolean,
+            default: () => defProps.calendar.show
+        },
+        // 是否允许点击遮罩关闭日历
+        closeOnClickOverlay: {
+            type: Boolean,
+            default: () => defProps.calendar.closeOnClickOverlay
+        },
+        // 是否为只读状态,只读状态下禁止选择日期
+        readonly: {
+            type: Boolean,
+            default: () => defProps.calendar.readonly
+        },
+        // 	是否展示确认按钮
+        showConfirm: {
+            type: Boolean,
+            default: () => defProps.calendar.showConfirm
+        },
+        // 日期区间最多可选天数,默认无限制,mode = range时有效
+        maxRange: {
+            type: [Number, String],
+            default: () => defProps.calendar.maxRange
+        },
+        // 范围选择超过最多可选天数时的提示文案,mode = range时有效
+        rangePrompt: {
+            type: String,
+            default: () => defProps.calendar.rangePrompt
+        },
+        // 范围选择超过最多可选天数时,是否展示提示文案,mode = range时有效
+        showRangePrompt: {
+            type: Boolean,
+            default: () => defProps.calendar.showRangePrompt
+        },
+        // 是否允许日期范围的起止时间为同一天,mode = range时有效
+        allowSameDay: {
+            type: Boolean,
+            default: () => defProps.calendar.allowSameDay
+        },
+		// 圆角值
+		round: {
+		    type: [Boolean, String, Number],
+		    default: () => defProps.calendar.round
+		},
+		// 最多展示月份数量
+		monthNum: {
+			type: [Number, String],
+			default: 3
+		}	
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-calendar/u-calendar.vue b/uni_modules/uview-plus/components/u-calendar/u-calendar.vue
new file mode 100644
index 0000000..aa31422
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-calendar/u-calendar.vue
@@ -0,0 +1,409 @@
+<template>
+	<u-popup
+		:show="show"
+		mode="bottom"
+		closeable
+		@close="close"
+		:round="round"
+		:closeOnClickOverlay="closeOnClickOverlay"
+	>
+		<view class="u-calendar">
+			<uHeader
+				:title="title"
+				:subtitle="subtitle"
+				:showSubtitle="showSubtitle"
+				:showTitle="showTitle"
+			></uHeader>
+			<scroll-view
+				:style="{
+                    height: addUnit(listHeight)
+                }"
+				scroll-y
+				@scroll="onScroll"
+				:scroll-top="scrollTop"
+				:scrollIntoView="scrollIntoView"
+			>
+				<uMonth
+					:color="color"
+					:rowHeight="rowHeight"
+					:showMark="showMark"
+					:months="months"
+					:mode="mode"
+					:maxCount="maxCount"
+					:startText="startText"
+					:endText="endText"
+					:defaultDate="defaultDate"
+					:minDate="innerMinDate"
+					:maxDate="innerMaxDate"
+					:maxMonth="monthNum"
+					:readonly="readonly"
+					:maxRange="maxRange"
+					:rangePrompt="rangePrompt"
+					:showRangePrompt="showRangePrompt"
+					:allowSameDay="allowSameDay"
+					ref="month"
+					@monthSelected="monthSelected"
+					@updateMonthTop="updateMonthTop"
+				></uMonth>
+			</scroll-view>
+			<slot name="footer" v-if="showConfirm">
+				<view class="u-calendar__confirm">
+					<u-button
+						shape="circle"
+						:text="
+                            buttonDisabled ? confirmDisabledText : confirmText
+                        "
+						:color="color"
+						@click="confirm"
+						:disabled="buttonDisabled"
+					></u-button>
+				</view>
+			</slot>
+		</view>
+	</u-popup>
+</template>
+
+<script>
+import uHeader from './header.vue'
+import uMonth from './month.vue'
+import props from './props.js'
+import util from './util.js'
+import dayjs from 'dayjs/esm/index'
+import Calendar from '../../libs/util/calendar.js'
+import mpMixin from '../../libs/mixin/mpMixin.js'
+import mixin from '../../libs/mixin/mixin.js'
+import { addUnit, range, error, padZero } from '../../libs/function/index';
+import test from '../../libs/function/test';
+/**
+ * Calendar 日历
+ * @description  此组件用于单个选择日期,范围选择日期等,日历被包裹在底部弹起的容器中.
+ * @tutorial https://ijry.github.io/uview-plus/components/calendar.html
+ *
+ * @property {String}				title				标题内容 (默认 日期选择 )
+ * @property {Boolean}				showTitle			是否显示标题  (默认 true )
+ * @property {Boolean}				showSubtitle		是否显示副标题	(默认 true )
+ * @property {String}				mode				日期类型选择  single-选择单个日期,multiple-可以选择多个日期,range-选择日期范围 ( 默认 'single' )
+ * @property {String}				startText			mode=range时,第一个日期底部的提示文字  (默认 '开始' )
+ * @property {String}				endText				mode=range时,最后一个日期底部的提示文字 (默认 '结束' )
+ * @property {Array}				customList			自定义列表
+ * @property {String}				color				主题色,对底部按钮和选中日期有效  (默认 ‘#3c9cff' )
+ * @property {String | Number}		minDate				最小的可选日期	 (默认 0 )
+ * @property {String | Number}		maxDate				最大可选日期  (默认 0 )
+ * @property {Array | String| Date}	defaultDate			默认选中的日期,mode为multiple或range是必须为数组格式
+ * @property {String | Number}		maxCount			mode=multiple时,最多可选多少个日期  (默认 	Number.MAX_SAFE_INTEGER  )
+ * @property {String | Number}		rowHeight			日期行高 (默认 56 )
+ * @property {Function}				formatter			日期格式化函数
+ * @property {Boolean}				showLunar			是否显示农历  (默认 false )
+ * @property {Boolean}				showMark			是否显示月份背景色 (默认 true )
+ * @property {String}				confirmText			确定按钮的文字 (默认 '确定' )
+ * @property {String}				confirmDisabledText	确认按钮处于禁用状态时的文字 (默认 '确定' )
+ * @property {Boolean}				show				是否显示日历弹窗 (默认 false )
+ * @property {Boolean}				closeOnClickOverlay	是否允许点击遮罩关闭日历 (默认 false )
+ * @property {Boolean}				readonly	        是否为只读状态,只读状态下禁止选择日期 (默认 false )
+ * @property {String | Number}		maxRange	        日期区间最多可选天数,默认无限制,mode = range时有效
+ * @property {String}				rangePrompt	        范围选择超过最多可选天数时的提示文案,mode = range时有效
+ * @property {Boolean}				showRangePrompt	    范围选择超过最多可选天数时,是否展示提示文案,mode = range时有效 (默认 true )
+ * @property {Boolean}				allowSameDay	    是否允许日期范围的起止时间为同一天,mode = range时有效 (默认 false )
+ * @property {Number|String}	    round				圆角值,默认无圆角  (默认 0 )
+ * @property {Number|String}	    monthNum			最多展示的月份数量  (默认 3 )
+ *
+ * @event {Function()} confirm 		点击确定按钮时触发		选择日期相关的返回参数
+ * @event {Function()} close 		日历关闭时触发			可定义页面关闭时的回调事件
+ * @example <u-calendar  :defaultDate="defaultDateMultiple" :show="show" mode="multiple" @confirm="confirm">
+	</u-calendar>
+ * */
+export default {
+	name: 'u-calendar',
+	mixins: [mpMixin, mixin, props],
+	components: {
+		uHeader,
+		uMonth
+	},
+	data() {
+		return {
+			// 需要显示的月份的数组
+			months: [],
+			// 在月份滚动区域中,当前视图中月份的index索引
+			monthIndex: 0,
+			// 月份滚动区域的高度
+			listHeight: 0,
+			// month组件中选择的日期数组
+			selected: [],
+			scrollIntoView: '',
+			scrollIntoViewScroll: '',
+			scrollTop:0,
+			// 过滤处理方法
+			innerFormatter: (value) => value
+		}
+	},
+	watch: {
+		scrollIntoView: {
+			immediate: true,
+			handler(n) {
+				// console.log('scrollIntoView', n)
+			}
+		},
+		selectedChange: {
+			immediate: true,
+			handler(n) {
+				this.setMonth()
+			}
+		},
+		// 打开弹窗时,设置月份数据
+		show: {
+			immediate: true,
+			handler(n) {
+				if (n) {
+					this.setMonth()
+				} else {
+					// 关闭时重置scrollIntoView,否则会出现二次打开日历,当前月份数据显示不正确。
+					// scrollIntoView需要有一个值变动过程,才会产生作用。
+					this.scrollIntoView = ''
+				}
+			}
+		}
+	},
+	computed: {
+		// 由于maxDate和minDate可以为字符串(2021-10-10),或者数值(时间戳),但是dayjs如果接受字符串形式的时间戳会有问题,这里进行处理
+		innerMaxDate() {
+			return test.number(this.maxDate)
+				? Number(this.maxDate)
+				: this.maxDate
+		},
+		innerMinDate() {
+			return test.number(this.minDate)
+				? Number(this.minDate)
+				: this.minDate
+		},
+		// 多个条件的变化,会引起选中日期的变化,这里统一管理监听
+		selectedChange() {
+			return [this.innerMinDate, this.innerMaxDate, this.defaultDate]
+		},
+		subtitle() {
+			// 初始化时,this.months为空数组,所以需要特别判断处理
+			if (this.months.length) {
+				return `${this.months[this.monthIndex].year}年${
+					this.months[this.monthIndex].month
+				}月`
+			} else {
+				return ''
+			}
+		},
+		buttonDisabled() {
+			// 如果为range类型,且选择的日期个数不足1个时,让底部的按钮出于disabled状态
+			if (this.mode === 'range') {
+				if (this.selected.length <= 1) {
+					return true
+				} else {
+					return false
+				}
+			} else {
+				return false
+			}
+		}
+	},
+	mounted() {
+		this.start = Date.now()
+		this.init()
+	},
+	emits: ["confirm", "close"],
+	methods: {
+		addUnit,
+		// 在微信小程序中,不支持将函数当做props参数,故只能通过ref形式调用
+		setFormatter(e) {
+			this.innerFormatter = e
+		},
+		// month组件内部选择日期后,通过事件通知给父组件
+		monthSelected(e,scene ='init') {
+			this.selected = e
+			if (!this.showConfirm) {
+				// 在不需要确认按钮的情况下,如果为单选,或者范围多选且已选长度大于2,则直接进行返还
+				if (
+					this.mode === 'multiple' ||
+					this.mode === 'single' ||
+					(this.mode === 'range' && this.selected.length >= 2)
+				) {
+				   if( scene === 'init'){
+					 return
+				   }
+				   if( scene === 'tap') {
+					 this.$emit('confirm', this.selected)
+				   }
+				}
+			}
+		},
+		init() {
+			// 校验maxDate,不能小于minDate。
+			if (
+				this.innerMaxDate &&
+                this.innerMinDate &&
+				new Date(this.innerMaxDate).getTime() < new Date(this.innerMinDate).getTime()
+			) {
+				return error('maxDate不能小于minDate时间')
+			}
+			// 滚动区域的高度
+			this.listHeight = this.rowHeight * 5 + 30
+			this.setMonth()
+		},
+		close() {
+			this.$emit('close')
+		},
+		// 点击确定按钮
+		confirm() {
+			if (!this.buttonDisabled) {
+				this.$emit('confirm', this.selected)
+			}
+		},
+		// 获得两个日期之间的月份数
+		getMonths(minDate, maxDate) {
+			const minYear = dayjs(minDate).year()
+			const minMonth = dayjs(minDate).month() + 1
+			const maxYear = dayjs(maxDate).year()
+			const maxMonth = dayjs(maxDate).month() + 1
+			return (maxYear - minYear) * 12 + (maxMonth - minMonth) + 1
+		},
+		// 设置月份数据
+		setMonth() {
+			// 最小日期的毫秒数
+			const minDate = this.innerMinDate || dayjs().valueOf()
+			// 如果没有指定最大日期,则往后推3个月
+			const maxDate =
+				this.innerMaxDate ||
+				dayjs(minDate)
+					.add(this.monthNum - 1, 'month')
+					.valueOf()
+			// 最大最小月份之间的共有多少个月份,
+			const months = range(
+				1,
+				this.monthNum,
+				this.getMonths(minDate, maxDate)
+			)
+			// 先清空数组
+			this.months = []
+			for (let i = 0; i < months; i++) {
+				this.months.push({
+					date: new Array(
+						dayjs(minDate).add(i, 'month').daysInMonth()
+					)
+						.fill(1)
+						.map((item, index) => {
+							// 日期,取值1-31
+							let day = index + 1
+							// 星期,0-6,0为周日
+							const week = dayjs(minDate)
+								.add(i, 'month')
+								.date(day)
+								.day()
+							const date = dayjs(minDate)
+								.add(i, 'month')
+								.date(day)
+								.format('YYYY-MM-DD')
+							let bottomInfo = ''
+							if (this.showLunar) {
+								// 将日期转为农历格式
+								const lunar = Calendar.solar2lunar(
+									dayjs(date).year(),
+									dayjs(date).month() + 1,
+									dayjs(date).date()
+								)
+								bottomInfo = lunar.IDayCn
+							}
+							let config = {
+								day,
+								week,
+								// 小于最小允许的日期,或者大于最大的日期,则设置为disabled状态
+								disabled:
+									dayjs(date).isBefore(
+										dayjs(minDate).format('YYYY-MM-DD')
+									) ||
+									dayjs(date).isAfter(
+										dayjs(maxDate).format('YYYY-MM-DD')
+									),
+								// 返回一个日期对象,供外部的formatter获取当前日期的年月日等信息,进行加工处理
+								date: new Date(date),
+								bottomInfo,
+								dot: false,
+								month:
+									dayjs(minDate).add(i, 'month').month() + 1
+							}
+							const formatter =
+								this.formatter || this.innerFormatter
+							return formatter(config)
+						}),
+					// 当前所属的月份
+					month: dayjs(minDate).add(i, 'month').month() + 1,
+					// 当前年份
+					year: dayjs(minDate).add(i, 'month').year()
+				})
+			}
+		},
+		// 滚动到默认设置的月份
+		scrollIntoDefaultMonth(selected) {
+			// 查询默认日期在可选列表的下标
+			const _index = this.months.findIndex(({
+				  year,
+				  month
+			  }) => {
+				month = padZero(month)
+				return `${year}-${month}` === selected
+			})
+			if (_index !== -1) {
+				// #ifndef MP-WEIXIN
+				this.$nextTick(() => {
+					this.scrollIntoView = `month-${_index}`
+					this.scrollIntoViewScroll = this.scrollIntoView
+				})
+				// #endif
+				// #ifdef MP-WEIXIN
+				this.scrollTop = this.months[_index].top || 0;
+				// #endif
+			}
+		},
+		// scroll-view滚动监听
+		onScroll(event) {
+			// 不允许小于0的滚动值,如果scroll-view到顶了,继续下拉,会出现负数值
+			const scrollTop = Math.max(0, event.detail.scrollTop)
+			// 将当前滚动条数值,除以滚动区域的高度,可以得出当前滚动到了哪一个月份的索引
+			for (let i = 0; i < this.months.length; i++) {
+				if (scrollTop >= (this.months[i].top || this.listHeight)) {
+					this.monthIndex = i
+					this.scrollIntoViewScroll = `month-${i}`
+				}
+			}
+		},
+		// 更新月份的top值
+		updateMonthTop(topArr = []) {
+			// 设置对应月份的top值,用于onScroll方法更新月份
+			topArr.map((item, index) => {
+				this.months[index].top = item
+			})
+
+			// 获取默认日期的下标
+			if (!this.defaultDate) {
+				// 如果没有设置默认日期,则将当天日期设置为默认选中的日期
+				const selected = dayjs().format("YYYY-MM")
+				this.scrollIntoDefaultMonth(selected)
+				return
+			}
+			let selected = dayjs().format("YYYY-MM");
+			// 单选模式,可以是字符串或数组,Date对象等
+			if (!test.array(this.defaultDate)) {
+				selected = dayjs(this.defaultDate).format("YYYY-MM")
+			} else {
+				selected = dayjs(this.defaultDate[0]).format("YYYY-MM");
+			}
+			this.scrollIntoDefaultMonth(selected)
+		}
+	}
+}
+</script>
+
+<style lang="scss" scoped>
+@import '../../libs/css/components.scss';
+
+.u-calendar {
+	&__confirm {
+		padding: 7px 18px;
+	}
+}
+</style>
diff --git a/uni_modules/uview-plus/components/u-calendar/util.js b/uni_modules/uview-plus/components/u-calendar/util.js
new file mode 100644
index 0000000..18762c1
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-calendar/util.js
@@ -0,0 +1,86 @@
+import dayjs from 'dayjs/esm/index'
+export default {
+    methods: {
+        // 设置月份数据
+        setMonth() {
+            // 月初是周几
+            const day = dayjs(this.date).date(1).day()
+            const start = day == 0 ? 6 : day - 1
+
+            // 本月天数
+            const days = dayjs(this.date).endOf('month').format('D')
+
+            // 上个月天数
+            const prevDays = dayjs(this.date).endOf('month').subtract(1, 'month').format('D')
+
+            // 日期数据
+            const arr = []
+            // 清空表格
+            this.month = []
+
+            // 添加上月数据
+            arr.push(
+                ...new Array(start).fill(1).map((e, i) => {
+                    const day = prevDays - start + i + 1
+
+                    return {
+                        value: day,
+                        disabled: true,
+                        date: dayjs(this.date).subtract(1, 'month').date(day).format('YYYY-MM-DD')
+                    }
+                })
+            )
+
+            // 添加本月数据
+            arr.push(
+                ...new Array(days - 0).fill(1).map((e, i) => {
+                    const day = i + 1
+
+                    return {
+                        value: day,
+                        date: dayjs(this.date).date(day).format('YYYY-MM-DD')
+                    }
+                })
+            )
+
+            // 添加下个月
+            arr.push(
+                ...new Array(42 - days - start).fill(1).map((e, i) => {
+                    const day = i + 1
+
+                    return {
+                        value: day,
+                        disabled: true,
+                        date: dayjs(this.date).add(1, 'month').date(day).format('YYYY-MM-DD')
+                    }
+                })
+            )
+
+            // 分割数组
+            for (let n = 0; n < arr.length; n += 7) {
+                this.month.push(
+                    arr.slice(n, n + 7).map((e, i) => {
+                        e.index = i + n
+
+                        // 自定义信息
+                        const custom = this.customList.find((c) => c.date == e.date)
+
+                        // 农历
+                        if (this.lunar) {
+                            const {
+                                IDayCn,
+                                IMonthCn
+                            } = this.getLunar(e.date)
+                            e.lunar = IDayCn == '初一' ? IMonthCn : IDayCn
+                        }
+
+                        return {
+                            ...e,
+                            ...custom
+                        }
+                    })
+                )
+            }
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-car-keyboard/props.js b/uni_modules/uview-plus/components/u-car-keyboard/props.js
new file mode 100644
index 0000000..5d1f9c1
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-car-keyboard/props.js
@@ -0,0 +1,15 @@
+// import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 是否打乱键盘按键的顺序
+        random: {
+            type: Boolean,
+            default: false
+        },
+        // 输入一个中文后,是否自动切换到英文
+        autoChange: {
+            type: Boolean,
+            default: false
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-car-keyboard/u-car-keyboard.vue b/uni_modules/uview-plus/components/u-car-keyboard/u-car-keyboard.vue
new file mode 100644
index 0000000..eb66244
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-car-keyboard/u-car-keyboard.vue
@@ -0,0 +1,315 @@
+<template>
+	<view
+		class="u-keyboard"
+		@touchmove.stop.prevent="noop"
+	>
+		<view
+			v-for="(group, i) in abc ? engKeyBoardList : areaList"
+			:key="i"
+			class="u-keyboard__button"
+			:index="i"
+			:class="[i + 1 === 4 && 'u-keyboard__button--center']"
+		>
+			<view
+				v-if="i === 3"
+				class="u-keyboard__button__inner-wrapper"
+			>
+				<view
+					class="u-keyboard__button__inner-wrapper__left"
+					hover-class="u-hover-class"
+					:hover-stay-time="200"
+					@tap="changeCarInputMode"
+				>
+					<text
+						class="u-keyboard__button__inner-wrapper__left__lang"
+						:class="[!abc && 'u-keyboard__button__inner-wrapper__left__lang--active']"
+					>中</text>
+					<text class="u-keyboard__button__inner-wrapper__left__line">/</text>
+					<text
+						class="u-keyboard__button__inner-wrapper__left__lang"
+						:class="[abc && 'u-keyboard__button__inner-wrapper__left__lang--active']"
+					>英</text>
+				</view>
+			</view>
+			<view
+				class="u-keyboard__button__inner-wrapper"
+				v-for="(item, j) in group"
+				:key="j"
+			>
+				<view
+					class="u-keyboard__button__inner-wrapper__inner"
+					:hover-stay-time="200"
+					@tap="carInputClick(i, j)"
+					hover-class="u-hover-class"
+				>
+					<text class="u-keyboard__button__inner-wrapper__inner__text">{{ item }}</text>
+				</view>
+			</view>
+			<view
+				v-if="i === 3"
+				@touchstart="backspaceClick"
+				@touchend="clearTimer"
+				class="u-keyboard__button__inner-wrapper"
+			>
+				<view
+					class="u-keyboard__button__inner-wrapper__right"
+					hover-class="u-hover-class"
+					:hover-stay-time="200"
+				>
+					<u-icon
+						size="28"
+						name="backspace"
+						color="#303133"
+					></u-icon>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { randomArray, sleep } from '../../libs/function/index';
+	/**
+	 * keyboard 键盘组件
+	 * @description 此为uView自定义的键盘面板,内含了数字键盘,车牌号键,身份证号键盘3种模式,都有可以打乱按键顺序的选项。
+	 * @tutorial https://uview-plus.jiangruyi.com/components/keyboard.html
+	 * @property {Boolean} random 是否打乱键盘的顺序
+	 * @event {Function} change 点击键盘触发
+	 * @event {Function} backspace 点击退格键触发
+	 * @example <u-keyboard ref="uKeyboard" mode="car" v-model="show"></u-keyboard>
+	 */
+	export default {
+		name: "u-keyboard",
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				// 车牌输入时,abc=true为输入车牌号码,bac=false为输入省份中文简称
+				abc: false
+			};
+		},
+		computed: {
+			areaList() {
+				let data = [
+					'京',
+					'沪',
+					'粤',
+					'津',
+					'冀',
+					'豫',
+					'云',
+					'辽',
+					'黑',
+					'湘',
+					'皖',
+					'鲁',
+					'苏',
+					'浙',
+					'赣',
+					'鄂',
+					'桂',
+					'甘',
+					'晋',
+					'陕',
+					'蒙',
+					'吉',
+					'闽',
+					'贵',
+					'渝',
+					'川',
+					'青',
+					'琼',
+					'宁',
+					'挂',
+					'藏',
+					'港',
+					'澳',
+					'新',
+					'使',
+					'学'
+				];
+				let tmp = [];
+				// 打乱顺序
+				if (this.random) data = randomArray(data);
+				// 切割成二维数组
+				tmp[0] = data.slice(0, 10);
+				tmp[1] = data.slice(10, 20);
+				tmp[2] = data.slice(20, 30);
+				tmp[3] = data.slice(30, 36);
+				return tmp;
+			},
+			engKeyBoardList() {
+				let data = [
+					1,
+					2,
+					3,
+					4,
+					5,
+					6,
+					7,
+					8,
+					9,
+					0,
+					'Q',
+					'W',
+					'E',
+					'R',
+					'T',
+					'Y',
+					'U',
+					'I',
+					'O',
+					'P',
+					'A',
+					'S',
+					'D',
+					'F',
+					'G',
+					'H',
+					'J',
+					'K',
+					'L',
+					'Z',
+					'X',
+					'C',
+					'V',
+					'B',
+					'N',
+					'M'
+				];
+				let tmp = [];
+				if (this.random) data = randomArray(data);
+				tmp[0] = data.slice(0, 10);
+				tmp[1] = data.slice(10, 20);
+				tmp[2] = data.slice(20, 30);
+				tmp[3] = data.slice(30, 36);
+				return tmp;
+			}
+		},
+		emits: ["change", "backspace"],
+		methods: {
+			// 点击键盘按钮
+			carInputClick(i, j) {
+				let value = '';
+				// 不同模式,获取不同数组的值
+				if (this.abc) value = this.engKeyBoardList[i][j];
+				else value = this.areaList[i][j];
+				// 如果允许自动切换,则将中文状态切换为英文
+				if (!this.abc && this.autoChange) sleep(200).then(() => this.abc = true)
+				this.$emit('change', value);
+			},
+			// 修改汽车牌键盘的输入模式,中文|英文
+			changeCarInputMode() {
+				this.abc = !this.abc;
+			},
+			// 点击退格键
+			backspaceClick() {
+				this.$emit('backspace');
+				clearInterval(this.timer); //再次清空定时器,防止重复注册定时器
+				this.timer = null;
+				this.timer = setInterval(() => {
+					this.$emit('backspace');
+				}, 250);
+			},
+			clearTimer() {
+				clearInterval(this.timer);
+				this.timer = null;
+			},
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+	$u-car-keyboard-background-color: rgb(224, 228, 230) !default;
+	$u-car-keyboard-padding:6px 0 6px !default;
+	$u-car-keyboard-button-inner-width:64rpx !default;
+	$u-car-keyboard-button-inner-background-color:#FFFFFF !default;
+	$u-car-keyboard-button-height:80rpx !default;
+	$u-car-keyboard-button-inner-box-shadow:0 1px 0px #999992 !default;
+	$u-car-keyboard-button-border-radius:4px !default;
+	$u-car-keyboard-button-inner-margin:8rpx 5rpx !default;
+	$u-car-keyboard-button-text-font-size:16px !default;
+	$u-car-keyboard-button-text-color:$u-main-color !default;
+	$u-car-keyboard-center-inner-margin: 0 4rpx !default;
+	$u-car-keyboard-special-button-width:134rpx !default;
+	$u-car-keyboard-lang-font-size:16px !default;
+	$u-car-keyboard-lang-color:$u-main-color !default;
+	$u-car-keyboard-active-color:$u-primary !default;
+	$u-car-keyboard-line-font-size:15px !default;
+	$u-car-keyboard-line-color:$u-main-color !default;
+	$u-car-keyboard-line-margin:0 1px !default;
+	$u-car-keyboard-u-hover-class-background-color:#BBBCC6 !default;
+
+	.u-keyboard {
+		@include flex(column);
+		justify-content: space-around;
+		background-color: $u-car-keyboard-background-color;
+		align-items: stretch;
+		padding: $u-car-keyboard-padding;
+
+		&__button {
+			@include flex;
+			justify-content: center;
+			flex: 1;
+			/* #ifndef APP-NVUE */
+			/* #endif */
+
+			&__inner-wrapper {
+				box-shadow: $u-car-keyboard-button-inner-box-shadow;
+				margin: $u-car-keyboard-button-inner-margin;
+				border-radius: $u-car-keyboard-button-border-radius;
+
+				&__inner {
+					@include flex;
+					justify-content: center;
+					align-items: center;
+					width: $u-car-keyboard-button-inner-width;
+					background-color: $u-car-keyboard-button-inner-background-color;
+					height: $u-car-keyboard-button-height;
+					border-radius: $u-car-keyboard-button-border-radius;
+
+					&__text {
+						font-size: $u-car-keyboard-button-text-font-size;
+						color: $u-car-keyboard-button-text-color;
+					}
+				}
+
+				&__left,
+				&__right {
+					border-radius: $u-car-keyboard-button-border-radius;
+					width: $u-car-keyboard-special-button-width;
+					height: $u-car-keyboard-button-height;
+					background-color: $u-car-keyboard-u-hover-class-background-color;
+					@include flex;
+					justify-content: center;
+					align-items: center;
+					box-shadow: $u-car-keyboard-button-inner-box-shadow;
+				}
+
+				&__left {
+					&__line {
+						font-size: $u-car-keyboard-line-font-size;
+						color: $u-car-keyboard-line-color;
+						margin: $u-car-keyboard-line-margin;
+					}
+
+					&__lang {
+						font-size: $u-car-keyboard-lang-font-size;
+						color: $u-car-keyboard-lang-color;
+
+						&--active {
+							color: $u-car-keyboard-active-color;
+						}
+					}
+				}
+			}
+		}
+	}
+
+	.u-hover-class {
+		background-color: $u-car-keyboard-u-hover-class-background-color;
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-cell-group/props.js b/uni_modules/uview-plus/components/u-cell-group/props.js
new file mode 100644
index 0000000..605fbd5
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-cell-group/props.js
@@ -0,0 +1,15 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 分组标题
+        title: {
+            type: String,
+            default: () => defProps.cellGroup.title
+        },
+        // 是否显示外边框
+        border: {
+            type: Boolean,
+            default: () => defProps.cellGroup.border
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-cell-group/u-cell-group.vue b/uni_modules/uview-plus/components/u-cell-group/u-cell-group.vue
new file mode 100644
index 0000000..ce70dbc
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-cell-group/u-cell-group.vue
@@ -0,0 +1,67 @@
+<template>
+    <view :style="[addStyle(customStyle)]" :class="[customClass]" class="u-cell-group">
+        <view v-if="title" class="u-cell-group__title">
+            <slot name="title">
+				<text class="u-cell-group__title__text">{{ title }}</text>
+			</slot>
+        </view>
+        <view class="u-cell-group__wrapper">
+			<u-line v-if="border"></u-line>
+            <slot />
+        </view>
+    </view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addStyle } from '../../libs/function/index';
+	/**
+	 * cellGroup  单元格
+	 * @description cell单元格一般用于一组列表的情况,比如个人中心页,设置页等。
+	 * @tutorial https://uview-plus.jiangruyi.com/components/cell.html
+	 * 
+	 * @property {String}	title		分组标题
+	 * @property {Boolean}	border		是否显示外边框 (默认 true )
+	 * @property {Object}	customStyle	定义需要用到的外部样式
+	 * 
+	 * @event {Function} click 	点击cell列表时触发
+	 * @example <u-cell-group title="设置喜好">
+	 */
+	export default {
+		name: 'u-cell-group',
+		mixins: [mpMixin, mixin, props],
+		methods: {
+			addStyle
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+	
+	$u-cell-group-title-padding: 16px 16px 8px !default;
+	$u-cell-group-title-font-size: 15px !default;
+	$u-cell-group-title-line-height: 16px !default;
+	$u-cell-group-title-color: $u-main-color !default;
+
+    .u-cell-group {
+		flex: 1;
+		
+        &__title {
+            padding: $u-cell-group-title-padding;
+
+            &__text {
+                font-size: $u-cell-group-title-font-size;
+                line-height: $u-cell-group-title-line-height;
+                color: $u-cell-group-title-color;
+            }
+        }
+		
+		&__wrapper {
+			position: relative;
+		}
+    }
+</style>
+
diff --git a/uni_modules/uview-plus/components/u-cell/props.js b/uni_modules/uview-plus/components/u-cell/props.js
new file mode 100644
index 0000000..b9fe857
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-cell/props.js
@@ -0,0 +1,111 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 标题
+        title: {
+            type: [String, Number],
+            default: () => defProps.cell.title
+        },
+        // 标题下方的描述信息
+        label: {
+            type: [String, Number],
+            default: () => defProps.cell.label
+        },
+        // 右侧的内容
+        value: {
+            type: [String, Number],
+            default: () => defProps.cell.value
+        },
+        // 左侧图标名称,或者图片链接(本地文件建议使用绝对地址)
+        icon: {
+            type: String,
+            default: () => defProps.cell.icon
+        },
+        // 是否禁用cell
+        disabled: {
+            type: Boolean,
+            default: () => defProps.cell.disabled
+        },
+        // 是否显示下边框
+        border: {
+            type: Boolean,
+            default: () => defProps.cell.border
+        },
+        // 内容是否垂直居中(主要是针对右侧的value部分)
+        center: {
+            type: Boolean,
+            default: () => defProps.cell.center
+        },
+        // 点击后跳转的URL地址
+        url: {
+            type: String,
+            default: () => defProps.cell.url
+        },
+        // 链接跳转的方式,内部使用的是uView封装的route方法,可能会进行拦截操作
+        linkType: {
+            type: String,
+            default: () => defProps.cell.linkType
+        },
+        // 是否开启点击反馈(表现为点击时加上灰色背景)
+        clickable: {
+            type: Boolean,
+            default: () => defProps.cell.clickable
+        },
+        // 是否展示右侧箭头并开启点击反馈
+        isLink: {
+            type: Boolean,
+            default: () => defProps.cell.isLink
+        },
+        // 是否显示表单状态下的必填星号(此组件可能会内嵌入input组件)
+        required: {
+            type: Boolean,
+            default: () => defProps.cell.required
+        },
+        // 右侧的图标箭头
+        rightIcon: {
+            type: String,
+            default: () => defProps.cell.rightIcon
+        },
+        // 右侧箭头的方向,可选值为:left,up,down
+        arrowDirection: {
+            type: String,
+            default: () => defProps.cell.arrowDirection
+        },
+        // 左侧图标样式
+        iconStyle: {
+            type: [Object, String],
+            default: () => {
+				return defProps.cell.iconStyle
+			}
+        },
+        // 右侧箭头图标的样式
+        rightIconStyle: {
+            type: [Object, String],
+            default: () => {
+				return defProps.cell.rightIconStyle
+			}
+        },
+        // 标题的样式
+        titleStyle: {
+            type: [Object, String],
+			default: () => {
+				return defProps.cell.titleStyle
+			}
+        },
+        // 单位元的大小,可选值为large
+        size: {
+            type: String,
+            default: () => defProps.cell.size
+        },
+        // 点击cell是否阻止事件传播
+        stop: {
+            type: Boolean,
+            default: () => defProps.cell.stop
+        },
+        // 标识符,cell被点击时返回
+        name: {
+            type: [Number, String],
+            default: () => defProps.cell.name
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-cell/u-cell.vue b/uni_modules/uview-plus/components/u-cell/u-cell.vue
new file mode 100644
index 0000000..73c17c3
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-cell/u-cell.vue
@@ -0,0 +1,246 @@
+<template>
+	<view class="u-cell" :class="[customClass]" :style="[addStyle(customStyle)]"
+		:hover-class="(!disabled && (clickable || isLink)) ? 'u-cell--clickable' : ''" :hover-stay-time="250"
+		@tap="clickHandler">
+		<view class="u-cell__body" :class="[ center && 'u-cell--center', size === 'large' && 'u-cell__body--large']">
+			<view class="u-cell__body__content">
+				<view class="u-cell__left-icon-wrap" v-if="$slots.icon || icon">
+					<slot name="icon" v-if="$slots.icon">
+					</slot>
+					<u-icon v-else :name="icon"
+						:custom-style="iconStyle"
+						:size="size === 'large' ? 22 : 18"></u-icon>
+				</view>
+				<view class="u-cell__title">
+                    <!-- 将slot与默认内容用if/else分开主要是因为微信小程序不支持slot嵌套传递,这样才能解决collapse组件的slot不失效问题,label暂时未用到。 -->
+					<slot name="title" v-if="$slots.title || !title">
+					</slot>
+                    <text v-else class="u-cell__title-text" :style="[titleTextStyle]"
+                        :class="[disabled && 'u-cell--disabled', size === 'large' && 'u-cell__title-text--large']">{{ title }}</text>
+					<slot name="label">
+						<text class="u-cell__label" v-if="label"
+							:class="[disabled && 'u-cell--disabled', size === 'large' && 'u-cell__label--large']">{{ label }}</text>
+					</slot>
+				</view>
+			</view>
+			<slot name="value">
+				<text class="u-cell__value"
+					:class="[disabled && 'u-cell--disabled', size === 'large' && 'u-cell__value--large']"
+					v-if="!testEmpty(value)">{{ value }}</text>
+			</slot>
+			<view class="u-cell__right-icon-wrap" v-if="$slots['right-icon'] || isLink"
+				:class="[`u-cell__right-icon-wrap--${arrowDirection}`]">
+				<u-icon v-if="rightIcon && !$slots['right-icon']" :name="rightIcon" :custom-style="rightIconStyle" :color="disabled ? '#c8c9cc' : 'info'"
+					:size="size === 'large' ? 18 : 16"></u-icon>
+				<slot v-else name="right-icon">	
+				</slot>
+			</view>
+			<view class="u-cell__right-icon-wrap" v-if="$slots['righticon']"
+				:class="[`u-cell__right-icon-wrap--${arrowDirection}`]">
+				<slot name="righticon">
+				</slot>
+			</view>
+		</view>
+		<u-line v-if="border"></u-line>
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addStyle } from '../../libs/function/index';
+	import test from '../../libs/function/test';
+	/**
+	 * cell  单元格
+	 * @description cell单元格一般用于一组列表的情况,比如个人中心页,设置页等。
+	 * @tutorial https://uview-plus.jiangruyi.com/components/cell.html
+	 * @property {String | Number}	title			标题
+	 * @property {String | Number}	label			标题下方的描述信息
+	 * @property {String | Number}	value			右侧的内容
+	 * @property {String}			icon			左侧图标名称,或者图片链接(本地文件建议使用绝对地址)
+	 * @property {Boolean}			disabled		是否禁用cell	
+	 * @property {Boolean}			border			是否显示下边框 (默认 true )
+	 * @property {Boolean}			center			内容是否垂直居中(主要是针对右侧的value部分) (默认 false )
+	 * @property {String}			url				点击后跳转的URL地址
+	 * @property {String}			linkType		链接跳转的方式,内部使用的是uView封装的route方法,可能会进行拦截操作 (默认 'navigateTo' )
+	 * @property {Boolean}			clickable		是否开启点击反馈(表现为点击时加上灰色背景) (默认 false ) 
+	 * @property {Boolean}			isLink			是否展示右侧箭头并开启点击反馈 (默认 false )
+	 * @property {Boolean}			required		是否显示表单状态下的必填星号(此组件可能会内嵌入input组件) (默认 false )
+	 * @property {String}			rightIcon		右侧的图标箭头 (默认 'arrow-right')
+	 * @property {String}			arrowDirection	右侧箭头的方向,可选值为:left,up,down
+	 * @property {Object | String}			rightIconStyle	右侧箭头图标的样式
+	 * @property {Object | String}			titleStyle		标题的样式
+	 * @property {Object | String}			iconStyle		左侧图标样式
+	 * @property {String}			size			单位元的大小,可选值为 large,normal,mini 
+	 * @property {Boolean}			stop			点击cell是否阻止事件传播 (默认 true )
+	 * @property {Object}			customStyle		定义需要用到的外部样式
+	 * 
+	 * @event {Function}			click			点击cell列表时触发
+	 * @example 该组件需要搭配cell-group组件使用,见官方文档示例
+	 */
+	export default {
+		name: 'u-cell',
+		data() {
+			return {
+
+			}
+		},
+		mixins: [mpMixin, mixin, props],
+		computed: {
+			titleTextStyle() {
+				return addStyle(this.titleStyle)
+			}
+		},
+		emits: ['click'],
+		methods: {
+			addStyle,
+			testEmpty: test.empty,
+			// 点击cell
+			clickHandler(e) {
+				if (this.disabled) return
+				this.$emit('click', {
+					name: this.name
+				})
+				// 如果配置了url(此props参数通过mixin引入)参数,跳转页面
+				this.openPage()
+				// 是否阻止事件传播
+				this.stop && this.preventEvent(e)
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	$u-cell-padding: 13px 15px !default;
+	$u-cell-font-size: 15px !default;
+	$u-cell-line-height: 24px !default;
+	$u-cell-color: $u-main-color !default;
+	$u-cell-icon-size: 16px !default;
+	$u-cell-title-font-size: 15px !default;
+	$u-cell-title-line-height: 22px !default;
+	$u-cell-title-color: $u-main-color !default;
+	$u-cell-label-font-size: 12px !default;
+	$u-cell-label-color: $u-tips-color !default;
+	$u-cell-label-line-height: 18px !default;
+	$u-cell-value-font-size: 14px !default;
+	$u-cell-value-color: $u-content-color !default;
+	$u-cell-clickable-color: $u-bg-color !default;
+	$u-cell-disabled-color: #c8c9cc !default;
+	$u-cell-padding-top-large: 13px !default;
+	$u-cell-padding-bottom-large: 13px !default;
+	$u-cell-value-font-size-large: 15px !default;
+	$u-cell-label-font-size-large: 14px !default;
+	$u-cell-title-font-size-large: 16px !default;
+	$u-cell-left-icon-wrap-margin-right: 4px !default;
+	$u-cell-right-icon-wrap-margin-left: 4px !default;
+	$u-cell-title-flex:1 !default;
+	$u-cell-label-margin-top:5px !default;
+
+
+	.u-cell {
+		&__body {
+			@include flex();
+			/* #ifndef APP-NVUE */
+			box-sizing: border-box;
+			/* #endif */
+			padding: $u-cell-padding;
+			font-size: $u-cell-font-size;
+			color: $u-cell-color;
+			// line-height: $u-cell-line-height;
+			align-items: center;
+
+			&__content {
+				@include flex(row);
+				align-items: center;
+				flex: 1;
+			}
+
+			&--large {
+				padding-top: $u-cell-padding-top-large;
+				padding-bottom: $u-cell-padding-bottom-large;
+			}
+		}
+
+		&__left-icon-wrap,
+		&__right-icon-wrap {
+			@include flex();
+			align-items: center;
+			// height: $u-cell-line-height;
+			font-size: $u-cell-icon-size;
+		}
+
+		&__left-icon-wrap {
+			margin-right: $u-cell-left-icon-wrap-margin-right;
+		}
+
+		&__right-icon-wrap {
+			margin-left: $u-cell-right-icon-wrap-margin-left;
+			transition: transform 0.3s;
+
+			&--up {
+				transform: rotate(-90deg);
+			}
+
+			&--down {
+				transform: rotate(90deg);
+			}
+		}
+
+		&__title {
+			flex: $u-cell-title-flex;
+
+			&-text {
+				font-size: $u-cell-title-font-size;
+				line-height: $u-cell-title-line-height;
+				color: $u-cell-title-color;
+
+				&--large {
+					font-size: $u-cell-title-font-size-large;
+				}
+			}
+
+		}
+
+		&__label {
+			margin-top: $u-cell-label-margin-top;
+			font-size: $u-cell-label-font-size;
+			color: $u-cell-label-color;
+			line-height: $u-cell-label-line-height;
+
+			&--large {
+				font-size: $u-cell-label-font-size-large;
+			}
+		}
+
+		&__value {	
+			text-align: right;
+			/* #ifndef APP-NVUE */
+			margin-left: auto;
+			/* #endif */	
+			font-size: $u-cell-value-font-size;
+			line-height: $u-cell-line-height;
+			color: $u-cell-value-color;
+			&--large {
+				font-size: $u-cell-value-font-size-large;
+			}
+		}
+
+		&--clickable {
+			background-color: $u-cell-clickable-color;
+		}
+
+		&--disabled {
+			color: $u-cell-disabled-color;
+			/* #ifndef APP-NVUE */
+			cursor: not-allowed;
+			/* #endif */
+		}
+
+		&--center {
+			align-items: center;
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-checkbox-group/props.js b/uni_modules/uview-plus/components/u-checkbox-group/props.js
new file mode 100644
index 0000000..f81c966
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-checkbox-group/props.js
@@ -0,0 +1,92 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 标识符
+        name: {
+            type: String,
+            default: () => defProps.checkboxGroup.name
+        },
+		// #ifdef VUE3
+		// 绑定的值
+		modelValue: {
+		    type: Array,
+		    default: () => defProps.checkboxGroup.value
+		},
+		// #endif
+		// #ifdef VUE2
+		// 绑定的值
+		value: {
+		    type: Array,
+		    default: () => defProps.checkboxGroup.value
+		},
+		// #endif
+        // 形状,circle-圆形,square-方形
+        shape: {
+            type: String,
+            default: () => defProps.checkboxGroup.shape
+        },
+        // 是否禁用全部checkbox
+        disabled: {
+            type: Boolean,
+            default: () => defProps.checkboxGroup.disabled
+        },
+
+        // 选中状态下的颜色,如设置此值,将会覆盖parent的activeColor值
+        activeColor: {
+            type: String,
+            default: () => defProps.checkboxGroup.activeColor
+        },
+        // 未选中的颜色
+        inactiveColor: {
+            type: String,
+            default: () => defProps.checkboxGroup.inactiveColor
+        },
+
+        // 整个组件的尺寸,默认px
+        size: {
+            type: [String, Number],
+            default: () => defProps.checkboxGroup.size
+        },
+        // 布局方式,row-横向,column-纵向
+        placement: {
+            type: String,
+            default: () => defProps.checkboxGroup.placement
+        },
+        // label的字体大小,px单位
+        labelSize: {
+            type: [String, Number],
+            default: () => defProps.checkboxGroup.labelSize
+        },
+        // label的字体颜色
+        labelColor: {
+            type: [String],
+            default: () => defProps.checkboxGroup.labelColor
+        },
+        // 是否禁止点击文本操作
+        labelDisabled: {
+            type: Boolean,
+            default: () => defProps.checkboxGroup.labelDisabled
+        },
+        // 图标颜色
+        iconColor: {
+            type: String,
+            default: () => defProps.checkboxGroup.iconColor
+        },
+        // 图标的大小,单位px
+        iconSize: {
+            type: [String, Number],
+            default: () => defProps.checkboxGroup.iconSize
+        },
+        // 勾选图标的对齐方式,left-左边,right-右边
+        iconPlacement: {
+            type: String,
+            default: () => defProps.checkboxGroup.iconPlacement
+        },
+        // 竖向配列时,是否显示下划线
+        borderBottom: {
+            type: Boolean,
+            default: () => defProps.checkboxGroup.borderBottom
+        }
+
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-checkbox-group/u-checkbox-group.vue b/uni_modules/uview-plus/components/u-checkbox-group/u-checkbox-group.vue
new file mode 100644
index 0000000..a99cc40
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-checkbox-group/u-checkbox-group.vue
@@ -0,0 +1,133 @@
+<template>
+	<view
+	    class="u-checkbox-group"
+	    :class="bemClass"
+	>
+		<slot></slot>
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	/**
+	 * checkboxGroup 复选框组
+	 * @description 复选框组件一般用于需要多个选择的场景,该组件功能完整,使用方便
+	 * @tutorial https://ijry.github.io/uview-plus/components/checkbox.html
+	 * @property {String}			name			标识符 
+	 * @property {Array}			value			绑定的值
+	 * @property {String}			shape			形状,circle-圆形,square-方形 (默认 'square' )
+	 * @property {Boolean}			disabled		是否禁用全部checkbox (默认 false )
+	 * @property {String}			activeColor		选中状态下的颜色,如设置此值,将会覆盖parent的activeColor值 (默认 '#2979ff' )
+	 * @property {String}			inactiveColor	未选中的颜色 (默认 '#c8c9cc' )
+	 * @property {String | Number}	size			整个组件的尺寸 单位px (默认 18 )
+	 * @property {String}			placement		布局方式,row-横向,column-纵向 (默认 'row' )
+	 * @property {String | Number}	labelSize		label的字体大小,px单位  (默认 14 )
+	 * @property {String}			labelColor		label的字体颜色 (默认 '#303133' )
+	 * @property {Boolean}			labelDisabled	是否禁止点击文本操作 (默认 false )
+	 * @property {String}			iconColor		图标颜色 (默认 '#ffffff' )
+	 * @property {String | Number}	iconSize		图标的大小,单位px (默认 12 )
+	 * @property {String}			iconPlacement	勾选图标的对齐方式,left-左边,right-右边  (默认 'left' )
+	 * @property {Boolean}			borderBottom	placement为row时,是否显示下边框 (默认 false )
+	 * @event {Function}	change	任一个checkbox状态发生变化时触发,回调为一个对象
+	 * @event {Function}	input	修改通过v-model绑定的值时触发,回调为一个对象
+	 * @example <u-checkbox-group></u-checkbox-group>
+	 */
+	export default {
+		name: 'u-checkbox-group',
+		mixins: [mpMixin, mixin,props],
+		computed: {
+			// 这里computed的变量,都是子组件u-checkbox需要用到的,由于头条小程序的兼容性差异,子组件无法实时监听父组件参数的变化
+			// 所以需要手动通知子组件,这里返回一个parentData变量,供watch监听,在其中去通知每一个子组件重新从父组件(u-checkbox-group)
+			// 拉取父组件新的变化后的参数
+			parentData() {
+			  return [
+				// #ifdef VUE2
+				this.value,
+				// #endif
+				// #ifdef VUE3
+				this.modelValue,
+				// #endif
+				this.disabled,
+				this.inactiveColor,
+				this.activeColor,
+				this.size,
+				this.labelDisabled,
+				this.shape,
+				this.iconSize,
+				this.borderBottom,
+				this.placement,
+			  ];
+			},
+			bemClass() {
+				// this.bem为一个computed变量,在mixin中
+				return this.bem('checkbox-group', ['placement'])
+			},
+		},
+		watch: {
+			// 当父组件需要子组件需要共享的参数发生了变化,手动通知子组件
+			parentData: {
+			  handler() {
+				if (this.children.length) {
+				  this.children.map((child) => {
+					// 判断子组件(u-checkbox)如果有init方法的话,就就执行(执行的结果是子组件重新从父组件拉取了最新的值)
+					typeof child.init === "function" && child.init();
+				  });
+				}
+			  },
+			  deep: true,
+			},
+		},
+		data() {
+			return {
+
+			}
+		},
+		created() {
+			this.children = []
+		},
+		// #ifdef VUE3
+		emits: ['update:modelValue', 'change'],
+		// #endif
+		methods: {
+			// 将其他的checkbox设置为未选中的状态
+			unCheckedOther(childInstance) {
+				const values = []
+				this.children.map(child => {
+					// 将被选中的checkbox,放到数组中返回
+					if (child.isChecked) {
+						values.push(child.name)
+					}
+				})
+				// 发出事件
+				this.$emit('change', values)
+				// 修改通过v-model绑定的值
+				// #ifdef VUE3
+				this.$emit("update:modelValue", values);
+				// #endif
+				// #ifdef VUE2
+				this.$emit("input", values);
+				// #endif
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-checkbox-group {
+
+		&--row {
+			/* #ifndef APP-NVUE */
+			display: flex;
+			/* #endif */
+			flex-flow: row wrap;
+		}
+
+		&--column {
+			@include flex(column);
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-checkbox/props.js b/uni_modules/uview-plus/components/u-checkbox/props.js
new file mode 100644
index 0000000..7825824
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-checkbox/props.js
@@ -0,0 +1,75 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // checkbox的名称
+        name: {
+            type: [String, Number, Boolean],
+            default: () => defProps.checkbox.name
+        },
+        // 形状,square为方形,circle为圆型
+        shape: {
+            type: String,
+            default: () => defProps.checkbox.shape
+        },
+        // 整体的大小
+        size: {
+            type: [String, Number],
+            default: () => defProps.checkbox.size
+        },
+        // 是否默认选中
+        checked: {
+            type: Boolean,
+            default: () => defProps.checkbox.checked
+        },
+        // 是否禁用
+        disabled: {
+            type: [String, Boolean],
+            default: () => defProps.checkbox.disabled
+        },
+        // 选中状态下的颜色,如设置此值,将会覆盖parent的activeColor值
+        activeColor: {
+            type: String,
+            default: () => defProps.checkbox.activeColor
+        },
+        // 未选中的颜色
+        inactiveColor: {
+            type: String,
+            default: () => defProps.checkbox.inactiveColor
+        },
+        // 图标的大小,单位px
+        iconSize: {
+            type: [String, Number],
+            default: () => defProps.checkbox.iconSize
+        },
+        // 图标颜色
+        iconColor: {
+            type: String,
+            default: () => defProps.checkbox.iconColor
+        },
+        // label提示文字,因为nvue下,直接slot进来的文字,由于特殊的结构,无法修改样式
+        label: {
+            type: [String, Number],
+            default: () => defProps.checkbox.label
+        },
+        // label的字体大小,px单位
+        labelSize: {
+            type: [String, Number],
+            default: () => defProps.checkbox.labelSize
+        },
+        // label的颜色
+        labelColor: {
+            type: String,
+            default: () => defProps.checkbox.labelColor
+        },
+        // 是否禁止点击提示语选中复选框
+        labelDisabled: {
+            type: [String, Boolean],
+            default: () => defProps.checkbox.labelDisabled
+        },
+		// 是否独立使用
+        usedAlone: {
+            type: [Boolean],
+            default: () => false
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-checkbox/u-checkbox.vue b/uni_modules/uview-plus/components/u-checkbox/u-checkbox.vue
new file mode 100644
index 0000000..f055d6d
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-checkbox/u-checkbox.vue
@@ -0,0 +1,374 @@
+<template>
+	<view
+	    class="u-checkbox cursor-pointer"
+	    :style="[checkboxStyle]"
+	    @tap.stop="wrapperClickHandler"
+	    :class="[`u-checkbox-label--${parentData.iconPlacement}`, parentData.borderBottom && parentData.placement === 'column' && 'u-border-bottom']"
+	>
+		<view
+		    class="u-checkbox__icon-wrap cursor-pointer"
+		    @tap.stop="iconClickHandler"
+		    :class="iconClasses"
+		    :style="[iconWrapStyle]"
+		>
+			<slot name="icon">
+				<u-icon
+				    class="u-checkbox__icon-wrap__icon"
+				    name="checkbox-mark"
+				    :size="elIconSize"
+				    :color="elIconColor"
+				/>
+			</slot>
+		</view>
+		<text
+		    @tap.stop="labelClickHandler"
+		    :style="{
+				color: elDisabled ? elInactiveColor : elLabelColor,
+				fontSize: elLabelSize,
+				lineHeight: elLabelSize
+			}"
+		>{{label}}</text>
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addStyle, addUnit, deepMerge, formValidate, error } from '../../libs/function/index';
+	import test from '../../libs/function/test';
+	/**
+	 * checkbox  复选框
+	 * @description 复选框组件一般用于需要多个选择的场景,该组件功能完整,使用方便
+	 * @tutorial https://uview-plus.jiangruyi.com/components/checkbox.html
+	 * @property {String | Number | Boolean}	name			checkbox组件的标示符
+	 * @property {String}						shape			形状,square为方形,circle为圆型
+	 * @property {String | Number}				size			整体的大小
+	 * @property {Boolean}						checked			是否默认选中
+	 * @property {String | Boolean}				disabled		是否禁用
+	 * @property {String}						activeColor		选中状态下的颜色,如设置此值,将会覆盖parent的activeColor值
+	 * @property {String}						inactiveColor	未选中的颜色
+	 * @property {String | Number}				iconSize		图标的大小,单位px
+	 * @property {String}						iconColor		图标颜色
+	 * @property {String | Number}				label			label提示文字,因为nvue下,直接slot进来的文字,由于特殊的结构,无法修改样式
+	 * @property {String}						labelColor 		label的颜色
+	 * @property {String | Number}				labelSize		label的字体大小,px单位
+	 * @property {String | Boolean}				labelDisabled	是否禁止点击提示语选中复选框
+	 * @property {Object}						customStyle		定义需要用到的外部样式
+	 * 
+	 * @event {Function}	change	任一个checkbox状态发生变化时触发,回调为一个对象
+	 * @example <u-checkbox v-model="checked" :disabled="false">天涯</u-checkbox>
+	 */
+	export default {
+		name: "u-checkbox",
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				isChecked: false,
+				// 父组件的默认值,因为头条小程序不支持在computed中使用this.parent.shape的形式
+				// 故只能使用如此方法
+				parentData: {
+					iconSize: 12,
+					labelDisabled: null,
+					disabled: null,
+					shape: 'square',
+					activeColor: null,
+					inactiveColor: null,
+					size: 18,
+					// #ifdef VUE2
+					value: null,
+					// #endif
+					// #ifdef VUE3
+					modelValue: null,
+					// #endif
+					iconColor: null,
+					placement: 'row',
+					borderBottom: false,
+					iconPlacement: 'left'
+				}
+			}
+		},
+		computed: {
+			// 是否禁用,如果父组件u-raios-group禁用的话,将会忽略子组件的配置
+			elDisabled() {
+				return this.disabled !== '' ? this.disabled : this.parentData.disabled !== null ? this.parentData.disabled : false;
+			},
+			// 是否禁用label点击
+			elLabelDisabled() {
+				return this.labelDisabled !== '' ? this.labelDisabled : this.parentData.labelDisabled !== null ? this.parentData.labelDisabled :
+					false;
+			},
+			// 组件尺寸,对应size的值,默认值为21px
+			elSize() {
+				return this.size ? this.size : (this.parentData.size ? this.parentData.size : 21);
+			},
+			// 组件的勾选图标的尺寸,默认12px
+			elIconSize() {
+				return this.iconSize ? this.iconSize : (this.parentData.iconSize ? this.parentData.iconSize : 12);
+			},
+			// 组件选中激活时的颜色
+			elActiveColor() {
+				return this.activeColor ? this.activeColor : (this.parentData.activeColor ? this.parentData.activeColor : '#2979ff');
+			},
+			// 组件选未中激活时的颜色
+			elInactiveColor() {
+				return this.inactiveColor ? this.inactiveColor : (this.parentData.inactiveColor ? this.parentData.inactiveColor :
+					'#c8c9cc');
+			},
+			// label的颜色
+			elLabelColor() {
+				return this.labelColor ? this.labelColor : (this.parentData.labelColor ? this.parentData.labelColor : '#606266')
+			},
+			// 组件的形状
+			elShape() {
+				return this.shape ? this.shape : (this.parentData.shape ? this.parentData.shape : 'circle');
+			},
+			// label大小
+			elLabelSize() {
+				return addUnit(this.labelSize ? this.labelSize : (this.parentData.labelSize ? this.parentData.labelSize :
+					'15'))
+			},
+			elIconColor() {
+				const iconColor = this.iconColor ? this.iconColor : (this.parentData.iconColor ? this.parentData.iconColor :
+					'#ffffff');
+				// 图标的颜色
+				if (this.elDisabled) {
+					// disabled状态下,已勾选的checkbox图标改为elInactiveColor
+					return this.isChecked ? this.elInactiveColor : 'transparent'
+				} else {
+					return this.isChecked ? iconColor : 'transparent'
+				}
+			},
+			iconClasses() {
+				let classes = []
+				// 组件的形状
+				classes.push('u-checkbox__icon-wrap--' + this.elShape)
+				if (this.elDisabled) {
+					classes.push('u-checkbox__icon-wrap--disabled')
+				}
+				if (this.isChecked && this.elDisabled) {
+					classes.push('u-checkbox__icon-wrap--disabled--checked')
+				}
+				// 支付宝,头条小程序无法动态绑定一个数组类名,否则解析出来的结果会带有",",而导致失效
+				// #ifdef MP-ALIPAY || MP-TOUTIAO
+				classes = classes.join(' ')
+				// #endif
+				return classes
+			},
+			iconWrapStyle() {
+				// checkbox的整体样式
+				const style = {}
+				style.backgroundColor = this.isChecked && !this.elDisabled ? this.elActiveColor : '#ffffff'
+				style.borderColor = this.isChecked && !this.elDisabled ? this.elActiveColor : this.elInactiveColor
+				style.width = addUnit(this.elSize)
+				style.height = addUnit(this.elSize)
+				// 如果是图标在右边的话,移除它的右边距
+				if (!this.usedAlone) {
+					if (this.parentData.iconPlacement === 'right') {
+						style.marginRight = 0
+					}
+				}
+				return style
+			},
+			checkboxStyle() {
+				const style = {}
+				if (!this.usedAlone) {
+					if (this.parentData.borderBottom && this.parentData.placement === 'row') {
+						error('检测到您将borderBottom设置为true,需要同时将u-checkbox-group的placement设置为column才有效')
+					}
+					// 当父组件设置了显示下边框并且排列形式为纵向时,给内容和边框之间加上一定间隔
+					if (this.parentData.borderBottom && this.parentData.placement === 'column') {
+						style.paddingBottom = '8px'
+					}
+				}
+				return deepMerge(style, addStyle(this.customStyle))
+			}
+		},
+		mounted() {
+			this.init()
+		},
+		emits: ["change"],
+		methods: {
+			init() {
+				if (!this.usedAlone) {
+					// 支付宝小程序不支持provide/inject,所以使用这个方法获取整个父组件,在created定义,避免循环引用
+					this.updateParentData()
+					if (!this.parent) {
+						error('u-checkbox必须搭配u-checkbox-group组件使用')
+					}
+				}
+				// #ifdef VUE2
+				const value = this.parentData.value
+				// #endif
+				// #ifdef VUE3
+				const value = this.parentData.modelValue
+				// #endif
+				// 设置初始化时,是否默认选中的状态,父组件u-checkbox-group的value可能是array,所以额外判断
+				if (this.checked) {
+					this.isChecked = true
+				} else if (!this.usedAlone && test.array(value)) {
+					// 查找数组是是否存在this.name元素值
+					this.isChecked = value.some(item => {
+						return item === this.name
+					})
+				}
+			},
+			updateParentData() {
+				this.getParentData('u-checkbox-group')
+			},
+			// 横向两端排列时,点击组件即可触发选中事件
+			wrapperClickHandler(e) {
+				if (!this.usedAlone) {
+					this.parentData.iconPlacement === 'right' && this.iconClickHandler(e)
+				} else {
+					this.iconClickHandler(e)
+				}
+			},
+			// 点击图标
+			iconClickHandler(e) {
+				this.preventEvent(e)
+				// 如果整体被禁用,不允许被点击
+				if (!this.elDisabled) {
+					this.setRadioCheckedStatus()
+				}
+			},
+			// 点击label
+			labelClickHandler(e) {
+				this.preventEvent(e)
+				// 如果按钮整体被禁用或者label被禁用,则不允许点击文字修改状态
+				if (!this.elLabelDisabled && !this.elDisabled) {
+					this.setRadioCheckedStatus()
+				}
+			},
+			emitEvent() {
+				this.$emit('change', this.isChecked)
+				// 尝试调用u-form的验证方法,进行一定延迟,否则微信小程序更新可能会不及时
+				this.$nextTick(() => {
+					formValidate(this, 'change')
+				})
+			},
+			// 改变组件选中状态
+			// 这里的改变的依据是,更改本组件的checked值为true,同时通过父组件遍历所有u-checkbox实例
+			// 将本组件外的其他u-checkbox的checked都设置为false(都被取消选中状态),因而只剩下一个为选中状态
+			setRadioCheckedStatus() {
+				// 将本组件标记为与原来相反的状态
+				this.isChecked = !this.isChecked
+				this.emitEvent()
+				if (!this.usedAlone) {
+					typeof this.parent.unCheckedOther === 'function' && this.parent.unCheckedOther(this)
+				}
+			}
+		},
+		watch:{
+			checked(){
+				this.isChecked = this.checked
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+	$u-checkbox-icon-wrap-margin-right:6px !default;
+	$u-checkbox-icon-wrap-font-size:6px !default;
+	$u-checkbox-icon-wrap-border-width:1px !default;
+	$u-checkbox-icon-wrap-border-color:#c8c9cc !default;
+	$u-checkbox-icon-wrap-icon-line-height:0 !default;
+	$u-checkbox-icon-wrap-circle-border-radius:100% !default;
+	$u-checkbox-icon-wrap-square-border-radius:3px !default;
+	$u-checkbox-icon-wrap-checked-color:#fff !default;
+	$u-checkbox-icon-wrap-checked-background-color:red !default;
+	$u-checkbox-icon-wrap-checked-border-color:#2979ff !default;
+	$u-checkbox-icon-wrap-disabled-background-color:#ebedf0 !default;
+	$u-checkbox-icon-wrap-disabled-checked-color:#c8c9cc !default;
+	$u-checkbox-label-margin-left:5px !default;
+	$u-checkbox-label-margin-right:12px !default;
+	$u-checkbox-label-color:$u-content-color !default;
+	$u-checkbox-label-font-size:15px !default;
+	$u-checkbox-label-disabled-color:#c8c9cc !default;
+
+	.u-checkbox {
+		/* #ifndef APP-NVUE */
+		@include flex(row);
+		/* #endif */
+		overflow: hidden;
+		flex-direction: row;
+		align-items: center;
+		margin-bottom: 5px;
+		margin-top: 5px;
+
+		&-label--left {
+			flex-direction: row
+		}
+
+		&-label--right {
+			flex-direction: row-reverse;
+			justify-content: space-between
+		}
+
+		&__icon-wrap {
+			/* #ifndef APP-NVUE */
+			box-sizing: border-box;
+			// nvue下,border-color过渡有问题
+			transition-property: border-color, background-color, color;
+			transition-duration: 0.2s;
+			/* #endif */
+			color: $u-content-color;
+			@include flex;
+			align-items: center;
+			justify-content: center;
+			color: transparent;
+			text-align: center;
+			margin-right: $u-checkbox-icon-wrap-margin-right;
+
+			font-size: $u-checkbox-icon-wrap-font-size;
+			border-width: $u-checkbox-icon-wrap-border-width;
+			border-color: $u-checkbox-icon-wrap-border-color;
+			border-style: solid;
+
+			/* #ifdef MP-TOUTIAO */
+			// 头条小程序兼容性问题,需要设置行高为0,否则图标偏下
+			&__icon {
+				line-height: $u-checkbox-icon-wrap-icon-line-height;
+			}
+
+			/* #endif */
+
+			&--circle {
+				border-radius: $u-checkbox-icon-wrap-circle-border-radius;
+			}
+
+			&--square {
+				border-radius: $u-checkbox-icon-wrap-square-border-radius;
+			}
+
+			&--checked {
+				color: $u-checkbox-icon-wrap-checked-color;
+				background-color: $u-checkbox-icon-wrap-checked-background-color;
+				border-color: $u-checkbox-icon-wrap-checked-border-color;
+			}
+
+			&--disabled {
+				background-color: $u-checkbox-icon-wrap-disabled-background-color !important;
+			}
+
+			&--disabled--checked {
+				color: $u-checkbox-icon-wrap-disabled-checked-color !important;
+			}
+		}
+
+		&__label {
+			/* #ifndef APP-NVUE */
+			word-wrap: break-word;
+			/* #endif */
+			margin-left: $u-checkbox-label-margin-left;
+			margin-right: $u-checkbox-label-margin-right;
+			color: $u-checkbox-label-color;
+			font-size: $u-checkbox-label-font-size;
+
+			&--disabled {
+				color: $u-checkbox-label-disabled-color;
+			}
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-circle-progress/props.js b/uni_modules/uview-plus/components/u-circle-progress/props.js
new file mode 100644
index 0000000..b07e6e2
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-circle-progress/props.js
@@ -0,0 +1,9 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        percentage: {
+            type: [String, Number],
+            default: () => defProps.circleProgress.percentage
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-circle-progress/u-circle-progress.vue b/uni_modules/uview-plus/components/u-circle-progress/u-circle-progress.vue
new file mode 100644
index 0000000..77b79af
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-circle-progress/u-circle-progress.vue
@@ -0,0 +1,201 @@
+<template>
+	<view class="u-circle-progress">
+		<view class="u-circle-progress__left">
+			<view
+			    class="u-circle-progress__left__circle"
+			    :style="[leftSyle]"
+			    ref="left-circle"
+			>
+
+			</view>
+		</view>
+		<view
+		    class="u-circle-progress__right"
+		>
+			<view
+			    class="u-circle-progress__right__circle"
+			    ref="right-circle"
+				:style="[rightSyle]"
+			>
+
+			</view>
+		</view>
+		<view class="u-circle-progress__circle">
+
+		</view>
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import {sleep } from '../../libs/function/index';
+	// #ifdef APP-NVUE
+	const animation = uni.requireNativePlugin('animation')
+	// #endif
+	/**
+	 * CircleProgress 圆形进度条 TODO: 待完善 
+	 * @description 展示操作或任务的当前进度,比如上传文件,是一个圆形的进度环。
+	 * @tutorial https://ijry.github.io/uview-plus/components/circleProgress.html
+	 * @property {String | Number}	percentage	圆环进度百分比值,为数值类型,0-100 (默认 30 )
+	 * @example
+	 */
+	export default {
+		name: 'u-circle-progress',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				leftBorderColor: 'rgb(200, 200, 200)',
+				rightBorderColor: 'rgb(200, 200, 200)',
+			}
+		},
+		computed: {
+			leftSyle() {
+				const style = {}
+				style.borderTopColor = this.leftBorderColor
+				style.borderRightColor = this.leftBorderColor
+				return style
+			},
+			rightSyle() {
+				const style = {}
+				style.borderLeftColor = this.rightBorderColor
+				style.borderBottomColor = this.rightBorderColor
+				return style
+			}
+		},
+		mounted() {
+			sleep().then(() => {
+				this.rightBorderColor = 'rgb(66, 185, 131)'
+				// this.init()
+			})
+		},
+		methods: {
+			init() {
+				animation.transition(this.$refs['right-circle'].ref, {
+					styles: {
+						transform: 'rotate(45deg)',
+						transformOrigin: 'center center'
+					},
+				}, () => {
+					this.rightBorderColor = 'rgb(66, 185, 131)'
+					// animation.transition(this.$refs['right-circle'].ref, {
+					// 	styles: {
+					// 		transform: 'rotate(225deg)',
+					// 		transformOrigin: 'center center'
+					// 	},
+					// 	duration: 3000,
+					// }, () => {
+					// 	animation.transition(this.$refs['left-circle'].ref, {
+					// 		styles: {
+					// 			transform: 'rotate(45deg)',
+					// 			transformOrigin: 'center center'
+					// 		},
+					// 	}, () => {
+					// 		this.leftBorderColor = 'rgb(66, 185, 131)'
+					// 		animation.transition(this.$refs['left-circle'].ref, {
+					// 			styles: {
+					// 				transform: 'rotate(225deg)',
+					// 				transformOrigin: 'center center'
+					// 			},
+					// 			duration: 1500,
+					// 		}, () => {
+
+					// 		})
+					// 	})
+					// })
+				})
+
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-circle-progress {
+		@include flex(row);
+		position: relative;
+		border-radius: 100px;
+		height: 100px;
+		width: 100px;
+		// transform: rotate(0deg);
+		// background-color: rgb(66, 185, 131);
+		background-color: rgb(200, 200, 200);
+		overflow: hidden;
+		justify-content: space-between;
+
+		&__circle {
+			border-radius: 100px;
+			height: 90px;
+			width: 90px;
+			transform: translate(-50%, -50%);
+			background-color: rgb(255, 255, 255);
+			left: 50px;
+			top: 50px;
+			position: absolute;
+		}
+
+		&__left {
+			position: absolute;
+			left: 0;
+			width: 50px;
+			height: 100px;
+			overflow: hidden;
+			box-sizing: border-box;
+			// background-color: rgb(66, 185, 131);
+			// background-color: rgb(200, 200, 200);
+			// transform-origin: left center;
+
+			&__circle {
+				box-sizing: border-box;
+				// background-color: red;
+				border-left-color: transparent;
+				border-bottom-color: transparent;
+				border-top-left-radius: 50px;
+				border-top-right-radius: 50px;
+				border-bottom-right-radius: 50px;
+				// border-left-color: rgb(66, 185, 131);
+				// border-bottom-color: rgb(66, 185, 131);
+				border-top-color: rgb(66, 185, 131);
+				border-right-color: rgb(66, 185, 131);
+				border-width: 5px;
+				width: 100px;
+				height: 100px;
+				transform: rotate(225deg);
+				// border-radius: 100px;
+			}
+		}
+
+		&__right {
+			position: absolute;
+			right: 0;
+			width: 50px;
+			height: 100px;
+			overflow: hidden;
+
+			&__circle {
+				position: absolute;
+				right: 0;
+				box-sizing: border-box;
+				// background-color: red;
+				border-top-color: transparent;
+				border-right-color: transparent;
+				border-top-left-radius: 50px;
+				border-bottom-left-radius: 50px;
+				border-bottom-right-radius: 50px;
+				// border-left-color: rgb(66, 185, 131);
+				// border-bottom-color: rgb(66, 185, 131);
+				border-left-color: rgb(200, 200, 200);
+				border-bottom-color: rgb(200, 200, 200);
+				border-width: 5px;
+				width: 100px;
+				height: 100px;
+				transform: rotate(45deg);
+				transform-origin: center center;
+				// border-radius: 100px;
+			}
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-code-input/props.js b/uni_modules/uview-plus/components/u-code-input/props.js
new file mode 100644
index 0000000..1a0893c
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-code-input/props.js
@@ -0,0 +1,89 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+		// 键盘弹起时,是否自动上推页面
+		adjustPosition: {
+			type: Boolean,
+            default: () => defProps.codeInput.adjustPosition
+		},
+        // 最大输入长度
+        maxlength: {
+            type: [String, Number],
+            default: () => defProps.codeInput.maxlength
+        },
+        // 是否用圆点填充
+        dot: {
+            type: Boolean,
+            default: () => defProps.codeInput.dot
+        },
+        // 显示模式,box-盒子模式,line-底部横线模式
+        mode: {
+            type: String,
+            default: () => defProps.codeInput.mode
+        },
+        // 是否细边框
+        hairline: {
+            type: Boolean,
+            default: () => defProps.codeInput.hairline
+        },
+        // 字符间的距离
+        space: {
+            type: [String, Number],
+            default: () => defProps.codeInput.space
+        },
+		// #ifdef VUE3
+		// 预置值
+		modelValue: {
+			type: [String, Number],
+			default: () => defProps.codeInput.value
+		},
+		// #endif
+		// #ifdef VUE2
+		// 预置值
+		value: {
+			type: [String, Number],
+			default: () => defProps.codeInput.value
+		},
+		// #endif
+        // 是否自动获取焦点
+        focus: {
+            type: Boolean,
+            default: () => defProps.codeInput.focus
+        },
+        // 字体是否加粗
+        bold: {
+            type: Boolean,
+            default: () => defProps.codeInput.bold
+        },
+        // 字体颜色
+        color: {
+            type: String,
+            default: () => defProps.codeInput.color
+        },
+        // 字体大小
+        fontSize: {
+            type: [String, Number],
+            default: () => defProps.codeInput.fontSize
+        },
+        // 输入框的大小,宽等于高
+        size: {
+            type: [String, Number],
+            default: () => defProps.codeInput.size
+        },
+        // 是否隐藏原生键盘,如果想用自定义键盘的话,需设置此参数为true
+        disabledKeyboard: {
+            type: Boolean,
+            default: () => defProps.codeInput.disabledKeyboard
+        },
+        // 边框和线条颜色
+        borderColor: {
+            type: String,
+            default: () => defProps.codeInput.borderColor
+        },
+		// 是否禁止输入"."符号
+		disabledDot: {
+			type: Boolean,
+			default: () => defProps.codeInput.disabledDot
+		}
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-code-input/u-code-input.vue b/uni_modules/uview-plus/components/u-code-input/u-code-input.vue
new file mode 100644
index 0000000..9cf1564
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-code-input/u-code-input.vue
@@ -0,0 +1,266 @@
+<template>
+	<view class="u-code-input">
+		<view
+			class="u-code-input__item"
+			:style="[itemStyle(index)]"
+			v-for="(item, index) in codeLength"
+			:key="index"
+		>
+			<view
+				class="u-code-input__item__dot"
+				v-if="dot && codeArray.length > index"
+			></view>
+			<text
+				v-else
+				:style="{
+					fontSize: addUnit(fontSize),
+					fontWeight: bold ? 'bold' : 'normal',
+					color: color
+				}"
+			>{{codeArray[index]}}</text>
+			<view
+				class="u-code-input__item__line"
+				v-if="mode === 'line'"
+				:style="[lineStyle]"
+			></view>
+			<!-- #ifndef APP-PLUS -->
+			<view v-if="isFocus && codeArray.length === index" :style="{backgroundColor: color}" class="u-code-input__item__cursor"></view>
+			<!-- #endif -->
+		</view>
+		<input
+			:disabled="disabledKeyboard"
+			type="number"
+			:focus="focus"
+			:value="inputValue"
+			:maxlength="maxlength"
+			:adjustPosition="adjustPosition"
+			class="u-code-input__input"
+			@input="inputHandler"
+			:style="{
+				height: addUnit(size)
+			}"
+			@focus="isFocus = true"
+			@blur="isFocus = false"
+		/>
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addUnit, getPx } from '../../libs/function/index';
+	/**
+	 * CodeInput 验证码输入
+	 * @description 该组件一般用于验证用户短信验证码的场景,也可以结合uview-plus的键盘组件使用
+	 * @tutorial https://ijry.github.io/uview-plus/components/codeInput.html
+	 * @property {String | Number}	maxlength			最大输入长度 (默认 6 )
+	 * @property {Boolean}			dot					是否用圆点填充 (默认 false )
+	 * @property {String}			mode				显示模式,box-盒子模式,line-底部横线模式 (默认 'box' )
+	 * @property {Boolean}			hairline			是否细边框 (默认 false )
+	 * @property {String | Number}	space				字符间的距离 (默认 10 )
+	 * @property {String | Number}	value				预置值
+	 * @property {Boolean}			focus				是否自动获取焦点 (默认 false )
+	 * @property {Boolean}			bold				字体和输入横线是否加粗 (默认 false )
+	 * @property {String}			color				字体颜色 (默认 '#606266' )
+	 * @property {String | Number}	fontSize			字体大小,单位px (默认 18 )
+	 * @property {String | Number}	size				输入框的大小,宽等于高 (默认 35 )
+	 * @property {Boolean}			disabledKeyboard	是否隐藏原生键盘,如果想用自定义键盘的话,需设置此参数为true (默认 false )
+	 * @property {String}			borderColor			边框和线条颜色 (默认 '#c9cacc' )
+	 * @property {Boolean}			disabledDot			是否禁止输入"."符号 (默认 true )
+	 * 
+	 * @event {Function}	change	输入内容发生改变时触发,具体见上方说明			value:当前输入的值
+	 * @event {Function}	finish	输入字符个数达maxlength值时触发,见上方说明	value:当前输入的值
+	 * @example	<u-code-input v-model="value4" :focus="true"></u-code-input>
+	 */
+	export default {
+		name: 'u-code-input',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				inputValue: '',
+				isFocus: this.focus
+			}
+		},
+		watch: {
+			// #ifdef VUE2
+			value: {
+			// #endif
+			// #ifdef VUE3
+			modelValue: {
+			// #endif
+				immediate: true,
+				handler(val) {
+					// 转为字符串,超出部分截掉
+					this.inputValue = String(val).substring(0, this.maxlength)
+				}
+			},
+		},
+		computed: {
+			// 根据长度,循环输入框的个数,因为头条小程序数值不能用于v-for
+			codeLength() {
+				return new Array(Number(this.maxlength))
+			},
+			// 循环item的样式
+			itemStyle() {
+				return index => {
+					const style = {
+						width: addUnit(this.size),
+						height: addUnit(this.size)
+					}
+					// 盒子模式下,需要额外进行处理
+					if (this.mode === 'box') {
+						// 设置盒子的边框,如果是细边框,则设置为0.5px宽度
+						style.border = `${this.hairline ? 0.5 : 1}px solid ${this.borderColor}`
+						// 如果盒子间距为0的话
+						if (getPx(this.space) === 0) {
+							// 给第一和最后一个盒子设置圆角
+							if (index === 0) {
+								style.borderTopLeftRadius = '3px'
+								style.borderBottomLeftRadius = '3px'
+							}
+							if (index === this.codeLength.length - 1) {
+								style.borderTopRightRadius = '3px'
+								style.borderBottomRightRadius = '3px'
+							}
+							// 最后一个盒子的右边框需要保留
+							if (index !== this.codeLength.length - 1) {
+								style.borderRight = 'none'
+							}
+						}
+					}
+					if (index !== this.codeLength.length - 1) {
+						// 设置验证码字符之间的距离,通过margin-right设置,最后一个字符,无需右边框
+						style.marginRight = addUnit(this.space)
+					} else {
+						// 最后一个盒子的有边框需要保留
+						style.marginRight = 0
+					}
+
+					return style
+				}
+			},
+			// 将输入的值,转为数组,给item历遍时,根据当前的索引显示数组的元素
+			codeArray() {
+				return String(this.inputValue).split('')
+			},
+			// 下划线模式下,横线的样式
+			lineStyle() {
+				const style = {}
+				style.height = this.hairline ? '2px' : '4px'
+				style.width = addUnit(this.size)
+				// 线条模式下,背景色即为边框颜色
+				style.backgroundColor = this.borderColor
+				return style
+			}
+		},
+		emits: ["change", 'finish', "update:modelValue"],
+		methods: {
+			addUnit,
+			// 监听输入框的值发生变化
+			inputHandler(e) {
+				const value = e.detail.value
+				this.inputValue = value
+				// 是否允许输入“.”符号
+				if(this.disabledDot) {
+					this.$nextTick(() => {
+						this.inputValue = value.replace('.', '')
+					})
+				}
+				// 未达到maxlength之前,发送change事件,达到后发送finish事件
+				this.$emit('change', value)
+				// 修改通过v-model双向绑定的值
+				// #ifdef VUE3
+                this.$emit("update:modelValue", value);
+                // #endif
+                // #ifdef VUE2
+                this.$emit("input", value);
+                // #endif
+				// 达到用户指定输入长度时,发出完成事件
+				if (String(value).length >= Number(this.maxlength)) {
+					this.$emit('finish', value)
+				}
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+	$u-code-input-cursor-width: 1px;
+	$u-code-input-cursor-height: 40%;
+	$u-code-input-cursor-animation-duration: 1s;
+	$u-code-input-cursor-animation-name: u-cursor-flicker;
+
+	.u-code-input {
+		@include flex;
+		position: relative;
+		overflow: hidden;
+
+		&__item {
+			@include flex;
+			justify-content: center;
+			align-items: center;
+			position: relative;
+
+			&__text {
+				font-size: 15px;
+				color: $u-content-color;
+			}
+
+			&__dot {
+				width: 7px;
+				height: 7px;
+				border-radius: 100px;
+				background-color: $u-content-color;
+			}
+
+			&__line {
+				position: absolute;
+				bottom: 0;
+				height: 4px;
+				border-radius: 100px;
+				width: 40px;
+				background-color: $u-content-color;
+			}
+			/* #ifndef APP-PLUS */
+			&__cursor {
+				position: absolute;
+				top: 50%;
+				left: 50%;
+				transform: translate(-50%,-50%);
+				width: $u-code-input-cursor-width;
+				height: $u-code-input-cursor-height;
+				animation: $u-code-input-cursor-animation-duration u-cursor-flicker infinite;
+			}
+			/* #endif */
+			
+		}
+
+		&__input {
+			// 之所以需要input输入框,是因为有它才能唤起键盘
+			// 这里将它设置为两倍的屏幕宽度,再将左边的一半移出屏幕,为了不让用户看到输入的内容
+			position: absolute;
+			left: -750rpx;
+			width: 1500rpx;
+			top: 0;
+			background-color: transparent;
+			text-align: left;
+		}
+	}
+	
+	/* #ifndef APP-PLUS */
+	@keyframes u-cursor-flicker {
+		0% {
+		    opacity: 0;
+		}
+		50% {
+		    opacity: 1;
+		}
+		100% {
+		    opacity: 0;
+		}
+	}
+	/* #endif */
+
+</style>
diff --git a/uni_modules/uview-plus/components/u-code/props.js b/uni_modules/uview-plus/components/u-code/props.js
new file mode 100644
index 0000000..b564045
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-code/props.js
@@ -0,0 +1,35 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 倒计时总秒数
+        seconds: {
+            type: [String, Number],
+            default: () => defProps.code.seconds
+        },
+        // 尚未开始时提示
+        startText: {
+            type: String,
+            default: () => defProps.code.startText
+        },
+        // 正在倒计时中的提示
+        changeText: {
+            type: String,
+            default: () => defProps.code.changeText
+        },
+        // 倒计时结束时的提示
+        endText: {
+            type: String,
+            default: () => defProps.code.endText
+        },
+        // 是否在H5刷新或各端返回再进入时继续倒计时
+        keepRunning: {
+            type: Boolean,
+            default: () => defProps.code.keepRunning
+        },
+        // 为了区分多个页面,或者一个页面多个倒计时组件本地存储的继续倒计时变了
+        uniqueKey: {
+            type: String,
+            default: () => defProps.code.uniqueKey
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-code/u-code.vue b/uni_modules/uview-plus/components/u-code/u-code.vue
new file mode 100644
index 0000000..a55d777
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-code/u-code.vue
@@ -0,0 +1,137 @@
+<template>
+	<view class="u-code">
+		<!-- 此组件功能由js完成,无需写html逻辑 -->
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	/**
+	 * Code 验证码输入框
+	 * @description 考虑到用户实际发送验证码的场景,可能是一个按钮,也可能是一段文字,提示语各有不同,所以本组件 不提供界面显示,只提供提示语,由用户将提示语嵌入到具体的场景
+	 * @tutorial https://ijry.github.io/uview-plus/components/code.html
+	 * @property {String | Number}	seconds			倒计时所需的秒数(默认 60 )
+	 * @property {String}			startText		开始前的提示语,见官网说明(默认 '获取验证码' )
+	 * @property {String}			changeText		倒计时期间的提示语,必须带有字母"x",见官网说明(默认 'X秒重新获取' )
+	 * @property {String}			endText			倒计结束的提示语,见官网说明(默认 '重新获取' )
+	 * @property {Boolean}			keepRunning		是否在H5刷新或各端返回再进入时继续倒计时( 默认false )
+	 * @property {String}			uniqueKey		为了区分多个页面,或者一个页面多个倒计时组件本地存储的继续倒计时变了
+	 *
+	 * @event {Function}	change	倒计时期间,每秒触发一次
+	 * @event {Function}	start	开始倒计时触发
+	 * @event {Function}	end		结束倒计时触发
+	 * @example <u-code ref="uCode" @change="codeChange" seconds="20"></u-code>
+	 */
+	export default {
+		name: "u-code",
+		mixins: [mpMixin, mixin,props],
+		data() {
+			return {
+				secNum: this.seconds,
+				timer: null,
+				canGetCode: true, // 是否可以执行验证码操作
+			}
+		},
+		mounted() {
+			this.checkKeepRunning()
+		},
+		watch: {
+			seconds: {
+				immediate: true,
+				handler(n) {
+					this.secNum = n
+				}
+			}
+		},
+		emits: ["start", "end", "change"],
+		methods: {
+			checkKeepRunning() {
+				// 获取上一次退出页面(H5还包括刷新)时的时间戳,如果没有上次的保存,此值可能为空
+				let lastTimestamp = Number(uni.getStorageSync(this.uniqueKey + '_$uCountDownTimestamp'))
+				if(!lastTimestamp) return this.changeEvent(this.startText)
+				// 当前秒的时间戳
+				let nowTimestamp = Math.floor((+ new Date()) / 1000)
+				// 判断当前的时间戳,是否小于上一次的本该按设定结束,却提前结束的时间戳
+				if(this.keepRunning && lastTimestamp && lastTimestamp > nowTimestamp) {
+					// 剩余尚未执行完的倒计秒数
+					this.secNum = lastTimestamp - nowTimestamp
+					// 清除本地保存的变量
+					uni.removeStorageSync(this.uniqueKey + '_$uCountDownTimestamp')
+					// 开始倒计时
+					this.start()
+				} else {
+					// 如果不存在需要继续上一次的倒计时,执行正常的逻辑
+					this.changeEvent(this.startText)
+				}
+			},
+			// 开始倒计时
+			start() {
+				// 防止快速点击获取验证码的按钮而导致内部产生多个定时器导致混乱
+				if(this.timer) {
+					clearInterval(this.timer)
+					this.timer = null
+				}
+				this.$emit('start')
+				this.canGetCode = false
+				// 这里放这句,是为了一开始时就提示,否则要等setInterval的1秒后才会有提示
+				this.changeEvent(this.changeText.replace(/x|X/, this.secNum))
+				this.timer = setInterval(() => {
+					if (--this.secNum) {
+						// 用当前倒计时的秒数替换提示字符串中的"x"字母
+						this.changeEvent(this.changeText.replace(/x|X/, this.secNum))
+					} else {
+						clearInterval(this.timer)
+						this.timer = null
+						this.changeEvent(this.endText)
+						this.secNum = this.seconds
+						this.$emit('end')
+						this.canGetCode = true
+					}
+				}, 1000)
+				this.setTimeToStorage()
+			},
+			// 重置,可以让用户再次获取验证码
+			reset() {
+				this.canGetCode = true
+				clearInterval(this.timer)
+				this.secNum = this.seconds
+				this.changeEvent(this.endText)
+			},
+			changeEvent(text) {
+				this.$emit('change', text)
+			},
+			// 保存时间戳,为了防止倒计时尚未结束,H5刷新或者各端的右上角返回上一页再进来
+			setTimeToStorage() {
+				if(!this.keepRunning) return
+				// 记录当前的时间戳,为了下次进入页面,如果还在倒计时内的话,继续倒计时
+				// 倒计时尚未结束,结果大于0;倒计时已经开始,就会小于初始值,如果等于初始值,说明没有开始倒计时,无需处理
+				if(this.secNum > 0 && this.secNum <= this.seconds) {
+					// 获取当前时间戳(+ new Date()为特殊写法),除以1000变成秒,再去除小数部分
+					let nowTimestamp = Math.floor((+ new Date()) / 1000)
+					// 将本该结束时候的时间戳保存起来 => 当前时间戳 + 剩余的秒数
+					uni.setStorage({
+						key: this.uniqueKey + '_$uCountDownTimestamp',
+						data: nowTimestamp + Number(this.secNum)
+					})
+				}
+			}
+		},
+		// 组件销毁的时候,清除定时器,否则定时器会继续存在,系统不会自动清除
+		// #ifdef VUE2
+		beforeDestroy() {
+		// #endif
+		// #ifdef VUE3
+		beforeUnmount() {
+		// #endif
+			this.setTimeToStorage()
+			clearTimeout(this.timer)
+			this.timer = null
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+</style>
diff --git a/uni_modules/uview-plus/components/u-col/props.js b/uni_modules/uview-plus/components/u-col/props.js
new file mode 100644
index 0000000..858f472
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-col/props.js
@@ -0,0 +1,30 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 占父容器宽度的多少等分,总分为12份
+        span: {
+            type: [String, Number],
+            default: () => defProps.col.span
+        },
+        // 指定栅格左侧的间隔数(总12栏)
+        offset: {
+            type: [String, Number],
+            default: () => defProps.col.offset
+        },
+        // 水平排列方式,可选值为`start`(或`flex-start`)、`end`(或`flex-end`)、`center`、`around`(或`space-around`)、`between`(或`space-between`)
+        justify: {
+            type: String,
+            default: () => defProps.col.justify
+        },
+        // 垂直对齐方式,可选值为top、center、bottom、stretch
+        align: {
+            type: String,
+            default: () => defProps.col.align
+        },
+        // 文字对齐方式
+        textAlign: {
+            type: String,
+            default: () => defProps.col.textAlign
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-col/u-col.vue b/uni_modules/uview-plus/components/u-col/u-col.vue
new file mode 100644
index 0000000..7a1acce
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-col/u-col.vue
@@ -0,0 +1,170 @@
+<template>
+	<view
+	    class="u-col"
+		ref="u-col"
+	    :class="[
+			'u-col-' + span
+		]"
+	    :style="[colStyle]"
+	    @tap="clickHandler"
+	>
+		<slot></slot>
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addStyle, addUnit, deepMerge, getPx } from '../../libs/function/index';
+	/**
+	 * CodeInput 栅格系统的列 
+	 * @description 该组件一般用于Layout 布局 通过基础的 12 分栏,迅速简便地创建布局
+	 * @tutorial https://ijry.github.io/uview-plus/components/Layout.html
+	 * @property {String | Number}	span		栅格占据的列数,总12等份 (默认 12 ) 
+	 * @property {String | Number}	offset		分栏左边偏移,计算方式与span相同 (默认 0 ) 
+	 * @property {String}			justify		水平排列方式,可选值为`start`(或`flex-start`)、`end`(或`flex-end`)、`center`、`around`(或`space-around`)、`between`(或`space-between`)  (默认 'start' ) 
+	 * @property {String}			align		垂直对齐方式,可选值为top、center、bottom、stretch (默认 'stretch' ) 
+	 * @property {String}			textAlign	文字水平对齐方式 (默认 'left' ) 
+	 * @property {Object}			customStyle	定义需要用到的外部样式
+	 * @event {Function}	click	col被点击,会阻止事件冒泡到row
+	 * @example	 <u-col  span="3" offset="3" > <view class="demo-layout bg-purple"></view> </u-col>
+	 */
+	export default {
+		name: 'u-col',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				width: 0,
+				parentData: {
+					gutter: 0
+				},
+				gridNum: 12
+			}
+		},
+		//  微信小程序中 options 选项
+		options: {
+			virtualHost: true // 将自定义节点设置成虚拟的,更加接近Vue组件的表现。我们不希望自定义组件的这个节点本身可以设置样式、响应 flex 布局等
+		},
+		computed: {
+			uJustify() {
+				if (this.justify == 'end' || this.justify == 'start') return 'flex-' + this.justify
+				else if (this.justify == 'around' || this.justify == 'between') return 'space-' + this.justify
+				else return this.justify
+			},
+			uAlignItem() {
+				if (this.align == 'top') return 'flex-start'
+				if (this.align == 'bottom') return 'flex-end'
+				else return this.align
+			},
+			colStyle() {
+				const style = {
+					// 这里写成"padding: 0 10px"的形式是因为nvue的需要
+					paddingLeft: addUnit(getPx(this.parentData.gutter)/2),
+					paddingRight: addUnit(getPx(this.parentData.gutter)/2),
+					alignItems: this.uAlignItem,
+					justifyContent: this.uJustify,
+					textAlign: this.textAlign,
+					// #ifndef APP-NVUE
+					// 在非nvue上,使用百分比形式
+					flex: `0 0 ${100 / this.gridNum * this.span}%`,
+					marginLeft: 100 / 12 * this.offset + '%',
+					// #endif
+					// #ifdef APP-NVUE
+					// 在nvue上,由于无法使用百分比单位,这里需要获取父组件的宽度,再计算得出该有对应的百分比尺寸
+					width: addUnit(Math.floor(this.width / this.gridNum * Number(this.span))),
+					marginLeft: addUnit(Math.floor(this.width / this.gridNum * Number(this.offset))),
+					// #endif
+				}
+				return deepMerge(style, addStyle(this.customStyle))
+			}
+		},
+		mounted() {
+			this.init()
+		},
+		emits: ["click"],
+		methods: {
+			async init() {
+				// 支付宝小程序不支持provide/inject,所以使用这个方法获取整个父组件,在created定义,避免循环引用
+				this.updateParentData()
+				this.width = await this.parent.getComponentWidth()
+			},
+			updateParentData() {
+				this.getParentData('u-row')
+			},
+			clickHandler(e) {
+				this.$emit('click');
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-col {
+		padding: 0;
+		/* #ifndef APP-NVUE */
+		box-sizing:border-box;
+		/* #endif */
+		/* #ifdef MP */
+		display: block;
+		/* #endif */
+	}
+
+	// nvue下百分比无效
+	/* #ifndef APP-NVUE */
+	.u-col-0 {
+		width: 0;
+	}
+
+	.u-col-1 {
+		width: calc(100%/12);
+	}
+
+	.u-col-2 {
+		width: calc(100%/12 * 2);
+	}
+
+	.u-col-3 {
+		width: calc(100%/12 * 3);
+	}
+
+	.u-col-4 {
+		width: calc(100%/12 * 4);
+	}
+
+	.u-col-5 {
+		width: calc(100%/12 * 5);
+	}
+
+	.u-col-6 {
+		width: calc(100%/12 * 6);
+	}
+
+	.u-col-7 {
+		width: calc(100%/12 * 7);
+	}
+
+	.u-col-8 {
+		width: calc(100%/12 * 8);
+	}
+
+	.u-col-9 {
+		width: calc(100%/12 * 9);
+	}
+
+	.u-col-10 {
+		width: calc(100%/12 * 10);
+	}
+
+	.u-col-11 {
+		width: calc(100%/12 * 11);
+	}
+
+	.u-col-12 {
+		width: calc(100%/12 * 12);
+	}
+
+	/* #endif */
+</style>
diff --git a/uni_modules/uview-plus/components/u-collapse-item/props.js b/uni_modules/uview-plus/components/u-collapse-item/props.js
new file mode 100644
index 0000000..77c926e
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-collapse-item/props.js
@@ -0,0 +1,60 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 标题
+        title: {
+            type: String,
+            default: () => defProps.collapseItem.title
+        },
+        // 标题右侧内容
+        value: {
+            type: String,
+            default: () => defProps.collapseItem.value
+        },
+        // 标题下方的描述信息
+        label: {
+            type: String,
+            default: () => defProps.collapseItem.label
+        },
+        // 是否禁用折叠面板
+        disabled: {
+            type: Boolean,
+            default: () => defProps.collapseItem.disabled
+        },
+        // 是否展示右侧箭头并开启点击反馈
+        isLink: {
+            type: Boolean,
+            default: () => defProps.collapseItem.isLink
+        },
+        // 是否开启点击反馈
+        clickable: {
+            type: Boolean,
+            default: () => defProps.collapseItem.clickable
+        },
+        // 是否显示内边框
+        border: {
+            type: Boolean,
+            default: () => defProps.collapseItem.border
+        },
+        // 标题的对齐方式
+        align: {
+            type: String,
+            default: () => defProps.collapseItem.align
+        },
+        // 唯一标识符
+        name: {
+            type: [String, Number],
+            default: () => defProps.collapseItem.name
+        },
+        // 标题左侧图片,可为绝对路径的图片或内置图标
+        icon: {
+            type: String,
+            default: () => defProps.collapseItem.icon
+        },
+        // 面板展开收起的过渡时间,单位ms
+        duration: {
+            type: Number,
+            default: () => defProps.collapseItem.duration
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-collapse-item/u-collapse-item.vue b/uni_modules/uview-plus/components/u-collapse-item/u-collapse-item.vue
new file mode 100644
index 0000000..11631a8
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-collapse-item/u-collapse-item.vue
@@ -0,0 +1,239 @@
+<template>
+	<view class="u-collapse-item">
+		<u-cell
+			:title="$slots.title ? '' : title"
+			:value="value"
+			:label="label"
+			:icon="icon"
+			:isLink="isLink"
+			:clickable="clickable"
+			:border="parentData.border && showBorder"
+			@click="clickHandler"
+			:arrowDirection="expanded ? 'up' : 'down'"
+			:disabled="disabled"
+		>
+			<!-- 微信小程序不支持,因为微信中不支持 <slot name="title" slot="title" />的写法 -->
+			<template #title>
+				<slot name="title">
+					<text v-if="!$slots.title && title">
+						{{title}}
+					</text>
+				</slot>
+			</template>
+			<template #icon>
+				<slot name="icon">
+					<u-icon v-if="!$slots.icon && icon" :size="22" :name="icon"></u-icon>
+				</slot>
+			</template>
+			<template #value>
+				<slot name="value">
+					<text v-if="!$slots.value && value">
+						{{value}}
+					</text>
+				</slot>
+			</template>
+			<template #right-icon>
+				<slot name="right-icon">
+				</slot>
+			</template>
+		</u-cell>
+		<view
+			class="u-collapse-item__content"
+			:animation="animationData"
+			ref="animation"
+		>
+			<view
+				class="u-collapse-item__content__text content-class"
+				:id="elId"
+				:ref="elId"
+			><slot /></view>
+		</view>
+		<u-line v-if="parentData.border"></u-line>
+	</view>
+</template>
+
+<script>
+	import props from './props.js';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { nextTick } from 'vue';
+	import { guid, sleep, error } from '../../libs/function/index';
+	import test from '../../libs/function/test';
+	// #ifdef APP-NVUE
+	const animation = uni.requireNativePlugin('animation')
+	const dom = uni.requireNativePlugin('dom')
+	// #endif
+	/**
+	 * collapseItem 折叠面板Item
+	 * @description 通过折叠面板收纳内容区域(搭配u-collapse使用)
+	 * @tutorial https://ijry.github.io/uview-plus/components/collapse.html
+	 * @property {String}			title 		标题
+	 * @property {String}			value 		标题右侧内容
+	 * @property {String}			label 		标题下方的描述信息
+	 * @property {Boolean}			disbled 	是否禁用折叠面板 ( 默认 false )
+	 * @property {Boolean}			isLink 		是否展示右侧箭头并开启点击反馈 ( 默认 true )
+	 * @property {Boolean}			clickable	是否开启点击反馈 ( 默认 true )
+	 * @property {Boolean}			border		是否显示内边框 ( 默认 true )
+	 * @property {String}			align		标题的对齐方式 ( 默认 'left' )
+	 * @property {String | Number}	name		唯一标识符
+	 * @property {String}			icon		标题左侧图片,可为绝对路径的图片或内置图标
+	 * @event {Function}			change 			某个item被打开或者收起时触发
+	 * @example <u-collapse-item :title="item.head" v-for="(item, index) in itemList" :key="index">{{item.body}}</u-collapse-item>
+	 */
+	export default {
+		name: "u-collapse-item",
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				elId: guid(),
+				// uni.createAnimation的导出数据
+				animationData: {},
+				// 是否展开状态
+				expanded: false,
+				// 根据expanded确定是否显示border,为了控制展开时,cell的下划线更好的显示效果,进行一定时间的延时
+				showBorder: false,
+				// 是否动画中,如果是则不允许继续触发点击
+				animating: false,
+				// 父组件u-collapse的参数
+				parentData: {
+					accordion: false,
+					border: false
+				}
+			};
+		},
+		watch: {
+			expanded(n) {
+				clearTimeout(this.timer)
+				this.timer = null
+				// 这里根据expanded的值来进行一定的延时,是为了cell的下划线更好的显示效果
+				this.timer = setTimeout(() => {
+					this.showBorder = n
+				}, n ? 10 : 290)
+			}
+		},
+		mounted() {
+			this.init()
+			console.log('$slots', this.$slots)
+		},
+		methods: {
+			// 异步获取内容,或者动态修改了内容时,需要重新初始化
+			async init() {
+				// 初始化数据
+				this.updateParentData()
+				if (!this.parent) {
+					return error('u-collapse-item必须要搭配u-collapse组件使用')
+				}
+				const {
+					value,
+					accordion,
+					children = []
+				} = this.parent
+
+				if (accordion) {
+					if (test.array(value)) {
+						return error('手风琴模式下,u-collapse组件的value参数不能为数组')
+					}
+					this.expanded = this.name == value
+				} else {
+					if (!test.array(value) && value !== null) {
+						return error('非手风琴模式下,u-collapse组件的value参数必须为数组')
+					}
+					this.expanded = (value || []).some(item => item == this.name)
+				}
+				// 设置组件的展开或收起状态
+				await nextTick()
+				this.setContentAnimate()
+			},
+			updateParentData() {
+				// 此方法在mixin中
+				this.getParentData('u-collapse')
+			},
+			async setContentAnimate() {
+				// 每次面板打开或者收起时,都查询元素尺寸
+				// 好处是,父组件从服务端获取内容后,变更折叠面板后可以获得最新的高度
+				const rect = await this.queryRect()
+				const height = this.expanded ? rect.height : 0
+				this.animating = true
+				// #ifdef APP-NVUE
+				const ref = this.$refs['animation'].ref
+				animation.transition(ref, {
+					styles: {
+						height: height + 'px'
+					},
+					duration: this.duration,
+					// 必须设置为true,否则会到面板收起或展开时,页面其他元素不会随之调整它们的布局
+					needLayout: true,
+					timingFunction: 'ease-in-out',
+				}, () => {
+					this.animating = false
+				})
+				// #endif
+
+				// #ifndef APP-NVUE
+				const animation = uni.createAnimation({
+					timingFunction: 'ease-in-out',
+				});
+				animation
+					.height(height)
+					.step({
+						duration: this.duration,
+					})
+					.step()
+				// 导出动画数据给面板的animationData值
+				this.animationData = animation.export()
+				// 标识动画结束
+				sleep(this.duration).then(() => {
+					this.animating = false
+				})
+				// #endif
+			},
+			// 点击collapsehead头部
+			clickHandler() {
+				if (this.disabled && this.animating) return
+				// 设置本组件为相反的状态
+				this.parent && this.parent.onChange(this)
+			},
+			// 查询内容高度
+			queryRect() {
+				// #ifndef APP-NVUE
+				// $uGetRect为uView自带的节点查询简化方法,详见文档介绍:https://ijry.github.io/uview-plus/js/getRect.html
+				// 组件内部一般用this.$uGetRect,对外的为uni.$u.getRect,二者功能一致,名称不同
+				return new Promise(resolve => {
+					this.$uGetRect(`#${this.elId}`).then(size => {
+						resolve(size)
+					})
+				})
+				// #endif
+
+				// #ifdef APP-NVUE
+				// nvue下,使用dom模块查询元素高度
+				// 返回一个promise,让调用此方法的主体能使用then回调
+				return new Promise(resolve => {
+					dom.getComponentRect(this.$refs[this.elId], res => {
+						resolve(res.size)
+					})
+				})
+				// #endif
+			}
+		},
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-collapse-item {
+
+		&__content {
+			overflow: hidden;
+			height: 0;
+
+			&__text {
+				padding: 12px 15px;
+				color: $u-content-color;
+				font-size: 14px;
+				line-height: 18px;
+			}
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-collapse/props.js b/uni_modules/uview-plus/components/u-collapse/props.js
new file mode 100644
index 0000000..c9c1ec9
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-collapse/props.js
@@ -0,0 +1,20 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 当前展开面板的name,非手风琴模式:[<string | number>],手风琴模式:string | number
+        value: {
+            type: [String, Number, Array, null],
+            default: () => defProps.collapse.value
+        },
+        // 是否手风琴模式
+        accordion: {
+            type: Boolean,
+            default: () => defProps.collapse.accordion
+        },
+        // 是否显示外边框
+        border: {
+            type: Boolean,
+            default: () => defProps.collapse.border
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-collapse/u-collapse.vue b/uni_modules/uview-plus/components/u-collapse/u-collapse.vue
new file mode 100644
index 0000000..f566a29
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-collapse/u-collapse.vue
@@ -0,0 +1,91 @@
+<template>
+	<view class="u-collapse">
+		<u-line v-if="border"></u-line>
+		<slot />
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	/**
+	 * collapse 折叠面板 
+	 * @description 通过折叠面板收纳内容区域
+	 * @tutorial https://ijry.github.io/uview-plus/components/collapse.html
+	 * @property {String | Number | Array}	value		当前展开面板的name,非手风琴模式:[<string | number>],手风琴模式:string | number
+	 * @property {Boolean}					accordion	是否手风琴模式( 默认 false )
+	 * @property {Boolean}					border		是否显示外边框 ( 默认 true )
+	 * @event {Function}	change 		当前激活面板展开时触发(如果是手风琴模式,参数activeNames类型为String,否则为Array)
+	 * @example <u-collapse></u-collapse>
+	 */
+	export default {
+		name: "u-collapse",
+		mixins: [mpMixin, mixin,props],
+		watch: {
+			needInit() {
+				this.init()
+			},
+			// 当父组件需要子组件需要共享的参数发生了变化,手动通知子组件
+			parentData() {
+				if (this.children.length) {
+					this.children.map(child => {
+						// 判断子组件(u-checkbox)如果有updateParentData方法的话,就就执行(执行的结果是子组件重新从父组件拉取了最新的值)
+						typeof(child.updateParentData) === 'function' && child.updateParentData()
+					})
+				}
+			}
+		},
+		created() {
+			this.children = []
+		},
+		computed: {
+			needInit() {
+				// 通过computed,同时监听accordion和value值的变化
+				// 再通过watch去执行init()方法,进行再一次的初始化
+				return [this.accordion, this.value]
+			}
+		},
+		emits: ["open", "close", "change"],
+		methods: {
+			// 重新初始化一次内部的所有子元素
+			init() {
+				this.children.map(child => {
+					child.init()
+				})
+			},
+			/**
+			 * collapse-item被点击时触发,由collapse统一处理各子组件的状态
+			 * @param {Object} target 被操作的面板的实例
+			 */
+			onChange(target) {
+				let changeArr = []
+				this.children.map((child, index) => {
+					// 如果是手风琴模式,将其他的折叠面板收起来
+					if (this.accordion) {
+						child.expanded = child === target ? !target.expanded : false
+						child.setContentAnimate()
+					} else {
+						if(child === target) {
+							child.expanded = !child.expanded
+							child.setContentAnimate()
+						}
+					}
+					// 拼接change事件中,数组元素的状态
+					changeArr.push({
+						// 如果没有定义name属性,则默认返回组件的index索引
+						name: child.name || index,
+						status: child.expanded ? 'open' : 'close'
+					})
+				})
+
+				this.$emit('change', changeArr)
+				this.$emit(target.expanded ? 'open' : 'close', target.name)
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+</style>
diff --git a/uni_modules/uview-plus/components/u-column-notice/props.js b/uni_modules/uview-plus/components/u-column-notice/props.js
new file mode 100644
index 0000000..dc3a5a7
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-column-notice/props.js
@@ -0,0 +1,56 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 显示的内容,字符串
+        text: {
+            type: [Array],
+            default: () => defProps.columnNotice.text
+        },
+        // 是否显示左侧的音量图标
+        icon: {
+            type: String,
+            default: () => defProps.columnNotice.icon
+        },
+        // 通告模式,link-显示右箭头,closable-显示右侧关闭图标
+        mode: {
+            type: String,
+            default: () => defProps.columnNotice.mode
+        },
+        // 文字颜色,各图标也会使用文字颜色
+        color: {
+            type: String,
+            default: () => defProps.columnNotice.color
+        },
+        // 背景颜色
+        bgColor: {
+            type: String,
+            default: () => defProps.columnNotice.bgColor
+        },
+        // 字体大小,单位px
+        fontSize: {
+            type: [String, Number],
+            default: () => defProps.columnNotice.fontSize
+        },
+        // 水平滚动时的滚动速度,即每秒滚动多少px(px),这有利于控制文字无论多少时,都能有一个恒定的速度
+        speed: {
+            type: [String, Number],
+            default: () => defProps.columnNotice.speed
+        },
+        // direction = row时,是否使用步进形式滚动
+        step: {
+            type: Boolean,
+            default: () => defProps.columnNotice.step
+        },
+        // 滚动一个周期的时间长,单位ms
+        duration: {
+            type: [String, Number],
+            default: () => defProps.columnNotice.duration
+        },
+        // 是否禁止用手滑动切换
+        // 目前HX2.6.11,只支持App 2.5.5+、H5 2.5.5+、支付宝小程序、字节跳动小程序
+        disableTouch: {
+            type: Boolean,
+            default: () => defProps.columnNotice.disableTouch
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-column-notice/u-column-notice.vue b/uni_modules/uview-plus/components/u-column-notice/u-column-notice.vue
new file mode 100644
index 0000000..a575a51
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-column-notice/u-column-notice.vue
@@ -0,0 +1,165 @@
+<template>
+	<view
+		class="u-notice"
+		@tap="clickHandler"
+	>
+		<slot name="icon">
+			<view
+				class="u-notice__left-icon"
+				v-if="icon"
+			>
+				<u-icon
+					:name="icon"
+					:color="color"
+					size="19"
+				></u-icon>
+			</view>
+		</slot>
+		<swiper
+			:disable-touch="disableTouch"
+			:vertical="step ? false : true"
+			circular
+			:interval="duration"
+			:autoplay="true"
+			class="u-notice__swiper"
+			@change="noticeChange"
+		>
+			<swiper-item
+				v-for="(item, index) in text"
+				:key="index"
+				class="u-notice__swiper__item"
+			>
+				<text
+					class="u-notice__swiper__item__text u-line-1"
+					:style="[textStyle]"
+				>{{ item }}</text>
+			</swiper-item>
+		</swiper>
+		<view
+			class="u-notice__right-icon"
+			v-if="['link', 'closable'].includes(mode)"
+		>
+			<u-icon
+				v-if="mode === 'link'"
+				name="arrow-right"
+				:size="17"
+				:color="color"
+			></u-icon>
+			<u-icon
+				v-if="mode === 'closable'"
+				name="close"
+				:size="16"
+				:color="color"
+				@click="close"
+			></u-icon>
+		</view>
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addUnit, error } from '../../libs/function/index';
+	import test from '../../libs/function/test';
+	/**
+	 * ColumnNotice 滚动通知中的垂直滚动 内部组件
+	 * @description 该组件用于滚动通告场景,是其中的垂直滚动方式
+	 * @tutorial https://ijry.github.io/uview-plus/components/noticeBar.html
+	 * @property {Array}			text 			显示的内容,字符串
+	 * @property {String}			icon 			是否显示左侧的音量图标 ( 默认 'volume' )
+	 * @property {String}			mode 			通告模式,link-显示右箭头,closable-显示右侧关闭图标
+	 * @property {String}			color 			文字颜色,各图标也会使用文字颜色 ( 默认 '#f9ae3d' )
+	 * @property {String}			bgColor 		背景颜色 ( 默认 '#fdf6ec' )
+	 * @property {String | Number}	fontSize		字体大小,单位px  ( 默认 14 )
+	 * @property {String | Number}	speed			水平滚动时的滚动速度,即每秒滚动多少px(rpx),这有利于控制文字无论多少时,都能有一个恒定的速度 ( 默认 80 )
+	 * @property {Boolean}			step			direction = row时,是否使用步进形式滚动 ( 默认 false )
+	 * @property {String | Number}	duration		滚动一个周期的时间长,单位ms ( 默认 1500 )
+	 * @property {Boolean}			disableTouch	是否禁止用手滑动切换   目前HX2.6.11,只支持App 2.5.5+、H5 2.5.5+、支付宝小程序、字节跳动小程序 ( 默认 true )
+	 * @example 
+	 */
+	export default {
+		mixins: [mpMixin, mixin, props],
+		watch: {
+			text: {
+				immediate: true,
+				handler(newValue, oldValue) {
+					if(!test.array(newValue)) {
+						error('noticebar组件direction为column时,要求text参数为数组形式')
+					}
+				}
+			}
+		},
+		computed: {
+			// 文字内容的样式
+			textStyle() {
+				let style = {}
+				style.color = this.color
+				style.fontSize = addUnit(this.fontSize)
+				return style
+			},
+			// 垂直或者水平滚动
+			vertical() {
+				if (this.mode == 'horizontal') return false
+				else return true
+			},
+		},
+		data() {
+			return {
+				index:0
+			}
+		},
+		emits: ["click", "close"],
+		methods: {
+			noticeChange(e){
+				this.index = e.detail.current
+			},
+			// 点击通告栏
+			clickHandler() {
+				this.$emit('click', this.index)
+			},
+			// 点击关闭按钮
+			close() {
+				this.$emit('close')
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-notice {
+		@include flex;
+		align-items: center;
+		justify-content: space-between;
+
+		&__left-icon {
+			align-items: center;
+			margin-right: 5px;
+		}
+
+		&__right-icon {
+			margin-left: 5px;
+			align-items: center;
+		}
+
+		&__swiper {
+			height: 16px;
+			@include flex;
+			align-items: center;
+			flex: 1;
+
+			&__item {
+				@include flex;
+				align-items: center;
+				overflow: hidden;
+
+				&__text {
+					font-size: 14px;
+					color: $u-warning;
+				}
+			}
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-copy/u-copy.vue b/uni_modules/uview-plus/components/u-copy/u-copy.vue
new file mode 100644
index 0000000..7e63ded
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-copy/u-copy.vue
@@ -0,0 +1,70 @@
+<template>
+	<view @click="handleClick">
+        <slot>复制</slot>
+    </view>
+</template>
+<script>
+export default {
+    name: "xy-copy",
+    props: {
+        content: {
+            type: String,
+            default: ''
+        },
+		alertStyle: {
+			type: String,
+			default: 'toast'
+		},
+		notice: {
+			type: String,
+			default: '复制成功'
+		}
+    },
+	emits: ['success'],
+    methods: {
+        handleClick() {
+            let content = this.content;
+			if (!content) {
+				uni.showToast({
+				    title: '暂无',
+				    icon: 'none',
+				    duration: 2000,
+				});
+				return false;
+			}
+            content = typeof content === 'string' ? content : content.toString() // 复制内容,必须字符串,数字需要转换为字符串
+            /**
+			* 小程序端 和 app端的复制逻辑
+			*/
+			let that = this;
+            uni.setClipboardData({
+                data: content,
+                success: function() {
+					if (that.alertStyle == 'modal') {
+						uni.showModal({
+							title: '提示',
+							content: that.notice
+						});
+					} else {
+						uni.showToast({
+						    title: that.notice,
+						    icon: 'none'
+						});
+					}
+					that.$emit('success');
+                },
+                fail:function(){
+                    uni.showToast({
+                        title: '复制失败',
+                        icon: 'none',
+                        duration:3000,
+                    });
+                }
+            });
+        }
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+</style>
diff --git a/uni_modules/uview-plus/components/u-count-down/props.js b/uni_modules/uview-plus/components/u-count-down/props.js
new file mode 100644
index 0000000..ae87960
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-count-down/props.js
@@ -0,0 +1,25 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 倒计时时长,单位ms
+        time: {
+            type: [String, Number],
+            default: () => defProps.countDown.time
+        },
+        // 时间格式,DD-日,HH-时,mm-分,ss-秒,SSS-毫秒
+        format: {
+            type: String,
+            default: () => defProps.countDown.format
+        },
+        // 是否自动开始倒计时
+        autoStart: {
+            type: Boolean,
+            default: () => defProps.countDown.autoStart
+        },
+        // 是否展示毫秒倒计时
+        millisecond: {
+            type: Boolean,
+            default: () => defProps.countDown.millisecond
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-count-down/u-count-down.vue b/uni_modules/uview-plus/components/u-count-down/u-count-down.vue
new file mode 100644
index 0000000..5eb1622
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-count-down/u-count-down.vue
@@ -0,0 +1,171 @@
+<template>
+	<view class="u-count-down">
+		<slot>
+			<text class="u-count-down__text">{{ formattedTime }}</text>
+		</slot>
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import {
+		isSameSecond,
+		parseFormat,
+		parseTimeData
+	} from './utils';
+	/**
+	 * u-count-down 倒计时
+	 * @description 该组件一般使用于某个活动的截止时间上,通过数字的变化,给用户明确的时间感受,提示用户进行某一个行为操作。
+	 * @tutorial https://uview-plus.jiangruyi.com/components/countDown.html
+	 * @property {String | Number}	time		倒计时时长,单位ms (默认 0 )
+	 * @property {String}			format		时间格式,DD-日,HH-时,mm-分,ss-秒,SSS-毫秒  (默认 'HH:mm:ss' )
+	 * @property {Boolean}			autoStart	是否自动开始倒计时 (默认 true )
+	 * @property {Boolean}			millisecond	是否展示毫秒倒计时 (默认 false )
+	 * @event {Function} finish 倒计时结束时触发 
+	 * @event {Function} change 倒计时变化时触发 
+	 * @event {Function} start	开始倒计时
+	 * @event {Function} pause	暂停倒计时 
+	 * @event {Function} reset	重设倒计时,若 auto-start 为 true,重设后会自动开始倒计时 
+	 * @example <u-count-down :time="time"></u-count-down>
+	 */
+	export default {
+		name: 'u-count-down',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				timer: null,
+				// 各单位(天,时,分等)剩余时间
+				timeData: parseTimeData(0),
+				// 格式化后的时间,如"03:23:21"
+				formattedTime: '0',
+				// 倒计时是否正在进行中
+				runing: false,
+				endTime: 0, // 结束的毫秒时间戳
+				remainTime: 0, // 剩余的毫秒时间
+			}
+		},
+		watch: {
+			time(n) {
+				this.reset()
+			}
+		},
+		mounted() {
+			this.init()
+		},
+		emits: ["change", "finish"],
+		methods: {
+			init() {
+				this.reset()
+			},
+			// 开始倒计时
+			start() {
+				if (this.runing) return
+				// 标识为进行中
+				this.runing = true
+				// 结束时间戳 = 此刻时间戳 + 剩余的时间
+				this.endTime = Date.now() + this.remainTime
+				this.toTick()
+			},
+			// 根据是否展示毫秒,执行不同操作函数
+			toTick() {
+				if (this.millisecond) {
+					this.microTick()
+				} else {
+					this.macroTick()
+				}
+			},
+			macroTick() {
+				this.clearTimeout()
+				// 每隔一定时间,更新一遍定时器的值
+				// 同时此定时器的作用也能带来毫秒级的更新
+				this.timer = setTimeout(() => {
+					// 获取剩余时间
+					const remain = this.getRemainTime()
+					// 重设剩余时间
+					if (!isSameSecond(remain, this.remainTime) || remain === 0) {
+						this.setRemainTime(remain)
+					}
+					// 如果剩余时间不为0,则继续检查更新倒计时
+					if (this.remainTime !== 0) {
+						this.macroTick()
+					}
+				}, 30)
+			},
+			microTick() {
+				this.clearTimeout()
+				this.timer = setTimeout(() => {
+					this.setRemainTime(this.getRemainTime())
+					if (this.remainTime !== 0) {
+						this.microTick()
+					}
+				}, 50)
+			},
+			// 获取剩余的时间
+			getRemainTime() {
+				// 取最大值,防止出现小于0的剩余时间值
+				return Math.max(this.endTime - Date.now(), 0)
+			},
+			// 设置剩余的时间
+			setRemainTime(remain) {
+				this.remainTime = remain
+				// 根据剩余的毫秒时间,得出该有天,小时,分钟等的值,返回一个对象
+				const timeData = parseTimeData(remain)
+				this.$emit('change', timeData)
+				// 得出格式化后的时间
+				this.formattedTime = parseFormat(this.format, timeData)
+				// 如果时间已到,停止倒计时
+				if (remain <= 0) {
+					this.pause()
+					this.$emit('finish')
+				}
+			},
+			// 重置倒计时
+			reset() {
+				this.pause()
+				this.remainTime = this.time
+				this.setRemainTime(this.remainTime)
+				if (this.autoStart) {
+					this.start()
+				}
+			},
+			// 暂停倒计时
+			pause() {
+				this.runing = false;
+				this.clearTimeout()
+			},
+			// 清空定时器
+			clearTimeout() {
+				clearTimeout(this.timer)
+				this.timer = null
+			}
+		},
+		// #ifdef VUE2
+		beforeDestroy() {
+		// #endif
+		// #ifdef VUE3
+		beforeUnmount() {
+		// #endif
+			this.clearTimeout()
+		}
+	}
+</script>
+
+<style
+	lang="scss"
+	scoped
+>
+	@import "../../libs/css/components.scss";
+	$u-count-down-text-color:$u-content-color !default;
+	$u-count-down-text-font-size:15px !default;
+	$u-count-down-text-line-height:22px !default;
+
+	.u-count-down {
+		&__text {
+			color: $u-count-down-text-color;
+			font-size: $u-count-down-text-font-size;
+			line-height: $u-count-down-text-line-height;
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-count-down/utils.js b/uni_modules/uview-plus/components/u-count-down/utils.js
new file mode 100644
index 0000000..8c75005
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-count-down/utils.js
@@ -0,0 +1,62 @@
+// 补0,如1 -> 01
+function padZero(num, targetLength = 2) {
+    let str = `${num}`
+    while (str.length < targetLength) {
+        str = `0${str}`
+    }
+    return str
+}
+const SECOND = 1000
+const MINUTE = 60 * SECOND
+const HOUR = 60 * MINUTE
+const DAY = 24 * HOUR
+export function parseTimeData(time) {
+    const days = Math.floor(time / DAY)
+    const hours = Math.floor((time % DAY) / HOUR)
+    const minutes = Math.floor((time % HOUR) / MINUTE)
+    const seconds = Math.floor((time % MINUTE) / SECOND)
+    const milliseconds = Math.floor(time % SECOND)
+    return {
+        days,
+        hours,
+        minutes,
+        seconds,
+        milliseconds
+    }
+}
+export function parseFormat(format, timeData) {
+    let {
+        days,
+        hours,
+        minutes,
+        seconds,
+        milliseconds
+    } = timeData
+    // 如果格式化字符串中不存在DD(天),则将天的时间转为小时中去
+    if (format.indexOf('DD') === -1) {
+        hours += days * 24
+    } else {
+        // 对天补0
+        format = format.replace('DD', padZero(days))
+    }
+    // 其他同理于DD的格式化处理方式
+    if (format.indexOf('HH') === -1) {
+        minutes += hours * 60
+    } else {
+        format = format.replace('HH', padZero(hours))
+    }
+    if (format.indexOf('mm') === -1) {
+        seconds += minutes * 60
+    } else {
+        format = format.replace('mm', padZero(minutes))
+    }
+    if (format.indexOf('ss') === -1) {
+        milliseconds += seconds * 1000
+    } else {
+        format = format.replace('ss', padZero(seconds))
+    }
+    return format.replace('SSS', padZero(milliseconds, 3))
+}
+export function isSameSecond(time1, time2) {
+    return Math.floor(time1 / 1000) === Math.floor(time2 / 1000)
+}
diff --git a/uni_modules/uview-plus/components/u-count-to/props.js b/uni_modules/uview-plus/components/u-count-to/props.js
new file mode 100644
index 0000000..b24607e
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-count-to/props.js
@@ -0,0 +1,60 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 开始的数值,默认从0增长到某一个数
+        startVal: {
+            type: [String, Number],
+            default: () => defProps.countTo.startVal
+        },
+        // 要滚动的目标数值,必须
+        endVal: {
+            type: [String, Number],
+            default: () => defProps.countTo.endVal
+        },
+        // 滚动到目标数值的动画持续时间,单位为毫秒(ms)
+        duration: {
+            type: [String, Number],
+            default: () => defProps.countTo.duration
+        },
+        // 设置数值后是否自动开始滚动
+        autoplay: {
+            type: Boolean,
+            default: () => defProps.countTo.autoplay
+        },
+        // 要显示的小数位数
+        decimals: {
+            type: [String, Number],
+            default: () => defProps.countTo.decimals
+        },
+        // 是否在即将到达目标数值的时候,使用缓慢滚动的效果
+        useEasing: {
+            type: Boolean,
+            default: () => defProps.countTo.useEasing
+        },
+        // 十进制分割
+        decimal: {
+            type: [String, Number],
+            default: () => defProps.countTo.decimal
+        },
+        // 字体颜色
+        color: {
+            type: String,
+            default: () => defProps.countTo.color
+        },
+        // 字体大小
+        fontSize: {
+            type: [String, Number],
+            default: () => defProps.countTo.fontSize
+        },
+        // 是否加粗字体
+        bold: {
+            type: Boolean,
+            default: () => defProps.countTo.bold
+        },
+        // 千位分隔符,类似金额的分割(¥23,321.05中的",")
+        separator: {
+            type: String,
+            default: () => defProps.countTo.separator
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-count-to/u-count-to.vue b/uni_modules/uview-plus/components/u-count-to/u-count-to.vue
new file mode 100644
index 0000000..207ad6f
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-count-to/u-count-to.vue
@@ -0,0 +1,189 @@
+<template>
+	<text
+		class="u-count-num"
+		:style="{
+			fontSize: addUnit(fontSize),
+			fontWeight: bold ? 'bold' : 'normal',
+			color: color
+		}"
+	>{{ displayValue }}</text>
+</template>
+
+<script>
+import props from './props';
+import mpMixin from '../../libs/mixin/mpMixin';
+import mixin from '../../libs/mixin/mixin';
+import { addUnit } from '../../libs/function/index';
+/**
+ * countTo 数字滚动
+ * @description 该组件一般用于需要滚动数字到某一个值的场景,目标要求是一个递增的值。
+ * @tutorial https://ijry.github.io/uview-plus/components/countTo.html
+ * @property {String | Number}	startVal	开始的数值,默认从0增长到某一个数(默认 0 )
+ * @property {String | Number}	endVal		要滚动的目标数值,必须 (默认 0 )
+ * @property {String | Number}	duration	滚动到目标数值的动画持续时间,单位为毫秒(ms) (默认 2000 )
+ * @property {Boolean}			autoplay	设置数值后是否自动开始滚动 (默认 true )
+ * @property {String | Number}	decimals	要显示的小数位数,见官网说明(默认 0 )
+ * @property {Boolean}			useEasing	滚动结束时,是否缓动结尾,见官网说明(默认 true )
+ * @property {String}			decimal		十进制分割 ( 默认 "." )
+ * @property {String}			color		字体颜色( 默认 '#606266' )
+ * @property {String | Number}	fontSize	字体大小,单位px( 默认 22 )
+ * @property {Boolean}			bold		字体是否加粗(默认 false )
+ * @property {String}			separator	千位分隔符,见官网说明
+ * @event {Function} end 数值滚动到目标值时触发
+ * @example <u-count-to ref="uCountTo" :end-val="endVal" :autoplay="autoplay"></u-count-to>
+ */
+export default {
+	name: 'u-count-to',
+	data() {
+		return {
+			localStartVal: this.startVal,
+			displayValue: this.formatNumber(this.startVal),
+			printVal: null,
+			paused: false, // 是否暂停
+			localDuration: Number(this.duration),
+			startTime: null, // 开始的时间
+			timestamp: null, // 时间戳
+			remaining: null, // 停留的时间
+			rAF: null,
+			lastTime: 0 // 上一次的时间
+		};
+	},
+	mixins: [mpMixin, mixin,props],
+	computed: {
+		countDown() {
+			return this.startVal > this.endVal;
+		}
+	},
+	watch: {
+		startVal() {
+			this.autoplay && this.start();
+		},
+		endVal() {
+			this.autoplay && this.start();
+		}
+	},
+	mounted() {
+		this.autoplay && this.start();
+	},
+	emits: ["end"],
+	methods: {
+		addUnit,
+		easingFn(t, b, c, d) {
+			return (c * (-Math.pow(2, (-10 * t) / d) + 1) * 1024) / 1023 + b;
+		},
+		requestAnimationFrame(callback) {
+			const currTime = new Date().getTime();
+			// 为了使setTimteout的尽可能的接近每秒60帧的效果
+			const timeToCall = Math.max(0, 16 - (currTime - this.lastTime));
+			const id = setTimeout(() => {
+				callback(currTime + timeToCall);
+			}, timeToCall);
+			this.lastTime = currTime + timeToCall;
+			return id;
+		},
+		cancelAnimationFrame(id) {
+			clearTimeout(id);
+		},
+		// 开始滚动数字
+		start() {
+			this.localStartVal = this.startVal;
+			this.startTime = null;
+			this.localDuration = this.duration;
+			this.paused = false;
+			this.rAF = this.requestAnimationFrame(this.count);
+		},
+		// 暂定状态,重新再开始滚动;或者滚动状态下,暂停
+		reStart() {
+			if (this.paused) {
+				this.resume();
+				this.paused = false;
+			} else {
+				this.stop();
+				this.paused = true;
+			}
+		},
+		// 暂停
+		stop() {
+			this.cancelAnimationFrame(this.rAF);
+		},
+		// 重新开始(暂停的情况下)
+		resume() {
+			if (!this.remaining) return
+			this.startTime = 0;
+			this.localDuration = this.remaining;
+			this.localStartVal = this.printVal;
+			this.requestAnimationFrame(this.count);
+		},
+		// 重置
+		reset() {
+			this.startTime = null;
+			this.cancelAnimationFrame(this.rAF);
+			this.displayValue = this.formatNumber(this.startVal);
+		},
+		count(timestamp) {
+			if (!this.startTime) this.startTime = timestamp;
+			this.timestamp = timestamp;
+			const progress = timestamp - this.startTime;
+			this.remaining = this.localDuration - progress;
+			if (this.useEasing) {
+				if (this.countDown) {
+					this.printVal = this.localStartVal - this.easingFn(progress, 0, this.localStartVal - this.endVal, this.localDuration);
+				} else {
+					this.printVal = this.easingFn(progress, this.localStartVal, this.endVal - this.localStartVal, this.localDuration);
+				}
+			} else {
+				if (this.countDown) {
+					this.printVal = this.localStartVal - (this.localStartVal - this.endVal) * (progress / this.localDuration);
+				} else {
+					this.printVal = this.localStartVal + (this.endVal - this.localStartVal) * (progress / this.localDuration);
+				}
+			}
+			if (this.countDown) {
+				this.printVal = this.printVal < this.endVal ? this.endVal : this.printVal;
+			} else {
+				this.printVal = this.printVal > this.endVal ? this.endVal : this.printVal;
+			}
+			this.displayValue = this.formatNumber(this.printVal) || 0;
+			if (progress < this.localDuration) {
+				this.rAF = this.requestAnimationFrame(this.count);
+			} else {
+				this.$emit('end');
+			}
+		},
+		// 判断是否数字
+		isNumber(val) {
+			return !isNaN(parseFloat(val));
+		},
+		formatNumber(num) {
+			// 将num转为Number类型,因为其值可能为字符串数值,调用toFixed会报错
+			num = Number(num);
+			num = num.toFixed(Number(this.decimals));
+			num += '';
+			const x = num.split('.');
+			let x1 = x[0];
+			const x2 = x.length > 1 ? this.decimal + x[1] : '';
+			const rgx = /(\d+)(\d{3})/;
+			if (this.separator && !this.isNumber(this.separator)) {
+				while (rgx.test(x1)) {
+					x1 = x1.replace(rgx, '$1' + this.separator + '$2');
+				}
+			}
+			return x1 + x2;
+		},
+		destroyed() {
+			this.cancelAnimationFrame(this.rAF);
+		}
+	}
+};
+</script>
+
+<style lang="scss" scoped>
+@import "../../libs/css/components.scss";
+
+.u-count-num {
+	/* #ifndef APP-NVUE */
+	display: inline-flex;
+	/* #endif */
+	text-align: center;
+}
+</style>
diff --git a/uni_modules/uview-plus/components/u-datetime-picker/props.js b/uni_modules/uview-plus/components/u-datetime-picker/props.js
new file mode 100644
index 0000000..47f7937
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-datetime-picker/props.js
@@ -0,0 +1,144 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 是否显示input
+        hasInput: {
+            type: Boolean,
+            default: () => false
+        },
+        placeholder: {
+            type: String,
+            default: () => '请选择'
+        },
+        format: {
+            type: String,
+            default: () => ''
+        },
+        // 是否打开组件
+        show: {
+            type: Boolean,
+            default: () => defProps.datetimePicker.show
+        },
+		// 弹出的方向,可选值为 top bottom right left center
+        popupMode: {
+            type: String,
+            default: () => defProps.picker.popupMode
+        },
+        // 是否展示顶部的操作栏
+        showToolbar: {
+            type: Boolean,
+            default: () => defProps.datetimePicker.showToolbar
+        },
+        // #ifdef VUE2
+        // 绑定值
+        value: {
+            type: [String, Number],
+            default: () => defProps.datetimePicker.value
+        },
+        // #endif
+        // #ifdef VUE3
+        // 绑定值
+        modelValue: {
+            type: [String, Number],
+            default: () => defProps.datetimePicker.value
+        },
+        // #endif
+        // 顶部标题
+        title: {
+            type: String,
+            default: () => defProps.datetimePicker.title
+        },
+        // 展示格式,mode=date为日期选择,mode=time为时间选择,mode=year-month为年月选择,mode=datetime为日期时间选择
+        mode: {
+            type: String,
+            default: () => defProps.datetimePicker.mode
+        },
+        // 可选的最大时间
+        maxDate: {
+            type: Number,
+            // 最大默认值为后10年
+            default: () => defProps.datetimePicker.maxDate
+        },
+        // 可选的最小时间
+        minDate: {
+            type: Number,
+            // 最小默认值为前10年
+            default: () => defProps.datetimePicker.minDate
+        },
+        // 可选的最小小时,仅mode=time有效
+        minHour: {
+            type: Number,
+            default: () => defProps.datetimePicker.minHour
+        },
+        // 可选的最大小时,仅mode=time有效
+        maxHour: {
+            type: Number,
+            default: () => defProps.datetimePicker.maxHour
+        },
+        // 可选的最小分钟,仅mode=time有效
+        minMinute: {
+            type: Number,
+            default: () => defProps.datetimePicker.minMinute
+        },
+        // 可选的最大分钟,仅mode=time有效
+        maxMinute: {
+            type: Number,
+            default: () => defProps.datetimePicker.maxMinute
+        },
+        // 选项过滤函数
+        filter: {
+            type: [Function, null],
+            default: () => defProps.datetimePicker.filter
+        },
+        // 选项格式化函数
+        formatter: {
+            type: [Function, null],
+            default: () => defProps.datetimePicker.formatter
+        },
+        // 是否显示加载中状态
+        loading: {
+            type: Boolean,
+            default: () => defProps.datetimePicker.loading
+        },
+        // 各列中,单个选项的高度
+        itemHeight: {
+            type: [String, Number],
+            default: () => defProps.datetimePicker.itemHeight
+        },
+        // 取消按钮的文字
+        cancelText: {
+            type: String,
+            default: () => defProps.datetimePicker.cancelText
+        },
+        // 确认按钮的文字
+        confirmText: {
+            type: String,
+            default: () => defProps.datetimePicker.confirmText
+        },
+        // 取消按钮的颜色
+        cancelColor: {
+            type: String,
+            default: () => defProps.datetimePicker.cancelColor
+        },
+        // 确认按钮的颜色
+        confirmColor: {
+            type: String,
+            default: () => defProps.datetimePicker.confirmColor
+        },
+        // 每列中可见选项的数量
+        visibleItemCount: {
+            type: [String, Number],
+            default: () => defProps.datetimePicker.visibleItemCount
+        },
+        // 是否允许点击遮罩关闭选择器
+        closeOnClickOverlay: {
+            type: Boolean,
+            default: () => defProps.datetimePicker.closeOnClickOverlay
+        },
+        // 各列的默认索引
+        defaultIndex: {
+            type: Array,
+            default: () => defProps.datetimePicker.defaultIndex
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-datetime-picker/u-datetime-picker.vue b/uni_modules/uview-plus/components/u-datetime-picker/u-datetime-picker.vue
new file mode 100644
index 0000000..dd20570
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-datetime-picker/u-datetime-picker.vue
@@ -0,0 +1,449 @@
+<template>
+    <view v-if="hasInput" class="u-datetime-picker">
+        <u-input
+            :placeholder="placeholder"
+            border="surround"
+            v-model="inputValue"
+            @click="showByClickInput = !showByClickInput"
+        ></u-input>
+    </view>
+	<u-picker
+		ref="picker"
+		:show="show || (hasInput && showByClickInput)"
+		:popupMode="popupMode"
+		:closeOnClickOverlay="closeOnClickOverlay"
+		:columns="columns"
+		:title="title"
+		:itemHeight="itemHeight"
+		:showToolbar="showToolbar"
+		:visibleItemCount="visibleItemCount"
+		:defaultIndex="innerDefaultIndex"
+		:cancelText="cancelText"
+		:confirmText="confirmText"
+		:cancelColor="cancelColor"
+		:confirmColor="confirmColor"
+		@close="close"
+		@cancel="cancel"
+		@confirm="confirm"
+		@change="change"
+	>
+	</u-picker>
+</template>
+
+<script>
+	function times(n, iteratee) {
+	    let index = -1
+	    const result = Array(n < 0 ? 0 : n)
+	    while (++index < n) {
+	        result[index] = iteratee(index)
+	    }
+	    return result
+	}
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import dayjs from 'dayjs/esm/index';
+	import { range, error, padZero } from '../../libs/function/index';
+	import test from '../../libs/function/test';
+	/**
+	 * DatetimePicker 时间日期选择器
+	 * @description 此选择器用于时间日期
+	 * @tutorial https://ijry.github.io/uview-plus/components/datetimePicker.html
+	 * @property {Boolean}			show				用于控制选择器的弹出与收起 ( 默认 false )
+	 * @property {Boolean}			showToolbar			是否显示顶部的操作栏  ( 默认 true )
+	 * @property {String | Number}	modelValue		    绑定值
+	 * @property {String}			title				顶部标题
+	 * @property {String}			mode				展示格式 mode=date为日期选择,mode=time为时间选择,mode=year-month为年月选择,mode=datetime为日期时间选择  ( 默认 ‘datetime )
+	 * @property {Number}			maxDate				可选的最大时间  默认值为后10年
+	 * @property {Number}			minDate				可选的最小时间  默认值为前10年
+	 * @property {Number}			minHour				可选的最小小时,仅mode=time有效   ( 默认 0 )
+	 * @property {Number}			maxHour				可选的最大小时,仅mode=time有效	  ( 默认 23 )
+	 * @property {Number}			minMinute			可选的最小分钟,仅mode=time有效	  ( 默认 0 )
+	 * @property {Number}			maxMinute			可选的最大分钟,仅mode=time有效   ( 默认 59 )
+	 * @property {Function}			filter				选项过滤函数
+	 * @property {Function}			formatter			选项格式化函数
+	 * @property {Boolean}			loading				是否显示加载中状态   ( 默认 false )
+	 * @property {String | Number}	itemHeight			各列中,单个选项的高度   ( 默认 44 )
+	 * @property {String}			cancelText			取消按钮的文字  ( 默认 '取消' )
+	 * @property {String}			confirmText			确认按钮的文字  ( 默认 '确认' )
+	 * @property {String}			cancelColor			取消按钮的颜色  ( 默认 '#909193' )
+	 * @property {String}			confirmColor		确认按钮的颜色  ( 默认 '#3c9cff' )
+	 * @property {String | Number}	visibleItemCount	每列中可见选项的数量  ( 默认 5 )
+	 * @property {Boolean}			closeOnClickOverlay	是否允许点击遮罩关闭选择器  ( 默认 false )
+	 * @property {Array}			defaultIndex		各列的默认索引
+	 * @event {Function} close 关闭选择器时触发
+	 * @event {Function} confirm 点击确定按钮,返回当前选择的值
+	 * @event {Function} change 当选择值变化时触发
+	 * @event {Function} cancel 点击取消按钮
+	 * @example  <u-datetime-picker :show="show" :value="value1"  mode="datetime" ></u-datetime-picker>
+	 */
+	export default {
+		name: 'datetime-picker',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+                // 原来的日期选择器不方便,这里增加一个hasInput选项支持类似element的自带输入框的功能。
+                inputValue: '', // 表单显示值
+                showByClickInput: false, // 是否在hasInput模式下显示日期选择弹唱
+				columns: [],
+				innerDefaultIndex: [],
+				innerFormatter: (type, value) => value
+			}
+		},
+		watch: {
+			show(newValue, oldValue) {
+				if (newValue) {
+					this.updateColumnValue(this.innerValue)
+				}
+			},
+			// #ifdef VUE3
+			modelValue(newValue) {
+				this.init()
+				this.getInputValue()
+			},
+			// #endif
+			// #ifdef VUE2
+			value(newValue) {
+				this.init()
+				this.getInputValue()
+			},
+			// #endif
+			propsChange() {
+				this.init()
+			}
+		},
+		computed: {
+			// 如果以下这些变量发生了变化,意味着需要重新初始化各列的值
+			propsChange() {
+				return [this.mode, this.maxDate, this.minDate, this.minHour, this.maxHour, this.minMinute, this.maxMinute, this.filter, ]
+			}
+		},
+		mounted() {
+			this.init()
+		},
+		// #ifdef VUE3
+		emits: ['close', 'cancel', 'confirm', 'change', 'update:modelValue'],
+		// #endif
+		methods: {
+			getInputValue(newValue) {
+				if (this.mode == 'time') {
+					this.inputValue = newValue
+				} else {
+					if (this.format) {
+						this.inputValue = dayjs(newValue).format(this.format)
+					} else {
+						let format = ''
+						switch (this.mode) {
+							case 'date':
+								format = 'YYYY-MM-DD'
+								break;
+							case 'year-month':
+								format = 'YYYY-MM'
+								break;
+							case 'datetime':
+								format = 'YYYY-MM-DD HH:mm'
+								break;
+							case 'time':
+								format = 'HH:mm'
+								break;
+							default:
+								break;
+						}
+						this.inputValue = dayjs(newValue).format(format)
+					}
+				}
+			},
+			init() {
+				// #ifdef VUE3
+				this.innerValue = this.correctValue(this.modelValue)
+				// #endif
+				// #ifdef VUE2
+				this.innerValue = this.correctValue(this.value)
+				// #endif
+				this.updateColumnValue(this.innerValue)
+			},
+			// 在微信小程序中,不支持将函数当做props参数,故只能通过ref形式调用
+			setFormatter(e) {
+				this.innerFormatter = e
+			},
+			// 关闭选择器
+			close() {
+				if (this.closeOnClickOverlay) {
+					this.$emit('close')
+				}
+			},
+			// 点击工具栏的取消按钮
+			cancel() {
+                if (this.hasInput) {
+                    this.showByClickInput = false
+                }
+				this.$emit('cancel')
+			},
+			// 点击工具栏的确定按钮
+			confirm() {
+				this.$emit('confirm', {
+					value: this.innerValue,
+					mode: this.mode
+				})
+                
+				// #ifdef VUE3
+				this.$emit('update:modelValue', this.innerValue)
+				// #endif
+				// #ifdef VUE2
+				this.$emit('input', this.innerValue)
+				// #endif
+                if (this.hasInput) {
+					this.getInputValue(this.innerValue)
+                    this.showByClickInput = false
+                }
+			},
+			//用正则截取输出值,当出现多组数字时,抛出错误
+			intercept(e,type){
+				let judge = e.match(/\d+/g)
+				//判断是否掺杂数字
+				if(judge.length>1){
+					error("请勿在过滤或格式化函数时添加数字")
+					return 0
+				}else if(type&&judge[0].length==4){//判断是否是年份
+					return judge[0]
+				}else if(judge[0].length>2){
+					error("请勿在过滤或格式化函数时添加数字")
+					return 0
+				}else{
+					return judge[0]
+				}
+			},
+			// 列发生变化时触发
+			change(e) {
+				const { indexs, values } = e
+				let selectValue = ''
+				if(this.mode === 'time') {
+					// 根据value各列索引,从各列数组中,取出当前时间的选中值
+					selectValue = `${this.intercept(values[0][indexs[0]])}:${this.intercept(values[1][indexs[1]])}`
+				} else {
+					// 将选择的值转为数值,比如'03'转为数值的3,'2019'转为数值的2019
+					const year = parseInt(this.intercept(values[0][indexs[0]],'year'))
+					const month = parseInt(this.intercept(values[1][indexs[1]]))
+					let date = parseInt(values[2] ? this.intercept(values[2][indexs[2]]) : 1)
+					let hour = 0, minute = 0
+					// 此月份的最大天数
+					const maxDate = dayjs(`${year}-${month}`).daysInMonth()
+					// year-month模式下,date不会出现在列中,设置为1,为了符合后边需要减1的需求
+					if (this.mode === 'year-month') {
+					    date = 1
+					}
+					// 不允许超过maxDate值
+					date = Math.min(maxDate, date)
+					if (this.mode === 'datetime') {
+					    hour = parseInt(this.intercept(values[3][indexs[3]]))
+					    minute = parseInt(this.intercept(values[4][indexs[4]]))
+					}
+					// 转为时间模式
+					selectValue = Number(new Date(year, month - 1, date, hour, minute))
+				}
+				// 取出准确的合法值,防止超越边界的情况
+				selectValue = this.correctValue(selectValue)
+				this.innerValue = selectValue
+				this.updateColumnValue(selectValue)
+				// 发出change时间,value为当前选中的时间戳
+				this.$emit('change', {
+					value: selectValue,
+					// #ifndef MP-WEIXIN
+					// 微信小程序不能传递this实例,会因为循环引用而报错
+					// picker: this.$refs.picker,
+					// #endif
+					mode: this.mode
+				})
+			},
+			// 更新各列的值,进行补0、格式化等操作
+			updateColumnValue(value) {
+				this.innerValue = value
+				this.updateColumns()
+				// 延迟执行,等待u-picker组件列数据更新完后再设置选中值索引
+				setTimeout(() => {
+				this.updateIndexs(value)
+				}, 0);
+			},
+			// 更新索引
+			updateIndexs(value) {
+				let values = []
+				const formatter = this.formatter || this.innerFormatter
+				if (this.mode === 'time') {
+					// 将time模式的时间用:分隔成数组
+				    const timeArr = value.split(':')
+					// 使用formatter格式化方法进行管道处理
+				    values = [formatter('hour', timeArr[0]), formatter('minute', timeArr[1])]
+				} else {
+				    const date = new Date(value)
+				    values = [
+				        formatter('year', `${dayjs(value).year()}`),
+						// 月份补0
+				        formatter('month', padZero(dayjs(value).month() + 1))
+				    ]
+				    if (this.mode === 'date') {
+						// date模式,需要添加天列
+				        values.push(formatter('day', padZero(dayjs(value).date())))
+				    }
+				    if (this.mode === 'datetime') {
+						// 数组的push方法,可以写入多个参数
+				        values.push(formatter('day', padZero(dayjs(value).date())), formatter('hour', padZero(dayjs(value).hour())), formatter('minute', padZero(dayjs(value).minute())))
+				    }
+				}
+
+				// 根据当前各列的所有值,从各列默认值中找到默认值在各列中的索引
+				const indexs = this.columns.map((column, index) => {
+					// 通过取大值,可以保证不会出现找不到索引的-1情况
+					return Math.max(0, column.findIndex(item => item === values[index]))
+				})
+				this.innerDefaultIndex = indexs
+			},
+			// 更新各列的值
+			updateColumns() {
+			    const formatter = this.formatter || this.innerFormatter
+				// 获取各列的值,并且map后,对各列的具体值进行补0操作
+			    const results = this.getOriginColumns().map((column) => column.values.map((value) => formatter(column.type, value)))
+				this.columns = results
+			},
+			getOriginColumns() {
+			    // 生成各列的值
+			    const results = this.getRanges().map(({ type, range }) => {
+			        let values = times(range[1] - range[0] + 1, (index) => {
+			            let value = range[0] + index
+			            value = type === 'year' ? `${value}` : padZero(value)
+			            return value
+			        })
+					// 进行过滤
+			        if (this.filter) {
+			            values = this.filter(type, values)
+						if (!values || (values && values.length == 0)) {
+							uni.showToast({
+								title: '日期filter结果不能为空',
+								icon: 'error',
+								mask: true
+							})
+						}
+			        }
+			        return { type, values }
+			    })
+			    return results
+			},
+			// 通过最大值和最小值生成数组
+			generateArray(start, end) {
+				return Array.from(new Array(end + 1).keys()).slice(start)
+			},
+			// 得出合法的时间
+			correctValue(value) {
+				const isDateMode = this.mode !== 'time'
+				if (isDateMode && !test.date(value)) {
+					// 如果是日期类型,但是又没有设置合法的当前时间的话,使用最小时间为当前时间
+					value = this.minDate
+				} else if (!isDateMode && !value) {
+					// 如果是时间类型,而又没有默认值的话,就用最小时间
+					value = `${padZero(this.minHour)}:${padZero(this.minMinute)}`
+				}
+				// 时间类型
+				if (!isDateMode) {
+					if (String(value).indexOf(':') === -1) return error('时间错误,请传递如12:24的格式')
+					let [hour, minute] = value.split(':')
+					// 对时间补零,同时控制在最小值和最大值之间
+					hour = padZero(range(this.minHour, this.maxHour, Number(hour)))
+					minute = padZero(range(this.minMinute, this.maxMinute, Number(minute)))
+					return `${ hour }:${ minute }`
+				} else {
+					// 如果是日期格式,控制在最小日期和最大日期之间
+					value = dayjs(value).isBefore(dayjs(this.minDate)) ? this.minDate : value
+					value = dayjs(value).isAfter(dayjs(this.maxDate)) ? this.maxDate : value
+					return value
+				}
+			},
+			// 获取每列的最大和最小值
+			getRanges() {
+			    if (this.mode === 'time') {
+			        return [
+			            {
+			                type: 'hour',
+			                range: [this.minHour, this.maxHour],
+			            },
+			            {
+			                type: 'minute',
+			                range: [this.minMinute, this.maxMinute],
+			            },
+			        ];
+			    }
+			    const { maxYear, maxDate, maxMonth, maxHour, maxMinute, } = this.getBoundary('max', this.innerValue);
+			    const { minYear, minDate, minMonth, minHour, minMinute, } = this.getBoundary('min', this.innerValue);
+			    const result = [
+			        {
+			            type: 'year',
+			            range: [minYear, maxYear],
+			        },
+			        {
+			            type: 'month',
+			            range: [minMonth, maxMonth],
+			        },
+			        {
+			            type: 'day',
+			            range: [minDate, maxDate],
+			        },
+			        {
+			            type: 'hour',
+			            range: [minHour, maxHour],
+			        },
+			        {
+			            type: 'minute',
+			            range: [minMinute, maxMinute],
+			        },
+			    ];
+			    if (this.mode === 'date')
+			        result.splice(3, 2);
+			    if (this.mode === 'year-month')
+			        result.splice(2, 3);
+			    return result;
+			},
+			// 根据minDate、maxDate、minHour、maxHour等边界值,判断各列的开始和结束边界值
+			getBoundary(type, innerValue) {
+			    const value = new Date(innerValue)
+			    const boundary = new Date(this[`${type}Date`])
+			    const year = dayjs(boundary).year()
+			    let month = 1
+			    let date = 1
+			    let hour = 0
+			    let minute = 0
+			    if (type === 'max') {
+			        month = 12
+					// 月份的天数
+			        date = dayjs(value).daysInMonth()
+			        hour = 23
+			        minute = 59
+			    }
+				// 获取边界值,逻辑是:当年达到了边界值(最大或最小年),就检查月允许的最大和最小值,以此类推
+			    if (dayjs(value).year() === year) {
+			        month = dayjs(boundary).month() + 1
+			        if (dayjs(value).month() + 1 === month) {
+			            date = dayjs(boundary).date()
+			            if (dayjs(value).date() === date) {
+			                hour = dayjs(boundary).hour()
+			                if (dayjs(value).hour() === hour) {
+			                    minute = dayjs(boundary).minute()
+			                }
+			            }
+			        }
+			    }
+			    return {
+			        [`${type}Year`]: year,
+			        [`${type}Month`]: month,
+			        [`${type}Date`]: date,
+			        [`${type}Hour`]: hour,
+			        [`${type}Minute`]: minute
+			    }
+			},
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import '../../libs/css/components.scss';
+	.u-datetime-picker {
+		width: 100%;
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-divider/props.js b/uni_modules/uview-plus/components/u-divider/props.js
new file mode 100644
index 0000000..ce481c2
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-divider/props.js
@@ -0,0 +1,45 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 是否虚线
+        dashed: {
+            type: Boolean,
+            default: () => defProps.divider.dashed
+        },
+        // 是否细线
+        hairline: {
+            type: Boolean,
+            default: () => defProps.divider.hairline
+        },
+        // 是否以点替代文字,优先于text字段起作用
+        dot: {
+            type: Boolean,
+            default: () => defProps.divider.dot
+        },
+        // 内容文本的位置,left-左边,center-中间,right-右边
+        textPosition: {
+            type: String,
+            default: () => defProps.divider.textPosition
+        },
+        // 文本内容
+        text: {
+            type: [String, Number],
+            default: () => defProps.divider.text
+        },
+        // 文本大小
+        textSize: {
+            type: [String, Number],
+            default: () => defProps.divider.textSize
+        },
+        // 文本颜色
+        textColor: {
+            type: String,
+            default: () => defProps.divider.textColor
+        },
+        // 线条颜色
+        lineColor: {
+            type: String,
+            default: () => defProps.divider.lineColor
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-divider/u-divider.vue b/uni_modules/uview-plus/components/u-divider/u-divider.vue
new file mode 100644
index 0000000..fef953a
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-divider/u-divider.vue
@@ -0,0 +1,121 @@
+<template>
+	<view
+	    class="u-divider"
+	    :style="[addStyle(customStyle)]"
+		@tap="click"
+	>
+		<u-line
+		    :color="lineColor"
+		    :customStyle="leftLineStyle"
+		    :hairline="hairline"
+			:dashed="dashed"
+		></u-line>
+		<text
+		    v-if="dot"
+		    class="u-divider__dot"
+		>●</text>
+		<text
+		    v-else-if="text"
+		    class="u-divider__text"
+		    :style="[textStyle]"
+		>{{text}}</text>
+		<u-line
+		    :color="lineColor"
+		    :customStyle="rightLineStyle"
+		    :hairline="hairline"
+			:dashed="dashed"
+		></u-line>
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addStyle, addUnit } from '../../libs/function/index';
+	/**
+	 * divider 分割线
+	 * @description 区隔内容的分割线,一般用于页面底部"没有更多"的提示。
+	 * @tutorial https://ijry.github.io/uview-plus/components/divider.html
+	 * @property {Boolean}			dashed			是否虚线 (默认 false )
+	 * @property {Boolean}			hairline		是否细线 (默认  true )
+	 * @property {Boolean}			dot				是否以点替代文字,优先于text字段起作用 (默认 false )
+	 * @property {String}			textPosition	内容文本的位置,left-左边,center-中间,right-右边 (默认 'center' )
+	 * @property {String | Number}	text			文本内容
+	 * @property {String | Number}	textSize		文本大小 (默认 14)
+	 * @property {String}			textColor		文本颜色 (默认 '#909399' )
+	 * @property {String}			lineColor		线条颜色 (默认 '#dcdfe6' )
+	 * @property {Object}			customStyle		定义需要用到的外部样式
+	 *
+	 * @event {Function}	click	divider组件被点击时触发
+	 * @example <u-divider :color="color">锦瑟无端五十弦</u-divider>
+	 */
+	export default {
+		name:'u-divider',
+		mixins: [mpMixin, mixin, props],
+		computed: {
+			textStyle() {
+				const style = {}
+				style.fontSize = addUnit(this.textSize)
+				style.color = this.textColor
+				return style
+			},
+			// 左边线条的的样式
+			leftLineStyle() {
+				const style = {}
+				// 如果是在左边,设置左边的宽度为固定值
+				if (this.textPosition === 'left') {
+					style.width = '80rpx'
+				} else {
+					style.flex = 1
+				}
+				return style
+			},
+			// 右边线条的的样式
+			rightLineStyle() {
+				const style = {}
+				// 如果是在右边,设置右边的宽度为固定值
+				if (this.textPosition === 'right') {
+					style.width = '80rpx'
+				} else {
+					style.flex = 1
+				}
+				return style
+			}
+		},
+		emits: ["click"],
+		methods: {
+			addStyle,
+			// divider组件被点击时触发
+			click() {
+				this.$emit('click');
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import '../../libs/css/components.scss';
+	$u-divider-margin:15px 0 !default;
+	$u-divider-text-margin:0 15px !default;
+	$u-divider-dot-font-size:12px !default;
+	$u-divider-dot-margin:0 12px !default;
+	$u-divider-dot-color: #c0c4cc !default;
+
+	.u-divider {
+		@include flex;
+		flex-direction: row;
+		align-items: center;
+		margin: $u-divider-margin;
+
+		&__text {
+			margin: $u-divider-text-margin;
+		}
+
+		&__dot {
+			font-size: $u-divider-dot-font-size;
+			margin: $u-divider-dot-margin;
+			color: $u-divider-dot-color;
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-dropdown-item/props.js b/uni_modules/uview-plus/components/u-dropdown-item/props.js
new file mode 100644
index 0000000..433dced
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-dropdown-item/props.js
@@ -0,0 +1,46 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // #ifdef VUE3
+        // 当前选中项的value值
+        modelValue: {
+            type: [Number, String, Array],
+            default: ''
+        },
+		// #endif
+		// #ifdef VUE2
+		// 当前选中项的value值
+        value: {
+            type: [Number, String, Array],
+            default: ''
+        },
+		// #endif
+        // 菜单项标题
+        title: {
+            type: [String, Number],
+            default: ''
+        },
+        // 选项数据,如果传入了默认slot,此参数无效
+        options: {
+            type: Array,
+            default() {
+                return []
+            }
+        },
+        // 是否禁用此菜单项
+        disabled: {
+            type: Boolean,
+            default: false
+        },
+        // 下拉弹窗的高度
+        height: {
+            type: [Number, String],
+            default: 'auto'
+        },
+        // 点击遮罩是否可以收起弹窗
+        closeOnClickOverlay: {
+            type: Boolean,
+            default: true
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-dropdown-item/u-dropdown-item.vue b/uni_modules/uview-plus/components/u-dropdown-item/u-dropdown-item.vue
new file mode 100644
index 0000000..acc3224
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-dropdown-item/u-dropdown-item.vue
@@ -0,0 +1,121 @@
+<template>
+	<view class="u-dropdown-item" v-if="active" @touchmove.stop.prevent="() => {}" @tap.stop.prevent="() => {}">
+		<block v-if="!$slots.default && !$slots.$default">
+			<scroll-view class="u-dropdown-item__scroll" scroll-y="true" :style="{
+				height: addUnit(height)
+			}">
+				<view class="u-dropdown-item__options">
+					<up-cell-group>
+						<up-cell @click="cellClick(item.value)" :arrow="false" :title="item.label" v-for="(item, index) in options"
+						 :key="index" :title-style="{
+							color: modelValue == item.value ? activeColor : inactiveColor
+						}">
+							<up-icon v-if="modelValue == item.value" name="checkbox-mark" :color="activeColor" size="32"></up-icon>
+						</up-cell>
+					</up-cell-group>
+				</view>
+			</scroll-view>
+		</block>
+		<slot v-else />
+	</view>
+</template>
+
+<script>
+    import props from './props';
+    import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addUnit, $parent } from '../../libs/function/index';
+	/**
+	 * dropdown-item 下拉菜单
+	 * @description 该组件一般用于向下展开菜单,同时可切换多个选项卡的场景
+	 * @tutorial https://ijry.github.io/uview-plus/components/dropdown.html
+	 * @property {String | Number} v-model 双向绑定选项卡选择值
+	 * @property {String} title 菜单项标题
+	 * @property {Array[Object]} options 选项数据,如果传入了默认slot,此参数无效
+	 * @property {Boolean} disabled 是否禁用此选项卡(默认false)
+	 * @property {String | Number} duration 选项卡展开和收起的过渡时间,单位ms(默认300)
+	 * @property {String | Number} height 弹窗下拉内容的高度(内容超出将会滚动)(默认auto)
+	 * @example <u-dropdown-item title="标题"></u-dropdown-item>
+	 */
+	export default {
+		name: 'u-dropdown-item',
+		mixins: [mpMixin, mixin, props],
+        options: {
+            styleIsolation: 'shared',
+        },
+		data() {
+			return {
+				active: false, // 当前项是否处于展开状态
+				activeColor: '#2979ff', // 激活时左边文字和右边对勾图标的颜色
+				inactiveColor: '#606266', // 未激活时左边文字和右边对勾图标的颜色
+			}
+		},
+		computed: {
+			// 监听props是否发生了变化,有些值需要传递给父组件u-dropdown,无法双向绑定
+			propsChange() {
+				return `${this.title}-${this.disabled}`;
+			}
+		},
+		watch: {
+			propsChange(n) {
+				// 当值变化时,通知父组件重新初始化,让父组件执行每个子组件的init()方法
+				// 将所有子组件数据重新整理一遍
+				if (this.parent) this.parent.init();
+			}
+		},
+		created() {
+			// 父组件的实例
+			this.parent = false;
+		},
+        emits: ['update:modelValue', 'change'],
+		methods: {
+			addUnit,
+			init() {
+				// 获取父组件u-dropdown
+				let parent = $parent.call(this, 'u-dropdown');
+				if (parent) {
+					this.parent = parent;
+					// 将子组件的激活颜色配置为父组件设置的激活和未激活时的颜色
+					this.activeColor = parent.activeColor;
+					this.inactiveColor = parent.inactiveColor;
+					// 将本组件的this,放入到父组件的children数组中,让父组件可以操作本(子)组件的方法和属性
+					// push进去前,显判断是否已经存在了本实例,因为在子组件内部数据变化时,会通过父组件重新初始化子组件
+					let exist = parent.children.find(val => {
+						return this === val;
+					})
+					if (!exist) parent.children.push(this);
+					if (parent.children.length == 1) this.active = true;
+					// 父组件无法监听children的变化,故将子组件的title,传入父组件的menuList数组中
+					parent.menuList.push({
+						title: this.title,
+						disabled: this.disabled
+					});
+				}
+			},
+			// cell被点击
+			cellClick(value) {
+				// 修改通过v-model绑定的值
+                // #ifdef VUE2
+				this.$emit('input', value);
+                // #endif
+		        // #ifdef VUE3
+                this.$emit('update:modelValue', value);
+                // #endif
+				// 通知父组件(u-dropdown)收起菜单
+				this.parent.close();
+				// 发出事件,抛出当前勾选项的value
+				this.$emit('change', value);
+			}
+		},
+		mounted() {
+			this.init();
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	@import "../../libs/css/components.scss";
+    .u-dropdown-item__scroll {
+        background: #ffffff;
+    }
+</style>
diff --git a/uni_modules/uview-plus/components/u-dropdown/props.js b/uni_modules/uview-plus/components/u-dropdown/props.js
new file mode 100644
index 0000000..f81dc4b
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-dropdown/props.js
@@ -0,0 +1,60 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 菜单标题和选项的激活态颜色
+        activeColor: {
+            type: String,
+            default: '#2979ff'
+        },
+        // 菜单标题和选项的未激活态颜色
+        inactiveColor: {
+            type: String,
+            default: '#606266'
+        },
+        // 点击遮罩是否关闭菜单
+        closeOnClickMask: {
+            type: Boolean,
+            default: true
+        },
+        // 点击当前激活项标题是否关闭菜单
+        closeOnClickSelf: {
+            type: Boolean,
+            default: true
+        },
+        // 过渡时间
+        duration: {
+            type: [Number, String],
+            default: 300
+        },
+        // 标题菜单的高度
+        height: {
+            type: [Number, String],
+            default: 40
+        },
+        // 是否显示下边框
+        borderBottom: {
+            type: Boolean,
+            default: false
+        },
+        // 标题的字体大小
+        titleSize: {
+            type: [Number, String],
+            default: 14
+        },
+        // 下拉出来的内容部分的圆角值
+        borderRadius: {
+            type: [Number, String],
+            default: 0
+        },
+        // 菜单右侧的icon图标
+        menuIcon: {
+            type: String,
+            default: 'arrow-down'
+        },
+        // 菜单右侧图标的大小
+        menuIconSize: {
+            type: [Number, String],
+            default: 14
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-dropdown/u-dropdown.vue b/uni_modules/uview-plus/components/u-dropdown/u-dropdown.vue
new file mode 100644
index 0000000..651dd84
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-dropdown/u-dropdown.vue
@@ -0,0 +1,254 @@
+<template>
+	<view class="u-dropdown">
+		<view class="u-dropdown__menu" :style="{
+			height: addUnit(height)
+		}" :class="{
+			'u-border-bottom': borderBottom
+		}">
+			<view class="u-dropdown__menu__item" v-for="(item, index) in menuList" :key="index" @tap.stop="menuClick(index)">
+				<view class="u-flex u-flex-row">
+					<text class="u-dropdown__menu__item__text" :style="{
+						color: item.disabled ? '#c0c4cc' : (index === current || highlightIndex == index) ? activeColor : inactiveColor,
+						fontSize: addUnit(titleSize)
+					}">{{item.title}}</text>
+					<view class="u-dropdown__menu__item__arrow" :class="{
+						'u-dropdown__menu__item__arrow--rotate': index === current
+					}">
+						<u-icon :custom-style="{display: 'flex'}" :name="menuIcon" :size="addUnit(menuIconSize)" :color="index === current || highlightIndex == index ? activeColor : '#c0c4cc'"></u-icon>
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="u-dropdown__content" :style="[contentStyle, {
+			transition: `opacity ${duration / 1000}s linear`,
+			top: addUnit(height),
+			height: contentHeight + 'px'
+		}]"
+		 @tap="maskClick" @touchmove.stop.prevent>
+			<view @tap.stop.prevent class="u-dropdown__content__popup" :style="[popupStyle]">
+				<slot></slot>
+			</view>
+			<view class="u-dropdown__content__mask"></view>
+		</view>
+	</view>
+</template>
+
+<script>
+    import props from './props';
+    import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addUnit, sys} from '../../libs/function/index';
+	/**
+	 * dropdown 下拉菜单
+	 * @description 该组件一般用于向下展开菜单,同时可切换多个选项卡的场景
+	 * @tutorial https://ijry.github.io/uview-plus/components/dropdown.html
+	 * @property {String} active-color 标题和选项卡选中的颜色(默认#2979ff)
+	 * @property {String} inactive-color 标题和选项卡未选中的颜色(默认#606266)
+	 * @property {Boolean} close-on-click-mask 点击遮罩是否关闭菜单(默认true)
+	 * @property {Boolean} close-on-click-self 点击当前激活项标题是否关闭菜单(默认true)
+	 * @property {String | Number} duration 选项卡展开和收起的过渡时间,单位ms(默认300)
+	 * @property {String | Number} height 标题菜单的高度,单位任意(默认80)
+	 * @property {String | Number} border-radius 菜单展开内容下方的圆角值,单位任意(默认0)
+	 * @property {Boolean} border-bottom 标题菜单是否显示下边框(默认false)
+	 * @property {String | Number} title-size 标题的字体大小,单位任意,数值默认为rpx单位(默认28)
+	 * @event {Function} open 下拉菜单被打开时触发
+	 * @event {Function} close 下拉菜单被关闭时触发
+	 * @example <u-dropdown></u-dropdown>
+	 */
+	export default {
+		name: 'u-dropdown',
+        mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				showDropdown: true, // 是否打开下来菜单,
+				menuList: [], // 显示的菜单
+				active: false, // 下拉菜单的状态
+				// 当前是第几个菜单处于激活状态,小程序中此处不能写成false或者"",否则后续将current赋值为0,
+				// 无能的TX没有使用===而是使用==判断,导致程序认为前后二者没有变化,从而不会触发视图更新
+				current: 99999,
+				// 外层内容的样式,初始时处于底层,且透明
+				contentStyle: {
+					zIndex: -1,
+					opacity: 0
+				},
+				// 让某个菜单保持高亮的状态
+				highlightIndex: 99999,
+				contentHeight: 0
+			}
+		},
+		computed: {
+			// 下拉出来部分的样式
+			popupStyle() {
+				let style = {};
+				// 进行Y轴位移,展开状态时,恢复原位。收齐状态时,往上位移100%,进行隐藏
+				style.transform = `translateY(${this.active ? 0 : '-100%'})`
+				style['transition-duration'] = this.duration / 1000 + 's';
+				style.borderRadius = `0 0 ${addUnit(this.borderRadius)} ${addUnit(this.borderRadius)}`;
+				return style;
+			}
+		},
+		created() {
+			// 引用所有子组件(u-dropdown-item)的this,不能在data中声明变量,否则在微信小程序会造成循环引用而报错
+			this.children = [];
+		},
+		mounted() {
+			this.getContentHeight();
+		},
+        emits: ['open', 'close'],
+		methods: {
+			addUnit,
+			init() {
+				// 当某个子组件内容变化时,触发父组件的init,父组件再让每一个子组件重新初始化一遍
+				// 以保证数据的正确性
+				this.menuList = [];
+				this.children.map(child => {
+					child.init();
+				})
+			},
+			// 点击菜单
+			menuClick(index) {
+				// 判断是否被禁用
+				if (this.menuList[index].disabled) return;
+				// 如果点击时的索引和当前激活项索引相同,意味着点击了激活项,需要收起下拉菜单
+				if (index === this.current && this.closeOnClickSelf) {
+					this.close();
+					// 等动画结束后,再移除下拉菜单中的内容,否则直接移除,也就没有下拉菜单收起的效果了
+					setTimeout(() => {
+						this.children[index].active = false;
+					}, this.duration)
+					return;
+				}
+				this.open(index);
+			},
+			// 打开下拉菜单
+			open(index) {
+				// 嵌套popup使用时可能获取不到正确的高度,重新计算
+				if (this.contentHeight < 1) this.getContentHeight()
+				// 重置高亮索引,否则会造成多个菜单同时高亮
+				// this.highlightIndex = 9999;
+				// 展开时,设置下拉内容的样式
+				this.contentStyle = {
+					zIndex: 11,
+				}
+				// 标记展开状态以及当前展开项的索引
+				this.active = true;
+				this.current = index;
+				// 历遍所有的子元素,将索引匹配的项标记为激活状态,因为子元素是通过v-if控制切换的
+				// 之所以不是因display: none,是因为nvue没有display这个属性
+				this.children.map((val, idx) => {
+					val.active = index == idx ? true : false;
+				})
+				this.$emit('open', this.current);
+			},
+			// 设置下拉菜单处于收起状态
+			close() {
+				this.$emit('close', this.current);
+				// 设置为收起状态,同时current归位,设置为空字符串
+				this.active = false;
+				this.current = 99999;
+				// 下拉内容的样式进行调整,不透明度设置为0
+				this.contentStyle = {
+					zIndex: -1,
+					opacity: 0
+				}
+			},
+			// 点击遮罩
+			maskClick() {
+				// 如果不允许点击遮罩,直接返回
+				if (!this.closeOnClickMask) return;
+				this.close();
+			},
+			// 外部手动设置某个菜单高亮
+			highlight(index = undefined) {
+				this.highlightIndex = index !== undefined ? index : 99999;
+			},
+			// 获取下拉菜单内容的高度
+			getContentHeight() {
+				// 这里的原理为,因为dropdown组件是相对定位的,它的下拉出来的内容,必须给定一个高度
+				// 才能让遮罩占满菜单一下,直到屏幕底部的高度
+				// sys()为uview-plus封装的获取设备信息的方法
+				let windowHeight = sys().windowHeight;
+				this.$uGetRect('.u-dropdown__menu').then(res => {
+					// 这里获取的是dropdown的尺寸,在H5上,uniapp获取尺寸是有bug的(以前提出修复过,后来又出现了此bug,目前hx2.8.11版本)
+					// H5端bug表现为元素尺寸的top值为导航栏底部到到元素的上边沿的距离,但是元素的bottom值确是导航栏顶部到元素底部的距离
+					// 二者是互相矛盾的,本质原因是H5端导航栏非原生,uni的开发者大意造成
+					// 这里取菜单栏的botton值合理的,不能用res.top,否则页面会造成滚动
+					this.contentHeight = windowHeight - res.bottom;
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	@import "../../libs/css/components.scss";
+
+	.u-dropdown {
+		flex: 1;
+		width: 100%;
+		position: relative;
+
+		&__menu {
+			@include flex;
+			position: relative;
+			z-index: 11;
+			height: 80rpx;
+
+			&__item {
+				flex: 1;
+				@include flex;
+				justify-content: center;
+				align-items: center;
+
+                .u-flex-row {
+                    flex-direction: row;
+                }
+
+				&__text {
+					font-size: 28rpx;
+					color: $u-content-color;
+				}
+
+				&__arrow {
+					margin-left: 6rpx;
+					transition: transform .3s;
+					align-items: center;
+					@include flex;
+
+					&--rotate {
+						transform: rotate(180deg);
+					}
+				}
+			}
+		}
+
+		&__content {
+			position: absolute;
+			z-index: 8;
+			width: 100%;
+			left: 0px;
+			bottom: 0;
+			overflow: hidden;
+			
+
+			&__mask {
+				position: absolute;
+				z-index: 9;
+				background: rgba(0, 0, 0, .3);
+				width: 100%;
+				left: 0;
+				top: 0;
+				bottom: 0;
+			}
+
+			&__popup {
+				position: relative;
+				z-index: 10;
+				transition: all 0.3s;
+				transform: translate3D(0, -100%, 0);
+				overflow: hidden;
+			}
+		}
+
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-empty/props.js b/uni_modules/uview-plus/components/u-empty/props.js
new file mode 100644
index 0000000..f0e16b8
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-empty/props.js
@@ -0,0 +1,60 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 内置图标名称,或图片路径,建议绝对路径
+        icon: {
+            type: String,
+            default: () => defProps.empty.icon
+        },
+        // 提示文字
+        text: {
+            type: String,
+            default: () => defProps.empty.text
+        },
+        // 文字颜色
+        textColor: {
+            type: String,
+            default: () => defProps.empty.textColor
+        },
+        // 文字大小
+        textSize: {
+            type: [String, Number],
+            default: () => defProps.empty.textSize
+        },
+        // 图标的颜色
+        iconColor: {
+            type: String,
+            default: () => defProps.empty.iconColor
+        },
+        // 图标的大小
+        iconSize: {
+            type: [String, Number],
+            default: () => defProps.empty.iconSize
+        },
+        // 选择预置的图标类型
+        mode: {
+            type: String,
+            default: () => defProps.empty.mode
+        },
+        //  图标宽度,单位px
+        width: {
+            type: [String, Number],
+            default: () => defProps.empty.width
+        },
+        // 图标高度,单位px
+        height: {
+            type: [String, Number],
+            default: () => defProps.empty.height
+        },
+        // 是否显示组件
+        show: {
+            type: Boolean,
+            default: () => defProps.empty.show
+        },
+        // 组件距离上一个元素之间的距离,默认px单位
+        marginTop: {
+            type: [String, Number],
+            default: () => defProps.empty.marginTop
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-empty/u-empty.vue b/uni_modules/uview-plus/components/u-empty/u-empty.vue
new file mode 100644
index 0000000..cc58c44
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-empty/u-empty.vue
@@ -0,0 +1,133 @@
+<template>
+	<view
+	    class="u-empty"
+	    :style="[emptyStyle]"
+	    v-if="show"
+	>
+		<u-icon
+		    v-if="!isSrc"
+		    :name="mode === 'message' ? 'chat' : `empty-${mode}`"
+		    :size="iconSize"
+		    :color="iconColor"
+		    margin-top="14"
+		></u-icon>
+		<image
+		    v-else
+		    :style="{
+				width: addUnit(width),
+				height: addUnit(height),
+			}"
+		    :src="icon"
+		    mode="widthFix"
+		></image>
+		<text
+		    class="u-empty__text"
+		    :style="[textStyle]"
+		>{{text ? text : icons[mode]}}</text>
+		<view class="u-empty__wrap" v-if="$slots.default || $slots.$default">
+			<slot />
+		</view>
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addUnit, addStyle, deepMerge } from '../../libs/function/index';
+	/**
+	 * empty 内容为空
+	 * @description 该组件用于需要加载内容,但是加载的第一页数据就为空,提示一个"没有内容"的场景, 我们精心挑选了十几个场景的图标,方便您使用。
+	 * @tutorial https://ijry.github.io/uview-plus/components/empty.html
+	 * @property {String}			icon		内置图标名称,或图片路径,建议绝对路径
+	 * @property {String}			text		提示文字
+	 * @property {String}			textColor	文字颜色 (默认 '#c0c4cc' )
+	 * @property {String | Number}	textSize	文字大小 (默认 14 )
+	 * @property {String}			iconColor	图标的颜色 (默认 '#c0c4cc' )
+	 * @property {String | Number}	iconSize	图标的大小 (默认 90 )
+	 * @property {String}			mode		选择预置的图标类型 (默认 'data' )
+	 * @property {String | Number}	width		图标宽度,单位px (默认 160 )
+	 * @property {String | Number}	height		图标高度,单位px (默认 160 )
+	 * @property {Boolean}			show		是否显示组件 (默认 true )
+	 * @property {String | Number}	marginTop	组件距离上一个元素之间的距离,默认px单位 (默认 0 )
+	 * @property {Object}			customStyle	定义需要用到的外部样式
+	 * 
+	 * @event {Function} click 点击组件时触发
+	 * @event {Function} close 点击关闭按钮时触发
+	 * @example <u-empty text="所谓伊人,在水一方" mode="list"></u-empty>
+	 */
+	export default {
+		name: "u-empty",
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				icons: {
+					car: '购物车为空',
+					page: '页面不存在',
+					search: '没有搜索结果',
+					address: '没有收货地址',
+					wifi: '没有WiFi',
+					order: '订单为空',
+					coupon: '没有优惠券',
+					favor: '暂无收藏',
+					permission: '无权限',
+					history: '无历史记录',
+					news: '无新闻列表',
+					message: '消息列表为空',
+					list: '列表为空',
+					data: '数据为空',
+					comment: '暂无评论',
+				}
+			}
+		},
+		computed: {
+			// 组件样式
+			emptyStyle() {
+				const style = {}
+				style.marginTop = addUnit(this.marginTop)
+				// 合并customStyle样式,此参数通过mixin中的props传递
+				return deepMerge(addStyle(this.customStyle), style)
+			},
+			// 文本样式
+			textStyle() {
+				const style = {}
+				style.color = this.textColor
+				style.fontSize = addUnit(this.textSize)
+				return style
+			},
+			// 判断icon是否图片路径
+			isSrc() {
+				return this.icon.indexOf('/') >= 0
+			}
+		},
+		methods: {
+			addUnit
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import '../../libs/css/components.scss';
+	$u-empty-text-margin-top:20rpx !default;
+	$u-empty-slot-margin-top:20rpx !default;
+
+	.u-empty {
+		@include flex;
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+
+		&__text {
+			@include flex;
+			justify-content: center;
+			align-items: center;
+			margin-top: $u-empty-text-margin-top;
+		}
+	}
+		.u-slot-wrap {
+			@include flex;
+			justify-content: center;
+			align-items: center;
+			margin-top:$u-empty-slot-margin-top;
+		}
+</style>
diff --git a/uni_modules/uview-plus/components/u-form-item/props.js b/uni_modules/uview-plus/components/u-form-item/props.js
new file mode 100644
index 0000000..02637a9
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-form-item/props.js
@@ -0,0 +1,54 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // input的label提示语
+        label: {
+            type: String,
+            default: () => defProps.formItem.label
+        },
+        // 绑定的值
+        prop: {
+            type: String,
+            default: () => defProps.formItem.prop
+        },
+        // 绑定的规则
+        rule: {
+            type: String,
+            default: () => defProps.formItem.rule
+        },
+        // 是否显示表单域的下划线边框
+        borderBottom: {
+            type: [String, Boolean],
+            default: () => defProps.formItem.borderBottom
+        },
+        // label的位置,left-左边,top-上边
+        labelPosition: {
+            type: String,
+            default: () => defProps.formItem.labelPosition
+        },
+        // label的宽度,单位px
+        labelWidth: {
+            type: [String, Number],
+            default: () => defProps.formItem.labelWidth
+        },
+        // 右侧图标
+        rightIcon: {
+            type: String,
+            default: () => defProps.formItem.rightIcon
+        },
+        // 左侧图标
+        leftIcon: {
+            type: String,
+            default: () => defProps.formItem.leftIcon
+        },
+        // 是否显示左边的必填星号,只作显示用,具体校验必填的逻辑,请在rules中配置
+        required: {
+            type: Boolean,
+            default: () => defProps.formItem.required
+        },
+        leftIconStyle: {
+            type: [String, Object],
+            default: () => defProps.formItem.leftIconStyle,
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-form-item/u-form-item.vue b/uni_modules/uview-plus/components/u-form-item/u-form-item.vue
new file mode 100644
index 0000000..80a7a1a
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-form-item/u-form-item.vue
@@ -0,0 +1,245 @@
+<template>
+	<view class="u-form-item">
+		<view
+			class="u-form-item__body"
+			@tap="clickHandler"
+			:style="[addStyle(customStyle), {
+                flexDirection: (labelPosition || parentData.labelPosition) === 'left' ? 'row' : 'column'
+			}]"
+		>
+			<!-- 微信小程序中,将一个参数设置空字符串,结果会变成字符串"true" -->
+			<slot name="label">
+				<!-- {{required}} -->
+				<view
+					class="u-form-item__body__left"
+					v-if="required || leftIcon || label"
+					:style="{
+						width: addUnit(labelWidth || parentData.labelWidth),
+						marginBottom: parentData.labelPosition === 'left' ? 0 : '5px',
+					}"
+				>
+					<!-- 为了块对齐 -->
+					<view class="u-form-item__body__left__content">
+						<!-- nvue不支持伪元素before -->
+						<text
+							v-if="required"
+							class="u-form-item__body__left__content__required"
+						>*</text>
+						<view
+							class="u-form-item__body__left__content__icon"
+							v-if="leftIcon"
+						>
+							<u-icon
+								:name="leftIcon"
+								:custom-style="leftIconStyle"
+							></u-icon>
+						</view>
+						<text
+							class="u-form-item__body__left__content__label"
+							:style="[parentData.labelStyle, {
+								justifyContent: parentData.labelAlign === 'left' ? 'flex-start' : parentData.labelAlign === 'center' ? 'center' : 'flex-end'
+							}]"
+						>{{ label }}</text>
+					</view>
+				</view>
+			</slot>
+			<view class="u-form-item__body__right">
+				<view class="u-form-item__body__right__content">
+					<view class="u-form-item__body__right__content__slot">
+						<slot />
+					</view>
+					<view
+						class="item__body__right__content__icon"
+						v-if="$slots.right"
+					>
+						<slot name="right" />
+					</view>
+				</view>
+			</view>
+		</view>
+		<slot name="error">
+			<text
+				v-if="!!message && parentData.errorType === 'message'"
+				class="u-form-item__body__right__message"
+				:style="{
+					marginLeft:  addUnit(parentData.labelPosition === 'top' ? 0 : (labelWidth || parentData.labelWidth))
+				}"
+			>{{ message }}</text>
+		</slot>
+		<u-line
+			v-if="borderBottom"
+			:color="message && parentData.errorType === 'border-bottom' ? color.error : propsLine.color"
+			:customStyle="`margin-top: ${message && parentData.errorType === 'message' ? '5px' : 0}`"
+		></u-line>
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import defProps from '../../libs/config/props.js';
+	import color from '../../libs/config/color';
+	import { addStyle, addUnit, getProperty, setProperty, error } from '../../libs/function/index';
+	/**
+	 * Form 表单
+	 * @description 此组件一般用于表单场景,可以配置Input输入框,Select弹出框,进行表单验证等。
+	 * @tutorial https://ijry.github.io/uview-plus/components/form.html
+	 * @property {String}			label			input的label提示语
+	 * @property {String}			prop			绑定的值
+	 * @property {String}			rule			绑定的规则
+	 * @property {String | Boolean}	borderBottom	是否显示表单域的下划线边框
+	 * @property {String | Number}	labelWidth		label的宽度,单位px
+	 * @property {String}			rightIcon		右侧图标
+	 * @property {String}			leftIcon		左侧图标
+	 * @property {String | Object} leftIconStyle 左侧图标的样式
+	 * @property {Boolean}			required		是否显示左边的必填星号,只作显示用,具体校验必填的逻辑,请在rules中配置 (默认 false )
+	 *
+	 * @example <u-form-item label="姓名" prop="userInfo.name" borderBottom ref="item1"></u-form-item>
+	 */
+	export default {
+		name: 'u-form-item',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				// 错误提示语
+				message: '',
+				parentData: {
+					// 提示文本的位置
+					labelPosition: 'left',
+					// 提示文本对齐方式
+					labelAlign: 'left',
+					// 提示文本的样式
+					labelStyle: {},
+					// 提示文本的宽度
+					labelWidth: 45,
+					// 错误提示方式
+					errorType: 'message'
+				},
+				color: color
+			}
+		},
+		// 组件创建完成时,将当前实例保存到u-form中
+		computed: {
+			propsLine() {
+				return defProps.line
+			}
+		},
+		mounted() {
+			this.init()
+		},
+		emits: ["click"],
+		methods: {
+			addStyle,
+			addUnit,
+			init() {
+				// 父组件的实例
+				this.updateParentData()
+				if (!this.parent) {
+					error('u-form-item需要结合u-form组件使用')
+				}
+			},
+			// 获取父组件的参数
+			updateParentData() {
+				// 此方法写在mixin中
+				this.getParentData('u-form');
+			},
+			// 移除u-form-item的校验结果
+			clearValidate() {
+				this.message = null
+			},
+			// 清空当前的组件的校验结果,并重置为初始值
+			resetField() {
+				// 找到原始值
+				const value = getProperty(this.parent.originalModel, this.prop)
+				// 将u-form的model的prop属性链还原原始值
+				setProperty(this.parent.model, this.prop, value)
+				// 移除校验结果
+				this.message = null
+			},
+			// 点击组件
+			clickHandler() {
+				this.$emit('click')
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-form-item {
+		@include flex(column);
+		font-size: 14px;
+		color: $u-main-color;
+
+		&__body {
+			@include flex;
+			padding: 10px 0;
+
+			&__left {
+				@include flex;
+				align-items: center;
+
+				&__content {
+					position: relative;
+					@include flex;
+					align-items: center;
+					padding-right: 10rpx;
+					flex: 1;
+
+					&__icon {
+						margin-right: 8rpx;
+					}
+
+					&__required {
+						position: absolute;
+						left: -9px;
+						color: $u-error;
+						line-height: 20px;
+						font-size: 20px;
+						top: 3px;
+					}
+
+					&__label {
+						@include flex;
+						align-items: center;
+						flex: 1;
+						color: $u-main-color;
+						font-size: 15px;
+					}
+				}
+			}
+
+			&__right {
+				flex: 1;
+
+				&__content {
+					@include flex;
+					align-items: center;
+					flex: 1;
+
+					&__slot {
+						flex: 1;
+						/* #ifndef MP */
+						@include flex;
+						align-items: center;
+						/* #endif */
+					}
+
+					&__icon {
+						margin-left: 10rpx;
+						color: $u-light-color;
+						font-size: 30rpx;
+					}
+				}
+
+				&__message {
+					font-size: 12px;
+					line-height: 12px;
+					color: $u-error;
+				}
+			}
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-form/props.js b/uni_modules/uview-plus/components/u-form/props.js
new file mode 100644
index 0000000..1390ca3
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-form/props.js
@@ -0,0 +1,46 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 当前form的需要验证字段的集合
+        model: {
+            type: Object,
+            default: () => defProps.form.model
+        },
+        // 验证规则
+        rules: {
+            type: [Object, Function, Array],
+            default: () => defProps.form.rules
+        },
+        // 有错误时的提示方式,message-提示信息,toast-进行toast提示
+        // border-bottom-下边框呈现红色,none-无提示
+        errorType: {
+            type: String,
+            default: () => defProps.form.errorType
+        },
+        // 是否显示表单域的下划线边框
+        borderBottom: {
+            type: Boolean,
+            default: () => defProps.form.borderBottom
+        },
+        // label的位置,left-左边,top-上边
+        labelPosition: {
+            type: String,
+            default: () => defProps.form.labelPosition
+        },
+        // label的宽度,单位px
+        labelWidth: {
+            type: [String, Number],
+            default: () => defProps.form.labelWidth
+        },
+        // lable字体的对齐方式
+        labelAlign: {
+            type: String,
+            default: () => defProps.form.labelAlign
+        },
+        // lable的样式,对象形式
+        labelStyle: {
+            type: Object,
+            default: () => defProps.form.labelStyle
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-form/u-form.vue b/uni_modules/uview-plus/components/u-form/u-form.vue
new file mode 100644
index 0000000..ded118e
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-form/u-form.vue
@@ -0,0 +1,218 @@
+<template>
+	<view class="u-form">
+		<slot />
+	</view>
+</template>
+
+<script>
+	import props from "./props.js";
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import Schema from "../../libs/util/async-validator";
+	import { toast, getProperty, setProperty, deepClone, error } from '../../libs/function/index';
+	import test from '../../libs/function/test';
+	// 去除警告信息
+	Schema.warning = function() {};
+	/**
+	 * Form 表单
+	 * @description 此组件一般用于表单场景,可以配置Input输入框,Select弹出框,进行表单验证等。
+	 * @tutorial https://ijry.github.io/uview-plus/components/form.html
+	 * @property {Object}						model			当前form的需要验证字段的集合
+	 * @property {Object | Function | Array}	rules			验证规则
+	 * @property {String}						errorType		错误的提示方式,见上方说明 ( 默认 message )
+	 * @property {Boolean}						borderBottom	是否显示表单域的下划线边框   ( 默认 true )
+	 * @property {String}						labelPosition	表单域提示文字的位置,left-左侧,top-上方 ( 默认 'left' )
+	 * @property {String | Number}				labelWidth		提示文字的宽度,单位px  ( 默认 45 )
+	 * @property {String}						labelAlign		lable字体的对齐方式   ( 默认 ‘left' )
+	 * @property {Object}						labelStyle		lable的样式,对象形式
+	 * @example <up-formlabelPosition="left" :model="model1" :rules="rules" ref="form1"></up-form>
+	 */
+	export default {
+		name: "u-form",
+		mixins: [mpMixin, mixin, props],
+		provide() {
+			return {
+				uForm: this,
+			};
+		},
+		data() {
+			return {
+				formRules: {},
+				// 规则校验器
+				validator: {},
+				// 原始的model快照,用于resetFields方法重置表单时使用
+				originalModel: null,
+			};
+		},
+		watch: {
+			// 监听规则的变化
+			rules: {
+				immediate: true,
+				handler(n) {
+					this.setRules(n);
+				},
+			},
+			// 监听属性的变化,通知子组件u-form-item重新获取信息
+			propsChange(n) {
+				if (this.children?.length) {
+					this.children.map((child) => {
+						// 判断子组件(u-form-item)如果有updateParentData方法的话,就就执行(执行的结果是子组件重新从父组件拉取了最新的值)
+						typeof child.updateParentData == "function" &&
+							child.updateParentData();
+					});
+				}
+			},
+			// 监听model的初始值作为重置表单的快照
+			model: {
+				immediate: true,
+				handler(n) {
+					if (!this.originalModel) {
+						this.originalModel = deepClone(n);
+					}
+				},
+			},
+		},
+		computed: {
+			propsChange() {
+				return [
+					this.errorType,
+					this.borderBottom,
+					this.labelPosition,
+					this.labelWidth,
+					this.labelAlign,
+					this.labelStyle,
+				];
+			},
+		},
+		created() {
+			// 存储当前form下的所有u-form-item的实例
+			// 不能定义在data中,否则微信小程序会造成循环引用而报错
+			this.children = [];
+		},
+		methods: {
+			// 手动设置校验的规则,如果规则中有函数的话,微信小程序中会过滤掉,所以只能手动调用设置规则
+			setRules(rules) {
+				// 判断是否有规则
+				if (Object.keys(rules).length === 0) return;
+				if (process.env.NODE_ENV === 'development' && Object.keys(this.model).length === 0) {
+					error('设置rules,model必须设置!如果已经设置,请刷新页面。');
+					return;
+				};
+				this.formRules = rules;
+				// 重新将规则赋予Validator
+				this.validator = new Schema(rules);
+			},
+			// 清空所有u-form-item组件的内容,本质上是调用了u-form-item组件中的resetField()方法
+			resetFields() {
+				this.resetModel();
+			},
+			// 重置model为初始值的快照
+			resetModel(obj) {
+				// 历遍所有u-form-item,根据其prop属性,还原model的原始快照
+				this.children.map((child) => {
+					const prop = child?.prop;
+					const value = getProperty(this.originalModel, prop);
+					setProperty(this.model, prop, value);
+				});
+			},
+			// 清空校验结果
+			clearValidate(props) {
+				props = [].concat(props);
+				this.children.map((child) => {
+					// 如果u-form-item的prop在props数组中,则清除对应的校验结果信息
+					if (props[0] === undefined || props.includes(child.prop)) {
+						child.message = null;
+					}
+				});
+			},
+			// 对部分表单字段进行校验
+			async validateField(value, callback, event = null) {
+				// $nextTick是必须的,否则model的变更,可能会延后于此方法的执行
+				this.$nextTick(() => {
+					// 校验错误信息,返回给回调方法,用于存放所有form-item的错误信息
+					const errorsRes = [];
+					// 如果为字符串,转为数组
+					value = [].concat(value);
+					// 历遍children所有子form-item
+					this.children.map((child) => {
+						// 用于存放form-item的错误信息
+						const childErrors = [];
+						if (value.includes(child.prop)) {
+							// 获取对应的属性,通过类似'a.b.c'的形式
+							const propertyVal = getProperty(
+								this.model,
+								child.prop
+							);
+							// 属性链数组
+							const propertyChain = child.prop.split(".");
+							const propertyName =
+								propertyChain[propertyChain.length - 1];
+
+							const rule = this.formRules[child.rule || child.prop];
+							// 如果不存在对应的规则,直接返回,否则校验器会报错
+							if (!rule) return;
+							// rule规则可为数组形式,也可为对象形式,此处拼接成为数组
+							const rules = [].concat(rule);
+
+							// 对rules数组进行校验
+							for (let i = 0; i < rules.length; i++) {
+								const ruleItem = rules[i];
+								// 将u-form-item的触发器转为数组形式
+								const trigger = [].concat(ruleItem?.trigger);
+								// 如果是有传入触发事件,但是此form-item却没有配置此触发器的话,不执行校验操作
+								if (event && !trigger.includes(event)) continue;
+								// 实例化校验对象,传入构造规则
+								const validator = new Schema({
+									[propertyName]: ruleItem,
+								});
+								validator.validate({
+										[propertyName]: propertyVal,
+									},
+									(errors, fields) => {
+										if (test.array(errors)) {
+											errorsRes.push(...errors);
+											childErrors.push(...errors);
+										}
+										child.message =
+											childErrors[0]?.message ? childErrors[0].message : null;
+									}
+								);
+							}
+						}
+					});
+					// 执行回调函数
+					typeof callback === "function" && callback(errorsRes);
+				});
+			},
+			// 校验全部数据
+			validate(callback) {
+				// 开发环境才提示,生产环境不会提示
+				if (process.env.NODE_ENV === 'development' && Object.keys(this.formRules).length === 0) {
+					error('未设置rules,请看文档说明!如果已经设置,请刷新页面。');
+					return;
+				}
+				return new Promise((resolve, reject) => {
+					// $nextTick是必须的,否则model的变更,可能会延后于validate方法
+					this.$nextTick(() => {
+						// 获取所有form-item的prop,交给validateField方法进行校验
+						const formItemProps = this.children.map(
+							(item) => item.prop
+						);
+						this.validateField(formItemProps, (errors) => {
+							if(errors.length) {
+								// 如果错误提示方式为toast,则进行提示
+								this.errorType === 'toast' && toast(errors[0].message)
+								reject(errors)
+							} else {
+								resolve(true)
+							}
+						});
+					});
+				});
+			},
+		},
+	};
+</script>
+
+<style lang="scss" scoped>
+</style>
diff --git a/uni_modules/uview-plus/components/u-gap/props.js b/uni_modules/uview-plus/components/u-gap/props.js
new file mode 100644
index 0000000..cc5bac4
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-gap/props.js
@@ -0,0 +1,25 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 背景颜色(默认transparent)
+        bgColor: {
+            type: String,
+            default: () => defProps.gap.bgColor
+        },
+        // 分割槽高度,单位px(默认30)
+        height: {
+            type: [String, Number],
+            default: () => defProps.gap.height
+        },
+        // 与上一个组件的距离
+        marginTop: {
+            type: [String, Number],
+            default: () => defProps.gap.marginTop
+        },
+        // 与下一个组件的距离
+        marginBottom: {
+            type: [String, Number],
+            default: () => defProps.gap.marginBottom
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-gap/u-gap.vue b/uni_modules/uview-plus/components/u-gap/u-gap.vue
new file mode 100644
index 0000000..9a2e32d
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-gap/u-gap.vue
@@ -0,0 +1,41 @@
+<template>
+	<view class="u-gap" :style="[gapStyle]"></view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addStyle, addUnit, deepMerge } from '../../libs/function/index.js';
+	/**
+	 * gap 间隔槽
+	 * @description 该组件一般用于内容块之间的用一个灰色块隔开的场景,方便用户风格统一,减少工作量
+	 * @tutorial https://ijry.github.io/uview-plus/components/gap.html
+	 * @property {String}			bgColor			背景颜色 (默认 'transparent' )
+	 * @property {String | Number}	height			分割槽高度,单位px (默认 20 )
+	 * @property {String | Number}	marginTop		与前一个组件的距离,单位px( 默认 0 )
+	 * @property {String | Number}	marginBottom	与后一个组件的距离,单位px (默认 0 )
+	 * @property {Object}			customStyle		定义需要用到的外部样式
+	 * 
+	 * @example <u-gap height="80" bg-color="#bbb"></u-gap>
+	 */
+	export default {
+		name: "u-gap",
+		mixins: [mpMixin, mixin, props],
+		computed: {
+			gapStyle() {
+				const style = {
+					backgroundColor: this.bgColor,
+					height: addUnit(this.height),
+					marginTop: addUnit(this.marginTop),
+					marginBottom: addUnit(this.marginBottom),
+				}
+				return deepMerge(style, addStyle(this.customStyle))
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+</style>
diff --git a/uni_modules/uview-plus/components/u-grid-item/props.js b/uni_modules/uview-plus/components/u-grid-item/props.js
new file mode 100644
index 0000000..a3a628d
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-grid-item/props.js
@@ -0,0 +1,15 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 宫格的name
+        name: {
+            type: [String, Number, null],
+            default: () => defProps.gridItem.name
+        },
+        // 背景颜色
+        bgColor: {
+            type: String,
+            default: () => defProps.gridItem.bgColor
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-grid-item/u-grid-item.vue b/uni_modules/uview-plus/components/u-grid-item/u-grid-item.vue
new file mode 100644
index 0000000..b0dc0ed
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-grid-item/u-grid-item.vue
@@ -0,0 +1,232 @@
+<template>
+	<!-- #ifndef APP-NVUE -->
+	<view
+		v-if="parentData.col > 0"
+	    class="u-grid-item"
+	    hover-class="u-grid-item--hover-class"
+	    :hover-stay-time="200"
+	    @tap="clickHandler"
+	    :class="classes"
+	    :style="[itemStyle]"
+	>
+		<slot />
+	</view>
+	<!-- #endif -->
+	<!-- #ifdef APP-NVUE -->
+	<view
+	    class="u-grid-item"
+	    :hover-stay-time="200"
+	    @tap="clickHandler"
+	    :class="classes"
+	    :style="[itemStyle]"
+	>
+		<slot />
+	</view>
+	<!-- #endif -->
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addStyle, deepMerge } from '../../libs/function/index';
+	/**
+	 * gridItem 提示
+	 * @description 宫格组件一般用于同时展示多个同类项目的场景,可以给宫格的项目设置徽标组件(badge),或者图标等,也可以扩展为左右滑动的轮播形式。搭配u-grid使用
+	 * @tutorial https://ijry.github.io/uview-plus/components/grid.html
+	 * @property {String | Number}	name		宫格的name ( 默认 null )
+	 * @property {String}			bgColor		宫格的背景颜色 (默认 'transparent' )
+	 * @property {Object}			customStyle	自定义样式,对象形式
+	 * @event {Function} click 点击宫格触发
+	 * @example <u-grid-item></u-grid-item>
+	 */
+	export default {
+		name: "u-grid-item",
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				parentData: {
+					col: 0, // 父组件划分的宫格数
+					border: true, // 是否显示边框,根据父组件决定
+				},
+				// #ifdef APP-NVUE
+				width: 0, // nvue下才这么计算,vue下放到computed中,否则会因为延时造成闪烁
+				// #endif
+				// #ifdef MP-TOUTIAO
+				width: '100%',
+				// #endif
+				classes: [], // 类名集合,用于判断是否显示右边和下边框
+			};
+		},
+		mounted() {
+			this.init()
+		},
+		emits: ['click'],
+		//  微信小程序中 options 选项
+		// #ifdef MP-WEIXIN
+		options: {
+		    virtualHost: true ,//将自定义节点设置成虚拟的,更加接近Vue组件的表现。我们不希望自定义组件的这个节点本身可以设置样式、响应 flex 布局等
+		},
+		// #endif
+		computed: {
+			// #ifndef APP-NVUE || MP-TOUTIAO
+			// vue下放到computed中,否则会因为延时造成闪烁
+			width() {
+				if (this.parentData.col > 0) {
+					return 100 / Number(this.parentData.col) + '%'
+				} else {
+					return 0;
+				}
+			},
+			// #endif
+			itemStyle() {
+				const style = {
+					background: this.bgColor,
+					width: this.width
+				}
+				return deepMerge(style, addStyle(this.customStyle))
+			}
+		},
+		methods: {
+			init() {
+				// 用于在父组件u-grid的children中被添加入子组件时,
+				// 重新计算item的边框
+				uni.$on('$uGridItem', () => {
+					this.gridItemClasses()
+				})
+				// 父组件的实例
+				this.updateParentData()
+				// #ifdef APP-NVUE
+				// 获取元素该有的长度,nvue下要延时才准确
+				this.$nextTick(function(){
+					this.getItemWidth()
+				})
+				// #endif
+				// 发出事件,通知所有的grid-item都重新计算自己的边框
+				uni.$emit('$uGridItem')
+				this.gridItemClasses()
+			},
+			// 获取父组件的参数
+			updateParentData() {
+				// 此方法写在mixin中
+				this.getParentData('u-grid');
+			},
+			clickHandler() {
+				let name = this.name
+				// 如果没有设置name属性,历遍父组件的children数组,判断当前的元素是否和本实例this相等,找出当前组件的索引
+				const children = this.parent?.children
+				if(children && this.name === null) {
+					name = children.findIndex(child => child === this)
+				}
+				// 调用父组件方法,发出事件
+				this.parent && this.parent.childClick(name)
+				this.$emit('click', name)
+			},
+			async getItemWidth() {
+				// 如果是nvue,不能使用百分比,只能使用固定宽度
+				let width = 0
+				if(this.parent) {
+					// 获取父组件宽度后,除以栅格数,得出每个item的宽度
+					const parentWidth = await this.getParentWidth()
+					width = parentWidth / Number(this.parentData.col) + 'px'
+				}
+				this.width = width
+			},
+			// 获取父元素的尺寸
+			getParentWidth() {
+				// #ifdef APP-NVUE
+				// 返回一个promise,让调用者可以用await同步获取
+				const dom = uni.requireNativePlugin('dom')
+				return new Promise(resolve => {
+					// 调用父组件的ref
+					dom.getComponentRect(this.parent.$refs['u-grid'], res => {
+						resolve(res.size.width)
+					})
+				})
+				// #endif
+			},
+			gridItemClasses() {
+				if(this.parentData.border) {
+					let classes = []
+					this.parent.children.map((child, index) =>{
+						if(this === child) {
+							const len = this.parent.children.length
+							// 贴近右边屏幕边沿的child,并且最后一个(比如只有横向2个的时候),无需右边框
+							if((index + 1) % this.parentData.col !== 0 && index + 1 !== len) {
+								classes.push('u-border-right')
+							}
+							// 总的宫格数量对列数取余的值
+							// 如果取余后,值为0,则意味着要将最后一排的宫格,都不需要下边框
+							const lessNum = len % this.parentData.col === 0 ? this.parentData.col : len % this.parentData.col
+							// 最下面的一排child,无需下边框
+							if(index < len - lessNum) {
+								classes.push('u-border-bottom')
+							}
+						}
+					})
+					// 支付宝,头条小程序无法动态绑定一个数组类名,否则解析出来的结果会带有",",而导致失效
+					// #ifdef MP-ALIPAY || MP-TOUTIAO
+					classes = classes.join(' ')
+					// #endif
+					this.classes = classes
+				}
+			}
+		},
+		// #ifdef VUE2
+		beforeDestroy() {
+		// #endif
+		// #ifdef VUE3
+		beforeUnmount() {
+		// #endif
+			// 移除事件监听,释放性能
+			uni.$off('$uGridItem')
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+      $u-grid-item-hover-class-opcatiy:.5 !default;
+      $u-grid-item-margin-top:1rpx !default;
+      $u-grid-item-border-right-width:0.5px !default;
+      $u-grid-item-border-bottom-width:0.5px !default;
+      $u-grid-item-border-right-color:$u-border-color !default;
+      $u-grid-item-border-bottom-color:$u-border-color !default;
+	.u-grid-item {
+		align-items: center;
+		justify-content: center;
+		position: relative;
+		flex-direction: column;
+		/* #ifndef APP-NVUE */
+		box-sizing: border-box;
+		display: flex;
+		/* #endif */
+
+		/* #ifdef MP */
+		position: relative;
+		float: left;
+		/* #endif */
+
+		/* #ifdef MP-WEIXIN */
+		margin-top:$u-grid-item-margin-top;
+		/* #endif */
+
+		&--hover-class {
+			opacity:$u-grid-item-hover-class-opcatiy;
+		}
+	}
+
+	/* #ifdef APP-NVUE */
+	// 由于nvue不支持组件内引入app.vue中再引入的样式,所以需要写在这里
+	.u-border-right {
+		border-right-width:$u-grid-item-border-right-width;
+		border-color: $u-grid-item-border-right-color;
+	}
+
+	.u-border-bottom {
+		border-bottom-width:$u-grid-item-border-bottom-width;
+		border-color:$u-grid-item-border-bottom-color;
+	}
+
+	/* #endif */
+</style>
diff --git a/uni_modules/uview-plus/components/u-grid/props.js b/uni_modules/uview-plus/components/u-grid/props.js
new file mode 100644
index 0000000..3dd4a12
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-grid/props.js
@@ -0,0 +1,20 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 分成几列
+        col: {
+            type: [String, Number],
+            default: () => defProps.grid.col
+        },
+        // 是否显示边框
+        border: {
+            type: Boolean,
+            default: () => defProps.grid.border
+        },
+        // 宫格对齐方式,表现为数量少的时候,靠左,居中,还是靠右
+        align: {
+            type: String,
+            default: () => defProps.grid.align
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-grid/u-grid.vue b/uni_modules/uview-plus/components/u-grid/u-grid.vue
new file mode 100644
index 0000000..ed273b5
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-grid/u-grid.vue
@@ -0,0 +1,113 @@
+<template>
+	<view
+	    class="u-grid"
+		ref='u-grid'
+	    :style="[gridStyle]"
+	>
+		<slot />
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addStyle, deepMerge } from '../../libs/function/index';
+	/**
+	 * grid 宫格布局
+	 * @description 宫格组件一般用于同时展示多个同类项目的场景,可以给宫格的项目设置徽标组件(badge),或者图标等,也可以扩展为左右滑动的轮播形式。
+	 * @tutorial https://ijry.github.io/uview-plus/components/grid.html
+	 * @property {String | Number}	col			宫格的列数(默认 3 )
+	 * @property {Boolean}			border		是否显示宫格的边框(默认 false )
+	 * @property {String}			align		宫格对齐方式,表现为数量少的时候,靠左,居中,还是靠右 (默认 'left' )
+	 * @property {Object}			customStyle	定义需要用到的外部样式
+	 * @event {Function} click 点击宫格触发
+	 * @example <u-grid :col="3" @click="click"></u-grid>
+	 */
+	export default {
+		name: 'u-grid',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				index: 0,
+				width: 0
+			}
+		},
+		watch: {
+			// 当父组件需要子组件需要共享的参数发生了变化,手动通知子组件
+			parentData() {
+				if (this.children.length) {
+					this.children.map(child => {
+						// 判断子组件(u-radio)如果有updateParentData方法的话,就就执行(执行的结果是子组件重新从父组件拉取了最新的值)
+						typeof(child.updateParentData) == 'function' && child.updateParentData();
+					})
+				}
+			},
+		},
+		created() {
+			// 如果将children定义在data中,在微信小程序会造成循环引用而报错
+			this.children = []
+		},
+		computed: {
+			// 计算父组件的值是否发生变化
+			parentData() {
+				return [this.hoverClass, this.col, this.size, this.border];
+			},
+			// 宫格对齐方式
+			gridStyle() {
+				let style = {};
+				switch (this.align) {
+					case 'left':
+						style.justifyContent = 'flex-start';
+						break;
+					case 'center':
+						style.justifyContent = 'center';
+						break;
+					case 'right':
+						style.justifyContent = 'flex-end';
+						break;
+					default:
+						style.justifyContent = 'flex-start';
+				};
+				return deepMerge(style, addStyle(this.customStyle));
+			}
+		},
+		emits: ['click'], // 防止事件执行两次
+		// 20240409发现抖音小程序如果开启virtualHost会出现严重问题,几乎所有事件包括created等生命周期事件全部失效。
+		// #ifdef MP-WEIXIN
+		options: {
+		    // virtualHost: true ,//将自定义节点设置成虚拟的,更加接近Vue组件的表现。我们不希望自定义组件的这个节点本身可以设置样式、响应 flex 布局等
+		},
+		// #endif
+		methods: {
+			// 此方法由u-grid-item触发,用于在u-grid发出事件
+			childClick(name) {
+				this.$emit('click', name)
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+     $u-grid-width:100% !default;
+	.u-grid {
+		/* #ifdef MP */
+		width: $u-grid-width;
+		position: relative;
+		box-sizing: border-box;
+		overflow: hidden;
+		display: block;
+		/* #endif */
+		justify-content: center;
+		@include flex;
+		flex-wrap: wrap;
+		align-items: center;
+		// 在uni-app中应尽量避免使用flex布局以外的方式,因为nvue/uvue等方案都支持flex布局
+		// 这里使用grid布局使用为目前20240409uni-app在抖音小程序开启virtualHost时有bug,存在事件失效问题。
+		/* #ifdef MP-TOUTIAO */
+		display: grid;
+		grid-template-columns: repeat(v-bind(col), 1fr);
+		/* #endif */
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-icon/icons.js b/uni_modules/uview-plus/components/u-icon/icons.js
new file mode 100644
index 0000000..f4d0fe2
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-icon/icons.js
@@ -0,0 +1,214 @@
+export default {
+    'uicon-level': '\ue693',
+    'uicon-column-line': '\ue68e',
+    'uicon-checkbox-mark': '\ue807',
+    'uicon-folder': '\ue7f5',
+    'uicon-movie': '\ue7f6',
+    'uicon-star-fill': '\ue669',
+    'uicon-star': '\ue65f',
+    'uicon-phone-fill': '\ue64f',
+    'uicon-phone': '\ue622',
+    'uicon-apple-fill': '\ue881',
+    'uicon-chrome-circle-fill': '\ue885',
+    'uicon-backspace': '\ue67b',
+    'uicon-attach': '\ue632',
+    'uicon-cut': '\ue948',
+    'uicon-empty-car': '\ue602',
+    'uicon-empty-coupon': '\ue682',
+    'uicon-empty-address': '\ue646',
+    'uicon-empty-favor': '\ue67c',
+    'uicon-empty-permission': '\ue686',
+    'uicon-empty-news': '\ue687',
+    'uicon-empty-search': '\ue664',
+    'uicon-github-circle-fill': '\ue887',
+    'uicon-rmb': '\ue608',
+    'uicon-person-delete-fill': '\ue66a',
+    'uicon-reload': '\ue788',
+    'uicon-order': '\ue68f',
+    'uicon-server-man': '\ue6bc',
+    'uicon-search': '\ue62a',
+    'uicon-fingerprint': '\ue955',
+    'uicon-more-dot-fill': '\ue630',
+    'uicon-scan': '\ue662',
+    'uicon-share-square': '\ue60b',
+    'uicon-map': '\ue61d',
+    'uicon-map-fill': '\ue64e',
+    'uicon-tags': '\ue629',
+    'uicon-tags-fill': '\ue651',
+    'uicon-bookmark-fill': '\ue63b',
+    'uicon-bookmark': '\ue60a',
+    'uicon-eye': '\ue613',
+    'uicon-eye-fill': '\ue641',
+    'uicon-mic': '\ue64a',
+    'uicon-mic-off': '\ue649',
+    'uicon-calendar': '\ue66e',
+    'uicon-calendar-fill': '\ue634',
+    'uicon-trash': '\ue623',
+    'uicon-trash-fill': '\ue658',
+    'uicon-play-left': '\ue66d',
+    'uicon-play-right': '\ue610',
+    'uicon-minus': '\ue618',
+    'uicon-plus': '\ue62d',
+    'uicon-info': '\ue653',
+    'uicon-info-circle': '\ue7d2',
+    'uicon-info-circle-fill': '\ue64b',
+    'uicon-question': '\ue715',
+    'uicon-error': '\ue6d3',
+    'uicon-close': '\ue685',
+    'uicon-checkmark': '\ue6a8',
+    'uicon-android-circle-fill': '\ue67e',
+    'uicon-android-fill': '\ue67d',
+    'uicon-ie': '\ue87b',
+    'uicon-IE-circle-fill': '\ue889',
+    'uicon-google': '\ue87a',
+    'uicon-google-circle-fill': '\ue88a',
+    'uicon-setting-fill': '\ue872',
+    'uicon-setting': '\ue61f',
+    'uicon-minus-square-fill': '\ue855',
+    'uicon-plus-square-fill': '\ue856',
+    'uicon-heart': '\ue7df',
+    'uicon-heart-fill': '\ue851',
+    'uicon-camera': '\ue7d7',
+    'uicon-camera-fill': '\ue870',
+    'uicon-more-circle': '\ue63e',
+    'uicon-more-circle-fill': '\ue645',
+    'uicon-chat': '\ue620',
+    'uicon-chat-fill': '\ue61e',
+    'uicon-bag-fill': '\ue617',
+    'uicon-bag': '\ue619',
+    'uicon-error-circle-fill': '\ue62c',
+    'uicon-error-circle': '\ue624',
+    'uicon-close-circle': '\ue63f',
+    'uicon-close-circle-fill': '\ue637',
+    'uicon-checkmark-circle': '\ue63d',
+    'uicon-checkmark-circle-fill': '\ue635',
+    'uicon-question-circle-fill': '\ue666',
+    'uicon-question-circle': '\ue625',
+    'uicon-share': '\ue631',
+    'uicon-share-fill': '\ue65e',
+    'uicon-shopping-cart': '\ue621',
+    'uicon-shopping-cart-fill': '\ue65d',
+    'uicon-bell': '\ue609',
+    'uicon-bell-fill': '\ue640',
+    'uicon-list': '\ue650',
+    'uicon-list-dot': '\ue616',
+    'uicon-zhihu': '\ue6ba',
+    'uicon-zhihu-circle-fill': '\ue709',
+    'uicon-zhifubao': '\ue6b9',
+    'uicon-zhifubao-circle-fill': '\ue6b8',
+    'uicon-weixin-circle-fill': '\ue6b1',
+    'uicon-weixin-fill': '\ue6b2',
+    'uicon-twitter-circle-fill': '\ue6ab',
+    'uicon-twitter': '\ue6aa',
+    'uicon-taobao-circle-fill': '\ue6a7',
+    'uicon-taobao': '\ue6a6',
+    'uicon-weibo-circle-fill': '\ue6a5',
+    'uicon-weibo': '\ue6a4',
+    'uicon-qq-fill': '\ue6a1',
+    'uicon-qq-circle-fill': '\ue6a0',
+    'uicon-moments-circel-fill': '\ue69a',
+    'uicon-moments': '\ue69b',
+    'uicon-qzone': '\ue695',
+    'uicon-qzone-circle-fill': '\ue696',
+    'uicon-baidu-circle-fill': '\ue680',
+    'uicon-baidu': '\ue681',
+    'uicon-facebook-circle-fill': '\ue68a',
+    'uicon-facebook': '\ue689',
+    'uicon-car': '\ue60c',
+    'uicon-car-fill': '\ue636',
+    'uicon-warning-fill': '\ue64d',
+    'uicon-warning': '\ue694',
+    'uicon-clock-fill': '\ue638',
+    'uicon-clock': '\ue60f',
+    'uicon-edit-pen': '\ue612',
+    'uicon-edit-pen-fill': '\ue66b',
+    'uicon-email': '\ue611',
+    'uicon-email-fill': '\ue642',
+    'uicon-minus-circle': '\ue61b',
+    'uicon-minus-circle-fill': '\ue652',
+    'uicon-plus-circle': '\ue62e',
+    'uicon-plus-circle-fill': '\ue661',
+    'uicon-file-text': '\ue663',
+    'uicon-file-text-fill': '\ue665',
+    'uicon-pushpin': '\ue7e3',
+    'uicon-pushpin-fill': '\ue86e',
+    'uicon-grid': '\ue673',
+    'uicon-grid-fill': '\ue678',
+    'uicon-play-circle': '\ue647',
+    'uicon-play-circle-fill': '\ue655',
+    'uicon-pause-circle-fill': '\ue654',
+    'uicon-pause': '\ue8fa',
+    'uicon-pause-circle': '\ue643',
+    'uicon-eye-off': '\ue648',
+    'uicon-eye-off-outline': '\ue62b',
+    'uicon-gift-fill': '\ue65c',
+    'uicon-gift': '\ue65b',
+    'uicon-rmb-circle-fill': '\ue657',
+    'uicon-rmb-circle': '\ue677',
+    'uicon-kefu-ermai': '\ue656',
+    'uicon-server-fill': '\ue751',
+    'uicon-coupon-fill': '\ue8c4',
+    'uicon-coupon': '\ue8ae',
+    'uicon-integral': '\ue704',
+    'uicon-integral-fill': '\ue703',
+    'uicon-home-fill': '\ue964',
+    'uicon-home': '\ue965',
+    'uicon-hourglass-half-fill': '\ue966',
+    'uicon-hourglass': '\ue967',
+    'uicon-account': '\ue628',
+    'uicon-plus-people-fill': '\ue626',
+    'uicon-minus-people-fill': '\ue615',
+    'uicon-account-fill': '\ue614',
+    'uicon-thumb-down-fill': '\ue726',
+    'uicon-thumb-down': '\ue727',
+    'uicon-thumb-up': '\ue733',
+    'uicon-thumb-up-fill': '\ue72f',
+    'uicon-lock-fill': '\ue979',
+    'uicon-lock-open': '\ue973',
+    'uicon-lock-opened-fill': '\ue974',
+    'uicon-lock': '\ue97a',
+    'uicon-red-packet-fill': '\ue690',
+    'uicon-photo-fill': '\ue98b',
+    'uicon-photo': '\ue98d',
+    'uicon-volume-off-fill': '\ue659',
+    'uicon-volume-off': '\ue644',
+    'uicon-volume-fill': '\ue670',
+    'uicon-volume': '\ue633',
+    'uicon-red-packet': '\ue691',
+    'uicon-download': '\ue63c',
+    'uicon-arrow-up-fill': '\ue6b0',
+    'uicon-arrow-down-fill': '\ue600',
+    'uicon-play-left-fill': '\ue675',
+    'uicon-play-right-fill': '\ue676',
+    'uicon-rewind-left-fill': '\ue679',
+    'uicon-rewind-right-fill': '\ue67a',
+    'uicon-arrow-downward': '\ue604',
+    'uicon-arrow-leftward': '\ue601',
+    'uicon-arrow-rightward': '\ue603',
+    'uicon-arrow-upward': '\ue607',
+    'uicon-arrow-down': '\ue60d',
+    'uicon-arrow-right': '\ue605',
+    'uicon-arrow-left': '\ue60e',
+    'uicon-arrow-up': '\ue606',
+    'uicon-skip-back-left': '\ue674',
+    'uicon-skip-forward-right': '\ue672',
+    'uicon-rewind-right': '\ue66f',
+    'uicon-rewind-left': '\ue671',
+    'uicon-arrow-right-double': '\ue68d',
+    'uicon-arrow-left-double': '\ue68c',
+    'uicon-wifi-off': '\ue668',
+    'uicon-wifi': '\ue667',
+    'uicon-empty-data': '\ue62f',
+    'uicon-empty-history': '\ue684',
+    'uicon-empty-list': '\ue68b',
+    'uicon-empty-page': '\ue627',
+    'uicon-empty-order': '\ue639',
+    'uicon-man': '\ue697',
+    'uicon-woman': '\ue69c',
+    'uicon-man-add': '\ue61c',
+    'uicon-man-add-fill': '\ue64c',
+    'uicon-man-delete': '\ue61a',
+    'uicon-man-delete-fill': '\ue66a',
+    'uicon-zh': '\ue70a',
+    'uicon-en': '\ue692'
+}
diff --git a/uni_modules/uview-plus/components/u-icon/props.js b/uni_modules/uview-plus/components/u-icon/props.js
new file mode 100644
index 0000000..09c63a3
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-icon/props.js
@@ -0,0 +1,90 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 图标类名
+        name: {
+            type: String,
+            default: () => defProps.icon.name
+        },
+        // 图标颜色,可接受主题色
+        color: {
+            type: String,
+            default: () => defProps.icon.color
+        },
+        // 字体大小,单位px
+        size: {
+            type: [String, Number],
+            default: () => defProps.icon.size
+        },
+        // 是否显示粗体
+        bold: {
+            type: Boolean,
+            default: () => defProps.icon.bold
+        },
+        // 点击图标的时候传递事件出去的index(用于区分点击了哪一个)
+        index: {
+            type: [String, Number],
+            default: () => defProps.icon.index
+        },
+        // 触摸图标时的类名
+        hoverClass: {
+            type: String,
+            default: () => defProps.icon.hoverClass
+        },
+        // 自定义扩展前缀,方便用户扩展自己的图标库
+        customPrefix: {
+            type: String,
+            default: () => defProps.icon.customPrefix
+        },
+        // 图标右边或者下面的文字
+        label: {
+            type: [String, Number],
+            default: () => defProps.icon.label
+        },
+        // label的位置,只能右边或者下边
+        labelPos: {
+            type: String,
+            default: () => defProps.icon.labelPos
+        },
+        // label的大小
+        labelSize: {
+            type: [String, Number],
+            default: () => defProps.icon.labelSize
+        },
+        // label的颜色
+        labelColor: {
+            type: String,
+            default: () => defProps.icon.labelColor
+        },
+        // label与图标的距离
+        space: {
+            type: [String, Number],
+            default: () => defProps.icon.space
+        },
+        // 图片的mode
+        imgMode: {
+            type: String,
+            default: () => defProps.icon.imgMode
+        },
+        // 用于显示图片小图标时,图片的宽度
+        width: {
+            type: [String, Number],
+            default: () => defProps.icon.width
+        },
+        // 用于显示图片小图标时,图片的高度
+        height: {
+            type: [String, Number],
+            default: () => defProps.icon.height
+        },
+        // 用于解决某些情况下,让图标垂直居中的用途
+        top: {
+            type: [String, Number],
+            default: () => defProps.icon.top
+        },
+        // 是否阻止事件传播
+        stop: {
+            type: Boolean,
+            default: () => defProps.icon.stop
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-icon/u-icon.vue b/uni_modules/uview-plus/components/u-icon/u-icon.vue
new file mode 100644
index 0000000..61fdc18
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-icon/u-icon.vue
@@ -0,0 +1,242 @@
+<template>
+	<view
+	    class="u-icon"
+	    @tap="clickHandler"
+	    :class="['u-icon--' + labelPos]"
+	>
+		<image
+		    class="u-icon__img"
+		    v-if="isImg"
+		    :src="name"
+		    :mode="imgMode"
+		    :style="[imgStyle, addStyle(customStyle)]"
+		></image>
+		<text
+		    v-else
+		    class="u-icon__icon"
+		    :class="uClasses"
+		    :style="[iconStyle, addStyle(customStyle)]"
+		    :hover-class="hoverClass"
+		>{{icon}}</text>
+		<!-- 这里进行空字符串判断,如果仅仅是v-if="label",可能会出现传递0的时候,结果也无法显示 -->
+		<text
+		    v-if="label !== ''" 
+		    class="u-icon__label"
+		    :style="{
+			color: labelColor,
+			fontSize: addUnit(labelSize),
+			marginLeft: labelPos == 'right' ? addUnit(space) : 0,
+			marginTop: labelPos == 'bottom' ? addUnit(space) : 0,
+			marginRight: labelPos == 'left' ? addUnit(space) : 0,
+			marginBottom: labelPos == 'top' ? addUnit(space) : 0,
+		}"
+		>{{ label }}</text>
+	</view>
+</template>
+
+<script>
+	// #ifdef APP-NVUE
+	// nvue通过weex的dom模块引入字体,相关文档地址如下:
+	// https://weex.apache.org/zh/docs/modules/dom.html#addrule
+	const fontUrl = 'https://at.alicdn.com/t/font_2225171_8kdcwk4po24.ttf'
+	const domModule = weex.requireModule('dom')
+	domModule.addRule('fontFace', {
+		'fontFamily': "uicon-iconfont",
+		'src': `url('${fontUrl}')`
+	})
+	// #endif
+
+	// 引入图标名称,已经对应的unicode
+	import icons from './icons'
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addUnit, addStyle } from '../../libs/function/index';
+	import config from '../../libs/config/config';
+	/**
+	 * icon 图标
+	 * @description 基于字体的图标集,包含了大多数常见场景的图标。
+	 * @tutorial https://ijry.github.io/uview-plus/components/icon.html
+	 * @property {String}			name			图标名称,见示例图标集
+	 * @property {String}			color			图标颜色,可接受主题色 (默认 color['u-content-color'] )
+	 * @property {String | Number}	size			图标字体大小,单位px (默认 '16px' )
+	 * @property {Boolean}			bold			是否显示粗体 (默认 false )
+	 * @property {String | Number}	index			点击图标的时候传递事件出去的index(用于区分点击了哪一个)
+	 * @property {String}			hoverClass		图标按下去的样式类,用法同uni的view组件的hoverClass参数,详情见官网
+	 * @property {String}			customPrefix	自定义扩展前缀,方便用户扩展自己的图标库 (默认 'uicon' )
+	 * @property {String | Number}	label			图标右侧的label文字
+	 * @property {String}			labelPos		label相对于图标的位置,只能right或bottom (默认 'right' )
+	 * @property {String | Number}	labelSize		label字体大小,单位px (默认 '15px' )
+	 * @property {String}			labelColor		图标右侧的label文字颜色 ( 默认 color['u-content-color'] )
+	 * @property {String | Number}	space			label与图标的距离,单位px (默认 '3px' )
+	 * @property {String}			imgMode			图片的mode
+	 * @property {String | Number}	width			显示图片小图标时的宽度
+	 * @property {String | Number}	height			显示图片小图标时的高度
+	 * @property {String | Number}	top				图标在垂直方向上的定位 用于解决某些情况下,让图标垂直居中的用途  (默认 0 )
+	 * @property {Boolean}			stop			是否阻止事件传播 (默认 false )
+	 * @property {Object}			customStyle		icon的样式,对象形式
+	 * @event {Function} click 点击图标时触发
+	 * @event {Function} touchstart 事件触摸时触发
+	 * @example <u-icon name="photo" color="#2979ff" size="28"></u-icon>
+	 */
+	export default {
+		name: 'u-icon',
+		data() {
+			return {
+
+			}
+		},
+		emits: ['click'],
+		mixins: [mpMixin, mixin, props],
+		computed: {
+			uClasses() {
+				let classes = []
+				classes.push(this.customPrefix + '-' + this.name)
+				// uView的自定义图标类名为u-iconfont
+				if (this.customPrefix == 'uicon') {
+					classes.push('u-iconfont')
+				} else {
+					// 不能缺少这一步,否则自定义图标会无效
+					classes.push(this.customPrefix)
+				}
+				// 主题色,通过类配置
+				if (this.color && config.type.includes(this.color)) classes.push('u-icon__icon--' + this.color)
+				// 阿里,头条,百度小程序通过数组绑定类名时,无法直接使用[a, b, c]的形式,否则无法识别
+				// 故需将其拆成一个字符串的形式,通过空格隔开各个类名
+				//#ifdef MP-ALIPAY || MP-TOUTIAO || MP-BAIDU
+				classes = classes.join(' ')
+				//#endif
+				return classes
+			},
+			iconStyle() {
+				let style = {}
+				style = {
+					fontSize: addUnit(this.size),
+					lineHeight: addUnit(this.size),
+					fontWeight: this.bold ? 'bold' : 'normal',
+					// 某些特殊情况需要设置一个到顶部的距离,才能更好的垂直居中
+					top: addUnit(this.top)
+				}
+				// 非主题色值时,才当作颜色值
+				if (this.color && !config.type.includes(this.color)) style.color = this.color
+
+				return style
+			},
+			// 判断传入的name属性,是否图片路径,只要带有"/"均认为是图片形式
+			isImg() {
+				return this.name.indexOf('/') !== -1
+			},
+			imgStyle() {
+				let style = {}
+				// 如果设置width和height属性,则优先使用,否则使用size属性
+				style.width = this.width ? addUnit(this.width) : addUnit(this.size)
+				style.height = this.height ? addUnit(this.height) : addUnit(this.size)
+				return style
+			},
+			// 通过图标名,查找对应的图标
+			icon() {
+				// 使用自定义图标的时候页面上会把name属性也展示出来,所以在这里处理一下
+				if (this.customPrefix !== "uicon") return "";
+				// 如果内置的图标中找不到对应的图标,就直接返回name值,因为用户可能传入的是unicode代码
+				return icons['uicon-' + this.name] || this.name
+			}
+		},
+		methods: {
+			addStyle,
+			addUnit,
+			clickHandler(e) {
+				this.$emit('click', this.index)
+				// 是否阻止事件冒泡
+				this.stop && this.preventEvent(e)
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	// 变量定义
+	$u-icon-primary: $u-primary !default;
+	$u-icon-success: $u-success !default;
+	$u-icon-info: $u-info !default;
+	$u-icon-warning: $u-warning !default;
+	$u-icon-error: $u-error !default;
+	$u-icon-label-line-height:1 !default;
+
+	/* #ifndef APP-NVUE */
+	// 非nvue下加载字体
+	@font-face {
+		font-family: 'uicon-iconfont';
+		src: url('https://at.alicdn.com/t/font_2225171_8kdcwk4po24.ttf') format('truetype');
+	}
+
+	/* #endif */
+
+	.u-icon {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		align-items: center;
+
+		&--left {
+			flex-direction: row-reverse;
+			align-items: center;
+		}
+
+		&--right {
+			flex-direction: row;
+			align-items: center;
+		}
+
+		&--top {
+			flex-direction: column-reverse;
+			justify-content: center;
+		}
+
+		&--bottom {
+			flex-direction: column;
+			justify-content: center;
+		}
+
+		&__icon {
+			font-family: uicon-iconfont;
+			position: relative;
+			@include flex;
+			align-items: center;
+
+			&--primary {
+				color: $u-icon-primary;
+			}
+
+			&--success {
+				color: $u-icon-success;
+			}
+
+			&--error {
+				color: $u-icon-error;
+			}
+
+			&--warning {
+				color: $u-icon-warning;
+			}
+
+			&--info {
+				color: $u-icon-info;
+			}
+		}
+
+		&__img {
+			/* #ifndef APP-NVUE */
+			height: auto;
+			will-change: transform;
+			/* #endif */
+		}
+
+		&__label {
+			/* #ifndef APP-NVUE */
+			line-height: $u-icon-label-line-height;
+			/* #endif */
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-image/props.js b/uni_modules/uview-plus/components/u-image/props.js
new file mode 100644
index 0000000..31a6f4e
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-image/props.js
@@ -0,0 +1,85 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 图片地址
+        src: {
+            type: String,
+            default: () => defProps.image.src
+        },
+        // 裁剪模式
+        mode: {
+            type: String,
+            default: () => defProps.image.mode
+        },
+        // 宽度,单位任意
+        width: {
+            type: [String, Number],
+            default: () => defProps.image.width
+        },
+        // 高度,单位任意
+        height: {
+            type: [String, Number],
+            default: () => defProps.image.height
+        },
+        // 图片形状,circle-圆形,square-方形
+        shape: {
+            type: String,
+            default: () => defProps.image.shape
+        },
+        // 圆角,单位任意
+        radius: {
+            type: [String, Number],
+            default: () => defProps.image.radius
+        },
+        // 是否懒加载,微信小程序、App、百度小程序、字节跳动小程序
+        lazyLoad: {
+            type: Boolean,
+            default: () => defProps.image.lazyLoad
+        },
+        // 开启长按图片显示识别微信小程序码菜单
+        showMenuByLongpress: {
+            type: Boolean,
+            default: () => defProps.image.showMenuByLongpress
+        },
+        // 加载中的图标,或者小图片
+        loadingIcon: {
+            type: String,
+            default: () => defProps.image.loadingIcon
+        },
+        // 加载失败的图标,或者小图片
+        errorIcon: {
+            type: String,
+            default: () => defProps.image.errorIcon
+        },
+        // 是否显示加载中的图标或者自定义的slot
+        showLoading: {
+            type: Boolean,
+            default: () => defProps.image.showLoading
+        },
+        // 是否显示加载错误的图标或者自定义的slot
+        showError: {
+            type: Boolean,
+            default: () => defProps.image.showError
+        },
+        // 是否需要淡入效果
+        fade: {
+            type: Boolean,
+            default: () => defProps.image.fade
+        },
+        // 只支持网络资源,只对微信小程序有效
+        webp: {
+            type: Boolean,
+            default: () => defProps.image.webp
+        },
+        // 过渡时间,单位ms
+        duration: {
+            type: [String, Number],
+            default: () => defProps.image.duration
+        },
+        // 背景颜色,用于深色页面加载图片时,为了和背景色融合
+        bgColor: {
+            type: String,
+            default: () => defProps.image.bgColor
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-image/u-image.vue b/uni_modules/uview-plus/components/u-image/u-image.vue
new file mode 100644
index 0000000..2c2f052
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-image/u-image.vue
@@ -0,0 +1,237 @@
+<template>
+	<u-transition
+		mode="fade"
+		:show="show"
+		:duration="fade ? 1000 : 0"
+	>
+		<view
+			class="u-image"
+			@tap="onClick"
+			:style="[wrapStyle, backgroundStyle]"
+		>
+			<image
+				v-if="!isError"
+				:src="src"
+				:mode="mode"
+				@error="onErrorHandler"
+				@load="onLoadHandler"
+				:show-menu-by-longpress="showMenuByLongpress"
+				:lazy-load="lazyLoad"
+				class="u-image__image"
+				:style="{
+					borderRadius: shape == 'circle' ? '10000px' : addUnit(radius),
+					width: addUnit(width),
+					height: addUnit(height)
+				}"
+			></image>
+			<view
+				v-if="showLoading && loading"
+				class="u-image__loading"
+				:style="{
+					borderRadius: shape == 'circle' ? '50%' : addUnit(radius),
+					backgroundColor: this.bgColor,
+					width: addUnit(width),
+					height: addUnit(height)
+				}"
+			>
+				<slot name="loading">
+					<u-icon
+						:name="loadingIcon"
+						:width="width"
+						:height="height"
+					></u-icon>
+				</slot>
+			</view>
+			<view
+				v-if="showError && isError && !loading"
+				class="u-image__error"
+				:style="{
+					borderRadius: shape == 'circle' ? '50%' : addUnit(radius),
+					width: addUnit(width),
+					height: addUnit(height)
+				}"
+			>
+				<slot name="error">
+					<u-icon
+						:name="errorIcon"
+						:width="width"
+						:height="height"
+					></u-icon>
+				</slot>
+			</view>
+		</view>
+	</u-transition>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addUnit, addStyle, deepMerge } from '../../libs/function/index';
+	/**
+	 * Image 图片
+	 * @description 此组件为uni-app的image组件的加强版,在继承了原有功能外,还支持淡入动画、加载中、加载失败提示、圆角值和形状等。
+	 * @tutorial https://uview-plus.jiangruyi.com/components/image.html
+	 * @property {String}			src 				图片地址
+	 * @property {String}			mode 				裁剪模式,见官网说明 (默认 'aspectFill' )
+	 * @property {String | Number}	width 				宽度,单位任意,如果为数值,则为px单位 (默认 '300' )
+	 * @property {String | Number}	height 				高度,单位任意,如果为数值,则为px单位 (默认 '225' )
+	 * @property {String}			shape 				图片形状,circle-圆形,square-方形 (默认 'square' )
+	 * @property {String | Number}	radius		 		圆角值,单位任意,如果为数值,则为px单位 (默认 0 )
+	 * @property {Boolean}			lazyLoad			是否懒加载,仅微信小程序、App、百度小程序、字节跳动小程序有效 (默认 true )
+	 * @property {Boolean}			showMenuByLongpress	是否开启长按图片显示识别小程序码菜单,仅微信小程序有效 (默认 true )
+	 * @property {String}			loadingIcon 		加载中的图标,或者小图片 (默认 'photo' )
+	 * @property {String}			errorIcon 			加载失败的图标,或者小图片 (默认 'error-circle' )
+	 * @property {Boolean}			showLoading 		是否显示加载中的图标或者自定义的slot (默认 true )
+	 * @property {Boolean}			showError 			是否显示加载错误的图标或者自定义的slot (默认 true )
+	 * @property {Boolean}			fade 				是否需要淡入效果 (默认 true )
+	 * @property {Boolean}			webp 				只支持网络资源,只对微信小程序有效 (默认 false )
+	 * @property {String | Number}	duration 			搭配fade参数的过渡时间,单位ms (默认 500 )
+	 * @property {String}			bgColor 			背景颜色,用于深色页面加载图片时,为了和背景色融合  (默认 '#f3f4f6' )
+	 * @property {Object}			customStyle  		定义需要用到的外部样式
+	 * @event {Function}	click	点击图片时触发
+	 * @event {Function}	error	图片加载失败时触发
+	 * @event {Function} load 图片加载成功时触发
+	 * @example <u-image width="100%" height="300px" :src="src"></u-image>
+	 */
+	export default {
+		name: 'u-image',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				// 图片是否加载错误,如果是,则显示错误占位图
+				isError: false,
+				// 初始化组件时,默认为加载中状态
+				loading: true,
+				// 不透明度,为了实现淡入淡出的效果
+				opacity: 1,
+				// 过渡时间,因为props的值无法修改,故需要一个中间值
+				durationTime: this.duration,
+				// 图片加载完成时,去掉背景颜色,因为如果是png图片,就会显示灰色的背景
+				backgroundStyle: {},
+				// 用于fade模式的控制组件显示与否
+				show: false
+			};
+		},
+		watch: {
+			src: {
+				immediate: true,
+				handler(n) {
+					if (!n) {
+						// 如果传入null或者'',或者false,或者undefined,标记为错误状态
+						this.isError = true
+						
+					} else {
+						this.isError = false;
+						this.loading = true;
+					}
+				}
+			}
+		},
+		computed: {
+			wrapStyle() {
+				let style = {};
+				// 通过调用addUnit()方法,如果有单位,如百分比,px单位等,直接返回,如果是纯粹的数值,则加上rpx单位
+				style.width = addUnit(this.width);
+				style.height = addUnit(this.height);
+				// 如果是显示圆形,设置一个很多的半径值即可
+				style.borderRadius = this.shape == 'circle' ? '10000px' : addUnit(this.radius)
+				// 如果设置圆角,必须要有hidden,否则可能圆角无效
+				style.overflow = this.radius > 0 ? 'hidden' : 'visible'
+				// if (this.fade) {
+				// 	style.opacity = this.opacity
+				// 	// nvue下,这几个属性必须要分开写
+				// 	style.transitionDuration = `${this.durationTime}ms`
+				// 	style.transitionTimingFunction = 'ease-in-out'
+				// 	style.transitionProperty = 'opacity'
+				// }
+				return deepMerge(style, addStyle(this.customStyle));
+
+			}
+		},
+		mounted() {
+			this.show = true
+		},
+		emits: ['click', 'error', 'load'],
+		methods: {
+			addUnit,
+			// 点击图片
+			onClick() {
+				this.$emit('click')
+			},
+			// 图片加载失败
+			onErrorHandler(err) {
+				this.loading = false
+				this.isError = true
+				this.$emit('error', err)
+			},
+			// 图片加载完成,标记loading结束
+			onLoadHandler(event) {
+				this.loading = false
+				this.isError = false
+				this.$emit('load', event)
+				this.removeBgColor()
+				// 如果不需要动画效果,就不执行下方代码,同时移除加载时的背景颜色
+				// 否则无需fade效果时,png图片依然能看到下方的背景色
+				// if (!this.fade) return this.removeBgColor();
+				// // 原来opacity为1(不透明,是为了显示占位图),改成0(透明,意味着该元素显示的是背景颜色,默认的灰色),再改成1,是为了获得过渡效果
+				// this.opacity = 0;
+				// // 这里设置为0,是为了图片展示到背景全透明这个过程时间为0,延时之后延时之后重新设置为duration,是为了获得背景透明(灰色)
+				// // 到图片展示的过程中的淡入效果
+				// this.durationTime = 0;
+				// // 延时50ms,否则在浏览器H5,过渡效果无效
+				// setTimeout(() => {
+				// 	this.durationTime = this.duration;
+				// 	this.opacity = 1;
+				// 	setTimeout(() => {
+				// 		this.removeBgColor();
+				// 	}, this.durationTime);
+				// }, 50);
+			},
+			// 移除图片的背景色
+			removeBgColor() {
+				// 淡入动画过渡完成后,将背景设置为透明色,否则png图片会看到灰色的背景
+				this.backgroundStyle = {
+					backgroundColor: 'transparent'
+				};
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import '../../libs/css/components.scss';
+
+	$u-image-error-top:0px !default;
+	$u-image-error-left:0px !default;
+	$u-image-error-width:100% !default;
+	$u-image-error-hight:100% !default;
+	$u-image-error-background-color:$u-bg-color !default;
+	$u-image-error-color:$u-tips-color !default;
+	$u-image-error-font-size: 46rpx !default;
+
+	.u-image {
+		position: relative;
+		transition: opacity 0.5s ease-in-out;
+
+		&__image {
+			width: 100%;
+			height: 100%;
+		}
+
+		&__loading,
+		&__error {
+			position: absolute;
+			top: $u-image-error-top;
+			left: $u-image-error-left;
+			width: $u-image-error-width;
+			height: $u-image-error-hight;
+			@include flex;
+			align-items: center;
+			justify-content: center;
+			background-color: $u-image-error-background-color;
+			color: $u-image-error-color;
+			font-size: $u-image-error-font-size;
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-index-anchor/props.js b/uni_modules/uview-plus/components/u-index-anchor/props.js
new file mode 100644
index 0000000..bbcd8d7
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-index-anchor/props.js
@@ -0,0 +1,30 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 列表锚点文本内容
+        text: {
+            type: [String, Number],
+            default: () => defProps.indexAnchor.text
+        },
+        // 列表锚点文字颜色
+        color: {
+            type: String,
+            default: () => defProps.indexAnchor.color
+        },
+        // 列表锚点文字大小,单位默认px
+        size: {
+            type: [String, Number],
+            default: () => defProps.indexAnchor.size
+        },
+        // 列表锚点背景颜色
+        bgColor: {
+            type: String,
+            default: () => defProps.indexAnchor.bgColor
+        },
+        // 列表锚点高度,单位默认px
+        height: {
+            type: [String, Number],
+            default: () => defProps.indexAnchor.height
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-index-anchor/u-index-anchor.vue b/uni_modules/uview-plus/components/u-index-anchor/u-index-anchor.vue
new file mode 100644
index 0000000..b56d634
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-index-anchor/u-index-anchor.vue
@@ -0,0 +1,95 @@
+<template>
+	<!-- #ifdef APP-NVUE -->
+	<header>
+	<!-- #endif -->
+	<view
+	    class="u-index-anchor u-border-bottom"
+		:ref="`u-index-anchor-${text}`"
+	    :style="{
+			height: addUnit(height),
+			backgroundColor: bgColor
+		}"
+	>
+		<text
+		    class="u-index-anchor__text"
+		    :style="{
+				fontSize: addUnit(size),
+				color: color
+			}"
+		>{{ text }}</text>
+	</view>
+	<!-- #ifdef APP-NVUE -->
+	</header>
+	<!-- #endif -->
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addUnit, $parent, error } from '../../libs/function/index';
+	// #ifdef APP-NVUE
+	const dom = uni.requireNativePlugin('dom')
+	// #endif
+	/**
+	 * IndexAnchor 列表锚点
+	 * @description 
+	 * @tutorial https://uview-plus.jiangruyi.com/components/indexList.html
+	 * @property {String | Number}	text	列表锚点文本内容
+	 * @property {String}			color	列表锚点文字颜色 ( 默认 '#606266' )
+	 * @property {String | Number}	size	列表锚点文字大小,单位默认px ( 默认 14 )
+	 * @property {String}			bgColor	列表锚点背景颜色 ( 默认 '#dedede' )
+	 * @property {String | Number}	height	列表锚点高度,单位默认px ( 默认 32 )
+	 * @example <u-index-anchor :text="indexList[index]"></u-index-anchor>
+	 */
+	export default {
+		name: 'u-index-anchor',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+			}
+		},
+		mounted() {
+			this.init()
+		},
+		methods: {
+			addUnit,
+			init() {
+				// 此处会活动父组件实例,并赋值给实例的parent属性
+				const indexList = $parent.call(this, 'u-index-list')
+				if (!indexList) { 
+					return error('u-index-anchor必须要搭配u-index-list组件使用')
+				}
+				// 将当前实例放入到u-index-list中
+				indexList.anchors.push(this)
+				const indexListItem = $parent.call(this, 'u-index-item')
+				// #ifndef APP-NVUE
+				// 只有在非nvue下,u-index-anchor才是嵌套在u-index-item中的
+				if (!indexListItem) {
+					return error('u-index-anchor必须要搭配u-index-item组件使用')
+				}
+				// 设置u-index-item的id为anchor的text标识符,因为非nvue下滚动列表需要依赖scroll-view滚动到元素的特性
+				indexListItem.id = this.text.charCodeAt(0)
+				// #endif
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-index-anchor {
+		position: sticky;
+		top: 0;
+		@include flex;
+		align-items: center;
+		padding-left: 15px;
+		z-index: 1;
+
+		&__text {
+			@include flex;
+			align-items: center;
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-index-item/props.js b/uni_modules/uview-plus/components/u-index-item/props.js
new file mode 100644
index 0000000..662c38e
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-index-item/props.js
@@ -0,0 +1,6 @@
+// import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-index-item/u-index-item.vue b/uni_modules/uview-plus/components/u-index-item/u-index-item.vue
new file mode 100644
index 0000000..fe2f750
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-index-item/u-index-item.vue
@@ -0,0 +1,90 @@
+<template>
+	<!-- #ifdef APP-NVUE -->
+	<cell ref="u-index-item">
+		<!-- #endif -->
+		<view
+			class="u-index-item"
+			:id="`u-index-item-${id}`"
+			:class="[`u-index-item-${id}`]"
+		>
+			<slot />
+		</view>
+		<!-- #ifdef APP-NVUE -->
+	</cell>
+	<!-- #endif -->
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { sleep, error } from '../../libs/function/index';
+	// #ifdef APP-NVUE
+	// 由于weex为阿里的KPI业绩考核的产物,所以不支持百分比单位,这里需要通过dom查询组件的宽度
+	const dom = uni.requireNativePlugin('dom')
+	// #endif
+	/**
+	 * IndexItem 
+	 * @description 
+	 * @tutorial https://uview-plus.jiangruyi.com/components/indexList.html
+	 * @property {String}
+	 * @event {Function}
+	 * @example
+	 */
+	export default {
+		name: 'u-index-item',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				// 本组件到滚动条顶部的距离
+				top: 0,
+				height: 0,
+				id: ''
+			}
+		},
+		created() {
+			// 子组件u-index-anchor的实例
+			this.anchor = {}
+		},
+		mounted() {
+			this.init()
+		},
+		methods: {
+			init() {
+				// 此处会活动父组件实例,并赋值给实例的parent属性
+				this.getParentData('u-index-list')
+				if (!this.parent) {
+					return error('u-index-item必须要搭配u-index-list组件使用')
+				}
+				sleep().then(() =>{
+					this.getIndexItemRect().then(size => {
+						// 由于对象的引用特性,此处会同时生效到父组件的children数组的本实例的top属性中,供父组件判断读取
+						this.top = Math.ceil(size.top)
+						this.height = Math.ceil(size.height)
+					})
+				})
+			},
+			getIndexItemRect() {
+				return new Promise(resolve => {
+					// #ifndef APP-NVUE
+					this.$uGetRect('.u-index-item').then(size => {
+						resolve(size)
+					})
+					// #endif
+
+					// #ifdef APP-NVUE
+					const ref = this.$refs['u-index-item']
+					dom.getComponentRect(ref, res => {
+						resolve(res.size)
+					})
+					// #endif
+				}) 
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+	
+</style>
diff --git a/uni_modules/uview-plus/components/u-index-list/props.js b/uni_modules/uview-plus/components/u-index-list/props.js
new file mode 100644
index 0000000..2dfb24a
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-index-list/props.js
@@ -0,0 +1,30 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 右边锚点非激活的颜色
+        inactiveColor: {
+            type: String,
+            default: () => defProps.indexList.inactiveColor
+        },
+        // 右边锚点激活的颜色
+        activeColor: {
+            type: String,
+            default: () => defProps.indexList.activeColor
+        },
+        // 索引字符列表,数组形式
+        indexList: {
+            type: Array,
+            default: () => defProps.indexList.indexList
+        },
+        // 是否开启锚点自动吸顶
+        sticky: {
+            type: Boolean,
+            default: () => defProps.indexList.sticky
+        },
+        // 自定义导航栏的高度
+        customNavHeight: {
+            type: [String, Number],
+            default: () => defProps.indexList.customNavHeight
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-index-list/u-index-list.vue b/uni_modules/uview-plus/components/u-index-list/u-index-list.vue
new file mode 100644
index 0000000..63f6944
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-index-list/u-index-list.vue
@@ -0,0 +1,446 @@
+<template>
+	<view class="u-index-list">
+		<!-- #ifdef APP-NVUE -->
+		<list
+			:scrollTop="scrollTop"
+			enable-back-to-top
+			:offset-accuracy="1"
+			:style="{
+				maxHeight: addUnit(scrollViewHeight)
+			}"
+			@scroll="scrollHandler"
+			ref="uList"
+		>
+			<cell
+				v-if="$slots.header"
+				ref="header"
+			>
+				<slot name="header" />
+			</cell>
+			<slot />
+			<cell v-if="$slots.footer">
+				<slot name="footer" />
+			</cell>
+		</list>
+		<!-- #endif -->
+		<!-- #ifndef APP-NVUE -->
+		<scroll-view
+			:scrollTop="scrollTop"
+			:scrollIntoView="scrollIntoView"
+			:offset-accuracy="1"
+			:style="{
+				maxHeight: addUnit(scrollViewHeight)
+			}"
+			scroll-y
+			@scroll="scrollHandler"
+			ref="uList"
+		>
+			<view v-if="$slots.header">
+				<slot name="header" />
+			</view>
+			<slot />
+			<view v-if="$slots.footer">
+				<slot name="footer" />
+			</view>
+		</scroll-view>
+		<!-- #endif -->
+		<view
+			class="u-index-list__letter"
+			ref="u-index-list__letter"
+			:style="{ top: addUnit(letterInfo.top || 100) }"
+			@touchstart.prevent="touchStart"
+			@touchmove.prevent="touchMove"
+			@touchend.prevent="touchEnd"
+			@touchcancel.prevent="touchEnd"
+		>
+			<view
+				class="u-index-list__letter__item"
+				v-for="(item, index) in uIndexList"
+				:key="index"
+				:style="{
+					backgroundColor: activeIndex === index ? activeColor : 'transparent'
+				}"
+			>
+				<text
+					class="u-index-list__letter__item__index"
+					:style="{color: activeIndex === index ? '#fff' : inactiveColor}"
+				>{{ item }}</text>
+			</view>
+		</view>
+		<u-transition
+			mode="fade"
+			:show="touching"
+			:customStyle="{
+				position: 'fixed',
+				right: '50px',
+				top: addUnit(indicatorTop),
+				zIndex: 2
+			}"
+		>
+			<view
+				class="u-index-list__indicator"
+				:class="['u-index-list__indicator--show']"
+				:style="{
+					height: addUnit(indicatorHeight),
+					width: addUnit(indicatorHeight)
+				}"
+			>
+				<text class="u-index-list__indicator__text">{{ uIndexList[activeIndex] }}</text>
+			</view>
+		</u-transition>
+	</view>
+</template>
+
+<script>
+	const indexList = () => {
+		const indexList = [];
+		const charCodeOfA = 'A'.charCodeAt(0);
+		for (let i = 0; i < 26; i++) {
+			indexList.push(String.fromCharCode(charCodeOfA + i));
+		}
+		return indexList;
+	}
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addUnit, sys, sleep, getPx } from '../../libs/function/index';
+	// #ifdef APP-NVUE
+	// 由于weex为阿里的KPI业绩考核的产物,所以不支持百分比单位,这里需要通过dom查询组件的宽度
+	const dom = uni.requireNativePlugin('dom')
+	// #endif
+	/**
+	 * IndexList 索引列表
+	 * @description  通过折叠面板收纳内容区域
+	 * @tutorial https://uview-plus.jiangruyi.com/components/indexList.html
+	 * @property {String}			inactiveColor	右边锚点非激活的颜色 ( 默认 '#606266' )
+	 * @property {String}			activeColor		右边锚点激活的颜色 ( 默认 '#5677fc' )
+	 * @property {Array}			indexList		索引字符列表,数组形式
+	 * @property {Boolean}			sticky			是否开启锚点自动吸顶 ( 默认 true )
+	 * @property {String | Number}	customNavHeight	自定义导航栏的高度 ( 默认 0 )
+	 * */ 
+	export default {
+		name: 'u-index-list',
+		mixins: [mpMixin, mixin, props],
+		// #ifdef MP-WEIXIN
+		// 将自定义节点设置成虚拟的,更加接近Vue组件的表现,能更好的使用flex属性
+		options: {
+			virtualHost: true
+		},
+		// #endif
+		data() {
+			return {
+				// 当前正在被选中的字母索引
+				activeIndex: -1,
+				touchmoveIndex: 1,
+				// 索引字母的信息
+				letterInfo: {
+					height: 0,
+					itemHeight: 0,
+					top: 0
+				},
+				// 设置字母指示器的高度,后面为了让指示器跟随字母,并将尖角部分指向字母的中部,需要依赖此值
+				indicatorHeight: 50,
+				// 字母放大指示器的top值,为了让其指向当前激活的字母
+				// indicatorTop: 0
+				// 当前是否正在被触摸状态
+				touching: false,
+				// 滚动条顶部top值
+				scrollTop: 0,
+				// scroll-view的高度
+				scrollViewHeight: 0,
+				// 系统信息
+				sys: sys(),
+				scrolling: false,
+				scrollIntoView: '',
+			}
+		},
+		computed: {
+			// 如果有传入外部的indexList锚点数组则使用,否则使用内部生成A-Z字母
+			uIndexList() {
+				return this.indexList.length ? this.indexList : indexList()
+			},
+			// 字母放大指示器的top值,为了让其指向当前激活的字母
+			indicatorTop() {
+				const {
+					top,
+					itemHeight
+				} = this.letterInfo
+				return Math.floor(top + itemHeight * this.activeIndex + itemHeight / 2 - this.indicatorHeight / 2)
+			}
+		},
+		watch: {
+			// 监听字母索引的变化,重新设置尺寸
+			uIndexList: {
+				immediate: true,
+				handler() {
+					sleep().then(() => {
+						this.setIndexListLetterInfo()
+					})
+				}
+			}
+		},
+		created() {
+			this.children = []
+			this.anchors = []
+			this.init()
+		},
+		mounted() {
+			this.setIndexListLetterInfo()
+		},
+		methods: {
+			addUnit,
+			init() {
+				// 设置列表的高度为整个屏幕的高度
+				//减去this.customNavHeight,并将this.scrollViewHeight设置为maxHeight
+				//解决当u-index-list组件放在tabbar页面时,scroll-view内容较少时,还能滚动
+				let customNavHeight = getPx(this.customNavHeight)
+				this.scrollViewHeight = this.sys.windowHeight - customNavHeight
+			},
+			// 索引列表被触摸
+			touchStart(e) {
+				// 获取触摸点信息
+				const touchStart = e.changedTouches[0]
+				if (!touchStart) return
+				this.touching = true
+				const {
+					pageY
+				} = touchStart
+				// 根据当前触摸点的坐标,获取当前触摸的为第几个字母
+				const currentIndex = this.getIndexListLetter(pageY)
+				this.setValueForTouch(currentIndex)
+			},
+			// 索引字母列表被触摸滑动中
+			touchMove(e) {
+				// 获取触摸点信息
+				let touchMove = e.changedTouches[0]
+				if (!touchMove) return;
+
+				// 滑动结束后迅速开始第二次滑动时候 touching 为 false 造成不显示 indicator 问题
+				if (!this.touching) {
+					this.touching = true
+				}
+				const {
+					pageY
+				} = touchMove
+				const currentIndex = this.getIndexListLetter(pageY)
+				this.setValueForTouch(currentIndex)
+			},
+			// 触摸结束
+			touchEnd(e) {
+				// 延时一定时间后再隐藏指示器,为了让用户看的更直观,同时也是为了消除快速切换u-transition的show带来的影响
+				sleep(300).then(() => {
+					this.touching = false
+				})
+			},
+			// 获取索引列表的尺寸以及单个字符的尺寸信息
+			getIndexListLetterRect() {
+				return new Promise(resolve => {
+					// 延时一定时间,以获取dom尺寸
+					// #ifndef APP-NVUE
+					this.$uGetRect('.u-index-list__letter').then(size => {
+						resolve(size)
+					})
+					// #endif
+
+					// #ifdef APP-NVUE
+					const ref = this.$refs['u-index-list__letter']
+					dom.getComponentRect(ref, res => {
+						resolve(res.size)
+					})
+					// #endif
+				})
+			},
+			// 设置indexList索引的尺寸信息
+			setIndexListLetterInfo() {
+				this.getIndexListLetterRect().then(size => {
+					const {
+						height
+					} = size
+					const sysData = sys()
+					const windowHeight = sysData.windowHeight
+					let customNavHeight = 0
+					// 消除各端导航栏非原生和原生导致的差异,让索引列表字母对屏幕垂直居中
+					if (this.customNavHeight == 0) {
+						// #ifdef H5
+						customNavHeight = sysData.windowTop
+						// #endif
+						// #ifndef H5
+						// 在非H5中,为原生导航栏,其高度不算在windowHeight内,这里设置为负值,后面相加时变成减去其高度的一半
+						customNavHeight = -(sysData.statusBarHeight + 44)
+						// #endif
+					} else {
+						customNavHeight = getPx(this.customNavHeight)
+					}
+					this.letterInfo = {
+						height,
+						// 为了让字母列表对屏幕绝对居中,让其对导航栏进行修正,也即往上偏移导航栏的一半高度
+						top: (windowHeight - height) / 2 + customNavHeight / 2,
+						itemHeight: Math.floor(height / this.uIndexList.length)
+					}
+				})
+			},
+			// 获取当前被触摸的索引字母
+			getIndexListLetter(pageY) {
+				const {
+					top,
+					height,
+					itemHeight
+				} = this.letterInfo
+				// 对H5的pageY进行修正,这是由于uni-app自作多情在H5中将触摸点的坐标跟H5的导航栏结合导致的问题
+				// #ifdef H5
+				pageY += sys().windowTop
+				// #endif
+				// 对第一和最后一个字母做边界处理,因为用户可能在字母列表上触摸到两端的尽头后依然继续滑动
+				if (pageY < top) {
+					return 0
+				} else if (pageY >= top + height) {
+					// 如果超出了,取最后一个字母
+					return this.uIndexList.length - 1
+				} else {
+					// 将触摸点的Y轴偏移值,减去索引字母的top值,除以每个字母的高度,即可得到当前触摸点落在哪个字母上
+					return Math.floor((pageY - top) / itemHeight);
+				}
+			},
+			// 设置各项由触摸而导致变化的值
+			setValueForTouch(currentIndex) {
+				// 如果偏移量太小,前后得出的会是同一个索引字母,为了防抖,进行返回
+				if (currentIndex === this.activeIndex) return
+				this.activeIndex = currentIndex
+				// #ifndef APP-NVUE || MP-WEIXIN
+				// 在非nvue中,由于anchor和item都在u-index-item中,所以需要对index-item进行偏移
+				this.scrollIntoView = `u-index-item-${this.uIndexList[currentIndex].charCodeAt(0)}`
+				// #endif
+				// #ifdef MP-WEIXIN
+				// 微信小程序下,scroll-view的scroll-into-view属性无法对slot中的内容的id生效,只能通过设置scrollTop的形式去移动滚动条
+				const customNavHeight = this.customNavHeight
+				this.scrollTop = this.children[currentIndex].top - getPx(customNavHeight)
+				// #endif
+				// #ifdef APP-NVUE
+				// 在nvue中,由于cell和header为同级元素,所以实际是需要对header(anchor)进行偏移
+				const anchor = `u-index-anchor-${this.uIndexList[currentIndex]}`
+				dom.scrollToElement(this.anchors[currentIndex].$refs[anchor], {
+					offset: 0,
+					animated: false
+				})
+				// #endif
+			},
+			getHeaderRect() {
+				// 获取header slot的高度,因为list组件中获取元素的尺寸是没有top值的
+				return new Promise(resolve => {
+					dom.getComponentRect(this.$refs.header, res => {
+						resolve(res.size)
+					})
+				})
+			},
+			// scroll-view的滚动事件
+			async scrollHandler(e) {
+				if (this.touching || this.scrolling) return
+				// 每过一定时间取样一次,减少资源损耗以及可能带来的卡顿
+				this.scrolling = true
+				sleep(10).then(() => {
+					this.scrolling = false
+				})
+				let scrollTop = 0
+				const len = this.children.length
+				let children = this.children
+				const anchors = this.anchors
+				// #ifdef APP-NVUE
+				// nvue下获取的滚动条偏移为负数,需要转为正数
+				scrollTop = Math.abs(e.contentOffset.y)
+				// 获取header slot的尺寸信息
+				const header = await this.getHeaderRect()
+				// item的top值,在nvue下,模拟出的anchor的top,类似非nvue下的index-item的top
+				let top = header.height
+				// 由于list组件无法获取cell的top值,这里通过header slot和各个item之间的height,模拟出类似非nvue下的位置信息
+				children = this.children.map((item, index) => {
+					const child = {
+						height: item.height,
+						top
+					}
+					// 进行累加,给下一个item提供计算依据
+					top += item.height + anchors[index].height
+					return child
+				})
+				// #endif
+				// #ifndef APP-NVUE
+				// 非nvue通过detail获取滚动条位移
+				scrollTop = e.detail.scrollTop
+				// #endif
+				for (let i = 0; i < len; i++) {
+					const item = children[i],
+						nextItem = children[i + 1]
+					// 如果滚动条高度小于第一个item的top值,此时无需设置任意字母为高亮
+					if (scrollTop <= children[0].top || scrollTop >= children[len - 1].top + children[len -
+							1].height) {
+						this.activeIndex = -1
+						break
+					} else if (!nextItem) { 
+						// 当不存在下一个item时,意味着历遍到了最后一个
+						this.activeIndex = len - 1
+						break
+					} else if (scrollTop > item.top && scrollTop < nextItem.top) {
+						this.activeIndex = i
+						break
+					}
+				}
+			},
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-index-list {
+
+		&__letter {
+			position: fixed;
+			right: 0;
+			text-align: center;
+			z-index: 3;
+			padding: 0 6px;
+
+			&__item {
+				width: 16px;
+				height: 16px;
+				border-radius: 100px;
+				margin: 1px 0;
+				@include flex;
+				align-items: center;
+				justify-content: center;
+
+				&--active {
+					background-color: $u-primary;
+				}
+
+				&__index {
+					font-size: 12px;
+					text-align: center;
+					line-height: 12px;
+				}
+			}
+		}
+
+		&__indicator {
+			width: 50px;
+			height: 50px;
+			border-radius: 100px 100px 0 100px;
+			text-align: center;
+			color: #ffffff;
+			background-color: #c9c9c9;
+			transform: rotate(-45deg);
+			@include flex;
+			justify-content: center;
+			align-items: center;
+
+			&__text {
+				font-size: 28px;
+				line-height: 28px;
+				font-weight: bold;
+				color: #fff;
+				transform: rotate(45deg);
+				text-align: center;
+			}
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-input/props.js b/uni_modules/uview-plus/components/u-input/props.js
new file mode 100644
index 0000000..0303f0f
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-input/props.js
@@ -0,0 +1,196 @@
+import defProps from '../../libs/config/props.js';
+export default {
+	props: {
+		// #ifdef VUE3
+		// 绑定的值
+		modelValue: {
+			type: [String, Number],
+			default: () => defProps.input.value
+		},
+		// #endif
+		// #ifdef VUE2
+		// 绑定的值
+		value: {
+			type: [String, Number],
+			default: () => defProps.input.value
+		},
+		// #endif
+		// number-数字输入键盘,app-vue下可以输入浮点数,app-nvue和小程序平台下只能输入整数
+		// idcard-身份证输入键盘,微信、支付宝、百度、QQ小程序
+		// digit-带小数点的数字键盘,App的nvue页面、微信、支付宝、百度、头条、QQ小程序
+		// text-文本输入键盘
+		type: {
+			type: String,
+			default: () => defProps.input.type
+		},
+		// 如果 textarea 是在一个 position:fixed 的区域,需要显示指定属性 fixed 为 true,
+		// 兼容性:微信小程序、百度小程序、字节跳动小程序、QQ小程序
+		fixed: {
+			type: Boolean,
+			default: () => defProps.input.fixed
+		},
+		// 是否禁用输入框
+		disabled: {
+			type: Boolean,
+			default: () => defProps.input.disabled
+		},
+		// 禁用状态时的背景色
+		disabledColor: {
+			type: String,
+			default: () => defProps.input.disabledColor
+		},
+		// 是否显示清除控件
+		clearable: {
+			type: Boolean,
+			default: () => defProps.input.clearable
+		},
+		// 是否密码类型
+		password: {
+			type: Boolean,
+			default: () => defProps.input.password
+		},
+		// 最大输入长度,设置为 -1 的时候不限制最大长度
+		maxlength: {
+			type: [String, Number],
+			default: () => defProps.input.maxlength
+		},
+		// 	输入框为空时的占位符
+		placeholder: {
+			type: String,
+			default: () => defProps.input.placeholder
+		},
+		// 指定placeholder的样式类,注意页面或组件的style中写了scoped时,需要在类名前写/deep/
+		placeholderClass: {
+			type: String,
+			default: () => defProps.input.placeholderClass
+		},
+		// 指定placeholder的样式
+		placeholderStyle: {
+			type: [String, Object],
+			default: () => defProps.input.placeholderStyle
+		},
+		// 是否显示输入字数统计,只在 type ="text"或type ="textarea"时有效
+		showWordLimit: {
+			type: Boolean,
+			default: () => defProps.input.showWordLimit
+		},
+		// 设置右下角按钮的文字,有效值:send|search|next|go|done,兼容性详见uni-app文档
+		// https://uniapp.dcloud.io/component/input
+		// https://uniapp.dcloud.io/component/textarea
+		confirmType: {
+			type: String,
+			default: () => defProps.input.confirmType
+		},
+		// 点击键盘右下角按钮时是否保持键盘不收起,H5无效
+		confirmHold: {
+			type: Boolean,
+			default: () => defProps.input.confirmHold
+		},
+		// focus时,点击页面的时候不收起键盘,微信小程序有效
+		holdKeyboard: {
+			type: Boolean,
+			default: () => defProps.input.holdKeyboard
+		},
+		// 自动获取焦点
+		// 在 H5 平台能否聚焦以及软键盘是否跟随弹出,取决于当前浏览器本身的实现。nvue 页面不支持,需使用组件的 focus()、blur() 方法控制焦点
+		focus: {
+			type: Boolean,
+			default: () => defProps.input.focus
+		},
+		// 键盘收起时,是否自动失去焦点,目前仅App3.0.0+有效
+		autoBlur: {
+			type: Boolean,
+			default: () => defProps.input.autoBlur
+		},
+		// 是否去掉 iOS 下的默认内边距,仅微信小程序,且type=textarea时有效
+		disableDefaultPadding: {
+			type: Boolean,
+			default: () => defProps.input.disableDefaultPadding
+		},
+		// 指定focus时光标的位置
+		cursor: {
+			type: [String, Number],
+			default: () => defProps.input.cursor
+		},
+		// 输入框聚焦时底部与键盘的距离
+		cursorSpacing: {
+			type: [String, Number],
+			default: () => defProps.input.cursorSpacing
+		},
+		// 光标起始位置,自动聚集时有效,需与selection-end搭配使用
+		selectionStart: {
+			type: [String, Number],
+			default: () => defProps.input.selectionStart
+		},
+		// 光标结束位置,自动聚集时有效,需与selection-start搭配使用
+		selectionEnd: {
+			type: [String, Number],
+			default: () => defProps.input.selectionEnd
+		},
+		// 键盘弹起时,是否自动上推页面
+		adjustPosition: {
+			type: Boolean,
+			default: () => defProps.input.adjustPosition
+		},
+		// 输入框内容对齐方式,可选值为:left|center|right
+		inputAlign: {
+			type: String,
+			default: () => defProps.input.inputAlign
+		},
+		// 输入框字体的大小
+		fontSize: {
+			type: [String, Number],
+			default: () => defProps.input.fontSize
+		},
+		// 输入框字体颜色
+		color: {
+			type: String,
+			default: () => defProps.input.color
+		},
+		// 输入框前置图标
+		prefixIcon: {
+			type: String,
+			default: () => defProps.input.prefixIcon
+		},
+		// 前置图标样式,对象或字符串
+		prefixIconStyle: {
+			type: [String, Object],
+			default: () => defProps.input.prefixIconStyle
+		},
+		// 输入框后置图标
+		suffixIcon: {
+			type: String,
+			default: () => defProps.input.suffixIcon
+		},
+		// 后置图标样式,对象或字符串
+		suffixIconStyle: {
+			type: [String, Object],
+			default: () => defProps.input.suffixIconStyle
+		},
+		// 边框类型,surround-四周边框,bottom-底部边框,none-无边框
+		border: {
+			type: String,
+			default: () => defProps.input.border
+		},
+		// 是否只读,与disabled不同之处在于disabled会置灰组件,而readonly则不会
+		readonly: {
+			type: Boolean,
+			default: () => defProps.input.readonly
+		},
+		// 输入框形状,circle-圆形,square-方形
+		shape: {
+			type: String,
+			default: () => defProps.input.shape
+		},
+		// 用于处理或者过滤输入框内容的方法
+		formatter: {
+			type: [Function, null],
+			default: () => defProps.input.formatter
+		},
+		// 是否忽略组件内对文本合成系统事件的处理
+		ignoreCompositionEvent: {
+			type: Boolean,
+			default: true
+		}
+	}
+}
diff --git a/uni_modules/uview-plus/components/u-input/u-input.vue b/uni_modules/uview-plus/components/u-input/u-input.vue
new file mode 100644
index 0000000..0550f1c
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-input/u-input.vue
@@ -0,0 +1,400 @@
+<template>
+    <view class="u-input" :class="inputClass" :style="[wrapperStyle]">
+        <view class="u-input__content">
+            <view
+                class="u-input__content__prefix-icon"
+                v-if="prefixIcon || $slots.prefix"
+            >
+                <slot name="prefix">
+                    <u-icon
+                        :name="prefixIcon"
+                        size="18"
+                        :customStyle="prefixIconStyle"
+                    ></u-icon>
+                </slot>
+            </view>
+            <view class="u-input__content__field-wrapper" @tap="clickHandler">
+				<!-- 根据uni-app的input组件文档,H5和APP中只要声明了password参数(无论true还是false),type均失效,此时
+					为了防止type=number时,又存在password属性,type无效,此时需要设置password为undefined
+				 -->
+            	<input
+            	    class="u-input__content__field-wrapper__field"
+            	    :style="[inputStyle]"
+            	    :type="type"
+            	    :focus="focus"
+            	    :cursor="cursor"
+            	    :value="innerValue"
+            	    :auto-blur="autoBlur"
+            	    :disabled="disabled || readonly"
+            	    :maxlength="maxlength"
+            	    :placeholder="placeholder"
+            	    :placeholder-style="placeholderStyle"
+            	    :placeholder-class="placeholderClass"
+            	    :confirm-type="confirmType"
+            	    :confirm-hold="confirmHold"
+            	    :hold-keyboard="holdKeyboard"
+            	    :cursor-spacing="cursorSpacing"
+            	    :adjust-position="adjustPosition"
+            	    :selection-end="selectionEnd"
+            	    :selection-start="selectionStart"
+            	    :password="password || type === 'password' || false"
+                    :ignoreCompositionEvent="ignoreCompositionEvent"
+            	    @input="onInput"
+            	    @blur="onBlur"
+            	    @focus="onFocus"
+            	    @confirm="onConfirm"
+            	    @keyboardheightchange="onkeyboardheightchange"
+            	/>
+            </view>
+            <view
+                class="u-input__content__clear"
+                v-if="isShowClear"
+                @click="onClear"
+            >
+                <u-icon
+                    name="close"
+                    size="11"
+                    color="#ffffff"
+                    customStyle="line-height: 12px"
+                ></u-icon>
+            </view>
+            <view
+                class="u-input__content__subfix-icon"
+                v-if="suffixIcon || $slots.suffix"
+            >
+                <slot name="suffix">
+                    <u-icon
+                        :name="suffixIcon"
+                        size="18"
+                        :customStyle="suffixIconStyle"
+                    ></u-icon>
+                </slot>
+            </view>
+        </view>
+    </view>
+</template>
+
+<script>
+import props from "./props.js";
+import mpMixin from '../../libs/mixin/mpMixin';
+import mixin from '../../libs/mixin/mixin';
+import { addStyle, addUnit, deepMerge, formValidate, $parent, sleep, os } from '../../libs/function/index';
+/**
+ * Input 输入框
+ * @description  此组件为一个输入框,默认没有边框和样式,是专门为配合表单组件u-form而设计的,利用它可以快速实现表单验证,输入内容,下拉选择等功能。
+ * @tutorial https://uview-plus.jiangruyi.com/components/input.html
+ * @property {String | Number}	value					输入的值
+ * @property {String}			type					输入框类型,见上方说明 ( 默认 'text' )
+ * @property {Boolean}			fixed					如果 textarea 是在一个 position:fixed 的区域,需要显示指定属性 fixed 为 true,兼容性:微信小程序、百度小程序、字节跳动小程序、QQ小程序 ( 默认 false )
+ * @property {Boolean}			disabled				是否禁用输入框 ( 默认 false )
+ * @property {String}			disabledColor			禁用状态时的背景色( 默认 '#f5f7fa' )
+ * @property {Boolean}			clearable				是否显示清除控件 ( 默认 false )
+ * @property {Boolean}			password				是否密码类型 ( 默认 false )
+ * @property {String | Number}	maxlength				最大输入长度,设置为 -1 的时候不限制最大长度 ( 默认 -1 )
+ * @property {String}			placeholder				输入框为空时的占位符
+ * @property {String}			placeholderClass		指定placeholder的样式类,注意页面或组件的style中写了scoped时,需要在类名前写/deep/ ( 默认 'input-placeholder' )
+ * @property {String | Object}	placeholderStyle		指定placeholder的样式,字符串/对象形式,如"color: red;"
+ * @property {Boolean}			showWordLimit			是否显示输入字数统计,只在 type ="text"或type ="textarea"时有效 ( 默认 false )
+ * @property {String}			confirmType				设置右下角按钮的文字,兼容性详见uni-app文档 ( 默认 'done' )
+ * @property {Boolean}			confirmHold				点击键盘右下角按钮时是否保持键盘不收起,H5无效 ( 默认 false )
+ * @property {Boolean}			holdKeyboard			focus时,点击页面的时候不收起键盘,微信小程序有效 ( 默认 false )
+ * @property {Boolean}			focus					自动获取焦点,在 H5 平台能否聚焦以及软键盘是否跟随弹出,取决于当前浏览器本身的实现。nvue 页面不支持,需使用组件的 focus()、blur() 方法控制焦点 ( 默认 false )
+ * @property {Boolean}			autoBlur				键盘收起时,是否自动失去焦点,目前仅App3.0.0+有效 ( 默认 false )
+ * @property {Boolean}			disableDefaultPadding	是否去掉 iOS 下的默认内边距,仅微信小程序,且type=textarea时有效 ( 默认 false )
+ * @property {String | Number}	cursor					指定focus时光标的位置( 默认 -1 )
+ * @property {String | Number}	cursorSpacing			输入框聚焦时底部与键盘的距离 ( 默认 30 )
+ * @property {String | Number}	selectionStart			光标起始位置,自动聚集时有效,需与selection-end搭配使用 ( 默认 -1 )
+ * @property {String | Number}	selectionEnd			光标结束位置,自动聚集时有效,需与selection-start搭配使用 ( 默认 -1 )
+ * @property {Boolean}			adjustPosition			键盘弹起时,是否自动上推页面 ( 默认 true )
+ * @property {String}			inputAlign				输入框内容对齐方式( 默认 'left' )
+ * @property {String | Number}	fontSize				输入框字体的大小 ( 默认 '15px' )
+ * @property {String}			color					输入框字体颜色	( 默认 '#303133' )
+ * @property {Function}			formatter			    内容式化函数
+ * @property {String}			prefixIcon				输入框前置图标
+ * @property {String | Object}	prefixIconStyle			前置图标样式,对象或字符串
+ * @property {String}			suffixIcon				输入框后置图标
+ * @property {String | Object}	suffixIconStyle			后置图标样式,对象或字符串
+ * @property {String}			border					边框类型,surround-四周边框,bottom-底部边框,none-无边框 ( 默认 'surround' )
+ * @property {Boolean}			readonly				是否只读,与disabled不同之处在于disabled会置灰组件,而readonly则不会 ( 默认 false )
+ * @property {String}			shape					输入框形状,circle-圆形,square-方形 ( 默认 'square' )
+ * @property {Object}			customStyle				定义需要用到的外部样式
+ * @property {Boolean}			ignoreCompositionEvent	是否忽略组件内对文本合成系统事件的处理。
+ * @example <u-input v-model="value" :password="true" suffix-icon="lock-fill" />
+ */
+export default {
+    name: "u-input",
+    mixins: [mpMixin, mixin, props],
+    data() {
+        return {
+            // 清除操作
+            clearInput: false,
+            // 输入框的值
+            innerValue: "",
+            // 是否处于获得焦点状态
+            focused: false,
+            // value是否第一次变化,在watch中,由于加入immediate属性,会在第一次触发,此时不应该认为value发生了变化
+            firstChange: true,
+            // value绑定值的变化是由内部还是外部引起的
+            changeFromInner: false,
+			// 过滤处理方法
+			innerFormatter: value => value
+        };
+    },
+    watch: {
+        // #ifdef VUE3
+        modelValue: {
+            immediate: true,
+            handler(newVal, oldVal) {
+                this.innerValue = newVal;
+                /* #ifdef H5 */
+                // 在H5中,外部value变化后,修改input中的值,不会触发@input事件,此时手动调用值变化方法
+                if (
+                    this.firstChange === false &&
+					this.changeFromInner === false
+                ) {
+                    this.valueChange();
+                } else {
+					// 尝试调用u-form的验证方法
+					formValidate(this, "change");
+				}
+                /* #endif */
+                this.firstChange = false;
+                // 重置changeFromInner的值为false,标识下一次引起默认为外部引起的
+                this.changeFromInner = false;
+            },
+        },
+        // #endif
+        // #ifdef VUE2
+        value: {
+            immediate: true,
+            handler(newVal, oldVal) {
+                this.innerValue = newVal;
+                /* #ifdef H5 */
+                // 在H5中,外部value变化后,修改input中的值,不会触发@input事件,此时手动调用值变化方法
+                if (
+                    this.firstChange === false &&
+                    this.changeFromInner === false
+                ) {
+                    this.valueChange();
+                } else {
+					// 尝试调用u-form的验证方法
+					formValidate(this, "change");
+				}
+                /* #endif */
+                this.firstChange = false;
+                // 重置changeFromInner的值为false,标识下一次引起默认为外部引起的
+                this.changeFromInner = false;
+            },
+        },
+        // #endif
+    },
+    computed: {
+        // 是否显示清除控件
+        isShowClear() {
+            const { clearable, readonly, focused, innerValue } = this;
+            return !!clearable && !readonly && !!focused && innerValue !== "";
+        },
+        // 组件的类名
+        inputClass() {
+            let classes = [],
+                { border, disabled, shape } = this;
+            border === "surround" &&
+                (classes = classes.concat(["u-border", "u-input--radius"]));
+            classes.push(`u-input--${shape}`);
+            border === "bottom" &&
+                (classes = classes.concat([
+                    "u-border-bottom",
+                    "u-input--no-radius",
+                ]));
+            return classes.join(" ");
+        },
+        // 组件的样式
+        wrapperStyle() {
+            const style = {};
+            // 禁用状态下,被背景色加上对应的样式
+            if (this.disabled) {
+                style.backgroundColor = this.disabledColor;
+            }
+            // 无边框时,去除内边距
+            if (this.border === "none") {
+                style.padding = "0";
+            } else {
+                // 由于uni-app的iOS开发者能力有限,导致需要分开写才有效
+                style.paddingTop = "6px";
+                style.paddingBottom = "6px";
+                style.paddingLeft = "9px";
+                style.paddingRight = "9px";
+            }
+            return deepMerge(style, addStyle(this.customStyle));
+        },
+        // 输入框的样式
+        inputStyle() {
+            const style = {
+                color: this.color,
+                fontSize: addUnit(this.fontSize),
+				textAlign: this.inputAlign
+            };
+            return style;
+        },
+    },
+    // #ifdef VUE3
+    emits: ['update:modelValue', 'focus', 'blur', 'change', 'confirm', 'clear', 'keyboardheightchange'],
+    // #endif
+    methods: {
+		// 在微信小程序中,不支持将函数当做props参数,故只能通过ref形式调用
+		setFormatter(e) {
+			this.innerFormatter = e
+		},
+        // 当键盘输入时,触发input事件
+        onInput(e) {
+            let { value = "" } = e.detail || {};
+            // 格式化过滤方法
+            const formatter = this.formatter || this.innerFormatter
+            const formatValue = formatter(value)
+            // 为了避免props的单向数据流特性,需要先将innerValue值设置为当前值,再在$nextTick中重新赋予设置后的值才有效
+            this.innerValue = value
+            this.$nextTick(() => {
+            	this.innerValue = formatValue;
+            	this.valueChange();
+            })
+        },
+        // 输入框失去焦点时触发
+        onBlur(event) {
+            this.$emit("blur", event.detail.value);
+            // H5端的blur会先于点击清除控件的点击click事件触发,导致focused
+            // 瞬间为false,从而隐藏了清除控件而无法被点击到
+            sleep(150).then(() => {
+                this.focused = false;
+            });
+            // 尝试调用u-form的验证方法
+            formValidate(this, "blur");
+        },
+        // 输入框聚焦时触发
+        onFocus(event) {
+            this.focused = true;
+            this.$emit("focus");
+        },
+        // 点击完成按钮时触发
+        onConfirm(event) {
+            this.$emit("confirm", this.innerValue);
+        },
+        // 键盘高度发生变化的时候触发此事件
+        // 兼容性:微信小程序2.7.0+、App 3.1.0+
+		onkeyboardheightchange(event) {
+            this.$emit("keyboardheightchange", event);
+        },
+        // 内容发生变化,进行处理
+        valueChange() {
+            if(this.clearInput) {
+                this.innerValue = '';
+                this.clearInput = false;
+            }
+            const value = this.innerValue;
+            this.$nextTick(() => {
+                // #ifdef VUE3
+                this.$emit("update:modelValue", value);
+                // #endif
+                // #ifdef VUE2
+                this.$emit("input", value);
+                // #endif
+                // 标识value值的变化是由内部引起的
+                this.changeFromInner = true;
+                this.$emit("change", value);
+                // 尝试调用u-form的验证方法
+                formValidate(this, "change");
+            });
+        },
+        // 点击清除控件
+        onClear() {
+            this.clearInput = true;
+            this.innerValue = "";
+            this.$nextTick(() => {
+                this.valueChange();
+                this.$emit("clear");
+            });
+        },
+        /**
+         * 在安卓nvue上,事件无法冒泡
+         * 在某些时间,我们希望监听u-from-item的点击事件,此时会导致点击u-form-item内的u-input后
+         * 无法触发u-form-item的点击事件,这里通过手动调用u-form-item的方法进行触发
+         */
+        clickHandler() {
+            // #ifdef APP-NVUE
+            if (os() === "android") {
+                const formItem = $parent.call(this, "u-form-item");
+                if (formItem) {
+                    formItem.clickHandler();
+                }
+            }
+            // #endif
+        },
+    },
+};
+</script>
+
+<style lang="scss" scoped>
+@import "../../libs/css/components.scss";
+
+.u-input {
+    @include flex(row);
+    align-items: center;
+    justify-content: space-between;
+    flex: 1;
+
+    &--radius,
+    &--square {
+        border-radius: 4px;
+    }
+
+    &--no-radius {
+        border-radius: 0;
+    }
+
+    &--circle {
+        border-radius: 100px;
+    }
+
+    &__content {
+        flex: 1;
+        @include flex(row);
+        align-items: center;
+        justify-content: space-between;
+
+        &__field-wrapper {
+            position: relative;
+            @include flex(row);
+            margin: 0;
+            flex: 1;
+			
+			&__field {
+				line-height: 26px;
+				text-align: left;
+				color: $u-main-color;
+				height: 24px;
+				font-size: 15px;
+				flex: 1;
+			}
+        }
+
+        &__clear {
+            width: 20px;
+            height: 20px;
+            border-radius: 100px;
+            background-color: #c6c7cb;
+            @include flex(row);
+            align-items: center;
+            justify-content: center;
+            transform: scale(0.82);
+            margin-left: 4px;
+        }
+
+        &__subfix-icon {
+            margin-left: 4px;
+        }
+
+        &__prefix-icon {
+            margin-right: 4px;
+        }
+    }
+}
+</style>
diff --git a/uni_modules/uview-plus/components/u-keyboard/props.js b/uni_modules/uview-plus/components/u-keyboard/props.js
new file mode 100644
index 0000000..d0c058e
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-keyboard/props.js
@@ -0,0 +1,85 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 键盘的类型,number-数字键盘,card-身份证键盘,car-车牌号键盘
+        mode: {
+            type: String,
+            default: () => defProps.keyboard.mode
+        },
+        // 是否显示键盘的"."符号
+        dotDisabled: {
+            type: Boolean,
+            default: () => defProps.keyboard.dotDisabled
+        },
+        // 是否显示顶部工具条
+        tooltip: {
+            type: Boolean,
+            default: () => defProps.keyboard.tooltip
+        },
+        // 是否显示工具条中间的提示
+        showTips: {
+            type: Boolean,
+            default: () => defProps.keyboard.showTips
+        },
+        // 工具条中间的提示文字
+        tips: {
+            type: String,
+            default: () => defProps.keyboard.tips
+        },
+        // 是否显示工具条左边的"取消"按钮
+        showCancel: {
+            type: Boolean,
+            default: () => defProps.keyboard.showCancel
+        },
+        // 是否显示工具条右边的"完成"按钮
+        showConfirm: {
+            type: Boolean,
+            default: () => defProps.keyboard.showConfirm
+        },
+        // 是否打乱键盘按键的顺序
+        random: {
+            type: Boolean,
+            default: () => defProps.keyboard.random
+        },
+        // 是否开启底部安全区适配,开启的话,会在iPhoneX机型底部添加一定的内边距
+        safeAreaInsetBottom: {
+            type: Boolean,
+            default: () => defProps.keyboard.safeAreaInsetBottom
+        },
+        // 是否允许通过点击遮罩关闭键盘
+        closeOnClickOverlay: {
+            type: Boolean,
+            default: () => defProps.keyboard.closeOnClickOverlay
+        },
+        // 控制键盘的弹出与收起
+        show: {
+            type: Boolean,
+            default: () => defProps.keyboard.show
+        },
+        // 是否显示遮罩,某些时候数字键盘时,用户希望看到自己的数值,所以可能不想要遮罩
+        overlay: {
+            type: Boolean,
+            default: () => defProps.keyboard.overlay
+        },
+        // z-index值
+        zIndex: {
+            type: [String, Number],
+            default: () => defProps.keyboard.zIndex
+        },
+        // 取消按钮的文字
+        cancelText: {
+            type: String,
+            default: () => defProps.keyboard.cancelText
+        },
+        // 确认按钮的文字
+        confirmText: {
+            type: String,
+            default: () => defProps.keyboard.confirmText
+        },
+        // 输入一个中文后,是否自动切换到英文
+        autoChange: {
+            type: Boolean,
+            default: () => defProps.keyboard.autoChange
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-keyboard/u-keyboard.vue b/uni_modules/uview-plus/components/u-keyboard/u-keyboard.vue
new file mode 100644
index 0000000..4495ef0
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-keyboard/u-keyboard.vue
@@ -0,0 +1,167 @@
+<template>
+	<u-popup
+	    :overlay="overlay"
+	    :closeOnClickOverlay="closeOnClickOverlay"
+	    mode="bottom"
+	    :popup="false"
+	    :show="show"
+	    :safeAreaInsetBottom="safeAreaInsetBottom"
+	    @close="popupClose"
+	    :zIndex="zIndex"
+	    :customStyle="{
+			backgroundColor: 'rgb(214, 218, 220)'
+		}"
+	>
+		<view class="u-keyboard">
+			<slot />
+			<view
+			    class="u-keyboard__tooltip"
+			    v-if="tooltip"
+			>
+				<view
+				    hover-class="u-hover-class"
+				    :hover-stay-time="100"
+				>
+					<text
+					    class="u-keyboard__tooltip__item u-keyboard__tooltip__cancel"
+					    v-if="showCancel"
+					    @tap="onCancel"
+					>{{showCancel && cancelText}}</text>
+				</view>
+				<view>
+					<text
+					    v-if="showTips"
+					    class="u-keyboard__tooltip__item u-keyboard__tooltip__tips"
+					>{{tips ? tips : mode == 'number' ? '数字键盘' : mode == 'card' ? '身份证键盘' : '车牌号键盘'}}</text>
+				</view>
+				<view
+				    hover-class="u-hover-class"
+				    :hover-stay-time="100"
+				>
+					<text
+					    v-if="showConfirm"
+					    @tap="onConfirm"
+					    class="u-keyboard__tooltip__item u-keyboard__tooltip__submit"
+					    hover-class="u-hover-class"
+					>{{showConfirm && confirmText}}</text>
+				</view>
+			</view>
+			<template v-if="mode == 'number' || mode == 'card'">
+				<u-number-keyboard
+				    :random="random"
+				    @backspace="backspace"
+				    @change="change"
+				    :mode="mode"
+				    :dotDisabled="dotDisabled"
+				></u-number-keyboard>
+			</template>
+			<template v-else>
+				<u-car-keyboard
+				    :random="random"
+					:autoChange="autoChange"
+				    @backspace="backspace"
+				    @change="change"
+				></u-car-keyboard>
+			</template>
+		</view>
+	</u-popup>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+
+	/**
+	 * keyboard 键盘
+	 * @description 此为uViw自定义的键盘面板,内含了数字键盘,车牌号键,身份证号键盘3中模式,都有可以打乱按键顺序的选项。
+	 * @tutorial https://ijry.github.io/uview-plus/components/keyboard.html
+	 * @property {String}			mode				键盘类型,见官网基本使用的说明 (默认 'number' )
+	 * @property {Boolean}			dotDisabled			是否显示"."按键,只在mode=number时有效 (默认 false )
+	 * @property {Boolean}			tooltip				是否显示键盘顶部工具条 (默认 true )
+	 * @property {Boolean}			showTips			是否显示工具条中间的提示 (默认 true )
+	 * @property {String}			tips				工具条中间的提示文字,见上方基本使用的说明,如不需要,请传""空字符
+	 * @property {Boolean}			showCancel			是否显示工具条左边的"取消"按钮 (默认 true )
+	 * @property {Boolean}			showConfirm			是否显示工具条右边的"完成"按钮( 默认 true )
+	 * @property {Boolean}			random				是否打乱键盘按键的顺序 (默认 false )
+	 * @property {Boolean}			safeAreaInsetBottom	是否开启底部安全区适配 (默认 true )
+	 * @property {Boolean}			closeOnClickOverlay	是否允许点击遮罩收起键盘 (默认 true )
+	 * @property {Boolean}			show				控制键盘的弹出与收起(默认 false )
+	 * @property {Boolean}			overlay				是否显示遮罩 (默认 true )
+	 * @property {String | Number}	zIndex				弹出键盘的z-index值 (默认 1075 )
+	 * @property {String}			cancelText			取消按钮的文字 (默认 '取消' )
+	 * @property {String}			confirmText			确认按钮的文字 (默认 '确认' )
+	 * @property {Object}			customStyle			自定义样式,对象形式
+	 * @event {Function} change 按键被点击(不包含退格键被点击)
+	 * @event {Function} cancel 键盘顶部工具条左边的"取消"按钮被点击
+	 * @event {Function} confirm 键盘顶部工具条右边的"完成"按钮被点击
+	 * @event {Function} backspace 键盘退格键被点击
+	 * @example <u-keyboard mode="number" v-model="show"></u-keyboard>
+	 */
+	export default {
+		name: "u-keyboard",
+		data() {
+			return {
+
+			}
+		},
+		mixins: [mpMixin, mixin, props],
+		emits: ["change", "close", "confirm", "cancel", "backspace"],
+		methods: {
+			change(e) {
+				this.$emit('change', e);
+			},
+			// 键盘关闭
+			popupClose() {
+				this.$emit('close');
+			},
+			// 输入完成
+			onConfirm() {
+				this.$emit('confirm');
+			},
+			// 取消输入
+			onCancel() {
+				this.$emit('cancel');
+			},
+			// 退格键
+			backspace() {
+				this.$emit('backspace');
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-keyboard {
+
+		&__tooltip {
+			@include flex;
+			justify-content: space-between;
+			background-color: #FFFFFF;
+			padding: 14px 12px;
+
+			&__item {
+				color: #333333;
+				flex: 1;
+				text-align: center;
+				font-size: 15px;
+			}
+
+			&__submit {
+				text-align: right;
+				color: $u-primary;
+			}
+
+			&__cancel {
+				text-align: left;
+				color: #888888;
+			}
+
+			&__tips {
+				color: $u-tips-color;
+			}
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-lazy-load/u-lazy-load.vue b/uni_modules/uview-plus/components/u-lazy-load/u-lazy-load.vue
new file mode 100644
index 0000000..5e60f9a
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-lazy-load/u-lazy-load.vue
@@ -0,0 +1,251 @@
+<template>
+    <view class="u-wrap" :style="{
+		opacity: Number(opacity),
+		borderRadius: borderRadius + 'rpx',
+		// 因为time值需要改变,所以不直接用duration值(不能改变父组件prop传过来的值)
+		transition: `opacity ${time / 1000}s ease-in-out`
+	}" :class="'u-lazy-item-' + elIndex">
+        <view :class="'u-lazy-item-' + elIndex">
+            <image :style="{ borderRadius: borderRadius + 'rpx', height: imgHeight }" v-if="!isError"
+                class="u-lazy-item" :src="isShow ? image : loadingImg" :mode="imgMode" @load="imgLoaded"
+                @error="loadError" @tap="clickImg">
+            </image>
+            <image :style="{ borderRadius: borderRadius + 'rpx', height: imgHeight }" class="u-lazy-item error" v-else
+                :src="errorImg" :mode="imgMode" @load="errorImgLoaded" @tap="clickImg"></image>
+        </view>
+    </view>
+</template>
+
+<script>
+    import {
+        addUnit,
+        guid
+    } from '../../libs/function/index.js';
+    /**
+     * lazyLoad 懒加载
+     * @description 懒加载使用的场景为:页面有很多图片时,APP会同时加载所有的图片,导致页面卡顿,各个位置的图片出现前后不一致等.
+     * @tutorial https://uview-plus.jiangruyi.com/components/lazy-load.html
+     * @property {String Number} index 用户自定义值,在事件触发时回调,用以区分是哪个图片
+     * @property {String} image 图片路径
+     * @property {String} loading-img 预加载时的占位图
+     * @property {String} error-img 图片加载出错时的占位图
+     * @property {String} threshold 触发加载时的位置,见上方说明,单位 rpx(默认300)
+     * @property {String Number} duration 图片加载成功时,淡入淡出时间,单位ms(默认)
+     * @property {String} effect 图片加载成功时,淡入淡出的css动画效果(默认ease-in-out)
+     * @property {Boolean} is-effect 图片加载成功时,是否启用淡入淡出效果(默认true)
+     * @property {String Number} border-radius 图片圆角值,单位rpx(默认0)
+     * @property {String Number} height 图片高度,注意:实际高度可能受img-mode参数影响(默认450)
+     * @property {String Number} mg-mode 图片的裁剪模式,详见image组件裁剪模式(默认widthFix)
+     * @event {Function} click 点击图片时触发
+     * @event {Function} load 图片加载成功时触发
+     * @event {Function} error 图片加载失败时触发
+     * @example <u-lazy-load :image="image" :loading-img="loadingImg" :error-img="errorImg"></u-lazy-load>
+     */
+    export default {
+        name: 'u-lazy-load',
+        props: {
+            index: {
+                type: [Number, String]
+            },
+            // 要显示的图片
+            image: {
+                type: String,
+                default: ''
+            },
+            // 图片裁剪模式
+            imgMode: {
+                type: String,
+                default: 'widthFix'
+            },
+            // 占位图片路径
+            loadingImg: {
+                type: String,
+                default: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAGQCAMAAAC3Ycb+AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OUM0QjNBQjkyQUQ2MTFFQTlCNUQ4RTIzNDE5RUIxNjciIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OUM0QjNBQkEyQUQ2MTFFQTlCNUQ4RTIzNDE5RUIxNjciPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5QzRCM0FCNzJBRDYxMUVBOUI1RDhFMjM0MTlFQjE2NyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5QzRCM0FCODJBRDYxMUVBOUI1RDhFMjM0MTlFQjE2NyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PtRHfPcAAAAzUExURZWVldfX18PDw62trZubm9zc3Li4uKGhoebm5tLS0uHh4c3Nzaenp729vcjIyLKysuvr6141L40AAAcXSURBVHja7NzZlqpGAEBR5lG0//9rIw7IJKJi4or7PGTdtN10wr5SVAEGf/qqArsAiIAAERAgAgJEQIAIiIAAERAgAgJEQIAIiIAAERAgAgJEQIAIiIAAERAgAgJEQIAIiIAAERAgAgJEQIAIiIAAERAgAgJEQIAIiIAAERAgAgJEQIAIiIAAERAgAgJEQIAIiIAAERAgAgJEQIAIiIAAERAgAgJEQIAICBABERAgAgJEQIAICBABERAgAgJEQIAICBABERAgAgJEQIAICBABERAgAgJEQIAICBABERAgAgJEQIAICBABERAgAgJEQIAICBABERAgAgJEQIAICBABERAgAgJEQIAICBABERAg+nmQFMi5Jis+sIniED23jSzIgLTtg2D//iYme/8QBM/9lQ+CAEhbNLM3N9hEHAThX7GPCiBfAxK1b51kD+R7QMLjXg7iCsgWIPUh7pfVozG791oeBPngm48G583uW5GkBvI+SBaM2xXDn1oqum423bX/mgF5FySc2cv93Voug9TdZotsggnkBZB2NzbhrSY5HnoG07jei8dvzsJB/c3W60SALILE46+WCztsbhPR7R2VJq0ukEcT49nyy8QhaKcRa3fYHZD4+ufqOJAcgDz8/59vtw1I3QP5K6JsOG0vm3hce4I8LQp/BaRZGJC3AAn7IKOKXbC+7EdA5vdmmVwOLksgRThqOqiH4XEGsht+peoPUE8U/jJIO5OLH4GEwUslV5G0PTBG5Uiw/Y2jyigO3l9HAHKv9PYb82LloH74dZBoBUgar+l48NsNvtD0fkez9iwrAvIYZDRCl+Xs149Hm/KZmQ+QjUCiO1ei4ru7EsgnQYrkznlQb7thCuRfAzlOAPN72427P4VA/i2Q/DKT/Ls/VR8fvIBsDZIuz7TPF6TCbnk4GJkB2RokejTjuE7/unlgCuSTIO0Cy+Plp6vDfnQlBchy8QtjSHVd3EgmK1bHLm+H6+nXYbz2DuQRSPnqoL7vvq0u70on4zvxgCyWD3b9UyDVdW24PaWaiGTnFZJwPIQAebDpIKheBIm7n124ZthMJipAlkqHO+IZkP1tbfzOJark/A7MgKyvvl60fRqkvXfhuow+t9+q00+0/yyBrK8ZngOtBzldhw2X9tvpNGty0gvkmbPeJ0Cy/r09s/stbmfo0yMWkEdjevgKyOn2t2pxv7UXoibTdCDLje9/Ww1ymqzn87dbp92242ZmMRjI8hASvwKSLq4udqN6ksw8nxXN3tszD9L8Gkg+2mFrQYql5az4tvFj5xOx4VwnSdeBtGdyPwUytxK77pBVlNHdO7OK3rh/eTPUvdutT3fO52tuHMqD4N7llv8pyOQQ//w19YVDfX27+Sfuby9/6nau4pdA8vEdOZuChEH/quHt0Jg+IRJ/5+PrHwKZXfjbDiS73Zo7mu5UkzX7uTsXe0e/7nC3ePf1O69+BUg2XDfZCqSqOu7rGVf8cHBe8zhC2b61dtUHXv0OkGo6ZL4JkpbRYXdUaFevivx2M/1GIOctNh949TtAoumQ+TpIHMX54CJu+8BDd8FkE5BqcZh/59XvAClmTvKfB0nDqIlHo3T70SftyW1eX9dXtgQJqs1f/Q6QaOa/7wmQKtxH8eiGoCRuovODIO3VxOMmruZbHrLyD7z6DSDtGyT7ew1kf9hNn07c986JTovzzem0Id9wUG+Vk/IDr34DSNR7huZJkMFT6vEhqrPx/j5cnlZML8N6/PAzh9Y99Flm5Yde/c9BquDOkvkKkMP58dA4qi9vivE8JOvGz/j8FokfPpr288+pH2ZPOZrLmeGD+7KOh6dqYWJ48ki7yUg0tz0go/fv/LLddfV3sgOLJyaGPY/zrSlh1a36Arkzoue9CyG35ze6E6/dzO2Ga0EGHqdRJIkfn9/8OEjTW8Vq91ZWh39FeehWA7Nu9ft8CpUEk1WWOyDF0OPyEU2Pnzf/bZC0P6IPzmAvu7KauQBVrgKpJ0tG2arHzX8e5Pb3PezNs/PrX+3JMyCLn9XXf37tPFHvt09WfCDDjx+yyn1/p1V11j7GnB/q3leLuVva79S/tzed+db08YpF4uOZtmz/9oXWMq6BCAgQAQEiIEAERECACAgQAQEiIEAERECACAgQAQEiIEAERECACAgQAQEiIEAERECACAgQAQEiIEAERECACAgQAQEiIEAERECACAgQAQEiIEAERECACAgQAQEiIEAERECACAgQAQEiIEAERECACAgQAQEiIEAEBIiACAgQAQEiIEAEBIiACAgQAQEiIEAEBIiACAgQAQEiIEAEBIiACAgQAQEiIEAEBIiACAgQAQEiIEAEBIiACAgQAQEiIEAEBIiACAgQAQEiIEAEBIiACAgQAQEiIEAEBIiACAgQAQEiIEAEBIiAALELvqt/BBgACqVeUBXxcCkAAAAASUVORK5CYII='
+            },
+            // 加载失败的错误占位图
+            errorImg: {
+                type: String,
+                default: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAGQCAMAAAC3Ycb+AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODdDMjhENDYyQUQ2MTFFQTlDQ0VBODgxQjFFOEEyMEMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODdDMjhENDcyQUQ2MTFFQTlDQ0VBODgxQjFFOEEyMEMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4N0MyOEQ0NDJBRDYxMUVBOUNDRUE4ODFCMUU4QTIwQyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4N0MyOEQ0NTJBRDYxMUVBOUNDRUE4ODFCMUU4QTIwQyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PhLwhikAAAAzUExURZWVldfX162trcPDw5ubm7i4uNzc3Obm5s3NzaGhoeHh4cjIyKenp9LS0r29vbKysuvr67sDMEkAAAlpSURBVHja7NzpYqMgAIVRUVHc8/5PO66R1WAbOzX97q+ZtDEpR0AWTR7kVyWhCAAhgABCAAGEAAIIAQQQAggBBBACCCAEEEAIIIAQQAgggBBAACGAAEIAAYQAQgABhAACCAEEEAIIIAQQAgggBBBACCCAEEAAIYAQQAAhgABCAAGEAAIIAYQAAggBBBACCCAEEEAIIAQQQAgggBBAACGAAEIAIYAAQgABhAACCAEEEAIIAQQQAgggBBBACCCAEEAAIYAQQAAhgABCAAGEAAIIAYQAAggBBBACCCAEEEAIIAQQQAgggBBAACGAAEIAIYAAQgABhAACCAEEEAIIAQQQAgggBBBACCCAEEAIIIAQQAAhgABCAAGEAEIAAYQAAggBBBACCCAEEAIIIAQQQAgggBBAACGAEEAAIYAAsqeX5QWHKIcs/Ptl03lfL4zDFPWfBGmSpPn+IZzSH5KkCL5B+n+oklwz6Iz//R2QzFOabzhEmiRirAmZt/bl0w/dpMbLqeeo4wEdpC7zR5WAPKziHKtO7ql+ReKvIa9BxgNaL5ZtEkpeAGIVp5jKJa09xVo9vgSSzQcszdYvmOqjQNSQ6pHK6rO1n1Xj32788miwHLaZz1Tl9i/yayDlYJ/60/+lp8GSY7OY1B8E4p55bWmfquFk22GLuUUxi78cX+m+BjL2GLkhMrV+/muS6Sfic0CEp5T1Yu2OQdTzsKV0MJV73KVjroyTffxfuv5Tf3fd6iLT9wz8YdVHgUzF2Is9/Xhi5sYJqP1w/GUpjOiHVbaI0w2L+pg3GZzvtokcgHxWDXHaiy78l3sPke01qphamT5c+dqyeAGSumdL/mkggauTam0e3L/mPEiqtzKDbl0Z1Wn8xOa4ySo8X/7TQIJnY/seEKWf12UmC72CKP9xYjr19RPT7NNA+oMO+R0gwmlotAry+C6I0f59ch8yXVQOr0BKYcXt1IUYRyCt+Ur9HGsrQKI79WY9sY9ARPKlzFOFdb41ioD8b5Bp+mqeeRKAxINkESBFGpOpKhgv9OuYpH8A8l4Qa3qp60Kl2/k+rG2sWafuuyCBafb2j4JkgZUob3nWcmicpkxEgmTLLGejTxnWSWCi8lPmsk6DlIHFJv24ojiYyYoGacwL8zXTLEAVaDI/Ybb3NIgKDSv2oXpmHkvNs+PTpMASEdlk7fOZeRk37fwJ6yGnQarQsGIfqqcvx43rTOXY6jf7uKXdRzdLDRPbjIrx1cIj3Kr4KyBFezzgUGuR5893qkOQ19fR2uVBaU+r16LphJNOiatK7PeBZK/Kb+tUn71rcQjSvARpghfH/yG/D2RetTuI3N5QrMWdP46brP7FmKZ//CGQ9At9SL01DLkzY/Vs8Z97fQZ7gelw7jHqCz+/Wile5J4g3Vc79eb5a6oLSue+Ve83gaSv2jp5PxCzjzwFUm9zw9MllSMil1kS4d2E9SaQ1xNo9wMxx0+nQNLnew/WDHvveMAHYm08mofl3TFI/8pD3Q6kMAv6DIi2jTCwRJUvNdDYrrJum9oHhusCbWALonwxBRk1vXMnEGWuT5wAmfYuVGUYpJ7fUZujCN92hvzwWlrFgxSfANKb10DxIMbShnfrynyZZV30imA7P43ArXXHbvBVkTCIuGy25AdBrHmNeBCpL214QdLp9LZarG3IMWrmW0ehtuO7F2PS09UcgqS3B7FKPhpknrStD0HGF/vQRne37LwLG8EbHT4WxN7/Fg0yD9Yr/3br4nnstA+0Il6QxzdBmg8A6a2/IRbkcK9h/uzV8zywF/oSkOyageCPglRWgcWClHnEzs9q/t/SENVXgFijlsq3VtXdCsRp4qObrLLLgjuzSq3fX89ZZW6AfxNIzF6X9FYgThN/fk093KkvHX/hbWd+DqS/FUhlf+G3gohEXzVs3g9iDluWoaW8fL73QhB34u+tIHIf19nLuF4Q98a09Eynnl56q+ePgEhnX+dbQOp6H5XnJ0ACd8dFgkwf12nTOTcEqd2pom+CFF02TIPw6dKmrLS5qOtBpo8b5quUtrwrSGbuqPkeSJqllTFHO02NPxdMrm+y5LKdWyWXjw4vA5nGEtnjuyCFyHqNYvEolzmASm3zK1Eg5zr13lhqV1tlksnVw8Pkwgri7O07AVKLJkutRYw87bPlRpBpNXE8xGb+fhBlvEGrGPLqViu5sILIx9dAmqF1705sxF4M8+R8P5dOdQwi12fMnATpjJ2JSt/POIvU9wPJEs/jduJAjLvU0yFT0i64Yb1bsVi79dA4pEy3TzoHMq2O7Re4vXm5O9+l290NpE4CU+YRIMNye2iaqbVS2AUnn2fsekthYKReVNutVedA5juttyIXrT38mOds+ps9DWhwL7GWc61/DVKPzVN9UHDarf1icU98IOU8tm6L031Iq63t1tKzj3fe/FCpO4F0/i0Z2+yvA1KeGBjqj1qYx8/zoxpKZ1Yl367I1k+sfcft/QPy9csXy/32qX1qLZsrryG5BGQaRj0vc/b7N54XXq293TCLB5HO42Fy517obW19b+qjl3CHp0fdLJcWvmdy1etESi/uAdJrs1hTaUklHuW8qSDdC3UfXVR5cnD3rAFSSqtFb7z7eapErx7rC739jCXfbK3aWiipjXo8UbmxXPa7QQq9R289j2Gr88N7Ag5AlHPRKc37pNZv0CZtX1tVMG6rm8qW1/KlCgQvcMss933ybwXZz3dReW5yce4ByZtHFIhwT9kmjxg8BzbKDUe1PB9edBJqSN7/KM1LmqyuMZ5BpeTUw1aD/uDI0relPfSHa/Wn8Pxq1BNfxy/h3IdwOJqIKumb9CHvTqMefyY82RoQAgggBBBACCCAEEAAIYAQQAAhgABCAAGEAAIIAYQAAggBBBACCCAEEEAIIAQQQAgggBBAACGAAEIAIYAAQgABhAACCAEEEAIIAQQQAgggBBBACCCAEEAIIIAQQAAhgABCAAGEAEIAAYQAAggBBBACCCAEEAIIIAQQQAgggBBAACGAEEAAIYAAQgABhAACCAEEEAIIAQQQAgggBBBACCCAEEAIIIAQQAAhgABCAAGEAEIAAYQAAggBBBACCCAEEAIIIAQQQAgggBBAACGAEEAAIYAAQgABhAACCAGEAAIIAQQQAgggBBBACCAEEEAIIIAQQAAhgABCACGAAEIAAYQAAggBBBACCAEEEAIIIAQQQAggfyL/BBgA8PgLdH0TBtkAAAAASUVORK5CYII='
+            },
+            // 图片进入可见区域前多少像素时,单位rpx,开始加载图片
+            // 负数为图片超出屏幕底部多少距离后触发懒加载,正数为图片顶部距离屏幕底部多少距离时触发(图片还没出现在屏幕上)
+            threshold: {
+                type: [Number, String],
+                default: 100
+            },
+            // 淡入淡出动画的过渡时间
+            duration: {
+                type: [Number, String],
+                default: 500
+            },
+            // 渡效果的速度曲线,各个之间差别不大,因为这是淡入淡出,且时间很短,不是那些变形或者移动的情况,会明显
+            // linear|ease|ease-in|ease-out|ease-in-out|cubic-bezier(n,n,n,n);
+            effect: {
+                type: String,
+                default: 'ease-in-out'
+            },
+            // 是否使用过渡效果
+            isEffect: {
+                type: Boolean,
+                default: true
+            },
+            // 圆角值
+            borderRadius: {
+                type: [Number, String],
+                default: 0
+            },
+            // 图片高度,单位rpx
+            height: {
+                type: [Number, String],
+                default: '450'
+            }
+        },
+        data() {
+            return {
+                isShow: false,
+                opacity: 1,
+                time: this.duration,
+                loadStatus: '', // 默认是懒加载中的状态
+                isError: false, // 图片加载失败
+                elIndex: guid()
+            }
+        },
+        computed: {
+            // 将threshold从rpx转为px
+            getThreshold() {
+                // 先取绝对值,因为threshold可能是负数,最后根据this.threshold是正数或者负数,重新还原
+                let thresholdPx = uni.upx2px(Math.abs(this.threshold));
+                return this.threshold < 0 ? -thresholdPx : thresholdPx;
+            },
+            // 计算图片的高度,可能为auto,带%,或者直接数值
+            imgHeight() {
+                return addUnit(this.height);
+            }
+        },
+        created() {
+            // 由于一些特殊原因,不能将此变量放到data中定义
+            this.observer = {};
+        },
+        watch: {
+            isShow(nVal) {
+                // 如果是不开启过渡效果,直接返回
+                if (!this.isEffect) return;
+                this.time = 0;
+                // 原来opacity为1(不透明,是为了显示占位图),改成0(透明,意味着该元素显示的是背景颜色,默认的白色),再改成1,是为了获得过渡效果
+                this.opacity = 0;
+                // 延时30ms,否则在浏览器H5,过渡效果无效
+                setTimeout(() => {
+                    this.time = this.duration;
+                    this.opacity = 1;
+                }, 30)
+            },
+            // 图片路径发生变化时,需要重新标记一些变量,否则会一直卡在某一个状态,比如isError
+            image(n) {
+                if (!n) {
+                    // 如果传入null或者'',或者undefined,标记为错误状态
+                    this.isError = true;
+                } else {
+                    this.init();
+                    this.isError = false;
+                }
+            }
+        },
+        emits: ['click', 'load'],
+        methods: {
+            // 用于重新初始化
+            init() {
+                this.isError = false;
+                this.loadStatus = '';
+            },
+            // 点击图片触发的事件,loadlazy-还是懒加载中状态,loading-图片正在加载,loaded-图片加加载完成
+            clickImg() {
+                let whichImg = '';
+                // 如果isShow为false,意味着图片还没开始加载,点击的只能是最开始的占位图
+                if (this.isShow == false) whichImg = 'lazyImg';
+                // 如果isError为true,意味着图片加载失败,这是只剩下错误的占位图,所以点击的只能是错误占位图
+                // 当然,也可以给错误的占位图元素绑定点击事件,看你喜欢~
+                else if (this.isError == true) whichImg = 'errorImg';
+                // 总共三张图片,除了两个占位图,剩下的只能是正常的那张图片了
+                else whichImg = 'realImg';
+                // 只通知当前图片的index
+                this.$emit('click', this.index);
+            },
+            // 图片加载完成事件,可能是加载占位图时触发,也可能是加载真正的图片完成时触发,通过isShow区分
+            imgLoaded() {
+                // 占位图加载完成
+                if (this.loadStatus == '') {
+                    this.loadStatus = 'lazyed';
+                }
+                // 真正的图片加载完成 
+                else if (this.loadStatus == 'lazyed') {
+                    this.loadStatus = 'loaded';
+                    this.$emit('load', this.index);
+                }
+            },
+            // 错误的图片加载完成
+            errorImgLoaded() {
+                this.$emit('error', this.index);
+            },
+            // 图片加载失败
+            loadError() {
+                this.isError = true;
+            },
+            disconnectObserver(observerName) {
+                const observer = this[observerName];
+                observer && observer.disconnect();
+            },
+        },
+        beforeUnmount() {
+            // 销毁页面时,可能还没触发某张很底部的懒加载图片,所以把这个事件给去掉
+            //observer.disconnect();
+        },
+        mounted() {
+            // 此uOnReachBottom事件由mixin.js发出,目的是让页面到底时,保证所有图片都进行加载,做到绝对稳定且可靠
+            this.$nextTick(() => {
+                uni.$once('uOnReachBottom', () => {
+                    if (!this.isShow) this.isShow = true;
+                });
+            })
+            // mounted的时候,不一定挂载了这个元素,延时30ms,否则会报错或者不报错,但是也没有效果
+            setTimeout(() => {
+                // 这里是组件内获取布局状态,不能用uni.createIntersectionObserver,而必须用this.createIntersectionObserver
+                // this.disconnectObserver('contentObserver');
+                const contentObserver = uni.createIntersectionObserver(this);
+                // 要理解这里怎么计算的,请看这个:
+                // https://blog.csdn.net/qq_25324335/article/details/83687695
+                contentObserver.relativeToViewport({
+                    bottom: this.getThreshold,
+                }).observe('.u-lazy-item-' + this.elIndex, (res) => {
+                    console.log('relativeToViewport', res)
+                    if (res.intersectionRatio > 0) {
+                        // 懒加载状态改变
+                        this.isShow = true;
+                        // 如果图片已经加载,去掉监听,减少性能的消耗
+                        this.disconnectObserver('contentObserver');
+                    }
+                })
+                this.contentObserver = contentObserver;
+            }, 30)
+        }
+    }
+</script>
+
+<style scoped lang="scss">
+    @import "../../libs/css/components.scss";
+
+    .u-wrap {
+        background-color: #eee;
+        overflow: hidden;
+    }
+
+    .u-lazy-item {
+        width: 100%;
+        // 骗系统开启硬件加速
+        transform: transition3d(0, 0, 0);
+        // 防止图片加载“闪一下”
+        will-change: transform;
+        /* #ifndef APP-NVUE */
+        display: block;
+        /* #endif */
+    }
+</style>
\ No newline at end of file
diff --git a/uni_modules/uview-plus/components/u-line-progress/props.js b/uni_modules/uview-plus/components/u-line-progress/props.js
new file mode 100644
index 0000000..b051f5a
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-line-progress/props.js
@@ -0,0 +1,29 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 激活部分的颜色
+        activeColor: {
+            type: String,
+            default: () => defProps.lineProgress.activeColor
+        },
+        inactiveColor: {
+            type: String,
+            default: () => defProps.lineProgress.color
+        },
+        // 进度百分比,数值
+        percentage: {
+            type: [String, Number],
+            default: () => defProps.lineProgress.inactiveColor
+        },
+        // 是否在进度条内部显示百分比的值
+        showText: {
+            type: Boolean,
+            default: () => defProps.lineProgress.showText
+        },
+        // 进度条的高度,单位px
+        height: {
+            type: [String, Number],
+            default: () => defProps.lineProgress.height
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-line-progress/u-line-progress.vue b/uni_modules/uview-plus/components/u-line-progress/u-line-progress.vue
new file mode 100644
index 0000000..bc6c520
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-line-progress/u-line-progress.vue
@@ -0,0 +1,149 @@
+<template>
+	<view
+	    class="u-line-progress"
+	    :style="[addStyle(customStyle)]"
+	>
+		<view
+		    class="u-line-progress__background"
+		    ref="u-line-progress__background"
+		    :style="[{
+				backgroundColor: inactiveColor,
+				height: addUnit(height),
+			}]"
+		>
+		</view>
+		<view
+		    class="u-line-progress__line"
+		    :style="[progressStyle]"
+		> 
+			<slot>
+				<text v-if="showText && percentage >= 10" class="u-line-progress__text">{{innserPercentage + '%'}}</text>
+			</slot> 
+		</view>
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addUnit, addStyle, sleep, range } from '../../libs/function/index';
+	// #ifdef APP-NVUE
+	const dom = uni.requireNativePlugin('dom')
+	// #endif
+	/**
+	 * lineProgress 线型进度条
+	 * @description 展示操作或任务的当前进度,比如上传文件,是一个线形的进度条。
+	 * @tutorial https://ijry.github.io/uview-plus/components/lineProgress.html
+	 * @property {String}			activeColor		激活部分的颜色 ( 默认 '#19be6b' )
+	 * @property {String}			inactiveColor	背景色 ( 默认 '#ececec' )
+	 * @property {String | Number}	percentage		进度百分比,数值 ( 默认 0 )
+	 * @property {Boolean}			showText		是否在进度条内部显示百分比的值 ( 默认 true )
+	 * @property {String | Number}	height			进度条的高度,单位px ( 默认 12 )
+	 * 
+	 * @example <u-line-progress :percent="70" :show-percent="true"></u-line-progress>
+	 */
+	export default {
+		name: "u-line-progress",
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				lineWidth: 0,
+			}
+		},
+		watch: {
+			percentage(n) {
+				this.resizeProgressWidth()
+			}
+		},
+		computed: {
+			progressStyle() { 
+				let style = {}
+				style.width = this.lineWidth
+				style.backgroundColor = this.activeColor
+				style.height = addUnit(this.height)
+				return style
+			},
+			innserPercentage() {
+				// 控制范围在0-100之间
+				return range(0, 100, this.percentage)
+			}
+		},
+		mounted() {
+			this.init()
+		},
+		methods: {
+			addStyle,
+			addUnit,
+			init() {
+				sleep(20).then(() => {
+					this.resizeProgressWidth()
+				})
+			},
+			getProgressWidth() {
+				// #ifndef APP-NVUE
+				return this.$uGetRect('.u-line-progress__background')
+				// #endif
+
+				// #ifdef APP-NVUE
+				// 返回一个promise
+				return new Promise(resolve => {
+					dom.getComponentRect(this.$refs['u-line-progress__background'], (res) => {
+						resolve(res.size)
+					})
+				})
+				// #endif
+			},
+			resizeProgressWidth() {
+				this.getProgressWidth().then(size => {
+					const {
+						width
+					} = size
+					// 通过设置的percentage值,计算其所占总长度的百分比
+					this.lineWidth = width * this.innserPercentage / 100 + 'px'
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-line-progress {
+		align-items: stretch;
+		position: relative;
+		@include flex(row);
+		flex: 1;
+		overflow: hidden;
+		border-radius: 100px;
+
+		&__background {
+			background-color: #ececec;
+			border-radius: 100px;
+			flex: 1;
+		}
+
+		&__line {
+			position: absolute;
+			top: 0;
+			left: 0;
+			bottom: 0;
+			align-items: center;
+			@include flex(row);
+			color: #ffffff;
+			border-radius: 100px;
+			transition: width 0.5s ease;
+			justify-content: flex-end;
+		}
+
+		&__text {
+			font-size: 10px;
+			align-items: center;
+			text-align: right;
+			color: #FFFFFF;
+			margin-right: 5px;
+			transform: scale(0.9);
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-line/props.js b/uni_modules/uview-plus/components/u-line/props.js
new file mode 100644
index 0000000..6ca15d9
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-line/props.js
@@ -0,0 +1,34 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        color: {
+            type: String,
+            default: () => defProps.line.color
+        },
+        // 长度,竖向时表现为高度,横向时表现为长度,可以为百分比,带px单位的值等
+        length: {
+            type: [String, Number],
+            default: () => defProps.line.length
+        },
+        // 线条方向,col-竖向,row-横向
+        direction: {
+            type: String,
+            default: () => defProps.line.direction
+        },
+        // 是否显示细边框
+        hairline: {
+            type: Boolean,
+            default: () => defProps.line.hairline
+        },
+        // 线条与上下左右元素的间距,字符串形式,如"30px"、"20px 30px"
+        margin: {
+            type: [String, Number],
+            default: () => defProps.line.margin
+        },
+        // 是否虚线,true-虚线,false-实线
+        dashed: {
+            type: Boolean,
+            default: () => defProps.line.dashed
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-line/u-line.vue b/uni_modules/uview-plus/components/u-line/u-line.vue
new file mode 100644
index 0000000..228242b
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-line/u-line.vue
@@ -0,0 +1,65 @@
+<template>
+	<view
+	    class="u-line"
+	    :style="[lineStyle]"
+	>
+
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addUnit, addStyle, deepMerge } from '../../libs/function/index';
+	/**
+	 * line 线条
+	 * @description 此组件一般用于显示一根线条,用于分隔内容块,有横向和竖向两种模式,且能设置0.5px线条,使用也很简单
+	 * @tutorial https://ijry.github.io/uview-plus/components/line.html
+	 * @property {String}			color		线条的颜色 ( 默认 '#d6d7d9' )
+	 * @property {String | Number}	length		长度,竖向时表现为高度,横向时表现为长度,可以为百分比,带px单位的值等 ( 默认 '100%' )
+	 * @property {String}			direction	线条的方向,row-横向,col-竖向 (默认 'row' )
+	 * @property {Boolean}			hairline	是否显示细线条 (默认 true )
+	 * @property {String | Number}	margin		线条与上下左右元素的间距,字符串形式,如"30px"  (默认 0 )
+	 * @property {Boolean}			dashed		是否虚线,true-虚线,false-实线 (默认 false )
+	 * @property {Object}			customStyle	定义需要用到的外部样式
+	 * @example <u-line color="red"></u-line>
+	 */
+	export default {
+		name: 'u-line',
+		mixins: [mpMixin, mixin, props],
+		computed: {
+			lineStyle() {
+				const style = {}
+				style.margin = this.margin
+				// 如果是水平线条,边框高度为1px,再通过transform缩小一半,就是0.5px了
+				if (this.direction === 'row') {
+					// 此处采用兼容分开写,兼容nvue的写法
+					style.borderBottomWidth = '1px'
+					style.borderBottomStyle = this.dashed ? 'dashed' : 'solid'
+					style.width = addUnit(this.length)
+					if (this.hairline) style.transform = 'scaleY(0.5)'
+				} else {
+					// 如果是竖向线条,边框宽度为1px,再通过transform缩小一半,就是0.5px了
+					style.borderLeftWidth = '1px'
+					style.borderLeftStyle = this.dashed ? 'dashed' : 'solid'
+					style.height = addUnit(this.length)
+					if (this.hairline) style.transform = 'scaleX(0.5)'
+				}
+
+				style.borderColor = this.color
+				return deepMerge(style, addStyle(this.customStyle))
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-line {
+		/* #ifndef APP-NVUE */
+		vertical-align: middle;
+		/* #endif */
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-link/props.js b/uni_modules/uview-plus/components/u-link/props.js
new file mode 100644
index 0000000..908c888
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-link/props.js
@@ -0,0 +1,40 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 文字颜色
+        color: {
+            type: String,
+            default: () => defProps.link.color
+        },
+        // 字体大小,单位px
+        fontSize: {
+            type: [String, Number],
+            default: () => defProps.link.fontSize
+        },
+        // 是否显示下划线
+        underLine: {
+            type: Boolean,
+            default: () => defProps.link.underLine
+        },
+        // 要跳转的链接
+        href: {
+            type: String,
+            default: () => defProps.link.href
+        },
+        // 小程序中复制到粘贴板的提示语
+        mpTips: {
+            type: String,
+            default: () => defProps.link.mpTips
+        },
+        // 下划线颜色
+        lineColor: {
+            type: String,
+            default: () => defProps.link.lineColor
+        },
+        // 超链接的问题,不使用slot形式传入,是因为nvue下无法修改颜色
+        text: {
+            type: String,
+            default: () => defProps.link.text
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-link/u-link.vue b/uni_modules/uview-plus/components/u-link/u-link.vue
new file mode 100644
index 0000000..0f2871d
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-link/u-link.vue
@@ -0,0 +1,87 @@
+<template>
+	<text
+	    class="u-link"
+	    @tap.stop="openLink"
+	    :style="[linkStyle, addStyle(customStyle)]"
+	>{{text}}</text>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addStyle, addUnit, getPx, toast } from '../../libs/function/index';
+	/**
+	 * link 超链接
+	 * @description 该组件为超链接组件,在不同平台有不同表现形式:在APP平台会通过plus环境打开内置浏览器,在小程序中把链接复制到粘贴板,同时提示信息,在H5中通过window.open打开链接。
+	 * @tutorial https://ijry.github.io/uview-plus/components/link.html
+	 * @property {String}			color		文字颜色 (默认 color['u-primary'] )
+	 * @property {String | Number}	fontSize	字体大小,单位px (默认 15 )
+	 * @property {Boolean}			underLine	是否显示下划线 (默认 false )
+	 * @property {String}			href		跳转的链接,要带上http(s)
+	 * @property {String}			mpTips		各个小程序平台把链接复制到粘贴板后的提示语(默认“链接已复制,请在浏览器打开”)
+	 * @property {String}			lineColor	下划线颜色,默认同color参数颜色 
+	 * @property {String}			text		超链接的问题,不使用slot形式传入,是因为nvue下无法修改颜色 
+	 * @property {Object}			customStyle	定义需要用到的外部样式
+	 * 
+	 * @example <u-link href="http://www.uviewui.com">蜀道难,难于上青天</u-link>
+	 */
+	export default {
+		name: "u-link",
+		mixins: [mpMixin, mixin, props],
+		computed: {
+			linkStyle() {
+				const style = {
+					color: this.color,
+					fontSize: addUnit(this.fontSize),
+					// line-height设置为比字体大小多2px
+					lineHeight: addUnit(getPx(this.fontSize) + 2),
+					textDecoration: this.underLine ? 'underline' : 'none'
+				}
+				// if (this.underLine) {
+				// 	style.borderBottomColor = this.lineColor || this.color
+				// 	style.borderBottomWidth = '1px'
+				// }
+				return style
+			}
+		},
+		emits: ["click"],
+		methods: {
+			addStyle,
+			openLink() {
+				// #ifdef APP-PLUS
+				plus.runtime.openURL(this.href)
+				// #endif
+				// #ifdef H5
+				window.open(this.href)
+				// #endif
+				// #ifdef MP
+				uni.setClipboardData({
+					data: this.href,
+					success: () => {
+						uni.hideToast();
+						this.$nextTick(() => {
+							toast(this.mpTips);
+						})
+					}
+				});
+				// #endif
+				this.$emit('click')
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+	$u-link-line-height:1 !default;
+
+	.u-link {
+		/* #ifndef APP-NVUE */
+		line-height: $u-link-line-height;
+		/* #endif */
+		@include flex;
+		flex-wrap: wrap;
+		flex: 1;
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-list-item/props.js b/uni_modules/uview-plus/components/u-list-item/props.js
new file mode 100644
index 0000000..61ed302
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-list-item/props.js
@@ -0,0 +1,10 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 用于滚动到指定item
+        anchor: {
+            type: [String, Number],
+            default: () => defProps.listItem.anchor
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-list-item/u-list-item.vue b/uni_modules/uview-plus/components/u-list-item/u-list-item.vue
new file mode 100644
index 0000000..7eada94
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-list-item/u-list-item.vue
@@ -0,0 +1,119 @@
+<template>
+	<!-- #ifdef APP-NVUE -->
+	<cell>
+		<!-- #endif -->
+		<view
+			class="u-list-item"
+			:ref="`u-list-item-${anchor}`"
+			:anchor="`u-list-item-${anchor}`"
+			:class="[`u-list-item-${anchor}`]"
+		>
+			<slot />
+		</view>
+		<!-- #ifdef APP-NVUE -->
+	</cell>
+	<!-- #endif -->
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { sys } from '../../libs/function/index';
+	// #ifdef APP-NVUE
+	const dom = uni.requireNativePlugin('dom')
+	// #endif
+	/**
+	 * List 列表
+	 * @description 该组件为高性能列表组件
+	 * @tutorial https://ijry.github.io/uview-plus/components/list.html
+	 * @property {String | Number}	anchor	用于滚动到指定item
+	 * @example <u-list-ite v-for="(item, index) in indexList" :key="index" ></u-list-item>
+	 */
+	export default {
+		name: 'u-list-item',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				// 节点信息
+				rect: {},
+				index: 0,
+				show: true,
+				sys: sys()
+			}
+		},
+		computed: {
+
+		},
+		inject: ['uList'],
+		watch: {
+			// #ifndef APP-NVUE
+			'uList.innerScrollTop'(n) {
+				const preLoadScreen = this.uList.preLoadScreen
+				const windowHeight = this.sys.windowHeight
+				if(n <= windowHeight * preLoadScreen) {
+					this.parent.updateOffsetFromChild(0)
+				} else if (this.rect.top <= n - windowHeight * preLoadScreen) {
+					this.parent.updateOffsetFromChild(this.rect.top)
+				}
+			}
+			// #endif
+		},
+		created() {
+			this.parent = {}
+		},
+		mounted() {
+			this.init()
+		},
+		methods: {
+			init() {
+				// 初始化数据
+				this.updateParentData()
+				this.index = this.parent.children.indexOf(this)
+				this.resize()
+			},
+			updateParentData() {
+				// 此方法在mixin中
+				this.getParentData('u-list')
+			},
+			resize() {
+				this.queryRect(`u-list-item-${this.anchor}`).then(size => {
+					const lastChild = this.parent.children[this.index - 1]
+					this.rect = size
+					const preLoadScreen = this.uList.preLoadScreen
+					const windowHeight = this.sys.windowHeight
+					// #ifndef APP-NVUE
+					if (lastChild) {
+						this.rect.top = lastChild.rect.top + lastChild.rect.height
+					}
+					if (size.top >= this.uList.innerScrollTop + (1 + preLoadScreen) * windowHeight) this.show =
+						false
+					// #endif
+				})
+			},
+			// 查询元素尺寸
+			queryRect(el) {
+				return new Promise(resolve => {
+					// #ifndef APP-NVUE
+					this.$uGetRect(`.${el}`).then(size => {
+						resolve(size)
+					})
+					// #endif
+
+					// #ifdef APP-NVUE
+					const ref = this.$refs[el]
+					dom.getComponentRect(ref, res => {
+						resolve(res.size)
+					})
+					// #endif
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-list-item {}
+</style>
diff --git a/uni_modules/uview-plus/components/u-list/props.js b/uni_modules/uview-plus/components/u-list/props.js
new file mode 100644
index 0000000..2270dd1
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-list/props.js
@@ -0,0 +1,77 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 控制是否出现滚动条,仅nvue有效
+        showScrollbar: {
+            type: Boolean,
+            default: () => defProps.list.showScrollbar
+        },
+        // 距底部多少时触发scrolltolower事件
+        lowerThreshold: {
+            type: [String, Number],
+            default: () => defProps.list.lowerThreshold
+        },
+        // 距顶部多少时触发scrolltoupper事件,非nvue有效
+        upperThreshold: {
+            type: [String, Number],
+            default: () => defProps.list.upperThreshold
+        },
+        // 设置竖向滚动条位置
+        scrollTop: {
+            type: [String, Number],
+            default: () => defProps.list.scrollTop
+        },
+        // 控制 onscroll 事件触发的频率,仅nvue有效
+        offsetAccuracy: {
+            type: [String, Number],
+            default: () => defProps.list.offsetAccuracy
+        },
+        // 启用 flexbox 布局。开启后,当前节点声明了display: flex就会成为flex container,并作用于其孩子节点,仅微信小程序有效
+        enableFlex: {
+            type: Boolean,
+            default: () => defProps.list.enableFlex
+        },
+        // 是否按分页模式显示List,默认值false
+        pagingEnabled: {
+            type: Boolean,
+            default: () => defProps.list.pagingEnabled
+        },
+        // 是否允许List滚动
+        scrollable: {
+            type: Boolean,
+            default: () => defProps.list.scrollable
+        },
+        // 值应为某子元素id(id不能以数字开头)
+        scrollIntoView: {
+            type: String,
+            default: () => defProps.list.scrollIntoView
+        },
+        // 在设置滚动条位置时使用动画过渡
+        scrollWithAnimation: {
+            type: Boolean,
+            default: () => defProps.list.scrollWithAnimation
+        },
+        // iOS点击顶部状态栏、安卓双击标题栏时,滚动条返回顶部,只对微信小程序有效
+        enableBackToTop: {
+            type: Boolean,
+            default: () => defProps.list.enableBackToTop
+        },
+        // 列表的高度
+        height: {
+            type: [String, Number],
+            default: () => defProps.list.height
+        },
+        // 列表宽度
+        width: {
+            type: [String, Number],
+            default: () => defProps.list.width
+        },
+        // 列表前后预渲染的屏数,1代表一个屏幕的高度,1.5代表1个半屏幕高度
+        preLoadScreen: {
+            type: [String, Number],
+            default: () => defProps.list.preLoadScreen
+        }
+        // vue下,是否开启虚拟列表
+
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-list/u-list.vue b/uni_modules/uview-plus/components/u-list/u-list.vue
new file mode 100644
index 0000000..dd40cea
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-list/u-list.vue
@@ -0,0 +1,160 @@
+<template>
+	<!-- #ifdef APP-NVUE -->
+	<list
+		class="u-list"
+		:enableBackToTop="enableBackToTop"
+		:loadmoreoffset="lowerThreshold"
+		:showScrollbar="showScrollbar"
+		:style="[listStyle]"
+		:offset-accuracy="Number(offsetAccuracy)"
+		@scroll="onScroll"
+		@loadmore="scrolltolower"
+	>
+		<slot />
+	</list>
+	<!-- #endif -->
+	<!-- #ifndef APP-NVUE -->
+	<scroll-view
+		class="u-list"
+		:scroll-into-view="scrollIntoView"
+		:style="[listStyle]"
+		:scroll-y="scrollable"
+		:scroll-top="Number(scrollTop)"
+		:lower-threshold="Number(lowerThreshold)"
+		:upper-threshold="Number(upperThreshold)"
+		:show-scrollbar="showScrollbar"
+		:enable-back-to-top="enableBackToTop"
+		:scroll-with-animation="scrollWithAnimation"
+		@scroll="onScroll"
+		@scrolltolower="scrolltolower"
+		@scrolltoupper="scrolltoupper"
+	>
+		<view>
+			<slot />
+		</view>
+	</scroll-view>
+	<!-- #endif -->
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addUnit, addStyle, deepMerge, sleep, sys } from '../../libs/function/index';
+	// #ifdef APP-NVUE
+	const dom = uni.requireNativePlugin('dom')
+	// #endif
+	/**
+	 * List 列表
+	 * @description 该组件为高性能列表组件
+	 * @tutorial https://ijry.github.io/uview-plus/components/list.html
+	 * @property {Boolean}			showScrollbar		控制是否出现滚动条,仅nvue有效 (默认 false )
+	 * @property {String | Number}	lowerThreshold		距底部多少时触发scrolltolower事件 (默认 50 )
+	 * @property {String | Number}	upperThreshold		距顶部多少时触发scrolltoupper事件,非nvue有效 (默认 0 )
+	 * @property {String | Number}	scrollTop			设置竖向滚动条位置(默认 0 )
+	 * @property {String | Number}	offsetAccuracy		控制 onscroll 事件触发的频率,仅nvue有效(默认 10 )
+	 * @property {Boolean}			enableFlex			启用 flexbox 布局。开启后,当前节点声明了display: flex就会成为flex container,并作用于其孩子节点,仅微信小程序有效(默认 false )
+	 * @property {Boolean}			pagingEnabled		是否按分页模式显示List,(默认 false )
+	 * @property {Boolean}			scrollable			是否允许List滚动(默认 true )
+	 * @property {String}			scrollIntoView		值应为某子元素id(id不能以数字开头)
+	 * @property {Boolean}			scrollWithAnimation	在设置滚动条位置时使用动画过渡 (默认 false )
+	 * @property {Boolean}			enableBackToTop		iOS点击顶部状态栏、安卓双击标题栏时,滚动条返回顶部,只对微信小程序有效 (默认 false )
+	 * @property {String | Number}	height				列表的高度 (默认 0 )
+	 * @property {String | Number}	width				列表宽度 (默认 0 )
+	 * @property {String | Number}	preLoadScreen		列表前后预渲染的屏数,1代表一个屏幕的高度,1.5代表1个半屏幕高度  (默认 1 )
+	 * @property {Object}			customStyle			定义需要用到的外部样式
+	 *
+	 * @example <u-list @scrolltolower="scrolltolower"></u-list>
+	 */
+	export default {
+		name: 'u-list',
+		mixins: [mpMixin, mixin, props],
+		watch: {
+			scrollIntoView(n) {
+				this.scrollIntoViewById(n)
+			}
+		},
+		data() {
+			return {
+				// 记录内部滚动的距离
+				innerScrollTop: 0,
+				// vue下,scroll-view在上拉加载时的偏移值
+				offset: 0,
+				sys: sys()
+			}
+		},
+		computed: {
+			listStyle() {
+				const style = {};
+				if (this.width != 0) style.width = addUnit(this.width)
+				if (this.height != 0) style.height = addUnit(this.height)
+				// 如果没有定义列表高度,则默认使用屏幕高度
+				if (!style.height) style.height = addUnit(this.sys.windowHeight, 'px')
+				return deepMerge(style, addStyle(this.customStyle))
+			}
+		},
+		provide() {
+			return {
+				uList: this
+			}
+		},
+		created() {
+			this.refs = []
+			this.children = []
+			this.anchors = []
+		},
+		mounted() {},
+		emits: ["scroll", "scrolltolower", "scrolltoupper"],
+		methods: {
+			updateOffsetFromChild(top) {
+				this.offset = top
+			},
+			onScroll(e) {
+				let scrollTop = 0
+				// #ifdef APP-NVUE
+				scrollTop = e.contentOffset.y
+				// #endif
+				// #ifndef APP-NVUE
+				scrollTop = e.detail.scrollTop
+				// #endif
+				this.innerScrollTop = scrollTop
+				this.$emit('scroll', Math.abs(scrollTop))
+			},
+			scrollIntoViewById(id) {
+				// #ifdef APP-NVUE
+				// 根据id参数,找到所有u-list-item中匹配的节点,再通过dom模块滚动到对应的位置
+				const item = this.refs.find(item => item.$refs[id] ? true : false)
+				dom.scrollToElement(item.$refs[id], {
+					// 是否需要滚动动画
+					animated: this.scrollWithAnimation
+				})
+				// #endif
+			},
+			// 滚动到底部触发事件
+			scrolltolower(e) {
+				sleep(30).then(() => {
+					this.$emit('scrolltolower')
+				})
+			},
+			// #ifndef APP-NVUE
+			// 滚动到底部时触发,非nvue有效
+			scrolltoupper(e) {
+				sleep(30).then(() => {
+					this.$emit('scrolltoupper')
+					// 这一句很重要,能绝对保证在性功能障碍的webview,滚动条到顶时,取消偏移值,让页面置顶
+					this.offset = 0
+				})
+			}
+			// #endif
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-list {
+		@include flex(column);
+
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-loading-icon/props.js b/uni_modules/uview-plus/components/u-loading-icon/props.js
new file mode 100644
index 0000000..825452e
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-loading-icon/props.js
@@ -0,0 +1,60 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 是否显示组件
+        show: {
+            type: Boolean,
+            default: () => defProps.loadingIcon.show
+        },
+        // 颜色
+        color: {
+            type: String,
+            default: () => defProps.loadingIcon.color
+        },
+        // 提示文字颜色
+        textColor: {
+            type: String,
+            default: () => defProps.loadingIcon.textColor
+        },
+        // 文字和图标是否垂直排列
+        vertical: {
+            type: Boolean,
+            default: () => defProps.loadingIcon.vertical
+        },
+        // 模式选择,circle-圆形,spinner-花朵形,semicircle-半圆形
+        mode: {
+            type: String,
+            default: () => defProps.loadingIcon.mode
+        },
+        // 图标大小,单位默认px
+        size: {
+            type: [String, Number],
+            default: () => defProps.loadingIcon.size
+        },
+        // 文字大小
+        textSize: {
+            type: [String, Number],
+            default: () => defProps.loadingIcon.textSize
+        },
+        // 文字内容
+        text: {
+            type: [String, Number],
+            default: () => defProps.loadingIcon.text
+        },
+        // 动画模式
+        timingFunction: {
+            type: String,
+            default: () => defProps.loadingIcon.timingFunction
+        },
+        // 动画执行周期时间
+        duration: {
+            type: [String, Number],
+            default: () => defProps.loadingIcon.duration
+        },
+        // mode=circle时的暗边颜色
+        inactiveColor: {
+            type: String,
+            default: () => defProps.loadingIcon.inactiveColor
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-loading-icon/u-loading-icon.vue b/uni_modules/uview-plus/components/u-loading-icon/u-loading-icon.vue
new file mode 100644
index 0000000..baa4a2a
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-loading-icon/u-loading-icon.vue
@@ -0,0 +1,349 @@
+<template>
+	<view
+		class="u-loading-icon"
+		:style="[addStyle(customStyle)]"
+		:class="[vertical && 'u-loading-icon--vertical']"
+		v-if="show"
+	>
+		<view
+			v-if="!webviewHide"
+			class="u-loading-icon__spinner"
+			:class="[`u-loading-icon__spinner--${mode}`]"
+			ref="ani"
+			:style="{
+				color: color,
+				width: addUnit(size),
+				height: addUnit(size),
+				borderTopColor: color,
+				borderBottomColor: otherBorderColor,
+				borderLeftColor: otherBorderColor,
+				borderRightColor: otherBorderColor,
+				'animation-duration': `${duration}ms`,
+				'animation-timing-function': mode === 'semicircle' || mode === 'circle' ? timingFunction : ''
+			}"
+		>
+			<block v-if="mode === 'spinner'">
+				<!-- #ifndef APP-NVUE -->
+				<view
+					v-for="(item, index) in array12"
+					:key="index"
+					class="u-loading-icon__dot"
+				>
+				</view>
+				<!-- #endif -->
+				<!-- #ifdef APP-NVUE -->
+				<!-- 此组件内部图标部分无法设置宽高,即使通过width和height配置了也无效 -->
+				<loading-indicator
+					v-if="!webviewHide"
+					class="u-loading-indicator"
+					:animating="true"
+					:style="{
+						color: color,
+						width: addUnit(size),
+						height: addUnit(size)
+					}"
+				/>
+				<!-- #endif -->
+			</block>
+		</view>
+		<text
+			v-if="text"
+			class="u-loading-icon__text"
+			:style="{
+				fontSize: addUnit(textSize),
+				color: textColor,
+			}"
+		>{{text}}</text>
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addUnit, addStyle } from '../../libs/function/index';
+	import { colorGradient } from '../../libs/function/colorGradient';
+	// #ifdef APP-NVUE
+	const animation = weex.requireModule('animation');
+	// #endif
+	/**
+	 * loading 加载动画
+	 * @description 警此组件为一个小动画,目前用在uView的loadmore加载更多和switch开关等组件的正在加载状态场景。
+	 * @tutorial https://ijry.github.io/uview-plus/components/loading.html
+	 * @property {Boolean}			show			是否显示组件  (默认 true)
+	 * @property {String}			color			动画活动区域的颜色,只对 mode = flower 模式有效(默认color['u-tips-color'])
+	 * @property {String}			textColor		提示文本的颜色(默认color['u-tips-color'])
+	 * @property {Boolean}			vertical		文字和图标是否垂直排列 (默认 false )
+	 * @property {String}			mode			模式选择,见官网说明(默认 'circle' )
+	 * @property {String | Number}	size			加载图标的大小,单位px (默认 24 )
+	 * @property {String | Number}	textSize		文字大小(默认 15 )
+	 * @property {String | Number}	text			文字内容 
+	 * @property {String}			timingFunction	动画模式 (默认 'ease-in-out' )
+	 * @property {String | Number}	duration		动画执行周期时间(默认 1200)
+	 * @property {String}			inactiveColor	mode=circle时的暗边颜色 
+	 * @property {Object}			customStyle		定义需要用到的外部样式
+	 * @example <u-loading mode="circle"></u-loading>
+	 */
+	export default {
+		name: 'u-loading-icon',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				// Array.form可以通过一个伪数组对象创建指定长度的数组
+				// https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/from
+				array12: Array.from({
+					length: 12
+				}),
+				// 这里需要设置默认值为360,否则在安卓nvue上,会延迟一个duration周期后才执行
+				// 在iOS nvue上,则会一开始默认执行两个周期的动画
+				aniAngel: 360, // 动画旋转角度
+				webviewHide: false, // 监听webview的状态,如果隐藏了页面,则停止动画,以免性能消耗
+				loading: false, // 是否运行中,针对nvue使用
+			}
+		},
+		computed: {
+			// 当为circle类型时,给其另外三边设置一个更轻一些的颜色
+			// 之所以需要这么做的原因是,比如父组件传了color为红色,那么需要另外的三个边为浅红色
+			// 而不能是固定的某一个其他颜色(因为这个固定的颜色可能浅蓝,导致效果没有那么细腻良好)
+			otherBorderColor() {
+				const lightColor = colorGradient(this.color, '#ffffff', 100)[80]
+				if (this.mode === 'circle') {
+					return this.inactiveColor ? this.inactiveColor : lightColor
+				} else {
+					return 'transparent'
+				}
+				// return this.mode === 'circle' ? this.inactiveColor ? this.inactiveColor : lightColor : 'transparent'
+			}
+		},
+		watch: {
+			show(n) {
+				// nvue中,show为true,且为非loading状态,就重新执行动画模块
+				// #ifdef APP-NVUE
+				if (n && !this.loading) {
+					setTimeout(() => {
+						this.startAnimate()
+					}, 30)
+				}
+				// #endif
+			}
+		},
+		mounted() {
+			this.init()
+		},
+		methods: {
+			addUnit,
+			addStyle,
+			init() {
+				setTimeout(() => {
+					// #ifdef APP-NVUE
+					this.show && this.nvueAnimate()
+					// #endif
+					// #ifdef APP-PLUS 
+					this.show && this.addEventListenerToWebview()
+					// #endif
+				}, 20)
+			},
+			// 监听webview的显示与隐藏
+			addEventListenerToWebview() {
+				// webview的堆栈
+				const pages = getCurrentPages()
+				// 当前页面
+				const page = pages[pages.length - 1]
+				// 当前页面的webview实例
+				const currentWebview = page.$getAppWebview()
+				// 监听webview的显示与隐藏,从而停止或者开始动画(为了性能)
+				currentWebview.addEventListener('hide', () => {
+					this.webviewHide = true
+				})
+				currentWebview.addEventListener('show', () => {
+					this.webviewHide = false
+				})
+			},
+			// #ifdef APP-NVUE
+			nvueAnimate() {
+				// nvue下,非spinner类型时才需要旋转,因为nvue的spinner类型,使用了weex的
+				// loading-indicator组件,自带旋转功能
+				this.mode !== 'spinner' && this.startAnimate()
+			},
+			// 执行nvue的animate模块动画
+			startAnimate() {
+				this.loading = true
+				const ani = this.$refs.ani
+				if (!ani) return
+				animation.transition(ani, {
+					// 进行角度旋转
+					styles: {
+						transform: `rotate(${this.aniAngel}deg)`,
+						transformOrigin: 'center center'
+					},
+					duration: this.duration,
+					timingFunction: this.timingFunction,
+					// delay: 10
+				}, () => {
+					// 每次增加360deg,为了让其重新旋转一周
+					this.aniAngel += 360
+					// 动画结束后,继续循环执行动画,需要同时判断webviewHide变量
+					// nvue安卓,页面隐藏后依然会继续执行startAnimate方法
+					this.show && !this.webviewHide ? this.startAnimate() : this.loading = false
+				})
+			}
+			// #endif
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+	$u-loading-icon-color: #c8c9cc !default;
+	$u-loading-icon-text-margin-left:4px !default;
+	$u-loading-icon-text-color:$u-content-color !default;
+	$u-loading-icon-text-font-size:14px !default;
+	$u-loading-icon-text-line-height:20px !default;
+	$u-loading-width:30px !default;
+	$u-loading-height:30px !default;
+	$u-loading-max-width:100% !default;
+	$u-loading-max-height:100% !default;
+	$u-loading-semicircle-border-width: 2px !default;
+	$u-loading-semicircle-border-color:transparent !default;
+	$u-loading-semicircle-border-top-right-radius: 100px !default;
+	$u-loading-semicircle-border-top-left-radius: 100px !default;
+	$u-loading-semicircle-border-bottom-left-radius: 100px !default;
+	$u-loading-semicircle-border-bottom-right-radiu: 100px !default;
+	$u-loading-semicircle-border-style: solid !default;
+	$u-loading-circle-border-top-right-radius: 100px !default;
+	$u-loading-circle-border-top-left-radius: 100px !default;
+	$u-loading-circle-border-bottom-left-radius: 100px !default;
+	$u-loading-circle-border-bottom-right-radiu: 100px !default;
+	$u-loading-circle-border-width:2px !default;
+	$u-loading-circle-border-top-color:#e5e5e5 !default;
+	$u-loading-circle-border-right-color:$u-loading-circle-border-top-color !default;
+	$u-loading-circle-border-bottom-color:$u-loading-circle-border-top-color !default;
+	$u-loading-circle-border-left-color:$u-loading-circle-border-top-color !default;
+	$u-loading-circle-border-style:solid !default;
+	$u-loading-icon-host-font-size:0px !default;
+	$u-loading-icon-host-line-height:1 !default;
+	$u-loading-icon-vertical-margin:6px 0 0 !default;
+	$u-loading-icon-dot-top:0 !default;
+	$u-loading-icon-dot-left:0 !default;
+	$u-loading-icon-dot-width:100% !default;
+	$u-loading-icon-dot-height:100% !default;
+	$u-loading-icon-dot-before-width:2px !default;
+	$u-loading-icon-dot-before-height:25% !default;
+	$u-loading-icon-dot-before-margin:0 auto !default;
+	$u-loading-icon-dot-before-background-color:currentColor !default;
+	$u-loading-icon-dot-before-border-radius:40% !default;
+
+	.u-loading-icon {
+		/* #ifndef APP-NVUE */
+		// display: inline-flex;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		justify-content: center;
+		color: $u-loading-icon-color;
+
+		&__text {
+			margin-left: $u-loading-icon-text-margin-left;
+			color: $u-loading-icon-text-color;
+			font-size: $u-loading-icon-text-font-size;
+			line-height: $u-loading-icon-text-line-height;
+		}
+
+		&__spinner {
+			width: $u-loading-width;
+			height: $u-loading-height;
+			position: relative;
+			/* #ifndef APP-NVUE */
+			box-sizing: border-box;
+			max-width: $u-loading-max-width;
+			max-height: $u-loading-max-height;
+			animation: u-rotate 1s linear infinite;
+			/* #endif */
+		}
+
+		&__spinner--semicircle {
+			border-width: $u-loading-semicircle-border-width;
+			border-color: $u-loading-semicircle-border-color;
+			border-top-right-radius: $u-loading-semicircle-border-top-right-radius;
+			border-top-left-radius: $u-loading-semicircle-border-top-left-radius;
+			border-bottom-left-radius: $u-loading-semicircle-border-bottom-left-radius;
+			border-bottom-right-radius: $u-loading-semicircle-border-bottom-right-radiu;
+			border-style: $u-loading-semicircle-border-style;
+		}
+
+		&__spinner--circle {
+			border-top-right-radius: $u-loading-circle-border-top-right-radius;
+			border-top-left-radius: $u-loading-circle-border-top-left-radius;
+			border-bottom-left-radius: $u-loading-circle-border-bottom-left-radius;
+			border-bottom-right-radius: $u-loading-circle-border-bottom-right-radiu;
+			border-width: $u-loading-circle-border-width;
+			border-top-color: $u-loading-circle-border-top-color;
+			border-right-color: $u-loading-circle-border-right-color;
+			border-bottom-color: $u-loading-circle-border-bottom-color;
+			border-left-color: $u-loading-circle-border-left-color;
+			border-style: $u-loading-circle-border-style;
+		}
+
+		&--vertical {
+			flex-direction: column
+		}
+	}
+
+	/* #ifndef APP-NVUE */
+	:host {
+		font-size: $u-loading-icon-host-font-size;
+		line-height: $u-loading-icon-host-line-height;
+	}
+
+	.u-loading-icon {
+		&__spinner--spinner {
+			animation-timing-function: steps(12)
+		}
+
+		&__text:empty {
+			display: none
+		}
+
+		&--vertical &__text {
+			margin: $u-loading-icon-vertical-margin;
+			color: $u-content-color;
+		}
+
+		&__dot {
+			position: absolute;
+			top: $u-loading-icon-dot-top;
+			left: $u-loading-icon-dot-left;
+			width: $u-loading-icon-dot-width;
+			height: $u-loading-icon-dot-height;
+
+			&:before {
+				display: block;
+				width: $u-loading-icon-dot-before-width;
+				height: $u-loading-icon-dot-before-height;
+				margin: $u-loading-icon-dot-before-margin;
+				background-color: $u-loading-icon-dot-before-background-color;
+				border-radius: $u-loading-icon-dot-before-border-radius;
+				content: " "
+			}
+		}
+	}
+
+	@for $i from 1 through 12 {
+		.u-loading-icon__dot:nth-of-type(#{$i}) {
+			transform: rotate($i * 30deg);
+			opacity: 1 - 0.0625 * ($i - 1);
+		}
+	}
+
+	@keyframes u-rotate {
+		0% {
+			transform: rotate(0deg)
+		}
+
+		to {
+			transform: rotate(1turn)
+		}
+	}
+
+	/* #endif */
+</style>
diff --git a/uni_modules/uview-plus/components/u-loading-page/props.js b/uni_modules/uview-plus/components/u-loading-page/props.js
new file mode 100644
index 0000000..aa2d50c
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-loading-page/props.js
@@ -0,0 +1,50 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 提示内容
+        loadingText: {
+            type: [String, Number],
+            default: () => defProps.loadingPage.loadingText
+        },
+        // 文字上方用于替换loading动画的图片
+        image: {
+            type: String,
+            default: () => defProps.loadingPage.image
+        },
+        // 加载动画的模式,circle-圆形,spinner-花朵形,semicircle-半圆形
+        loadingMode: {
+            type: String,
+            default: () => defProps.loadingPage.loadingMode
+        },
+        // 是否加载中
+        loading: {
+            type: Boolean,
+            default: () => defProps.loadingPage.loading
+        },
+        // 背景色
+        bgColor: {
+            type: String,
+            default: () => defProps.loadingPage.bgColor
+        },
+        // 文字颜色
+        color: {
+            type: String,
+            default: () => defProps.loadingPage.color
+        },
+        // 文字大小
+        fontSize: {
+            type: [String, Number],
+            default: () => defProps.loadingPage.fontSize
+        },
+		// 图标大小
+		iconSize: {
+		    type: [String, Number],
+		    default: () => defProps.loadingPage.fontSize
+		},
+        // 加载中图标的颜色,只能rgb或者十六进制颜色值
+        loadingColor: {
+            type: String,
+            default: () => defProps.loadingPage.loadingColor
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-loading-page/u-loading-page.vue b/uni_modules/uview-plus/components/u-loading-page/u-loading-page.vue
new file mode 100644
index 0000000..0044a0c
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-loading-page/u-loading-page.vue
@@ -0,0 +1,120 @@
+<template>
+    <u-transition
+        :show="loading"
+        :custom-style="{
+            position: 'fixed',
+            top: 0,
+            left: 0,
+            right: 0,
+            bottom: 0,
+            backgroundColor: bgColor,
+            display: 'flex',
+        }"
+    >
+        <view class="u-loading-page">
+            <view class="u-loading-page__warpper">
+                <view class="u-loading-page__warpper__loading-icon">
+                    <image
+                        v-if="image"
+                        :src="image"
+                        class="u-loading-page__warpper__loading-icon__img"
+                        mode="widthFit"
+						:style="{
+							width: addUnit(iconSize),
+						    height: addUnit(iconSize)
+						}"
+                    ></image>
+                    <u-loading-icon
+                        v-else
+                        :mode="loadingMode"
+                        :size="addUnit(iconSize)"
+                        :color="loadingColor"
+                    ></u-loading-icon>
+                </view>
+                <slot>
+                    <text
+                        class="u-loading-page__warpper__text"
+                        :style="{
+                            fontSize: addUnit(fontSize),
+                            color: color,
+                        }"
+                        >{{ loadingText }}</text
+                    >
+                </slot>
+            </view>
+        </view>
+    </u-transition>
+</template>
+
+<script>
+import props from "./props.js";
+import mpMixin from '../../libs/mixin/mpMixin';
+import mixin from '../../libs/mixin/mixin';
+import { addUnit } from '../../libs/function/index';
+/**
+ * loadingPage 加载动画
+ * @description 警此组件为一个小动画,目前用在uView的loadmore加载更多和switch开关等组件的正在加载状态场景。
+ * @tutorial https://ijry.github.io/uview-plus/components/loading.html
+ * @property {String | Number}	loadingText		提示内容  (默认 '正在加载' )
+ * @property {String}			image			文字上方用于替换loading动画的图片
+ * @property {String}			loadingMode		加载动画的模式,circle-圆形,spinner-花朵形,semicircle-半圆形 (默认 'circle' )
+ * @property {Boolean}			loading			是否加载中 (默认 false )
+ * @property {String}			bgColor			背景色 (默认 '#ffffff' )
+ * @property {String}			color			文字颜色 (默认 '#C8C8C8' )
+ * @property {String | Number}	fontSize		文字大小 (默认 19 )
+ * @property {String | Number}	iconSize		图标大小 (默认 28 )
+ * @property {String}			loadingColor	加载中图标的颜色,只能rgb或者十六进制颜色值 (默认 '#C8C8C8' )
+ * @property {Object}			customStyle		自定义样式
+ * @example <u-loading mode="circle"></u-loading>
+ */
+export default {
+    name: "u-loading-page",
+    mixins: [mpMixin, mixin, props],
+    data() {
+        return {};
+    },
+    methods: {
+        addUnit
+    }
+};
+</script>
+
+<style lang="scss" scoped>
+@import "../../libs/css/components.scss";
+
+$text-color: rgb(200, 200, 200) !default;
+$text-size: 19px !default;
+$u-loading-icon-margin-bottom: 10px !default;
+
+.u-loading-page {
+    @include flex(column);
+    flex: 1;
+    align-items: center;
+    justify-content: center;
+
+    &__warpper {
+        margin-top: -150px;
+        justify-content: center;
+        align-items: center;
+        /* #ifndef APP-NVUE */
+        color: $text-color;
+        font-size: $text-size;
+        /* #endif */
+        @include flex(column);
+
+        &__loading-icon {
+            margin-bottom: $u-loading-icon-margin-bottom;
+
+            &__img {
+                width: 40px;
+                height: 40px;
+            }
+        }
+
+        &__text {
+            font-size: $text-size;
+            color: $text-color;
+        }
+    }
+}
+</style>
diff --git a/uni_modules/uview-plus/components/u-loadmore/props.js b/uni_modules/uview-plus/components/u-loadmore/props.js
new file mode 100644
index 0000000..927574a
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-loadmore/props.js
@@ -0,0 +1,95 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 组件状态,loadmore-加载前的状态,loading-加载中的状态,nomore-没有更多的状态
+        status: {
+            type: String,
+            default: () => defProps.loadmore.status
+        },
+        // 组件背景色
+        bgColor: {
+            type: String,
+            default: () => defProps.loadmore.bgColor
+        },
+        // 是否显示加载中的图标
+        icon: {
+            type: Boolean,
+            default: () => defProps.loadmore.icon
+        },
+        // 字体大小
+        fontSize: {
+            type: [String, Number],
+            default: () => defProps.loadmore.fontSize
+        },
+		    // 图标大小
+        iconSize: {
+            type: [String, Number],
+            default: () => defProps.loadmore.iconSize
+        },
+        // 字体颜色
+        color: {
+            type: String,
+            default: () => defProps.loadmore.color
+        },
+        // 加载中状态的图标,spinner-花朵状图标,circle-圆圈状,semicircle-半圆
+        loadingIcon: {
+            type: String,
+            default: () => defProps.loadmore.loadingIcon
+        },
+        // 加载前的提示语
+        loadmoreText: {
+            type: String,
+            default: () => defProps.loadmore.loadmoreText
+        },
+        // 加载中提示语
+        loadingText: {
+            type: String,
+            default: () => defProps.loadmore.loadingText
+        },
+        // 没有更多的提示语
+        nomoreText: {
+            type: String,
+            default: () => defProps.loadmore.nomoreText
+        },
+        // 在“没有更多”状态下,是否显示粗点
+        isDot: {
+            type: Boolean,
+            default: () => defProps.loadmore.isDot
+        },
+        // 加载中图标的颜色
+        iconColor: {
+            type: String,
+            default: () => defProps.loadmore.iconColor
+        },
+        // 上边距
+        marginTop: {
+            type: [String, Number],
+            default: () => defProps.loadmore.marginTop
+        },
+        // 下边距
+        marginBottom: {
+            type: [String, Number],
+            default: () => defProps.loadmore.marginBottom
+        },
+        // 高度,单位px
+        height: {
+            type: [String, Number],
+            default: () => defProps.loadmore.height
+        },
+        // 是否显示左边分割线
+        line: {
+            type: Boolean,
+            default: () => defProps.loadmore.line
+        },
+        // 线条颜色
+        lineColor: {
+            type: String,
+            default: () => defProps.loadmore.lineColor
+        },
+        // 是否虚线,true-虚线,false-实线
+        dashed: {
+            type: Boolean,
+            default: () => defProps.loadmore.dashed
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-loadmore/u-loadmore.vue b/uni_modules/uview-plus/components/u-loadmore/u-loadmore.vue
new file mode 100644
index 0000000..e5654d5
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-loadmore/u-loadmore.vue
@@ -0,0 +1,155 @@
+<template>
+	<view
+	    class="u-loadmore"
+	    :style="[
+			addStyle(customStyle),
+			{
+				backgroundColor: bgColor,
+				marginBottom: addUnit(marginBottom),
+				marginTop: addUnit(marginTop),
+				height: addUnit(height),
+			},
+		]"
+	>
+		<u-line
+		    length="140rpx"
+		    :color="lineColor"
+		    :hairline="false"
+			:dashed="dashed"
+			v-if="line"
+		></u-line>
+		<!-- 加载中和没有更多的状态才显示两边的横线 -->
+		<view
+		    :class="status == 'loadmore' || status == 'nomore' ? 'u-more' : ''"
+		    class="u-loadmore__content"
+		>
+			<view
+			    class="u-loadmore__content__icon-wrap"
+			    v-if="status === 'loading' && icon"
+			>
+				<u-loading-icon
+				    :color="iconColor"
+				    :size="iconSize"
+				    :mode="loadingIcon"
+				></u-loading-icon>
+			</view>
+			<!-- 如果没有更多的状态下,显示内容为dot(粗点),加载特定样式 -->
+			<text
+			    class="u-line-1"
+			    :style="[loadTextStyle]"
+			    :class="[(status == 'nomore' && isDot == true) ? 'u-loadmore__content__dot-text' : 'u-loadmore__content__text']"
+			    @tap="loadMore"
+			>{{ showText }}</text>
+		</view>
+		<u-line
+		    length="140rpx"
+		    :color="lineColor"
+			:hairline="false"
+			:dashed="dashed"
+			v-if="line"
+		></u-line>
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addUnit, addStyle } from '../../libs/function/index';
+	/**
+	 * loadmore 加载更多
+	 * @description 此组件一般用于标识页面底部加载数据时的状态。
+	 * @tutorial https://ijry.github.io/uview-plus/components/loadMore.html
+	 * @property {String}			status			组件状态(默认 'loadmore' )
+	 * @property {String}			bgColor			组件背景颜色,在页面是非白色时会用到(默认 'transparent' )
+	 * @property {Boolean}			icon			加载中时是否显示图标(默认 true )
+	 * @property {String | Number}	fontSize		字体大小(默认 14 )
+	 * @property {String | Number}	iconSize		图标大小(默认 17 )
+	 * @property {String}			color			字体颜色(默认 '#606266' )
+	 * @property {String}			loadingIcon		加载图标(默认 'circle' )
+	 * @property {String}			loadmoreText	加载前的提示语(默认 '加载更多' )
+	 * @property {String}			loadingText		加载中提示语(默认 '正在加载...' )
+	 * @property {String}			nomoreText		没有更多的提示语(默认 '没有更多了' )
+	 * @property {Boolean}			isDot			到上一个相邻元素的距离 (默认 false )
+	 * @property {String}			iconColor		加载中图标的颜色 (默认 '#b7b7b7' )
+	 * @property {String}			lineColor		线条颜色(默认 #E6E8EB )
+	 * @property {String | Number}	marginTop		上边距 (默认 10 )
+	 * @property {String | Number}	marginBottom	下边距 (默认 10 )
+	 * @property {String | Number}	height			高度,单位px (默认 'auto' )
+	 * @property {Boolean}			line			是否显示左边分割线  (默认 false )
+	 * @property {Boolean}			dashed		// 是否虚线,true-虚线,false-实线  (默认 false )
+	 * @event {Function} loadmore status为loadmore时,点击组件会发出此事件
+	 * @example <u-loadmore :status="status" icon-type="iconType" load-text="loadText" />
+	 */
+	export default {
+		name: "u-loadmore",
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				// 粗点
+				dotText: "●"
+			}
+		},
+		computed: {
+			// 加载的文字显示的样式
+			loadTextStyle() {
+				return {
+					color: this.color,
+					fontSize: addUnit(this.fontSize),
+					lineHeight: addUnit(this.fontSize),
+					backgroundColor: this.bgColor,
+				}
+			},
+			// 显示的提示文字
+			showText() {
+				let text = '';
+				if (this.status == 'loadmore') text = this.loadmoreText
+				else if (this.status == 'loading') text = this.loadingText
+				else if (this.status == 'nomore' && this.isDot) text = this.dotText;
+				else text = this.nomoreText;
+				return text;
+			}
+		},
+		emits: ["loadmore"],
+		methods: {
+			addStyle,
+			addUnit,
+			loadMore() {
+				// 只有在“加载更多”的状态下才发送点击事件,内容不满一屏时无法触发底部上拉事件,所以需要点击来触发
+				if (this.status == 'loadmore') this.$emit('loadmore');
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-loadmore {
+		@include flex(row);
+		align-items: center;
+		justify-content: center;
+		flex: 1;
+
+		&__content {
+			margin: 0 15px;
+			@include flex(row);
+			align-items: center;
+			justify-content: center;
+
+			&__icon-wrap {
+				margin-right: 8px;
+			}
+
+			&__text {
+				font-size: 14px;
+				color: $u-content-color;
+			}
+
+			&__dot-text {
+				font-size: 15px;
+				color: $u-tips-color;
+			}
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-message-input/u-message-input.vue b/uni_modules/uview-plus/components/u-message-input/u-message-input.vue
new file mode 100644
index 0000000..0da5f1c
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-message-input/u-message-input.vue
@@ -0,0 +1,318 @@
+<template>
+	<view class="u-char-box">
+		<view class="u-char-flex">
+			<input :disabled="disabledKeyboard" :value="valueModel" type="number" :focus="focus" :maxlength="maxlength" class="u-input" @input="getVal"/>
+			<view v-for="(item, index) in loopCharArr" :key="index">
+				<view :class="[breathe && charArrLength == index ? 'u-breathe' : '', 'u-char-item',
+				charArrLength === index && mode == 'box' ? 'u-box-active' : '',
+				mode === 'box' ? 'u-box' : '']" :style="{
+					fontWeight: bold ? 'bold' : 'normal',
+					fontSize: fontSize + 'rpx',
+					width: width + 'rpx',
+					height: width + 'rpx',
+					color: inactiveColor,
+					borderColor: charArrLength === index && mode == 'box' ? activeColor : inactiveColor
+				}">
+					<view class="u-placeholder-line" :style="{
+							display: charArrLength === index ? 'block' : 'none',
+							height: width * 0.5 +'rpx'
+						}"
+						v-if="mode !== 'middleLine'"
+					></view>
+					<view v-if="mode === 'middleLine' && charArrLength <= index" :class="[breathe && charArrLength == index ? 'u-breathe' : '', charArrLength === index ? 'u-middle-line-active' : '']"
+					 class="u-middle-line" :style="{height: bold ? '4px' : '2px', background: charArrLength === index ? activeColor : inactiveColor}"></view>
+					<view v-if="mode === 'bottomLine'" :class="[breathe && charArrLength == index ? 'u-breathe' : '', charArrLength === index ? 'u-bottom-line-active' : '']"
+					 class="u-bottom-line" :style="{height: bold ? '4px' : '2px', background: charArrLength === index ? activeColor : inactiveColor}"></view>
+					<block v-if="!dotFill"> {{ charArr[index] ? charArr[index] : ''}}</block>
+					<block v-else>
+						<text class="u-dot">{{ charArr[index] ? '●' : ''}}</text>
+					</block>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * messageInput 验证码输入框
+	 * @description 该组件一般用于验证用户短信验证码的场景,也可以结合uView的键盘组件使用
+	 * @tutorial https://www.uviewui.com/components/messageInput.html
+	 * @property {String Number} maxlength 输入字符个数(默认4)
+	 * @property {Boolean} dot-fill 是否用圆点填充(默认false)
+	 * @property {String} mode 模式选择,见上方"基本使用"说明(默认box)
+	 * @property {String Number} value 预置值
+	 * @property {Boolean} breathe 是否开启呼吸效果,见上方说明(默认true)
+	 * @property {Boolean} focus 是否自动获取焦点(默认false)
+	 * @property {Boolean} bold 字体和输入横线是否加粗(默认true)
+	 * @property {String Number} font-size 字体大小,单位rpx(默认60)
+	 * @property {String} active-color 当前激活输入框的样式(默认#2979ff)
+	 * @property {String} inactive-color 非激活输入框的样式,文字颜色同此值(默认#606266)
+	 * @property {String | Number} width 输入框宽度,单位rpx,高等于宽(默认80)
+	 * @property {Boolean} disabled-keyboard 禁止点击输入框唤起系统键盘(默认false)
+	 * @event {Function} change 输入内容发生改变时触发,具体见官网说明
+	 * @event {Function} finish 输入字符个数达maxlength值时触发,见官网说明
+	 * @example <u-message-input mode="bottomLine"></u-message-input>
+	 */
+	export default {
+		name: "u-message-input",
+		props: {
+			// 最大输入长度
+			maxlength: {
+				type: [Number, String],
+				default: 4
+			},
+			// 是否用圆点填充
+			dotFill: {
+				type: Boolean,
+				default: false
+			},
+			// 显示模式,box-盒子模式,bottomLine-横线在底部模式,middleLine-横线在中部模式
+			mode: {
+				type: String,
+				default: "box"
+			},
+			// 预置值
+			modelValue: {
+				type: [String, Number],
+				default: ''
+			},
+			// 当前激活输入item,是否带有呼吸效果
+			breathe: {
+				type: Boolean,
+				default: true
+			},
+			// 是否自动获取焦点
+			focus: {
+				type: Boolean,
+				default: false
+			},
+			// 字体是否加粗
+			bold: {
+				type: Boolean,
+				default: false
+			},
+			// 字体大小
+			fontSize: {
+				type: [String, Number],
+				default: 60
+			},
+			// 激活样式
+			activeColor: {
+				type: String,
+				default: '#2979ff'
+			},
+			// 未激活的样式
+			inactiveColor: {
+				type: String,
+				default: '#606266'
+			},
+			// 输入框的大小,单位rpx,宽等于高
+			width: {
+				type: [Number, String],
+				default: '80'
+			},
+			// 是否隐藏原生键盘,如果想用自定义键盘的话,需设置此参数为true
+			disabledKeyboard: {
+				type: Boolean,
+				default: false
+			}
+		},
+		watch: {
+			// maxlength: {
+			// 	// 此值设置为true,会在组件加载后无需maxlength变化就会执行一次本监听函数,无需再created生命周期中处理
+			// 	immediate: true,
+			// 	handler(val) {
+			// 		this.maxlength = Number(val);
+			// 	}
+			// }, 
+			modelValue: {
+				immediate: true,
+				handler(val) {
+					// 转为字符串
+					val = String(val);
+					// 超出部分截掉
+					this.valueModel = val.substring(0, this.maxlength);
+				}
+			},
+		},
+		data() {
+			return {
+				valueModel: ""
+			}
+		},
+		emits: ['change', 'finish'],
+		computed: {
+			// 是否显示呼吸灯效果
+			animationClass() {
+				return (index) => {
+					if (this.breathe && this.charArr.length == index) return 'u-breathe';
+					else return '';
+				}
+			},
+			// 用于显示字符
+			charArr() {
+				return this.valueModel.split('');
+			},
+			charArrLength() {
+				return this.charArr.length;
+			},
+			// 根据长度,循环输入框的个数,因为头条小程序数值不能用于v-for
+			loopCharArr() {
+				return new Array(this.maxlength);
+			}
+		},
+		methods: {
+			getVal(e) {
+				let {
+					value
+				} = e.detail
+				this.valueModel = value;
+				// 判断长度是否超出了maxlength值,理论上不会发生,因为input组件设置了maxlength属性值
+				if (String(value).length > this.maxlength) return;
+				// 未达到maxlength之前,发送change事件,达到后发送finish事件
+				this.$emit('change', value);
+				if (String(value).length == this.maxlength) {
+					this.$emit('finish', value);
+				}
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	// 定义混入指令,用于在非nvue环境下的flex定义,因为nvue没有display属性,会报错
+	@mixin vue-flex($direction: row) {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		flex-direction: $direction;
+		/* #endif */
+	}
+
+	@keyframes breathe {
+		0% {
+			opacity: 0.3;
+		}
+
+		50% {
+			opacity: 1;
+		}
+
+		100% {
+			opacity: 0.3;
+		}
+	}
+
+	.u-char-box {
+		text-align: center;
+	}
+
+	.u-char-flex {
+		@include vue-flex;
+		justify-content: center;
+		flex-wrap: wrap;
+		position: relative;
+	}
+
+	.u-input {
+		position: absolute;
+		top: 0;
+		left: -100%;
+		width: 200%;
+		height: 100%;
+		text-align: left;
+		z-index: 9;
+		opacity: 0;
+		background: none;
+	}
+
+	.u-char-item {
+		position: relative;
+		width: 90rpx;
+		height: 90rpx;
+		margin: 10rpx 10rpx;
+		font-size: 60rpx;
+		font-weight: bold;
+		color: $u-main-color;
+		line-height: 90rpx;
+		@include vue-flex;
+		justify-content: center;
+		align-items: center;
+	}
+
+	.u-middle-line {
+		border: none;
+	}
+
+	.u-box {
+		box-sizing: border-box;
+		border: 2rpx solid #cccccc;
+		border-radius: 6rpx;
+	}
+
+	.u-box-active {
+		overflow: hidden;
+		animation-timing-function: ease-in-out;
+		animation-duration: 1500ms;
+		animation-iteration-count: infinite;
+		animation-direction: alternate;
+		border: 2rpx solid $u-primary;
+	}
+
+	.u-middle-line-active {
+		background: $u-primary;
+	}
+
+	.u-breathe {
+		animation: breathe 2s infinite ease;
+	}
+
+	.u-placeholder-line {
+		/* #ifndef APP-NVUE */
+		display: none;
+		/* #endif */
+		position: absolute;
+		left: 50%;
+		top: 50%;
+		transform: translate(-50%, -50%);
+		width: 2rpx;
+		height: 40rpx;
+		background: #333333;
+		animation: twinkling 1.5s infinite ease;
+	}
+
+	.u-animation-breathe {
+		animation-name: breathe;
+	}
+
+	.u-dot {
+		font-size: 34rpx;
+		line-height: 34rpx;
+	}
+
+	.u-middle-line {
+		height: 4px;
+		background: #000000;
+		width: 80%;
+		position: absolute;
+		border-radius: 2px;
+		top: 50%;
+		left: 50%;
+		transform: translate(-50%, -50%);
+	}
+
+	.u-bottom-line-active {
+		background: $u-primary;
+	}
+
+	.u-bottom-line {
+		height: 4px;
+		background: #000000;
+		width: 80%;
+		position: absolute;
+		border-radius: 2px;
+		bottom: 0;
+		left: 50%;
+		transform: translate(-50%);
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-modal/props.js b/uni_modules/uview-plus/components/u-modal/props.js
new file mode 100644
index 0000000..b4bb168
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-modal/props.js
@@ -0,0 +1,85 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 是否展示modal
+        show: {
+            type: Boolean,
+            default: () => defProps.modal.show
+        },
+        // 标题
+        title: {
+            type: [String],
+            default: () => defProps.modal.title
+        },
+        // 弹窗内容
+        content: {
+            type: String,
+            default: () => defProps.modal.content
+        },
+        // 确认文案
+        confirmText: {
+            type: String,
+            default: () => defProps.modal.confirmText
+        },
+        // 取消文案
+        cancelText: {
+            type: String,
+            default: () => defProps.modal.cancelText
+        },
+        // 是否显示确认按钮
+        showConfirmButton: {
+            type: Boolean,
+            default: () => defProps.modal.showConfirmButton
+        },
+        // 是否显示取消按钮
+        showCancelButton: {
+            type: Boolean,
+            default: () => defProps.modal.showCancelButton
+        },
+        // 确认按钮颜色
+        confirmColor: {
+            type: String,
+            default: () => defProps.modal.confirmColor
+        },
+        // 取消文字颜色
+        cancelColor: {
+            type: String,
+            default: () => defProps.modal.cancelColor
+        },
+        // 对调确认和取消的位置
+        buttonReverse: {
+            type: Boolean,
+            default: () => defProps.modal.buttonReverse
+        },
+        // 是否开启缩放效果
+        zoom: {
+            type: Boolean,
+            default: () => defProps.modal.zoom
+        },
+        // 是否异步关闭,只对确定按钮有效
+        asyncClose: {
+            type: Boolean,
+            default: () => defProps.modal.asyncClose
+        },
+        // 是否允许点击遮罩关闭modal
+        closeOnClickOverlay: {
+            type: Boolean,
+            default: () => defProps.modal.closeOnClickOverlay
+        },
+        // 给一个负的margin-top,往上偏移,避免和键盘重合的情况
+        negativeTop: {
+            type: [String, Number],
+            default: () => defProps.modal.negativeTop
+        },
+        // modal宽度,不支持百分比,可以数值,px,rpx单位
+        width: {
+            type: [String, Number],
+            default: () => defProps.modal.width
+        },
+        // 确认按钮的样式,circle-圆形,square-方形,如设置,将不会显示取消按钮
+        confirmButtonShape: {
+            type: String,
+            default: () => defProps.modal.confirmButtonShape
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-modal/u-modal.vue b/uni_modules/uview-plus/components/u-modal/u-modal.vue
new file mode 100644
index 0000000..aa9b673
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-modal/u-modal.vue
@@ -0,0 +1,233 @@
+<template>
+	<u-popup
+		mode="center"
+		:zoom="zoom"
+		:show="show"
+		:customStyle="{
+			borderRadius: '6px', 
+			overflow: 'hidden',
+			marginTop: `-${addUnit(negativeTop)}`
+		}"
+		:closeOnClickOverlay="closeOnClickOverlay"
+		:safeAreaInsetBottom="false"
+		:duration="400"
+		@click="clickHandler"
+	>
+		<view
+			class="u-modal"
+			:style="{
+				width: addUnit(width),
+			}"
+		>
+			<text
+				class="u-modal__title"
+				v-if="title"
+			>{{ title }}</text>
+			<view
+				class="u-modal__content"
+				:style="{
+					paddingTop: `${title ? 12 : 25}px`
+				}"
+			>
+				<slot>
+					<text class="u-modal__content__text">{{ content }}</text>
+				</slot>
+			</view>
+			<view
+				class="u-modal__button-group--confirm-button"
+				v-if="$slots.confirmButton"
+			>
+				<slot name="confirmButton"></slot>
+			</view>
+			<template v-else>
+				<u-line></u-line>
+				<view
+					class="u-modal__button-group"
+					:style="{
+						flexDirection: buttonReverse ? 'row-reverse' : 'row'
+					}"
+				>
+					<view
+						class="u-modal__button-group__wrapper u-modal__button-group__wrapper--cancel"
+						:hover-stay-time="150"
+						hover-class="u-modal__button-group__wrapper--hover"
+						:class="[showCancelButton && !showConfirmButton && 'u-modal__button-group__wrapper--only-cancel']"
+						v-if="showCancelButton"
+						@tap="cancelHandler"
+					>
+						<text
+							class="u-modal__button-group__wrapper__text"
+							:style="{
+								color: cancelColor
+							}"
+						>{{ cancelText }}</text>
+					</view>
+					<u-line
+						direction="column"
+						v-if="showConfirmButton && showCancelButton"
+					></u-line>
+					<view
+						class="u-modal__button-group__wrapper u-modal__button-group__wrapper--confirm"
+						:hover-stay-time="150"
+						hover-class="u-modal__button-group__wrapper--hover"
+						:class="[!showCancelButton && showConfirmButton && 'u-modal__button-group__wrapper--only-confirm']"
+						v-if="showConfirmButton"
+						@tap="confirmHandler"
+					>
+						<u-loading-icon v-if="loading"></u-loading-icon>
+						<text
+							v-else
+							class="u-modal__button-group__wrapper__text"
+							:style="{
+								color: confirmColor
+							}"
+						>{{ confirmText }}</text>
+					</view>
+				</view>
+			</template>
+		</view>
+	</u-popup>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addUnit } from '../../libs/function/index';
+	/**
+	 * Modal 模态框
+	 * @description 弹出模态框,常用于消息提示、消息确认、在当前页面内完成特定的交互操作。
+	 * @tutorial https://ijry.github.io/uview-plus/components/modul.html
+	 * @property {Boolean}			show				是否显示模态框,请赋值给show (默认 false )
+	 * @property {String}			title				标题内容
+	 * @property {String}			content				模态框内容,如传入slot内容,则此参数无效
+	 * @property {String}			confirmText			确认按钮的文字 (默认 '确认' )
+	 * @property {String}			cancelText			取消按钮的文字 (默认 '取消' )
+	 * @property {Boolean}			showConfirmButton	是否显示确认按钮 (默认 true )
+	 * @property {Boolean}			showCancelButton	是否显示取消按钮 (默认 false )
+	 * @property {String}			confirmColor		确认按钮的颜色 (默认 '#2979ff' )
+	 * @property {String}			cancelColor			取消按钮的颜色 (默认 '#606266' )
+	 * @property {Boolean}			buttonReverse		对调确认和取消的位置 (默认 false )
+	 * @property {Boolean}			zoom				是否开启缩放模式 (默认 true )
+	 * @property {Boolean}			asyncClose			是否异步关闭,只对确定按钮有效,见上方说明 (默认 false )
+	 * @property {Boolean}			closeOnClickOverlay	是否允许点击遮罩关闭Modal (默认 false )
+	 * @property {String | Number}	negativeTop			往上偏移的值,给一个负的margin-top,往上偏移,避免和键盘重合的情况,单位任意,数值则默认为px单位 (默认 0 )
+	 * @property {String | Number}	width				modal宽度,不支持百分比,可以数值,px,rpx单位 (默认 '650rpx' )
+	 * @property {String}			confirmButtonShape	确认按钮的样式,如设置,将不会显示取消按钮
+	 * @event {Function} confirm	点击确认按钮时触发
+	 * @event {Function} cancel		点击取消按钮时触发
+	 * @event {Function} close		点击遮罩关闭出发,closeOnClickOverlay为true有效
+	 * @example <u-loadmore :status="status" icon-type="iconType" load-text="loadText" />
+	 */
+	export default {
+		name: 'u-modal',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				loading: false
+			}
+		},
+		watch: {
+			show(n) {
+				// 为了避免第一次打开modal,又使用了异步关闭的loading
+				// 第二次打开modal时,loading依然存在的情况
+				if (n && this.loading) this.loading = false
+			}
+		},
+		emits: ["confirm", "cancel", "close"],
+		methods: {
+			addUnit,
+			// 点击确定按钮
+			confirmHandler() {
+				// 如果配置了异步关闭,将按钮值为loading状态
+				if (this.asyncClose) {
+					this.loading = true;
+				}
+				this.$emit('confirm')
+			},
+			// 点击取消按钮
+			cancelHandler() {
+				this.$emit('cancel')
+			},
+			// 点击遮罩
+			// 从原理上来说,modal的遮罩点击,并不是真的点击到了遮罩
+			// 因为modal依赖于popup的中部弹窗类型,中部弹窗比较特殊,虽有然遮罩,但是为了让弹窗内容能flex居中
+			// 多了一个透明的遮罩,此透明的遮罩会覆盖在灰色的遮罩上,所以实际上是点击不到灰色遮罩的,popup内部在
+			// 透明遮罩的子元素做了.stop处理,所以点击内容区,也不会导致误触发
+			clickHandler() {
+				if (this.closeOnClickOverlay) {
+					this.$emit('close')
+				}
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+	$u-modal-border-radius: 6px;
+
+	.u-modal {
+		width: 650rpx;
+		border-radius: $u-modal-border-radius;
+		overflow: hidden;
+
+		&__title {
+			display: block;
+			font-size: 16px;
+			font-weight: bold;
+			color: $u-content-color;
+			text-align: center;
+			padding-top: 25px;
+		}
+
+		&__content {
+			padding: 12px 25px 25px 25px;
+			@include flex;
+			justify-content: center;
+
+			&__text {
+				font-size: 15px;
+				color: $u-content-color;
+				flex: 1;
+			}
+		}
+
+		&__button-group {
+			@include flex;
+
+			&--confirm-button {
+				flex-direction: column;
+				padding: 0px 25px 15px 25px;
+			}
+
+			&__wrapper {
+				flex: 1;
+				@include flex;
+				justify-content: center;
+				align-items: center;
+				height: 48px;
+				
+				&--confirm,
+				&--only-cancel {
+					border-bottom-right-radius: $u-modal-border-radius;
+				}
+				
+				&--cancel,
+				&--only-confirm {
+					border-bottom-left-radius: $u-modal-border-radius;
+				}
+
+				&--hover {
+					background-color: $u-bg-color;
+				}
+
+				&__text {
+					color: $u-content-color;
+					font-size: 16px;
+					text-align: center;
+				}
+			}
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-navbar/props.js b/uni_modules/uview-plus/components/u-navbar/props.js
new file mode 100644
index 0000000..87ba882
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-navbar/props.js
@@ -0,0 +1,85 @@
+import defProps from '../../libs/config/props.js';
+export default {
+	props: {
+		// 是否开启顶部安全区适配
+		safeAreaInsetTop: {
+			type: Boolean,
+			default: () => defProps.navbar.safeAreaInsetTop
+		},
+		// 固定在顶部时,是否生成一个等高元素,以防止塌陷
+		placeholder: {
+			type: Boolean,
+			default: () => defProps.navbar.placeholder
+		},
+		// 是否固定在顶部
+		fixed: {
+			type: Boolean,
+			default: () => defProps.navbar.fixed
+		},
+		// 是否显示下边框
+		border: {
+			type: Boolean,
+			default: () => defProps.navbar.border
+		},
+		// 左边的图标
+		leftIcon: {
+			type: String,
+			default: () => defProps.navbar.leftIcon
+		},
+		// 左边的提示文字
+		leftText: {
+			type: String,
+			default: () => defProps.navbar.leftText
+		},
+		// 左右的提示文字
+		rightText: {
+			type: String,
+			default: () => defProps.navbar.rightText
+		},
+		// 右边的图标
+		rightIcon: {
+			type: String,
+			default: () => defProps.navbar.rightIcon
+		},
+		// 标题
+		title: {
+			type: [String, Number],
+			default: () => defProps.navbar.title
+		},
+		// 背景颜色
+		bgColor: {
+			type: String,
+			default: () => defProps.navbar.bgColor
+		},
+		// 标题的宽度
+		titleWidth: {
+			type: [String, Number],
+			default: () => defProps.navbar.titleWidth
+		},
+		// 导航栏高度
+		height: {
+			type: [String, Number],
+			default: () => defProps.navbar.height
+		},
+		// 左侧返回图标的大小
+		leftIconSize: {
+			type: [String, Number],
+			default: () => defProps.navbar.leftIconSize
+		},
+		// 左侧返回图标的颜色
+		leftIconColor: {
+			type: String,
+			default: () => defProps.navbar.leftIconColor
+		},
+		// 点击左侧区域(返回图标),是否自动返回上一页
+		autoBack: {
+			type: Boolean,
+			default: () => defProps.navbar.autoBack
+		},
+		// 标题的样式,对象或字符串
+		titleStyle: {
+			type: [String, Object],
+			default: () => defProps.navbar.titleStyle
+		}
+	}
+}
diff --git a/uni_modules/uview-plus/components/u-navbar/u-navbar.vue b/uni_modules/uview-plus/components/u-navbar/u-navbar.vue
new file mode 100644
index 0000000..8d10eb9
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-navbar/u-navbar.vue
@@ -0,0 +1,193 @@
+<template>
+	<view class="u-navbar">
+		<view
+			class="u-navbar__placeholder"
+			v-if="fixed && placeholder"
+			:style="{
+				height: addUnit(getPx(height) + sys().statusBarHeight,'px'),
+			}"
+		></view>
+		<view :class="[fixed && 'u-navbar--fixed']">
+			<u-status-bar
+				v-if="safeAreaInsetTop"
+				:bgColor="bgColor"
+			></u-status-bar>
+			<view
+				class="u-navbar__content"
+				:class="[border && 'u-border-bottom']"
+				:style="{
+					height: addUnit(height),
+					backgroundColor: bgColor,
+				}"
+			>
+				<view
+					class="u-navbar__content__left"
+					hover-class="u-navbar__content__left--hover"
+					hover-start-time="150"
+					@tap="leftClick"
+				>
+					<slot name="left">
+						<u-icon
+							v-if="leftIcon"
+							:name="leftIcon"
+							:size="leftIconSize"
+							:color="leftIconColor"
+						></u-icon>
+						<text
+							v-if="leftText"
+							:style="{
+								color: leftIconColor
+							}"
+							class="u-navbar__content__left__text"
+						>{{ leftText }}</text>
+					</slot>
+				</view>
+				<slot name="center">
+					<text
+						class="u-line-1 u-navbar__content__title"
+						:style="[{
+							width: addUnit(titleWidth),
+						}, addStyle(titleStyle)]"
+					>{{ title }}</text>
+				</slot>
+				<view
+					class="u-navbar__content__right"
+					v-if="$slots.right || rightIcon || rightText"
+					@tap="rightClick"
+				>
+					<slot name="right">
+						<u-icon
+							v-if="rightIcon"
+							:name="rightIcon"
+							size="20"
+						></u-icon>
+						<text
+							v-if="rightText"
+							class="u-navbar__content__right__text"
+						>{{ rightText }}</text>
+					</slot>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addUnit, addStyle, getPx, sys } from '../../libs/function/index';
+	/**
+	 * Navbar 自定义导航栏
+	 * @description 此组件一般用于在特殊情况下,需要自定义导航栏的时候用到,一般建议使用uni-app带的导航栏。
+	 * @tutorial https://ijry.github.io/uview-plus/components/navbar.html
+	 * @property {Boolean}			safeAreaInsetTop	是否开启顶部安全区适配  (默认 true )
+	 * @property {Boolean}			placeholder			固定在顶部时,是否生成一个等高元素,以防止塌陷 (默认 false )
+	 * @property {Boolean}			fixed				导航栏是否固定在顶部 (默认 false )
+	 * @property {Boolean}			border				导航栏底部是否显示下边框 (默认 false )
+	 * @property {String}			leftIcon			左边返回图标的名称,只能为uView自带的图标 (默认 'arrow-left' )
+	 * @property {String}			leftText			左边的提示文字
+	 * @property {String}			rightText			右边的提示文字
+	 * @property {String}			rightIcon			右边返回图标的名称,只能为uView自带的图标
+	 * @property {String}			title				导航栏标题,如设置为空字符,将会隐藏标题占位区域
+	 * @property {String}			bgColor				导航栏背景设置 (默认 '#ffffff' )
+	 * @property {String | Number}	titleWidth			导航栏标题的最大宽度,内容超出会以省略号隐藏 (默认 '400rpx' )
+	 * @property {String | Number}	height				导航栏高度(不包括状态栏高度在内,内部自动加上)(默认 '44px' )
+	 * @property {String | Number}	leftIconSize		左侧返回图标的大小(默认 20px )
+	 * @property {String | Number}	leftIconColor		左侧返回图标的颜色(默认 #303133 )
+	 * @property {Boolean}	        autoBack			点击左侧区域(返回图标),是否自动返回上一页(默认 false )
+	 * @property {Object | String}	titleStyle			标题的样式,对象或字符串
+	 * @event {Function} leftClick		点击左侧区域
+	 * @event {Function} rightClick		点击右侧区域
+	 * @example <u-navbar title="剑未配妥,出门已是江湖" left-text="返回" right-text="帮助" @click-left="onClickBack" @click-right="onClickRight"></u-navbar>
+	 */
+	export default {
+		name: 'u-navbar',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+			}
+		},
+		emits: ["leftClick", "rightClick"],
+		methods: {
+			addStyle,
+			addUnit,
+			sys,
+			getPx,
+			// 点击左侧区域
+			leftClick() {
+				// 如果配置了autoBack,自动返回上一页
+				this.$emit('leftClick')
+				if(this.autoBack) {
+					uni.navigateBack()
+				}
+			},
+			// 点击右侧区域
+			rightClick() {
+				this.$emit('rightClick')
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-navbar {
+
+		&--fixed {
+			position: fixed;
+			left: 0;
+			right: 0;
+			top: 0;
+			z-index: 11;
+		}
+
+		&__content {
+			@include flex(row);
+			align-items: center;
+			height: 44px;
+			background-color: #9acafc;
+			position: relative;
+			justify-content: center;
+
+			&__left,
+			&__right {
+				padding: 0 13px;
+				position: absolute;
+				top: 0;
+				bottom: 0;
+				@include flex(row);
+				align-items: center;
+			}
+
+			&__left {
+				left: 0;
+				
+				&--hover {
+					opacity: 0.7;
+				}
+
+				&__text {
+					font-size: 15px;
+					margin-left: 3px;
+				}
+			}
+
+			&__title {
+				text-align: center;
+				font-size: 16px;
+				color: $u-main-color;
+			}
+
+			&__right {
+				right: 0;
+
+				&__text {
+					font-size: 15px;
+					margin-left: 3px;
+				}
+			}
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-no-network/props.js b/uni_modules/uview-plus/components/u-no-network/props.js
new file mode 100644
index 0000000..d465f98
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-no-network/props.js
@@ -0,0 +1,20 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 页面文字提示
+        tips: {
+            type: String,
+            default: () => defProps.noNetwork.tips
+        },
+        // 一个z-index值,用于设置没有网络这个组件的层次,因为页面可能会有其他定位的元素层级过高,导致此组件被覆盖
+        zIndex: {
+            type: [String, Number],
+            default: () => defProps.noNetwork.zIndex
+        },
+        // image 没有网络的图片提示
+        image: {
+            type: String,
+            default: () => defProps.noNetwork.image
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-no-network/u-no-network.vue b/uni_modules/uview-plus/components/u-no-network/u-no-network.vue
new file mode 100644
index 0000000..3d77ac0
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-no-network/u-no-network.vue
@@ -0,0 +1,223 @@
+<template>
+	<u-overlay
+	    :show="!isConnected"
+		:zIndex="zIndex"
+	    @touchmove.stop.prevent="noop"
+		:customStyle="{
+			backgroundColor: '#fff',
+			display: 'flex',
+			justifyContent: 'center',
+		}"
+	>
+		<view
+		    class="u-no-network"
+		>
+			<u-icon
+			    :name="image"
+			    size="150"
+			    imgMode="widthFit"
+			    class="u-no-network__error-icon"
+			></u-icon>
+			<text class="u-no-network__tips">{{tips}}</text>
+			<!-- 只有APP平台,才能跳转设置页,因为需要调用plus环境 -->
+			<!-- #ifdef APP-PLUS -->
+			<view class="u-no-network__app">
+				<text class="u-no-network__app__setting">请检查网络,或前往</text>
+				<text
+				    class="u-no-network__app__to-setting"
+				    @tap="openSettings"
+				>设置</text>
+			</view>
+			<!-- #endif -->
+			<view class="u-no-network__retry">
+				<u-button
+				    size="mini"
+				    text="重试"
+				    type="primary"
+					plain
+				    @click="retry"
+				></u-button>
+			</view>
+		</view>
+	</u-overlay>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { toast } from '../../libs/function/index';
+	/**
+	 * noNetwork 无网络提示
+	 * @description 该组件无需任何配置,引入即可,内部自动处理所有功能和事件。
+	 * @tutorial https://ijry.github.io/uview-plus/components/noNetwork.html
+	 * @property {String}			tips 	没有网络时的提示语 (默认:'哎呀,网络信号丢失' )
+	 * @property {String | Number}	zIndex	组件的z-index值 
+	 * @property {String}			image	无网络的图片提示,可用的src地址或base64图片 
+	 * @event {Function}			retry	用户点击页面的"重试"按钮时触发
+	 * @example <u-no-network></u-no-network>
+	 */
+	export default {
+		name: "u-no-network",
+		mixins: [mpMixin, mixin,props],
+		data() {
+			return {
+				isConnected: true, // 是否有网络连接
+				networkType: "none", // 网络类型
+			}
+		},
+		mounted() {
+			this.isIOS = (uni.getSystemInfoSync().platform === 'ios')
+			uni.onNetworkStatusChange((res) => {
+				this.isConnected = res.isConnected
+				this.networkType = res.networkType
+				this.emitEvent(this.networkType)
+			})
+			uni.getNetworkType({
+				success: (res) => {
+					this.networkType = res.networkType
+					this.emitEvent(this.networkType)
+					if (res.networkType == 'none') {
+						this.isConnected = false
+					} else {
+						this.isConnected = true
+					}
+				}
+			})
+		},
+		emits: ["disconnected", "connected"],
+		methods: {
+			retry() {
+				// 重新检查网络
+				uni.getNetworkType({
+					success: (res) => {
+						this.networkType = res.networkType
+						this.emitEvent(this.networkType)
+						if (res.networkType == 'none') {
+							toast('无网络连接')
+							this.isConnected = false
+						} else {
+							toast('网络已连接')
+							this.isConnected = true
+						}
+					}
+				})
+				this.$emit('retry')
+			},
+			// 发出事件给父组件
+			emitEvent(networkType) {
+				this.$emit(networkType === 'none' ? 'disconnected' : 'connected')
+			},
+			async openSettings() {
+				if (this.networkType == "none") {
+					this.openSystemSettings()
+					return
+				}
+			},
+			openAppSettings() {
+				this.gotoAppSetting()
+			},
+			openSystemSettings() {
+				// 以下方法来自5+范畴,如需深究,请自行查阅相关文档
+				// https://ask.dcloud.net.cn/docs/
+				if (this.isIOS) {
+					this.gotoiOSSetting()
+				} else {
+					this.gotoAndroidSetting()
+				}
+			},
+			network() {
+				var result = null
+				var cellularData = plus.ios.newObject("CTCellularData")
+				var state = cellularData.plusGetAttribute("restrictedState")
+				if (state == 0) {
+					result = null
+				} else if (state == 2) {
+					result = 1
+				} else if (state == 1) {
+					result = 2
+				}
+				plus.ios.deleteObject(cellularData)
+				return result
+			},
+			gotoAppSetting() {
+				if (this.isIOS) {
+					var UIApplication = plus.ios.import("UIApplication")
+					var application2 = UIApplication.sharedApplication()
+					var NSURL2 = plus.ios.import("NSURL")
+					var setting2 = NSURL2.URLWithString("app-settings:")
+					application2.openURL(setting2)
+					plus.ios.deleteObject(setting2)
+					plus.ios.deleteObject(NSURL2)
+					plus.ios.deleteObject(application2)
+				} else {
+					var Intent = plus.android.importClass("android.content.Intent")
+					var Settings = plus.android.importClass("android.provider.Settings")
+					var Uri = plus.android.importClass("android.net.Uri")
+					var mainActivity = plus.android.runtimeMainActivity()
+					var intent = new Intent()
+					intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
+					var uri = Uri.fromParts("package", mainActivity.getPackageName(), null)
+					intent.setData(uri)
+					mainActivity.startActivity(intent)
+				}
+			},
+			gotoiOSSetting() {
+				var UIApplication = plus.ios.import("UIApplication")
+				var application2 = UIApplication.sharedApplication()
+				var NSURL2 = plus.ios.import("NSURL")
+				var setting2 = NSURL2.URLWithString("App-prefs:root=General")
+				application2.openURL(setting2)
+				plus.ios.deleteObject(setting2)
+				plus.ios.deleteObject(NSURL2)
+				plus.ios.deleteObject(application2)
+			},
+			gotoAndroidSetting() {
+				var Intent = plus.android.importClass("android.content.Intent")
+				var Settings = plus.android.importClass("android.provider.Settings")
+				var mainActivity = plus.android.runtimeMainActivity()
+				var intent = new Intent(Settings.ACTION_SETTINGS)
+				mainActivity.startActivity(intent)
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-no-network {
+		@include flex(column);
+		justify-content: center;
+		align-items: center;
+		margin-top: -100px;
+
+		&__tips {
+			color: $u-tips-color;
+			font-size: 14px;
+			margin-top: 15px;
+		}
+
+		&__app {
+			@include flex(row);
+			margin-top: 6px;
+
+			&__setting {
+				color: $u-light-color;
+				font-size: 13px;
+			}
+
+			&__to-setting {
+				font-size: 13px;
+				color: $u-primary;
+				margin-left: 3px;
+			}
+		}
+
+		&__retry {
+			@include flex(row);
+			justify-content: center;
+			margin-top: 15px;
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-notice-bar/props.js b/uni_modules/uview-plus/components/u-notice-bar/props.js
new file mode 100644
index 0000000..9a3298e
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-notice-bar/props.js
@@ -0,0 +1,71 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 显示的内容,数组
+        text: {
+            type: [Array, String],
+            default: () => defProps.noticeBar.text
+        },
+        // 通告滚动模式,row-横向滚动,column-竖向滚动
+        direction: {
+            type: String,
+            default: () => defProps.noticeBar.direction
+        },
+        // direction = row时,是否使用步进形式滚动
+        step: {
+            type: Boolean,
+            default: () => defProps.noticeBar.step
+        },
+        // 是否显示左侧的音量图标
+        icon: {
+            type: String,
+            default: () => defProps.noticeBar.icon
+        },
+        // 通告模式,link-显示右箭头,closable-显示右侧关闭图标
+        mode: {
+            type: String,
+            default: () => defProps.noticeBar.mode
+        },
+        // 文字颜色,各图标也会使用文字颜色
+        color: {
+            type: String,
+            default: () => defProps.noticeBar.color
+        },
+        // 背景颜色
+        bgColor: {
+            type: String,
+            default: () => defProps.noticeBar.bgColor
+        },
+        // 水平滚动时的滚动速度,即每秒滚动多少px(px),这有利于控制文字无论多少时,都能有一个恒定的速度
+        speed: {
+            type: [String, Number],
+            default: () => defProps.noticeBar.speed
+        },
+        // 字体大小
+        fontSize: {
+            type: [String, Number],
+            default: () => defProps.noticeBar.fontSize
+        },
+        // 滚动一个周期的时间长,单位ms
+        duration: {
+            type: [String, Number],
+            default: () => defProps.noticeBar.duration
+        },
+        // 是否禁止用手滑动切换
+        // 目前HX2.6.11,只支持App 2.5.5+、H5 2.5.5+、支付宝小程序、字节跳动小程序
+        disableTouch: {
+            type: Boolean,
+            default: () => defProps.noticeBar.disableTouch
+        },
+        // 跳转的页面路径
+        url: {
+            type: String,
+            default: () => defProps.noticeBar.url
+        },
+        // 页面跳转的类型
+        linkType: {
+            type: String,
+            default: () => defProps.noticeBar.linkType
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-notice-bar/u-notice-bar.vue b/uni_modules/uview-plus/components/u-notice-bar/u-notice-bar.vue
new file mode 100644
index 0000000..373f619
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-notice-bar/u-notice-bar.vue
@@ -0,0 +1,105 @@
+<template>
+	<view
+		class="u-notice-bar"
+		v-if="show"
+		:style="[{
+			backgroundColor: bgColor
+		}, addStyle(customStyle)]"
+	>
+		<template v-if="direction === 'column' || (direction === 'row' && step)">
+			<u-column-notice
+				:color="color"
+				:bgColor="bgColor"
+				:text="text"
+				:mode="mode"
+				:step="step"
+				:icon="icon"
+				:disable-touch="disableTouch"
+				:fontSize="fontSize"
+				:duration="duration"
+				@close="close"
+				@click="click"
+			></u-column-notice>
+		</template>
+		<template v-else>
+			<u-row-notice
+				:color="color"
+				:bgColor="bgColor"
+				:text="text"
+				:mode="mode"
+				:fontSize="fontSize"
+				:speed="speed"
+				:url="url"
+				:linkType="linkType"
+				:icon="icon"
+				@close="close"
+				@click="click"
+			></u-row-notice>
+		</template>
+	</view>
+</template>
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addStyle } from '../../libs/function/index';
+	/**
+	 * noticeBar 滚动通知
+	 * @description 该组件用于滚动通告场景,有多种模式可供选择
+	 * @tutorial https://ijry.github.io/uview-plus/components/noticeBar.html
+	 * @property {Array | String}	text			显示的内容,数组
+	 * @property {String}			direction		通告滚动模式,row-横向滚动,column-竖向滚动 ( 默认 'row' )
+	 * @property {Boolean}			step			direction = row时,是否使用步进形式滚动  ( 默认 false )
+	 * @property {String}			icon			是否显示左侧的音量图标 ( 默认 'volume' )
+	 * @property {String}			mode			通告模式,link-显示右箭头,closable-显示右侧关闭图标
+	 * @property {String}			color			文字颜色,各图标也会使用文字颜色 ( 默认 '#f9ae3d' )
+	 * @property {String}			bgColor			背景颜色 ( 默认 '#fdf6ec' )
+	 * @property {String | Number}	speed			水平滚动时的滚动速度,即每秒滚动多少px(px),这有利于控制文字无论多少时,都能有一个恒定的速度 ( 默认 80 )
+	 * @property {String | Number}	fontSize		字体大小 ( 默认 14 )
+	 * @property {String | Number}	duration		滚动一个周期的时间长,单位ms ( 默认 2000 )
+	 * @property {Boolean}			disableTouch	是否禁止用手滑动切换 目前HX2.6.11,只支持App 2.5.5+、H5 2.5.5+、支付宝小程序、字节跳动小程序(默认34) ( 默认 true )
+	 * @property {String}			url				跳转的页面路径
+	 * @property {String}			linkType		页面跳转的类型 ( 默认 navigateTo )
+	 * @property {Object}			customStyle		定义需要用到的外部样式
+	 * 
+	 * @event {Function}			click			点击通告文字触发
+	 * @event {Function}			close			点击右侧关闭图标触发
+	 * @example <u-notice-bar :more-icon="true" :list="list"></u-notice-bar>
+	 */
+	export default {
+		name: "u-notice-bar",
+		mixins: [mpMixin, mixin,props],
+		data() {
+			return {
+				show: true
+			}
+		},
+		emits: ["click", "close"],
+		methods: {
+			addStyle,
+			// 点击通告栏
+			click(index) {
+				this.$emit('click', index)
+				if (this.url && this.linkType) {
+					// 此方法写在mixin中,另外跳转的url和linkType参数也在mixin的props中
+					this.openPage()
+				}
+			},
+			// 点击关闭按钮
+			close() {
+				this.show = false
+				this.$emit('close')
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-notice-bar {
+		overflow: hidden;
+		padding: 9px 12px;
+		flex: 1;
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-notify/props.js b/uni_modules/uview-plus/components/u-notify/props.js
new file mode 100644
index 0000000..5f28a93
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-notify/props.js
@@ -0,0 +1,50 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 到顶部的距离
+        top: {
+            type: [String, Number],
+            default: () => defProps.notify.top
+        },
+        // 是否展示组件
+        // show: {
+        // 	type: Boolean,
+        // 	default: () => defProps.notify.show
+        // },
+        // type主题,primary,success,warning,error
+        type: {
+            type: String,
+            default: () => defProps.notify.type
+        },
+        // 字体颜色
+        color: {
+            type: String,
+            default: () => defProps.notify.color
+        },
+        // 背景颜色
+        bgColor: {
+            type: String,
+            default: () => defProps.notify.bgColor
+        },
+        // 展示的文字内容
+        message: {
+            type: String,
+            default: () => defProps.notify.message
+        },
+        // 展示时长,为0时不消失,单位ms
+        duration: {
+            type: [String, Number],
+            default: () => defProps.notify.duration
+        },
+        // 字体大小
+        fontSize: {
+            type: [String, Number],
+            default: () => defProps.notify.fontSize
+        },
+        // 是否留出顶部安全距离(状态栏高度)
+        safeAreaInsetTop: {
+            type: Boolean,
+            default: () => defProps.notify.safeAreaInsetTop
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-notify/u-notify.vue b/uni_modules/uview-plus/components/u-notify/u-notify.vue
new file mode 100644
index 0000000..c40df01
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-notify/u-notify.vue
@@ -0,0 +1,222 @@
+<template>
+	<u-transition
+		mode="slide-down"
+		:customStyle="containerStyle"
+		:show="open"
+	>
+		<view
+			class="u-notify"
+			:class="[`u-notify--${tmpConfig.type}`]"
+			:style="[backgroundColor, addStyle(customStyle)]"
+		>
+			<u-status-bar v-if="tmpConfig.safeAreaInsetTop"></u-status-bar>
+			<view class="u-notify__warpper">
+				<slot name="icon">
+					<u-icon
+						v-if="['success', 'warning', 'error'].includes(tmpConfig.type)"
+						:name="tmpConfig.icon"
+						:color="tmpConfig.color"
+						:size="1.3 * tmpConfig.fontSize"
+						:customStyle="{marginRight: '4px'}"
+					></u-icon>
+				</slot>
+				<text
+					class="u-notify__warpper__text"
+					:style="{
+						fontSize: addUnit(tmpConfig.fontSize),
+						color: tmpConfig.color
+					}"
+				>{{ tmpConfig.message }}</text>
+			</view>
+		</view>
+	</u-transition>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import defProps from '../../libs/config/props.js';
+	import { addUnit, addStyle, deepMerge } from '../../libs/function/index';
+	/**
+	 * notify 顶部提示
+	 * @description 该组件一般用于页面顶部向下滑出一个提示,尔后自动收起的场景
+	 * @tutorial
+	 * @property {String | Number}	top					到顶部的距离 ( 默认 0 )
+	 * @property {String}			type				主题,primary,success,warning,error ( 默认 'primary' )
+	 * @property {String}			color				字体颜色 ( 默认 '#ffffff' )
+	 * @property {String}			bgColor				背景颜色
+	 * @property {String}			message				展示的文字内容
+	 * @property {String | Number}	duration			展示时长,为0时不消失,单位ms ( 默认 3000 )
+	 * @property {String | Number}	fontSize			字体大小 ( 默认 15 )
+	 * @property {Boolean}			safeAreaInsetTop	是否留出顶部安全距离(状态栏高度) ( 默认 false )
+	 * @property {Object}			customStyle			组件的样式,对象形式
+	 * @event {Function}	open	开启组件时调用的函数
+	 * @event {Function}	close	关闭组件式调用的函数
+	 * @example <u-notify message="Hi uView"></u-notify>
+	 */
+	export default {
+		name: 'u-notify',
+		mixins: [mpMixin, mixin,props],
+		data() {
+			return {
+				// 是否展示组件
+				open: false,
+				timer: null,
+				config: {
+					// 到顶部的距离
+					top: defProps.notify.top,
+					// type主题,primary,success,warning,error
+					type: defProps.notify.type,
+					// 字体颜色
+					color: defProps.notify.color,
+					// 背景颜色
+					bgColor: defProps.notify.bgColor,
+					// 展示的文字内容
+					message: defProps.notify.message,
+					// 展示时长,为0时不消失,单位ms
+					duration: defProps.notify.duration,
+					// 字体大小
+					fontSize: defProps.notify.fontSize,
+					// 是否留出顶部安全距离(状态栏高度)
+					safeAreaInsetTop: defProps.notify.safeAreaInsetTop
+				},
+				// 合并后的配置,避免多次调用组件后,可能会复用之前使用的配置参数
+				tmpConfig: {}
+			}
+		},
+		computed: {
+			containerStyle() {
+				let top = 0
+				if (this.tmpConfig.top === 0) {
+					// #ifdef H5
+					// H5端,导航栏为普通元素,需要将组件移动到导航栏的下边沿
+					// H5的导航栏高度为44px
+					top = 44
+					// #endif
+				}
+				const style = {
+					top: addUnit(this.tmpConfig.top === 0 ? top : this.tmpConfig.top),
+					// 因为组件底层为u-transition组件,必须将其设置为fixed定位
+					// 让其出现在导航栏底部
+					position: 'fixed',
+					left: 0,
+					right: 0,
+					zIndex: 10076
+				}
+				return style
+			},
+			// 组件背景颜色
+			backgroundColor() {
+				const style = {}
+				if (this.tmpConfig.bgColor) {
+					style.backgroundColor = this.tmpConfig.bgColor
+				}
+				return style
+			},
+			// 默认主题下的图标
+			icon() {
+				let icon
+				if (this.tmpConfig.type === 'success') {
+					icon = 'checkmark-circle'
+				} else if (this.tmpConfig.type === 'error') {
+					icon = 'close-circle'
+				} else if (this.tmpConfig.type === 'warning') {
+					icon = 'error-circle'
+				}
+				return icon
+			}
+		},
+		created() {
+			// 通过主题的形式调用toast,批量生成方法函数
+			['primary', 'success', 'error', 'warning'].map(item => {
+				this[item] = message => this.show({
+					type: item,
+					message
+				})
+			})
+		},
+		methods: {
+			addStyle,
+			addUnit,
+			show(options) {
+				// 不将结果合并到this.config变量,避免多次调用u-toast,前后的配置造成混乱
+				this.tmpConfig = deepMerge(this.config, options)
+				// 任何定时器初始化之前,都要执行清除操作,否则可能会造成混乱
+				this.clearTimer()
+				this.open = true
+				if (this.tmpConfig.duration > 0) {
+					this.timer = setTimeout(() => {
+						this.open = false
+						// 倒计时结束,清除定时器,隐藏toast组件
+						this.clearTimer()
+						// 判断是否存在callback方法,如果存在就执行
+						typeof(this.tmpConfig.complete) === 'function' && this.tmpConfig.complete()
+					}, this.tmpConfig.duration)
+				}
+			},
+			// 关闭notify
+			close() {
+				this.clearTimer()
+			},
+			clearTimer() {
+				this.open = false
+				// 清除定时器
+				clearTimeout(this.timer)
+				this.timer = null
+			}
+		},
+		// #ifdef VUE2
+		beforeDestroy() {
+		// #endif
+		// #ifdef VUE3
+		beforeUnmount() {
+		// #endif
+			this.clearTimer()
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	$u-notify-padding: 8px 10px !default;
+	$u-notify-text-font-size: 15px !default;
+	$u-notify-primary-bgColor: $u-primary !default;
+	$u-notify-success-bgColor: $u-success !default;
+	$u-notify-error-bgColor: $u-error !default;
+	$u-notify-warning-bgColor: $u-warning !default;
+
+
+	.u-notify {
+		padding: $u-notify-padding;
+
+		&__warpper {
+			@include flex;
+			align-items: center;
+			text-align: center;
+			justify-content: center;
+
+			&__text {
+				font-size: $u-notify-text-font-size;
+				text-align: center;
+			}
+		}
+
+		&--primary {
+			background-color: $u-notify-primary-bgColor;
+		}
+
+		&--success {
+			background-color: $u-notify-success-bgColor;
+		}
+
+		&--error {
+			background-color: $u-notify-error-bgColor;
+		}
+
+		&--warning {
+			background-color: $u-notify-warning-bgColor;
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-number-box/props.js b/uni_modules/uview-plus/components/u-number-box/props.js
new file mode 100644
index 0000000..2b289ea
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-number-box/props.js
@@ -0,0 +1,119 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 步进器标识符,在change回调返回
+        name: {
+            type: [String, Number],
+            default: () => defProps.numberBox.name
+        },
+        // #ifdef VUE2
+        // 用于双向绑定的值,初始化时设置设为默认min值(最小值)
+        value: {
+            type: [String, Number],
+            default: () => defProps.numberBox.value
+        },
+        // #endif
+        // #ifdef VUE3
+        // 用于双向绑定的值,初始化时设置设为默认min值(最小值)
+        modelValue: {
+            type: [String, Number],
+            default: () => defProps.numberBox.value
+        },
+        // #endif
+        // 最小值
+        min: {
+            type: [String, Number],
+            default: () => defProps.numberBox.min
+        },
+        // 最大值
+        max: {
+            type: [String, Number],
+            default: () => defProps.numberBox.max
+        },
+        // 加减的步长,可为小数
+        step: {
+            type: [String, Number],
+            default: () => defProps.numberBox.step
+        },
+        // 是否只允许输入整数
+        integer: {
+            type: Boolean,
+            default: () => defProps.numberBox.integer
+        },
+        // 是否禁用,包括输入框,加减按钮
+        disabled: {
+            type: Boolean,
+            default: () => defProps.numberBox.disabled
+        },
+        // 是否禁用输入框
+        disabledInput: {
+            type: Boolean,
+            default: () => defProps.numberBox.disabledInput
+        },
+        // 是否开启异步变更,开启后需要手动控制输入值
+        asyncChange: {
+            type: Boolean,
+            default: () => defProps.numberBox.asyncChange
+        },
+        // 输入框宽度,单位为px
+        inputWidth: {
+            type: [String, Number],
+            default: () => defProps.numberBox.inputWidth
+        },
+        // 是否显示减少按钮
+        showMinus: {
+            type: Boolean,
+            default: () => defProps.numberBox.showMinus
+        },
+        // 是否显示增加按钮
+        showPlus: {
+            type: Boolean,
+            default: () => defProps.numberBox.showPlus
+        },
+        // 显示的小数位数
+        decimalLength: {
+            type: [String, Number, null],
+            default: () => defProps.numberBox.decimalLength
+        },
+        // 是否开启长按加减手势
+        longPress: {
+            type: Boolean,
+            default: () => defProps.numberBox.longPress
+        },
+        // 输入框文字和加减按钮图标的颜色
+        color: {
+            type: String,
+            default: () => defProps.numberBox.color
+        },
+        // 按钮大小,宽高等于此值,单位px,输入框高度和此值保持一致
+        buttonSize: {
+            type: [String, Number],
+            default: () => defProps.numberBox.buttonSize
+        },
+        // 输入框和按钮的背景颜色
+        bgColor: {
+            type: String,
+            default: () => defProps.numberBox.bgColor
+        },
+        // 指定光标于键盘的距离,避免键盘遮挡输入框,单位px
+        cursorSpacing: {
+            type: [String, Number],
+            default: () => defProps.numberBox.cursorSpacing
+        },
+        // 是否禁用增加按钮
+        disablePlus: {
+            type: Boolean,
+            default: () => defProps.numberBox.disablePlus
+        },
+        // 是否禁用减少按钮
+        disableMinus: {
+            type: Boolean,
+            default: () => defProps.numberBox.disableMinus
+        },
+        // 加减按钮图标的样式
+        iconStyle: {
+            type: [Object, String],
+            default: () => defProps.numberBox.iconStyle
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-number-box/u-number-box.vue b/uni_modules/uview-plus/components/u-number-box/u-number-box.vue
new file mode 100644
index 0000000..fd67e4e
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-number-box/u-number-box.vue
@@ -0,0 +1,465 @@
+<template>
+	<view class="u-number-box">
+		<view
+		    class="u-number-box__slot cursor-pointer"
+		    @tap.stop="clickHandler('minus')"
+		    @touchstart="onTouchStart('minus')"
+		    @touchend.stop="clearTimeout"
+		    v-if="showMinus && $slots.minus"
+		>
+			<slot name="minus" />
+		</view>
+		<view
+		    v-else-if="showMinus"
+		    class="u-number-box__minus cursor-pointer"
+		    @tap.stop="clickHandler('minus')"
+		    @touchstart="onTouchStart('minus')"
+		    @touchend.stop="clearTimeout"
+		    hover-class="u-number-box__minus--hover"
+		    hover-stay-time="150"
+		    :class="{ 'u-number-box__minus--disabled': isDisabled('minus') }"
+		    :style="[buttonStyle('minus')]"
+		>
+			<u-icon
+			    name="minus"
+			    :color="isDisabled('minus') ? '#c8c9cc' : '#323233'"
+			    size="15"
+			    bold
+				:customStyle="iconStyle"
+			></u-icon>
+		</view>
+
+		<slot name="input">
+			<!-- #ifdef MP-WEIXIN -->
+			<input
+			    :disabled="disabledInput || disabled"
+			    :cursor-spacing="getCursorSpacing"
+			    :class="{ 'u-number-box__input--disabled': disabled || disabledInput }"
+			    :value="currentValue"
+			    class="u-number-box__input"
+			    @blur="onBlur"
+			    @focus="onFocus"
+			    @input="onInput"
+			    type="number"
+			    :style="[inputStyle]"
+			/>
+			<!-- #endif -->
+			<!-- #ifndef MP-WEIXIN -->
+			<input
+			    :disabled="disabledInput || disabled"
+			    :cursor-spacing="getCursorSpacing"
+			    :class="{ 'u-number-box__input--disabled': disabled || disabledInput }"
+			    v-model="currentValue"
+			    class="u-number-box__input"
+			    @blur="onBlur"
+			    @focus="onFocus"
+			    @input="onInput"
+			    type="number"
+			    :style="[inputStyle]"
+			/>
+			<!-- #endif -->
+		</slot>
+		<view
+		    class="u-number-box__slot cursor-pointer"
+		    @tap.stop="clickHandler('plus')"
+		    @touchstart="onTouchStart('plus')"
+		    @touchend.stop="clearTimeout"
+		    v-if="showPlus && $slots.plus"
+		>
+			<slot name="plus" />
+		</view>
+		<view
+		    v-else-if="showPlus"
+		    class="u-number-box__plus cursor-pointer"
+		    @tap.stop="clickHandler('plus')"
+		    @touchstart="onTouchStart('plus')"
+		    @touchend.stop="clearTimeout"
+		    hover-class="u-number-box__plus--hover"
+		    hover-stay-time="150"
+		    :class="{ 'u-number-box__minus--disabled': isDisabled('plus') }"
+		    :style="[buttonStyle('plus')]"
+		>
+			<u-icon
+			    name="plus"
+			    :color="isDisabled('plus') ? '#c8c9cc' : '#323233'"
+			    size="15"
+			    bold
+				:customStyle="iconStyle"
+			></u-icon>
+		</view>
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { getPx, addUnit } from '../../libs/function/index';
+	/**
+	 * numberBox 步进器
+	 * @description 该组件一般用于商城购物选择物品数量的场景。
+	 * @tutorial https://uview-plus.jiangruyi.com/components/numberBox.html
+	 * @property {String | Number}	name			步进器标识符,在change回调返回
+	 * @property {String | Number}	value			用于双向绑定的值,初始化时设置设为默认min值(最小值)  (默认 0 )
+	 * @property {String | Number}	min				最小值 (默认 1 )
+	 * @property {String | Number}	max				最大值 (默认 Number.MAX_SAFE_INTEGER )
+	 * @property {String | Number}	step			加减的步长,可为小数 (默认 1 )
+	 * @property {Boolean}			integer			是否只允许输入整数 (默认 false )
+	 * @property {Boolean}			disabled		是否禁用,包括输入框,加减按钮 (默认 false )
+	 * @property {Boolean}			disabledInput	是否禁用输入框 (默认 false )
+	 * @property {Boolean}			asyncChange		是否开启异步变更,开启后需要手动控制输入值 (默认 false )
+	 * @property {String | Number}	inputWidth		输入框宽度,单位为px (默认 35 )
+	 * @property {Boolean}			showMinus		是否显示减少按钮 (默认 true )
+	 * @property {Boolean}			showPlus		是否显示增加按钮 (默认 true )
+	 * @property {String | Number}	decimalLength	显示的小数位数
+	 * @property {Boolean}			longPress		是否开启长按加减手势 (默认 true )
+	 * @property {String}			color			输入框文字和加减按钮图标的颜色 (默认 '#323233' )
+	 * @property {String | Number}	buttonSize		按钮大小,宽高等于此值,单位px,输入框高度和此值保持一致 (默认 30 )
+	 * @property {String}			bgColor			输入框和按钮的背景颜色 (默认 '#EBECEE' )
+	 * @property {String | Number}	cursorSpacing	指定光标于键盘的距离,避免键盘遮挡输入框,单位px (默认 100 )
+	 * @property {Boolean}			disablePlus		是否禁用增加按钮 (默认 false )
+	 * @property {Boolean}			disableMinus	是否禁用减少按钮 (默认 false )
+	 * @property {Object | String}	iconStyle		加减按钮图标的样式
+	 *
+	 * @event {Function}	onFocus	输入框活动焦点
+	 * @event {Function}	onBlur	输入框失去焦点
+	 * @event {Function}	onInput	输入框值发生变化
+	 * @event {Function}	onChange
+	 * @example <u-number-box v-model="value" @change="valChange"></u-number-box>
+	 */
+	export default {
+		name: 'u-number-box',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				// 输入框实际操作的值
+				currentValue: '',
+				// 定时器
+				longPressTimer: null
+			}
+		},
+		watch: {
+			// 多个值之间,只要一个值发生变化,都要重新检查check()函数
+			watchChange(n) {
+				this.check()
+			},
+			// #ifdef VUE2
+			// 监听v-mode的变化,重新初始化内部的值
+			value(n) {
+				if (n !== this.currentValue) {
+					this.currentValue = this.format(this.value)
+				}
+			},
+			// #endif
+			// #ifdef VUE3
+			// 监听v-mode的变化,重新初始化内部的值
+			modelValue: {
+				handler: function (newV, oldV) {
+					if (newV !== this.currentValue) {
+						this.currentValue = this.format(this.modelValue)
+					}
+				},
+				immediate: true
+		}
+			// #endif
+		},
+		computed: {
+			getCursorSpacing() {
+				// 判断传入的单位,如果为px单位,需要转成px
+				return getPx(this.cursorSpacing)
+			},
+			// 按钮的样式
+			buttonStyle() {
+				return (type) => {
+					const style = {
+						backgroundColor: this.bgColor,
+						height: addUnit(this.buttonSize),
+						color: this.color
+					}
+					if (this.isDisabled(type)) {
+						style.backgroundColor = '#f7f8fa'
+					}
+					return style
+				}
+			},
+			// 输入框的样式
+			inputStyle() {
+				const disabled = this.disabled || this.disabledInput
+				const style = {
+					color: this.color,
+					backgroundColor: this.bgColor,
+					height: addUnit(this.buttonSize),
+					width: addUnit(this.inputWidth)
+				}
+				return style
+			},
+			// 用于监听多个值发生变化
+			watchChange() {
+				return [this.integer, this.decimalLength, this.min, this.max]
+			},
+			isDisabled() {
+				return (type) => {
+					if (type === 'plus') {
+						// 在点击增加按钮情况下,判断整体的disabled,是否单独禁用增加按钮,以及当前值是否大于最大的允许值
+						return (
+							this.disabled ||
+							this.disablePlus ||
+							this.currentValue >= this.max
+						)
+					}
+					// 点击减少按钮同理
+					return (
+						this.disabled ||
+						this.disableMinus ||
+						this.currentValue <= this.min
+					)
+				}
+			},
+		},
+		mounted() {
+			this.init()
+		},
+		// #ifdef VUE3
+		emits: ['update:modelValue', 'focus', 'blur', 'overlimit', 'change', 'plus', 'minus'],
+		// #endif
+		methods: {
+			init() {
+				// #ifdef VUE3
+				this.currentValue = this.format(this.modelValue)
+				// #endif
+				// #ifdef VUE2
+				this.currentValue = this.format(this.value)
+				// #endif
+			},
+			// 格式化整理数据,限制范围
+			format(value) {
+				value = this.filter(value)
+				// 如果为空字符串,那么设置为0,同时将值转为Number类型
+				value = value === '' ? 0 : +value
+				// 对比最大最小值,取在min和max之间的值
+				value = Math.max(Math.min(this.max, value), this.min)
+				// 如果设定了最大的小数位数,使用toFixed去进行格式化
+				if (this.decimalLength !== null) {
+					value = value.toFixed(this.decimalLength)
+				}
+				return value
+			},
+			// 过滤非法的字符
+			filter(value) {
+				// 只允许0-9之间的数字,"."为小数点,"-"为负数时候使用
+				value = String(value).replace(/[^0-9.-]/g, '')
+				// 如果只允许输入整数,则过滤掉小数点后的部分
+				if (this.integer && value.indexOf('.') !== -1) {
+					value = value.split('.')[0]
+				}
+				return value;
+			},
+			check() {
+				// 格式化了之后,如果前后的值不相等,那么设置为格式化后的值
+				const val = this.format(this.currentValue);
+				if (val !== this.currentValue) {
+					this.currentValue = val
+				}
+			},
+			// 判断是否出于禁止操作状态
+			// isDisabled(type) {
+			// 	if (type === 'plus') {
+			// 		// 在点击增加按钮情况下,判断整体的disabled,是否单独禁用增加按钮,以及当前值是否大于最大的允许值
+			// 		return (
+			// 			this.disabled ||
+			// 			this.disablePlus ||
+			// 			this.currentValue >= this.max
+			// 		)
+			// 	}
+			// 	// 点击减少按钮同理
+			// 	return (
+			// 		this.disabled ||
+			// 		this.disableMinus ||
+			// 		this.currentValue <= this.min
+			// 	)
+			// },
+			// 输入框活动焦点
+			onFocus(event) {
+				this.$emit('focus', {
+					...event.detail,
+					name: this.name,
+				})
+			},
+			// 输入框失去焦点
+			onBlur(event) {
+				// 对输入值进行格式化
+				const value = this.format(event.detail.value)
+				// 发出blur事件
+				this.$emit(
+					'blur',{
+						...event.detail,
+						name: this.name,
+					}
+				)
+			},
+			// 输入框值发生变化
+			onInput(e) {
+				const {
+					value = ''
+				} = e.detail || {}
+				// 为空返回
+				if (value === '') return
+				let formatted = this.filter(value)
+				// 最大允许的小数长度
+				if (this.decimalLength !== null && formatted.indexOf('.') !== -1) {
+					const pair = formatted.split('.');
+					formatted = `${pair[0]}.${pair[1].slice(0, this.decimalLength)}`
+				}
+				formatted = this.format(formatted)
+				this.emitChange(formatted);
+				// #ifdef MP-WEIXIN 
+				return formatted
+				// #endif 
+			
+			},
+			// 发出change事件
+			emitChange(value) {
+				// 如果开启了异步变更值,则不修改内部的值,需要用户手动在外部通过v-model变更
+				if (!this.asyncChange) {
+					this.$nextTick(() => {
+						// #ifdef VUE3
+						this.$emit('update:modelValue', value)
+						// #endif
+						// #ifdef VUE2
+						this.$emit('input', value)
+						// #endif
+						this.currentValue = value
+						this.$forceUpdate()
+					})
+				}
+				this.$emit('change', {
+					value,
+					name: this.name,
+				});
+			},
+			onChange() {
+				const {
+					type
+				} = this
+				if (this.isDisabled(type)) {
+					return this.$emit('overlimit', type)
+				}
+				const diff = type === 'minus' ? -this.step : +this.step
+				const value = this.format(this.add(+this.currentValue, diff))
+				this.emitChange(value)
+				this.$emit(type)
+			},
+			// 对值扩大后进行四舍五入,再除以扩大因子,避免出现浮点数操作的精度问题
+			add(num1, num2) {
+				const cardinal = Math.pow(10, 10);
+				return Math.round((num1 + num2) * cardinal) / cardinal
+			},
+			// 点击加减按钮
+			clickHandler(type) {
+				this.type = type
+				this.onChange()
+			},
+			longPressStep() {
+				// 每隔一段时间,重新调用longPressStep方法,实现长按加减
+				this.clearTimeout()
+				this.longPressTimer = setTimeout(() => {
+					this.onChange()
+					this.longPressStep()
+				}, 250);
+			},
+			onTouchStart(type) {
+				if (!this.longPress) return
+				this.clearTimeout()
+				this.type = type
+				// 一定时间后,默认达到长按状态
+				this.longPressTimer = setTimeout(() => {
+					this.onChange()
+					this.longPressStep()
+				}, 600)
+			},
+			// 触摸结束,清除定时器,停止长按加减
+			onTouchEnd() {
+				if (!this.longPress) return
+				this.clearTimeout()
+			},
+			// 清除定时器
+			clearTimeout() {
+				clearTimeout(this.longPressTimer)
+				this.longPressTimer = null
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import '../../libs/css/components.scss';
+
+	$u-numberBox-hover-bgColor: #E6E6E6 !default;
+	$u-numberBox-disabled-color: #c8c9cc !default;
+	$u-numberBox-disabled-bgColor: #f7f8fa !default;
+	$u-numberBox-plus-radius: 4px !default;
+	$u-numberBox-minus-radius: 4px !default;
+	$u-numberBox-input-text-align: center !default;
+	$u-numberBox-input-font-size: 15px !default;
+	$u-numberBox-input-padding: 0 !default;
+	$u-numberBox-input-margin: 0 2px !default;
+	$u-numberBox-input-disabled-color: #c8c9cc !default;
+	$u-numberBox-input-disabled-bgColor: #f2f3f5 !default;
+
+	.u-number-box {
+		@include flex(row);
+		align-items: center;
+
+		&__slot {
+			/* #ifndef APP-NVUE */
+			touch-action: none;
+			/* #endif */
+		}
+
+		&__plus,
+		&__minus {
+			width: 35px;
+			@include flex;
+			justify-content: center;
+			align-items: center;
+			/* #ifndef APP-NVUE */
+			touch-action: none;
+			/* #endif */
+
+			&--hover {
+				background-color: $u-numberBox-hover-bgColor !important;
+			}
+
+			&--disabled {
+				color: $u-numberBox-disabled-color;
+				background-color: $u-numberBox-disabled-bgColor;
+			}
+		}
+
+		&__plus {
+			border-top-right-radius: $u-numberBox-plus-radius;
+			border-bottom-right-radius: $u-numberBox-plus-radius;
+		}
+
+		&__minus {
+			border-top-left-radius: $u-numberBox-minus-radius;
+			border-bottom-left-radius: $u-numberBox-minus-radius;
+		}
+
+		&__input {
+			position: relative;
+			text-align: $u-numberBox-input-text-align;
+			font-size: $u-numberBox-input-font-size;
+			padding: $u-numberBox-input-padding;
+			margin: $u-numberBox-input-margin;
+			@include flex;
+			align-items: center;
+			justify-content: center;
+
+			&--disabled {
+				color: $u-numberBox-input-disabled-color;
+				background-color: $u-numberBox-input-disabled-bgColor;
+			}
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-number-keyboard/props.js b/uni_modules/uview-plus/components/u-number-keyboard/props.js
new file mode 100644
index 0000000..90ad3e1
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-number-keyboard/props.js
@@ -0,0 +1,20 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 键盘的类型,number-数字键盘,card-身份证键盘
+        mode: {
+            type: String,
+            default: () => defProps.numberKeyboard.value
+        },
+        // 是否显示键盘的"."符号
+        dotDisabled: {
+            type: Boolean,
+            default: () => defProps.numberKeyboard.dotDisabled
+        },
+        // 是否打乱键盘按键的顺序
+        random: {
+            type: Boolean,
+            default: () => defProps.numberKeyboard.random
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-number-keyboard/u-number-keyboard.vue b/uni_modules/uview-plus/components/u-number-keyboard/u-number-keyboard.vue
new file mode 100644
index 0000000..8df3b91
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-number-keyboard/u-number-keyboard.vue
@@ -0,0 +1,198 @@
+<template>
+	<view
+		class="u-keyboard"
+		@touchmove.stop.prevent="noop"
+	>
+		<view
+			class="u-keyboard__button-wrapper"
+			v-for="(item, index) in numList"
+			:key="index"
+		>
+			<view
+				class="u-keyboard__button-wrapper__button"
+				:style="[itemStyle(index)]"
+				@tap="keyboardClick(item)"
+				hover-class="u-hover-class"
+				:hover-stay-time="200"
+			>
+				<text class="u-keyboard__button-wrapper__button__text">{{ item }}</text>
+			</view>
+		</view>
+		<view
+			class="u-keyboard__button-wrapper"
+		>
+			<view
+				class="u-keyboard__button-wrapper__button u-keyboard__button-wrapper__button--gray"
+				hover-class="u-hover-class"
+				:hover-stay-time="200"
+				@touchstart.stop="backspaceClick"
+				@touchend="clearTimer"
+			>
+				<u-icon
+					name="backspace"
+					color="#303133"
+					size="28"
+				></u-icon>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { randomArray } from '../../libs/function/index';
+	/**
+	 * keyboard 键盘组件
+	 * @description
+	 * @tutorial
+	 * @property {String}	mode		键盘的类型,number-数字键盘,card-身份证键盘
+	 * @property {Boolean}	dotDisabled	是否显示键盘的"."符号
+	 * @property {Boolean}	random		是否打乱键盘按键的顺序
+	 * @event {Function} change		点击键盘触发
+	 * @event {Function} backspace	点击退格键触发
+	 * @example
+	 */
+	export default {
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				backspace: 'backspace', // 退格键内容
+				dot: '.', // 点
+				timer: null, // 长按多次删除的事件监听
+				cardX: 'X' // 身份证的X符号
+			};
+		},
+		computed: {
+			// 键盘需要显示的内容
+			numList() {
+				let tmp = [];
+				if (this.dotDisabled && this.mode == 'number') {
+					if (!this.random) {
+						return [1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
+					} else {
+						return randomArray([1, 2, 3, 4, 5, 6, 7, 8, 9, 0]);
+					}
+				} else if (!this.dotDisabled && this.mode == 'number') {
+					if (!this.random) {
+						return [1, 2, 3, 4, 5, 6, 7, 8, 9, this.dot, 0];
+					} else {
+						return randomArray([1, 2, 3, 4, 5, 6, 7, 8, 9, this.dot, 0]);
+					}
+				} else if (this.mode == 'card') {
+					if (!this.random) {
+						return [1, 2, 3, 4, 5, 6, 7, 8, 9, this.cardX, 0];
+					} else {
+						return randomArray([1, 2, 3, 4, 5, 6, 7, 8, 9, this.cardX, 0]);
+					}
+				}
+			},
+			// 按键的样式,在非乱序&&数字键盘&&不显示点按钮时,index为9时,按键占位两个空间
+			itemStyle() {
+				return index => {
+					let style = {};
+					if (this.mode == 'number' && this.dotDisabled && index == 9) style.width = '464rpx';
+					return style;
+				};
+			},
+			// 是否让按键显示灰色,只在非乱序&&数字键盘&&且允许点按键的时候
+			btnBgGray() {
+				return index => {
+					if (!this.random && index == 9 && (this.mode != 'number' || (this.mode == 'number' && !this
+							.dotDisabled))) return true;
+					else return false;
+				};
+			},
+		},
+		created() {
+		},
+		emits: ["backspace", "change"],
+		methods: {
+			// 点击退格键
+			backspaceClick() {
+				this.$emit('backspace');
+				clearInterval(this.timer); //再次清空定时器,防止重复注册定时器
+				this.timer = null;
+				this.timer = setInterval(() => {
+					this.$emit('backspace');
+				}, 250);
+			},
+			clearTimer() {
+				clearInterval(this.timer);
+				this.timer = null;
+			},
+			// 获取键盘显示的内容
+			keyboardClick(val) {
+				// 允许键盘显示点模式和触发非点按键时,将内容转为数字类型
+				if (!this.dotDisabled && val != this.dot && val != this.cardX) val = Number(val);
+				this.$emit('change', val);
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+	$u-number-keyboard-background-color:rgb(224, 228, 230) !default;
+	$u-number-keyboard-padding:8px 10rpx 8px 10rpx !default;
+	$u-number-keyboard-button-width:222rpx !default;
+	$u-number-keyboard-button-margin:4px 6rpx !default;
+	$u-number-keyboard-button-border-top-left-radius:4px !default;
+	$u-number-keyboard-button-border-top-right-radius:4px !default;
+	$u-number-keyboard-button-border-bottom-left-radius:4px !default;
+	$u-number-keyboard-button-border-bottom-right-radius:4px !default;
+	$u-number-keyboard-button-height: 90rpx!default;
+	$u-number-keyboard-button-background-color:#FFFFFF !default;
+	$u-number-keyboard-button-box-shadow:0 2px 0px #BBBCBE !default;
+	$u-number-keyboard-text-font-size:20px !default;
+	$u-number-keyboard-text-font-weight:500 !default;
+	$u-number-keyboard-text-color:$u-main-color !default;
+	$u-number-keyboard-gray-background-color:rgb(200, 202, 210) !default;
+	$u-number-keyboard-u-hover-class-background-color: #BBBCC6 !default;
+
+	.u-keyboard {
+		@include flex;
+		flex-direction: row;
+		justify-content: space-around;
+		background-color: $u-number-keyboard-background-color;
+		flex-wrap: wrap;
+		padding: $u-number-keyboard-padding;
+
+		&__button-wrapper {
+			box-shadow: $u-number-keyboard-button-box-shadow;
+			margin: $u-number-keyboard-button-margin;
+			border-top-left-radius: $u-number-keyboard-button-border-top-left-radius;
+			border-top-right-radius: $u-number-keyboard-button-border-top-right-radius;
+			border-bottom-left-radius: $u-number-keyboard-button-border-bottom-left-radius;
+			border-bottom-right-radius: $u-number-keyboard-button-border-bottom-right-radius;
+
+			&__button {
+				width: $u-number-keyboard-button-width;
+				height: $u-number-keyboard-button-height;
+				background-color: $u-number-keyboard-button-background-color;
+				@include flex;
+				justify-content: center;
+				align-items: center;
+				border-top-left-radius: $u-number-keyboard-button-border-top-left-radius;
+				border-top-right-radius: $u-number-keyboard-button-border-top-right-radius;
+				border-bottom-left-radius: $u-number-keyboard-button-border-bottom-left-radius;
+				border-bottom-right-radius: $u-number-keyboard-button-border-bottom-right-radius;
+
+				&__text {
+					font-size: $u-number-keyboard-text-font-size;
+					font-weight: $u-number-keyboard-text-font-weight;
+					color: $u-number-keyboard-text-color;
+				}
+
+				&--gray {
+					background-color: $u-number-keyboard-gray-background-color;
+				}
+			}
+		}
+	}
+
+	.u-hover-class {
+		background-color: $u-number-keyboard-u-hover-class-background-color;
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-overlay/props.js b/uni_modules/uview-plus/components/u-overlay/props.js
new file mode 100644
index 0000000..55eb7cb
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-overlay/props.js
@@ -0,0 +1,25 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 是否显示遮罩
+        show: {
+            type: Boolean,
+            default: () => defProps.overlay.show
+        },
+        // 层级z-index
+        zIndex: {
+            type: [String, Number],
+            default: () => defProps.overlay.zIndex
+        },
+        // 遮罩的过渡时间,单位为ms
+        duration: {
+            type: [String, Number],
+            default: () => defProps.overlay.duration
+        },
+        // 不透明度值,当做rgba的第四个参数
+        opacity: {
+            type: [String, Number],
+            default: () => defProps.overlay.opacity
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-overlay/u-overlay.vue b/uni_modules/uview-plus/components/u-overlay/u-overlay.vue
new file mode 100644
index 0000000..b7dd7f3
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-overlay/u-overlay.vue
@@ -0,0 +1,71 @@
+<template>
+	<u-transition
+	    :show="show"
+	    custom-class="u-overlay"
+	    :duration="duration"
+	    :custom-style="overlayStyle"
+	    @click="clickHandler"
+	>
+		<slot />
+	</u-transition>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addStyle, deepMerge } from '../../libs/function/index';
+	/**
+	 * overlay 遮罩
+	 * @description 创建一个遮罩层,用于强调特定的页面元素,并阻止用户对遮罩下层的内容进行操作,一般用于弹窗场景
+	 * @tutorial https://ijry.github.io/uview-plus/components/overlay.html
+	 * @property {Boolean}			show		是否显示遮罩(默认 false )
+	 * @property {String | Number}	zIndex		zIndex 层级(默认 10070 )
+	 * @property {String | Number}	duration	动画时长,单位毫秒(默认 300 )
+	 * @property {String | Number}	opacity		不透明度值,当做rgba的第四个参数 (默认 0.5 )
+	 * @property {Object}			customStyle	定义需要用到的外部样式
+	 * @event {Function} click 点击遮罩发送事件
+	 * @example <u-overlay :show="show" @click="show = false"></u-overlay>
+	 */
+	export default {
+		name: "u-overlay",
+		mixins: [mpMixin, mixin,props],
+		computed: {
+			overlayStyle() {
+				const style = {
+					position: 'fixed',
+					top: 0,
+					left: 0,
+					right: 0,
+					zIndex: this.zIndex,
+					bottom: 0,
+					'background-color': `rgba(0, 0, 0, ${this.opacity})`
+				}
+				return deepMerge(style, addStyle(this.customStyle))
+			}
+		},
+		emits: ["click"],
+		methods: {
+			clickHandler() {
+				this.$emit('click')
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+     $u-overlay-top:0 !default;
+     $u-overlay-left:0 !default;
+     $u-overlay-width:100% !default;
+     $u-overlay-height:100% !default;
+     $u-overlay-background-color:rgba(0, 0, 0, .7) !default;
+	.u-overlay {
+		position: fixed;
+		top:$u-overlay-top;
+		left:$u-overlay-left;
+		width: $u-overlay-width;
+		height:$u-overlay-height;
+		background-color:$u-overlay-background-color;
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-parse/node/node.vue b/uni_modules/uview-plus/components/u-parse/node/node.vue
new file mode 100644
index 0000000..06035de
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-parse/node/node.vue
@@ -0,0 +1,576 @@
+<template>
+  <view :id="attrs.id" :class="'_block _'+name+' '+attrs.class" :style="attrs.style">
+    <block v-for="(n, i) in childs" v-bind:key="i">
+      <!-- 图片 -->
+      <!-- 占位图 -->
+      <image v-if="n.name==='img'&&!n.t&&((opts[1]&&!ctrl[i])||ctrl[i]<0)" class="_img" :style="n.attrs.style" :src="ctrl[i]<0?opts[2]:opts[1]" mode="widthFix" />
+      <!-- 显示图片 -->
+      <!-- #ifdef H5 || (APP-PLUS && VUE2) -->
+      <img v-if="n.name==='img'" :id="n.attrs.id" :class="'_img '+n.attrs.class" :style="(ctrl[i]===-1?'display:none;':'')+n.attrs.style" :src="n.attrs.src||(ctrl.load?n.attrs['data-src']:'')" :data-i="i" @load="imgLoad" @error="mediaError" @tap.stop="imgTap" @longpress="imgLongTap" />
+      <!-- #endif -->
+      <!-- #ifndef H5 || (APP-PLUS && VUE2) -->
+      <!-- 表格中的图片,使用 rich-text 防止大小不正确 -->
+      <rich-text v-if="n.name==='img'&&n.t" :style="'display:'+n.t" :nodes="'<img class=\'_img\' style=\''+n.attrs.style+'\' src=\''+n.attrs.src+'\'>'" :data-i="i" @tap.stop="imgTap" />
+      <!-- #endif -->
+      <!-- #ifndef H5 || APP-PLUS -->
+      <image v-else-if="n.name==='img'" :id="n.attrs.id" :class="'_img '+n.attrs.class" :style="(ctrl[i]===-1?'display:none;':'')+'width:'+(ctrl[i]||1)+'px;height:1px;'+n.attrs.style" :src="n.attrs.src" :mode="!n.h?'widthFix':(!n.w?'heightFix':'')" :lazy-load="opts[0]" :webp="n.webp" :show-menu-by-longpress="opts[3]&&!n.attrs.ignore" :image-menu-prevent="!opts[3]||n.attrs.ignore" :data-i="i" @load="imgLoad" @error="mediaError" @tap.stop="imgTap" @longpress="imgLongTap" />
+      <!-- #endif -->
+      <!-- #ifdef APP-PLUS && VUE3 -->
+      <image v-else-if="n.name==='img'" :id="n.attrs.id" :class="'_img '+n.attrs.class" :style="(ctrl[i]===-1?'display:none;':'')+'width:'+(ctrl[i]||1)+'px;'+n.attrs.style" :src="n.attrs.src||(ctrl.load?n.attrs['data-src']:'')" :mode="!n.h?'widthFix':(!n.w?'heightFix':'')" :data-i="i" @load="imgLoad" @error="mediaError" @tap.stop="imgTap" @longpress="imgLongTap" />
+      <!-- #endif -->
+      <!-- 文本 -->
+      <!-- #ifdef MP-WEIXIN -->
+      <text v-else-if="n.text" :user-select="opts[4]=='force'&&isiOS" decode>{{n.text}}</text>
+      <!-- #endif -->
+      <!-- #ifndef MP-WEIXIN || MP-BAIDU || MP-ALIPAY || MP-TOUTIAO -->
+      <text v-else-if="n.text" decode>{{n.text}}</text>
+      <!-- #endif -->
+      <text v-else-if="n.name==='br'">\n</text>
+      <!-- 链接 -->
+      <view v-else-if="n.name==='a'" :id="n.attrs.id" :class="(n.attrs.href?'_a ':'')+n.attrs.class" hover-class="_hover" :style="'display:inline;'+n.attrs.style" :data-i="i" @tap.stop="linkTap">
+        <node name="span" :childs="n.children" :opts="opts" style="display:inherit" />
+      </view>
+      <!-- 视频 -->
+      <!-- #ifdef APP-PLUS -->
+      <view v-else-if="n.html" :id="n.attrs.id" :class="'_video '+n.attrs.class" :style="n.attrs.style" v-html="n.html" @vplay.stop="play" />
+      <!-- #endif -->
+      <!-- #ifndef APP-PLUS -->
+      <video v-else-if="n.name==='video'" :id="n.attrs.id" :class="n.attrs.class" :style="n.attrs.style" :autoplay="n.attrs.autoplay" :controls="n.attrs.controls" :loop="n.attrs.loop" :muted="n.attrs.muted" :object-fit="n.attrs['object-fit']" :poster="n.attrs.poster" :src="n.src[ctrl[i]||0]" :data-i="i" @play="play" @error="mediaError" />
+      <!-- #endif -->
+      <!-- #ifdef H5 || APP-PLUS -->
+      <iframe v-else-if="n.name==='iframe'" :style="n.attrs.style" :allowfullscreen="n.attrs.allowfullscreen" :frameborder="n.attrs.frameborder" :src="n.attrs.src" />
+      <embed v-else-if="n.name==='embed'" :style="n.attrs.style" :src="n.attrs.src" />
+      <!-- #endif -->
+      <!-- #ifndef MP-TOUTIAO || ((H5 || APP-PLUS) && VUE3) -->
+      <!-- 音频 -->
+      <audio v-else-if="n.name==='audio'" :id="n.attrs.id" :class="n.attrs.class" :style="n.attrs.style" :author="n.attrs.author" :controls="n.attrs.controls" :loop="n.attrs.loop" :name="n.attrs.name" :poster="n.attrs.poster" :src="n.src[ctrl[i]||0]" :data-i="i" @play="play" @error="mediaError" />
+      <!-- #endif -->
+      <view v-else-if="(n.name==='table'&&n.c)||n.name==='li'" :id="n.attrs.id" :class="'_'+n.name+' '+n.attrs.class" :style="n.attrs.style">
+        <node v-if="n.name==='li'" :childs="n.children" :opts="opts" />
+        <view v-else v-for="(tbody, x) in n.children" v-bind:key="x" :class="'_'+tbody.name+' '+tbody.attrs.class" :style="tbody.attrs.style">
+          <node v-if="tbody.name==='td'||tbody.name==='th'" :childs="tbody.children" :opts="opts" />
+          <block v-else v-for="(tr, y) in tbody.children" v-bind:key="y">
+            <view v-if="tr.name==='td'||tr.name==='th'" :class="'_'+tr.name+' '+tr.attrs.class" :style="tr.attrs.style">
+              <node :childs="tr.children" :opts="opts" />
+            </view>
+            <view v-else :class="'_'+tr.name+' '+tr.attrs.class" :style="tr.attrs.style">
+              <view v-for="(td, z) in tr.children" v-bind:key="z" :class="'_'+td.name+' '+td.attrs.class" :style="td.attrs.style">
+                <node :childs="td.children" :opts="opts" />
+              </view>
+            </view>
+          </block>
+        </view>
+      </view>
+
+      <!-- 富文本 -->
+      <!-- #ifdef H5 || ((MP-WEIXIN || MP-QQ || APP-PLUS || MP-360) && VUE2) -->
+      <rich-text v-else-if="!n.c&&!handler.isInline(n.name, n.attrs.style)" :id="n.attrs.id" :style="n.f" :user-select="opts[4]" :nodes="[n]" />
+      <!-- #endif -->
+      <!-- #ifndef H5 || ((MP-WEIXIN || MP-QQ || APP-PLUS || MP-360) && VUE2) -->
+      <rich-text v-else-if="!n.c" :id="n.attrs.id" :style="n.f+';display:inline'" :preview="false" :selectable="opts[4]" :user-select="opts[4]" :nodes="[n]" />
+      <!-- #endif -->
+      <!-- 继续递归 -->
+      <view v-else-if="n.c===2" :id="n.attrs.id" :class="'_block _'+n.name+' '+n.attrs.class" :style="n.f+';'+n.attrs.style">
+        <node v-for="(n2, j) in n.children" v-bind:key="j" :style="n2.f" :name="n2.name" :attrs="n2.attrs" :childs="n2.children" :opts="opts" />
+      </view>
+      <node v-else :style="n.f" :name="n.name" :attrs="n.attrs" :childs="n.children" :opts="opts" />
+    </block>
+  </view>
+</template>
+<script module="handler" lang="wxs">
+// 行内标签列表
+var inlineTags = {
+  abbr: true,
+  b: true,
+  big: true,
+  code: true,
+  del: true,
+  em: true,
+  i: true,
+  ins: true,
+  label: true,
+  q: true,
+  small: true,
+  span: true,
+  strong: true,
+  sub: true,
+  sup: true
+}
+/**
+ * @description 判断是否为行内标签
+ */
+module.exports = {
+  isInline: function (tagName, style) {
+    return inlineTags[tagName] || (style || '').indexOf('display:inline') !== -1
+  }
+}
+</script>
+<script>
+
+import node from './node'
+export default {
+  name: 'node',
+  options: {
+    // #ifdef MP-WEIXIN
+    virtualHost: true,
+    // #endif
+    // #ifdef MP-TOUTIAO
+    addGlobalClass: false
+    // #endif
+  },
+  data () {
+    return {
+      ctrl: {},
+      // #ifdef MP-WEIXIN
+      isiOS: uni.getSystemInfoSync().system.includes('iOS')
+      // #endif
+    }
+  },
+  props: {
+    name: String,
+    attrs: {
+      type: Object,
+      default () {
+        return {}
+      }
+    },
+    childs: Array,
+    opts: Array
+  },
+  components: {
+
+    // #ifndef (H5 || APP-PLUS) && VUE3
+    node
+    // #endif
+  },
+  mounted () {
+    this.$nextTick(() => {
+      for (this.root = this.$parent; this.root.$options.name !== 'u-parse'; this.root = this.root.$parent);
+    })
+    // #ifdef H5 || APP-PLUS
+    if (this.opts[0]) {
+      let i
+      for (i = this.childs.length; i--;) {
+        if (this.childs[i].name === 'img') break
+      }
+      if (i !== -1) {
+        this.observer = uni.createIntersectionObserver(this).relativeToViewport({
+          top: 500,
+          bottom: 500
+        })
+        this.observer.observe('._img', res => {
+          if (res.intersectionRatio) {
+            this.$set(this.ctrl, 'load', 1)
+            this.observer.disconnect()
+          }
+        })
+      }
+    }
+    // #endif
+  },
+  beforeDestroy () {
+    // #ifdef H5 || APP-PLUS
+    if (this.observer) {
+      this.observer.disconnect()
+    }
+    // #endif
+  },
+  methods:{
+    // #ifdef MP-WEIXIN
+    toJSON () { return this },
+    // #endif
+    /**
+     * @description 播放视频事件
+     * @param {Event} e
+     */
+    play (e) {
+      this.root.$emit('play')
+      // #ifndef APP-PLUS
+      if (this.root.pauseVideo) {
+        let flag = false
+        const id = e.target.id
+        for (let i = this.root._videos.length; i--;) {
+          if (this.root._videos[i].id === id) {
+            flag = true
+          } else {
+            this.root._videos[i].pause() // 自动暂停其他视频
+          }
+        }
+        // 将自己加入列表
+        if (!flag) {
+          const ctx = uni.createVideoContext(id
+            // #ifndef MP-BAIDU
+            , this
+            // #endif
+          )
+          ctx.id = id
+          if (this.root.playbackRate) {
+            ctx.playbackRate(this.root.playbackRate)
+          }
+          this.root._videos.push(ctx)
+        }
+      }
+      // #endif
+    },
+
+    /**
+     * @description 图片点击事件
+     * @param {Event} e
+     */
+    imgTap (e) {
+      const node = this.childs[e.currentTarget.dataset.i]
+      if (node.a) {
+        this.linkTap(node.a)
+        return
+      }
+      if (node.attrs.ignore) return
+      // #ifdef H5 || APP-PLUS
+      node.attrs.src = node.attrs.src || node.attrs['data-src']
+      // #endif
+      this.root.$emit('imgTap', node.attrs)
+      // 自动预览图片
+      if (this.root.previewImg) {
+        uni.previewImage({
+          // #ifdef MP-WEIXIN
+          showmenu: this.root.showImgMenu,
+          // #endif
+          // #ifdef MP-ALIPAY
+          enablesavephoto: this.root.showImgMenu,
+          enableShowPhotoDownload: this.root.showImgMenu,
+          // #endif
+          current: parseInt(node.attrs.i),
+          urls: this.root.imgList
+        })
+      }
+    },
+
+    /**
+     * @description 图片长按
+     */
+    imgLongTap (e) {
+      // #ifdef APP-PLUS
+      const attrs = this.childs[e.currentTarget.dataset.i].attrs
+      if (this.opts[3] && !attrs.ignore) {
+        uni.showActionSheet({
+          itemList: ['保存图片'],
+          success: () => {
+            const save = path => {
+              uni.saveImageToPhotosAlbum({
+                filePath: path,
+                success () {
+                  uni.showToast({
+                    title: '保存成功'
+                  })
+                }
+              })
+            }
+            if (this.root.imgList[attrs.i].startsWith('http')) {
+              uni.downloadFile({
+                url: this.root.imgList[attrs.i],
+                success: res => save(res.tempFilePath)
+              })
+            } else {
+              save(this.root.imgList[attrs.i])
+            }
+          }
+        })
+      }
+      // #endif
+    },
+
+    /**
+     * @description 图片加载完成事件
+     * @param {Event} e
+     */
+    imgLoad (e) {
+      const i = e.currentTarget.dataset.i
+      /* #ifndef H5 || (APP-PLUS && VUE2) */
+      if (!this.childs[i].w) {
+        // 设置原宽度
+        this.$set(this.ctrl, i, e.detail.width)
+      } else /* #endif */ if ((this.opts[1] && !this.ctrl[i]) || this.ctrl[i] === -1) {
+        // 加载完毕,取消加载中占位图
+        this.$set(this.ctrl, i, 1)
+      }
+      this.checkReady()
+    },
+
+    /**
+     * @description 检查是否所有图片加载完毕
+     */
+    checkReady () {
+      if (!this.root.lazyLoad) {
+        this.root._unloadimgs -= 1
+        if (!this.root._unloadimgs) {
+          setTimeout(() => {
+            this.root.getRect().then(rect => {
+              this.root.$emit('ready', rect)
+            }).catch(() => {
+              this.root.$emit('ready', {})
+            })
+          }, 350)
+        }
+      }
+    },
+
+    /**
+     * @description 链接点击事件
+     * @param {Event} e
+     */
+    linkTap (e) {
+      const node = e.currentTarget ? this.childs[e.currentTarget.dataset.i] : {}
+      const attrs = node.attrs || e
+      const href = attrs.href
+      this.root.$emit('linkTap', Object.assign({
+        innerText: this.root.getText(node.children || []) // 链接内的文本内容
+      }, attrs))
+      if (href) {
+        if (href[0] === '#') {
+          // 跳转锚点
+          this.root.navigateTo(href.substring(1)).catch(() => { })
+        } else if (href.split('?')[0].includes('://')) {
+          // 复制外部链接
+          if (this.root.copyLink) {
+            // #ifdef H5
+            window.open(href)
+            // #endif
+            // #ifdef MP
+            uni.setClipboardData({
+              data: href,
+              success: () =>
+                uni.showToast({
+                  title: '链接已复制'
+                })
+            })
+            // #endif
+            // #ifdef APP-PLUS
+            plus.runtime.openWeb(href)
+            // #endif
+          }
+        } else {
+          // 跳转页面
+          uni.navigateTo({
+            url: href,
+            fail () {
+              uni.switchTab({
+                url: href,
+                fail () { }
+              })
+            }
+          })
+        }
+      }
+    },
+
+    /**
+     * @description 错误事件
+     * @param {Event} e
+     */
+    mediaError (e) {
+      const i = e.currentTarget.dataset.i
+      const node = this.childs[i]
+      // 加载其他源
+      if (node.name === 'video' || node.name === 'audio') {
+        let index = (this.ctrl[i] || 0) + 1
+        if (index > node.src.length) {
+          index = 0
+        }
+        if (index < node.src.length) {
+          this.$set(this.ctrl, i, index)
+          return
+        }
+      } else if (node.name === 'img') {
+        // #ifdef H5 && VUE3
+        if (this.opts[0] && !this.ctrl.load) return
+        // #endif
+        // 显示错误占位图
+        if (this.opts[2]) {
+          this.$set(this.ctrl, i, -1)
+        }
+        this.checkReady()
+      }
+      if (this.root) {
+        this.root.$emit('error', {
+          source: node.name,
+          attrs: node.attrs,
+          // #ifndef H5 && VUE3
+          errMsg: e.detail.errMsg
+          // #endif
+        })
+      }
+    }
+  }
+}
+</script>
+<style>
+/* a 标签默认效果 */
+._a {
+  padding: 1.5px 0 1.5px 0;
+  color: #366092;
+  word-break: break-all;
+}
+
+/* a 标签点击态效果 */
+._hover {
+  text-decoration: underline;
+  opacity: 0.7;
+}
+
+/* 图片默认效果 */
+._img {
+  max-width: 100%;
+  -webkit-touch-callout: none;
+}
+
+/* 内部样式 */
+
+._block {
+  display: block;
+}
+
+._b,
+._strong {
+  font-weight: bold;
+}
+
+._code {
+  font-family: monospace;
+}
+
+._del {
+  text-decoration: line-through;
+}
+
+._em,
+._i {
+  font-style: italic;
+}
+
+._h1 {
+  font-size: 2em;
+}
+
+._h2 {
+  font-size: 1.5em;
+}
+
+._h3 {
+  font-size: 1.17em;
+}
+
+._h5 {
+  font-size: 0.83em;
+}
+
+._h6 {
+  font-size: 0.67em;
+}
+
+._h1,
+._h2,
+._h3,
+._h4,
+._h5,
+._h6 {
+  display: block;
+  font-weight: bold;
+}
+
+._image {
+  height: 1px;
+}
+
+._ins {
+  text-decoration: underline;
+}
+
+._li {
+  display: list-item;
+}
+
+._ol {
+  list-style-type: decimal;
+}
+
+._ol,
+._ul {
+  display: block;
+  padding-left: 40px;
+  margin: 1em 0;
+}
+
+._q::before {
+  content: '"';
+}
+
+._q::after {
+  content: '"';
+}
+
+._sub {
+  font-size: smaller;
+  vertical-align: sub;
+}
+
+._sup {
+  font-size: smaller;
+  vertical-align: super;
+}
+
+._thead,
+._tbody,
+._tfoot {
+  display: table-row-group;
+}
+
+._tr {
+  display: table-row;
+}
+
+._td,
+._th {
+  display: table-cell;
+  vertical-align: middle;
+}
+
+._th {
+  font-weight: bold;
+  text-align: center;
+}
+
+._ul {
+  list-style-type: disc;
+}
+
+._ul ._ul {
+  margin: 0;
+  list-style-type: circle;
+}
+
+._ul ._ul ._ul {
+  list-style-type: square;
+}
+
+._abbr,
+._b,
+._code,
+._del,
+._em,
+._i,
+._ins,
+._label,
+._q,
+._span,
+._strong,
+._sub,
+._sup {
+  display: inline;
+}
+
+/* #ifdef APP-PLUS */
+._video {
+  width: 300px;
+  height: 225px;
+}
+/* #endif */
+</style>
\ No newline at end of file
diff --git a/uni_modules/uview-plus/components/u-parse/parser.js b/uni_modules/uview-plus/components/u-parse/parser.js
new file mode 100644
index 0000000..c251cbf
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-parse/parser.js
@@ -0,0 +1,1333 @@
+/**
+ * @fileoverview html 解析器
+ */
+
+// 配置
+const config = {
+  // 信任的标签(保持标签名不变)
+  trustTags: makeMap('a,abbr,ad,audio,b,blockquote,br,code,col,colgroup,dd,del,dl,dt,div,em,fieldset,h1,h2,h3,h4,h5,h6,hr,i,img,ins,label,legend,li,ol,p,q,ruby,rt,source,span,strong,sub,sup,table,tbody,td,tfoot,th,thead,tr,title,ul,video'),
+
+  // 块级标签(转为 div,其他的非信任标签转为 span)
+  blockTags: makeMap('address,article,aside,body,caption,center,cite,footer,header,html,nav,pre,section'),
+
+  // #ifdef (MP-WEIXIN || MP-QQ || APP-PLUS || MP-360) && VUE3
+  // 行内标签
+  inlineTags: makeMap('abbr,b,big,code,del,em,i,ins,label,q,small,span,strong,sub,sup'),
+  // #endif
+
+  // 要移除的标签
+  ignoreTags: makeMap('area,base,canvas,embed,frame,head,iframe,input,link,map,meta,param,rp,script,source,style,textarea,title,track,wbr'),
+
+  // 自闭合的标签
+  voidTags: makeMap('area,base,br,col,circle,ellipse,embed,frame,hr,img,input,line,link,meta,param,path,polygon,rect,source,track,use,wbr'),
+
+  // html 实体
+  entities: {
+    lt: '<',
+    gt: '>',
+    quot: '"',
+    apos: "'",
+    ensp: '\u2002',
+    emsp: '\u2003',
+    nbsp: '\xA0',
+    semi: ';',
+    ndash: '–',
+    mdash: '—',
+    middot: '·',
+    lsquo: '‘',
+    rsquo: '’',
+    ldquo: '“',
+    rdquo: '”',
+    bull: '•',
+    hellip: '…',
+    larr: '←',
+    uarr: '↑',
+    rarr: '→',
+    darr: '↓'
+  },
+
+  // 默认的标签样式
+  tagStyle: {
+    // #ifndef APP-PLUS-NVUE
+    address: 'font-style:italic',
+    big: 'display:inline;font-size:1.2em',
+    caption: 'display:table-caption;text-align:center',
+    center: 'text-align:center',
+    cite: 'font-style:italic',
+    dd: 'margin-left:40px',
+    mark: 'background-color:yellow',
+    pre: 'font-family:monospace;white-space:pre',
+    s: 'text-decoration:line-through',
+    small: 'display:inline;font-size:0.8em',
+    strike: 'text-decoration:line-through',
+    u: 'text-decoration:underline'
+    // #endif
+  },
+
+  // svg 大小写对照表
+  svgDict: {
+    animatetransform: 'animateTransform',
+    lineargradient: 'linearGradient',
+    viewbox: 'viewBox',
+    attributename: 'attributeName',
+    repeatcount: 'repeatCount',
+    repeatdur: 'repeatDur'
+  }
+}
+const tagSelector={}
+const {
+  windowWidth,
+  // #ifdef MP-WEIXIN
+  system
+  // #endif
+} = uni.getSystemInfoSync()
+const blankChar = makeMap(' ,\r,\n,\t,\f')
+let idIndex = 0
+
+// #ifdef H5 || APP-PLUS
+config.ignoreTags.iframe = undefined
+config.trustTags.iframe = true
+config.ignoreTags.embed = undefined
+config.trustTags.embed = true
+// #endif
+// #ifdef APP-PLUS-NVUE
+config.ignoreTags.source = undefined
+config.ignoreTags.style = undefined
+// #endif
+
+/**
+ * @description 创建 map
+ * @param {String} str 逗号分隔
+ */
+function makeMap (str) {
+  const map = Object.create(null)
+  const list = str.split(',')
+  for (let i = list.length; i--;) {
+    map[list[i]] = true
+  }
+  return map
+}
+
+/**
+ * @description 解码 html 实体
+ * @param {String} str 要解码的字符串
+ * @param {Boolean} amp 要不要解码 &amp;
+ * @returns {String} 解码后的字符串
+ */
+function decodeEntity (str, amp) {
+  let i = str.indexOf('&')
+  while (i !== -1) {
+    const j = str.indexOf(';', i + 3)
+    let code
+    if (j === -1) break
+    if (str[i + 1] === '#') {
+      // &#123; 形式的实体
+      code = parseInt((str[i + 2] === 'x' ? '0' : '') + str.substring(i + 2, j))
+      if (!isNaN(code)) {
+        str = str.substr(0, i) + String.fromCharCode(code) + str.substr(j + 1)
+      }
+    } else {
+      // &nbsp; 形式的实体
+      code = str.substring(i + 1, j)
+      if (config.entities[code] || (code === 'amp' && amp)) {
+        str = str.substr(0, i) + (config.entities[code] || '&') + str.substr(j + 1)
+      }
+    }
+    i = str.indexOf('&', i + 1)
+  }
+  return str
+}
+
+/**
+ * @description 合并多个块级标签,加快长内容渲染
+ * @param {Array} nodes 要合并的标签数组
+ */
+function mergeNodes (nodes) {
+  let i = nodes.length - 1
+  for (let j = i; j >= -1; j--) {
+    if (j === -1 || nodes[j].c || !nodes[j].name || (nodes[j].name !== 'div' && nodes[j].name !== 'p' && nodes[j].name[0] !== 'h') || (nodes[j].attrs.style || '').includes('inline')) {
+      if (i - j >= 5) {
+        nodes.splice(j + 1, i - j, {
+          name: 'div',
+          attrs: {},
+          children: nodes.slice(j + 1, i + 1)
+        })
+      }
+      i = j - 1
+    }
+  }
+}
+
+/**
+ * @description html 解析器
+ * @param {Object} vm 组件实例
+ */
+function Parser (vm) {
+  this.options = vm || {}
+  this.tagStyle = Object.assign({}, config.tagStyle, this.options.tagStyle)
+  this.imgList = vm.imgList || []
+  this.imgList._unloadimgs = 0
+  this.plugins = vm.plugins || []
+  this.attrs = Object.create(null)
+  this.stack = []
+  this.nodes = []
+  this.pre = (this.options.containerStyle || '').includes('white-space') && this.options.containerStyle.includes('pre') ? 2 : 0
+}
+
+/**
+ * @description 执行解析
+ * @param {String} content 要解析的文本
+ */
+Parser.prototype.parse = function (content) {
+  // 插件处理
+  for (let i = this.plugins.length; i--;) {
+    if (this.plugins[i].onUpdate) {
+      content = this.plugins[i].onUpdate(content, config) || content
+    }
+  }
+
+  new Lexer(this).parse(content)
+  // 出栈未闭合的标签
+  while (this.stack.length) {
+    this.popNode()
+  }
+  if (this.nodes.length > 50) {
+    mergeNodes(this.nodes)
+  }
+  return this.nodes
+}
+
+/**
+ * @description 将标签暴露出来(不被 rich-text 包含)
+ */
+Parser.prototype.expose = function () {
+  // #ifndef APP-PLUS-NVUE
+  for (let i = this.stack.length; i--;) {
+    const item = this.stack[i]
+    if (item.c || item.name === 'a' || item.name === 'video' || item.name === 'audio') return
+    item.c = 1
+  }
+  // #endif
+}
+
+/**
+ * @description 处理插件
+ * @param {Object} node 要处理的标签
+ * @returns {Boolean} 是否要移除此标签
+ */
+Parser.prototype.hook = function (node) {
+  for (let i = this.plugins.length; i--;) {
+    if (this.plugins[i].onParse && this.plugins[i].onParse(node, this) === false) {
+      return false
+    }
+  }
+  return true
+}
+
+/**
+ * @description 将链接拼接上主域名
+ * @param {String} url 需要拼接的链接
+ * @returns {String} 拼接后的链接
+ */
+Parser.prototype.getUrl = function (url) {
+  const domain = this.options.domain
+  if (url[0] === '/') {
+    if (url[1] === '/') {
+      // // 开头的补充协议名
+      url = (domain ? domain.split('://')[0] : 'http') + ':' + url
+    } else if (domain) {
+      // 否则补充整个域名
+      url = domain + url
+    } /* #ifdef APP-PLUS */ else {
+      url = plus.io.convertLocalFileSystemURL(url)
+    } /* #endif */
+  } else if (!url.includes('data:') && !url.includes('://')) {
+    if (domain) {
+      url = domain + '/' + url
+    } /* #ifdef APP-PLUS */ else {
+      url = plus.io.convertLocalFileSystemURL(url)
+    } /* #endif */
+  }
+  return url
+}
+
+/**
+ * @description 解析样式表
+ * @param {Object} node 标签
+ * @returns {Object}
+ */
+Parser.prototype.parseStyle = function (node) {
+  const attrs = node.attrs
+  const list = (this.tagStyle[node.name] || '').split(';').concat((attrs.style || '').split(';'))
+  const styleObj = {}
+  let tmp = ''
+
+  if (attrs.id && !this.xml) {
+    // 暴露锚点
+    if (this.options.useAnchor) {
+      this.expose()
+    } else if (node.name !== 'img' && node.name !== 'a' && node.name !== 'video' && node.name !== 'audio') {
+      attrs.id = undefined
+    }
+  }
+
+  // 转换 width 和 height 属性
+  if (attrs.width) {
+    styleObj.width = parseFloat(attrs.width) + (attrs.width.includes('%') ? '%' : 'px')
+    attrs.width = undefined
+  }
+  if (attrs.height) {
+    styleObj.height = parseFloat(attrs.height) + (attrs.height.includes('%') ? '%' : 'px')
+    attrs.height = undefined
+  }
+
+  for (let i = 0, len = list.length; i < len; i++) {
+    const info = list[i].split(':')
+    if (info.length < 2) continue
+    const key = info.shift().trim().toLowerCase()
+    let value = info.join(':').trim()
+    if ((value[0] === '-' && value.lastIndexOf('-') > 0) || value.includes('safe')) {
+      // 兼容性的 css 不压缩
+      tmp += `;${key}:${value}`
+    } else if (!styleObj[key] || value.includes('import') || !styleObj[key].includes('import')) {
+      // 重复的样式进行覆盖
+      if (value.includes('url')) {
+        // 填充链接
+        let j = value.indexOf('(') + 1
+        if (j) {
+          while (value[j] === '"' || value[j] === "'" || blankChar[value[j]]) {
+            j++
+          }
+          value = value.substr(0, j) + this.getUrl(value.substr(j))
+        }
+      } else if (value.includes('rpx')) {
+        // 转换 rpx(rich-text 内部不支持 rpx)
+        value = value.replace(/[0-9.]+\s*rpx/g, $ => parseFloat($) * windowWidth / 750 + 'px')
+      }
+      styleObj[key] = value
+    }
+  }
+
+  node.attrs.style = tmp
+  return styleObj
+}
+
+/**
+ * @description 解析到标签名
+ * @param {String} name 标签名
+ * @private
+ */
+Parser.prototype.onTagName = function (name) {
+  this.tagName = this.xml ? name : name.toLowerCase()
+  if (this.tagName === 'svg') {
+    this.xml = (this.xml || 0) + 1 // svg 标签内大小写敏感
+  }
+}
+
+/**
+ * @description 解析到属性名
+ * @param {String} name 属性名
+ * @private
+ */
+Parser.prototype.onAttrName = function (name) {
+  name = this.xml ? name : name.toLowerCase()
+  if (name.substr(0, 5) === 'data-') {
+    if (name === 'data-src' && !this.attrs.src) {
+      // data-src 自动转为 src
+      this.attrName = 'src'
+    } else if (this.tagName === 'img' || this.tagName === 'a') {
+      // a 和 img 标签保留 data- 的属性,可以在 imgTap 和 linkTap 事件中使用
+      this.attrName = name
+    } else {
+      // 剩余的移除以减小大小
+      this.attrName = undefined
+    }
+  } else {
+    this.attrName = name
+    this.attrs[name] = 'T' // boolean 型属性缺省设置
+  }
+}
+
+/**
+ * @description 解析到属性值
+ * @param {String} val 属性值
+ * @private
+ */
+Parser.prototype.onAttrVal = function (val) {
+  const name = this.attrName || ''
+  if (name === 'style' || name === 'href') {
+    // 部分属性进行实体解码
+    this.attrs[name] = decodeEntity(val, true)
+  } else if (name.includes('src')) {
+    // 拼接主域名
+    this.attrs[name] = this.getUrl(decodeEntity(val, true))
+  } else if (name) {
+    this.attrs[name] = val
+  }
+}
+
+/**
+ * @description 解析到标签开始
+ * @param {Boolean} selfClose 是否有自闭合标识 />
+ * @private
+ */
+Parser.prototype.onOpenTag = function (selfClose) {
+  // 拼装 node
+  const node = Object.create(null)
+  node.name = this.tagName
+  node.attrs = this.attrs
+  // 避免因为自动 diff 使得 type 被设置为 null 导致部分内容不显示
+  if (this.options.nodes.length) {
+    node.type = 'node'
+  }
+  this.attrs = Object.create(null)
+
+  const attrs = node.attrs
+  const parent = this.stack[this.stack.length - 1]
+  const siblings = parent ? parent.children : this.nodes
+  const close = this.xml ? selfClose : config.voidTags[node.name]
+
+  // 替换标签名选择器
+  if (tagSelector[node.name]) {
+    attrs.class = tagSelector[node.name] + (attrs.class ? ' ' + attrs.class : '')
+  }
+
+  // 转换 embed 标签
+  if (node.name === 'embed') {
+    // #ifndef H5 || APP-PLUS
+    const src = attrs.src || ''
+    // 按照后缀名和 type 将 embed 转为 video 或 audio
+    if (src.includes('.mp4') || src.includes('.3gp') || src.includes('.m3u8') || (attrs.type || '').includes('video')) {
+      node.name = 'video'
+    } else if (src.includes('.mp3') || src.includes('.wav') || src.includes('.aac') || src.includes('.m4a') || (attrs.type || '').includes('audio')) {
+      node.name = 'audio'
+    }
+    if (attrs.autostart) {
+      attrs.autoplay = 'T'
+    }
+    attrs.controls = 'T'
+    // #endif
+    // #ifdef H5 || APP-PLUS
+    this.expose()
+    // #endif
+  }
+
+  // #ifndef APP-PLUS-NVUE
+  // 处理音视频
+  if (node.name === 'video' || node.name === 'audio') {
+    // 设置 id 以便获取 context
+    if (node.name === 'video' && !attrs.id) {
+      attrs.id = 'v' + idIndex++
+    }
+    // 没有设置 controls 也没有设置 autoplay 的自动设置 controls
+    if (!attrs.controls && !attrs.autoplay) {
+      attrs.controls = 'T'
+    }
+    // 用数组存储所有可用的 source
+    node.src = []
+    if (attrs.src) {
+      node.src.push(attrs.src)
+      attrs.src = undefined
+    }
+    this.expose()
+  }
+  // #endif
+
+  // 处理自闭合标签
+  if (close) {
+    if (!this.hook(node) || config.ignoreTags[node.name]) {
+      // 通过 base 标签设置主域名
+      if (node.name === 'base' && !this.options.domain) {
+        this.options.domain = attrs.href
+      } /* #ifndef APP-PLUS-NVUE */ else if (node.name === 'source' && parent && (parent.name === 'video' || parent.name === 'audio') && attrs.src) {
+        // 设置 source 标签(仅父节点为 video 或 audio 时有效)
+        parent.src.push(attrs.src)
+      } /* #endif */
+      return
+    }
+
+    // 解析 style
+    const styleObj = this.parseStyle(node)
+
+    // 处理图片
+    if (node.name === 'img') {
+      if (attrs.src) {
+        // 标记 webp
+        if (attrs.src.includes('webp')) {
+          node.webp = 'T'
+        }
+        // data url 图片如果没有设置 original-src 默认为不可预览的小图片
+        if (attrs.src.includes('data:') && !attrs['original-src']) {
+          attrs.ignore = 'T'
+        }
+        if (!attrs.ignore || node.webp || attrs.src.includes('cloud://')) {
+          for (let i = this.stack.length; i--;) {
+            const item = this.stack[i]
+            if (item.name === 'a') {
+              node.a = item.attrs
+            }
+            if (item.name === 'table' && !node.webp && !attrs.src.includes('cloud://')) {
+              if (!styleObj.display || styleObj.display.includes('inline')) {
+                node.t = 'inline-block'
+              } else {
+                node.t = styleObj.display
+              }
+              styleObj.display = undefined
+            }
+            // #ifndef H5 || APP-PLUS
+            const style = item.attrs.style || ''
+            if (style.includes('flex:') && !style.includes('flex:0') && !style.includes('flex: 0') && (!styleObj.width || parseInt(styleObj.width) > 100)) {
+              styleObj.width = '100% !important'
+              styleObj.height = ''
+              for (let j = i + 1; j < this.stack.length; j++) {
+                this.stack[j].attrs.style = (this.stack[j].attrs.style || '').replace('inline-', '')
+              }
+            } else if (style.includes('flex') && styleObj.width === '100%') {
+              for (let j = i + 1; j < this.stack.length; j++) {
+                const style = this.stack[j].attrs.style || ''
+                if (!style.includes(';width') && !style.includes(' width') && style.indexOf('width') !== 0) {
+                  styleObj.width = ''
+                  break
+                }
+              }
+            } else if (style.includes('inline-block')) {
+              if (styleObj.width && styleObj.width[styleObj.width.length - 1] === '%') {
+                item.attrs.style += ';max-width:' + styleObj.width
+                styleObj.width = ''
+              } else {
+                item.attrs.style += ';max-width:100%'
+              }
+            }
+            // #endif
+            item.c = 1
+          }
+          attrs.i = this.imgList.length.toString()
+          let src = attrs['original-src'] || attrs.src
+          // #ifndef H5 || MP-ALIPAY || APP-PLUS || MP-360
+          if (this.imgList.includes(src)) {
+            // 如果有重复的链接则对域名进行随机大小写变换避免预览时错位
+            let i = src.indexOf('://')
+            if (i !== -1) {
+              i += 3
+              let newSrc = src.substr(0, i)
+              for (; i < src.length; i++) {
+                if (src[i] === '/') break
+                newSrc += Math.random() > 0.5 ? src[i].toUpperCase() : src[i]
+              }
+              newSrc += src.substr(i)
+              src = newSrc
+            }
+          }
+          // #endif
+          this.imgList.push(src)
+          if (!node.t) {
+            this.imgList._unloadimgs += 1
+          }
+          // #ifdef H5 || APP-PLUS
+          if (this.options.lazyLoad) {
+            attrs['data-src'] = attrs.src
+            attrs.src = undefined
+          }
+          // #endif
+        }
+      }
+      if (styleObj.display === 'inline') {
+        styleObj.display = ''
+      }
+      // #ifndef APP-PLUS-NVUE
+      if (attrs.ignore) {
+        styleObj['max-width'] = styleObj['max-width'] || '100%'
+        attrs.style += ';-webkit-touch-callout:none'
+      }
+      // #endif
+      // 设置的宽度超出屏幕,为避免变形,高度转为自动
+      if (parseInt(styleObj.width) > windowWidth) {
+        styleObj.height = undefined
+      }
+      // 记录是否设置了宽高
+      if (!isNaN(parseInt(styleObj.width))) {
+        node.w = 'T'
+      }
+      if (!isNaN(parseInt(styleObj.height)) && (!styleObj.height.includes('%') || (parent && (parent.attrs.style || '').includes('height')))) {
+        node.h = 'T'
+      }
+    } else if (node.name === 'svg') {
+      siblings.push(node)
+      this.stack.push(node)
+      this.popNode()
+      return
+    }
+    for (const key in styleObj) {
+      if (styleObj[key]) {
+        attrs.style += `;${key}:${styleObj[key].replace(' !important', '')}`
+      }
+    }
+    attrs.style = attrs.style.substr(1) || undefined
+    // #ifdef (MP-WEIXIN || MP-QQ) && VUE3
+    if (!attrs.style) {
+      delete attrs.style
+    }
+    // #endif
+  } else {
+    if ((node.name === 'pre' || ((attrs.style || '').includes('white-space') && attrs.style.includes('pre'))) && this.pre !== 2) {
+      this.pre = node.pre = 1
+    }
+    node.children = []
+    this.stack.push(node)
+  }
+
+  // 加入节点树
+  siblings.push(node)
+}
+
+/**
+ * @description 解析到标签结束
+ * @param {String} name 标签名
+ * @private
+ */
+Parser.prototype.onCloseTag = function (name) {
+  // 依次出栈到匹配为止
+  name = this.xml ? name : name.toLowerCase()
+  let i
+  for (i = this.stack.length; i--;) {
+    if (this.stack[i].name === name) break
+  }
+  if (i !== -1) {
+    while (this.stack.length > i) {
+      this.popNode()
+    }
+  } else if (name === 'p' || name === 'br') {
+    const siblings = this.stack.length ? this.stack[this.stack.length - 1].children : this.nodes
+    siblings.push({
+      name,
+      attrs: {
+        class: tagSelector[name] || '',
+        style: this.tagStyle[name] || ''
+      }
+    })
+  }
+}
+
+/**
+ * @description 处理标签出栈
+ * @private
+ */
+Parser.prototype.popNode = function () {
+  const node = this.stack.pop()
+  let attrs = node.attrs
+  const children = node.children
+  const parent = this.stack[this.stack.length - 1]
+  const siblings = parent ? parent.children : this.nodes
+
+  if (!this.hook(node) || config.ignoreTags[node.name]) {
+    // 获取标题
+    if (node.name === 'title' && children.length && children[0].type === 'text' && this.options.setTitle) {
+      uni.setNavigationBarTitle({
+        title: children[0].text
+      })
+    }
+    siblings.pop()
+    return
+  }
+
+  if (node.pre && this.pre !== 2) {
+    // 是否合并空白符标识
+    this.pre = node.pre = undefined
+    for (let i = this.stack.length; i--;) {
+      if (this.stack[i].pre) {
+        this.pre = 1
+      }
+    }
+  }
+
+  const styleObj = {}
+
+  // 转换 svg
+  if (node.name === 'svg') {
+    if (this.xml > 1) {
+      // 多层 svg 嵌套
+      this.xml--
+      return
+    }
+    // #ifdef APP-PLUS-NVUE
+    (function traversal (node) {
+      if (node.name) {
+        // 调整 svg 的大小写
+        node.name = config.svgDict[node.name] || node.name
+        for (const item in node.attrs) {
+          if (config.svgDict[item]) {
+            node.attrs[config.svgDict[item]] = node.attrs[item]
+            node.attrs[item] = undefined
+          }
+        }
+        for (let i = 0; i < (node.children || []).length; i++) {
+          traversal(node.children[i])
+        }
+      }
+    })(node)
+    // #endif
+    // #ifndef APP-PLUS-NVUE
+    let src = ''
+    const style = attrs.style
+    attrs.style = ''
+    attrs.xmlns = 'http://www.w3.org/2000/svg';
+    (function traversal (node) {
+      if (node.type === 'text') {
+        src += node.text
+        return
+      }
+      const name = config.svgDict[node.name] || node.name
+      src += '<' + name
+      for (const item in node.attrs) {
+        const val = node.attrs[item]
+        if (val) {
+          src += ` ${config.svgDict[item] || item}="${val}"`
+        }
+      }
+      if (!node.children) {
+        src += '/>'
+      } else {
+        src += '>'
+        for (let i = 0; i < node.children.length; i++) {
+          traversal(node.children[i])
+        }
+        src += '</' + name + '>'
+      }
+    })(node)
+    node.name = 'img'
+    node.attrs = {
+      src: 'data:image/svg+xml;utf8,' + src.replace(/#/g, '%23'),
+      style,
+      ignore: 'T'
+    }
+    node.children = undefined
+    // #endif
+    this.xml = false
+    return
+  }
+
+  // #ifndef APP-PLUS-NVUE
+  // 转换 align 属性
+  if (attrs.align) {
+    if (node.name === 'table') {
+      if (attrs.align === 'center') {
+        styleObj['margin-inline-start'] = styleObj['margin-inline-end'] = 'auto'
+      } else {
+        styleObj.float = attrs.align
+      }
+    } else {
+      styleObj['text-align'] = attrs.align
+    }
+    attrs.align = undefined
+  }
+
+  // 转换 dir 属性
+  if (attrs.dir) {
+    styleObj.direction = attrs.dir
+    attrs.dir = undefined
+  }
+
+  // 转换 font 标签的属性
+  if (node.name === 'font') {
+    if (attrs.color) {
+      styleObj.color = attrs.color
+      attrs.color = undefined
+    }
+    if (attrs.face) {
+      styleObj['font-family'] = attrs.face
+      attrs.face = undefined
+    }
+    if (attrs.size) {
+      let size = parseInt(attrs.size)
+      if (!isNaN(size)) {
+        if (size < 1) {
+          size = 1
+        } else if (size > 7) {
+          size = 7
+        }
+        styleObj['font-size'] = ['x-small', 'small', 'medium', 'large', 'x-large', 'xx-large', 'xxx-large'][size - 1]
+      }
+      attrs.size = undefined
+    }
+  }
+  // #endif
+
+  // 一些编辑器的自带 class
+  if ((attrs.class || '').includes('align-center')) {
+    styleObj['text-align'] = 'center'
+  }
+
+  Object.assign(styleObj, this.parseStyle(node))
+
+  if (node.name !== 'table' && parseInt(styleObj.width) > windowWidth) {
+    styleObj['max-width'] = '100%'
+    styleObj['box-sizing'] = 'border-box'
+  }
+
+  // #ifndef APP-PLUS-NVUE
+  if (config.blockTags[node.name]) {
+    node.name = 'div'
+  } else if (!config.trustTags[node.name] && !this.xml) {
+    // 未知标签转为 span,避免无法显示
+    node.name = 'span'
+  }
+
+  if (node.name === 'a' || node.name === 'ad'
+    // #ifdef H5 || APP-PLUS
+    || node.name === 'iframe' // eslint-disable-line
+    // #endif
+  ) {
+    this.expose()
+  } else if (node.name === 'video') {
+    if ((styleObj.height || '').includes('auto')) {
+      styleObj.height = undefined
+    }
+    /* #ifdef APP-PLUS */
+    let str = '<video style="width:100%;height:100%"'
+    for (const item in attrs) {
+      if (attrs[item]) {
+        str += ' ' + item + '="' + attrs[item] + '"'
+      }
+    }
+    if (this.options.pauseVideo) {
+      str += ' onplay="this.dispatchEvent(new CustomEvent(\'vplay\',{bubbles:!0}));for(var e=document.getElementsByTagName(\'video\'),t=0;t<e.length;t++)e[t]!=this&&e[t].pause()"'
+    }
+    str += '>'
+    for (let i = 0; i < node.src.length; i++) {
+      str += '<source src="' + node.src[i] + '">'
+    }
+    str += '</video>'
+    node.html = str
+    /* #endif */
+  } else if ((node.name === 'ul' || node.name === 'ol') && node.c) {
+    // 列表处理
+    const types = {
+      a: 'lower-alpha',
+      A: 'upper-alpha',
+      i: 'lower-roman',
+      I: 'upper-roman'
+    }
+    if (types[attrs.type]) {
+      attrs.style += ';list-style-type:' + types[attrs.type]
+      attrs.type = undefined
+    }
+    for (let i = children.length; i--;) {
+      if (children[i].name === 'li') {
+        children[i].c = 1
+      }
+    }
+  } else if (node.name === 'table') {
+    // 表格处理
+    // cellpadding、cellspacing、border 这几个常用表格属性需要通过转换实现
+    let padding = parseFloat(attrs.cellpadding)
+    let spacing = parseFloat(attrs.cellspacing)
+    const border = parseFloat(attrs.border)
+    const bordercolor = styleObj['border-color']
+    const borderstyle = styleObj['border-style']
+    if (node.c) {
+      // padding 和 spacing 默认 2
+      if (isNaN(padding)) {
+        padding = 2
+      }
+      if (isNaN(spacing)) {
+        spacing = 2
+      }
+    }
+    if (border) {
+      attrs.style += `;border:${border}px ${borderstyle || 'solid'} ${bordercolor || 'gray'}`
+    }
+    if (node.flag && node.c) {
+      // 有 colspan 或 rowspan 且含有链接的表格通过 grid 布局实现
+      styleObj.display = 'grid'
+      if (spacing) {
+        styleObj['grid-gap'] = spacing + 'px'
+        styleObj.padding = spacing + 'px'
+      } else if (border) {
+        // 无间隔的情况下避免边框重叠
+        attrs.style += ';border-left:0;border-top:0'
+      }
+
+      const width = [] // 表格的列宽
+      const trList = [] // tr 列表
+      const cells = [] // 保存新的单元格
+      const map = {}; // 被合并单元格占用的格子
+
+      (function traversal (nodes) {
+        for (let i = 0; i < nodes.length; i++) {
+          if (nodes[i].name === 'tr') {
+            trList.push(nodes[i])
+          } else {
+            traversal(nodes[i].children || [])
+          }
+        }
+      })(children)
+
+      for (let row = 1; row <= trList.length; row++) {
+        let col = 1
+        for (let j = 0; j < trList[row - 1].children.length; j++) {
+          const td = trList[row - 1].children[j]
+          if (td.name === 'td' || td.name === 'th') {
+            // 这个格子被上面的单元格占用,则列号++
+            while (map[row + '.' + col]) {
+              col++
+            }
+            let style = td.attrs.style || ''
+            let start = style.indexOf('width') ? style.indexOf(';width') : 0
+            // 提取出 td 的宽度
+            if (start !== -1) {
+              let end = style.indexOf(';', start + 6)
+              if (end === -1) {
+                end = style.length
+              }
+              if (!td.attrs.colspan) {
+                width[col] = style.substring(start ? start + 7 : 6, end)
+              }
+              style = style.substr(0, start) + style.substr(end)
+            }
+            // 设置竖直对齐
+            style += ';display:flex'
+            start = style.indexOf('vertical-align')
+            if (start !== -1) {
+              const val = style.substr(start + 15, 10)
+              if (val.includes('middle')) {
+                style += ';align-items:center'
+              } else if (val.includes('bottom')) {
+                style += ';align-items:flex-end'
+              }
+            } else {
+              style += ';align-items:center'
+            }
+            // 设置水平对齐
+            start = style.indexOf('text-align')
+            if (start !== -1) {
+              const val = style.substr(start + 11, 10)
+              if (val.includes('center')) {
+                style += ';justify-content: center'
+              } else if (val.includes('right')) {
+                style += ';justify-content: right'
+              }
+            }
+            style = (border ? `;border:${border}px ${borderstyle || 'solid'} ${bordercolor || 'gray'}` + (spacing ? '' : ';border-right:0;border-bottom:0') : '') + (padding ? `;padding:${padding}px` : '') + ';' + style
+            // 处理列合并
+            if (td.attrs.colspan) {
+              style += `;grid-column-start:${col};grid-column-end:${col + parseInt(td.attrs.colspan)}`
+              if (!td.attrs.rowspan) {
+                style += `;grid-row-start:${row};grid-row-end:${row + 1}`
+              }
+              col += parseInt(td.attrs.colspan) - 1
+            }
+            // 处理行合并
+            if (td.attrs.rowspan) {
+              style += `;grid-row-start:${row};grid-row-end:${row + parseInt(td.attrs.rowspan)}`
+              if (!td.attrs.colspan) {
+                style += `;grid-column-start:${col};grid-column-end:${col + 1}`
+              }
+              // 记录下方单元格被占用
+              for (let rowspan = 1; rowspan < td.attrs.rowspan; rowspan++) {
+                for (let colspan = 0; colspan < (td.attrs.colspan || 1); colspan++) {
+                  map[(row + rowspan) + '.' + (col - colspan)] = 1
+                }
+              }
+            }
+            if (style) {
+              td.attrs.style = style
+            }
+            cells.push(td)
+            col++
+          }
+        }
+        if (row === 1) {
+          let temp = ''
+          for (let i = 1; i < col; i++) {
+            temp += (width[i] ? width[i] : 'auto') + ' '
+          }
+          styleObj['grid-template-columns'] = temp
+        }
+      }
+      node.children = cells
+    } else {
+      // 没有使用合并单元格的表格通过 table 布局实现
+      if (node.c) {
+        styleObj.display = 'table'
+      }
+      if (!isNaN(spacing)) {
+        styleObj['border-spacing'] = spacing + 'px'
+      }
+      if (border || padding) {
+        // 遍历
+        (function traversal (nodes) {
+          for (let i = 0; i < nodes.length; i++) {
+            const td = nodes[i]
+            if (td.name === 'th' || td.name === 'td') {
+              if (border) {
+                td.attrs.style = `border:${border}px ${borderstyle || 'solid'} ${bordercolor || 'gray'};${td.attrs.style || ''}`
+              }
+              if (padding) {
+                td.attrs.style = `padding:${padding}px;${td.attrs.style || ''}`
+              }
+            } else if (td.children) {
+              traversal(td.children)
+            }
+          }
+        })(children)
+      }
+    }
+    // 给表格添加一个单独的横向滚动层
+    if (this.options.scrollTable && !(attrs.style || '').includes('inline')) {
+      const table = Object.assign({}, node)
+      node.name = 'div'
+      node.attrs = {
+        style: 'overflow:auto'
+      }
+      node.children = [table]
+      attrs = table.attrs
+    }
+  } else if ((node.name === 'td' || node.name === 'th') && (attrs.colspan || attrs.rowspan)) {
+    for (let i = this.stack.length; i--;) {
+      if (this.stack[i].name === 'table') {
+        this.stack[i].flag = 1 // 指示含有合并单元格
+        break
+      }
+    }
+  } else if (node.name === 'ruby') {
+    // 转换 ruby
+    node.name = 'span'
+    for (let i = 0; i < children.length - 1; i++) {
+      if (children[i].type === 'text' && children[i + 1].name === 'rt') {
+        children[i] = {
+          name: 'div',
+          attrs: {
+            style: 'display:inline-block;text-align:center'
+          },
+          children: [{
+            name: 'div',
+            attrs: {
+              style: 'font-size:50%;' + (children[i + 1].attrs.style || '')
+            },
+            children: children[i + 1].children
+          }, children[i]]
+        }
+        children.splice(i + 1, 1)
+      }
+    }
+  } else if (node.c) {
+    (function traversal (node) {
+      node.c = 2
+      for (let i = node.children.length; i--;) {
+        const child = node.children[i]
+        // #ifdef (MP-WEIXIN || MP-QQ || APP-PLUS || MP-360) && VUE3
+        if (child.name && (config.inlineTags[child.name] || ((child.attrs.style || '').includes('inline') && child.children)) && !child.c) {
+          traversal(child)
+        }
+        // #endif
+        if (!child.c || child.name === 'table') {
+          node.c = 1
+        }
+      }
+    })(node)
+  }
+
+  if ((styleObj.display || '').includes('flex') && !node.c) {
+    for (let i = children.length; i--;) {
+      const item = children[i]
+      if (item.f) {
+        item.attrs.style = (item.attrs.style || '') + item.f
+        item.f = undefined
+      }
+    }
+  }
+  // flex 布局时部分样式需要提取到 rich-text 外层
+  const flex = parent && ((parent.attrs.style || '').includes('flex') || (parent.attrs.style || '').includes('grid'))
+    // #ifdef MP-WEIXIN
+    // 检查基础库版本 virtualHost 是否可用
+    && !(node.c && wx.getNFCAdapter) // eslint-disable-line
+    // #endif
+    // #ifndef MP-WEIXIN || MP-QQ || MP-BAIDU || MP-TOUTIAO
+    && !node.c // eslint-disable-line
+  // #endif
+  if (flex) {
+    node.f = ';max-width:100%'
+  }
+
+  if (children.length >= 50 && node.c && !(styleObj.display || '').includes('flex')) {
+    mergeNodes(children)
+  }
+  // #endif
+
+  for (const key in styleObj) {
+    if (styleObj[key]) {
+      const val = `;${key}:${styleObj[key].replace(' !important', '')}`
+      /* #ifndef APP-PLUS-NVUE */
+      if (flex && ((key.includes('flex') && key !== 'flex-direction') || key === 'align-self' || key.includes('grid') || styleObj[key][0] === '-' || (key.includes('width') && val.includes('%')))) {
+        node.f += val
+        if (key === 'width') {
+          attrs.style += ';width:100%'
+        }
+      } else /* #endif */ {
+        attrs.style += val
+      }
+    }
+  }
+  attrs.style = attrs.style.substr(1) || undefined
+  // #ifdef (MP-WEIXIN || MP-QQ) && VUE3
+  for (const key in attrs) {
+    if (!attrs[key]) {
+      delete attrs[key]
+    }
+  }
+  // #endif
+}
+
+/**
+ * @description 解析到文本
+ * @param {String} text 文本内容
+ */
+Parser.prototype.onText = function (text) {
+  if (!this.pre) {
+    // 合并空白符
+    let trim = ''
+    let flag
+    for (let i = 0, len = text.length; i < len; i++) {
+      if (!blankChar[text[i]]) {
+        trim += text[i]
+      } else {
+        if (trim[trim.length - 1] !== ' ') {
+          trim += ' '
+        }
+        if (text[i] === '\n' && !flag) {
+          flag = true
+        }
+      }
+    }
+    // 去除含有换行符的空串
+    if (trim === ' ') {
+      if (flag) return
+      // #ifdef VUE3
+      else {
+        const parent = this.stack[this.stack.length - 1]
+        if (parent && parent.name[0] === 't') return
+      }
+      // #endif
+    }
+    text = trim
+  }
+  const node = Object.create(null)
+  node.type = 'text'
+  // #ifdef (MP-BAIDU || MP-ALIPAY || MP-TOUTIAO) && VUE3
+  node.attrs = {}
+  // #endif
+  node.text = decodeEntity(text)
+  if (this.hook(node)) {
+    // #ifdef MP-WEIXIN
+    if (this.options.selectable === 'force' && system.includes('iOS') && !uni.canIUse('rich-text.user-select')) {
+      this.expose()
+    }
+    // #endif
+    const siblings = this.stack.length ? this.stack[this.stack.length - 1].children : this.nodes
+    siblings.push(node)
+  }
+}
+
+/**
+ * @description html 词法分析器
+ * @param {Object} handler 高层处理器
+ */
+function Lexer (handler) {
+  this.handler = handler
+}
+
+/**
+ * @description 执行解析
+ * @param {String} content 要解析的文本
+ */
+Lexer.prototype.parse = function (content) {
+  this.content = content || ''
+  this.i = 0 // 标记解析位置
+  this.start = 0 // 标记一个单词的开始位置
+  this.state = this.text // 当前状态
+  for (let len = this.content.length; this.i !== -1 && this.i < len;) {
+    this.state()
+  }
+}
+
+/**
+ * @description 检查标签是否闭合
+ * @param {String} method 如果闭合要进行的操作
+ * @returns {Boolean} 是否闭合
+ * @private
+ */
+Lexer.prototype.checkClose = function (method) {
+  const selfClose = this.content[this.i] === '/'
+  if (this.content[this.i] === '>' || (selfClose && this.content[this.i + 1] === '>')) {
+    if (method) {
+      this.handler[method](this.content.substring(this.start, this.i))
+    }
+    this.i += selfClose ? 2 : 1
+    this.start = this.i
+    this.handler.onOpenTag(selfClose)
+    if (this.handler.tagName === 'script') {
+      this.i = this.content.indexOf('</', this.i)
+      if (this.i !== -1) {
+        this.i += 2
+        this.start = this.i
+      }
+      this.state = this.endTag
+    } else {
+      this.state = this.text
+    }
+    return true
+  }
+  return false
+}
+
+/**
+ * @description 文本状态
+ * @private
+ */
+Lexer.prototype.text = function () {
+  this.i = this.content.indexOf('<', this.i) // 查找最近的标签
+  if (this.i === -1) {
+    // 没有标签了
+    if (this.start < this.content.length) {
+      this.handler.onText(this.content.substring(this.start, this.content.length))
+    }
+    return
+  }
+  const c = this.content[this.i + 1]
+  if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
+    // 标签开头
+    if (this.start !== this.i) {
+      this.handler.onText(this.content.substring(this.start, this.i))
+    }
+    this.start = ++this.i
+    this.state = this.tagName
+  } else if (c === '/' || c === '!' || c === '?') {
+    if (this.start !== this.i) {
+      this.handler.onText(this.content.substring(this.start, this.i))
+    }
+    const next = this.content[this.i + 2]
+    if (c === '/' && ((next >= 'a' && next <= 'z') || (next >= 'A' && next <= 'Z'))) {
+      // 标签结尾
+      this.i += 2
+      this.start = this.i
+      this.state = this.endTag
+      return
+    }
+    // 处理注释
+    let end = '-->'
+    if (c !== '!' || this.content[this.i + 2] !== '-' || this.content[this.i + 3] !== '-') {
+      end = '>'
+    }
+    this.i = this.content.indexOf(end, this.i)
+    if (this.i !== -1) {
+      this.i += end.length
+      this.start = this.i
+    }
+  } else {
+    this.i++
+  }
+}
+
+/**
+ * @description 标签名状态
+ * @private
+ */
+Lexer.prototype.tagName = function () {
+  if (blankChar[this.content[this.i]]) {
+    // 解析到标签名
+    this.handler.onTagName(this.content.substring(this.start, this.i))
+    while (blankChar[this.content[++this.i]]);
+    if (this.i < this.content.length && !this.checkClose()) {
+      this.start = this.i
+      this.state = this.attrName
+    }
+  } else if (!this.checkClose('onTagName')) {
+    this.i++
+  }
+}
+
+/**
+ * @description 属性名状态
+ * @private
+ */
+Lexer.prototype.attrName = function () {
+  let c = this.content[this.i]
+  if (blankChar[c] || c === '=') {
+    // 解析到属性名
+    this.handler.onAttrName(this.content.substring(this.start, this.i))
+    let needVal = c === '='
+    const len = this.content.length
+    while (++this.i < len) {
+      c = this.content[this.i]
+      if (!blankChar[c]) {
+        if (this.checkClose()) return
+        if (needVal) {
+          // 等号后遇到第一个非空字符
+          this.start = this.i
+          this.state = this.attrVal
+          return
+        }
+        if (this.content[this.i] === '=') {
+          needVal = true
+        } else {
+          this.start = this.i
+          this.state = this.attrName
+          return
+        }
+      }
+    }
+  } else if (!this.checkClose('onAttrName')) {
+    this.i++
+  }
+}
+
+/**
+ * @description 属性值状态
+ * @private
+ */
+Lexer.prototype.attrVal = function () {
+  const c = this.content[this.i]
+  const len = this.content.length
+  if (c === '"' || c === "'") {
+    // 有冒号的属性
+    this.start = ++this.i
+    this.i = this.content.indexOf(c, this.i)
+    if (this.i === -1) return
+    this.handler.onAttrVal(this.content.substring(this.start, this.i))
+  } else {
+    // 没有冒号的属性
+    for (; this.i < len; this.i++) {
+      if (blankChar[this.content[this.i]]) {
+        this.handler.onAttrVal(this.content.substring(this.start, this.i))
+        break
+      } else if (this.checkClose('onAttrVal')) return
+    }
+  }
+  while (blankChar[this.content[++this.i]]);
+  if (this.i < len && !this.checkClose()) {
+    this.start = this.i
+    this.state = this.attrName
+  }
+}
+
+/**
+ * @description 结束标签状态
+ * @returns {String} 结束的标签名
+ * @private
+ */
+Lexer.prototype.endTag = function () {
+  const c = this.content[this.i]
+  if (blankChar[c] || c === '>' || c === '/') {
+    this.handler.onCloseTag(this.content.substring(this.start, this.i))
+    if (c !== '>') {
+      this.i = this.content.indexOf('>', this.i)
+      if (this.i === -1) return
+    }
+    this.start = ++this.i
+    this.state = this.text
+  } else {
+    this.i++
+  }
+}
+
+export default Parser
diff --git a/uni_modules/uview-plus/components/u-parse/props.js b/uni_modules/uview-plus/components/u-parse/props.js
new file mode 100644
index 0000000..484f624
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-parse/props.js
@@ -0,0 +1,47 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+		containerStyle: {
+          type: String,
+          default: null
+		},
+        content: String,
+        copyLink: {
+		  type: Boolean,
+		  default: () => defProps.parse.copyLink
+        },
+        domain: String,
+        errorImg: {
+		  type: String,
+		  default: () => defProps.parse.errorImg
+        },
+        lazyLoad: {
+		  type: Boolean,
+		  default: () => defProps.parse.lazyLoad
+        },
+        loadingImg: {
+		  type: String,
+		  default: () => defProps.parse.loadingImg
+        },
+        pauseVideo: {
+		  type: Boolean,
+		  default: () => defProps.parse.pauseVideo
+        },
+        previewImg: {
+		  type: Boolean,
+		  default: () => defProps.parse.previewImg
+        },
+        scrollTable: Boolean,
+        selectable: Boolean,
+        setTitle: {
+		  type: Boolean,
+		  default: () => defProps.parse.setTitle
+        },
+        showImgMenu: {
+		  type: Boolean,
+		  default: () => defProps.parse.showImgMenu
+        },
+        tagStyle: Object,
+        useAnchor: null
+	  }
+}
diff --git a/uni_modules/uview-plus/components/u-parse/u-parse.vue b/uni_modules/uview-plus/components/u-parse/u-parse.vue
new file mode 100644
index 0000000..fc9d0ad
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-parse/u-parse.vue
@@ -0,0 +1,504 @@
+<template>
+	<view id="_root" :class="(selectable ? '_select ' : '') + '_root'" :style="containerStyle">
+		<slot v-if="!nodes[0]" />
+		<!-- #ifndef APP-PLUS-NVUE -->
+		<node v-else :childs="nodes" :opts="[lazyLoad, loadingImg, errorImg, showImgMenu, selectable]" name="span" />
+		<!-- #endif -->
+		<!-- #ifdef APP-PLUS-NVUE -->
+		<web-view ref="web" src="/static/app-plus/mp-html/local.html" :style="'margin-top:-2px;height:' + height + 'px'" @onPostMessage="_onMessage" />
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+/**
+ * mp-html v2.4.1
+ * @description 富文本组件
+ * @tutorial https://github.com/jin-yufeng/mp-html
+ * @property {String} container-style 容器的样式
+ * @property {String} content 用于渲染的 html 字符串
+ * @property {Boolean} copy-link 是否允许外部链接被点击时自动复制
+ * @property {String} domain 主域名,用于拼接链接
+ * @property {String} error-img 图片出错时的占位图链接
+ * @property {Boolean} lazy-load 是否开启图片懒加载
+ * @property {string} loading-img 图片加载过程中的占位图链接
+ * @property {Boolean} pause-video 是否在播放一个视频时自动暂停其他视频
+ * @property {Boolean} preview-img 是否允许图片被点击时自动预览
+ * @property {Boolean} scroll-table 是否给每个表格添加一个滚动层使其能单独横向滚动
+ * @property {Boolean | String} selectable 是否开启长按复制
+ * @property {Boolean} set-title 是否将 title 标签的内容设置到页面标题
+ * @property {Boolean} show-img-menu 是否允许图片被长按时显示菜单
+ * @property {Object} tag-style 标签的默认样式
+ * @property {Boolean | Number} use-anchor 是否使用锚点链接
+ * @event {Function} load dom 结构加载完毕时触发
+ * @event {Function} ready 所有图片加载完毕时触发
+ * @event {Function} imgTap 图片被点击时触发
+ * @event {Function} linkTap 链接被点击时触发
+ * @event {Function} play 音视频播放时触发
+ * @event {Function} error 媒体加载出错时触发
+ */
+// #ifndef APP-PLUS-NVUE
+import node from './node/node'
+// #endif
+import Parser from './parser'
+const plugins = []
+// #ifdef APP-PLUS-NVUE
+const dom = weex.requireModule('dom')
+// #endif
+export default {
+	name: 'u-parse',
+	data() {
+		return {
+			nodes: [],
+			// #ifdef APP-PLUS-NVUE
+			height: 3
+			// #endif
+		}
+	},
+	props: {
+		containerStyle: {
+			type: String,
+			default: ''
+		},
+		content: {
+			type: String,
+			default: ''
+		},
+		copyLink: {
+			type: [Boolean, String],
+			default: true
+		},
+		domain: String,
+		errorImg: {
+			type: String,
+			default: ''
+		},
+		lazyLoad: {
+			type: [Boolean, String],
+			default: false
+		},
+		loadingImg: {
+			type: String,
+			default: ''
+		},
+		pauseVideo: {
+			type: [Boolean, String],
+			default: true
+		},
+		previewImg: {
+			type: [Boolean, String],
+			default: true
+		},
+		scrollTable: [Boolean, String],
+		selectable: [Boolean, String],
+		setTitle: {
+			type: [Boolean, String],
+			default: true
+		},
+		showImgMenu: {
+			type: [Boolean, String],
+			default: true
+		},
+		tagStyle: Object,
+		useAnchor: [Boolean, Number]
+	},
+	// #ifdef VUE3
+	emits: ['load', 'ready', 'imgTap', 'linkTap', 'play', 'error'],
+	// #endif
+	// #ifndef APP-PLUS-NVUE
+	components: {
+		node
+	},
+	// #endif
+	watch: {
+		content(content) {
+			this.setContent(content)
+		}
+	},
+	created() {
+		this.plugins = []
+		for (let i = plugins.length; i--;) {
+			this.plugins.push(new plugins[i](this))
+		}
+	},
+	mounted() {
+		if (this.content && !this.nodes.length) {
+			this.setContent(this.content)
+		}
+	},
+	// #ifdef VUE2
+		beforeDestroy() {
+		// #endif
+		// #ifdef VUE3
+		beforeUnmount() {
+		// #endif
+		this._hook('onDetached')
+	},
+	methods: {
+		/**
+		 * @description 将锚点跳转的范围限定在一个 scroll-view 内
+		 * @param {Object} page scroll-view 所在页面的示例
+		 * @param {String} selector scroll-view 的选择器
+		 * @param {String} scrollTop scroll-view scroll-top 属性绑定的变量名
+		 */
+		in(page, selector, scrollTop) {
+			// #ifndef APP-PLUS-NVUE
+			if (page && selector && scrollTop) {
+				this._in = {
+					page,
+					selector,
+					scrollTop
+				}
+			}
+			// #endif
+		},
+
+		/**
+		 * @description 锚点跳转
+		 * @param {String} id 要跳转的锚点 id
+		 * @param {Number} offset 跳转位置的偏移量
+		 * @returns {Promise}
+		 */
+		navigateTo(id, offset) {
+			return new Promise((resolve, reject) => {
+				if (!this.useAnchor) {
+					reject(Error('Anchor is disabled'))
+					return
+				}
+				offset = offset || parseInt(this.useAnchor) || 0
+				// #ifdef APP-PLUS-NVUE
+				if (!id) {
+					dom.scrollToElement(this.$refs.web, {
+						offset
+					})
+					resolve()
+				} else {
+					this._navigateTo = {
+						resolve,
+						reject,
+						offset
+					}
+					this.$refs.web.evalJs('uni.postMessage({data:{action:"getOffset",offset:(document.getElementById(' + id + ')||{}).offsetTop}})')
+				}
+				// #endif
+				// #ifndef APP-PLUS-NVUE
+				let deep = ' '
+				// #ifdef MP-WEIXIN || MP-QQ || MP-TOUTIAO
+				deep = '>>>'
+				// #endif
+				const selector = uni.createSelectorQuery()
+					// #ifndef MP-ALIPAY
+					.in(this._in ? this._in.page : this)
+					// #endif
+					.select((this._in ? this._in.selector : '._root') + (id ? `${deep}#${id}` : '')).boundingClientRect()
+				if (this._in) {
+					selector.select(this._in.selector).scrollOffset()
+						.select(this._in.selector).boundingClientRect()
+				} else {
+					// 获取 scroll-view 的位置和滚动距离
+					selector.selectViewport().scrollOffset() // 获取窗口的滚动距离
+				}
+				selector.exec(res => {
+					if (!res[0]) {
+						reject(Error('Label not found'))
+						return
+					}
+					const scrollTop = res[1].scrollTop + res[0].top - (res[2] ? res[2].top : 0) + offset
+					if (this._in) {
+						// scroll-view 跳转
+						this._in.page[this._in.scrollTop] = scrollTop
+					} else {
+						// 页面跳转
+						uni.pageScrollTo({
+							scrollTop,
+							duration: 300
+						})
+					}
+					resolve()
+				})
+				// #endif
+			})
+		},
+
+		/**
+		 * @description 获取文本内容
+		 * @return {String}
+		 */
+		getText(nodes) {
+			let text = '';
+			(function traversal(nodes) {
+				for (let i = 0; i < nodes.length; i++) {
+					const node = nodes[i]
+					if (node.type === 'text') {
+						text += node.text.replace(/&amp;/g, '&')
+					} else if (node.name === 'br') {
+						text += '\n'
+					} else {
+						// 块级标签前后加换行
+						const isBlock = node.name === 'p' || node.name === 'div' || node.name === 'tr' || node.name === 'li' || (node.name[0] === 'h' && node.name[1] > '0' && node.name[1] < '7')
+						if (isBlock && text && text[text.length - 1] !== '\n') {
+							text += '\n'
+						}
+						// 递归获取子节点的文本
+						if (node.children) {
+							traversal(node.children)
+						}
+						if (isBlock && text[text.length - 1] !== '\n') {
+							text += '\n'
+						} else if (node.name === 'td' || node.name === 'th') {
+							text += '\t'
+						}
+					}
+				}
+			})(nodes || this.nodes)
+			return text
+		},
+
+		/**
+		 * @description 获取内容大小和位置
+		 * @return {Promise}
+		 */
+		getRect() {
+			return new Promise((resolve, reject) => {
+				uni.createSelectorQuery()
+					// #ifndef MP-ALIPAY
+					.in(this)
+					// #endif
+					.select('#_root').boundingClientRect().exec(res => res[0] ? resolve(res[0]) : reject(Error('Root label not found')))
+			})
+		},
+
+		/**
+		 * @description 暂停播放媒体
+		 */
+		pauseMedia() {
+			for (let i = (this._videos || []).length; i--;) {
+				this._videos[i].pause()
+			}
+			// #ifdef APP-PLUS
+			const command = 'for(var e=document.getElementsByTagName("video"),i=e.length;i--;)e[i].pause()'
+			// #ifndef APP-PLUS-NVUE
+			let page = this.$parent
+			while (!page.$scope) page = page.$parent
+			page.$scope.$getAppWebview().evalJS(command)
+			// #endif
+			// #ifdef APP-PLUS-NVUE
+			this.$refs.web.evalJs(command)
+			// #endif
+			// #endif
+		},
+
+		/**
+		 * @description 设置媒体播放速率
+		 * @param {Number} rate 播放速率
+		 */
+		setPlaybackRate(rate) {
+			this.playbackRate = rate
+			for (let i = (this._videos || []).length; i--;) {
+				this._videos[i].playbackRate(rate)
+			}
+			// #ifdef APP-PLUS
+			const command = 'for(var e=document.getElementsByTagName("video"),i=e.length;i--;)e[i].playbackRate=' + rate
+			// #ifndef APP-PLUS-NVUE
+			let page = this.$parent
+			while (!page.$scope) page = page.$parent
+			page.$scope.$getAppWebview().evalJS(command)
+			// #endif
+			// #ifdef APP-PLUS-NVUE
+			this.$refs.web.evalJs(command)
+			// #endif
+			// #endif
+		},
+
+		/**
+		 * @description 设置内容
+		 * @param {String} content html 内容
+		 * @param {Boolean} append 是否在尾部追加
+		 */
+		setContent(content, append) {
+			if (!append || !this.imgList) {
+				this.imgList = []
+			}
+			const nodes = new Parser(this).parse(content)
+			// #ifdef APP-PLUS-NVUE
+			if (this._ready) {
+				this._set(nodes, append)
+			}
+			// #endif
+			this.$set(this, 'nodes', append ? (this.nodes || []).concat(nodes) : nodes)
+
+			// #ifndef APP-PLUS-NVUE
+			this._videos = []
+			this.$nextTick(() => {
+				this._hook('onLoad')
+				this.$emit('load')
+			})
+
+			if (this.lazyLoad || this.imgList._unloadimgs < this.imgList.length / 2) {
+				// 设置懒加载,每 350ms 获取高度,不变则认为加载完毕
+				let height = 0
+				const callback = rect => {
+					if (!rect || !rect.height) rect = {}
+					// 350ms 总高度无变化就触发 ready 事件
+					if (rect.height === height) {
+						this.$emit('ready', rect)
+					} else {
+						height = rect.height
+						setTimeout(() => {
+							this.getRect().then(callback).catch(callback)
+						}, 350)
+					}
+				}
+				this.getRect().then(callback).catch(callback)
+			} else {
+				// 未设置懒加载,等待所有图片加载完毕
+				if (!this.imgList._unloadimgs) {
+					this.getRect().then(rect => {
+						this.$emit('ready', rect)
+					}).catch(() => {
+						this.$emit('ready', {})
+					})
+				}
+			}
+			// #endif
+		},
+
+		/**
+		 * @description 调用插件钩子函数
+		 */
+		_hook(name) {
+			for (let i = plugins.length; i--;) {
+				if (this.plugins[i][name]) {
+					this.plugins[i][name]()
+				}
+			}
+		},
+
+		// #ifdef APP-PLUS-NVUE
+		/**
+		 * @description 设置内容
+		 */
+		_set(nodes, append) {
+			this.$refs.web.evalJs('setContent(' + JSON.stringify(nodes).replace(/%22/g, '') + ',' + JSON.stringify([this.containerStyle.replace(/(?:margin|padding)[^;]+/g, ''), this.errorImg, this.loadingImg, this.pauseVideo, this.scrollTable, this.selectable]) + ',' + append + ')')
+		},
+
+		/**
+		 * @description 接收到 web-view 消息
+		 */
+		_onMessage(e) {
+			const message = e.detail.data[0]
+			switch (message.action) {
+				// web-view 初始化完毕
+				case 'onJSBridgeReady':
+					this._ready = true
+					if (this.nodes) {
+						this._set(this.nodes)
+					}
+					break
+				// 内容 dom 加载完毕
+				case 'onLoad':
+					this.height = message.height
+					this._hook('onLoad')
+					this.$emit('load')
+					break
+				// 所有图片加载完毕
+				case 'onReady':
+					this.getRect().then(res => {
+						this.$emit('ready', res)
+					}).catch(() => {
+						this.$emit('ready', {})
+					})
+					break
+				// 总高度发生变化
+				case 'onHeightChange':
+					this.height = message.height
+					break
+				// 图片点击
+				case 'onImgTap':
+					this.$emit('imgTap', message.attrs)
+					if (this.previewImg) {
+						uni.previewImage({
+							current: parseInt(message.attrs.i),
+							urls: this.imgList
+						})
+					}
+					break
+				// 链接点击
+				case 'onLinkTap': {
+					const href = message.attrs.href
+					this.$emit('linkTap', message.attrs)
+					if (href) {
+						// 锚点跳转
+						if (href[0] === '#') {
+							if (this.useAnchor) {
+								dom.scrollToElement(this.$refs.web, {
+									offset: message.offset
+								})
+							}
+						} else if (href.includes('://')) {
+							// 打开外链
+							if (this.copyLink) {
+								plus.runtime.openWeb(href)
+							}
+						} else {
+							uni.navigateTo({
+								url: href,
+								fail() {
+									uni.switchTab({
+										url: href
+									})
+								}
+							})
+						}
+					}
+					break
+				}
+				case 'onPlay':
+					this.$emit('play')
+					break
+				// 获取到锚点的偏移量
+				case 'getOffset':
+					if (typeof message.offset === 'number') {
+						dom.scrollToElement(this.$refs.web, {
+							offset: message.offset + this._navigateTo.offset
+						})
+						this._navigateTo.resolve()
+					} else {
+						this._navigateTo.reject(Error('Label not found'))
+					}
+					break
+				// 点击
+				case 'onClick':
+					this.$emit('tap')
+					this.$emit('click')
+					break
+				// 出错
+				case 'onError':
+					this.$emit('error', {
+						source: message.source,
+						attrs: message.attrs
+					})
+			}
+		}
+		// #endif
+	}
+}
+</script>
+
+<style>
+/* #ifndef APP-PLUS-NVUE */
+/* 根节点样式 */
+._root {
+	padding: 1px 0;
+	overflow-x: auto;
+	overflow-y: hidden;
+	-webkit-overflow-scrolling: touch;
+}
+
+/* 长按复制 */
+._select {
+	user-select: text;
+}
+
+/* #endif */
+</style>
diff --git a/uni_modules/uview-plus/components/u-picker-column/props.js b/uni_modules/uview-plus/components/u-picker-column/props.js
new file mode 100644
index 0000000..662c38e
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-picker-column/props.js
@@ -0,0 +1,6 @@
+// import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-picker-column/u-picker-column.vue b/uni_modules/uview-plus/components/u-picker-column/u-picker-column.vue
new file mode 100644
index 0000000..bd5aff2
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-picker-column/u-picker-column.vue
@@ -0,0 +1,29 @@
+<template>
+	<picker-view-column>
+		<view class="u-picker-column">
+
+		</view>
+	</picker-view-column>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	/**
+	 * PickerColumn 
+	 * @description 
+	 * @tutorial url
+	 * @property {String}
+	 * @event {Function}
+	 * @example
+	 */
+	export default {
+		name: 'u-picker-column',
+		mixins: [mpMixin, mixin, props],
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+</style>
diff --git a/uni_modules/uview-plus/components/u-picker/props.js b/uni_modules/uview-plus/components/u-picker/props.js
new file mode 100644
index 0000000..a557a31
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-picker/props.js
@@ -0,0 +1,85 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 是否展示picker弹窗
+        show: {
+            type: Boolean,
+            default: () => defProps.picker.show
+        },
+		// 弹出的方向,可选值为 top bottom right left center
+        popupMode: {
+            type: String,
+            default: () => defProps.picker.popupMode
+        },
+        // 是否展示顶部的操作栏
+        showToolbar: {
+            type: Boolean,
+            default: () => defProps.picker.showToolbar
+        },
+        // 顶部标题
+        title: {
+            type: String,
+            default: () => defProps.picker.title
+        },
+        // 对象数组,设置每一列的数据
+        columns: {
+            type: Array,
+            default: () => defProps.picker.columns
+        },
+        // 是否显示加载中状态
+        loading: {
+            type: Boolean,
+            default: () => defProps.picker.loading
+        },
+        // 各列中,单个选项的高度
+        itemHeight: {
+            type: [String, Number],
+            default: () => defProps.picker.itemHeight
+        },
+        // 取消按钮的文字
+        cancelText: {
+            type: String,
+            default: () => defProps.picker.cancelText
+        },
+        // 确认按钮的文字
+        confirmText: {
+            type: String,
+            default: () => defProps.picker.confirmText
+        },
+        // 取消按钮的颜色
+        cancelColor: {
+            type: String,
+            default: () => defProps.picker.cancelColor
+        },
+        // 确认按钮的颜色
+        confirmColor: {
+            type: String,
+            default: () => defProps.picker.confirmColor
+        },
+        // 每列中可见选项的数量
+        visibleItemCount: {
+            type: [String, Number],
+            default: () => defProps.picker.visibleItemCount
+        },
+        // 选项对象中,需要展示的属性键名
+        keyName: {
+            type: String,
+            default: () => defProps.picker.keyName
+        },
+        // 是否允许点击遮罩关闭选择器
+        closeOnClickOverlay: {
+            type: Boolean,
+            default: () => defProps.picker.closeOnClickOverlay
+        },
+        // 各列的默认索引
+        defaultIndex: {
+            type: Array,
+            default: () => defProps.picker.defaultIndex
+        },
+		// 是否在手指松开时立即触发 change 事件。若不开启则会在滚动动画结束后触发 change 事件,只在微信2.21.1及以上有效
+		immediateChange: {
+			type: Boolean,
+			default: () => defProps.picker.immediateChange
+		}
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-picker/u-picker.vue b/uni_modules/uview-plus/components/u-picker/u-picker.vue
new file mode 100644
index 0000000..b68cfed
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-picker/u-picker.vue
@@ -0,0 +1,296 @@
+<template>
+	<u-popup
+		:show="show"
+		:mode="popupMode"
+		@close="closeHandler"
+	>
+		<view class="u-picker">
+			<u-toolbar
+				v-if="showToolbar"
+				:cancelColor="cancelColor"
+				:confirmColor="confirmColor"
+				:cancelText="cancelText"
+				:confirmText="confirmText"
+				:title="title"
+				@cancel="cancel"
+				@confirm="confirm"
+			></u-toolbar>
+			<picker-view
+				class="u-picker__view"
+				:indicatorStyle="`height: ${addUnit(itemHeight)}`"
+				:value="innerIndex"
+				:immediateChange="true"
+				:style="{
+					height: `${addUnit(visibleItemCount * itemHeight)}`
+				}"
+				@change="changeHandler"
+			>
+				<picker-view-column
+					v-for="(item, index) in innerColumns"
+					:key="index"
+					class="u-picker__view__column"
+				>
+					<view
+						v-if="testArray(item)"
+						class="u-picker__view__column__item u-line-1"
+						v-for="(item1, index1) in item"
+						:key="index1"
+						:style="{
+							height: addUnit(itemHeight),
+							lineHeight: addUnit(itemHeight),
+							fontWeight: index1 === innerIndex[index] ? 'bold' : 'normal',
+							display: 'block'
+						}"
+					>{{ getItemText(item1) }}</view>
+				</picker-view-column>
+			</picker-view>
+			<view
+				v-if="loading"
+				class="u-picker--loading"
+			>
+				<u-loading-icon mode="circle"></u-loading-icon>
+			</view>
+		</view>
+	</u-popup>
+</template>
+
+<script>
+/**
+ * u-picker
+ * @description 选择器
+ * @property {Boolean}			show				是否显示picker弹窗(默认 false )
+ * @property {Boolean}			showToolbar			是否显示顶部的操作栏(默认 true )
+ * @property {String}			title				顶部标题
+ * @property {Array}			columns				对象数组,设置每一列的数据
+ * @property {Boolean}			loading				是否显示加载中状态(默认 false )
+ * @property {String | Number}	itemHeight			各列中,单个选项的高度(默认 44 )
+ * @property {String}			cancelText			取消按钮的文字(默认 '取消' )
+ * @property {String}			confirmText			确认按钮的文字(默认 '确定' )
+ * @property {String}			cancelColor			取消按钮的颜色(默认 '#909193' )
+ * @property {String}			confirmColor		确认按钮的颜色(默认 '#3c9cff' )
+ * @property {String | Number}	visibleItemCount	每列中可见选项的数量(默认 5 )
+ * @property {String}			keyName				选项对象中,需要展示的属性键名(默认 'text' )
+ * @property {Boolean}			closeOnClickOverlay	是否允许点击遮罩关闭选择器(默认 false )
+ * @property {Array}			defaultIndex		各列的默认索引
+ * @property {Boolean}			immediateChange		是否在手指松开时立即触发change事件(默认 false )
+ * @event {Function} close		关闭选择器时触发
+ * @event {Function} cancel		点击取消按钮触发
+ * @event {Function} change		当选择值变化时触发
+ * @event {Function} confirm	点击确定按钮,返回当前选择的值
+ */
+import props from './props';
+import mpMixin from '../../libs/mixin/mpMixin';
+import mixin from '../../libs/mixin/mixin';
+import { addUnit, deepClone, sleep } from '../../libs/function/index';
+import test from '../../libs/function/test';
+export default {
+	name: 'u-picker',
+	mixins: [mpMixin, mixin, props],
+	data() {
+		return {
+			// 上一次选择的列索引
+			lastIndex: [],
+			// 索引值 ,对应picker-view的value
+			innerIndex: [],
+			// 各列的值
+			innerColumns: [],
+			// 上一次的变化列索引
+			columnIndex: 0,
+		}
+	},
+	watch: {
+		// 监听默认索引的变化,重新设置对应的值
+		defaultIndex: {
+			immediate: true,
+			handler(n) {
+				this.setIndexs(n, true)
+			}
+		},
+		// 监听columns参数的变化
+		columns: {
+			immediate: true,
+			deep:true,
+			handler(n) {
+				this.setColumns(n)
+			}
+		},
+	},
+	emits: ['close', 'cancel', 'confirm', 'change'],
+	methods: {
+		addUnit,
+		testArray: test.array,
+		// 获取item需要显示的文字,判别为对象还是文本
+		getItemText(item) {
+			if (test.object(item)) {
+				return item[this.keyName]
+			} else {
+				return item
+			}
+		},
+		// 关闭选择器
+		closeHandler() {
+			if (this.closeOnClickOverlay) {
+				this.$emit('close')
+			}
+		},
+		// 点击工具栏的取消按钮
+		cancel() {
+			this.$emit('cancel')
+		},
+		// 点击工具栏的确定按钮
+		confirm() {
+			this.$emit('confirm', {
+				indexs: this.innerIndex,
+				value: this.innerColumns.map((item, index) => item[this.innerIndex[index]]),
+				values: this.innerColumns
+			})
+		},
+		// 选择器某一列的数据发生变化时触发
+		changeHandler(e) {
+			const {
+				value
+			} = e.detail
+			let index = 0,
+				columnIndex = 0
+			// 通过对比前后两次的列索引,得出当前变化的是哪一列
+			for (let i = 0; i < value.length; i++) {
+				let item = value[i]
+				if (item !== (this.lastIndex[i] || 0)) { // 把undefined转为合法假值0
+					// 设置columnIndex为当前变化列的索引
+					columnIndex = i
+					// index则为变化列中的变化项的索引
+					index = item
+					break // 终止循环,即使少一次循环,也是性能的提升
+				}
+			}
+			this.columnIndex = columnIndex
+			const values = this.innerColumns
+			// 将当前的各项变化索引,设置为"上一次"的索引变化值
+			this.setLastIndex(value)
+			this.setIndexs(value)
+
+			this.$emit('change', {
+				// #ifndef MP-WEIXIN || MP-LARK
+				// 微信小程序不能传递this,会因为循环引用而报错
+				// picker: this,
+				// #endif
+				value: this.innerColumns.map((item, index) => item[value[index]]),
+				index,
+				indexs: value,
+				// values为当前变化列的数组内容
+				values,
+				columnIndex
+			})
+		},
+		// 设置index索引,此方法可被外部调用设置
+		setIndexs(index, setLastIndex) {
+			this.innerIndex = deepClone(index)
+			if (setLastIndex) {
+				this.setLastIndex(index)
+			}
+		},
+		// 记录上一次的各列索引位置
+		setLastIndex(index) {
+			// 当能进入此方法,意味着当前设置的各列默认索引,即为“上一次”的选中值,需要记录,是因为changeHandler中
+			// 需要拿前后的变化值进行对比,得出当前发生改变的是哪一列
+			this.lastIndex = deepClone(index)
+		},
+		// 设置对应列选项的所有值
+		setColumnValues(columnIndex, values) {
+			// 替换innerColumns数组中columnIndex索引的值为values,使用的是数组的splice方法
+			this.innerColumns.splice(columnIndex, 1, values)
+            // 替换完成之后将修改列之后的已选值置空
+			this.setLastIndex(this.innerIndex.slice(0, columnIndex))
+			// 拷贝一份原有的innerIndex做临时变量,将大于当前变化列的所有的列的默认索引设置为0
+			let tmpIndex = deepClone(this.innerIndex)
+			for (let i = 0; i < this.innerColumns.length; i++) {
+				if (i > this.columnIndex) {
+					tmpIndex[i] = 0
+				}
+			}
+			// 一次性赋值,不能单个修改,否则无效
+			this.setIndexs(tmpIndex)
+		},
+		// 获取对应列的所有选项
+		getColumnValues(columnIndex) {
+			// 进行同步阻塞,因为外部得到change事件之后,可能需要执行setColumnValues更新列的值
+			// 索引如果在外部change的回调中调用getColumnValues的话,可能无法得到变更后的列值,这里进行一定延时,保证值的准确性
+			(async () => {
+				await sleep()
+			})()
+			return this.innerColumns[columnIndex]
+		},
+		// 设置整体各列的columns的值
+		setColumns(columns) {
+			// console.log(columns)
+			this.innerColumns = deepClone(columns)
+			// 如果在设置各列数据时,没有被设置默认的各列索引defaultIndex,那么用0去填充它,数组长度为列的数量
+			if (this.innerIndex.length === 0) {
+				this.innerIndex = new Array(columns.length).fill(0)
+			}
+		},
+		// 获取各列选中值对应的索引
+		getIndexs() {
+			return this.innerIndex
+		},
+		// 获取各列选中的值
+		getValues() {
+			// 进行同步阻塞,因为外部得到change事件之后,可能需要执行setColumnValues更新列的值
+			// 索引如果在外部change的回调中调用getValues的话,可能无法得到变更后的列值,这里进行一定延时,保证值的准确性
+			(async () => {
+				await sleep()
+			})()
+			return this.innerColumns.map((item, index) => item[this.innerIndex[index]])
+		}
+	},
+}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-picker {
+		position: relative;
+
+		&__view {
+
+			&__column {
+				@include flex;
+				flex: 1;
+				justify-content: center;
+
+				&__item {
+					@include flex;
+					justify-content: center;
+					align-items: center;
+					font-size: 16px;
+					text-align: center;
+					/* #ifndef APP-NVUE */
+					display: block;
+					/* #endif */
+					color: $u-main-color;
+
+					&--disabled {
+						/* #ifndef APP-NVUE */
+						cursor: not-allowed;
+						/* #endif */
+						opacity: 0.35;
+					}
+				}
+			}
+		}
+
+		&--loading {
+			position: absolute;
+			top: 0;
+			right: 0;
+			left: 0;
+			bottom: 0;
+			@include flex;
+			justify-content: center;
+			align-items: center;
+			background-color: rgba(255, 255, 255, 0.87);
+			z-index: 1000;
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-popup/props.js b/uni_modules/uview-plus/components/u-popup/props.js
new file mode 100644
index 0000000..b01add0
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-popup/props.js
@@ -0,0 +1,80 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 是否展示弹窗
+        show: {
+            type: Boolean,
+            default: () => defProps.popup.show
+        },
+        // 是否显示遮罩
+        overlay: {
+            type: Boolean,
+            default: () => defProps.popup.overlay
+        },
+        // 弹出的方向,可选值为 top bottom right left center
+        mode: {
+            type: String,
+            default: () => defProps.popup.mode
+        },
+        // 动画时长,单位ms
+        duration: {
+            type: [String, Number],
+            default: () => defProps.popup.duration
+        },
+        // 是否显示关闭图标
+        closeable: {
+            type: Boolean,
+            default: () => defProps.popup.closeable
+        },
+        // 自定义遮罩的样式
+        overlayStyle: {
+            type: [Object, String],
+            default: () => defProps.popup.overlayStyle
+        },
+        // 点击遮罩是否关闭弹窗
+        closeOnClickOverlay: {
+            type: Boolean,
+            default: () => defProps.popup.closeOnClickOverlay
+        },
+        // 层级
+        zIndex: {
+            type: [String, Number],
+            default: () => defProps.popup.zIndex
+        },
+        // 是否为iPhoneX留出底部安全距离
+        safeAreaInsetBottom: {
+            type: Boolean,
+            default: () => defProps.popup.safeAreaInsetBottom
+        },
+        // 是否留出顶部安全距离(状态栏高度)
+        safeAreaInsetTop: {
+            type: Boolean,
+            default: () => defProps.popup.safeAreaInsetTop
+        },
+        // 自定义关闭图标位置,top-left为左上角,top-right为右上角,bottom-left为左下角,bottom-right为右下角
+        closeIconPos: {
+            type: String,
+            default: () => defProps.popup.closeIconPos
+        },
+        // 是否显示圆角
+        round: {
+            type: [Boolean, String, Number],
+            default: () => defProps.popup.round
+        },
+        // mode=center,也即中部弹出时,是否使用缩放模式
+        zoom: {
+            type: Boolean,
+            default: () => defProps.popup.zoom
+        },
+        // 弹窗背景色,设置为transparent可去除白色背景
+        bgColor: {
+            type: String,
+            default: () => defProps.popup.bgColor
+        },
+        // 遮罩的透明度,0-1之间
+        overlayOpacity: {
+            type: [Number, String],
+            default: () => defProps.popup.overlayOpacity
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-popup/u-popup.vue b/uni_modules/uview-plus/components/u-popup/u-popup.vue
new file mode 100644
index 0000000..533d525
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-popup/u-popup.vue
@@ -0,0 +1,307 @@
+<template>
+	<view class="u-popup">
+		<u-overlay
+			:show="show"
+			@click="overlayClick"
+			v-if="overlay"
+			:duration="overlayDuration"
+			:customStyle="overlayStyle"
+			:opacity="overlayOpacity"
+		></u-overlay>
+		<u-transition
+			:show="show"
+			:customStyle="transitionStyle"
+			:mode="position"
+			:duration="duration"
+			@afterEnter="afterEnter"
+			@click="clickHandler"
+		>
+			<view
+				class="u-popup__content"
+				:style="[contentStyle]"
+				@tap.stop="noop"
+			>
+				<u-status-bar v-if="safeAreaInsetTop"></u-status-bar>
+				<slot></slot>
+				<view
+					v-if="closeable"
+					@tap.stop="close"
+					class="u-popup__content__close"
+					:class="['u-popup__content__close--' + closeIconPos]"
+					hover-class="u-popup__content__close--hover"
+					hover-stay-time="150"
+				>
+					<u-icon
+						name="close"
+						color="#909399"
+						size="18"
+						bold
+					></u-icon>
+				</view>
+				<u-safe-bottom v-if="safeAreaInsetBottom"></u-safe-bottom>
+			</view>
+		</u-transition>
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addUnit, addStyle, deepMerge, sleep, sys } from '../../libs/function/index';
+	/**
+	 * popup 弹窗
+	 * @description 弹出层容器,用于展示弹窗、信息提示等内容,支持上、下、左、右和中部弹出。组件只提供容器,内部内容由用户自定义
+	 * @tutorial https://ijry.github.io/uview-plus/components/popup.html
+	 * @property {Boolean}			show				是否展示弹窗 (默认 false )
+	 * @property {Boolean}			overlay				是否显示遮罩 (默认 true )
+	 * @property {String}			mode				弹出方向(默认 'bottom' )
+	 * @property {String | Number}	duration			动画时长,单位ms (默认 300 )
+	 * @property {String | Number}	overlayDuration		遮罩层动画时长,单位ms (默认 350 )
+	 * @property {Boolean}			closeable			是否显示关闭图标(默认 false )
+	 * @property {Object | String}	overlayStyle		自定义遮罩的样式
+	 * @property {String | Number}	overlayOpacity		遮罩透明度,0-1之间(默认 0.5)
+	 * @property {Boolean}			closeOnClickOverlay	点击遮罩是否关闭弹窗 (默认  true )
+	 * @property {String | Number}	zIndex				层级 (默认 10075 )
+	 * @property {Boolean}			safeAreaInsetBottom	是否为iPhoneX留出底部安全距离 (默认 true )
+	 * @property {Boolean}			safeAreaInsetTop	是否留出顶部安全距离(状态栏高度) (默认 false )
+	 * @property {String}			closeIconPos		自定义关闭图标位置(默认 'top-right' )
+	 * @property {String | Number}	round				圆角值(默认 0)
+	 * @property {Boolean}			zoom				当mode=center时 是否开启缩放(默认 true )
+	 * @property {Object}			customStyle			组件的样式,对象形式
+	 * @event {Function} open 弹出层打开
+	 * @event {Function} close 弹出层收起
+	 * @example <u-popup v-model="show"><text>出淤泥而不染,濯清涟而不妖</text></u-popup>
+	 */
+	export default {
+		name: 'u-popup',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				overlayDuration: this.duration + 50
+			}
+		},
+		watch: {
+			show(newValue, oldValue) {
+				if (newValue === true) {
+					// #ifdef MP-WEIXIN
+					const children = this.$children
+					this.retryComputedComponentRect(children)
+					// #endif
+				}
+			}
+		},
+		computed: {
+			transitionStyle() {
+				const style = {
+					zIndex: this.zIndex,
+					position: 'fixed',
+					display: 'flex',
+				}
+				style[this.mode] = 0
+				if (this.mode === 'left') {
+					return deepMerge(style, {
+						bottom: 0,
+						top: 0,
+					})
+				} else if (this.mode === 'right') {
+					return deepMerge(style, {
+						bottom: 0,
+						top: 0,
+					})
+				} else if (this.mode === 'top') {
+					return deepMerge(style, {
+						left: 0,
+						right: 0
+					})
+				} else if (this.mode === 'bottom') {
+					return deepMerge(style, {
+						left: 0,
+						right: 0,
+					})
+				} else if (this.mode === 'center') {
+					return deepMerge(style, {
+						alignItems: 'center',
+						'justify-content': 'center',
+						top: 0,
+						left: 0,
+						right: 0,
+						bottom: 0
+					})
+				}
+			},
+			contentStyle() {
+				const style = {}
+				// 通过设备信息的safeAreaInsets值来判断是否需要预留顶部状态栏和底部安全局的位置
+				// 不使用css方案,是因为nvue不支持css的iPhoneX安全区查询属性
+				const {
+					safeAreaInsets
+				} = sys()
+				if (this.mode !== 'center') {
+					style.flex = 1
+				}
+				// 背景色,一般用于设置为transparent,去除默认的白色背景
+				if (this.bgColor) {
+					style.backgroundColor = this.bgColor
+				}
+				if(this.round) {
+					const value = addUnit(this.round)
+					if(this.mode === 'top') {
+						style.borderBottomLeftRadius = value
+						style.borderBottomRightRadius = value
+					} else if(this.mode === 'bottom') {
+						style.borderTopLeftRadius = value
+						style.borderTopRightRadius = value
+					} else if(this.mode === 'center') {
+						style.borderRadius = value
+					} 
+				}
+				return deepMerge(style, addStyle(this.customStyle))
+			},
+			position() {
+				if (this.mode === 'center') {
+					return this.zoom ? 'fade-zoom' : 'fade'
+				}
+				if (this.mode === 'left') {
+					return 'slide-left'
+				}
+				if (this.mode === 'right') {
+					return 'slide-right'
+				}
+				if (this.mode === 'bottom') {
+					return 'slide-up'
+				}
+				if (this.mode === 'top') {
+					return 'slide-down'
+				}
+			},
+		},
+		emits: ["open", "close", "click"],
+		methods: {
+			// 点击遮罩
+			overlayClick() {
+				if (this.closeOnClickOverlay) {
+					this.$emit('close')
+				}
+			},
+			close(e) {
+				this.$emit('close')
+			},
+			afterEnter() {
+				this.$emit('open')
+			},
+			clickHandler() {
+				// 由于中部弹出时,其u-transition占据了整个页面相当于遮罩,此时需要发出遮罩点击事件,是否无法通过点击遮罩关闭弹窗
+				if(this.mode === 'center') {
+					this.overlayClick()
+				}
+				this.$emit('click')
+			},
+			// #ifdef MP-WEIXIN
+			retryComputedComponentRect(children) {
+				// 组件内部需要计算节点的组件
+				const names = ['u-calendar-month', 'u-album', 'u-collapse-item', 'u-dropdown', 'u-index-item', 'u-index-list',
+					'u-line-progress', 'u-list-item', 'u-rate', 'u-read-more', 'u-row', 'u-row-notice', 'u-scroll-list',
+					'u-skeleton', 'u-slider', 'u-steps-item', 'u-sticky', 'u-subsection', 'u-swipe-action-item', 'u-tabbar',
+					'u-tabs', 'u-tooltip'
+				]
+				// 历遍所有的子组件节点
+				for (let i = 0; i < children.length; i++) {
+					const child = children[i]
+					// 拿到子组件的子组件
+					const grandChild = child.$children
+					// 判断如果在需要重新初始化的组件数组中名中,并且存在init方法的话,则执行
+					if (names.includes(child.$options.name) && typeof child?.init === 'function') {
+						// 需要进行一定的延时,因为初始化页面需要时间
+						sleep(50).then(() => {
+							child.init()
+						})
+					}
+					// 如果子组件还有孙组件,进行递归历遍
+					if (grandChild.length) {
+						this.retryComputedComponentRect(grandChild)
+					}
+				}
+			}
+			// #endif
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+	$u-popup-flex:1 !default;
+	$u-popup-content-background-color: #fff !default;
+
+	.u-popup {
+		flex: $u-popup-flex;
+
+		&__content {
+			background-color: $u-popup-content-background-color;
+			position: relative;
+
+			&--round-top {
+				border-top-left-radius: 0;
+				border-top-right-radius: 0;
+				border-bottom-left-radius: 10px;
+				border-bottom-right-radius: 10px;
+			}
+
+			&--round-left {
+				border-top-left-radius: 0;
+				border-top-right-radius: 10px;
+				border-bottom-left-radius: 0;
+				border-bottom-right-radius: 10px;
+			}
+
+			&--round-right {
+				border-top-left-radius: 10px;
+				border-top-right-radius: 0;
+				border-bottom-left-radius: 10px;
+				border-bottom-right-radius: 0;
+			}
+
+			&--round-bottom {
+				border-top-left-radius: 10px;
+				border-top-right-radius: 10px;
+				border-bottom-left-radius: 0;
+				border-bottom-right-radius: 0;
+			}
+
+			&--round-center {
+				border-top-left-radius: 10px;
+				border-top-right-radius: 10px;
+				border-bottom-left-radius: 10px;
+				border-bottom-right-radius: 10px;
+			}
+
+			&__close {
+				position: absolute;
+
+				&--hover {
+					opacity: 0.4;
+				}
+			}
+
+			&__close--top-left {
+				top: 15px;
+				left: 15px;
+			}
+
+			&__close--top-right {
+				top: 15px;
+				right: 15px;
+			}
+
+			&__close--bottom-left {
+				bottom: 15px;
+				left: 15px;
+			}
+
+			&__close--bottom-right {
+				right: 15px;
+				bottom: 15px;
+			}
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-qrcode/qrcode.js b/uni_modules/uview-plus/components/u-qrcode/qrcode.js
new file mode 100644
index 0000000..ae5f945
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-qrcode/qrcode.js
@@ -0,0 +1,1206 @@
+let QRCode = {};
+(function () {
+    /**
+     * 获取单个字符的utf8编码
+     * unicode BMP平面约65535个字符
+     * @param {num} code
+     * return {array}
+     */
+    function unicodeFormat8(code) {
+        // 1 byte
+        var c0, c1, c2;
+        if (code < 128) {
+            return [code];
+            // 2 bytes
+        } else if (code < 2048) {
+            c0 = 192 + (code >> 6);
+            c1 = 128 + (code & 63);
+            return [c0, c1];
+            // 3 bytes
+        } else {
+            c0 = 224 + (code >> 12);
+            c1 = 128 + (code >> 6 & 63);
+            c2 = 128 + (code & 63);
+            return [c0, c1, c2];
+        }
+    }
+    /**
+     * 获取字符串的utf8编码字节串
+     * @param {string} string
+     * @return {array}
+     */
+    function getUTF8Bytes(string) {
+        var utf8codes = [];
+        for (var i = 0; i < string.length; i++) {
+            var code = string.charCodeAt(i);
+            var utf8 = unicodeFormat8(code);
+            for (var j = 0; j < utf8.length; j++) {
+                utf8codes.push(utf8[j]);
+            }
+        }
+        return utf8codes;
+    }
+    /**
+     * 二维码算法实现
+     * @param {string} data              要编码的信息字符串
+     * @param {num} errorCorrectLevel 纠错等级
+     */
+    function QRCodeAlg(data, errorCorrectLevel) {
+        this.typeNumber = -1; //版本
+        this.errorCorrectLevel = errorCorrectLevel;
+        this.modules = null; //二维矩阵,存放最终结果
+        this.moduleCount = 0; //矩阵大小
+        this.dataCache = null; //数据缓存
+        this.rsBlocks = null; //版本数据信息
+        this.totalDataCount = -1; //可使用的数据量
+        this.data = data;
+        this.utf8bytes = getUTF8Bytes(data);
+        this.make();
+    }
+    QRCodeAlg.prototype = {
+        constructor: QRCodeAlg,
+        /**
+         * 获取二维码矩阵大小
+         * @return {num} 矩阵大小
+         */
+        getModuleCount: function () {
+            return this.moduleCount;
+        },
+        /**
+         * 编码
+         */
+        make: function () {
+            this.getRightType();
+            this.dataCache = this.createData();
+            this.createQrcode();
+        },
+        /**
+         * 设置二位矩阵功能图形
+         * @param  {bool} test 表示是否在寻找最好掩膜阶段
+         * @param  {num} maskPattern 掩膜的版本
+         */
+        makeImpl: function (maskPattern) {
+            this.moduleCount = this.typeNumber * 4 + 17;
+            this.modules = new Array(this.moduleCount);
+            for (var row = 0; row < this.moduleCount; row++) {
+                this.modules[row] = new Array(this.moduleCount);
+            }
+            this.setupPositionProbePattern(0, 0);
+            this.setupPositionProbePattern(this.moduleCount - 7, 0);
+            this.setupPositionProbePattern(0, this.moduleCount - 7);
+            this.setupPositionAdjustPattern();
+            this.setupTimingPattern();
+            this.setupTypeInfo(true, maskPattern);
+            if (this.typeNumber >= 7) {
+                this.setupTypeNumber(true);
+            }
+            this.mapData(this.dataCache, maskPattern);
+        },
+        /**
+         * 设置二维码的位置探测图形
+         * @param  {num} row 探测图形的中心横坐标
+         * @param  {num} col 探测图形的中心纵坐标
+         */
+        setupPositionProbePattern: function (row, col) {
+            for (var r = -1; r <= 7; r++) {
+                if (row + r <= -1 || this.moduleCount <= row + r) continue;
+                for (var c = -1; c <= 7; c++) {
+                    if (col + c <= -1 || this.moduleCount <= col + c) continue;
+                    if ((0 <= r && r <= 6 && (c == 0 || c == 6)) || (0 <= c && c <= 6 && (r == 0 || r == 6)) || (2 <= r && r <= 4 && 2 <= c && c <= 4)) {
+                        this.modules[row + r][col + c] = true;
+                    } else {
+                        this.modules[row + r][col + c] = false;
+                    }
+                }
+            }
+        },
+        /**
+         * 创建二维码
+         * @return {[type]} [description]
+         */
+        createQrcode: function () {
+            var minLostPoint = 0;
+            var pattern = 0;
+            var bestModules = null;
+            for (var i = 0; i < 8; i++) {
+                this.makeImpl(i);
+                var lostPoint = QRUtil.getLostPoint(this);
+                if (i == 0 || minLostPoint > lostPoint) {
+                    minLostPoint = lostPoint;
+                    pattern = i;
+                    bestModules = this.modules;
+                }
+            }
+            this.modules = bestModules;
+            this.setupTypeInfo(false, pattern);
+            if (this.typeNumber >= 7) {
+                this.setupTypeNumber(false);
+            }
+        },
+        /**
+         * 设置定位图形
+         * @return {[type]} [description]
+         */
+        setupTimingPattern: function () {
+            for (var r = 8; r < this.moduleCount - 8; r++) {
+                if (this.modules[r][6] != null) {
+                    continue;
+                }
+                this.modules[r][6] = (r % 2 == 0);
+                if (this.modules[6][r] != null) {
+                    continue;
+                }
+                this.modules[6][r] = (r % 2 == 0);
+            }
+        },
+        /**
+         * 设置矫正图形
+         * @return {[type]} [description]
+         */
+        setupPositionAdjustPattern: function () {
+            var pos = QRUtil.getPatternPosition(this.typeNumber);
+            for (var i = 0; i < pos.length; i++) {
+                for (var j = 0; j < pos.length; j++) {
+                    var row = pos[i];
+                    var col = pos[j];
+                    if (this.modules[row][col] != null) {
+                        continue;
+                    }
+                    for (var r = -2; r <= 2; r++) {
+                        for (var c = -2; c <= 2; c++) {
+                            if (r == -2 || r == 2 || c == -2 || c == 2 || (r == 0 && c == 0)) {
+                                this.modules[row + r][col + c] = true;
+                            } else {
+                                this.modules[row + r][col + c] = false;
+                            }
+                        }
+                    }
+                }
+            }
+        },
+        /**
+         * 设置版本信息(7以上版本才有)
+         * @param  {bool} test 是否处于判断最佳掩膜阶段
+         * @return {[type]}      [description]
+         */
+        setupTypeNumber: function (test) {
+            var bits = QRUtil.getBCHTypeNumber(this.typeNumber);
+            for (var i = 0; i < 18; i++) {
+                var mod = (!test && ((bits >> i) & 1) == 1);
+                this.modules[Math.floor(i / 3)][i % 3 + this.moduleCount - 8 - 3] = mod;
+                this.modules[i % 3 + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod;
+            }
+        },
+        /**
+         * 设置格式信息(纠错等级和掩膜版本)
+         * @param  {bool} test
+         * @param  {num} maskPattern 掩膜版本
+         * @return {}
+         */
+        setupTypeInfo: function (test, maskPattern) {
+            var data = (QRErrorCorrectLevel[this.errorCorrectLevel] << 3) | maskPattern;
+            var bits = QRUtil.getBCHTypeInfo(data);
+            // vertical
+            for (var i = 0; i < 15; i++) {
+                var mod = (!test && ((bits >> i) & 1) == 1);
+                if (i < 6) {
+                    this.modules[i][8] = mod;
+                } else if (i < 8) {
+                    this.modules[i + 1][8] = mod;
+                } else {
+                    this.modules[this.moduleCount - 15 + i][8] = mod;
+                }
+                // horizontal
+                var mod = (!test && ((bits >> i) & 1) == 1);
+                if (i < 8) {
+                    this.modules[8][this.moduleCount - i - 1] = mod;
+                } else if (i < 9) {
+                    this.modules[8][15 - i - 1 + 1] = mod;
+                } else {
+                    this.modules[8][15 - i - 1] = mod;
+                }
+            }
+            // fixed module
+            this.modules[this.moduleCount - 8][8] = (!test);
+        },
+        /**
+         * 数据编码
+         * @return {[type]} [description]
+         */
+        createData: function () {
+            var buffer = new QRBitBuffer();
+            var lengthBits = this.typeNumber > 9 ? 16 : 8;
+            buffer.put(4, 4); //添加模式
+            buffer.put(this.utf8bytes.length, lengthBits);
+            for (var i = 0, l = this.utf8bytes.length; i < l; i++) {
+                buffer.put(this.utf8bytes[i], 8);
+            }
+            if (buffer.length + 4 <= this.totalDataCount * 8) {
+                buffer.put(0, 4);
+            }
+            // padding
+            while (buffer.length % 8 != 0) {
+                buffer.putBit(false);
+            }
+            // padding
+            while (true) {
+                if (buffer.length >= this.totalDataCount * 8) {
+                    break;
+                }
+                buffer.put(QRCodeAlg.PAD0, 8);
+                if (buffer.length >= this.totalDataCount * 8) {
+                    break;
+                }
+                buffer.put(QRCodeAlg.PAD1, 8);
+            }
+            return this.createBytes(buffer);
+        },
+        /**
+         * 纠错码编码
+         * @param  {buffer} buffer 数据编码
+         * @return {[type]}
+         */
+        createBytes: function (buffer) {
+            var offset = 0;
+            var maxDcCount = 0;
+            var maxEcCount = 0;
+            var length = this.rsBlock.length / 3;
+            var rsBlocks = new Array();
+            for (var i = 0; i < length; i++) {
+                var count = this.rsBlock[i * 3 + 0];
+                var totalCount = this.rsBlock[i * 3 + 1];
+                var dataCount = this.rsBlock[i * 3 + 2];
+                for (var j = 0; j < count; j++) {
+                    rsBlocks.push([dataCount, totalCount]);
+                }
+            }
+            var dcdata = new Array(rsBlocks.length);
+            var ecdata = new Array(rsBlocks.length);
+            for (var r = 0; r < rsBlocks.length; r++) {
+                var dcCount = rsBlocks[r][0];
+                var ecCount = rsBlocks[r][1] - dcCount;
+                maxDcCount = Math.max(maxDcCount, dcCount);
+                maxEcCount = Math.max(maxEcCount, ecCount);
+                dcdata[r] = new Array(dcCount);
+                for (var i = 0; i < dcdata[r].length; i++) {
+                    dcdata[r][i] = 0xff & buffer.buffer[i + offset];
+                }
+                offset += dcCount;
+                var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount);
+                var rawPoly = new QRPolynomial(dcdata[r], rsPoly.getLength() - 1);
+                var modPoly = rawPoly.mod(rsPoly);
+                ecdata[r] = new Array(rsPoly.getLength() - 1);
+                for (var i = 0; i < ecdata[r].length; i++) {
+                    var modIndex = i + modPoly.getLength() - ecdata[r].length;
+                    ecdata[r][i] = (modIndex >= 0) ? modPoly.get(modIndex) : 0;
+                }
+            }
+            var data = new Array(this.totalDataCount);
+            var index = 0;
+            for (var i = 0; i < maxDcCount; i++) {
+                for (var r = 0; r < rsBlocks.length; r++) {
+                    if (i < dcdata[r].length) {
+                        data[index++] = dcdata[r][i];
+                    }
+                }
+            }
+            for (var i = 0; i < maxEcCount; i++) {
+                for (var r = 0; r < rsBlocks.length; r++) {
+                    if (i < ecdata[r].length) {
+                        data[index++] = ecdata[r][i];
+                    }
+                }
+            }
+            return data;
+
+        },
+        /**
+         * 布置模块,构建最终信息
+         * @param  {} data
+         * @param  {} maskPattern
+         * @return {}
+         */
+        mapData: function (data, maskPattern) {
+            var inc = -1;
+            var row = this.moduleCount - 1;
+            var bitIndex = 7;
+            var byteIndex = 0;
+            for (var col = this.moduleCount - 1; col > 0; col -= 2) {
+                if (col == 6) col--;
+                while (true) {
+                    for (var c = 0; c < 2; c++) {
+                        if (this.modules[row][col - c] == null) {
+                            var dark = false;
+                            if (byteIndex < data.length) {
+                                dark = (((data[byteIndex] >>> bitIndex) & 1) == 1);
+                            }
+                            var mask = QRUtil.getMask(maskPattern, row, col - c);
+                            if (mask) {
+                                dark = !dark;
+                            }
+                            this.modules[row][col - c] = dark;
+                            bitIndex--;
+                            if (bitIndex == -1) {
+                                byteIndex++;
+                                bitIndex = 7;
+                            }
+                        }
+                    }
+                    row += inc;
+                    if (row < 0 || this.moduleCount <= row) {
+                        row -= inc;
+                        inc = -inc;
+                        break;
+                    }
+                }
+            }
+        }
+    };
+    /**
+     * 填充字段
+     */
+    QRCodeAlg.PAD0 = 0xEC;
+    QRCodeAlg.PAD1 = 0x11;
+    //---------------------------------------------------------------------
+    // 纠错等级对应的编码
+    //---------------------------------------------------------------------
+    var QRErrorCorrectLevel = [1, 0, 3, 2];
+    //---------------------------------------------------------------------
+    // 掩膜版本
+    //---------------------------------------------------------------------
+    var QRMaskPattern = {
+        PATTERN000: 0,
+        PATTERN001: 1,
+        PATTERN010: 2,
+        PATTERN011: 3,
+        PATTERN100: 4,
+        PATTERN101: 5,
+        PATTERN110: 6,
+        PATTERN111: 7
+    };
+    //---------------------------------------------------------------------
+    // 工具类
+    //---------------------------------------------------------------------
+    var QRUtil = {
+        /*
+        每个版本矫正图形的位置
+         */
+        PATTERN_POSITION_TABLE: [
+            [],
+            [6, 18],
+            [6, 22],
+            [6, 26],
+            [6, 30],
+            [6, 34],
+            [6, 22, 38],
+            [6, 24, 42],
+            [6, 26, 46],
+            [6, 28, 50],
+            [6, 30, 54],
+            [6, 32, 58],
+            [6, 34, 62],
+            [6, 26, 46, 66],
+            [6, 26, 48, 70],
+            [6, 26, 50, 74],
+            [6, 30, 54, 78],
+            [6, 30, 56, 82],
+            [6, 30, 58, 86],
+            [6, 34, 62, 90],
+            [6, 28, 50, 72, 94],
+            [6, 26, 50, 74, 98],
+            [6, 30, 54, 78, 102],
+            [6, 28, 54, 80, 106],
+            [6, 32, 58, 84, 110],
+            [6, 30, 58, 86, 114],
+            [6, 34, 62, 90, 118],
+            [6, 26, 50, 74, 98, 122],
+            [6, 30, 54, 78, 102, 126],
+            [6, 26, 52, 78, 104, 130],
+            [6, 30, 56, 82, 108, 134],
+            [6, 34, 60, 86, 112, 138],
+            [6, 30, 58, 86, 114, 142],
+            [6, 34, 62, 90, 118, 146],
+            [6, 30, 54, 78, 102, 126, 150],
+            [6, 24, 50, 76, 102, 128, 154],
+            [6, 28, 54, 80, 106, 132, 158],
+            [6, 32, 58, 84, 110, 136, 162],
+            [6, 26, 54, 82, 110, 138, 166],
+            [6, 30, 58, 86, 114, 142, 170]
+        ],
+        G15: (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0),
+        G18: (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0),
+        G15_MASK: (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1),
+        /*
+        BCH编码格式信息
+         */
+        getBCHTypeInfo: function (data) {
+            var d = data << 10;
+            while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) >= 0) {
+                d ^= (QRUtil.G15 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15)));
+            }
+            return ((data << 10) | d) ^ QRUtil.G15_MASK;
+        },
+        /*
+        BCH编码版本信息
+         */
+        getBCHTypeNumber: function (data) {
+            var d = data << 12;
+            while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) >= 0) {
+                d ^= (QRUtil.G18 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18)));
+            }
+            return (data << 12) | d;
+        },
+        /*
+        获取BCH位信息
+         */
+        getBCHDigit: function (data) {
+            var digit = 0;
+            while (data != 0) {
+                digit++;
+                data >>>= 1;
+            }
+            return digit;
+        },
+        /*
+        获取版本对应的矫正图形位置
+         */
+        getPatternPosition: function (typeNumber) {
+            return QRUtil.PATTERN_POSITION_TABLE[typeNumber - 1];
+        },
+        /*
+        掩膜算法
+         */
+        getMask: function (maskPattern, i, j) {
+            switch (maskPattern) {
+                case QRMaskPattern.PATTERN000:
+                    return (i + j) % 2 == 0;
+                case QRMaskPattern.PATTERN001:
+                    return i % 2 == 0;
+                case QRMaskPattern.PATTERN010:
+                    return j % 3 == 0;
+                case QRMaskPattern.PATTERN011:
+                    return (i + j) % 3 == 0;
+                case QRMaskPattern.PATTERN100:
+                    return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 == 0;
+                case QRMaskPattern.PATTERN101:
+                    return (i * j) % 2 + (i * j) % 3 == 0;
+                case QRMaskPattern.PATTERN110:
+                    return ((i * j) % 2 + (i * j) % 3) % 2 == 0;
+                case QRMaskPattern.PATTERN111:
+                    return ((i * j) % 3 + (i + j) % 2) % 2 == 0;
+                default:
+                    throw new Error("bad maskPattern:" + maskPattern);
+            }
+        },
+        /*
+        获取RS的纠错多项式
+         */
+        getErrorCorrectPolynomial: function (errorCorrectLength) {
+            var a = new QRPolynomial([1], 0);
+            for (var i = 0; i < errorCorrectLength; i++) {
+                a = a.multiply(new QRPolynomial([1, QRMath.gexp(i)], 0));
+            }
+            return a;
+        },
+        /*
+        获取评价
+         */
+        getLostPoint: function (qrCode) {
+            var moduleCount = qrCode.getModuleCount(),
+                lostPoint = 0,
+                darkCount = 0;
+            for (var row = 0; row < moduleCount; row++) {
+                var sameCount = 0;
+                var head = qrCode.modules[row][0];
+                for (var col = 0; col < moduleCount; col++) {
+                    var current = qrCode.modules[row][col];
+                    //level 3 评价
+                    if (col < moduleCount - 6) {
+                        if (current && !qrCode.modules[row][col + 1] && qrCode.modules[row][col + 2] && qrCode.modules[row][col + 3] && qrCode.modules[row][col + 4] && !qrCode.modules[row][col + 5] && qrCode.modules[row][col + 6]) {
+                            if (col < moduleCount - 10) {
+                                if (qrCode.modules[row][col + 7] && qrCode.modules[row][col + 8] && qrCode.modules[row][col + 9] && qrCode.modules[row][col + 10]) {
+                                    lostPoint += 40;
+                                }
+                            } else if (col > 3) {
+                                if (qrCode.modules[row][col - 1] && qrCode.modules[row][col - 2] && qrCode.modules[row][col - 3] && qrCode.modules[row][col - 4]) {
+                                    lostPoint += 40;
+                                }
+                            }
+                        }
+                    }
+                    //level 2 评价
+                    if ((row < moduleCount - 1) && (col < moduleCount - 1)) {
+                        var count = 0;
+                        if (current) count++;
+                        if (qrCode.modules[row + 1][col]) count++;
+                        if (qrCode.modules[row][col + 1]) count++;
+                        if (qrCode.modules[row + 1][col + 1]) count++;
+                        if (count == 0 || count == 4) {
+                            lostPoint += 3;
+                        }
+                    }
+                    //level 1 评价
+                    if (head ^ current) {
+                        sameCount++;
+                    } else {
+                        head = current;
+                        if (sameCount >= 5) {
+                            lostPoint += (3 + sameCount - 5);
+                        }
+                        sameCount = 1;
+                    }
+                    //level 4 评价
+                    if (current) {
+                        darkCount++;
+                    }
+                }
+            }
+            for (var col = 0; col < moduleCount; col++) {
+                var sameCount = 0;
+                var head = qrCode.modules[0][col];
+                for (var row = 0; row < moduleCount; row++) {
+                    var current = qrCode.modules[row][col];
+                    //level 3 评价
+                    if (row < moduleCount - 6) {
+                        if (current && !qrCode.modules[row + 1][col] && qrCode.modules[row + 2][col] && qrCode.modules[row + 3][col] && qrCode.modules[row + 4][col] && !qrCode.modules[row + 5][col] && qrCode.modules[row + 6][col]) {
+                            if (row < moduleCount - 10) {
+                                if (qrCode.modules[row + 7][col] && qrCode.modules[row + 8][col] && qrCode.modules[row + 9][col] && qrCode.modules[row + 10][col]) {
+                                    lostPoint += 40;
+                                }
+                            } else if (row > 3) {
+                                if (qrCode.modules[row - 1][col] && qrCode.modules[row - 2][col] && qrCode.modules[row - 3][col] && qrCode.modules[row - 4][col]) {
+                                    lostPoint += 40;
+                                }
+                            }
+                        }
+                    }
+                    //level 1 评价
+                    if (head ^ current) {
+                        sameCount++;
+                    } else {
+                        head = current;
+                        if (sameCount >= 5) {
+                            lostPoint += (3 + sameCount - 5);
+                        }
+                        sameCount = 1;
+                    }
+                }
+            }
+            // LEVEL4
+            var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5;
+            lostPoint += ratio * 10;
+            return lostPoint;
+        }
+
+    };
+    //---------------------------------------------------------------------
+    // QRMath使用的数学工具
+    //---------------------------------------------------------------------
+    var QRMath = {
+        /*
+        将n转化为a^m
+         */
+        glog: function (n) {
+            if (n < 1) {
+                throw new Error("glog(" + n + ")");
+            }
+            return QRMath.LOG_TABLE[n];
+        },
+        /*
+        将a^m转化为n
+         */
+        gexp: function (n) {
+            while (n < 0) {
+                n += 255;
+            }
+            while (n >= 256) {
+                n -= 255;
+            }
+            return QRMath.EXP_TABLE[n];
+        },
+        EXP_TABLE: new Array(256),
+        LOG_TABLE: new Array(256)
+
+    };
+    for (var i = 0; i < 8; i++) {
+        QRMath.EXP_TABLE[i] = 1 << i;
+    }
+    for (var i = 8; i < 256; i++) {
+        QRMath.EXP_TABLE[i] = QRMath.EXP_TABLE[i - 4] ^ QRMath.EXP_TABLE[i - 5] ^ QRMath.EXP_TABLE[i - 6] ^ QRMath.EXP_TABLE[i - 8];
+    }
+    for (var i = 0; i < 255; i++) {
+        QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]] = i;
+    }
+    //---------------------------------------------------------------------
+    // QRPolynomial 多项式
+    //---------------------------------------------------------------------
+    /**
+     * 多项式类
+     * @param {Array} num   系数
+     * @param {num} shift a^shift
+     */
+    function QRPolynomial(num, shift) {
+        if (num.length == undefined) {
+            throw new Error(num.length + "/" + shift);
+        }
+        var offset = 0;
+        while (offset < num.length && num[offset] == 0) {
+            offset++;
+        }
+        this.num = new Array(num.length - offset + shift);
+        for (var i = 0; i < num.length - offset; i++) {
+            this.num[i] = num[i + offset];
+        }
+    }
+    QRPolynomial.prototype = {
+        get: function (index) {
+            return this.num[index];
+        },
+        getLength: function () {
+            return this.num.length;
+        },
+        /**
+         * 多项式乘法
+         * @param  {QRPolynomial} e 被乘多项式
+         * @return {[type]}   [description]
+         */
+        multiply: function (e) {
+            var num = new Array(this.getLength() + e.getLength() - 1);
+            for (var i = 0; i < this.getLength(); i++) {
+                for (var j = 0; j < e.getLength(); j++) {
+                    num[i + j] ^= QRMath.gexp(QRMath.glog(this.get(i)) + QRMath.glog(e.get(j)));
+                }
+            }
+            return new QRPolynomial(num, 0);
+        },
+        /**
+         * 多项式模运算
+         * @param  {QRPolynomial} e 模多项式
+         * @return {}
+         */
+        mod: function (e) {
+            var tl = this.getLength(),
+                el = e.getLength();
+            if (tl - el < 0) {
+                return this;
+            }
+            var num = new Array(tl);
+            for (var i = 0; i < tl; i++) {
+                num[i] = this.get(i);
+            }
+            while (num.length >= el) {
+                var ratio = QRMath.glog(num[0]) - QRMath.glog(e.get(0));
+
+                for (var i = 0; i < e.getLength(); i++) {
+                    num[i] ^= QRMath.gexp(QRMath.glog(e.get(i)) + ratio);
+                }
+                while (num[0] == 0) {
+                    num.shift();
+                }
+            }
+            return new QRPolynomial(num, 0);
+        }
+    };
+
+    //---------------------------------------------------------------------
+    // RS_BLOCK_TABLE
+    //---------------------------------------------------------------------
+    /*
+    二维码各个版本信息[块数, 每块中的数据块数, 每块中的信息块数]
+     */
+    var RS_BLOCK_TABLE = [
+        // L
+        // M
+        // Q
+        // H
+        // 1
+        [1, 26, 19],
+        [1, 26, 16],
+        [1, 26, 13],
+        [1, 26, 9],
+
+        // 2
+        [1, 44, 34],
+        [1, 44, 28],
+        [1, 44, 22],
+        [1, 44, 16],
+
+        // 3
+        [1, 70, 55],
+        [1, 70, 44],
+        [2, 35, 17],
+        [2, 35, 13],
+
+        // 4
+        [1, 100, 80],
+        [2, 50, 32],
+        [2, 50, 24],
+        [4, 25, 9],
+
+        // 5
+        [1, 134, 108],
+        [2, 67, 43],
+        [2, 33, 15, 2, 34, 16],
+        [2, 33, 11, 2, 34, 12],
+
+        // 6
+        [2, 86, 68],
+        [4, 43, 27],
+        [4, 43, 19],
+        [4, 43, 15],
+
+        // 7
+        [2, 98, 78],
+        [4, 49, 31],
+        [2, 32, 14, 4, 33, 15],
+        [4, 39, 13, 1, 40, 14],
+
+        // 8
+        [2, 121, 97],
+        [2, 60, 38, 2, 61, 39],
+        [4, 40, 18, 2, 41, 19],
+        [4, 40, 14, 2, 41, 15],
+
+        // 9
+        [2, 146, 116],
+        [3, 58, 36, 2, 59, 37],
+        [4, 36, 16, 4, 37, 17],
+        [4, 36, 12, 4, 37, 13],
+
+        // 10
+        [2, 86, 68, 2, 87, 69],
+        [4, 69, 43, 1, 70, 44],
+        [6, 43, 19, 2, 44, 20],
+        [6, 43, 15, 2, 44, 16],
+
+        // 11
+        [4, 101, 81],
+        [1, 80, 50, 4, 81, 51],
+        [4, 50, 22, 4, 51, 23],
+        [3, 36, 12, 8, 37, 13],
+
+        // 12
+        [2, 116, 92, 2, 117, 93],
+        [6, 58, 36, 2, 59, 37],
+        [4, 46, 20, 6, 47, 21],
+        [7, 42, 14, 4, 43, 15],
+
+        // 13
+        [4, 133, 107],
+        [8, 59, 37, 1, 60, 38],
+        [8, 44, 20, 4, 45, 21],
+        [12, 33, 11, 4, 34, 12],
+
+        // 14
+        [3, 145, 115, 1, 146, 116],
+        [4, 64, 40, 5, 65, 41],
+        [11, 36, 16, 5, 37, 17],
+        [11, 36, 12, 5, 37, 13],
+
+        // 15
+        [5, 109, 87, 1, 110, 88],
+        [5, 65, 41, 5, 66, 42],
+        [5, 54, 24, 7, 55, 25],
+        [11, 36, 12],
+
+        // 16
+        [5, 122, 98, 1, 123, 99],
+        [7, 73, 45, 3, 74, 46],
+        [15, 43, 19, 2, 44, 20],
+        [3, 45, 15, 13, 46, 16],
+
+        // 17
+        [1, 135, 107, 5, 136, 108],
+        [10, 74, 46, 1, 75, 47],
+        [1, 50, 22, 15, 51, 23],
+        [2, 42, 14, 17, 43, 15],
+
+        // 18
+        [5, 150, 120, 1, 151, 121],
+        [9, 69, 43, 4, 70, 44],
+        [17, 50, 22, 1, 51, 23],
+        [2, 42, 14, 19, 43, 15],
+
+        // 19
+        [3, 141, 113, 4, 142, 114],
+        [3, 70, 44, 11, 71, 45],
+        [17, 47, 21, 4, 48, 22],
+        [9, 39, 13, 16, 40, 14],
+
+        // 20
+        [3, 135, 107, 5, 136, 108],
+        [3, 67, 41, 13, 68, 42],
+        [15, 54, 24, 5, 55, 25],
+        [15, 43, 15, 10, 44, 16],
+
+        // 21
+        [4, 144, 116, 4, 145, 117],
+        [17, 68, 42],
+        [17, 50, 22, 6, 51, 23],
+        [19, 46, 16, 6, 47, 17],
+
+        // 22
+        [2, 139, 111, 7, 140, 112],
+        [17, 74, 46],
+        [7, 54, 24, 16, 55, 25],
+        [34, 37, 13],
+
+        // 23
+        [4, 151, 121, 5, 152, 122],
+        [4, 75, 47, 14, 76, 48],
+        [11, 54, 24, 14, 55, 25],
+        [16, 45, 15, 14, 46, 16],
+
+        // 24
+        [6, 147, 117, 4, 148, 118],
+        [6, 73, 45, 14, 74, 46],
+        [11, 54, 24, 16, 55, 25],
+        [30, 46, 16, 2, 47, 17],
+
+        // 25
+        [8, 132, 106, 4, 133, 107],
+        [8, 75, 47, 13, 76, 48],
+        [7, 54, 24, 22, 55, 25],
+        [22, 45, 15, 13, 46, 16],
+
+        // 26
+        [10, 142, 114, 2, 143, 115],
+        [19, 74, 46, 4, 75, 47],
+        [28, 50, 22, 6, 51, 23],
+        [33, 46, 16, 4, 47, 17],
+
+        // 27
+        [8, 152, 122, 4, 153, 123],
+        [22, 73, 45, 3, 74, 46],
+        [8, 53, 23, 26, 54, 24],
+        [12, 45, 15, 28, 46, 16],
+
+        // 28
+        [3, 147, 117, 10, 148, 118],
+        [3, 73, 45, 23, 74, 46],
+        [4, 54, 24, 31, 55, 25],
+        [11, 45, 15, 31, 46, 16],
+
+        // 29
+        [7, 146, 116, 7, 147, 117],
+        [21, 73, 45, 7, 74, 46],
+        [1, 53, 23, 37, 54, 24],
+        [19, 45, 15, 26, 46, 16],
+
+        // 30
+        [5, 145, 115, 10, 146, 116],
+        [19, 75, 47, 10, 76, 48],
+        [15, 54, 24, 25, 55, 25],
+        [23, 45, 15, 25, 46, 16],
+
+        // 31
+        [13, 145, 115, 3, 146, 116],
+        [2, 74, 46, 29, 75, 47],
+        [42, 54, 24, 1, 55, 25],
+        [23, 45, 15, 28, 46, 16],
+
+        // 32
+        [17, 145, 115],
+        [10, 74, 46, 23, 75, 47],
+        [10, 54, 24, 35, 55, 25],
+        [19, 45, 15, 35, 46, 16],
+
+        // 33
+        [17, 145, 115, 1, 146, 116],
+        [14, 74, 46, 21, 75, 47],
+        [29, 54, 24, 19, 55, 25],
+        [11, 45, 15, 46, 46, 16],
+
+        // 34
+        [13, 145, 115, 6, 146, 116],
+        [14, 74, 46, 23, 75, 47],
+        [44, 54, 24, 7, 55, 25],
+        [59, 46, 16, 1, 47, 17],
+
+        // 35
+        [12, 151, 121, 7, 152, 122],
+        [12, 75, 47, 26, 76, 48],
+        [39, 54, 24, 14, 55, 25],
+        [22, 45, 15, 41, 46, 16],
+
+        // 36
+        [6, 151, 121, 14, 152, 122],
+        [6, 75, 47, 34, 76, 48],
+        [46, 54, 24, 10, 55, 25],
+        [2, 45, 15, 64, 46, 16],
+
+        // 37
+        [17, 152, 122, 4, 153, 123],
+        [29, 74, 46, 14, 75, 47],
+        [49, 54, 24, 10, 55, 25],
+        [24, 45, 15, 46, 46, 16],
+
+        // 38
+        [4, 152, 122, 18, 153, 123],
+        [13, 74, 46, 32, 75, 47],
+        [48, 54, 24, 14, 55, 25],
+        [42, 45, 15, 32, 46, 16],
+
+        // 39
+        [20, 147, 117, 4, 148, 118],
+        [40, 75, 47, 7, 76, 48],
+        [43, 54, 24, 22, 55, 25],
+        [10, 45, 15, 67, 46, 16],
+
+        // 40
+        [19, 148, 118, 6, 149, 119],
+        [18, 75, 47, 31, 76, 48],
+        [34, 54, 24, 34, 55, 25],
+        [20, 45, 15, 61, 46, 16]
+    ];
+
+    /**
+     * 根据数据获取对应版本
+     * @return {[type]} [description]
+     */
+    QRCodeAlg.prototype.getRightType = function () {
+        for (var typeNumber = 1; typeNumber < 41; typeNumber++) {
+            var rsBlock = RS_BLOCK_TABLE[(typeNumber - 1) * 4 + this.errorCorrectLevel];
+            if (rsBlock == undefined) {
+                throw new Error("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" + this.errorCorrectLevel);
+            }
+            var length = rsBlock.length / 3;
+            var totalDataCount = 0;
+            for (var i = 0; i < length; i++) {
+                var count = rsBlock[i * 3 + 0];
+                var dataCount = rsBlock[i * 3 + 2];
+                totalDataCount += dataCount * count;
+            }
+            var lengthBytes = typeNumber > 9 ? 2 : 1;
+            if (this.utf8bytes.length + lengthBytes < totalDataCount || typeNumber == 40) {
+                this.typeNumber = typeNumber;
+                this.rsBlock = rsBlock;
+                this.totalDataCount = totalDataCount;
+                break;
+            }
+        }
+    };
+
+    //---------------------------------------------------------------------
+    // QRBitBuffer
+    //---------------------------------------------------------------------
+    function QRBitBuffer() {
+        this.buffer = new Array();
+        this.length = 0;
+    }
+    QRBitBuffer.prototype = {
+        get: function (index) {
+            var bufIndex = Math.floor(index / 8);
+            return ((this.buffer[bufIndex] >>> (7 - index % 8)) & 1);
+        },
+        put: function (num, length) {
+            for (var i = 0; i < length; i++) {
+                this.putBit(((num >>> (length - i - 1)) & 1));
+            }
+        },
+        putBit: function (bit) {
+            var bufIndex = Math.floor(this.length / 8);
+            if (this.buffer.length <= bufIndex) {
+                this.buffer.push(0);
+            }
+            if (bit) {
+                this.buffer[bufIndex] |= (0x80 >>> (this.length % 8));
+            }
+            this.length++;
+        }
+    };
+
+
+
+    // xzedit
+    let qrcodeAlgObjCache = [];
+    /**
+     * 二维码构造函数,主要用于绘制
+     * @param  {参数列表} opt 传递参数
+     * @return {}
+     */
+    QRCode = function (opt) {
+        //设置默认参数
+        this.options = {
+            text: '',
+            size: 256,
+            correctLevel: 3,
+            background: '#ffffff',
+            foreground: '#000000',
+            pdground: '#000000',
+            image: '',
+            imageSize: 30,
+            canvasId: opt.canvasId,
+            context: opt.context,
+            usingComponents: opt.usingComponents,
+            showLoading: opt.showLoading,
+            loadingText: opt.loadingText,
+        };
+        if (typeof opt === 'string') { // 只编码ASCII字符串
+            opt = {
+                text: opt
+            };
+        }
+        if (opt) {
+            for (var i in opt) {
+                this.options[i] = opt[i];
+            }
+        }
+        //使用QRCodeAlg创建二维码结构
+        var qrCodeAlg = null;
+        for (var i = 0, l = qrcodeAlgObjCache.length; i < l; i++) {
+            if (qrcodeAlgObjCache[i].text == this.options.text && qrcodeAlgObjCache[i].text.correctLevel == this.options.correctLevel) {
+                qrCodeAlg = qrcodeAlgObjCache[i].obj;
+                break;
+            }
+        }
+        if (i == l) {
+            qrCodeAlg = new QRCodeAlg(this.options.text, this.options.correctLevel);
+            qrcodeAlgObjCache.push({
+                text: this.options.text,
+                correctLevel: this.options.correctLevel,
+                obj: qrCodeAlg
+            });
+        }
+        /**
+         * 计算矩阵点的前景色
+         * @param {Obj} config
+         * @param {Number} config.row 点x坐标
+         * @param {Number} config.col 点y坐标
+         * @param {Number} config.count 矩阵大小
+         * @param {Number} config.options 组件的options
+         * @return {String}
+         */
+        let getForeGround = function (config) {
+            var options = config.options;
+            if (options.pdground && (
+                (config.row > 1 && config.row < 5 && config.col > 1 && config.col < 5) ||
+                (config.row > (config.count - 6) && config.row < (config.count - 2) && config.col > 1 && config.col < 5) ||
+                (config.row > 1 && config.row < 5 && config.col > (config.count - 6) && config.col < (config.count - 2))
+            )) {
+                return options.pdground;
+            }
+            return options.foreground;
+        }
+        // 创建canvas
+        let createCanvas = function (options) {
+            if(options.showLoading){
+                uni.showLoading({
+                    title: options.loadingText,
+                    mask: true
+                });
+            }
+            var ctx = uni.createCanvasContext(options.canvasId, options.context);
+            var count = qrCodeAlg.getModuleCount();
+            var ratioSize = options.size;
+            var ratioImgSize = options.imageSize;
+            //计算每个点的长宽
+            var tileW = (ratioSize / count).toPrecision(4);
+            var tileH = (ratioSize / count).toPrecision(4);
+            //绘制
+            for (var row = 0; row < count; row++) {
+                for (var col = 0; col < count; col++) {
+                    var w = (Math.ceil((col + 1) * tileW) - Math.floor(col * tileW));
+                    var h = (Math.ceil((row + 1) * tileW) - Math.floor(row * tileW));
+                    var foreground = getForeGround({
+                        row: row,
+                        col: col,
+                        count: count,
+                        options: options
+                    });
+                    ctx.setFillStyle(qrCodeAlg.modules[row][col] ? foreground : options.background);
+                    ctx.fillRect(Math.round(col * tileW), Math.round(row * tileH), w, h);
+                }
+            }
+            if (options.image) {
+                var x = Number(((ratioSize - ratioImgSize) / 2).toFixed(2));
+                var y = Number(((ratioSize - ratioImgSize) / 2).toFixed(2));
+                drawRoundedRect(ctx, x, y, ratioImgSize, ratioImgSize, 2, 6, true, true)
+                ctx.drawImage(options.image, x, y, ratioImgSize, ratioImgSize);
+                // 画圆角矩形
+                function drawRoundedRect(ctxi, x, y, width, height, r, lineWidth, fill, stroke) {
+                    ctxi.setLineWidth(lineWidth);
+                    ctxi.setFillStyle(options.background);
+                    ctxi.setStrokeStyle(options.background);
+                    ctxi.beginPath(); // draw top and top right corner 
+                    ctxi.moveTo(x + r, y);
+                    ctxi.arcTo(x + width, y, x + width, y + r, r); // draw right side and bottom right corner 
+                    ctxi.arcTo(x + width, y + height, x + width - r, y + height, r); // draw bottom and bottom left corner 
+                    ctxi.arcTo(x, y + height, x, y + height - r, r); // draw left and top left corner 
+                    ctxi.arcTo(x, y, x + r, y, r);
+                    ctxi.closePath();
+                    if (fill) {
+                        ctxi.fill();
+                    }
+                    if (stroke) {
+                        ctxi.stroke();
+                    }
+                }
+            }
+            setTimeout(() => {
+                ctx.draw(true, () => {
+                    // 保存到临时区域
+                    setTimeout(() => {
+                        uni.canvasToTempFilePath({
+                            width: options.width,
+                            height: options.height,
+                            destWidth: options.width,
+                            destHeight: options.height,
+                            canvasId: options.canvasId,
+                            quality: Number(1),
+                            success: function (res) {
+                                if (options.cbResult) {
+                                    // 由于官方还没有统一此接口的输出字段,所以先判定下  支付宝为 res.apFilePath
+                                    if (!empty(res.tempFilePath)) {
+                                        options.cbResult(res.tempFilePath)
+                                    } else if (!empty(res.apFilePath)) {
+                                        options.cbResult(res.apFilePath)
+                                    } else {
+                                        options.cbResult(res.tempFilePath)
+                                    }
+                                }
+                            },
+                            fail: function (res) {
+                                if (options.cbResult) {
+                                    options.cbResult(res)
+                                }
+                            },
+                            complete: function () {
+                                uni.hideLoading();
+                            },
+                        }, options.context);
+                    }, options.text.length + 100);
+                });
+            }, options.usingComponents ? 0 : 150);
+        }
+        createCanvas(this.options);
+        // 空判定
+        let empty = function (v) {
+            let tp = typeof v,
+                rt = false;
+            if (tp == "number" && String(v) == "") {
+                rt = true
+            } else if (tp == "undefined") {
+                rt = true
+            } else if (tp == "object") {
+                if (JSON.stringify(v) == "{}" || JSON.stringify(v) == "[]" || v == null) rt = true
+            } else if (tp == "string") {
+                if (v == "" || v == "undefined" || v == "null" || v == "{}" || v == "[]") rt = true
+            } else if (tp == "function") {
+                rt = false
+            }
+            return rt
+        }
+    };
+    QRCode.prototype.clear = function (fn) {
+        var ctx = uni.createCanvasContext(this.options.canvasId, this.options.context)
+        ctx.clearRect(0, 0, this.options.size, this.options.size)
+        ctx.draw(false, () => {
+            if (fn) {
+                fn()
+            }
+        })
+    };
+})()
+
+export default QRCode
\ No newline at end of file
diff --git a/uni_modules/uview-plus/components/u-qrcode/u-qrcode.vue b/uni_modules/uview-plus/components/u-qrcode/u-qrcode.vue
new file mode 100644
index 0000000..4423d0c
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-qrcode/u-qrcode.vue
@@ -0,0 +1,199 @@
+<template>
+	<view class="u-qrcode">
+		<canvas class="u-qrcode__canvas" :canvas-id="cid" :style="{ width: size + unit, height: size + unit }" />
+		<image v-show="show" :src="result" :style="{ width: size + unit, height: size + unit }" />
+	</view>
+</template>
+
+<script>
+import QRCode from "./qrcode.js"
+let qrcode
+export default {
+	name: "u-qrcode",
+	props: {
+		cid: {
+			type: String,
+			default: 'u-qrcode-canvas' + Math.random().toString()
+		},
+		size: {
+			type: Number,
+			default: 200
+		},
+		unit: {
+			type: String,
+			default: 'px'
+		},
+		show: {
+			type: Boolean,
+			default: true
+		},
+		val: {
+			type: String,
+			default: ''
+		},
+		background: {
+			type: String,
+			default: '#ffffff'
+		},
+		foreground: {
+			type: String,
+			default: '#000000'
+		},
+		pdground: {
+			type: String,
+			default: '#000000'
+		},
+		icon: {
+			type: String,
+			default: ''
+		},
+		iconSize: {
+			type: Number,
+			default: 40
+		},
+		lv: {
+			type: Number,
+			default: 3
+		},
+		onval: {
+			type: Boolean,
+			default: true
+		},
+		loadMake: {
+			type: Boolean,
+			default: true
+		},
+		usingComponents: {
+			type: Boolean,
+			default: true
+		},
+		showLoading: {
+			type: Boolean,
+			default: true
+		},
+		loadingText: {
+			type: String,
+			default: '二维码生成中'
+		},
+	},
+	data() {
+		return {
+			result: '',
+		}
+	},
+	methods: {
+		_makeCode() {
+			let that = this
+			if (!this._empty(this.val)) {
+				qrcode = new QRCode({
+					context: that, // 上下文环境
+					canvasId: that.cid, // canvas-id
+					usingComponents: that.usingComponents, // 是否是自定义组件
+					showLoading: that.showLoading, // 是否显示loading
+					loadingText: that.loadingText, // loading文字
+					text: that.val, // 生成内容
+					size: that.size, // 二维码大小
+					background: that.background, // 背景色
+					foreground: that.foreground, // 前景色
+					pdground: that.pdground, // 定位角点颜色
+					correctLevel: that.lv, // 容错级别
+					image: that.icon, // 二维码图标
+					imageSize: that.iconSize,// 二维码图标大小
+					cbResult: function (res) { // 生成二维码的回调
+						that._result(res)
+					},
+				});
+			} else {
+				uni.showToast({
+					title: '二维码内容不能为空',
+					icon: 'none',
+					duration: 2000
+				});
+			}
+		},
+		_clearCode() {
+			this._result('')
+			qrcode.clear()
+		},
+		_saveCode() {
+			let that = this;
+			if (this.result != "") {
+				uni.saveImageToPhotosAlbum({
+					filePath: that.result,
+					success: function () {
+						uni.showToast({
+							title: '二维码保存成功',
+							icon: 'success',
+							duration: 2000
+						});
+					}
+				});
+			}
+		},
+		_result(res) {
+			this.result = res;
+			this.$emit('result', res)
+		},
+		_empty(v) {
+			let tp = typeof v,
+				rt = false;
+			if (tp == "number" && String(v) == "") {
+				rt = true
+			} else if (tp == "undefined") {
+				rt = true
+			} else if (tp == "object") {
+				if (JSON.stringify(v) == "{}" || JSON.stringify(v) == "[]" || v == null) rt = true
+			} else if (tp == "string") {
+				if (v == "" || v == "undefined" || v == "null" || v == "{}" || v == "[]") rt = true
+			} else if (tp == "function") {
+				rt = false
+			}
+			return rt
+		}
+	},
+	watch: {
+		size: function (n, o) {
+			if (n != o && !this._empty(n)) {
+				this.cSize = n
+				if (!this._empty(this.val)) {
+					setTimeout(() => {
+						this._makeCode()
+					}, 100);
+				}
+			}
+		},
+		val: function (n, o) {
+			if (this.onval) {
+				if (n != o && !this._empty(n)) {
+					setTimeout(() => {
+						this._makeCode()
+					}, 0);
+				}
+			}
+		}
+	},
+	computed: {
+	},
+	mounted: function () {
+		if (this.loadMake) {
+			if (!this._empty(this.val)) {
+				setTimeout(() => {
+					this._makeCode()
+				}, 0);
+			}
+		}
+	},
+}
+</script>
+<style lang="scss" scoped>
+.u-qrcode {
+	position: relative;
+
+	&__canvas {
+		position: fixed;
+		top: -99999rpx;
+		left: -99999rpx;
+		z-index: -99999;
+	}
+}
+</style>
diff --git a/uni_modules/uview-plus/components/u-radio-group/props.js b/uni_modules/uview-plus/components/u-radio-group/props.js
new file mode 100644
index 0000000..9ffd92a
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-radio-group/props.js
@@ -0,0 +1,94 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // #ifdef VUE3
+        // 绑定的值
+        modelValue: {
+            type: [String, Number, Boolean],
+            default: () => defProps.radioGroup.value
+        },
+        // #endif
+        // #ifdef VUE2
+        // 绑定的值
+        value: {
+            type: [String, Number, Boolean],
+            default: () => defProps.radioGroup.value
+        },
+        // #endif
+        // 是否禁用全部radio
+        disabled: {
+            type: Boolean,
+            default: () => defProps.radioGroup.disabled
+        },
+        // 形状,circle-圆形,square-方形
+        shape: {
+            type: String,
+            default: () => defProps.radioGroup.shape
+        },
+        // 选中状态下的颜色,如设置此值,将会覆盖parent的activeColor值
+        activeColor: {
+            type: String,
+            default: () => defProps.radioGroup.activeColor
+        },
+        // 未选中的颜色
+        inactiveColor: {
+            type: String,
+            default: () => defProps.radioGroup.inactiveColor
+        },
+        // 标识符
+        name: {
+            type: String,
+            default: () => defProps.radioGroup.name
+        },
+        // 整个组件的尺寸,默认px
+        size: {
+            type: [String, Number],
+            default: () => defProps.radioGroup.size
+        },
+        // 布局方式,row-横向,column-纵向
+        placement: {
+            type: String,
+            default: () => defProps.radioGroup.placement
+        },
+        // label的文本
+        label: {
+            type: [String],
+            default: () => defProps.radioGroup.label
+        },
+        // label的颜色 (默认 '#303133' )
+        labelColor: {
+            type: [String],
+            default: () => defProps.radioGroup.labelColor
+        },
+        // label的字体大小,px单位
+        labelSize: {
+            type: [String, Number],
+            default: () => defProps.radioGroup.labelSize
+        },
+        // 是否禁止点击文本操作checkbox(默认 false )
+        labelDisabled: {
+            type: Boolean,
+            default: () => defProps.radioGroup.labelDisabled
+        },
+        // 图标颜色
+        iconColor: {
+            type: String,
+            default: () => defProps.radioGroup.iconColor
+        },
+        // 图标的大小,单位px
+        iconSize: {
+            type: [String, Number],
+            default: () => defProps.radioGroup.iconSize
+        },
+        // 竖向配列时,是否显示下划线
+        borderBottom: {
+            type: Boolean,
+            default: () => defProps.radioGroup.borderBottom
+        },
+        // 图标与文字的对齐方式
+        iconPlacement: {
+            type: String,
+            default: () => defProps.radio.iconPlacement
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-radio-group/u-radio-group.vue b/uni_modules/uview-plus/components/u-radio-group/u-radio-group.vue
new file mode 100644
index 0000000..1f3da7d
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-radio-group/u-radio-group.vue
@@ -0,0 +1,128 @@
+<template>
+	<view
+	    class="u-radio-group"
+	    :class="bemClass"
+	>
+		<slot></slot>
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+
+	/**
+	 * radioRroup 单选框父组件
+	 * @description 单选框用于有一个选择,用户只能选择其中一个的场景。搭配u-radio使用
+	 * @tutorial https://ijry.github.io/uview-plus/components/radio.html
+	 * @property {String | Number | Boolean}	value 			绑定的值
+	 * @property {Boolean}						disabled		是否禁用所有radio(默认 false )
+	 * @property {String}						shape			外观形状,shape-方形,circle-圆形(默认 circle )
+	 * @property {String}						activeColor		选中时的颜色,应用到所有子Radio组件(默认 '#2979ff' )
+	 * @property {String}						inactiveColor	未选中的颜色 (默认 '#c8c9cc' )
+	 * @property {String}						name			标识符
+	 * @property {String | Number}				size			组件整体的大小,单位px(默认 18 )
+	 * @property {String}						placement		布局方式,row-横向,column-纵向 (默认 'row' )
+	 * @property {String}						label			文本
+	 * @property {String}						labelColor		label的颜色 (默认 '#303133' )
+	 * @property {String | Number}				labelSize		label的字体大小,px单位 (默认 14 )
+	 * @property {Boolean}						labelDisabled	是否禁止点击文本操作checkbox(默认 false )
+	 * @property {String}						iconColor		图标颜色 (默认 '#ffffff' )
+	 * @property {String | Number}				iconSize		图标的大小,单位px (默认 12 )
+	 * @property {Boolean}						borderBottom	placement为row时,是否显示下边框 (默认 false )
+	 * @property {String}						iconPlacement	图标与文字的对齐方式 (默认 'left' )
+     * @property {Object}						customStyle		组件的样式,对象形式
+	 * @event {Function} change 任一个radio状态发生变化时触发
+	 * @example <u-radio-group v-model="value"></u-radio-group>
+	 */
+	export default {
+		name: 'u-radio-group',
+		mixins: [mpMixin, mixin, props],
+		computed: {
+			// 这里computed的变量,都是子组件u-radio需要用到的,由于头条小程序的兼容性差异,子组件无法实时监听父组件参数的变化
+			// 所以需要手动通知子组件,这里返回一个parentData变量,供watch监听,在其中去通知每一个子组件重新从父组件(u-radio-group)
+			// 拉取父组件新的变化后的参数
+			parentData() {
+				// #ifdef VUE3
+                return [this.modelValue, this.disabled, this.inactiveColor, this.activeColor, this.size, this.labelDisabled, this.shape,
+					this.iconSize, this.borderBottom, this.placement
+				]
+                // #endif
+                // #ifdef VUE2
+                return [this.value, this.disabled, this.inactiveColor, this.activeColor, this.size, this.labelDisabled, this.shape,
+					this.iconSize, this.borderBottom, this.placement
+				]
+				// #endif
+				
+			},
+			bemClass() {
+				// this.bem为一个computed变量,在mixin中
+				return this.bem('radio-group', ['placement'])
+			},
+		},
+		watch: {
+			// 当父组件需要子组件需要共享的参数发生了变化,手动通知子组件
+			parentData() {
+				if (this.children.length) {
+					this.children.map(child => {
+						// 判断子组件(u-radio)如果有init方法的话,就就执行(执行的结果是子组件重新从父组件拉取了最新的值)
+						typeof(child.init) === 'function' && child.init()
+					})
+				}
+			},
+		},
+		data() {
+			return {
+			}
+		},
+		created() {
+			this.children = []
+		},
+		// #ifdef VUE3
+		emits: ['update:modelValue', 'change'],
+    	// #endif
+		methods: {
+			// 将其他的radio设置为未选中的状态
+			unCheckedOther(childInstance) {
+				this.children.map(child => {
+					// 所有子radio中,被操作组件实例的checked的值无需修改
+					if (childInstance !== child) {
+						child.checked = false
+					}
+				})
+				const {
+					name
+				} = childInstance
+				// 通过emit事件,设置父组件通过v-model双向绑定的值
+				// #ifdef VUE3
+                this.$emit("update:modelValue", name);
+                // #endif
+                // #ifdef VUE2
+                this.$emit("input", name);
+				// #endif
+				// 发出事件
+				this.$emit('change', name)
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-radio-group {
+		flex: 1;
+
+		&--row {
+			/* #ifndef APP-NVUE */
+			display: flex;
+			/* #endif */
+			flex-flow: row wrap;
+		}
+
+		&--column {
+			@include flex(column);
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-radio/props.js b/uni_modules/uview-plus/components/u-radio/props.js
new file mode 100644
index 0000000..038d6e0
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-radio/props.js
@@ -0,0 +1,70 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // radio的名称
+        name: {
+            type: [String, Number, Boolean],
+            default: () => defProps.radio.name
+        },
+        // 形状,square为方形,circle为圆型
+        shape: {
+            type: String,
+            default: () => defProps.radio.shape
+        },
+        // 是否禁用
+        disabled: {
+            type: [String, Boolean],
+            default: () => defProps.radio.disabled
+        },
+        // 是否禁止点击提示语选中单选框
+        labelDisabled: {
+            type: [String, Boolean],
+            default: () => defProps.radio.labelDisabled
+        },
+        // 选中状态下的颜色,如设置此值,将会覆盖parent的activeColor值
+        activeColor: {
+            type: String,
+            default: () => defProps.radio.activeColor
+        },
+        // 未选中的颜色
+        inactiveColor: {
+            type: String,
+            default: () => defProps.radio.inactiveColor
+        },
+        // 图标的大小,单位px
+        iconSize: {
+            type: [String, Number],
+            default: () => defProps.radio.iconSize
+        },
+        // label的字体大小,px单位
+        labelSize: {
+            type: [String, Number],
+            default: () => defProps.radio.labelSize
+        },
+        // label提示文字,因为nvue下,直接slot进来的文字,由于特殊的结构,无法修改样式
+        label: {
+            type: [String, Number],
+            default: () => defProps.radio.label
+        },
+        // 整体的大小
+        size: {
+            type: [String, Number],
+            default: () => defProps.radio.size
+        },
+        // 图标颜色
+        color: {
+            type: String,
+            default: () => defProps.radio.color
+        },
+        // label的颜色
+        labelColor: {
+            type: String,
+            default: () => defProps.radio.labelColor
+        },
+        // 图标颜色
+        iconColor: {
+            type: String,
+            default: () => defProps.radio.iconColor
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-radio/u-radio.vue b/uni_modules/uview-plus/components/u-radio/u-radio.vue
new file mode 100644
index 0000000..cfe0cd9
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-radio/u-radio.vue
@@ -0,0 +1,348 @@
+<template>
+	<view
+	    class="u-radio cursor-pointer"
+		@tap.stop="wrapperClickHandler"
+	    :style="[radioStyle]"
+	    :class="[`u-radio-label--${parentData.iconPlacement}`, parentData.borderBottom && parentData.placement === 'column' && 'u-border-bottom']"
+	>
+		<view
+		    class="u-radio__icon-wrap cursor-pointer"
+		    @tap.stop="iconClickHandler"
+		    :class="iconClasses"
+		    :style="[iconWrapStyle]"
+		>
+			<slot name="icon">
+				<u-icon
+				    class="u-radio__icon-wrap__icon"
+				    name="checkbox-mark"
+				    :size="elIconSize"
+				    :color="elIconColor"
+				/>
+			</slot>
+		</view>
+		<text
+			class="u-radio__text"
+		    @tap.stop="labelClickHandler"
+		    :style="{
+				color: elDisabled ? elInactiveColor : elLabelColor,
+				fontSize: elLabelSize,
+				lineHeight: elLabelSize
+			}"
+		>{{label}}</text>
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addUnit, addStyle, os, deepMerge, formValidate, error } from '../../libs/function/index';
+	/**
+	 * radio 单选框
+	 * @description 单选框用于有一个选择,用户只能选择其中一个的场景。搭配u-radio-group使用
+	 * @tutorial https://ijry.github.io/uview-plus/components/radio.html
+	 * @property {String | Number}	name			radio的名称
+	 * @property {String}			shape			形状,square为方形,circle为圆型
+	 * @property {Boolean}			disabled		是否禁用
+	 * @property {String | Boolean}	labelDisabled	是否禁止点击提示语选中单选框
+	 * @property {String}			activeColor		选中时的颜色,如设置parent的active-color将失效
+	 * @property {String}			inactiveColor	未选中的颜色
+	 * @property {String | Number}	iconSize		图标大小,单位px
+	 * @property {String | Number}	labelSize		label字体大小,单位px
+	 * @property {String | Number}	label			label提示文字,因为nvue下,直接slot进来的文字,由于特殊的结构,无法修改样式
+	 * @property {String | Number}	size			整体的大小
+	 * @property {String}			iconColor		图标颜色
+	 * @property {String}			labelColor		label的颜色
+	 * @property {Object}			customStyle		组件的样式,对象形式
+	 * 
+	 * @event {Function} change 某个radio状态发生变化时触发(选中状态)
+	 * @example <u-radio :labelDisabled="false">门掩黄昏,无计留春住</u-radio>
+	 */
+	export default {
+		name: "u-radio",
+		mixins: [mpMixin, mixin,props],
+		data() {
+			return {
+				checked: false,
+				// 当你看到这段代码的时候,
+				// 父组件的默认值,因为头条小程序不支持在computed中使用this.parent.shape的形式
+				// 故只能使用如此方法
+				parentData: {
+					iconSize: 12,
+					labelDisabled: null,
+					disabled: null,
+					shape: null,
+					activeColor: null,
+					inactiveColor: null,
+					size: 18,
+					value: null,
+					modelValue: null,
+					iconColor: null,
+					placement: 'row',
+					borderBottom: false,
+					iconPlacement: 'left'
+				}
+			}
+		},
+		computed: {
+			// 是否禁用,如果父组件u-raios-group禁用的话,将会忽略子组件的配置
+			elDisabled() {
+				return this.disabled !== '' ? this.disabled : this.parentData.disabled !== null ? this.parentData.disabled : false;
+			},
+			// 是否禁用label点击
+			elLabelDisabled() {
+				return this.labelDisabled !== '' ? this.labelDisabled : this.parentData.labelDisabled !== null ? this.parentData.labelDisabled :
+					false;
+			},
+			// 组件尺寸,对应size的值,默认值为21px
+			elSize() {
+				return this.size ? this.size : (this.parentData.size ? this.parentData.size : 21);
+			},
+			// 组件的勾选图标的尺寸,默认12px
+			elIconSize() {
+				return this.iconSize ? this.iconSize : (this.parentData.iconSize ? this.parentData.iconSize : 12);
+			},
+			// 组件选中激活时的颜色
+			elActiveColor() {
+				return this.activeColor ? this.activeColor : (this.parentData.activeColor ? this.parentData.activeColor : '#2979ff');
+			},
+			// 组件选未中激活时的颜色
+			elInactiveColor() {
+				return this.inactiveColor ? this.inactiveColor : (this.parentData.inactiveColor ? this.parentData.inactiveColor :
+					'#c8c9cc');
+			},
+			// label的颜色
+			elLabelColor() {
+				return this.labelColor ? this.labelColor : (this.parentData.labelColor ? this.parentData.labelColor : '#606266')
+			},
+			// 组件的形状
+			elShape() {
+				return this.shape ? this.shape : (this.parentData.shape ? this.parentData.shape : 'circle');
+			},
+			// label大小
+			elLabelSize() {
+				return addUnit(this.labelSize ? this.labelSize : (this.parentData.labelSize ? this.parentData.labelSize :
+					'15'))
+			},
+			elIconColor() {
+				const iconColor = this.iconColor ? this.iconColor : (this.parentData.iconColor ? this.parentData.iconColor :
+					'#ffffff');
+				// 图标的颜色
+				if (this.elDisabled) {
+					// disabled状态下,已勾选的radio图标改为elInactiveColor
+					return this.checked ? this.elInactiveColor : 'transparent'
+				} else {
+					return this.checked ? iconColor : 'transparent'
+				}
+			},
+			iconClasses() {
+				let classes = []
+				// 组件的形状
+				classes.push('u-radio__icon-wrap--' + this.elShape)
+				if (this.elDisabled) {
+					classes.push('u-radio__icon-wrap--disabled')
+				}
+				if (this.checked && this.elDisabled) {
+					classes.push('u-radio__icon-wrap--disabled--checked')
+				}
+				// 支付宝,头条小程序无法动态绑定一个数组类名,否则解析出来的结果会带有",",而导致失效
+				// #ifdef MP-ALIPAY || MP-TOUTIAO
+				classes = classes.join(' ')
+				// #endif
+				return classes
+			},
+			iconWrapStyle() {
+				// radio的整体样式
+				const style = {}
+				style.backgroundColor = this.checked && !this.elDisabled ? this.elActiveColor : '#ffffff'
+				style.borderColor = this.checked && !this.elDisabled ? this.elActiveColor : this.elInactiveColor
+				style.width = addUnit(this.elSize)
+				style.height = addUnit(this.elSize)
+				// 如果是图标在右边的话,移除它的右边距
+				if (this.parentData.iconPlacement === 'right') {
+					style.marginRight = 0
+				}
+				return style
+			},
+			radioStyle() {
+				const style = {}
+				if(this.parentData.borderBottom && this.parentData.placement === 'row') {
+					error('检测到您将borderBottom设置为true,需要同时将u-radio-group的placement设置为column才有效')
+				}
+				// 当父组件设置了显示下边框并且排列形式为纵向时,给内容和边框之间加上一定间隔
+				if(this.parentData.borderBottom && this.parentData.placement === 'column') {
+					// ios像素密度高,需要多一点的距离
+					style.paddingBottom = os() === 'ios' ? '12px' : '8px'
+				}
+				return deepMerge(style, addStyle(this.customStyle))
+			}
+		},
+		mounted() {
+			this.init()
+		},
+		emits: ["change"],
+		methods: {
+			init() {
+				// 支付宝小程序不支持provide/inject,所以使用这个方法获取整个父组件,在created定义,避免循环引用
+				this.updateParentData()
+				if (!this.parent) {
+					error('u-radio必须搭配u-radio-group组件使用')
+				}
+				// 设置初始化时,是否默认选中的状态
+				// #ifdef VUE3
+				this.checked = this.name === this.parentData.modelValue
+				// #endif
+        		// #ifdef VUE2
+				this.checked = this.name === this.parentData.value
+				// #endif
+			},
+			updateParentData() {
+				this.getParentData('u-radio-group')
+			},
+			// 点击图标
+			iconClickHandler(e) {
+				this.preventEvent(e)
+				// 如果整体被禁用,不允许被点击
+				if (!this.elDisabled) {
+					this.setRadioCheckedStatus()
+				}
+			},
+			// 横向两端排列时,点击组件即可触发选中事件
+			wrapperClickHandler(e) {
+				this.parentData.iconPlacement === 'right' && this.iconClickHandler(e)
+			},
+			// 点击label
+			labelClickHandler(e) {
+				this.preventEvent(e)
+				// 如果按钮整体被禁用或者label被禁用,则不允许点击文字修改状态
+				if (!this.elLabelDisabled && !this.elDisabled) {
+					this.setRadioCheckedStatus()
+				}
+			},
+			emitEvent() {
+				// u-radio的checked不为true时(意味着未选中),才发出事件,避免多次点击触发事件
+				if (!this.checked) {
+					this.$emit('change', this.name)
+					// 尝试调用u-form的验证方法,进行一定延迟,否则微信小程序更新可能会不及时
+					this.$nextTick(() => {
+						formValidate(this, 'change')
+					})
+				}
+			},
+			// 改变组件选中状态
+			// 这里的改变的依据是,更改本组件的checked值为true,同时通过父组件遍历所有u-radio实例
+			// 将本组件外的其他u-radio的checked都设置为false(都被取消选中状态),因而只剩下一个为选中状态
+			setRadioCheckedStatus() {
+				this.emitEvent()
+				// 将本组件标记为选中状态
+				this.checked = true
+				typeof this.parent.unCheckedOther === 'function' && this.parent.unCheckedOther(this)
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+	$u-radio-wrap-margin-right:6px !default;
+	$u-radio-wrap-font-size:20px !default;
+	$u-radio-wrap-border-width:1px !default;
+	$u-radio-wrap-border-color: #c8c9cc !default;
+	$u-radio-line-height:0 !default;
+	$u-radio-circle-border-radius:100% !default;
+	$u-radio-square-border-radius:3px !default;
+	$u-radio-checked-color:#fff !default;
+	$u-radio-checked-background-color:red !default;
+	$u-radio-checked-border-color: #2979ff !default;
+	$u-radio-disabled-background-color:#ebedf0 !default;
+	$u-radio-disabled--checked-color:#c8c9cc !default;
+	$u-radio-label-margin-left: 5px !default;
+	$u-radio-label-margin-right:12px !default;
+	$u-radio-label-color:$u-content-color !default;
+	$u-radio-label-font-size:15px !default;
+	$u-radio-label-disabled-color:#c8c9cc !default;
+	
+	.u-radio {
+		/* #ifndef APP-NVUE */
+		@include flex(row);
+		/* #endif */
+		overflow: hidden;
+		flex-direction: row;
+		align-items: center;
+		margin-bottom: 5px;
+		margin-top: 5px;
+		
+		&-label--left {
+			flex-direction: row
+		}
+
+		&-label--right {
+			flex-direction: row-reverse;
+			justify-content: space-between
+		}
+
+		&__icon-wrap {
+			/* #ifndef APP-NVUE */
+			box-sizing: border-box;
+			// nvue下,border-color过渡有问题
+			transition-property: border-color, background-color, color;
+			transition-duration: 0.2s;
+			/* #endif */
+			color: $u-content-color;
+			@include flex;
+			align-items: center;
+			justify-content: center;
+			color: transparent;
+			text-align: center;
+			margin-right: $u-radio-wrap-margin-right;
+			font-size: $u-radio-wrap-font-size;
+			border-width: $u-radio-wrap-border-width;
+			border-color: $u-radio-wrap-border-color;
+			border-style: solid;
+
+			/* #ifdef MP-TOUTIAO */
+			// 头条小程序兼容性问题,需要设置行高为0,否则图标偏下
+			&__icon {
+				line-height: $u-radio-line-height;
+			}
+
+			/* #endif */
+
+			&--circle {
+				border-radius: $u-radio-circle-border-radius;
+			}
+
+			&--square {
+				border-radius: $u-radio-square-border-radius;
+			}
+
+			&--checked {
+				color: $u-radio-checked-color;
+				background-color: $u-radio-checked-background-color;
+				border-color: $u-radio-checked-border-color;
+			}
+
+			&--disabled {
+				background-color: $u-radio-disabled-background-color !important;
+			}
+
+			&--disabled--checked {
+				color: $u-radio-disabled--checked-color !important;
+			}
+		}
+
+		&__label {
+			/* #ifndef APP-NVUE */
+			word-wrap: break-word;
+			/* #endif */
+			margin-left: $u-radio-label-margin-left;
+			margin-right: $u-radio-label-margin-right;
+			color: $u-radio-label-color;
+			font-size: $u-radio-label-font-size;
+
+			&--disabled {
+				color: $u-radio-label-disabled-color;
+			}
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-rate/props.js b/uni_modules/uview-plus/components/u-rate/props.js
new file mode 100644
index 0000000..21137cf
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-rate/props.js
@@ -0,0 +1,79 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // #ifdef VUE3
+        // 用于v-model双向绑定选中的星星数量
+        modelValue: {
+            type: [String, Number],
+            default: () => defProps.rate.value
+        },
+        // #endif
+        // #ifdef VUE2
+        // 用于v-model双向绑定选中的星星数量
+        value: {
+            type: [String, Number],
+            default: () => defProps.rate.value
+        },
+        // #endif
+        // 要显示的星星数量
+        count: {
+            type: [String, Number],
+            default: () => defProps.rate.count
+        },
+        // 是否不可选中
+        disabled: {
+            type: Boolean,
+            default: () => defProps.rate.disabled
+        },
+        // 是否只读
+        readonly: {
+            type: Boolean,
+            default: () => defProps.rate.readonly
+        },
+        // 星星的大小,单位px
+        size: {
+            type: [String, Number],
+            default: () => defProps.rate.size
+        },
+        // 未选中时的颜色
+        inactiveColor: {
+            type: String,
+            default: () => defProps.rate.inactiveColor
+        },
+        // 选中的颜色
+        activeColor: {
+            type: String,
+            default: () => defProps.rate.activeColor
+        },
+        // 星星之间的间距,单位px
+        gutter: {
+            type: [String, Number],
+            default: () => defProps.rate.gutter
+        },
+        // 最少能选择的星星个数
+        minCount: {
+            type: [String, Number],
+            default: () => defProps.rate.minCount
+        },
+        // 是否允许半星
+        allowHalf: {
+            type: Boolean,
+            default: () => defProps.rate.allowHalf
+        },
+        // 选中时的图标(星星)
+        activeIcon: {
+            type: String,
+            default: () => defProps.rate.activeIcon
+        },
+        // 未选中时的图标(星星)
+        inactiveIcon: {
+            type: String,
+            default: () => defProps.rate.inactiveIcon
+        },
+        // 是否可以通过滑动手势选择评分
+        touchable: {
+            type: Boolean,
+            default: () => defProps.rate.touchable
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-rate/u-rate.vue b/uni_modules/uview-plus/components/u-rate/u-rate.vue
new file mode 100644
index 0000000..569d65a
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-rate/u-rate.vue
@@ -0,0 +1,328 @@
+<template>
+    <view
+        class="u-rate"
+        :id="elId"
+        ref="u-rate"
+        :style="[addStyle(customStyle)]"
+    >
+        <view
+            class="u-rate__content"
+            @touchmove.stop="touchMove"
+            @touchend.stop="touchEnd"
+        >
+            <view
+                class="u-rate__content__item cursor-pointer"
+                v-for="(item, index) in Number(count)"
+                :key="index"
+                :class="[elClass]"
+            >
+                <view
+                    class="u-rate__content__item__icon-wrap"
+                    ref="u-rate__content__item__icon-wrap"
+                    @tap.stop="clickHandler($event, index + 1)"
+                >
+                    <u-icon
+                        :name="
+                            Math.floor(activeIndex) > index
+                                ? activeIcon
+                                : inactiveIcon
+                        "
+                        :color="
+                            disabled
+                                ? '#c8c9cc'
+                                : Math.floor(activeIndex) > index
+                                ? activeColor
+                                : inactiveColor
+                        "
+                        :custom-style="{
+                            padding: `0 ${addUnit(gutter / 2)}`,
+                        }"
+                        :size="size"
+                    ></u-icon>
+                </view>
+                <view
+                    v-if="allowHalf"
+                    @tap.stop="clickHandler($event, index + 1)"
+                    class="u-rate__content__item__icon-wrap u-rate__content__item__icon-wrap--half"
+                    :style="[{
+                        width: addUnit(rateWidth / 2),
+                    }]"
+                    ref="u-rate__content__item__icon-wrap"
+                >
+                    <u-icon
+                        :name="
+                            Math.ceil(activeIndex) > index
+                                ? activeIcon
+                                : inactiveIcon
+                        "
+                        :color="
+                            disabled
+                                ? '#c8c9cc'
+                                : Math.ceil(activeIndex) > index
+                                ? activeColor
+                                : inactiveColor
+                        "
+                        :custom-style="{
+                            padding: `0 ${addUnit(gutter / 2)}`
+                        }"
+                        :size="size"
+                    ></u-icon>
+                </view>
+            </view>
+        </view>
+    </view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addUnit, addStyle, guid, sleep, range, os } from '../../libs/function/index';
+	// #ifdef APP-NVUE
+	const dom = weex.requireModule("dom");
+	// #endif
+	/**
+	 * rate 评分
+	 * @description 该组件一般用于满意度调查,星型评分的场景
+	 * @tutorial https://ijry.github.io/uview-plus/components/rate.html
+	 * @property {String | Number}	value			用于v-model双向绑定选中的星星数量 (默认 1 )
+	 * @property {String | Number}	count			最多可选的星星数量 (默认 5 )
+	 * @property {Boolean}			disabled		是否禁止用户操作 (默认 false )
+	 * @property {Boolean}			readonly		是否只读 (默认 false )
+	 * @property {String | Number}	size			星星的大小,单位px (默认 18 )
+	 * @property {String}			inactiveColor	未选中星星的颜色 (默认 '#b2b2b2' )
+	 * @property {String}			activeColor		选中的星星颜色 (默认 '#FA3534' )
+	 * @property {String | Number}	gutter			星星之间的距离 (默认 4 )
+	 * @property {String | Number}	minCount		最少选中星星的个数 (默认 1 )
+	 * @property {Boolean}			allowHalf		是否允许半星选择 (默认 false )
+	 * @property {String}			activeIcon		选中时的图标名,只能为uView的内置图标 (默认 'star-fill' )
+	 * @property {String}			inactiveIcon	未选中时的图标名,只能为uView的内置图标 (默认 'star' )
+	 * @property {Boolean}			touchable		是否可以通过滑动手势选择评分 (默认 'true' )
+	 * @property {Object}			customStyle		组件的样式,对象形式
+	 * @event {Function} change 选中的星星发生变化时触发
+	 * @example <u-rate :count="count" :value="2"></u-rate>
+	 */
+	export default {
+		name: "u-rate",
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				// 生成一个唯一id,否则一个页面多个评分组件,会造成冲突
+				elId: guid(),
+				elClass: guid(),
+				rateBoxLeft: 0, // 评分盒子左边到屏幕左边的距离,用于滑动选择时计算距离
+				// #ifdef VUE3
+				activeIndex: this.modelValue,
+				// #endif
+				// #ifdef VUE2
+				activeIndex: this.value,
+				// #endif
+				rateWidth: 0, // 每个星星的宽度
+				// 标识是否正在滑动,由于iOS事件上touch比click先触发,导致快速滑动结束后,接着触发click,导致事件混乱而出错
+				moving: false,
+			};
+		},
+		watch: {
+			// #ifdef VUE3
+			modelValue(val) {
+				this.activeIndex = val;
+			},
+			// #endif
+        	// #ifdef VUE2
+			value(val) {
+				this.activeIndex = val;
+			},
+			// #endif
+			activeIndex: 'emitEvent'
+		},
+		// #ifdef VUE3
+		emits: ['update:modelValue', 'change'],
+    	// #endif
+		methods: {
+			addStyle,
+			addUnit,
+			init() {
+				sleep().then(() => {
+					this.getRateItemRect();
+					this.getRateIconWrapRect();
+				})
+			},
+			// 获取评分组件盒子的布局信息
+			async getRateItemRect() {
+				await sleep();
+				// uView封装的获取节点的方法,详见文档
+				// #ifndef APP-NVUE
+				this.$uGetRect("#" + this.elId).then((res) => {
+					this.rateBoxLeft = res.left;
+				});
+				// #endif
+				// #ifdef APP-NVUE
+				dom.getComponentRect(this.$refs["u-rate"], (res) => {
+					this.rateBoxLeft = res.size.left;
+				});
+				// #endif
+			},
+			// 获取单个星星的尺寸
+			getRateIconWrapRect() {
+				// uView封装的获取节点的方法,详见文档
+				// #ifndef APP-NVUE
+				this.$uGetRect("." + this.elClass).then((res) => {
+					this.rateWidth = res.width;
+				});
+				// #endif
+				// #ifdef APP-NVUE
+				dom.getComponentRect(
+					this.$refs["u-rate__content__item__icon-wrap"][0],
+					(res) => {
+						this.rateWidth = res.size.width;
+					}
+				);
+				// #endif
+			},
+			// 手指滑动
+			touchMove(e) {
+				// 如果禁止通过手动滑动选择,返回
+				if (!this.touchable) {
+					return;
+				}
+				this.preventEvent(e);
+				const x = e.changedTouches[0].pageX;
+				this.getActiveIndex(x);
+			},
+			// 停止滑动
+			touchEnd(e) {
+				// 如果禁止通过手动滑动选择,返回
+				if (!this.touchable) {
+					return;
+				}
+				this.preventEvent(e);
+				const x = e.changedTouches[0].pageX;
+				this.getActiveIndex(x);
+			},
+			// 通过点击,直接选中
+			clickHandler(e, index) {
+				// ios上,moving状态取消事件触发
+				if (os() === "ios" && this.moving) {
+					return;
+				}
+				this.preventEvent(e);
+				let x = 0;
+				// 点击时,在nvue上,无法获得点击的坐标,所以无法实现点击半星选择
+				// #ifndef APP-NVUE
+				x = e.changedTouches[0].pageX;
+				// #endif
+				// #ifdef APP-NVUE
+				// nvue下,无法通过点击获得坐标信息,这里通过元素的位置尺寸值模拟坐标
+				x = index * this.rateWidth + this.rateBoxLeft;
+				// #endif
+				this.getActiveIndex(x,true);
+			},
+			// 发出事件
+			emitEvent() {
+				// 发出change事件
+				this.$emit("change", this.activeIndex);
+				// 同时修改双向绑定的值
+				// #ifdef VUE3
+                this.$emit("update:modelValue", this.activeIndex);
+                // #endif
+                // #ifdef VUE2
+				this.$emit("input", this.activeIndex);
+				// #endif
+			},
+			// 获取当前激活的评分图标
+			getActiveIndex(x,isClick = false) {
+				if (this.disabled || this.readonly) {
+					return;
+				}
+				// 判断当前操作的点的x坐标值,是否在允许的边界范围内
+				const allRateWidth = this.rateWidth * this.count + this.rateBoxLeft;
+				// 如果小于第一个图标的左边界,设置为最小值,如果大于所有图标的宽度,则设置为最大值
+				x = range(this.rateBoxLeft, allRateWidth, x) - this.rateBoxLeft
+				// 滑动点相对于评分盒子左边的距离
+				const distance = x;
+				// 滑动的距离,相当于多少颗星星
+				let index;
+				// 判断是否允许半星
+				if (this.allowHalf) {
+					index = Math.floor(distance / this.rateWidth);
+					// 取余,判断小数的区间范围
+					const decimal = distance % this.rateWidth;
+					if (decimal <= this.rateWidth / 2 && decimal > 0) {
+						index += 0.5;
+					} else if (decimal > this.rateWidth / 2) {
+						index++;
+					}
+				} else {
+					index = Math.floor(distance / this.rateWidth);
+					// 取余,判断小数的区间范围
+					const decimal = distance % this.rateWidth;
+					// 非半星时,只有超过了图标的一半距离,才认为是选择了这颗星
+					if (isClick){
+						if (decimal > 0) index++;
+					} else {
+						if (decimal > this.rateWidth / 2) index++;
+					}
+
+				}
+				this.activeIndex = Math.min(index, this.count);
+				// 对最少颗星星的限制
+				if (this.activeIndex < this.minCount) {
+					this.activeIndex = this.minCount;
+				}
+
+				// 设置延时为了让click事件在touchmove之前触发
+				setTimeout(() => {
+					this.moving = true;
+				}, 10);
+				// 一定时间后,取消标识为移动中状态,是为了让click事件无效
+				setTimeout(() => {
+					this.moving = false;
+				}, 10);
+			},
+		},
+		mounted() {
+			this.init();
+		},
+	};
+</script>
+
+<style lang="scss" scoped>
+@import "../../libs/css/components.scss";
+$u-rate-margin: 0 !default;
+$u-rate-padding: 0 !default;
+$u-rate-item-icon-wrap-half-top: 0 !default;
+$u-rate-item-icon-wrap-half-left: 0 !default;
+
+.u-rate {
+    @include flex;
+    align-items: center;
+    margin: $u-rate-margin;
+    padding: $u-rate-padding;
+    /* #ifndef APP-NVUE */
+    touch-action: none;
+    /* #endif */
+
+    &__content {
+        @include flex;
+
+		&__item {
+		    position: relative;
+
+		    &__icon-wrap {
+		        &--half {
+		            position: absolute;
+		            overflow: hidden;
+		            top: $u-rate-item-icon-wrap-half-top;
+		            left: $u-rate-item-icon-wrap-half-left;
+		        }
+		    }
+		}
+    }
+}
+
+.u-icon {
+    /* #ifndef APP-NVUE */
+    box-sizing: border-box;
+    /* #endif */
+}
+</style>
diff --git a/uni_modules/uview-plus/components/u-read-more/props.js b/uni_modules/uview-plus/components/u-read-more/props.js
new file mode 100644
index 0000000..972c8a8
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-read-more/props.js
@@ -0,0 +1,62 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 默认的显示占位高度
+        showHeight: {
+            type: [String, Number],
+            default: () => defProps.readMore.showHeight
+        },
+        // 展开后是否显示"收起"按钮
+        toggle: {
+            type: Boolean,
+            default: () => defProps.readMore.toggle
+        },
+        // 关闭时的提示文字
+        closeText: {
+            type: String,
+            default: () => defProps.readMore.closeText
+        },
+        // 展开时的提示文字
+        openText: {
+            type: String,
+            default: () => defProps.readMore.openText
+        },
+        // 提示的文字颜色
+        color: {
+            type: String,
+            default: () => defProps.readMore.color
+        },
+        // 提示文字的大小
+        fontSize: {
+            type: [String, Number],
+            default: () => defProps.readMore.fontSize
+        },
+        // 是否显示阴影
+        // 此参数不能写在props/readMore.js中进行默认配置,因为使用了条件编译,在外部js中
+        // uni无法准确识别当前是否处于nvue还是非nvue下
+        shadowStyle: {
+            type: Object,
+            default: () => ({
+                // #ifndef APP-NVUE
+                backgroundImage: 'linear-gradient(-180deg, rgba(255, 255, 255, 0) 0%, #fff 80%)',
+                // #endif
+                // #ifdef APP-NVUE
+                // nvue上不支持设置复杂的backgroundImage属性
+                backgroundImage: 'linear-gradient(to top, #fff, rgba(255, 255, 255, 0.5))',
+                // #endif
+                paddingTop: '100px',
+                marginTop: '-100px'
+            })
+        },
+        // 段落首行缩进的字符个数
+        textIndent: {
+            type: String,
+            default: () => defProps.readMore.textIndent
+        },
+        // open和close事件时,将此参数返回在回调参数中
+        name: {
+            type: [String, Number],
+            default: () => defProps.readMore.name
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-read-more/u-read-more.vue b/uni_modules/uview-plus/components/u-read-more/u-read-more.vue
new file mode 100644
index 0000000..120d04e
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-read-more/u-read-more.vue
@@ -0,0 +1,166 @@
+<template>
+	<view class="u-read-more">
+		<view
+		    class="u-read-more__content"
+		    :style="{
+				height: isLongContent && status === 'close' ? addUnit(showHeight) : addUnit(contentHeight),
+				textIndent: textIndent
+			}"
+		>
+			<view
+			    class="u-read-more__content__inner"
+			    ref="u-read-more__content__inner"
+			    :class="[elId]"
+			>
+				<slot></slot>
+			</view>
+		</view>
+		<view
+		    class="u-read-more__toggle"
+		    :style="[innerShadowStyle]"
+		    v-if="isLongContent"
+		>
+			<slot name="toggle">
+				<view
+				    class="u-read-more__toggle__text"
+				    @tap="toggleReadMore"
+				>
+					<up-text
+					    :text="status === 'close' ? closeText : openText"
+					    :color="color"
+					    :size="fontSize"
+					    :lineHeight="fontSize"
+					    margin="0 5px 0 0"
+					></up-text>
+					<view class="u-read-more__toggle__icon">
+						<u-icon
+						    :color="color"
+						    :size="fontSize + 2"
+						    :name="status === 'close' ? 'arrow-down' : 'arrow-up'"
+						></u-icon>
+					</view>
+				</view>
+			</slot>
+		</view>
+	</view>
+</template>
+
+<script>
+	// #ifdef APP-NVUE
+	const dom = uni.requireNativePlugin('dom')
+	// #endif
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addUnit, guid, getPx, sleep } from '../../libs/function/index';
+	/**
+	 * readMore 阅读更多
+	 * @description 该组件一般用于内容较长,预先收起一部分,点击展开全部内容的场景。
+	 * @tutorial https://ijry.github.io/uview-plus/components/readMore.html
+	 * @property {String | Number}	showHeight	内容超出此高度才会显示展开全文按钮,单位px(默认 400 )
+	 * @property {Boolean}			toggle		展开后是否显示收起按钮(默认 false )
+	 * @property {String}			closeText	关闭时的提示文字(默认 '展开阅读全文' )
+	 * @property {String}			openText	展开时的提示文字(默认 '收起' )
+	 * @property {String}			color		提示文字的颜色(默认 '#2979ff' )
+	 * @property {String | Number}	fontSize	提示文字的大小,单位px (默认 14 )
+	 * @property {Object}			shadowStyle	显示阴影的样式
+	 * @property {String}			textIndent	段落首行缩进的字符个数 (默认 '2em' )
+	 * @property {String | Number}	name		用于在 open 和 close 事件中当作回调参数返回
+	 * @event {Function} open 内容被展开时触发
+	 * @event {Function} close 内容被收起时触发
+	 * @example <u-read-more><rich-text :nodes="content"></rich-text></u-read-more>
+	 */
+	export default {
+		name: 'u-read-more',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				isLongContent: false, // 是否需要隐藏一部分内容
+				status: 'close', // 当前隐藏与显示的状态,close-收起状态,open-展开状态
+				elId: guid(), // 生成唯一class
+				contentHeight: 100, // 内容高度
+			}
+		},
+		computed: {
+			// 展开后无需阴影,收起时才需要阴影样式
+			innerShadowStyle() {
+				if (this.status === 'open') return {}
+				else return this.shadowStyle
+			}
+		},
+		mounted() {
+			this.init()
+		},
+		emits: ["open", "close"],
+		methods: {
+			addUnit,
+			async init() {
+				this.getContentHeight().then(height => {
+					this.contentHeight = height
+					// 判断高度,如果真实内容高度大于占位高度,则显示收起与展开的控制按钮
+					if (height > getPx(this.showHeight)) {
+						this.isLongContent = true
+						this.status = 'close'
+					} else {
+						// https://github.com/ijry/uview-plus/issues/270
+						this.isLongContent = false
+						this.status = 'close'
+					}
+				})
+			},
+			// 获取内容的高度
+			async getContentHeight() {
+				// 延时一定时间再获取节点
+				await sleep(30)
+				return new Promise(resolve => {
+					// #ifndef APP-NVUE
+					this.$uGetRect('.' + this.elId).then(res => {
+						resolve(res.height)
+					})
+					// #endif
+
+					// #ifdef APP-NVUE
+					const ref = this.$refs['u-read-more__content__inner']
+					dom.getComponentRect(ref, (res) => {
+						resolve(res.size.height)
+					})
+					// #endif
+				})
+			},
+			// 展开或者收起
+			toggleReadMore() {
+				this.status = this.status === 'close' ? 'open' : 'close'
+				// 如果toggle为false,隐藏"收起"部分的内容
+				if (this.toggle == false) this.isLongContent = false
+				// 发出打开或者收齐的事件
+				this.$emit(this.status, this.name)
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+@import "../../libs/css/components.scss";
+
+.u-read-more {
+
+	&__content {
+		overflow: hidden;
+		color: $u-content-color;
+		font-size: 15px;
+		text-align: left;
+	}
+
+	&__toggle {
+		@include flex;
+		justify-content: center;
+
+		&__text {
+			@include flex;
+			align-items: center;
+			justify-content: center;
+			margin-top: 5px;
+		}
+	}
+}
+</style>
diff --git a/uni_modules/uview-plus/components/u-row-notice/props.js b/uni_modules/uview-plus/components/u-row-notice/props.js
new file mode 100644
index 0000000..276ba1b
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-row-notice/props.js
@@ -0,0 +1,40 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 显示的内容,字符串
+        text: {
+            type: String,
+            default: () => defProps.rowNotice.text
+        },
+        // 是否显示左侧的音量图标
+        icon: {
+            type: String,
+            default: () => defProps.rowNotice.icon
+        },
+        // 通告模式,link-显示右箭头,closable-显示右侧关闭图标
+        mode: {
+            type: String,
+            default: () => defProps.rowNotice.mode
+        },
+        // 文字颜色,各图标也会使用文字颜色
+        color: {
+            type: String,
+            default: () => defProps.rowNotice.color
+        },
+        // 背景颜色
+        bgColor: {
+            type: String,
+            default: () => defProps.rowNotice.bgColor
+        },
+        // 字体大小,单位px
+        fontSize: {
+            type: [String, Number],
+            default: () => defProps.rowNotice.fontSize
+        },
+        // 水平滚动时的滚动速度,即每秒滚动多少px(rpx),这有利于控制文字无论多少时,都能有一个恒定的速度
+        speed: {
+            type: [String, Number],
+            default: () => defProps.rowNotice.speed
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-row-notice/u-row-notice.vue b/uni_modules/uview-plus/components/u-row-notice/u-row-notice.vue
new file mode 100644
index 0000000..2adabbb
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-row-notice/u-row-notice.vue
@@ -0,0 +1,342 @@
+<template>
+	<view
+		class="u-notice"
+		@tap="clickHandler"
+	>
+		<slot name="icon">
+			<view
+				class="u-notice__left-icon"
+				v-if="icon"
+			>
+				<u-icon
+					:name="icon"
+					:color="color"
+					size="19"
+				></u-icon>
+			</view>
+		</slot>
+		<view
+			class="u-notice__content"
+			ref="u-notice__content"
+		>
+			<view
+				ref="u-notice__content__text"
+				class="u-notice__content__text"
+				:style="[animationStyle]"
+			>
+				<text
+					v-for="(item, index) in innerText"
+					:key="index"
+					:style="[textStyle]"
+				>{{item}}</text>
+			</view>
+		</view>
+		<view
+			class="u-notice__right-icon"
+			v-if="['link', 'closable'].includes(mode)"
+		>
+			<u-icon
+				v-if="mode === 'link'"
+				name="arrow-right"
+				:size="17"
+				:color="color"
+			></u-icon>
+			<u-icon
+				v-if="mode === 'closable'"
+				@click="close"
+				name="close"
+				:size="16"
+				:color="color"
+			></u-icon>
+		</view>
+	</view>
+</template>
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addUnit, error, sleep, getPx } from '../../libs/function/index';
+	import test from '../../libs/function/test';
+	// #ifdef APP-NVUE
+	const animation = uni.requireNativePlugin('animation')
+	const dom = uni.requireNativePlugin('dom')
+	// #endif
+	/**
+	 * RowNotice 滚动通知中的水平滚动模式
+	 * @description 水平滚动
+	 * @tutorial https://ijry.github.io/uview-plus/components/noticeBar.html
+	 * @property {String | Number}	text			显示的内容,字符串
+	 * @property {String}			icon			是否显示左侧的音量图标 (默认 'volume' )
+	 * @property {String}			mode			通告模式,link-显示右箭头,closable-显示右侧关闭图标
+	 * @property {String}			color			文字颜色,各图标也会使用文字颜色 (默认 '#f9ae3d' )
+	 * @property {String}			bgColor			背景颜色 (默认 ''#fdf6ec' )
+	 * @property {String | Number}	fontSize		字体大小,单位px (默认 14 )
+	 * @property {String | Number}	speed			水平滚动时的滚动速度,即每秒滚动多少px(rpx),这有利于控制文字无论多少时,都能有一个恒定的速度  (默认 80 )
+	 * 
+	 * @event {Function} click 点击通告文字触发
+	 * @event {Function} close 点击右侧关闭图标触发
+	 * @example 
+	 */
+	export default {
+		name: 'u-row-notice',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				animationDuration: '0', // 动画执行时间
+				animationPlayState: 'paused', // 动画的开始和结束执行
+				// nvue下,内容发生变化,导致滚动宽度也变化,需要标志为是否需要重新计算宽度
+				// 不能在内容变化时直接重新计算,因为nvue的animation模块上一次的滚动不是刚好结束,会有影响
+				nvueInit: true,
+				show: true
+			};
+		},
+		watch: {
+			text: {
+				immediate: true,
+				handler(newValue, oldValue) {
+					// #ifdef APP-NVUE
+					this.nvueInit = true
+					// #endif
+					// #ifndef APP-NVUE
+					this.vue()
+					// #endif
+					
+					if(!test.string(newValue)) {
+						error('noticebar组件direction为row时,要求text参数为字符串形式')
+					}
+				}
+			},
+			fontSize() {
+				// #ifdef APP-NVUE
+				this.nvueInit = true
+				// #endif
+				// #ifndef APP-NVUE
+				this.vue()
+				// #endif
+			},
+			speed() {
+				// #ifdef APP-NVUE
+				this.nvueInit = true
+				// #endif
+				// #ifndef APP-NVUE
+				this.vue()
+				// #endif
+			}
+		},
+		computed: {
+			// 文字内容的样式
+			textStyle() {
+				let style = {}
+				style.color = this.color
+				style.fontSize = addUnit(this.fontSize)
+				return style
+			},
+			animationStyle() {
+				let style = {}
+				style.animationDuration = this.animationDuration
+				style.animationPlayState = this.animationPlayState
+				return style
+			},
+			// 内部对用户传入的数据进一步分割,放到多个text标签循环,否则如果用户传入的字符串很长(100个字符以上)
+			// 放在一个text标签中进行滚动,在低端安卓机上,动画可能会出现抖动现象,需要分割到多个text中可解决此问题
+			innerText() {
+				let result = [],
+					// 每组text标签的字符长度
+					len = 20
+				const textArr = this.text.split('')
+				for (let i = 0; i < textArr.length; i += len) {
+					// 对拆分的后的text进行slice分割,得到的为数组再进行join拼接为字符串
+					result.push(textArr.slice(i, i + len).join(''))
+				}
+				return result
+			}
+		},
+		mounted() {
+			// #ifdef APP-PLUS
+			// 在APP上(含nvue),监听当前webview是否处于隐藏状态(进入下一页时即为hide状态)
+			// 如果webivew隐藏了,为了节省性能的损耗,应停止动画的执行,同时也是为了保持进入下一页返回后,滚动位置保持不变
+			var pages = getCurrentPages()
+			var page = pages[pages.length - 1]
+			var currentWebview = page.$getAppWebview()
+			currentWebview.addEventListener('hide', () => {
+				this.webviewHide = true
+			})
+			currentWebview.addEventListener('show', () => {
+				this.webviewHide = false
+			})
+			// #endif
+
+			this.init()
+		},
+		emits: ["click", "close"],
+		methods: {
+			init() {
+				// #ifdef APP-NVUE
+				this.nvue()
+				// #endif
+
+				// #ifndef APP-NVUE
+				this.vue()
+				// #endif
+				
+				if(!test.string(this.text)) {
+					error('noticebar组件direction为row时,要求text参数为字符串形式')
+				}
+			},
+			// vue版处理
+			async vue() {
+				// #ifndef APP-NVUE
+				let boxWidth = 0,
+					textWidth = 0
+				// 进行一定的延时
+				await sleep()
+				// 查询盒子和文字的宽度
+				textWidth = (await this.$uGetRect('.u-notice__content__text')).width
+				boxWidth = (await this.$uGetRect('.u-notice__content')).width
+				// 根据t=s/v(时间=路程/速度),这里为何不需要加上#u-notice-box的宽度,因为中设置了.u-notice-content样式中设置了padding-left: 100%
+				// 恰巧计算出来的结果中已经包含了#u-notice-box的宽度
+				this.animationDuration = `${textWidth / getPx(this.speed)}s`
+				// 这里必须这样开始动画,否则在APP上动画速度不会改变
+				this.animationPlayState = 'paused'
+				setTimeout(() => {
+					this.animationPlayState = 'running'
+				}, 10)
+				// #endif
+			},
+			// nvue版处理
+			async nvue() {
+				// #ifdef APP-NVUE
+				this.nvueInit = false
+				let boxWidth = 0,
+					textWidth = 0
+				// 进行一定的延时
+				await sleep()
+				// 查询盒子和文字的宽度
+				textWidth = (await this.getNvueRect('u-notice__content__text')).width
+				boxWidth = (await this.getNvueRect('u-notice__content')).width
+				// 将文字移动到盒子的右边沿,之所以需要这么做,是因为nvue不支持100%单位,否则可以通过css设置
+				animation.transition(this.$refs['u-notice__content__text'], {
+					styles: {
+						transform: `translateX(${boxWidth}px)`
+					},
+				}, () => {
+					// 如果非禁止动画,则开始滚动
+					!this.stopAnimation && this.loopAnimation(textWidth, boxWidth)
+				});
+				// #endif
+			},
+			loopAnimation(textWidth, boxWidth) {
+				// #ifdef APP-NVUE
+				animation.transition(this.$refs['u-notice__content__text'], {
+					styles: {
+						// 目标移动终点为-textWidth,也即当文字的最右边贴到盒子的左边框的位置
+						transform: `translateX(-${textWidth}px)`
+					},
+					// 滚动时间的计算为,时间 = 路程(boxWidth + textWidth) / 速度,最后转为毫秒
+					duration: (boxWidth + textWidth) / getPx(this.speed) * 1000,
+					delay: 10
+				}, () => {
+					animation.transition(this.$refs['u-notice__content__text'], {
+						styles: {
+							// 重新将文字移动到盒子的右边沿
+							transform: `translateX(${this.stopAnimation ? 0 : boxWidth}px)`
+						},
+					}, () => {
+						// 如果非禁止动画,则继续下一轮滚动
+						if (!this.stopAnimation) {
+							// 判断是否需要初始化计算尺寸
+							if (this.nvueInit) {
+								this.nvue()
+							} else {
+								this.loopAnimation(textWidth, boxWidth)
+							}
+						}
+					});
+				})
+				// #endif
+			},
+			getNvueRect(el) {
+				// #ifdef APP-NVUE
+				// 返回一个promise
+				return new Promise(resolve => {
+					dom.getComponentRect(this.$refs[el], (res) => {
+						resolve(res.size)
+					})
+				})
+				// #endif
+			},
+			// 点击通告栏
+			clickHandler(index) {
+				this.$emit('click')
+			},
+			// 点击右侧按钮,需要判断点击的是关闭图标还是箭头图标
+			close() {
+				this.$emit('close')
+			}
+		},
+		// #ifdef APP-NVUE
+		// #ifdef VUE2
+		beforeDestroy() {
+		// #endif
+		// #ifdef VUE3
+		beforeUnmount() {
+		// #endif
+			this.stopAnimation = true
+		},
+		// #endif
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-notice {
+		@include flex;
+		align-items: center;
+		justify-content: space-between;
+
+		&__left-icon {
+			align-items: center;
+			margin-right: 5px;
+		}
+
+		&__right-icon {
+			margin-left: 5px;
+			align-items: center;
+		}
+
+		&__content {
+			text-align: right;
+			flex: 1;
+			@include flex;
+			flex-wrap: nowrap;
+			overflow: hidden;
+
+			&__text {
+				font-size: 14px;
+				color: $u-warning;
+				/* #ifndef APP-NVUE */
+				// 这一句很重要,为了能让滚动左右连接起来
+				padding-left: 100%;
+				word-break: keep-all;
+				white-space: nowrap;
+				animation: u-loop-animation 10s linear infinite both;
+				/* #endif */
+				@include flex(row);
+			}
+		}
+
+	}
+
+	/* #ifndef APP-NVUE */
+	@keyframes u-loop-animation {
+		0% {
+			transform: translate3d(0, 0, 0);
+		}
+	
+		100% {
+			transform: translate3d(-100%, 0, 0);
+		}
+	}
+	/* #endif */
+</style>
diff --git a/uni_modules/uview-plus/components/u-row/props.js b/uni_modules/uview-plus/components/u-row/props.js
new file mode 100644
index 0000000..baf88f1
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-row/props.js
@@ -0,0 +1,20 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 给col添加间距,左右边距各占一半
+        gutter: {
+            type: [String, Number],
+            default: () => defProps.row.gutter
+        },
+        // 水平排列方式,可选值为`start`(或`flex-start`)、`end`(或`flex-end`)、`center`、`around`(或`space-around`)、`between`(或`space-between`)
+        justify: {
+            type: String,
+            default: () => defProps.row.justify
+        },
+        // 垂直对齐方式,可选值为top、center、bottom
+        align: {
+            type: String,
+            default: () => defProps.row.align
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-row/u-row.vue b/uni_modules/uview-plus/components/u-row/u-row.vue
new file mode 100644
index 0000000..98671bd
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-row/u-row.vue
@@ -0,0 +1,97 @@
+<template>
+	<view
+	    class="u-row"
+		ref="u-row"
+	    :style="[rowStyle]"
+	    @tap="clickHandler"
+	>
+		<slot />
+	</view>
+</template>
+
+<script>
+	// #ifdef APP-NVUE
+	const dom = uni.requireNativePlugin('dom')
+	// #endif
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addUnit, addStyle, deepMerge, sleep } from '../../libs/function/index';
+	/**
+	 * Row 栅格系统中的行
+	 * @description 通过基础的 12 分栏,迅速简便地创建布局 
+	 * @tutorial https://ijry.github.io/uview-plus/components/layout.html
+	 * @property {String | Number}	gutter		栅格间隔,左右各为此值的一半,单位px  (默认 0 )
+	 * @property {String}			justify		水平排列方式(微信小程序暂不支持) 可选值为`start`(或`flex-start`)、`end`(或`flex-end`)、`center`、`around`(或`space-around`)、`between`(或`space-between`)  (默认 'start' )
+	 * @property {String}			align		垂直排列方式 (默认 'center' )
+	 * @property {Object}			customStyle	定义需要用到的外部样式
+	 * 
+	 * @event {Function} click row被点击
+	 * @example <u-row justify="space-between" customStyle="margin-bottom: 10px"></u-row>
+	 */
+	export default {
+		name: "u-row",
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				
+			}
+		},
+		computed: {
+			uJustify() {
+				if (this.justify == 'end' || this.justify == 'start') return 'flex-' + this.justify
+				else if (this.justify == 'around' || this.justify == 'between') return 'space-' + this.justify
+				else return this.justify
+			},
+			uAlignItem() {
+				if (this.align == 'top') return 'flex-start'
+				if (this.align == 'bottom') return 'flex-end'
+				else return this.align
+			},
+			rowStyle() {
+				const style = {
+					alignItems: this.uAlignItem,
+					justifyContent: this.uJustify
+				}
+				// 通过给u-row左右两边的负外边距,消除u-col在有gutter时,第一个和最后一个元素的左内边距和右内边距造成的影响
+				if(this.gutter) {
+					style.marginLeft = addUnit(-Number(this.gutter)/2)
+					style.marginRight = addUnit(-Number(this.gutter)/2)
+				}
+				return deepMerge(style, addStyle(this.customStyle))
+			}
+		},
+		emits: ["click"],
+		methods: {
+			clickHandler(e) {
+				this.$emit('click')
+			},
+			async getComponentWidth() {
+				// 延时一定时间,以确保节点渲染完成
+				await sleep()
+				return new Promise(resolve => {
+					// uView封装的获取节点的方法,详见文档
+					// #ifndef APP-NVUE
+					this.$uGetRect('.u-row').then(res => {
+						resolve(res.width)
+					})
+					// #endif
+					// #ifdef APP-NVUE
+					// nvue的dom模块用于获取节点
+					dom.getComponentRect(this.$refs['u-row'], (res) => {
+						resolve(res.size.width)
+					})
+					// #endif
+				})
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+	
+	.u-row {
+		@include flex;
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-safe-bottom/props.js b/uni_modules/uview-plus/components/u-safe-bottom/props.js
new file mode 100644
index 0000000..662c38e
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-safe-bottom/props.js
@@ -0,0 +1,6 @@
+// import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-safe-bottom/u-safe-bottom.vue b/uni_modules/uview-plus/components/u-safe-bottom/u-safe-bottom.vue
new file mode 100644
index 0000000..c7570a7
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-safe-bottom/u-safe-bottom.vue
@@ -0,0 +1,59 @@
+<template>
+	<view
+		class="u-safe-bottom"
+		:style="[style]"
+		:class="[!isNvue && 'u-safe-area-inset-bottom']"
+	>
+	</view>
+</template>
+
+<script>
+	import props from "./props.js";
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addStyle, deepMerge, addUnit, sys } from '../../libs/function/index';
+	/**
+	 * SafeBottom 底部安全区
+	 * @description 这个适配,主要是针对IPhone X等一些底部带指示条的机型,指示条的操作区域与页面底部存在重合,容易导致用户误操作,因此我们需要针对这些机型进行底部安全区适配。
+	 * @tutorial https://ijry.github.io/uview-plus/components/safeAreaInset.html
+	 * @property {type}		prop_name
+	 * @property {Object}	customStyle	定义需要用到的外部样式
+	 *
+	 * @event {Function()}
+	 * @example <u-status-bar></u-status-bar>
+	 */
+	export default {
+		name: "u-safe-bottom",
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				safeAreaBottomHeight: 0,
+				isNvue: false,
+			};
+		},
+		computed: {
+			style() {
+				const style = {};
+				// #ifdef APP-NVUE || MP-TOUTIAO
+				// nvue下,高度使用js计算填充
+				style.height = addUnit(sys().safeAreaInsets.bottom, 'px');
+				// #endif
+				return deepMerge(style, addStyle(this.customStyle));
+			},
+		},
+		mounted() {
+			// #ifdef APP-NVUE
+			// 标识为是否nvue
+			this.isNvue = true;
+			// #endif
+		},
+	};
+</script>
+
+<style lang="scss" scoped>
+	.u-safe-bottom {
+		/* #ifndef APP-NVUE */
+		width: 100%;
+		/* #endif */
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-scroll-list/nvue.js b/uni_modules/uview-plus/components/u-scroll-list/nvue.js
new file mode 100644
index 0000000..f801480
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-scroll-list/nvue.js
@@ -0,0 +1,28 @@
+// 引入bindingx,此库类似于微信小程序wxs,目的是让js运行在视图层,减少视图层和逻辑层的通信折损
+const BindingX = uni.requireNativePlugin('bindingx')
+import { os } from '../../libs/function/index';
+export default {
+    methods: {
+        // 此处不写注释,请自行体会
+        nvueScrollHandler(e) {
+            const anchor = this.$refs['u-scroll-list__scroll-view'].ref
+            const element = this.$refs['u-scroll-list__indicator__line__bar'].ref
+            const scrollLeft = e.contentOffset.x
+            const contentSize = e.contentSize.width
+            const { scrollWidth } = this
+            const barAllMoveWidth = this.indicatorWidth - this.indicatorBarWidth
+            // 在安卓和iOS上,需要除的倍数不一样,iOS需要除以2
+            const actionNum = os() === 'ios' ? 2 : 1
+            const expression = `(x / ${actionNum}) / ${contentSize - scrollWidth} * ${barAllMoveWidth}`
+            BindingX.bind({
+                anchor,
+                eventType: 'scroll',
+                props: [{
+                    element,
+                    property: 'transform.translateX',
+                    expression
+                }]
+            })
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-scroll-list/other.js b/uni_modules/uview-plus/components/u-scroll-list/other.js
new file mode 100644
index 0000000..e69de29
diff --git a/uni_modules/uview-plus/components/u-scroll-list/props.js b/uni_modules/uview-plus/components/u-scroll-list/props.js
new file mode 100644
index 0000000..741da17
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-scroll-list/props.js
@@ -0,0 +1,35 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 指示器的整体宽度
+        indicatorWidth: {
+            type: [String, Number],
+            default: () => defProps.scrollList.indicatorWidth
+        },
+        // 滑块的宽度
+        indicatorBarWidth: {
+            type: [String, Number],
+            default: () => defProps.scrollList.indicatorBarWidth
+        },
+        // 是否显示面板指示器
+        indicator: {
+            type: Boolean,
+            default: () => defProps.scrollList.indicator
+        },
+        // 指示器非激活颜色
+        indicatorColor: {
+            type: String,
+            default: () => defProps.scrollList.indicatorColor
+        },
+        // 指示器的激活颜色
+        indicatorActiveColor: {
+            type: String,
+            default: () => defProps.scrollList.indicatorActiveColor
+        },
+        // 指示器样式,可通过bottom,left,right进行定位
+        indicatorStyle: {
+            type: [String, Object],
+            default: () => defProps.scrollList.indicatorStyle
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-scroll-list/scrollWxs.wxs b/uni_modules/uview-plus/components/u-scroll-list/scrollWxs.wxs
new file mode 100644
index 0000000..ce94f1d
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-scroll-list/scrollWxs.wxs
@@ -0,0 +1,50 @@
+function scroll(event, ownerInstance) {
+	// detail中含有scroll-view的信息,比如scroll-view的实际宽度,当前时间点scroll-view的移动距离等
+	var detail = event.detail
+	var scrollWidth = detail.scrollWidth
+	var scrollLeft = detail.scrollLeft
+	// 获取当前组件的dataset,说白了就是祸国殃民的腾xun搞出来的垃ji
+	var dataset = event.currentTarget.dataset
+	// 此为scroll-view外部包裹元素的宽度
+	// 某些HX版本(3.1.18),发现view元素中大写的data-scrollWidth,在wxs中,变成了全部小写,所以这里需要特别处理
+	var scrollComponentWidth = dataset.scrollWidth || dataset.scrollwidth || 0
+	// 指示器和滑块的宽度
+	var indicatorWidth = dataset.indicatorWidth || dataset.indicatorwidth || 0
+	var barWidth = dataset.barWidth || dataset.barwidth || 0
+	// 此处的计算理由为:scroll-view的滚动距离与目标滚动距离(scroll-view的实际宽度减去包裹元素的宽度)之比,等于滑块当前移动距离与总需
+	// 滑动距离(指示器的总宽度减去滑块宽度)的比值
+	var x = scrollLeft / (scrollWidth - scrollComponentWidth) * (indicatorWidth - barWidth)
+	setBarStyle(ownerInstance, x)
+}
+
+// 由于webview的无能,无法保证scroll-view在滑动过程中,一直触发scroll事件,会导致
+// 无法监听到某些滚动值,当在首尾临界值无法监听到时,这是致命的,因为错失这些值会导致滑块无法回到起点和终点
+// 所以这里需要对临界值做监听并处理
+function scrolltolower(event, ownerInstance) {
+	ownerInstance.callMethod('scrollEvent', 'right')
+	// 获取当前组件的dataset
+	var dataset = event.currentTarget.dataset
+	// 指示器和滑块的宽度
+	var indicatorWidth = dataset.indicatorWidth || dataset.indicatorwidth || 0
+	var barWidth = dataset.barWidth || dataset.barwidth || 0
+	// scroll-view滚动到右边终点时,将滑块也设置为到右边的终点,它所需移动的距离为:指示器宽度 - 滑块宽度
+	setBarStyle(ownerInstance, indicatorWidth - barWidth)
+}
+
+function scrolltoupper(event, ownerInstance) {
+	ownerInstance.callMethod('scrollEvent', 'left')
+	// 滚动到左边时,将滑块设置为0的偏移距离,回到起点
+	setBarStyle(ownerInstance, 0)
+}
+
+function setBarStyle(ownerInstance, x) {
+	ownerInstance.selectComponent('.u-scroll-list__indicator__line__bar') && ownerInstance.selectComponent('.u-scroll-list__indicator__line__bar').setStyle({
+		transform: 'translateX(' + x + 'px)'
+	})
+}
+
+module.exports = {
+	scroll: scroll,
+	scrolltolower: scrolltolower,
+	scrolltoupper: scrolltoupper
+}
diff --git a/uni_modules/uview-plus/components/u-scroll-list/u-scroll-list.vue b/uni_modules/uview-plus/components/u-scroll-list/u-scroll-list.vue
new file mode 100644
index 0000000..a6bac76
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-scroll-list/u-scroll-list.vue
@@ -0,0 +1,232 @@
+<template>
+	<view
+		class="u-scroll-list"
+		ref="u-scroll-list"
+	>
+		<!-- #ifdef APP-NVUE -->
+		<!-- nvue使用bindingX实现,以得到更好的性能 -->
+		<scroller
+			class="u-scroll-list__scroll-view"
+			ref="u-scroll-list__scroll-view"
+			scroll-direction="horizontal"
+			:show-scrollbar="false"
+			:offset-accuracy="1"
+			@scroll="nvueScrollHandler"
+		>
+			<view class="u-scroll-list__scroll-view__content">
+				<slot />
+			</view>
+		</scroller>
+		<!-- #endif -->
+		<!-- #ifndef APP-NVUE -->
+		<!-- #ifdef MP-WEIXIN || APP-VUE || H5 || MP-QQ -->
+		<!-- 以上平台,支持wxs -->
+		<scroll-view
+			class="u-scroll-list__scroll-view"
+			scroll-x
+			@scroll="wxs.scroll"
+			@scrolltoupper="wxs.scrolltoupper"
+			@scrolltolower="wxs.scrolltolower"
+			:data-scrollWidth="scrollWidth"
+			:data-barWidth="getPx(indicatorBarWidth)"
+			:data-indicatorWidth="getPx(indicatorWidth)"
+			:show-scrollbar="false"
+			:upper-threshold="0"
+			:lower-threshold="0"
+		>
+			<!-- #endif -->
+			<!-- #ifndef APP-NVUE || MP-WEIXIN || H5 || APP-VUE || MP-QQ -->
+			<!-- 非以上平台,只能使用普通js实现 -->
+			<scroll-view
+				class="u-scroll-list__scroll-view"
+				scroll-x
+				@scroll="scrollHandler"
+				@scrolltoupper="scrolltoupperHandler"
+				@scrolltolower="scrolltolowerHandler"
+				:show-scrollbar="false"
+				:upper-threshold="0"
+				:lower-threshold="0"
+			>
+				<!-- #endif -->
+				<view class="u-scroll-list__scroll-view__content">
+					<slot />
+				</view>
+			</scroll-view>
+			<!-- #endif -->
+			<view
+				class="u-scroll-list__indicator"
+				v-if="indicator"
+				:style="[addStyle(indicatorStyle)]"
+			>
+				<view
+					class="u-scroll-list__indicator__line"
+					:style="[lineStyle]"
+				>
+					<view
+						class="u-scroll-list__indicator__line__bar"
+						:style="[barStyle]"
+						ref="u-scroll-list__indicator__line__bar"
+					></view>
+				</view>
+			</view>
+	</view>
+</template>
+
+<script
+	src="./scrollWxs.wxs"
+	module="wxs"
+	lang="wxs"
+></script>
+
+<script>
+/**
+ * scrollList 横向滚动列表
+ * @description 该组件一般用于同时展示多个商品、分类的场景,也可以完成左右滑动的列表。
+ * @tutorial https://ijry.github.io/uview-plus/components/scrollList.html
+ * @property {String | Number}	indicatorWidth			指示器的整体宽度 (默认 50 )
+ * @property {String | Number}	indicatorBarWidth		滑块的宽度 (默认 20 )
+ * @property {Boolean}			indicator				是否显示面板指示器 (默认 true )
+ * @property {String}			indicatorColor			指示器非激活颜色 (默认 '#f2f2f2' )
+ * @property {String}			indicatorActiveColor	指示器的激活颜色 (默认 '#3c9cff' )
+ * @property {String | Object}	indicatorStyle			指示器样式,可通过bottom,left,right进行定位
+ * @event {Function} left	滑动到左边时触发
+ * @event {Function} right	滑动到右边时触发
+ * @example
+ */
+// #ifdef APP-NVUE
+const dom = uni.requireNativePlugin('dom')
+import nvueMixin from "./nvue.js"
+// #endif
+import props from './props';
+import mpMixin from '../../libs/mixin/mpMixin';
+import mixin from '../../libs/mixin/mixin';
+import { addStyle, addUnit, getPx, sleep } from '../../libs/function/index';
+export default {
+	name: 'u-scroll-list',
+	// #ifndef APP-NVUE
+	mixins: [mpMixin, mixin, props],
+	// #endif
+	// #ifdef APP-NVUE
+	mixins: [mpMixin, mixin, nvueMixin, props],
+	// #endif
+	data() {
+		return {
+			scrollInfo: {
+				scrollLeft: 0,
+				scrollWidth: 0
+			},
+			scrollWidth: 0
+		}
+	},
+	computed: {
+		// 指示器为线型的样式
+		barStyle() {
+			const style = {}
+			// #ifndef APP-NVUE || MP-WEIXIN || H5 || APP-VUE || MP-QQ
+			// 此为普通js方案,只有在非nvue和不支持wxs方案的端才使用、
+			// 此处的计算理由为:scroll-view的滚动距离与目标滚动距离(scroll-view的实际宽度减去包裹元素的宽度)之比,等于滑块当前移动距离与总需
+			// 滑动距离(指示器的总宽度减去滑块宽度)的比值
+			const scrollLeft = this.scrollInfo.scrollLeft,
+				scrollWidth = this.scrollInfo.scrollWidth,
+				barAllMoveWidth = this.indicatorWidth - this.indicatorBarWidth
+			const x = scrollLeft / (scrollWidth - this.scrollWidth) * barAllMoveWidth
+			style.transform = `translateX(${ x }px)`
+			// #endif
+			// 设置滑块的宽度和背景色,是每个平台都需要的
+			style.width = addUnit(this.indicatorBarWidth)
+			style.backgroundColor = this.indicatorActiveColor
+			return style
+		},
+		lineStyle() {
+			const style = {}
+			// 指示器整体的样式,需要设置其宽度和背景色
+			style.width = addUnit(this.indicatorWidth)
+			style.backgroundColor = this.indicatorColor
+			return style
+		}
+	},
+	mounted() {
+		this.init()
+	},
+	emits: ["left", "right"],
+	methods: {
+		addStyle,
+		getPx,
+		init() {
+			this.getComponentWidth()
+		},
+		// #ifndef APP-NVUE || MP-WEIXIN || H5 || APP-VUE || MP-QQ
+		// scroll-view触发滚动事件
+		scrollHandler(e) {
+			this.scrollInfo = e.detail
+		},
+		scrolltoupperHandler() {
+			this.scrollEvent('left')
+			this.scrollInfo.scrollLeft = 0
+		},
+		scrolltolowerHandler() {
+			this.scrollEvent('right')
+			// 在普通js方案中,滚动到右边时,通过设置this.scrollInfo,模拟出滚动到右边的情况
+			// 因为上方是用过computed计算的,设置后,会自动调整滑块的位置
+			this.scrollInfo.scrollLeft = getPx(this.indicatorWidth) - getPx(this.indicatorBarWidth)
+		},
+		// #endif
+		//
+		scrollEvent(status) {
+			this.$emit(status)
+		},
+		// 获取组件的宽度
+		async getComponentWidth() {
+			// 延时一定时间,以获取dom尺寸
+			await sleep(30)
+			// #ifndef APP-NVUE
+			this.$uGetRect('.u-scroll-list').then(size => {
+				this.scrollWidth = size.width
+			})
+			// #endif
+
+			// #ifdef APP-NVUE
+			const ref = this.$refs['u-scroll-list']
+			ref && dom.getComponentRect(ref, (res) => {
+				this.scrollWidth = res.size.width
+			})
+			// #endif
+		},
+	}
+}
+</script>
+
+<style lang="scss" scoped>
+@import "../../libs/css/components.scss";
+
+.u-scroll-list {
+	padding-bottom: 10px;
+
+	&__scroll-view {
+		@include flex;
+
+		&__content {
+			@include flex;
+		}
+	}
+
+	&__indicator {
+		@include flex;
+		justify-content: center;
+		margin-top: 15px;
+
+		&__line {
+			width: 60px;
+			height: 4px;
+			border-radius: 100px;
+			overflow: hidden;
+
+			&__bar {
+				width: 20px;
+				height: 4px;
+				border-radius: 100px;
+			}
+		}
+	}
+}
+</style>
diff --git a/uni_modules/uview-plus/components/u-search/props.js b/uni_modules/uview-plus/components/u-search/props.js
new file mode 100644
index 0000000..7aaa3ba
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-search/props.js
@@ -0,0 +1,123 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 搜索框形状,round-圆形,square-方形
+        shape: {
+            type: String,
+            default: () => defProps.search.shape
+        },
+        // 搜索框背景色,默认值#f2f2f2
+        bgColor: {
+            type: String,
+            default: () => defProps.search.bgColor
+        },
+        // 占位提示文字
+        placeholder: {
+            type: String,
+            default: () => defProps.search.placeholder
+        },
+        // 是否启用清除控件
+        clearabled: {
+            type: Boolean,
+            default: () => defProps.search.clearabled
+        },
+        // 是否自动聚焦
+        focus: {
+            type: Boolean,
+            default: () => defProps.search.focus
+        },
+        // 是否在搜索框右侧显示取消按钮
+        showAction: {
+            type: Boolean,
+            default: () => defProps.search.showAction
+        },
+        // 右边控件的样式
+        actionStyle: {
+            type: Object,
+            default: () => defProps.search.actionStyle
+        },
+        // 取消按钮文字
+        actionText: {
+            type: String,
+            default: () => defProps.search.actionText
+        },
+        // 输入框内容对齐方式,可选值为 left|center|right
+        inputAlign: {
+            type: String,
+            default: () => defProps.search.inputAlign
+        },
+        // input输入框的样式,可以定义文字颜色,大小等,对象形式
+        inputStyle: {
+            type: Object,
+            default: () => defProps.search.inputStyle
+        },
+        // 是否启用输入框
+        disabled: {
+            type: Boolean,
+            default: () => defProps.search.disabled
+        },
+        // 边框颜色
+        borderColor: {
+            type: String,
+            default: () => defProps.search.borderColor
+        },
+        // 搜索图标的颜色,默认同输入框字体颜色
+        searchIconColor: {
+            type: String,
+            default: () => defProps.search.searchIconColor
+        },
+        // 输入框字体颜色
+        color: {
+            type: String,
+            default: () => defProps.search.color
+        },
+        // placeholder的颜色
+        placeholderColor: {
+            type: String,
+            default: () => defProps.search.placeholderColor
+        },
+        // 左边输入框的图标,可以为uView图标名称或图片路径
+        searchIcon: {
+            type: String,
+            default: () => defProps.search.searchIcon
+        },
+        searchIconSize: {
+            type: [Number, String],
+            default: () => defProps.search.searchIconSize
+        },
+        // 组件与其他上下左右元素之间的距离,带单位的字符串形式,如"30px"、"30px 20px"等写法
+        margin: {
+            type: String,
+            default: () => defProps.search.margin
+        },
+        // 开启showAction时,是否在input获取焦点时才显示
+        animation: {
+            type: Boolean,
+            default: () => defProps.search.animation
+        },
+        // 输入框的初始化内容
+        modelValue: {
+            type: String,
+            default: () => defProps.search.value
+        },
+		value: {
+		    type: String,
+		    default: () => defProps.search.value
+		},
+        // 输入框最大能输入的长度,-1为不限制长度(来自uniapp文档)
+        maxlength: {
+            type: [String, Number],
+            default: () => defProps.search.maxlength
+        },
+        // 搜索框高度,单位px
+        height: {
+            type: [String, Number],
+            default: () => defProps.search.height
+        },
+        // 搜索框左侧文本
+        label: {
+            type: [String, Number, null],
+            default: () => defProps.search.label
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-search/u-search.vue b/uni_modules/uview-plus/components/u-search/u-search.vue
new file mode 100644
index 0000000..4c54b9a
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-search/u-search.vue
@@ -0,0 +1,327 @@
+<template>
+	<view
+	    class="u-search"
+	    @tap="clickHandler"
+	    :style="[{
+			margin: margin,
+		}, addStyle(customStyle)]"
+	>
+		<view
+		    class="u-search__content"
+		    :style="{
+				backgroundColor: bgColor,
+				borderRadius: shape == 'round' ? '100px' : '4px',
+				borderColor: borderColor,
+			}"
+		>
+			<template v-if="$slots.label || label !== null">
+				<slot name="label">
+					<text class="u-search__content__label">{{ label }}</text>
+				</slot>
+			</template>
+			<view class="u-search__content__icon">
+				<u-icon
+					@tap="clickIcon"
+				    :size="searchIconSize"
+				    :name="searchIcon"
+				    :color="searchIconColor ? searchIconColor : color"
+				></u-icon>
+			</view>
+			<input
+			    confirm-type="search"
+			    @blur="blur"
+			    :value="keyword"
+			    @confirm="search"
+			    @input="inputChange"
+			    :disabled="disabled"
+			    @focus="getFocus"
+			    :focus="focus"
+			    :maxlength="maxlength"
+			    placeholder-class="u-search__content__input--placeholder"
+			    :placeholder="placeholder"
+			    :placeholder-style="`color: ${placeholderColor}`"
+			    class="u-search__content__input"
+			    type="text"
+			    :style="[{
+					textAlign: inputAlign,
+					color: color,
+					backgroundColor: bgColor,
+					height: addUnit(height)
+				}, inputStyle]"
+			/>
+			<view
+			    class="u-search__content__icon u-search__content__close"
+			    v-if="keyword && clearabled && focused"
+			    @tap="clear"
+			>
+				<u-icon
+				    name="close"
+				    size="11"
+				    color="#ffffff"
+					customStyle="line-height: 12px"
+				></u-icon>
+			</view>
+		</view>
+		<text
+		    :style="[actionStyle]"
+		    class="u-search__action"
+		    :class="[(showActionBtn || show) && 'u-search__action--active']"
+		    @tap.stop.prevent="custom"
+		>{{ actionText }}</text>
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addUnit, addStyle } from '../../libs/function/index';
+	/**
+	 * search 搜索框
+	 * @description 搜索组件,集成了常见搜索框所需功能,用户可以一键引入,开箱即用。
+	 * @tutorial https://ijry.github.io/uview-plus/components/search.html
+	 * @property {String}			shape				搜索框形状,round-圆形,square-方形(默认 'round' )
+	 * @property {String}			bgColor				搜索框背景颜色(默认 '#f2f2f2' )
+	 * @property {String}			placeholder			占位文字内容(默认 '请输入关键字' )
+	 * @property {Boolean}			clearabled			是否启用清除控件(默认 true )
+	 * @property {Boolean}			focus				是否自动获得焦点(默认 false )
+	 * @property {Boolean}			showAction			是否显示右侧控件(默认 true )
+	 * @property {Object}			actionStyle			右侧控件的样式,对象形式
+	 * @property {String}			actionText			右侧控件文字(默认 '搜索' )
+	 * @property {String}			inputAlign			输入框内容水平对齐方式 (默认 'left' )
+	 * @property {Object}			inputStyle			自定义输入框样式,对象形式
+	 * @property {Boolean}			disabled			是否启用输入框(默认 false )
+	 * @property {String}			borderColor			边框颜色,配置了颜色,才会有边框 (默认 'transparent' )
+	 * @property {String}			searchIconColor		搜索图标的颜色,默认同输入框字体颜色 (默认 '#909399' )
+	 * @property {Number | String}	searchIconSize 搜索图标的字体,默认22
+	 * @property {String}			color				输入框字体颜色(默认 '#606266' )
+	 * @property {String}			placeholderColor	placeholder的颜色(默认 '#909399' )
+	 * @property {String}			searchIcon			输入框左边的图标,可以为uView图标名称或图片路径  (默认 'search' )
+	 * @property {String}			margin				组件与其他上下左右元素之间的距离,带单位的字符串形式,如"30px"   (默认 '0' )
+	 * @property {Boolean} 			animation			是否开启动画,见上方说明(默认 false )
+	 * @property {String}			value				输入框初始值
+	 * @property {String | Number}	maxlength			输入框最大能输入的长度,-1为不限制长度  (默认 '-1' )
+	 * @property {String | Number}	height				输入框高度,单位px(默认 64 )
+	 * @property {String | Number}	label				搜索框左边显示内容
+	 * @property {Object}			customStyle			定义需要用到的外部样式
+	 *
+	 * @event {Function} change 输入框内容发生变化时触发
+	 * @event {Function} search 用户确定搜索时触发,用户按回车键,或者手机键盘右下角的"搜索"键时触发
+	 * @event {Function} custom 用户点击右侧控件时触发
+	 * @event {Function} clear 用户点击清除按钮时触发
+	 * @example <u-search placeholder="日照香炉生紫烟" v-model="keyword"></u-search>
+	 */
+	export default {
+		name: "u-search",
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				keyword: '',
+				showClear: false, // 是否显示右边的清除图标
+				show: false,
+				// 标记input当前状态是否处于聚焦中,如果是,才会显示右侧的清除控件
+				focused: this.focus
+				// 绑定输入框的值
+				// inputValue: this.value
+			};
+		},
+		watch: {
+			keyword(nVal) {
+				// 双向绑定值,让v-model绑定的值双向变化
+				// #ifdef VUE3
+				this.$emit("update:modelValue", nVal);
+				// #endif
+				// #ifdef VUE2
+				this.$emit('input', nVal);
+				// #endif
+				// 触发change事件,事件效果和v-model双向绑定的效果一样,让用户多一个选择
+				this.$emit('change', nVal);
+			},
+			// #ifdef VUE3
+			modelValue: {
+				immediate: true,
+				handler(nVal) {
+					this.keyword = nVal;
+				}
+			},
+			// #endif
+			// #ifdef VUE2
+			value: {
+				immediate: true,
+				handler(nVal) {
+					this.keyword = nVal;
+				}
+			},
+			// #endif
+		},
+		computed: {
+			showActionBtn() {
+				return !this.animation && this.showAction
+			}
+		},
+		emits: ['clear', 'search', 'custom', 'focus', 'blur', 'click', 'clickIcon', 'update:modelValue', 'change'],
+		methods: {
+			addStyle,
+			addUnit,
+			// 目前HX2.6.9 v-model双向绑定无效,故监听input事件获取输入框内容的变化
+			inputChange(e) {
+				this.keyword = e.detail.value;
+			},
+			// 清空输入
+			// 也可以作为用户通过this.$refs形式调用清空输入框内容
+			clear() {
+				this.keyword = '';
+				// 延后发出事件,避免在父组件监听clear事件时,value为更新前的值(不为空)
+				this.$nextTick(() => {
+					this.$emit('clear');
+				})
+			},
+			// 确定搜索
+			search(e) {
+				this.$emit('search', e.detail.value);
+				try {
+					// 收起键盘
+					uni.hideKeyboard();
+				} catch (e) {}
+			},
+			// 点击右边自定义按钮的事件
+			custom() {
+				this.$emit('custom', this.keyword);
+				try {
+					// 收起键盘
+					uni.hideKeyboard();
+				} catch (e) {}
+			},
+			// 获取焦点
+			getFocus() {
+				this.focused = true;
+				// 开启右侧搜索按钮展开的动画效果
+				if (this.animation && this.showAction) this.show = true;
+				this.$emit('focus', this.keyword);
+			},
+			// 失去焦点
+			blur() {
+				// 最开始使用的是监听图标@touchstart事件,自从hx2.8.4后,此方法在微信小程序出错
+				// 这里改为监听点击事件,手点击清除图标时,同时也发生了@blur事件,导致图标消失而无法点击,这里做一个延时
+				setTimeout(() => {
+					this.focused = false;
+				}, 100)
+				this.show = false;
+				this.$emit('blur', this.keyword);
+			},
+			// 点击搜索框,只有disabled=true时才发出事件,因为禁止了输入,意味着是想跳转真正的搜索页
+			clickHandler() {
+				if (this.disabled) this.$emit('click');
+			},
+			// 点击左边图标
+			clickIcon(e) {
+				this.$emit('clickIcon', this.keyword);
+				try {
+					// 收起键盘
+					uni.hideKeyboard();
+				} catch (e) {}
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+@import "../../libs/css/components.scss";
+$u-search-content-padding: 0 10px !default;
+$u-search-label-color: $u-main-color !default;
+$u-search-label-font-size: 14px !default;
+$u-search-label-margin: 0 4px !default;
+$u-search-close-size: 20px !default;
+$u-search-close-radius: 100px !default;
+$u-search-close-bgColor: #C6C7CB !default;
+$u-search-close-transform: scale(0.82) !default;
+$u-search-input-font-size: 14px !default;
+$u-search-input-margin: 0 5px !default;
+$u-search-input-color: $u-main-color !default;
+$u-search-input-placeholder-color: $u-tips-color !default;
+$u-search-action-font-size: 14px !default;
+$u-search-action-color: $u-main-color !default;
+$u-search-action-width: 0 !default;
+$u-search-action-active-width: 40px !default;
+$u-search-action-margin-left: 5px !default;
+
+/* #ifdef H5 */
+// iOS15在H5下,hx的某些版本,input type=search时,会多了一个搜索图标,进行移除
+[type="search"]::-webkit-search-decoration {
+    display: none;
+}
+/* #endif */
+
+.u-search {
+	@include flex(row);
+	align-items: center;
+	flex: 1;
+
+	&__content {
+		@include flex;
+		align-items: center;
+		padding: $u-search-content-padding;
+		flex: 1;
+		justify-content: space-between;
+		border-width: 1px;
+		border-color: transparent;
+		border-style: solid;
+		overflow: hidden;
+
+		&__icon {
+			@include flex;
+			align-items: center;
+		}
+
+		&__label {
+			color: $u-search-label-color;
+			font-size: $u-search-label-font-size;
+			margin: $u-search-label-margin;
+		}
+
+		&__close {
+			width: $u-search-close-size;
+			height: $u-search-close-size;
+			border-top-left-radius: $u-search-close-radius;
+			border-top-right-radius: $u-search-close-radius;
+			border-bottom-left-radius: $u-search-close-radius;
+			border-bottom-right-radius: $u-search-close-radius;
+			background-color: $u-search-close-bgColor;
+			@include flex(row);
+			align-items: center;
+			justify-content: center;
+			transform: $u-search-close-transform;
+		}
+
+		&__input {
+			flex: 1;
+			font-size: $u-search-input-font-size;
+			line-height: 1;
+			margin: $u-search-input-margin;
+			color: $u-search-input-color;
+
+			&--placeholder {
+				color: $u-search-input-placeholder-color;
+			}
+		}
+	}
+
+	&__action {
+		font-size: $u-search-action-font-size;
+		color: $u-search-action-color;
+		width: $u-search-action-width;
+		overflow: hidden;
+		transition-property: width;
+		transition-duration: 0.3s;
+		/* #ifndef APP-NVUE */
+		white-space: nowrap;
+		/* #endif */
+		text-align: center;
+
+		&--active {
+			width: $u-search-action-active-width;
+			margin-left: $u-search-action-margin-left;
+		}
+	}
+}
+</style>
diff --git a/uni_modules/uview-plus/components/u-skeleton/props.js b/uni_modules/uview-plus/components/u-skeleton/props.js
new file mode 100644
index 0000000..71cac50
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-skeleton/props.js
@@ -0,0 +1,60 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 是否展示骨架组件
+        loading: {
+            type: Boolean,
+            default: () => defProps.skeleton.loading
+        },
+        // 是否开启动画效果
+        animate: {
+            type: Boolean,
+            default: () => defProps.skeleton.animate
+        },
+        // 段落占位图行数
+        rows: {
+            type: [String, Number],
+            default: () => defProps.skeleton.rows
+        },
+        // 段落占位图的宽度
+        rowsWidth: {
+            type: [String, Number, Array],
+            default: () => defProps.skeleton.rowsWidth
+        },
+        // 段落占位图的高度
+        rowsHeight: {
+            type: [String, Number, Array],
+            default: () => defProps.skeleton.rowsHeight
+        },
+        // 是否展示标题占位图
+        title: {
+            type: Boolean,
+            default: () => defProps.skeleton.title
+        },
+        // 段落标题的宽度
+        titleWidth: {
+            type: [String, Number],
+            default: () => defProps.skeleton.titleWidth
+        },
+        // 段落标题的高度
+        titleHeight: {
+            type: [String, Number],
+            default: () => defProps.skeleton.titleHeight
+        },
+        // 是否展示头像占位图
+        avatar: {
+            type: Boolean,
+            default: () => defProps.skeleton.avatar
+        },
+        // 头像占位图大小
+        avatarSize: {
+            type: [String, Number],
+            default: () => defProps.skeleton.avatarSize
+        },
+        // 头像占位图的形状,circle-圆形,square-方形
+        avatarShape: {
+            type: String,
+            default: () => defProps.skeleton.avatarShape
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-skeleton/u-skeleton.vue b/uni_modules/uview-plus/components/u-skeleton/u-skeleton.vue
new file mode 100644
index 0000000..01d397c
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-skeleton/u-skeleton.vue
@@ -0,0 +1,249 @@
+<template>
+	<view class="u-skeleton">
+		<view
+		    class="u-skeleton__wrapper"
+		    ref="u-skeleton__wrapper"
+		    v-if="loading"
+			style="display: flex; flex-direction: row;"
+		>
+			<view
+			    class="u-skeleton__wrapper__avatar"
+			    v-if="avatar"
+			    :class="[`u-skeleton__wrapper__avatar--${avatarShape}`, animate && 'animate']"
+			    :style="{
+						height: addUnit(avatarSize),
+						width: addUnit(avatarSize)
+					}"
+			></view>
+			<view
+			    class="u-skeleton__wrapper__content"
+			    ref="u-skeleton__wrapper__content"
+				style="flex: 1;"
+			>
+				<view
+				    class="u-skeleton__wrapper__content__title"
+				    v-if="title"
+				    :style="{
+							width: uTitleWidth,
+							height: addUnit(titleHeight),
+						}"
+				    :class="[animate && 'animate']"
+				></view>
+				<view
+				    class="u-skeleton__wrapper__content__rows"
+				    :class="[animate && 'animate']"
+				    v-for="(item, index) in rowsArray"
+				    :key="index"
+				    :style="{
+							 width: item.width,
+							 height: item.height,
+							 marginTop: item.marginTop
+						}"
+				>
+		
+				</view>
+			</view>
+		</view>
+		<slot v-else />
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addUnit, sleep, error } from '../../libs/function/index';
+	import test from '../../libs/function/test';
+	// #ifdef APP-NVUE
+	// 由于weex为阿里的KPI业绩考核的产物,所以不支持百分比单位,这里需要通过dom查询组件的宽度
+	const dom = uni.requireNativePlugin('dom')
+	const animation = uni.requireNativePlugin('animation')
+	// #endif
+	/**
+	 * Skeleton 骨架屏
+	 * @description 骨架屏一般用于页面在请求远程数据尚未完成时,页面用灰色块预显示本来的页面结构,给用户更好的体验。
+	 * @tutorial https://ijry.github.io/uview-plus/components/skeleton.html
+	 * @property {Boolean}					loading		是否显示骨架占位图,设置为false将会展示子组件内容 (默认 true )
+	 * @property {Boolean}					animate		是否开启动画效果 (默认 true )
+	 * @property {String | Number}			rows		段落占位图行数 (默认 0 )
+	 * @property {String | Number | Array}	rowsWidth	段落占位图的宽度,可以为百分比,数值,带单位字符串等,可通过数组传入指定每个段落行的宽度 (默认 '100%' )
+	 * @property {String | Number | Array}	rowsHeight	段落的高度 (默认 18 )
+	 * @property {Boolean}					title		是否展示标题占位图 (默认 true )
+	 * @property {String | Number}			titleWidth	标题的宽度 (默认 '50%' )
+	 * @property {String | Number}			titleHeight	标题的高度 (默认 18 )
+	 * @property {Boolean}					avatar		是否展示头像占位图 (默认 false )
+	 * @property {String | Number}			avatarSize	头像占位图大小 (默认 32 )
+	 * @property {String}					avatarShape	头像占位图的形状,circle-圆形,square-方形 (默认 'circle' )
+	 * @example <u-search placeholder="日照香炉生紫烟" v-model="keyword"></u-search>
+	 */
+	export default {
+		name: 'u-skeleton',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				width: 0,
+			}
+		},
+		watch: {
+			loading() {
+				this.getComponentWidth()
+			}
+		},
+		computed: {
+			rowsArray() {
+				if (/%$/.test(this.rowsHeight)) {
+					error('rowsHeight参数不支持百分比单位')
+				}
+				const rows = []
+				for (let i = 0; i < this.rows; i++) {
+					let item = {},
+						// 需要预防超出数组边界的情况
+						rowWidth = test.array(this.rowsWidth) ? (this.rowsWidth[i] || (i === this.rows - 1 ? '70%' : '100%')) : i ===
+						this.rows - 1 ? '70%' : this.rowsWidth,
+						rowHeight = test.array(this.rowsHeight) ? (this.rowsHeight[i] || '18px') : this.rowsHeight
+					// 如果有title占位图,第一个段落占位图的外边距需要大一些,如果没有title占位图,第一个段落占位图则无需外边距
+					// 之所以需要这么做,是因为weex的无能,以提升性能为借口不支持css的一些伪类
+					item.marginTop = !this.title && i === 0 ? 0 : this.title && i === 0 ? '20px' : '12px'
+					// 如果设置的为百分比的宽度,转换为px值,因为nvue不支持百分比单位
+					if (/%$/.test(rowWidth)) {
+						// 通过parseInt提取出百分比单位中的数值部分,除以100得到百分比的小数值
+						item.width = addUnit(this.width * parseInt(rowWidth) / 100)
+					} else {
+						item.width = addUnit(rowWidth)
+					}
+					item.height = addUnit(rowHeight)
+					rows.push(item)
+				}
+				// console.log(rows);
+				return rows
+			},
+			uTitleWidth() {
+				let tWidth = 0
+				if (/%$/.test(this.titleWidth)) {
+					// 通过parseInt提取出百分比单位中的数值部分,除以100得到百分比的小数值
+					tWidth = addUnit(this.width * parseInt(this.titleWidth) / 100)
+				} else {
+					tWidth = addUnit(this.titleWidth)
+				}
+				return addUnit(tWidth)
+			},
+			
+		},
+		mounted() {
+			this.init()
+		},
+		methods: {
+			addUnit,
+			init() {
+				this.getComponentWidth()
+				// #ifdef APP-NVUE
+				this.loading && this.animate && this.setNvueAnimation()
+				// #endif
+			},
+			async setNvueAnimation() {
+				// #ifdef APP-NVUE
+				// 为了让opacity:1的状态保持一定时间,这里做一个延时
+				await sleep(500)
+				const skeleton = this.$refs['u-skeleton__wrapper'];
+				skeleton && this.loading && this.animate && animation.transition(skeleton, {
+					styles: {
+						opacity: 0.5
+					},
+					duration: 600,
+				}, () => {
+					// 这里无需判断是否loading和开启动画状态,因为最终的状态必须达到opacity: 1,否则可能
+					// 会停留在opacity: 0.5的状态中
+					animation.transition(skeleton, {
+						styles: {
+							opacity: 1
+						},
+						duration: 600,
+					}, () => {
+						// 只有在loading中时,才执行动画
+						this.loading && this.animate && this.setNvueAnimation()
+					})
+				})
+				// #endif
+			},
+			// 获取组件的宽度
+			async getComponentWidth() {
+				// 延时一定时间,以获取dom尺寸
+				await sleep(20)
+				// #ifndef APP-NVUE
+				this.$uGetRect('.u-skeleton__wrapper__content').then(size => {
+					this.width = size.width
+				})
+				// #endif
+
+				// #ifdef APP-NVUE
+				const ref = this.$refs['u-skeleton__wrapper__content']
+				ref && dom.getComponentRect(ref, (res) => {
+					this.width = res.size.width
+				})
+				// #endif
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	@mixin background {
+		/* #ifdef APP-NVUE */
+		background-color: #F1F2F4;
+		/* #endif */
+		/* #ifndef APP-NVUE */
+		background: linear-gradient(90deg, #F1F2F4 25%, #e6e6e6 37%, #F1F2F4 50%);
+		background-size: 400% 100%;
+		/* #endif */
+	}
+
+	.u-skeleton {
+		flex: 1;
+		
+		&__wrapper {
+			@include flex(row);
+			
+			&__avatar {
+				@include background;
+				margin-right: 15px;
+			
+				&--circle {
+					border-radius: 100px;
+				}
+			
+				&--square {
+					border-radius: 4px;
+				}
+			}
+			
+			&__content {
+				flex: 1;
+			
+				&__rows,
+				&__title {
+					@include background;
+					border-radius: 3px;
+				}
+			}
+		}
+	}
+
+	/* #ifndef APP-NVUE */
+	.animate {
+		animation: skeleton 1.8s ease infinite
+	}
+
+	@keyframes skeleton {
+		0% {
+			background-position: 100% 50%
+		}
+
+		100% {
+			background-position: 0 50%
+		}
+	}
+
+	/* #endif */
+</style>
diff --git a/uni_modules/uview-plus/components/u-slider/mpother.js b/uni_modules/uview-plus/components/u-slider/mpother.js
new file mode 100644
index 0000000..040c848
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-slider/mpother.js
@@ -0,0 +1,113 @@
+/**
+ * 使用普通的js方案实现slider
+ */
+export default {
+    watch: {
+        value(n) {
+            // 只有在非滑动状态时,才可以通过value更新滑块值,这里监听,是为了让用户触发
+            if (this.status === 'end') {
+                this.updateSliderPlacement(n, true)
+            }
+        }
+    },
+    mounted() {
+        this.init()
+    },
+    methods: {
+        init() {
+            this.getSliderRect()
+        },
+        // 获取slider尺寸
+        getSliderRect() {
+            // 获取滑块条的尺寸信息
+            setTimeout(() => {
+                this.$uGetRect('.u-slider').then((rect) => {
+                    this.sliderRect = rect
+                    this.updateSliderPlacement(this.value, true)
+                })
+            }, 10)
+        },
+        // 是否可以操作
+        canNotDo() {
+            return this.disabled
+        },
+        // 获取当前手势点的X轴位移值
+        getTouchX(e) {
+            return e.touches[0].clientX
+        },
+        formatStep(value) {
+            // 移动点占总长度的百分比
+            return Math.round(Math.max(this.min, Math.min(value, this.max)) / this.step) * this.step
+        },
+        // 发出事件
+        emitEvent(event, value) {
+            this.$emit(event, value || this.value)
+        },
+        // 标记当前手势的状态
+        setTouchStatus(status) {
+            this.status = status
+        },
+        onTouchStart(e) {
+            if (this.canNotDo()) {
+                return
+            }
+            // 标示当前的状态为开始触摸滑动
+            this.emitEvent('start')
+            this.setTouchStatus('start')
+        },
+        onTouchMove(e) {
+            if (this.canNotDo()) {
+                return
+            }
+            // 滑块的左边不一定跟屏幕左边接壤,所以需要减去最外层父元素的左边值
+            const x = this.getTouchX(e)
+            const { left, width } = this.sliderRect
+            const distanceX = x - left
+            // 获得移动距离对整个滑块的百分比值,此为带有多位小数的值,不能用此更新视图
+            // 否则造成通信阻塞,需要每改变一个step值时修改一次视图
+            const percent = (distanceX / width) * 100
+            this.setTouchStatus('moving')
+            this.updateSliderPlacement(percent, true, 'moving')
+        },
+        onTouchEnd() {
+            if (this.canNotDo()) {
+                return
+            }
+            this.emitEvent('end')
+            this.setTouchStatus('end')
+        },
+        // 设置滑点的位置
+        updateSliderPlacement(value, drag, event) {
+            // 去掉小数部分,同时也是对step步进的处理
+            const { width } = this.sliderRect
+            const percent = this.formatStep(value)
+            // 设置移动的值
+            const barStyle = {
+                width: `${percent / 100 * width}px`
+            }
+            // 移动期间无需过渡动画
+            if (drag === true) {
+                barStyle.transition = 'none'
+            } else {
+                // 非移动期间,删掉对过渡为空的声明,让css中的声明起效
+                delete barStyle.transition
+            }
+            // 修改value值
+            this.$emit('input', percent)
+            // 事件的名称
+            if (event) {
+                this.emitEvent(event, percent)
+            }
+            this.barStyle = barStyle
+        },
+        onClick(e) {
+            if (this.canNotDo()) {
+                return
+            }
+            // 直接点击滑块的情况,计算方式与onTouchMove方法相同
+            const { left, width } = this.sliderRect
+            const value = ((e.detail.x - left) / width) * 100
+            this.updateSliderPlacement(value, false, 'click')
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-slider/mpwxs.js b/uni_modules/uview-plus/components/u-slider/mpwxs.js
new file mode 100644
index 0000000..8d051fd
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-slider/mpwxs.js
@@ -0,0 +1,43 @@
+import { sleep } from '../../libs/function/index';
+export default {
+    data() {
+        return {
+            sliderRect: {},
+            info: {
+                width: null,
+                left: null,
+                step: this.step,
+                disabled: this.disabled,
+                min: this.min,
+                max: this.max,
+                value: this.value
+            }
+        }
+    },
+    mounted() {
+        this.init()
+    },
+    methods: {
+        init() {
+            this.getSliderRect()
+        },
+        // 获取slider尺寸
+        getSliderRect() {
+            // 获取滑块条的尺寸信息
+            sleep().then(() => {
+                this.$uGetRect('.u-slider').then((rect) => {
+                    this.info.width = rect.width
+                    this.info.left = rect.left
+                })
+            })
+        },
+        // 此方法由wxs调用,用于修改v-model绑定的值
+        updateValue(value) {
+            this.$emit('input', value)
+        },
+        // 此方法由wxs调用,发出事件
+        emitEvent(e) {
+            this.$emit(e.event, e.value ? e.value : this.value)
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-slider/mpwxs.wxs b/uni_modules/uview-plus/components/u-slider/mpwxs.wxs
new file mode 100644
index 0000000..847df4a
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-slider/mpwxs.wxs
@@ -0,0 +1,121 @@
+/**
+ * 使用wxs方案实现slider
+ * 兼容微信,QQ,H5,Vue版的安卓和iOS
+ */
+/**
+ * 开始滑动操作
+ * @param {Object} e
+ * @param {Object} ownerInstance
+ */
+function onTouchMove(e, ownerInstance) {
+	// wxs事件对象下有一个instance属性,表示当前触发此事件的组件的实例,通过该实例,可以获取相关的dataset,设置样式等信息
+	// https://developers.weixin.qq.com/miniprogram/dev/framework/view/interactive-animation.html
+	var instance = e.instance;
+	// getState()为一个对象,挂载在instance上,类似组件的data一样,可以存放一些变量,供以后的触发事件中使用
+	var state = instance.getState()
+
+	// 滑块组件的整体尺寸信息
+	var mp = state.mp
+	if(mp.disabled) {
+		return
+	}
+	
+	var distanceX = getTouchX(e) - mp.left
+	// 获得移动距离对整个滑块的百分比值,此为带有多位小数的值,step大于1时,不能用此更新视图
+	var percent = (distanceX / mp.width) * 100
+
+	updateSliderPlacement(instance, ownerInstance, percent, 'moving')
+	
+	// 阻止页面滚动,可以保证在滑动过程中,不让页面可以上下滚动,造成不好的体验
+	e.stopPropagation && e.stopPropagation() 
+	e.preventDefault && e.preventDefault()
+}
+
+function onClick(e, ownerInstance) {
+	var instance = e.instance
+	var state = instance.getState()
+	var mp = state.mp
+	if(mp.disabled) {
+		return
+	}
+	
+	// 直接点击滑块的情况,计算方式与onTouchMove方法相同
+	var value = ((e.detail.x - mp.left) / mp.width) * 100
+	updateSliderPlacement(instance, ownerInstance, value, 'click')
+}
+
+function sizeReady(newValue, oldValue, ownerInstance, instance) {
+	// 页面初始化时候,也会触发此方法,传递的值为空,这里不执行往后的逻辑
+	if(!newValue || newValue.disabled) {
+		return 
+	}
+	var state = instance.getState()
+	state.mp = newValue
+	updateSliderPlacement(instance, ownerInstance, newValue.value)
+}
+
+// 设置滑点的位置
+function updateSliderPlacement(instance, ownerInstance, value, event) {
+	var state = instance.getState()
+	var mp = state.mp
+	if(mp.disabled) {
+		return
+	}
+
+	var percent = 0
+	if (mp.step > 1) {
+		// 如果step步进大于1,需要跳步,所以需要使用Math.round进行取整
+		percent = Math.round(Math.max(mp.min, Math.min(value, mp.max)) / mp.step) * mp.step
+	} else {
+		// 当step=1时,无需跳步,充分利用wxs性能,滑块实时跟随手势,达到丝滑的效果
+		percent = Math.max(mp.min, Math.min(value, mp.max))
+	}
+	// 返回组件的实例
+	var gapInstance = ownerInstance.selectComponent('.u-slider__gap')
+	// 在移动期间,不允许transition动画,否则会造成卡顿
+	gapInstance[event === 'click' ? 'addClass' : 'removeClass']('u-slider__gap--ani')
+	// 调用逻辑层的方法,修改v-model绑定的值
+	ownerInstance.callMethod('updateValue', Math.round(percent))
+	if(event) {
+		ownerInstance.callMethod('emitEvent', {
+			event: event,
+			value: Math.round(percent)
+		})
+	}
+	
+	// 设置移动的值
+	gapInstance.requestAnimationFrame(function() {
+		gapInstance.setStyle({
+			width: percent / 100 * mp.width + 'px',
+		})
+	})
+}
+
+// 开始滑动
+function onTouchStart(e, ownerInstance) {
+	ownerInstance.callMethod('emitEvent', {
+		event: 'start', 
+		value: null
+	})
+}
+
+// 停止滑动
+function onTouchEnd(e, ownerInstance) {
+	ownerInstance.callMethod('emitEvent', {
+		event: 'end', 
+		value: null
+	})
+}
+
+// 获取当前手势点的X轴位移值
+function getTouchX(e) {
+	return e.touches[0].clientX
+}
+
+module.exports = {
+	onTouchStart: onTouchStart,
+	onTouchMove: onTouchMove,
+	onTouchEnd: onTouchEnd,
+	sizeReady: sizeReady,
+	onClick: onClick
+}
diff --git a/uni_modules/uview-plus/components/u-slider/nvue - 副本.js b/uni_modules/uview-plus/components/u-slider/nvue - 副本.js
new file mode 100644
index 0000000..ccdb24c
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-slider/nvue - 副本.js	
@@ -0,0 +1,180 @@
+/**
+ * 使用bindingx方案实现slider
+ * 只能使用于nvue下
+ */
+// 引入bindingx,此库类似于微信小程序wxs,目的是让js运行在视图层,减少视图层和逻辑层的通信折损
+const BindingX = uni.requireNativePlugin('bindingx')
+// nvue操作dom的库,用于获取dom的尺寸信息
+const dom = uni.requireNativePlugin('dom')
+// nvue中用于操作元素动画的库,类似于uni.animation,只不过uni.animation不能用于nvue
+const animation = uni.requireNativePlugin('animation')
+import { range } from '../../libs/function/index';
+export default {
+	data() {
+		return {
+			// bindingx的回调值,用于取消绑定
+			panEvent: null,
+			// 标记是否移动状态
+			moving: false,
+			// 位移的偏移量
+			x: 0,
+			// 是否正在触摸过程中,用于标记动画类是否添加或移除
+			touching: false,
+			changeFromInside: false
+		}
+	},
+	watch: {
+		// 监听vlaue的变化,此变化可能是由于内部修改v-model的值,或者外部
+		// 从服务端获取一个值后,赋值给slider的v-model而导致的
+		value(n) {
+			if (!this.changeFromInside) {
+				this.initX()
+			} else {
+				this.changeFromInside = false
+			}
+		}
+	},
+	mounted() {
+		this.init()
+	},
+	methods: {
+		init() {
+			this.getSliderRect()
+		},
+		// 获取节点信息
+		// 获取slider尺寸
+		getSliderRect() {
+			// 获取滑块条的尺寸信息
+			// 通过nvue的dom模块,查询节点信息
+			setTimeout(() => {
+				dom.getComponentRect(this.$refs['slider'], res => {
+					this.sliderRect = res.size
+					this.initX()
+				})
+			}, 10)
+		},
+		// 初始化按钮位置
+		initButtonStyle({
+			barStyle,
+			buttonWrapperStyle
+		}) {
+			this.barStyle = barStyle
+			this.buttonWrapperStyle = buttonWrapperStyle
+		},
+		emitEvent(event, value) {
+			this.$emit(event, value ? value : this.value)
+		},
+		formatStep(value) {
+			// 移动点占总长度的百分比
+			return Math.round(Math.max(this.min, Math.min(value, this.max)) / this.step) * this.step
+		},
+		// 滑动开始
+		onTouchStart(e) {
+			// 阻止页面滚动,可以保证在滑动过程中,不让页面可以上下滚动,造成不好的体验
+			e.stopPropagation && e.stopPropagation()
+			e.preventDefault && e.preventDefault()
+			if (this.moving || this.disabled) {
+				// 释放上一次的资源
+				if (this.panEvent?.token != 0) {
+					BindingX.unbind({
+						token: this.panEvent.token,
+						// pan为手势事件
+						eventType: 'pan'
+					})
+					this.gesToken = 0
+				}
+				return
+			}
+
+			this.moving = true
+			this.touching = true
+
+			// 获取元素ref
+			const button = this.$refs['nvue-button'].ref
+			const gap = this.$refs['nvue-gap'].ref
+
+			const {
+				min,
+				max,
+				step
+			} = this
+			const {
+				left,
+				width
+			} = this.sliderRect
+
+			// 初始值为本次偏移量x,加上次停止滑动时的结束值
+			let exporession = `(${this.x} + x)`
+			// 将偏移的x值,转为总位移的百分比值,为了和min和max进行判断
+			exporession = `(${exporession} / ${width}) * 100`
+			if (step > 1) {
+				// 如果step步进大于1,需要跳步,所以需要使用Math.round进行取整
+				exporession = `round(max(${min}, min(${exporession}, ${max})) / ${step}) * ${step}`
+			} else {
+				// 当step=1时,无需跳步,充分利用bindingx性能,滑块实时跟随手势,达到丝滑的效果
+				exporession = `max(${min}, min(${exporession}, ${max}))`
+			}
+			// 将百分比最后转化为对应的px值
+			exporession = `${exporession} / 100 * ${width}`
+			// 最大值不允许超过轨迹的宽度
+			const {
+				sliderWidth
+			} = this.sliderRect
+			exporession = `min(${sliderWidth}, ${exporession})`
+			// 滑块点总是需要一个左偏移的值,为自身宽度的一半
+			const buttonExpression = `${exporession} - ${this.blockHeight / 2}`
+			// 阿里为了KPI而开源的BindingX
+			this.panEvent = BindingX.bind({
+				anchor: button,
+				eventType: 'pan',
+				props: [{
+					element: gap,
+					// 绑定width属性,设置其宽度值
+					property: 'width',
+					expression
+				}, {
+					element: button,
+					// 绑定width属性,设置其宽度值
+					property: 'transform.translateX',
+					expression: buttonExpression
+				}]
+			}, (e) => {
+				if (e.state === 'end' || e.state === 'exit') {
+					// 
+					this.x = range(0, left + width, e.deltaX + this.x)
+					// 根据偏移值,得出移动的百分比,进而修改双向绑定的v-model的值
+					const value = (this.x / width) * 100
+					const percent = this.formatStep(value)
+					// 修改value值
+					this.$emit('input', percent)
+					// 标记下一次触发value的watch时,这个值的变化,是由内部改变的
+					this.changeFromInside = true
+					this.moving = false
+					this.touching = false
+				}
+			})
+		},
+		// 从value的变化,倒推得出x的值该为多少
+		initX() {
+			const {
+				left,
+				width
+			} = this.sliderRect
+			// 得出x的初始偏移值,之所以需要这么做,是因为在bindingX中,触摸滑动时,只能的值本次移动的偏移值
+			// 而无法的值准确的前后移动的两个点的坐标值,weex纯粹为阿里巴巴的KPI(部门业绩考核)产物,也就这样了
+			this.x = this.value / 100 * width
+			// 设置移动的值
+			const barStyle = {
+				width: this.x + 'px'
+			}
+			// 按钮的初始值
+			const buttonWrapperStyle = {
+				transform: `translateX(${this.x - this.blockHeight / 2}px)`
+			}
+			this.initButtonStyle({
+				barStyle,
+				buttonWrapperStyle
+			})
+		}
+	}
+}
diff --git a/uni_modules/uview-plus/components/u-slider/nvue.js b/uni_modules/uview-plus/components/u-slider/nvue.js
new file mode 100644
index 0000000..53380ff
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-slider/nvue.js
@@ -0,0 +1,193 @@
+/**
+ * 使用bindingx方案实现slider
+ * 只能使用于nvue下
+ */
+// 引入bindingx,此库类似于微信小程序wxs,目的是让js运行在视图层,减少视图层和逻辑层的通信折损
+const BindingX = uni.requireNativePlugin('bindingx')
+// nvue操作dom的库,用于获取dom的尺寸信息
+const dom = uni.requireNativePlugin('dom')
+// nvue中用于操作元素动画的库,类似于uni.animation,只不过uni.animation不能用于nvue
+const animation = uni.requireNativePlugin('animation')
+import { range } from '../../libs/function/index';
+export default {
+    data() {
+        return {
+            // 位移的偏移量
+            x: 0,
+            // 是否正在触摸过程中,用于标记动画类是否添加或移除
+            touching: false,
+            changeFromInside: false
+        }
+    },
+    watch: {
+        // 监听vlaue的变化,此变化可能是由于内部修改v-model的值,或者外部
+        // 从服务端获取一个值后,赋值给slider的v-model而导致的
+        value(n) {
+            if (!this.changeFromInside) {
+                this.initX()
+            } else {
+                this.changeFromInside = false
+            }
+        }
+    },
+    mounted() {
+        this.init()
+    },
+    methods: {
+        init() {
+            // 更新滑块尺寸信息
+            this.getSliderRect().then((size) => {
+                this.sliderRect = size
+                this.initX()
+            })
+        },
+        // 获取节点信息
+        // 获取slider尺寸
+        getSliderRect() {
+            // 获取滑块条的尺寸信息
+            // 通过nvue的dom模块,查询节点信息
+            return new Promise((resolve) => {
+                this.$nextTick(() => {
+                    dom.getComponentRect(this.$refs.slider, (res) => {
+                        resolve(res.size)
+                    })
+                })
+            })
+        },
+        // 初始化按钮位置
+        initButtonStyle({
+            barStyle,
+            buttonWrapperStyle
+        }) {
+            this.barStyle = barStyle
+            this.buttonWrapperStyle = buttonWrapperStyle
+        },
+        emitEvent(event, value) {
+            this.$emit(event, value || this.value)
+        },
+        // 滑动开始
+        async onTouchStart(e) {
+            // if (this.disabled) return
+            // // 阻止页面滚动,可以保证在滑动过程中,不让页面可以上下滚动,造成不好的体验
+            // e.stopPropagation && e.stopPropagation()
+            // e.preventDefault && e.preventDefault()
+            // // 更新滑块的尺寸信息
+            // this.sliderRect = await this.getSliderRect()
+            // // 标记滑动过程中触摸点的信息
+            // this.touchStart(e)
+            // this.startValue = this.format(this.value)
+            // this.dragStatus = 'start'
+
+            // 标记滑动过程中触摸点的信息
+            // this.touchStart(e)
+        },
+        // 开始滑动
+        onTouchMove(e) {
+            // if (this.disabled) return;
+            // if (this.dragStatus === 'start') {
+            // 	this.$emit('drag-start')
+            // }
+            // // 标记当前滑动过程中的触点信息,此方法在touch mixin中
+            // this.touchMove(e)
+            // this.dragStatus = 'draging'
+            // const {
+            // 	width: sliderWidth
+            // } = this.sliderRect
+            // const diff = (this.deltaX / sliderWidth) * this.getRange()
+            // this.newValue = this.startValue + diff
+            // this.updateValue(this.newValue, false, true)
+            // 获取元素ref
+            // const button = this.$refs['nvue-button'].ref
+            // const gap = this.$refs['nvue-gap'].ref
+
+            //          animation.transition(gap, {
+            // 	styles: {
+            //                  width: `${this.startX + this.deltaX}px`
+            // 	}
+            // })
+            // // console.log(this.startX + this.deltaX);
+            // animation.transition(button, {
+            // 	styles: {
+            //         transform: `translateX(${this.startX + this.deltaX}px)`
+            // 	}
+            // })
+            // this.barStyle = {
+            // 	width: `${this.startX + this.deltaX}px`
+            // }
+            const {
+                x
+            } = this.getTouchPoint(e)
+            this.buttonWrapperStyle = {
+                transform: `translateX(${x}px)`
+            }
+            // this.buttonWrapperStyle = {
+            // 	transform: `translateX(${this.format(this.startX + this.deltaX)}px)`
+            // }
+        },
+        // onTouchEnd() {
+        // 	if (this.disabled) return;
+        // 	if (this.dragStatus === 'draging') {
+        // 		this.updateValue(this.newValue, true)
+        // 		this.$emit('drag-end');
+        // 	}
+        // },
+        updateValue(value, end, drag) {
+            value = this.format(value)
+            const {
+                width: sliderWidth
+            } = this.sliderRect
+            const width = `${((value - this.min) * sliderWidth) / this.getRange()}`
+            this.value = value
+            this.barStyle = {
+                width: `${width}px`
+            }
+            // console.log('width', width);
+            if (drag) {
+                this.$emit('drag', {
+                    value
+                })
+            }
+            if (end) {
+                this.$emit('change', value)
+            }
+            if ((drag || end)) {
+                this.changeFromInside = true
+                this.$emit('update', value)
+            }
+        },
+        // 从value的变化,倒推得出x的值该为多少
+        initX() {
+            const {
+                left,
+                width
+            } = this.sliderRect
+            // 得出x的初始偏移值,之所以需要这么做,是因为在bindingX中,触摸滑动时,只能的值本次移动的偏移值
+            // 而无法的值准确的前后移动的两个点的坐标值,weex纯粹为阿里巴巴的KPI(部门业绩考核)产物,也就这样了
+            this.x = this.value / 100 * width
+            // 设置移动的值
+            const barStyle = {
+                width: `${this.x}px`
+            }
+            // 按钮的初始值
+            const buttonWrapperStyle = {
+                transform: `translateX(${this.x - this.blockHeight / 2}px)`
+            }
+            this.initButtonStyle({
+                barStyle,
+                buttonWrapperStyle
+            })
+        },
+        // 移动点占总长度的百分比,此处需要先除以step,是为了保证step大于1时,比如10,那么在滑动11,12px这样的
+        // 距离时,实际上滑块是不会滑动的,到了16,17px,经过四舍五入后,就变成了20px,进行了下一个跳变
+        format(value) {
+            return Math.round(range(this.min, this.max, value) / this.step) * this.step
+        },
+        getRange() {
+            const {
+                max,
+                min
+            } = this
+            return max - min
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-slider/props.js b/uni_modules/uview-plus/components/u-slider/props.js
new file mode 100644
index 0000000..87153fa
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-slider/props.js
@@ -0,0 +1,64 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 最小可选值
+        min: {
+            type: [Number, String],
+            default: () => defProps.slider.min
+        },
+        // 最大可选值
+        max: {
+            type: [Number, String],
+            default: () => defProps.slider.max
+        },
+        // 步长,取值必须大于 0,并且可被(max - min)整除
+        step: {
+            type: [Number, String],
+            default: () => defProps.slider.step
+        },
+		// #ifdef VUE3
+		// 当前取值
+		modelValue: {
+			type: [String, Number],
+			default: () => defProps.slider.value
+		},
+		// #endif
+		// #ifdef VUE2
+		// 当前取值
+		value: {
+			type: [String, Number],
+			default: () => defProps.slider.value
+		},
+		// #endif
+        // 滑块右侧已选择部分的背景色
+        activeColor: {
+            type: String,
+            default: () => defProps.slider.activeColor
+        },
+        // 滑块左侧未选择部分的背景色
+        inactiveColor: {
+            type: String,
+            default: () => defProps.slider.inactiveColor
+        },
+        // 滑块的大小,取值范围为 12 - 28
+        blockSize: {
+            type: [Number, String],
+            default: () => defProps.slider.blockSize
+        },
+        // 滑块的颜色
+        blockColor: {
+            type: String,
+            default: () => defProps.slider.blockColor
+        },
+		// 禁用状态
+		disabled: {
+			type: Boolean,
+			default: () => defProps.slider.disabled
+		},
+        // 是否显示当前的选择值
+        showValue: {
+            type: Boolean,
+            default: () => defProps.slider.showValue
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-slider/u-slider.vue b/uni_modules/uview-plus/components/u-slider/u-slider.vue
new file mode 100644
index 0000000..e937696
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-slider/u-slider.vue
@@ -0,0 +1,71 @@
+<template>
+	<view
+		class="u-slider"
+		:style="[addStyle(customStyle)]"
+	>
+		<slider
+			:min="min"
+			:max="max"
+			:step="step"
+			:value="modelValue"
+			:activeColor="activeColor"
+			:backgroundColor="inactiveColor"
+			:blockSize="getPx(blockSize)"
+			:blockColor="blockColor"
+			:showValue="showValue"
+			:disabled="disabled"
+			@changing="changingHandler"
+			@change="changeHandler"
+		></slider>
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addStyle, getPx } from '../../libs/function/index.js';
+	export default {
+		name: 'up-slider',
+		mixins: [mpMixin, mixin, props],
+		emits: ["changing", "change", "update:modelValue"],
+		methods: {
+			addStyle,
+			getPx,
+			// 拖动过程中触发
+			changingHandler(e) {
+				const {
+					value
+				} = e.detail
+				// 更新v-model的值
+				// #ifdef VUE3
+                this.$emit("update:modelValue", value);
+                // #endif
+                // #ifdef VUE2
+                this.$emit("input", value);
+                // #endif
+				// 触发事件
+				this.$emit('changing', value)
+			},
+			// 滑动结束时触发
+			changeHandler(e) {
+				const {
+					value
+				} = e.detail
+				// 更新v-model的值
+				// #ifdef VUE3
+                this.$emit("update:modelValue", value);
+                // #endif
+                // #ifdef VUE2
+                this.$emit("input", value);
+                // #endif
+				// 触发事件
+				this.$emit('change', value)
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+</style>
diff --git a/uni_modules/uview-plus/components/u-status-bar/props.js b/uni_modules/uview-plus/components/u-status-bar/props.js
new file mode 100644
index 0000000..d4523a0
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-status-bar/props.js
@@ -0,0 +1,9 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        bgColor: {
+            type: String,
+            default: () => defProps.statusBar.bgColor
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-status-bar/u-status-bar.vue b/uni_modules/uview-plus/components/u-status-bar/u-status-bar.vue
new file mode 100644
index 0000000..26f6e2c
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-status-bar/u-status-bar.vue
@@ -0,0 +1,49 @@
+<template>
+	<view
+	    :style="[style]"
+	    class="u-status-bar"
+	>
+		<slot />
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addUnit, addStyle, deepMerge, sys } from '../../libs/function/index';
+	/**
+	 * StatbusBar 状态栏占位
+	 * @description 本组件主要用于状态填充,比如在自定导航栏的时候,它会自动适配一个恰当的状态栏高度。
+	 * @tutorial https://uview-plus.jiangruyi.com/components/statusBar.html
+	 * @property {String}			bgColor			背景色 (默认 'transparent' )
+	 * @property {String | Object}	customStyle		自定义样式 
+	 * @example <u-status-bar></u-status-bar>
+	 */
+	export default {
+		name: 'u-status-bar',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+			}
+		},
+		computed: {
+			style() {
+				const style = {}
+				// 状态栏高度,由于某些安卓和微信开发工具无法识别css的顶部状态栏变量,所以使用js获取的方式
+				style.height = addUnit(sys().statusBarHeight, 'px')
+				style.backgroundColor = this.bgColor
+				return deepMerge(style, addStyle(this.customStyle))
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.u-status-bar {
+		// nvue会默认100%,如果nvue下,显式写100%的话,会导致宽度不为100%而异常
+		/* #ifndef APP-NVUE */
+		width: 100%;
+		/* #endif */
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-steps-item/props.js b/uni_modules/uview-plus/components/u-steps-item/props.js
new file mode 100644
index 0000000..a68d2a7
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-steps-item/props.js
@@ -0,0 +1,25 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 标题
+        title: {
+            type: [String, Number],
+            default: () => defProps.stepsItem.title
+        },
+        // 描述文本
+        desc: {
+            type: [String, Number],
+            default: () => defProps.stepsItem.desc
+        },
+        // 图标大小
+        iconSize: {
+            type: [String, Number],
+            default: () => defProps.stepsItem.iconSize
+        },
+        // 当前步骤是否处于失败状态
+        error: {
+            type: Boolean,
+            default: () => defProps.stepsItem.error
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-steps-item/u-steps-item.vue b/uni_modules/uview-plus/components/u-steps-item/u-steps-item.vue
new file mode 100644
index 0000000..d34bf28
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-steps-item/u-steps-item.vue
@@ -0,0 +1,320 @@
+<template>
+	<view class="u-steps-item" ref="u-steps-item" :class="[`u-steps-item--${parentData.direction}`]">
+		<view class="u-steps-item__line" v-if="index + 1 < childLength"
+			:class="[`u-steps-item__line--${parentData.direction}`]" :style="[lineStyle]"></view>
+		<view class="u-steps-item__wrapper"
+			:class="[`u-steps-item__wrapper--${parentData.direction}`, parentData.dot && `u-steps-item__wrapper--${parentData.direction}--dot`]">
+			<slot name="icon">
+				<view class="u-steps-item__wrapper__dot" v-if="parentData.dot" :style="{
+						backgroundColor: statusColor
+					}">
+
+				</view>
+				<view class="u-steps-item__wrapper__icon" v-else-if="parentData.activeIcon || parentData.inactiveIcon">
+					<u-icon :name="index <= parentData.current ? parentData.activeIcon : parentData.inactiveIcon"
+						:size="iconSize"
+						:color="index <= parentData.current ? parentData.activeColor : parentData.inactiveColor">
+					</u-icon>
+				</view>
+				<view v-else :style="{
+						backgroundColor: statusClass === 'process' ? parentData.activeColor : 'transparent',
+						borderColor: statusColor
+					}" class="u-steps-item__wrapper__circle">
+					<text v-if="statusClass === 'process' || statusClass === 'wait'"
+						class="u-steps-item__wrapper__circle__text" :style="{
+							color: index == parentData.current ? '#ffffff' : parentData.inactiveColor
+						}">{{ index + 1}}</text>
+					<u-icon v-else :color="statusClass === 'error' ? 'error' : parentData.activeColor" size="12"
+						:name="statusClass === 'error' ? 'close' : 'checkmark'"></u-icon>
+				</view>
+			</slot>
+		</view>
+		<view class="u-steps-item__content" :class="[`u-steps-item__content--${parentData.direction}`]"
+			:style="[contentStyle]">
+			<up-text :text="title" :type="parentData.current == index ? 'main' : 'content'" lineHeight="20px"
+				:size="parentData.current == index ? 14 : 13"></up-text>
+			<slot name="desc">
+				<up-text :text="desc" type="tips" size="12"></up-text>
+			</slot>
+		</view>
+		<!-- <view
+		    class="u-steps-item__line"
+		    v-if="showLine && parentData.direction === 'column'"
+			:class="[`u-steps-item__line--${parentData.direction}`]"
+		    :style="[lineStyle]"
+		></view> -->
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { sleep, error } from '../../libs/function/index';
+	import color from '../../libs/config/color';
+	// #ifdef APP-NVUE
+	const dom = uni.requireNativePlugin('dom')
+	// #endif
+	/**
+	 * StepsItem 步骤条的子组件
+	 * @description 本组件需要和u-steps配合使用
+	 * @tutorial https://uview-plus.jiangruyi.com/components/steps.html
+	 * @property {String}			title			标题文字
+	 * @property {String}			current			描述文本
+	 * @property {String | Number}	iconSize		图标大小  (默认 17 )
+	 * @property {Boolean}			error			当前步骤是否处于失败状态  (默认 false )
+	 * @example <u-steps current="0"><u-steps-item title="已出库" desc="10:35" ></u-steps-item></u-steps>
+	 */
+	export default {
+		name: 'u-steps-item',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				index: 0,
+				childLength: 0,
+				showLine: false,
+				size: {
+					height: 0,
+					width: 0
+				},
+				parentData: {
+					direction: 'row',
+					current: 0,
+					activeColor: '',
+					inactiveColor: '',
+					activeIcon: '',
+					inactiveIcon: '',
+					dot: false
+				}
+			}
+		},
+		watch: {
+			'parentData'(newValue, oldValue) {
+			}
+		},
+		created() {
+			this.init()
+		},
+		computed: {
+			lineStyle() {
+				const style = {}
+				if (this.parentData.direction === 'row') {
+					style.width = this.size.width + 'px'
+					style.left = this.size.width / 2 + 'px'
+				} else {
+					style.height = this.size.height + 'px'
+					// style.top = this.size.height / 2 + 'px'
+				}
+				style.backgroundColor = this.parent.children?.[this.index + 1]?.error ? color.error : this.index <
+					this
+					.parentData
+					.current ? this.parentData.activeColor : this.parentData.inactiveColor
+				return style
+			},
+			statusClass() {
+				const {
+					index,
+					error
+				} = this
+				const {
+					current
+				} = this.parentData
+				if (current == index) {
+					return error === true ? 'error' : 'process'
+				} else if (error) {
+					return 'error'
+				} else if (current > index) {
+					return 'finish'
+				} else {
+					return 'wait'
+				}
+			},
+			statusColor() {
+				let colorTmp = ''
+				switch (this.statusClass) {
+					case 'finish':
+						colorTmp = this.parentData.activeColor
+						break
+					case 'error':
+						colorTmp = color.error
+						break
+					case 'process':
+						colorTmp = this.parentData.dot ? this.parentData.activeColor : 'transparent'
+						break
+					default:
+						colorTmp = this.parentData.inactiveColor
+						break
+				}
+				return colorTmp
+			},
+			contentStyle() {
+				const style = {}
+				if (this.parentData.direction === 'column') {
+					style.marginLeft = this.parentData.dot ? '2px' : '6px'
+					style.marginTop = this.parentData.dot ? '0px' : '6px'
+				} else {
+					style.marginTop = this.parentData.dot ? '2px' : '6px'
+					style.marginLeft = this.parentData.dot ? '2px' : '6px'
+				}
+
+				return style
+			}
+		},
+		mounted() {
+			this.parent && this.parent.updateFromChild()
+			sleep().then(() => {
+				this.getStepsItemRect()
+			})
+		},
+		methods: {
+			init() {
+				// 初始化数据
+				this.updateParentData()
+				if (!this.parent) {
+					return error('u-steps-item必须要搭配u-steps组件使用')
+				}
+				this.index = this.parent.children.indexOf(this)
+				this.childLength = this.parent.children.length
+			},
+			updateParentData() {
+				// 此方法在mixin中
+				this.getParentData('u-steps')
+			},
+			// 父组件数据发生变化
+			updateFromParent() {
+				this.init()
+			},
+			// 获取组件的尺寸,用于设置横线的位置
+			getStepsItemRect() {
+				// #ifndef APP-NVUE
+				this.$uGetRect('.u-steps-item').then(size => {
+					this.size = size
+				})
+				// #endif
+
+				// #ifdef APP-NVUE
+				dom.getComponentRect(this.$refs['u-steps-item'], res => {
+					const {
+						size
+					} = res
+					this.size = size
+				})
+				// #endif
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-steps-item {
+		flex: 1;
+		@include flex;
+
+		&--row {
+			flex-direction: column;
+			align-items: center;
+			position: relative;
+		}
+
+		&--column {
+			position: relative;
+			flex-direction: row;
+			justify-content: flex-start;
+			padding-bottom: 5px;
+		}
+
+		&__wrapper {
+			@include flex;
+			justify-content: center;
+			align-items: center;
+			position: relative;
+			background-color: #fff;
+
+			&--column {
+				width: 20px;
+				height: 32px;
+
+				&--dot {
+					height: 20px;
+					width: 20px;
+				}
+			}
+
+			&--row {
+				width: 32px;
+				height: 20px;
+
+				&--dot {
+					width: 20px;
+					height: 20px;
+				}
+			}
+
+			&__circle {
+				width: 20px;
+				height: 20px;
+				/* #ifndef APP-NVUE */
+				box-sizing: border-box;
+				flex-shrink: 0;
+				/* #endif */
+				border-radius: 100px;
+				border-width: 1px;
+				border-color: $u-tips-color;
+				border-style: solid;
+				@include flex(row);
+				align-items: center;
+				justify-content: center;
+				transition: background-color 0.3s;
+
+				&__text {
+					color: $u-tips-color;
+					font-size: 11px;
+					@include flex(row);
+					align-items: center;
+					justify-content: center;
+					text-align: center;
+					line-height: 11px;
+				}
+			}
+
+			&__dot {
+				width: 10px;
+				height: 10px;
+				border-radius: 100px;
+				background-color: $u-content-color;
+			}
+		}
+
+		&__content {
+			@include flex;
+			flex: 1;
+
+			&--row {
+				flex-direction: column;
+				align-items: center;
+			}
+
+			&--column {
+				flex-direction: column;
+				margin-left: 6px;
+			}
+		}
+
+		&__line {
+			position: absolute;
+			background: $u-tips-color;
+
+			&--row {
+				top: 10px;
+				height: 1px;
+			}
+
+			&--column {
+				width: 1px;
+				left: 10px;
+			}
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-steps/props.js b/uni_modules/uview-plus/components/u-steps/props.js
new file mode 100644
index 0000000..de9d53d
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-steps/props.js
@@ -0,0 +1,40 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 排列方向
+        direction: {
+            type: String,
+            default: () => defProps.steps.direction
+        },
+        // 设置第几个步骤
+        current: {
+            type: [String, Number],
+            default: () => defProps.steps.current
+        },
+        // 激活状态颜色
+        activeColor: {
+            type: String,
+            default: () => defProps.steps.activeColor
+        },
+        // 未激活状态颜色
+        inactiveColor: {
+            type: String,
+            default: () => defProps.steps.inactiveColor
+        },
+        // 激活状态的图标
+        activeIcon: {
+            type: String,
+            default: () => defProps.steps.activeIcon
+        },
+        // 未激活状态图标
+        inactiveIcon: {
+            type: String,
+            default: () => defProps.steps.inactiveIcon
+        },
+        // 是否显示点类型
+        dot: {
+            type: Boolean,
+            default: () => defProps.steps.dot
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-steps/u-steps.vue b/uni_modules/uview-plus/components/u-steps/u-steps.vue
new file mode 100644
index 0000000..c5f5606
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-steps/u-steps.vue
@@ -0,0 +1,83 @@
+<template>
+	<view
+	    class="u-steps"
+	    :class="[`u-steps--${direction}`]"
+	>
+		<slot></slot>
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import test from '../../libs/function/test';
+	/**
+	 * Steps 步骤条
+	 * @description 该组件一般用于完成一个任务要分几个步骤,标识目前处于第几步的场景。
+	 * @tutorial https://uview-plus.jiangruyi.com/components/steps.html
+	 * @property {String}			direction		row-横向,column-竖向 (默认 'row' )
+	 * @property {String | Number}	current			设置当前处于第几步 (默认 0 )
+	 * @property {String}			activeColor		激活状态颜色 (默认 '#3c9cff' )
+	 * @property {String}			inactiveColor	未激活状态颜色 (默认 '#969799' )
+	 * @property {String}			activeIcon		激活状态的图标
+	 * @property {String}			inactiveIcon	未激活状态图标 
+	 * @property {Boolean}			dot				是否显示点类型 (默认 false )
+	 * @example <u-steps current="0"><u-steps-item title="已出库" desc="10:35" ></u-steps-item></u-steps>
+	 */
+	export default {
+		name: 'u-steps',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+			}
+		},
+		watch: {
+			children() {
+				this.updateChildData()
+			},
+			parentData() {
+				this.updateChildData()
+			}
+		},
+		computed: {
+			// 监听参数的变化,通过watch中,手动去更新子组件的数据,否则子组件不会自动变化
+			parentData() {
+				return [this.current, this.direction, this.activeColor, this.inactiveColor, this.activeIcon, this.inactiveIcon, this.dot]
+			}
+		},
+		methods: {
+			// 更新子组件的数据
+			updateChildData() {
+				this.children.map(child => {
+					// 先判断子组件是否存在对应的方法
+					test.func((child || {}).updateFromParent()) && child.updateFromParent()
+				})
+			},
+			// 接受子组件的通知,去修改其他子组件的数据
+			updateFromChild() {
+				this.updateChildData()
+			}
+		},
+		created() {
+			this.children = []
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-steps {
+		@include flex;
+
+		&--column {
+			flex-direction: column
+		}
+
+		&--row {
+			flex-direction: row;
+			flex: 1;
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-sticky/props.js b/uni_modules/uview-plus/components/u-sticky/props.js
new file mode 100644
index 0000000..6446c15
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-sticky/props.js
@@ -0,0 +1,41 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 吸顶容器到顶部某个距离的时候,进行吸顶,在H5平台,NavigationBar为44px
+        offsetTop: {
+            type: [String, Number],
+            default: () => defProps.sticky.offsetTop
+        },
+        // 自定义导航栏的高度
+        customNavHeight: {
+            type: [String, Number],
+            // #ifdef H5
+            // H5端的导航栏属于“自定义”导航栏的范畴,因为它是非原生的,与普通元素一致
+            default: 44,
+            // #endif
+            // #ifndef H5
+            default: () => defProps.sticky.customNavHeight
+            // #endif
+        },
+        // 是否开启吸顶功能
+        disabled: {
+            type: Boolean,
+            default: () => defProps.sticky.disabled
+        },
+        // 吸顶区域的背景颜色
+        bgColor: {
+            type: String,
+            default: () => defProps.sticky.bgColor
+        },
+        // z-index值
+        zIndex: {
+            type: [String, Number],
+            default: () => defProps.sticky.zIndex
+        },
+        // 列表中的索引值
+        index: {
+            type: [String, Number],
+            default: () => defProps.sticky.index
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-sticky/u-sticky.vue b/uni_modules/uview-plus/components/u-sticky/u-sticky.vue
new file mode 100644
index 0000000..7700b8d
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-sticky/u-sticky.vue
@@ -0,0 +1,221 @@
+<template>
+	<view
+		class="u-sticky"
+		:id="elId"
+		:style="[style]"
+	>
+		<view
+			:style="[stickyContent]"
+			class="u-sticky__content"
+		>
+			<slot />
+		</view>
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addUnit, addStyle, deepMerge, getPx, guid, sys, os } from '../../libs/function/index';
+	import zIndex from '../../libs/config/zIndex';
+	/**
+	 * sticky 吸顶
+	 * @description 该组件与CSS中position: sticky属性实现的效果一致,当组件达到预设的到顶部距离时, 就会固定在指定位置,组件位置大于预设的顶部距离时,会重新按照正常的布局排列。
+	 * @tutorial https://ijry.github.io/uview-plus/components/sticky.html
+	 * @property {String | Number}	offsetTop		吸顶时与顶部的距离,单位px(默认 0 )
+	 * @property {String | Number}	customNavHeight	自定义导航栏的高度 (h5 默认44  其他默认 0 )
+	 * @property {Boolean}			disabled		是否开启吸顶功能 (默认 false )
+	 * @property {String}			bgColor			组件背景颜色(默认 '#ffffff' )
+	 * @property {String | Number}	zIndex			吸顶时的z-index值
+	 * @property {String | Number}	index			自定义标识,用于区分是哪一个组件
+	 * @property {Object}			customStyle		组件的样式,对象形式
+	 * @event {Function} fixed		组件吸顶时触发
+	 * @event {Function} unfixed	组件取消吸顶时触发
+	 * @example <u-sticky offsetTop="200"><view>塞下秋来风景异,衡阳雁去无留意</view></u-sticky>
+	 */
+	export default {
+		name: 'u-sticky',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				cssSticky: false, // 是否使用css的sticky实现
+				stickyTop: 0, // 吸顶的top值,因为可能受自定义导航栏影响,最终的吸顶值非offsetTop值
+				elId: guid(),
+				left: 0, // js模式时,吸顶的内容因为处于postition: fixed模式,为了和原来保持一致的样式,需要记录并重新设置它的left,height,width属性
+				width: 'auto',
+				height: 'auto',
+				fixed: false, // js模式时,是否处于吸顶模式
+			}
+		},
+		computed: {
+			style() {
+				const style = {}
+				if(!this.disabled) {
+					if (this.cssSticky) {
+						style.position = 'sticky'
+						style.zIndex = this.uZindex
+						style.top = addUnit(this.stickyTop)
+					} else {
+						style.height = this.fixed ? this.height + 'px' : 'auto'
+					}
+				} else {
+					// 无需吸顶时,设置会默认的relative(nvue)和非nvue的static静态模式即可
+					// #ifdef APP-NVUE
+					style.position = 'relative'
+					// #endif
+					// #ifndef APP-NVUE
+					style.position = 'static'
+					// #endif
+				}
+				style.backgroundColor = this.bgColor
+				return deepMerge(addStyle(this.customStyle), style)
+			},
+			// 吸顶内容的样式
+			stickyContent() {
+				const style = {}
+				if (!this.cssSticky) {
+					style.position = this.fixed ? 'fixed' : 'static'
+					style.top = this.stickyTop + 'px'
+					style.left = this.left + 'px'
+					style.width = this.width == 'auto' ? 'auto' : this.width + 'px'
+					style.zIndex = this.uZindex
+				}
+				return style
+			},
+			uZindex() {
+				return this.zIndex ? this.zIndex : zIndex.sticky
+			}
+		},
+		mounted() {
+			this.init()
+		},
+		methods: {
+			init() {
+				this.getStickyTop()
+				// 判断使用的模式
+				this.checkSupportCssSticky()
+				// 如果不支持css sticky,则使用js方案,此方案性能比不上css方案
+				if (!this.cssSticky) {
+					!this.disabled && this.initObserveContent()
+				}
+			},
+			initObserveContent() {
+				// 获取吸顶内容的高度,用于在js吸顶模式时,给父元素一个填充高度,防止"塌陷"
+				this.$uGetRect('#' + this.elId).then((res) => {
+					this.height = res.height
+					this.left = res.left
+					this.width = res.width
+					this.$nextTick(() => {
+						this.observeContent()
+					})
+				})
+			},
+			observeContent() {
+				// 先断掉之前的观察
+				this.disconnectObserver('contentObserver')
+				const contentObserver = uni.createIntersectionObserver({
+					// 检测的区间范围
+					thresholds: [0.95, 0.98, 1]
+				})
+				// 到屏幕顶部的高度时触发
+				contentObserver.relativeToViewport({
+					top: -this.stickyTop
+				})
+				// 绑定观察的元素
+				contentObserver.observe(`#${this.elId}`, res => {
+					this.setFixed(res.boundingClientRect.top)
+				})
+				this.contentObserver = contentObserver
+			},
+			setFixed(top) {
+				// 判断是否出于吸顶条件范围
+				const fixed = top <= this.stickyTop
+				this.fixed = fixed
+			},
+			disconnectObserver(observerName) {
+				// 断掉观察,释放资源
+				const observer = this[observerName]
+				observer && observer.disconnect()
+			},
+			getStickyTop() {
+				this.stickyTop = getPx(this.offsetTop) + getPx(this.customNavHeight)
+			},
+			async checkSupportCssSticky() {
+				// #ifdef H5
+				// H5,一般都是现代浏览器,是支持css sticky的,这里使用创建元素嗅探的形式判断
+				if (this.checkCssStickyForH5()) {
+					this.cssSticky = true
+				}
+				// #endif
+
+				// 如果安卓版本高于8.0,依然认为是支持css sticky的(因为安卓7在某些机型,可能不支持sticky)
+				if (os() === 'android' && Number(sys().system) > 8) {
+					this.cssSticky = true
+				}
+
+				// APP-Vue和微信平台,通过computedStyle判断是否支持css sticky
+				// #ifdef APP-VUE || MP-WEIXIN || MP-TOUTIAO
+				this.cssSticky = await this.checkComputedStyle()
+				// #endif
+
+				// ios上,从ios6开始,都是支持css sticky的
+				if (os() === 'ios') {
+					this.cssSticky = true
+				}
+
+				// nvue,是支持css sticky的
+				// #ifdef APP-NVUE
+				this.cssSticky = true
+				// #endif
+			},
+			// 在APP和微信小程序上,通过uni.createSelectorQuery可以判断是否支持css sticky
+			checkComputedStyle() {
+				// 方法内进行判断,避免在其他平台生成无用代码
+				// #ifdef APP-VUE || MP-WEIXIN || MP-TOUTIAO
+				return new Promise(resolve => {
+					uni.createSelectorQuery().in(this).select('.u-sticky').fields({
+						computedStyle: ["position"]
+					}).exec(e => {
+						resolve('sticky' === e[0].position)
+					})
+				})
+				// #endif
+			},
+			// H5通过创建元素的形式嗅探是否支持css sticky
+			// 判断浏览器是否支持sticky属性
+			checkCssStickyForH5() {
+				// 方法内进行判断,避免在其他平台生成无用代码
+				// #ifdef H5
+				const vendorList = ['', '-webkit-', '-ms-', '-moz-', '-o-'],
+					vendorListLength = vendorList.length,
+					stickyElement = document.createElement('div')
+				for (let i = 0; i < vendorListLength; i++) {
+					stickyElement.style.position = vendorList[i] + 'sticky'
+					if (stickyElement.style.position !== '') {
+						return true
+					}
+				}
+				return false;
+				// #endif
+			}
+		},
+		// #ifdef VUE2
+		beforeDestroy() {
+		// #endif
+		// #ifdef VUE3
+		beforeUnmount() {
+		// #endif
+			this.disconnectObserver('contentObserver')
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.u-sticky {
+		/* #ifdef APP-VUE || MP-WEIXIN || MP-TOUTIAO */
+		// 此处默认写sticky属性,是为了给微信和APP通过uni.createSelectorQuery查询是否支持css sticky使用
+		position: sticky;
+		/* #endif */
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-subsection/props.js b/uni_modules/uview-plus/components/u-subsection/props.js
new file mode 100644
index 0000000..e50efda
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-subsection/props.js
@@ -0,0 +1,50 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // tab的数据
+        list: {
+            type: Array,
+            default: () => defProps.subsection.list
+        },
+        // 当前活动的tab的index
+        current: {
+            type: [String, Number],
+            default: () => defProps.subsection.current
+        },
+        // 激活的颜色
+        activeColor: {
+            type: String,
+            default: () => defProps.subsection.activeColor
+        },
+        // 未激活的颜色
+        inactiveColor: {
+            type: String,
+            default: () => defProps.subsection.inactiveColor
+        },
+        // 模式选择,mode=button为按钮形式,mode=subsection时为分段模式
+        mode: {
+            type: String,
+            default: () => defProps.subsection.mode
+        },
+        // 字体大小
+        fontSize: {
+            type: [String, Number],
+            default: () => defProps.subsection.fontSize
+        },
+        // 激活tab的字体是否加粗
+        bold: {
+            type: Boolean,
+            default: () => defProps.subsection.bold
+        },
+        // mode = button时,组件背景颜色
+        bgColor: {
+            type: String,
+            default: () => defProps.subsection.bgColor
+        },
+		// 从list元素对象中读取的键名
+		keyName: {
+			type: String,
+			default: () => defProps.subsection.keyName
+		}
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-subsection/u-subsection.vue b/uni_modules/uview-plus/components/u-subsection/u-subsection.vue
new file mode 100644
index 0000000..c7d7177
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-subsection/u-subsection.vue
@@ -0,0 +1,318 @@
+<template>
+    <view
+        class="u-subsection"
+        ref="u-subsection"
+        :class="[`u-subsection--${mode}`]"
+        :style="[addStyle(customStyle), wrapperStyle]"
+    >
+        <view
+            class="u-subsection__bar cursor-pointer"
+            ref="u-subsection__bar"
+            :style="[barStyle]"
+            :class="[
+                mode === 'button' && 'u-subsection--button__bar',
+                innerCurrent === 0 &&
+                    mode === 'subsection' &&
+                    'u-subsection__bar--first',
+                innerCurrent > 0 &&
+                innerCurrent < list.length - 1 &&
+                    mode === 'subsection' &&
+                    'u-subsection__bar--center',
+                innerCurrent === list.length - 1 &&
+                    mode === 'subsection' &&
+                    'u-subsection__bar--last',
+            ]"
+        ></view>
+        <view
+            class="u-subsection__item cursor-pointer"
+            :class="[
+                `u-subsection__item--${index}`,
+                index < list.length - 1 &&
+                    'u-subsection__item--no-border-right',
+                index === 0 && 'u-subsection__item--first',
+                index === list.length - 1 && 'u-subsection__item--last',
+            ]"
+            :ref="`u-subsection__item--${index}`"
+            :style="[itemStyle(index)]"
+            @tap="clickHandler(index)"
+            v-for="(item, index) in list"
+            :key="index"
+        >
+            <text
+                class="u-subsection__item__text"
+                :style="[textStyle(index)]"
+                >{{ getText(item) }}</text
+            >
+        </view>
+    </view>
+</template>
+
+<script>
+// #ifdef APP-NVUE
+const dom = uni.requireNativePlugin("dom");
+const animation = uni.requireNativePlugin("animation");
+// #endif
+import props from "./props.js";
+import mpMixin from '../../libs/mixin/mpMixin';
+import mixin from '../../libs/mixin/mixin';
+import { addStyle, addUnit, sleep } from '../../libs/function/index';
+/**
+ * Subsection 分段器
+ * @description 该分段器一般用于用户从几个选项中选择某一个的场景
+ * @tutorial https://ijry.github.io/uview-plus/components/subsection.html
+ * @property {Array}			list			tab的数据
+ * @property {String | Number}	current			当前活动的tab的index(默认 0 )
+ * @property {String}			activeColor		激活时的颜色(默认 '#3c9cff' )
+ * @property {String}			inactiveColor	未激活时的颜色(默认 '#303133' )
+ * @property {String}			mode			模式选择,mode=button为按钮形式,mode=subsection时为分段模式(默认 'button' )
+ * @property {String | Number}	fontSize		字体大小,单位px(默认 12 )
+ * @property {Boolean}			bold			激活选项的字体是否加粗(默认 true )
+ * @property {String}			bgColor			组件背景颜色,mode为button时有效(默认 '#eeeeef' )
+ * @property {Object}			customStyle		定义需要用到的外部样式
+ * @property {String}	        keyName	        从`list`元素对象中读取的键名(默认 'name' )
+ *
+ * @event {Function} change		分段器选项发生改变时触发  回调 index:选项的index索引值,从0开始
+ * @example <u-subsection :list="list" :current="curNow" @change="sectionChange"></u-subsection>
+ */
+export default {
+    name: "u-subsection",
+    mixins: [mpMixin, mixin, props],
+    data() {
+        return {
+            // 组件尺寸
+            itemRect: {
+                width: 0,
+                height: 0,
+            },
+            innerCurrent: '',
+            windowResizeCallback: {}
+        };
+    },
+    watch: {
+        list(newValue, oldValue) {
+            this.init();
+        },
+        current: {
+            immediate: true,
+            handler(n) {
+                if (n !== this.innerCurrent) {
+                    this.innerCurrent = n
+                }
+                // #ifdef APP-NVUE
+                // 在安卓nvue上,如果通过translateX进行位移,到最后一个时,会导致右侧无法绘制圆角
+                // 故用animation模块进行位移
+                const ref = this.$refs?.["u-subsection__bar"]?.ref;
+                // 不存在ref的时候(理解为第一次初始化时,需要渲染dom,进行一定延时再获取ref),这里的100ms是经过测试得出的结果(某些安卓需要延时久一点),勿随意修改
+                sleep(ref ? 0 : 100).then(() => {
+                    animation.transition(this.$refs["u-subsection__bar"].ref, {
+                        styles: {
+                            transform: `translateX(${
+                                n * this.itemRect.width
+                            }px)`,
+                            transformOrigin: "center center",
+                        },
+                        duration: 300,
+                    });
+                });
+                // #endif
+            },
+        },
+    },
+    computed: {
+        wrapperStyle() {
+            const style = {};
+            // button模式时,设置背景色
+            if (this.mode === "button") {
+                style.backgroundColor = this.bgColor;
+            }
+            return style;
+        },
+        // 滑块的样式
+        barStyle() {
+            const style = {};
+            style.width = `${this.itemRect.width}px`;
+            style.height = `${this.itemRect.height}px`;
+            // 通过translateX移动滑块,其移动的距离为索引*item的宽度
+            // #ifndef APP-NVUE
+            style.transform = `translateX(${
+                this.innerCurrent * this.itemRect.width
+            }px)`;
+            // #endif
+            if (this.mode === "subsection") {
+                // 在subsection模式下,需要动态设置滑块的圆角,因为移动滑块使用的是translateX,无法通过父元素设置overflow: hidden隐藏滑块的直角
+                style.backgroundColor = this.activeColor;
+            }
+            return style;
+        },
+        // 分段器item的样式
+        itemStyle(index) {
+            return (index) => {
+                const style = {};
+                if (this.mode === "subsection") {
+                    // 设置border的样式
+                    style.borderColor = this.activeColor;
+                    style.borderWidth = "1px";
+                    style.borderStyle = "solid";
+                }
+                return style;
+            };
+        },
+        // 分段器文字颜色
+        textStyle(index) {
+            return (index) => {
+                const style = {};
+                style.fontWeight =
+                    this.bold && this.innerCurrent === index ? "bold" : "normal";
+                style.fontSize = addUnit(this.fontSize);
+                // subsection模式下,激活时默认为白色的文字
+                if (this.mode === "subsection") {
+                    style.color =
+                        this.innerCurrent === index ? "#fff" : this.inactiveColor;
+                } else {
+                    // button模式下,激活时文字颜色默认为activeColor
+                    style.color =
+                        this.innerCurrent === index
+                            ? this.activeColor
+                            : this.inactiveColor;
+                }
+                return style;
+            };
+        },
+    },
+    mounted() {
+        this.init();
+        this.windowResizeCallback = (res) => {
+            this.init();
+        }
+        uni.onWindowResize(this.windowResizeCallback)
+    },
+    beforeUnmount() {
+        uni.offWindowResize(this.windowResizeCallback)
+    },
+	emits: ["change"],
+    methods: {
+        addStyle,
+        init() {
+            this.innerCurrent = this.current
+            sleep().then(() => this.getRect());
+        },
+		// 判断展示文本
+		getText(item) {
+			return typeof item === 'object' ? item[this.keyName] : item
+		},
+        // 获取组件的尺寸
+        getRect() {
+            // #ifndef APP-NVUE
+            this.$uGetRect(".u-subsection__item--0").then((size) => {
+                this.itemRect = size;
+            });
+            // #endif
+
+            // #ifdef APP-NVUE
+            const ref = this.$refs["u-subsection__item--0"][0];
+            ref &&
+                dom.getComponentRect(ref, (res) => {
+                    this.itemRect = res.size;
+                });
+            // #endif
+        },
+        clickHandler(index) {
+            this.innerCurrent = index
+            this.$emit("change", index);
+        },
+    },
+};
+</script>
+
+<style lang="scss" scoped>
+@import "../../libs/css/components.scss";
+
+.u-subsection {
+    @include flex;
+    position: relative;
+    overflow: hidden;
+	/* #ifndef APP-NVUE */
+	width: 100%;
+	box-sizing: border-box;
+	/* #endif */
+
+    &--button {
+        height: 34px;
+        background-color: rgb(238, 238, 239);
+        padding: 3px;
+        border-radius: 4px;
+        align-items: stretch;
+
+        &__bar {
+            background-color: #ffffff;
+            border-radius: 4px !important;
+        }
+    }
+
+    &--subsection {
+        height: 32px;
+    }
+
+    &__bar {
+        position: absolute;
+        /* #ifndef APP-NVUE */
+        transition-property: transform, color;
+        transition-duration: 0.3s;
+        transition-timing-function: ease-in-out;
+        /* #endif */
+
+        &--first {
+            border-top-left-radius: 4px;
+            border-bottom-left-radius: 4px;
+            border-top-right-radius: 0px;
+            border-bottom-right-radius: 0px;
+        }
+
+        &--center {
+            border-top-left-radius: 0px;
+            border-bottom-left-radius: 0px;
+            border-top-right-radius: 0px;
+            border-bottom-right-radius: 0px;
+        }
+
+        &--last {
+            border-top-left-radius: 0px;
+            border-bottom-left-radius: 0px;
+            border-top-right-radius: 4px;
+            border-bottom-right-radius: 4px;
+        }
+    }
+
+    &__item {
+        @include flex;
+        flex: 1;
+        justify-content: center;
+        align-items: center;
+        // vue环境下,需要设置相对定位,因为滑块为绝对定位,item需要在滑块的上面
+        position: relative;
+
+        &--no-border-right {
+            border-right-width: 0 !important;
+        }
+
+        &--first {
+            border-top-left-radius: 4px;
+            border-bottom-left-radius: 4px;
+        }
+
+        &--last {
+            border-top-right-radius: 4px;
+            border-bottom-right-radius: 4px;
+        }
+
+        &__text {
+            font-size: 12px;
+            line-height: 14px;
+            @include flex;
+            align-items: center;
+            transition-property: color;
+            transition-duration: 0.3s;
+        }
+    }
+}
+</style>
diff --git a/uni_modules/uview-plus/components/u-swipe-action-item/alipay.sjs b/uni_modules/uview-plus/components/u-swipe-action-item/alipay.sjs
new file mode 100644
index 0000000..51a7636
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-swipe-action-item/alipay.sjs
@@ -0,0 +1,229 @@
+/**
+ * 此为wxs模块,只支持APP-VUE,微信和QQ小程序以及H5平台
+ * wxs内部不支持es6语法,变量只能使用var定义,无法使用解构,箭头函数等特性
+ */
+
+// 开始触摸
+function touchstart(event, ownerInstance) {
+	// 触发事件的组件的ComponentDescriptor实例
+	var instance = event.instance
+	// wxs内的局部变量快照,此快照是属于整个组件的,在touchstart和touchmove事件中都能获取到相同的结果
+	var state = instance.getState()
+	if (state.disabled) return
+	var touches = event.touches
+	// 如果进行的是多指触控,不允许进行操作
+	if (touches && touches.length > 1) return
+	// 标识当前为滑动中状态
+	state.moving = true
+	// 记录触摸开始点的坐标值
+	state.startX = touches[0].pageX
+	state.startY = touches[0].pageY
+	
+	ownerInstance.callMethod('closeOther')
+}
+
+// 触摸滑动
+function touchmove(event, ownerInstance) {
+	// 触发事件的组件的ComponentDescriptor实例
+	var instance = event.instance
+	// wxs内的局部变量快照
+	var state = instance.getState()
+	if (state.disabled || !state.moving) return
+	var touches = event.touches
+	var pageX = touches[0].pageX
+	var pageY = touches[0].pageY
+	var moveX = pageX - state.startX
+	var moveY = pageY - state.startY
+	var buttonsWidth = state.buttonsWidth
+
+	// 移动的X轴距离大于Y轴距离,也即终点与起点位置连线,与X轴夹角小于45度时,禁止页面滚动
+	if (Math.abs(moveX) > Math.abs(moveY) || Math.abs(moveX) > state.threshold) {
+		event.preventDefault && event.preventDefault()
+		event.stopPropagation && event.stopPropagation()
+	}
+	// 如果移动的X轴距离小于Y轴距离,也即终点位置与起点位置连线,与Y轴夹角小于45度时,认为是页面上下滑动,而不是左右滑动单元格
+	if (Math.abs(moveX) < Math.abs(moveY)) return
+
+	// 限制右滑的距离,不允许内容部分往右偏移,右滑会导致X轴偏移值大于0,以此做判断
+	// 此处不能直接return,因为滑动过程中会缺失某些关键点坐标,会导致错乱,最好的办法就是
+	// 在超出后,设置为0
+	if (state.status === 'open') {
+		// 在开启状态下,向左滑动,需忽略
+		if (moveX < 0) moveX = 0
+		// 想要收起菜单,最大能移动的距离为按钮的总宽度
+		if (moveX > buttonsWidth) moveX = buttonsWidth
+		// 如果是已经打开了的状态,向左滑动时,移动收起菜单
+		moveSwipeAction(-buttonsWidth + moveX, instance, ownerInstance)
+	} else {
+		// 关闭状态下,右滑动需忽略
+		if (moveX > 0) moveX = 0
+		// 滑动的距离不允许超过所有按钮的总宽度,此时只能是左滑,最终设置按钮的总宽度,同时为负数
+		if (Math.abs(moveX) > buttonsWidth) moveX = -buttonsWidth
+		// 只要是在滑过程中,就不断移动单元格内容部分,从而使隐藏的菜单显示出来
+		moveSwipeAction(moveX, instance, ownerInstance)
+	}
+}
+
+// 触摸结束
+function touchend(event, ownerInstance) {
+	// 触发事件的组件的ComponentDescriptor实例
+	var instance = event.instance
+	// wxs内的局部变量快照
+	var state = instance.getState()
+	if (!state.moving || state.disabled) return
+	var touches = event.changedTouches ? event.changedTouches[0] : {}
+	var pageX = touches.pageX
+	var pageY = touches.pageY
+	var moveX = pageX - state.startX
+	if (state.status === 'open') {
+		// 在展开的状态下,继续左滑,无需操作
+		if (moveX < 0) return
+		// 在开启状态下,点击一下内容区域,moveX为0,也即没有进行移动,这时执行收起菜单逻辑
+		if (moveX === 0) {
+			return closeSwipeAction(instance, ownerInstance)
+		}
+		// 在开启状态下,滑动距离小于阈值,则默认为不关闭,同时恢复原来的打开状态
+		if (Math.abs(moveX) < state.threshold) {
+			openSwipeAction(instance, ownerInstance)
+		} else {
+			// 如果滑动距离大于阈值,则执行收起逻辑
+			closeSwipeAction(instance, ownerInstance)
+		}
+	} else {
+		// 在关闭的状态下,右滑,无需操作
+		if (moveX > 0) return
+		// 理由同上
+		if (Math.abs(moveX) < state.threshold) {
+			closeSwipeAction(instance, ownerInstance)
+		} else {
+			openSwipeAction(instance, ownerInstance)
+		}
+	}
+}
+
+// 获取过渡时间
+function getDuration(value) {
+	if (value.toString().indexOf('s') >= 0) return value
+	return value > 30 ? value + 'ms' : value + 's'
+}
+
+// 滑动结束时判断滑动的方向
+function getMoveDirection(instance, ownerInstance) {
+	var state = instance.getState()
+}
+
+// 移动滑动选择器内容区域,同时显示出其隐藏的菜单
+function moveSwipeAction(moveX, instance, ownerInstance) {
+	var state = instance.getState()
+	// 获取所有按钮的实例,需要通过它去设置按钮的位移
+	var buttons = ownerInstance.selectAllComponents('.u-swipe-action-item__right__button')
+
+	// 设置菜单内容部分的偏移
+	instance.requestAnimationFrame(function() {
+		instance.setStyle({
+			// 设置translateX的值
+			'transition': 'none',
+			transform: 'translateX(' + moveX + 'px)',
+			'-webkit-transform': 'translateX(' + moveX + 'px)'
+		})
+	})
+}
+
+// 一次性展开滑动菜单
+function openSwipeAction(instance, ownerInstance) {
+	var state = instance.getState()
+	// 获取所有按钮的实例,需要通过它去设置按钮的位移
+	var buttons = ownerInstance.selectAllComponents('.u-swipe-action-item__right__button')
+	// 处理duration单位问题
+	var duration = getDuration(state.duration)
+	// 展开过程中,是向左移动,所以X的偏移应该为负值
+	var buttonsWidth = -state.buttonsWidth
+	instance.requestAnimationFrame(function() {
+		// 设置菜单主体内容
+		instance.setStyle({
+			'transition': 'transform ' + duration,
+			'transform': 'translateX(' + buttonsWidth + 'px)',
+			'-webkit-transform': 'translateX(' + buttonsWidth + 'px)',
+		})
+	})
+	setStatus('open', instance, ownerInstance)
+}
+
+// 标记菜单的当前状态,open-已经打开,close-已经关闭
+function setStatus(status, instance, ownerInstance) {
+	var state = instance.getState()
+	state.status = status
+	ownerInstance.callMethod('setState', status)
+}
+
+// 一次性收起滑动菜单
+function closeSwipeAction(instance, ownerInstance) {
+	var state = instance.getState()
+	// 获取所有按钮的实例,需要通过它去设置按钮的位移
+	var buttons = ownerInstance.selectAllComponents('.u-swipe-action-item__right__button')
+	var len = buttons.length
+	// 处理duration单位问题
+	var duration = getDuration(state.duration)
+	instance.requestAnimationFrame(function() {
+		// 设置菜单主体内容
+		instance.setStyle({
+			'transition': 'transform ' + duration,
+			'transform': 'translateX(0px)',
+			'-webkit-transform': 'translateX(0px)'
+		})
+		// 设置各个隐藏的按钮为收起的状态
+		for (var i = len - 1; i >= 0; i--) {
+			buttons[i].setStyle({
+				'transition': 'transform ' + duration,
+				'transform': 'translateX(0px)',
+				'-webkit-transform': 'translateX(0px)'
+			})
+		}
+	})
+	setStatus('close', instance, ownerInstance)
+}
+
+// status的状态发生变化
+function statusChange(newValue, oldValue, ownerInstance, instance) {
+	var state = instance.getState()
+	if (state.disabled) return
+	// 打开或关闭单元格
+	if (newValue === 'close' && state.status === 'open') {
+		closeSwipeAction(instance, ownerInstance)
+	} else if(newValue === 'open' && state.status === 'close') {
+		openSwipeAction(instance, ownerInstance)
+	}
+}
+
+// 菜单尺寸发生变化
+function sizeChange(newValue, oldValue, ownerInstance, instance) {
+	// wxs内的局部变量快照
+	var state = instance.getState()
+	// 临时防止nv_disabled报错
+	if (!state || !newValue) {
+		return;
+	}
+	state.disabled = newValue.disabled
+	state.duration = newValue.duration
+	state.show = newValue.show
+	state.threshold = newValue.threshold
+	state.buttons = newValue.buttons
+
+	if (state.buttons) {
+		var len = state.buttons.length
+		var buttonsWidth = 0
+		var buttons = newValue.buttons
+		for (var i = 0; i < len; i++) {
+			buttonsWidth += buttons[i].width
+		}
+	}
+	state.buttonsWidth = buttonsWidth
+}
+
+export default {
+	touchstart: touchstart,
+	touchmove: touchmove,
+	touchend: touchend,
+	sizeChange: sizeChange,
+	statusChange: statusChange
+}
diff --git a/uni_modules/uview-plus/components/u-swipe-action-item/index - backup.wxs b/uni_modules/uview-plus/components/u-swipe-action-item/index - backup.wxs
new file mode 100644
index 0000000..04cab92
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-swipe-action-item/index - backup.wxs	
@@ -0,0 +1,256 @@
+/**
+ * 此为wxs模块,只支持APP-VUE,微信和QQ小程序以及H5平台
+ * wxs内部不支持es6语法,变量只能使用var定义,无法使用解构,箭头函数等特性
+ */
+
+// 开始触摸
+function touchstart(event, ownerInstance) {
+	// 触发事件的组件的ComponentDescriptor实例
+	var instance = event.instance
+	// wxs内的局部变量快照,此快照是属于整个组件的,在touchstart和touchmove事件中都能获取到相同的结果
+	var state = instance.getState()
+	if (state.disable) return
+	var touches = event.touches
+	// 如果进行的是多指触控,不允许进行操作
+	if (touches && touches.length > 1) return
+	// 标识当前为滑动中状态
+	state.moving = true
+	// 记录触摸开始点的坐标值
+	state.startX = touches[0].pageX
+	state.startY = touches[0].pageY
+}
+
+// 触摸滑动
+function touchmove(event, ownerInstance) {
+	// 触发事件的组件的ComponentDescriptor实例
+	var instance = event.instance
+	// wxs内的局部变量快照
+	var state = instance.getState()
+	if (state.disabled || !state.moving) return
+
+	var touches = event.touches
+	var pageX = touches[0].pageX
+	var pageY = touches[0].pageY
+	var moveX = pageX - state.startX
+	var moveY = pageY - state.startY
+	var buttonsWidth = state.buttonsWidth
+
+	// 移动的X轴距离大于Y轴距离,也即终点与起点位置连线,与X轴夹角小于45度时,禁止页面滚动
+	if (Math.abs(moveX) > Math.abs(moveY) || Math.abs(moveX) > state.threshold) {
+		event.preventDefault()
+		event.stopPropagation()
+	}
+	// 如果移动的X轴距离小于Y轴距离,也即终点位置与起点位置连线,与Y轴夹角小于45度时,认为是页面上下滑动,而不是左右滑动单元格
+	if (Math.abs(moveX) < Math.abs(moveY)) return
+
+	// 限制右滑的距离,不允许内容部分往右偏移,右滑会导致X轴偏移值大于0,以此做判断
+	// 此处不能直接return,因为滑动过程中会缺失某些关键点坐标,会导致错乱,最好的办法就是
+	// 在超出后,设置为0
+	if (state.status === 'open') {
+		// 在开启状态下,向左滑动,需忽略
+		if (moveX < 0) moveX = 0
+		// 想要收起菜单,最大能移动的距离为按钮的总宽度
+		if (moveX > buttonsWidth) moveX = buttonsWidth
+		// 如果是已经打开了的状态,向左滑动时,移动收起菜单
+		moveSwipeAction(-buttonsWidth + moveX, instance, ownerInstance)
+	} else {
+		// 关闭状态下,右滑动需忽略
+		if (moveX > 0) moveX = 0
+		// 滑动的距离不允许超过所有按钮的总宽度,此时只能是左滑,最终设置按钮的总宽度,同时为负数
+		if (Math.abs(moveX) > buttonsWidth) moveX = -buttonsWidth
+		// 只要是在滑过程中,就不断移动菜单的内容部分,从而使隐藏的菜单显示出来
+		moveSwipeAction(moveX, instance, ownerInstance)
+	}
+}
+
+// 触摸结束
+function touchend(event, ownerInstance) {
+	// 触发事件的组件的ComponentDescriptor实例
+	var instance = event.instance
+	// wxs内的局部变量快照
+	var state = instance.getState()
+	if (!state.moving || state.disabled) return
+	var touches = event.changedTouches ? event.changedTouches[0] : {}
+	var pageX = touches.pageX
+	var pageY = touches.pageY
+	var moveX = pageX - state.startX
+	if (state.status === 'open') {
+		// 在展开的状态下,继续左滑,无需操作
+		if (moveX < 0) return
+		// 在开启状态下,点击一下内容区域,moveX为0,也即没有进行移动,这时执行收起菜单逻辑
+		if (moveX === 0) {
+			return closeSwipeAction(instance, ownerInstance)
+		}
+		// 在开启状态下,滑动距离小于阈值,则默认为不关闭,同时恢复原来的打开状态
+		if (Math.abs(moveX) < state.threshold) {
+			openSwipeAction(instance, ownerInstance)
+		} else {
+			// 如果滑动距离大于阈值,则执行收起逻辑
+			closeSwipeAction(instance, ownerInstance)
+		}
+	} else {
+		// 在关闭的状态下,右滑,无需操作
+		if (moveX > 0) return
+		// 理由同上
+		if (Math.abs(moveX) < state.threshold) {
+			closeSwipeAction(instance, ownerInstance)
+		} else {
+			openSwipeAction(instance, ownerInstance)
+		}
+	}
+}
+
+// 获取过渡时间
+function getDuration(value) {
+	if (value.toString().indexOf('s') >= 0) return value
+	return value > 30 ? value + 'ms' : value + 's'
+}
+
+// 滑动结束时判断滑动的方向
+function getMoveDirection(instance, ownerInstance) {
+	var state = instance.getState()
+}
+
+// 移动滑动选择器内容区域,同时显示出其隐藏的菜单
+function moveSwipeAction(moveX, instance, ownerInstance) {
+	var state = instance.getState()
+	// 获取所有按钮的实例,需要通过它去设置按钮的位移
+	var buttons = ownerInstance.selectAllComponents('.u-swipe-action-item__right__button')
+	var len = buttons.length
+	var previewButtonsMoveX = 0
+
+	// 设置菜单内容部分的偏移
+	instance.requestAnimationFrame(function() {
+		instance.setStyle({
+			// 设置translateX的值
+			'transition': 'none',
+			transform: 'translateX(' + moveX + 'px)',
+			'-webkit-transform': 'translateX(' + moveX + 'px)'
+		})
+		// 折叠按钮动画
+		for (var i = len - 1; i >= 0; i--) {
+			// 通过比例,得出元素自身该移动的距离
+			var translateX = state.buttons[i].width / state.buttonsWidth * moveX
+			// 最终移动的距离,是通过自身比例算出的距离,再加上在它之前所有按钮移动的距离之和
+			var realTranslateX = translateX + previewButtonsMoveX
+			buttons[i].setStyle({
+				// 在移动期间,不能使用过渡效果,否则会造成卡顿,本质原因是每次移动一点,就要花一定时间去过渡这个过程
+				'transition': 'none',
+				'transform': 'translateX(' + realTranslateX + 'px)',
+				'-webkit-transform': 'translateX(' + realTranslateX + 'px)'
+			})
+			// 记录本按钮之前的所有按钮的移动距离之和
+			previewButtonsMoveX += translateX
+		}
+	})
+}
+
+// 一次性展开滑动菜单
+function openSwipeAction(instance, ownerInstance) {
+	var state = instance.getState()
+	// 获取所有按钮的实例,需要通过它去设置按钮的位移
+	var buttons = ownerInstance.selectAllComponents('.u-swipe-action-item__right__button')
+	var len = buttons.length
+	// 处理duration单位问题
+	const duration = getDuration(state.duration)
+	// 展开过程中,是向左移动,所以X的偏移应该为负值
+	var buttonsWidth = -state.buttonsWidth
+	var previewButtonsMoveX = 0
+	instance.requestAnimationFrame(function() {
+		// 设置菜单主体内容
+		instance.setStyle({
+			'transition': 'transform ' + duration,
+			'transform': 'translateX(' + buttonsWidth + 'px)',
+			'-webkit-transform': 'translateX(' + buttonsWidth + 'px)',
+		})
+		// 设置各个隐藏的按钮为展开的状态
+		for (var i = len - 1; i >= 0; i--) {
+			// 通过比例,得出元素自身该移动的距离
+			var translateX = state.buttons[i].width / state.buttonsWidth * buttonsWidth
+			// 最终移动的距离,是通过自身比例算出的距离,再加上在它之前所有按钮移动的距离之和
+			var realTranslateX = translateX + previewButtonsMoveX
+			buttons[i].setStyle({
+				// 在移动期间,需要加上动画效果
+				'transition': 'transform ' + duration,
+				'transform': 'translateX(' + realTranslateX + 'px)',
+				'-webkit-transform': 'translateX(' + realTranslateX + 'px)'
+			})
+			// 记录本按钮之前的所有按钮的移动距离之和
+			previewButtonsMoveX += translateX
+		}
+	})
+	setStatus('open', instance)
+}
+
+// 标记菜单的当前状态,open-已经打开,close-已经关闭
+function setStatus(status, instance) {
+	var state = instance.getState()
+	state.status = status
+}
+
+// 一次性收起滑动菜单
+function closeSwipeAction(instance, ownerInstance) {
+	var state = instance.getState()
+	// 获取所有按钮的实例,需要通过它去设置按钮的位移
+	var buttons = ownerInstance.selectAllComponents('.u-swipe-action-item__right__button')
+	var len = buttons.length
+	// 处理duration单位问题
+	const duration = getDuration(state.duration)
+	instance.requestAnimationFrame(function() {
+		// 设置菜单主体内容
+		instance.setStyle({
+			'transition': 'transform ' + duration,
+			'transform': 'translateX(0px)',
+			'-webkit-transform': 'translateX(0px)'
+		})
+		// 设置各个隐藏的按钮为收起的状态
+		for (var i = len - 1; i >= 0; i--) {
+			buttons[i].setStyle({
+				'transition': 'transform ' + duration,
+				'transform': 'translateX(0px)',
+				'-webkit-transform': 'translateX(0px)'
+			})
+		}
+	})
+	setStatus('close', instance)
+}
+
+// show的状态发生变化
+function showChange(newValue, oldValue, ownerInstance, instance) {
+	var state = instance.getState()
+	if (state.disabled) return
+	// 打开或关闭单元格
+	if (newValue) {
+		openSwipeAction(instance, ownerInstance)
+	} else {
+		closeSwipeAction(instance, ownerInstance)
+	}
+}
+
+// 菜单尺寸发生变化
+function sizeChange(newValue, oldValue, ownerInstance, instance) {
+	// wxs内的局部变量快照
+	var state = instance.getState()
+	state.disabled = newValue.disabled
+	state.duration = newValue.duration
+	state.show = newValue.show
+	state.threshold = newValue.threshold
+	state.buttons = newValue.buttons
+
+	var len = state.buttons.length
+	if (len) {
+		var buttonsWidth = 0
+		var buttons = newValue.buttons
+		for (var i = 0; i < len; i++) {
+			buttonsWidth += buttons[i].width
+		}
+	}
+	state.buttonsWidth = buttonsWidth
+}
+
+module.exports = {
+	touchstart: touchstart,
+	touchmove: touchmove,
+	touchend: touchend,
+	sizeChange: sizeChange
+}
diff --git a/uni_modules/uview-plus/components/u-swipe-action-item/index.wxs b/uni_modules/uview-plus/components/u-swipe-action-item/index.wxs
new file mode 100644
index 0000000..73e1bbb
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-swipe-action-item/index.wxs
@@ -0,0 +1,229 @@
+/**
+ * 此为wxs模块,只支持APP-VUE,微信和QQ小程序以及H5平台
+ * wxs内部不支持es6语法,变量只能使用var定义,无法使用解构,箭头函数等特性
+ */
+
+// 开始触摸
+function touchstart(event, ownerInstance) {
+	// 触发事件的组件的ComponentDescriptor实例
+	var instance = event.instance
+	// wxs内的局部变量快照,此快照是属于整个组件的,在touchstart和touchmove事件中都能获取到相同的结果
+	var state = instance.getState()
+	if (state.disabled) return
+	var touches = event.touches
+	// 如果进行的是多指触控,不允许进行操作
+	if (touches && touches.length > 1) return
+	// 标识当前为滑动中状态
+	state.moving = true
+	// 记录触摸开始点的坐标值
+	state.startX = touches[0].pageX
+	state.startY = touches[0].pageY
+	
+	ownerInstance.callMethod('closeOther')
+}
+
+// 触摸滑动
+function touchmove(event, ownerInstance) {
+	// 触发事件的组件的ComponentDescriptor实例
+	var instance = event.instance
+	// wxs内的局部变量快照
+	var state = instance.getState()
+	if (state.disabled || !state.moving) return
+	var touches = event.touches
+	var pageX = touches[0].pageX
+	var pageY = touches[0].pageY
+	var moveX = pageX - state.startX
+	var moveY = pageY - state.startY
+	var buttonsWidth = state.buttonsWidth
+
+	// 移动的X轴距离大于Y轴距离,也即终点与起点位置连线,与X轴夹角小于45度时,禁止页面滚动
+	if (Math.abs(moveX) > Math.abs(moveY) || Math.abs(moveX) > state.threshold) {
+		event.preventDefault && event.preventDefault()
+		event.stopPropagation && event.stopPropagation()
+	}
+	// 如果移动的X轴距离小于Y轴距离,也即终点位置与起点位置连线,与Y轴夹角小于45度时,认为是页面上下滑动,而不是左右滑动单元格
+	if (Math.abs(moveX) < Math.abs(moveY)) return
+
+	// 限制右滑的距离,不允许内容部分往右偏移,右滑会导致X轴偏移值大于0,以此做判断
+	// 此处不能直接return,因为滑动过程中会缺失某些关键点坐标,会导致错乱,最好的办法就是
+	// 在超出后,设置为0
+	if (state.status === 'open') {
+		// 在开启状态下,向左滑动,需忽略
+		if (moveX < 0) moveX = 0
+		// 想要收起菜单,最大能移动的距离为按钮的总宽度
+		if (moveX > buttonsWidth) moveX = buttonsWidth
+		// 如果是已经打开了的状态,向左滑动时,移动收起菜单
+		moveSwipeAction(-buttonsWidth + moveX, instance, ownerInstance)
+	} else {
+		// 关闭状态下,右滑动需忽略
+		if (moveX > 0) moveX = 0
+		// 滑动的距离不允许超过所有按钮的总宽度,此时只能是左滑,最终设置按钮的总宽度,同时为负数
+		if (Math.abs(moveX) > buttonsWidth) moveX = -buttonsWidth
+		// 只要是在滑过程中,就不断移动单元格内容部分,从而使隐藏的菜单显示出来
+		moveSwipeAction(moveX, instance, ownerInstance)
+	}
+}
+
+// 触摸结束
+function touchend(event, ownerInstance) {
+	// 触发事件的组件的ComponentDescriptor实例
+	var instance = event.instance
+	// wxs内的局部变量快照
+	var state = instance.getState()
+	if (!state.moving || state.disabled) return
+	var touches = event.changedTouches ? event.changedTouches[0] : {}
+	var pageX = touches.pageX
+	var pageY = touches.pageY
+	var moveX = pageX - state.startX
+	if (state.status === 'open') {
+		// 在展开的状态下,继续左滑,无需操作
+		if (moveX < 0) return
+		// 在开启状态下,点击一下内容区域,moveX为0,也即没有进行移动,这时执行收起菜单逻辑
+		if (moveX === 0) {
+			return closeSwipeAction(instance, ownerInstance)
+		}
+		// 在开启状态下,滑动距离小于阈值,则默认为不关闭,同时恢复原来的打开状态
+		if (Math.abs(moveX) < state.threshold) {
+			openSwipeAction(instance, ownerInstance)
+		} else {
+			// 如果滑动距离大于阈值,则执行收起逻辑
+			closeSwipeAction(instance, ownerInstance)
+		}
+	} else {
+		// 在关闭的状态下,右滑,无需操作
+		if (moveX > 0) return
+		// 理由同上
+		if (Math.abs(moveX) < state.threshold) {
+			closeSwipeAction(instance, ownerInstance)
+		} else {
+			openSwipeAction(instance, ownerInstance)
+		}
+	}
+}
+
+// 获取过渡时间
+function getDuration(value) {
+	if (value.toString().indexOf('s') >= 0) return value
+	return value > 30 ? value + 'ms' : value + 's'
+}
+
+// 滑动结束时判断滑动的方向
+function getMoveDirection(instance, ownerInstance) {
+	var state = instance.getState()
+}
+
+// 移动滑动选择器内容区域,同时显示出其隐藏的菜单
+function moveSwipeAction(moveX, instance, ownerInstance) {
+	var state = instance.getState()
+	// 获取所有按钮的实例,需要通过它去设置按钮的位移
+	var buttons = ownerInstance.selectAllComponents('.u-swipe-action-item__right__button')
+
+	// 设置菜单内容部分的偏移
+	instance.requestAnimationFrame(function() {
+		instance.setStyle({
+			// 设置translateX的值
+			'transition': 'none',
+			transform: 'translateX(' + moveX + 'px)',
+			'-webkit-transform': 'translateX(' + moveX + 'px)'
+		})
+	})
+}
+
+// 一次性展开滑动菜单
+function openSwipeAction(instance, ownerInstance) {
+	var state = instance.getState()
+	// 获取所有按钮的实例,需要通过它去设置按钮的位移
+	var buttons = ownerInstance.selectAllComponents('.u-swipe-action-item__right__button')
+	// 处理duration单位问题
+	var duration = getDuration(state.duration)
+	// 展开过程中,是向左移动,所以X的偏移应该为负值
+	var buttonsWidth = -state.buttonsWidth
+	instance.requestAnimationFrame(function() {
+		// 设置菜单主体内容
+		instance.setStyle({
+			'transition': 'transform ' + duration,
+			'transform': 'translateX(' + buttonsWidth + 'px)',
+			'-webkit-transform': 'translateX(' + buttonsWidth + 'px)',
+		})
+	})
+	setStatus('open', instance, ownerInstance)
+}
+
+// 标记菜单的当前状态,open-已经打开,close-已经关闭
+function setStatus(status, instance, ownerInstance) {
+	var state = instance.getState()
+	state.status = status
+	ownerInstance.callMethod('setState', status)
+}
+
+// 一次性收起滑动菜单
+function closeSwipeAction(instance, ownerInstance) {
+	var state = instance.getState()
+	// 获取所有按钮的实例,需要通过它去设置按钮的位移
+	var buttons = ownerInstance.selectAllComponents('.u-swipe-action-item__right__button')
+	var len = buttons.length
+	// 处理duration单位问题
+	var duration = getDuration(state.duration)
+	instance.requestAnimationFrame(function() {
+		// 设置菜单主体内容
+		instance.setStyle({
+			'transition': 'transform ' + duration,
+			'transform': 'translateX(0px)',
+			'-webkit-transform': 'translateX(0px)'
+		})
+		// 设置各个隐藏的按钮为收起的状态
+		for (var i = len - 1; i >= 0; i--) {
+			buttons[i].setStyle({
+				'transition': 'transform ' + duration,
+				'transform': 'translateX(0px)',
+				'-webkit-transform': 'translateX(0px)'
+			})
+		}
+	})
+	setStatus('close', instance, ownerInstance)
+}
+
+// status的状态发生变化
+function statusChange(newValue, oldValue, ownerInstance, instance) {
+	var state = instance.getState()
+	if (state.disabled) return
+	// 打开或关闭单元格
+	if (newValue === 'close' && state.status === 'open') {
+		closeSwipeAction(instance, ownerInstance)
+	} else if(newValue === 'open' && state.status === 'close') {
+		openSwipeAction(instance, ownerInstance)
+	}
+}
+
+// 菜单尺寸发生变化
+function sizeChange(newValue, oldValue, ownerInstance, instance) {
+	// wxs内的局部变量快照
+	var state = instance.getState()
+	// 临时防止nv_disabled报错
+	if (!state || !newValue) {
+		return;
+	}
+	state.disabled = newValue.disabled
+	state.duration = newValue.duration
+	state.show = newValue.show
+	state.threshold = newValue.threshold
+	state.buttons = newValue.buttons
+
+	if (state.buttons) {
+		var len = state.buttons.length
+		var buttonsWidth = 0
+		var buttons = newValue.buttons
+		for (var i = 0; i < len; i++) {
+			buttonsWidth += buttons[i].width
+		}
+	}
+	state.buttonsWidth = buttonsWidth
+}
+
+module.exports = {
+	touchstart: touchstart,
+	touchmove: touchmove,
+	touchend: touchend,
+	sizeChange: sizeChange,
+	statusChange: statusChange
+}
diff --git a/uni_modules/uview-plus/components/u-swipe-action-item/nvue - backup.js b/uni_modules/uview-plus/components/u-swipe-action-item/nvue - backup.js
new file mode 100644
index 0000000..f114ca6
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-swipe-action-item/nvue - backup.js	
@@ -0,0 +1,270 @@
+// nvue操作dom的库,用于获取dom的尺寸信息
+const dom = uni.requireNativePlugin('dom')
+// nvue中用于操作元素动画的库,类似于uni.animation,只不过uni.animation不能用于nvue
+const animation = uni.requireNativePlugin('animation')
+import { sleep } from '../../libs/function/index';
+export default {
+    data() {
+        return {
+            // 是否滑动中
+            moving: false,
+            // 状态,open-打开状态,close-关闭状态
+            status: 'close',
+            // 开始触摸点的X和Y轴坐标
+            startX: 0,
+            startY: 0,
+            // 所有隐藏按钮的尺寸信息数组
+            buttons: [],
+            // 所有按钮的总宽度
+            buttonsWidth: 0,
+            // 记录上一次移动的位置值
+            moveX: 0,
+            // 记录上一次滑动的位置,用于前后两次做对比,如果移动的距离小于某一阈值,则认为前后之间没有移动,为了解决可能存在的通信阻塞问题
+            lastX: 0
+        }
+    },
+    computed: {
+        // 获取过渡时间
+        getDuratin() {
+            let duration = String(this.duration)
+            // 如果ms为单位,返回ms的数值部分
+            if (duration.indexOf('ms') >= 0) return parseInt(duration)
+            // 如果s为单位,为了得到ms的数值,需要乘以1000
+            if (duration.indexOf('s') >= 0) return parseInt(duration) * 1000
+            // 如果值传了数值,且小于30,认为是s单位
+            duration = Number(duration)
+            return duration < 30 ? duration * 1000 : duration
+        }
+    },
+    watch: {
+        show: {
+            immediate: true,
+            handler(n) {
+                // if(n === true) {
+                // 	sleep(50).then(() => {
+                // 		this.openSwipeAction()
+                // 	})
+                // } else {
+                // 	this.closeSwipeAction()
+                // }
+            }
+        }
+    },
+    mounted() {
+        sleep(20).then(() => {
+            this.queryRect()
+        })
+    },
+    methods: {
+        close() {
+            this.closeSwipeAction()
+        },
+        // 触摸单元格
+        touchstart(event) {
+            if (this.disabled) return
+            this.closeOther()
+            const { touches } = event
+            // 记录触摸开始点的坐标值
+            this.startX = touches[0].pageX
+            this.startY = touches[0].pageY
+        },
+        // // 触摸滑动
+        touchmove(event) {
+            if (this.disabled) return
+            const { touches } = event
+            const { pageX } = touches[0]
+            const { pageY } = touches[0]
+            let moveX = pageX - this.startX
+            const moveY = pageY - this.startY
+            const { buttonsWidth } = this
+            const len = this.buttons.length
+
+            // 判断前后两次的移动距离,如果小于一定值,则不进行移动处理
+            if (Math.abs(pageX - this.lastX) < 0.3) return
+            this.lastX = pageX
+
+            // 移动的X轴距离大于Y轴距离,也即终点与起点位置连线,与X轴夹角小于45度时,禁止页面滚动
+            if (Math.abs(moveX) > Math.abs(moveY) || Math.abs(moveX) > this.threshold) {
+                event.stopPropagation()
+            }
+            // 如果移动的X轴距离小于Y轴距离,也即终点位置与起点位置连线,与Y轴夹角小于45度时,认为是页面上下滑动,而不是左右滑动单元格
+            if (Math.abs(moveX) < Math.abs(moveY)) return
+
+            // 限制右滑的距离,不允许内容部分往右偏移,右滑会导致X轴偏移值大于0,以此做判断
+            // 此处不能直接return,因为滑动过程中会缺失某些关键点坐标,会导致错乱,最好的办法就是
+            // 在超出后,设置为0
+            if (this.status === 'open') {
+                // 在开启状态下,向左滑动,需忽略
+                if (moveX < 0) moveX = 0
+                // 想要收起菜单,最大能移动的距离为按钮的总宽度
+                if (moveX > buttonsWidth) moveX = buttonsWidth
+                // 如果是已经打开了的状态,向左滑动时,移动收起菜单
+                this.moveSwipeAction(-buttonsWidth + moveX)
+            } else {
+                // 关闭状态下,右滑动需忽略
+                if (moveX > 0) moveX = 0
+                // 滑动的距离不允许超过所有按钮的总宽度,此时只能是左滑,最终设置按钮的总宽度,同时为负数
+                if (Math.abs(moveX) > buttonsWidth) moveX = -buttonsWidth
+                // 只要是在滑过程中,就不断移动菜单的内容部分,从而使隐藏的菜单显示出来
+                this.moveSwipeAction(moveX)
+            }
+        },
+        // 单元格结束触摸
+        touchend(event) {
+            if (this.disabled) return
+            const touches = event.changedTouches ? event.changedTouches[0] : {}
+            const { pageX } = touches
+            const { pageY } = touches
+            const { buttonsWidth } = this
+            this.moveX = pageX - this.startX
+            if (this.status === 'open') {
+                // 在展开的状态下,继续左滑,无需操作
+                if (this.moveX < 0) this.moveX = 0
+                if (this.moveX > buttonsWidth) this.moveX = buttonsWidth
+                // 在开启状态下,点击一下内容区域,moveX为0,也即没有进行移动,这时执行收起菜单逻辑
+                if (this.moveX === 0) {
+                    return this.closeSwipeAction()
+                }
+                // 在开启状态下,滑动距离小于阈值,则默认为不关闭,同时恢复原来的打开状态
+                if (Math.abs(this.moveX) < this.threshold) {
+                    this.openSwipeAction()
+                } else {
+                    // 如果滑动距离大于阈值,则执行收起逻辑
+                    this.closeSwipeAction()
+                }
+            } else {
+                // 在关闭的状态下,右滑,无需操作
+                if (this.moveX >= 0) this.moveX = 0
+                if (this.moveX <= -buttonsWidth) this.moveX = -buttonsWidth
+                // 理由同上
+                if (Math.abs(this.moveX) < this.threshold) {
+                    this.closeSwipeAction()
+                } else {
+                    this.openSwipeAction()
+                }
+            }
+        },
+        // 移动滑动选择器内容区域,同时显示出其隐藏的菜单
+        moveSwipeAction(moveX) {
+            if (this.moving) return
+            this.moving = true
+
+            let previewButtonsMoveX = 0
+            const len = this.buttons.length
+            animation.transition(this.$refs['u-swipe-action-item__content'].ref, {
+                styles: {
+                    transform: `translateX(${moveX}px)`
+                },
+                timingFunction: 'linear'
+            }, () => {
+                this.moving = false
+            })
+            // 按钮的组的长度
+            for (let i = len - 1; i >= 0; i--) {
+                const buttonRef = this.$refs[`u-swipe-action-item__right__button-${i}`][0].ref
+                // 通过比例,得出元素自身该移动的距离
+                const translateX = this.buttons[i].width / this.buttonsWidth * moveX
+                // 最终移动的距离,是通过自身比例算出的距离,再加上在它之前所有按钮移动的距离之和
+                const realTranslateX = translateX + previewButtonsMoveX
+                animation.transition(buttonRef, {
+                    styles: {
+                        transform: `translateX(${realTranslateX}px)`
+                    },
+                    duration: 0,
+                    delay: 0,
+                    timingFunction: 'linear'
+                }, () => {})
+                // 记录本按钮之前的所有按钮的移动距离之和
+                previewButtonsMoveX += translateX
+            }
+        },
+        // 关闭菜单
+        closeSwipeAction() {
+            if (this.status === 'close') return
+            this.moving = true
+            const { buttonsWidth } = this
+            animation.transition(this.$refs['u-swipe-action-item__content'].ref, {
+                styles: {
+                    transform: 'translateX(0px)'
+                },
+                duration: this.getDuratin,
+                timingFunction: 'ease-in-out'
+            }, () => {
+                this.status = 'close'
+                this.moving = false
+                this.closeHandler()
+            })
+            // 按钮的组的长度
+            const len = this.buttons.length
+            for (let i = len - 1; i >= 0; i--) {
+                const buttonRef = this.$refs[`u-swipe-action-item__right__button-${i}`][0].ref
+                // 如果不满足边界条件,返回
+                if (this.buttons.length === 0 || !this.buttons[i] || !this.buttons[i].width) return
+
+                animation.transition(buttonRef, {
+                    styles: {
+                        transform: 'translateX(0px)'
+                    },
+                    duration: this.getDuratin,
+                    timingFunction: 'ease-in-out'
+                }, () => {})
+            }
+        },
+        // 打开菜单
+        openSwipeAction() {
+            if (this.status === 'open') return
+            this.moving = true
+            const buttonsWidth = -this.buttonsWidth
+            let previewButtonsMoveX = 0
+            animation.transition(this.$refs['u-swipe-action-item__content'].ref, {
+                styles: {
+                    transform: `translateX(${buttonsWidth}px)`
+                },
+                duration: this.getDuratin,
+                timingFunction: 'ease-in-out'
+            }, () => {
+                this.status = 'open'
+                this.moving = false
+                this.openHandler()
+            })
+            // 按钮的组的长度
+            const len = this.buttons.length
+            for (let i = len - 1; i >= 0; i--) {
+                const buttonRef = this.$refs[`u-swipe-action-item__right__button-${i}`][0].ref
+                // 如果不满足边界条件,返回
+                if (this.buttons.length === 0 || !this.buttons[i] || !this.buttons[i].width) return
+                // 通过比例,得出元素自身该移动的距离
+                const translateX = this.buttons[i].width / this.buttonsWidth * buttonsWidth
+                // 最终移动的距离,是通过自身比例算出的距离,再加上在它之前所有按钮移动的距离之和
+                const realTranslateX = translateX + previewButtonsMoveX
+                animation.transition(buttonRef, {
+                    styles: {
+                        transform: `translateX(${realTranslateX}px)`
+                    },
+                    duration: this.getDuratin,
+                    timingFunction: 'ease-in-out'
+                }, () => {})
+                previewButtonsMoveX += translateX
+            }
+        },
+        // 查询按钮节点信息
+        queryRect() {
+            // 历遍所有按钮数组,通过getRectByDom返回一个promise
+            const promiseAll = this.rightOptions.map((item, index) => this.getRectByDom(this.$refs[`u-swipe-action-item__right__button-${index}`][0]))
+            // 通过promise.all方法,让所有按钮的查询结果返回一个数组的形式
+            Promise.all(promiseAll).then((sizes) => {
+                this.buttons = sizes
+                // 计算所有按钮总宽度
+                this.buttonsWidth = sizes.reduce((sum, cur) => sum + cur.width, 0)
+            })
+        },
+        // 通过nvue的dom模块,查询节点信息
+        getRectByDom(ref) {
+            return new Promise((resolve) => {
+                dom.getComponentRect(ref, (res) => {
+                    resolve(res.size)
+                })
+            })
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-swipe-action-item/nvue.js b/uni_modules/uview-plus/components/u-swipe-action-item/nvue.js
new file mode 100644
index 0000000..a48b064
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-swipe-action-item/nvue.js
@@ -0,0 +1,179 @@
+// nvue操作dom的库,用于获取dom的尺寸信息
+const dom = uni.requireNativePlugin('dom');
+const bindingX = uni.requireNativePlugin('bindingx');
+const animation = uni.requireNativePlugin('animation');
+import { getPx, getDuration } from '../../libs/function/index';
+export default {
+	data() {
+		return {
+			// 所有按钮的总宽度
+			buttonsWidth: 0,
+			// 是否正在移动中
+			moving: false
+		}
+	},
+	computed: {
+		// 获取过渡时间
+		getDuratin() {
+			let duration = String(this.duration)
+			// 如果ms为单位,返回ms的数值部分
+			if (duration.indexOf('ms') >= 0) return parseInt(duration)
+			// 如果s为单位,为了得到ms的数值,需要乘以1000
+			if (duration.indexOf('s') >= 0) return parseInt(duration) * 1000
+			// 如果值传了数值,且小于30,认为是s单位
+			duration = Number(duration)
+			return duration < 30 ? duration * 1000 : duration
+		}
+	},
+	watch: {
+		show(n) {
+			if(n) {
+				this.moveCellByAnimation('open') 
+			} else {
+				this.moveCellByAnimation('close') 
+			}
+		}
+	},
+	mounted() {
+		this.initialize()
+	},
+	methods: {
+		initialize() {
+			this.queryRect() 
+		},
+		// 关闭单元格,用于打开一个,自动关闭其他单元格的场景
+		closeHandler() {
+			if(this.status === 'open') {
+				// 如果在打开状态下,进行点击的话,直接关闭单元格
+				return this.moveCellByAnimation('close') && this.unbindBindingX()
+			}
+		},
+		// 点击单元格
+		clickHandler() {
+			// 如果在移动中被点击,进行忽略
+			if(this.moving) return
+			// 尝试关闭其他打开的单元格
+			this.parent && this.parent.closeOther(this)
+			if(this.status === 'open') {
+				// 如果在打开状态下,进行点击的话,直接关闭单元格
+				return this.moveCellByAnimation('close') && this.unbindBindingX()
+			}
+		},
+		// 滑动单元格
+		onTouchstart(e) {
+			// 如果当前正在移动中,或者disabled状态,则返回
+			if(this.moving || this.disabled) { 
+				return this.unbindBindingX()   
+			}
+			if(this.status === 'open') {
+				// 如果在打开状态下,进行点击的话,直接关闭单元格
+				return this.moveCellByAnimation('close') && this.unbindBindingX()
+			}
+			// 特殊情况下,e可能不为一个对象
+			e?.stopPropagation && e.stopPropagation() 
+			e?.preventDefault && e.preventDefault()
+			this.moving = true
+			// 获取元素ref
+			const content = this.getContentRef()
+			let expression = `min(max(${-this.buttonsWidth}, x), 0)`
+			// 尝试关闭其他打开的单元格
+			this.parent && this.parent.closeOther(this)
+			
+			// 阿里为了KPI而开源的BindingX
+			this.panEvent = bindingX.bind({
+				anchor: content,
+				eventType: 'pan',
+				props: [{
+					element: content,
+					// 绑定width属性,设置其宽度值
+					property: 'transform.translateX',
+					expression
+				}]
+			}, (res) => {
+				this.moving = false
+				if (res.state === 'end' || res.state === 'exit') {
+					const deltaX = res.deltaX
+					if(deltaX <= -this.buttonsWidth || deltaX >= 0) {
+						// 如果触摸滑动的过程中,大于单元格的总宽度,或者大于0,意味着已经动过滑动达到了打开或者关闭的状态
+						// 这里直接进行状态的标记
+						this.$nextTick(() => {
+							this.status = deltaX <= -this.buttonsWidth ? 'open' : 'close'
+						})
+					} else if(Math.abs(deltaX) > getPx(this.threshold)) {
+						// 在移动大于阈值、并且小于总按钮宽度时,进行自动打开或者关闭
+						// 移动距离大于0时,意味着需要关闭状态
+						if(Math.abs(deltaX) < this.buttonsWidth) {
+							this.moveCellByAnimation(deltaX > 0 ? 'close' : 'open')
+						}
+					} else {
+						// 在小于阈值时,进行关闭操作(如果在打开状态下,将不会执行bindingX)
+						this.moveCellByAnimation('close')
+					}
+				}
+			})
+		},
+		// 释放bindingX
+		unbindBindingX() {
+			// 释放上一次的资源
+			if (this?.panEvent?.token != 0) {
+				bindingX.unbind({
+					token: this.panEvent?.token,
+					// pan为手势事件
+					eventType: 'pan'
+				})
+			}
+		},
+		// 查询按钮节点信息
+		queryRect() {
+			// 历遍所有按钮数组,通过getRectByDom返回一个promise
+			const promiseAll = this.options.map((item, index) => {
+				return this.getRectByDom(this.$refs[`u-swipe-action-item__right__button-${index}`][0])
+			})
+			// 通过promise.all方法,让所有按钮的查询结果返回一个数组的形式
+			Promise.all(promiseAll).then(sizes => {
+				this.buttons = sizes
+				// 计算所有按钮总宽度
+				this.buttonsWidth = sizes.reduce((sum, cur) => sum + cur.width, 0)
+			})
+		},
+		// 通过nvue的dom模块,查询节点信息
+		getRectByDom(ref) {
+			return new Promise(resolve => {
+				dom.getComponentRect(ref, res => {
+					resolve(res.size)
+				})
+			}) 
+		},
+		// 移动单元格到左边或者右边尽头
+		moveCellByAnimation(status = 'open') {
+			if(this.moving) return
+			// 标识当前状态
+			this.moveing = true
+			const content = this.getContentRef()
+			const x = status === 'open' ? -this.buttonsWidth : 0 
+			animation.transition(content, {
+				styles: {
+					transform: `translateX(${x}px)`,
+				},
+				duration: getDuration(this.duration, false),
+				timingFunction: 'ease-in-out'
+			}, () => {
+				this.moving = false
+				this.status = status
+				this.unbindBindingX()
+			})
+		},
+		// 获取元素ref
+		getContentRef() {
+			return this.$refs['u-swipe-action-item__content'].ref
+		},
+		// #ifdef VUE2
+		beforeDestroy() {
+		// #endif
+		// #ifdef VUE3
+		beforeUnmount() {
+		// #endif
+			this.unbindBindingX()
+		}
+	}
+}
diff --git a/uni_modules/uview-plus/components/u-swipe-action-item/other.js b/uni_modules/uview-plus/components/u-swipe-action-item/other.js
new file mode 100644
index 0000000..6729dd1
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-swipe-action-item/other.js
@@ -0,0 +1,171 @@
+export default {
+	data() {
+		return {
+			state: {
+				moving: false,
+				startX: 0,
+				startY: 0,
+				buttonsWidth: 0
+			}
+		}
+	},
+	watch: {
+		status(newValue) {
+			if (this.disabled) return
+			// 打开或关闭单元格
+			if (newValue === 'close' && this.status === 'open') {
+				this.closeSwipeAction(instance, ownerInstance)
+			} else if(newValue === 'open' && this.status === 'close') {
+				this.openSwipeAction()
+			}
+		},
+		options(newVal) {
+			this.getBtnWidth()
+		}
+	},
+	mounted() {
+		this.getBtnWidth()
+	},
+    methods: {
+		clickHandler() {
+		},
		setStatus(status) {
			this.status = status
		},
+		getBtnWidth() {
+			let view = uni.createSelectorQuery().in(this).select(".u-swipe-action-item__right");
+			view.fields({
+				size: true,
+				scrollOffset: true
+				}, data => {
+					this.state.buttonsWidth = data.width
+					// console.log("得到节点信息" + JSON.stringify(data));
+			}).exec();
+		},
+        // 开始触摸
+        touchstart(event) {
+			// console.log(event)
+			// 标识当前为滑动中状态
+			this.state.moving = true
+			// 记录触摸开始点的坐标值
+			var touches = event.touches
+			this.state.startX = touches[0].pageX
+			this.state.startY = touches[0].pageY
+			
+			// todo关闭其它
+			// this.$parent && this.$parent.closeOther(this)
+        },
+        touchmove(event) {
+            // console.log(event)
+			if (this.disabled || !this.state.moving) return
+			var touches = event.touches
+			var pageX = touches[0].pageX
+			var pageY = touches[0].pageY
+			var moveX = pageX - this.state.startX
+			var moveY = pageY - this.state.startY
+
+			// 移动的X轴距离大于Y轴距离,也即终点与起点位置连线,与X轴夹角小于45度时,禁止页面滚动
+			if (Math.abs(moveX) > Math.abs(moveY) || Math.abs(moveX) > this.threshold) {
+				event.preventDefault && event.preventDefault()
+				event.stopPropagation && event.stopPropagation()
+			}
+			// 如果移动的X轴距离小于Y轴距离,也即终点位置与起点位置连线,与Y轴夹角小于45度时,认为是页面上下滑动,而不是左右滑动单元格
+			if (Math.abs(moveX) < Math.abs(moveY)) return
+
+			// 限制右滑的距离,不允许内容部分往右偏移,右滑会导致X轴偏移值大于0,以此做判断
+			// 此处不能直接return,因为滑动过程中会缺失某些关键点坐标,会导致错乱,最好的办法就是
+			// 在超出后,设置为0
+			if (this.status === 'open') {
+				// 在开启状态下,向左滑动,需忽略
+				if (moveX < 0) moveX = 0
+				// 想要收起菜单,最大能移动的距离为按钮的总宽度
+				if (moveX > this.state.buttonsWidth) moveX = this.state.buttonsWidth
+				// 如果是已经打开了的状态,向左滑动时,移动收起菜单
+				this.moveSwipeAction(-this.state.buttonsWidth + moveX)
+			} else {
+				// 关闭状态下,右滑动需忽略
+				if (moveX > 0) moveX = 0
+				// 滑动的距离不允许超过所有按钮的总宽度,此时只能是左滑,最终设置按钮的总宽度,同时为负数
+				if (Math.abs(moveX) > this.state.buttonsWidth) moveX = -this.state.buttonsWidth
+				// 只要是在滑过程中,就不断移动单元格内容部分,从而使隐藏的菜单显示出来
+				this.moveSwipeAction(moveX)
+			}
+        },
+        touchend(event) {
+            // console.log(event)
+			if (!this.state.moving || this.disabled) return
+			this.state.moving = false
+			var touches = event.changedTouches ? event.changedTouches[0] : {}
+			var pageX = touches.pageX
+			var pageY = touches.pageY
+			var moveX = pageX - this.state.startX
+			if (this.status === 'open') {
+				// 在展开的状态下,继续左滑,无需操作
+				if (moveX < 0) return
+				// 在开启状态下,点击一下内容区域,moveX为0,也即没有进行移动,这时执行收起菜单逻辑
+				if (moveX === 0) {
+					return this.closeSwipeAction()
+				}
+				// 在开启状态下,滑动距离小于阈值,则默认为不关闭,同时恢复原来的打开状态
+				if (Math.abs(moveX) < this.threshold) {
+					this.openSwipeAction()
+				} else {
+					// 如果滑动距离大于阈值,则执行收起逻辑
+					this.closeSwipeAction()
+				}
+			} else {
+				// 在关闭的状态下,右滑,无需操作
+				if (moveX > 0) return
+				// 理由同上
+				if (Math.abs(moveX) < this.threshold) {
+					this.closeSwipeAction()
+				} else {
+					this.openSwipeAction()
+				}
+			}
+        },
+		// 一次性展开滑动菜单
+		openSwipeAction() {
+			// 处理duration单位问题
+			var duration = this.getDuration(this.duration)
+			// 展开过程中,是向左移动,所以X的偏移应该为负值
+			var buttonsWidth = -this.state.buttonsWidth
+			this.sliderStyle = {
+				'transition': 'transform ' + duration,
+				'transform': 'translateX(' + buttonsWidth + 'px)',
+				'-webkit-transform': 'translateX(' + buttonsWidth + 'px)',
+			}
+			this.setStatus('open')
+		},
+		// 一次性收起滑动菜单
+		closeSwipeAction() {
+			// 处理duration单位问题
+			var duration = this.getDuration(this.duration)
+			this.sliderStyle = {
+				'transition': 'transform ' + duration,
+				'transform': 'translateX(0px)',
+				'-webkit-transform': 'translateX(0px)'
+			}
+			// 设置各个隐藏的按钮为收起的状态
+			// for (var i = this.state.buttonsWidth - 1; i >= 0; i--) {
+			// 	buttons[i].setStyle({
+			// 		'transition': 'transform ' + duration,
+			// 		'transform': 'translateX(0px)',
+			// 		'-webkit-transform': 'translateX(0px)'
+			// 	})
+			// }
+			this.setStatus('close')
+		},
+		// 移动滑动选择器内容区域,同时显示出其隐藏的菜单
+		moveSwipeAction(moveX) {
+			// 设置菜单内容部分的偏移
+			this.sliderStyle = {
+				'transition': 'none',
+				transform: 'translateX(' + moveX + 'px)',
+				'-webkit-transform': 'translateX(' + moveX + 'px)'
+			}
+		},
+		// 获取过渡时间
+		getDuration(value) {
+			if (value.toString().indexOf('s') >= 0) return value
+			return value > 30 ? value + 'ms' : value + 's'
+		}
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-swipe-action-item/props.js b/uni_modules/uview-plus/components/u-swipe-action-item/props.js
new file mode 100644
index 0000000..eec2513
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-swipe-action-item/props.js
@@ -0,0 +1,42 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 控制打开或者关闭
+        show: {
+            type: Boolean,
+            default: () => defProps.swipeActionItem.show
+        },
+        // 标识符,如果是v-for,可用index索引值
+        name: {
+            type: [String, Number],
+            default: () => defProps.swipeActionItem.name
+        },
+        // 是否禁用
+        disabled: {
+            type: Boolean,
+            default: () => defProps.swipeActionItem.disabled
+        },
+        // 是否自动关闭其他swipe按钮组
+        autoClose: {
+            type: Boolean,
+            default: () => defProps.swipeActionItem.autoClose
+        },
+        // 滑动距离阈值,只有大于此值,才被认为是要打开菜单
+        threshold: {
+            type: Number,
+            default: () => defProps.swipeActionItem.threshold
+        },
+        // 右侧按钮内容
+        options: {
+            type: Array,
+            default() {
+                return defProps.swipeActionItem.rightOptions
+            }
+        },
+        // 动画过渡时间,单位ms
+        duration: {
+            type: [String, Number],
+            default: () => defProps.swipeActionItem.duration
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-swipe-action-item/u-swipe-action-item.vue b/uni_modules/uview-plus/components/u-swipe-action-item/u-swipe-action-item.vue
new file mode 100644
index 0000000..35453d0
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-swipe-action-item/u-swipe-action-item.vue
@@ -0,0 +1,229 @@
+<template>	
+	<!-- #ifdef MP-ALIPAY -->
+	<!-- <import-sjs from="./alipay.sjs" name="mysjs" /> -->
+	<!-- #endif -->
+	<view class="u-swipe-action-item" ref="u-swipe-action-item">
+		<view class="u-swipe-action-item__right">
+			<slot name="button">
+				<view v-for="(item,index) in options" :key="index" class="u-swipe-action-item__right__button"
+					:ref="`u-swipe-action-item__right__button-${index}`" :style="[{
+						alignItems: item.style && item.style.borderRadius ? 'center' : 'stretch'
+					}]" @tap="buttonClickHandler(item, index)">
+					<view class="u-swipe-action-item__right__button__wrapper" :style="[{
+							backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD',
+							borderRadius: item.style && item.style.borderRadius ? item.style.borderRadius : '0',
+							padding: item.style && item.style.borderRadius ? '0' : '0 15px',
+						}, item.style]">
+						<u-icon v-if="item.icon" :name="item.icon"
+							:color="item.style && item.style.color ? item.style.color : '#ffffff'"
+							:size="item.iconSize ? addUnit(item.iconSize) : item.style && item.style.fontSize ? getPx(item.style.fontSize) * 1.2 : 17"
+							:customStyle="{
+								marginRight: item.text ? '2px' : 0
+							}"></u-icon>
+						<text v-if="item.text" class="u-swipe-action-item__right__button__wrapper__text u-line-1"
+							:style="[{
+								color: item.style && item.style.color ? item.style.color : '#ffffff',
+								fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px',
+								lineHeight: item.style && item.style.fontSize ? item.style.fontSize : '16px',
+							}]">{{ item.text }}</text>
+					</view>
+				</view>
+			</slot>
+		</view>
+		<!-- #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5  -->
+		<view class="u-swipe-action-item__content" @touchstart="wxs.touchstart" @touchmove="wxs.touchmove"
+			@touchend="wxs.touchend" :status="status" :change:status="wxs.statusChange" :size="size"
+			:change:size="wxs.sizeChange">
+			<slot></slot>
+		</view>
+		<!-- #endif -->
+		<!-- #ifdef MP-ALIPAY || MP-BAIDU || MP-TOUTIAO-->
+		<view class="u-swipe-action-item__content" @click="clickHandler" @touchstart="touchstart" @touchmove="touchmove"
+			@touchend="touchend" :style="sliderStyle">
+			<slot></slot>
+		</view>
+		<!-- <view class="u-swipe-action-item__content" @touchstart="mysjs.touchstart" @touchmove="mysjs.touchmove"
+			@touchend="mysjs.touchend">
+			<slot></slot>
+		</view> -->
+		<!-- #endif -->
+		<!-- #ifdef APP-NVUE -->
+		<view class="u-swipe-action-item__content" ref="u-swipe-action-item__content" @panstart="onTouchstart"
+			@tap="clickHandler">
+			<slot></slot>
+		</view>
+		<!-- #endif -->
+	</view>
+</template>
+<!-- #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5 -->
+<script src="./index.wxs" module="wxs" lang="wxs"></script>
+<!-- #endif -->
+<script>
+	import touch from '../../libs/mixin/touch.js'
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addUnit, getPx, sleep } from '../../libs/function/index';
+	// #ifdef APP-NVUE
+	import nvue from './nvue.js';
+	// #endif
+	// #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5
+	import wxs from './wxs.js';
+	// #endif
+	// #ifdef MP-ALIPAY || MP-BAIDU || MP-TOUTIAO
+	import other from './other.js';
+	// #endif
+	/**
+	 * SwipeActionItem 滑动单元格子组件
+	 * @description 该组件一般用于左滑唤出操作菜单的场景,用的最多的是左滑删除操作
+	 * @tutorial https://ijry.github.io/uview-plus/components/swipeAction.html
+	 * @property {Boolean}			show			控制打开或者关闭(默认 false )
+	 * @property {String | Number}	index			标识符,如果是v-for,可用index索引
+	 * @property {Boolean}			disabled		是否禁用(默认 false )
+	 * @property {Boolean}			autoClose		是否自动关闭其他swipe按钮组(默认 true )
+	 * @property {Number}			threshold		滑动距离阈值,只有大于此值,才被认为是要打开菜单(默认 30 )
+	 * @property {Array}			options			右侧按钮内容
+	 * @property {String | Number}	duration		动画过渡时间,单位ms(默认 350 )
+	 * @event {Function(index)}	open	组件打开时触发
+	 * @event {Function(index)}	close	组件关闭时触发
+	 * @example	<u-swipe-action><u-swipe-action-item :options="options1" ></u-swipe-action-item></u-swipe-action>
+	 */
+	export default {
+		name: 'u-swipe-action-item',
+		emits: ['click'],
+		
+		mixins: [
+			mpMixin,
+			mixin,
+			// #ifndef APP-NVUE
+			touch,
+			// #endif
+			// #ifdef APP-NVUE
+			nvue,
+			// #endif
+			// #ifdef APP-VUE || MP-WEIXIN || H5 || MP-QQ || H5
+			wxs,
+			// #endif
+			// #ifdef MP-ALIPAY || MP-BAIDU || MP-TOUTIAO
+			other,
+			// #endif
+			props
+		],
+		data() {
+			return {
+				// 按钮的尺寸信息
+				size: {},
+				// 父组件u-swipe-action的参数
+				parentData: {
+					autoClose: true,
+				},
+				// 当前状态,open-打开,close-关闭
+				status: 'close',
+				sliderStyle: {}
+			}
+		},
+		watch: {
+			// 由于wxs无法直接读取外部的值,需要在外部值变化时,重新执行赋值逻辑
+			// #ifndef APP-NVUE
+			wxsInit(newValue, oldValue) {
+				this.queryRect()
+			}
+			// #endif
+		},
+		computed: {
+			wxsInit() {
+				return [this.disabled, this.autoClose, this.threshold, this.options, this.duration]
+			}
+		},
+		mounted() {
+			this.init()
+		},
+		methods: {
+			addUnit,
+			getPx,
+			init() {
+				// 初始化父组件数据
+				this.updateParentData()
+				// #ifndef APP-NVUE
+				sleep().then(() => {
+					this.queryRect()
+				})
+				// #endif
+			},
+			updateParentData() {
+				// 此方法在mixin中
+				this.getParentData('u-swipe-action')
+			},
+			// #ifndef APP-NVUE
+			// 查询节点
+			queryRect() {
+				this.$uGetRect('.u-swipe-action-item__right__button', true).then(buttons => {
+					this.size = {
+						buttons,
+						show: this.show,
+						disabled: this.disabled,
+						threshold: this.threshold,
+						duration: this.duration
+					}
+				})
+			},
+			// #endif
+			// 按钮被点击
+			buttonClickHandler(item, index) {
+				this.$emit('click', {
+					index,
+					name: this.name
+				})
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-swipe-action-item {
+		position: relative;
+		overflow: hidden;
+		/* #ifndef APP-NVUE || MP-WEIXIN */
+		touch-action: pan-y;
+		/* #endif */
+
+		&__content {
+            transform: translateX(0px); // 修复某些情况下默认右侧按钮是展开的问题
+			background-color: #FFFFFF;
+			z-index: 10;
+		}
+
+		&__right {
+			position: absolute;
+			top: 0;
+			bottom: 0;
+			right: 0;
+			@include flex;
+
+			&__button {
+				@include flex;
+				justify-content: center;
+				overflow: hidden;
+				align-items: center;
+
+				&__wrapper {
+					@include flex;
+					align-items: center;
+					justify-content: center;
+					padding: 0 15px;
+
+					&__text {
+						@include flex;
+						align-items: center;
+						color: #FFFFFF;
+						font-size: 15px;
+						text-align: center;
+						justify-content: center;
+					}
+				}
+			}
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-swipe-action-item/wxs.js b/uni_modules/uview-plus/components/u-swipe-action-item/wxs.js
new file mode 100644
index 0000000..ee49c10
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-swipe-action-item/wxs.js
@@ -0,0 +1,15 @@
+export default {
+    methods: {
+        // 关闭时执行
+        closeHandler() {
+            this.status = 'close'
+        },
+        setState(status) {
+            this.status = status
+        },
+        closeOther() {
+            // 尝试关闭其他打开的单元格
+            this.parent && this.parent.closeOther(this)
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-swipe-action/props.js b/uni_modules/uview-plus/components/u-swipe-action/props.js
new file mode 100644
index 0000000..85bd999
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-swipe-action/props.js
@@ -0,0 +1,10 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 是否自动关闭其他swipe按钮组
+        autoClose: {
+            type: Boolean,
+            default: () => defProps.swipeAction.autoClose
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-swipe-action/u-swipe-action.vue b/uni_modules/uview-plus/components/u-swipe-action/u-swipe-action.vue
new file mode 100644
index 0000000..fc5f603
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-swipe-action/u-swipe-action.vue
@@ -0,0 +1,69 @@
+<template>
+	<view class="u-swipe-action">
+		<slot></slot>
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	/**
+	 * SwipeAction 滑动单元格 
+	 * @description 该组件一般用于左滑唤出操作菜单的场景,用的最多的是左滑删除操作
+	 * @tutorial https://ijry.github.io/uview-plus/components/swipeAction.html
+	 * @property {Boolean}	autoClose	是否自动关闭其他swipe按钮组
+	 * @event {Function(index)}	click	点击组件时触发
+	 * @example	<u-swipe-action><u-swipe-action-item :rightOptions="options1" ></u-swipe-action-item></u-swipe-action>
+	 */
+	export default {
+		name: 'u-swipe-action',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {}
+		},
+		provide() {
+			return {
+				swipeAction: this
+			}
+		},
+		computed: {
+			// 这里computed的变量,都是子组件u-swipe-action-item需要用到的,由于头条小程序的兼容性差异,子组件无法实时监听父组件参数的变化
+			// 所以需要手动通知子组件,这里返回一个parentData变量,供watch监听,在其中去通知每一个子组件重新从父组件(u-swipe-action-item)
+			// 拉取父组件新的变化后的参数
+			parentData() {
+				return [this.autoClose]
+			}
+		},
+		watch: {
+			// 当父组件需要子组件需要共享的参数发生了变化,手动通知子组件
+			parentData() {
+				if (this.children.length) {
+					this.children.map(child => {
+						// 判断子组件(u-swipe-action-item)如果有updateParentData方法的话,就就执行(执行的结果是子组件重新从父组件拉取了最新的值)
+						typeof(child.updateParentData) === 'function' && child.updateParentData()
+					})
+				}
+			},
+		},
+		created() {
+			this.children = []
+		},
+		methods: {
+			closeOther(child) {
+				if (this.autoClose) {
+					// 历遍所有的单元格,找出非当前操作中的单元格,进行关闭
+					this.children.map((item, index) => {
+						if (child !== item) {
+							item.closeHandler()
+						}
+					})
+				}
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+
+</style>
diff --git a/uni_modules/uview-plus/components/u-swiper-indicator/props.js b/uni_modules/uview-plus/components/u-swiper-indicator/props.js
new file mode 100644
index 0000000..6999ece
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-swiper-indicator/props.js
@@ -0,0 +1,30 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 轮播的长度
+        length: {
+            type: [String, Number],
+            default: () => defProps.swiperIndicator.length
+        },
+        // 当前处于活动状态的轮播的索引
+        current: {
+            type: [String, Number],
+            default: () => defProps.swiperIndicator.current
+        },
+        // 指示器非激活颜色
+        indicatorActiveColor: {
+            type: String,
+            default: () => defProps.swiperIndicator.indicatorActiveColor
+        },
+        // 指示器的激活颜色
+        indicatorInactiveColor: {
+            type: String,
+            default: () => defProps.swiperIndicator.indicatorInactiveColor
+        },
+		// 指示器模式,line-线型,dot-点型
+		indicatorMode: {
+		    type: String,
+		    default: () => defProps.swiperIndicator.indicatorMode
+		}
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-swiper-indicator/u-swiper-indicator.vue b/uni_modules/uview-plus/components/u-swiper-indicator/u-swiper-indicator.vue
new file mode 100644
index 0000000..0ffc2a1
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-swiper-indicator/u-swiper-indicator.vue
@@ -0,0 +1,115 @@
+<template>
+	<view class="u-swiper-indicator">
+		<view
+			class="u-swiper-indicator__wrapper"
+			v-if="indicatorMode === 'line'"
+			:class="[`u-swiper-indicator__wrapper--${indicatorMode}`]"
+			:style="{
+				width: addUnit(lineWidth * length),
+				backgroundColor: indicatorInactiveColor
+			}"
+		>
+			<view
+				class="u-swiper-indicator__wrapper--line__bar"
+				:style="[lineStyle]"
+			></view>
+		</view>
+		<view
+			class="u-swiper-indicator__wrapper"
+			v-if="indicatorMode === 'dot'"
+		>
+			<view
+				class="u-swiper-indicator__wrapper__dot"
+				v-for="(item, index) in length"
+				:key="index"
+				:class="[index === current && 'u-swiper-indicator__wrapper__dot--active']"
+				:style="[dotStyle(index)]"
+			>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addUnit } from '../../libs/function/index';
+	/**
+	 * SwiperIndicator 轮播图指示器
+	 * @description 该组件一般用于导航轮播,广告展示等场景,可开箱即用,
+	 * @tutorial https://ijry.github.io/uview-plus/components/swiper.html
+	 * @property {String | Number}	length					轮播的长度(默认 0 )
+	 * @property {String | Number}	current					当前处于活动状态的轮播的索引(默认 0 )
+	 * @property {String}			indicatorActiveColor	指示器非激活颜色
+	 * @property {String}			indicatorInactiveColor	指示器的激活颜色
+	 * @property {String}			indicatorMode			指示器模式(默认 'line' )
+	 * @example	<u-swiper :list="list4" indicator keyName="url" :autoplay="false"></u-swiper>
+	 */
+	export default {
+		name: 'u-swiper-indicator',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				lineWidth: 22
+			}
+		},
+		computed: {
+			// 指示器为线型的样式
+			lineStyle() {
+				let style = {}
+				style.width = addUnit(this.lineWidth)
+				style.transform = `translateX(${ addUnit(this.current * this.lineWidth) })`
+				style.backgroundColor = this.indicatorActiveColor
+				return style
+			},
+			// 指示器为点型的样式
+			dotStyle() {
+				return index => {
+					let style = {}
+					style.backgroundColor = index === this.current ? this.indicatorActiveColor : this.indicatorInactiveColor
+					return style
+				}
+			}
+		},
+		methods: {
+			addUnit
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-swiper-indicator {
+
+		&__wrapper {
+			@include flex;
+
+			&--line {
+				border-radius: 100px;
+				height: 4px;
+
+				&__bar {
+					width: 22px;
+					height: 4px;
+					border-radius: 100px;
+					background-color: #FFFFFF;
+					transition: transform 0.3s;
+				}
+			}
+
+			&__dot {
+				width: 5px;
+				height: 5px;
+				border-radius: 100px;
+				margin: 0 4px;
+
+				&--active {
+					width: 12px;
+				}
+			}
+
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-swiper/props.js b/uni_modules/uview-plus/components/u-swiper/props.js
new file mode 100644
index 0000000..99df529
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-swiper/props.js
@@ -0,0 +1,126 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 列表数组,元素可为字符串,如为对象可通过keyName指定目标属性名
+        list: {
+            type: Array,
+            default: () => defProps.swiper.list
+        },
+        // 是否显示面板指示器
+        indicator: {
+            type: Boolean,
+            default: () => defProps.swiper.indicator
+        },
+        // 指示器非激活颜色
+        indicatorActiveColor: {
+            type: String,
+            default: () => defProps.swiper.indicatorActiveColor
+        },
+        // 指示器的激活颜色
+        indicatorInactiveColor: {
+            type: String,
+            default: () => defProps.swiper.indicatorInactiveColor
+        },
+        // 指示器样式,可通过bottom,left,right进行定位
+        indicatorStyle: {
+            type: [String, Object],
+            default: () => defProps.swiper.indicatorStyle
+        },
+        // 指示器模式,line-线型,dot-点型
+        indicatorMode: {
+            type: String,
+            default: () => defProps.swiper.indicatorMode
+        },
+        // 是否自动切换
+        autoplay: {
+            type: Boolean,
+            default: () => defProps.swiper.autoplay
+        },
+        // 当前所在滑块的 index
+        current: {
+            type: [String, Number],
+            default: () => defProps.swiper.current
+        },
+        // 当前所在滑块的 item-id ,不能与 current 被同时指定
+        currentItemId: {
+            type: String,
+            default: () => defProps.swiper.currentItemId
+        },
+        // 滑块自动切换时间间隔
+        interval: {
+            type: [String, Number],
+            default: () => defProps.swiper.interval
+        },
+        // 滑块切换过程所需时间
+        duration: {
+            type: [String, Number],
+            default: () => defProps.swiper.duration
+        },
+        // 播放到末尾后是否重新回到开头
+        circular: {
+            type: Boolean,
+            default: () => defProps.swiper.circular
+        },
+        // 前边距,可用于露出前一项的一小部分,nvue和支付宝不支持
+        previousMargin: {
+            type: [String, Number],
+            default: () => defProps.swiper.previousMargin
+        },
+        // 后边距,可用于露出后一项的一小部分,nvue和支付宝不支持
+        nextMargin: {
+            type: [String, Number],
+            default: () => defProps.swiper.nextMargin
+        },
+        // 当开启时,会根据滑动速度,连续滑动多屏,支付宝不支持
+        acceleration: {
+            type: Boolean,
+            default: () => defProps.swiper.acceleration
+        },
+        // 同时显示的滑块数量,nvue、支付宝小程序不支持
+        displayMultipleItems: {
+            type: Number,
+            default: () => defProps.swiper.displayMultipleItems
+        },
+        // 指定swiper切换缓动动画类型,有效值:default、linear、easeInCubic、easeOutCubic、easeInOutCubic
+        // 只对微信小程序有效
+        easingFunction: {
+            type: String,
+            default: () => defProps.swiper.easingFunction
+        },
+        // list数组中指定对象的目标属性名
+        keyName: {
+            type: String,
+            default: () => defProps.swiper.keyName
+        },
+        // 图片的裁剪模式
+        imgMode: {
+            type: String,
+            default: () => defProps.swiper.imgMode
+        },
+        // 组件高度
+        height: {
+            type: [String, Number],
+            default: () => defProps.swiper.height
+        },
+        // 背景颜色
+        bgColor: {
+            type: String,
+            default: () => defProps.swiper.bgColor
+        },
+        // 组件圆角,数值或带单位的字符串
+        radius: {
+            type: [String, Number],
+            default: () => defProps.swiper.radius
+        },
+        // 是否加载中
+        loading: {
+            type: Boolean,
+            default: () => defProps.swiper.loading
+        },
+        // 是否显示标题,要求数组对象中有title属性
+        showTitle: {
+            type: Boolean,
+            default: () => defProps.swiper.showTitle
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-swiper/u-swiper.vue b/uni_modules/uview-plus/components/u-swiper/u-swiper.vue
new file mode 100644
index 0000000..4bdff4f
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-swiper/u-swiper.vue
@@ -0,0 +1,267 @@
+<template>
+	<view
+		class="u-swiper"
+		:style="{
+			backgroundColor: bgColor,
+			height: addUnit(height),
+			borderRadius: addUnit(radius)
+		}"
+	>
+		<view
+			class="u-swiper__loading"
+			v-if="loading"
+		>
+			<u-loading-icon mode="circle"></u-loading-icon>
+		</view>
+		<swiper
+			v-else
+			class="u-swiper__wrapper"
+			:style="{
+				flex: '1',
+				height: addUnit(height)
+			}"
+			@change="change"
+			:circular="circular"
+			:interval="interval"
+			:duration="duration"
+			:autoplay="autoplay"
+			:current="current"
+			:currentItemId="currentItemId"
+			:previousMargin="addUnit(previousMargin)"
+			:nextMargin="addUnit(nextMargin)"
+			:acceleration="acceleration"
+			:displayMultipleItems="displayMultipleItems"
+			:easingFunction="easingFunction"
+		>
+			<swiper-item
+				class="u-swiper__wrapper__item"
+				v-for="(item, index) in list"
+				:key="index"
+			>
+				<view
+					class="u-swiper__wrapper__item__wrapper"
+					:style="[itemStyle(index)]"
+				>
+					<!-- 在nvue中,image图片的宽度默认为屏幕宽度,需要通过flex:1撑开,另外必须设置高度才能显示图片 -->
+					<image
+						class="u-swiper__wrapper__item__wrapper__image"
+						v-if="getItemType(item) === 'image'"
+						:src="getSource(item)"
+						:mode="imgMode"
+						@tap="clickHandler(index)"
+						:style="{
+							height: addUnit(height),
+							borderRadius: addUnit(radius)
+						}"
+					></image>
+					<video
+						class="u-swiper__wrapper__item__wrapper__video"
+						v-if="getItemType(item) === 'video'"
+						:id="`video-${index}`"
+						:enable-progress-gesture="false"
+						:src="getSource(item)"
+						:poster="getPoster(item)"
+						:title="showTitle && testObject(item) && item.title ? item.title : ''"
+						:style="{
+							height: addUnit(height)
+						}"
+						controls
+						@tap="clickHandler(index)"
+					></video>
+					<text
+						v-if="showTitle && testObject(item) && item.title && testImage(getSource(item))"
+						class="u-swiper__wrapper__item__wrapper__title u-line-1"
+					>{{ item.title }}</text>
+				</view>
+			</swiper-item>
+		</swiper>
+		<view class="u-swiper__indicator" :style="[addStyle(indicatorStyle)]">
+			<slot name="indicator">
+				<u-swiper-indicator
+					v-if="!loading && indicator && !showTitle"
+					:indicatorActiveColor="indicatorActiveColor"
+					:indicatorInactiveColor="indicatorInactiveColor"
+					:length="list.length"
+					:current="currentIndex"
+					:indicatorMode="indicatorMode"
+				></u-swiper-indicator>
+			</slot>
+		</view>
+	</view>
+</template>
+<script>
+	import props from './props.js';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addUnit, addStyle, error } from '../../libs/function/index';
+	import test from '../../libs/function/test';
+	/**
+	 * Swiper 轮播图
+	 * @description 该组件一般用于导航轮播,广告展示等场景,可开箱即用,
+	 * @tutorial https://ijry.github.io/uview-plus/components/swiper.html
+	 * @property {Array}			list					轮播图数据
+	 * @property {Boolean}			indicator				是否显示面板指示器(默认 false )
+	 * @property {String}			indicatorActiveColor	指示器非激活颜色(默认 '#FFFFFF' )
+	 * @property {String}			indicatorInactiveColor	指示器的激活颜色(默认 'rgba(255, 255, 255, 0.35)' )
+	 * @property {String | Object}	indicatorStyle			指示器样式,可通过bottom,left,right进行定位
+	 * @property {String}			indicatorMode			指示器模式(默认 'line' )
+	 * @property {Boolean}			autoplay				是否自动切换(默认 true )
+	 * @property {String | Number}	current					当前所在滑块的 index(默认 0 )
+	 * @property {String}			currentItemId			当前所在滑块的 item-id ,不能与 current 被同时指定
+	 * @property {String | Number}	interval				滑块自动切换时间间隔(ms)(默认 3000 )
+	 * @property {String | Number}	duration				滑块切换过程所需时间(ms)(默认 300 )
+	 * @property {Boolean}			circular				播放到末尾后是否重新回到开头(默认 false )
+	 * @property {String | Number}	previousMargin			前边距,可用于露出前一项的一小部分,nvue和支付宝不支持(默认 0 )
+	 * @property {String | Number}	nextMargin				后边距,可用于露出后一项的一小部分,nvue和支付宝不支持(默认 0 )
+	 * @property {Boolean}			acceleration			当开启时,会根据滑动速度,连续滑动多屏,支付宝不支持(默认 false )
+	 * @property {Number}			displayMultipleItems	同时显示的滑块数量,nvue、支付宝小程序不支持(默认 1 )
+	 * @property {String}			easingFunction			指定swiper切换缓动动画类型, 只对微信小程序有效(默认 'default' )
+	 * @property {String}			keyName					list数组中指定对象的目标属性名(默认 'url' )
+	 * @property {String}			imgMode					图片的裁剪模式(默认 'aspectFill' )
+	 * @property {String | Number}	height					组件高度(默认 130 )
+	 * @property {String}			bgColor					背景颜色(默认 	'#f3f4f6' )
+	 * @property {String | Number}	radius					组件圆角,数值或带单位的字符串(默认 4 )
+	 * @property {Boolean}			loading					是否加载中(默认 false )
+	 * @property {Boolean}			showTitle				是否显示标题,要求数组对象中有title属性(默认 false )
+	 * @event {Function(index)}	click	点击轮播图时触发	index:点击了第几张图片,从0开始
+	 * @event {Function(index)}	change	轮播图切换时触发(自动或者手动切换)	index:切换到了第几张图片,从0开始
+	 * @example	<u-swiper :list="list4" keyName="url" :autoplay="false"></u-swiper>
+	 */
+	export default {
+		name: 'u-swiper',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				currentIndex: 0
+			}
+		},
+		watch: {
+			current(val, preVal) {
+				if(val === preVal) return;
+				this.currentIndex = val; // 和上游数据关联上
+			}
+		},
+		emits: ["click", "change"],
+		computed: {
+			itemStyle() {
+				return index => {
+					const style = {}
+					// #ifndef APP-NVUE || MP-TOUTIAO
+					// 左右流出空间的写法不支持nvue和头条
+					// 只有配置了此二值,才加上对应的圆角,以及缩放
+					if (this.nextMargin && this.previousMargin) {
+						style.borderRadius = addUnit(this.radius)
+						if (index !== this.currentIndex) style.transform = 'scale(0.92)'
+					}
+					// #endif
+					return style
+				}
+			}
+		},
+		methods: {
+			addStyle,
+			addUnit,
+			testObject: test.object,
+			testImage: test.image,
+			getItemType(item) {
+				if (typeof item === 'string') return test.video(this.getSource(item)) ? 'video' : 'image'
+				if (typeof item === 'object' && this.keyName) {
+				if (!item.type) return test.video(this.getSource(item)) ? 'video' : 'image'
+				if (item.type === 'image') return 'image'
+				if (item.type === 'video') return 'video'
+				return 'image'
+				}
+			},
+			// 获取目标路径,可能数组中为字符串,对象的形式,额外可指定对象的目标属性名keyName
+			getSource(item) {
+				if (typeof item === 'string') return item
+				if (typeof item === 'object' && this.keyName) return item[this.keyName]
+				else error('请按格式传递列表参数')
+				return ''
+			},
+			// 轮播切换事件
+			change(e) {
+				// 当前的激活索引
+				const {
+					current
+				} = e.detail
+				this.pauseVideo(this.currentIndex)
+				this.currentIndex = current
+				this.$emit('change', e.detail)
+			},
+			// 切换轮播时,暂停视频播放
+			pauseVideo(index) {
+				const lastItem = this.getSource(this.list[index])
+				if (test.video(lastItem)) {
+					// 当视频隐藏时,暂停播放
+					const video = uni.createVideoContext(`video-${index}`, this)
+					video.pause()
+				}
+			},
+			// 当一个轮播item为视频时,获取它的视频海报
+			getPoster(item) {
+				return typeof item === 'object' && item.poster ? item.poster : ''
+			},
+			// 点击某个item
+			clickHandler(index) {
+				this.$emit('click', index)
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+	
+	.u-swiper__wrapper {
+		flex: 1;
+	}
+	.u-swiper {
+		@include flex;
+		justify-content: center;
+		align-items: center;
+		position: relative;
+		overflow: hidden;
+
+		&__wrapper {
+			flex: 1;
+
+			&__item {
+				flex: 1;
+
+				&__wrapper {
+					@include flex;
+					position: relative;
+					overflow: hidden;
+					transition: transform 0.3s;
+					flex: 1;
+
+					&__image {
+						flex: 1;
+					}
+
+					&__video {
+						flex: 1;
+					}
+
+					&__title {
+						position: absolute;
+						background-color: rgba(0, 0, 0, 0.3);
+						bottom: 0;
+						left: 0;
+						right: 0;
+						font-size: 28rpx;
+						padding: 12rpx 24rpx;
+						color: #FFFFFF;
+						flex: 1;
+					}
+				}
+			}
+		}
+
+		&__indicator {
+			position: absolute;
+			bottom: 10px;
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-switch/props.js b/uni_modules/uview-plus/components/u-switch/props.js
new file mode 100644
index 0000000..154ed5d
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-switch/props.js
@@ -0,0 +1,63 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 是否为加载中状态
+        loading: {
+            type: Boolean,
+            default: () => defProps.switch.loading
+        },
+        // 是否为禁用装填
+        disabled: {
+            type: Boolean,
+            default: () => defProps.switch.disabled
+        },
+        // 开关尺寸,单位px
+        size: {
+            type: [String, Number],
+            default: () => defProps.switch.size
+        },
+        // 打开时的背景颜色
+        activeColor: {
+            type: String,
+            default: () => defProps.switch.activeColor
+        },
+        // 关闭时的背景颜色
+        inactiveColor: {
+            type: String,
+            default: () => defProps.switch.inactiveColor
+        },
+        // 通过v-model双向绑定的值
+        // #ifdef VUE3
+        modelValue: {
+            type: [Boolean, String, Number],
+            default: () => defProps.switch.value
+        },
+        // #endif
+        // #ifdef VUE2
+        value: {
+            type: [Boolean, String, Number],
+            default: () => defProps.switch.value
+        },
+        // #endif
+        // switch打开时的值
+        activeValue: {
+            type: [String, Number, Boolean],
+            default: () => defProps.switch.activeValue
+        },
+        // switch关闭时的值
+        inactiveValue: {
+            type: [String, Number, Boolean],
+            default: () => defProps.switch.inactiveValue
+        },
+        // 是否开启异步变更,开启后需要手动控制输入值
+        asyncChange: {
+            type: Boolean,
+            default: () => defProps.switch.asyncChange
+        },
+        // 圆点与外边框的距离
+        space: {
+            type: [String, Number],
+            default: () => defProps.switch.space
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-switch/u-switch.vue b/uni_modules/uview-plus/components/u-switch/u-switch.vue
new file mode 100644
index 0000000..b28a6bd
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-switch/u-switch.vue
@@ -0,0 +1,216 @@
+<template>
+	<view
+	    class="u-switch cursor-pointer"
+	    :class="[disabled && 'u-switch--disabled']"
+	    :style="[switchStyle, addStyle(customStyle)]"
+	    @tap="clickHandler"
+	>
+		<view
+		    class="u-switch__bg"
+		    :style="[bgStyle]"
+		>
+		</view>
+		<view
+		    class="u-switch__node"
+		    <!-- #ifdef VUE3 -->
+			:class="[modelValue && 'u-switch__node--on']"
+			<!-- #endif -->
+			<!-- #ifdef VUE2 -->
+			:class="[value && 'u-switch__node--on']"
+			<!-- #endif -->
+		    :style="[nodeStyle]"
+		    ref="u-switch__node"
+		>
+			<u-loading-icon
+			    :show="loading"
+			    mode="circle"
+			    timingFunction='linear'
+			    <!-- #ifdef VUE3 -->
+				:color="modelValue ? activeColor : '#AAABAD'"
+				<!-- #endif -->
+				<!-- #ifdef VUE2 -->
+				:color="value ? activeColor : '#AAABAD'"
+				<!-- #endif -->
+			    :size="size * 0.6"
+			/>
+		</view>
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addStyle, addUnit, error } from '../../libs/function/index';
+	/**
+	 * switch 开关选择器
+	 * @description 选择开关一般用于只有两个选择,且只能选其一的场景。
+	 * @tutorial https://ijry.github.io/uview-plus/components/switch.html
+	 * @property {Boolean}						loading			是否处于加载中(默认 false )
+	 * @property {Boolean}						disabled		是否禁用(默认 false )
+	 * @property {String | Number}				size			开关尺寸,单位px (默认 25 )
+	 * @property {String}						activeColor		打开时的背景色 (默认 '#2979ff' )
+	 * @property {String} 						inactiveColor	关闭时的背景色 (默认 '#ffffff' )
+	 * @property {Boolean | String | Number}	value			通过v-model双向绑定的值 (默认 false )
+	 * @property {Boolean | String | Number}	activeValue		打开选择器时通过change事件发出的值 (默认 true )
+	 * @property {Boolean | String | Number}	inactiveValue	关闭选择器时通过change事件发出的值 (默认 false )
+	 * @property {Boolean}						asyncChange		是否开启异步变更,开启后需要手动控制输入值 (默认 false )
+	 * @property {String | Number}				space			圆点与外边框的距离 (默认 0 )
+	 * @property {Object}						customStyle		定义需要用到的外部样式
+	 *
+	 * @event {Function} change 在switch打开或关闭时触发
+	 * @example <u-switch v-model="checked" active-color="red" inactive-color="#eee"></u-switch>
+	 */
+	export default {
+		name: "u-switch",
+		mixins: [mpMixin, mixin,props],
+		watch: {
+			// #ifdef VUE3
+			modelValue: {
+				immediate: true,
+				handler(n) {
+					if(n !== this.inactiveValue && n !== this.activeValue) {
+						error('v-model绑定的值必须为inactiveValue、activeValue二者之一')
+					}
+				}
+			},
+			// #endif
+        	// #ifdef VUE2
+			value: {
+				immediate: true,
+				handler(n) {
+					if(n !== this.inactiveValue && n !== this.activeValue) {
+						error('v-model绑定的值必须为inactiveValue、activeValue二者之一')
+					}
+				}
+			}
+			// #endif
+		},
+		data() {
+			return {
+				bgColor: '#ffffff'
+			}
+		},
+		computed: {
+			isActive(){
+				// #ifdef VUE3
+				return this.modelValue === this.activeValue;
+				// #endif
+        		// #ifdef VUE2
+				return this.value === this.activeValue;
+				// #endif
+			},
+			switchStyle() {
+				let style = {}
+				// 这里需要加2,是为了腾出边框的距离,否则圆点node会和外边框紧贴在一起
+				style.width = addUnit(this.size * 2 + 2)
+				style.height = addUnit(Number(this.size) + 2)
+				// style.borderColor = this.value ? 'rgba(0, 0, 0, 0)' : 'rgba(0, 0, 0, 0.12)'
+				// 如果自定义了“非激活”演示,name边框颜色设置为透明(跟非激活颜色一致)
+				// 这里不能简单的设置为非激活的颜色,否则打开状态时,会有边框,所以需要透明
+				if(this.customInactiveColor) {
+					style.borderColor = 'rgba(0, 0, 0, 0)'
+				}
+				style.backgroundColor = this.isActive ? this.activeColor : this.inactiveColor
+				return style;
+			},
+			nodeStyle() {
+				let style = {}
+				// 如果自定义非激活颜色,将node圆点的尺寸减少两个像素,让其与外边框距离更大一点
+				style.width = addUnit(this.size - this.space)
+				style.height = addUnit(this.size - this.space)
+				const translateX = this.isActive ? addUnit(this.space) : addUnit(this.size);
+				style.transform = `translateX(-${translateX})`
+				return style
+			},
+			bgStyle() {
+				let style = {}
+				// 这里配置一个多余的元素在HTML中,是为了让switch切换时,有更良好的背景色扩充体验(见实际效果)
+				style.width = addUnit(Number(this.size) * 2 - this.size / 2)
+				style.height = addUnit(this.size)
+				style.backgroundColor = this.inactiveColor
+				// 打开时,让此元素收缩,否则反之
+				style.transform = `scale(${this.isActive ? 0 : 1})`
+				return style
+			},
+			customInactiveColor() {
+				// 之所以需要判断是否自定义了“非激活”颜色,是为了让node圆点离外边框更宽一点的距离
+				return this.inactiveColor !== '#fff' && this.inactiveColor !== '#ffffff'
+			}
+		},
+		// #ifdef VUE3
+		emits: ['update:modelValue', 'change'],
+    	// #endif
+		methods: {
+			addStyle,
+			clickHandler() {
+				if (!this.disabled && !this.loading) {
+					const oldValue = this.isActive ? this.inactiveValue : this.activeValue
+					if(!this.asyncChange) {
+						// #ifdef VUE3
+						this.$emit("update:modelValue", oldValue);
+						// #endif
+						// #ifdef VUE2
+						this.$emit("input", oldValue);
+						// #endif
+					}
+					// 放到下一个生命周期,因为双向绑定的value修改父组件状态需要时间,且是异步的
+					this.$nextTick(() => {
+						this.$emit('change', oldValue)
+					})
+				}
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-switch {
+		@include flex(row);
+		/* #ifndef APP-NVUE */
+		box-sizing: border-box;
+		/* #endif */
+		position: relative;
+		background-color: #fff;
+		border-width: 1px;
+		border-radius: 100px;
+		transition: background-color 0.4s;
+		border-color: rgba(0, 0, 0, 0.12);
+		border-style: solid;
+		justify-content: flex-end;
+		align-items: center;
+		// 由于weex为阿里逗着玩的KPI项目,导致bug奇多,这必须要写这一行,
+		// 否则在iOS上,点击页面任意地方,都会触发switch的点击事件
+		overflow: hidden;
+
+		&__node {
+			@include flex(row);
+			align-items: center;
+			justify-content: center;
+			border-radius: 100px;
+			background-color: #fff;
+			border-radius: 100px;
+			box-shadow: 1px 1px 1px 0 rgba(0, 0, 0, 0.25);
+			transition-property: transform;
+			transition-duration: 0.4s;
+			transition-timing-function: cubic-bezier(0.3, 1.05, 0.4, 1.05);
+		}
+
+		&__bg {
+			position: absolute;
+			border-radius: 100px;
+			background-color: #FFFFFF;
+			transition-property: transform;
+			transition-duration: 0.4s;
+			border-top-left-radius: 0;
+			border-bottom-left-radius: 0;
+			transition-timing-function: ease;
+		}
+
+		&--disabled {
+			opacity: 0.6;
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-tabbar-item/props.js b/uni_modules/uview-plus/components/u-tabbar-item/props.js
new file mode 100644
index 0000000..2932a2e
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-tabbar-item/props.js
@@ -0,0 +1,36 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // item标签的名称,作为与u-tabbar的value参数匹配的标识符
+        name: {
+            type: [String, Number, null],
+            default: () => defProps.tabbarItem.name
+        },
+        // uView内置图标或者绝对路径的图片
+        icon: {
+            icon: String,
+            default: () => defProps.tabbarItem.icon
+        },
+        // 右上角的角标提示信息
+        badge: {
+            type: [String, Number, null],
+            default: () => defProps.tabbarItem.badge
+        },
+        // 是否显示圆点,将会覆盖badge参数
+        dot: {
+            type: Boolean,
+            default: () => defProps.tabbarItem.dot
+        },
+        // 描述文本
+        text: {
+            type: String,
+            default: () => defProps.tabbarItem.text
+        },
+        // 控制徽标的位置,对象或者字符串形式,可以设置top和right属性
+        badgeStyle: {
+            type: [Object, String],
+            default: () => defProps.tabbarItem.badgeStyle
+        }
+
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-tabbar-item/u-tabbar-item.vue b/uni_modules/uview-plus/components/u-tabbar-item/u-tabbar-item.vue
new file mode 100644
index 0000000..588dab5
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-tabbar-item/u-tabbar-item.vue
@@ -0,0 +1,153 @@
+<template>
+	<view
+	    class="u-tabbar-item cursor-pointer"
+	    :style="[addStyle(customStyle)]"
+	    @tap="clickHandler"
+	>
+		<view class="u-tabbar-item__icon">
+			<u-icon
+			    v-if="icon"
+			    :name="icon"
+			    :color="isActive? parentData.activeColor : parentData.inactiveColor"
+			    :size="20"
+			></u-icon>
+			<template v-else>
+				<slot
+				    v-if="isActive"
+				    name="active-icon"
+				/>
+				<slot
+				    v-else
+				    name="inactive-icon"
+				/>
+			</template>
+			<u-badge
+				absolute
+				:offset="[0, dot ? '34rpx' : badge > 9 ? '14rpx' : '20rpx']"
+			    :customStyle="badgeStyle"
+			    :isDot="dot"
+			    :value="badge || (dot ? 1 : null)"
+			    :show="dot || badge > 0"
+			></u-badge>
+		</view>
+		
+		<slot name="text">
+			<text
+			    class="u-tabbar-item__text"
+			    :style="{
+					color: isActive? parentData.activeColor : parentData.inactiveColor
+				}"
+			>{{ text }}</text>
+		</slot>
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addStyle, error } from '../../libs/function/index';
+	/**
+	 * TabbarItem 底部导航栏子组件
+	 * @description 此组件提供了自定义tabbar的能力。
+	 * @tutorial https://ijry.github.io/uview-plus/components/tabbar.html
+	 * @property {String | Number}	name		item标签的名称,作为与u-tabbar的value参数匹配的标识符
+	 * @property {String}			icon		uView内置图标或者绝对路径的图片
+	 * @property {String | Number}	badge		右上角的角标提示信息
+	 * @property {Boolean}			dot			是否显示圆点,将会覆盖badge参数(默认 false )
+	 * @property {String}			text		描述文本
+	 * @property {Object | String}	badgeStyle	控制徽标的位置,对象或者字符串形式,可以设置top和right属性(默认 'top: 6px;right:2px;' )
+	 * @property {Object}			customStyle	定义需要用到的外部样式
+	 * 
+	 * @example <u-tabbar :value="value2" :placeholder="false" @change="name => value2 = name" :fixed="false" :safeAreaInsetBottom="false"><u-tabbar-item text="首页" icon="home" dot ></u-tabbar-item></u-tabbar>
+	 */
+	export default {
+		name: 'u-tabbar-item',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				isActive: false, // 是否处于激活状态
+				parentData: {
+					value: null,
+					activeColor: '',
+					inactiveColor: ''
+				}
+			}
+		},
+		//  微信小程序中 options 选项
+		options: {
+		    virtualHost: true //将自定义节点设置成虚拟的,更加接近Vue组件的表现。我们不希望自定义组件的这个节点本身可以设置样式、响应 flex 布局等
+		},
+		created() {
+			this.init()
+		},
+		emits: ["click", "change"],
+		methods: {
+			addStyle,
+			init() {
+				// 支付宝小程序不支持provide/inject,所以使用这个方法获取整个父组件,在created定义,避免循环引用
+				this.updateParentData()
+				if (!this.parent) {
+					error('u-tabbar-item必须搭配u-tabbar组件使用')
+				}
+				// 本子组件在u-tabbar的children数组中的索引
+				const index = this.parent.children.indexOf(this)
+				// 判断本组件的name(如果没有定义name,就用index索引)是否等于父组件的value参数
+				this.isActive = (this.name || index) === this.parentData.value
+			},
+			updateParentData() {
+				// 此方法在mixin中
+				this.getParentData('u-tabbar')
+			},
+			// 此方法将会被父组件u-tabbar调用
+			updateFromParent() {
+				// 重新初始化
+				this.init()
+			},
+			clickHandler() {
+				this.$nextTick(() => {
+					const index = this.parent.children.indexOf(this)
+					const name = this.name || index
+					// 点击的item为非激活的item才发出change事件
+					if (name !== this.parent.value) {
+						this.parent.$emit('change', name)
+					}
+					this.$emit('click', name)
+				})
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+	.u-tabbar-item {
+		@include flex(column);
+		align-items: center;
+		justify-content: center;
+		flex: 1;
+		width: 100%;
+		height: 100%;
+		
+		&__icon {
+			@include flex;
+			position: relative;
+			width: 150rpx;
+			justify-content: center;
+		}
+
+		&__text {
+			margin-top: 2px;
+			font-size: 12px;
+			color: $u-content-color;
+		}
+	}
+
+	/* #ifdef MP */
+	// 由于小程序都使用shadow DOM形式实现,需要给影子宿主设置flex: 1才能让其撑开
+	:host {
+		flex: 1;
+		width: 100%;
+	}
+	/* #endif */
+</style>
diff --git a/uni_modules/uview-plus/components/u-tabbar/props.js b/uni_modules/uview-plus/components/u-tabbar/props.js
new file mode 100644
index 0000000..35a5f96
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-tabbar/props.js
@@ -0,0 +1,45 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 当前匹配项的name
+        value: {
+            type: [String, Number, null],
+            default: () => defProps.tabbar.value
+        },
+        // 是否为iPhoneX留出底部安全距离
+        safeAreaInsetBottom: {
+            type: Boolean,
+            default: () => defProps.tabbar.safeAreaInsetBottom
+        },
+        // 是否显示上方边框
+        border: {
+            type: Boolean,
+            default: () => defProps.tabbar.border
+        },
+        // 元素层级z-index
+        zIndex: {
+            type: [String, Number],
+            default: () => defProps.tabbar.zIndex
+        },
+        // 选中标签的颜色
+        activeColor: {
+            type: String,
+            default: () => defProps.tabbar.activeColor
+        },
+        // 未选中标签的颜色
+        inactiveColor: {
+            type: String,
+            default: () => defProps.tabbar.inactiveColor
+        },
+        // 是否固定在底部
+        fixed: {
+            type: Boolean,
+            default: () => defProps.tabbar.fixed
+        },
+        // fixed定位固定在底部时,是否生成一个等高元素防止塌陷
+        placeholder: {
+            type: Boolean,
+            default: () => defProps.tabbar.placeholder
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-tabbar/u-tabbar.vue b/uni_modules/uview-plus/components/u-tabbar/u-tabbar.vue
new file mode 100644
index 0000000..9c87ee9
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-tabbar/u-tabbar.vue
@@ -0,0 +1,145 @@
+<template>
+	<view class="u-tabbar">
+		<view
+		    class="u-tabbar__content"
+		    ref="u-tabbar__content"
+		    @touchmove.stop.prevent="noop"
+		    :class="[border && 'u-border-top', fixed && 'u-tabbar--fixed']"
+		    :style="[tabbarStyle]"
+		>
+			<view class="u-tabbar__content__item-wrapper">
+				<slot />
+			</view>
+			<u-safe-bottom v-if="safeAreaInsetBottom"></u-safe-bottom>
+		</view>
+		<view
+		    class="u-tabbar__placeholder"
+			v-if="placeholder"
+		    :style="{
+				height: placeholderHeight + 'px',
+			}"
+		></view>
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addStyle, deepMerge, sleep } from '../../libs/function/index';
+	// #ifdef APP-NVUE
+	const dom = uni.requireNativePlugin('dom')
+	// #endif
+	/**
+	 * Tabbar 底部导航栏
+	 * @description 此组件提供了自定义tabbar的能力。
+	 * @tutorial https://ijry.github.io/uview-plus/components/tabbar.html
+	 * @property {String | Number}	value				当前匹配项的name
+	 * @property {Boolean}			safeAreaInsetBottom	是否为iPhoneX留出底部安全距离(默认 true )
+	 * @property {Boolean}			border				是否显示上方边框(默认 true )
+	 * @property {String | Number}	zIndex				元素层级z-index(默认 1 )
+	 * @property {String}			activeColor			选中标签的颜色(默认 '#1989fa' )
+	 * @property {String}			inactiveColor		未选中标签的颜色(默认 '#7d7e80' )
+	 * @property {Boolean}			fixed				是否固定在底部(默认 true )
+	 * @property {Boolean}			placeholder			fixed定位固定在底部时,是否生成一个等高元素防止塌陷(默认 true )
+	 * @property {Object}			customStyle			定义需要用到的外部样式
+	 * 
+	 * @example <u-tabbar :value="value2" :placeholder="false" @change="name => value2 = name" :fixed="false" :safeAreaInsetBottom="false"><u-tabbar-item text="首页" icon="home" dot ></u-tabbar-item></u-tabbar>
+	 */
+	export default {
+		name: 'u-tabbar',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				placeholderHeight: 0
+			}
+		},
+		computed: {
+			tabbarStyle() {
+				const style = {
+					zIndex: this.zIndex
+				}
+				// 合并来自父组件的customStyle样式
+				return deepMerge(style, addStyle(this.customStyle))
+			},
+			// 监听多个参数的变化,通过在computed执行对应的操作
+			updateChild() {
+				return [this.value, this.activeColor, this.inactiveColor]
+			},
+			updatePlaceholder() {
+				return [this.fixed, this.placeholder]
+			}
+		},
+		watch: {
+			updateChild() {
+				// 如果updateChildren中的元素发生了变化,则执行子元素初始化操作
+				this.updateChildren()
+			},
+			updatePlaceholder() {
+				// 如果fixed,placeholder等参数发生变化,重新计算占位元素的高度
+				this.setPlaceholderHeight()
+			}
+		},
+		created() {
+			this.children = []
+		},
+		mounted() {
+			this.setPlaceholderHeight()
+		},
+		methods: {
+			updateChildren() {
+				// 如果存在子元素,则执行子元素的updateFromParent进行更新数据
+				this.children.length && this.children.map(child => child.updateFromParent())
+			},
+			// 设置用于防止塌陷元素的高度
+			async setPlaceholderHeight() {
+				if (!this.fixed || !this.placeholder) return
+				// 延时一定时间
+				await sleep(20)
+				// #ifndef APP-NVUE
+				this.$uGetRect('.u-tabbar__content').then(({height = 50}) => {
+					// 修复IOS safearea bottom 未填充高度
+					this.placeholderHeight = height
+				})
+				// #endif
+
+				// #ifdef APP-NVUE
+				dom.getComponentRect(this.$refs['u-tabbar__content'], (res) => {
+					const {
+						size
+					} = res
+					this.placeholderHeight = size.height
+				})
+				// #endif
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-tabbar {
+		@include flex(column);
+		flex: 1;
+		justify-content: center;
+		
+		&__content {
+			@include flex(column);
+			background-color: #fff;
+			
+			&__item-wrapper {
+				height: 50px;
+				@include flex(row);
+				justify-content: space-around;
+			}
+		}
+
+		&--fixed {
+			position: fixed;
+			bottom: 0;
+			left: 0;
+			right: 0;
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-table/props.js b/uni_modules/uview-plus/components/u-table/props.js
new file mode 100644
index 0000000..662c38e
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-table/props.js
@@ -0,0 +1,6 @@
+// import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-table/u-table.vue b/uni_modules/uview-plus/components/u-table/u-table.vue
new file mode 100644
index 0000000..9cb030f
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-table/u-table.vue
@@ -0,0 +1,31 @@
+<template>
+	<view class="u-table">
+		
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	/**
+	 * Table 表格 
+	 * @description 表格组件一般用于展示大量结构化数据的场景 本组件标签类似HTML的table表格,由table、tr、th、td四个组件组成
+	 * @tutorial https://ijry.github.io/uview-plus/components/table.html
+	 * @example <u-table><u-tr><u-th>学校</u-th </u-tr> <u-tr><u-td>浙江大学</u-td> </u-tr> <u-tr><u-td>清华大学</u-td> </u-tr></u-table>
+	 */
+	export default {
+		name: 'u-table',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+	
+</style>
diff --git a/uni_modules/uview-plus/components/u-tabs-item/props.js b/uni_modules/uview-plus/components/u-tabs-item/props.js
new file mode 100644
index 0000000..662c38e
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-tabs-item/props.js
@@ -0,0 +1,6 @@
+// import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-tabs-item/u-tabs-item.vue b/uni_modules/uview-plus/components/u-tabs-item/u-tabs-item.vue
new file mode 100644
index 0000000..a6fdd89
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-tabs-item/u-tabs-item.vue
@@ -0,0 +1,31 @@
+<template>
+	<swiper-item>
+		<slot />
+	</swiper-item>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	/**
+	 * TabsItem  tabs标签组件的自组件
+	 * @description tabs标签组件,在标签多的时候,可以配置为左右滑动,标签少的时候,可以禁止滑动。 该组件的一个特点是配置为滚动模式时,激活的tab会自动移动到组件的中间位置。
+	 * @tutorial https://ijry.github.io/uview-plus/components/tabs.html
+	 * @property {type}	prop_name
+	 * @event {Function()} 
+	 * @example 
+	 */
+	export default {
+		name: 'u-tabs-item',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				
+			}
+		}
+	}
+</script>
+
+<style>
+</style>
diff --git a/uni_modules/uview-plus/components/u-tabs/props.js b/uni_modules/uview-plus/components/u-tabs/props.js
new file mode 100644
index 0000000..8689e54
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-tabs/props.js
@@ -0,0 +1,65 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 滑块的移动过渡时间,单位ms
+        duration: {
+            type: Number,
+            default: () => defProps.tabs.duration
+        },
+        // tabs标签数组
+        list: {
+            type: Array,
+            default: () => defProps.tabs.list
+        },
+        // 滑块颜色
+        lineColor: {
+            type: String,
+            default: () => defProps.tabs.lineColor
+        },
+        // 菜单选择中时的样式
+        activeStyle: {
+            type: [String, Object],
+            default: () => defProps.tabs.activeStyle
+        },
+        // 菜单非选中时的样式
+        inactiveStyle: {
+            type: [String, Object],
+            default: () => defProps.tabs.inactiveStyle
+        },
+        // 滑块长度
+        lineWidth: {
+            type: [String, Number],
+            default: () => defProps.tabs.lineWidth
+        },
+        // 滑块高度
+        lineHeight: {
+            type: [String, Number],
+            default: () => defProps.tabs.lineHeight
+        },
+        // 滑块背景显示大小,当滑块背景设置为图片时使用
+        lineBgSize: {
+            type: String,
+            default: () => defProps.tabs.lineBgSize
+        },
+        // 菜单item的样式
+        itemStyle: {
+            type: [String, Object],
+            default: () => defProps.tabs.itemStyle
+        },
+        // 菜单是否可滚动
+        scrollable: {
+            type: Boolean,
+            default: () => defProps.tabs.scrollable
+        },
+		// 当前选中标签的索引
+		current: {
+			type: [Number, String],
+			default: () => defProps.tabs.current
+		},
+		// 默认读取的键名
+		keyName: {
+			type: String,
+			default: () => defProps.tabs.keyName
+		}
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-tabs/u-tabs.vue b/uni_modules/uview-plus/components/u-tabs/u-tabs.vue
new file mode 100644
index 0000000..0b69547
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-tabs/u-tabs.vue
@@ -0,0 +1,363 @@
+<template>
+	<view class="u-tabs">
+		<view class="u-tabs__wrapper">
+			<slot name="left" />
+			<view class="u-tabs__wrapper__scroll-view-wrapper">
+				<scroll-view
+					:scroll-x="scrollable"
+					:scroll-left="scrollLeft"
+					scroll-with-animation
+					class="u-tabs__wrapper__scroll-view"
+					:show-scrollbar="false"
+					ref="u-tabs__wrapper__scroll-view"
+				>
+					<view
+						class="u-tabs__wrapper__nav"
+						ref="u-tabs__wrapper__nav"
+					>
+						<view
+							class="u-tabs__wrapper__nav__item"
+							v-for="(item, index) in list"
+							:key="index"
+							@tap="clickHandler(item, index)"
+							:ref="`u-tabs__wrapper__nav__item-${index}`"
+							:style="[addStyle(itemStyle), {flex: scrollable ? '' : 1}]"
+							:class="[`u-tabs__wrapper__nav__item-${index}`, item.disabled && 'u-tabs__wrapper__nav__item--disabled']"
+						>
+							<text
+								:class="[item.disabled && 'u-tabs__wrapper__nav__item__text--disabled']"
+								class="u-tabs__wrapper__nav__item__text"
+								:style="[textStyle(index)]"
+							>{{ item[keyName] }}</text>
+							<u-badge
+								:show="!!(item.badge && (item.badge.show || item.badge.isDot || item.badge.value))"
+								:isDot="item.badge && item.badge.isDot || propsBadge.isDot"
+								:value="item.badge && item.badge.value || propsBadge.value"
+								:max="item.badge && item.badge.max || propsBadge.max"
+								:type="item.badge && item.badge.type || propsBadge.type"
+								:showZero="item.badge && item.badge.showZero || propsBadge.showZero"
+								:bgColor="item.badge && item.badge.bgColor || propsBadge.bgColor"
+								:color="item.badge && item.badge.color || propsBadge.color"
+								:shape="item.badge && item.badge.shape || propsBadge.shape"
+								:numberType="item.badge && item.badge.numberType || propsBadge.numberType"
+								:inverted="item.badge && item.badge.inverted || propsBadge.inverted"
+								customStyle="margin-left: 4px;"
+							></u-badge>
+						</view>
+						<!-- #ifdef APP-NVUE -->
+						<view
+							class="u-tabs__wrapper__nav__line"
+							ref="u-tabs__wrapper__nav__line"
+							:style="[{
+								width: addUnit(lineWidth),
+								height: addUnit(lineHeight),
+								background: lineColor,
+								backgroundSize: lineBgSize,
+							}]"
+						>
+						</view>
+						<!-- #endif -->
+						<!-- #ifndef APP-NVUE -->
+						<view
+							class="u-tabs__wrapper__nav__line"
+							ref="u-tabs__wrapper__nav__line"
+							:style="[{
+								width: addUnit(lineWidth),
+								transform: `translate(${lineOffsetLeft}px)`,
+								transitionDuration: `${firstTime ? 0 : duration}ms`,
+								height: addUnit(lineHeight),
+								background: lineColor,
+								backgroundSize: lineBgSize,
+							}]"
+						>
+						</view>
+						<!-- #endif -->
+					</view>
+				</scroll-view>
+			</view>
+			<slot name="right" />
+		</view>
+	</view>
+</template>
+
+<script>
+	// #ifdef APP-NVUE
+	const animation = uni.requireNativePlugin('animation')
+	const dom = uni.requireNativePlugin('dom')
+	// #endif
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import defProps from '../../libs/config/props.js';
+	import { addUnit, addStyle, deepMerge, getPx, sleep, sys } from '../../libs/function/index';
+	/**
+	 * Tabs 标签
+	 * @description tabs标签组件,在标签多的时候,可以配置为左右滑动,标签少的时候,可以禁止滑动。 该组件的一个特点是配置为滚动模式时,激活的tab会自动移动到组件的中间位置。
+	 * @tutorial https://ijry.github.io/uview-plus/components/tabs.html
+	 * @property {String | Number}	duration			滑块移动一次所需的时间,单位秒(默认 200 )
+	 * @property {String | Number}	swierWidth			swiper的宽度(默认 '750rpx' )
+	 * @property {String}	keyName	 从`list`元素对象中读取的键名(默认 'name' )
+	 * @event {Function(index)} change 标签改变时触发 index: 点击了第几个tab,索引从0开始
+	 * @event {Function(index)} click 点击标签时触发 index: 点击了第几个tab,索引从0开始
+	 * @example <u-tabs :list="list" :is-scroll="false" :current="current" @change="change"></u-tabs>
+	 */
+	export default {
+		name: 'u-tabs',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				firstTime: true,
+				scrollLeft: 0,
+				scrollViewWidth: 0,
+				lineOffsetLeft: 0,
+				tabsRect: {
+					left: 0
+				},
+				innerCurrent: 0,
+				moving: false,
+			}
+		},
+		watch: {
+			current: {
+				immediate: true,
+				handler (newValue, oldValue) {
+					// 内外部值不相等时,才尝试移动滑块
+					if (newValue !== this.innerCurrent) {
+						this.innerCurrent = newValue
+						this.$nextTick(() => {
+							this.resize()
+						})
+					}
+				}
+			},
+			// list变化时,重新渲染list各项信息
+			list() {
+				this.$nextTick(() => {
+					this.resize()
+				})
+			}
+		},
+		computed: {
+			textStyle() {
+				return index => {
+					const style = {}
+					// 取当期是否激活的样式
+					const customeStyle = index === this.innerCurrent ? addStyle(this.activeStyle) : uni.$u
+						.addStyle(
+							this.inactiveStyle)
+					// 如果当前菜单被禁用,则加上对应颜色,需要在此做处理,是因为nvue下,无法在style样式中通过!import覆盖标签的内联样式
+					if (this.list[index].disabled) {
+						style.color = '#c8c9cc'
+					}
+					return deepMerge(customeStyle, style)
+				}
+			},
+			propsBadge() {
+				return defProps.badge
+			}
+		},
+		async mounted() {
+			this.init()
+		},
+		emits: ['click', 'change'],
+		methods: {
+			addStyle,
+			addUnit,
+			setLineLeft() {
+				const tabItem = this.list[this.innerCurrent];
+				if (!tabItem) {
+					return;
+				}
+				// 获取滑块该移动的位置
+				let lineOffsetLeft = this.list
+					.slice(0, this.innerCurrent)
+					.reduce((total, curr) => total + curr.rect.width, 0);
+                // 获取下划线的数值px表示法
+				const lineWidth = getPx(this.lineWidth);
+				this.lineOffsetLeft = lineOffsetLeft + (tabItem.rect.width - lineWidth) / 2
+				// #ifdef APP-NVUE
+				// 第一次移动滑块,无需过渡时间
+				this.animation(this.lineOffsetLeft, this.firstTime ? 0 : parseInt(this.duration))
+				// #endif
+
+				// 如果是第一次执行此方法,让滑块在初始化时,瞬间滑动到第一个tab item的中间
+				// 这里需要一个定时器,因为在非nvue下,是直接通过style绑定过渡时间,需要等其过渡完成后,再设置为false(非第一次移动滑块)
+				if (this.firstTime) {
+					setTimeout(() => {
+						this.firstTime = false
+					}, 10);
+				}
+			},
+			// nvue下设置滑块的位置
+			animation(x, duration = 0) {
+				// #ifdef APP-NVUE
+				const ref = this.$refs['u-tabs__wrapper__nav__line']
+				animation.transition(ref, {
+					styles: {
+						transform: `translateX(${x}px)`
+					},
+					duration
+				})
+				// #endif
+			},
+			// 点击某一个标签
+			clickHandler(item, index) {
+				// 因为标签可能为disabled状态,所以click是一定会发出的,但是change事件是需要可用的状态才发出
+				this.$emit('click', {
+					...item,
+					index
+				})
+				// 如果disabled状态,返回
+				if (item.disabled) return
+				this.innerCurrent = index
+				this.resize()
+				this.$emit('change', {
+					...item,
+					index
+				})
+			},
+			init() {
+				sleep().then(() => {
+					this.resize()
+				})
+			},
+			setScrollLeft() {
+				// 当前活动tab的布局信息,有tab菜单的width和left(为元素左边界到父元素左边界的距离)等信息
+				const tabRect = this.list[this.innerCurrent]
+				// 累加得到当前item到左边的距离
+				const offsetLeft = this.list
+					.slice(0, this.innerCurrent)
+					.reduce((total, curr) => {
+						return total + curr.rect.width
+					}, 0)
+				// 此处为屏幕宽度
+				const windowWidth = sys().windowWidth
+				// 将活动的tabs-item移动到屏幕正中间,实际上是对scroll-view的移动
+				let scrollLeft = offsetLeft - (this.tabsRect.width - tabRect.rect.width) / 2 - (windowWidth - this.tabsRect
+					.right) / 2 + this.tabsRect.left / 2
+				// 这里做一个限制,限制scrollLeft的最大值为整个scroll-view宽度减去tabs组件的宽度
+				scrollLeft = Math.min(scrollLeft, this.scrollViewWidth - this.tabsRect.width)
+				this.scrollLeft = Math.max(0, scrollLeft)
+			},
+			// 获取所有标签的尺寸
+			resize() {
+				// 如果不存在list,则不处理
+				if(this.list.length === 0) {
+					return
+				}
+				Promise.all([this.getTabsRect(), this.getAllItemRect()]).then(([tabsRect, itemRect = []]) => {
+					this.tabsRect = tabsRect
+					this.scrollViewWidth = 0
+					itemRect.map((item, index) => {
+						// 计算scroll-view的宽度,这里
+						this.scrollViewWidth += item.width
+						// 另外计算每一个item的中心点X轴坐标
+						this.list[index].rect = item
+					})
+					// 获取了tabs的尺寸之后,设置滑块的位置
+					this.setLineLeft()
+					this.setScrollLeft()
+				})
+			},
+			// 获取导航菜单的尺寸
+			getTabsRect() {
+				return new Promise(resolve => {
+					this.queryRect('u-tabs__wrapper__scroll-view').then(size => resolve(size))
+				})
+			},
+			// 获取所有标签的尺寸
+			getAllItemRect() {
+				return new Promise(resolve => {
+					const promiseAllArr = this.list.map((item, index) => this.queryRect(
+						`u-tabs__wrapper__nav__item-${index}`, true))
+					Promise.all(promiseAllArr).then(sizes => resolve(sizes))
+				})
+			},
+			// 获取各个标签的尺寸
+			queryRect(el, item) {
+				// #ifndef APP-NVUE
+				// $uGetRect为uView自带的节点查询简化方法,详见文档介绍:https://ijry.github.io/uview-plus/js/getRect.html
+				// 组件内部一般用this.$uGetRect,对外的为uni.$u.getRect,二者功能一致,名称不同
+				return new Promise(resolve => {
+					this.$uGetRect(`.${el}`).then(size => {
+						resolve(size)
+					})
+				})
+				// #endif
+
+				// #ifdef APP-NVUE
+				// nvue下,使用dom模块查询元素高度
+				// 返回一个promise,让调用此方法的主体能使用then回调
+				return new Promise(resolve => {
+					dom.getComponentRect(item ? this.$refs[el][0] : this.$refs[el], res => {
+						resolve(res.size)
+					})
+				})
+				// #endif
+			},
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-tabs {
+
+		&__wrapper {
+			@include flex;
+			align-items: center;
+
+			&__scroll-view-wrapper {
+				flex: 1;
+				/* #ifndef APP-NVUE */
+				overflow: auto hidden;
+				/* #endif */
+			}
+
+			&__scroll-view {
+				@include flex;
+				flex: 1;
+			}
+
+			&__nav {
+				@include flex;
+				position: relative;
+
+				&__item {
+					padding: 0 11px;
+					@include flex;
+					align-items: center;
+					justify-content: center;
+
+					&--disabled {
+						/* #ifndef APP-NVUE */
+						cursor: not-allowed;
+						/* #endif */
+					}
+
+					&__text {
+						font-size: 15px;
+						color: $u-content-color;
+                        white-space: nowrap;
+
+						&--disabled {
+							color: $u-disabled-color !important;
+						}
+					}
+				}
+
+				&__line {
+					height: 3px;
+					background: $u-primary;
+					width: 30px;
+					position: absolute;
+					bottom: 2px;
+					border-radius: 100px;
+					transition-property: transform;
+					transition-duration: 300ms;
+				}
+			}
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-tag/props.js b/uni_modules/uview-plus/components/u-tag/props.js
new file mode 100644
index 0000000..746c94a
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-tag/props.js
@@ -0,0 +1,89 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 标签类型info、primary、success、warning、error
+        type: {
+            type: String,
+            default: () => defProps.tag.type
+        },
+        // 不可用
+        disabled: {
+            type: [Boolean, String],
+            default: () => defProps.tag.disabled
+        },
+        // 标签的大小,large,medium,mini
+        size: {
+            type: String,
+            default: () => defProps.tag.size
+        },
+        // tag的形状,circle(两边半圆形), square(方形,带圆角)
+        shape: {
+            type: String,
+            default: () => defProps.tag.shape
+        },
+        // 标签文字
+        text: {
+            type: [String, Number],
+            default: () => defProps.tag.text
+        },
+        // 背景颜色,默认为空字符串,即不处理
+        bgColor: {
+            type: String,
+            default: () => defProps.tag.bgColor
+        },
+        // 标签字体颜色,默认为空字符串,即不处理
+        color: {
+            type: String,
+            default: () => defProps.tag.color
+        },
+        // 标签的边框颜色
+        borderColor: {
+            type: String,
+            default: () => defProps.tag.borderColor
+        },
+        // 关闭按钮图标的颜色
+        closeColor: {
+            type: String,
+            default: () => defProps.tag.closeColor
+        },
+        // 点击时返回的索引值,用于区分例遍的数组哪个元素被点击了
+        name: {
+            type: [String, Number],
+            default: () => defProps.tag.name
+        },
+        // // 模式选择,dark|light|plain
+        // mode: {
+        // 	type: String,
+        // 	default: 'light'
+        // },
+        // 镂空时是否填充背景色
+        plainFill: {
+            type: Boolean,
+            default: () => defProps.tag.plainFill
+        },
+        // 是否镂空
+        plain: {
+            type: Boolean,
+            default: () => defProps.tag.plain
+        },
+        // 是否可关闭
+        closable: {
+            type: Boolean,
+            default: () => defProps.tag.closable
+        },
+        // 是否显示
+        show: {
+            type: Boolean,
+            default: () => defProps.tag.show
+        },
+        // 内置图标,或绝对路径的图片
+        icon: {
+            type: String,
+            default: () => defProps.tag.icon,
+		},
+		iconColor: {
+            type: String,
+            default: () => defProps.tag.iconColor
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-tag/u-tag.vue b/uni_modules/uview-plus/components/u-tag/u-tag.vue
new file mode 100644
index 0000000..5158a13
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-tag/u-tag.vue
@@ -0,0 +1,364 @@
+<template>
+	<u-transition
+		mode="fade"
+		:show="show"
+		style="display: inline-flex;"
+	>
+		<view class="u-tag-wrapper cursor-pointer">
+			<view
+				class="u-tag"
+				:class="[`u-tag--${shape}`, !plain && `u-tag--${type}`, plain && `u-tag--${type}--plain`, `u-tag--${size}`, plain && plainFill && `u-tag--${type}--plain--fill`]"
+				@tap.stop="clickHandler"
+				:style="[{
+					marginRight: closable ? '10px' : 0,
+					marginTop: closable ? '10px' : 0,
+				}, style]"
+			>
+				<slot name="icon">
+					<view
+						class="u-tag__icon"
+						v-if="icon"
+					>
+						<image
+							v-if="testImage(icon)"
+							:src="icon"
+							:style="[imgStyle]"
+						></image>
+						<u-icon
+							v-else
+							:color="elIconColor"
+							:name="icon"
+							:size="iconSize"
+						></u-icon>
+					</view>
+				</slot>
+				<text
+					class="u-tag__text"
+					:style="[textColor]"
+					:class="[`u-tag__text--${type}`, plain && `u-tag__text--${type}--plain`, `u-tag__text--${size}`]"
+				>{{ text }}</text>
+			</view>
+			<view
+				class="u-tag__close"
+				:class="[`u-tag__close--${size}`]"
+				v-if="closable"
+				@tap.stop="closeHandler"
+				:style="{backgroundColor: closeColor}"
+			>
+				<u-icon
+					name="close"
+					:size="closeSize"
+					color="#ffffff"
+				></u-icon>
+			</view>
+		</view>
+	</u-transition>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import test from '../../libs/function/test';
+	/**
+	 * Tag 标签
+	 * @description tag组件一般用于标记和选择,我们提供了更加丰富的表现形式,能够较全面的涵盖您的使用场景
+	 * @tutorial https://ijry.github.io/uview-plus/components/tag.html
+	 * @property {String}			type		标签类型info、primary、success、warning、error (默认 'primary' )
+	 * @property {Boolean | String}	disabled	不可用(默认 false )
+	 * @property {String}			size		标签的大小,large,medium,mini (默认 'medium' )
+	 * @property {String}			shape		tag的形状,circle(两边半圆形), square(方形,带圆角)(默认 'square' )
+	 * @property {String | Number}	text		标签的文字内容 
+	 * @property {String}			bgColor		背景颜色,默认为空字符串,即不处理
+	 * @property {String}			color		标签字体颜色,默认为空字符串,即不处理
+	 * @property {String}			borderColor	镂空形式标签的边框颜色
+	 * @property {String}			closeColor	关闭按钮图标的颜色(默认 #C6C7CB)
+	 * @property {String | Number}	name		点击时返回的索引值,用于区分例遍的数组哪个元素被点击了
+	 * @property {Boolean}			plainFill	镂空时是否填充背景色(默认 false )
+	 * @property {Boolean}			plain		是否镂空(默认 false )
+	 * @property {Boolean}			closable	是否可关闭,设置为true,文字右边会出现一个关闭图标(默认 false )
+	 * @property {Boolean}			show		标签显示与否(默认 true )
+	 * @property {String}			icon		内置图标,或绝对路径的图片
+	 * @event {Function(index)} click 点击标签时触发 index: 传递的index参数值
+	 * @event {Function(index)} close closable为true时,点击标签关闭按钮触发 index: 传递的index参数值	
+	 * @example <u-tag text="标签" type="error" plain plainFill></u-tag>
+	 */
+	export default {
+		name: 'u-tag',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+
+			}
+		},
+		computed: {
+			style() {
+				const style = {}
+				if (this.bgColor) {
+					style.backgroundColor = this.bgColor
+				}
+				if (this.color) {
+					style.color = this.color
+				}
+				if(this.borderColor) {
+					style.borderColor = this.borderColor
+				}
+				return style
+			},
+			// nvue下,文本颜色无法继承父元素
+			textColor() {
+				const style = {}
+				if (this.color) {
+					style.color = this.color
+				}
+				return style
+			},
+			imgStyle() {
+				const width = this.size === 'large' ? '17px' : this.size === 'medium' ? '15px' : '13px'
+				return {
+					width,
+					height: width
+				}
+			},
+			// 文本的样式
+			closeSize() {
+				const size = this.size === 'large' ? 15 : this.size === 'medium' ? 13 : 12
+				return size
+			},
+			// 图标大小
+			iconSize() {
+				const size = this.size === 'large' ? 21 : this.size === 'medium' ? 19 : 16
+				return size
+			},
+			// 图标颜色
+			elIconColor() {
+				return this.iconColor ? this.iconColor : this.plain ? this.type : '#ffffff'
+			}
+		},
+		emits: ["click", "close"],
+		methods: {
+			testImage: test.image,
+			// 点击关闭按钮
+			closeHandler() {
+				this.$emit('close', this.name)
+			},
+			// 点击标签
+			clickHandler() {
+				this.$emit('click', this.name)
+			}
+		}
+	}
+</script>
+
+<style
+	lang="scss"
+	scoped
+>
+	@import "../../libs/css/components.scss";
+
+	.u-tag-wrapper {
+		position: relative;
+	}
+
+	.u-tag {
+		@include flex;
+		align-items: center;
+		border-style: solid;
+
+		&--circle {
+			border-radius: 100px;
+		}
+
+		&--square {
+			border-radius: 3px;
+		}
+
+		&__icon {
+			margin-right: 4px;
+		}
+
+		&__text {
+			&--mini {
+				font-size: 12px;
+				line-height: 12px;
+			}
+
+			&--medium {
+				font-size: 13px;
+				line-height: 13px;
+			}
+
+			&--large {
+				font-size: 15px;
+				line-height: 15px;
+			}
+		}
+
+		&--mini {
+			height: 22px;
+			line-height: 22px;
+			padding: 0 5px;
+		}
+
+		&--medium {
+			height: 26px;
+			line-height: 22px;
+			padding: 0 10px;
+		}
+
+		&--large {
+			height: 32px;
+			line-height: 32px;
+			padding: 0 15px;
+		}
+
+		&--primary {
+			background-color: $u-primary;
+			border-width: 1px;
+			border-color: $u-primary;
+		}
+
+		&--primary--plain {
+			border-width: 1px;
+			border-color: $u-primary;
+		}
+
+		&--primary--plain--fill {
+			background-color: #ecf5ff;
+		}
+
+		&__text--primary {
+			color: #FFFFFF;
+		}
+
+		&__text--primary--plain {
+			color: $u-primary;
+		}
+
+		&--error {
+			background-color: $u-error;
+			border-width: 1px;
+			border-color: $u-error;
+		}
+
+		&--error--plain {
+			border-width: 1px;
+			border-color: $u-error;
+		}
+
+		&--error--plain--fill {
+			background-color: #fef0f0;
+		}
+
+		&__text--error {
+			color: #FFFFFF;
+		}
+
+		&__text--error--plain {
+			color: $u-error;
+		}
+
+		&--warning {
+			background-color: $u-warning;
+			border-width: 1px;
+			border-color: $u-warning;
+		}
+
+		&--warning--plain {
+			border-width: 1px;
+			border-color: $u-warning;
+		}
+
+		&--warning--plain--fill {
+			background-color: #fdf6ec;
+		}
+
+		&__text--warning {
+			color: #FFFFFF;
+		}
+
+		&__text--warning--plain {
+			color: $u-warning;
+		}
+
+		&--success {
+			background-color: $u-success;
+			border-width: 1px;
+			border-color: $u-success;
+		}
+
+		&--success--plain {
+			border-width: 1px;
+			border-color: $u-success;
+		}
+
+		&--success--plain--fill {
+			background-color: #f5fff0;
+		}
+
+		&__text--success {
+			color: #FFFFFF;
+		}
+
+		&__text--success--plain {
+			color: $u-success;
+		}
+
+		&--info {
+			background-color: $u-info;
+			border-width: 1px;
+			border-color: $u-info;
+		}
+
+		&--info--plain {
+			border-width: 1px;
+			border-color: $u-info;
+		}
+
+		&--info--plain--fill {
+			background-color: #f4f4f5;
+		}
+
+		&__text--info {
+			color: #FFFFFF;
+		}
+
+		&__text--info--plain {
+			color: $u-info;
+		}
+
+		&__close {
+			position: absolute;
+			z-index: 999;
+			top: 10px;
+			right: 10px;
+			border-radius: 100px;
+			background-color: #C6C7CB;
+			@include flex(row);
+			align-items: center;
+			justify-content: center;
+			/* #ifndef APP-NVUE */
+			transform: scale(0.6) translate(80%, -80%);
+			/* #endif */
+			/* #ifdef APP-NVUE */
+			transform: scale(0.6) translate(50%, -50%);
+			/* #endif */
+
+			&--mini {
+				width: 18px;
+				height: 18px;
+			}
+
+			&--medium {
+				width: 22px;
+				height: 22px;
+			}
+
+			&--large {
+				width: 25px;
+				height: 25px;
+			}
+		}
+
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-td/props.js b/uni_modules/uview-plus/components/u-td/props.js
new file mode 100644
index 0000000..82cd1ef
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-td/props.js
@@ -0,0 +1,6 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-td/u-td.vue b/uni_modules/uview-plus/components/u-td/u-td.vue
new file mode 100644
index 0000000..a0c06e9
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-td/u-td.vue
@@ -0,0 +1,33 @@
+<template>
+	<view class="u-td">
+		
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	/** 
+	 * Td 表格中的单元格
+	 * @description 
+	 * @tutorial url
+	 * @property {String | Number} 
+	 * @event {Function}
+	 * @example
+	 */
+	export default {
+		name: 'u-td',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+	
+</style>
diff --git a/uni_modules/uview-plus/components/u-text/props.js b/uni_modules/uview-plus/components/u-text/props.js
new file mode 100644
index 0000000..6cfc40b
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-text/props.js
@@ -0,0 +1,111 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 主题颜色
+        type: {
+            type: String,
+            default: () => defProps.text.type
+        },
+        // 是否显示
+        show: {
+            type: Boolean,
+            default: () => defProps.text.show
+        },
+        // 显示的值
+        text: {
+            type: [String, Number],
+            default: () => defProps.text.text
+        },
+        // 前置图标
+        prefixIcon: {
+            type: String,
+            default: () => defProps.text.prefixIcon
+        },
+        // 后置图标
+        suffixIcon: {
+            type: String,
+            default: () => defProps.text.suffixIcon
+        },
+        // 文本处理的匹配模式
+        // text-普通文本,price-价格,phone-手机号,name-姓名,date-日期,link-超链接
+        mode: {
+            type: String,
+            default: () => defProps.text.mode
+        },
+        // mode=link下,配置的链接
+        href: {
+            type: String,
+            default: () => defProps.text.href
+        },
+        // 格式化规则
+        format: {
+            type: [String, Function],
+            default: () => defProps.text.format
+        },
+        // mode=phone时,点击文本是否拨打电话
+        call: {
+            type: Boolean,
+            default: () => defProps.text.call
+        },
+        // 小程序的打开方式
+        openType: {
+            type: String,
+            default: () => defProps.text.openType
+        },
+        // 是否粗体,默认normal
+        bold: {
+            type: Boolean,
+            default: () => defProps.text.bold
+        },
+        // 是否块状
+        block: {
+            type: Boolean,
+            default: () => defProps.text.block
+        },
+        // 文本显示的行数,如果设置,超出此行数,将会显示省略号
+        lines: {
+            type: [String, Number],
+            default: () => defProps.text.lines
+        },
+        // 文本颜色
+        color: {
+            type: String,
+            default: () => defProps.text.color
+        },
+        // 字体大小
+        size: {
+            type: [String, Number],
+            default: () => defProps.text.size
+        },
+        // 图标的样式
+        iconStyle: {
+            type: [Object, String],
+            default: () => defProps.text.iconStyle
+        },
+        // 文字装饰,下划线,中划线等,可选值 none|underline|line-through
+        decoration: {
+            tepe: String,
+            default: () => defProps.text.decoration
+        },
+        // 外边距,对象、字符串,数值形式均可
+        margin: {
+            type: [Object, String, Number],
+            default: () => defProps.text.margin
+        },
+        // 文本行高
+        lineHeight: {
+            type: [String, Number],
+            default: () => defProps.text.lineHeight
+        },
+        // 文本对齐方式,可选值left|center|right
+        align: {
+            type: String,
+            default: () => defProps.text.align
+        },
+        // 文字换行,可选值break-word|normal|anywhere
+        wordWrap: {
+            type: String,
+            default: () => defProps.text.wordWrap
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-text/u-text.vue b/uni_modules/uview-plus/components/u-text/u-text.vue
new file mode 100644
index 0000000..663be1d
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-text/u-text.vue
@@ -0,0 +1,228 @@
+<template>
+    <view
+        class="u-text"
+        :class="[]"
+        v-if="show"
+        :style="{
+            margin: margin,
+			justifyContent: align === 'left' ? 'flex-start' : align === 'center' ? 'center' : 'flex-end'
+        }"
+        @tap="clickHandler"
+    >
+        <text
+            :class="['u-text__price', type && `u-text__value--${type}`]"
+            v-if="mode === 'price'"
+            :style="[valueStyle]"
+            >¥</text
+        >
+        <view class="u-text__prefix-icon" v-if="prefixIcon">
+            <u-icon
+                :name="prefixIcon"
+                :customStyle="addStyle(iconStyle)"
+            ></u-icon>
+        </view>
+        <u-link
+            v-if="mode === 'link'"			class="u-text__value"
+            :style="{fontWeight: valueStyle.fontWeight, wordWrap: valueStyle.wordWrap, fontSize: valueStyle.fontSize}"			:class="[			    type && `u-text__value--${type}`,			    lines && `u-line-${lines}`			]"			:text="value"
+            :href="href"
+            underLine
+        ></u-link>
+        <template v-else-if="openType && isMp">
+            <button
+                class="u-reset-button u-text__value"
+                :style="[valueStyle]"
+                :data-index="index"
+                :openType="openType"
+                @getuserinfo="onGetUserInfo"
+                @contact="onContact"
+                @getphonenumber="onGetPhoneNumber"
+                @error="onError"
+                @launchapp="onLaunchApp"
+                @opensetting="onOpenSetting"
+                :lang="lang"
+                :session-from="sessionFrom"
+                :send-message-title="sendMessageTitle"
+                :send-message-path="sendMessagePath"
+                :send-message-img="sendMessageImg"
+                :show-message-card="showMessageCard"
+                :app-parameter="appParameter"
+            >
+                {{ value }}
+            </button>
+        </template>
+        <text
+            v-else
+            class="u-text__value"
+            :style="[valueStyle]"
+            :class="[
+                type && `u-text__value--${type}`,
+                lines && `u-line-${lines}`
+            ]"
+            >{{ value }}</text
+        >
+        <view class="u-text__suffix-icon" v-if="suffixIcon">
+            <u-icon
+                :name="suffixIcon"
+                :customStyle="addStyle(iconStyle)"
+            ></u-icon>
+        </view>
+    </view>
+</template>
+
+<script>
+import props from './props'
+import value from './value.js'
+import mpMixin from '../../libs/mixin/mpMixin';
+import mixin from '../../libs/mixin/mixin';
+import button from '../../libs/mixin/button';
+import openType from '../../libs/mixin/openType';
+import { addStyle, addUnit, deepMerge } from '../../libs/function/index';
+/**
+ * Text 文本
+ * @description 此组件集成了文本类在项目中的常用功能,包括状态,拨打电话,格式化日期,*替换,超链接...等功能。 您大可不必在使用特殊文本时自己定义,text组件几乎涵盖您能使用的大部分场景。
+ * @tutorial https://ijry.github.io/uview-plus/components/loading.html
+ * @property {String} 					type		主题颜色
+ * @property {Boolean} 					show		是否显示(默认 true )
+ * @property {String | Number}			text		显示的值
+ * @property {String}					prefixIcon	前置图标
+ * @property {String} 					suffixIcon	后置图标
+ * @property {String} 					mode		文本处理的匹配模式 text-普通文本,price-价格,phone-手机号,name-姓名,date-日期,link-超链接
+ * @property {String} 					href		mode=link下,配置的链接
+ * @property {String | Function} 		format		格式化规则
+ * @property {Boolean} 					call		mode=phone时,点击文本是否拨打电话(默认 false )
+ * @property {String} 					openType	小程序的打开方式
+ * @property {Boolean} 					bold		是否粗体,默认normal(默认 false )
+ * @property {Boolean} 					block		是否块状(默认 false )
+ * @property {String | Number} 			lines		文本显示的行数,如果设置,超出此行数,将会显示省略号
+ * @property {String} 					color		文本颜色(默认 '#303133' )
+ * @property {String | Number} 			size		字体大小(默认 15 )
+ * @property {Object | String} 			iconStyle	图标的样式 (默认 {fontSize: '15px'} )
+ * @property {String} 					decoration	文字装饰,下划线,中划线等,可选值 none|underline|line-through(默认 'none' )
+ * @property {Object | String | Number}	margin		外边距,对象、字符串,数值形式均可(默认 0 )
+ * @property {String | Number} 			lineHeight	文本行高
+ * @property {String} 					align		文本对齐方式,可选值left|center|right(默认 'left' )
+ * @property {String} 					wordWrap	文字换行,可选值break-word|normal|anywhere(默认 'normal' )
+ * @event {Function} click  点击触发事件
+ * @example <up-text text="我用十年青春,赴你最后之约"></up-text>
+ */
+export default {
+    name: 'u--text',
+    // #ifdef MP
+    mixins: [mpMixin, mixin, value, button, openType, props],
+    // #endif
+    // #ifndef MP
+    mixins: [mpMixin, mixin, value, props],
+    // #endif
+	emits: ['click'],
+    computed: {
+        valueStyle() {
+            const style = {
+                textDecoration: this.decoration,
+                fontWeight: this.bold ? 'bold' : 'normal',
+                wordWrap: this.wordWrap,
+                fontSize: addUnit(this.size)
+            }
+            !this.type && (style.color = this.color)
+            this.isNvue && this.lines && (style.lines = this.lines)
+            this.lineHeight &&
+                (style.lineHeight = addUnit(this.lineHeight))
+            !this.isNvue && this.block && (style.display = 'block')
+            return deepMerge(style, addStyle(this.customStyle))
+        },
+        isNvue() {
+            let nvue = false
+            // #ifdef APP-NVUE
+            nvue = true
+            // #endif
+            return nvue
+        },
+        isMp() {
+            let mp = false
+            // #ifdef MP
+            mp = true
+            // #endif
+            return mp
+        }
+    },
+    data() {
+        return {}
+    },
+    methods: {
+        addStyle,
+        clickHandler() {
+            // 如果为手机号模式,拨打电话
+            if (this.call && this.mode === 'phone') {
+                uni.makePhoneCall({
+                    phoneNumber: this.text
+                })
+            }
+            this.$emit('click')
+        }
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+@import '../../libs/css/components.scss';
+
+.u-text {
+    @include flex(row);
+    align-items: center;
+    flex-wrap: nowrap;
+    flex: 1;
+	/* #ifndef APP-NVUE */
+	width: 100%;
+	/* #endif */
+
+    &__price {
+        font-size: 14px;
+        color: $u-content-color;
+    }
+
+    &__value {
+        font-size: 14px;
+        @include flex;
+        color: $u-content-color;
+        flex-wrap: wrap;
+        // flex: 1;
+        text-overflow: ellipsis;
+        align-items: center;
+
+        &--primary {
+            color: $u-primary;
+        }
+
+        &--warning {
+            color: $u-warning;
+        }
+
+        &--success {
+            color: $u-success;
+        }
+
+        &--info {
+            color: $u-info;
+        }
+
+        &--error {
+            color: $u-error;
+        }
+
+        &--main {
+            color: $u-main-color;
+        }
+
+        &--content {
+            color: $u-content-color;
+        }
+
+        &--tips {
+            color: $u-tips-color;
+        }
+
+        &--light {
+            color: $u-light-color;
+        }
+    }
+}
+</style>
diff --git a/uni_modules/uview-plus/components/u-text/value.js b/uni_modules/uview-plus/components/u-text/value.js
new file mode 100644
index 0000000..749ad68
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-text/value.js
@@ -0,0 +1,87 @@
+import { error, priceFormat, timeFormat } from '../../libs/function/index';
+import test from '../../libs/function/test';
+export default {
+    computed: {
+        // 经处理后需要显示的值
+        value() {
+            const {
+                text,
+                mode,
+                format,
+                href
+            } = this
+            // 价格类型
+            if (mode === 'price') {
+                // 如果text不为金额进行提示
+                if (!/^\d+(\.\d+)?$/.test(text)) {
+                    error('金额模式下,text参数需要为金额格式');
+                }
+                // 进行格式化,判断用户传入的format参数为正则,或者函数,如果没有传入format,则使用默认的金额格式化处理
+                if (test.func(format)) {
+                    // 如果用户传入的是函数,使用函数格式化
+                    return format(text)
+                }
+                // 如果format非正则,非函数,则使用默认的金额格式化方法进行操作
+                return priceFormat(text, 2)
+            } if (mode === 'date') {
+                // 判断是否合法的日期或者时间戳
+                !test.date(text) && error('日期模式下,text参数需要为日期或时间戳格式')
+                // 进行格式化,判断用户传入的format参数为正则,或者函数,如果没有传入format,则使用默认的格式化处理
+                if (test.func(format)) {
+                    // 如果用户传入的是函数,使用函数格式化
+                    return format(text)
+                } if (format) {
+                    // 如果format非正则,非函数,则使用默认的时间格式化方法进行操作
+                    return timeFormat(text, format)
+                }
+                // 如果没有设置format,则设置为默认的时间格式化形式
+                return timeFormat(text, 'yyyy-mm-dd')
+            } if (mode === 'phone') {
+                // 判断是否合法的手机号
+                // !test.mobile(text) && error('手机号模式下,text参数需要为手机号码格式')
+                if (test.func(format)) {
+                    // 如果用户传入的是函数,使用函数格式化
+                    return format(text)
+                } if (format === 'encrypt') {
+                    // 如果format为encrypt,则将手机号进行星号加密处理
+                    return `${text.substr(0, 3)}****${text.substr(7)}`
+                }
+                return text
+            } if (mode === 'name') {
+                // 判断是否合法的字符粗
+                !(typeof (text) === 'string') && error('姓名模式下,text参数需要为字符串格式')
+                if (test.func(format)) {
+                    // 如果用户传入的是函数,使用函数格式化
+                    return format(text)
+                } if (format === 'encrypt') {
+                    // 如果format为encrypt,则将姓名进行星号加密处理
+                    return this.formatName(text)
+                }
+                return text
+            } if (mode === 'link') {
+                // 判断是否合法的字符粗
+                !test.url(href) && error('超链接模式下,href参数需要为URL格式')
+                return text
+            }
+            return text
+        }
+    },
+    methods: {
+        // 默认的姓名脱敏规则
+        formatName(name) {
+            let value = ''
+            if (name.length === 2) {
+                value = name.substr(0, 1) + '*'
+            } else if (name.length > 2) {
+                let char = ''
+                for (let i = 0, len = name.length - 2; i < len; i++) {
+                    char += '*'
+                }
+                value = name.substr(0, 1) + char + name.substr(-1, 1)
+            } else {
+                value = name
+            }
+            return value
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-textarea/props.js b/uni_modules/uview-plus/components/u-textarea/props.js
new file mode 100644
index 0000000..88c65ca
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-textarea/props.js
@@ -0,0 +1,125 @@
+import defProps from '../../libs/config/props.js';
+export default {
+	props: {
+		// 输入框的内容
+		value: {
+			type: [String, Number],
+			default: () => defProps.textarea.value
+		},
+		// 输入框的内容
+		modelValue: {
+			type: [String, Number],
+			default: () => defProps.textarea.value
+		},
+		// 输入框为空时占位符
+		placeholder: {
+			type: [String, Number],
+			default: () => defProps.textarea.placeholder
+		},
+		// 指定placeholder的样式类,注意页面或组件的style中写了scoped时,需要在类名前写/deep/
+		placeholderClass: {
+			type: String,
+			default: () => defProps.input.placeholderClass
+		},
+		// 指定placeholder的样式
+		placeholderStyle: {
+			type: [String, Object],
+			default: () => defProps.input.placeholderStyle
+		},
+		// 输入框高度
+		height: {
+			type: [String, Number],
+			default: () => defProps.textarea.height
+		},
+		// 设置键盘右下角按钮的文字,仅微信小程序,App-vue和H5有效
+		confirmType: {
+			type: String,
+			default: () => defProps.textarea.confirmType
+		},
+		// 是否禁用
+		disabled: {
+			type: Boolean,
+			default: () => defProps.textarea.disabled
+		},
+		// 是否显示统计字数
+		count: {
+			type: Boolean,
+			default: () => defProps.textarea.count
+		},
+		// 是否自动获取焦点,nvue不支持,H5取决于浏览器的实现
+		focus: {
+			type: Boolean,
+			default: () => defProps.textarea.focus
+		},
+		// 是否自动增加高度
+		autoHeight: {
+			type: Boolean,
+			default: () => defProps.textarea.autoHeight
+		},
+		// 如果textarea是在一个position:fixed的区域,需要显示指定属性fixed为true
+		fixed: {
+			type: Boolean,
+			default: () => defProps.textarea.fixed
+		},
+		// 指定光标与键盘的距离
+		cursorSpacing: {
+			type: Number,
+			default: () => defProps.textarea.cursorSpacing
+		},
+		// 指定focus时的光标位置
+		cursor: {
+			type: [String, Number],
+			default: () => defProps.textarea.cursor
+		},
+		// 是否显示键盘上方带有”完成“按钮那一栏,
+		showConfirmBar: {
+			type: Boolean,
+			default: () => defProps.textarea.showConfirmBar
+		},
+		// 光标起始位置,自动聚焦时有效,需与selection-end搭配使用
+		selectionStart: {
+			type: Number,
+			default: () => defProps.textarea.selectionStart
+		},
+		// 光标结束位置,自动聚焦时有效,需与selection-start搭配使用
+		selectionEnd: {
+			type: Number,
+			default: () => defProps.textarea.selectionEnd
+		},
+		// 键盘弹起时,是否自动上推页面
+		adjustPosition: {
+			type: Boolean,
+			default: () => defProps.textarea.adjustPosition
+		},
+		// 是否去掉 iOS 下的默认内边距,只微信小程序有效
+		disableDefaultPadding: {
+			type: Boolean,
+			default: () => defProps.textarea.disableDefaultPadding
+		},
+		// focus时,点击页面的时候不收起键盘,只微信小程序有效
+		holdKeyboard: {
+			type: Boolean,
+			default: () => defProps.textarea.holdKeyboard
+		},
+		// 最大输入长度,设置为 -1 的时候不限制最大长度
+		maxlength: {
+			type: [String, Number],
+			default: () => defProps.textarea.maxlength
+		},
+		// 边框类型,surround-四周边框,bottom-底部边框
+		border: {
+			type: String,
+			default: () => defProps.textarea.border
+		},
+		// 用于处理或者过滤输入框内容的方法
+		formatter: {
+			type: [Function, null],
+			default: () => defProps.textarea.formatter
+		},
+		// 是否忽略组件内对文本合成系统事件的处理
+		ignoreCompositionEvent: {
+			type: Boolean,
+			default: true
+		}
+	}
+}
diff --git a/uni_modules/uview-plus/components/u-textarea/u-textarea.vue b/uni_modules/uview-plus/components/u-textarea/u-textarea.vue
new file mode 100644
index 0000000..1edcb8d
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-textarea/u-textarea.vue
@@ -0,0 +1,278 @@
+<template>
+    <view class="u-textarea" :class="textareaClass" :style="[textareaStyle]">
+        <textarea
+            class="u-textarea__field"
+            :value="innerValue"
+            :style="{ height: addUnit(height) }"
+            :placeholder="placeholder"
+            :placeholder-style="addStyle(placeholderStyle, 'string')"
+            :placeholder-class="placeholderClass"
+            :disabled="disabled"
+            :focus="focus"
+            :autoHeight="autoHeight"
+            :fixed="fixed"
+            :cursorSpacing="cursorSpacing"
+            :cursor="cursor"
+            :showConfirmBar="showConfirmBar"
+            :selectionStart="selectionStart"
+            :selectionEnd="selectionEnd"
+            :adjustPosition="adjustPosition"
+            :disableDefaultPadding="disableDefaultPadding"
+            :holdKeyboard="holdKeyboard"
+            :maxlength="maxlength"
+            :confirm-type="confirmType"
+            :ignoreCompositionEvent="ignoreCompositionEvent"
+            @focus="onFocus"
+            @blur="onBlur"
+            @linechange="onLinechange"
+            @input="onInput"
+            @confirm="onConfirm"
+            @keyboardheightchange="onKeyboardheightchange"
+        ></textarea>
+		<!-- #ifndef MP-ALIPAY -->
+        <text
+            class="u-textarea__count"
+            :style="{
+                'background-color': disabled ? 'transparent' : '#fff',
+            }"
+            v-if="count"
+            >{{ innerValue.length }}/{{ maxlength }}</text
+        >
+		<!-- #endif -->
+    </view>
+</template>
+
+<script>
+import props from "./props.js";
+import mpMixin from '../../libs/mixin/mpMixin';
+import mixin from '../../libs/mixin/mixin';
+import { addStyle, addUnit, deepMerge, formValidate, os } from '../../libs/function/index';
+/**
+ * Textarea 文本域
+ * @description 文本域此组件满足了可能出现的表单信息补充,编辑等实际逻辑的功能,内置了字数校验等
+ * @tutorial https://ijry.github.io/uview-plus/components/textarea.html
+ *
+ * @property {String | Number} 		value					输入框的内容
+ * @property {String | Number}		placeholder				输入框为空时占位符
+ * @property {String}			    placeholderClass		指定placeholder的样式类,注意页面或组件的style中写了scoped时,需要在类名前写/deep/ ( 默认 'input-placeholder' )
+ * @property {String | Object}	    placeholderStyle		指定placeholder的样式,字符串/对象形式,如"color: red;"
+ * @property {String | Number}		height					输入框高度(默认 70 )
+ * @property {String}				confirmType				设置键盘右下角按钮的文字,仅微信小程序,App-vue和H5有效(默认 'done' )
+ * @property {Boolean}				disabled				是否禁用(默认 false )
+ * @property {Boolean}				count					是否显示统计字数(默认 false )
+ * @property {Boolean}				focus					是否自动获取焦点,nvue不支持,H5取决于浏览器的实现(默认 false )
+ * @property {Boolean | Function}	autoHeight				是否自动增加高度(默认 false )
+ * @property {Boolean}				fixed					如果textarea是在一个position:fixed的区域,需要显示指定属性fixed为true(默认 false )
+ * @property {Number}				cursorSpacing			指定光标与键盘的距离(默认 0 )
+ * @property {String | Number}		cursor					指定focus时的光标位置
+ * @property {Function}			    formatter			    内容式化函数
+ * @property {Boolean}				showConfirmBar			是否显示键盘上方带有”完成“按钮那一栏,(默认 true )
+ * @property {Number}				selectionStart			光标起始位置,自动聚焦时有效,需与selection-end搭配使用,(默认 -1 )
+ * @property {Number | Number}		selectionEnd			光标结束位置,自动聚焦时有效,需与selection-start搭配使用(默认 -1 )
+ * @property {Boolean}				adjustPosition			键盘弹起时,是否自动上推页面(默认 true )
+ * @property {Boolean | Number}		disableDefaultPadding	是否去掉 iOS 下的默认内边距,只微信小程序有效(默认 false )
+ * @property {Boolean}				holdKeyboard			focus时,点击页面的时候不收起键盘,只微信小程序有效(默认 false )
+ * @property {String | Number}		maxlength				最大输入长度,设置为 -1 的时候不限制最大长度(默认 140 )
+ * @property {String}				border					边框类型,surround-四周边框,none-无边框,bottom-底部边框(默认 'surround' )
+ * @property {Boolean}				ignoreCompositionEvent	是否忽略组件内对文本合成系统事件的处理
+ *
+ * @event {Function(e)} focus					输入框聚焦时触发,event.detail = { value, height },height 为键盘高度
+ * @event {Function(e)} blur					输入框失去焦点时触发,event.detail = {value, cursor}
+ * @event {Function(e)} linechange				输入框行数变化时调用,event.detail = {height: 0, heightRpx: 0, lineCount: 0}
+ * @event {Function(e)} input					当键盘输入时,触发 input 事件
+ * @event {Function(e)} confirm					点击完成时, 触发 confirm 事件
+ * @event {Function(e)} keyboardheightchange	键盘高度发生变化的时候触发此事件
+ * @example <up-textarea v-model="value1" placeholder="请输入内容" ></up-textarea>
+ */
+export default {
+    name: "u-textarea",
+    mixins: [mpMixin, mixin, props],
+	data() {
+		return {
+			// 输入框的值
+			innerValue: "",
+			// 是否处于获得焦点状态
+			focused: false,
+			// value是否第一次变化,在watch中,由于加入immediate属性,会在第一次触发,此时不应该认为value发生了变化
+			firstChange: true,
+			// value绑定值的变化是由内部还是外部引起的
+			changeFromInner: false,
+			// 过滤处理方法
+			innerFormatter: value => value
+		}
+	},
+	created() {
+	},
+	watch: {
+        // #ifdef VUE2
+	    value: {
+	        immediate: true,
+	        handler(newVal, oldVal) {
+	            this.innerValue = newVal;
+	            /* #ifdef H5 */
+	            // 在H5中,外部value变化后,修改input中的值,不会触发@input事件,此时手动调用值变化方法
+	            if (
+	                this.firstChange === false &&
+	                this.changeFromInner === false
+	            ) {
+	                this.valueChange();
+	            }
+	            /* #endif */
+	            this.firstChange = false;
+	            // 重置changeFromInner的值为false,标识下一次引起默认为外部引起的
+	            this.changeFromInner = false;
+	        },
+	    },
+        // #endif
+        // #ifdef VUE3
+        modelValue: {
+	        immediate: true,
+	        handler(newVal, oldVal) {
+	            this.innerValue = newVal;
+	            /* #ifdef H5 */
+	            // 在H5中,外部value变化后,修改input中的值,不会触发@input事件,此时手动调用值变化方法
+	            if (
+	                this.firstChange === false &&
+	                this.changeFromInner === false
+	            ) {
+	                this.valueChange();
+	            }
+	            /* #endif */
+	            this.firstChange = false;
+	            // 重置changeFromInner的值为false,标识下一次引起默认为外部引起的
+	            this.changeFromInner = false;
+	        },
+	    }
+        // #endif
+	},
+    computed: {
+        // 组件的类名
+        textareaClass() {
+            let classes = [],
+                { border, disabled } = this;
+            border === "surround" &&
+                (classes = classes.concat(["u-border", "u-textarea--radius"]));
+            border === "bottom" &&
+                (classes = classes.concat([
+                    "u-border-bottom",
+                    "u-textarea--no-radius",
+                ]));
+            disabled && classes.push("u-textarea--disabled");
+            return classes.join(" ");
+        },
+        // 组件的样式
+        textareaStyle() {
+            const style = {};
+            // #ifdef APP-NVUE
+            // 由于textarea在安卓nvue上的差异性,需要额外再调整其内边距
+            if (os() === "android") {
+                style.paddingTop = "6px";
+                style.paddingLeft = "9px";
+                style.paddingBottom = "3px";
+                style.paddingRight = "6px";
+            }
+            // #endif
+            return deepMerge(style, addStyle(this.customStyle));
+        },
+    },
+    // #ifdef VUE3
+    emits: ['update:modelValue', 'linechange', 'focus', 'blur', 'change', 'confirm', 'keyboardheightchange'],
+    // #endif
+    methods: {
+        addStyle,
+        addUnit,
+		// 在微信小程序中,不支持将函数当做props参数,故只能通过ref形式调用
+		setFormatter(e) {
+			this.innerFormatter = e
+		},
+        onFocus(e) {
+            this.$emit("focus", e);
+        },
+        onBlur(e) {
+            this.$emit("blur", e);
+            // 尝试调用u-form的验证方法
+            formValidate(this, "blur");
+        },
+        onLinechange(e) {
+            this.$emit("linechange", e);
+        },
+        onInput(e) {
+			let { value = "" } = e.detail || {};
+			// 格式化过滤方法
+			const formatter = this.formatter || this.innerFormatter
+			const formatValue = formatter(value)
+			// 为了避免props的单向数据流特性,需要先将innerValue值设置为当前值,再在$nextTick中重新赋予设置后的值才有效
+			this.innerValue = value
+			this.$nextTick(() => {
+				this.innerValue = formatValue;
+				this.valueChange();
+			})
+        },
+		// 内容发生变化,进行处理
+		valueChange() {
+		    const value = this.innerValue;
+		    this.$nextTick(() => {
+                // #ifdef VUE3
+                this.$emit("update:modelValue", value);
+                // #endif
+                // #ifdef VUE2
+                this.$emit("input", value);
+                // #endif
+		        // 标识value值的变化是由内部引起的
+		        this.changeFromInner = true;
+		        this.$emit("change", value);
+		        // 尝试调用u-form的验证方法
+		        formValidate(this, "change");
+		    });
+		},
+        onConfirm(e) {
+            this.$emit("confirm", e);
+        },
+        onKeyboardheightchange(e) {
+            this.$emit("keyboardheightchange", e);
+        },
+    },
+};
+</script>
+
+<style lang="scss" scoped>
+@import "../../libs/css/components.scss";
+
+.u-textarea {
+    border-radius: 4px;
+    background-color: #fff;
+    position: relative;
+    @include flex;
+    flex: 1;
+	padding: 9px;
+
+    &--radius {
+        border-radius: 4px;
+    }
+
+    &--no-radius {
+        border-radius: 0;
+    }
+
+    &--disabled {
+        background-color: #f5f7fa;
+    }
+
+    &__field {
+        flex: 1;
+        font-size: 15px;
+        color: $u-content-color;
+		width: 100%;
+    }
+
+    &__count {
+        position: absolute;
+        right: 5px;
+        bottom: 2px;
+        font-size: 12px;
+        color: $u-tips-color;
+        background-color: #ffffff;
+        padding: 1px 4px;
+    }
+}
+</style>
diff --git a/uni_modules/uview-plus/components/u-toast/u-toast.vue b/uni_modules/uview-plus/components/u-toast/u-toast.vue
new file mode 100644
index 0000000..d3aaf30
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-toast/u-toast.vue
@@ -0,0 +1,301 @@
+<template>
+	<view class="u-toast">
+		<u-overlay
+			:show="isShow"
+			:custom-style="overlayStyle"
+		>
+			<view
+				class="u-toast__content"
+				:style="[contentStyle]"
+				:class="['u-type-' + tmpConfig.type, (tmpConfig.type === 'loading' || tmpConfig.loading) ?  'u-toast__content--loading' : '']"
+			>
+				<u-loading-icon
+					v-if="tmpConfig.type === 'loading'"
+					mode="circle"
+					color="rgb(255, 255, 255)"
+					inactiveColor="rgb(120, 120, 120)"
+					size="25"
+				></u-loading-icon>
+				<u-icon
+					v-else-if="tmpConfig.type !== 'defalut' && iconName"
+					:name="iconName"
+					size="17"
+					:color="tmpConfig.type"
+					:customStyle="iconStyle"
+				></u-icon>
+				<u-gap
+					v-if="tmpConfig.type === 'loading' || tmpConfig.loading"
+					height="12"
+					bgColor="transparent"
+				></u-gap>
+				<text
+					class="u-toast__content__text"
+					:class="['u-toast__content__text--' + tmpConfig.type]"
+					style="max-width: 400rpx;"
+				>{{ tmpConfig.message }}</text>
+			</view>
+		</u-overlay>
+	</view>
+</template>
+
+<script>
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { os, sys, deepMerge, type2icon } from '../../libs/function/index';
+	import color from '../../libs/config/color';
+	import { hexToRgb } from '../../libs/function/colorGradient';
+	/**
+	 * toast 消息提示
+	 * @description 此组件表现形式类似uni的uni.showToastAPI,但也有不同的地方。
+	 * @tutorial https://ijry.github.io/uview-plus/components/toast.html
+	 * @property {String | Number}	zIndex		toast展示时的zIndex值 (默认 10090 )
+	 * @property {Boolean}			loading		是否加载中 (默认 false )
+	 * @property {String | Number}	message		显示的文字内容
+	 * @property {String}			icon		图标,或者绝对路径的图片
+	 * @property {String}			type		主题类型 (默认 default)
+	 * @property {Boolean}			show		是否显示该组件 (默认 false)
+	 * @property {Boolean}			overlay		是否显示透明遮罩,防止点击穿透 (默认 false )
+	 * @property {String}			position	位置 (默认 'center' )
+	 * @property {Object}			params		跳转的参数 
+	 * @property {String | Number}  duration	展示时间,单位ms (默认 2000 )
+	 * @property {Boolean}			isTab		是否返回的为tab页面 (默认 false )
+	 * @property {String}			url			toast消失后是否跳转页面,有则跳转,优先级高于back参数 
+	 * @property {Function}			complete	执行完后的回调函数 
+	 * @property {Boolean}			back		结束toast是否自动返回上一页 (默认 false )
+	 * @property {Object}			customStyle	组件的样式,对象形式
+	 * @event {Function} show 显示toast,如需一进入页面就显示toast,请在onReady生命周期调用
+	 * @example <u-toast ref="uToast" />
+	 */
+	export default {
+		name: 'u-toast',
+		mixins: [mpMixin, mixin],
+		data() {
+			return {
+				isShow: false,
+				timer: null, // 定时器
+				config: {
+					message: '', // 显示文本
+					type: '', // 主题类型,primary,success,error,warning,black
+					duration: 2000, // 显示的时间,毫秒
+					icon: true, // 显示的图标
+					position: 'center', // toast出现的位置
+					complete: null, // 执行完后的回调函数
+					overlay: false, // 是否防止触摸穿透
+					loading: false, // 是否加载中状态
+				},
+				tmpConfig: {}, // 将用户配置和内置配置合并后的临时配置变量
+			}
+		},
+		computed: {
+			iconName() {
+				// 只有不为none,并且type为error|warning|succes|info时候,才显示图标
+				if(!this.tmpConfig.icon || this.tmpConfig.icon == 'none') {
+					return '';
+				}
+				if (['error', 'warning', 'success', 'primary'].includes(this.tmpConfig.type)) {
+					return type2icon(this.tmpConfig.type)
+				} else {
+					return ''
+				}
+			},
+			overlayStyle() {
+				const style = {
+					justifyContent: 'center',
+					alignItems: 'center',
+					display: 'flex'
+				}
+				// 将遮罩设置为100%透明度,避免出现灰色背景
+				style.backgroundColor = 'rgba(0, 0, 0, 0)'
+				return style
+			},
+			iconStyle() {
+				const style = {}
+				// 图标需要一个右边距,以跟右边的文字有隔开的距离
+				style.marginRight = '4px'
+				// #ifdef APP-NVUE
+				// iOSAPP下,图标有1px的向下偏移,这里进行修正
+				if (os() === 'ios') {
+					style.marginTop = '-1px'
+				}
+				// #endif
+				return style
+			},
+			loadingIconColor() {
+				let colorTmp = 'rgb(255, 255, 255)'
+				if (['error', 'warning', 'success', 'primary'].includes(this.tmpConfig.type)) {
+					// loading-icon组件内部会对color参数进行一个透明度处理,该方法要求传入的颜色值
+					// 必须为rgb格式的,所以这里做一个处理
+					colorTmp = hexToRgb(color[this.tmpConfig.type])
+				}
+				return colorTmp
+			},
+			// 内容盒子的样式
+			contentStyle() {
+				const windowHeight = sys().windowHeight, style = {}
+				let value = 0
+				// 根据top和bottom,对Y轴进行窗体高度的百分比偏移
+				if(this.tmpConfig.position === 'top') {
+					value = - windowHeight * 0.25
+				} else if(this.tmpConfig.position === 'bottom') {
+					value = windowHeight * 0.25
+				}
+				style.transform = `translateY(${value}px)`
+				return style
+			}
+		},
+		created() {
+			// 通过主题的形式调用toast,批量生成方法函数
+			['primary', 'success', 'error', 'warning', 'default', 'loading'].map(item => {
+				this[item] = message => this.show({
+					type: item,
+					message
+				})
+			})
+		},
+		methods: {
+			// 显示toast组件,由父组件通过this.$refs.xxx.show(options)形式调用
+			show(options) {
+				// 不将结果合并到this.config变量,避免多次调用u-toast,前后的配置造成混乱
+				this.tmpConfig = deepMerge(this.config, options)
+				// 清除定时器
+				this.clearTimer()
+				this.isShow = true
+				this.timer = setTimeout(() => {
+					// 倒计时结束,清除定时器,隐藏toast组件
+					this.clearTimer()
+					// 判断是否存在callback方法,如果存在就执行
+					typeof(this.tmpConfig.complete) === 'function' && this.tmpConfig.complete()
+				}, this.tmpConfig.duration)
+			},
+			// 隐藏toast组件,由父组件通过this.$refs.xxx.hide()形式调用
+			hide() {
+				this.clearTimer()
+			},
+			clearTimer() {
+				this.isShow = false
+				// 清除定时器
+				clearTimeout(this.timer)
+				this.timer = null
+			}
+		},
+		// #ifdef VUE2
+		beforeDestroy() {
+		// #endif
+		// #ifdef VUE3
+		beforeUnmount() {
+		// #endif
+			this.clearTimer()
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	$u-toast-color:#fff !default;
+	$u-toast-border-radius:4px !default;
+	$u-toast-border-background-color:#585858 !default;
+	$u-toast-border-font-size:14px !default;
+	$u-toast-border-padding:12px 20px !default;
+	$u-toast-loading-border-padding: 20px 20px !default;
+	$u-toast-content-text-color:#fff !default;
+	$u-toast-content-text-font-size:15px !default;
+	$u-toast-u-icon:10rpx !default;
+	$u-toast-u-type-primary-color:$u-primary !default;
+	$u-toast-u-type-primary-background-color:#ecf5ff !default;
+	$u-toast-u-type-primary-border-color:rgb(215, 234, 254) !default;
+	$u-toast-u-type-primary-border-width:1px !default;
+	$u-toast-u-type-success-color: $u-success !default;
+	$u-toast-u-type-success-background-color: #dbf1e1 !default;
+	$u-toast-u-type-success-border-color: #BEF5C8 !default;
+	$u-toast-u-type-success-border-width: 1px !default;
+	$u-toast-u-type-error-color:$u-error !default;
+	$u-toast-u-type-error-background-color:#fef0f0 !default;
+	$u-toast-u-type-error-border-color:#fde2e2 !default;
+	$u-toast-u-type-error-border-width: 1px !default;
+	$u-toast-u-type-warning-color:$u-warning !default;
+	$u-toast-u-type-warning-background-color:#fdf6ec !default;
+	$u-toast-u-type-warning-border-color:#faecd8 !default;
+	$u-toast-u-type-warning-border-width: 1px !default;
+	$u-toast-u-type-default-color:#fff !default;
+	$u-toast-u-type-default-background-color:#585858 !default;
+
+	.u-toast {
+		&__content {
+			@include flex;
+			padding: $u-toast-border-padding;
+			border-radius: $u-toast-border-radius;
+			background-color: $u-toast-border-background-color;
+			color: $u-toast-color;
+			align-items: center;
+			/* #ifndef APP-NVUE */
+			max-width: 600rpx;
+			/* #endif */
+			position: relative;
+
+			&--loading {
+				flex-direction: column;
+				padding: $u-toast-loading-border-padding;
+			}
+
+			&__text {
+				color: $u-toast-content-text-color;
+				font-size: $u-toast-content-text-font-size;
+				line-height: $u-toast-content-text-font-size;
+
+				&--default {
+					color: $u-toast-content-text-color;
+				}
+
+				&--error {
+					color: $u-error;
+				}
+
+				&--primary {
+					color: $u-primary;
+				}
+
+				&--success {
+					color: $u-success;
+				}
+
+				&--warning {
+					color: $u-warning;
+				}
+			}
+		}
+	}
+
+	.u-type-primary {
+		color: $u-toast-u-type-primary-color;
+		background-color: $u-toast-u-type-primary-background-color;
+		border-color: $u-toast-u-type-primary-border-color;
+		border-width: $u-toast-u-type-primary-border-width;
+	}
+
+	.u-type-success {
+		color: $u-toast-u-type-success-color;
+		background-color: $u-toast-u-type-success-background-color;
+		border-color: $u-toast-u-type-success-border-color;
+		border-width: 1px;
+	}
+
+	.u-type-error {
+		color: $u-toast-u-type-error-color;
+		background-color: $u-toast-u-type-error-background-color;
+		border-color: $u-toast-u-type-error-border-color;
+		border-width: $u-toast-u-type-error-border-width;
+	}
+
+	.u-type-warning {
+		color: $u-toast-u-type-warning-color;
+		background-color: $u-toast-u-type-warning-background-color;
+		border-color: $u-toast-u-type-warning-border-color;
+		border-width: 1px;
+	}
+
+	.u-type-default {
+		color: $u-toast-u-type-default-color;
+		background-color: $u-toast-u-type-default-background-color;
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-toolbar/props.js b/uni_modules/uview-plus/components/u-toolbar/props.js
new file mode 100644
index 0000000..55c1e95
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-toolbar/props.js
@@ -0,0 +1,35 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 是否展示工具条
+        show: {
+            type: Boolean,
+            default: () => defProps.toolbar.show
+        },
+        // 取消按钮的文字
+        cancelText: {
+            type: String,
+            default: () => defProps.toolbar.cancelText
+        },
+        // 确认按钮的文字
+        confirmText: {
+            type: String,
+            default: () => defProps.toolbar.confirmText
+        },
+        // 取消按钮的颜色
+        cancelColor: {
+            type: String,
+            default: () => defProps.toolbar.cancelColor
+        },
+        // 确认按钮的颜色
+        confirmColor: {
+            type: String,
+            default: () => defProps.toolbar.confirmColor
+        },
+        // 标题文字
+        title: {
+            type: String,
+            default: () => defProps.toolbar.title
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-toolbar/u-toolbar.vue b/uni_modules/uview-plus/components/u-toolbar/u-toolbar.vue
new file mode 100644
index 0000000..2a56ecb
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-toolbar/u-toolbar.vue
@@ -0,0 +1,105 @@
+<template>
+	<view
+		class="u-toolbar"
+		@touchmove.stop.prevent="noop"
+		v-if="show"
+	>
+		<view
+			class="u-toolbar__cancel__wrapper"
+			hover-class="u-hover-class"
+		>
+			<text
+				class="u-toolbar__wrapper__cancel"
+				@tap="cancel"
+				:style="{
+					color: cancelColor
+				}"
+			>{{ cancelText }}</text>
+		</view>
+		<text
+			class="u-toolbar__title u-line-1"
+			v-if="title"
+		>{{ title }}</text>
+		<view
+			class="u-toolbar__confirm__wrapper"
+			hover-class="u-hover-class"
+		>
+			<text
+				class="u-toolbar__wrapper__confirm"
+				@tap="confirm"
+				:style="{
+				color: confirmColor
+			}"
+			>{{ confirmText }}</text>
+		</view>
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	/**
+	 * Toolbar 工具条
+	 * @description 
+	 * @tutorial https://ijry.github.io/uview-plus/components/toolbar.html
+	 * @property {Boolean}	show			是否展示工具条(默认 true )
+	 * @property {String}	cancelText		取消按钮的文字(默认 '取消' )
+	 * @property {String}	confirmText		确认按钮的文字(默认 '确认' )
+	 * @property {String}	cancelColor		取消按钮的颜色(默认 '#909193' )
+	 * @property {String}	confirmColor	确认按钮的颜色(默认 '#3c9cff' )
+	 * @property {String}	title			标题文字
+	 * @event {Function} 
+	 * @example 
+	 */
+	export default {
+		name: 'u-toolbar',
+		mixins: [mpMixin, mixin, props],
+		emits: ["confirm", "cancel"],
+		methods: {
+			// 点击取消按钮
+			cancel() {
+				this.$emit('cancel')
+			},
+			// 点击确定按钮
+			confirm() {
+				this.$emit('confirm')
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-toolbar {
+		height: 42px;
+		@include flex;
+		justify-content: space-between;
+		align-items: center;
+
+		&__wrapper {
+			&__cancel {
+				color: $u-tips-color;
+				font-size: 15px;
+				padding: 0 15px;
+			}
+		}
+
+		&__title {
+			color: $u-main-color;
+			padding: 0 60rpx;
+			font-size: 16px;
+			flex: 1;
+			text-align: center;
+		}
+
+		&__wrapper {
+			&__confirm {
+				color: $u-primary;
+				font-size: 15px;
+				padding: 0 15px;
+			}
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-tooltip/props.js b/uni_modules/uview-plus/components/u-tooltip/props.js
new file mode 100644
index 0000000..f93e2e2
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-tooltip/props.js
@@ -0,0 +1,60 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 需要显示的提示文字
+        text: {
+            type: [String, Number],
+            default: () => defProps.tooltip.text
+        },
+        // 点击复制按钮时,复制的文本,为空则使用text值
+        copyText: {
+            type: [String, Number],
+            default: () => defProps.tooltip.copyText
+        },
+        // 文本大小
+        size: {
+            type: [String, Number],
+            default: () => defProps.tooltip.size
+        },
+        // 字体颜色
+        color: {
+            type: String,
+            default: () => defProps.tooltip.color
+        },
+        // 弹出提示框时,文本的背景色
+        bgColor: {
+            type: String,
+            default: () => defProps.tooltip.bgColor
+        },
+        // 弹出提示的方向,top-上方,bottom-下方
+        direction: {
+            type: String,
+            default: () => defProps.tooltip.direction
+        },
+        // 弹出提示的z-index,nvue无效
+        zIndex: {
+            type: [String, Number],
+            default: () => defProps.tooltip.zIndex
+        },
+        // 是否显示复制按钮
+        showCopy: {
+            type: Boolean,
+            default: () => defProps.tooltip.showCopy
+        },
+        // 扩展的按钮组
+        buttons: {
+            type: Array,
+            default: () => defProps.tooltip.buttons
+        },
+        // 是否显示透明遮罩以防止触摸穿透
+        overlay: {
+            type: Boolean,
+            default: () => defProps.tooltip.overlay
+        },
+        // 是否显示复制成功或者失败的toast
+        showToast: {
+            type: Boolean,
+            default: () => defProps.tooltip.showToast
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-tooltip/u-tooltip.vue b/uni_modules/uview-plus/components/u-tooltip/u-tooltip.vue
new file mode 100644
index 0000000..6a8ed56
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-tooltip/u-tooltip.vue
@@ -0,0 +1,342 @@
+<template>
+	<view
+		class="u-tooltip"
+		:style="[addStyle(customStyle)]"
+	>
+		<u-overlay
+			:show="showTooltip && tooltipTop !== -10000 && overlay"
+			customStyle="backgroundColor: rgba(0, 0, 0, 0)"
+			@click="overlayClickHandler"
+		></u-overlay>
+		<view class="u-tooltip__wrapper">
+			<text
+				class="u-tooltip__wrapper__text"
+				:id="textId"
+				:ref="textId"
+				:userSelect="false"
+				:selectable="false"
+				@longpress.stop="longpressHandler"
+				:style="{
+					color: color,
+					backgroundColor: bgColor && showTooltip && tooltipTop !== -10000 ? bgColor : 'transparent'
+				}"
+			>{{ text }}</text>
+			<u-transition
+				mode="fade"
+				:show="showTooltip"
+				duration="300"
+				:customStyle="{
+					position: 'absolute', 
+					top: addUnit(tooltipTop),
+					zIndex: zIndex,
+					...tooltipStyle
+				}"
+			>
+				<view
+					class="u-tooltip__wrapper__popup"
+					:id="tooltipId"
+					:ref="tooltipId"
+				>
+					<view
+						class="u-tooltip__wrapper__popup__indicator"
+						hover-class="u-tooltip__wrapper__popup__indicator--hover"
+						v-if="showCopy || buttons.length"
+						:style="[indicatorStyle, {
+							width: addUnit(indicatorWidth),
+							height: addUnit(indicatorWidth),
+						}]"
+					>
+						<!-- 由于nvue不支持三角形绘制,这里就做一个四方形,再旋转45deg,得到露出的一个三角 -->
+					</view>
+					<view class="u-tooltip__wrapper__popup__list">
+						<view
+							v-if="showCopy"
+							class="u-tooltip__wrapper__popup__list__btn"
+							hover-class="u-tooltip__wrapper__popup__list__btn--hover"
+							@tap="setClipboardData"
+						>
+							<text
+								class="u-tooltip__wrapper__popup__list__btn__text"
+							>复制</text>
+						</view>
+						<u-line
+							direction="column"
+							color="#8d8e90"
+							v-if="showCopy && buttons.length > 0"
+							length="18"
+						></u-line>
+						<block v-for="(item , index) in buttons" :key="index">
+							<view
+								class="u-tooltip__wrapper__popup__list__btn"
+								hover-class="u-tooltip__wrapper__popup__list__btn--hover"
+							>
+								<text
+									class="u-tooltip__wrapper__popup__list__btn__text"
+									@tap="btnClickHandler(index)"
+								>{{ item }}</text>
+							</view>
+							<u-line
+								direction="column"
+								color="#8d8e90"
+								v-if="index < buttons.length - 1"
+								length="18"
+							></u-line>
+						</block>
+					</view>
+				</view>
+			</u-transition>
+		</view>
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addStyle, addUnit, getPx, guid, toast, sleep, sys } from '../../libs/function/index';
+	// #ifdef APP-NVUE 
+	const dom = uni.requireNativePlugin('dom')
+	// #endif
+	/**
+	 * Tooltip 
+	 * @description 
+	 * @tutorial https://ijry.github.io/uview-plus/components/tooltip.html
+	 * @property {String | Number}	text		需要显示的提示文字
+	 * @property {String | Number}	copyText	点击复制按钮时,复制的文本,为空则使用text值
+	 * @property {String | Number}	size		文本大小(默认 14 )
+	 * @property {String}			color		字体颜色(默认 '#606266' )
+	 * @property {String}			bgColor		弹出提示框时,文本的背景色(默认 'transparent' )
+	 * @property {String}			direction	弹出提示的方向,top-上方,bottom-下方(默认 'top' )
+	 * @property {String | Number}	zIndex		弹出提示的z-index,nvue无效(默认 10071 )
+	 * @property {Boolean}			showCopy	是否显示复制按钮(默认 true )
+	 * @property {Array}			buttons		扩展的按钮组
+	 * @property {Boolean}			overlay		是否显示透明遮罩以防止触摸穿透(默认 true )
+	 * @property {Object}			customStyle	定义需要用到的外部样式
+	 * 
+	 * @event {Function} 
+	 * @example 
+	 */
+	export default {
+		name: 'u-tooltip',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				// 是否展示气泡
+				showTooltip: true,
+				// 生成唯一id,防止一个页面多个组件,造成干扰
+				textId: guid(),
+				tooltipId: guid(),
+				// 初始时甚至为很大的值,让其移到屏幕外面,为了计算元素的尺寸
+				tooltipTop: -10000,
+				// 气泡的位置信息
+				tooltipInfo: {
+					width: 0,
+					left: 0
+				},
+				// 文本的位置信息
+				textInfo: {
+					width: 0,
+					left: 0
+				},
+				// 三角形指示器的样式
+				indicatorStyle: {},
+				// 气泡在可能超出屏幕边沿范围时,重新定位后,距离屏幕边沿的距离
+				screenGap: 12,
+				// 三角形指示器的宽高,由于对元素进行了角度旋转,精确计算指示器位置时,需要用到其尺寸信息
+				indicatorWidth: 14,
+			}
+		},
+		watch: {
+			propsChange() {
+				this.getElRect()
+			}
+		},
+		computed: {
+			// 特别处理H5的复制,因为H5浏览器是自带系统复制功能的,在H5环境
+			// 当一些依赖参数变化时,需要重新计算气泡和指示器的位置信息
+			propsChange() {
+				return [this.text, this.buttons]
+			},
+			// 计算气泡和指示器的位置信息
+			tooltipStyle() {
+				const style = {
+						transform: `translateY(${this.direction === 'top' ? '-100%' : '100%'})`,
+					},
+					sysInfo = sys()
+				if (this.tooltipInfo.width / 2 > this.textInfo.left + this.textInfo.width / 2 - this.screenGap) {
+					this.indicatorStyle = {}
+					style.left = `-${addUnit(this.textInfo.left - this.screenGap)}`
+					this.indicatorStyle.left = addUnit(this.textInfo.width / 2 - getPx(style.left) - this.indicatorWidth /
+						2)
+				} else if (this.tooltipInfo.width / 2 > sysInfo.windowWidth - this.textInfo.right + this.textInfo.width / 2 -
+					this.screenGap) {
+					this.indicatorStyle = {}
+					style.right = `-${addUnit(sysInfo.windowWidth - this.textInfo.right - this.screenGap)}`
+					this.indicatorStyle.right = addUnit(this.textInfo.width / 2 - getPx(style.right) - this
+						.indicatorWidth / 2)
+				} else {
+					const left = Math.abs(this.textInfo.width / 2 - this.tooltipInfo.width / 2)
+					style.left = this.textInfo.width > this.tooltipInfo.width ? addUnit(left) : -addUnit(left)
+					this.indicatorStyle = {}
+				}
+				if (this.direction === 'top') {
+					style.marginTop = '-10px'
+					this.indicatorStyle.bottom = '-4px'
+				} else {
+					style.marginBottom = '-10px'
+					this.indicatorStyle.top = '-4px'
+				}
+				return style
+			}
+		},
+		mounted() {
+			this.init()
+		},
+		emits: ["click"],
+		methods: {
+			addStyle,
+			addUnit,
+			init() {
+				this.getElRect()
+			},
+			// 长按触发事件
+			async longpressHandler() {
+				this.tooltipTop = 0
+				this.showTooltip = true
+			},
+			// 点击透明遮罩
+			overlayClickHandler() {
+				this.showTooltip = false
+			},
+			// 点击弹出按钮
+			btnClickHandler(index) {
+				this.showTooltip = false
+				// 如果需要展示复制按钮,此处index需要加1,因为复制按钮在第一个位置
+				this.$emit('click', this.showCopy ? index + 1 : index)
+			},
+			// 查询内容高度
+			queryRect(ref) {
+				// #ifndef APP-NVUE
+				// $uGetRect为uView自带的节点查询简化方法,详见文档介绍:https://ijry.github.io/uview-plus/js/getRect.html
+				// 组件内部一般用this.$uGetRect,对外的为uni.$u.getRect,二者功能一致,名称不同
+				return new Promise(resolve => {
+					this.$uGetRect(`#${ref}`).then(size => {
+						resolve(size)
+					})
+				})
+				// #endif
+
+				// #ifdef APP-NVUE
+				// nvue下,使用dom模块查询元素高度
+				// 返回一个promise,让调用此方法的主体能使用then回调
+				return new Promise(resolve => {
+					dom.getComponentRect(this.$refs[ref], res => {
+						resolve(res.size)
+					})
+				})
+				// #endif
+			},
+			// 元素尺寸
+			getElRect() {
+				// 调用之前,先将指示器调整到屏幕外,方便获取尺寸
+				this.showTooltip = true
+				this.tooltipTop = -10000
+				sleep(500).then(() => {
+					this.queryRect(this.tooltipId).then(size => {
+						this.tooltipInfo = size
+						// 获取气泡尺寸之后,将其隐藏,为了让下次切换气泡显示与隐藏时,有淡入淡出的效果
+						this.showTooltip = false
+					})
+					this.queryRect(this.textId).then(size => {
+						this.textInfo = size
+					})
+				})
+			},
+			// 复制文本到粘贴板
+			setClipboardData() {
+				// 关闭组件
+				this.showTooltip = false
+				this.$emit('click', 0)
+				uni.setClipboardData({
+					// 优先使用copyText字段,如果没有,则默认使用text字段当做复制的内容
+					data: this.copyText || this.text,
+					success: () => {
+						this.showToast && toast('复制成功')
+					},
+					fail: () => {
+						this.showToast && toast('复制失败')
+					},
+					complete: () => {
+						this.showTooltip = false
+					}
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-tooltip {
+		position: relative;
+		@include flex;
+
+		&__wrapper {
+			@include flex;
+			justify-content: center;
+			/* #ifndef APP-NVUE */
+			white-space: nowrap;
+			/* #endif */
+
+			&__text {
+				font-size: 14px;
+			}
+
+			&__popup {
+				@include flex;
+				justify-content: center;
+
+				&__list {
+					background-color: #060607;
+					position: relative;
+					flex: 1;
+					border-radius: 5px;
+					padding: 0px 0;
+					@include flex(row);
+					align-items: center;
+					overflow: hidden;
+
+					&__btn {
+						padding: 11px 13px;
+
+						&--hover {
+							background-color: #58595B;
+						}
+
+						&__text {
+							line-height: 12px;
+							font-size: 13px;
+							color: #FFFFFF;
+						}
+					}
+				}
+
+				&__indicator {
+					position: absolute;
+					background-color: #060607;
+					width: 14px;
+					height: 14px;
+					bottom: -4px;
+					transform: rotate(45deg);
+					border-radius: 2px;
+					z-index: -1;
+
+					&--hover {
+						background-color: #58595B;
+					}
+				}
+			}
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-tr/props.js b/uni_modules/uview-plus/components/u-tr/props.js
new file mode 100644
index 0000000..662c38e
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-tr/props.js
@@ -0,0 +1,6 @@
+// import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-tr/u-tr.vue b/uni_modules/uview-plus/components/u-tr/u-tr.vue
new file mode 100644
index 0000000..551e681
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-tr/u-tr.vue
@@ -0,0 +1,33 @@
+<template>
+	<view class="u-tr">
+		
+	</view>
+</template>
+
+<script>
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	/**
+	 * Tr  
+	 * @description 
+	 * @tutorial url
+	 * @property {String}
+	 * @event {Function}
+	 * @example
+	 */
+	export default {
+		name: 'u-tr',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+	
+</style>
diff --git a/uni_modules/uview-plus/components/u-transition/nvue-ani-map.js b/uni_modules/uview-plus/components/u-transition/nvue-ani-map.js
new file mode 100644
index 0000000..b86b962
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-transition/nvue-ani-map.js
@@ -0,0 +1,68 @@
+export default {
+    fade: {
+        enter: { opacity: 0 },
+        'enter-to': { opacity: 1 },
+        leave: { opacity: 1 },
+        'leave-to': { opacity: 0 }
+    },
+    'fade-up': {
+        enter: { opacity: 0, transform: 'translateY(100%)' },
+        'enter-to': { opacity: 1, transform: 'translateY(0)' },
+        leave: { opacity: 1, transform: 'translateY(0)' },
+        'leave-to': { opacity: 0, transform: 'translateY(100%)' }
+    },
+    'fade-down': {
+        enter: { opacity: 0, transform: 'translateY(-100%)' },
+        'enter-to': { opacity: 1, transform: 'translateY(0)' },
+        leave: { opacity: 1, transform: 'translateY(0)' },
+        'leave-to': { opacity: 0, transform: 'translateY(-100%)' }
+    },
+    'fade-left': {
+        enter: { opacity: 0, transform: 'translateX(-100%)' },
+        'enter-to': { opacity: 1, transform: 'translateY(0)' },
+        leave: { opacity: 1, transform: 'translateY(0)' },
+        'leave-to': { opacity: 0, transform: 'translateX(-100%)' }
+    },
+    'fade-right': {
+        enter: { opacity: 0, transform: 'translateX(100%)' },
+        'enter-to': { opacity: 1, transform: 'translateY(0)' },
+        leave: { opacity: 1, transform: 'translateY(0)' },
+        'leave-to': { opacity: 0, transform: 'translateX(100%)' }
+    },
+    'slide-up': {
+        enter: { transform: 'translateY(100%)' },
+        'enter-to': { transform: 'translateY(0)' },
+        leave: { transform: 'translateY(0)' },
+        'leave-to': { transform: 'translateY(100%)' }
+    },
+    'slide-down': {
+        enter: { transform: 'translateY(-100%)' },
+        'enter-to': { transform: 'translateY(0)' },
+        leave: { transform: 'translateY(0)' },
+        'leave-to': { transform: 'translateY(-100%)' }
+    },
+    'slide-left': {
+        enter: { transform: 'translateX(-100%)' },
+        'enter-to': { transform: 'translateY(0)' },
+        leave: { transform: 'translateY(0)' },
+        'leave-to': { transform: 'translateX(-100%)' }
+    },
+    'slide-right': {
+        enter: { transform: 'translateX(100%)' },
+        'enter-to': { transform: 'translateY(0)' },
+        leave: { transform: 'translateY(0)' },
+        'leave-to': { transform: 'translateX(100%)' }
+    },
+    zoom: {
+        enter: { transform: 'scale(0.95)' },
+        'enter-to': { transform: 'scale(1)' },
+        leave: { transform: 'scale(1)' },
+        'leave-to': { transform: 'scale(0.95)' }
+    },
+    'fade-zoom': {
+        enter: { opacity: 0, transform: 'scale(0.95)' },
+        'enter-to': { opacity: 1, transform: 'scale(1)' },
+        leave: { opacity: 1, transform: 'scale(1)' },
+        'leave-to': { opacity: 0, transform: 'scale(0.95)' }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-transition/props.js b/uni_modules/uview-plus/components/u-transition/props.js
new file mode 100644
index 0000000..96d7477
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-transition/props.js
@@ -0,0 +1,25 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 是否展示组件
+        show: {
+            type: Boolean,
+            default: () => defProps.transition.show
+        },
+        // 使用的动画模式
+        mode: {
+            type: String,
+            default: () => defProps.transition.mode
+        },
+        // 动画的执行时间,单位ms
+        duration: {
+            type: [String, Number],
+            default: () => defProps.transition.duration
+        },
+        // 使用的动画过渡函数
+        timingFunction: {
+            type: String,
+            default: () => defProps.transition.timingFunction
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-transition/transition.js b/uni_modules/uview-plus/components/u-transition/transition.js
new file mode 100644
index 0000000..b1ae487
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-transition/transition.js
@@ -0,0 +1,163 @@
+// 定义一个一定时间后自动成功的promise,让调用nextTick方法处,进入下一个then方法
+const waitTick = () => new Promise(resolve => setTimeout(resolve, 1000 / 50))
+// nvue动画模块实现细节抽离在外部文件
+// #ifdef APP-NVUE
+import animationMap from './nvue-ani-map.js'
+// #endif
+
+// #ifndef APP-NVUE
+// 定义类名,通过给元素动态切换类名,赋予元素一定的css动画样式
+const getClassNames = (name) => ({
+    enter: `u-${name}-enter u-${name}-enter-active`,
+    'enter-to': `u-${name}-enter-to u-${name}-enter-active`,
+    leave: `u-${name}-leave u-${name}-leave-active`,
+    'leave-to': `u-${name}-leave-to u-${name}-leave-active`
+})
+// #endif
+
+// #ifdef APP-NVUE
+// 引入nvue(weex)的animation动画模块,文档见:
+// https://weex.apache.org/zh/docs/modules/animation.html#transition
+const animation = uni.requireNativePlugin('animation')
+const getStyle = (name) => animationMap[name]
+// #endif
+
+import { nextTick } from 'vue'
+import { sleep } from '../../libs/function/index';
+export default {
+    methods: {
+        // 组件被点击发出事件
+        clickHandler() {
+            this.$emit('click')
+        },
+        // #ifndef APP-NVUE
+        // vue版本的组件进场处理
+        async vueEnter() {
+            // 动画进入时的类名
+            const classNames = getClassNames(this.mode)
+            // 定义状态和发出动画进入前事件
+            this.status = 'enter'
+            this.$emit('beforeEnter')
+            this.inited = true
+            this.display = true
+            this.classes = classNames.enter
+			await nextTick();
+			{
+                // https://github.com/umicro/uView2.0/issues/545
+				await sleep(20)
+                // 标识动画尚未结束
+                this.$emit('enter')
+                this.transitionEnded = false
+				// 组件动画进入后触发的事件
+                this.$emit('afterEnter')
+                // 赋予组件enter-to类名
+                this.classes = classNames['enter-to']
+            }
+        },
+        // 动画离场处理
+        async vueLeave() {
+            // 如果不是展示状态,无需执行逻辑
+            if (!this.display) return
+            const classNames = getClassNames(this.mode)
+            // 标记离开状态和发出事件
+            this.status = 'leave'
+            this.$emit('beforeLeave')
+            // 获得类名
+            this.classes = classNames.leave
+
+            await nextTick();
+			{
+               // 动画正在离场的状态
+               this.transitionEnded = false
+               this.$emit('leave')
+                // 组件执行动画,到了执行的执行时间后,执行一些额外处理
+                setTimeout(this.onTransitionEnd, this.duration)
+                this.classes = classNames['leave-to']
+            }
+        },
+        // #endif
+        // #ifdef APP-NVUE
+        // nvue版本动画进场
+        async nvueEnter() {
+            // 获得样式的名称
+            const currentStyle = getStyle(this.mode)
+            // 组件动画状态和发出事件
+            this.status = 'enter'
+            this.$emit('beforeEnter')
+            // 展示生成组件元素
+            this.inited = true
+            this.display = true
+            // 在nvue安卓上,由于渲染速度慢,在弹窗,键盘,日历等组件中,渲染其中的内容需要时间
+            // 导致出现弹窗卡顿,这里让其一开始为透明状态,等一定时间渲染完成后,再让其隐藏起来,再让其按正常逻辑出现
+            this.viewStyle = {
+                opacity: 0
+            }
+            // 等待弹窗内容渲染完成
+            await nextTick();
+			{
+                // 合并样式
+                this.viewStyle = currentStyle.enter
+                Promise.resolve()
+                    .then(waitTick)
+                    .then(() => {
+                        // 组件开始进入前的事件
+                        this.$emit('enter')
+                        // nvue的transition动画模块需要通过ref调用组件,注意此处的ref不同于vue的this.$refs['u-transition']用法
+                        animation.transition(this.$refs['u-transition'].ref, {
+                            styles: currentStyle['enter-to'],
+                            duration: this.duration,
+                            timingFunction: this.timingFunction,
+                            needLayout: false,
+                            delay: 0
+                        }, () => {
+                            // 动画执行完毕,发出事件
+                            this.$emit('afterEnter')
+                        })
+                    })
+                    .catch(() => {})
+            }
+        },
+        nvueLeave() {
+            if (!this.display) {
+                return
+            }
+            const currentStyle = getStyle(this.mode)
+            // 定义状态和事件
+            this.status = 'leave'
+            this.$emit('beforeLeave')
+            // 合并样式
+            this.viewStyle = currentStyle.leave
+            // 放到promise中处理执行过程
+            Promise.resolve()
+                .then(waitTick) // 等待几十ms
+                .then(() => {
+                    this.transitionEnded = false
+                    // 动画正在离场的状态
+                    this.$emit('leave')
+                    animation.transition(this.$refs['u-transition'].ref, {
+                        styles: currentStyle['leave-to'],
+                        duration: this.duration,
+                        timingFunction: this.timingFunction,
+                        needLayout: false,
+                        delay: 0
+                    }, () => {
+                        this.onTransitionEnd()
+                    })
+                })
+                .catch(() => {})
+        },
+        // #endif
+        // 完成过渡后触发
+        onTransitionEnd() {
+            // 如果已经是结束的状态,无需再处理
+            if (this.transitionEnded) return
+            this.transitionEnded = true
+            // 发出组件动画执行后的事件
+            this.$emit(this.status === 'leave' ? 'afterLeave' : 'afterEnter')
+            if (!this.show && this.display) {
+                this.display = false
+                this.inited = false
+            }
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-transition/u-transition.vue b/uni_modules/uview-plus/components/u-transition/u-transition.vue
new file mode 100644
index 0000000..1d544ed
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-transition/u-transition.vue
@@ -0,0 +1,96 @@
+<template>
+	<view
+		v-if="inited"
+		class="u-transition"
+		ref="u-transition"
+		@tap="clickHandler"
+		:class="classes"
+		:style="[mergeStyle]"
+		@touchmove="noop"
+	>
+		<slot />
+	</view>
+</template>
+
+<script>
+import props from './props';
+import mpMixin from '../../libs/mixin/mpMixin';
+import mixin from '../../libs/mixin/mixin';
+import { addStyle } from '../../libs/function/index';
+// 组件的methods方法,由于内容较长,写在外部文件中通过mixin引入
+import transition from "./transition.js";
+/**
+ * transition  动画组件
+ * @description
+ * @tutorial
+ * @property {String}			show			是否展示组件 (默认 false )
+ * @property {String}			mode			使用的动画模式 (默认 'fade' )
+ * @property {String | Number}	duration		动画的执行时间,单位ms (默认 '300' )
+ * @property {String}			timingFunction	使用的动画过渡函数 (默认 'ease-out' )
+ * @property {Object}			customStyle		自定义样式
+ * @event {Function} before-enter	进入前触发
+ * @event {Function} enter			进入中触发
+ * @event {Function} after-enter	进入后触发
+ * @event {Function} before-leave	离开前触发
+ * @event {Function} leave			离开中触发
+ * @event {Function} after-leave	离开后触发
+ * @example
+ */
+export default {
+	name: 'u-transition',
+	data() {
+		return {
+			inited: false, // 是否显示/隐藏组件
+			viewStyle: {}, // 组件内部的样式
+			status: '', // 记录组件动画的状态
+			transitionEnded: false, // 组件是否结束的标记
+			display: false, // 组件是否展示
+			classes: '', // 应用的类名
+		}
+	},
+	emits: ['click', 'beforeEnter', 'enter', 'afterEnter', 'beforeLeave', 'leave', 'afterLeave'],
+	computed: {
+	    mergeStyle() {
+	        const { viewStyle, customStyle } = this
+	        return {
+	            // #ifndef APP-NVUE
+	            transitionDuration: `${this.duration}ms`,
+	            // display: `${this.display ? '' : 'none'}`,
+				transitionTimingFunction: this.timingFunction,
+	            // #endif
+				// 避免自定义样式影响到动画属性,所以写在viewStyle前面
+	            ...addStyle(customStyle),
+	            ...viewStyle
+	        }
+	    }
+	},
+	// 将mixin挂在到组件中,实际上为一个vue格式对象。
+	mixins: [mpMixin, mixin, transition, props],
+	watch: {
+		show: {
+			handler(newVal) {
+				// vue和nvue分别执行不同的方法
+				// #ifdef APP-NVUE
+				newVal ? this.nvueEnter() : this.nvueLeave()
+				// #endif
+				// #ifndef APP-NVUE
+				newVal ? this.vueEnter() : this.vueLeave()
+				// #endif
+			},
+			// 表示同时监听初始化时的props的show的意思
+			immediate: true
+		}
+	}
+}
+</script>
+
+<style lang="scss" scoped>
+@import '../../libs/css/components.scss';
+
+/* #ifndef APP-NVUE */
+// vue版本动画相关的样式抽离在外部文件
+@import './vue.ani-style.scss';
+/* #endif */
+
+.u-transition {}
+</style>
diff --git a/uni_modules/uview-plus/components/u-transition/vue.ani-style.scss b/uni_modules/uview-plus/components/u-transition/vue.ani-style.scss
new file mode 100644
index 0000000..a31d88b
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-transition/vue.ani-style.scss
@@ -0,0 +1,113 @@
+/**
+ * vue版本动画内置的动画模式有如下:
+ * fade:淡入
+ * zoom:缩放
+ * fade-zoom:缩放淡入
+ * fade-up:上滑淡入
+ * fade-down:下滑淡入
+ * fade-left:左滑淡入
+ * fade-right:右滑淡入
+ * slide-up:上滑进入
+ * slide-down:下滑进入
+ * slide-left:左滑进入
+ * slide-right:右滑进入
+ */
+
+$u-zoom-scale: scale(0.95);
+
+.u-fade-enter-active,
+.u-fade-leave-active {
+	transition-property: opacity;
+}
+
+.u-fade-enter,
+.u-fade-leave-to {
+	opacity: 0
+}
+
+.u-fade-zoom-enter,
+.u-fade-zoom-leave-to {
+	transform: $u-zoom-scale;
+	opacity: 0;
+}
+
+.u-fade-zoom-enter-active,
+.u-fade-zoom-leave-active {
+	transition-property: transform, opacity;
+}
+
+.u-fade-down-enter-active,
+.u-fade-down-leave-active,
+.u-fade-left-enter-active,
+.u-fade-left-leave-active,
+.u-fade-right-enter-active,
+.u-fade-right-leave-active,
+.u-fade-up-enter-active,
+.u-fade-up-leave-active {
+	transition-property: opacity, transform;
+}
+
+.u-fade-up-enter,
+.u-fade-up-leave-to {
+	transform: translate3d(0, 100%, 0);
+	opacity: 0
+}
+
+.u-fade-down-enter,
+.u-fade-down-leave-to {
+	transform: translate3d(0, -100%, 0);
+	opacity: 0
+}
+
+.u-fade-left-enter,
+.u-fade-left-leave-to {
+	transform: translate3d(-100%, 0, 0);
+	opacity: 0
+}
+
+.u-fade-right-enter,
+.u-fade-right-leave-to {
+	transform: translate3d(100%, 0, 0);
+	opacity: 0
+}
+
+.u-slide-down-enter-active,
+.u-slide-down-leave-active,
+.u-slide-left-enter-active,
+.u-slide-left-leave-active,
+.u-slide-right-enter-active,
+.u-slide-right-leave-active,
+.u-slide-up-enter-active,
+.u-slide-up-leave-active {
+	transition-property: transform;
+}
+
+.u-slide-up-enter,
+.u-slide-up-leave-to {
+	transform: translate3d(0, 100%, 0)
+}
+
+.u-slide-down-enter,
+.u-slide-down-leave-to {
+	transform: translate3d(0, -100%, 0)
+}
+
+.u-slide-left-enter,
+.u-slide-left-leave-to {
+	transform: translate3d(-100%, 0, 0)
+}
+
+.u-slide-right-enter,
+.u-slide-right-leave-to {
+	transform: translate3d(100%, 0, 0)
+}
+
+.u-zoom-enter-active,
+.u-zoom-leave-active {
+	transition-property: transform
+}
+
+.u-zoom-enter,
+.u-zoom-leave-to {
+	transform: $u-zoom-scale
+}
diff --git a/uni_modules/uview-plus/components/u-upload/mixin.js b/uni_modules/uview-plus/components/u-upload/mixin.js
new file mode 100644
index 0000000..8c6e959
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-upload/mixin.js
@@ -0,0 +1,22 @@
+import { error } from '../../libs/function/index';
+export default {
+    watch: {
+        // 监听accept的变化,判断是否符合个平台要求
+        // 只有微信小程序才支持选择媒体,文件类型,所以这里做一个判断提示
+        accept: {
+            immediate: true,
+            handler(val) {
+                // #ifndef MP-WEIXIN
+                if (val === 'all' || val === 'media') {
+                    error('只有微信小程序才支持把accept配置为all、media之一')
+                }
+                // #endif
+                // #ifndef H5 || MP-WEIXIN
+                if (val === 'file') {
+                    error('只有微信小程序和H5(HX2.9.9)才支持把accept配置为file')
+                }
+                // #endif
+            }
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-upload/props.js b/uni_modules/uview-plus/components/u-upload/props.js
new file mode 100644
index 0000000..c477aca
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-upload/props.js
@@ -0,0 +1,125 @@
+import defProps from '../../libs/config/props.js';
+export default {
+    props: {
+        // 接受的文件类型, 可选值为all media image file video
+        accept: {
+            type: String,
+            default: () => defProps.upload.accept
+        },
+        // 	图片或视频拾取模式,当accept为image类型时设置capture可选额外camera可以直接调起摄像头
+        capture: {
+            type: [String, Array],
+            default: () => defProps.upload.capture
+        },
+        // 当accept为video时生效,是否压缩视频,默认为true
+        compressed: {
+            type: Boolean,
+            default: () => defProps.upload.compressed
+        },
+        // 当accept为video时生效,可选值为back或front
+        camera: {
+            type: String,
+            default: () => defProps.upload.camera
+        },
+        // 当accept为video时生效,拍摄视频最长拍摄时间,单位秒
+        maxDuration: {
+            type: Number,
+            default: () => defProps.upload.maxDuration
+        },
+        // 上传区域的图标,只能内置图标
+        uploadIcon: {
+            type: String,
+            default: () => defProps.upload.uploadIcon
+        },
+        // 上传区域的图标的颜色,默认
+        uploadIconColor: {
+            type: String,
+            default: () => defProps.upload.uploadIconColor
+        },
+        // 是否开启文件读取前事件
+        useBeforeRead: {
+            type: Boolean,
+            default: () => defProps.upload.useBeforeRead
+        },
+        // 读取后的处理函数
+        afterRead: {
+            type: Function,
+            default: null
+        },
+        // 读取前的处理函数
+        beforeRead: {
+            type: Function,
+            default: null
+        },
+        // 是否显示组件自带的图片预览功能
+        previewFullImage: {
+            type: Boolean,
+            default: () => defProps.upload.previewFullImage
+        },
+        // 最大上传数量
+        maxCount: {
+            type: [String, Number],
+            default: () => defProps.upload.maxCount
+        },
+        // 是否启用
+        disabled: {
+            type: Boolean,
+            default: () => defProps.upload.disabled
+        },
+        // 预览上传的图片时的裁剪模式,和image组件mode属性一致
+        imageMode: {
+            type: String,
+            default: () => defProps.upload.imageMode
+        },
+        // 标识符,可以在回调函数的第二项参数中获取
+        name: {
+            type: String,
+            default: () => defProps.upload.name
+        },
+        // 所选的图片的尺寸, 可选值为original compressed
+        sizeType: {
+            type: Array,
+            default: () => defProps.upload.sizeType
+        },
+        // 是否开启图片多选,部分安卓机型不支持
+        multiple: {
+            type: Boolean,
+            default: () => defProps.upload.multiple
+        },
+        // 是否展示删除按钮
+        deletable: {
+            type: Boolean,
+            default: () => defProps.upload.deletable
+        },
+        // 文件大小限制,单位为byte
+        maxSize: {
+            type: [String, Number],
+            default: () => defProps.upload.maxSize
+        },
+        // 显示已上传的文件列表
+        fileList: {
+            type: Array,
+            default: () => defProps.upload.fileList
+        },
+        // 上传区域的提示文字
+        uploadText: {
+            type: String,
+            default: () => defProps.upload.uploadText
+        },
+        // 内部预览图片区域和选择图片按钮的区域宽度
+        width: {
+            type: [String, Number],
+            default: () => defProps.upload.width
+        },
+        // 内部预览图片区域和选择图片按钮的区域高度
+        height: {
+            type: [String, Number],
+            default: () => defProps.upload.height
+        },
+        // 是否在上传完成后展示预览图
+        previewImage: {
+            type: Boolean,
+            default: () => defProps.upload.previewImage
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/components/u-upload/u-upload.vue b/uni_modules/uview-plus/components/u-upload/u-upload.vue
new file mode 100644
index 0000000..cb1a366
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-upload/u-upload.vue
@@ -0,0 +1,567 @@
+<template>
+	<view class="u-upload" :style="[addStyle(customStyle)]">
+		<view class="u-upload__wrap" >
+			<template v-if="previewImage">
+				<view
+				    class="u-upload__wrap__preview"
+				    v-for="(item, index) in lists"
+				    :key="index"
+				>
+					<image
+					    v-if="item.isImage || (item.type && item.type === 'image')"
+					    :src="item.thumb || item.url"
+					    :mode="imageMode"
+					    class="u-upload__wrap__preview__image"
+					    @tap="onPreviewImage(item)"
+						:style="[{
+							width: addUnit(width),
+							height: addUnit(height)
+						}]"
+					/>
+					<view
+					    v-else
+					    class="u-upload__wrap__preview__other"
+					>
+						<u-icon
+						    color="#80CBF9"
+						    size="26"
+						    :name="item.isVideo || (item.type && item.type === 'video') ? 'movie' : 'folder'"
+						></u-icon>
+						<text class="u-upload__wrap__preview__other__text">{{item.isVideo || (item.type && item.type === 'video') ? '视频' : '文件'}}</text>
+					</view>
+					<view
+					    class="u-upload__status"
+					    v-if="item.status === 'uploading' || item.status === 'failed'"
+					>
+						<view class="u-upload__status__icon">
+							<u-icon
+							    v-if="item.status === 'failed'"
+							    name="close-circle"
+							    color="#ffffff"
+							    size="25"
+							/>
+							<u-loading-icon
+							    size="22"
+							    mode="circle"
+							    color="#ffffff"
+							    v-else
+							/>
+						</view>
+						<text
+						    v-if="item.message"
+						    class="u-upload__status__message"
+						>{{ item.message }}</text>
+					</view>
+					<view
+					    class="u-upload__deletable"
+					    v-if="item.status !== 'uploading' && (deletable || item.deletable)"
+					    @tap.stop="deleteItem(index)"
+					>
+						<view class="u-upload__deletable__icon">
+							<u-icon
+							    name="close"
+							    color="#ffffff"
+							    size="10"
+							></u-icon>
+						</view>
+					</view>
+					<view
+					    class="u-upload__success"
+					    v-if="item.status === 'success'"
+					>
+						<!-- #ifdef APP-NVUE -->
+						<image
+						    :src="successIcon"
+						    class="u-upload__success__icon"
+						></image>
+						<!-- #endif -->
+						<!-- #ifndef APP-NVUE -->
+						<view class="u-upload__success__icon">
+							<u-icon
+							    name="checkmark"
+							    color="#ffffff"
+							    size="12"
+							></u-icon>
+						</view>
+						<!-- #endif -->
+					</view>
+				</view>
+				
+			</template>
+			
+			<template v-if="isInCount">
+				<view
+				    v-if="$slots.default || $slots.$default"
+				    @tap="chooseFile"
+				>
+					<slot />
+				</view>
+				<view
+				    v-else
+				    class="u-upload__button"
+				    :hover-class="!disabled ? 'u-upload__button--hover' : ''"
+				    hover-stay-time="150"
+				    @tap="chooseFile"
+				    :class="[disabled && 'u-upload__button--disabled']"
+					:style="[{
+						width: addUnit(width),
+						height: addUnit(height)
+					}]"
+				>
+					<u-icon
+					    :name="uploadIcon"
+					    size="26"
+					    :color="uploadIconColor"
+					></u-icon>
+					<text
+					    v-if="uploadText"
+					    class="u-upload__button__text"
+					>{{ uploadText }}</text>
+				</view>
+			</template>
+		</view>
+
+	</view>
+</template>
+
+<script>
+	import {
+		chooseFile
+	} from './utils';
+	import mixinUp from './mixin.js';
+	import props from './props';
+	import mpMixin from '../../libs/mixin/mpMixin';
+	import mixin from '../../libs/mixin/mixin';
+	import { addStyle, addUnit, toast } from '../../libs/function/index';
+	import test from '../../libs/function/test';
+	/**
+	 * upload 上传
+	 * @description 该组件用于上传图片场景
+	 * @tutorial https://uview-plus.jiangruyi.com/components/upload.html
+	 * @property {String}			accept				接受的文件类型, 可选值为all media image file video (默认 'image' )
+	 * @property {String | Array}	capture				图片或视频拾取模式,当accept为image类型时设置capture可选额外camera可以直接调起摄像头(默认 ['album', 'camera'] )
+	 * @property {Boolean}			compressed			当accept为video时生效,是否压缩视频,默认为true(默认 true )
+	 * @property {String}			camera				当accept为video时生效,可选值为back或front(默认 'back' )
+	 * @property {Number}			maxDuration			当accept为video时生效,拍摄视频最长拍摄时间,单位秒(默认 60 )
+	 * @property {String}			uploadIcon			上传区域的图标,只能内置图标(默认 'camera-fill' )
+	 * @property {String}			uploadIconColor		上传区域的图标的字体颜色,只能内置图标(默认 #D3D4D6 )
+	 * @property {Boolean}			useBeforeRead		是否开启文件读取前事件(默认 false )
+	 * @property {Boolean}			previewFullImage	是否显示组件自带的图片预览功能(默认 true )
+	 * @property {String | Number}	maxCount			最大上传数量(默认 52 )
+	 * @property {Boolean}			disabled			是否启用(默认 false )
+	 * @property {String}			imageMode			预览上传的图片时的裁剪模式,和image组件mode属性一致(默认 'aspectFill' )
+	 * @property {String}			name				标识符,可以在回调函数的第二项参数中获取
+	 * @property {Array}			sizeType			所选的图片的尺寸, 可选值为original compressed(默认 ['original', 'compressed'] )
+	 * @property {Boolean}			multiple			是否开启图片多选,部分安卓机型不支持 (默认 false )
+	 * @property {Boolean}			deletable			是否展示删除按钮(默认 true )
+	 * @property {String | Number}	maxSize				文件大小限制,单位为byte (默认 Number.MAX_VALUE )
+	 * @property {Array}			fileList			显示已上传的文件列表
+	 * @property {String}			uploadText			上传区域的提示文字
+	 * @property {String | Number}	width				内部预览图片区域和选择图片按钮的区域宽度(默认 80 )
+	 * @property {String | Number}	height				内部预览图片区域和选择图片按钮的区域高度(默认 80 )
+	 * @property {Object}			customStyle			组件的样式,对象形式
+	 * @event {Function} afterRead		读取后的处理函数
+	 * @event {Function} beforeRead		读取前的处理函数
+	 * @event {Function} oversize		文件超出大小限制
+	 * @event {Function} clickPreview	点击预览图片
+	 * @event {Function} delete 		删除图片
+	 * @example <u-upload :action="action" :fileList="fileList" ></u-upload>
+	 */
+	export default {
+		name: "u-upload",
+		mixins: [mpMixin, mixin, mixinUp, props],
+		data() {
+			return {
+				// #ifdef APP-NVUE
+				successIcon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAKKADAAQAAAABAAAAKAAAAAB65masAAACP0lEQVRYCc3YXygsURwH8K/dpcWyG3LF5u/6/+dKVylSypuUl6uUPMifKMWL8oKEB1EUT1KeUPdR3uTNUsSLxb2udG/cbvInNuvf2rVnazZ/ZndmZ87snjM1Z+Z3zpzfp9+Z5mEAhlvjRtZgCKs+gnPAOcAkkMOR4jEHfItjDvgRxxSQD8cM0BuOCaAvXNCBQrigAsXgggYUiwsK0B9cwIH+4gIKlIILGFAqLiBAOTjFgXJxigJp4BQD0sIpAqSJow6kjSNAFTnRaHJwLenD6Mud52VQAcrBfTd2oyq+HtGaGGWAcnAVcXWoM3bCZrdi+ncPfaAcXE5UKVpdW/vitGPqqAtn98d0gXJwX7Qp6MmegUYVhvmTIezdmHlxJCjpHRTCFerLkRRu4k0aqdajN3sWOo0BK//msHa+xDuPC/oNFMKRhTtM4xjIX0SCNpXL4+7VIaHuyiWEp2L7ahWLf8fejfPdqPmC3mJicORZUp1CQzm+GiphvljGk+PBvWRbxii+xVTj5M6CiZ/tsDufvaXyxEUDxeLIyvu3m0iOyEFWVAkydcVYdyFrE9tQk9iMq6f/GNlvwt3LjQfh60LUrw9/cFyyMJUW/XkLSNMV4Mi6C5ML+ui4x5ClAX9sB9w0wV6wglJwJCv5fOxcr6EstgbGiEw4XcfUry4cWrcEUW8n+ARKxXEJHhw2WG43UKSvwI/TSZgvl7kh0b3XLZaLEy0QmMgLZAVH7J+ALOE+AVnDvQOyiPMAWcW5gSzjCPAV+78S5WE0GrQAAAAASUVORK5CYII=',
+				// #endif
+				lists: [],
+				isInCount: true,
+			}
+		},
+		watch: {
+			// 监听文件列表的变化,重新整理内部数据
+			fileList: {
+				handler() {
+					this.formatFileList()
+				},
+				immediate: true,
+				deep: true,
+			},
+		},
+		// #ifdef VUE3
+		emits: ['error', 'beforeRead', 'oversize', 'afterRead', 'delete', 'clickPreview'],
+		// #endif
+		methods: {
+			addUnit,
+			addStyle,
+			formatFileList() {
+				const {
+					fileList = [], maxCount
+				} = this;
+				const lists = fileList.map((item) =>
+					Object.assign(Object.assign({}, item), {
+						// 如果item.url为本地选择的blob文件的话,无法判断其为video还是image,此处优先通过accept做判断处理
+						isImage: this.accept === 'image' || test.image(item.url || item.thumb),
+						isVideo: this.accept === 'video' || test.video(item.url || item.thumb),
+						deletable: typeof(item.deletable) === 'boolean' ? item.deletable : this.deletable,
+					})
+				);
+				this.lists = lists
+				this.isInCount = lists.length < maxCount
+			},
+			chooseFile() {
+				const {
+					maxCount,
+					multiple,
+					lists,
+					disabled
+				} = this;
+				if (disabled) return;
+				// 如果用户传入的是字符串,需要格式化成数组
+				let capture;
+				try {
+					capture = test.array(this.capture) ? this.capture : this.capture.split(',');
+				}catch(e) {
+					capture = [];
+				}
+				chooseFile(
+						Object.assign({
+							accept: this.accept,
+							multiple: this.multiple,
+							capture: capture,
+							compressed: this.compressed,
+							maxDuration: this.maxDuration,
+							sizeType: this.sizeType,
+							camera: this.camera,
+						}, {
+							maxCount: maxCount - lists.length,
+						})
+					)
+					.then((res) => {
+						this.onBeforeRead(multiple ? res : res[0]);
+					})
+					.catch((error) => {
+						this.$emit('error', error);
+					});
+			},
+			// 文件读取之前
+			onBeforeRead(file) {
+				const {
+					beforeRead,
+					useBeforeRead,
+				} = this;
+				let res = true
+				// beforeRead是否为一个方法
+				if (test.func(beforeRead)) {
+					// 如果用户定义了此方法,则去执行此方法,并传入读取的文件回调
+					res = beforeRead(file, this.getDetail());
+				}
+				if (useBeforeRead) {
+					res = new Promise((resolve, reject) => {
+						this.$emit(
+							'beforeRead',
+							Object.assign(Object.assign({
+								file
+							}, this.getDetail()), {
+								callback: (ok) => {
+									ok ? resolve() : reject();
+								},
+							})
+						);
+					});
+				}
+				if (!res) {
+					return;
+				}
+				if (test.promise(res)) {
+					res.then((data) => this.onAfterRead(data || file));
+				} else {
+					this.onAfterRead(file);
+				}
+			},
+			getDetail(index) {
+				return {
+					name: this.name,
+					index: index == null ? this.fileList.length : index,
+				};
+			},
+			onAfterRead(file) {
+				const {
+					maxSize,
+					afterRead
+				} = this;
+				const oversize = Array.isArray(file) ?
+					file.some((item) => item.size > maxSize) :
+					file.size > maxSize;
+				if (oversize) {
+					this.$emit('oversize', Object.assign({
+						file
+					}, this.getDetail()));
+					return;
+				}
+				if (typeof afterRead === 'function') {
+					afterRead(file, this.getDetail());
+				}
+				this.$emit('afterRead', Object.assign({
+					file
+				}, this.getDetail()));
+			},
+			deleteItem(index) {
+				this.$emit(
+					'delete',
+					Object.assign(Object.assign({}, this.getDetail(index)), {
+						file: this.fileList[index],
+					})
+				);
+			},
+			// 预览图片
+			onPreviewImage(item) {
+				if (!item.isImage || !this.previewFullImage) return
+				uni.previewImage({
+					// 先filter找出为图片的item,再返回filter结果中的图片url
+					urls: this.lists.filter((item) => this.accept === 'image' || test.image(item.url || item.thumb)).map((item) => item.url || item.thumb),
+					current: item.url || item.thumb,
+					fail() {
+						toast('预览图片失败')
+					},
+				});
+			},
+			onPreviewVideo(event) {
+				if (!this.data.previewFullImage) return;
+				const {
+					index
+				} = event.currentTarget.dataset;
+				const {
+					lists
+				} = this.data;
+				wx.previewMedia({
+					sources: lists
+						.filter((item) => isVideoFile(item))
+						.map((item) =>
+							Object.assign(Object.assign({}, item), {
+								type: 'video'
+							})
+						),
+					current: index,
+					fail() {
+						toast('预览视频失败')
+					},
+				});
+			},
+			onClickPreview(event) {
+				const {
+					index
+				} = event.currentTarget.dataset;
+				const item = this.data.lists[index];
+				this.$emit(
+					'clickPreview',
+					Object.assign(Object.assign({}, item), this.getDetail(index))
+				);
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import '../../libs/css/components.scss';
+	$u-upload-preview-border-radius: 2px !default;
+	$u-upload-preview-margin: 0 8px 8px 0 !default;
+	$u-upload-image-width:80px !default;
+	$u-upload-image-height:$u-upload-image-width;
+	$u-upload-other-bgColor: rgb(242, 242, 242) !default;
+	$u-upload-other-flex:1 !default;
+	$u-upload-text-font-size:11px !default;
+	$u-upload-text-color:$u-tips-color !default;
+	$u-upload-text-margin-top:2px !default;
+	$u-upload-deletable-right:0 !default;
+	$u-upload-deletable-top:0 !default;
+	$u-upload-deletable-bgColor:rgb(55, 55, 55) !default;
+	$u-upload-deletable-height:14px !default;
+	$u-upload-deletable-width:$u-upload-deletable-height;
+	$u-upload-deletable-boder-bottom-left-radius:100px !default;
+	$u-upload-deletable-zIndex:3 !default;
+	$u-upload-success-bottom:0 !default;
+	$u-upload-success-right:0 !default;
+	$u-upload-success-border-style:solid !default;
+	$u-upload-success-border-top-color:transparent !default;
+	$u-upload-success-border-left-color:transparent !default;
+	$u-upload-success-border-bottom-color: $u-success !default;
+	$u-upload-success-border-right-color:$u-upload-success-border-bottom-color;
+	$u-upload-success-border-width:9px !default;
+	$u-upload-icon-top:0px !default;
+	$u-upload-icon-right:0px !default;
+	$u-upload-icon-h5-top:1px !default;
+	$u-upload-icon-h5-right:0 !default;
+	$u-upload-icon-width:16px !default;
+	$u-upload-icon-height:$u-upload-icon-width;
+	$u-upload-success-icon-bottom:-10px !default;
+	$u-upload-success-icon-right:-10px !default;
+	$u-upload-status-right:0 !default;
+	$u-upload-status-left:0 !default;
+	$u-upload-status-bottom:0 !default;
+	$u-upload-status-top:0 !default;
+	$u-upload-status-bgColor:rgba(0, 0, 0, 0.5) !default;
+	$u-upload-status-icon-Zindex:1 !default;
+	$u-upload-message-font-size:12px !default;
+	$u-upload-message-color:#FFFFFF !default;
+	$u-upload-message-margin-top:5px !default;
+	$u-upload-button-width:80px !default;
+	$u-upload-button-height:$u-upload-button-width;
+	$u-upload-button-bgColor:rgb(244, 245, 247) !default;
+	$u-upload-button-border-radius:2px !default;
+	$u-upload-botton-margin: 0 8px 8px 0 !default;
+	$u-upload-text-font-size:11px !default;
+	$u-upload-text-color:$u-tips-color !default;
+	$u-upload-text-margin-top: 2px !default;
+	$u-upload-hover-bgColor:rgb(230, 231, 233) !default;
+	$u-upload-disabled-opacity:.5 !default;
+
+	.u-upload {
+		@include flex(column);
+		flex: 1;
+
+		&__wrap {
+			@include flex;
+			flex-wrap: wrap;
+			flex: 1;
+
+			&__preview {
+				border-radius: $u-upload-preview-border-radius;
+				margin: $u-upload-preview-margin;
+				position: relative;
+				overflow: hidden;
+				@include flex;
+
+				&__image {
+					width: $u-upload-image-width;
+					height: $u-upload-image-height;
+				}
+
+				&__other {
+					width: $u-upload-image-width;
+					height: $u-upload-image-height;
+					background-color: $u-upload-other-bgColor;
+					flex: $u-upload-other-flex;
+					@include flex(column);
+					justify-content: center;
+					align-items: center;
+
+					&__text {
+						font-size: $u-upload-text-font-size;
+						color: $u-upload-text-color;
+						margin-top: $u-upload-text-margin-top;
+					}
+				}
+			}
+		}
+
+		&__deletable {
+			position: absolute;
+			top: $u-upload-deletable-top;
+			right: $u-upload-deletable-right;
+			background-color: $u-upload-deletable-bgColor;
+			height: $u-upload-deletable-height;
+			width: $u-upload-deletable-width;
+			@include flex;
+			border-bottom-left-radius: $u-upload-deletable-boder-bottom-left-radius;
+			align-items: center;
+			justify-content: center;
+			z-index: $u-upload-deletable-zIndex;
+
+			&__icon {
+				position: absolute;
+				transform: scale(0.7);
+				top: $u-upload-icon-top;
+				right: $u-upload-icon-right;
+				/* #ifdef H5 */
+				top: $u-upload-icon-h5-top;
+				right: $u-upload-icon-h5-right;
+				/* #endif */
+			}
+		}
+
+		&__success {
+			position: absolute;
+			bottom: $u-upload-success-bottom;
+			right: $u-upload-success-right;
+			@include flex;
+			// 由于weex(nvue)为阿里巴巴的KPI(部门业绩考核)的laji产物,不支持css绘制三角形
+			// 所以在nvue下使用图片,非nvue下使用css实现
+			/* #ifndef APP-NVUE */
+			border-style: $u-upload-success-border-style;
+			border-top-color: $u-upload-success-border-top-color;
+			border-left-color: $u-upload-success-border-left-color;
+			border-bottom-color: $u-upload-success-border-bottom-color;
+			border-right-color: $u-upload-success-border-right-color;
+			border-width: $u-upload-success-border-width;
+			align-items: center;
+			justify-content: center;
+			/* #endif */
+
+			&__icon {
+				/* #ifndef APP-NVUE */
+				position: absolute;
+				transform: scale(0.7);
+				bottom: $u-upload-success-icon-bottom;
+				right: $u-upload-success-icon-right;
+				/* #endif */
+				/* #ifdef APP-NVUE */
+				width: $u-upload-icon-width;
+				height: $u-upload-icon-height;
+				/* #endif */
+			}
+		}
+
+		&__status {
+			position: absolute;
+			top: $u-upload-status-top;
+			bottom: $u-upload-status-bottom;
+			left: $u-upload-status-left;
+			right: $u-upload-status-right;
+			background-color: $u-upload-status-bgColor;
+			@include flex(column);
+			align-items: center;
+			justify-content: center;
+
+			&__icon {
+				position: relative;
+				z-index: $u-upload-status-icon-Zindex;
+			}
+
+			&__message {
+				font-size: $u-upload-message-font-size;
+				color: $u-upload-message-color;
+				margin-top: $u-upload-message-margin-top;
+			}
+		}
+
+		&__button {
+			@include flex(column);
+			align-items: center;
+			justify-content: center;
+			width: $u-upload-button-width;
+			height: $u-upload-button-height;
+			background-color: $u-upload-button-bgColor;
+			border-radius: $u-upload-button-border-radius;
+			margin: $u-upload-botton-margin;
+			/* #ifndef APP-NVUE */
+			box-sizing: border-box;
+			/* #endif */
+
+			&__text {
+				font-size: $u-upload-text-font-size;
+				color: $u-upload-text-color;
+				margin-top: $u-upload-text-margin-top;
+			}
+
+			&--hover {
+				background-color: $u-upload-hover-bgColor;
+			}
+
+			&--disabled {
+				opacity: $u-upload-disabled-opacity;
+			}
+		}
+	}
+</style>
diff --git a/uni_modules/uview-plus/components/u-upload/utils.js b/uni_modules/uview-plus/components/u-upload/utils.js
new file mode 100644
index 0000000..88cb602
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-upload/utils.js
@@ -0,0 +1,151 @@
+function pickExclude(obj, keys) {
+	// 某些情况下,type可能会为
+    if (!['[object Object]', '[object File]'].includes(Object.prototype.toString.call(obj))) {
+        return {}
+    }
+    return Object.keys(obj).reduce((prev, key) => {
+        if (!keys.includes(key)) {
+            prev[key] = obj[key]
+        }
+        return prev
+    }, {})
+}
+
+function formatImage(res) {
+    return res.tempFiles.map((item) => ({
+        ...pickExclude(item, ['path']),
+        type: 'image',
+        url: item.path,
+        thumb: item.path,
+		size: item.size,
+		// #ifdef H5
+		name: item.name
+		// #endif
+    }))
+}
+
+function formatVideo(res) {
+    return [
+        {
+            ...pickExclude(res, ['tempFilePath', 'thumbTempFilePath', 'errMsg']),
+            type: 'video',
+            url: res.tempFilePath,
+            thumb: res.thumbTempFilePath,
+			size: res.size,
+			// #ifdef H5
+			name: res.name
+			// #endif
+        }
+    ]
+}
+
+function formatMedia(res) {
+    return res.tempFiles.map((item) => ({
+        ...pickExclude(item, ['fileType', 'thumbTempFilePath', 'tempFilePath']),
+        type: res.type,
+        url: item.tempFilePath,
+        thumb: res.type === 'video' ? item.thumbTempFilePath : item.tempFilePath,
+		size: item.size
+    }))
+}
+
+function formatFile(res) {
+    return res.tempFiles.map((item) => ({ 
+		...pickExclude(item, ['path']), 
+		url: item.path, 
+		size:item.size,
+		// #ifdef H5
+		name: item.name,
+		type: item.type
+		// #endif 
+	}))
+}
+export function chooseFile({
+    accept,
+    multiple,
+    capture,
+    compressed,
+    maxDuration,
+    sizeType,
+    camera,
+    maxCount
+}) {
+    return new Promise((resolve, reject) => {
+        switch (accept) {
+        case 'image':
+            uni.chooseImage({
+                count: multiple ? Math.min(maxCount, 9) : 1,
+                sourceType: capture,
+                sizeType,
+                success: (res) => resolve(formatImage(res)),
+                fail: reject
+            })
+            break
+            // #ifdef MP-WEIXIN
+            // 只有微信小程序才支持chooseMedia接口
+        case 'media':
+            wx.chooseMedia({
+                count: multiple ? Math.min(maxCount, 9) : 1,
+                sourceType: capture,
+                maxDuration,
+                sizeType,
+                camera,
+                success: (res) => resolve(formatMedia(res)),
+                fail: reject
+            })
+            break
+            // #endif
+        case 'video':
+            uni.chooseVideo({
+                sourceType: capture,
+                compressed,
+                maxDuration,
+                camera,
+                success: (res) => resolve(formatVideo(res)),
+                fail: reject
+            })
+            break
+            // #ifdef MP-WEIXIN || H5
+            // 只有微信小程序才支持chooseMessageFile接口
+        case 'file':
+            // #ifdef MP-WEIXIN
+            wx.chooseMessageFile({
+                count: multiple ? maxCount : 1,
+                type: accept,
+                success: (res) => resolve(formatFile(res)),
+                fail: reject
+            })
+            // #endif
+            // #ifdef H5
+            // 需要hx2.9.9以上才支持uni.chooseFile
+            uni.chooseFile({
+                count: multiple ? maxCount : 1,
+                type: accept,
+                success: (res) => resolve(formatFile(res)),
+                fail: reject
+            })
+            // #endif
+            break
+				// #endif
+		default: 
+			// 此为保底选项,在accept不为上面任意一项的时候选取全部文件
+			// #ifdef MP-WEIXIN
+			wx.chooseMessageFile({
+			    count: multiple ? maxCount : 1,
+			    type: 'all',
+			    success: (res) => resolve(formatFile(res)),
+			    fail: reject
+			})
+			// #endif
+			// #ifdef H5
+			// 需要hx2.9.9以上才支持uni.chooseFile
+			uni.chooseFile({
+				count: multiple ? maxCount : 1,
+				type: 'all',
+				success: (res) => resolve(formatFile(res)),
+				fail: reject
+			})
+			// #endif
+        }
+    })
+}
diff --git a/uni_modules/uview-plus/components/u-waterfall/u-waterfall.vue b/uni_modules/uview-plus/components/u-waterfall/u-waterfall.vue
new file mode 100644
index 0000000..cce73d8
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-waterfall/u-waterfall.vue
@@ -0,0 +1,225 @@
+<template>
+    <view class="u-waterfall">
+        <view id="u-left-column" class="u-column">
+            <slot name="left" :leftList="leftList"></slot>
+        </view>
+        <view id="u-right-column" class="u-column">
+            <slot name="right" :rightList="rightList"></slot>
+        </view>
+    </view>
+</template>
+
+<script>
+    /**
+     * waterfall 瀑布流
+     * @description 这是一个瀑布流形式的组件,内容分为左右两列,结合uview的懒加载组件效果更佳。相较于某些只是奇偶数左右分别,或者没有利用vue作用域插槽的做法,uview的瀑布流实现了真正的 组件化,搭配LazyLoad 懒加载和loadMore 加载更多组件,让您开箱即用,眼前一亮。
+     * @tutorial https://uview-plus.jiangruyi.com/components/waterfall.html
+     * @property {Array} flow-list 用于渲染的数据
+     * @property {String Number} add-time 单条数据添加到队列的时间间隔,单位ms,见上方注意事项说明(默认200)
+     * @example <u-waterfall :flowList="flowList"></u-waterfall>
+     */
+    export default {
+        name: "u-waterfall",
+        props: {
+            // #ifdef VUE2
+            value: {
+                // 瀑布流数据
+                type: Array,
+                required: true,
+                default: function() {
+                    return [];
+                }
+            },
+            // #endif
+            // #ifdef VUE3
+            modelValue: {
+                // 瀑布流数据
+                type: Array,
+                required: true,
+                default: function() {
+                    return [];
+                }
+            },
+            // #endif
+            // 每次向结构插入数据的时间间隔,间隔越长,越能保证两列高度相近,但是对用户体验越不好
+            // 单位ms
+            addTime: {
+                type: [Number, String],
+                default: 200
+            },
+            // id值,用于清除某一条数据时,根据此idKey名称找到并移除,如数据为{idx: 22, name: 'lisa'}
+            // 那么该把idKey设置为idx
+            idKey: {
+                type: String,
+                default: 'id'
+            }
+        },
+        data() {
+            return {
+                leftList: [],
+                rightList: [],
+                tempList: [],
+                children: []
+            }
+        },
+        watch: {
+            copyFlowList(nVal, oVal) {
+                // 取差值,即这一次数组变化新增的部分
+                let startIndex = Array.isArray(oVal) && oVal.length > 0 ? oVal.length : 0;
+                // 拼接上原有数据
+                this.tempList = this.tempList.concat(this.cloneData(nVal.slice(startIndex)));
+                this.splitData();
+            }
+        },
+        mounted() {
+            this.tempList = this.cloneData(this.copyFlowList);
+            this.splitData();
+        },
+        computed: {
+            // 破坏flowList变量的引用,否则watch的结果新旧值是一样的
+            copyFlowList() {
+                // #ifdef VUE2
+                return this.cloneData(this.value);
+                // #endif
+                // #ifdef VUE3
+                return this.cloneData(this.modelValue);
+                // #endif
+            }
+        },
+        emits: ['update:modelValue'],
+        methods: {
+            async splitData() {
+                if (!this.tempList.length) return;
+                let leftRect = await this.$uGetRect('#u-left-column');
+                let rightRect = await this.$uGetRect('#u-right-column');
+                // 如果左边小于或等于右边,就添加到左边,否则添加到右边
+                let item = this.tempList[0];
+                // 解决多次快速上拉后,可能数据会乱的问题,因为经过上面的两个await节点查询阻塞一定时间,加上后面的定时器干扰
+                // 数组可能变成[],导致此item值可能为undefined
+                if (!item) return;
+                if (leftRect.height < rightRect.height) {
+                    this.leftList.push(item);
+                } else if (leftRect.height > rightRect.height) {
+                    this.rightList.push(item);
+                } else {
+                    // 这里是为了保证第一和第二张添加时,左右都能有内容
+                    // 因为添加第一张,实际队列的高度可能还是0,这时需要根据队列元素长度判断下一个该放哪边
+                    if (this.leftList.length <= this.rightList.length) {
+                        this.leftList.push(item);
+                    } else {
+                        this.rightList.push(item);
+                    }
+                }
+                // 移除临时列表的第一项
+                this.tempList.splice(0, 1);
+                // 如果临时数组还有数据,继续循环
+                if (this.tempList.length) {
+                    setTimeout(() => {
+                        this.splitData();
+                    }, this.addTime)
+                }
+            },
+            // 复制而不是引用对象和数组
+            cloneData(data) {
+                return JSON.parse(JSON.stringify(data));
+            },
+            // 清空数据列表
+            clear() {
+                this.leftList = [];
+                this.rightList = [];
+                // 同时清除父组件列表中的数据
+                // #ifdef VUE2
+                this.$emit('input', []);
+                // #endif
+                // #ifdef VUE3
+                this.$emit('update:modelValue', []);
+                // #endif
+                this.tempList = [];
+            },
+            // 清除某一条指定的数据,根据id实现
+            remove(id) {
+                // 如果findIndex找不到合适的条件,就会返回-1
+                let index = -1;
+                index = this.leftList.findIndex(val => val[this.idKey] == id);
+                if (index != -1) {
+                    // 如果index不等于-1,说明已经找到了要找的id,根据index索引删除这一条数据
+                    this.leftList.splice(index, 1);
+                } else {
+                    // 同理于上方面的方法
+                    index = this.rightList.findIndex(val => val[this.idKey] == id);
+                    if (index != -1) this.rightList.splice(index, 1);
+                }
+                // 同时清除父组件的数据中的对应id的条目
+                // #ifdef VUE2
+                index = this.value.findIndex(val => val[this.idKey] == id);
+                if (index != -1) this.$emit('input', this.value.splice(index, 1));
+                // #endif
+                // #ifdef VUE3
+                index = this.modelvalue.findIndex(val => val[this.idKey] == id);
+                if (index != -1) this.$emit('input', this.modelvalue.splice(index, 1));
+                // #endif
+            },
+            // 修改某条数据的某个属性
+            modify(id, key, value) {
+                // 如果findIndex找不到合适的条件,就会返回-1
+                let index = -1;
+                index = this.leftList.findIndex(val => val[this.idKey] == id);
+                if (index != -1) {
+                    // 如果index不等于-1,说明已经找到了要找的id,修改对应key的值
+                    this.leftList[index][key] = value;
+                } else {
+                    // 同理于上方面的方法
+                    index = this.rightList.findIndex(val => val[this.idKey] == id);
+                    if (index != -1) this.rightList[index][key] = value;
+                }
+                // 修改父组件的数据中的对应id的条目
+                // #ifdef VUE2
+                index = this.value.findIndex(val => val[this.idKey] == id);
+                // #endif
+                // #ifdef VUE3
+                index = this.modelvalue.findIndex(val => val[this.idKey] == id);
+                // #endif
+                if (index != -1) {
+                    // 首先复制一份value的数据
+                    // #ifdef VUE2
+                    let data = this.cloneData(this.value);
+                    // #endif
+                    // #ifdef VUE3
+                    let data = this.cloneData(this.modelvalue);
+                    // #endif
+                    // 修改对应索引的key属性的值为value
+                    data[index][key] = value;
+                    // 修改父组件通过v-model绑定的变量的值
+                    // #ifdef VUE2
+                    this.$emit('input', data);
+                    // #endif
+                    // #ifdef VUE3
+                    this.$emit('update:modelValue', data);
+                    // #endif
+
+                }
+            }
+        }
+    }
+</script>
+
+<style lang="scss" scoped>
+    @import "../../libs/css/components.scss";
+
+    .u-waterfall {
+        @include flex;
+        flex-direction: row;
+        align-items: flex-start;
+    }
+
+    .u-column {
+        @include flex;
+        flex: 1;
+        flex-direction: column;
+        height: auto;
+    }
+
+    .u-image {
+        width: 100%;
+    }
+</style>
\ No newline at end of file
diff --git a/uni_modules/uview-plus/components/uview-plus/uview-plus.vue b/uni_modules/uview-plus/components/uview-plus/uview-plus.vue
new file mode 100644
index 0000000..bcd3662
--- /dev/null
+++ b/uni_modules/uview-plus/components/uview-plus/uview-plus.vue
@@ -0,0 +1,15 @@
+<template>
+</template>
+
+<template>
+	<view></view>
+</template>
+
+<script>
+	export default {
+		
+	}
+</script>
+
+<style>
+</style>
diff --git a/uni_modules/uview-plus/index.js b/uni_modules/uview-plus/index.js
new file mode 100644
index 0000000..1370e11
--- /dev/null
+++ b/uni_modules/uview-plus/index.js
@@ -0,0 +1,94 @@
+// 看到此报错,是因为没有配置vite.config.js的【transpileDependencies】
+// const pleaseSetTranspileDependencies = {}, babelTest = pleaseSetTranspileDependencies?.test
+
+// 引入全局mixin
+import mixin from './libs/mixin/mixin.js'
+// 小程序特有的mixin
+import mpMixin from './libs/mixin/mpMixin.js'
+// 全局挂载引入http相关请求拦截插件
+import Request from './libs/luch-request'
+
+// 路由封装
+import route from './libs/util/route.js'
+// 颜色渐变相关,colorGradient-颜色渐变,hexToRgb-十六进制颜色转rgb颜色,rgbToHex-rgb转十六进制
+import colorGradient from './libs/function/colorGradient.js'
+
+// 规则检验
+import test from './libs/function/test.js'
+// 防抖方法
+import debounce from './libs/function/debounce.js'
+// 节流方法
+import throttle from './libs/function/throttle.js'
+// 公共文件写入的方法
+import index from './libs/function/index.js'
+
+// 配置信息
+import config from './libs/config/config.js'
+// props配置信息
+import props from './libs/config/props.js'
+// 各个需要fixed的地方的z-index配置文件
+import zIndex from './libs/config/zIndex.js'
+// 关于颜色的配置,特殊场景使用
+import color from './libs/config/color.js'
+// 平台
+import platform from './libs/function/platform'
+
+// 导出
+const http = new Request()
+let themeType = ['primary', 'success', 'error', 'warning', 'info'];
+export { route, http, debounce, throttle, platform, themeType, mixin, mpMixin, props, color, test, zIndex }
+export * from './libs/function/index.js'
+export * from './libs/function/colorGradient.js'
+
+/**
+ * @description 修改uView内置属性值
+ * @param {object} props 修改内置props属性
+ * @param {object} config 修改内置config属性
+ * @param {object} color 修改内置color属性
+ * @param {object} zIndex 修改内置zIndex属性
+ */
+export function setConfig(configs) {
+	index.shallowMerge(config, configs.config || {})
+	index.shallowMerge(props, configs.props || {})
+	index.shallowMerge(color, configs.color || {})
+	index.shallowMerge(zIndex, configs.zIndex || {})
+}
+index.setConfig = setConfig
+
+const $u = {
+    route,
+    date: index.timeFormat, // 另名date
+    colorGradient: colorGradient.colorGradient,
+    hexToRgb: colorGradient.hexToRgb,
+    rgbToHex: colorGradient.rgbToHex,
+    colorToRgba: colorGradient.colorToRgba,
+    test,
+    type: themeType,
+    http,
+    config, // uview-plus配置信息相关,比如版本号
+    zIndex,
+    debounce,
+    throttle,
+    mixin,
+    mpMixin,
+    props,
+    ...index,
+    color,
+    platform
+}
+
+// $u挂载到uni对象上
+uni.$u = $u
+
+const install = (Vue) => {
+    // 同时挂载到uni和Vue.prototype中
+    // #ifndef APP-NVUE
+    // 只有vue,挂载到Vue.prototype才有意义,因为nvue中全局Vue.prototype和Vue.mixin是无效的
+    Vue.config.globalProperties.$u = $u
+    Vue.mixin(mixin)
+    // #endif
+}
+
+export default {
+    install
+}
diff --git a/uni_modules/uview-plus/index.scss b/uni_modules/uview-plus/index.scss
new file mode 100644
index 0000000..b1585f4
--- /dev/null
+++ b/uni_modules/uview-plus/index.scss
@@ -0,0 +1,24 @@
+// 引入公共基础类
+@import "./libs/css/common.scss";
+@import "./libs/css/flex.scss";
+@import "./libs/css/color.scss";
+
+// 非nvue的样式
+/* #ifndef APP-NVUE */
+@import "./libs/css/vue.scss";
+/* #endif */
+
+// nvue的特有样式
+/* #ifdef APP-NVUE */
+@import "./libs/css/nvue.scss";
+/* #endif */
+
+// 小程序特有的样式
+/* #ifdef MP */
+@import "./libs/css/mp.scss";
+/* #endif */
+
+// H5特有的样式
+/* #ifdef H5 */
+@import "./libs/css/h5.scss";
+/* #endif */
\ No newline at end of file
diff --git a/uni_modules/uview-plus/libs/config/color.js b/uni_modules/uview-plus/libs/config/color.js
new file mode 100644
index 0000000..56b4187
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/color.js
@@ -0,0 +1,17 @@
+// 为了让用户能够自定义主题,会逐步弃用此文件,各颜色通过css提供
+// 为了给某些特殊场景使用和向后兼容,无需删除此文件(2020-06-20)
+const color = {
+    primary: '#3c9cff',
+    info: '#909399',
+    default: '#909399',
+    warning: '#f9ae3d',
+    error: '#f56c6c',
+    success: '#5ac725',
+    mainColor: '#303133',
+    contentColor: '#606266',
+    tipsColor: '#909399',
+    lightColor: '#c0c4cc',
+    borderColor: '#e4e7ed'
+}
+
+export default color
diff --git a/uni_modules/uview-plus/libs/config/config.js b/uni_modules/uview-plus/libs/config/config.js
new file mode 100644
index 0000000..283b5a5
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/config.js
@@ -0,0 +1,33 @@
+const version = '3'
+
+// 开发环境才提示,生产环境不会提示
+if (process.env.NODE_ENV === 'development') {
+	console.log(`\n %c uview-plus V${version} %c https://ijry.github.io/uview-plus/ \n\n`, 'color: #ffffff; background: #3c9cff; padding:5px 0;', 'color: #3c9cff;background: #ffffff; padding:5px 0;');
+}
+
+export default {
+    v: version,
+    version,
+    // 主题名称
+    type: [
+        'primary',
+        'success',
+        'info',
+        'error',
+        'warning'
+    ],
+    // 颜色部分,本来可以通过scss的:export导出供js使用,但是奈何nvue不支持
+    color: {
+        'u-primary': '#2979ff',
+        'u-warning': '#ff9900',
+        'u-success': '#19be6b',
+        'u-error': '#fa3534',
+        'u-info': '#909399',
+        'u-main-color': '#303133',
+        'u-content-color': '#606266',
+        'u-tips-color': '#909399',
+        'u-light-color': '#c0c4cc'
+    },
+	// 默认单位,可以通过配置为rpx,那么在用于传入组件大小参数为数值时,就默认为rpx
+	unit: 'px'
+}
diff --git a/uni_modules/uview-plus/libs/config/props.js b/uni_modules/uview-plus/libs/config/props.js
new file mode 100644
index 0000000..0736108
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props.js
@@ -0,0 +1,190 @@
+/**
+ * 此文件的作用为统一配置所有组件的props参数
+ * 借此用户可以全局覆盖组件的props默认值
+ * 无需在每个引入组件的页面中都配置一次
+ */
+import config from './config'
+
+import ActionSheet from './props/actionSheet'
+import Album from './props/album'
+import Alert from './props/alert'
+import Avatar from './props/avatar'
+import AvatarGroup from './props/avatarGroup'
+import Backtop from './props/backtop'
+import Badge from './props/badge'
+import Button from './props/button'
+import Calendar from './props/calendar'
+import CarKeyboard from './props/carKeyboard'
+import Cell from './props/cell'
+import CellGroup from './props/cellGroup'
+import Checkbox from './props/checkbox'
+import CheckboxGroup from './props/checkboxGroup'
+import CircleProgress from './props/circleProgress'
+import Code from './props/code'
+import CodeInput from './props/codeInput'
+import Col from './props/col'
+import Collapse from './props/collapse'
+import CollapseItem from './props/collapseItem'
+import ColumnNotice from './props/columnNotice'
+import CountDown from './props/countDown'
+import CountTo from './props/countTo'
+import DatetimePicker from './props/datetimePicker'
+import Divider from './props/divider'
+import Empty from './props/empty'
+import Form from './props/form'
+import GormItem from './props/formItem'
+import Gap from './props/gap'
+import Grid from './props/grid'
+import GridItem from './props/gridItem'
+import Icon from './props/icon'
+import Image from './props/image'
+import IndexAnchor from './props/indexAnchor'
+import IndexList from './props/indexList'
+import Input from './props/input'
+import Keyboard from './props/keyboard'
+import Line from './props/line'
+import LineProgress from './props/lineProgress'
+import Link from './props/link'
+import List from './props/list'
+import ListItem from './props/listItem'
+import LoadingIcon from './props/loadingIcon'
+import LoadingPage from './props/loadingPage'
+import Loadmore from './props/loadmore'
+import Modal from './props/modal'
+import Navbar from './props/navbar'
+import NoNetwork from './props/noNetwork'
+import NoticeBar from './props/noticeBar'
+import Notify from './props/notify'
+import NumberBox from './props/numberBox'
+import NumberKeyboard from './props/numberKeyboard'
+import Overlay from './props/overlay'
+import Parse from './props/parse'
+import Picker from './props/picker'
+import Popup from './props/popup'
+import Radio from './props/radio'
+import RadioGroup from './props/radioGroup'
+import Rate from './props/rate'
+import ReadMore from './props/readMore'
+import Row from './props/row'
+import RowNotice from './props/rowNotice'
+import ScrollList from './props/scrollList'
+import Search from './props/search'
+import Section from './props/section'
+import Skeleton from './props/skeleton'
+import Slider from './props/slider'
+import StatusBar from './props/statusBar'
+import Steps from './props/steps'
+import StepsItem from './props/stepsItem'
+import Sticky from './props/sticky'
+import Subsection from './props/subsection'
+import SwipeAction from './props/swipeAction'
+import SwipeActionItem from './props/swipeActionItem'
+import Swiper from './props/swiper'
+import SwipterIndicator from './props/swipterIndicator'
+import Switch from './props/switch'
+import Tabbar from './props/tabbar'
+import TabbarItem from './props/tabbarItem'
+import Tabs from './props/tabs'
+import Tag from './props/tag'
+import Text from './props/text'
+import Textarea from './props/textarea'
+import Toast from './props/toast'
+import Toolbar from './props/toolbar'
+import Tooltip from './props/tooltip'
+import Transition from './props/transition'
+import Upload from './props/upload'
+
+const {
+    color
+} = config
+
+export default {
+    ...ActionSheet,
+    ...Album,
+    ...Alert,
+    ...Avatar,
+    ...AvatarGroup,
+    ...Backtop,
+    ...Badge,
+    ...Button,
+    ...Calendar,
+    ...CarKeyboard,
+    ...Cell,
+    ...CellGroup,
+    ...Checkbox,
+    ...CheckboxGroup,
+    ...CircleProgress,
+    ...Code,
+    ...CodeInput,
+    ...Col,
+    ...Collapse,
+    ...CollapseItem,
+    ...ColumnNotice,
+    ...CountDown,
+    ...CountTo,
+    ...DatetimePicker,
+    ...Divider,
+    ...Empty,
+    ...Form,
+    ...GormItem,
+    ...Gap,
+    ...Grid,
+    ...GridItem,
+    ...Icon,
+    ...Image,
+    ...IndexAnchor,
+    ...IndexList,
+    ...Input,
+    ...Keyboard,
+    ...Line,
+    ...LineProgress,
+    ...Link,
+    ...List,
+    ...ListItem,
+    ...LoadingIcon,
+    ...LoadingPage,
+    ...Loadmore,
+    ...Modal,
+    ...Navbar,
+    ...NoNetwork,
+    ...NoticeBar,
+    ...Notify,
+    ...NumberBox,
+    ...NumberKeyboard,
+    ...Overlay,
+    ...Parse,
+    ...Picker,
+    ...Popup,
+    ...Radio,
+    ...RadioGroup,
+    ...Rate,
+    ...ReadMore,
+    ...Row,
+    ...RowNotice,
+    ...ScrollList,
+    ...Search,
+    ...Section,
+    ...Skeleton,
+    ...Slider,
+    ...StatusBar,
+    ...Steps,
+    ...StepsItem,
+    ...Sticky,
+    ...Subsection,
+    ...SwipeAction,
+    ...SwipeActionItem,
+    ...Swiper,
+    ...SwipterIndicator,
+    ...Switch,
+    ...Tabbar,
+    ...TabbarItem,
+    ...Tabs,
+    ...Tag,
+    ...Text,
+    ...Textarea,
+    ...Toast,
+    ...Toolbar,
+    ...Tooltip,
+    ...Transition,
+    ...Upload
+}
diff --git a/uni_modules/uview-plus/libs/config/props/actionSheet.js b/uni_modules/uview-plus/libs/config/props/actionSheet.js
new file mode 100644
index 0000000..ac47e14
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/actionSheet.js
@@ -0,0 +1,25 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 16:44:35
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/actionSheet.js
+ */
+export default {
+    // action-sheet组件
+    actionSheet: {
+        show: false,
+        title: '',
+        description: '',
+        actions: [],
+        index: '',
+        cancelText: '',
+        closeOnClickAction: true,
+        safeAreaInsetBottom: true,
+        openType: '',
+        closeOnClickOverlay: true,
+        round: 0
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/album.js b/uni_modules/uview-plus/libs/config/props/album.js
new file mode 100644
index 0000000..b49ed30
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/album.js
@@ -0,0 +1,25 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 16:47:24
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/album.js
+ */
+export default {
+    // album 组件
+    album: {
+        urls: [],
+        keyName: '',
+        singleSize: 180,
+        multipleSize: 70,
+        space: 6,
+        singleMode: 'scaleToFill',
+        multipleMode: 'aspectFill',
+        maxCount: 9,
+        previewFullImage: true,
+        rowCount: 3,
+        showMore: true
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/alert.js b/uni_modules/uview-plus/libs/config/props/alert.js
new file mode 100644
index 0000000..8f8182c
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/alert.js
@@ -0,0 +1,22 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 16:48:53
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/alert.js
+ */
+export default {
+    // alert警告组件
+    alert: {
+        title: '',
+        type: 'warning',
+        description: '',
+        closable: false,
+        showIcon: false,
+        effect: 'light',
+        center: false,
+        fontSize: 14
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/avatar.js b/uni_modules/uview-plus/libs/config/props/avatar.js
new file mode 100644
index 0000000..c097d4e
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/avatar.js
@@ -0,0 +1,28 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 16:49:22
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/avatar.js
+ */
+export default {
+    // avatar 组件
+    avatar: {
+        src: '',
+        shape: 'circle',
+        size: 40,
+        mode: 'scaleToFill',
+        text: '',
+        bgColor: '#c0c4cc',
+        color: '#ffffff',
+        fontSize: 18,
+        icon: '',
+        mpAvatar: false,
+        randomBgColor: false,
+        defaultUrl: '',
+        colorIndex: '',
+        name: ''
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/avatarGroup.js b/uni_modules/uview-plus/libs/config/props/avatarGroup.js
new file mode 100644
index 0000000..29ad008
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/avatarGroup.js
@@ -0,0 +1,23 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 16:49:55
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/avatarGroup.js
+ */
+export default {
+    // avatarGroup 组件
+    avatarGroup: {
+        urls: [],
+        maxCount: 5,
+        shape: 'circle',
+        mode: 'scaleToFill',
+        showMore: true,
+        size: 40,
+        keyName: '',
+        gap: 0.5,
+		extraValue: 0
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/backtop.js b/uni_modules/uview-plus/libs/config/props/backtop.js
new file mode 100644
index 0000000..13052ab
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/backtop.js
@@ -0,0 +1,27 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 16:50:18
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/backtop.js
+ */
+export default {
+    // backtop组件
+    backtop: {
+        mode: 'circle',
+        icon: 'arrow-upward',
+        text: '',
+        duration: 100,
+        scrollTop: 0,
+        top: 400,
+        bottom: 100,
+        right: 20,
+        zIndex: 9,
+        iconStyle: {
+            color: '#909399',
+            fontSize: '19px'
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/badge.js b/uni_modules/uview-plus/libs/config/props/badge.js
new file mode 100644
index 0000000..8818f98
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/badge.js
@@ -0,0 +1,27 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-23 19:51:50
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/badge.js
+ */
+export default {
+    // 徽标数组件
+    badge: {
+        isDot: false,
+        value: '',
+        show: true,
+        max: 999,
+        type: 'error',
+        showZero: false,
+        bgColor: null,
+        color: null,
+        shape: 'circle',
+        numberType: 'overflow',
+        offset: [],
+        inverted: false,
+        absolute: false
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/button.js b/uni_modules/uview-plus/libs/config/props/button.js
new file mode 100644
index 0000000..acd65fc
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/button.js
@@ -0,0 +1,42 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 16:51:27
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/button.js
+ */
+export default {
+    // button组件
+    button: {
+        hairline: false,
+        type: 'info',
+        size: 'normal',
+        shape: 'square',
+        plain: false,
+        disabled: false,
+        loading: false,
+        loadingText: '',
+        loadingMode: 'spinner',
+        loadingSize: 15,
+        openType: '',
+        formType: '',
+        appParameter: '',
+        hoverStopPropagation: true,
+        lang: 'en',
+        sessionFrom: '',
+        sendMessageTitle: '',
+        sendMessagePath: '',
+        sendMessageImg: '',
+        showMessageCard: false,
+        dataName: '',
+        throttleTime: 0,
+        hoverStartTime: 0,
+        hoverStayTime: 200,
+        text: '',
+        icon: '',
+        iconColor: '',
+        color: ''
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/calendar.js b/uni_modules/uview-plus/libs/config/props/calendar.js
new file mode 100644
index 0000000..7f90beb
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/calendar.js
@@ -0,0 +1,42 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 16:52:43
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/calendar.js
+ */
+export default {
+    // calendar 组件
+    calendar: {
+        title: '日期选择',
+        showTitle: true,
+        showSubtitle: true,
+        mode: 'single',
+        startText: '开始',
+        endText: '结束',
+        customList: [],
+        color: '#3c9cff',
+        minDate: 0,
+        maxDate: 0,
+        defaultDate: null,
+        maxCount: Number.MAX_SAFE_INTEGER, // Infinity
+        rowHeight: 56,
+        formatter: null,
+        showLunar: false,
+        showMark: true,
+        confirmText: '确定',
+        confirmDisabledText: '确定',
+        show: false,
+        closeOnClickOverlay: false,
+        readonly: false,
+        showConfirm: true,
+        maxRange: Number.MAX_SAFE_INTEGER, // Infinity
+        rangePrompt: '',
+        showRangePrompt: true,
+        allowSameDay: false,
+		round: 0,
+		monthNum: 3
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/carKeyboard.js b/uni_modules/uview-plus/libs/config/props/carKeyboard.js
new file mode 100644
index 0000000..af1baa0
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/carKeyboard.js
@@ -0,0 +1,15 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 16:53:20
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/carKeyboard.js
+ */
+export default {
+    // 车牌号键盘
+    carKeyboard: {
+        random: false
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/cell.js b/uni_modules/uview-plus/libs/config/props/cell.js
new file mode 100644
index 0000000..425ea3f
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/cell.js
@@ -0,0 +1,35 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-23 20:53:09
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/cell.js
+ */
+export default {
+	// cell组件的props
+	cell: {
+		customClass: '',
+		title: '',
+		label: '',
+		value: '',
+		icon: '',
+		disabled: false,
+		border: true,
+		center: false,
+		url: '',
+		linkType: 'navigateTo',
+		clickable: false,
+		isLink: false,
+		required: false,
+		arrowDirection: '',
+		iconStyle: {},
+		rightIconStyle: {},
+		rightIcon: 'arrow-right',
+		titleStyle: {},
+		size: '',
+		stop: true,
+		name: ''
+	}
+}
diff --git a/uni_modules/uview-plus/libs/config/props/cellGroup.js b/uni_modules/uview-plus/libs/config/props/cellGroup.js
new file mode 100644
index 0000000..d48a9cd
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/cellGroup.js
@@ -0,0 +1,17 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 16:54:16
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/cellGroup.js
+ */
+export default {
+    // cell-group组件的props
+    cellGroup: {
+        title: '',
+        border: true,
+        customStyle: {}
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/checkbox.js b/uni_modules/uview-plus/libs/config/props/checkbox.js
new file mode 100644
index 0000000..2310901
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/checkbox.js
@@ -0,0 +1,27 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-23 21:06:59
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/checkbox.js
+ */
+export default {
+    // checkbox组件
+    checkbox: {
+        name: '',
+        shape: '',
+        size: '',
+        checkbox: false,
+        disabled: '',
+        activeColor: '',
+        inactiveColor: '',
+        iconSize: '',
+        iconColor: '',
+        label: '',
+        labelSize: '',
+        labelColor: '',
+        labelDisabled: ''
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/checkboxGroup.js b/uni_modules/uview-plus/libs/config/props/checkboxGroup.js
new file mode 100644
index 0000000..d0e22b6
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/checkboxGroup.js
@@ -0,0 +1,29 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 16:54:47
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/checkboxGroup.js
+ */
+export default {
+    // checkbox-group组件
+    checkboxGroup: {
+        name: '',
+        value: [],
+        shape: 'square',
+        disabled: false,
+        activeColor: '#2979ff',
+        inactiveColor: '#c8c9cc',
+        size: 18,
+        placement: 'row',
+        labelSize: 14,
+        labelColor: '#303133',
+        labelDisabled: false,
+        iconColor: '#ffffff',
+        iconSize: 12,
+        iconPlacement: 'left',
+        borderBottom: false
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/circleProgress.js b/uni_modules/uview-plus/libs/config/props/circleProgress.js
new file mode 100644
index 0000000..b3a9b43
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/circleProgress.js
@@ -0,0 +1,15 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 16:55:02
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/circleProgress.js
+ */
+export default {
+    // circleProgress 组件
+    circleProgress: {
+        percentage: 30
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/code.js b/uni_modules/uview-plus/libs/config/props/code.js
new file mode 100644
index 0000000..693417a
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/code.js
@@ -0,0 +1,21 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 16:55:27
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/code.js
+ */
+
+export default {
+    // code 组件
+    code: {
+        seconds: 60,
+        startText: '获取验证码',
+        changeText: 'X秒重新获取',
+        endText: '重新获取',
+        keepRunning: false,
+        uniqueKey: ''
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/codeInput.js b/uni_modules/uview-plus/libs/config/props/codeInput.js
new file mode 100644
index 0000000..cac9265
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/codeInput.js
@@ -0,0 +1,29 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 16:55:58
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/codeInput.js
+ */
+export default {
+    // codeInput 组件
+    codeInput: {
+		adjustPosition: true,
+        maxlength: 6,
+        dot: false,
+        mode: 'box',
+        hairline: false,
+        space: 10,
+        value: '',
+        focus: false,
+        bold: false,
+        color: '#606266',
+        fontSize: 18,
+        size: 35,
+        disabledKeyboard: false,
+        borderColor: '#c9cacc',
+		disabledDot: true
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/col.js b/uni_modules/uview-plus/libs/config/props/col.js
new file mode 100644
index 0000000..7621653
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/col.js
@@ -0,0 +1,19 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 16:56:12
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/col.js
+ */
+export default {
+    // col 组件
+    col: {
+        span: 12,
+        offset: 0,
+        justify: 'start',
+        align: 'stretch',
+        textAlign: 'left'
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/collapse.js b/uni_modules/uview-plus/libs/config/props/collapse.js
new file mode 100644
index 0000000..c2b9fdd
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/collapse.js
@@ -0,0 +1,17 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 16:56:30
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/collapse.js
+ */
+export default {
+    // collapse 组件
+    collapse: {
+        value: null,
+        accordion: false,
+        border: true
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/collapseItem.js b/uni_modules/uview-plus/libs/config/props/collapseItem.js
new file mode 100644
index 0000000..74ce682
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/collapseItem.js
@@ -0,0 +1,25 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 16:56:42
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/collapseItem.js
+ */
+export default {
+    // collapseItem 组件
+    collapseItem: {
+        title: '',
+        value: '',
+        label: '',
+        disabled: false,
+        isLink: true,
+        clickable: true,
+        border: true,
+        align: 'left',
+        name: '',
+        icon: '',
+        duration: 300
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/columnNotice.js b/uni_modules/uview-plus/libs/config/props/columnNotice.js
new file mode 100644
index 0000000..147c0aa
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/columnNotice.js
@@ -0,0 +1,24 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 16:57:16
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/columnNotice.js
+ */
+export default {
+    // columnNotice 组件
+    columnNotice: {
+        text: '',
+        icon: 'volume',
+        mode: '',
+        color: '#f9ae3d',
+        bgColor: '#fdf6ec',
+        fontSize: 14,
+        speed: 80,
+        step: false,
+        duration: 1500,
+        disableTouch: true
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/countDown.js b/uni_modules/uview-plus/libs/config/props/countDown.js
new file mode 100644
index 0000000..81e33b1
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/countDown.js
@@ -0,0 +1,18 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:11:29
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/countDown.js
+ */
+export default {
+    // u-count-down 计时器组件
+    countDown: {
+        time: 0,
+        format: 'HH:mm:ss',
+        autoStart: true,
+        millisecond: false
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/countTo.js b/uni_modules/uview-plus/libs/config/props/countTo.js
new file mode 100644
index 0000000..a536cde
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/countTo.js
@@ -0,0 +1,25 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 16:57:32
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/countTo.js
+ */
+export default {
+    // countTo 组件
+    countTo: {
+        startVal: 0,
+        endVal: 0,
+        duration: 2000,
+        autoplay: true,
+        decimals: 0,
+        useEasing: true,
+        decimal: '.',
+        color: '#606266',
+        fontSize: 22,
+        bold: false,
+        separator: ''
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/datetimePicker.js b/uni_modules/uview-plus/libs/config/props/datetimePicker.js
new file mode 100644
index 0000000..96e8ab8
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/datetimePicker.js
@@ -0,0 +1,37 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 16:57:48
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/datetimePicker.js
+ */
+export default {
+    // datetimePicker 组件
+    datetimePicker: {
+        show: false,
+		popupMode: 'bottom',
+        showToolbar: true,
+        value: '',
+        title: '',
+        mode: 'datetime',
+        maxDate: new Date(new Date().getFullYear() + 10, 0, 1).getTime(),
+        minDate: new Date(new Date().getFullYear() - 10, 0, 1).getTime(),
+        minHour: 0,
+        maxHour: 23,
+        minMinute: 0,
+        maxMinute: 59,
+        filter: null,
+        formatter: null,
+        loading: false,
+        itemHeight: 44,
+        cancelText: '取消',
+        confirmText: '确认',
+        cancelColor: '#909193',
+        confirmColor: '#3c9cff',
+        visibleItemCount: 5,
+        closeOnClickOverlay: false,
+        defaultIndex: []
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/divider.js b/uni_modules/uview-plus/libs/config/props/divider.js
new file mode 100644
index 0000000..55a8ce4
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/divider.js
@@ -0,0 +1,23 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 16:58:03
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/divider.js
+ */
+export default {
+    // divider组件
+    divider: {
+        dashed: false,
+        hairline: true,
+        dot: false,
+        textPosition: 'center',
+        text: '',
+        textSize: 14,
+        textColor: '#909399',
+        lineColor: '#dcdfe6'
+    }
+
+}
diff --git a/uni_modules/uview-plus/libs/config/props/empty.js b/uni_modules/uview-plus/libs/config/props/empty.js
new file mode 100644
index 0000000..fe20445
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/empty.js
@@ -0,0 +1,26 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:03:27
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/empty.js
+ */
+export default {
+    // empty组件
+    empty: {
+        icon: '',
+        text: '',
+        textColor: '#c0c4cc',
+        textSize: 14,
+        iconColor: '#c0c4cc',
+        iconSize: 90,
+        mode: 'data',
+        width: 160,
+        height: 160,
+        show: true,
+        marginTop: 0
+    }
+
+}
diff --git a/uni_modules/uview-plus/libs/config/props/form.js b/uni_modules/uview-plus/libs/config/props/form.js
new file mode 100644
index 0000000..204d845
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/form.js
@@ -0,0 +1,22 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:03:49
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/form.js
+ */
+export default {
+    // form 组件
+    form: {
+        model: {},
+        rules: {},
+        errorType: 'message',
+        borderBottom: true,
+        labelPosition: 'left',
+        labelWidth: 45,
+        labelAlign: 'left',
+        labelStyle: {}
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/formItem.js b/uni_modules/uview-plus/libs/config/props/formItem.js
new file mode 100644
index 0000000..163257a
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/formItem.js
@@ -0,0 +1,24 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:04:32
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/formItem.js
+ */
+export default {
+    // formItem 组件
+    formItem: {
+        label: '',
+        prop: '',
+        rule: '',
+        borderBottom: '',
+        labelPosition: '',
+        labelWidth: '',
+        rightIcon: '',
+        leftIcon: '',
+        required: false,
+        leftIconStyle: '',
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/gap.js b/uni_modules/uview-plus/libs/config/props/gap.js
new file mode 100644
index 0000000..60a21af
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/gap.js
@@ -0,0 +1,19 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:05:25
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/gap.js
+ */
+export default {
+    // gap组件
+    gap: {
+        bgColor: 'transparent',
+        height: 20,
+        marginTop: 0,
+        marginBottom: 0,
+        customStyle: {}
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/grid.js b/uni_modules/uview-plus/libs/config/props/grid.js
new file mode 100644
index 0000000..60abeb7
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/grid.js
@@ -0,0 +1,17 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:05:57
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/grid.js
+ */
+export default {
+    // grid组件
+    grid: {
+        col: 3,
+        border: false,
+        align: 'left'
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/gridItem.js b/uni_modules/uview-plus/libs/config/props/gridItem.js
new file mode 100644
index 0000000..1b747f4
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/gridItem.js
@@ -0,0 +1,16 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:06:13
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/gridItem.js
+ */
+export default {
+    // grid-item组件
+    gridItem: {
+        name: null,
+        bgColor: 'transparent'
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/icon.js b/uni_modules/uview-plus/libs/config/props/icon.js
new file mode 100644
index 0000000..1d81d2d
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/icon.js
@@ -0,0 +1,36 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 18:00:14
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/icon.js
+ */
+import config from '../config'
+
+const {
+    color
+} = config
+export default {
+    // icon组件
+    icon: {
+        name: '',
+        color: color['u-content-color'],
+        size: '16px',
+        bold: false,
+        index: '',
+        hoverClass: '',
+        customPrefix: 'uicon',
+        label: '',
+        labelPos: 'right',
+        labelSize: '15px',
+        labelColor: color['u-content-color'],
+        space: '3px',
+        imgMode: '',
+        width: '',
+        height: '',
+        top: 0,
+        stop: false
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/image.js b/uni_modules/uview-plus/libs/config/props/image.js
new file mode 100644
index 0000000..2552db6
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/image.js
@@ -0,0 +1,30 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:01:51
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/image.js
+ */
+export default {
+    // image组件
+    image: {
+        src: '',
+        mode: 'aspectFill',
+        width: '300',
+        height: '225',
+        shape: 'square',
+        radius: 0,
+        lazyLoad: true,
+        showMenuByLongpress: true,
+        loadingIcon: 'photo',
+        errorIcon: 'error-circle',
+        showLoading: true,
+        showError: true,
+        fade: true,
+        webp: false,
+        duration: 500,
+        bgColor: '#f3f4f6'
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/indexAnchor.js b/uni_modules/uview-plus/libs/config/props/indexAnchor.js
new file mode 100644
index 0000000..bb20d46
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/indexAnchor.js
@@ -0,0 +1,19 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:13:15
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/indexAnchor.js
+ */
+export default {
+    // indexAnchor 组件
+    indexAnchor: {
+        text: '',
+        color: '#606266',
+        size: 14,
+        bgColor: '#dedede',
+        height: 32
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/indexList.js b/uni_modules/uview-plus/libs/config/props/indexList.js
new file mode 100644
index 0000000..84a255e
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/indexList.js
@@ -0,0 +1,19 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:13:35
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/indexList.js
+ */
+export default {
+    // indexList 组件
+    indexList: {
+        inactiveColor: '#606266',
+        activeColor: '#5677fc',
+        indexList: [],
+        sticky: true,
+        customNavHeight: 0
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/input.js b/uni_modules/uview-plus/libs/config/props/input.js
new file mode 100644
index 0000000..4f0edc6
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/input.js
@@ -0,0 +1,48 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:13:55
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/input.js
+ */
+export default {
+	// index 组件
+	input: {
+		value: '',
+		type: 'text',
+		fixed: false,
+		disabled: false,
+		disabledColor: '#f5f7fa',
+		clearable: false,
+		password: false,
+		maxlength: -1,
+		placeholder: null,
+		placeholderClass: 'input-placeholder',
+		placeholderStyle: 'color: #c0c4cc',
+		showWordLimit: false,
+		confirmType: 'done',
+		confirmHold: false,
+		holdKeyboard: false,
+		focus: false,
+		autoBlur: false,
+		disableDefaultPadding: false,
+		cursor: -1,
+		cursorSpacing: 30,
+		selectionStart: -1,
+		selectionEnd: -1,
+		adjustPosition: true,
+		inputAlign: 'left',
+		fontSize: '15px',
+		color: '#303133',
+		prefixIcon: '',
+		prefixIconStyle: '',
+		suffixIcon: '',
+		suffixIconStyle: '',
+		border: 'surround',
+		readonly: false,
+		shape: 'square',
+		formatter: null
+	}
+}
diff --git a/uni_modules/uview-plus/libs/config/props/keyboard.js b/uni_modules/uview-plus/libs/config/props/keyboard.js
new file mode 100644
index 0000000..57182bd
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/keyboard.js
@@ -0,0 +1,30 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:07:49
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/keyboard.js
+ */
+export default {
+    // 键盘组件
+    keyboard: {
+        mode: 'number',
+        dotDisabled: false,
+        tooltip: true,
+        showTips: true,
+        tips: '',
+        showCancel: true,
+        showConfirm: true,
+        random: false,
+        safeAreaInsetBottom: true,
+        closeOnClickOverlay: true,
+        show: false,
+        overlay: true,
+        zIndex: 10075,
+        cancelText: '取消',
+        confirmText: '确定',
+        autoChange: false
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/line.js b/uni_modules/uview-plus/libs/config/props/line.js
new file mode 100644
index 0000000..2c87af2
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/line.js
@@ -0,0 +1,20 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:04:49
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/line.js
+ */
+export default {
+    // line组件
+    line: {
+        color: '#d6d7d9',
+        length: '100%',
+        direction: 'row',
+        hairline: true,
+        margin: 0,
+        dashed: false
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/lineProgress.js b/uni_modules/uview-plus/libs/config/props/lineProgress.js
new file mode 100644
index 0000000..cdfcb0e
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/lineProgress.js
@@ -0,0 +1,19 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:14:11
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/lineProgress.js
+ */
+export default {
+    // lineProgress 组件
+    lineProgress: {
+        activeColor: '#19be6b',
+        inactiveColor: '#ececec',
+        percentage: 0,
+        showText: true,
+        height: 12
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/link.js b/uni_modules/uview-plus/libs/config/props/link.js
new file mode 100644
index 0000000..6c4c883
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/link.js
@@ -0,0 +1,26 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:45:36
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/link.js
+ */
+import config from '../config'
+
+const {
+    color
+} = config
+export default {
+    // link超链接组件props参数
+    link: {
+        color: color['u-primary'],
+        fontSize: 15,
+        underLine: false,
+        href: '',
+        mpTips: '链接已复制,请在浏览器打开',
+        lineColor: '',
+        text: ''
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/list.js b/uni_modules/uview-plus/libs/config/props/list.js
new file mode 100644
index 0000000..a830c32
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/list.js
@@ -0,0 +1,28 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:14:53
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/list.js
+ */
+export default {
+    // list 组件
+    list: {
+        showScrollbar: false,
+        lowerThreshold: 50,
+        upperThreshold: 0,
+        scrollTop: 0,
+        offsetAccuracy: 10,
+        enableFlex: false,
+        pagingEnabled: false,
+        scrollable: true,
+        scrollIntoView: '',
+        scrollWithAnimation: false,
+        enableBackToTop: false,
+        height: 0,
+        width: 0,
+        preLoadScreen: 1
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/listItem.js b/uni_modules/uview-plus/libs/config/props/listItem.js
new file mode 100644
index 0000000..7fe2166
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/listItem.js
@@ -0,0 +1,15 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:15:40
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/listItem.js
+ */
+export default {
+    // listItem 组件
+    listItem: {
+        anchor: ''
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/loadingIcon.js b/uni_modules/uview-plus/libs/config/props/loadingIcon.js
new file mode 100644
index 0000000..f4739c4
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/loadingIcon.js
@@ -0,0 +1,30 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:45:47
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/loadingIcon.js
+ */
+import config from '../config'
+
+const {
+    color
+} = config
+export default {
+    // loading-icon加载中图标组件
+    loadingIcon: {
+        show: true,
+        color: color['u-tips-color'],
+        textColor: color['u-tips-color'],
+        vertical: false,
+        mode: 'spinner',
+        size: 24,
+        textSize: 15,
+        text: '',
+        timingFunction: 'ease-in-out',
+        duration: 1200,
+        inactiveColor: ''
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/loadingPage.js b/uni_modules/uview-plus/libs/config/props/loadingPage.js
new file mode 100644
index 0000000..dc53109
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/loadingPage.js
@@ -0,0 +1,23 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:00:23
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/loadingPage.js
+ */
+export default {
+    // loading-page组件
+    loadingPage: {
+        loadingText: '正在加载',
+        image: '',
+        loadingMode: 'circle',
+        loading: false,
+        bgColor: '#ffffff',
+        color: '#C8C8C8',
+        fontSize: 19,
+        iconSize: 28,
+        loadingColor: '#C8C8C8'
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/loadmore.js b/uni_modules/uview-plus/libs/config/props/loadmore.js
new file mode 100644
index 0000000..67c1160
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/loadmore.js
@@ -0,0 +1,32 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:15:26
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/loadmore.js
+ */
+export default {
+    // loadmore 组件
+    loadmore: {
+        status: 'loadmore',
+        bgColor: 'transparent',
+        icon: true,
+        fontSize: 14,
+		iconSize: 17,
+        color: '#606266',
+        loadingIcon: 'spinner',
+        loadmoreText: '加载更多',
+        loadingText: '正在加载...',
+        nomoreText: '没有更多了',
+        isDot: false,
+        iconColor: '#b7b7b7',
+        marginTop: 10,
+        marginBottom: 10,
+        height: 'auto',
+        line: false,
+		lineColor: '#E6E8EB',
+		dashed: false,
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/modal.js b/uni_modules/uview-plus/libs/config/props/modal.js
new file mode 100644
index 0000000..2ae3fff
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/modal.js
@@ -0,0 +1,30 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:15:59
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/modal.js
+ */
+export default {
+    // modal 组件
+    modal: {
+        show: false,
+        title: '',
+        content: '',
+        confirmText: '确认',
+        cancelText: '取消',
+        showConfirmButton: true,
+        showCancelButton: false,
+        confirmColor: '#2979ff',
+        cancelColor: '#606266',
+        buttonReverse: false,
+        zoom: true,
+        asyncClose: false,
+        closeOnClickOverlay: false,
+        negativeTop: 0,
+        width: '650rpx',
+        confirmButtonShape: ''
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/navbar.js b/uni_modules/uview-plus/libs/config/props/navbar.js
new file mode 100644
index 0000000..614a99d
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/navbar.js
@@ -0,0 +1,32 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:16:18
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/navbar.js
+ */
+import color from '../color'
+export default {
+    // navbar 组件
+    navbar: {
+        safeAreaInsetTop: true,
+        placeholder: false,
+        fixed: true,
+        border: false,
+        leftIcon: 'arrow-left',
+        leftText: '',
+        rightText: '',
+        rightIcon: '',
+        title: '',
+        bgColor: '#ffffff',
+        titleWidth: '400rpx',
+        height: '44px',
+		leftIconSize: 20,
+		leftIconColor: color.mainColor,
+		autoBack: false,
+		titleStyle: ''
+    }
+
+}
diff --git a/uni_modules/uview-plus/libs/config/props/noNetwork.js b/uni_modules/uview-plus/libs/config/props/noNetwork.js
new file mode 100644
index 0000000..74dba1b
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/noNetwork.js
@@ -0,0 +1,18 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:16:39
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/noNetwork.js
+ */
+export default {
+    // noNetwork
+    noNetwork: {
+        tips: '哎呀,网络信号丢失',
+        zIndex: '',
+        image: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAYAAAB5fY51AAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAABLKADAAQAAAABAAABLAAAAADYYILnAABAAElEQVR4Ae29CZhkV3kefNeq6m2W7tn3nl0aCbHIAgmQPGB+sLCNzSID9g9PYrAf57d/+4+DiW0cy8QBJ06c2In/PLFDHJ78+MGCGNsYgyxwIwktwEijAc1ohtmnZ+2Z7p5eq6vu9r/vuXWrq25VdVV1V3dXVX9Hmj73nv285963vvOd75yraeIEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQaD8E9PbrkvRopSMwMBBYRs+5O/yJS68cPnzYXel4tFP/jXbqjPRFEAiCQNe6Bw/6gdFn9Oy9Q90LLG2DgBBW2wyldIQIPPPCte2a5q3jtR+4ff/4wuBuXotrDwSEsNpjHKUXQODppy+udYJMEUEZgbd94DvnNwlA7YGAEFZ7jOOK78Xp06eTTkq7sxwQhmXuf/754VXl4iSstRAQwmqt8ZLWlkHg0UcD49qYfUjXfLtMtOZ7npExJu4iqZWLl7DWQUAIq3XGSlpaAYHD77q8xwuCOSUoXw8Sl0eMux977DGzQjES3AIICGG1wCBJEysj8PXnz230XXdr5RQFMYbRvWnv6w8UhMhliyGwYghr4Pjg3oEXL34ey9zyC9tiD2ml5h47dr1LN7S6CMjz/A3PvHh1Z6UyJby5EVgRhKUe7Kz/JU0LfvrJo5f+Y3MPibSuFgQGBgasYSd9l6GDsup0WS/T/9RTp9fXmU2SNwECdQ92E7S57iaMeJnPQLK6ixkDLfjlb7546RfrLkQyNBcC3dsP6oHWMd9G+V3JgwPHh7rnm1/yLQ8CbU9Y33zp0j+nZFUMb/DHmB7+SHGY3LUKAk8cObtD00xlHDrfNge+Z2ozU3c9dvx4Yr5lSL6lR6CtCWvg6OAPw9z538ZhhZRl6XrwhW8du1KX/iNejtwvPQIDR8+vSRqJ/obU7GupjdNdh2gW0ZDypJBFR6BtB2rg2OVtuub9JcmpHIpBoK1xfffLzx4f7C0XL2HNiYDp6bs9z23Ypn1fC1Y/9PCFDc3ZW2lVHIG2JKzTp4Ok7nv/G6Q054MIvda+bNb74pEgKGtwGAdL7pcfAa8vOKEZ2kyjWuLr7uDh+/qvN6o8KWdxEWhLwroyeek/g4zuqwU6kNrhyZcu/UktaSXN8iNwuL9/RuvVXtJ9PbPQ1vhmcP6t9+47u9ByJP/SIdB2hDVw9MJHQFYfrQdCph84evFX68kjaZcPAZJWwjMXRFpJ2zr91tfuvrh8vZCa54NA2xGWrunvmg8QWCJ/N4ir7fCYDxatkOeBB7an501agXbygVdvv9IK/ZQ2FiPQdi9osGbH+zRNf7y4m9Xu9Me7N9nv0HXdr5ZS4psHgXpJC9P/wDRTx0Vn1TxjWG9LGrbaUm/Fi5meSvcrkxf/Cg/ow9XqAUk91v3qHT97r6471dJKfHMi8Oyzgx1Z03t1YAQVT2MwgsC3u+yXHzi0faQ5eyGtqgWBtpOw2Ol9+/TM+sTOn8L08MtzgQCy+tOHXr3jA0JWc6HU/HF5Scssr4jXcYqfP6V/T8iq+ceyWgvbUsKKOn38eJAYyl56TAuCEr2WYei//9Crd/5GlFb81kdASVopSFrerKRlaoZj9HR+700H10+0fg+lB21NWBxe2lhNHsUpDZr27mi4dV379R9+za4/iO7Fbx8ECknLCPTsTDJ17O33bJpqnx6u7J60PWFxeAcCbMV56dJfQKf1bkMLfuGh1+76zMoe9vbuPUnLsb2DtmOe5HSxvXsrvWtLBEhaTx29+Ma27Jx0ShAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQaEsEVoQdVluO3BJ06ptHL34b1XRjp4Ch6Rq24+kmjG4Nwwg+9uA9u/73EjRBqhAEihAoe3xwUQq5WTYEzp0b3ZnV/Ncf6O/9AvY9wlh/6dy3X7ncN512Zw9BVLXjuAP4np44vnQtkZoEgVkEhLBmsWiKqwsXpjbPBOn3gRfenwnc+7GBe+zsjclvonFDS9nA9Iy/u3x9+vAP3735VPk4CRUEFhcBIazFxbfm0k9fHD7k+v4nQFaPQIrx8Gmyx/GJ0J/t7ez7mw0b9MmaC2pQQgh0/ZSm4g5TwueWWtqLt0HuVy4CQljLPPYnB0depTn+b3t+8B4t0AdBUv93h2H9xc6da0aXs2m+r1WQsLRnl7NdUvfKRkAIa5nG//r1oGtsZvjTgev/kqYHF/TA+AXoqv4npJemOEiQU1Eo2l+G0movBK1UBBPU7s9E1+ILAkuNgKwSLjXiqO/khVtvARH8dxDBRkMzPrF/V+9/BlG5y9CUqlXinHv9mRPXtvuus88L9H3JPv2zD2yXExCqAicJBIFWRwAvv3Xqwq0/Pnn+lv/K+ZvfPH3p9p5W75O0fxaBp793ce3AwIDMWmYhafiVgNtwSMsXeHp4eNXJC8Nf0PAdRCiuf/XgrnWUqsqotcvnl9DmRkCdweX4b9N7+m/ih+mbMraLM14yJVwcXItKpT1VRve+ArC3Qqn+3gM7132jKEGZm6tXg86J7OhDfuA/iHwPUpfUZSfu2L59tXxEoQxeyxkEgjKeOnLxHb4RqC+NY5H3+2953d4XlrNN7Vq3ENYij+yZwbG9jpt9GkBPQ5H9zgP9607OVeWp87cOQtn9zwJf+xDMNFfj+jryPqXpxj8c2Nn7P+SXey70lidu4IXzb0DNB4tr9751+HV7zxSHyd1CERDCWiiCc+QPjUCnsaqmZ62O5IN7N/VUNP48ee7mAZDTf4Tt049iUG4Guv4ZfNLos9UIbo7qJWoJEHjy+bP7fNsoOcnW0A0/aacef8PdG28sQTNWTBVCWIs01OfPj66BpfqTmq732UnjgT1bei+Vq4pTv7HM8Ceg2/o1qLQug7T+FaaM3IqTLZdewpoHgYEjV9fphvOj+OShWa5V+CxvZtpzv/LwG/aNl4uXsPoRwI+4uEYjAJ2GmdG8L0FK2mYa+tsrkdXZy+P7x2ZuHdW14P+BLdank9q6Qwd3rf+ckFWjR6Tx5Q2cP58K9Jm3VCIr1ogt48lO237r3//96YofeG18y9q7RFklXITxPXV+5DchKb3ZDMy37Nu5tuxG4R9cHH6b42QfAzlds+3EPXu2rfrBIjRFilwkBIIR7SHoJDurFU89ZOd680Gke6JaWomvjoBIWNUxqivFD87fej0e0n8Fwvr0/t1rnyqX+QfnRz7g+8FX8Rv8vL3auF/IqhxKzR2WCPxXqKeq3krDTdj2ierpJEUtCIgOqxaUakwzNBR0D09yiqePHOjveyOkpxLr9VMXb73V97S/h3nDXx7Y2fdPkAYbncW1IgIDxy5vM7LZt/hgrnLtxyaBrJNxv/72N+6tuNhSLp+EVUZACKsyNnXHvHL+1qcgNf2KbSXu2bt9dcmS9qlzo/fARgcmCtpzB3b1/Vg5QiuslLowENyDWDn8cSjl98PgdBviu03N+rl9/WufLEwr18uDwLdevLTF1YK3xnVZ2HI1bUxrT7z5zTuXdRP78qCyeLUKYTUI25OXbm4JPO00TBj+6I7+db8ZL3ZwMOiYdG4dA1lN9HWte2iuI2NAVPapC8O/CGPR34Ip/AZIbIMo7yX8G9QMbcS09P+2b1vf5XgdrXaPfiYns9oeLLEd8D1/B7Dp0E1jGP042pXQj7RKf546cmGzp+tv1TRf6YQD35/QO3seP3xow5IfC9QqmM23naJ0ny9ysXwgq98BWc0kVhv/Nhalbqe8kd/Fr8MOSEr3zEVWrwyO3I29hl+E9LUHGf+nAXI6sGPdd8uV2YphIKnE5IyL6bLxk7cn3bdkHHefrpvJAExMZ1uBZmqeNzXtfzUzk/m/ens7LjV7Px+8d9e1579/44l0duZtge+Np5zEEw8c2pBu9na3YvtEwmrAqNE8IZvNHsep5//yjl3r/0O8yFOXbv0QCO05gP0JGIL+fjw+uj91YeRh/Dp/PtCDM7Zpfmjvjt6Xo7hW9ycmJjaYduf7Hdf/8HTGfa3rG9rYxLSWnsloPg7fijZV8oFM2Ja2a9t6EJd7bCztvHP7us4rrdD/r3/7ct9I99jEI4cOiQ3dIg2YEFYDgOUJDFj1e8TqX7cT4kImXuQr5279A4DeBEX8ayvprU4N3rovcALot/TH13T0fXDTJn0qXk4r3k9OTm4y7a6PzjjORzOOvn1kbEqbnEprPhRzwAKzwFLHk05hv6Yd6N+o3R6beG50aPSdr3qV6IJKkVp5ITIlXOCYn4Yexr0w/DO6YXymHFlR0e5r7tsM3fxgJbI6fW1ivTeT+SsYmr54cFff+5Cu5X+hb94Merp6/J/PusGvTE6724eGJ7RpSFOkKPCUZvBPBccoHBet3Rwe13rX9tw/PjXzZ5hKvr8SfhWKkeA2REAIa4GD6p0feRdWBnvxjv2PckVhVfBf4A29uG/X2i+Ui2eYn8n8NryuDr3jPfWSFV5k44UT137eshIP2K7/64cObbheqZ6lCp+Ydt8TBO7vTM5od1+/NR4SFVhoLpKKt410lnE8LTMzo3V2dLznxLkhYgQ9obiVjEDln7mVjEodfYcpw+MAsftg/7qSDbAnb97sCSb0Yei2fqOcbovVqKNnNO8HmAE9Cv3Wp+uoWjt27HpXNqH9WTKR+kBHKqEFbvo5y3N/avfu4g23R45f3WGa1k9ZicTd0zPTf/f6O7f8dT311Jp2fHzmgJlI/N70jPPe4bEZ6Kg4qw0lqlrLiNKBiLWerpTW25PUbkPXZViW62ecHz+4d8PXojTirzwEyhq8rTwYFtRjvpX/rlwJ+iSXugPbMuyKBOHo3geRJtuT7PujcmVUCuPJlhnL/9NUqvMD2eyM5sxMaIlE4n7XML907tyNjcxHQjty4sZv66Z1xEok/xNW5n4uZSf+8sT5m++vVO58wkEu5sR09pd9w/rWyET2vReujiqygrSopn/zKZN5qMeirotKeTyolm7p/+X06Wvr51ue5Gt9BISwFjiGsLl6N6SrvylXDNTK70D4mX071pwtF88w6Jd/DG/1E1u26NOV0pQL71y3/8PJVOcHMzPTWkcCH2YGOaTTaS2RTN6f1fQvvvDK1bdnbO2JZCr1SeRfn05Pa1PTU0gXJBKW+ecnzlxvCGndhFQ1NRP8bcY1/vjS9bF1V26MwHwsVKiXa3etYVw1TNhYJ3TDjQCO42jJVMcez7J+t9YyJF37ISCEtahjGjxkGDr2DJZ31D8h5vUQJL5RPkXlUMM07u3qSGidICvkzzuSlmlZb0olrK9hD9v9JCrPC196JoPMAolFg6CV+PPj54YeyWecx8Vk2v1Q0rSfhFT18LnBmzBRyNalp5qrSuq7kiAsh4SFa7oZ9M0wzI+cPHOjZPo9V1kS1z4ICGEt4lhiCvZrSa2jol7qzPXJPk6nIGbVbWfUvcr7hO9MP97ZVXpggOu6ajplYStj7l1XvbRMXbPAbp6HzSSBlkraNknrvfVCcPt2sHYi7f3pTDb47KUbYxuvKqkKpYBXKBnV869c3WgbDEixAck0FGFFfEzJzbIsO9C1TyrcymWWsLZGIHoW2rqTzdo5dXyykz0NC8l779i5vu4zwM+eHVntGP5jqVTq/6AkVc5NZ3wNH2lVxNWZNIukMSjiNd9z0+CHp5DXAdX4SAg203w8GB5IATtODHzdK8C15kEjhXvNS9rWA11dnfcMDY9prscss48RySakrOLWqODCoIKAgkuVgsS0urtD60haeV1YYVbbtjUn6/74HXvW/11huFy3PwKzT1r797Upe3jq4sib9u9Y+wxe+vh7W1N7jx49v6ZzbffnQD4/Cj1Pfjx54XiBls6GVuTUc9mQsOIO9mPQFdkIRlz4fy5JLm2ZMOqTcJaXIqpcqnixVe+rdbZ3dbc2OT0D0wZIibHSksmklslknvx+//q3PiKnXcTQae/b+LPQ3r1t0969cOL6G7o6E09qgZegdMJBpVQ1DbKCpyUt6oPKz/4NEJalCAuZFIuEVBJd+jgLh4rvAiFqUVGkhJZMWFp3Z0obGSu/d5gSnWmavuO6h+/cvYHSobgVgoAYjrb4QPMUiGtj1/79jBMkLBwiTlMASlYzTkhWCJyTrGAyMOFkst/BoYMmuIIyGJYcMXMMdNwHPhYN1qWS1t6ZLGaKZL8yzFXTr15BooLLMugHMBRNKgW+It8y9TEcJGt4rvcRFCCEVQbFdg0Swmrxkb0+cf2XOzq73kgdFieEXF2jdEUJKQH6SVWQrNjtZDKlpTPp38U58iUbthk/Ph7sN6zg/xudSGvD4xkq6otcnnjyF0XRRTflkyC0IIJE1JG0QbqGNpMNp5xFhRTcZDNoj66988SFm5vv3LX+WkGUXLYxAuXnCW3c4XbqGs9hwjv+a9lsuN+ahOJSCoLjNDAFvVUll0p1aNPp6adTweSflEszPO48oFn+4yOTmR+6enOshKyYhzWpf/jDuuf6x2aV/qNRaPG/1d0gUXWCA0uu7GhMmkqmerEc8KOVU0lMuyFQ+Ylut562YX9Sncmf7Ojo3BDZWbGLtMkiUVXSWTFNuMqWuYG530f7+/tnGFboxsfdd9mm8XdDo9O7rg6NFq0CFqZr5DWlK9qV0fZqGvZchSuPlevB2VmG/hOV4yWm3RAQwmrhEcW64qu4ykfJho52Vp3J8quBYQooqWDKADftBd6HD+5efyoKj/zR8ew/hWXY56/cnFh7a3RCTTGjuMX0SVB9qzu1qfQM+jO3dBW1g6uVSHv/qVNX10Vh4rc3AkJYLTy+WA/8ou9kJjo7bOh+DLVFZ64TEbCyBktxI5PJZj56R//Gx+NdH5vM4vuI+p8NXh9LjU1iw3EZhXc8TyPuuV9wDaaCfBjTM06N0hVWQmHBDzvSDZ5tvqYR7ZAymh8BIazmH6OKLbzv0KZvJEz3ZzEFnEolaEtV2XEaCLKadrIz//TQnk1/EU85NuH8th8Yf4j9gMZUOrNkZEVZCnsbtTU9KW18GqcKFyjh420sd2+j33pg3F8uTsLaDwEhrBYf04O7N/2t7/o/C2FoGnsIy/YGlvAwSfCvZzLOe+8oR1ZT3u/5uvHJC9dGtJlMrfqjslXVHwjpat2aLi2rjFFLjUSrFUjlO0juddXSSXx7ICCE1QbjiHO0/hofbPgwpnDTOR2V6hWNQqGUx34890noet5yaO+Gko3Y45PO7/uB/lvnrwxrWdha1absbgxo1FWtwplXqYSJY5Nn5lU3bLHQmGA/yko0plVSSjMjIITVzKNTR9sO7dv8RSeb/T9BWmMkKv4D+YzBXuljV7yxd+zfte6VeHGKrHTz4+cv38JWmyUmKzSGG5z7VndoE7kz3uPtq+Welvhwm39weVjOyaoFsBZPI4TV4gNY2Pw79mz8KyebeRIH+VEZTaX0sf27+v794TKmCxNTzr/2NOPj5wZBVjjdYSklq6jN69dyKuhqmWztivYob+RTSkPbe/xMdlMUJn77IiCE1W5jq+s4dYEO6mzsYAmvi/+CrH7LDYxPcBq4HGTFVcG1ULLT5orS1ULIkoSFI2cMHKG8obiXcteOCAhhtdmo6gaOh4EWWlkyYU9gvHswXfgV19d/7+LVkSWfBrItJJhObL/p7elQR8fUZnEV70XxPc01sM+xrzhU7toRgZIHuh07uZL6xA3LBaYB+Ar8rBsfz34YX1j+D5eu317QNGy2xPquSE4mDuXb2IujY2AgytNE67RiKFshzuwCR5s9ZSMlsK0QEMJqq+GkBKOF5yFzRoidK5BoFCeMjM/8mG+a//Xy0Li55KYLBRiTrGjwOQ1br4VMBQuKVJeQKVPxMLlvPwSEsNpsTEECmBLSgbHUpwD1YGwse59l2p+9fmuig4fiNZIowrqq/6Xeqm9Vh9JbjcOKvqFtACX7gV8kTVZvkaRoRQSEsFpx1OZoM2iKxxuHLtDcsZlgLzYZfv7m7XSv+r7fIm234XSP/8o5ktWqzqSyZr89PoXPYDTYkZvziw0NLluKayoEyq4iNVULpTF1IaDjHHZmoAW4aep9geN8fiLt998cGYdtVp7K6iqzXGJFUCAi7jdkuapsBJKcPBwgyP8YRyV7B04Q3dDbpY3jg6gupoMNla5U41BbUN9n0sr1ScKaHwEhrOYfo7paCAW0WiWknihhW/0Tabf/6tDtxpIVSIhGnz1dSXUkDL8fSHKi4/lWPId9Kp3Vxqegp8J/m9f14D6DQ/nmb281FwgkZ1Dj7bnSSFx7ICCE1R7jmO8FJJr8jCvjeNrIxFjDJBpKVaSlXhwDw384MyucBoLAGEfHI5ptO6n1YAq4FjorH9IWjUOnFlF3pj62aui3whbI33ZGQAir/UY3XCVEvzgdw/8NcSyGUhSlpVWQrFg2p39xp0JYLyIohaXxdZ2FGofG6yi85/QS32F0Asu8URgu1+2JgCjd22xcsVElPC85169Gaa1YTkRWJKpSqooBiQQzONvq9sRULKKxtzzAEJw1api2EFZjoW3K0oSwmnJY5tcoSD09HanEDztubnfO/IopyUWC6sUmZUpW5aSqkgwgK04DxxaZrFivacCaIdAuH9zaM1rSDgloOwSEsNpoSMenvU93dXb+EE5taFivKElRqd67qrNmsqIF+yjMF/i56MV2JqadYKxXMDXM6+4Wu04pf/kQEMJaPuwbWvPticwj4Il/NnTrdl7JrqaDC5wTUle1GmdWWVCw1+JotjA6PgnThsIdQrXknF8arkJi/+R355dbcrUaArU9ha3WqxXW3tHR9C5dN//T9eEJ3aGdUwP7T0V7F86Mr0VW4mF6o2NTS/ilaB2HDmb8wA2+08AuS1FNjIAQVhMPTi1NgwRkGKbxRxMz3uaJSRzVUkumOtLwo6Zc7aOkVdEhynN9NQ1cyuNqeEqD67mX9TXGyxXbJhFthYAQVosP58S0909czfqJqzdGODVqaG/IUbCWr2p0yukfp4FUtDfeir1yl8IPUGjPHFy/fqJyKolpJwSEsFp4NEfT6Z3YBvOp8MvMc0hAi9hHNQ1cBrJil5TUZxhfXsTuSdFNhoAQVpMNSD3NMTzzU1PZYAM/ProYkg3UV5rHT8lXmA7SwnwEq4FLLVkRI04HM+n0LdvzvlEPZpK2tREQwmrR8ZucCd7hePr7rw2N5PfxLUZXON1zHKz4kb0KnIttP6Njk8tyaimbwXPrsW/yq3v3bhoqaJZctjkCQlgtOMCYCnU4GedTI+NpQ32XbxH7QOmKG5nzdIWZJz8HNkKygqI9TmSL2JSiovGVn0A39c8WBcpN2yMghNWCQ4zPc0HRbr6GEs6chJFnmfl3knZO4/hmII1B6fiFG9br0s6qAeXPp2WUrhzHeXH/jr6n5pNf8rQuAkJYLTZ2kK7Wul7w6zeGx9DyUsZovOodOizosTg1TM9k1Wogpa7lIisOF+w48E/7E5B1Y/cgtdizsBKbK6c1tNioT6X9n3MDcyePOo7OoJqrC6S0+ZIYV+GSOHxvc18PJCxXG4ed13I727axqTp9yk9rX1jutkj9S4+ASFhLj/m8axwdDdbgELxfGsLpoZyqVXPVU1QugVJUV0dC27p+FaaBWWxknq6ceAljTNMiAf/BoUMbJpewWqmqSRAQCatJBqKWZpgJ731Zx9pJM4aK0hXe5vlKVFEbKFlxs3PvqpSSqpbzKztRm+gnEkktnU6/2GFMfa4wXK5XDgJCWC0y1iAR6/Z49iOjY7C5qkG6mk+3SFQGlEP8FFdnygrNFqBsn1OxP5+K5pGHbcBhqhT8fqu/v39mHkVIljZAQAirRQYx7Wj3Zj3tddQjVVJ4l50CMjHe8mqOTJCCvmoTyIrENXx7Uinbm4Gs2PZUqkObnp76i0N7N36tWl8kvn0RaGnCGhgILKPn3B3+xKVXDh8+nPseX3sOlpt13+P4uonv71WeDqLr1ampFB8S1JrulNaHc9rTMxltcpofOeWns0rTLkeIZUHRnpm5YibMf7kc9UudzYNAyyrd8ZLpWvfgQT8w+oyevXeo++bBtaEtQd9s1/ffRsV3I6eDJCp+nourgH04UZQnhIYfWm1o8xdUGCU8/E/bil89sH3dlQUVJplbHoGWJaxnXri2HTvd1nEEcCBS3z++MLi75UejQgcmJjL92ax/gNJPo6QekhVXAbdvXI3D+XQ1Bcxiu02zTAEjKFIdHTQS/S8Hd2/4YhQm/spFoCUJ6+mnL651gkwRQRmBt33gO+c3teNQYin/oG6aKX5rcKEukqqoWN+Ij5vy81v8UATDG0WGC21jlJ96K6wKPpWd8H8jChN/ZSPQcoR1+vTppJPS7iw3bIZl7n/++eFV5eJaOczX9Z2YvM1LPxWpocBHKv8qHHdMqSphGUqqahaThfj40ITBcbLnsDj6oXvu2bS4n96JVy73TYtASxHWo48GxrUx+5Cu+XY5RH3PMzLGxF0ktXLxrRoGNVPPfNtOolIrgElLGYH2wbZqcipdIFVFlDbfGhqfj9bskCaHHS/7gTt3r73Y+BqkxFZFoKUI6/C7Lu/Bl1jmlKB8PUhcHjHufuyxx/g5lbZw+BL7bX4EoiZqyS0T0uM0j1+82QSl+ua+bhxj7GjD2LicwWkLzaarigbKsmDJ7gcTmezMBw/t3ixntUfAiK8QaBmzhq8/f26j77pbaxo3w+jetPf1B5D2RE3pmzyR4/nH+Mti4Wx1dUrCHO0lSVGqskFUnakkpn6mhu086jgYHkWTW3Wbo4Tli6L5gqYHE47vfeDufVv+YflaIjU3KwItIWEdO3a9Szc0ElDNDqcLbHjmxas7a87QxAnX9ljfxcr+Mzs29ykpi1O8iJjoR/cm5o7dnUl89LRLW93dyWmVIip+Kp7pmlWqIvQ8Mga9Gslm3Efu3LX+K008HNK0ZUSgplnGMrZPGxgYsIKeXa/TA61jPu0w0+7xBx/cd3M+eZspD0wbDgWm+RXP13cODY/jWGKuGAb48jG+agNpilbqlKZoWDqDY2AyjtNUlupzYZlKpXgaxIVMNv0zd+/d+uxcaSVuZSPQ/IT13TN34QRvZW81n6HSDdMLUqmjh9tgd//Fi8OHEl3JL3Z2dh3MzGA7XU664llVWRz/QhLjNYmsmaWp/DjCjqIDdlaZTOZZ1/A+fGj7hjP5OLkQBMog0NSE9cSRszuswNhdpt31BRnazM3U9IuPHDrUuG+419eChqU+cvzqjp7u5P9KJpMPpqc51Zv9QntLkFQBEqZluVCw/7nhaP9i376+8YIouRQEyiLQtIQ1cPT8GjOw7vE8tyFtxBrb2MBXdh579FF99g0vC0nzB548ebNHT2l/aFmJj1BPBYyav9EFLaQ+jdPAVNL8/pZ13a8qiJLLOhAAjvrTRy/d0enbF+69d0tzHFhWR/vnk7Rple6mp+9uFFkRGF8LVj/08IUN8wGp2fIcPLh+4sCu9R+F3ucj0MLf4vaVVnChqYWmdaQS2jpY2vd0djh86Vqh7c3Yxm8dudTPxaW0lrn7yJEjZW0Tm7HdC2lT0xKW1xecgHE3FDWNcb7uDh6+r/96Y0prjlIO7ur7TOD5b3ayzt9ylY0Gl83qKFXZsCXrXdOlrV3djf2LBr556JOshLDmMWhPPXV6vav5O5jVxYLUhNl3iIbV8yiqpbI0bQcP85C2Xu0l3dczC0XUN4Pzb71339mFltOM+Q/0rzu5f2fvu1zH+QDOt3uZ0pbVRMRFouJK5qqeTkhVqyBdtdUmhGV5JI4cudrpd5kHiyp3tTU/8s6r+4rC2vCmaQmLWJO0Ep65INJK2tbpt75298U2HLuiLh3oX/95L+0/kHUyvwTieiUJHVEimVzy1UKeWMqv2pCoKEVFRNXT1aHawnBx80eAZj7TwcxdAc5Gi5fiaNnNT37nCk4xaV/X1IRF2B94YHt63qQVaCcfePX2K+07fMU9U7qtHev+xE/7r3cc70O+6w1gxuV0dHZiusgvJS/O7IskRXLs6KCxqj+B26t9a3uUREWi4plbQlTFYzXvu+7tB3EIUGel/L6e3TNw5NS8zYAqldss4YvzBC9C7559drAja3qvDoyg6pwCP+KBZaVOPPjazS1vMLpQKE9fuPnawDB+EqehPwzWuAuSl8LPg90WVxhJJPWQCUmPBAWTBEz1TFUGpqO3wYYvIPgr2az35a2b1/50V6f1e1NTlVcvEzB0xRekj67usu5FmS2/crvQcaol/zeeObfTSOj91dIq28PxiaOHDx9quy8LtQxhcZBqIS0Dhkl2l/3yA4e2j1Qb2JUUD1Iyz1waOQib0vsxKXsAFvH3wMB0JySwtZC+DBPTN5BOCEnhrI1BuKe9l6tIzsVCiD6E0DOabrwI2elZ09aP7N3aNxjheXvK+a1OENa0EFYEyYL9rz072Ju03ZpNQKj7Xd899cKhNrA9LASvZTY/s9GcHoK0XsrakLS8UklLxyl+/rj+/Qfu2367sJNyTS7SuZfneO7ffweBGScu3NwAqWgrTvTc5jjBZmw87tMCfRXYKQWOgula4OiBOQUZ7DZuhrAGdQXxV0zPuCaGnkv3VPGHOpPw7+QPR62OM5HhdNddGOeX2kmCbSnC4mDlSStVTFr4eLljdHV+702vWz9R66Cu5HS5h5hmHvz3QiOxwJTRo2BGgY06dm7OVhewYGAY6s75oD+ZDs4JPY9JyqSCQ7ABqftd5VFM3/j2Ja4mtsWpJQSq6ZXu5UZTKeJnsHpohiYPRqBn04nkS2+CQWW59BK2dAjwS0Y4IHDz2ERWG8Gnwm7iK9W3sFmbvrqGPzw6gW8eTmvTM07XmTPX28KYd7EQ3rjnvv1QFHbPt3zT9DcMPHd+13zzN1s+/hC2rKOo7NjeQdsxT5LEWrYjbdLw05eHtwWe9jl0542u62HZHZIVpalY/yIlP5X3MHYddLLZfy4fmYiBhNuB509vw+rG3tKY+kOwGHLi7W/cS91jS7v4s9TSnZHGLx8CICH9lXNDX+zpWfXuycnaBV2e3e567nAm4973qv0bzy1fD5qr5oEB7KXt0u7B3Loh7yhWVfypbOalh9+wr6U3mbfklLC5Hi1pDRE4ef7Wj+EEiZ+amqpvJT2bzWjJRLIPR3n9riA5i4DZg720DSIrlsrvHXSZ9p7ZGlrzSgirNcetqVp9/vz5FJTqj6JRejTdq6eBMzNpHP9s//QrF4bvrydfO6f1JrCX1mvcXlo98Kembjotr3wXwmrnp36J+pYNeh5JdqRem83O77gxkpxtW3bgOZ/g1HKJmt3U1Rw+3D+zrc89aunagnWzpq6PdxujLz388L4F78tdbtCEsJZ7BFq8/sHBoMPX/I9hyrGgnuDUUZzrnnz7yQu3HlxQQW2Ued++fZmJ1e5LoPB5k5ZpWCPXz+08du+99zrtAI0QVjuM4jL2YcIZeh+2+9wF49MFtYJSlgmHE0g/JlLWLJQPg7RmhtyXsJ18eja0tivsXhj6xy9ve/mRR5TRcG2ZmjyViN9NPkDN3Dz1FW5z9XM4i+s1ME1YcFNpUIrVLHzJzHnwjl0bn1twgW1UwPHjxxPXpztejR0HFTc+F3YXRwxdfdM9W08D0zrs4wtLaM5rkbCac1xaolWOvurhZIPIih0OdVm2haNTfqUlAFjCRnJP4HBn+iUqz6tVa2nGpTe/etsP2o2s2G8hrGqjL/FlEQC5GHghfplSUSMdvwaEA/9+4vjpa3c2stx2KIsfUek2dr+EuXNF2xEjSJx98w/tbFt7NiGsdniSl6EPp84O3W/Z1oPzXRms1GRKWdCJdeCIlJ+vlGYlh997r+70+EPH8NHJEtLCauCph+7bmj81ox1xEsJqx1Fdij4Zxi9AT2KSYBrtslgxhOD2gWOyz7AstFzx6zFHj1mGobYUYAgC9cHge3ddK5uhjQKFsNpoMJeqK6+8cm0X6noXiWUxHA8WxAdWNyQM45HFKL8dyiRpueM7jllmMGpnjO+1w9fNaxmXxiogaqlR0jQdAkeOBPjczrnOiQ6jw88ESSOA6KT7iQzOHEvavu1pZsLQg4QPP/DdZG9Xx/vWrOr+mfR03SvtNffdxleAQIgvTzjBT0w409Mpu2faufZy+vDhw5WPMa25dEnYqggIYbXqyNXY7i/jCyvdfmaVb5hdVsLp9LJGp43j1/1A7/RdvdMwPRzEboRnLVHe9vEvL3eXBOB4ZMta22H+TiqV2LJQ26u5u6Bju44Z3J7O/Lvp6cwPmBanOwQ4uNHRTWMK21bSvh1Mm642nTWCtKkH07rnTE72aOO0XZq7bIltVQSEsFp15HLthg5J/+aJE12m3tVjOPYq1/dW4cTjHnwMYhXOce8xDd3y/PJW6OpMdsTRVy4iK/rKMR/jwvz825VIHFzT3fkx13UW/dnhRy3GJyeeHEs7n1XNibUPFvY6vtGDw5vV9w0Vofn81qGhZfDhi3HX8SfQ/3HPMse9CWcCX0gel2OIFJIt+2fRH7qWRaYJG85NxldGzV4tGayFSLQ24+q9ULyu9gJfMU5ELTn6wUISTl03NHz1KzyiJLqmX657OLLdSJgoXTO7cBxyN172blier4YCvBsFdSNXV2dC35tKJrbzfPfFdjwvC/qs9MSMxxNRsSqmT6LhUDQHE+jUBE7UnATXTuLsrRn01K2l/x6+qItiR3TNG8V59KNB0DGSfNXGUXwJY2Gm+osNhpSvEBDCasIHgVLTt75/aQ0MnXpBNb2QgNYEntfr4wu/nBYpKQLtxtdwAh0SBX3VDe7nM/Ha5vf1Fb/CURS2bCTAWWuxR229qRsbQQQbUed61LfW14JVKKsTJ5sk8WUcHbtlNANyTOhgcmAGKH7p3m1FWpqtuZCu+LByVdKHVMjpKEQrBwIW9tnpXOIH+QTDSH/D9f0bmCLewDn1I4HmwtAypPDZ/oe9oXKf/aMPsWxSs/RR13FHrURiZE1gDR86tKHEdCDMKX+XCwEhrOVCvqBeHNaW6ui11/mWDtLQ1kEiWodXE4rwYgepAPssTPCMOjIdAk94TZ8pMZjch8HjDorGFUTUAwlkh64be0A9/ZCatiDZWtOyE7ClQmIdJICJFYhA+TRV4Fo5/QIHiUvrTEbkVRCxiJfsSBbfYk87OTExXxdazY5yUgiRKfpHQ1YSkONmAZY+gV4NIeVFfCXoLNA5h/Plb5LzWAyzF+IVXdNnvO/6GcsyhjC1vmWZ7s2pO3fdOqzriy9asnJxZREoerDLppDAhiIAEtCfO3F5rW0a6z1PX4/nf53nG5RqqrpieSnULEVh8cx4E7ugH78H8tG9eP/24oVezY+pkpA8b/abhPF8le75BqdsXUtaFeaTlTI2IByEoU1l8oq1mkokcZHElIRoWmpejMMCMyCvQXyy7JjjuUcgOl4tLCzCMpTHgFpcgkViX/dH/ax2Szf8m2Yqc/MN+1r7BM/C/rfCtRDWEozSkbMjq7NTY5t13dqE6dhG3wsSqlp+C9DDi0ifLrqmT1f6BgUaPjiHN0lJAGAfvpWcI4XjiHIMF6ocO/EjmMa9HeelQ1LT1PRpoce/sJwOTCQtc+kfGQp6Uxl+9JWtmL+jNEaJ0gKBgbsygR58B4sHfwV5aliVWg3vCHv6ymHcdG868IzrVsK6pnd71+/dsmXxbD3m3/W2ybn0T1/bQFe5I8euX+9ybuqbXMPbDA7ZCKV4uMOecyz+9OfmWvj9x9zEw6JW+JuOX298WhE6qtwLEV3TL1tb/AWj7sqwfqaro/sdmcyM+vBp2XzzDEzaBiQsNH+e+eeTjQ+ohwqnG0BYhfVzNYKrkOmpyauYYH8KvD8G6RPBszrC6Jq+ystl0ghzXEZjR5+O4+iZwTh+eG7Yqa5rq/3hGzzTSkXKn4YgIITVABjBP+ZzP7i8ydasrZCetuCHvIvFRs92SEdlpnCYE2LOQi12OA7RNf1yjrphHIyE9yOXPnfNMDg70DpdTf8DWDKs5rRvMVwChAWrUgh21HzllD0NrigqlxKVC7bKQuOOWeGiuI7OTkhb6T8C/Xw3xkel9cXxj6eIxiY3Hhx3X9dHsWJwDaa3l1+zd9Mt/F4tUk/ijWnP+/DBb8++LWqvnh0c7NDGta0pO7kl6zpb8AJzEUr91kYEFdeBRCt69Nm4+AsSl6jwjVGckY6VwPwUpLhLURx9xliWvxFHi/w+zB0SWCnLsVpxnoXesSI2ngp4zmRJXPgf/0IleGH51R6uwjeX5MR76qtITh7+8N9Cp4GF7Sm8Zl1s35pVXVomm/5c1vG+Wm284njHJeJq44/FjixUAld8w7uijW6+xo3MhW2S6+oIVHumqpewglJ87+LFtcFUcqur+1vxwPcZJqYPMOyhXw6GKI4+4/GwQpjCBhe+6XDIpFb06PM+np5hhS5eXzw9bLJ2pBLGv4Fe36BU4kA6IQGw8MUY6MJywVeqDs54Z69zrWdY7jI3G1ZtUiSV6zzDI3IqLLew/wu9jspl+yywrA1pEed5QceXPT3jBb/DLrA5ua5UHZ/4eMTbFx+fwvE3DJO8fANrjlctL7giJhRx9MrfR89R+VgJ1Y6currONuwd0FNsxwtV02mPlWGLy1TxlPHf6Hh8PH9xesvw9yRM+5PIRT2ZIgVKKZxWUY/PT8aTFPji0i3m4Ed1hDWV/7uY9bNGtiGqAyorJRWSqCgdkrQiR5KddrwPlsq8xfhG6efvx8dvtiQczDdmmPaldDBxSVYeZ3GJXxUMWzxq5d4fPz7Ym7X1HTAL2A7NqtJHEQ3qtCPjw3LoxB/v+OMZ5VVzR5aHWRuErYA+y4uu6fM+Xl9J/lh7bFvbY+vmv0bWos9tsXAWSLIiaSnyApHxJz6SbFSFuXTw8i86r5vVRW1m+6IHmUREAuI0lcREP5q2ztWPrO9/YK54xsXHI56+cePvj3qBfimZNS+J5FWMcrjptThsRd4dPX9+DcwEd5iQphwozfkCwJKaLv9ewHYKeicfSudwShcnJDBBOD3MTwGRO0cqLIj73jQTaejDBYaPHTBgJ/i5+HyYijd95sFhRzkzB7yL2IrCtGwezj9nOQVTUlfPwiicifnu5J0qHHd8mXHIG6ZD7JQqIk9kJK6QwAokMWRUhMaSeJ0vcfaiXNhs7PyuwpYV51Vh+EM/Pu2M9GckpyiOuZm2Wvtom+Y4me8xPbvIIujzPu6Wbvyt1ejL3U7Sv/v754ZHsORwaX3KGdwiJhO5pzY+Mivk/urVq52jTnIXlEc78LKu8qAMx/G8kHhyOicosz0ovM3IrIDKb15HSvDoOoqv+hMLYCOWI8ash0vmufryZVcqLz4u8fym3ov1xT/EVp4UDUTn4/iS0xW+sZTMojASmLqGp64iH4FRXJQ2TKj+lv7JVRTVxwQkm9APyaboGnGMzSVR6VR87ipsVT645ovOzi5tamb6zzB1/nqzjz+s9YetwLioZW5C8jq08K9+1IxS8yQsfF6ap1WL2BK8VOaJc6NbPcPrx7wJ++hmHQUPvOaQgMJ3ETtVlERDP0wVsQ19uPgcLQyt/Dc+p4jlL6k/1xa2qVyh5ApEzEoErm/DsPOTXV3de6anq36roFyRdYWVbVSshHJEMt98saIXfIu9koplYZL6m/hUz7kS/Jt0/PE8+Jj6X/Y6k+fv2tA1BKIvB/OC8WnGAmp5dpqx3XW36fjgYK/upXbhFd+BrRlqn16MfkrspkoC4hnirYjbUVWzs4rHx8uL3cerjwt0TA4RcBcsuX8Rn97q54okVsCKJJ9YkSvy1gJR4aOtnAr6OJP+L13d+BKBKMEzHhAfgDh6yzD+vqHjTDDvYpAxLqwEfVdbE9bpIEi6V27tdLP+LnzPrWS/XrRTnz5d4e79+LNY7r4kP+Z7Jv7z1LyPL0B4Tb+ci9cXLy+eJ54e8Rw//rqqcUR+HOrgYVprJbBl5E2w63oI64J7k8mUDZLGhmAXs19ucVkxP8gKQu4ptCxbMy2TW3KAGI4u1P207ztH3CDx/7bL+Cdse8h1Zy5ev7Dp8uHD7blJuy0J69TV8XW6l92Dl3cbLG6g98idbhDgdANcY1ZY9o2N4mpNr96GRf1Da3Wui0RW69F1bWslvp81LD2xDTOGu9DhQzBc7AcYfYlkAqo6A6ozqHNBYJTESGitTGShsp0qQSxT4AcoPJQw0LBlEPhBFakHDjoLvY+XgVIyg7WK77tG8n9pvpHXBbXL+OMBd7FN6KLu+uf27esbX9RHdIkLbxvCGhgYsDb3v2a7obt7YHakpKmYiqgE2ioqJbzIOszXcSov/DAzRRNehyJKvPx4+igv/ZLKEaCkoZxUFMYXE1I8f7Xyq/UHp9CkAlfbCF3NdlhS7IQguA0N2wiJYy1ktC5IISb1Okr5jSYruy2SGlYkIkKLSC3yy/WrUWGzSnjaTUX/QEhYQuNewLCdwBFKRkpOuAfr4sBnwwfDg6B0MHagORhBHNqHw5WxTwYav6lAt/42MBLfrYZXHO9w3Ftr/B0Hp0pY+tkD29ddAz5ln8NGjddSlNPyhHV8aKjbzAS7Dd3egRcvgRHJWyrHASw9Pyp+vlSxEluH0jWAGQF9VVZMpxHVRZ/xSKQU4PR5Xy0+/sLQZCFS9DN/XKtSeh5WrL2x+sMyZv+W67+vwz5eC7oDx12rm9pakNg639B68XL3Qh+2Bm94DySxHhg0daBHSQhiCbyyyMS9SDi8RhEHyYP1qD9qak0S4VGn5VYrSTRKEkKHWYYiHuQmCYb/YKYLqS+3H5LYckxJmz6qhSYJ5yNgzgtuclESpncBfN8Fj3lgJdCSGpHcGECoxrouMoHjzO+4evLLMB1VKxJV8Wyj8Q80Ix043jnTu32hlTdkh08Yn7UWcnio9Qs3pzZm0lN7LCOxIdIZxbuQ1+lAVFFxJB7aMeUIiPkiPRPjo2v6dPF4FVjHnxi/oQK0Az/bymf5uI7ayGLj6eM63nrbF5VNXzV7nv3HViQL3JAEaSV1z0iBNJIgJBCYkSKJYbdjEiSHw7a0BI5s6QBBbINUswMUsQ6E11UojZGccA9dcZDBdQY+TgyFTgkiEKYyIBvstAQzIRk8cBJ+A2j4gZFDFWAqjAp3V5IhQYYwwUJ57ByS0QINzMYK8FyrRxt3KNbXb2qG/UVNT5wDyCt6/A0boGbdqzPA4tD21SPquWihPy1FWHjQzYs3xnZkM95ePIZd8RccBx1xez/UPowp46I4+uVcLD9/8Plq0Gfy6Jp+uez5uqPyY+UtNN5DuVQc06drpv4bIDXsjtsMpdkOSC79QK4Xog3PzwF4IBNCBiIhpBSpoE8jioqWaM2KCRuOqwLXgIQItKIe0lCYD/lZjoqgGIo0+J++SsmMKA8eqQ21qHuUh2PfzQHN6vgG6vVK8GfmQhcbr3Yff+AEi3rtdCtNF8u/eIWD2ATXx4Mg0XH1Vr/hm7sDQw8PvyvTrriKWocEE0C6oM/kJRJHrAykgj6WGlq+JUifu6YfS6pu4/UVa6AgQcXKi78ApekhcWFBwMstEkTX9MvVHw+Lt2ex+4+Pg62CxgsHEwZbAdgWIJfA+ICkfDRYtyAwWWB7Ay8F8VT/KB0bOJ4Gx/CQfUKSwZGrJJs8iZHYgB0zMB+zk8hopQ8hEcEog2ERASIBAOL5fIrVIKLxXKtzKPZLgZUckvGf+/nH5HsK0+Uz3316zeAjj3D23Lwu90w0ZwNpiZ72UnvwfO/AXIFnXfLBxLOsHn6yiLqmr3oQ04LHX9hq6TFHI6txrlYWkHj98UT1lh8vryR/rIKq6aO204drdP8hRWF3itmLUw42QnW1CSTSA2IAIXkWOBYKLWw8wjVqNkEaFqjFwLQNJhWI4ZiFoiq6QX0SbsEo6HMoWVFCYprwjw6FP65BXCSoXJwiOwpnFK9A6yiWkQhRDwA9XAfpwLS/AqnqSKP7jwapquiznXFXMn6x8Yg/X/HySvLHKqiaPlZfvf0H6BloAM/v3tpzHkJwUx59Uxb4GE5Lfnt2ZGS16SX3+F5mq4llfegtwnaSR6J5EC8hPUV6IDaS6aDnoZ5DpYe6AtdgOr4pyhXLNPH0KKCo/DDP7N+S+mI6qHzbQr7AbdgW+iylWn0l5cf6E29ftfSN6L9lGl04x30tOtMHklmLhxpClW9BL4S1T+i2uNPRp+0FflD0AN9A9LHnmHGBBfJCE3QL9ALiguoJqiu+64gDzWGIIAlhzhaSDsMV/yjJi3BxyY9khP9BXBSzEMY/AFORGMmM1yyKZfmm+ZKuJf4uMHV1THEj+o+S864E7zYd/8Dliqp2MamvPbt9uw4dY/M4DnXTuMuXx/scK9iHLcbryzfKwvOJBSGNPl10Tb8WV0xYyMFymDdXXv46Kq+ueChJQI4WlSUqf8StOf5CNdXqr9afxe8/Gm6AoLAqGKyCGLSG350ACFzKM2FvaeOseEhFOsjItdQ2S6wYYmkOdl2+CfLBvmpIV55vYY2Qn6uAxAWC40zbhxSmWArcQj0TSIiSU37mx0kgVesgLereOSz8E5EWJa6Qzyh1hZEcO7xY4Ct9WLfNvwa+5xA2h6uGP6vMPxMsZ8WNf0Gf+cOCw9usq51a5+kNG9Sn1IjJsjoO0LI7EpVra/vxhPdFs7JyjYriohlbTAKGxO1C6oJEljseOLqmTxfPX66OucJK66OUNzuDjK7p05UIbGwX25I/vrj4BYrnD0uZ/Rtvfzz9fPsPIkgkbL0DZNMFRVEHFEY2ZCBTcwMLdfCsCCVN4SwpE9YG+ARNgD24IDHYSYB1yNCYDkLRFoC8oOUG40AKQx5IYyAmlQ6SF7dDoSof0hbJiApzqLs43aPc5UG+AvVQ/4T7nGQFQiJ5kdbAkmgH2Sz0FaWB4gLrad22v4nmuvPt/yzCc1+V4t0e4z93r8PYwDCvNANxLSthkai0jmCf5+jq6y6Y4SkjTfoKprgWufj9Dg3AozBmiK7pl3H8WDH3u0YfLY6u6c/HVS2vSvsxoygyTF2q/qNenEyjJ5NJPYGPRidME1M1/JYqwyoNq32Ihu4J0z5M+WA2DoqwEI9wfmEaEhQJzPNsKNOh0jJwrfRVJqbnNOrC6IGwQFzgHiKrpCuq2kE+FizrMXWE7IWCEKemg7hSiimOQchNIC3EchqpHlBO95TshQThkwF5TL9k+Mm/MZLGzVo3AlQdLzagDle1vCYd/wU9/5Z5ZcyZPnNow/J8ZHZZCGtsbKw3rdn7nIzTx42o0WfP1cPKuYJ6XPFs5q7p8zmKx5v8cdcxDeMPOR1fj+gh4X10TV/dukiC+nJPeLy8eH1hrtm/UVvpKxcrP2oL/dlcs1eQ9PCeo73wGcp+R2Xyvlp74vH19B9EkoA2CYKUlcQqJCQj6vkoyBjh/IurcJiy4Zxy2FMptRBO7sK3kClR0UYUZAX+wMqfC1ICiYHMYBsKSQsSFKaAUEqZLoiK00ASFsgpN0UEUWE6yOkiiArE6NmUb91OWwAAEuNJREFUszCNxA0c/uBoF04W86YOarWQAYjGmHBBEIkUiXEqib025hNmInWknv6zKo77Sh3/RvcfSx5Xl4O4yr5Y7NxiuEEQFT4uvs8yrF5VvosX28LLS185vsiRHkc9YPiJtrCbJIzHyx3gJdfpl80flZWPR6qIxJghus7xjSqj4E9UNn2VvN76Csqq6XIR+48OYEeGlcAaXhLfQwxNQcgQEI9IErOOxBUuCuDLz9Arm5iyOTaYy7Jty8hAb2VCm43ZmwnwQTbgFpAWyA4SGEKhaMdgYNpngKAcpeMCAfFjYGE4yAqco3RZ0LorUqOkxVkf6AgzvFBPFbISSsOUD+WRrWijpcwbmI4Gomj4yxAIv4bPVU+q9sfxk/EP36UlfP49N3vNWr/m9CZdX/zzjDDofAoW3XHVr9NPHdB8p2+uORl/mjFLUktMbBTtkSJbpLCRxYyD5OpJps/4+DJuvq5IIgoLqfi3pLzcRuloM7QSzKImsBSWG80LVKkxkSvOkFHaCjL5QvrPN9rwvaSVtEg2ICmQCNRQkGjwnlOpNktMxdds+GxcRFrIyCmhTQMEUJjl4qwtzPbAOVC8o0DUZroGiMmBpEUfRBZ4DvRUJC4/1GOpij1ML9XU0PJdFxIZGsOpJkkOQ0YdFh5CPodKl0WfRqQkVUhTIEf1iN4GkdJU4Rx/xsJfHkpfMv4cd+IAUJb1+YdkfSU7NXp6+/bti7qquKiEdfVq0Gl2TO2DonYzAcUTCv0slCB8FuGia/q8j7iAPl30aNIPHVKq55w+00MvjFLo05WmV8H5P9XLzydVF/H0xbGl9UGfjm226B98po2u6fO+0f3H9M7SbT1h+FoS00ybSmm+5/RZHxzbwWvVHtSvNuLRR4BKl0vPtHRhWh1SESUsNBkH0qjvNiAx4MA1JDBc4yBmTPmwJArJCFM+dA1SE5XsmFIqRTzKUrZYkMio78IUkauFoW6Mcbin1GWrOR8nqOEUEUQFmuK3ZdEw6NFg92s9j3XLp0CIsAuS8VdPkcKhCZ9/KAc81x/c3NdzFjy6KHZc0YPNh7VhDg9jYnh4co9n2dvx1nLalys7Rimx2xLGigfEJBQ0Xr149FkBVb04BQiTlPAFbTiDxRGKM1pJf5AgarPKG0sQu413N07hkCANO5m0fSebtCwziW5DqMISHTRMJCDF23inYbmsauNCHq+Vn1ta5dErzKN8psP/RiIXVpAegKJQ30Y06AQSEXdAIpdL0wbTNsLpoSIeCwRJHZYBpTusIFAIlPC0iqL5AxoCcmLPQkkLdITRCc0dSFqQD1A51g4pLOXmhZCwDMO2BpH9q6ZtDoU4oKQIy5yEynFnv+mzw+0+/q3Sf5yT4aYs89zq1alLIK7wYeQANcCpgW5AOaqIARzxcudrXrMTz+cuFAxBI1Rw06eLKz3xsnDikt+Mmr9mWBlXrbySeJAlTt8MXJImXHRNv0zx2GpWZ3r0KKqzXHlRHH26+fQf+mkbg56ADjppUuihMJl7BEhGtmnj+4Phj1lEUAzjaQcgJkzcqPPmlI/yjdJV8Trf/+hbeYyP0uMS0zSVF8SEaSELxkhR6a7IC1IVHkNMBWEkCljxYQ7YXgWKrDCHw2ohJDDKSkr5Tst3TANBp7DdgkTFKSOpxYMtV2i3hXQoJjwbBo3L4oibAajdXmSbCl01PEvi6x3PetMvwfi3cv+xHpPRk8GZvo6Oq5y5FvZlvtfqQZ5v5igfH7iRdHqrn/H24McyEb6ejCUxkCwqEATi8JDNKtWRIxI6wrLj+aOyQgIqLT/KTZ+OLYnCFGHE60PdSgzIgVmcfrbt5evjYkB97VeNyv8plx/UYoChElhYgB7KtD3PAUWRpejIVNzNAjNzyDuYRqnrMF5dIx4CkTrlAJQRps2FhZIX5lqYwfFLOygTBeSmkUhDEgNvIC7MR5ML6JhozoCpn+858G1utbH4j7BRT0Z9VlZzbTyOKJCKeCjkqYbkFBJh+DXCPVcKuXKIFURlm8WBoZSFOBCYmk6i33ioT+Kw1CegEMspcFfe+M8+rRySNum/YUwm9I7TPT04NWOBDg/nwtz16xMbEp3mPswIOuI6G7wBSlynz1pQWZEIP0smIcEEWN3QsfJDn+nj9FFSPh73wilgdE2f+eOumo4pPqWI2kI/LKu4RVXLq7H/kJopRUFhnkj4joNT9KC/BlZgAIVD1I+cwASVUBgCIsF1KEQxJLpGPKHGP5LYrAs5ikREnmJ61KF4K5cG1+REVS6HC1JauGroYYcOrLWUEp6MSF0UpoZgK5hV2dgEzeNLYbMBnRQZEUPnOwGMT6GOp57Kg/0WTCMYjnsQHpDmlJFTR5IcNt/alvV1PdF5NsKcLSpGG03L6QcjnWDpeIXqgFYb//A9wGi1+fMPDeqY7nae6uvT530KKp+JebkhHJyX6Fqz33X83tCgRr1d6gXBH+XnFtEwDmEVMBfAtbK7UvHxVTb1gGLQokbFVBZMDtUJHmT+dsPxmqSRU2nkrxkWxhfbOfEVwLov4sIaonSRr1qZy6vy8xliPbn+qPjYHxSm6mJwdB357DfaVtJ/BMLeW0/ayVQSR6TA5AB7h8kwmFeRrFBUSFYkJk7GsM+F5SuiCQmFBEriCskHYcxfEM9ozBjBS/yaKD//rBzndjD3BHswAcmqwFdhOWGugCw5owwpEt9sxMlVGWQEK4GlcAOi1XAcL6eLICfdcMFmNDnH7xdO/YTCHTkxM2B6EiSPbuXmHrZO5eJy4Iu6lfo2Gu8orFfA+PM9UMjnHpBIx9v+/Q9Wm8nMfcMTE1d7u7vP4Ec6fzy1wqOGP3xI63JHjgT2/rsy/boTbMP0pe78dVUWS5wjK0VUjIqNN3kA62ZYeIcfxofXDFNFUZBTT4W6m71mWBlXrb4yWSoEYWh0jVIUdJEmzA6o18mRDN7dCplCEkK8IiP4WRAU9OO8j5wimZB3SAhKYlJEphLkJCaSEP7PEdxsfVG5UWFxP6qPPngTlvBED6IWLN8dTPmg8ocFPPRXWBdlFWqqCEmLlhAgLRtKdLaAkpQNfRUM6DUQGOUiTimNEaT7FvRVw/F6K91XG4/mHf9KPaovvJ36jzfSS1mpc6mUdhnvhZL4a0GjZsKBKK+n0+kt0AHvztCAsIzjeeAeUKVPF1l101cBWCICxcGmcPalUeHRnyguIsJYej79fFnpKxdjrKhu+spVK69Ke+OW6SXlh7Xk/8b7D5umJKY6nUiQAEmp5ZKoD5Ay8kTFzcAsJIrL+ZREYCWAaU4ubXRNP8wfpuSuGubHMwCJhSuGPCiYJIMw5GV6xkfY0Wd+WoPiBAlEhvnzNluw3SKZYTkQHIQ5J1RQDg7Lw/QQGUIdFp4wcC9KgQ/7KkxjucEHROVmc3ZaCFfEjMxUvlPvBZ0WhT1Q1zG06hQKyGPA9qEh4bPRJuO/0p//WvoPyXpa77BPr9L1mn64QiJRT0vlP3jg1oyn0/th1dnN6VOkQyh8wVRuPpLUH9GHi+sckD4vLaj43NSHLwfv8cKjbGxdgc97JUpFpIRbpovKYHTUltkpHYkyEqNYf1gWfZU+Vn+JiMZERS4qKyTAMv1hmwoItLT/aL6OL9cn8A4mknhDkR5CUuh43ExhAXjnIQVxRQ9UwnU1JM73meHISINzlY/1Ir3jwNQBtui5IpU3K2mFZbEUEhgJiHlZhkqI8rws7hPFxBHlZ5romu1CGRSv2HyQEQiLPkwefJcSk2o0mU+F8Z46KswbKd8qvRUWiq7BsuoYlF/q+Jd839p4/KNnFHhw+Fbc819r/y3dHO7qsk9D2lLPBvEq59SLXC6CYSCq1OTk5F48g+FxLyQSvvyzhFK8taaYL1ACiYdkkSOg/HVO4irmAySLlR8+yHy5wnaWysTF7YmnRxdyecMXFDcxx3KjNCUEGUtb2r4Iixwh5qebxEG58v2Hkh0ERqlLp5kClNLkngLSyF8XExrZi089SYbFm9DRg1FCbEKyoxQE8sqFkTOgTwrDVIPCP/k8qpRcGrxMEXmxnpwjUeXbhjpgA2bBNsp0HPQWOiwNOnddw5YcNIdSFyzTlUKehEbrLDxDNn7osjCXPw5FO22qgPfKHn/pf8XxxxetvSvYlX8BxBVKCdGDmPPDhz0W+Oijjxof//jHt+Hh2oko/qKqFx4l0BJQmQIwS3RNn/fxZXqGFbq4nQzimI9tKFs+S1S1KJ9XoQkEfUQwtKg98fSzefMMwmx5F28/IqK2RLjM2b54/gX0H0v6+IiDZSVgHJogfYWNzDMUpCtsUkKg4pKIUJAsnNTlkjNWzfBCPMOhi8JAiCSqPBmyMFVQ1OdctQwLywNZ5cPCpDl80D6IhjzBASQF0sUeREpSJCyE4ceSpJXbEO2612AHepaTSRn/YrtEAD3n8xV/ntv4+S96nyGRO9gccQZmEPiBK3bRi5kPHcG+v2T32n2+53bxNY8oQyWIB0SR9OmqxMeTh5lm/8azx8srEbCQNSqTpUTX+eagwCiPqiWeQAXO/olHV2tPaYUFjWCxsQJjt7MV564K6iOB2Xj1adNGa3PqDMFl4XwSSnAQCUIibqFPlwtTwbiOkoSR+JvLx3KYv9BXaSrlLyifSegQBNMFTAWhiIeFArRZnoX+8Y2EzKhbnuNlYO9wFpZXkwoH5Kmj/6qOFTz+0n8+Y4Y/2pVIcJqY35+YJ6wjEN33ZzL9kPY3hWjx6Sv+RcByLIQAZZYQJSn2C944FRF/QkvjQ31XZDcV04GVPOGl+WdJEhVGbaNPV3d7Va7ZP83U/1ACgzTjkg4gjUFvHhGWkrPAPnnBLNeFSEKKfAbzOu9yBAUdVj6cZURpZuU3XOUILioD93x2IEnxxFGc9c6M+M93cHSNZVzHquBQDeMn4x898wQ2us7pgGvAbyU8/z5e5EupVEqtJirCgp4KHxVI7sbrQIYKHyKF3+yvIvEEX8FsQNk9qXwgBpgQwNo7p9OKrukzfdzF08+WTmYrV35YF+tU8bEpYImInGtLVH+8PkzZ8iQcVpjrawXCLOHH5uo/9JmWjbXHJMQcNhVW8bOklbsumnJw7Q+cgtVK2mJxAUNNKKncp54KHuzAwnjCE01B1UIHA1A80ik/IkdIfTj6mE8MXh2sSKZhdHUd+IcDykwFLj4eMv7Fv+il75c8/xEmeHaojD+jZ4LgbsPVVvO5iutg4oSAFCCiAqVp/jrUKRU8mzVexsube05ff3tiD0Q1wkP/ojrYgeiaftiheHsjLKL4GrudTxYvb0H9h94bpzeAwCD4cAqJf5SmlBjFH5D8ChVC1Q8KyIkrjtgbE64y4lqtINJHel5Hq4q4ZdsYzsWBWaU+rkFWtFzQbiNNnWciNbT/qD4+Hitq/FdE/3mWzmvQU+W4hZZPenQuRHRNfylcvfVjpUqz0Tj6dNE1/fm4euufTx1z5am3/hr6z6lj9A9ElneKwPJ3IYEVEpqKys0YFeUhoDBP4TV/+bjVIkfqKuu8/ixC/+tqR73111V4DYnrrb+G8a+h1tkk9dY/m7MxV7XUzwdP3ApBgCYG6Co+L6/+kcB4X0g0ERFFzwXjojBc5q8ZhqOKtWEoROmLEwSWBIHowVySyqSS5kIABEYhisRFEov8SgRWGD6K9OMgq8IwBIkTBBYXASGsxcW3pUoHgfF5iIiLPv9x+03kuLxMqaqsUj1KJL4gsFgICGEtFrJtUG6OwDhtJHHhqLOl+dBAG0AnXRAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBIGVhMD/D0fV/fpMMM+gAAAAAElFTkSuQmCC'
+    }
+
+}
diff --git a/uni_modules/uview-plus/libs/config/props/noticeBar.js b/uni_modules/uview-plus/libs/config/props/noticeBar.js
new file mode 100644
index 0000000..f7465ac
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/noticeBar.js
@@ -0,0 +1,27 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:17:13
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/noticeBar.js
+ */
+export default {
+    // noticeBar
+    noticeBar: {
+        text: [],
+        direction: 'row',
+        step: false,
+        icon: 'volume',
+        mode: '',
+        color: '#f9ae3d',
+        bgColor: '#fdf6ec',
+        speed: 80,
+        fontSize: 14,
+        duration: 2000,
+        disableTouch: true,
+        url: '',
+        linkType: 'navigateTo'
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/notify.js b/uni_modules/uview-plus/libs/config/props/notify.js
new file mode 100644
index 0000000..1042d2a
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/notify.js
@@ -0,0 +1,22 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:10:21
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/notify.js
+ */
+export default {
+    // notify组件
+    notify: {
+        top: 0,
+        type: 'primary',
+        color: '#ffffff',
+        bgColor: '',
+        message: '',
+        duration: 3000,
+        fontSize: 15,
+        safeAreaInsetTop: false
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/numberBox.js b/uni_modules/uview-plus/libs/config/props/numberBox.js
new file mode 100644
index 0000000..424f0ca
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/numberBox.js
@@ -0,0 +1,35 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:11:46
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/numberBox.js
+ */
+export default {
+    // 步进器组件
+    numberBox: {
+        name: '',
+        value: 0,
+        min: 1,
+        max: Number.MAX_SAFE_INTEGER,
+        step: 1,
+        integer: false,
+        disabled: false,
+        disabledInput: false,
+        asyncChange: false,
+        inputWidth: 35,
+        showMinus: true,
+        showPlus: true,
+        decimalLength: null,
+        longPress: true,
+        color: '#323233',
+        buttonSize: 30,
+        bgColor: '#EBECEE',
+        cursorSpacing: 100,
+        disableMinus: false,
+        disablePlus: false,
+        iconStyle: ''
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/numberKeyboard.js b/uni_modules/uview-plus/libs/config/props/numberKeyboard.js
new file mode 100644
index 0000000..7b45065
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/numberKeyboard.js
@@ -0,0 +1,17 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:08:05
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/numberKeyboard.js
+ */
+export default {
+    // 数字键盘
+    numberKeyboard: {
+        mode: 'number',
+        dotDisabled: false,
+        random: false
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/overlay.js b/uni_modules/uview-plus/libs/config/props/overlay.js
new file mode 100644
index 0000000..c26d068
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/overlay.js
@@ -0,0 +1,18 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:06:50
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/overlay.js
+ */
+export default {
+    // overlay组件
+    overlay: {
+        show: false,
+        zIndex: 10070,
+        duration: 300,
+        opacity: 0.5
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/parse.js b/uni_modules/uview-plus/libs/config/props/parse.js
new file mode 100644
index 0000000..feb22b9
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/parse.js
@@ -0,0 +1,22 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:17:33
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/parse.js
+ */
+export default {
+    // parse
+    parse: {
+        copyLink: true,
+        errorImg: '',
+        lazyLoad: false,
+        loadingImg: '',
+        pauseVideo: true,
+        previewImg: true,
+        setTitle: true,
+        showImgMenu: true
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/picker.js b/uni_modules/uview-plus/libs/config/props/picker.js
new file mode 100644
index 0000000..f5d6a5e
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/picker.js
@@ -0,0 +1,30 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:18:20
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/picker.js
+ */
+export default {
+    // picker
+    picker: {
+        show: false,
+		popupMode: 'bottom',
+        showToolbar: true,
+        title: '',
+        columns: [],
+        loading: false,
+        itemHeight: 44,
+        cancelText: '取消',
+        confirmText: '确定',
+        cancelColor: '#909193',
+        confirmColor: '#3c9cff',
+        visibleItemCount: 5,
+        keyName: 'text',
+        closeOnClickOverlay: false,
+        defaultIndex: [],
+		immediateChange: false
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/popup.js b/uni_modules/uview-plus/libs/config/props/popup.js
new file mode 100644
index 0000000..5440c3c
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/popup.js
@@ -0,0 +1,29 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:06:33
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/popup.js
+ */
+export default {
+    // popup组件
+    popup: {
+        show: false,
+        overlay: true,
+        mode: 'bottom',
+        duration: 300,
+        closeable: false,
+        overlayStyle: {},
+        closeOnClickOverlay: true,
+        zIndex: 10075,
+        safeAreaInsetBottom: true,
+        safeAreaInsetTop: false,
+        closeIconPos: 'top-right',
+        round: 0,
+        zoom: true,
+        bgColor: '',
+        overlayOpacity: 0.5
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/radio.js b/uni_modules/uview-plus/libs/config/props/radio.js
new file mode 100644
index 0000000..4df200f
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/radio.js
@@ -0,0 +1,27 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:02:34
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/radio.js
+ */
+export default {
+    // radio组件
+    radio: {
+        name: '',
+        shape: '',
+        disabled: '',
+        labelDisabled: '',
+        activeColor: '',
+        inactiveColor: '',
+        iconSize: '',
+        labelSize: '',
+        label: '',
+        labelColor: '',
+        size: '',
+        iconColor: '',
+        placement: ''
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/radioGroup.js b/uni_modules/uview-plus/libs/config/props/radioGroup.js
new file mode 100644
index 0000000..728e9db
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/radioGroup.js
@@ -0,0 +1,30 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:03:12
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/radioGroup.js
+ */
+export default {
+    // radio-group组件
+    radioGroup: {
+        value: '',
+        disabled: false,
+        shape: 'circle',
+        activeColor: '#2979ff',
+        inactiveColor: '#c8c9cc',
+        name: '',
+        size: 18,
+        placement: 'row',
+        label: '',
+        labelColor: '#303133',
+        labelSize: 14,
+        labelDisabled: false,
+        iconColor: '#ffffff',
+        iconSize: 12,
+        borderBottom: false,
+        iconPlacement: 'left'
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/rate.js b/uni_modules/uview-plus/libs/config/props/rate.js
new file mode 100644
index 0000000..d31c61a
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/rate.js
@@ -0,0 +1,26 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:05:09
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/rate.js
+ */
+export default {
+    // rate组件
+    rate: {
+        value: 1,
+        count: 5,
+        disabled: false,
+        size: 18,
+        inactiveColor: '#b2b2b2',
+        activeColor: '#FA3534',
+        gutter: 4,
+        minCount: 1,
+        allowHalf: false,
+        activeIcon: 'star-fill',
+        inactiveIcon: 'star',
+        touchable: true
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/readMore.js b/uni_modules/uview-plus/libs/config/props/readMore.js
new file mode 100644
index 0000000..09b11cc
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/readMore.js
@@ -0,0 +1,22 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:18:41
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/readMore.js
+ */
+export default {
+    // readMore
+    readMore: {
+        showHeight: 400,
+        toggle: false,
+        closeText: '展开阅读全文',
+        openText: '收起',
+        color: '#2979ff',
+        fontSize: 14,
+        textIndent: '2em',
+        name: ''
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/row.js b/uni_modules/uview-plus/libs/config/props/row.js
new file mode 100644
index 0000000..573a431
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/row.js
@@ -0,0 +1,17 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:18:58
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/row.js
+ */
+export default {
+    // row
+    row: {
+        gutter: 0,
+        justify: 'start',
+        align: 'center'
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/rowNotice.js b/uni_modules/uview-plus/libs/config/props/rowNotice.js
new file mode 100644
index 0000000..cd9d0a0
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/rowNotice.js
@@ -0,0 +1,21 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:19:13
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/rowNotice.js
+ */
+export default {
+    // rowNotice
+    rowNotice: {
+        text: '',
+        icon: 'volume',
+        mode: '',
+        color: '#f9ae3d',
+        bgColor: '#fdf6ec',
+        fontSize: 14,
+        speed: 80
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/scrollList.js b/uni_modules/uview-plus/libs/config/props/scrollList.js
new file mode 100644
index 0000000..441e63a
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/scrollList.js
@@ -0,0 +1,20 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:19:28
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/scrollList.js
+ */
+export default {
+    // scrollList
+    scrollList: {
+        indicatorWidth: 50,
+        indicatorBarWidth: 20,
+        indicator: true,
+        indicatorColor: '#f2f2f2',
+        indicatorActiveColor: '#3c9cff',
+        indicatorStyle: ''
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/search.js b/uni_modules/uview-plus/libs/config/props/search.js
new file mode 100644
index 0000000..8f393c8
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/search.js
@@ -0,0 +1,37 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:19:45
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/search.js
+ */
+export default {
+    // search
+    search: {
+        shape: 'round',
+        bgColor: '#f2f2f2',
+        placeholder: '请输入关键字',
+        clearabled: true,
+        focus: false,
+        showAction: true,
+        actionStyle: {},
+        actionText: '搜索',
+        inputAlign: 'left',
+        inputStyle: {},
+        disabled: false,
+        borderColor: 'transparent',
+        searchIconColor: '#909399',
+        searchIconSize: 22,
+        color: '#606266',
+        placeholderColor: '#909399',
+        searchIcon: 'search',
+        margin: '0',
+        animation: false,
+        value: '',
+        maxlength: '-1',
+        height: 32,
+        label: null
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/section.js b/uni_modules/uview-plus/libs/config/props/section.js
new file mode 100644
index 0000000..f432648
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/section.js
@@ -0,0 +1,24 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:07:33
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/section.js
+ */
+export default {
+    // u-section组件
+    section: {
+        title: '',
+        subTitle: '更多',
+        right: true,
+        fontSize: 15,
+        bold: true,
+        color: '#303133',
+        subColor: '#909399',
+        showLine: true,
+        lineColor: '',
+        arrow: true
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/skeleton.js b/uni_modules/uview-plus/libs/config/props/skeleton.js
new file mode 100644
index 0000000..83b777d
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/skeleton.js
@@ -0,0 +1,25 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:20:14
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/skeleton.js
+ */
+export default {
+    // skeleton
+    skeleton: {
+        loading: true,
+        animate: true,
+        rows: 0,
+        rowsWidth: '100%',
+        rowsHeight: 18,
+        title: true,
+        titleWidth: '50%',
+        titleHeight: 18,
+        avatar: false,
+        avatarSize: 32,
+        avatarShape: 'circle'
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/slider.js b/uni_modules/uview-plus/libs/config/props/slider.js
new file mode 100644
index 0000000..0d1c15f
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/slider.js
@@ -0,0 +1,25 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:08:25
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/slider.js
+ */
+export default {
+    // slider组件
+    slider: {
+        value: 0,
+        blockSize: 18,
+        min: 0,
+        max: 100,
+        step: 1,
+        activeColor: '#2979ff',
+        inactiveColor: '#c0c4cc',
+        blockColor: '#ffffff',
+        showValue: false,
+		disabled:false,
+        blockStyle: {}
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/statusBar.js b/uni_modules/uview-plus/libs/config/props/statusBar.js
new file mode 100644
index 0000000..d237a83
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/statusBar.js
@@ -0,0 +1,15 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:20:39
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/statusBar.js
+ */
+export default {
+    // statusBar
+    statusBar: {
+        bgColor: 'transparent'
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/steps.js b/uni_modules/uview-plus/libs/config/props/steps.js
new file mode 100644
index 0000000..881c39e
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/steps.js
@@ -0,0 +1,21 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:12:37
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/steps.js
+ */
+export default {
+    // steps组件
+    steps: {
+        direction: 'row',
+        current: 0,
+        activeColor: '#3c9cff',
+        inactiveColor: '#969799',
+        activeIcon: '',
+        inactiveIcon: '',
+        dot: false
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/stepsItem.js b/uni_modules/uview-plus/libs/config/props/stepsItem.js
new file mode 100644
index 0000000..5dba8f4
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/stepsItem.js
@@ -0,0 +1,18 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:12:55
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/stepsItem.js
+ */
+export default {
+    // steps-item组件
+    stepsItem: {
+        title: '',
+        desc: '',
+        iconSize: 17,
+        error: false
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/sticky.js b/uni_modules/uview-plus/libs/config/props/sticky.js
new file mode 100644
index 0000000..b034604
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/sticky.js
@@ -0,0 +1,20 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:01:30
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/sticky.js
+ */
+export default {
+    // sticky组件
+    sticky: {
+        offsetTop: 0,
+        customNavHeight: 0,
+        disabled: false,
+        bgColor: 'transparent',
+        zIndex: '',
+        index: ''
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/subsection.js b/uni_modules/uview-plus/libs/config/props/subsection.js
new file mode 100644
index 0000000..9a165ff
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/subsection.js
@@ -0,0 +1,23 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:12:20
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/subsection.js
+ */
+export default {
+    // subsection组件
+    subsection: {
+        list: [],
+        current: 0,
+        activeColor: '#3c9cff',
+        inactiveColor: '#303133',
+        mode: 'button',
+        fontSize: 12,
+        bold: true,
+        bgColor: '#eeeeef',
+		keyName: 'name'
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/swipeAction.js b/uni_modules/uview-plus/libs/config/props/swipeAction.js
new file mode 100644
index 0000000..25051b8
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/swipeAction.js
@@ -0,0 +1,15 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:00:42
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/swipeAction.js
+ */
+export default {
+    // swipe-action组件
+    swipeAction: {
+        autoClose: true
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/swipeActionItem.js b/uni_modules/uview-plus/libs/config/props/swipeActionItem.js
new file mode 100644
index 0000000..40ef27c
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/swipeActionItem.js
@@ -0,0 +1,21 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:01:13
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/swipeActionItem.js
+ */
+export default {
+    // swipeActionItem 组件
+    swipeActionItem: {
+        show: false,
+        name: '',
+        disabled: false,
+        threshold: 20,
+        autoClose: true,
+        options: [],
+        duration: 300
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/swiper.js b/uni_modules/uview-plus/libs/config/props/swiper.js
new file mode 100644
index 0000000..59af537
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/swiper.js
@@ -0,0 +1,39 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:21:38
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/swiper.js
+ */
+export default {
+    // swiper 组件
+    swiper: {
+        list: [],
+        indicator: false,
+        indicatorActiveColor: '#FFFFFF',
+        indicatorInactiveColor: 'rgba(255, 255, 255, 0.35)',
+        indicatorStyle: '',
+        indicatorMode: 'line',
+        autoplay: true,
+        current: 0,
+        currentItemId: '',
+        interval: 3000,
+        duration: 300,
+        circular: false,
+        previousMargin: 0,
+        nextMargin: 0,
+        acceleration: false,
+        displayMultipleItems: 1,
+        easingFunction: 'default',
+        keyName: 'url',
+        imgMode: 'aspectFill',
+        height: 130,
+        bgColor: '#f3f4f6',
+        radius: 4,
+        loading: false,
+        showTitle: false
+    }
+
+}
diff --git a/uni_modules/uview-plus/libs/config/props/swipterIndicator.js b/uni_modules/uview-plus/libs/config/props/swipterIndicator.js
new file mode 100644
index 0000000..4b59e6e
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/swipterIndicator.js
@@ -0,0 +1,19 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:22:07
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/swiperIndicator.js
+ */
+export default {
+    // swiperIndicator 组件
+    swiperIndicator: {
+        length: 0,
+        current: 0,
+        indicatorActiveColor: '',
+        indicatorInactiveColor: '',
+		indicatorMode: 'line'
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/switch.js b/uni_modules/uview-plus/libs/config/props/switch.js
new file mode 100644
index 0000000..e6400b4
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/switch.js
@@ -0,0 +1,24 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:22:24
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/switch.js
+ */
+export default {
+    // switch
+    switch: {
+        loading: false,
+        disabled: false,
+        size: 25,
+        activeColor: '#2979ff',
+        inactiveColor: '#ffffff',
+        value: false,
+        activeValue: true,
+        inactiveValue: false,
+        asyncChange: false,
+        space: 0
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/tabbar.js b/uni_modules/uview-plus/libs/config/props/tabbar.js
new file mode 100644
index 0000000..187112d
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/tabbar.js
@@ -0,0 +1,22 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:22:40
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/tabbar.js
+ */
+export default {
+    // tabbar
+    tabbar: {
+        value: null,
+        safeAreaInsetBottom: true,
+        border: true,
+        zIndex: 1,
+        activeColor: '#1989fa',
+        inactiveColor: '#7d7e80',
+        fixed: true,
+        placeholder: true
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/tabbarItem.js b/uni_modules/uview-plus/libs/config/props/tabbarItem.js
new file mode 100644
index 0000000..d036ce5
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/tabbarItem.js
@@ -0,0 +1,20 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:22:55
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/tabbarItem.js
+ */
+export default {
+    //
+    tabbarItem: {
+        name: null,
+        icon: '',
+        badge: null,
+        dot: false,
+        text: '',
+        badgeStyle: 'top: 6px;right:2px;'
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/tabs.js b/uni_modules/uview-plus/libs/config/props/tabs.js
new file mode 100644
index 0000000..817e2d2
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/tabs.js
@@ -0,0 +1,32 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:23:14
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/tabs.js
+ */
+export default {
+    //
+    tabs: {
+        duration: 300,
+        list: [],
+        lineColor: '#3c9cff',
+        activeStyle: {
+            color: '#303133'
+        },
+        inactiveStyle: {
+            color: '#606266'
+        },
+        lineWidth: 20,
+        lineHeight: 3,
+        lineBgSize: 'cover',
+        itemStyle: {
+            height: '44px'
+        },
+        scrollable: true,
+		current: 0,
+		keyName: 'name'
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/tag.js b/uni_modules/uview-plus/libs/config/props/tag.js
new file mode 100644
index 0000000..e686e50
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/tag.js
@@ -0,0 +1,30 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:23:37
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/tag.js
+ */
+export default {
+	// tag 组件
+	tag: {
+		type: 'primary',
+		disabled: false,
+		size: 'medium',
+		shape: 'square',
+		text: '',
+		bgColor: '',
+		color: '',
+		borderColor: '',
+		closeColor: '#C6C7CB',
+		name: '',
+		plainFill: false,
+		plain: false,
+		closable: false,
+		show: true,
+		icon: '',
+		iconColor: ''
+	}
+}
\ No newline at end of file
diff --git a/uni_modules/uview-plus/libs/config/props/text.js b/uni_modules/uview-plus/libs/config/props/text.js
new file mode 100644
index 0000000..c74cf6d
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/text.js
@@ -0,0 +1,38 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:23:58
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/text.js
+ */
+export default {
+    // text 组件
+    text: {
+        type: '',
+        show: true,
+        text: '',
+        prefixIcon: '',
+        suffixIcon: '',
+        mode: '',
+        href: '',
+        format: '',
+        call: false,
+        openType: '',
+        bold: false,
+        block: false,
+        lines: '',
+        color: '#303133',
+        size: 15,
+        iconStyle: {
+            fontSize: '15px'
+        },
+        decoration: 'none',
+        margin: 0,
+        lineHeight: '',
+        align: 'left',
+        wordWrap: 'normal'
+    }
+
+}
diff --git a/uni_modules/uview-plus/libs/config/props/textarea.js b/uni_modules/uview-plus/libs/config/props/textarea.js
new file mode 100644
index 0000000..44519f9
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/textarea.js
@@ -0,0 +1,36 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:24:32
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/textarea.js
+ */
+export default {
+	// textarea 组件
+	textarea: {
+		value: '',
+		placeholder: '',
+		placeholderClass: 'textarea-placeholder',
+		placeholderStyle: 'color: #c0c4cc',
+		height: 70,
+		confirmType: 'done',
+		disabled: false,
+		count: false,
+		focus: false,
+		autoHeight: false,
+		fixed: false,
+		cursorSpacing: 0,
+		cursor: '',
+		showConfirmBar: true,
+		selectionStart: -1,
+		selectionEnd: -1,
+		adjustPosition: true,
+		disableDefaultPadding: false,
+		holdKeyboard: false,
+		maxlength: 140,
+		border: 'surround',
+		formatter: null
+	}
+}
diff --git a/uni_modules/uview-plus/libs/config/props/toast.js b/uni_modules/uview-plus/libs/config/props/toast.js
new file mode 100644
index 0000000..2dd2ed1
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/toast.js
@@ -0,0 +1,30 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:07:07
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/toast.js
+ */
+export default {
+    // toast组件
+    toast: {
+        zIndex: 10090,
+        loading: false,
+        text: '',
+        icon: '',
+        type: '',
+        loadingMode: '',
+        show: '',
+        overlay: false,
+        position: 'center',
+        params: {},
+        duration: 2000,
+        isTab: false,
+        url: '',
+        callback: null,
+        back: false
+    }
+
+}
diff --git a/uni_modules/uview-plus/libs/config/props/toolbar.js b/uni_modules/uview-plus/libs/config/props/toolbar.js
new file mode 100644
index 0000000..3289967
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/toolbar.js
@@ -0,0 +1,21 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:24:55
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/toolbar.js
+ */
+export default {
+    // toolbar 组件
+    toolbar: {
+        show: true,
+        cancelText: '取消',
+        confirmText: '确认',
+        cancelColor: '#909193',
+        confirmColor: '#3c9cff',
+        title: ''
+    }
+
+}
diff --git a/uni_modules/uview-plus/libs/config/props/tooltip.js b/uni_modules/uview-plus/libs/config/props/tooltip.js
new file mode 100644
index 0000000..875604d
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/tooltip.js
@@ -0,0 +1,25 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:25:14
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/tooltip.js
+ */
+export default {
+    // tooltip 组件
+    tooltip: {
+        text: '',
+        copyText: '',
+        size: 14,
+        color: '#606266',
+        bgColor: 'transparent',
+        direction: 'top',
+        zIndex: 10071,
+        showCopy: true,
+        buttons: [],
+        overlay: true,
+        showToast: true
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/transition.js b/uni_modules/uview-plus/libs/config/props/transition.js
new file mode 100644
index 0000000..0fad118
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/transition.js
@@ -0,0 +1,18 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 16:59:00
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/transition.js
+ */
+export default {
+    // transition动画组件的props
+    transition: {
+        show: false,
+        mode: 'fade',
+        duration: '300',
+        timingFunction: 'ease-out'
+    }
+}
diff --git a/uni_modules/uview-plus/libs/config/props/upload.js b/uni_modules/uview-plus/libs/config/props/upload.js
new file mode 100644
index 0000000..87e481e
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/props/upload.js
@@ -0,0 +1,36 @@
+/*
+ * @Author       : LQ
+ * @Description  :
+ * @version      : 1.0
+ * @Date         : 2021-08-20 16:44:21
+ * @LastAuthor   : LQ
+ * @lastTime     : 2021-08-20 17:09:50
+ * @FilePath     : /u-view2.0/uview-ui/libs/config/props/upload.js
+ */
+export default {
+	// upload组件
+	upload: {
+		accept: 'image',
+		capture: ['album', 'camera'],
+		compressed: true,
+		camera: 'back',
+		maxDuration: 60,
+		uploadIcon: 'camera-fill',
+		uploadIconColor: '#D3D4D6',
+		useBeforeRead: false,
+		previewFullImage: true,
+		maxCount: 52,
+		disabled: false,
+		imageMode: 'aspectFill',
+		name: '',
+		sizeType: ['original', 'compressed'],
+		multiple: false,
+		deletable: true,
+		maxSize: Number.MAX_VALUE,
+		fileList: [],
+		uploadText: '',
+		width: 80,
+		height: 80,
+		previewImage: true
+	}
+}
diff --git a/uni_modules/uview-plus/libs/config/zIndex.js b/uni_modules/uview-plus/libs/config/zIndex.js
new file mode 100644
index 0000000..5fc3682
--- /dev/null
+++ b/uni_modules/uview-plus/libs/config/zIndex.js
@@ -0,0 +1,20 @@
+// uniapp在H5中各API的z-index值如下:
+/**
+ * actionsheet: 999
+ * modal: 999
+ * navigate: 998
+ * tabbar: 998
+ * toast: 999
+ */
+
+export default {
+    toast: 10090,
+    noNetwork: 10080,
+    // popup包含popup,actionsheet,keyboard,picker的值
+    popup: 10075,
+    mask: 10070,
+    navbar: 980,
+    topTips: 975,
+    sticky: 970,
+    indexListSticky: 965
+}
diff --git a/uni_modules/uview-plus/libs/css/color.scss b/uni_modules/uview-plus/libs/css/color.scss
new file mode 100644
index 0000000..3237ba4
--- /dev/null
+++ b/uni_modules/uview-plus/libs/css/color.scss
@@ -0,0 +1,155 @@
+.u-primary-light {
+	color: $u-primary-light;
+}
+
+.u-warning-light {
+	color: $u-warning-light;
+}
+
+.u-success-light {
+	color: $u-success-light;
+}
+
+.u-error-light {
+	color: $u-error-light;
+}
+
+.u-info-light {
+	color: $u-info-light;
+}
+
+.u-primary-light-bg {
+	background-color: $u-primary-light;
+}
+
+.u-warning-light-bg {
+	background-color: $u-warning-light;
+}
+
+.u-success-light-bg {
+	background-color: $u-success-light;
+}
+
+.u-error-light-bg {
+	background-color: $u-error-light;
+}
+
+.u-info-light-bg {
+	background-color: $u-info-light;
+}
+
+.u-primary-dark {
+	color: $u-primary-dark;
+}
+
+.u-warning-dark {
+	color: $u-warning-dark;
+}
+
+.u-success-dark {
+	color: $u-success-dark;
+}
+
+.u-error-dark {
+	color: $u-error-dark;
+}
+
+.u-info-dark {
+	color: $u-info-dark;
+}
+
+.u-primary-dark-bg {
+	background-color: $u-primary-dark;
+}
+
+.u-warning-dark-bg {
+	background-color: $u-warning-dark;
+}
+
+.u-success-dark-bg {
+	background-color: $u-success-dark;
+}
+
+.u-error-dark-bg {
+	background-color: $u-error-dark;
+}
+
+.u-info-dark-bg {
+	background-color: $u-info-dark;
+}
+
+.u-primary-disabled {
+	color: $u-primary-disabled;
+}
+
+.u-warning-disabled {
+	color: $u-warning-disabled;
+}
+
+.u-success-disabled {
+	color: $u-success-disabled;
+}
+
+.u-error-disabled {
+	color: $u-error-disabled;
+}
+
+.u-info-disabled {
+	color: $u-info-disabled;
+}
+
+.u-primary {
+	color: $u-primary;
+}
+
+.u-warning {
+	color: $u-warning;
+}
+
+.u-success {
+	color: $u-success;
+}
+
+.u-error {
+	color: $u-error;
+}
+
+.u-info {
+	color: $u-info;
+}
+
+.u-primary-bg {
+	background-color: $u-primary;
+}
+
+.u-warning-bg {
+	background-color: $u-warning;
+}
+
+.u-success-bg {
+	background-color: $u-success;
+}
+
+.u-error-bg {
+	background-color: $u-error;
+}
+
+.u-info-bg {
+	background-color: $u-info;
+}
+
+.u-main-color {
+	color: $u-main-color;
+}
+
+.u-content-color {
+	color: $u-content-color;
+}
+
+.u-tips-color {
+	color: $u-tips-color;
+}
+
+.u-light-color {
+	color: $u-light-color;
+}
diff --git a/uni_modules/uview-plus/libs/css/common.scss b/uni_modules/uview-plus/libs/css/common.scss
new file mode 100644
index 0000000..ca2c2a2
--- /dev/null
+++ b/uni_modules/uview-plus/libs/css/common.scss
@@ -0,0 +1,100 @@
+// 超出行数,自动显示行尾省略号,最多5行
+// 来自uview-plus的温馨提示:当您在控制台看到此报错,说明需要在App.vue的style标签加上【lang="scss"】
+@for $i from 1 through 5 {
+	.u-line-#{$i} {
+		/* #ifdef APP-NVUE */
+		// nvue下,可以直接使用lines属性,这是weex特有样式
+		lines: $i;
+		text-overflow: ellipsis;
+		overflow: hidden;
+		flex: 1;
+		/* #endif */
+
+		/* #ifndef APP-NVUE */
+		// vue下,单行和多行显示省略号需要单独处理
+		@if $i == '1' {
+			overflow: hidden;
+			white-space: nowrap;
+			text-overflow: ellipsis;
+		} @else {
+			display: -webkit-box!important;
+			overflow: hidden;
+			text-overflow: ellipsis;
+			word-break: break-all;
+			-webkit-line-clamp: $i;
+			-webkit-box-orient: vertical!important;
+		}
+		/* #endif */
+	}
+}
+
+
+// 此处加上!important并非随意乱用,而是因为目前*.nvue页面编译到H5时,
+// App.vue的样式会被uni-app的view元素的自带border属性覆盖,导致无效
+// 综上,这是uni-app的缺陷导致我们为了多端兼容,而必须要加上!important
+// 移动端兼容性较好,直接使用0.5px去实现细边框,不使用伪元素形式实现
+.u-border {
+	border-width: 0.5px!important;
+	border-color: $u-border-color!important;
+    border-style: solid;
+}
+
+.u-border-top {
+	border-top-width: 0.5px!important;
+	border-color: $u-border-color!important;
+    border-top-style: solid;
+}
+
+.u-border-left {
+	border-left-width: 0.5px!important;
+	border-color: $u-border-color!important;
+    border-left-style: solid;
+}
+
+.u-border-right {
+	border-right-width: 0.5px!important;
+	border-color: $u-border-color!important;
+    border-right-style: solid;
+}
+
+.u-border-bottom {
+	border-bottom-width: 0.5px!important;
+	border-color: $u-border-color!important;
+    border-bottom-style: solid;
+}
+
+.u-border-top-bottom {
+	border-top-width: 0.5px!important;
+	border-bottom-width: 0.5px!important;
+	border-color: $u-border-color!important;
+    border-top-style: solid;
+    border-bottom-style: solid;
+}
+
+// 去除button的所有默认样式,让其表现跟普通的view、text元素一样
+.u-reset-button {
+	padding: 0;
+	background-color: transparent;
+	/* #ifndef APP-PLUS */
+	font-size: inherit;
+	line-height: inherit;
+	color: inherit;
+	/* #endif */
+	/* #ifdef APP-NVUE */
+	border-width: 0;
+	/* #endif */
+}
+
+/* #ifndef APP-NVUE */
+.u-reset-button::after {
+   border: none;
+}
+/* #endif */
+
+.u-hover-class {
+	opacity: 0.7;
+}
+
+.cursor-pointer {
+    cursor: pointer;
+}
diff --git a/uni_modules/uview-plus/libs/css/components.scss b/uni_modules/uview-plus/libs/css/components.scss
new file mode 100644
index 0000000..223a2f5
--- /dev/null
+++ b/uni_modules/uview-plus/libs/css/components.scss
@@ -0,0 +1,25 @@
+@import "./mixin.scss";
+
+/* #ifndef APP-NVUE */
+// 由于uview-plus是基于nvue环境进行开发的,此环境中普通元素默认为flex-direction: column;
+// 所以在非nvue中,需要对元素进行重置为flex-direction: column; 否则可能会表现异常
+// 2024-04-09由于微信小程序会提示 Some selectors are not allowed in component wxss所以注释以下几行
// view,
+// scroll-view,
+// swiper-item,
+.u-empty,
+.u-empty__wrap,
+.u-tabs,
+.u-tabs__wrapper,
+.u-tabs__wrapper__scroll-view-wrapper,
+.u-tabs__wrapper__scroll-view,
+.u-tabs__wrapper__nav,
+.u-tabs__wrapper__nav__line {
+	display: flex;
+	flex-direction: column;
+	flex-shrink: 0;
+	flex-grow: 0;
+	flex-basis: auto;
+	align-items: stretch;
+	align-content: flex-start;
+}
+/* #endif */
diff --git a/uni_modules/uview-plus/libs/css/flex.scss b/uni_modules/uview-plus/libs/css/flex.scss
new file mode 100644
index 0000000..4688cdf
--- /dev/null
+++ b/uni_modules/uview-plus/libs/css/flex.scss
@@ -0,0 +1,298 @@
+// .u-flex {
+// 	@include vue-flex(row);
+// }
+
+// .u-flex-x {
+// 	@include vue-flex(row);
+// }
+
+// .u-flex-y {
+// 	@include vue-flex(column);
+// }
+
+// .u-flex-xy-center {
+// 	@include vue-flex(row);
+// 	justify-content: center;
+// 	align-items: center;
+// }
+
+// .u-flex-x-center {
+// 	@include vue-flex(row);
+// 	justify-content: center;
+// }
+
+// .u-flex-y-center {
+// 	@include vue-flex(column);
+// 	justify-content: center;
+// }
+
+
+// flex布局
+.u-flex,
+.u-flex-row,
+.u-flex-x {
+	@include flex;
+}
+
+.u-flex-y,
+.u-flex-column {
+	@include flex(column);
+}
+
+.u-flex-x-center {
+	@include flex;
+	justify-content: center;
+}
+
+.u-flex-xy-center {
+	@include flex;
+	justify-content: center;
+	align-items: center;
+}
+
+.u-flex-y-center {
+	@include flex;
+	align-items: center;
+}
+
+.u-flex-x-left {
+	@include flex;
+}
+
+.u-flex-x-reverse,
+.u-flex-row-reverse {
+	flex-direction: row-reverse;
+}
+
+.u-flex-y-reverse,
+.u-flex-column-reverse {
+	flex-direction: column-reverse;
+}
+
+/* #ifndef APP-NVUE */
+// 此处为vue版本的简写,因为nvue不支持同时作用于两个类名的样式写法
+// nvue下只能写成class="u-flex-x u-flex-x-reverse的形式"
+.u-flex.u-flex-reverse,
+.u-flex-row.u-flex-reverse,
+.u-flex-x.u-flex-reverse {
+	flex-direction: row-reverse;
+}
+
+.u-flex-column.u-flex-reverse,
+.u-flex-y.u-flex-reverse {
+	flex-direction: column-reverse;
+}
+
+// 自动伸缩
+.u-flex-fill {
+	flex: 1 1 auto;
+}
+
+// 边界自动伸缩
+.u-margin-top-auto,
+.u-m-t-auto {
+	margin-top: auto !important;
+}
+
+.u-margin-right-auto,
+.u-m-r-auto {
+	margin-right: auto !important;
+}
+
+.u-margin-bottom-auto,
+.u-m-b-auto {
+	margin-bottom: auto !important;
+}
+
+.u-margin-left-auto,
+.u-m-l-auto {
+	margin-left: auto !important;
+}
+
+.u-margin-center-auto,
+.u-m-c-auto {
+	margin-left: auto !important;
+	margin-right: auto !important;
+}
+
+.u-margin-middle-auto,
+.u-m-m-auto {
+	margin-top: auto !important;
+	margin-bottom: auto !important;
+}
+/* #endif */
+
+// 换行
+.u-flex-wrap {
+	flex-wrap: wrap;
+}
+
+// 反向换行
+.u-flex-wrap-reverse {
+	flex-wrap: wrap-reverse;
+}
+
+// 主轴起点对齐
+.u-flex-start {
+	justify-content: flex-start;
+}
+
+// 主轴中间对齐
+.u-flex-center {
+	justify-content: center;
+}
+
+// 主轴终点对齐
+.u-flex-end {
+	justify-content: flex-end;
+}
+
+// 主轴等比间距
+.u-flex-between {
+	justify-content: space-between;
+}
+
+// 主轴均分间距
+.u-flex-around {
+	justify-content: space-around;
+}
+
+// 交叉轴起点对齐
+.u-flex-items-start {
+	align-items: flex-start;
+}
+
+// 交叉轴中间对齐
+.u-flex-items-center {
+	align-items: center;
+}
+
+// 交叉轴终点对齐
+.u-flex-items-end {
+	align-items: flex-end;
+}
+
+// 交叉轴第一行文字基线对齐
+.u-flex-items-baseline {
+	/* #ifndef APP-NVUE */
+	align-items: baseline;
+	/* #endif */
+}
+
+// 交叉轴方向拉伸对齐
+.u-flex-items-stretch {
+	align-items: stretch;
+}
+
+
+// 以下属于项目(子元素)的类
+
+// 子元素交叉轴起点对齐
+.u-flex-self-start {
+	align-self: flex-start;
+}
+
+// 子元素交叉轴居中对齐
+.u-flex-self-center {
+	align-self: center;
+}
+
+// 子元素交叉轴终点对齐
+.u-flex-self-end {
+	align-self: flex-end;
+}
+
+// 子元素交叉轴第一行文字基线对齐
+.u-flex-self-baseline {
+	align-self: baseline;
+}
+
+// 子元素交叉轴方向拉伸对齐
+.u-flex-self-stretch {
+	align-self: stretch;
+}
+
+// 多轴交叉时的对齐方式
+
+// 起点对齐
+.u-flex-content-start {
+	align-content: flex-start;
+}
+
+// 居中对齐
+.u-flex-content-center {
+	align-content: center;
+}
+
+// 终点对齐
+.u-flex-content-end {
+	align-content: flex-end;
+}
+
+// 两端对齐
+.u-flex-content-between {
+	align-content: space-between;
+}
+
+// 均分间距
+.u-flex-content-around {
+	align-content: space-around;
+}
+
+// 全部居中对齐
+.u-flex-middle {
+	justify-content: center;
+	align-items: center;
+	align-self: center;
+	align-content: center;
+}
+
+// 是否可以放大
+.u-flex-grow {
+	flex-grow: 1;
+}
+
+// 是否可以缩小
+.u-flex-shrink {
+	flex-shrink: 1;
+}
+
+// 定义内外边距,历遍1-80
+@for $i from 0 through 80 {
+	// 只要双数和能被5除尽的数
+	@if $i % 2 == 0 or $i % 5 == 0 {
+		// 得出:u-margin-30或者u-m-30
+		.u-margin-#{$i}, .u-m-#{$i} {
+			margin: $i + rpx!important;
+		}
+		
+		// 得出:u-padding-30或者u-p-30
+		.u-padding-#{$i}, .u-p-#{$i} {
+			padding: $i + rpx!important;
+		}
+		
+		@each $short, $long in l left, t top, r right, b bottom {
+			// 缩写版,结果如: u-m-l-30
+			// 定义外边距
+			.u-m-#{$short}-#{$i} {
+				margin-#{$long}: $i + rpx!important;
+			}
+			
+			// 定义内边距
+			.u-p-#{$short}-#{$i} {
+				padding-#{$long}: $i + rpx!important;
+			}
+			
+			// 完整版,结果如:u-margin-left-30
+			// 定义外边距
+			.u-margin-#{$long}-#{$i} {
+				margin-#{$long}: $i + rpx!important;
+			}
+			
+			// 定义内边距
+			.u-padding-#{$long}-#{$i} {
+				padding-#{$long}: $i + rpx!important;
+			}
+		}
+	}
+}
diff --git a/uni_modules/uview-plus/libs/css/h5.scss b/uni_modules/uview-plus/libs/css/h5.scss
new file mode 100644
index 0000000..e69de29
diff --git a/uni_modules/uview-plus/libs/css/mixin.scss b/uni_modules/uview-plus/libs/css/mixin.scss
new file mode 100644
index 0000000..7e35b3b
--- /dev/null
+++ b/uni_modules/uview-plus/libs/css/mixin.scss
@@ -0,0 +1,8 @@
+// 通过scss的mixin功能,把原来需要写4行的css,变成一行
+// 目的是保持代码干净整洁,不至于在nvue下,到处都要写display:flex的条件编译
+@mixin flex($direction: row) {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	flex-direction: $direction;
+}
diff --git a/uni_modules/uview-plus/libs/css/mp.scss b/uni_modules/uview-plus/libs/css/mp.scss
new file mode 100644
index 0000000..e69de29
diff --git a/uni_modules/uview-plus/libs/css/nvue.scss b/uni_modules/uview-plus/libs/css/nvue.scss
new file mode 100644
index 0000000..e69de29
diff --git a/uni_modules/uview-plus/libs/css/vue.scss b/uni_modules/uview-plus/libs/css/vue.scss
new file mode 100644
index 0000000..3ae4d29
--- /dev/null
+++ b/uni_modules/uview-plus/libs/css/vue.scss
@@ -0,0 +1,27 @@
+// 历遍生成4个方向的底部安全区
+@each $d in top, right, bottom, left {
+	.u-safe-area-inset-#{$d} {
+		padding-#{$d}: 0;
+		padding-#{$d}: constant(safe-area-inset-#{$d});  
+		padding-#{$d}: env(safe-area-inset-#{$d});  
+	}
+}
+
+//提升H5端uni.toast()的层级,避免被uView的modal等遮盖
+/* #ifdef H5 */
+uni-toast {
+    z-index: 10090;
+}
+uni-toast .uni-toast {
+   z-index: 10090;
+}
+/* #endif */
+
+// 隐藏scroll-view的滚动条
+::-webkit-scrollbar {
+    display: none;  
+    width: 0 !important;  
+    height: 0 !important;  
+    -webkit-appearance: none;  
+    background: transparent;  
+}
\ No newline at end of file
diff --git a/uni_modules/uview-plus/libs/function/colorGradient.js b/uni_modules/uview-plus/libs/function/colorGradient.js
new file mode 100644
index 0000000..174f894
--- /dev/null
+++ b/uni_modules/uview-plus/libs/function/colorGradient.js
@@ -0,0 +1,134 @@
+/**
+ * 求两个颜色之间的渐变值
+ * @param {string} startColor 开始的颜色
+ * @param {string} endColor 结束的颜色
+ * @param {number} step 颜色等分的份额
+ * */
+export function colorGradient(startColor = 'rgb(0, 0, 0)', endColor = 'rgb(255, 255, 255)', step = 10) {
+    const startRGB = hexToRgb(startColor, false) // 转换为rgb数组模式
+    const startR = startRGB[0]
+    const startG = startRGB[1]
+    const startB = startRGB[2]
+
+    const endRGB = hexToRgb(endColor, false)
+    const endR = endRGB[0]
+    const endG = endRGB[1]
+    const endB = endRGB[2]
+
+    const sR = (endR - startR) / step // 总差值
+    const sG = (endG - startG) / step
+    const sB = (endB - startB) / step
+    const colorArr = []
+    for (let i = 0; i < step; i++) {
+        // 计算每一步的hex值
+        let hex = rgbToHex(`rgb(${Math.round((sR * i + startR))},${Math.round((sG * i + startG))},${Math.round((sB
+			* i + startB))})`)
+        // 确保第一个颜色值为startColor的值
+        if (i === 0) hex = rgbToHex(startColor)
+        // 确保最后一个颜色值为endColor的值
+        if (i === step - 1) hex = rgbToHex(endColor)
+        colorArr.push(hex)
+    }
+    return colorArr
+}
+
+// 将hex表示方式转换为rgb表示方式(这里返回rgb数组模式)
+export function hexToRgb(sColor, str = true) {
+    const reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/
+    sColor = String(sColor).toLowerCase()
+    if (sColor && reg.test(sColor)) {
+        if (sColor.length === 4) {
+            let sColorNew = '#'
+            for (let i = 1; i < 4; i += 1) {
+                sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1))
+            }
+            sColor = sColorNew
+        }
+        // 处理六位的颜色值
+        const sColorChange = []
+        for (let i = 1; i < 7; i += 2) {
+            sColorChange.push(parseInt(`0x${sColor.slice(i, i + 2)}`))
+        }
+        if (!str) {
+            return sColorChange
+        }
+        return `rgb(${sColorChange[0]},${sColorChange[1]},${sColorChange[2]})`
+    } if (/^(rgb|RGB)/.test(sColor)) {
+        const arr = sColor.replace(/(?:\(|\)|rgb|RGB)*/g, '').split(',')
+        return arr.map((val) => Number(val))
+    }
+    return sColor
+}
+
+// 将rgb表示方式转换为hex表示方式
+export function rgbToHex(rgb) {
+    const _this = rgb
+    const reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/
+    if (/^(rgb|RGB)/.test(_this)) {
+        const aColor = _this.replace(/(?:\(|\)|rgb|RGB)*/g, '').split(',')
+        let strHex = '#'
+        for (let i = 0; i < aColor.length; i++) {
+            let hex = Number(aColor[i]).toString(16)
+            hex = String(hex).length == 1 ? `${0}${hex}` : hex // 保证每个rgb的值为2位
+            if (hex === '0') {
+                hex += hex
+            }
+            strHex += hex
+        }
+        if (strHex.length !== 7) {
+            strHex = _this
+        }
+        return strHex
+    } if (reg.test(_this)) {
+        const aNum = _this.replace(/#/, '').split('')
+        if (aNum.length === 6) {
+            return _this
+        } if (aNum.length === 3) {
+            let numHex = '#'
+            for (let i = 0; i < aNum.length; i += 1) {
+                numHex += (aNum[i] + aNum[i])
+            }
+            return numHex
+        }
+    } else {
+        return _this
+    }
+}
+
+/**
+* JS颜色十六进制转换为rgb或rgba,返回的格式为 rgba(255,255,255,0.5)字符串
+* sHex为传入的十六进制的色值
+* alpha为rgba的透明度
+*/
+export function colorToRgba(color, alpha) {
+    color = rgbToHex(color)
+    // 十六进制颜色值的正则表达式
+    const reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/
+    /* 16进制颜色转为RGB格式 */
+    let sColor = String(color).toLowerCase()
+    if (sColor && reg.test(sColor)) {
+        if (sColor.length === 4) {
+            let sColorNew = '#'
+            for (let i = 1; i < 4; i += 1) {
+                sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1))
+            }
+            sColor = sColorNew
+        }
+        // 处理六位的颜色值
+        const sColorChange = []
+        for (let i = 1; i < 7; i += 2) {
+            sColorChange.push(parseInt(`0x${sColor.slice(i, i + 2)}`))
+        }
+        // return sColorChange.join(',')
+        return `rgba(${sColorChange.join(',')},${alpha})`
+    }
+
+    return sColor
+}
+
+export default {
+    colorGradient,
+    hexToRgb,
+    rgbToHex,
+    colorToRgba
+}
diff --git a/uni_modules/uview-plus/libs/function/debounce.js b/uni_modules/uview-plus/libs/function/debounce.js
new file mode 100644
index 0000000..d424aa4
--- /dev/null
+++ b/uni_modules/uview-plus/libs/function/debounce.js
@@ -0,0 +1,29 @@
+let timeout = null
+
+/**
+ * 防抖原理:一定时间内,只有最后一次操作,再过wait毫秒后才执行函数
+ *
+ * @param {Function} func 要执行的回调函数
+ * @param {Number} wait 延时的时间
+ * @param {Boolean} immediate 是否立即执行
+ * @return null
+ */
+export function debounce(func, wait = 500, immediate = false) {
+    // 清除定时器
+    if (timeout !== null) clearTimeout(timeout)
+    // 立即执行,此类情况一般用不到
+    if (immediate) {
+        const callNow = !timeout
+        timeout = setTimeout(() => {
+            timeout = null
+        }, wait)
+        if (callNow) typeof func === 'function' && func()
+    } else {
+        // 设置定时器,当最后一次操作后,timeout不会再被清除,所以在延时wait毫秒后执行func回调方法
+        timeout = setTimeout(() => {
+            typeof func === 'function' && func()
+        }, wait)
+    }
+}
+
+export default debounce
diff --git a/uni_modules/uview-plus/libs/function/digit.js b/uni_modules/uview-plus/libs/function/digit.js
new file mode 100644
index 0000000..470bea6
--- /dev/null
+++ b/uni_modules/uview-plus/libs/function/digit.js
@@ -0,0 +1,167 @@
+let _boundaryCheckingState = true; // 是否进行越界检查的全局开关
+
+/**
+ * 把错误的数据转正
+ * @private
+ * @example strip(0.09999999999999998)=0.1
+ */
+export function strip(num, precision = 15) {
+  return +parseFloat(Number(num).toPrecision(precision));
+}
+
+/**
+ * Return digits length of a number
+ * @private
+ * @param {*number} num Input number
+ */
+export function digitLength(num) {
+  // Get digit length of e
+  const eSplit = num.toString().split(/[eE]/);
+  const len = (eSplit[0].split('.')[1] || '').length - +(eSplit[1] || 0);
+  return len > 0 ? len : 0;
+}
+
+/**
+ * 把小数转成整数,如果是小数则放大成整数
+ * @private
+ * @param {*number} num 输入数
+ */
+export function float2Fixed(num) {
+  if (num.toString().indexOf('e') === -1) {
+    return Number(num.toString().replace('.', ''));
+  }
+  const dLen = digitLength(num);
+  return dLen > 0 ? strip(Number(num) * Math.pow(10, dLen)) : Number(num);
+}
+
+/**
+ * 检测数字是否越界,如果越界给出提示
+ * @private
+ * @param {*number} num 输入数
+ */
+export function checkBoundary(num) {
+  if (_boundaryCheckingState) {
+    if (num > Number.MAX_SAFE_INTEGER || num < Number.MIN_SAFE_INTEGER) {
+      console.warn(`${num} 超出了精度限制,结果可能不正确`);
+    }
+  }
+}
+
+/**
+ * 把递归操作扁平迭代化
+ * @param {number[]} arr 要操作的数字数组
+ * @param {function} operation 迭代操作
+ * @private
+ */
+export function iteratorOperation(arr, operation) {
+  const [num1, num2, ...others] = arr;
+  let res = operation(num1, num2);
+
+  others.forEach((num) => {
+    res = operation(res, num);
+  });
+
+  return res;
+}
+
+/**
+ * 高精度乘法
+ * @export
+ */
+export function times(...nums) {
+  if (nums.length > 2) {
+    return iteratorOperation(nums, times);
+  }
+
+  const [num1, num2] = nums;
+  const num1Changed = float2Fixed(num1);
+  const num2Changed = float2Fixed(num2);
+  const baseNum = digitLength(num1) + digitLength(num2);
+  const leftValue = num1Changed * num2Changed;
+
+  checkBoundary(leftValue);
+
+  return leftValue / Math.pow(10, baseNum);
+}
+
+/**
+ * 高精度加法
+ * @export
+ */
+export function plus(...nums) {
+  if (nums.length > 2) {
+    return iteratorOperation(nums, plus);
+  }
+
+  const [num1, num2] = nums;
+  // 取最大的小数位
+  const baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));
+  // 把小数都转为整数然后再计算
+  return (times(num1, baseNum) + times(num2, baseNum)) / baseNum;
+}
+
+/**
+ * 高精度减法
+ * @export
+ */
+export function minus(...nums) {
+  if (nums.length > 2) {
+    return iteratorOperation(nums, minus);
+  }
+
+  const [num1, num2] = nums;
+  const baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));
+  return (times(num1, baseNum) - times(num2, baseNum)) / baseNum;
+}
+
+/**
+ * 高精度除法
+ * @export
+ */
+export function divide(...nums) {
+  if (nums.length > 2) {
+    return iteratorOperation(nums, divide);
+  }
+
+  const [num1, num2] = nums;
+  const num1Changed = float2Fixed(num1);
+  const num2Changed = float2Fixed(num2);
+  checkBoundary(num1Changed);
+  checkBoundary(num2Changed);
+  // 重要,这里必须用strip进行修正
+  return times(num1Changed / num2Changed, strip(Math.pow(10, digitLength(num2) - digitLength(num1))));
+}
+
+/**
+ * 四舍五入
+ * @export
+ */
+export function round(num, ratio) {
+  const base = Math.pow(10, ratio);
+  let result = divide(Math.round(Math.abs(times(num, base))), base);
+  if (num < 0 && result !== 0) {
+    result = times(result, -1);
+  }
+  // 位数不足则补0
+  return result;
+}
+
+/**
+ * 是否进行边界检查,默认开启
+ * @param flag 标记开关,true 为开启,false 为关闭,默认为 true
+ * @export
+ */
+export function enableBoundaryChecking(flag = true) {
+  _boundaryCheckingState = flag;
+}
+
+
+export default {
+  times,
+  plus,
+  minus,
+  divide,
+  round,
+  enableBoundaryChecking,
+};
+
diff --git a/uni_modules/uview-plus/libs/function/index.js b/uni_modules/uview-plus/libs/function/index.js
new file mode 100644
index 0000000..5f0b039
--- /dev/null
+++ b/uni_modules/uview-plus/libs/function/index.js
@@ -0,0 +1,724 @@
+import {
+	number as testNumber,
+	array as testArray,
+	empty as testEmpty
+} from './test'
+import { round } from './digit.js'
+import config from '../config/config';
+/**
+ * @description 如果value小于min,取min;如果value大于max,取max
+ * @param {number} min 
+ * @param {number} max 
+ * @param {number} value
+ */
+export function range(min = 0, max = 0, value = 0) {
+	return Math.max(min, Math.min(max, Number(value)))
+}
+
+/**
+ * @description 用于获取用户传递值的px值  如果用户传递了"xxpx"或者"xxrpx",取出其数值部分,如果是"xxxrpx"还需要用过uni.rpx2px进行转换
+ * @param {number|string} value 用户传递值的px值
+ * @param {boolean} unit 
+ * @returns {number|string}
+ */
+export function getPx(value, unit = false) {
+	if (testNumber(value)) {
+		return unit ? `${value}px` : Number(value)
+	}
+	// 如果带有rpx,先取出其数值部分,再转为px值
+	if (/(rpx|upx)$/.test(value)) {
+		return unit ? `${uni.rpx2px(parseInt(value))}px` : Number(uni.rpx2px(parseInt(value)))
+	}
+	return unit ? `${parseInt(value)}px` : parseInt(value)
+}
+
+/**
+ * @description 进行延时,以达到可以简写代码的目的 比如: await uni.$u.sleep(20)将会阻塞20ms
+ * @param {number} value 堵塞时间 单位ms 毫秒
+ * @returns {Promise} 返回promise
+ */
+export function sleep(value = 30) {
+	return new Promise((resolve) => {
+		setTimeout(() => {
+			resolve()
+		}, value)
+	})
+}
+/**
+ * @description 运行期判断平台
+ * @returns {string} 返回所在平台(小写) 
+ * @link 运行期判断平台 https://uniapp.dcloud.io/frame?id=判断平台
+ */
+export function os() {
+	return uni.getSystemInfoSync().platform.toLowerCase()
+}
+/**
+ * @description 获取系统信息同步接口
+ * @link 获取系统信息同步接口 https://uniapp.dcloud.io/api/system/info?id=getsysteminfosync 
+ */
+export function sys() {
+	return uni.getSystemInfoSync()
+}
+
+/**
+ * @description 取一个区间数
+ * @param {Number} min 最小值
+ * @param {Number} max 最大值
+ */
+export function random(min, max) {
+	if (min >= 0 && max > 0 && max >= min) {
+		const gab = max - min + 1
+		return Math.floor(Math.random() * gab + min)
+	}
+	return 0
+}
+
+/**
+ * @param {Number} len uuid的长度
+ * @param {Boolean} firstU 将返回的首字母置为"u"
+ * @param {Nubmer} radix 生成uuid的基数(意味着返回的字符串都是这个基数),2-二进制,8-八进制,10-十进制,16-十六进制
+ */
+export function guid(len = 32, firstU = true, radix = null) {
+	const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('')
+	const uuid = []
+	radix = radix || chars.length
+
+	if (len) {
+		// 如果指定uuid长度,只是取随机的字符,0|x为位运算,能去掉x的小数位,返回整数位
+		for (let i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix]
+	} else {
+		let r
+		// rfc4122标准要求返回的uuid中,某些位为固定的字符
+		uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-'
+		uuid[14] = '4'
+
+		for (let i = 0; i < 36; i++) {
+			if (!uuid[i]) {
+				r = 0 | Math.random() * 16
+				uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r]
+			}
+		}
+	}
+	// 移除第一个字符,并用u替代,因为第一个字符为数值时,该guuid不能用作id或者class
+	if (firstU) {
+		uuid.shift()
+		return `u${uuid.join('')}`
+	}
+	return uuid.join('')
+}
+
+/**
+* @description 获取父组件的参数,因为支付宝小程序不支持provide/inject的写法
+   this.$parent在非H5中,可以准确获取到父组件,但是在H5中,需要多次this.$parent.$parent.xxx
+   这里默认值等于undefined有它的含义,因为最顶层元素(组件)的$parent就是undefined,意味着不传name
+   值(默认为undefined),就是查找最顶层的$parent
+*  @param {string|undefined} name 父组件的参数名
+*/
+export function $parent(name = undefined) {
+	let parent = this.$parent
+	// 通过while历遍,这里主要是为了H5需要多层解析的问题
+	while (parent) {
+		// 父组件
+		if (parent.$options && parent.$options.name !== name) {
+			// 如果组件的name不相等,继续上一级寻找
+			parent = parent.$parent
+		} else {
+			return parent
+		}
+	}
+	return false
+}
+
+/**
+ * @description 样式转换
+ * 对象转字符串,或者字符串转对象
+ * @param {object | string} customStyle 需要转换的目标
+ * @param {String} target 转换的目的,object-转为对象,string-转为字符串
+ * @returns {object|string}
+ */
+export function addStyle(customStyle, target = 'object') {
+	// 字符串转字符串,对象转对象情形,直接返回
+	if (testEmpty(customStyle) || typeof(customStyle) === 'object' && target === 'object' || target === 'string' &&
+		typeof(customStyle) === 'string') {
+		return customStyle
+	}
+	// 字符串转对象
+	if (target === 'object') {
+		// 去除字符串样式中的两端空格(中间的空格不能去掉,比如padding: 20px 0如果去掉了就错了),空格是无用的
+		customStyle = trim(customStyle)
+		// 根据";"将字符串转为数组形式
+		const styleArray = customStyle.split(';')
+		const style = {}
+		// 历遍数组,拼接成对象
+		for (let i = 0; i < styleArray.length; i++) {
+			// 'font-size:20px;color:red;',如此最后字符串有";"的话,会导致styleArray最后一个元素为空字符串,这里需要过滤
+			if (styleArray[i]) {
+				const item = styleArray[i].split(':')
+				style[trim(item[0])] = trim(item[1])
+			}
+		}
+		return style
+	}
+	// 这里为对象转字符串形式
+	let string = ''
+	if (typeof customStyle === 'object') {
+		customStyle.forEach((val, i) => {
+			// 驼峰转为中划线的形式,否则css内联样式,无法识别驼峰样式属性名
+			const key = i.replace(/([A-Z])/g, '-$1').toLowerCase()
+			string += `${key}:${val};`
+		})
+	}
+	// 去除两端空格
+	return trim(string)
+}
+
+/**
+ * @description 添加单位,如果有rpx,upx,%,px等单位结尾或者值为auto,直接返回,否则加上px单位结尾
+ * @param {string|number} value 需要添加单位的值
+ * @param {string} unit 添加的单位名 比如px
+ */
+export function addUnit(value = 'auto', unit = '') {
+	if (!unit) {
+		unit = config.unit || 'px'
+	}
+	value = String(value)
+	// 用uView内置验证规则中的number判断是否为数值
+	return testNumber(value) ? `${value}${unit}` : value
+}
+
+/**
+ * @description 深度克隆
+ * @param {object} obj 需要深度克隆的对象
+ * @returns {*} 克隆后的对象或者原值(不是对象)
+ */
+export function deepClone(obj) {
+	// 对常见的“非”值,直接返回原来值
+	if ([null, undefined, NaN, false].includes(obj)) return obj
+	if (typeof obj !== 'object' && typeof obj !== 'function') {
+		// 原始类型直接返回
+		return obj
+	}
+	const o = testArray(obj) ? [] : {}
+	for (const i in obj) {
+		if (obj.hasOwnProperty(i)) {
+			o[i] = typeof obj[i] === 'object' ? deepClone(obj[i]) : obj[i]
+		}
+	}
+	return o
+}
+
+/**
+ * @description JS对象深度合并
+ * @param {object} target 需要拷贝的对象
+ * @param {object} source 拷贝的来源对象
+ * @returns {object|boolean} 深度合并后的对象或者false(入参有不是对象)
+ */
+export function deepMerge(targetOrigin = {}, source = {}) {
+	let target = deepClone(targetOrigin)
+	if (typeof target !== 'object' || typeof source !== 'object') return false
+	for (const prop in source) {
+		if (!source.hasOwnProperty(prop)) continue
+		if (prop in target) {
+			if (source[prop] == null) {
+				target[prop] = source[prop]
+			}else if (typeof target[prop] !== 'object') {
+				target[prop] = source[prop]
+			} else if (typeof source[prop] !== 'object') {
+				target[prop] = source[prop]
+			} else if (target[prop].concat && source[prop].concat) {
+				target[prop] = target[prop].concat(source[prop])
+			} else {
+				target[prop] = deepMerge(target[prop], source[prop])
+			}
+		} else {
+			target[prop] = source[prop]
+		}
+	}
+	return target
+}
+/**
+ * @description JS对象深度合并
+ * @param {object} target 需要拷贝的对象
+ * @param {object} source 拷贝的来源对象
+ * @returns {object|boolean} 深度合并后的对象或者false(入参有不是对象)
+ */
+export function shallowMerge(target, source = {}) {
+	if (typeof target !== 'object' || typeof source !== 'object') return false
+	for (const prop in source) {
+		if (!source.hasOwnProperty(prop)) continue
+		if (prop in target) {
+			if (source[prop] == null) {
+				target[prop] = source[prop]
+			}else if (typeof target[prop] !== 'object') {
+				target[prop] = source[prop]
+			} else if (typeof source[prop] !== 'object') {
+				target[prop] = source[prop]
+			} else if (target[prop].concat && source[prop].concat) {
+				target[prop] = target[prop].concat(source[prop])
+			} else {
+				target[prop] = shallowMerge(target[prop], source[prop])
+			}
+		} else {
+			target[prop] = source[prop]
+		}
+	}
+	return target
+}
+
+/**
+ * @description error提示
+ * @param {*} err 错误内容
+ */
+export function error(err) {
+	// 开发环境才提示,生产环境不会提示
+	if (process.env.NODE_ENV === 'development') {
+		console.error(`uView提示:${err}`)
+	}
+}
+
+/**
+ * @description 打乱数组
+ * @param {array} array 需要打乱的数组
+ * @returns {array} 打乱后的数组
+ */
+export function randomArray(array = []) {
+	// 原理是sort排序,Math.random()产生0<= x < 1之间的数,会导致x-0.05大于或者小于0
+	return array.sort(() => Math.random() - 0.5)
+}
+
+// padStart 的 polyfill,因为某些机型或情况,还无法支持es7的padStart,比如电脑版的微信小程序
+// 所以这里做一个兼容polyfill的兼容处理
+if (!String.prototype.padStart) {
+	// 为了方便表示这里 fillString 用了ES6 的默认参数,不影响理解
+	String.prototype.padStart = function(maxLength, fillString = ' ') {
+		if (Object.prototype.toString.call(fillString) !== '[object String]') {
+			throw new TypeError(
+				'fillString must be String'
+			)
+		}
+		const str = this
+		// 返回 String(str) 这里是为了使返回的值是字符串字面量,在控制台中更符合直觉
+		if (str.length >= maxLength) return String(str)
+
+		const fillLength = maxLength - str.length
+		let times = Math.ceil(fillLength / fillString.length)
+		while (times >>= 1) {
+			fillString += fillString
+			if (times === 1) {
+				fillString += fillString
+			}
+		}
+		return fillString.slice(0, fillLength) + str
+	}
+}
+
+/**
+ * @description 格式化时间
+ * @param {String|Number} dateTime 需要格式化的时间戳
+ * @param {String} fmt 格式化规则 yyyy:mm:dd|yyyy:mm|yyyy年mm月dd日|yyyy年mm月dd日 hh时MM分等,可自定义组合 默认yyyy-mm-dd
+ * @returns {string} 返回格式化后的字符串
+ */
+export function timeFormat(dateTime = null, formatStr = 'yyyy-mm-dd') {
+  let date
+	// 若传入时间为假值,则取当前时间
+  if (!dateTime) {
+    date = new Date()
+  }
+  // 若为unix秒时间戳,则转为毫秒时间戳(逻辑有点奇怪,但不敢改,以保证历史兼容)
+  else if (/^\d{10}$/.test(dateTime.toString().trim())) {
+    date = new Date(dateTime * 1000)
+  }
+  // 若用户传入字符串格式时间戳,new Date无法解析,需做兼容
+  else if (typeof dateTime === 'string' && /^\d+$/.test(dateTime.trim())) {
+    date = new Date(Number(dateTime))
+  }
+  // 其他都认为符合 RFC 2822 规范
+  else {
+    // 处理平台性差异,在Safari/Webkit中,new Date仅支持/作为分割符的字符串时间
+    date = new Date(
+      typeof dateTime === 'string'
+        ? dateTime.replace(/-/g, '/')
+        : dateTime
+    )
+  }
+
+	const timeSource = {
+		'y': date.getFullYear().toString(), // 年
+		'm': (date.getMonth() + 1).toString().padStart(2, '0'), // 月
+		'd': date.getDate().toString().padStart(2, '0'), // 日
+		'h': date.getHours().toString().padStart(2, '0'), // 时
+		'M': date.getMinutes().toString().padStart(2, '0'), // 分
+		's': date.getSeconds().toString().padStart(2, '0') // 秒
+		// 有其他格式化字符需求可以继续添加,必须转化成字符串
+	}
+
+  for (const key in timeSource) {
+    const [ret] = new RegExp(`${key}+`).exec(formatStr) || []
+    if (ret) {
+      // 年可能只需展示两位
+      const beginIndex = key === 'y' && ret.length === 2 ? 2 : 0
+      formatStr = formatStr.replace(ret, timeSource[key].slice(beginIndex))
+    }
+  }
+
+  return formatStr
+}
+
+/**
+ * @description 时间戳转为多久之前
+ * @param {String|Number} timestamp 时间戳
+ * @param {String|Boolean} format 
+ * 格式化规则如果为时间格式字符串,超出一定时间范围,返回固定的时间格式;
+ * 如果为布尔值false,无论什么时间,都返回多久以前的格式
+ * @returns {string} 转化后的内容
+ */
+export function timeFrom(timestamp = null, format = 'yyyy-mm-dd') {
+	if (timestamp == null) timestamp = Number(new Date())
+	timestamp = parseInt(timestamp)
+	// 判断用户输入的时间戳是秒还是毫秒,一般前端js获取的时间戳是毫秒(13位),后端传过来的为秒(10位)
+	if (timestamp.toString().length == 10) timestamp *= 1000
+	let timer = (new Date()).getTime() - timestamp
+	timer = parseInt(timer / 1000)
+	// 如果小于5分钟,则返回"刚刚",其他以此类推
+	let tips = ''
+	switch (true) {
+		case timer < 300:
+			tips = '刚刚'
+			break
+		case timer >= 300 && timer < 3600:
+			tips = `${parseInt(timer / 60)}分钟前`
+			break
+		case timer >= 3600 && timer < 86400:
+			tips = `${parseInt(timer / 3600)}小时前`
+			break
+		case timer >= 86400 && timer < 2592000:
+			tips = `${parseInt(timer / 86400)}天前`
+			break
+		default:
+			// 如果format为false,则无论什么时间戳,都显示xx之前
+			if (format === false) {
+				if (timer >= 2592000 && timer < 365 * 86400) {
+					tips = `${parseInt(timer / (86400 * 30))}个月前`
+				} else {
+					tips = `${parseInt(timer / (86400 * 365))}年前`
+				}
+			} else {
+				tips = timeFormat(timestamp, format)
+			}
+	}
+	return tips
+}
+
+/**
+ * @description 去除空格
+ * @param String str 需要去除空格的字符串
+ * @param String pos both(左右)|left|right|all 默认both
+ */
+export function trim(str, pos = 'both') {
+	str = String(str)
+	if (pos == 'both') {
+		return str.replace(/^\s+|\s+$/g, '')
+	}
+	if (pos == 'left') {
+		return str.replace(/^\s*/, '')
+	}
+	if (pos == 'right') {
+		return str.replace(/(\s*$)/g, '')
+	}
+	if (pos == 'all') {
+		return str.replace(/\s+/g, '')
+	}
+	return str
+}
+
+/**
+ * @description 对象转url参数
+ * @param {object} data,对象
+ * @param {Boolean} isPrefix,是否自动加上"?"
+ * @param {string} arrayFormat 规则 indices|brackets|repeat|comma
+ */
+export function queryParams(data = {}, isPrefix = true, arrayFormat = 'brackets') {
+	const prefix = isPrefix ? '?' : ''
+	const _result = []
+	if (['indices', 'brackets', 'repeat', 'comma'].indexOf(arrayFormat) == -1) arrayFormat = 'brackets'
+	for (const key in data) {
+		const value = data[key]
+		// 去掉为空的参数
+		if (['', undefined, null].indexOf(value) >= 0) {
+			continue
+		}
+		// 如果值为数组,另行处理
+		if (value.constructor === Array) {
+			// e.g. {ids: [1, 2, 3]}
+			switch (arrayFormat) {
+				case 'indices':
+					// 结果: ids[0]=1&ids[1]=2&ids[2]=3
+					for (let i = 0; i < value.length; i++) {
+						_result.push(`${key}[${i}]=${value[i]}`)
+					}
+					break
+				case 'brackets':
+					// 结果: ids[]=1&ids[]=2&ids[]=3
+					value.forEach((_value) => {
+						_result.push(`${key}[]=${_value}`)
+					})
+					break
+				case 'repeat':
+					// 结果: ids=1&ids=2&ids=3
+					value.forEach((_value) => {
+						_result.push(`${key}=${_value}`)
+					})
+					break
+				case 'comma':
+					// 结果: ids=1,2,3
+					let commaStr = ''
+					value.forEach((_value) => {
+						commaStr += (commaStr ? ',' : '') + _value
+					})
+					_result.push(`${key}=${commaStr}`)
+					break
+				default:
+					value.forEach((_value) => {
+						_result.push(`${key}[]=${_value}`)
+					})
+			}
+		} else {
+			_result.push(`${key}=${value}`)
+		}
+	}
+	return _result.length ? prefix + _result.join('&') : ''
+}
+
+/**
+ * 显示消息提示框
+ * @param {String} title 提示的内容,长度与 icon 取值有关。
+ * @param {Number} duration 提示的延迟时间,单位毫秒,默认:2000
+ */
+export function toast(title, duration = 2000) {
+	uni.showToast({
+		title: String(title),
+		icon: 'none',
+		duration
+	})
+}
+
+/**
+ * @description 根据主题type值,获取对应的图标
+ * @param {String} type 主题名称,primary|info|error|warning|success
+ * @param {boolean} fill 是否使用fill填充实体的图标
+ */
+export function type2icon(type = 'success', fill = false) {
+	// 如果非预置值,默认为success
+	if (['primary', 'info', 'error', 'warning', 'success'].indexOf(type) == -1) type = 'success'
+	let iconName = ''
+	// 目前(2019-12-12),info和primary使用同一个图标
+	switch (type) {
+		case 'primary':
+			iconName = 'info-circle'
+			break
+		case 'info':
+			iconName = 'info-circle'
+			break
+		case 'error':
+			iconName = 'close-circle'
+			break
+		case 'warning':
+			iconName = 'error-circle'
+			break
+		case 'success':
+			iconName = 'checkmark-circle'
+			break
+		default:
+			iconName = 'checkmark-circle'
+	}
+	// 是否是实体类型,加上-fill,在icon组件库中,实体的类名是后面加-fill的
+	if (fill) iconName += '-fill'
+	return iconName
+}
+
+/**
+ * @description 数字格式化
+ * @param {number|string} number 要格式化的数字
+ * @param {number} decimals 保留几位小数
+ * @param {string} decimalPoint 小数点符号
+ * @param {string} thousandsSeparator 千分位符号
+ * @returns {string} 格式化后的数字
+ */
+export function priceFormat(number, decimals = 0, decimalPoint = '.', thousandsSeparator = ',') {
+	number = (`${number}`).replace(/[^0-9+-Ee.]/g, '')
+	const n = !isFinite(+number) ? 0 : +number
+	const prec = !isFinite(+decimals) ? 0 : Math.abs(decimals)
+	const sep = (typeof thousandsSeparator === 'undefined') ? ',' : thousandsSeparator
+	const dec = (typeof decimalPoint === 'undefined') ? '.' : decimalPoint
+	let s = ''
+
+	s = (prec ? round(n, prec) + '' : `${Math.round(n)}`).split('.')
+	const re = /(-?\d+)(\d{3})/
+	while (re.test(s[0])) {
+		s[0] = s[0].replace(re, `$1${sep}$2`)
+	}
+	
+	if ((s[1] || '').length < prec) {
+		s[1] = s[1] || ''
+		s[1] += new Array(prec - s[1].length + 1).join('0')
+	}
+	return s.join(dec)
+}
+
+/**
+ * @description 获取duration值
+ * 如果带有ms或者s直接返回,如果大于一定值,认为是ms单位,小于一定值,认为是s单位
+ * 比如以30位阈值,那么300大于30,可以理解为用户想要的是300ms,而不是想花300s去执行一个动画
+ * @param {String|number} value 比如: "1s"|"100ms"|1|100
+ * @param {boolean} unit  提示: 如果是false 默认返回number
+ * @return {string|number} 
+ */
+export function getDuration(value, unit = true) {
+	const valueNum = parseInt(value)
+	if (unit) {
+		if (/s$/.test(value)) return value
+		return value > 30 ? `${value}ms` : `${value}s`
+	}
+	if (/ms$/.test(value)) return valueNum
+	if (/s$/.test(value)) return valueNum > 30 ? valueNum : valueNum * 1000
+	return valueNum
+}
+
+/**
+ * @description 日期的月或日补零操作
+ * @param {String} value 需要补零的值
+ */
+export function padZero(value) {
+	return `00${value}`.slice(-2)
+}
+
+/**
+ * @description 在u-form的子组件内容发生变化,或者失去焦点时,尝试通知u-form执行校验方法
+ * @param {*} instance
+ * @param {*} event
+ */
+export function formValidate(instance, event) {
+	const formItem = $parent.call(instance, 'u-form-item')
+	const form = $parent.call(instance, 'u-form')
+	// 如果发生变化的input或者textarea等,其父组件中有u-form-item或者u-form等,就执行form的validate方法
+	// 同时将form-item的pros传递给form,让其进行精确对象验证
+	if (formItem && form) {
+		form.validateField(formItem.prop, () => {}, event)
+	}
+}
+
+/**
+ * @description 获取某个对象下的属性,用于通过类似'a.b.c'的形式去获取一个对象的的属性的形式
+ * @param {object} obj 对象
+ * @param {string} key 需要获取的属性字段
+ * @returns {*}
+ */
+export function getProperty(obj, key) {
+	if (typeof obj !== 'object' || null == obj) {
+        return ''
+    }
+	if (typeof key !== 'string' || key === '') {
+		return ''
+	}
+	if (key.indexOf('.') !== -1) {
+		const keys = key.split('.')
+		let firstObj = obj[keys[0]] || {}
+
+		for (let i = 1; i < keys.length; i++) {
+			if (firstObj) {
+				firstObj = firstObj[keys[i]]
+			}
+		}
+		return firstObj
+	}
+	return obj[key]
+}
+
+/**
+ * @description 设置对象的属性值,如果'a.b.c'的形式进行设置
+ * @param {object} obj 对象
+ * @param {string} key 需要设置的属性
+ * @param {string} value 设置的值
+ */
+export function setProperty(obj, key, value) {
+	if (typeof obj !== 'object' || null == obj) {
+		return
+	}
+	// 递归赋值
+	const inFn = function(_obj, keys, v) {
+		// 最后一个属性key
+		if (keys.length === 1) {
+			_obj[keys[0]] = v
+			return
+		}
+		// 0~length-1个key
+		while (keys.length > 1) {
+			const k = keys[0]
+			if (!_obj[k] || (typeof _obj[k] !== 'object')) {
+				_obj[k] = {}
+			}
+			const key = keys.shift()
+			// 自调用判断是否存在属性,不存在则自动创建对象
+			inFn(_obj[k], keys, v)
+		}
+	}
+
+	if (typeof key !== 'string' || key === '') {
+
+	} else if (key.indexOf('.') !== -1) { // 支持多层级赋值操作
+		const keys = key.split('.')
+		inFn(obj, keys, value)
+	} else {
+		obj[key] = value
+	}
+}
+
+/**
+ * @description 获取当前页面路径
+ */
+export function page() {
+	const pages = getCurrentPages()
+	// 某些特殊情况下(比如页面进行redirectTo时的一些时机),pages可能为空数组
+	return `/${pages[pages.length - 1].route || ''}`
+}
+
+/**
+ * @description 获取当前路由栈实例数组
+ */
+export function pages() {
+	const pages = getCurrentPages()
+	return pages
+}
+
+export default {
+	range,
+	getPx,
+	sleep,
+	os,
+	sys,
+	random,
+	guid,
+	$parent,
+	addStyle,
+	addUnit,
+	deepClone,
+	deepMerge,
+    shallowMerge,
+	error,
+	randomArray,
+	timeFormat,
+	timeFrom,
+	trim,
+	queryParams,
+	toast,
+	type2icon,
+	priceFormat,
+	getDuration,
+	padZero,
+	formValidate,
+	getProperty,
+	setProperty,
+	page,
+	pages,
+	// setConfig
+}
diff --git a/uni_modules/uview-plus/libs/function/platform.js b/uni_modules/uview-plus/libs/function/platform.js
new file mode 100644
index 0000000..904fccc
--- /dev/null
+++ b/uni_modules/uview-plus/libs/function/platform.js
@@ -0,0 +1,75 @@
+/**
+ * 注意:
+ * 此部分内容,在vue-cli模式下,需要在vue.config.js加入如下内容才有效:
+ * module.exports = {
+ *     transpileDependencies: ['uview-v2']
+ * }
+ */
+
+let platform = 'none'
+
+// #ifdef VUE3
+platform = 'vue3'
+// #endif
+
+// #ifdef VUE2
+platform = 'vue2'
+// #endif
+
+// #ifdef APP-PLUS
+platform = 'plus'
+// #endif
+
+// #ifdef APP-NVUE
+platform = 'nvue'
+// #endif
+
+// #ifdef H5
+platform = 'h5'
+// #endif
+
+// #ifdef MP
+platform = 'mp'
+// #endif
+
+// #ifdef MP-WEIXIN
+platform = 'weixin'
+// #endif
+
+// #ifdef MP-ALIPAY
+platform = 'alipay'
+// #endif
+
+// #ifdef MP-BAIDU
+platform = 'baidu'
+// #endif
+
+// #ifdef MP-TOUTIAO
+platform = 'toutiao'
+// #endif
+
+// #ifdef MP-QQ
+platform = 'qq'
+// #endif
+
+// #ifdef MP-KUAISHOU
+platform = 'kuaishou'
+// #endif
+
+// #ifdef MP-360
+platform = '360'
+// #endif
+
+// #ifdef QUICKAPP-WEBVIEW
+platform = 'quickapp-webview'
+// #endif
+
+// #ifdef QUICKAPP-WEBVIEW-HUAWEI
+platform = 'quickapp-webview-huawei'
+// #endif
+
+// #ifdef QUICKAPP-WEBVIEW-UNION
+platform = 'quckapp-webview-union'
+// #endif
+
+export default platform
diff --git a/uni_modules/uview-plus/libs/function/test.js b/uni_modules/uview-plus/libs/function/test.js
new file mode 100644
index 0000000..f97a30f
--- /dev/null
+++ b/uni_modules/uview-plus/libs/function/test.js
@@ -0,0 +1,288 @@
+/**
+ * 验证电子邮箱格式
+ */
+export function email(value) {
+    return /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/.test(value)
+}
+
+/**
+ * 验证手机格式
+ */
+export function mobile(value) {
+    return /^1[23456789]\d{9}$/.test(value)
+}
+
+/**
+ * 验证URL格式
+ */
+export function url(value) {
+    return /^((https|http|ftp|rtsp|mms):\/\/)(([0-9a-zA-Z_!~*'().&=+$%-]+: )?[0-9a-zA-Z_!~*'().&=+$%-]+@)?(([0-9]{1,3}.){3}[0-9]{1,3}|([0-9a-zA-Z_!~*'()-]+.)*([0-9a-zA-Z][0-9a-zA-Z-]{0,61})?[0-9a-zA-Z].[a-zA-Z]{2,6})(:[0-9]{1,4})?((\/?)|(\/[0-9a-zA-Z_!~*'().;?:@&=+$,%#-]+)+\/?)$/
+        .test(value)
+}
+
+/**
+ * 验证日期格式
+ */
+export function date(value) {
+    if (!value) return false
+    // 判断是否数值或者字符串数值(意味着为时间戳),转为数值,否则new Date无法识别字符串时间戳
+    if (number(value)) value = +value
+    return !/Invalid|NaN/.test(new Date(value).toString())
+}
+
+/**
+ * 验证ISO类型的日期格式
+ */
+export function dateISO(value) {
+    return /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(value)
+}
+
+/**
+ * 验证十进制数字
+ */
+export function number(value) {
+    return /^[\+-]?(\d+\.?\d*|\.\d+|\d\.\d+e\+\d+)$/.test(value)
+}
+
+/**
+ * 验证字符串
+ */
+export function string(value) {
+    return typeof value === 'string'
+}
+
+/**
+ * 验证整数
+ */
+export function digits(value) {
+    return /^\d+$/.test(value)
+}
+
+/**
+ * 验证身份证号码
+ */
+export function idCard(value) {
+    return /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
+        value
+    )
+}
+
+/**
+ * 是否车牌号
+ */
+export function carNo(value) {
+    // 新能源车牌
+    const xreg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF]$)|([DF][A-HJ-NP-Z0-9][0-9]{4}$))/
+    // 旧车牌
+    const creg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1}$/
+    if (value.length === 7) {
+        return creg.test(value)
+    } if (value.length === 8) {
+        return xreg.test(value)
+    }
+    return false
+}
+
+/**
+ * 金额,只允许2位小数
+ */
+export function amount(value) {
+    // 金额,只允许保留两位小数
+    return /^[1-9]\d*(,\d{3})*(\.\d{1,2})?$|^0\.\d{1,2}$/.test(value)
+}
+
+/**
+ * 中文
+ */
+export function chinese(value) {
+    const reg = /^[\u4e00-\u9fa5]+$/gi
+    return reg.test(value)
+}
+
+/**
+ * 只能输入字母
+ */
+export function letter(value) {
+    return /^[a-zA-Z]*$/.test(value)
+}
+
+/**
+ * 只能是字母或者数字
+ */
+export function enOrNum(value) {
+    // 英文或者数字
+    const reg = /^[0-9a-zA-Z]*$/g
+    return reg.test(value)
+}
+
+/**
+ * 验证是否包含某个值
+ */
+export function contains(value, param) {
+    return value.indexOf(param) >= 0
+}
+
+/**
+ * 验证一个值范围[min, max]
+ */
+export function range(value, param) {
+    return value >= param[0] && value <= param[1]
+}
+
+/**
+ * 验证一个长度范围[min, max]
+ */
+export function rangeLength(value, param) {
+    return value.length >= param[0] && value.length <= param[1]
+}
+
+/**
+ * 是否固定电话
+ */
+export function landline(value) {
+    const reg = /^\d{3,4}-\d{7,8}(-\d{3,4})?$/
+    return reg.test(value)
+}
+
+/**
+ * 判断是否为空
+ */
+export function empty(value) {
+    switch (typeof value) {
+    case 'undefined':
+        return true
+    case 'string':
+        if (value.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g, '').length == 0) return true
+        break
+    case 'boolean':
+        if (!value) return true
+        break
+    case 'number':
+        if (value === 0 || isNaN(value)) return true
+        break
+    case 'object':
+        if (value === null || value.length === 0) return true
+        for (const i in value) {
+            return false
+        }
+        return true
+    }
+    return false
+}
+
+/**
+ * 是否json字符串
+ */
+export function jsonString(value) {
+    if (typeof value === 'string') {
+        try {
+            const obj = JSON.parse(value)
+            if (typeof obj === 'object' && obj) {
+                return true
+            }
+            return false
+        } catch (e) {
+            return false
+        }
+    }
+    return false
+}
+
+/**
+ * 是否数组
+ */
+export function array(value) {
+    if (typeof Array.isArray === 'function') {
+        return Array.isArray(value)
+    }
+    return Object.prototype.toString.call(value) === '[object Array]'
+}
+
+/**
+ * 是否对象
+ */
+export function object(value) {
+    return Object.prototype.toString.call(value) === '[object Object]'
+}
+
+/**
+ * 是否短信验证码
+ */
+export function code(value, len = 6) {
+    return new RegExp(`^\\d{${len}}$`).test(value)
+}
+
+/**
+ * 是否函数方法
+ * @param {Object} value
+ */
+export function func(value) {
+    return typeof value === 'function'
+}
+
+/**
+ * 是否promise对象
+ * @param {Object} value
+ */
+export function promise(value) {
+    return object(value) && func(value.then) && func(value.catch)
+}
+
+/** 是否图片格式
+ * @param {Object} value
+ */
+export function image(value) {
+    const newValue = value.split('?')[0]
+    const IMAGE_REGEXP = /\.(jpeg|jpg|gif|png|svg|webp|jfif|bmp|dpg)/i
+    return IMAGE_REGEXP.test(newValue)
+}
+
+/**
+ * 是否视频格式
+ * @param {Object} value
+ */
+export function video(value) {
+    const VIDEO_REGEXP = /\.(mp4|mpg|mpeg|dat|asf|avi|rm|rmvb|mov|wmv|flv|mkv|m3u8)/i
+    return VIDEO_REGEXP.test(value)
+}
+
+/**
+ * 是否为正则对象
+ * @param {Object}
+ * @return {Boolean}
+ */
+export function regExp(o) {
+    return o && Object.prototype.toString.call(o) === '[object RegExp]'
+}
+
+export default {
+    email,
+    mobile,
+    url,
+    date,
+    dateISO,
+    number,
+    digits,
+    idCard,
+    carNo,
+    amount,
+    chinese,
+    letter,
+    enOrNum,
+    contains,
+    range,
+    rangeLength,
+    empty,
+    isEmpty: empty,
+    jsonString,
+    landline,
+    object,
+    array,
+    code,
+    func,
+    promise,
+    video,
+    image,
+    regExp,
+    string
+}
diff --git a/uni_modules/uview-plus/libs/function/throttle.js b/uni_modules/uview-plus/libs/function/throttle.js
new file mode 100644
index 0000000..55cb1c7
--- /dev/null
+++ b/uni_modules/uview-plus/libs/function/throttle.js
@@ -0,0 +1,30 @@
+let timer;
+let flag;
+/**
+ * 节流原理:在一定时间内,只能触发一次
+ *
+ * @param {Function} func 要执行的回调函数
+ * @param {Number} wait 延时的时间
+ * @param {Boolean} immediate 是否立即执行
+ * @return null
+ */
+export function throttle(func, wait = 500, immediate = true) {
+    if (immediate) {
+        if (!flag) {
+            flag = true
+            // 如果是立即执行,则在wait毫秒内开始时执行
+            typeof func === 'function' && func()
+            timer = setTimeout(() => {
+                flag = false
+            }, wait)
+        }
+    } else if (!flag) {
+        flag = true
+        // 如果是非立即执行,则在wait毫秒内的结束处执行
+        timer = setTimeout(() => {
+            flag = false
+            typeof func === 'function' && func()
+        }, wait)
+    }
+}
+export default throttle
diff --git a/uni_modules/uview-plus/libs/luch-request/adapters/index.js b/uni_modules/uview-plus/libs/luch-request/adapters/index.js
new file mode 100644
index 0000000..e03cf5f
--- /dev/null
+++ b/uni_modules/uview-plus/libs/luch-request/adapters/index.js
@@ -0,0 +1,97 @@
+import buildURL from '../helpers/buildURL'
+import buildFullPath from '../core/buildFullPath'
+import settle from '../core/settle'
+import { isUndefined } from '../utils'
+
+/**
+ * 返回可选值存在的配置
+ * @param {Array} keys - 可选值数组
+ * @param {Object} config2 - 配置
+ * @return {{}} - 存在的配置项
+ */
+const mergeKeys = (keys, config2) => {
+    const config = {}
+    keys.forEach((prop) => {
+        if (!isUndefined(config2[prop])) {
+            config[prop] = config2[prop]
+        }
+    })
+    return config
+}
+export default (config) => new Promise((resolve, reject) => {
+    const fullPath = buildURL(buildFullPath(config.baseURL, config.url), config.params)
+    const _config = {
+        url: fullPath,
+        header: config.header,
+        complete: (response) => {
+            config.fullPath = fullPath
+            response.config = config
+            try {
+                // 对可能字符串不是json 的情况容错
+                if (typeof response.data === 'string') {
+                    response.data = JSON.parse(response.data)
+                }
+                // eslint-disable-next-line no-empty
+            } catch (e) {
+            }
+            settle(resolve, reject, response)
+        }
+    }
+    let requestTask
+    if (config.method === 'UPLOAD') {
+        delete _config.header['content-type']
+        delete _config.header['Content-Type']
+        const otherConfig = {
+        // #ifdef MP-ALIPAY
+            fileType: config.fileType,
+            // #endif
+            filePath: config.filePath,
+            name: config.name
+        }
+        const optionalKeys = [
+        // #ifdef APP-PLUS || H5
+            'files',
+            // #endif
+            // #ifdef H5
+            'file',
+            // #endif
+            // #ifdef H5 || APP-PLUS
+            'timeout',
+            // #endif
+            'formData'
+        ]
+        requestTask = uni.uploadFile({ ..._config, ...otherConfig, ...mergeKeys(optionalKeys, config) })
+    } else if (config.method === 'DOWNLOAD') {
+        // #ifdef H5 || APP-PLUS
+        if (!isUndefined(config.timeout)) {
+            _config.timeout = config.timeout
+        }
+        // #endif
+        requestTask = uni.downloadFile(_config)
+    } else {
+        const optionalKeys = [
+            'data',
+            'method',
+            // #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN
+            'timeout',
+            // #endif
+            'dataType',
+            // #ifndef MP-ALIPAY
+            'responseType',
+            // #endif
+            // #ifdef APP-PLUS
+            'sslVerify',
+            // #endif
+            // #ifdef H5
+            'withCredentials',
+            // #endif
+            // #ifdef APP-PLUS
+            'firstIpv4'
+        // #endif
+        ]
+        requestTask = uni.request({ ..._config, ...mergeKeys(optionalKeys, config) })
+    }
+    if (config.getTask) {
+        config.getTask(requestTask, config)
+    }
+})
diff --git a/uni_modules/uview-plus/libs/luch-request/core/InterceptorManager.js b/uni_modules/uview-plus/libs/luch-request/core/InterceptorManager.js
new file mode 100644
index 0000000..3e8728d
--- /dev/null
+++ b/uni_modules/uview-plus/libs/luch-request/core/InterceptorManager.js
@@ -0,0 +1,50 @@
+'use strict'
+
+function InterceptorManager() {
+    this.handlers = []
+}
+
+/**
+ * Add a new interceptor to the stack
+ *
+ * @param {Function} fulfilled The function to handle `then` for a `Promise`
+ * @param {Function} rejected The function to handle `reject` for a `Promise`
+ *
+ * @return {Number} An ID used to remove interceptor later
+ */
+InterceptorManager.prototype.use = function use(fulfilled, rejected) {
+    this.handlers.push({
+        fulfilled,
+        rejected
+    })
+    return this.handlers.length - 1
+}
+
+/**
+ * Remove an interceptor from the stack
+ *
+ * @param {Number} id The ID that was returned by `use`
+ */
+InterceptorManager.prototype.eject = function eject(id) {
+    if (this.handlers[id]) {
+        this.handlers[id] = null
+    }
+}
+
+/**
+ * Iterate over all the registered interceptors
+ *
+ * This method is particularly useful for skipping over any
+ * interceptors that may have become `null` calling `eject`.
+ *
+ * @param {Function} fn The function to call for each interceptor
+ */
+InterceptorManager.prototype.forEach = function forEach(fn) {
+    this.handlers.forEach((h) => {
+        if (h !== null) {
+            fn(h)
+        }
+    })
+}
+
+export default InterceptorManager
diff --git a/uni_modules/uview-plus/libs/luch-request/core/Request.js b/uni_modules/uview-plus/libs/luch-request/core/Request.js
new file mode 100644
index 0000000..cc48566
--- /dev/null
+++ b/uni_modules/uview-plus/libs/luch-request/core/Request.js
@@ -0,0 +1,198 @@
+/**
+ * @Class Request
+ * @description luch-request http请求插件
+ * @version 3.0.7
+ * @Author lu-ch
+ * @Date 2021-09-04
+ * @Email webwork.s@qq.com
+ * 文档: https://www.quanzhan.co/luch-request/
+ * github: https://github.com/lei-mu/luch-request
+ * DCloud: http://ext.dcloud.net.cn/plugin?id=392
+ * HBuilderX: beat-3.0.4 alpha-3.0.4
+ */
+
+import dispatchRequest from './dispatchRequest'
+import InterceptorManager from './InterceptorManager'
+import mergeConfig from './mergeConfig'
+import defaults from './defaults'
+import { isPlainObject } from '../utils'
+import clone from '../utils/clone'
+
+export default class Request {
+    /**
+   * @param {Object} arg - 全局配置
+   * @param {String} arg.baseURL - 全局根路径
+   * @param {Object} arg.header - 全局header
+   * @param {String} arg.method = [GET|POST|PUT|DELETE|CONNECT|HEAD|OPTIONS|TRACE] - 全局默认请求方式
+   * @param {String} arg.dataType = [json] - 全局默认的dataType
+   * @param {String} arg.responseType = [text|arraybuffer] - 全局默认的responseType。支付宝小程序不支持
+   * @param {Object} arg.custom - 全局默认的自定义参数
+   * @param {Number} arg.timeout - 全局默认的超时时间,单位 ms。默认60000。H5(HBuilderX 2.9.9+)、APP(HBuilderX 2.9.9+)、微信小程序(2.10.0)、支付宝小程序
+   * @param {Boolean} arg.sslVerify - 全局默认的是否验证 ssl 证书。默认true.仅App安卓端支持(HBuilderX 2.3.3+)
+   * @param {Boolean} arg.withCredentials - 全局默认的跨域请求时是否携带凭证(cookies)。默认false。仅H5支持(HBuilderX 2.6.15+)
+   * @param {Boolean} arg.firstIpv4 - 全DNS解析时优先使用ipv4。默认false。仅 App-Android 支持 (HBuilderX 2.8.0+)
+   * @param {Function(statusCode):Boolean} arg.validateStatus - 全局默认的自定义验证器。默认statusCode >= 200 && statusCode < 300
+   */
+    constructor(arg = {}) {
+        if (!isPlainObject(arg)) {
+            arg = {}
+            console.warn('设置全局参数必须接收一个Object')
+        }
+        this.config = clone({ ...defaults, ...arg })
+        this.interceptors = {
+            request: new InterceptorManager(),
+            response: new InterceptorManager()
+        }
+    }
+
+    /**
+   * @Function
+   * @param {Request~setConfigCallback} f - 设置全局默认配置
+   */
+    setConfig(f) {
+        this.config = f(this.config)
+    }
+
+    middleware(config) {
+        config = mergeConfig(this.config, config)
+        const chain = [dispatchRequest, undefined]
+        let promise = Promise.resolve(config)
+
+        this.interceptors.request.forEach((interceptor) => {
+            chain.unshift(interceptor.fulfilled, interceptor.rejected)
+        })
+
+        this.interceptors.response.forEach((interceptor) => {
+            chain.push(interceptor.fulfilled, interceptor.rejected)
+        })
+
+        while (chain.length) {
+            promise = promise.then(chain.shift(), chain.shift())
+        }
+
+        return promise
+    }
+
+    /**
+   * @Function
+   * @param {Object} config - 请求配置项
+   * @prop {String} options.url - 请求路径
+   * @prop {Object} options.data - 请求参数
+   * @prop {Object} [options.responseType = config.responseType] [text|arraybuffer] - 响应的数据类型
+   * @prop {Object} [options.dataType = config.dataType] - 如果设为 json,会尝试对返回的数据做一次 JSON.parse
+   * @prop {Object} [options.header = config.header] - 请求header
+   * @prop {Object} [options.method = config.method] - 请求方法
+   * @returns {Promise<unknown>}
+   */
+    request(config = {}) {
+        return this.middleware(config)
+    }
+
+    get(url, options = {}) {
+        return this.middleware({
+            url,
+            method: 'GET',
+            ...options
+        })
+    }
+
+    post(url, data, options = {}) {
+        return this.middleware({
+            url,
+            data,
+            method: 'POST',
+            ...options
+        })
+    }
+
+    // #ifndef MP-ALIPAY
+    put(url, data, options = {}) {
+        return this.middleware({
+            url,
+            data,
+            method: 'PUT',
+            ...options
+        })
+    }
+
+    // #endif
+
+    // #ifdef APP-PLUS || H5 || MP-WEIXIN || MP-BAIDU
+    delete(url, data, options = {}) {
+        return this.middleware({
+            url,
+            data,
+            method: 'DELETE',
+            ...options
+        })
+    }
+
+    // #endif
+
+    // #ifdef H5 || MP-WEIXIN
+    connect(url, data, options = {}) {
+        return this.middleware({
+            url,
+            data,
+            method: 'CONNECT',
+            ...options
+        })
+    }
+
+    // #endif
+
+    // #ifdef  H5 || MP-WEIXIN || MP-BAIDU
+    head(url, data, options = {}) {
+        return this.middleware({
+            url,
+            data,
+            method: 'HEAD',
+            ...options
+        })
+    }
+
+    // #endif
+
+    // #ifdef APP-PLUS || H5 || MP-WEIXIN || MP-BAIDU
+    options(url, data, options = {}) {
+        return this.middleware({
+            url,
+            data,
+            method: 'OPTIONS',
+            ...options
+        })
+    }
+
+    // #endif
+
+    // #ifdef H5 || MP-WEIXIN
+    trace(url, data, options = {}) {
+        return this.middleware({
+            url,
+            data,
+            method: 'TRACE',
+            ...options
+        })
+    }
+
+    // #endif
+
+    upload(url, config = {}) {
+        config.url = url
+        config.method = 'UPLOAD'
+        return this.middleware(config)
+    }
+
+    download(url, config = {}) {
+        config.url = url
+        config.method = 'DOWNLOAD'
+        return this.middleware(config)
+    }
+}
+
+/**
+ * setConfig回调
+ * @return {Object} - 返回操作后的config
+ * @callback Request~setConfigCallback
+ * @param {Object} config - 全局默认config
+ */
diff --git a/uni_modules/uview-plus/libs/luch-request/core/buildFullPath.js b/uni_modules/uview-plus/libs/luch-request/core/buildFullPath.js
new file mode 100644
index 0000000..5eb8a17
--- /dev/null
+++ b/uni_modules/uview-plus/libs/luch-request/core/buildFullPath.js
@@ -0,0 +1,20 @@
+'use strict'
+
+import isAbsoluteURL from '../helpers/isAbsoluteURL'
+import combineURLs from '../helpers/combineURLs'
+
+/**
+ * Creates a new URL by combining the baseURL with the requestedURL,
+ * only when the requestedURL is not already an absolute URL.
+ * If the requestURL is absolute, this function returns the requestedURL untouched.
+ *
+ * @param {string} baseURL The base URL
+ * @param {string} requestedURL Absolute or relative URL to combine
+ * @returns {string} The combined full path
+ */
+export default function buildFullPath(baseURL, requestedURL) {
+    if (baseURL && !isAbsoluteURL(requestedURL)) {
+        return combineURLs(baseURL, requestedURL)
+    }
+    return requestedURL
+}
diff --git a/uni_modules/uview-plus/libs/luch-request/core/defaults.js b/uni_modules/uview-plus/libs/luch-request/core/defaults.js
new file mode 100644
index 0000000..be375a9
--- /dev/null
+++ b/uni_modules/uview-plus/libs/luch-request/core/defaults.js
@@ -0,0 +1,29 @@
+/**
+ * 默认的全局配置
+ */
+
+export default {
+    baseURL: '',
+    header: {},
+    method: 'GET',
+    dataType: 'json',
+    // #ifndef MP-ALIPAY
+    responseType: 'text',
+    // #endif
+    custom: {},
+    // #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN
+    timeout: 60000,
+    // #endif
+    // #ifdef APP-PLUS
+    sslVerify: true,
+    // #endif
+    // #ifdef H5
+    withCredentials: false,
+    // #endif
+    // #ifdef APP-PLUS
+    firstIpv4: false,
+    // #endif
+    validateStatus: function validateStatus(status) {
+        return status >= 200 && status < 300
+    }
+}
diff --git a/uni_modules/uview-plus/libs/luch-request/core/dispatchRequest.js b/uni_modules/uview-plus/libs/luch-request/core/dispatchRequest.js
new file mode 100644
index 0000000..724545c
--- /dev/null
+++ b/uni_modules/uview-plus/libs/luch-request/core/dispatchRequest.js
@@ -0,0 +1,3 @@
+import adapter from '../adapters/index'
+
+export default (config) => adapter(config)
diff --git a/uni_modules/uview-plus/libs/luch-request/core/mergeConfig.js b/uni_modules/uview-plus/libs/luch-request/core/mergeConfig.js
new file mode 100644
index 0000000..08f8b9b
--- /dev/null
+++ b/uni_modules/uview-plus/libs/luch-request/core/mergeConfig.js
@@ -0,0 +1,103 @@
+import { deepMerge, isUndefined } from '../utils'
+
+/**
+ * 合并局部配置优先的配置,如果局部有该配置项则用局部,如果全局有该配置项则用全局
+ * @param {Array} keys - 配置项
+ * @param {Object} globalsConfig - 当前的全局配置
+ * @param {Object} config2 - 局部配置
+ * @return {{}}
+ */
+const mergeKeys = (keys, globalsConfig, config2) => {
+    const config = {}
+    keys.forEach((prop) => {
+        if (!isUndefined(config2[prop])) {
+            config[prop] = config2[prop]
+        } else if (!isUndefined(globalsConfig[prop])) {
+            config[prop] = globalsConfig[prop]
+        }
+    })
+    return config
+}
+/**
+ *
+ * @param globalsConfig - 当前实例的全局配置
+ * @param config2 - 当前的局部配置
+ * @return - 合并后的配置
+ */
+export default (globalsConfig, config2 = {}) => {
+    const method = config2.method || globalsConfig.method || 'GET'
+    let config = {
+        baseURL: globalsConfig.baseURL || '',
+        method,
+        url: config2.url || '',
+        params: config2.params || {},
+        custom: { ...(globalsConfig.custom || {}), ...(config2.custom || {}) },
+        header: deepMerge(globalsConfig.header || {}, config2.header || {})
+    }
+    const defaultToConfig2Keys = ['getTask', 'validateStatus']
+    config = { ...config, ...mergeKeys(defaultToConfig2Keys, globalsConfig, config2) }
+
+    // eslint-disable-next-line no-empty
+    if (method === 'DOWNLOAD') {
+    // #ifdef H5 || APP-PLUS
+        if (!isUndefined(config2.timeout)) {
+            config.timeout = config2.timeout
+        } else if (!isUndefined(globalsConfig.timeout)) {
+            config.timeout = globalsConfig.timeout
+        }
+    // #endif
+    } else if (method === 'UPLOAD') {
+        delete config.header['content-type']
+        delete config.header['Content-Type']
+        const uploadKeys = [
+            // #ifdef APP-PLUS || H5
+            'files',
+            // #endif
+            // #ifdef MP-ALIPAY
+            'fileType',
+            // #endif
+            // #ifdef H5
+            'file',
+            // #endif
+            'filePath',
+            'name',
+            // #ifdef H5 || APP-PLUS
+            'timeout',
+            // #endif
+            'formData'
+        ]
+        uploadKeys.forEach((prop) => {
+            if (!isUndefined(config2[prop])) {
+                config[prop] = config2[prop]
+            }
+        })
+        // #ifdef H5 || APP-PLUS
+        if (isUndefined(config.timeout) && !isUndefined(globalsConfig.timeout)) {
+            config.timeout = globalsConfig.timeout
+        }
+    // #endif
+    } else {
+        const defaultsKeys = [
+            'data',
+            // #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN
+            'timeout',
+            // #endif
+            'dataType',
+            // #ifndef MP-ALIPAY
+            'responseType',
+            // #endif
+            // #ifdef APP-PLUS
+            'sslVerify',
+            // #endif
+            // #ifdef H5
+            'withCredentials',
+            // #endif
+            // #ifdef APP-PLUS
+            'firstIpv4'
+            // #endif
+        ]
+        config = { ...config, ...mergeKeys(defaultsKeys, globalsConfig, config2) }
+    }
+
+    return config
+}
diff --git a/uni_modules/uview-plus/libs/luch-request/core/settle.js b/uni_modules/uview-plus/libs/luch-request/core/settle.js
new file mode 100644
index 0000000..8d3638f
--- /dev/null
+++ b/uni_modules/uview-plus/libs/luch-request/core/settle.js
@@ -0,0 +1,16 @@
+/**
+ * Resolve or reject a Promise based on response status.
+ *
+ * @param {Function} resolve A function that resolves the promise.
+ * @param {Function} reject A function that rejects the promise.
+ * @param {object} response The response.
+ */
+export default function settle(resolve, reject, response) {
+    const { validateStatus } = response.config
+    const status = response.statusCode
+    if (status && (!validateStatus || validateStatus(status))) {
+        resolve(response)
+    } else {
+        reject(response)
+    }
+}
diff --git a/uni_modules/uview-plus/libs/luch-request/helpers/buildURL.js b/uni_modules/uview-plus/libs/luch-request/helpers/buildURL.js
new file mode 100644
index 0000000..472ad6a
--- /dev/null
+++ b/uni_modules/uview-plus/libs/luch-request/helpers/buildURL.js
@@ -0,0 +1,69 @@
+'use strict'
+
+import * as utils from '../utils'
+
+function encode(val) {
+    return encodeURIComponent(val)
+        .replace(/%40/gi, '@')
+        .replace(/%3A/gi, ':')
+        .replace(/%24/g, '$')
+        .replace(/%2C/gi, ',')
+        .replace(/%20/g, '+')
+        .replace(/%5B/gi, '[')
+        .replace(/%5D/gi, ']')
+}
+
+/**
+ * Build a URL by appending params to the end
+ *
+ * @param {string} url The base of the url (e.g., http://www.google.com)
+ * @param {object} [params] The params to be appended
+ * @returns {string} The formatted url
+ */
+export default function buildURL(url, params) {
+    /* eslint no-param-reassign:0 */
+    if (!params) {
+        return url
+    }
+
+    let serializedParams
+    if (utils.isURLSearchParams(params)) {
+        serializedParams = params.toString()
+    } else {
+        const parts = []
+
+        utils.forEach(params, (val, key) => {
+            if (val === null || typeof val === 'undefined') {
+                return
+            }
+
+            if (utils.isArray(val)) {
+                key = `${key}[]`
+            } else {
+                val = [val]
+            }
+
+            utils.forEach(val, (v) => {
+                if (utils.isDate(v)) {
+                    v = v.toISOString()
+                } else if (utils.isObject(v)) {
+                    v = JSON.stringify(v)
+                }
+                parts.push(`${encode(key)}=${encode(v)}`)
+            })
+        })
+
+        serializedParams = parts.join('&')
+    }
+
+    if (serializedParams) {
+        const hashmarkIndex = url.indexOf('#')
+        if (hashmarkIndex !== -1) {
+            url = url.slice(0, hashmarkIndex)
+        }
+
+        url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams
+    }
+
+    return url
+}
diff --git a/uni_modules/uview-plus/libs/luch-request/helpers/combineURLs.js b/uni_modules/uview-plus/libs/luch-request/helpers/combineURLs.js
new file mode 100644
index 0000000..ac7c124
--- /dev/null
+++ b/uni_modules/uview-plus/libs/luch-request/helpers/combineURLs.js
@@ -0,0 +1,14 @@
+'use strict'
+
+/**
+ * Creates a new URL by combining the specified URLs
+ *
+ * @param {string} baseURL The base URL
+ * @param {string} relativeURL The relative URL
+ * @returns {string} The combined URL
+ */
+export default function combineURLs(baseURL, relativeURL) {
+    return relativeURL
+        ? `${baseURL.replace(/\/+$/, '')}/${relativeURL.replace(/^\/+/, '')}`
+        : baseURL
+}
diff --git a/uni_modules/uview-plus/libs/luch-request/helpers/isAbsoluteURL.js b/uni_modules/uview-plus/libs/luch-request/helpers/isAbsoluteURL.js
new file mode 100644
index 0000000..63c6647
--- /dev/null
+++ b/uni_modules/uview-plus/libs/luch-request/helpers/isAbsoluteURL.js
@@ -0,0 +1,14 @@
+'use strict'
+
+/**
+ * Determines whether the specified URL is absolute
+ *
+ * @param {string} url The URL to test
+ * @returns {boolean} True if the specified URL is absolute, otherwise false
+ */
+export default function isAbsoluteURL(url) {
+    // A URL is considered absolute if it begins with "<scheme>://" or "//" (protocol-relative URL).
+    // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed
+    // by any combination of letters, digits, plus, period, or hyphen.
+    return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url)
+}
diff --git a/uni_modules/uview-plus/libs/luch-request/index.d.ts b/uni_modules/uview-plus/libs/luch-request/index.d.ts
new file mode 100644
index 0000000..e939ce1
--- /dev/null
+++ b/uni_modules/uview-plus/libs/luch-request/index.d.ts
@@ -0,0 +1,116 @@
+type AnyObject = Record<string | number | symbol, any>
+type HttpPromise<T> = Promise<HttpResponse<T>>;
+type Tasks = UniApp.RequestTask | UniApp.UploadTask | UniApp.DownloadTask
+export interface RequestTask {
+  abort: () => void;
+  offHeadersReceived: () => void;
+  onHeadersReceived: () => void;
+}
+export interface HttpRequestConfig<T = Tasks> {
+  /** 请求基地址 */
+  baseURL?: string;
+  /** 请求服务器接口地址 */
+  url?: string;
+
+  /** 请求查询参数,自动拼接为查询字符串 */
+  params?: AnyObject;
+  /** 请求体参数 */
+  data?: AnyObject;
+
+  /** 文件对应的 key */
+  name?: string;
+  /** HTTP 请求中其他额外的 form data */
+  formData?: AnyObject;
+  /** 要上传文件资源的路径。 */
+  filePath?: string;
+  /** 需要上传的文件列表。使用 files 时,filePath 和 name 不生效,App、H5( 2.6.15+) */
+  files?: Array<{
+    name?: string;
+    file?: File;
+    uri: string;
+  }>;
+  /** 要上传的文件对象,仅H5(2.6.15+)支持 */
+  file?: File;
+
+  /** 请求头信息 */
+  header?: AnyObject;
+  /** 请求方式 */
+  method?: "GET" | "POST" | "PUT" | "DELETE" | "CONNECT" | "HEAD" | "OPTIONS" | "TRACE" | "UPLOAD" | "DOWNLOAD";
+  /** 如果设为 json,会尝试对返回的数据做一次 JSON.parse */
+  dataType?: string;
+  /** 设置响应的数据类型,支付宝小程序不支持 */
+  responseType?: "text" | "arraybuffer";
+  /** 自定义参数 */
+  custom?: AnyObject;
+  /** 超时时间,仅微信小程序(2.10.0)、支付宝小程序支持 */
+  timeout?: number;
+  /** DNS解析时优先使用ipv4,仅 App-Android 支持 (HBuilderX 2.8.0+) */
+  firstIpv4?: boolean;
+  /** 验证 ssl 证书 仅5+App安卓端支持(HBuilderX 2.3.3+) */
+  sslVerify?: boolean;
+  /** 跨域请求时是否携带凭证(cookies)仅H5支持(HBuilderX 2.6.15+) */
+  withCredentials?: boolean;
+
+  /** 返回当前请求的task, options。请勿在此处修改options。 */
+  getTask?: (task: T, options: HttpRequestConfig<T>) => void;
+  /**  全局自定义验证器 */
+  validateStatus?: (statusCode: number) => boolean | void;
+}
+export interface HttpResponse<T = any> {
+  config: HttpRequestConfig;
+  statusCode: number;
+  cookies: Array<string>;
+  data: T;
+  errMsg: string;
+  header: AnyObject;
+}
+export interface HttpUploadResponse<T = any> {
+  config: HttpRequestConfig;
+  statusCode: number;
+  data: T;
+  errMsg: string;
+}
+export interface HttpDownloadResponse extends HttpResponse {
+  tempFilePath: string;
+}
+export interface HttpError {
+  config: HttpRequestConfig;
+  statusCode?: number;
+  cookies?: Array<string>;
+  data?: any;
+  errMsg: string;
+  header?: AnyObject;
+}
+export interface HttpInterceptorManager<V, E = V> {
+  use(
+    onFulfilled?: (config: V) => Promise<V> | V,
+    onRejected?: (config: E) => Promise<E> | E
+  ): void;
+  eject(id: number): void;
+}
+export abstract class HttpRequestAbstract {
+  constructor(config?: HttpRequestConfig);
+  config: HttpRequestConfig;
+  interceptors: {
+    request: HttpInterceptorManager<HttpRequestConfig, HttpRequestConfig>;
+    response: HttpInterceptorManager<HttpResponse, HttpError>;
+  }
+  middleware<T = any>(config: HttpRequestConfig): HttpPromise<T>;
+  request<T = any>(config: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;
+  get<T = any>(url: string, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;
+  upload<T = any>(url: string, config?: HttpRequestConfig<UniApp.UploadTask>): HttpPromise<T>;
+  delete<T = any>(url: string, data?: AnyObject, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;
+  head<T = any>(url: string, data?: AnyObject, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;
+  post<T = any>(url: string, data?: AnyObject, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;
+  put<T = any>(url: string, data?: AnyObject, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;
+  connect<T = any>(url: string, data?: AnyObject, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;
+  options<T = any>(url: string, data?: AnyObject, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;
+  trace<T = any>(url: string, data?: AnyObject, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;
+
+  download(url: string, config?: HttpRequestConfig<UniApp.DownloadTask>): Promise<HttpDownloadResponse>;
+
+  setConfig(onSend: (config: HttpRequestConfig) => HttpRequestConfig): void;
+}
+
+declare class HttpRequest extends HttpRequestAbstract { }
+export default HttpRequest;
diff --git a/uni_modules/uview-plus/libs/luch-request/index.js b/uni_modules/uview-plus/libs/luch-request/index.js
new file mode 100644
index 0000000..8fb2b44
--- /dev/null
+++ b/uni_modules/uview-plus/libs/luch-request/index.js
@@ -0,0 +1,3 @@
+import Request from './core/Request'
+
+export default Request
diff --git a/uni_modules/uview-plus/libs/luch-request/utils.js b/uni_modules/uview-plus/libs/luch-request/utils.js
new file mode 100644
index 0000000..847283d
--- /dev/null
+++ b/uni_modules/uview-plus/libs/luch-request/utils.js
@@ -0,0 +1,131 @@
+'use strict'
+
+// utils is a library of generic helper functions non-specific to axios
+
+const { toString } = Object.prototype
+
+/**
+ * Determine if a value is an Array
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is an Array, otherwise false
+ */
+export function isArray(val) {
+    return toString.call(val) === '[object Array]'
+}
+
+/**
+ * Determine if a value is an Object
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is an Object, otherwise false
+ */
+export function isObject(val) {
+    return val !== null && typeof val === 'object'
+}
+
+/**
+ * Determine if a value is a Date
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is a Date, otherwise false
+ */
+export function isDate(val) {
+    return toString.call(val) === '[object Date]'
+}
+
+/**
+ * Determine if a value is a URLSearchParams object
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is a URLSearchParams object, otherwise false
+ */
+export function isURLSearchParams(val) {
+    return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams
+}
+
+/**
+ * Iterate over an Array or an Object invoking a function for each item.
+ *
+ * If `obj` is an Array callback will be called passing
+ * the value, index, and complete array for each item.
+ *
+ * If 'obj' is an Object callback will be called passing
+ * the value, key, and complete object for each property.
+ *
+ * @param {Object|Array} obj The object to iterate
+ * @param {Function} fn The callback to invoke for each item
+ */
+export function forEach(obj, fn) {
+    // Don't bother if no value provided
+    if (obj === null || typeof obj === 'undefined') {
+        return
+    }
+
+    // Force an array if not already something iterable
+    if (typeof obj !== 'object') {
+    /* eslint no-param-reassign:0 */
+        obj = [obj]
+    }
+
+    if (isArray(obj)) {
+    // Iterate over array values
+        for (let i = 0, l = obj.length; i < l; i++) {
+            fn.call(null, obj[i], i, obj)
+        }
+    } else {
+    // Iterate over object keys
+        for (const key in obj) {
+            if (Object.prototype.hasOwnProperty.call(obj, key)) {
+                fn.call(null, obj[key], key, obj)
+            }
+        }
+    }
+}
+
+/**
+ * 是否为boolean 值
+ * @param val
+ * @returns {boolean}
+ */
+export function isBoolean(val) {
+    return typeof val === 'boolean'
+}
+
+/**
+ * 是否为真正的对象{} new Object
+ * @param {any} obj - 检测的对象
+ * @returns {boolean}
+ */
+export function isPlainObject(obj) {
+    return Object.prototype.toString.call(obj) === '[object Object]'
+}
+
+/**
+ * Function equal to merge with the difference being that no reference
+ * to original objects is kept.
+ *
+ * @see merge
+ * @param {Object} obj1 Object to merge
+ * @returns {Object} Result of all merge properties
+ */
+export function deepMerge(/* obj1, obj2, obj3, ... */) {
+    const result = {}
+    function assignValue(val, key) {
+        if (typeof result[key] === 'object' && typeof val === 'object') {
+            result[key] = deepMerge(result[key], val)
+        } else if (typeof val === 'object') {
+            result[key] = deepMerge({}, val)
+        } else {
+            result[key] = val
+        }
+    }
+    for (let i = 0, l = arguments.length; i < l; i++) {
+        forEach(arguments[i], assignValue)
+    }
+    return result
+}
+
+export function isUndefined(val) {
+    return typeof val === 'undefined'
+}
diff --git a/uni_modules/uview-plus/libs/luch-request/utils/clone.js b/uni_modules/uview-plus/libs/luch-request/utils/clone.js
new file mode 100644
index 0000000..2fee704
--- /dev/null
+++ b/uni_modules/uview-plus/libs/luch-request/utils/clone.js
@@ -0,0 +1,264 @@
+/* eslint-disable */
+var clone = (function() {
+  'use strict';
+
+  function _instanceof(obj, type) {
+    return type != null && obj instanceof type;
+  }
+
+  var nativeMap;
+  try {
+    nativeMap = Map;
+  } catch(_) {
+    // maybe a reference error because no `Map`. Give it a dummy value that no
+    // value will ever be an instanceof.
+    nativeMap = function() {};
+  }
+
+  var nativeSet;
+  try {
+    nativeSet = Set;
+  } catch(_) {
+    nativeSet = function() {};
+  }
+
+  var nativePromise;
+  try {
+    nativePromise = Promise;
+  } catch(_) {
+    nativePromise = function() {};
+  }
+
+  /**
+   * Clones (copies) an Object using deep copying.
+   *
+   * This function supports circular references by default, but if you are certain
+   * there are no circular references in your object, you can save some CPU time
+   * by calling clone(obj, false).
+   *
+   * Caution: if `circular` is false and `parent` contains circular references,
+   * your program may enter an infinite loop and crash.
+   *
+   * @param `parent` - the object to be cloned
+   * @param `circular` - set to true if the object to be cloned may contain
+   *    circular references. (optional - true by default)
+   * @param `depth` - set to a number if the object is only to be cloned to
+   *    a particular depth. (optional - defaults to Infinity)
+   * @param `prototype` - sets the prototype to be used when cloning an object.
+   *    (optional - defaults to parent prototype).
+   * @param `includeNonEnumerable` - set to true if the non-enumerable properties
+   *    should be cloned as well. Non-enumerable properties on the prototype
+   *    chain will be ignored. (optional - false by default)
+   */
+  function clone(parent, circular, depth, prototype, includeNonEnumerable) {
+    if (typeof circular === 'object') {
+      depth = circular.depth;
+      prototype = circular.prototype;
+      includeNonEnumerable = circular.includeNonEnumerable;
+      circular = circular.circular;
+    }
+    // maintain two arrays for circular references, where corresponding parents
+    // and children have the same index
+    var allParents = [];
+    var allChildren = [];
+
+    var useBuffer = typeof Buffer != 'undefined';
+
+    if (typeof circular == 'undefined')
+      circular = true;
+
+    if (typeof depth == 'undefined')
+      depth = Infinity;
+
+    // recurse this function so we don't reset allParents and allChildren
+    function _clone(parent, depth) {
+      // cloning null always returns null
+      if (parent === null)
+        return null;
+
+      if (depth === 0)
+        return parent;
+
+      var child;
+      var proto;
+      if (typeof parent != 'object') {
+        return parent;
+      }
+
+      if (_instanceof(parent, nativeMap)) {
+        child = new nativeMap();
+      } else if (_instanceof(parent, nativeSet)) {
+        child = new nativeSet();
+      } else if (_instanceof(parent, nativePromise)) {
+        child = new nativePromise(function (resolve, reject) {
+          parent.then(function(value) {
+            resolve(_clone(value, depth - 1));
+          }, function(err) {
+            reject(_clone(err, depth - 1));
+          });
+        });
+      } else if (clone.__isArray(parent)) {
+        child = [];
+      } else if (clone.__isRegExp(parent)) {
+        child = new RegExp(parent.source, __getRegExpFlags(parent));
+        if (parent.lastIndex) child.lastIndex = parent.lastIndex;
+      } else if (clone.__isDate(parent)) {
+        child = new Date(parent.getTime());
+      } else if (useBuffer && Buffer.isBuffer(parent)) {
+        if (Buffer.from) {
+          // Node.js >= 5.10.0
+          child = Buffer.from(parent);
+        } else {
+          // Older Node.js versions
+          child = new Buffer(parent.length);
+          parent.copy(child);
+        }
+        return child;
+      } else if (_instanceof(parent, Error)) {
+        child = Object.create(parent);
+      } else {
+        if (typeof prototype == 'undefined') {
+          proto = Object.getPrototypeOf(parent);
+          child = Object.create(proto);
+        }
+        else {
+          child = Object.create(prototype);
+          proto = prototype;
+        }
+      }
+
+      if (circular) {
+        var index = allParents.indexOf(parent);
+
+        if (index != -1) {
+          return allChildren[index];
+        }
+        allParents.push(parent);
+        allChildren.push(child);
+      }
+
+      if (_instanceof(parent, nativeMap)) {
+        parent.forEach(function(value, key) {
+          var keyChild = _clone(key, depth - 1);
+          var valueChild = _clone(value, depth - 1);
+          child.set(keyChild, valueChild);
+        });
+      }
+      if (_instanceof(parent, nativeSet)) {
+        parent.forEach(function(value) {
+          var entryChild = _clone(value, depth - 1);
+          child.add(entryChild);
+        });
+      }
+
+      for (var i in parent) {
+        var attrs = Object.getOwnPropertyDescriptor(parent, i);
+        if (attrs) {
+          child[i] = _clone(parent[i], depth - 1);
+        }
+
+        try {
+          var objProperty = Object.getOwnPropertyDescriptor(parent, i);
+          if (objProperty.set === 'undefined') {
+            // no setter defined. Skip cloning this property
+            continue;
+          }
+          child[i] = _clone(parent[i], depth - 1);
+        } catch(e){
+          if (e instanceof TypeError) {
+            // when in strict mode, TypeError will be thrown if child[i] property only has a getter
+            // we can't do anything about this, other than inform the user that this property cannot be set.
+            continue
+          } else if (e instanceof ReferenceError) {
+            //this may happen in non strict mode
+            continue
+          }
+        }
+
+      }
+
+      if (Object.getOwnPropertySymbols) {
+        var symbols = Object.getOwnPropertySymbols(parent);
+        for (var i = 0; i < symbols.length; i++) {
+          // Don't need to worry about cloning a symbol because it is a primitive,
+          // like a number or string.
+          var symbol = symbols[i];
+          var descriptor = Object.getOwnPropertyDescriptor(parent, symbol);
+          if (descriptor && !descriptor.enumerable && !includeNonEnumerable) {
+            continue;
+          }
+          child[symbol] = _clone(parent[symbol], depth - 1);
+          Object.defineProperty(child, symbol, descriptor);
+        }
+      }
+
+      if (includeNonEnumerable) {
+        var allPropertyNames = Object.getOwnPropertyNames(parent);
+        for (var i = 0; i < allPropertyNames.length; i++) {
+          var propertyName = allPropertyNames[i];
+          var descriptor = Object.getOwnPropertyDescriptor(parent, propertyName);
+          if (descriptor && descriptor.enumerable) {
+            continue;
+          }
+          child[propertyName] = _clone(parent[propertyName], depth - 1);
+          Object.defineProperty(child, propertyName, descriptor);
+        }
+      }
+
+      return child;
+    }
+
+    return _clone(parent, depth);
+  }
+
+  /**
+   * Simple flat clone using prototype, accepts only objects, usefull for property
+   * override on FLAT configuration object (no nested props).
+   *
+   * USE WITH CAUTION! This may not behave as you wish if you do not know how this
+   * works.
+   */
+  clone.clonePrototype = function clonePrototype(parent) {
+    if (parent === null)
+      return null;
+
+    var c = function () {};
+    c.prototype = parent;
+    return new c();
+  };
+
+// private utility functions
+
+  function __objToStr(o) {
+    return Object.prototype.toString.call(o);
+  }
+  clone.__objToStr = __objToStr;
+
+  function __isDate(o) {
+    return typeof o === 'object' && __objToStr(o) === '[object Date]';
+  }
+  clone.__isDate = __isDate;
+
+  function __isArray(o) {
+    return typeof o === 'object' && __objToStr(o) === '[object Array]';
+  }
+  clone.__isArray = __isArray;
+
+  function __isRegExp(o) {
+    return typeof o === 'object' && __objToStr(o) === '[object RegExp]';
+  }
+  clone.__isRegExp = __isRegExp;
+
+  function __getRegExpFlags(re) {
+    var flags = '';
+    if (re.global) flags += 'g';
+    if (re.ignoreCase) flags += 'i';
+    if (re.multiline) flags += 'm';
+    return flags;
+  }
+  clone.__getRegExpFlags = __getRegExpFlags;
+
+  return clone;
+})();
+
+export default clone
diff --git a/uni_modules/uview-plus/libs/mixin/button.js b/uni_modules/uview-plus/libs/mixin/button.js
new file mode 100644
index 0000000..0c019c2
--- /dev/null
+++ b/uni_modules/uview-plus/libs/mixin/button.js
@@ -0,0 +1,13 @@
+export default {
+    props: {
+        lang: String,
+        sessionFrom: String,
+        sendMessageTitle: String,
+        sendMessagePath: String,
+        sendMessageImg: String,
+        showMessageCard: Boolean,
+        appParameter: String,
+        formType: String,
+        openType: String
+    }
+}
diff --git a/uni_modules/uview-plus/libs/mixin/mixin.js b/uni_modules/uview-plus/libs/mixin/mixin.js
new file mode 100644
index 0000000..dd43972
--- /dev/null
+++ b/uni_modules/uview-plus/libs/mixin/mixin.js
@@ -0,0 +1,171 @@
+import { deepMerge, $parent } from '../function/index';
+import test from '../function/test';
+import route from '../util/route';
+export default {
+    // 定义每个组件都可能需要用到的外部样式以及类名
+    props: {
+        // 每个组件都有的父组件传递的样式,可以为字符串或者对象形式
+        customStyle: {
+            type: [Object, String],
+            default: () => ({})
+        },
+        customClass: {
+            type: String,
+            default: ''
+        },
+        // 跳转的页面路径
+        url: {
+            type: String,
+            default: ''
+        },
+        // 页面跳转的类型
+        linkType: {
+            type: String,
+            default: 'navigateTo'
+        }
+    },
+    data() {
+        return {}
+    },
+    onLoad() {
+        // getRect挂载到$u上,因为这方法需要使用in(this),所以无法把它独立成一个单独的文件导出
+        this.$u.getRect = this.$uGetRect
+    },
+    created() {
+        // 组件当中,只有created声明周期,为了能在组件使用,故也在created中将方法挂载到$u
+        this.$u.getRect = this.$uGetRect
+    },
+    computed: {
+        // 在2.x版本中,将会把$u挂载到uni对象下,导致在模板中无法使用uni.$u.xxx形式
+        // 所以这里通过computed计算属性将其附加到this.$u上,就可以在模板或者js中使用uni.$u.xxx
+        // 只在nvue环境通过此方式引入完整的$u,其他平台会出现性能问题,非nvue则按需引入(主要原因是props过大)
+        $u() {
+            // #ifndef APP-NVUE
+            // 在非nvue端,移除props,http,mixin等对象,避免在小程序setData时数据过大影响性能
+            return deepMerge(uni.$u, {
+                props: undefined,
+                http: undefined,
+                mixin: undefined
+            })
+            // #endif
+            // #ifdef APP-NVUE
+            return uni.$u
+            // #endif
+        },
+        /**
+         * 生成bem规则类名
+         * 由于微信小程序,H5,nvue之间绑定class的差异,无法通过:class="[bem()]"的形式进行同用
+         * 故采用如下折中做法,最后返回的是数组(一般平台)或字符串(支付宝和字节跳动平台),类似['a', 'b', 'c']或'a b c'的形式
+         * @param {String} name 组件名称
+         * @param {Array} fixed 一直会存在的类名
+         * @param {Array} change 会根据变量值为true或者false而出现或者隐藏的类名
+         * @returns {Array|string}
+         */
+        bem() {
+            return function (name, fixed, change) {
+                // 类名前缀
+                const prefix = `u-${name}--`
+                const classes = {}
+                if (fixed) {
+                    fixed.map((item) => {
+                        // 这里的类名,会一直存在
+                        classes[prefix + this[item]] = true
+                    })
+                }
+                if (change) {
+                    change.map((item) => {
+                        // 这里的类名,会根据this[item]的值为true或者false,而进行添加或者移除某一个类
+                        this[item] ? (classes[prefix + item] = this[item]) : (delete classes[prefix + item])
+                    })
+                }
+                return Object.keys(classes)
+                    // 支付宝,头条小程序无法动态绑定一个数组类名,否则解析出来的结果会带有",",而导致失效
+                    // #ifdef MP-ALIPAY || MP-TOUTIAO || MP-LARK
+                    .join(' ')
+                    // #endif
+            }
+        }
+    },
+    methods: {
+        // 跳转某一个页面
+        openPage(urlKey = 'url') {
+            const url = this[urlKey]
+            if (url) {
+                // h5官方回应:发行h5会自动摇树优化,所有使用uni的地方,都会被直接转换成具体的API调用 https://ask.dcloud.net.cn/question/161523?notification_id-1201922__rf-false__item_id-226372
+                // 使用封装的 route 进行跳转(直接调用方法),不使用 uni 对象
+                route({ type: this.linkType, url })
+                // 执行类似uni.navigateTo的方法
+                // uni[this.linkType]({
+                //     url
+                // })
+            }
+        },
+        // 查询节点信息
+        // 目前此方法在支付宝小程序中无法获取组件跟接点的尺寸,为支付宝的bug(2020-07-21)
+        // 解决办法为在组件根部再套一个没有任何作用的view元素
+        $uGetRect(selector, all) {
+            return new Promise((resolve) => {
+                uni.createSelectorQuery()
+                    .in(this)[all ? 'selectAll' : 'select'](selector)
+                    .boundingClientRect((rect) => {
+                        if (all && Array.isArray(rect) && rect.length) {
+                            resolve(rect)
+                        }
+                        if (!all && rect) {
+                            resolve(rect)
+                        }
+                    })
+                    .exec()
+            })
+        },
+        getParentData(parentName = '') {
+            // 避免在created中去定义parent变量
+            if (!this.parent) this.parent = {}
+            // 这里的本质原理是,通过获取父组件实例(也即类似u-radio的父组件u-radio-group的this)
+            // 将父组件this中对应的参数,赋值给本组件(u-radio的this)的parentData对象中对应的属性
+            // 之所以需要这么做,是因为所有端中,头条小程序不支持通过this.parent.xxx去监听父组件参数的变化
+            // 此处并不会自动更新子组件的数据,而是依赖父组件u-radio-group去监听data的变化,手动调用更新子组件的方法去重新获取
+            this.parent = $parent.call(this, parentName)
+            if (this.parent.children) {
+                // 如果父组件的children不存在本组件的实例,才将本实例添加到父组件的children中
+                this.parent.children.indexOf(this) === -1 && this.parent.children.push(this)
+            }
+            if (this.parent && this.parentData) {
+                // 历遍parentData中的属性,将parent中的同名属性赋值给parentData
+                Object.keys(this.parentData).map((key) => {
+                    this.parentData[key] = this.parent[key]
+                })
+            }
+        },
+        // 阻止事件冒泡
+        preventEvent(e) {
+            e && typeof (e.stopPropagation) === 'function' && e.stopPropagation()
+        },
+        // 空操作
+        noop(e) {
+            this.preventEvent(e)
+        }
+    },
+    onReachBottom() {
+        uni.$emit('uOnReachBottom')
+	},
+	// #ifdef VUE2
+	beforeDestroy() {
+	// #endif
+	// #ifdef VUE3
+	beforeUnmount() {
+	// #endif
+        // 判断当前页面是否存在parent和chldren,一般在checkbox和checkbox-group父子联动的场景会有此情况
+        // 组件销毁时,移除子组件在父组件children数组中的实例,释放资源,避免数据混乱
+        if (this.parent && test.array(this.parent.children)) {
+            // 组件销毁时,移除父组件中的children数组中对应的实例
+            const childrenList = this.parent.children
+            childrenList.map((child, index) => {
+                // 如果相等,则移除
+                if (child === this) {
+                    childrenList.splice(index, 1)
+                }
+            })
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/libs/mixin/mpMixin.js b/uni_modules/uview-plus/libs/mixin/mpMixin.js
new file mode 100644
index 0000000..29e7e65
--- /dev/null
+++ b/uni_modules/uview-plus/libs/mixin/mpMixin.js
@@ -0,0 +1,8 @@
+export default {
+    // #ifdef MP-WEIXIN
+    // 将自定义节点设置成虚拟的,更加接近Vue组件的表现,能更好的使用flex属性
+    options: {
+        virtualHost: true
+    }
+    // #endif
+}
diff --git a/uni_modules/uview-plus/libs/mixin/mpShare.js b/uni_modules/uview-plus/libs/mixin/mpShare.js
new file mode 100644
index 0000000..d62e408
--- /dev/null
+++ b/uni_modules/uview-plus/libs/mixin/mpShare.js
@@ -0,0 +1,15 @@
+
+export default {
+    data() {
+        return {
+            mpShare: {
+                title: '', // 默认为小程序名称
+                path: '', // 默认为当前页面路径
+                imageUrl: '' // 默认为当前页面的截图 
+            }
+        }
+    },
+    onShareAppMessage() {
+        return this.mpShare;
+    }
+}
diff --git a/uni_modules/uview-plus/libs/mixin/openType.js b/uni_modules/uview-plus/libs/mixin/openType.js
new file mode 100644
index 0000000..1216181
--- /dev/null
+++ b/uni_modules/uview-plus/libs/mixin/openType.js
@@ -0,0 +1,25 @@
+export default {
+    props: {
+        openType: String
+    },
+    methods: {
+        onGetUserInfo(event) {
+            this.$emit('getuserinfo', event.detail)
+        },
+        onContact(event) {
+            this.$emit('contact', event.detail)
+        },
+        onGetPhoneNumber(event) {
+            this.$emit('getphonenumber', event.detail)
+        },
+        onError(event) {
+            this.$emit('error', event.detail)
+        },
+        onLaunchApp(event) {
+            this.$emit('launchapp', event.detail)
+        },
+        onOpenSetting(event) {
+            this.$emit('opensetting', event.detail)
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/libs/mixin/style.js b/uni_modules/uview-plus/libs/mixin/style.js
new file mode 100644
index 0000000..6356bff
--- /dev/null
+++ b/uni_modules/uview-plus/libs/mixin/style.js
@@ -0,0 +1,247 @@
+import { addStyle, deepMerge, addUnit, trim } from '../function/index';
+export default {
+    props: {
+        // flex排列方式
+        flexDirection: {
+            type: String,
+            default: ''
+        },
+        // flex-direction的简写
+        fd: {
+            type: String,
+            default: ''
+        },
+        // 展示类型
+        display: {
+            type: String,
+            default: ''
+        },
+        // display简写
+        d: {
+            type: String,
+            default: ''
+        },
+        // 主轴排列方式
+        justifyContent: {
+            type: String,
+            default: ''
+        },
+        // justifyContent的简写
+        jc: {
+            type: String,
+            default: ''
+        },
+        // 纵轴排列方式
+        alignItems: {
+            type: String,
+            default: ''
+        },
+        // align-items的简写
+        ai: {
+            type: String,
+            default: ''
+        },
+        color: {
+            type: String,
+            default: ''
+        },
+        // color简写
+        c: {
+            type: String,
+            default: ''
+        },
+        // 字体大小
+        fontSize: {
+            type: [String, Number],
+            default: 0
+        },
+        // font-size简写
+        fs: {
+            type: [String, Number],
+            default: ''
+        },
+        margin: {
+            type: [String, Number],
+            default: 0
+        },
+        // margin简写
+        m: {
+            type: [String, Number],
+            default: 0
+        },
+        // margin-top
+        marginTop: {
+            type: [String, Number],
+            default: 0
+        },
+        // margin-top简写
+        mt: {
+            type: [String, Number],
+            default: 0
+        },
+        // margin-right
+        marginRight: {
+            type: [String, Number],
+            default: 0
+        },
+        // margin-right简写
+        mr: {
+            type: [String, Number],
+            default: 0
+        },
+        // margin-bottom
+        marginBottom: {
+            type: [String, Number],
+            default: 0
+        },
+        // margin-bottom简写
+        mb: {
+            type: [String, Number],
+            default: 0
+        },
+        // margin-left
+        marginLeft: {
+            type: [String, Number],
+            default: 0
+        },
+        // margin-left简写
+        ml: {
+            type: [String, Number],
+            default: 0
+        },
+        // padding-left
+        paddingLeft: {
+            type: [String, Number],
+            default: 0
+        },
+        // padding-left简写
+        pl: {
+            type: [String, Number],
+            default: 0
+        },
+        // padding-top
+        paddingTop: {
+            type: [String, Number],
+            default: 0
+        },
+        // padding-top简写
+        pt: {
+            type: [String, Number],
+            default: 0
+        },
+        // padding-right
+        paddingRight: {
+            type: [String, Number],
+            default: 0
+        },
+        // padding-right简写
+        pr: {
+            type: [String, Number],
+            default: 0
+        },
+        // padding-bottom
+        paddingBottom: {
+            type: [String, Number],
+            default: 0
+        },
+        // padding-bottom简写
+        pb: {
+            type: [String, Number],
+            default: 0
+        },
+        // border-radius
+        borderRadius: {
+            type: [String, Number],
+            default: 0
+        },
+        // border-radius简写
+        radius: {
+            type: [String, Number],
+            default: 0
+        },
+        // transform
+        transform: {
+            type: String,
+            default: ''
+        },
+        // 定位
+        position: {
+            type: String,
+            default: ''
+        },
+        // position简写
+        pos: {
+            type: String,
+            default: ''
+        },
+        // 宽度
+        width: {
+            type: [String, Number],
+            default: null
+        },
+        // width简写
+        w: {
+            type: [String, Number],
+            default: null
+        },
+        // 高度
+        height: {
+            type: [String, Number],
+            default: null
+        },
+        // height简写
+        h: {
+            type: [String, Number],
+            default: null
+        },
+        top: {
+            type: [String, Number],
+            default: 0
+        },
+        right: {
+            type: [String, Number],
+            default: 0
+        },
+        bottom: {
+            type: [String, Number],
+            default: 0
+        },
+        left: {
+            type: [String, Number],
+            default: 0
+        }
+    },
+    computed: {
+        viewStyle() {
+            const style = {}
+            const addStyleTmp = addStyle(this.width || this.w)
+                && (style.width = addStyle(this.width || this.w))(this.height || this.h)
+                && (style.height = addStyle(this.height || this.h))(this.margin || this.m)
+                && (style.margin = addStyle(this.margin || this.m))(this.marginTop || this.mt)
+                && (style.marginTop = addStyle(this.marginTop || this.mt))(this.marginRight || this.mr)
+                && (style.marginRight = addStyle(this.marginRight || this.mr))(this.marginBottom || this.mb)
+                && (style.marginBottom = addStyle(this.marginBottom || this.mb))(this.marginLeft || this.ml)
+                && (style.marginLeft = addStyle(this.marginLeft || this.ml))(this.padding || this.p)
+                && (style.padding = addStyle(this.padding || this.p))(this.paddingTop || this.pt)
+                && (style.paddingTop = addStyle(this.paddingTop || this.pt))(this.paddingRight || this.pr)
+                && (style.paddingRight = addStyle(this.paddingRight || this.pr))(this.paddingBottom || this.pb)
+                && (style.paddingBottom = addStyle(this.paddingBottom || this.pb))(this.paddingLeft || this.pl)
+                && (style.paddingLeft = addStyle(this.paddingLeft || this.pl))(this.color || this.c)
+                && (style.color = this.color || this.c)(this.fontSize || this.fs)
+                && (style.fontSize = this.fontSize || this.fs)(this.borderRadius || this.radius)
+                && (style.borderRadius = this.borderRadius || this.radius)(this.position || this.pos)
+                && (this.position = this.position || this.pos)(this.flexDirection || this.fd)
+                && (this.flexDirection = this.flexDirection || this.fd)(this.justifyContent || jc)
+                && (this.justifyContent = this.justifyContent || jc)(this.alignItems || ai)
+                && (this.alignItems = this.alignItems || ai)
+            return deepMerge(style, addStyleTmp(this.customStyle))
+        }
+    },
+    methods: {
+        // 获取margin或者padding的单位,比如padding: 0 20转为padding: 0 20px
+        getUnit(unit = '') {
+            // 取出两端空格,分隔成数组,再对数组的每个元素添加单位,最后再合并成字符串
+            return trim(unit).split(' ').map((item) => addUnit(item)).join(' ')
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/libs/mixin/touch.js b/uni_modules/uview-plus/libs/mixin/touch.js
new file mode 100644
index 0000000..0ecbd88
--- /dev/null
+++ b/uni_modules/uview-plus/libs/mixin/touch.js
@@ -0,0 +1,59 @@
+const MIN_DISTANCE = 10
+
+function getDirection(x, y) {
+    if (x > y && x > MIN_DISTANCE) {
+        return 'horizontal'
+    }
+    if (y > x && y > MIN_DISTANCE) {
+        return 'vertical'
+    }
+    return ''
+}
+
+export default {
+    methods: {
+        getTouchPoint(e) {
+            if (!e) {
+                return {
+                    x: 0,
+                    y: 0
+                }
+            } if (e.touches && e.touches[0]) {
+                return {
+                    x: e.touches[0].pageX,
+                    y: e.touches[0].pageY
+                }
+            } if (e.changedTouches && e.changedTouches[0]) {
+                return {
+                    x: e.changedTouches[0].pageX,
+                    y: e.changedTouches[0].pageY
+                }
+            }
+            return {
+                x: e.clientX || 0,
+                y: e.clientY || 0
+            }
+        },
+        resetTouchStatus() {
+            this.direction = ''
+            this.deltaX = 0
+            this.deltaY = 0
+            this.offsetX = 0
+            this.offsetY = 0
+        },
+        touchStart(event) {
+            this.resetTouchStatus()
+            const touch = this.getTouchPoint(event)
+            this.startX = touch.x
+            this.startY = touch.y
+        },
+        touchMove(event) {
+            const touch = this.getTouchPoint(event)
+            this.deltaX = touch.x - this.startX
+            this.deltaY = touch.y - this.startY
+            this.offsetX = Math.abs(this.deltaX)
+            this.offsetY = Math.abs(this.deltaY)
+            this.direction =				this.direction || getDirection(this.offsetX, this.offsetY)
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/libs/util/async-validator.js b/uni_modules/uview-plus/libs/util/async-validator.js
new file mode 100644
index 0000000..9e114df
--- /dev/null
+++ b/uni_modules/uview-plus/libs/util/async-validator.js
@@ -0,0 +1,1343 @@
+function _extends() {
+    _extends = Object.assign || function (target) {
+        for (let i = 1; i < arguments.length; i++) {
+            const source = arguments[i]
+
+            for (const key in source) {
+                if (Object.prototype.hasOwnProperty.call(source, key)) {
+                    target[key] = source[key]
+                }
+            }
+        }
+
+        return target
+    }
+
+    return _extends.apply(this, arguments)
+}
+
+/* eslint no-console:0 */
+const formatRegExp = /%[sdj%]/g
+let warning = function warning() {} // don't print warning message when in production env or node runtime
+
+if (typeof process !== 'undefined' && process.env && process.env.NODE_ENV !== 'production' && typeof window
+	!== 'undefined' && typeof document !== 'undefined') {
+    warning = function warning(type, errors) {
+        if (typeof console !== 'undefined' && console.warn) {
+            if (errors.every((e) => typeof e === 'string')) {
+                console.warn(type, errors)
+            }
+        }
+    }
+}
+
+function convertFieldsError(errors) {
+    if (!errors || !errors.length) return null
+    const fields = {}
+    errors.forEach((error) => {
+        const { field } = error
+        fields[field] = fields[field] || []
+        fields[field].push(error)
+    })
+    return fields
+}
+
+function format() {
+    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
+        args[_key] = arguments[_key]
+    }
+
+    let i = 1
+    const f = args[0]
+    const len = args.length
+
+    if (typeof f === 'function') {
+        return f.apply(null, args.slice(1))
+    }
+
+    if (typeof f === 'string') {
+        let str = String(f).replace(formatRegExp, (x) => {
+            if (x === '%%') {
+                return '%'
+            }
+
+            if (i >= len) {
+                return x
+            }
+
+            switch (x) {
+            case '%s':
+                return String(args[i++])
+
+            case '%d':
+                return Number(args[i++])
+
+            case '%j':
+                try {
+                    return JSON.stringify(args[i++])
+                } catch (_) {
+                    return '[Circular]'
+                }
+
+                break
+
+            default:
+                return x
+            }
+        })
+
+        for (let arg = args[i]; i < len; arg = args[++i]) {
+            str += ` ${arg}`
+        }
+
+        return str
+    }
+
+    return f
+}
+
+function isNativeStringType(type) {
+    return type === 'string' || type === 'url' || type === 'hex' || type === 'email' || type === 'pattern'
+}
+
+function isEmptyValue(value, type) {
+    if (value === undefined || value === null) {
+        return true
+    }
+
+    if (type === 'array' && Array.isArray(value) && !value.length) {
+        return true
+    }
+
+    if (isNativeStringType(type) && typeof value === 'string' && !value) {
+        return true
+    }
+
+    return false
+}
+
+function asyncParallelArray(arr, func, callback) {
+    const results = []
+    let total = 0
+    const arrLength = arr.length
+
+    function count(errors) {
+        results.push.apply(results, errors)
+        total++
+
+        if (total === arrLength) {
+            callback(results)
+        }
+    }
+
+    arr.forEach((a) => {
+        func(a, count)
+    })
+}
+
+function asyncSerialArray(arr, func, callback) {
+    let index = 0
+    const arrLength = arr.length
+
+    function next(errors) {
+        if (errors && errors.length) {
+            callback(errors)
+            return
+        }
+
+        const original = index
+        index += 1
+
+        if (original < arrLength) {
+            func(arr[original], next)
+        } else {
+            callback([])
+        }
+    }
+
+    next([])
+}
+
+function flattenObjArr(objArr) {
+    const ret = []
+    Object.keys(objArr).forEach((k) => {
+        ret.push.apply(ret, objArr[k])
+    })
+    return ret
+}
+
+function asyncMap(objArr, option, func, callback) {
+    if (option.first) {
+        const _pending = new Promise((resolve, reject) => {
+            const next = function next(errors) {
+                callback(errors)
+                return errors.length ? reject({
+                    errors,
+                    fields: convertFieldsError(errors)
+                }) : resolve()
+            }
+
+            const flattenArr = flattenObjArr(objArr)
+            asyncSerialArray(flattenArr, func, next)
+        })
+
+        _pending.catch((e) => e)
+
+        return _pending
+    }
+
+    let firstFields = option.firstFields || []
+
+    if (firstFields === true) {
+        firstFields = Object.keys(objArr)
+    }
+
+    const objArrKeys = Object.keys(objArr)
+    const objArrLength = objArrKeys.length
+    let total = 0
+    const results = []
+    const pending = new Promise((resolve, reject) => {
+        const next = function next(errors) {
+            results.push.apply(results, errors)
+            total++
+
+            if (total === objArrLength) {
+                callback(results)
+                return results.length ? reject({
+                    errors: results,
+                    fields: convertFieldsError(results)
+                }) : resolve()
+            }
+        }
+
+        if (!objArrKeys.length) {
+            callback(results)
+            resolve()
+        }
+
+        objArrKeys.forEach((key) => {
+            const arr = objArr[key]
+
+            if (firstFields.indexOf(key) !== -1) {
+                asyncSerialArray(arr, func, next)
+            } else {
+                asyncParallelArray(arr, func, next)
+            }
+        })
+    })
+    pending.catch((e) => e)
+    return pending
+}
+
+function complementError(rule) {
+    return function (oe) {
+        if (oe && oe.message) {
+            oe.field = oe.field || rule.fullField
+            return oe
+        }
+
+        return {
+            message: typeof oe === 'function' ? oe() : oe,
+            field: oe.field || rule.fullField
+        }
+    }
+}
+
+function deepMerge(target, source) {
+    if (source) {
+        for (const s in source) {
+            if (source.hasOwnProperty(s)) {
+                const value = source[s]
+
+                if (typeof value === 'object' && typeof target[s] === 'object') {
+                    target[s] = { ...target[s], ...value }
+                } else {
+                    target[s] = value
+                }
+            }
+        }
+    }
+
+    return target
+}
+
+/**
+ *  Rule for validating required fields.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param source The source object being validated.
+ *  @param errors An array of errors that this rule may add
+ *  validation errors to.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function required(rule, value, source, errors, options, type) {
+    if (rule.required && (!source.hasOwnProperty(rule.field) || isEmptyValue(value, type || rule.type))) {
+        errors.push(format(options.messages.required, rule.fullField))
+    }
+}
+
+/**
+ *  Rule for validating whitespace.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param source The source object being validated.
+ *  @param errors An array of errors that this rule may add
+ *  validation errors to.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function whitespace(rule, value, source, errors, options) {
+    if (/^\s+$/.test(value) || value === '') {
+        errors.push(format(options.messages.whitespace, rule.fullField))
+    }
+}
+
+/* eslint max-len:0 */
+
+const pattern = {
+    // http://emailregex.com/
+    email: /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,
+    url: new RegExp(
+        '^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$',
+        'i'
+    ),
+    hex: /^#?([a-f0-9]{6}|[a-f0-9]{3})$/i
+}
+var types = {
+    integer: function integer(value) {
+        return /^(-)?\d+$/.test(value);
+    },
+    float: function float(value) {
+        return /^(-)?\d+(\.\d+)?$/.test(value);
+    },
+    array: function array(value) {
+        return Array.isArray(value)
+    },
+    regexp: function regexp(value) {
+        if (value instanceof RegExp) {
+            return true
+        }
+
+        try {
+            return !!new RegExp(value)
+        } catch (e) {
+            return false
+        }
+    },
+    date: function date(value) {
+        return typeof value.getTime === 'function' && typeof value.getMonth === 'function' && typeof value.getYear
+			=== 'function'
+    },
+    number: function number(value) {
+        if (isNaN(value)) {
+            return false
+        }
+
+        // 修改源码,将字符串数值先转为数值
+        return typeof +value === 'number'
+    },
+    object: function object(value) {
+        return typeof value === 'object' && !types.array(value)
+    },
+    method: function method(value) {
+        return typeof value === 'function'
+    },
+    email: function email(value) {
+        return typeof value === 'string' && !!value.match(pattern.email) && value.length < 255
+    },
+    url: function url(value) {
+        return typeof value === 'string' && !!value.match(pattern.url)
+    },
+    hex: function hex(value) {
+        return typeof value === 'string' && !!value.match(pattern.hex)
+    }
+}
+/**
+ *  Rule for validating the type of a value.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param source The source object being validated.
+ *  @param errors An array of errors that this rule may add
+ *  validation errors to.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function type(rule, value, source, errors, options) {
+    if (rule.required && value === undefined) {
+        required(rule, value, source, errors, options)
+        return
+    }
+
+    const custom = ['integer', 'float', 'array', 'regexp', 'object', 'method', 'email', 'number', 'date', 'url', 'hex']
+    const ruleType = rule.type
+
+    if (custom.indexOf(ruleType) > -1) {
+        if (!types[ruleType](value)) {
+            errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type))
+        } // straight typeof check
+    } else if (ruleType && typeof value !== rule.type) {
+        errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type))
+    }
+}
+
+/**
+ *  Rule for validating minimum and maximum allowed values.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param source The source object being validated.
+ *  @param errors An array of errors that this rule may add
+ *  validation errors to.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function range(rule, value, source, errors, options) {
+    const len = typeof rule.len === 'number'
+    const min = typeof rule.min === 'number'
+    const max = typeof rule.max === 'number' // 正则匹配码点范围从U+010000一直到U+10FFFF的文字(补充平面Supplementary Plane)
+
+    const spRegexp = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g
+    let val = value
+    let key = null
+    const num = typeof value === 'number'
+    const str = typeof value === 'string'
+    const arr = Array.isArray(value)
+
+    if (num) {
+        key = 'number'
+    } else if (str) {
+        key = 'string'
+    } else if (arr) {
+        key = 'array'
+    } // if the value is not of a supported type for range validation
+    // the validation rule rule should use the
+    // type property to also test for a particular type
+
+    if (!key) {
+        return false
+    }
+
+    if (arr) {
+        val = value.length
+    }
+
+    if (str) {
+        // 处理码点大于U+010000的文字length属性不准确的bug,如"𠮷𠮷𠮷".lenght !== 3
+        val = value.replace(spRegexp, '_').length
+    }
+
+    if (len) {
+        if (val !== rule.len) {
+            errors.push(format(options.messages[key].len, rule.fullField, rule.len))
+        }
+    } else if (min && !max && val < rule.min) {
+        errors.push(format(options.messages[key].min, rule.fullField, rule.min))
+    } else if (max && !min && val > rule.max) {
+        errors.push(format(options.messages[key].max, rule.fullField, rule.max))
+    } else if (min && max && (val < rule.min || val > rule.max)) {
+        errors.push(format(options.messages[key].range, rule.fullField, rule.min, rule.max))
+    }
+}
+
+const ENUM = 'enum'
+/**
+ *  Rule for validating a value exists in an enumerable list.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param source The source object being validated.
+ *  @param errors An array of errors that this rule may add
+ *  validation errors to.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function enumerable(rule, value, source, errors, options) {
+    rule[ENUM] = Array.isArray(rule[ENUM]) ? rule[ENUM] : []
+
+    if (rule[ENUM].indexOf(value) === -1) {
+        errors.push(format(options.messages[ENUM], rule.fullField, rule[ENUM].join(', ')))
+    }
+}
+
+/**
+ *  Rule for validating a regular expression pattern.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param source The source object being validated.
+ *  @param errors An array of errors that this rule may add
+ *  validation errors to.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function pattern$1(rule, value, source, errors, options) {
+    if (rule.pattern) {
+        if (rule.pattern instanceof RegExp) {
+            // if a RegExp instance is passed, reset `lastIndex` in case its `global`
+            // flag is accidentally set to `true`, which in a validation scenario
+            // is not necessary and the result might be misleading
+            rule.pattern.lastIndex = 0
+
+            if (!rule.pattern.test(value)) {
+                errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern))
+            }
+        } else if (typeof rule.pattern === 'string') {
+            const _pattern = new RegExp(rule.pattern)
+
+            if (!_pattern.test(value)) {
+                errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern))
+            }
+        }
+    }
+}
+
+const rules = {
+    required,
+    whitespace,
+    type,
+    range,
+    enum: enumerable,
+    pattern: pattern$1
+}
+
+/**
+ *  Performs validation for string types.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function string(rule, value, callback, source, options) {
+    const errors = []
+    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)
+
+    if (validate) {
+        if (isEmptyValue(value, 'string') && !rule.required) {
+            return callback()
+        }
+
+        rules.required(rule, value, source, errors, options, 'string')
+
+        if (!isEmptyValue(value, 'string')) {
+            rules.type(rule, value, source, errors, options)
+            rules.range(rule, value, source, errors, options)
+            rules.pattern(rule, value, source, errors, options)
+
+            if (rule.whitespace === true) {
+                rules.whitespace(rule, value, source, errors, options)
+            }
+        }
+    }
+
+    callback(errors)
+}
+
+/**
+ *  Validates a function.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function method(rule, value, callback, source, options) {
+    const errors = []
+    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)
+
+    if (validate) {
+        if (isEmptyValue(value) && !rule.required) {
+            return callback()
+        }
+
+        rules.required(rule, value, source, errors, options)
+
+        if (value !== undefined) {
+            rules.type(rule, value, source, errors, options)
+        }
+    }
+
+    callback(errors)
+}
+
+/**
+ *  Validates a number.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function number(rule, value, callback, source, options) {
+    const errors = []
+    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)
+
+    if (validate) {
+        if (value === '') {
+            value = undefined
+        }
+
+        if (isEmptyValue(value) && !rule.required) {
+            return callback()
+        }
+
+        rules.required(rule, value, source, errors, options)
+
+        if (value !== undefined) {
+            rules.type(rule, value, source, errors, options)
+            rules.range(rule, value, source, errors, options)
+        }
+    }
+
+    callback(errors)
+}
+
+/**
+ *  Validates a boolean.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function _boolean(rule, value, callback, source, options) {
+    const errors = []
+    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)
+
+    if (validate) {
+        if (isEmptyValue(value) && !rule.required) {
+            return callback()
+        }
+
+        rules.required(rule, value, source, errors, options)
+
+        if (value !== undefined) {
+            rules.type(rule, value, source, errors, options)
+        }
+    }
+
+    callback(errors)
+}
+
+/**
+ *  Validates the regular expression type.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function regexp(rule, value, callback, source, options) {
+    const errors = []
+    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)
+
+    if (validate) {
+        if (isEmptyValue(value) && !rule.required) {
+            return callback()
+        }
+
+        rules.required(rule, value, source, errors, options)
+
+        if (!isEmptyValue(value)) {
+            rules.type(rule, value, source, errors, options)
+        }
+    }
+
+    callback(errors)
+}
+
+/**
+ *  Validates a number is an integer.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function integer(rule, value, callback, source, options) {
+    const errors = []
+    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)
+
+    if (validate) {
+        if (isEmptyValue(value) && !rule.required) {
+            return callback()
+        }
+
+        rules.required(rule, value, source, errors, options)
+
+        if (value !== undefined) {
+            rules.type(rule, value, source, errors, options)
+            rules.range(rule, value, source, errors, options)
+        }
+    }
+
+    callback(errors)
+}
+
+/**
+ *  Validates a number is a floating point number.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function floatFn(rule, value, callback, source, options) {
+    const errors = []
+    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)
+
+    if (validate) {
+        if (isEmptyValue(value) && !rule.required) {
+            return callback()
+        }
+
+        rules.required(rule, value, source, errors, options)
+
+        if (value !== undefined) {
+            rules.type(rule, value, source, errors, options)
+            rules.range(rule, value, source, errors, options)
+        }
+    }
+
+    callback(errors)
+}
+
+/**
+ *  Validates an array.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function array(rule, value, callback, source, options) {
+    const errors = []
+    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)
+
+    if (validate) {
+        if (isEmptyValue(value, 'array') && !rule.required) {
+            return callback()
+        }
+
+        rules.required(rule, value, source, errors, options, 'array')
+
+        if (!isEmptyValue(value, 'array')) {
+            rules.type(rule, value, source, errors, options)
+            rules.range(rule, value, source, errors, options)
+        }
+    }
+
+    callback(errors)
+}
+
+/**
+ *  Validates an object.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function object(rule, value, callback, source, options) {
+    const errors = []
+    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)
+
+    if (validate) {
+        if (isEmptyValue(value) && !rule.required) {
+            return callback()
+        }
+
+        rules.required(rule, value, source, errors, options)
+
+        if (value !== undefined) {
+            rules.type(rule, value, source, errors, options)
+        }
+    }
+
+    callback(errors)
+}
+
+const ENUM$1 = 'enum'
+/**
+ *  Validates an enumerable list.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function enumerable$1(rule, value, callback, source, options) {
+    const errors = []
+    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)
+
+    if (validate) {
+        if (isEmptyValue(value) && !rule.required) {
+            return callback()
+        }
+
+        rules.required(rule, value, source, errors, options)
+
+        if (value !== undefined) {
+            rules[ENUM$1](rule, value, source, errors, options)
+        }
+    }
+
+    callback(errors)
+}
+
+/**
+ *  Validates a regular expression pattern.
+ *
+ *  Performs validation when a rule only contains
+ *  a pattern property but is not declared as a string type.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function pattern$2(rule, value, callback, source, options) {
+    const errors = []
+    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)
+
+    if (validate) {
+        if (isEmptyValue(value, 'string') && !rule.required) {
+            return callback()
+        }
+
+        rules.required(rule, value, source, errors, options)
+
+        if (!isEmptyValue(value, 'string')) {
+            rules.pattern(rule, value, source, errors, options)
+        }
+    }
+
+    callback(errors)
+}
+
+function date(rule, value, callback, source, options) {
+    const errors = []
+    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)
+
+    if (validate) {
+        if (isEmptyValue(value) && !rule.required) {
+            return callback()
+        }
+
+        rules.required(rule, value, source, errors, options)
+
+        if (!isEmptyValue(value)) {
+            let dateObject
+
+            if (typeof value === 'number') {
+                dateObject = new Date(value)
+            } else {
+                dateObject = value
+            }
+
+            rules.type(rule, dateObject, source, errors, options)
+
+            if (dateObject) {
+                rules.range(rule, dateObject.getTime(), source, errors, options)
+            }
+        }
+    }
+
+    callback(errors)
+}
+
+function required$1(rule, value, callback, source, options) {
+    const errors = []
+    const type = Array.isArray(value) ? 'array' : typeof value
+    rules.required(rule, value, source, errors, options, type)
+    callback(errors)
+}
+
+function type$1(rule, value, callback, source, options) {
+    const ruleType = rule.type
+    const errors = []
+    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)
+
+    if (validate) {
+        if (isEmptyValue(value, ruleType) && !rule.required) {
+            return callback()
+        }
+
+        rules.required(rule, value, source, errors, options, ruleType)
+
+        if (!isEmptyValue(value, ruleType)) {
+            rules.type(rule, value, source, errors, options)
+        }
+    }
+
+    callback(errors)
+}
+
+/**
+ *  Performs validation for any type.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function any(rule, value, callback, source, options) {
+    const errors = []
+    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)
+
+    if (validate) {
+        if (isEmptyValue(value) && !rule.required) {
+            return callback()
+        }
+
+        rules.required(rule, value, source, errors, options)
+    }
+
+    callback(errors)
+}
+
+const validators = {
+    string,
+    method,
+    number,
+    boolean: _boolean,
+    regexp,
+    integer,
+    float: floatFn,
+    array,
+    object,
+    enum: enumerable$1,
+    pattern: pattern$2,
+    date,
+    url: type$1,
+    hex: type$1,
+    email: type$1,
+    required: required$1,
+    any
+}
+
+function newMessages() {
+    return {
+        default: 'Validation error on field %s',
+        required: '%s is required',
+        enum: '%s must be one of %s',
+        whitespace: '%s cannot be empty',
+        date: {
+            format: '%s date %s is invalid for format %s',
+            parse: '%s date could not be parsed, %s is invalid ',
+            invalid: '%s date %s is invalid'
+        },
+        types: {
+            string: '%s is not a %s',
+            method: '%s is not a %s (function)',
+            array: '%s is not an %s',
+            object: '%s is not an %s',
+            number: '%s is not a %s',
+            date: '%s is not a %s',
+            boolean: '%s is not a %s',
+            integer: '%s is not an %s',
+            float: '%s is not a %s',
+            regexp: '%s is not a valid %s',
+            email: '%s is not a valid %s',
+            url: '%s is not a valid %s',
+            hex: '%s is not a valid %s'
+        },
+        string: {
+            len: '%s must be exactly %s characters',
+            min: '%s must be at least %s characters',
+            max: '%s cannot be longer than %s characters',
+            range: '%s must be between %s and %s characters'
+        },
+        number: {
+            len: '%s must equal %s',
+            min: '%s cannot be less than %s',
+            max: '%s cannot be greater than %s',
+            range: '%s must be between %s and %s'
+        },
+        array: {
+            len: '%s must be exactly %s in length',
+            min: '%s cannot be less than %s in length',
+            max: '%s cannot be greater than %s in length',
+            range: '%s must be between %s and %s in length'
+        },
+        pattern: {
+            mismatch: '%s value %s does not match pattern %s'
+        },
+        clone: function clone() {
+            const cloned = JSON.parse(JSON.stringify(this))
+            cloned.clone = this.clone
+            return cloned
+        }
+    }
+}
+const messages = newMessages()
+
+/**
+ *  Encapsulates a validation schema.
+ *
+ *  @param descriptor An object declaring validation rules
+ *  for this schema.
+ */
+
+function Schema(descriptor) {
+    this.rules = null
+    this._messages = messages
+    this.define(descriptor)
+}
+
+Schema.prototype = {
+    messages: function messages(_messages) {
+        if (_messages) {
+            this._messages = deepMerge(newMessages(), _messages)
+        }
+
+        return this._messages
+    },
+    define: function define(rules) {
+        if (!rules) {
+            throw new Error('Cannot configure a schema with no rules')
+        }
+
+        if (typeof rules !== 'object' || Array.isArray(rules)) {
+            throw new Error('Rules must be an object')
+        }
+
+        this.rules = {}
+        let z
+        let item
+
+        for (z in rules) {
+            if (rules.hasOwnProperty(z)) {
+                item = rules[z]
+                this.rules[z] = Array.isArray(item) ? item : [item]
+            }
+        }
+    },
+    validate: function validate(source_, o, oc) {
+        const _this = this
+
+        if (o === void 0) {
+            o = {}
+        }
+
+        if (oc === void 0) {
+            oc = function oc() {}
+        }
+
+        let source = source_
+        let options = o
+        let callback = oc
+
+        if (typeof options === 'function') {
+            callback = options
+            options = {}
+        }
+
+        if (!this.rules || Object.keys(this.rules).length === 0) {
+            if (callback) {
+                callback()
+            }
+
+            return Promise.resolve()
+        }
+
+        function complete(results) {
+            let i
+            let errors = []
+            let fields = {}
+
+            function add(e) {
+                if (Array.isArray(e)) {
+                    let _errors
+
+                    errors = (_errors = errors).concat.apply(_errors, e)
+                } else {
+                    errors.push(e)
+                }
+            }
+
+            for (i = 0; i < results.length; i++) {
+                add(results[i])
+            }
+
+            if (!errors.length) {
+                errors = null
+                fields = null
+            } else {
+                fields = convertFieldsError(errors)
+            }
+
+            callback(errors, fields)
+        }
+
+        if (options.messages) {
+            let messages$1 = this.messages()
+
+            if (messages$1 === messages) {
+                messages$1 = newMessages()
+            }
+
+            deepMerge(messages$1, options.messages)
+            options.messages = messages$1
+        } else {
+            options.messages = this.messages()
+        }
+
+        let arr
+        let value
+        const series = {}
+        const keys = options.keys || Object.keys(this.rules)
+        keys.forEach((z) => {
+            arr = _this.rules[z]
+            value = source[z]
+            arr.forEach((r) => {
+                let rule = r
+
+                if (typeof rule.transform === 'function') {
+                    if (source === source_) {
+                        source = { ...source }
+                    }
+
+                    value = source[z] = rule.transform(value)
+                }
+
+                if (typeof rule === 'function') {
+                    rule = {
+                        validator: rule
+                    }
+                } else {
+                    rule = { ...rule }
+                }
+
+                rule.validator = _this.getValidationMethod(rule)
+                rule.field = z
+                rule.fullField = rule.fullField || z
+                rule.type = _this.getType(rule)
+
+                if (!rule.validator) {
+                    return
+                }
+
+                series[z] = series[z] || []
+                series[z].push({
+                    rule,
+                    value,
+                    source,
+                    field: z
+                })
+            })
+        })
+        const errorFields = {}
+        return asyncMap(series, options, (data, doIt) => {
+            const { rule } = data
+            let deep = (rule.type === 'object' || rule.type === 'array') && (typeof rule.fields === 'object' || typeof rule.defaultField
+				=== 'object')
+            deep = deep && (rule.required || !rule.required && data.value)
+            rule.field = data.field
+
+            function addFullfield(key, schema) {
+                return { ...schema, fullField: `${rule.fullField}.${key}` }
+            }
+
+            function cb(e) {
+                if (e === void 0) {
+                    e = []
+                }
+
+                let errors = e
+
+                if (!Array.isArray(errors)) {
+                    errors = [errors]
+                }
+
+                if (!options.suppressWarning && errors.length) {
+                    Schema.warning('async-validator:', errors)
+                }
+
+                if (errors.length && rule.message) {
+                    errors = [].concat(rule.message)
+                }
+
+                errors = errors.map(complementError(rule))
+
+                if (options.first && errors.length) {
+                    errorFields[rule.field] = 1
+                    return doIt(errors)
+                }
+
+                if (!deep) {
+                    doIt(errors)
+                } else {
+                    // if rule is required but the target object
+                    // does not exist fail at the rule level and don't
+                    // go deeper
+                    if (rule.required && !data.value) {
+                        if (rule.message) {
+                            errors = [].concat(rule.message).map(complementError(rule))
+                        } else if (options.error) {
+                            errors = [options.error(rule, format(options.messages.required, rule.field))]
+                        } else {
+                            errors = []
+                        }
+
+                        return doIt(errors)
+                    }
+
+                    let fieldsSchema = {}
+
+                    if (rule.defaultField) {
+                        for (const k in data.value) {
+                            if (data.value.hasOwnProperty(k)) {
+                                fieldsSchema[k] = rule.defaultField
+                            }
+                        }
+                    }
+
+                    fieldsSchema = { ...fieldsSchema, ...data.rule.fields }
+
+                    for (const f in fieldsSchema) {
+                        if (fieldsSchema.hasOwnProperty(f)) {
+                            const fieldSchema = Array.isArray(fieldsSchema[f]) ? fieldsSchema[f] : [fieldsSchema[f]]
+                            fieldsSchema[f] = fieldSchema.map(addFullfield.bind(null, f))
+                        }
+                    }
+
+                    const schema = new Schema(fieldsSchema)
+                    schema.messages(options.messages)
+
+                    if (data.rule.options) {
+                        data.rule.options.messages = options.messages
+                        data.rule.options.error = options.error
+                    }
+
+                    schema.validate(data.value, data.rule.options || options, (errs) => {
+                        const finalErrors = []
+
+                        if (errors && errors.length) {
+                            finalErrors.push.apply(finalErrors, errors)
+                        }
+
+                        if (errs && errs.length) {
+                            finalErrors.push.apply(finalErrors, errs)
+                        }
+
+                        doIt(finalErrors.length ? finalErrors : null)
+                    })
+                }
+            }
+
+            let res
+
+            if (rule.asyncValidator) {
+                res = rule.asyncValidator(rule, data.value, cb, data.source, options)
+            } else if (rule.validator) {
+                res = rule.validator(rule, data.value, cb, data.source, options)
+
+                if (res === true) {
+                    cb()
+                } else if (res === false) {
+                    cb(rule.message || `${rule.field} fails`)
+                } else if (res instanceof Array) {
+                    cb(res)
+                } else if (res instanceof Error) {
+                    cb(res.message)
+                }
+            }
+
+            if (res && res.then) {
+                res.then(() => cb(), (e) => cb(e))
+            }
+        }, (results) => {
+            complete(results)
+        })
+    },
+    getType: function getType(rule) {
+        if (rule.type === undefined && rule.pattern instanceof RegExp) {
+            rule.type = 'pattern'
+        }
+
+        if (typeof rule.validator !== 'function' && rule.type && !validators.hasOwnProperty(rule.type)) {
+            throw new Error(format('Unknown rule type %s', rule.type))
+        }
+
+        return rule.type || 'string'
+    },
+    getValidationMethod: function getValidationMethod(rule) {
+        if (typeof rule.validator === 'function') {
+            return rule.validator
+        }
+
+        const keys = Object.keys(rule)
+        const messageIndex = keys.indexOf('message')
+
+        if (messageIndex !== -1) {
+            keys.splice(messageIndex, 1)
+        }
+
+        if (keys.length === 1 && keys[0] === 'required') {
+            return validators.required
+        }
+
+        return validators[this.getType(rule)] || false
+    }
+}
+
+Schema.register = function register(type, validator) {
+    if (typeof validator !== 'function') {
+        throw new Error('Cannot register a validator by type, validator is not a function')
+    }
+
+    validators[type] = validator
+}
+
+Schema.warning = warning
+Schema.messages = messages
+
+export default Schema
+// # sourceMappingURL=index.js.map
diff --git a/uni_modules/uview-plus/libs/util/calendar.js b/uni_modules/uview-plus/libs/util/calendar.js
new file mode 100644
index 0000000..5afcd30
--- /dev/null
+++ b/uni_modules/uview-plus/libs/util/calendar.js
@@ -0,0 +1,546 @@
+/**
+* @1900-2100区间内的公历、农历互转
+* @charset UTF-8
+* @github  https://github.com/jjonline/calendar.js
+* @Author  Jea杨(JJonline@JJonline.Cn)
+* @Time    2014-7-21
+* @Time    2016-8-13 Fixed 2033hex、Attribution Annals
+* @Time    2016-9-25 Fixed lunar LeapMonth Param Bug
+* @Time    2017-7-24 Fixed use getTerm Func Param Error.use solar year,NOT lunar year
+* @Version 1.0.3
+* @公历转农历:calendar.solar2lunar(1987,11,01); //[you can ignore params of prefix 0]
+* @农历转公历:calendar.lunar2solar(1987,09,10); //[you can ignore params of prefix 0]
+*/
+/* eslint-disable */
+var Calendar = {
+
+    /**
+        * 农历1900-2100的润大小信息表
+        * @Array Of Property
+        * @return Hex
+        */
+    lunarInfo: [0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2, // 1900-1909
+        0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977, // 1910-1919
+        0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, // 1920-1929
+        0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950, // 1930-1939
+        0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557, // 1940-1949
+        0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0, // 1950-1959
+        0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0, // 1960-1969
+        0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6, // 1970-1979
+        0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570, // 1980-1989
+        0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x05ac0, 0x0ab60, 0x096d5, 0x092e0, // 1990-1999
+        0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5, // 2000-2009
+        0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, // 2010-2019
+        0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530, // 2020-2029
+        0x05aa0, 0x076a3, 0x096d0, 0x04afb, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, // 2030-2039
+        0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0, // 2040-2049
+        /** Add By JJonline@JJonline.Cn**/
+        0x14b63, 0x09370, 0x049f8, 0x04970, 0x064b0, 0x168a6, 0x0ea50, 0x06b20, 0x1a6c4, 0x0aae0, // 2050-2059
+        0x0a2e0, 0x0d2e3, 0x0c960, 0x0d557, 0x0d4a0, 0x0da50, 0x05d55, 0x056a0, 0x0a6d0, 0x055d4, // 2060-2069
+        0x052d0, 0x0a9b8, 0x0a950, 0x0b4a0, 0x0b6a6, 0x0ad50, 0x055a0, 0x0aba4, 0x0a5b0, 0x052b0, // 2070-2079
+        0x0b273, 0x06930, 0x07337, 0x06aa0, 0x0ad50, 0x14b55, 0x04b60, 0x0a570, 0x054e4, 0x0d160, // 2080-2089
+        0x0e968, 0x0d520, 0x0daa0, 0x16aa6, 0x056d0, 0x04ae0, 0x0a9d4, 0x0a2d0, 0x0d150, 0x0f252, // 2090-2099
+        0x0d520], // 2100
+
+    /**
+        * 公历每个月份的天数普通表
+        * @Array Of Property
+        * @return Number
+        */
+    solarMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
+
+    /**
+        * 天干地支之天干速查表
+        * @Array Of Property trans["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"]
+        * @return Cn string
+        */
+    Gan: ['\u7532', '\u4e59', '\u4e19', '\u4e01', '\u620a', '\u5df1', '\u5e9a', '\u8f9b', '\u58ec', '\u7678'],
+
+    /**
+        * 天干地支之地支速查表
+        * @Array Of Property
+        * @trans["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"]
+        * @return Cn string
+        */
+    Zhi: ['\u5b50', '\u4e11', '\u5bc5', '\u536f', '\u8fb0', '\u5df3', '\u5348', '\u672a', '\u7533', '\u9149', '\u620c', '\u4ea5'],
+
+    /**
+        * 天干地支之地支速查表<=>生肖
+        * @Array Of Property
+        * @trans["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"]
+        * @return Cn string
+        */
+    Animals: ['\u9f20', '\u725b', '\u864e', '\u5154', '\u9f99', '\u86c7', '\u9a6c', '\u7f8a', '\u7334', '\u9e21', '\u72d7', '\u732a'],
+
+    /**
+        * 24节气速查表
+        * @Array Of Property
+        * @trans["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"]
+        * @return Cn string
+        */
+    solarTerm: ['\u5c0f\u5bd2', '\u5927\u5bd2', '\u7acb\u6625', '\u96e8\u6c34', '\u60ca\u86f0', '\u6625\u5206', '\u6e05\u660e', '\u8c37\u96e8', '\u7acb\u590f', '\u5c0f\u6ee1', '\u8292\u79cd', '\u590f\u81f3', '\u5c0f\u6691', '\u5927\u6691', '\u7acb\u79cb', '\u5904\u6691', '\u767d\u9732', '\u79cb\u5206', '\u5bd2\u9732', '\u971c\u964d', '\u7acb\u51ac', '\u5c0f\u96ea', '\u5927\u96ea', '\u51ac\u81f3'],
+
+    /**
+        * 1900-2100各年的24节气日期速查表
+        * @Array Of Property
+        * @return 0x string For splice
+        */
+    sTermInfo: ['9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f',
+        '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+        '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa',
+        '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f',
+        'b027097bd097c36b0b6fc9274c91aa', '9778397bd19801ec9210c965cc920e', '97b6b97bd19801ec95f8c965cc920f',
+        '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd197c36c9210c9274c91aa',
+        '97b6b97bd19801ec95f8c965cc920e', '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2',
+        '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec95f8c965cc920e', '97bcf97c3598082c95f8e1cfcc920f',
+        '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+        '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+        '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722',
+        '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f',
+        '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+        '97bcf97c359801ec95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+        '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd097bd07f595b0b6fc920fb0722',
+        '9778397bd097c36b0b6fc9210c8dc2', '9778397bd19801ec9210c9274c920e', '97b6b97bd19801ec95f8c965cc920f',
+        '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e',
+        '97b6b97bd19801ec95f8c965cc920f', '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2',
+        '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bd07f1487f595b0b0bc920fb0722',
+        '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+        '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+        '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',
+        '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f531b0b0bb0b6fb0722',
+        '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+        '97bcf7f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+        '97b6b97bd19801ec9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',
+        '9778397bd097c36b0b6fc9210c91aa', '97b6b97bd197c36c9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722',
+        '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e',
+        '97b6b7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2',
+        '9778397bd097c36b0b70c9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722',
+        '7f0e397bd097c35b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721',
+        '7f0e27f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+        '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',
+        '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',
+        '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721',
+        '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+        '97b6b7f0e47f531b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',
+        '9778397bd097c36b0b6fc9210c91aa', '97b6b7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',
+        '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '977837f0e37f149b0723b0787b0721',
+        '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c35b0b6fc9210c8dc2',
+        '977837f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722',
+        '7f0e397bd097c35b0b6fc9210c8dc2', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
+        '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '977837f0e37f14998082b0787b06bd',
+        '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',
+        '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',
+        '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
+        '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd',
+        '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',
+        '977837f0e37f14998082b0723b06bd', '7f07e7f0e37f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',
+        '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b0721',
+        '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f595b0b0bb0b6fb0722', '7f0e37f0e37f14898082b0723b02d5',
+        '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f531b0b0bb0b6fb0722',
+        '7f0e37f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
+        '7f0e37f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd',
+        '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35',
+        '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',
+        '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f149b0723b0787b0721',
+        '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0723b06bd',
+        '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', '7f0e37f0e366aa89801eb072297c35',
+        '7ec967f0e37f14998082b0723b06bd', '7f07e7f0e37f14998083b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',
+        '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14898082b0723b02d5', '7f07e7f0e37f14998082b0787b0721',
+        '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66aa89801e9808297c35', '665f67f0e37f14898082b0723b02d5',
+        '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66a449801e9808297c35',
+        '665f67f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
+        '7f0e36665b66a449801e9808297c35', '665f67f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd',
+        '7f07e7f0e47f531b0723b0b6fb0721', '7f0e26665b66a449801e9808297c35', '665f67f0e37f1489801eb072297c35',
+        '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722'],
+
+    /**
+        * 数字转中文速查表
+        * @Array Of Property
+        * @trans ['日','一','二','三','四','五','六','七','八','九','十']
+        * @return Cn string
+        */
+    nStr1: ['\u65e5', '\u4e00', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', '\u5341'],
+
+    /**
+        * 日期转农历称呼速查表
+        * @Array Of Property
+        * @trans ['初','十','廿','卅']
+        * @return Cn string
+        */
+    nStr2: ['\u521d', '\u5341', '\u5eff', '\u5345'],
+
+    /**
+        * 月份转农历称呼速查表
+        * @Array Of Property
+        * @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊']
+        * @return Cn string
+        */
+    nStr3: ['\u6b63', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', '\u5341', '\u51ac', '\u814a'],
+
+    /**
+        * 返回农历y年一整年的总天数
+        * @param lunar Year
+        * @return Number
+        * @eg:var count = calendar.lYearDays(1987) ;//count=387
+        */
+    lYearDays: function (y) {
+        var i; var sum = 348
+        for (i = 0x8000; i > 0x8; i >>= 1) { sum += (this.lunarInfo[y - 1900] & i) ? 1 : 0 }
+        return (sum + this.leapDays(y))
+    },
+
+    /**
+        * 返回农历y年闰月是哪个月;若y年没有闰月 则返回0
+        * @param lunar Year
+        * @return Number (0-12)
+        * @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6
+        */
+    leapMonth: function (y) { // 闰字编码 \u95f0
+        return (this.lunarInfo[y - 1900] & 0xf)
+    },
+
+    /**
+        * 返回农历y年闰月的天数 若该年没有闰月则返回0
+        * @param lunar Year
+        * @return Number (0、29、30)
+        * @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29
+        */
+    leapDays: function (y) {
+        if (this.leapMonth(y)) {
+            return ((this.lunarInfo[y - 1900] & 0x10000) ? 30 : 29)
+        }
+        return (0)
+    },
+
+    /**
+        * 返回农历y年m月(非闰月)的总天数,计算m为闰月时的天数请使用leapDays方法
+        * @param lunar Year
+        * @return Number (-1、29、30)
+        * @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29
+        */
+    monthDays: function (y, m) {
+        if (m > 12 || m < 1) { return -1 }// 月份参数从1至12,参数错误返回-1
+        return ((this.lunarInfo[y - 1900] & (0x10000 >> m)) ? 30 : 29)
+    },
+
+    /**
+        * 返回公历(!)y年m月的天数
+        * @param solar Year
+        * @return Number (-1、28、29、30、31)
+        * @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30
+        */
+    solarDays: function (y, m) {
+        if (m > 12 || m < 1) { return -1 } // 若参数错误 返回-1
+        var ms = m - 1
+        if (ms == 1) { // 2月份的闰平规律测算后确认返回28或29
+            return (((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)) ? 29 : 28)
+        } else {
+            return (this.solarMonth[ms])
+        }
+    },
+
+    /**
+       * 农历年份转换为干支纪年
+       * @param  lYear 农历年的年份数
+       * @return Cn string
+       */
+    toGanZhiYear: function (lYear) {
+        var ganKey = (lYear - 3) % 10
+        var zhiKey = (lYear - 3) % 12
+        if (ganKey == 0) ganKey = 10// 如果余数为0则为最后一个天干
+        if (zhiKey == 0) zhiKey = 12// 如果余数为0则为最后一个地支
+        return this.Gan[ganKey - 1] + this.Zhi[zhiKey - 1]
+    },
+
+    /**
+       * 公历月、日判断所属星座
+       * @param  cMonth [description]
+       * @param  cDay [description]
+       * @return Cn string
+       */
+    toAstro: function (cMonth, cDay) {
+        var s = '\u9b54\u7faf\u6c34\u74f6\u53cc\u9c7c\u767d\u7f8a\u91d1\u725b\u53cc\u5b50\u5de8\u87f9\u72ee\u5b50\u5904\u5973\u5929\u79e4\u5929\u874e\u5c04\u624b\u9b54\u7faf'
+        var arr = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22]
+        return s.substr(cMonth * 2 - (cDay < arr[cMonth - 1] ? 2 : 0), 2) + '\u5ea7'// 座
+    },
+
+    /**
+        * 传入offset偏移量返回干支
+        * @param offset 相对甲子的偏移量
+        * @return Cn string
+        */
+    toGanZhi: function (offset) {
+        return this.Gan[offset % 10] + this.Zhi[offset % 12]
+    },
+
+    /**
+        * 传入公历(!)y年获得该年第n个节气的公历日期
+        * @param y公历年(1900-2100);n二十四节气中的第几个节气(1~24);从n=1(小寒)算起
+        * @return day Number
+        * @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春
+        */
+    getTerm: function (y, n) {
+        if (y < 1900 || y > 2100) { return -1 }
+        if (n < 1 || n > 24) { return -1 }
+        var _table = this.sTermInfo[y - 1900]
+        var _info = [
+            parseInt('0x' + _table.substr(0, 5)).toString(),
+            parseInt('0x' + _table.substr(5, 5)).toString(),
+            parseInt('0x' + _table.substr(10, 5)).toString(),
+            parseInt('0x' + _table.substr(15, 5)).toString(),
+            parseInt('0x' + _table.substr(20, 5)).toString(),
+            parseInt('0x' + _table.substr(25, 5)).toString()
+        ]
+        var _calday = [
+            _info[0].substr(0, 1),
+            _info[0].substr(1, 2),
+            _info[0].substr(3, 1),
+            _info[0].substr(4, 2),
+
+            _info[1].substr(0, 1),
+            _info[1].substr(1, 2),
+            _info[1].substr(3, 1),
+            _info[1].substr(4, 2),
+
+            _info[2].substr(0, 1),
+            _info[2].substr(1, 2),
+            _info[2].substr(3, 1),
+            _info[2].substr(4, 2),
+
+            _info[3].substr(0, 1),
+            _info[3].substr(1, 2),
+            _info[3].substr(3, 1),
+            _info[3].substr(4, 2),
+
+            _info[4].substr(0, 1),
+            _info[4].substr(1, 2),
+            _info[4].substr(3, 1),
+            _info[4].substr(4, 2),
+
+            _info[5].substr(0, 1),
+            _info[5].substr(1, 2),
+            _info[5].substr(3, 1),
+            _info[5].substr(4, 2)
+        ]
+        return parseInt(_calday[n - 1])
+    },
+
+    /**
+        * 传入农历数字月份返回汉语通俗表示法
+        * @param lunar month
+        * @return Cn string
+        * @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月'
+        */
+    toChinaMonth: function (m) { // 月 => \u6708
+        if (m > 12 || m < 1) { return -1 } // 若参数错误 返回-1
+        var s = this.nStr3[m - 1]
+        s += '\u6708'// 加上月字
+        return s
+    },
+
+    /**
+        * 传入农历日期数字返回汉字表示法
+        * @param lunar day
+        * @return Cn string
+        * @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一'
+        */
+    toChinaDay: function (d) { // 日 => \u65e5
+        var s
+        switch (d) {
+            case 10:
+                s = '\u521d\u5341'; break
+            case 20:
+                s = '\u4e8c\u5341'; break
+                break
+            case 30:
+                s = '\u4e09\u5341'; break
+                break
+            default:
+                s = this.nStr2[Math.floor(d / 10)]
+                s += this.nStr1[d % 10]
+        }
+        return (s)
+    },
+
+    /**
+        * 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春”
+        * @param y year
+        * @return Cn string
+        * @eg:var animal = calendar.getAnimal(1987) ;//animal='兔'
+        */
+    getAnimal: function (y) {
+        return this.Animals[(y - 4) % 12]
+    },
+
+    /**
+        * 传入阳历年月日获得详细的公历、农历object信息 <=>JSON
+        * @param y  solar year
+        * @param m  solar month
+        * @param d  solar day
+        * @return JSON object
+        * @eg:console.log(calendar.solar2lunar(1987,11,01));
+        */
+    solar2lunar: function (y, m, d) { // 参数区间1900.1.31~2100.12.31
+        // 年份限定、上限
+        if (y < 1900 || y > 2100) {
+            return -1// undefined转换为数字变为NaN
+        }
+        // 公历传参最下限
+        if (y == 1900 && m == 1 && d < 31) {
+            return -1
+        }
+        // 未传参  获得当天
+        if (!y) {
+            var objDate = new Date()
+        } else {
+            var objDate = new Date(y, parseInt(m) - 1, d)
+        }
+        var i; var leap = 0; var temp = 0
+        // 修正ymd参数
+        var y = objDate.getFullYear()
+        var m = objDate.getMonth() + 1
+        var d = objDate.getDate()
+        var offset = (Date.UTC(objDate.getFullYear(), objDate.getMonth(), objDate.getDate()) - Date.UTC(1900, 0, 31)) / 86400000
+        for (i = 1900; i < 2101 && offset > 0; i++) {
+            temp = this.lYearDays(i)
+            offset -= temp
+        }
+        if (offset < 0) {
+            offset += temp; i--
+        }
+
+        // 是否今天
+        var isTodayObj = new Date()
+        var isToday = false
+        if (isTodayObj.getFullYear() == y && isTodayObj.getMonth() + 1 == m && isTodayObj.getDate() == d) {
+            isToday = true
+        }
+        // 星期几
+        var nWeek = objDate.getDay()
+        var cWeek = this.nStr1[nWeek]
+        // 数字表示周几顺应天朝周一开始的惯例
+        if (nWeek == 0) {
+            nWeek = 7
+        }
+        // 农历年
+        var year = i
+        var leap = this.leapMonth(i) // 闰哪个月
+        var isLeap = false
+
+        // 效验闰月
+        for (i = 1; i < 13 && offset > 0; i++) {
+            // 闰月
+            if (leap > 0 && i == (leap + 1) && isLeap == false) {
+                --i
+                isLeap = true; temp = this.leapDays(year) // 计算农历闰月天数
+            } else {
+                temp = this.monthDays(year, i)// 计算农历普通月天数
+            }
+            // 解除闰月
+            if (isLeap == true && i == (leap + 1)) { isLeap = false }
+            offset -= temp
+        }
+        // 闰月导致数组下标重叠取反
+        if (offset == 0 && leap > 0 && i == leap + 1) {
+            if (isLeap) {
+                isLeap = false
+            } else {
+                isLeap = true; --i
+            }
+        }
+        if (offset < 0) {
+            offset += temp; --i
+        }
+        // 农历月
+        var month = i
+        // 农历日
+        var day = offset + 1
+        // 天干地支处理
+        var sm = m - 1
+        var gzY = this.toGanZhiYear(year)
+
+        // 当月的两个节气
+        // bugfix-2017-7-24 11:03:38 use lunar Year Param `y` Not `year`
+        var firstNode = this.getTerm(y, (m * 2 - 1))// 返回当月「节」为几日开始
+        var secondNode = this.getTerm(y, (m * 2))// 返回当月「节」为几日开始
+
+        // 依据12节气修正干支月
+        var gzM = this.toGanZhi((y - 1900) * 12 + m + 11)
+        if (d >= firstNode) {
+            gzM = this.toGanZhi((y - 1900) * 12 + m + 12)
+        }
+
+        // 传入的日期的节气与否
+        var isTerm = false
+        var Term = null
+        if (firstNode == d) {
+            isTerm = true
+            Term = this.solarTerm[m * 2 - 2]
+        }
+        if (secondNode == d) {
+            isTerm = true
+            Term = this.solarTerm[m * 2 - 1]
+        }
+        // 日柱 当月一日与 1900/1/1 相差天数
+        var dayCyclical = Date.UTC(y, sm, 1, 0, 0, 0, 0) / 86400000 + 25567 + 10
+        var gzD = this.toGanZhi(dayCyclical + d - 1)
+        // 该日期所属的星座
+        var astro = this.toAstro(m, d)
+
+        return { 'lYear': year, 'lMonth': month, 'lDay': day, 'Animal': this.getAnimal(year), 'IMonthCn': (isLeap ? '\u95f0' : '') + this.toChinaMonth(month), 'IDayCn': this.toChinaDay(day), 'cYear': y, 'cMonth': m, 'cDay': d, 'gzYear': gzY, 'gzMonth': gzM, 'gzDay': gzD, 'isToday': isToday, 'isLeap': isLeap, 'nWeek': nWeek, 'ncWeek': '\u661f\u671f' + cWeek, 'isTerm': isTerm, 'Term': Term, 'astro': astro }
+    },
+
+    /**
+        * 传入农历年月日以及传入的月份是否闰月获得详细的公历、农历object信息 <=>JSON
+        * @param y  lunar year
+        * @param m  lunar month
+        * @param d  lunar day
+        * @param isLeapMonth  lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可]
+        * @return JSON object
+        * @eg:console.log(calendar.lunar2solar(1987,9,10));
+        */
+    lunar2solar: function (y, m, d, isLeapMonth) { // 参数区间1900.1.31~2100.12.1
+        var isLeapMonth = !!isLeapMonth
+        var leapOffset = 0
+        var leapMonth = this.leapMonth(y)
+        var leapDay = this.leapDays(y)
+        if (isLeapMonth && (leapMonth != m)) { return -1 }// 传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同
+        if (y == 2100 && m == 12 && d > 1 || y == 1900 && m == 1 && d < 31) { return -1 }// 超出了最大极限值
+        var day = this.monthDays(y, m)
+        var _day = day
+        // bugFix 2016-9-25
+        // if month is leap, _day use leapDays method
+        if (isLeapMonth) {
+            _day = this.leapDays(y, m)
+        }
+        if (y < 1900 || y > 2100 || d > _day) { return -1 }// 参数合法性效验
+
+        // 计算农历的时间差
+        var offset = 0
+        for (var i = 1900; i < y; i++) {
+            offset += this.lYearDays(i)
+        }
+        var leap = 0; var isAdd = false
+        for (var i = 1; i < m; i++) {
+            leap = this.leapMonth(y)
+            if (!isAdd) { // 处理闰月
+                if (leap <= i && leap > 0) {
+                    offset += this.leapDays(y); isAdd = true
+                }
+            }
+            offset += this.monthDays(y, i)
+        }
+        // 转换闰月农历 需补充该年闰月的前一个月的时差
+        if (isLeapMonth) { offset += day }
+        // 1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点)
+        var stmap = Date.UTC(1900, 1, 30, 0, 0, 0)
+        var calObj = new Date((offset + d - 31) * 86400000 + stmap)
+        var cY = calObj.getUTCFullYear()
+        var cM = calObj.getUTCMonth() + 1
+        var cD = calObj.getUTCDate()
+
+        return this.solar2lunar(cY, cM, cD)
+    }
+}
+
+export default Calendar
diff --git a/uni_modules/uview-plus/libs/util/emitter.js b/uni_modules/uview-plus/libs/util/emitter.js
new file mode 100644
index 0000000..1e64044
--- /dev/null
+++ b/uni_modules/uview-plus/libs/util/emitter.js
@@ -0,0 +1,51 @@
+/**
+ * 递归使用 call 方式this指向
+ * @param componentName // 需要找的组件的名称
+ * @param eventName // 事件名称
+ * @param params // 需要传递的参数
+ */
+function broadcast(componentName, eventName, params) {
+    // 循环子节点找到名称一样的子节点 否则 递归 当前子节点
+    this.$children.map((child) => {
+        if (componentName === child.$options.name) {
+            child.$emit.apply(child, [eventName].concat(params))
+        } else {
+            broadcast.apply(child, [componentName, eventName].concat(params))
+        }
+    })
+}
+export default {
+    methods: {
+        /**
+         * 派发 (向上查找) (一个)
+         * @param componentName // 需要找的组件的名称
+         * @param eventName // 事件名称
+         * @param params // 需要传递的参数
+         */
+        dispatch(componentName, eventName, params) {
+            let parent = this.$parent || this.$root// $parent 找到最近的父节点 $root 根节点
+            let { name } = parent.$options // 获取当前组件实例的name
+            // 如果当前有节点 && 当前没名称 且 当前名称等于需要传进来的名称的时候就去查找当前的节点
+            // 循环出当前名称的一样的组件实例
+            while (parent && (!name || name !== componentName)) {
+                parent = parent.$parent
+                if (parent) {
+                    name = parent.$options.name
+                }
+            }
+            // 有节点表示当前找到了name一样的实例
+            if (parent) {
+                parent.$emit.apply(parent, [eventName].concat(params))
+            }
+        },
+        /**
+         * 广播 (向下查找) (广播多个)
+         * @param componentName // 需要找的组件的名称
+         * @param eventName // 事件名称
+         * @param params // 需要传递的参数
+         */
+        broadcast(componentName, eventName, params) {
+            broadcast.call(this, componentName, eventName, params)
+        }
+    }
+}
diff --git a/uni_modules/uview-plus/libs/util/route.js b/uni_modules/uview-plus/libs/util/route.js
new file mode 100644
index 0000000..4e474f5
--- /dev/null
+++ b/uni_modules/uview-plus/libs/util/route.js
@@ -0,0 +1,124 @@
+/**
+ * 路由跳转方法,该方法相对于直接使用uni.xxx的好处是使用更加简单快捷
+ * 并且带有路由拦截功能
+ */
+import { queryParams, deepMerge, page } from '../function/index';
+class Router {
+    constructor() {
+        // 原始属性定义
+        this.config = {
+            type: 'navigateTo',
+            url: '',
+            delta: 1, // navigateBack页面后退时,回退的层数
+            params: {}, // 传递的参数
+            animationType: 'pop-in', // 窗口动画,只在APP有效
+            animationDuration: 300, // 窗口动画持续时间,单位毫秒,只在APP有效
+            intercept: false // 是否需要拦截
+        }
+        // 因为route方法是需要对外赋值给另外的对象使用,同时route内部有使用this,会导致route失去上下文
+        // 这里在构造函数中进行this绑定
+        this.route = this.route.bind(this)
+    }
+
+    // 判断url前面是否有"/",如果没有则加上,否则无法跳转
+    addRootPath(url) {
+        return url[0] === '/' ? url : `/${url}`
+    }
+
+    // 整合路由参数
+    mixinParam(url, params) {
+        url = url && this.addRootPath(url)
+
+        // 使用正则匹配,主要依据是判断是否有"/","?","="等,如“/page/index/index?name=mary"
+        // 如果有url中有get参数,转换后无需带上"?"
+        let query = ''
+        if (/.*\/.*\?.*=.*/.test(url)) {
+            // object对象转为get类型的参数
+            query = queryParams(params, false)
+            // 因为已有get参数,所以后面拼接的参数需要带上"&"隔开
+            return url += `&${query}`
+        }
+        // 直接拼接参数,因为此处url中没有后面的query参数,也就没有"?/&"之类的符号
+        query = queryParams(params)
+        return url += query
+    }
+
+    // 对外的方法名称
+    async route(options = {}, params = {}) {
+        // 合并用户的配置和内部的默认配置
+        let mergeConfig = {}
+
+        if (typeof options === 'string') {
+            // 如果options为字符串,则为route(url, params)的形式
+            mergeConfig.url = this.mixinParam(options, params)
+            mergeConfig.type = 'navigateTo'
+        } else {
+            mergeConfig = deepMerge(this.config, options)
+            // 否则正常使用mergeConfig中的url和params进行拼接
+            mergeConfig.url = this.mixinParam(options.url, options.params)
+        }
+
+        // 如果本次跳转的路径和本页面路径一致,不执行跳转,防止用户快速点击跳转按钮,造成多次跳转同一个页面的问题
+        if (mergeConfig.url === page()) return
+
+        if (params.intercept) {
+            this.config.intercept = params.intercept
+        }
+        // params参数也带给拦截器
+        mergeConfig.params = params
+        // 合并内外部参数
+        mergeConfig = deepMerge(this.config, mergeConfig)
+        // 判断用户是否定义了拦截器
+        if (typeof uni.$u.routeIntercept === 'function') {
+            // 定一个promise,根据用户执行resolve(true)或者resolve(false)来决定是否进行路由跳转
+            const isNext = await new Promise((resolve, reject) => {
+                uni.$u.routeIntercept(mergeConfig, resolve)
+            })
+            // 如果isNext为true,则执行路由跳转
+            isNext && this.openPage(mergeConfig)
+        } else {
+            this.openPage(mergeConfig)
+        }
+    }
+
+    // 执行路由跳转
+    openPage(config) {
+        // 解构参数
+        const {
+            url,
+            type,
+            delta,
+            animationType,
+            animationDuration
+        } = config
+        if (config.type == 'navigateTo' || config.type == 'to') {
+            uni.navigateTo({
+                url,
+                animationType,
+                animationDuration
+            })
+        }
+        if (config.type == 'redirectTo' || config.type == 'redirect') {
+            uni.redirectTo({
+                url
+            })
+        }
+        if (config.type == 'switchTab' || config.type == 'tab') {
+            uni.switchTab({
+                url
+            })
+        }
+        if (config.type == 'reLaunch' || config.type == 'launch') {
+            uni.reLaunch({
+                url
+            })
+        }
+        if (config.type == 'navigateBack' || config.type == 'back') {
+            uni.navigateBack({
+                delta
+            })
+        }
+    }
+}
+
+export default (new Router()).route
diff --git a/uni_modules/uview-plus/package.json b/uni_modules/uview-plus/package.json
new file mode 100644
index 0000000..6c89b3d
--- /dev/null
+++ b/uni_modules/uview-plus/package.json
@@ -0,0 +1,93 @@
+{
+	"id": "uview-plus",
+	"name": "uview-plus",
+	"displayName": "uview-plus3.0重磅发布,全面的Vue3移动组件库。",
+	"version": "3.2.14",
+	"description": "uview-plus已兼容vue3,全面的组件和便捷的工具会让您信手拈来,如鱼得水",
+	"keywords": [
+        "uview",
+        "uview-plus",
+        "ui",
+        "ui",
+        "uni-app",
+        "uni-app",
+        "ui"
+    ],
+    "main": "index.js",
+	"repository": "https://github.com/ijry/uview-plus",
+	"engines": {
+		"HBuilderX": "^3.1.0"
+	},
+    "dcloudext": {
+        "sale": {
+			"regular": {
+				"price": "0.00"
+			},
+			"sourcecode": {
+				"price": "0.00"
+			}
+		},
+		"contact": {
+			"qq": "598821125"
+		},
+		"declaration": {
+			"ads": "无",
+			"data": "无",
+			"permissions": "无"
+		},
+        "npmurl": "https://www.npmjs.com/package/uview-plus",
+        "type": "component-vue"
+	},
+	"uni_modules": {
+		"dependencies": [],
+		"encrypt": [],
+		"platforms": {
+			"cloud": {
+				"tcb": "y",
+                "aliyun": "y",
+                "alipay": "n"
+			},
+			"client": {
+				"Vue": {
+					"vue2": "n",
+					"vue3": "y"
+				},
+				"App": {
+					"app-vue": "y",
+					"app-nvue": "y"
+				},
+				"H5-mobile": {
+					"Safari": "y",
+					"Android Browser": "y",
+					"微信浏览器(Android)": "y",
+					"QQ浏览器(Android)": "y"
+				},
+				"H5-pc": {
+					"Chrome": "y",
+					"IE": "y",
+					"Edge": "y",
+					"Firefox": "y",
+					"Safari": "y"
+				},
+				"小程序": {
+					"微信": "y",
+					"阿里": "y",
+					"百度": "y",
+					"字节跳动": "y",
+					"QQ": "y"
+				},
+				"快应用": {
+					"华为": "y",
+					"联盟": "y"
+				}
+			}
+		}
+	},
+	"dependencies": {
+		"clipboard": "^2.0.11",
+		"dayjs": "^1.11.3"
+	},
+	"publishConfig": {
+	    "registry": "https://registry.npmjs.org/"
+	}
+}
diff --git a/uni_modules/uview-plus/theme.scss b/uni_modules/uview-plus/theme.scss
new file mode 100644
index 0000000..331b30f
--- /dev/null
+++ b/uni_modules/uview-plus/theme.scss
@@ -0,0 +1,44 @@
+// 此文件为uView的主题变量,这些变量目前只能通过uni.scss引入才有效,另外由于
+// uni.scss中引入的样式会同时混入到全局样式文件和单独每一个页面的样式中,造成微信程序包太大,
+// 故uni.scss只建议放scss变量名相关样式,其他的样式可以通过main.js或者App.vue引入
+
+$u-main-color: #303133;
+$u-content-color: #606266;
+$u-tips-color: #909193;
+$u-light-color: #c0c4cc;
+$u-border-color: #dadbde;
+$u-bg-color: #f3f4f6;
+$u-disabled-color: #c8c9cc;
+
+$u-primary: #3c9cff;
+$u-primary-dark: #398ade;
+$u-primary-disabled: #9acafc;
+$u-primary-light: #ecf5ff;
+
+$u-warning: #f9ae3d;
+$u-warning-dark: #f1a532;
+$u-warning-disabled: #f9d39b;
+$u-warning-light: #fdf6ec;
+
+$u-success: #5ac725;
+$u-success-dark: #53c21d;
+$u-success-disabled: #a9e08f;
+$u-success-light: #f5fff0;
+
+$u-error: #f56c6c;
+$u-error-dark: #e45656;
+$u-error-disabled: #f7b2b2;
+$u-error-light: #fef0f0;
+
+$u-info: #909399;
+$u-info-dark: #767a82;
+$u-info-disabled: #c4c6c9;
+$u-info-light: #f4f4f5;
+
+// scss混入,为了少写几行#ifndef
+@mixin flex($direction: row) {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	flex-direction: $direction;
+}
diff --git a/uni_modules/uview-plus/types/comps.d.ts b/uni_modules/uview-plus/types/comps.d.ts
new file mode 100644
index 0000000..61ece4a
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps.d.ts
@@ -0,0 +1,99 @@
+declare module '@vue/runtime-core' {
+  export interface GlobalComponents {
+    // 基础组件
+    ['up-icon']: typeof import('./comps/icon')['Icon']
+    ['up-image']: typeof import('./comps/image')['Image']
+    ['up-button']: typeof import('./comps/button')['Button']
+    ['up-text']: typeof import('./comps/text')['Text']
+    ['up-row']: typeof import('./comps/row')['Row']
+    ['up-col']: typeof import('./comps/col')['Col']
+    ['up-cell']: typeof import('./comps/cell')['Cell']
+    ['up-cell-group']: typeof import('./comps/cellGroup')['CellGroup']
+    ['up-badge']: typeof import('./comps/badge')['Badge']
+    ['up-tag']: typeof import('./comps/tag')['Tag']
+    ['up-loading-icon']: typeof import('./comps/loadingIcon')['LoadingIcon']
+    ['up-loading-page']: typeof import('./comps/loadingPage')['LoadingPage']
+
+    // 表单组件
+    ['up-form']: typeof import('./comps/form')['Form']
+    ['up-form-item']: typeof import('./comps/formItem')['FormItem']
+    ['up-calendar']: typeof import('./comps/calendar')['Calendar']
+    ['up-keyboard']: typeof import('./comps/keyboard')['Keyboard']
+    ['up-picker']: typeof import('./comps/picker')['Picker']
+    ['up-datetime-picker']: typeof import('./comps/datetimePicker')['DatetimePicker']
+    ['up-rate']: typeof import('./comps/rate')['Rate']
+    ['up-search']: typeof import('./comps/search')['Search']
+    ['up-number-box']: typeof import('./comps/numberBox')['NumberBox']
+    ['up-upload']: typeof import('./comps/upload')['Upload']
+    ['up-code']: typeof import('./comps/code')['Code']
+    ['up-input']: typeof import('./comps/input')['Input']
+    ['up-textarea']: typeof import('./comps/textarea')['Textarea']
+    ['up-checkbox']: typeof import('./comps/checkbox')['Checkbox']
+    ['up-checkbox-group']: typeof import('./comps/checkboxGroup')['CheckboxGroup']
+    ['up-radio']: typeof import('./comps/radio')['Radio']
+    ['up-radio-group']: typeof import('./comps/radioGroup')['RadioGroup']
+    ['up-switch']: typeof import('./comps/switch')['Switch']
+    ['up-slider']: typeof import('./comps/slider')['Slider']
+    ['up-album']: typeof import('./comps/album')['Album']
+
+    // 数据组件
+    ['up-list']: typeof import('./comps/list')['List']
+    ['up-list-item']: typeof import('./comps/listItem')['ListItem']
+    ['up-line-progress']: typeof import('./comps/lineProgress')['LineProgress']
+    ['up-count-down']: typeof import('./comps/countDown')['CountDown']
+    ['up-count-to']: typeof import('./comps/countTo')['CountTo']
+
+    // 反馈组件
+    ['up-tooltip']: typeof import('./comps/tooltip')['Tooltip']
+    ['up-action-sheet']: typeof import('./comps/actionSheet')['ActionSheet']
+    ['up-alert']: typeof import('./comps/alert')['Alert']
+    ['up-toast']: typeof import('./comps/toast')['Toast']
+    ['up-notice-bar']: typeof import('./comps/noticeBar')['NoticeBar']
+    ['up-notify']: typeof import('./comps/notify')['Notify']
+    ['up-swipe-action']: typeof import('./comps/swipeAction')['SwipeAction']
+    ['up-swipe-action-item']: typeof import('./comps/swipeActionItem')['SwipeActionItem']
+    ['up-collapse']: typeof import('./comps/collapse')['Collapse']
+    ['up-collapse-item']: typeof import('./comps/collapseItem')['CollapseItem']
+    ['up-popup']: typeof import('./comps/popup')['Popup']
+    ['up-modal']: typeof import('./comps/modal')['Modal']
+
+    // 布局组件
+    ['up-scroll-list']: typeof import('./comps/scrollList')['ScrollList']
+    ['up-line']: typeof import('./comps/line')['Line']
+    ['up-overlay']: typeof import('./comps/overlay')['Overlay']
+    ['up-no-network']: typeof import('./comps/noNetwork')['NoNetwork']
+    ['up-grid']: typeof import('./comps/grid')['Grid']
+    ['up-grid-item']: typeof import('./comps/gridItem')['GridItem']
+    ['up-swiper']: typeof import('./comps/swiper')['Swiper']
+    ['up-skeleton']: typeof import('./comps/skeleton')['Skeleton']
+    ['up-sticky']: typeof import('./comps/sticky')['Sticky']
+    ['up-divider']: typeof import('./comps/divider')['Divider']
+
+    // 导航组件
+    ['up-tabbar']: typeof import('./comps/tabbar')['Tabbar']
+    ['up-tabbar-item']: typeof import('./comps/tabbarItem')['TabbarItem']
+    ['up-back-top']: typeof import('./comps/backTop')['BackTop']
+    ['up-navbar']: typeof import('./comps/navbar')['Navbar']
+    ['up-tabs']: typeof import('./comps/tabs')['Tabs']
+    ['up-subsection']: typeof import('./comps/subsection')['Subsection']
+    ['up-index-list']: typeof import('./comps/indexList')['IndexList']
+    ['up-index-item']: typeof import('./comps/indexItem')['IndexItem']
+    ['up-index-anchor']: typeof import('./comps/indexAnchor')['IndexAnchor']
+    ['up-steps']: typeof import('./comps/steps')['Steps']
+    ['up-steps-item']: typeof import('./comps/stepsItem')['StepsItem']
+    ['up-empty']: typeof import('./comps/empty')['Empty']
+
+    // 其他组件
+    ['up-parse']: typeof import('./comps/parse')['Parse']
+    ['up-code-input']: typeof import('./comps/codeInput')['CodeInput']
+    ['up-load-more']: typeof import('./comps/loadMore')['LoadMore']
+    ['up-read-more']: typeof import('./comps/readMore')['ReadMore']
+    ['up-gap']: typeof import('./comps/gap')['Gap']
+    ['up-avatar']: typeof import('./comps/avatar')['Avatar']
+    ['up-avatar-group']: typeof import('./comps/avatarGroup')['AvatarGroup']
+    ['up-link']: typeof import('./comps/link')['Link']
+    ['up-transition']: typeof import('./comps/transition')['Transition']
+  }
+}
+
+export {}
diff --git a/uni_modules/uview-plus/types/comps/_common.d.ts b/uni_modules/uview-plus/types/comps/_common.d.ts
new file mode 100644
index 0000000..03cb105
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/_common.d.ts
@@ -0,0 +1,9 @@
+export interface AllowedComponentProps {
+  class?: unknown;
+  style?: unknown;
+}
+
+export interface VNodeProps {
+  key?: string | number | symbol;
+  ref?: unknown;
+}
diff --git a/uni_modules/uview-plus/types/comps/actionSheet.d.ts b/uni_modules/uview-plus/types/comps/actionSheet.d.ts
new file mode 100644
index 0000000..12c3ae1
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/actionSheet.d.ts
@@ -0,0 +1,121 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface ActionSheetProps {
+  /**
+   * 是否展示
+   * @default false
+   */
+  show?: boolean
+  /**
+   * 设置标题
+   */
+  title?: string
+  /**
+   * 选项上方的描述信息
+   */
+  description?: string
+  /**
+   * 按钮的文字数组
+   * @default []
+   */
+  actions?: any[]
+  /**
+   * 取消按钮的文字,不为空时显示按钮
+   */
+  cancelText?: string
+  /**
+   * 点击某个菜单项时是否关闭弹窗
+   */
+  closeOnClickAction?: string
+  /**
+   * 是否开启底部安全区适配
+   * @default false
+   */
+  safeAreaInsetBottom?: boolean
+  /**
+   * 小程序的打开方式
+   */
+  openType?: string
+  /**
+   * 点击遮罩是否允许关闭
+   */
+  closeOnClickOverlay?: boolean
+  /**
+   * 圆角值,默认无圆角
+   * @default 0
+   */
+  round?: string | number
+  /**
+   * 指定返回用户信息的语言
+   * @default "en"
+   */
+  lang?: 'zh_CN' | 'zh_TW' | 'en'
+  /**
+   * 会话来源,open-type="contact"时有效。只微信小程序有效
+   */
+  sessionFrom?: string
+  /**
+   * 会话内消息卡片标题,openType="contact"时有效
+   */
+  sendMessageTitle?: string
+  /**
+   * 会话内消息卡片点击跳转小程序路径,openType="contact"时有效
+   */
+  sendMessagePath?: string
+  /**
+   * 会话内消息卡片图片,openType="contact"时有效
+   */
+  sendMessageImg?: string
+  /**
+   * 是否显示会话内消息卡片,设置此参数为 true,用户进入客服会话会在右下角显示"可能要发送的小程序"提示,用户点击后可以快速发送小程序消息,openType="contact"时有效
+   * @default false
+   */
+  showMessageCard?: boolean
+  /**
+   * 打开 APP 时,向 APP 传递的参数,openType=launchApp 时有效
+   */
+  appParameter?: string
+  /**
+   * 点击ActionSheet列表项时触发
+   */
+  onSelect?: () => any
+  /**
+   * 点击取消按钮时触发
+   */
+  onClose?: () => any
+  /**
+   * 获取用户信息回调,openType="getUserInfo"时有效
+   * @param detail 用户信息
+   */
+  onGetuserinfo?: (detail: any) => any
+  /**
+   * 客服消息回调,openType="contact"时有效
+   */
+  onContact?: () => any
+  /**
+   * 获取用户手机号回调,openType="getPhoneNumber"时有效
+   */
+  onGetphonenumber?: () => any
+  /**
+   * 当使用开放能力时,发生错误的回调
+   */
+  onError?: (...args: any) => any
+  /**
+   * 在打开授权设置页并关闭后回调
+   */
+  onOpensetting?: (...args: any) => any
+  /**
+   * 打开 APP 成功的回调
+   */
+  onLaunchapp?: (...args: any) => any
+}
+
+declare interface _ActionSheet {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      ActionSheetProps
+  }
+}
+
+export declare const ActionSheet: _ActionSheet
diff --git a/uni_modules/uview-plus/types/comps/album.d.ts b/uni_modules/uview-plus/types/comps/album.d.ts
new file mode 100644
index 0000000..16a857f
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/album.d.ts
@@ -0,0 +1,72 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface AlbumProps {
+  /**
+   * 图片地址列表
+   */
+  urls?: string[] | Record<string, any>[]
+  /**
+   * 指定从数组的对象元素中读取哪个属性作为图片地址
+   */
+  keyName?: string
+  /**
+   * 单图时,图片长边的长度
+   * @default 180
+   */
+  singleSize?: string | number
+  /**
+   * 多图时,图片边长
+   * @default 70
+   */
+  multipleSize?: string | number
+  /**
+   * 多图时,图片水平和垂直之间的间隔
+   * @default 6
+   */
+  space?: string | number
+  /**
+   * 单图时,图片缩放裁剪的模式
+   * @default "scaleToFill"
+   */
+  singleMode?: ImageMode
+  /**
+   * 多图时,图片缩放裁剪的模式
+   * @default "aspectFill"
+   */
+  multipleMode?: ImageMode
+  /**
+   * 最多展示的图片数量,超出时最后一个位置将会显示剩余图片数量
+   * @default 9
+   */
+  maxCount?: string | number
+  /**
+   * 是否可以预览图片
+   * @default true
+   */
+  previewFullImage?: boolean
+  /**
+   * 每行展示图片数量,如设置,singleSize和multipleSize将会无效
+   * @default 3
+   */
+  rowCount?: string | number
+  /**
+   * 超出maxCount时是否显示查看更多的提示
+   * @default true
+   */
+  showMore?: boolean
+  /**
+   * 某些特殊的情况下,需要让文字与相册的宽度相等,这里事件的形式对外发送
+   * @param width 宽度
+   */
+  onAlbumWidth?: (width: any) => any
+}
+
+declare interface _Album {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      AlbumProps
+  }
+}
+
+export declare const Album: _Album
diff --git a/uni_modules/uview-plus/types/comps/alert.d.ts b/uni_modules/uview-plus/types/comps/alert.d.ts
new file mode 100644
index 0000000..b8b5541
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/alert.d.ts
@@ -0,0 +1,55 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface AlertProps {
+  /**
+   * 显示的文字
+   */
+  title?: string
+  /**
+   * 使用预设的颜色
+   * @default "warning"
+   */
+  type?: 'warning' | 'success' | 'primary' | 'error' | 'info'
+  /**
+   * 辅助性文字,颜色比`title`浅一点,字号也小一点,可选
+   */
+  description?: string
+  /**
+   * 关闭按钮(默认为叉号icon图标)
+   * @default false
+   */
+  closable?: boolean
+  /**
+   * 是否显示左边的辅助图标
+   * @default false
+   */
+  showIcon?: boolean
+  /**
+   * 多图时,图片缩放裁剪的模式
+   */
+  effect?: 'light' | 'dark'
+  /**
+   * 文字是否居中
+   * @default false
+   */
+  center?: boolean
+  /**
+   * 字体大小
+   * @default 14
+   */
+  fontSize?: string | number
+  /**
+   * 点击组件时触发
+   */
+  onClick?: () => any
+}
+
+declare interface _Alert {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      AlertProps
+  }
+}
+
+export declare const Alert: _Alert
diff --git a/uni_modules/uview-plus/types/comps/avatar.d.ts b/uni_modules/uview-plus/types/comps/avatar.d.ts
new file mode 100644
index 0000000..bc3ff36
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/avatar.d.ts
@@ -0,0 +1,85 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+import { ImageMode } from './image'
+
+declare interface AvatarProps {
+  /**
+   * 头像路径,如加载失败,将会显示默认头像(不能为相对路径)
+   */
+  src?: string
+  /**
+   * 头像形状
+   * @default "circle"
+   */
+  shape?: 'circle' | 'square'
+  /**
+   * 头像尺寸
+   * @default 40
+   */
+  size?: 'large' | 'default' | 'mini' | number
+  /**
+   * 裁剪类型
+   * @default "scaleToFill"
+   */
+  mode?: ImageMode
+  /**
+   * 用文字替代图片,级别优先于`src`
+   */
+  text?: string
+  /**
+   * 背景颜色
+   * @default "#c0c4cc"
+   */
+  bgColor?: string
+  /**
+   * 文字颜色
+   * @default "#fff"
+   */
+  color?: string
+  /**
+   * 文字大小
+   * @default 18
+   */
+  fontSize?: string | number
+  /**
+   * 显示的图标
+   */
+  icon?: string
+  /**
+   * 显示小程序头像,只对百度,微信,QQ小程序有效
+   * @default false
+   */
+  mpAvatar?: boolean
+  /**
+   * 是否使用随机背景色
+   * @default false
+   */
+  randomBgColor?: boolean
+  /**
+   * 加载失败的默认头像(组件有内置默认图片)
+   */
+  defaultUrl?: string
+  /**
+   * 如果配置了randomBgColor为true,且配置了此值,则从默认的背景色数组中取出对应索引的颜色值,取值0-19之间
+   */
+  colorIndex?: string | number
+  /**
+   * 组件标识符
+   * @default "level"
+   */
+  name?: string
+  /**
+   * 头像被点击
+   * @param index 用户传递的标识符
+   */
+  onClick?: (index: any) => any
+}
+
+declare interface _Avatar {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      AvatarProps
+  }
+}
+
+export declare const Avatar: _Avatar
diff --git a/uni_modules/uview-plus/types/comps/avatarGroup.d.ts b/uni_modules/uview-plus/types/comps/avatarGroup.d.ts
new file mode 100644
index 0000000..e9ff4c4
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/avatarGroup.d.ts
@@ -0,0 +1,62 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+import { ImageMode } from './image'
+
+declare interface AvatarGroupProps {
+  /**
+   * 头像图片组
+   * @default []
+   */
+  urls?: string[]
+  /**
+   * 最多展示的头像数量
+   * @default 5
+   */
+  maxCount?: string | number
+  /**
+   * 头像形状
+   * @default "circle"
+   */
+  shape?: 'circle' | 'square'
+  /**
+   * 裁剪模式
+   * @default "aspectFill"
+   */
+  mode?: ImageMode
+  /**
+   * 超出maxCount时是否显示查看更多的提示
+   * @default true
+   */
+  showMore?: boolean
+  /**
+   * 头像大小
+   * @default 40
+   */
+  size?: string | number
+  /**
+   * 指定从数组的对象元素中读取哪个属性作为图片地址
+   */
+  keyName?: string
+  /**
+   * 头像之间的遮挡比例(0.4代表遮挡40%)
+   * @default 0.5
+   */
+  gap?: string | number
+  /**
+   * 需额外显示的值,如设置则优先于内部的`urls.length - maxCount`值
+   */
+  extraValue?: string | number
+  /**
+   * 头像组更多点击
+   */
+  onShowMore?: () => any
+}
+
+declare interface _AvatarGroup {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      AvatarGroupProps
+  }
+}
+
+export declare const AvatarGroup: _AvatarGroup
diff --git a/uni_modules/uview-plus/types/comps/backTop.d.ts b/uni_modules/uview-plus/types/comps/backTop.d.ts
new file mode 100644
index 0000000..d41cbe6
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/backTop.d.ts
@@ -0,0 +1,74 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface BackTopProps {
+  /**
+   * 按钮形状
+   * @default "circle"
+   */
+  mode?: 'circle' | 'square'
+  /**
+   * uView内置图标名称,或图片路径
+   * @default "arrow-upward"
+   */
+  icon?: string
+  /**
+   * 返回顶部按钮的提示文字
+   */
+  text?: string
+  /**
+   * 返回顶部过程中的过渡时间,单位ms
+   * @default 100
+   */
+  duration?: string | number
+  /**
+   * 页面的滚动距离,通过`onPageScroll`生命周期获取
+   * @default 0
+   */
+  scrollTop?: string | number
+  /**
+   * 滚动条滑动多少距离时显示,单位rpx
+   * @default 400
+   */
+  top?: string | number
+  /**
+   * 返回按钮位置到屏幕底部的距离,单位rpx
+   * @default 100
+   */
+  bottom?: string | number
+  /**
+   * 返回按钮位置到屏幕右边的距离,单位rpx
+   * @default 20
+   */
+  right?: string | number
+  /**
+   * 返回顶部按钮的层级
+   * @default 9
+   */
+  zIndex?: string | number
+  /**
+   * 图标的样式
+   */
+  iconStyle?: unknown
+  /**
+   * 按钮外层的自定义样式
+   */
+  customStyle?: unknown
+}
+
+declare interface BackTopSlots {
+  /**
+   * 自定义返回按钮的所有内容
+   */
+  ['default']?: () => any
+}
+
+declare interface _BackTop {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      BackTopProps
+    $slots: BackTopSlots
+  }
+}
+
+export declare const BackTop: _BackTop
diff --git a/uni_modules/uview-plus/types/comps/badge.d.ts b/uni_modules/uview-plus/types/comps/badge.d.ts
new file mode 100644
index 0000000..35e434f
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/badge.d.ts
@@ -0,0 +1,76 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface BadgeProps {
+  /**
+   * 不展示数字,只有一个小点
+   * @default false
+   */
+  isDot?: boolean
+  /**
+   * 展示的数字,大于`overflowCount`时显示为`${overflowCount}+`,为`0`且`show-zero`为`false`时隐藏
+   */
+  value?: string | number
+  /**
+   * 组件是否显示
+   * @default true
+   */
+  show?: boolean
+  /**
+   * 最大值,超过最大值会显示 '{max}+'
+   * @default 99
+   */
+  max?: string | number
+  /**
+   * 主题类型
+   * @default "error"
+   */
+  type?: 'error' | 'warning' | 'success' | 'primary' | 'info'
+  /**
+   * 当数值为 0 时,是否展示 Badge
+   * @default false
+   */
+  showZero?: boolean
+  /**
+   * 背景颜色,优先级比`type`高,如设置,`type`参数会失效
+   */
+  bgColor?: string
+  /**
+   * 字体颜色
+   * @default "#fff"
+   */
+  color?: string
+  /**
+   * 徽标形状,circle-四角均为圆角,horn-左下角为直角
+   * @default "circle"
+   */
+  shape?: 'circle' | 'horn'
+  /**
+   * 置数字的显示方式,详细见[文档](https://www.uviewui.com/components/badge.html#%E8%AE%BE%E7%BD%AE%E6%95%B0%E5%AD%97%E7%9A%84%E6%98%BE%E7%A4%BA%E6%96%B9%E5%BC%8F-overflow-ellipsis-limit)
+   * @default "overflow"
+   */
+  numberType?: 'overflow' | 'ellipsis' | 'limit'
+  /**
+   * 设置badge的位置偏移,格式为 [x, y],也即设置的为`top`和`right`的值,`absolute`为`true`时有效
+   */
+  offset?: string[]
+  /**
+   * 是否反转背景和字体颜色
+   * @default false
+   */
+  inverted?: boolean
+  /**
+   * 组件是否绝对定位,为`true`时,`offset`参数才有效
+   * @default false
+   */
+  absolute?: boolean
+}
+
+declare interface _Badge {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      BadgeProps
+  }
+}
+
+export declare const Badge: _Badge
diff --git a/uni_modules/uview-plus/types/comps/button.d.ts b/uni_modules/uview-plus/types/comps/button.d.ts
new file mode 100644
index 0000000..db4bf36
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/button.d.ts
@@ -0,0 +1,169 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface ButtonProps {
+  /**
+   * 是否显示按钮的细边框
+   * @default true
+   */
+  hairline?: boolean
+  /**
+   * 按钮的样式类型
+   * @default "info"
+   */
+  type?: 'info' | 'primary' | 'error' | 'warning' | 'success'
+  /**
+   * 按钮的大小
+   * @default "normal"
+   */
+  size?: 'normal' | 'large' | 'mini'
+  /**
+   * 按钮外观形状
+   * @default "square"
+   */
+  shape?: 'square' | 'circle'
+  /**
+   * 按钮是否镂空
+   * @default false
+   */
+  plain?: boolean
+  /**
+   * 是否禁用
+   * @default false
+   */
+  disabled?: boolean
+  /**
+   * 按钮名称前是否带 loading 图标
+   * @default false
+   */
+  loading?: boolean
+  /**
+   * 加载中提示文字
+   */
+  loadingText?: string
+  /**
+   * 加载状态图标类型
+   * @default "spinner"
+   */
+  loadingMode?: string
+  /**
+   * 加载图标大小
+   * @default 15
+   */
+  loadingSize?: string | number
+  /**
+   * 开放能力,具体请看 [button](https://uniapp.dcloud.net.cn/component/button.html#open-type-%E6%9C%89%E6%95%88%E5%80%BC)
+   */
+  openType?: string
+  /**
+   * 用于 <form> 组件
+   */
+  formType?: 'submit' | 'reset'
+  /**
+   * 打开 APP 时,向 APP 传递的参数,open-type=launchApp时有效 (注:只微信小程序、QQ小程序有效)
+   */
+  appParameter?: string
+  /**
+   * 指定是否阻止本节点的祖先节点出现点击态,微信小程序有效
+   * @default true
+   */
+  hoverStopPropagation?: boolean
+  /**
+   * 指定返回用户信息的语言
+   * @default "en"
+   */
+  lang?: 'en' | 'zh_CN' | 'zh_TW'
+  /**
+   * 会话来源,openType="contact"时有效
+   */
+  sessionFrom?: string
+  /**
+   * 会话内消息卡片标题,openType="contact"时有效
+   */
+  sendMessageTitle?: string
+  /**
+   * 会话内消息卡片点击跳转小程序路径,openType="contact"时有效
+   */
+  sendMessagePath?: string
+  /**
+   * 会话内消息卡片图片,openType="contact"时有效
+   */
+  sendMessageImg?: string
+  /**
+   * 是否显示会话内消息卡片,设置此参数为 true,用户进入客服会话会在右下角显示"可能要发送的小程序"提示,用户点击后可以快速发送小程序消息,openType="contact"时有效
+   */
+  showMessageCard?: string
+  /**
+   * 额外传参参数,用于小程序的data-xxx属性,通过target.dataset.name获取
+   */
+  dataName?: string
+  /**
+   * 节流,一定时间内只能触发一次,单位毫秒
+   * @default 0
+   */
+  throttleTime?: string | number
+  /**
+   * 按住后多久出现点击态,单位毫秒
+   * @default 0
+   */
+  hoverStartTime?: string | number
+  /**
+   * 手指松开后点击态保留时间,单位毫秒
+   * @default 200
+   */
+  hoverStayTime?: string | number
+  /**
+   * 	按钮文字,之所以通过props传入,是因为slot传入的话(注:nvue中无法控制文字的样式)
+   */
+  text?: string | number
+  /**
+   * 按钮图标
+   */
+  icon?: string
+  /**
+   * 按钮颜色
+   */
+  iconColor?: string
+  /**
+   * 按钮颜色,支持传入linear-gradient渐变色
+   */
+  color?: string
+  /**
+   * 定义需要用到的外部样式
+   */
+  customStyle?: unknown
+  /**
+   * 按钮点击,请勿使用@tap点击事件,微信小程序无效,返回值为点击事件及参数
+   */
+  onClick?: (...args: any) => any
+  /**
+   * open-type="getPhoneNumber"时有效
+   */
+  onGetphonenumber?: (...args: any) => any
+  /**
+   * 获取用户信息回调,openType="getUserInfo"时有效
+   * @param detail 用户信息
+   */
+  onGetuserinfo?: (detail: any) => any
+  /**
+   * 当使用开放能力时,发生错误的回调
+   */
+  onError?: (...args: any) => any
+  /**
+   * 在打开授权设置页并关闭后回调
+   */
+  onOpensetting?: (...args: any) => any
+  /**
+   * 打开 APP 成功的回调
+   */
+  onLaunchapp?: (...args: any) => any
+}
+
+declare interface _Button {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      ButtonProps
+  }
+}
+
+export declare const Button: _Button
diff --git a/uni_modules/uview-plus/types/comps/calendar.d.ts b/uni_modules/uview-plus/types/comps/calendar.d.ts
new file mode 100644
index 0000000..239d23d
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/calendar.d.ts
@@ -0,0 +1,164 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface CalendarProps {
+  /**
+   * 标题内容
+   * @default "日期选择"
+   */
+  title?: string
+  /**
+   * 是否显示标题
+   * @default true
+   */
+  showTitle?: boolean
+  /**
+   * 是否显示副标题
+   * @default true
+   */
+  showSubtitle?: boolean
+  /**
+   * 日期类型选择
+   * @default 'single
+   */
+  mode?: 'single' | 'multiple' | 'range'
+  /**
+   * mode=range时,第一个日期底部的提示文字
+   * @default "开始"
+   */
+  startText?: string
+  /**
+   * mode=range时,最后一个日期底部的提示文字
+   * @default "结束"
+   */
+  endText?: string
+  /**
+   * 自定义列表
+   */
+  customList?: any[]
+  /**
+   * 主题色,对底部按钮和选中日期有效
+   * @default "#3c9cff"
+   */
+  color?: string
+  /**
+   * 最小的可选日期
+   * @default 0
+   */
+  minDate?: string | number
+  /**
+   * 最大可选日期
+   * @default 0
+   */
+  maxDate?: string | number
+  /**
+   * 默认选中的日期,mode为multiple或range是必须为数组格式
+   * @default null
+   */
+  defaultDate?: string | Date | any[]
+  /**
+   * mode=multiple时,最多可选多少个日期
+   * @default Number.MAX_SAFE_INTEGER
+   */
+  maxCount?: string | number
+  /**
+   * 日期行高
+   * @default 56
+   */
+  rowHeight?: string | number
+  /**
+   * 日期格式化函数(如需兼容微信小程序,则只能通过setFormatter方法)
+   */
+  formatter?: (...args: any) => any
+  /**
+   * 是否显示农历
+   * @default false
+   */
+  showLunar?: boolean
+  /**
+   * 是否显示月份背景色
+   * @default true
+   */
+  showMark?: boolean
+  /**
+   * 确定按钮的文字
+   * @default "确定"
+   */
+  confirmText?: string
+  /**
+   * 确认按钮处于禁用状态时的文字
+   * @default "确定"
+   */
+  confirmDisabledText?: string
+  /**
+   * 是否显示日历弹窗
+   * @default false
+   */
+  show?: boolean
+  /**
+   * 是否允许点击遮罩关闭日历 (注意:关闭事件需要自行处理,只会在开启closeOnClickOverlay后点击遮罩层执行close回调)
+   * @default false
+   */
+  closeOnClickOverlay?: boolean
+  /**
+   * 是否为只读状态,只读状态下禁止选择日期
+   * @default false
+   */
+  readonly?: boolean
+  /**
+   * 日期区间最多可选天数,默认无限制,mode = range时有效
+   * @default 无限制
+   */
+  maxRange?: string | number
+  /**
+   * 范围选择超过最多可选天数时的提示文案,mode = range时有效
+   * @default "选择天数不能超过 xx 天"
+   */
+  rangePrompt?: string | null
+  /**
+   * 范围选择超过最多可选天数时,是否展示提示文案,mode = range时有效
+   * @default true
+   */
+  showRangePrompt?: boolean
+  /**
+   * 是否允许日期范围的起止时间为同一天,mode = range时有效
+   * @default false
+   */
+  allowSameDay?: boolean
+  /**
+   * 圆角值,默认无圆角
+   * @default 0
+   */
+  round?: string | number
+  /**
+   * 最大展示的月份数量
+   * @default 3
+   */
+  monthNum?: string | number
+  /**
+   * 日期选择完成后触发,若`show-confirm`为`true`,则点击确认按钮后触发
+   */
+  onConfirm?: (...args: any) => any
+  /**
+   * 日历关闭时触发
+   */
+  onClose?: () => any
+}
+
+declare interface _Calendar {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      CalendarProps
+  }
+}
+
+declare interface _CalendarRef {
+  /**
+   * 为兼容微信小程序而暴露的内部方法,详见[文档](https://www.uviewui.com/components/calendar.html#%E8%87%AA%E5%AE%9A%E4%B9%89%E6%96%87%E6%A1%88)
+   */
+  setFormatter: (type, value) => any
+}
+
+export declare const Calendar: _Calendar
+
+export declare const CalendarRef: _CalendarRef
diff --git a/uni_modules/uview-plus/types/comps/cell.d.ts b/uni_modules/uview-plus/types/comps/cell.d.ts
new file mode 100644
index 0000000..89f5d9f
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/cell.d.ts
@@ -0,0 +1,133 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface CellProps {
+  /**
+   * 左侧标题
+   */
+  title?: string | number
+  /**
+   * 标题下方的描述信息
+   */
+  label?: string | number
+  /**
+   * 右侧的内容
+   */
+  value?: string | number
+  /**
+   * 左侧图标名称,或者图片链接(本地文件建议使用绝对地址)
+   */
+  icon?: string
+  /**
+   * 是否禁用cell
+   * @default false
+   */
+  disabled?: boolean
+  /**
+   * 是否显示下边框
+   * @default true
+   */
+  border?: boolean
+  /**
+   * 内容是否垂直居中(主要是针对右侧的value部分)
+   * @default false
+   */
+  center?: boolean
+  /**
+   * 点击后跳转的URL地址
+   */
+  url?: string
+  /**
+   * 链接跳转的方式,内部使用的是uView封装的route方法,可能会进行拦截操作
+   * @default "navigateTo"
+   */
+  linkType?: string
+  /**
+   * 是否开启点击反馈(表现为点击时加上灰色背景)
+   * @default false
+   */
+  clickable?: boolean
+  /**
+   * 是否展示右侧箭头并开启点击反馈
+   * @default false
+   */
+  isLink?: boolean
+  /**
+   * 是否显示表单状态下的必填星号(此组件可能会内嵌入input组件)
+   * @default false
+   */
+  required?: boolean
+  /**
+   * 右侧的图标箭头
+   * @default "arrow-right"
+   */
+  rightIcon?: string
+  /**
+   * 右侧箭头的方向
+   * @default "right"
+   */
+  arrowDirection?: 'left' | 'right' | 'up' | 'down'
+  /**
+   * 左侧图标样式
+   */
+  iconStyle?: unknown
+  /**
+   * 右侧箭头图标的样式
+   */
+  rightIconStyle?: unknown
+  /**
+   * 标题的样式
+   */
+  titleStyle?: unknown
+  /**
+   * 单位元的大小,可选值为large
+   */
+  size?: string
+  /**
+   * 点击cell是否阻止事件传播
+   * @default true
+   */
+  stop?: boolean
+  /**
+   * 标识符,用于在`click`事件中进行返回
+   */
+  name?: string | number
+  /**
+   * 点击cell列表时触发
+   * @param name `props`的`name`参数标识符
+   */
+  onClick?: (name: any) => any
+}
+
+declare interface CellSlots {
+  /**
+   * 自定义左侧标题部分的内容,如需使用,请勿定义`title`参数,或赋值`null`即可
+   */
+  ['title']?: () => any
+  /**
+   * 自定义右侧标题部分的内容,如需使用,请勿定义`value`参数,或赋值`null`即可
+   */
+  ['value']?: () => any
+  /**
+   * 自定义左侧的图标
+   */
+  ['icon']?: () => any
+  /**
+   * 自定义右侧图标内容,需设置`arrow`为`false`才起作用
+   */
+  ['right-icon']?: () => any
+  /**
+   * 自定义label内容
+   */
+  ['label']?: () => any
+}
+
+declare interface _Cell {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      CellProps
+    $slots: CellSlots
+  }
+}
+
+export declare const Cell: _Cell
diff --git a/uni_modules/uview-plus/types/comps/cellGroup.d.ts b/uni_modules/uview-plus/types/comps/cellGroup.d.ts
new file mode 100644
index 0000000..c429523
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/cellGroup.d.ts
@@ -0,0 +1,27 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface CellGroupProps {
+  /**
+   * 分组标题
+   */
+  title?: string
+  /**
+   * 是否显示外边框
+   * @default true
+   */
+  border?: boolean
+  /**
+   * 用户自定义外部样式,对象形式
+   */
+  customStyle?: unknown
+}
+
+declare interface _CellGroup {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      CellGroupProps
+  }
+}
+
+export declare const CellGroup: _CellGroup
diff --git a/uni_modules/uview-plus/types/comps/checkbox.d.ts b/uni_modules/uview-plus/types/comps/checkbox.d.ts
new file mode 100644
index 0000000..eb4bd94
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/checkbox.d.ts
@@ -0,0 +1,69 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface CheckboxProps {
+  /**
+   * checkbox的名称
+   */
+  name?: string | number | boolean
+  /**
+   * 形状,square为方形,circle为圆型
+   * @default "square"
+   */
+  shape?: 'square' | 'circle'
+  /**
+   * 整体的大小
+   */
+  size?: string | number
+  /**
+   * 是否默认选中
+   * @default false
+   */
+  checked?: boolean
+  /**
+   * 是否禁用
+   * @default false
+   */
+  disabled?: string | boolean
+  /**
+   * 选中状态下的颜色,如设置此值,将会覆盖parent的activeColor值
+   */
+  activeColor?: string
+  /**
+   * 未选中的颜色
+   */
+  inactiveColor?: string
+  /**
+   * 图标的大小,单位px
+   */
+  iconSize?: string | number
+  /**
+   * 图标颜色
+   */
+  iconColor?: string
+  /**
+   * label提示文字,因为nvue下,直接slot进来的文字,由于特殊的结构,无法修改样式
+   */
+  label?: string | number
+  /**
+   * label的字体大小,px单位
+   */
+  labelSize?: string | number
+  /**
+   * label的颜色
+   */
+  labelColor?: string
+  /**
+   * 是否禁止点击提示语选中复选框
+   */
+  labelDisabled?: string | boolean
+}
+
+declare interface _Checkbox {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      CheckboxProps
+  }
+}
+
+export declare const Checkbox: _Checkbox
diff --git a/uni_modules/uview-plus/types/comps/checkboxGroup.d.ts b/uni_modules/uview-plus/types/comps/checkboxGroup.d.ts
new file mode 100644
index 0000000..c6080b7
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/checkboxGroup.d.ts
@@ -0,0 +1,93 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface CheckboxGroupProps {
+  /**
+   * 标识符
+   */
+  name?: string
+  /**
+   * 绑定的值
+   * @default []
+   */
+  value?: string[]
+  /**
+   * 形状,square为方形,circle为圆型
+   * @default "square"
+   */
+  shape?: 'square' | 'circle'
+  /**
+   * 是否禁用全部checkbox
+   * @default false
+   */
+  disabled?: boolean
+  /**
+   * 选中状态下的颜色,如设置此值,将会覆盖parent的activeColor值
+   * @default "#2979ff"
+   */
+  activeColor?: string
+  /**
+   * 未选中的颜色
+   * @default "#c8c9cc"
+   */
+  inactiveColor?: string
+  /**
+   * 整体的大小
+   * @default 18
+   */
+  size?: string
+  /**
+   * 布局方式,row-横向,column-纵向
+   * @default "row"
+   */
+  placement?: 'row' | 'column'
+   /**
+   * label的字体大小,px单位
+   * @default 14
+   */
+  labelSize?: string | number
+  /**
+   * label的颜色
+   * @default "#303133"
+   */
+  labelColor?: string
+  /**
+   * 是否禁止点击文本操作
+   * @default false
+   */
+  labelDisabled?: boolean
+  /**
+   * 图标的大小,单位px
+   * @default 12
+   */
+  iconSize?: string | number
+  /**
+   * 图标颜色
+   * @default "#fff"
+   */
+  iconColor?: string
+  /**
+   * 勾选图标的对齐方式,left-左边,right-右边
+   * @default "left"
+   */
+  iconPlacement?: 'left' | 'right'
+  /**
+   * 竖向配列时,是否显示下划线
+   * @default false
+   */
+  borderBottom?: boolean
+  /**
+   * 任一个`checkbox`状态发生变化时触发,回调为一个对象
+   * @param detail 元素为被选中的`checkbox`的`name`数组
+   */
+  onChange?: (detail: any[]) => any
+}
+
+declare interface _CheckboxGroup {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      CheckboxGroupProps
+  }
+}
+
+export declare const CheckboxGroup: _CheckboxGroup
diff --git a/uni_modules/uview-plus/types/comps/code.d.ts b/uni_modules/uview-plus/types/comps/code.d.ts
new file mode 100644
index 0000000..6ad0366
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/code.d.ts
@@ -0,0 +1,69 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface CodeProps {
+  /**
+   * 倒计时所需的秒数
+   * @default 60
+   */
+  seconds?: string | number
+  /**
+   * 开始前的提示语,详细见[文档](https://www.uviewui.com/components/code.html#%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8F%90%E7%A4%BA%E8%AF%AD)
+   * @default "获取验证码"
+   */
+  startText?: string
+  /**
+   * 倒计时期间的提示语,必须带有字母"x",详细见[文档](https://www.uviewui.com/components/code.html#%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8F%90%E7%A4%BA%E8%AF%AD)
+   * @default "X秒重新获取"
+   */
+  changeText?: string
+  /**
+   * 倒计结束的提示语,详细见[文档](https://www.uviewui.com/components/code.html#%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8F%90%E7%A4%BA%E8%AF%AD)
+   * @default "重新获取"
+   */
+  endText?: string
+  /**
+   * 是否在H5刷新或各端返回再进入时继续倒计时
+   * @default false
+   */
+  keepRunning?: boolean
+  /**
+   * 多个组件之间继续倒计时的区分`key`,详细见[文档](https://www.uviewui.com/components/code.html#%E4%BF%9D%E6%8C%81%E5%80%92%E8%AE%A1%E6%97%B6)
+   */
+  uniqueKey?: string
+  /**
+   * 倒计时期间,每秒触发一次
+   * @param text 当前剩余多少秒的状态
+   */
+  onChange?: (text: string) => any
+  /**
+   * 开始倒计时触发
+   */
+  onStart?: () => any
+  /**
+   * 结束倒计时触发
+   */
+  onEnd?: () => any
+}
+
+declare interface _Code {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      CodeProps
+  }
+}
+
+declare interface _CodeRef {
+  /**
+   * 开始倒计时
+   */
+  start: () => void
+  /**
+   * 结束当前正在进行中的倒计时,设置组件为可以重新获取验证码的状态
+   */
+  reset: () => void
+}
+
+export declare const Code: _Code
+
+export declare const CodeRef: _CodeRef
diff --git a/uni_modules/uview-plus/types/comps/codeInput.d.ts b/uni_modules/uview-plus/types/comps/codeInput.d.ts
new file mode 100644
index 0000000..2858b09
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/codeInput.d.ts
@@ -0,0 +1,98 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface CodeInputProps {
+  /**
+   * 键盘弹起时,是否自动上推页面
+   * @default true
+   */
+  adjustPosition?: boolean
+  /**
+   * 输入字符个数
+   * @default 6
+   */
+  maxlength?: string | number
+  /**
+   * 是否用圆点填充
+   * @default false
+   */
+  dot?: boolean
+  /**
+   * 模式选择
+   * @default "box"
+   */
+  mode?: 'box' | 'bottomLine' | 'middleLine'
+  /**
+   * 是否细边框
+   * @default false
+   */
+  hairline?: boolean
+  /**
+   * 字符间的距离
+   * @default 10
+   */
+  space?: string | number
+  /**
+   * 预置值
+   */
+  value?: string | number
+  /**
+   * 是否自动获取焦点
+   * @default false
+   */
+  focus?: boolean
+  /**
+   * 字体和输入横线是否加粗
+   * @default false
+   */
+  bold?: boolean
+  /**
+   * 字体颜色
+   * @default "#606266"
+   */
+  color?: string
+  /**
+   * 字体大小,单位rpx
+   * @default 18
+   */
+  fontSize?: string | number
+  /**
+   * 输入框的大小,宽等于高
+   * @default 35
+   */
+  size?: string | number
+  /**
+   * 禁止点击输入框唤起系统键盘
+   * @default false
+   */
+  disabledKeyboard?: boolean
+  /**
+   * 边框和线条颜色
+   * @default "#c9cacc"
+   */
+  borderColor?: string
+  /**
+   * 是否禁止输入"."符号
+   * @default true
+   */
+  disabledDot?: boolean
+  /**
+   * 输入内容发生改变时触发
+   * @param value 当前输入的值
+   */
+  onChange?: (value: any) => any
+  /**
+   * 输入字符个数达`maxlength`值时触发
+   * @param value 当前输入的值
+   */
+  onFinish?: (value: any) => any
+}
+
+declare interface _CodeInput {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      CodeInputProps
+  }
+}
+
+export declare const CodeInput: _CodeInput
diff --git a/uni_modules/uview-plus/types/comps/col.d.ts b/uni_modules/uview-plus/types/comps/col.d.ts
new file mode 100644
index 0000000..b8443f4
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/col.d.ts
@@ -0,0 +1,43 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface ColProps {
+  /**
+   * 栅格占据的列数,总12等分
+   * @default 0
+   */
+  span?: string | number
+  /**
+   * 分栏左边偏移,计算方式与span相同
+   * @default 0
+   */
+  offset?: string | number
+  /**
+   * 水平排列方式(微信小程序暂不支持)
+   * @default "start"
+   */
+  justify?: 'start' | 'flex-start' | 'end' | 'flex-end' | 'center' | 'around' | 'space-around' | 'between' | 'space-between'
+  /**
+   * 垂直排列方式
+   * @default "stretch"
+   */
+  align?: 'top' | 'center' | 'bottom' | 'stretch'
+  /**
+   * 文字水平对齐方式
+   * @default 'left
+   */
+  textAlign?: 'left' | 'center' | 'right'
+  /**
+   * 点击触发事件
+   */
+  onClick?: () => any
+}
+
+declare interface _Col {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      ColProps
+  }
+}
+
+export declare const Col: _Col
diff --git a/uni_modules/uview-plus/types/comps/collapse.d.ts b/uni_modules/uview-plus/types/comps/collapse.d.ts
new file mode 100644
index 0000000..c374591
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/collapse.d.ts
@@ -0,0 +1,52 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface CollapseProps {
+  /**
+   * 当前展开面板的name,非手风琴模式:[<String | Number>],手风琴模式:String | Number
+   */
+  value: string | number | (string | number)[]
+  /**
+   * 是否手风琴模式
+   * @default false
+   */
+  accordion?: boolean
+  /**
+   * 是否显示外边框
+   * @default true
+   */
+  border?: boolean
+  /**
+   * 当前激活面板展开时触发(如果是手风琴模式,参数activeNames类型为String,否则为Array)
+   * @param activeNames 活动项
+   */
+  onChange?: (activeNames: string | any[]) => any
+  /**
+   * 当前激活面板展开时触发(如果是手风琴模式,参数activeNames类型为String,否则为Array)
+   * @param activeNames 活动项
+   */
+  onOpen?: (activeNames: string | any[]) => any
+  /**
+   * 当前激活面板关闭时触发(如果是手风琴模式,参数activeNames类型为String,否则为Array)
+   * @param activeNames 活动项
+   */
+  onClose?: (activeNames: string | any[]) => any
+}
+
+declare interface _Collapse {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      CollapseProps
+  }
+}
+
+declare interface _CollapseRef {
+  /**
+   * 重新初始化内部高度计算,用于异步获取内容的情形,请结合`this.$nextTick()`使用
+   */
+  init: () => void
+}
+
+export declare const Collapse: _Collapse
+
+export declare const CollapseRef: _CollapseRef
diff --git a/uni_modules/uview-plus/types/comps/collapseItem.d.ts b/uni_modules/uview-plus/types/comps/collapseItem.d.ts
new file mode 100644
index 0000000..768960f
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/collapseItem.d.ts
@@ -0,0 +1,83 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface CollapseItemProps {
+  /**
+   * 面板标题
+   */
+  title?: string
+  /**
+   * 标题右侧内容
+   */
+  value?: string
+  /**
+   * 标题下方的描述信息
+   */
+  label?: string
+  /**
+   * 面板是否可以打开或收起
+   * @default false
+   */
+  disabled?: boolean
+  /**
+   * 是否展示右侧箭头并开启点击反馈
+   * @default true
+   */
+  isLink?: boolean
+  /**
+   * 是否开启点击反馈
+   * @default true
+   */
+  clickable?: boolean
+  /**
+   * 是否显示内边框
+   * @default true
+   */
+  border?: boolean
+  /**
+   * 唯一标识符,如不设置,默认用当前`collapse-item`的索引值
+   */
+  name?: string | number
+  /**
+   * 标题左侧图片,可为绝对路径的图片或内置图标
+   */
+  icon?: string
+  /**
+   * 面板展开收起的过渡时间,单位`ms`
+   * @default 300
+   */
+  duration?: number
+}
+
+declare interface CollapseItemSlots {
+  /**
+   * 主体部分的内容
+   */
+  ['default']?: () => any
+  /**
+   * 标题内容
+   */
+  ['title']?: () => any
+  /**
+   * icon
+   */
+  ['icon']?: () => any
+  /**
+   * 右侧value
+   */
+  ['value']?: () => any
+  /**
+   * 右侧icon
+   */
+  ['right-icon']?: () => any
+}
+
+declare interface _CollapseItem {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      CollapseItemProps
+    $slots: CollapseItemSlots
+  }
+}
+
+export declare const CollapseItem: _CollapseItem
diff --git a/uni_modules/uview-plus/types/comps/countDown.d.ts b/uni_modules/uview-plus/types/comps/countDown.d.ts
new file mode 100644
index 0000000..779c373
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/countDown.d.ts
@@ -0,0 +1,60 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface CountDownProps {
+  /**
+   * 倒计时时长,单位ms
+   * @default 0
+   */
+  time?: string | number
+  /**
+   * 时间格式,DD-日,HH-时,mm-分,ss-秒,SSS-毫秒
+   * @default "HH:mm:ss"
+   */
+  format?: string
+  /**
+   * 是否自动开始倒计时
+   * @default true
+   */
+  autoStart?: boolean
+  /**
+   * 是否展示毫秒倒计时
+   * @default false
+   */
+  millisecond?: boolean
+  /**
+   * 过程中,倒计时变化时触发
+   * @param time 剩余的时间
+   */
+  onChange?: (time: any) => any
+  /**
+   * 倒计时结束
+   */
+  onFinish?: () => any
+}
+
+declare interface _CountDownRef {
+  /**
+   * 开始倒计时
+   */
+  start: () => void
+  /**
+   * 暂停倒计时
+   */
+  pause: () => void
+  /**
+   * 重置倒计时
+   */
+  reset: () => void
+}
+
+declare interface _CountDown {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      CountDownProps
+  }
+}
+
+export declare const CountDown: _CountDown
+
+export declare const CountDownRef: _CountDownRef
diff --git a/uni_modules/uview-plus/types/comps/countTo.d.ts b/uni_modules/uview-plus/types/comps/countTo.d.ts
new file mode 100644
index 0000000..99317f7
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/countTo.d.ts
@@ -0,0 +1,88 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface CountToProps {
+  /**
+   * 开始值
+   * @default 0
+   */
+  startVal?: string | number
+  /**
+   * 结束值
+   * @default 0
+   */
+  endVal?: string | number
+  /**
+   * 滚动过程所需的时间,单位ms
+   * @default 2000
+   */
+  duration?: string | number
+  /**
+   * 是否自动开始滚动
+   * @default true
+   */
+  autoplay?: boolean
+  /**
+   * 要显示的小数位数,详细见[文档](https://www.uviewui.com/components/countTo.html#%E6%98%AF%E5%90%A6%E6%98%BE%E7%A4%BA%E5%B0%8F%E6%95%B0%E4%BD%8D)
+   * @default 0
+   */
+  decimals?: string | number
+  /**
+   * 滚动结束时,是否缓动结尾,详细见[文档](https://www.uviewui.com/components/countTo.html#%E8%AE%BE%E7%BD%AE%E6%BB%9A%E5%8A%A8%E7%9B%B8%E5%85%B3%E5%8F%82%E6%95%B0)
+   * @default true
+   */
+  useEasing?: boolean
+  /**
+   * 十进制分割
+   */
+  decimal?: string
+  /**
+   * 字体颜色
+   * @default #606266
+   */
+  color?: string
+  /**
+   * 字体大小,单位px
+   * @default 22
+   */
+  fontSize?: string | number
+  /**
+   * 字体是否加粗
+   * @default false
+   */
+  bold?: boolean
+  /**
+   * 千位分隔符,详细见[文档](https://www.uviewui.com/components/countTo.html#%E5%8D%83%E5%88%86%E4%BD%8D%E5%88%86%E9%9A%94%E7%AC%A6)
+   */
+  separator?: string
+  /**
+   * 数值滚动到目标值时触发
+   */
+  onEnd?: () => any
+}
+
+declare interface _CountToRef {
+  /**
+   * `autoplay`为`false`时,通过此方法启动滚动
+   */
+  start: () => void
+  /**
+   * 暂停后重新开始滚动(从暂停前的值开始滚动)
+   */
+  reStart: () => void
+  /**
+   * 暂停滚动
+   */
+  paused: () => void
+}
+
+declare interface _CountTo {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      CountToProps
+  }
+}
+
+export declare const CountTo: _CountTo
+
+export declare const CountToRef: _CountToRef
diff --git a/uni_modules/uview-plus/types/comps/datetimePicker.d.ts b/uni_modules/uview-plus/types/comps/datetimePicker.d.ts
new file mode 100644
index 0000000..bdf2ea8
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/datetimePicker.d.ts
@@ -0,0 +1,146 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface DatetimePickerProps {
+  /**
+   * 用于控制选择器的弹出与收起
+   * @default false
+   */
+  show?: boolean
+  /**
+   * 是否显示顶部的操作栏
+   * @default true
+   */
+  showToolbar?: boolean
+  /**
+   * 绑定值
+   */
+  ['v-model']?: string | number
+  /**
+   * 顶部标题
+   */
+  title?: string
+  /**
+   * 展示格式
+   * @default "datetime"
+   */
+  mode?: 'datetime' | 'date' | 'time' | 'year-month'
+  /**
+   * 可选的最大时间(时间戳毫秒)
+   * @default 最大默认值为后10年
+   */
+  maxDate?: number
+  /**
+   * 可选的最小时间(时间戳毫秒)
+   * @default 最小默认值为前10年
+   */
+  minDate?: number
+  /**
+   * 可选的最小小时,仅mode=time有效
+   * @default 0
+   */
+  minHour?: number
+  /**
+   * 可选的最大小时,仅mode=time有效
+   * @default 23
+   */
+  maxHour?: number
+  /**
+   * 可选的最小分钟,仅mode=time有效
+   * @default 0
+   */
+  minMinute?: number
+  /**
+   * 可选的最大分钟,仅mode=time有效
+   * @default 59
+   */
+  maxMinute?: number
+  /**
+   * 选项过滤函数
+   * @default null
+   */
+  filter?: (...args: any) => any
+  /**
+   * 输入过滤或格式化函数(如需兼容微信小程序,则只能通过`setFormatter`方法)
+   * @default null
+   */
+  formatter?: (...args: any) => any
+  /**
+   * 是否显示加载中状态
+   * @default false
+   */
+  loading?: boolean
+  /**
+   * 各列中,单个选项的高度
+   * @default 44
+   */
+  itemHeight?: string | number
+  /**
+   * 取消按钮的文字
+   * @default "取消"
+   */
+  cancelText?: string
+  /**
+   * 确认按钮的文字
+   * @default "确认"
+   */
+  confirmText?: string
+  /**
+   * 取消按钮的颜色
+   * @default "#909193"
+   */
+  cancelColor?: string
+  /**
+   * 确认按钮的颜色
+   * @default "#3c9cff"
+   */
+  confirmColor?: string
+  /**
+   * 每列中可见选项的数量
+   * @default 5
+   */
+  visibleItemCount?: string | number
+  /**
+   * 是否允许点击遮罩关闭选择器(注意:关闭事件需要自行处理,只会在开启closeOnClickOverlay后点击遮罩层执行close回调)
+   * @default false
+   */
+  closeOnClickOverlay?: boolean
+  /**
+   * 各列的默认索引
+   */
+  defaultIndex?: any[]
+  /**
+   * 关闭选择器时触发
+   */
+  onClose?: () => any
+  /**
+   * 点击确定按钮,返回当前选择的值
+   */
+  onConfirm?: () => any
+  /**
+   * 当选择值变化时触发
+   */
+  onChange?: () => any
+  /**
+   * 点击取消按钮
+   */
+  onCancel?: () => any
+}
+
+declare interface _DatetimePickerRef {
+  /**
+   * 为兼容微信小程序而暴露的内部方法,详见[文档](https://www.uviewui.com/components/datetimePicker.html#%E6%A0%BC%E5%BC%8F%E5%8C%96)
+   */
+  setFormatter: (type, value) => any
+}
+
+declare interface _DatetimePicker {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      DatetimePickerProps
+  }
+}
+
+export declare const DatetimePicker: _DatetimePicker
+
+export declare const DatetimePickerRef: _DatetimePickerRef
diff --git a/uni_modules/uview-plus/types/comps/divider.d.ts b/uni_modules/uview-plus/types/comps/divider.d.ts
new file mode 100644
index 0000000..a27cf13
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/divider.d.ts
@@ -0,0 +1,58 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface DividerProps {
+  /**
+   * 是否虚线
+   * @default false
+   */
+  dashed?: boolean
+  /**
+   * 是否细线
+   * @default true
+   */
+  hairline?: boolean
+  /**
+   * 是否以点替代文字,优先于text字段起作用
+   * @default false
+   */
+  dot?: boolean
+  /**
+   * 内容文本的位置
+   * @default "center"
+   */
+  textPosition?: 'left' | 'center' | 'right'
+  /**
+   * 文本内容
+   */
+  text?: string | number
+  /**
+   * 文本大小
+   * @default 14
+   */
+  textSize?: string | number
+  /**
+   * 文本颜色
+   * @default #909399
+   */
+  textColor?: string
+  /**
+   * 线条颜色
+   * @default #dcdfe6
+   */
+  lineColor?: string
+  /**
+   * divider组件被点击时触发
+   */
+  onClick?: () => any
+}
+
+declare interface _Divider {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      DividerProps
+  }
+}
+
+export declare const Divider: _Divider
+
diff --git a/uni_modules/uview-plus/types/comps/empty.d.ts b/uni_modules/uview-plus/types/comps/empty.d.ts
new file mode 100644
index 0000000..1adf63b
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/empty.d.ts
@@ -0,0 +1,72 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface EmptyProps {
+  /**
+   * 内置图标名称,或图片路径,建议绝对路径
+   */
+  icon?: string
+  /**
+   * 文字提示
+   */
+  text?: string
+  /**
+   * 文字颜色
+   * @default "#c0c4cc"
+   */
+  textColor?: string
+  /**
+   * 文字大小
+   * @default 14
+   */
+  textSize?: string | number
+  /**
+   * 图标的颜色
+   * @default "#c0c4cc"
+   */
+  iconColor?: string
+  /**
+   * 图标的大小
+   * @default 90
+   */
+  iconSize?: string | number
+  /**
+   * 内置的图标,详细见[文档](https://www.uviewui.com/components/empty.html#%E5%86%85%E7%BD%AE%E5%9B%BE%E6%A0%87)
+   * @default "data"
+   */
+  mode?: string
+  /**
+   * 图标的宽度,单位px
+   * @default 160
+   */
+  width?: string | number
+  /**
+   * 图标的高度,单位px
+   * @default 160
+   */
+  height?: string | number
+  /**
+   * 是否显示组件
+   * @default true
+   */
+  show?: boolean
+  /**
+   * 组件到上一个元素的间距,单位px
+   * @default 0
+   */
+  marginTop?: string | number
+}
+
+declare interface EmptySlots {
+  ['default']?: () => any
+}
+
+declare interface _Empty {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      EmptyProps
+    $slots: EmptySlots
+  }
+}
+
+export declare const Empty: _Empty
diff --git a/uni_modules/uview-plus/types/comps/form.d.ts b/uni_modules/uview-plus/types/comps/form.d.ts
new file mode 100644
index 0000000..c701ebb
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/form.d.ts
@@ -0,0 +1,76 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface FormProps {
+  /**
+   * 表单数据对象
+   */
+  model?: Record<string, any>
+  /**
+   * 通过ref设置,如果rules中有自定义方法等,需要使用setRules方法设置规则,详见[文档](https://www.uviewui.com/components/form.html#%E9%AA%8C%E8%AF%81%E8%A7%84%E5%88%99)
+   */
+  rules?: Record<string, any>
+  /**
+   * 错误的提示方式
+   * @default "message"
+   */
+  errorType?: 'message' | 'none' | 'toast' | 'border-bottom' | 'none'
+  /**
+   * 是否显示表单域的下划线边框
+   * @default true
+   */
+  borderBottom?: boolean
+  /**
+   * 表单域提示文字的位置,left-左侧,top-上方
+   * @default "left"
+   */
+  labelPosition?: 'left' | 'top'
+  /**
+   * 提示文字的宽度,单位px
+   * @default 45
+   */
+  labelWidth?: string | number
+  /**
+   * lable字体的对齐方式
+   * @default "left"
+   */
+  labelAlign?: 'left' | 'center' | 'right'
+  /**
+   * lable的样式
+   */
+  labelStyle?: unknown
+}
+
+declare interface _FormRef {
+  /**
+   * 对整个表单进行校验的方法
+   */
+  validate: () => any
+  /**
+   * 如果`rules`中有自定义方法等,需要用此方法设置`rules`规则,否则微信小程序无效
+   */
+  setRules: (rules: any) => any
+  /**
+   * 对部分表单字段进行校验
+   */
+  validateField: (value, cb: ((errorsRes) => any)) => any
+  /**
+   * 对整个表单进行重置,将所有字段值重置为初始值并移除校验结果
+   */
+  resetFields: () => any
+  /**
+   * 清空校验结果
+   */
+  clearValidate: (props: any) => any
+}
+
+declare interface _Form {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      FormProps
+  }
+}
+
+export declare const Form: _Form
+
+export declare const FormRef: _FormRef
diff --git a/uni_modules/uview-plus/types/comps/formItem.d.ts b/uni_modules/uview-plus/types/comps/formItem.d.ts
new file mode 100644
index 0000000..55fcdf9
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/formItem.d.ts
@@ -0,0 +1,68 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface FormItemProps {
+  /**
+   * 左侧提示文字
+   */
+  label?: string
+  /**
+   * 表单域`model`对象的属性名,在使用 validate、resetFields 方法的情况下,该属性是必填的
+   */
+  prop?: string
+  /**
+   * 是否显示下边框,如不需要下边框,需同时将u-form的同名参数设置为false
+   * @default true
+   */
+  borderBottom?: boolean
+  /**
+   * 提示文字的宽度,单位rpx,如设置,将覆盖`u-form`的同名参数
+   */
+  labelWidth?: string | number
+  /**
+   * label的位置
+   */
+  labelPosition?: 'left' | 'top'
+  /**
+   * 右侧自定义字体图标(限uView内置图标)或图片地址
+   */
+  rightIcon?: string
+  /**
+   * 左侧自定义字体图标(限uView内置图标)或图片地址
+   */
+  leftIcon?: string
+  /**
+   * 左侧自定义字体图标的样式
+   */
+  leftIconStyle?: unknown
+  /**
+   * 是否显示左边的"*"号,这里仅起展示作用,如需校验必填,请通过rules配置必填规则,如需在swiper标签内显示星号,需要给予swiper-item内第一个根节点一定的margin样式
+   * @default false
+   */
+  required?: boolean
+  /**
+   * 点击时触发
+   */
+  onClick?: () => any
+}
+
+declare interface FormItemSlots {
+  /**
+   * Form Item 的内容
+   */
+  ['default']?: () => any
+  /**
+   * 右侧自定义内容,可以在此传入一个按钮,用于获取验证码等场景
+   */
+  ['right']?: () => any
+}
+
+declare interface _FormItem {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      FormItemProps
+    $slots: FormItemSlots
+  }
+}
+
+export declare const FormItem: _FormItem
diff --git a/uni_modules/uview-plus/types/comps/gap.d.ts b/uni_modules/uview-plus/types/comps/gap.d.ts
new file mode 100644
index 0000000..b69bcc7
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/gap.d.ts
@@ -0,0 +1,35 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface GapProps {
+  /**
+   * 背景颜色
+   * @default "transparent"
+   */
+  bgColor?: string
+  /**
+   * 间隔槽高度,单位px
+   * @default 20
+   */
+  height?: string | number
+  /**
+   * 与前一个元素的距离,单位px
+   * @default 0
+   */
+  marginTop?: string | number
+  /**
+   * 与后一个元素的距离,单位px
+   * @default 0
+   */
+  marginBottom?: string | number
+}
+
+declare interface _Gap {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      GapProps
+  }
+}
+
+export declare const Gap: _Gap
+
diff --git a/uni_modules/uview-plus/types/comps/grid.d.ts b/uni_modules/uview-plus/types/comps/grid.d.ts
new file mode 100644
index 0000000..dbf083f
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/grid.d.ts
@@ -0,0 +1,34 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface GridProps {
+  /**
+   * 宫格的列数
+   * @default 3
+   */
+  col?: string | number
+  /**
+   * 是否显示宫格的边框
+   * @default true
+   */
+  border?: boolean
+  /**
+   * 宫格的对齐方式,用于控制只有一两个宫格时的对齐场景
+   * @default "left"
+   */
+  align?: 'left' | 'center' | 'right'
+  /**
+   * 点击宫格触发
+   * @param name `grid-item` 的 `name`
+   */
+  onClick?: (name: any) => any
+}
+
+declare interface _Grid {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      GridProps
+  }
+}
+
+export declare const Grid: _Grid
diff --git a/uni_modules/uview-plus/types/comps/gridItem.d.ts b/uni_modules/uview-plus/types/comps/gridItem.d.ts
new file mode 100644
index 0000000..0195d38
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/gridItem.d.ts
@@ -0,0 +1,28 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface GridItemProps {
+  /**
+   * 宫格的name
+   */
+  name?: string | number
+  /**
+   * 宫格的背景颜色
+   * @default "transparent"
+   */
+  bgColor?: string
+  /**
+   * 点击宫格触发
+   * @param name `grid-item` 的 `name`
+   */
+  onClick?: (name: any) => any
+}
+
+declare interface _GridItem {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      GridItemProps
+  }
+}
+
+export declare const GridItem: _GridItem
diff --git a/uni_modules/uview-plus/types/comps/icon.d.ts b/uni_modules/uview-plus/types/comps/icon.d.ts
new file mode 100644
index 0000000..5b5d09e
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/icon.d.ts
@@ -0,0 +1,93 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+import { ImageMode } from './image'
+
+declare interface IconProps {
+  /**
+   * 图标名称,如名称带有`/`,会被认为是图片图标
+   */
+  name?: string
+  /**
+   * 图标颜色
+   * @default "color['u-content-color']"
+   */
+  color?: string
+  /**
+   * 图标字体大小,单位默认px
+   * @default "16px"
+   */
+  size?: string | number
+  /**
+   * 是否显示粗体
+   * @default false
+   */
+  bold?: boolean
+  /**
+   * 一个用于区分多个图标的值,点击图标时通过`click`事件传出
+   */
+  index?: string | number
+  /**
+   * 图标按下去的样式类,用法同uni的`view`组件的`hover-class`参数,详见:[hover-class](https://uniapp.dcloud.io/component/view)
+   */
+  hoverClass?: string
+  /**
+   * 图标右侧/下方的label文字
+   */
+  label?: string | number
+  /**
+   * `label`相对于图标的位置
+   * @default "right"
+   */
+  labelPos?: 'right' | 'bottom' | 'top' | 'left'
+  /**
+   * `label`字体大小,单位默认px
+   * @default "15px"
+   */
+  labelSize?: string | number
+  /**
+   * `label`字体颜色
+   * @default "color['u-content-color']"
+   */
+  labelColor?: string
+  /**
+   * `label`与图标的距离,单位默认px
+   * @default "3px"
+   */
+  space?: string | number
+  /**
+   * 裁剪模式
+   */
+  imgMode?: ImageMode
+  /**
+   * `name`为图片路径时图片的宽度,单位默认px
+   */
+  width?: string | number
+  /**
+   * `name`为图片路径时图片的高度,单位默认px
+   */
+  height?: string | number
+  /**
+   * 图标到顶部的距离,如果某些场景,如果图标没有垂直居中,可以调整此参数,单位默认px
+   * @default 0
+   */
+  top?: string | number
+  /**
+   * 是否阻止事件传播
+   * @default false
+   */
+  stop?: boolean
+  /**
+   * 点击图标时触发
+   * @param index 通过`props`传递的`index`值
+   */
+  onClick?: (index: any) => any
+}
+
+declare interface _Icon {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      IconProps
+  }
+}
+
+export declare const Icon: _Icon
diff --git a/uni_modules/uview-plus/types/comps/image.d.ts b/uni_modules/uview-plus/types/comps/image.d.ts
new file mode 100644
index 0000000..32e9ea4
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/image.d.ts
@@ -0,0 +1,119 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+export declare type ImageMode = 'scaleToFill' | 'aspectFit' | 'aspectFill' | 'widthFix' | 'heightFix' | 'top' | 'bottom' | 'center' | 'left' | 'right' | 'top left' | 'top right' | 'bottom left' | 'bottom right'
+
+declare interface ImageProps {
+  /**
+   * 图片地址,强烈建议使用绝对或者网络路径
+   */
+  src?: string
+  /**
+   * 裁剪模式
+   * @default "aspectFill"
+   */
+  mode?: ImageMode
+  /**
+   * 宽度,单位任意,如果为数值,默认单位px
+   * @default 300
+   */
+  width?: string | number
+  /**
+   * 高度,单位任意,如果为数值,默认单位px
+   * @default 225
+   */
+  height?: string | number
+  /**
+   * 图片形状
+   * @default "square"
+   */
+  shape?: 'circle' | 'square'
+  /**
+   * 圆角,默认单位px
+   * @default 0
+   */
+  radius?: string | number
+  /**
+   * 是否懒加载,仅微信小程序、App、百度小程序、字节跳动小程序有效
+   * @default true
+   */
+  lazyLoad?: boolean
+  /**
+   * 是否开启长按图片显示识别小程序码菜单,仅微信小程序有效
+   */
+  showMenuByLongpress?: boolean
+  /**
+   * 加载中的图标,或者小图片
+   * @default "photo"
+   */
+  loadingIcon?: string
+  /**
+   * 加载失败的图标,或者小图片
+   * @default "error-circle"
+   */
+  errorIcon?: string
+  /**
+   * 是否显示加载中的图标或者自定义的slot
+   * @default true
+   */
+  showLoading?: boolean
+  /**
+   * 是否显示加载错误的图标或者自定义的slot
+   * @default true
+   */
+  showError?: boolean
+  /**
+   * 是否需要淡入效果
+   * @default true
+   */
+  fade?: boolean
+  /**
+   * 只支持网络资源,只对微信小程序有效
+   * @default false
+   */
+  webp?: boolean
+  /**
+   * 搭配`fade`参数的过渡时间,单位ms
+   * @default 500
+   */
+  duration?: string | number
+  /**
+   * 背景颜色,用于深色页面加载图片时,为了和背景色融合
+   * @default "#f3f4f6"
+   */
+  bgColor?: string
+  /**
+   * 点击图片时触发
+   */
+  onClick?: () => any
+  /**
+   * 图片加载失败时触发
+   * @param err 错误信息
+   */
+  onError?: (err: any) => any
+  /**
+   * 图片加载成功时触发
+   */
+  onLoad?: () => any
+}
+
+declare interface ImageSlots {
+  /**
+   * 自定义加载中的提示内容
+   */
+  ['loading']?: () => any
+  /**
+   * 自定义失败的提示内容
+   */
+  ['error']?: () => any
+}
+
+declare interface _Image {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      ImageProps
+    $slots: ImageSlots
+  }
+}
+
+export declare const Image: _Image
diff --git a/uni_modules/uview-plus/types/comps/indexAnchor.d.ts b/uni_modules/uview-plus/types/comps/indexAnchor.d.ts
new file mode 100644
index 0000000..583824d
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/indexAnchor.d.ts
@@ -0,0 +1,38 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface IndexAnchorProps {
+  /**
+   * 列表锚点文本内容
+   */
+  text?: string | number
+  /**
+   * 列表锚点文字颜色
+   * @default "#606266"
+   */
+  color?: string
+  /**
+   * 列表锚点文字大小,单位默认px
+   * @default 14
+   */
+  size?: string | number
+  /**
+   * 列表锚点背景颜色
+   * @default "#dedede"
+   */
+  bgColor?: string
+  /**
+   * 列表锚点高度,单位默认px
+   * @default 32
+   */
+  height?: string | number
+}
+
+declare interface _IndexAnchor {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      IndexAnchorProps
+  }
+}
+
+export declare const IndexAnchor: _IndexAnchor
diff --git a/uni_modules/uview-plus/types/comps/indexItem.d.ts b/uni_modules/uview-plus/types/comps/indexItem.d.ts
new file mode 100644
index 0000000..07b8f7b
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/indexItem.d.ts
@@ -0,0 +1,18 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface IndexItemSlots {
+  /**
+   * 自定义列表内容
+   */
+  ['default']?: () => any
+}
+
+declare interface _IndexItem {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps
+    $slots: IndexItemSlots
+  }
+}
+
+export declare const IndexItem: _IndexItem
diff --git a/uni_modules/uview-plus/types/comps/indexList.d.ts b/uni_modules/uview-plus/types/comps/indexList.d.ts
new file mode 100644
index 0000000..79643ea
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/indexList.d.ts
@@ -0,0 +1,39 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface IndexListProps {
+  /**
+   * 右边锚点状态非激活时的颜色
+   * @default "#606266"
+   */
+  inactiveColor?: string
+  /**
+   * 右边锚点状态激活时的颜色
+   * @default "#5677fc"
+   */
+  activeColor?: string
+  /**
+   * 索引字符列表,数组
+   * @default "A-Z"
+   */
+  indexList?: (string | number)[]
+  /**
+   * 是否开启锚点自动吸顶
+   * @default true
+   */
+  sticky?: boolean
+  /**
+   * 自定义导航栏的高度,单位默认px
+   * @default 0
+   */
+  customNavHeight?: string | number
+}
+
+declare interface _IndexList {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      IndexListProps
+  }
+}
+
+export declare const IndexList: _IndexList
diff --git a/uni_modules/uview-plus/types/comps/input.d.ts b/uni_modules/uview-plus/types/comps/input.d.ts
new file mode 100644
index 0000000..1e3a4a4
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/input.d.ts
@@ -0,0 +1,234 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface InputProps {
+  /**
+   * 输入的值
+   */
+  value?: string | number
+  /**
+   * 输入框类型,详见[文档](https://www.uviewui.com/components/input.html#%E8%BE%93%E5%85%A5%E6%A1%86%E7%9A%84%E7%B1%BB%E5%9E%8B)
+   * @default "text"
+   */
+  type?: 'text' | 'number' | 'idcard' | 'digit' | 'password'
+  /**
+   * 是否禁用输入框
+   * @default false
+   */
+  disabled?: boolean
+  /**
+   * 禁用状态时的背景色
+   * @default "#f5f7fa"
+   */
+  disabledColor?: string
+  /**
+   * 是否显示清除控件
+   * @default false
+   */
+  clearable?: boolean
+  /**
+   * 是否密码类型
+   * @default false
+   */
+  password?: boolean
+  /**
+   * 最大输入长度,设置为 -1 的时候不限制最大长度
+   * @default -1
+   */
+  maxlength?: string | number
+  /**
+   * 输入框为空时的占位符
+   */
+  placeholder?: string
+  /**
+   * 指定placeholder的样式类,注意页面或组件的style中写了scoped时,需要在类名前写/deep/
+   * @default "input-placeholder"
+   */
+  placeholderClass?: string
+  /**
+   * 指定placeholder的样式
+   * @default "color: #c0c4cc"
+   */
+  placeholderStyle?: unknown
+  /**
+   * 是否显示输入字数统计,只在 type ="text"或type ="textarea"时有效
+   * @default false
+   */
+  showWordLimit?: boolean
+  /**
+   * 设置右下角按钮的文字
+   * @default "done"
+   */
+  confirmType?: 'send' | 'search' | 'next' | 'go' | 'done'
+  /**
+   * 点击键盘右下角按钮时是否保持键盘不收起,H5无效
+   * @default false
+   */
+  confirmHold?: boolean
+  /**
+   * focus时,点击页面的时候不收起键盘,微信小程序有效
+   * @default false
+   */
+  holdKeyboard?: boolean
+  /**
+   * 自动获取焦点,在 H5 平台能否聚焦以及软键盘是否跟随弹出,取决于当前浏览器本身的实现。nvue 页面不支持,需使用组件的 focus()、blur() 方法控制焦点
+   * @default false
+   */
+  focus?: boolean
+  /**
+   * 键盘收起时,是否自动失去焦点,目前仅App3.0.0+有效
+   * @default false
+   */
+  autoBlur?: boolean
+  /**
+   * 是否忽略组件内对文本合成系统事件的处理。为 false 时将触发 compositionstart、compositionend、compositionupdate 事件,且在文本合成期间会触发 input 事件
+   * @default true
+   */
+  ignoreCompositionEvent?: boolean
+  /**
+   * 是否去掉 iOS 下的默认内边距,仅微信小程序,且type=textarea时有效
+   * @default false
+   */
+  disableDefaultPadding?: boolean
+  /**
+   * 指定focus时光标的位置
+   * @default -1
+   */
+  cursor?: string | number
+  /**
+   * 输入框聚焦时底部与键盘的距离
+   * @default 30
+   */
+  cursorSpacing?: string | number
+  /**
+   * 光标起始位置,自动聚集时有效,需与selection-end搭配使用
+   * @default -1
+   */
+  selectionStart?: string | number
+  /**
+   * 光标结束位置,自动聚集时有效,需与selection-start搭配使用
+   * @default -1
+   */
+  selectionEnd?: string | number
+  /**
+   * 键盘弹起时,是否自动上推页面
+   * @default true
+   */
+  adjustPosition?: boolean
+  /**
+   * 输入框内容对齐方式
+   * @default "left"
+   */
+  inputAlign?: 'left' | 'center' | 'right'
+  /**
+   * 输入框字体的大小
+   * @default "15px"
+   */
+  fontSize?: string | number
+  /**
+   * 输入框字体颜色
+   * @default "#303133"
+   */
+  color?: string
+  /**
+   * 输入框前置图标
+   */
+  prefixIcon?: string
+  /**
+   * 前置图标样式
+   */
+  prefixIconStyle?: unknown
+  /**
+   * 输入框后置图标
+   */
+  suffixIcon?: string
+  /**
+   * 后置图标样式
+   */
+  suffixIconStyle?: unknown
+  /**
+   * 边框类型,surround-四周边框,bottom-底部边框,none-无边框
+   * @default "surround"
+   */
+  border?: 'surround' | 'bottom' | 'none'
+  /**
+   * 是否只读,与disabled不同之处在于disabled会置灰组件,而readonly则不会
+   * @default false
+   */
+  readonly?: boolean
+  /**
+   * 输入框形状,circle-圆形,square-方形
+   * @default "square"
+   */
+  shape?: 'square' | 'circle'
+  /**
+   * 输入过滤或格式化函数(如需兼容微信小程序,则只能通过`setFormatter`方法)
+   */
+  formatter?: (...args: any) => any
+  /**
+   * 定义需要用到的外部样式
+   */
+  customStyle?: unknown
+  /**
+   * 输入框失去焦点时触发
+   * @param value 内容值
+   */
+  onBlur?: (value: any) => any
+  /**
+   * 输入框聚焦时触发
+   */
+  onFocus?: () => any
+  /**
+   * 点击完成按钮时触发
+   * @param value 内容值
+   */
+  onConfirm?: (value: any) => any
+  /**
+   * 键盘高度发生变化的时候触发此事件
+   */
+  onKeyboardheightchange?: () => any
+  /**
+   * 内容发生变化触发此事件
+   * @param value 内容值
+   */
+  onInput?: (value: any) => any
+  /**
+   * 内容发生变化触发此事件
+   * @param value 内容值
+   */
+  onChange?: (value: any) => any
+  /**
+   * 点击清空内容
+   */
+  onClear?: () => any
+}
+
+declare interface InputSlots {
+  /**
+   * 输入框前置内容,`nuve`环境需`u--input`有效,非`nvue`环境需`u-input`才有效
+   */
+  ['prefix']?: () => any
+  /**
+   * 输入框后置内容,`nuve`环境需`u--input`有效,非`nvue`环境需`u-input`才有效
+   */
+  ['suffix']?: () => any
+}
+
+declare interface _Input {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      InputProps
+    $slots: InputSlots
+  }
+}
+
+declare interface _InputRef {
+  /**
+   * 为兼容微信小程序而暴露的内部方法
+   */
+  setFormatter: () => void
+}
+
+export declare const Input: _Input
+
+export declare const InputRef: _InputRef
diff --git a/uni_modules/uview-plus/types/comps/keyboard.d.ts b/uni_modules/uview-plus/types/comps/keyboard.d.ts
new file mode 100644
index 0000000..8319e8f
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/keyboard.d.ts
@@ -0,0 +1,125 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface KeyboardProps {
+  /**
+   * 键盘的类型,number-数字键盘,card-身份证键盘,car-车牌号键盘
+   * @default "car"
+   */
+  mode?: 'car' | 'number' | 'card'
+  /**
+   * 是否显示"."按键,只在mode=number时有效
+   * @default false
+   */
+  dotDisabled?: boolean
+  /**
+   * 是否显示键盘顶部工具条
+   * @default true
+   */
+  tooltip?: boolean
+  /**
+   * 是否显示工具条中间的提示
+   * @default true
+   */
+  showTips?: boolean
+  /**
+   * 工具条中间的提示文字,详见[文档](https://www.uviewui.com/components/keyboard.html#%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8)
+   */
+  tips?: string
+  /**
+   * 是否显示工具条左边的"取消"按钮
+   * @default true
+   */
+  showCancel?: boolean
+  /**
+   * 是否显示工具条右边的"完成"按钮
+   * @default true
+   */
+  showConfirm?: boolean
+  /**
+   * 是否打乱键盘按键的顺序
+   * @default false
+   */
+  random?: boolean
+  /**
+   * 是否开启底部安全区适配
+   * @default false
+   */
+  safeAreaInsetBottom?: boolean
+  /**
+   * 是否允许点击遮罩收起键盘(注意:关闭事件需要自行处理,只会在开启closeOnClickOverlay后点击遮罩层执行close回调)
+   * @default true
+   */
+  closeOnClickOverlay?: boolean
+  /**
+   * 控制键盘的弹出与收起
+   * @default true
+   */
+  show?: boolean
+  /**
+   * 是否显示遮罩
+   * @default true
+   */
+  overlay?: boolean
+  /**
+   * 弹出键盘的`z-index`值
+   * @default 1075
+   */
+  zIndex?: string | number
+  /**
+   * 确认按钮的文字
+   * @default "确认"
+   */
+  confirmText?: string
+  /**
+   * 取消按钮的文字
+   * @default "取消"
+   */
+  cancelText?: string
+  /**
+   * 自定义样式
+   */
+  customStyle?: unknown
+  /**
+   * `mode`为`car`下,输入文字后,是否自动切换为字母模式
+   * @default false
+   */
+  autoChange?: boolean
+  /**
+   * 按键被点击(不包含退格键被点击)
+   */
+  onChange?: () => any
+  /**
+   * 键盘关闭
+   */
+  onClose?: () => any
+  /**
+   * 键盘顶部工具条右边的"完成"按钮被点击
+   */
+  onConfirm?: () => any
+  /**
+   * 键盘顶部工具条左边的"取消"按钮被点击
+   */
+  onCancel?: () => any
+  /**
+   * 键盘退格键被点击
+   */
+  onBackspace?: () => any
+}
+
+declare interface KeyboardSlots {
+  /**
+   * 内容将会显示键盘的工具条上面,可以结合MessageInput 验证码输入组件实现类似支付宝输入密码时,上方显示输入内容的功能
+   */
+  ['default']: () => any
+}
+
+declare interface _Keyboard {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      KeyboardProps
+    $slots: KeyboardSlots
+  }
+}
+
+export declare const Keyboard: _Keyboard
diff --git a/uni_modules/uview-plus/types/comps/line.d.ts b/uni_modules/uview-plus/types/comps/line.d.ts
new file mode 100644
index 0000000..7d8568d
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/line.d.ts
@@ -0,0 +1,44 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface LineProps {
+  /**
+   * 线条的颜色
+   * @default "#d6d7d9"
+   */
+  color?: string
+  /**
+   * 长度,竖向时表现为高度,横向时表现为长度,可以为百分比,带rpx单位的值等
+   * @default 100%
+   */
+  length?: string | number
+  /**
+   * 线条的方向,`row`-横向,`col`-竖向
+   * @default "row"
+   */
+  direction?: "row" | "col"
+  /**
+   * 是否显示细边框
+   * @default true
+   */
+  hairline?: boolean
+  /**
+   * 线条与上下左右元素的间距,字符串形式,如"30rpx"、"20rpx 30rpx",默认单位px
+   * @default 0
+   */
+  margin?: string | number
+  /**
+   * 是否虚线,false-实线,true-虚线
+   * @default false
+   */
+  dashed?: boolean
+}
+
+declare interface _Line {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      LineProps
+  }
+}
+
+export declare const Line: _Line
diff --git a/uni_modules/uview-plus/types/comps/lineProgress.d.ts b/uni_modules/uview-plus/types/comps/lineProgress.d.ts
new file mode 100644
index 0000000..2e7aeef
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/lineProgress.d.ts
@@ -0,0 +1,51 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface LineProgressProps {
+  /**
+   * 进度条激活部分的颜色
+   * @default "#19be6b"
+   */
+  activeColor?: string
+  /**
+   * 进度条的底色,默认为灰色
+   * @default "#ececec"
+   */
+  inactiveColor?: string
+  /**
+   * 进度百分比,数值
+   * @default 0
+   */
+  percentage?: string | number
+  /**
+   * 是否在进度条内部显示百分比的值
+   * @default true
+   */
+  showText?: boolean
+  /**
+   * 进度条的高度,默认单位px
+   * @default 12
+   */
+  height?: string | number
+  /**
+   * 点击触发事件
+   */
+  onClick?: () => any
+}
+
+declare interface LineProgressSlots {
+  /**
+   * 传入自定义的显示内容,将会覆盖默认显示的百分比值
+   */
+  ['default']?: (arg: any) => any
+}
+
+declare interface _LineProgress {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      LineProgressProps
+    $slots: LineProgressSlots
+  }
+}
+
+export declare const LineProgress: _LineProgress
diff --git a/uni_modules/uview-plus/types/comps/link.d.ts b/uni_modules/uview-plus/types/comps/link.d.ts
new file mode 100644
index 0000000..0dfd12a
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/link.d.ts
@@ -0,0 +1,51 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface LinkProps {
+  /**
+   * 文字颜色
+   * @default color['u-primary']
+   */
+  color?: string
+  /**
+   * 字体大小,默认单位px
+   * @default 15
+   */
+  fontSize?: string | number
+  /**
+   * 是否显示下划线
+   * @default false
+   */
+  underLine?: boolean
+  /**
+   * 跳转的链接,要带上http(s)
+   */
+  href?: string
+  /**
+   * 各个小程序平台把链接复制到粘贴板后的提示语
+   * @default "链接已复制,请在浏览器打开"
+   */
+  mpTips?: string
+  /**
+   * 下划线颜色,默认同color参数颜色
+   */
+  lineColor?: string
+  /**
+   * 超链接的问题,不使用slot形式传入,是因为nvue下无法修改颜色
+   */
+  text?: string
+}
+
+declare interface LinkSlots {
+  ['default']?: () => any
+}
+
+declare interface _Link {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      LinkProps
+    $slots: LinkSlots
+  }
+}
+
+export declare const Link: _Link
diff --git a/uni_modules/uview-plus/types/comps/list.d.ts b/uni_modules/uview-plus/types/comps/list.d.ts
new file mode 100644
index 0000000..024099b
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/list.d.ts
@@ -0,0 +1,92 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface ListProps {
+  /**
+   * 控制是否出现滚动条,仅nvue有效
+   * @default false
+   */
+  showScrollbar?: boolean
+  /**
+   * 距底部多少时触发scrolltolower事件
+   * @default 50
+   */
+  lowerThreshold?: string | number
+  /**
+   * 距顶部多少时触发scrolltoupper事件,非nvue有效
+   * @default 0
+   */
+  upperThreshold?: string | number
+  /**
+   * 设置竖向滚动条位置
+   * @default 0
+   */
+  scrollTop?: string | number
+  /**
+   * 控制 onscroll 事件触发的频率,仅nvue有效
+   * @default 10
+   */
+  offsetAccuracy?: string | number
+  /**
+   * 启用 flexbox 布局。开启后,当前节点声明了display: flex就会成为flex container,并作用于其孩子节点,仅微信小程序有效
+   * @default false
+   */
+  enableFlex?: boolean
+  /**
+   * 是否按分页模式显示List
+   * @default false
+   */
+  pagingEnabled?: boolean
+  /**
+   * 是否允许List滚动
+   * @default true
+   */
+  scrollable?: boolean
+  /**
+   * 值应为某子元素id(id不能以数字开头)
+   */
+  scrollIntoView?: string
+  /**
+   * 在设置滚动条位置时使用动画过渡
+   * @default false
+   */
+  scrollWithAnimation?: boolean
+  /**
+   * iOS点击顶部状态栏、安卓双击标题栏时,滚动条返回顶部,只对微信小程序有效
+   * @default false
+   */
+  enableBackToTop?: boolean
+  /**
+   * 列表的高度
+   * @default 0
+   */
+  height?: string | number
+  /**
+   * 列表宽度
+   * @default 0
+   */
+  width?: string | number
+  /**
+   * 列表前后预渲染的屏数,1代表一个屏幕的高度,1.5代表1个半屏幕高度
+   * @default 1
+   */
+  preLoadScreen?: string | number
+  /**
+   * 滚动条滚动触发事件
+   * @param scrollTop 滚动条位置
+   */
+  onScroll?: (scrollTop: number) => any
+  /**
+   * 滚动到底部触发事件
+   */
+  onScrolltolower?: () => any
+}
+
+declare interface _List {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      ListProps
+  }
+}
+
+export declare const List: _List
diff --git a/uni_modules/uview-plus/types/comps/listItem.d.ts b/uni_modules/uview-plus/types/comps/listItem.d.ts
new file mode 100644
index 0000000..f8dcd9c
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/listItem.d.ts
@@ -0,0 +1,18 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface ListItemProps {
+  /**
+   * 用于滚动到指定item
+   */
+  anchor?: string | number
+}
+
+declare interface _ListItem {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      ListItemProps
+  }
+}
+
+export declare const ListItem: _ListItem
diff --git a/uni_modules/uview-plus/types/comps/loadMore.d.ts b/uni_modules/uview-plus/types/comps/loadMore.d.ts
new file mode 100644
index 0000000..942ca87
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/loadMore.d.ts
@@ -0,0 +1,108 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface LoadMoreProps {
+  /**
+   * 组件状态
+   * @default "loadmore"
+   */
+  status?: 'loadmore' | 'loading' | 'nomore'
+  /**
+   * 组件背景颜色,在页面是非白色时会用到
+   * @default "transparent"
+   */
+  bgColor?: string
+  /**
+   * 加载中时是否显示图标
+   * @default true
+   */
+  icon?: boolean
+  /**
+   * 字体大小,单位rpx
+   * @default 14
+   */
+  fontSize?: string | number
+  /**
+   * 图标大小,单位px
+   * @default 17
+   */
+  iconSize?: string | number
+  /**
+   * 字体颜色
+   * @default "#606266"
+   */
+  color?: string
+  /**
+   * 加载中状态的图标
+   * @default "circle"
+   */
+  loadingIcon?: 'circle' | 'spinner' | 'semicircle'
+  /**
+   * 加载前的提示语
+   * @default "加载更多"
+   */
+  loadmoreText?: string
+  /**
+   * 加载中提示语
+   * @default "正在加载..."
+   */
+  loadingText?: string
+  /**
+   * 没有更多的提示语
+   * @default "没有更多了"
+   */
+  nomoreText?: string
+  /**
+   * `status`为`nomore`时,内容显示为一个"●"
+   * @default false
+   */
+  isDot?: boolean
+  /**
+   * 加载中的动画图标的颜色
+   * @default "#b7b7b7"
+   */
+  iconColor?: string
+  /**
+   * 线条颜色
+   * @default "#E6E8EB"
+   */
+  lineColor?: string
+  /**
+   * 是否虚线,false-实线,true-虚线
+   * @default false
+   */
+  dashed?: boolean
+  /**
+   * 与前一个元素的距离,单位rpx
+   * @default 10
+   */
+  marginTop?: string | number
+  /**
+   * 与后一个元素的距离,单位rpx
+   * @default 10
+   */
+  marginBottom?: string | number
+  /**
+   * 高度
+   * @default "auto"
+   */
+  height?: string | number
+  /**
+   * 是否显示左边分割线
+   * @default false
+   */
+  line?: boolean
+  /**
+   * `status`为`loadmore`时,点击组件会发出此事件
+   */
+  onLoadmore?: () => any
+}
+
+declare interface _LoadMore {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      LoadMoreProps
+  }
+}
+
+export declare const LoadMore: _LoadMore
diff --git a/uni_modules/uview-plus/types/comps/loadingIcon.d.ts b/uni_modules/uview-plus/types/comps/loadingIcon.d.ts
new file mode 100644
index 0000000..4a842a0
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/loadingIcon.d.ts
@@ -0,0 +1,68 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface LoadingIconProps {
+  /**
+   * 是否显示动画
+   * @default true
+   */
+  show?: boolean
+  /**
+   * 图标颜色
+   * @default "color['u-tips-color']"
+   */
+  color?: string
+  /**
+   * 提示文本颜色
+   * @default "color['u-tips-color']"
+   */
+  textColor?: string
+  /**
+   * 图标和文字是否垂直排列
+   * @default false
+   */
+  vertical?: boolean
+  /**
+   * 模式选
+   * @default "circle"
+   */
+  mode?: 'circle' | 'semicircle'
+  /**
+   * 加载图标的大小,单位px
+   * @default 24
+   */
+  size?: string | number
+  /**
+   * 加载文字的大小,单位px
+   * @default 15
+   */
+  textSize?: string | number
+  /**
+   * 文字内容
+   */
+  text?: string
+  /**
+   * 指定`animation-timing-function`的css属性,但只支持`mode`为`circle`或`semicircle`才有效
+   * @default "ease-in-out"
+   */
+  timingFunction?: string
+  /**
+   * 动画执行周期时间,单位ms
+   * @default 1200
+   */
+  duration?: string | number
+  /**
+   * 图标的暗边颜色, `mode`为`circle` 模式有效
+   * @default "transparent"
+   */
+  inactiveColor?: string
+}
+
+declare interface _LoadingIcon {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      LoadingIconProps
+  }
+}
+
+export declare const LoadingIcon: _LoadingIcon
diff --git a/uni_modules/uview-plus/types/comps/loadingPage.d.ts b/uni_modules/uview-plus/types/comps/loadingPage.d.ts
new file mode 100644
index 0000000..88e03ab
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/loadingPage.d.ts
@@ -0,0 +1,58 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface LoadingPageProps {
+  /**
+   * 提示内容
+   * @default "正在加载"
+   */
+  loadingText?: string | number
+  /**
+   * 文字上方用于替换loading动画的图片
+   */
+  image?: string
+  /**
+   * 加载动画的模式
+   * @default "circle"
+   */
+  loadingMode?: 'circle' | 'spinner' | 'semicircle'
+  /**
+   * 是否加载中
+   * @default false
+   */
+  loading?: boolean
+  /**
+   * 背景颜色
+   * @default "#ffffff"
+   */
+  bgColor?: string
+  /**
+   * 文字颜色
+   * @default "#C8C8C8"
+   */
+  color?: string
+  /**
+   * 文字大小
+   * @default 19
+   */
+  fontSize?: string | number
+  /**
+   * 图标大小
+   * @default 28
+   */
+  iconSize?: string | number
+  /**
+   * 加载中图标的颜色
+   * @default "#C8C8C8"
+   */
+  loadingColor?: string
+}
+
+declare interface _LoadingPage {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      LoadingPageProps
+  }
+}
+
+export declare const LoadingPage: _LoadingPage
diff --git a/uni_modules/uview-plus/types/comps/modal.d.ts b/uni_modules/uview-plus/types/comps/modal.d.ts
new file mode 100644
index 0000000..b9e2b57
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/modal.d.ts
@@ -0,0 +1,115 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface ModalProps {
+  /**
+   * 是否显示模态框,请赋值给`show`
+   * @default false
+   */
+  show?: boolean
+  /**
+   * 标题内容
+   */
+  title?: string
+  /**
+   * 模态框内容,如传入`slot`内容,则此参数无效
+   */
+  content?: string
+  /**
+   * 确认按钮的文字
+   * @default "确认"
+   */
+  confirmText?: string
+  /**
+   * 取消按钮的文字
+   * @default "取消"
+   */
+  cancelText?: string
+  /**
+   * 是否显示确认按钮
+   * @default true
+   */
+  showConfirmButton?: boolean
+  /**
+   * 是否显示取消按钮
+   * @default false
+   */
+  showCancelButton?: boolean
+  /**
+   * 确认按钮的颜色
+   * @default "#2979ff"
+   */
+  confirmColor?: string
+  /**
+   * 取消按钮的颜色
+   * @default "#606266"
+   */
+  cancelColor?: string
+  /**
+   * 对调确认和取消的位置
+   * @default false
+   */
+  buttonReverse?: boolean
+  /**
+   * 是否开启缩放模式
+   * @default true
+   */
+  zoom?: boolean
+  /**
+   * 是否异步关闭,只对确定按钮有效
+   * @default false
+   */
+  asyncClose?: boolean
+  /**
+   * 是否允许点击遮罩关闭Modal(注意:关闭事件需要自行处理,只会在开启closeOnClickOverlay后点击遮罩层执行close回调)
+   * @default false
+   */
+  closeOnClickOverlay?: boolean
+  /**
+   * 往上偏移的值,给一个负的margin-top,往上偏移,避免和键盘重合的情况,单位任意,数值则默认为rpx单位
+   * @default 0
+   */
+  negativeTop?: string | number
+  /**
+   * modal宽度,不支持百分比,可以数值,px,rpx单位
+   * @default "650rpx"
+   */
+  width?: string | number
+  /**
+   * 确认按钮的样式,如设置,将不会显示取消按钮
+   */
+  confirmButtonShape?: 'circle' | 'square'
+  /**
+   * 点击确认按钮时触发
+   */
+  onConfirm?: () => any
+  /**
+   * 点击取消按钮时触发
+   */
+  onCancel?: () => any
+  /**
+   * 点击遮罩关闭出发,closeOnClickOverlay为true有效
+   */
+  onClose?: () => any
+}
+
+declare interface ModalSlots {
+  /**
+   * 传入自定义内容,一般为富文本
+   */
+  ['default']?: () => any
+  /**
+   * 传入自定义按钮,用于在微信小程序弹窗通过按钮授权的场景
+   */
+  ['confirm-button']?: () => any
+}
+
+declare interface _Modal {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      ModalProps
+    $slots: ModalSlots
+  }
+}
+
+export declare const Modal: _Modal
diff --git a/uni_modules/uview-plus/types/comps/navbar.d.ts b/uni_modules/uview-plus/types/comps/navbar.d.ts
new file mode 100644
index 0000000..b44b2a8
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/navbar.d.ts
@@ -0,0 +1,113 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface NavbarProps {
+  /**
+   * 是否开启顶部安全区适配
+   * @default true
+   */
+  safeAreaInsetTop?: boolean
+  /**
+   * 固定在顶部时,是否生成一个等高元素,以防止塌陷
+   * @default false
+   */
+  placeholder?: boolean
+  /**
+   * 导航栏是否固定在顶部
+   * @default true
+   */
+  fixed?: boolean
+  /**
+   * 导航栏底部是否显示下边框
+   * @default false
+   */
+  border?: boolean
+  /**
+   * 左边返回图标的名称,只能为uView自带的图标
+   * @default "arrow-left"
+   */
+  leftIcon?: string
+  /**
+   * 左边的提示文字
+   */
+  leftText?: string
+  /**
+   * 右边的提示文字
+   */
+  rightText?: string
+  /**
+   * 右边返回图标的名称,只能为uView自带的图标
+   */
+  rightIcon?: string
+  /**
+   * 导航栏标题,如设置为空字符,将会隐藏标题占位区域
+   */
+  title?: string
+  /**
+   * 导航栏背景设置
+   * @default"#fff
+   */
+  bgColor?: string
+  /**
+   * 导航栏标题的最大宽度,内容超出会以省略号隐藏,单位rpx
+   * @default "400rpx"
+   */
+  titleWidth?: string | number
+  /**
+   * 导航栏高度(不包括状态栏高度在内,内部自动加上),单位px
+   * @default "44px"
+   */
+  height?: string | number
+  /**
+   * 左侧返回图标的大小
+   * @default "20px"
+   */
+  leftIconSize?: string | number
+  /**
+   * 左侧返回图标的颜色
+   * @default "#303133"
+   */
+  leftIconColor?: string
+  /**
+   * 点击左侧区域(返回图标),是否自动返回上一页
+   * @default false
+   */
+  autoBack?: boolean
+  /**
+   * 标题的样式
+   */
+  titleStyle?: unknown
+  /**
+   * 点击左侧区域
+   */
+  onLeftClick?: () => any
+  /**
+   * 点击右侧区域
+   */
+  onRightClick?: () => any
+}
+
+declare interface NavbarSlots {
+  /**
+   * 自定义左侧部分内容
+   */
+  ['left']?: () => any
+  /**
+   * 自定义右侧部分内容
+   */
+  ['right']?: () => any
+  /**
+   * 自定义中部内容
+   */
+  ['center']?: () => any
+}
+
+declare interface _Navbar {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      NavbarProps
+    $slots: NavbarSlots
+  }
+}
+
+export declare const Navbar: _Navbar
diff --git a/uni_modules/uview-plus/types/comps/noNetwork.d.ts b/uni_modules/uview-plus/types/comps/noNetwork.d.ts
new file mode 100644
index 0000000..0558585
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/noNetwork.d.ts
@@ -0,0 +1,40 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface NoNetworkProps {
+  /**
+   * 没有网络时的提示语
+   * @default "哎呀,网络信号丢失"
+   */
+  tips?: string
+  /**
+   * 组件的`z-index`值
+   * @default 10080
+   */
+  zIndex?: string | number
+  /**
+   * 无网络的图片提示,可用的src地址或base64图片
+   */
+  image?: string
+  /**
+   * 用户点击页面的"重试"按钮时触发
+   */
+  onRetry?: () => any
+  /**
+   * "重试"后,有网络触发
+   */
+  onConnected?: () => any
+  /**
+   * "重试"后,无网络触发
+   */
+  onDisconnected?: () => any
+}
+
+declare interface _NoNetwork {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      NoNetworkProps
+  }
+}
+
+export declare const NoNetwork: _NoNetwork
diff --git a/uni_modules/uview-plus/types/comps/noticeBar.d.ts b/uni_modules/uview-plus/types/comps/noticeBar.d.ts
new file mode 100644
index 0000000..ae84540
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/noticeBar.d.ts
@@ -0,0 +1,85 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface NoticeBarProps {
+  /**
+   * 显示的内容,direction为column时要求为数组, 为row时要求为字符串
+   */
+  text?: string | string[]
+  /**
+   * 通告滚动模式,row-横向滚动,column-竖向滚动
+   * @default "row"
+   */
+  direction?: 'row' | 'column'
+  /**
+   * direction = row时,是否使用步进形式滚动
+   * @default false
+   */
+  step?: boolean
+  /**
+   * 是否显示左侧的音量图标
+   * @default "volume"
+   */
+  icon?: string
+  /**
+   * 通告模式,link-显示右箭头,closable-显示右侧关闭图标
+   */
+  mode?: 'link' | 'closable'
+  /**
+   * 文字颜色
+   * @default "#f9ae3d"
+   */
+  color?: string
+  /**
+   * 背景颜色
+   * @default "#fdf6ec"
+   */
+  bgColor?: string
+  /**
+   * 水平滚动时的滚动速度,即每秒滚动多少px(rpx),这有利于控制文字无论多少时,都能有一个恒定的速度
+   * @default 80
+   */
+  speed?: string | number
+  /**
+   * 字体大小
+   * @default 14
+   */
+  fontSize?: string | number
+  /**
+   * 滚动一个周期的时间长,单位ms
+   * @default 2000
+   */
+  duration?: string | number
+  /**
+   * 是否禁止用手滑动切换(目前HX2.6.11,只支持App 2.5.5+、H5 2.5.5+、支付宝小程序、字节跳动小程序)
+   * @default true
+   */
+  disableTouch?: boolean
+  /**
+   * 跳转的页面路径
+   */
+  url?: string
+  /**
+   * 页面跳转的类型
+   * @default "navigateTo"
+   */
+  linkType?: string
+  /**
+   * 点击通告文字触发
+   * @param index 点击的text的索引
+   */
+  onClick?: (index: number) => any
+  /**
+   * 点击右侧关闭图标触发
+   */
+  onClose?: () => any
+}
+
+declare interface _NoticeBar {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      NoticeBarProps
+  }
+}
+
+export declare const NoticeBar: _NoticeBar
diff --git a/uni_modules/uview-plus/types/comps/notify.d.ts b/uni_modules/uview-plus/types/comps/notify.d.ts
new file mode 100644
index 0000000..64cf140
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/notify.d.ts
@@ -0,0 +1,73 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface NotifyProps {
+  /**
+   * 到顶部的距离
+   * @default 0
+   */
+  top?: string | number
+  /**
+   * 主题
+   * @default "primary"
+   */
+  type?: 'primary' | 'success' | 'warning' | 'error'
+  /**
+   * 字体颜色
+   * @default "#fff"
+   */
+  color?: string
+  /**
+   * 背景颜色
+   */
+  bgColor?: string
+  /**
+   * 展示的文字内容
+   */
+  message?: string
+  /**
+   * 展示时长,为0时不消失,单位ms
+   * @default 3000
+   */
+  duration?: string | number
+  /**
+   * 字体大小,单位rpx
+   * @default 15
+   */
+  fontSize?: string | number
+  /**
+   * 是否留出顶部安全距离(状态栏高度)
+   * @default false
+   */
+  safeAreaInsetTop?: boolean
+}
+
+declare interface NotifySlots {
+  /**
+   * 通知内容
+   */
+  ['icon']?: () => any
+}
+
+declare interface _NotifyRef {
+  /**
+   * 显示并加载配置
+   */
+  show: (options: NotifyProps) => void
+  /**
+   * 关闭消息提示
+   */
+  close: () => void
+}
+
+declare interface _Notify {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      NotifyProps
+    $slots: NotifySlots
+  }
+}
+
+export declare const Notify: _Notify
+
+export declare const NotifyRef: _NotifyRef
diff --git a/uni_modules/uview-plus/types/comps/numberBox.d.ts b/uni_modules/uview-plus/types/comps/numberBox.d.ts
new file mode 100644
index 0000000..daa0998
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/numberBox.d.ts
@@ -0,0 +1,155 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface NumberBoxProps {
+  /**
+   * 步进器标识符,在change回调返回
+   */
+  name?: string | number
+  /**
+   * 用于双向绑定的值,初始化时设置设为默认min值(最小值)
+   * @default 1
+   */
+  value?: string | number
+  /**
+   * 用户可输入的最小值
+   * @default 1
+   */
+  min?: string | number
+  /**
+   * 用户可输入的最大值
+   * @default Number.MAX_SAFE_INTEGER
+   */
+  max?: string | number
+  /**
+   * 步长,每次加或减的值, 支持小数值,如需小数
+   * @default 1
+   */
+  step?: string | number
+  /**
+   * 是否只能输入正整数
+   * @default false
+   */
+  integer?: boolean
+  /**
+   * 是否禁用操作,包括输入框,加减按钮
+   * @default false
+   */
+  disabled?: boolean
+  /**
+   * 是否禁止输入框
+   * @default false
+   */
+  disabledInput?: boolean
+  /**
+   * 是否开启异步变更,开启后需要手动控制输入值
+   * @default false
+   */
+  asyncChange?: boolean
+  /**
+   * 输入框宽度,单位px
+   * @default 35
+   */
+  inputWidth?: string | number
+  /**
+   * 是否显示减少按钮
+   * @default true
+   */
+  showMinus?: boolean
+  /**
+   * 是否显示增加按钮
+   * @default true
+   */
+  showPlus?: boolean
+  /**
+   * 显示的小数位数
+   */
+  decimalLength?: string | number
+  /**
+   * 是否允许长按进行加减
+   * @default true
+   */
+  longPress?: boolean
+  /**
+   * 输入框文字和加减按钮图标的颜色
+   * @default "#323233"
+   */
+  color?: string
+  /**
+   * 按钮大小,宽高等于此值,单位px,输入框高度和此值保持一致
+   * @default 30
+   */
+  buttonSize?: string | number
+  /**
+   * 输入框和按钮的背景颜色
+   * @default "#EBECEE"
+   */
+  bgColor?: string
+  /**
+   * 指定光标于键盘的距离,避免键盘遮挡输入框,单位px
+   * @default 100
+   */
+  cursorSpacing?: string | number
+  /**
+   * 是否禁用增加按钮
+   * @default false
+   */
+  disablePlus?: boolean
+  /**
+   * 是否禁用减少按钮
+   * @default false
+   */
+  disableMinus?: boolean
+  /**
+   * 加减按钮图标的样式
+   */
+  iconStyle?: string
+  /**
+   * 输入框得到焦点触发(按钮可点击情况下)
+   * @param value 输入框当前值
+   * @param value 步进器标识符
+   */
+  onFocus?: (value: any, name: any) => any
+  /**
+   * 输入框失去焦点时触发
+   * @param value 输入框当前值
+   * @param value 步进器标识符
+   */
+  onBlur?: (value: any, name: any) => any
+  /**
+   * 输入框内容发生变化时触发
+   * @param value 输入框当前值
+   * @param value 步进器标识符
+   */
+  onChange?: (value: any, name: any) => any
+  /**
+   * 超过范围阈值时触发
+   * @type type 限制类型
+   */
+  onOverlimit?: (type: 'minus' | 'plus') => any
+}
+
+declare interface NumberBoxSlots {
+  /**
+   * 减少按钮
+   */
+  ['minus']?: () => any
+  /**
+   * 输入框
+   */
+  ['input']?: () => any
+  /**
+   * 增加按钮
+   */
+  ['plus']?: () => any
+}
+
+declare interface _NumberBox {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      NumberBoxProps
+    $slots: NumberBoxSlots
+  }
+}
+
+export declare const NumberBox: _NumberBox
diff --git a/uni_modules/uview-plus/types/comps/overlay.d.ts b/uni_modules/uview-plus/types/comps/overlay.d.ts
new file mode 100644
index 0000000..f820c63
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/overlay.d.ts
@@ -0,0 +1,46 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface OverlayProps {
+  /**
+   * 是否显示遮罩
+   * @default false
+   */
+  show?: boolean
+  /**
+   * z-index 层级
+   * @default 10070
+   */
+  zIndex?: string | number
+  /**
+   * 动画时长,单位毫秒
+   * @default 300
+   */
+  duration?: string | number
+  /**
+   * 不透明度值,当做rgba的第四个参数
+   * @default 0.5
+   */
+  opacity?: string | number
+  /**
+   * 点击遮罩发送此事件
+   */
+  onClick?: () => any
+}
+
+declare interface OverlaySlots {
+  /**
+   * 默认插槽,用于在遮罩层上方嵌入内容
+   */
+  ['default']?: () => any
+}
+
+declare interface _Overlay {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      OverlayProps
+    $slots: OverlaySlots
+  }
+}
+
+export declare const Overlay: _Overlay
diff --git a/uni_modules/uview-plus/types/comps/parse.d.ts b/uni_modules/uview-plus/types/comps/parse.d.ts
new file mode 100644
index 0000000..5174d9f
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/parse.d.ts
@@ -0,0 +1,101 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface ParseProps {
+  /**
+   * 背景颜色,只适用与APP-PLUS-NVUE
+   */
+  bgColor?: string
+  /**
+   * 要显示的富文本字符串
+   */
+  content?: string
+  /**
+   * 是否允许外部链接被点击时自动复制
+   */
+  copyLink?: string
+  /**
+   * 主域名,设置后将给链接自动拼接上主域名或协议名
+   */
+  domain?: string
+  /**
+   * 图片出错时的占位图链接
+   */
+  errorImg?: string
+  /**
+   * 是否开启图片懒加载,nvue不支持此属性
+   * @default true
+   */
+  lazyLoad?: boolean
+  /**
+   * 图片加载完成前的占位图
+   */
+  loadingImg?: string
+  /**
+   * 是否在播放一个视频时自动暂停其它视频
+   */
+  pauseVideo?: boolean
+  /**
+   * 是否开启图片被点击时自动预览
+   * @default true
+   */
+  previewImg?: boolean
+  /**
+   * 是否自动给 table 添加一个滚动层(使表格可以单独横向滚动)
+   * @default false
+   */
+  scrollTable?: boolean
+  /**
+   * 是否开启长按复制内容
+   * @default false
+   */
+  selectable?: boolean
+  /**
+   * 是否自动将 title 标签的内容设置到页面标题
+   * @default true
+   */
+  setTitle?: boolean
+  /**
+   * 是否开启图片被长按时显示菜单
+   * @default true
+   */
+  showImgMenu?: boolean
+  /**
+   * 设置标签的默认样式
+   */
+  tagStyle?: unknown
+  /**
+   * 是否使用页面内锚点
+   * @default false
+   */
+  useAnchor?: boolean | number
+  /**
+   * dom 加载完成时触发
+   */
+  onLoad?: () => any
+  /**
+   * 渲染完成时触发
+   */
+  onReady?: (...args: any) => any
+  /**
+   * 出错时触发
+   */
+  onError?: (...args: any) => any
+  /**
+   * 图片被点击时触发
+   */
+  onImgTap?: (...args: any) => any
+  /**
+   * 在链接被点击时触发
+   */
+  onLinkTap?: (...args: any) => any
+}
+
+declare interface _Parse {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      ParseProps
+  }
+}
+
+export declare const Parse: _Parse
diff --git a/uni_modules/uview-plus/types/comps/picker.d.ts b/uni_modules/uview-plus/types/comps/picker.d.ts
new file mode 100644
index 0000000..0536f18
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/picker.d.ts
@@ -0,0 +1,115 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface PickerProps {
+  /**
+   * 用于控制选择器的弹出与收起
+   * @default false
+   */
+  show?: boolean
+  /**
+   * 是否显示顶部的操作栏
+   * @default true
+   */
+  showToolbar?: boolean
+  /**
+   * 顶部中间的标题
+   */
+  title?: string
+  /**
+   * 设置每一列的数据,详见[文档](https://www.uviewui.com/components/picker.html#%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8)
+   */
+  columns?: any[]
+  /**
+   * 加载状态
+   * @default false
+   */
+  loading?: boolean
+  /**
+   * 各列中,单个选项的高度
+   * @default 14
+   */
+  itemHeight?: string | number
+  /**
+   * 取消按钮的文字
+   * @default "取消"
+   */
+  cancelText?: string
+  /**
+   * 确认按钮的文字
+   * @default "确认"
+   */
+  confirmText?: string
+  /**
+   * 取消按钮的颜色
+   * @default "#909193"
+   */
+  cancelColor?: string
+  /**
+   * 确认按钮的颜色
+   * @default "#3c9cff"
+   */
+  confirmColor?: string
+  /**
+   * 每列中可见选项的数量
+   * @default 5
+   */
+  visibleItemCount?: string | number
+  /**
+   * 自定义需要展示的`text`属性键名
+   * @default "text"
+   */
+  keyName?: string
+  /**
+   * 是否允许点击遮罩关闭选择器(注意:关闭事件需要自行处理,只会在开启closeOnClickOverlay后点击遮罩层执行close回调)
+   * @default false
+   */
+  closeOnClickOverlay?: boolean
+  /**
+   * 各列的默认索引
+   */
+  defaultIndex?: any[]
+  /**
+   * 是否在手指松开时立即触发`change`事件。若不开启则会在滚动动画结束后触发`change`事件,只在微信`2.21.1`及以上有效
+   * @default false
+   */
+  immediateChange?: boolean
+  /**
+   * 关闭选择器时触发
+   */
+  onClose?: () => any
+  /**
+   * 点击确定按钮,返回当前选择的值
+   */
+  onConfirm?: (...args: any) => any
+  /**
+   * 当选择值变化时触发
+   */
+  onChange?: (...args: any) => any
+  /**
+   * 点击取消按钮
+   */
+  onCancel?: () => any
+}
+
+declare interface _PickerRef {
+  /**
+   * 设置对应列的选择值
+   */
+  setIndexs: (index, setLastIndex) => any
+  /**
+   * 多列联动时需要用到,详见[文档](https://www.uviewui.com/components/picker.html#%E5%A4%9A%E5%88%97%E6%A8%A1%E5%BC%8F%E4%B8%8E%E5%A4%9A%E5%88%97%E8%81%94%E5%8A%A8)
+   */
+  setColumnValues: (...args: any) => any
+}
+
+declare interface _Picker {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      PickerProps
+  }
+}
+
+export declare const Picker: _Picker
+
+export declare const PickerRef: _PickerRef
diff --git a/uni_modules/uview-plus/types/comps/popup.d.ts b/uni_modules/uview-plus/types/comps/popup.d.ts
new file mode 100644
index 0000000..8be053f
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/popup.d.ts
@@ -0,0 +1,103 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface PopupProps {
+  /**
+   * 是否展示弹窗
+   * @default false
+   */
+  show?: boolean
+  /**
+   * 是否显示遮罩
+   * @default true
+   */
+  overlay?: boolean
+  /**
+   * 弹出方向
+   * @default 'bottom'
+   */
+  mode?: 'top' | 'right' | 'bottom' | 'center'
+  /**
+   * 遮罩打开或收起的动画过渡时间,单位ms
+   * @default 300
+   */
+  duration?: number
+  /**
+   * 是否显示关闭图标
+   * @default false
+   */
+  closeable?: boolean
+  /**
+   * 遮罩自定义样式,一般用于修改遮罩颜色,如:{background: 'rgba(3, 100, 219, 0.5)'}
+   */
+  overlayStyle?: unknown
+  /**
+   * 遮罩透明度,0-1之间,勿与overlayStyle共用
+   * @default 0.5
+   */
+  overlayOpacity?: number | string
+  /**
+   * 点击遮罩是否关闭弹窗(注意:关闭事件需要自行处理,只会在开启closeOnClickOverlay后点击遮罩层执行close回调)
+   * @default true
+   */
+  closeOnClickOverlay?: boolean
+  /**
+   * 弹出层的z-index值
+   * @default 10075
+   */
+  zIndex?: number | string
+  /**
+   * 是否为留出底部安全距离
+   * @default true
+   */
+  safeAreaInsetBottom?: boolean
+  /**
+   * 是否留出顶部安全距离(状态栏高度)
+   * @default false
+   */
+  safeAreaInsetTop?: boolean
+  /**
+   * 自定义关闭图标位置,top-left为左上角,top-right为右上角,bottom-left为左下角,bottom-right为右下角
+   */
+  closeIconPos?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'
+  /**
+   * 设置圆角值,仅对mode = top | bottom | center有效
+   * @default 0
+   */
+  round?: number | string
+  /**
+   * 当mode=center时 是否开启缩放
+   * @default true
+   */
+  zoom?: boolean
+  /**
+   * 背景色,一般用于特殊弹窗内容场景,设置为transparent可去除默认的白色背景
+   */
+  bgColor?: string
+  /**
+   * 用户自定义样式
+   */
+  customStyle?: unknown
+  /**
+   * 弹出层打开
+   */
+  onOpen?: () => any
+  /**
+   * 弹出层收起
+   */
+  onClose?: () => any
+}
+
+declare interface PopupSlots {
+  ['default']?: () => any
+}
+
+declare interface _Popup {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      PopupProps
+    $slots: PopupSlots
+  }
+}
+
+export declare const Popup: _Popup
diff --git a/uni_modules/uview-plus/types/comps/radio.d.ts b/uni_modules/uview-plus/types/comps/radio.d.ts
new file mode 100644
index 0000000..2175418
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/radio.d.ts
@@ -0,0 +1,77 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface RadioProps {
+  /**
+   * checkbox的名称
+   */
+  name?: string | number
+  /**
+   * 形状,square为方形,circle为圆型
+   * @default "square"
+   */
+  shape?: 'square' | 'circle'
+  /**
+   * 是否禁用
+   * @default false
+   */
+  disabled?: boolean
+  /**
+   * 是否禁止点击提示语选中复选框
+   */
+  labelDisabled?: string | boolean
+  /**
+   * 选中状态下的颜色,如设置此值,将会覆盖parent的activeColor值
+   */
+  activeColor?: string
+  /**
+   * 未选中的颜色
+   */
+  inactiveColor?: string
+  /**
+   * 图标的大小,单位px
+   */
+  iconSize?: string | number
+  /**
+   * label的字体大小,px单位
+   */
+  labelSize?: string | number
+  /**
+   * label提示文字,因为nvue下,直接slot进来的文字,由于特殊的结构,无法修改样式
+   */
+  label?: string | number
+  /**
+   * 整体的大小
+   */
+  size?: string | number
+  /**
+   * 图标颜色
+   */
+  iconColor?: string
+  /**
+   * label的颜色
+   */
+  labelColor?: string
+  /**
+   * 某个`radio`状态发生变化时触发(选中状态)
+   * @param name 通过`props`传递的`name`值
+   */
+  onChange?: (name: string) => any
+}
+
+declare interface RadioSlots {
+  /**
+   * 自定义修改label内容
+   */
+  ['default']?: () => any
+}
+
+declare interface _Radio {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      RadioProps
+    $slots: RadioSlots
+  }
+}
+
+export declare const Radio: _Radio
diff --git a/uni_modules/uview-plus/types/comps/radioGroup.d.ts b/uni_modules/uview-plus/types/comps/radioGroup.d.ts
new file mode 100644
index 0000000..d490205
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/radioGroup.d.ts
@@ -0,0 +1,97 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+
+declare interface RadioGroupProps {
+  /**
+   * 绑定的值
+   */
+  value?: string | number | boolean
+  /**
+   * 是否禁用全部checkbox
+   * @default false
+   */
+  disabled?: boolean
+  /**
+   * 形状,circle-圆形,square-方形
+   * @default "circle"
+   */
+  shape?: 'circle' | 'square'
+  /**
+   * 选中状态下的颜色,如子`Checkbox`组件设置此值,将会覆盖本值
+   * @default "#2979ff"
+   */
+  activeColor?: string
+  /**
+   * 未选中的颜色
+   * @default "#c8c9cc"
+   */
+  inactiveColor?: string
+  /**
+   * 标识符
+   */
+  name?: string
+  /**
+   * 整个组件的尺寸,默认px
+   * @default 18
+   */
+  size?: string | number
+  /**
+   * 布局方式,row-横向,column-纵向
+   * @default "row"
+   */
+  placement?: 'row' | 'column'
+  /**
+   * 文本
+   */
+  label?: string
+  /**
+   * label的字体颜色
+   * @default "#303133"
+   */
+  labelColor?: string
+  /**
+   * label的字体大小,px单位
+   * @default 14
+   */
+  labelSize?: string | number
+  /**
+   * 是否禁止点击文本操作
+   * @default false
+   */
+  labelDisabled?: boolean
+  /**
+   * 图标颜色
+   * @default "#fff"
+   */
+  iconColor?: string
+  /**
+   * 图标的大小,单位px
+   * @default 12
+   */
+  iconSize?: string | number
+  /**
+   * 竖向配列时,是否显示下划线
+   * @default false
+   */
+  borderBottom?: boolean
+  /**
+   * 勾选图标的对齐方式,left-左边,right-右边
+   * @default "left"
+   */
+  iconPlacement?: 'left' | 'right'
+  /**
+   * 任一个`radio`状态发生变化时触发
+   * @param name 值为`radio`通过`props`传递的`name`值
+   */
+  onChange?: (name: string) => any
+}
+
+declare interface _RadioGroup {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      RadioGroupProps
+  }
+}
+
+export declare const RadioGroup: _RadioGroup
diff --git a/uni_modules/uview-plus/types/comps/rate.d.ts b/uni_modules/uview-plus/types/comps/rate.d.ts
new file mode 100644
index 0000000..5e641d7
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/rate.d.ts
@@ -0,0 +1,85 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+
+declare interface RateProps {
+  /**
+   * 双向绑定选择星星的数量
+   * @default 1
+   */
+  value?: string | number
+  /**
+   * 最多可选的星星数量
+   * @default 5
+   */
+  count?: string | number
+  /**
+   * 是否禁止用户操作
+   * @default false
+   */
+  disabled?: boolean
+  /**
+   * 是否只读
+   * @default false
+   */
+  readonly?: boolean
+  /**
+   * 星星的大小,单位rpx
+   * @default 18
+   */
+  size?: string | number
+  /**
+   * 未选中星星的颜色
+   * @default "#b2b2b2"
+   */
+  inactiveColor?: string
+  /**
+   * 选中的星星颜色
+   * @default "#FA3534"
+   */
+  activeColor?: string
+  /**
+   * 星星之间的距离
+   * @default 4
+   */
+  gutter?: string | number
+  /**
+   * 最少选中星星的个数
+   * @default 1
+   */
+  minCount?: string | number
+  /**
+   * 是否允许半星选择
+   * @default false
+   */
+  allowHalf?: boolean
+  /**
+   * 选中时的图标名,只能为uView的内置图标
+   * @default "star-fill"
+   */
+  activeIcon?: string
+  /**
+   * 未选中时的图标名,只能为uView的内置图标
+   * @default "star"
+   */
+  inactiveIcon?: string
+  /**
+   * 是否可以通过滑动手势选择评分
+   * @default true
+   */
+  touchable?: boolean
+  /**
+   * 选中的星星发生变化时触发
+   * @param value 当前选中的星星的数量
+   */
+  onChange?: (value: number) => any
+}
+
+declare interface _Rate {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      RateProps
+  }
+}
+
+export declare const Rate: _Rate
diff --git a/uni_modules/uview-plus/types/comps/readMore.d.ts b/uni_modules/uview-plus/types/comps/readMore.d.ts
new file mode 100644
index 0000000..74786e4
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/readMore.d.ts
@@ -0,0 +1,80 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface ReadMoreProps {
+  /**
+   * 内容超出此高度才会显示展开全文按钮,单位rpx
+   * @default 400
+   */
+  showHeight?: string | number
+  /**
+   * 展开后是否显示收起按钮
+   * @default false
+   */
+  toggle?: boolean
+  /**
+   * 关闭时的提示文字
+   * @default "展开阅读全文"
+   */
+  closeText?: string
+  /**
+   * 展开时的提示文字
+   * @default "收起"
+   */
+  openText?: string
+  /**
+   * 提示文字的颜色
+   * @default "#2979ff"
+   */
+  color?: string
+  /**
+   * 提示文字的大小,默认单位px
+   * @default 14
+   */
+  fontSize?: string | number
+  /**
+   * 对阴影的自定义处理
+   */
+  shadowStyle?: {
+    backgroundImage?: string
+    paddingTop?: string
+    marginTop?: string
+  }
+  /**
+   * 段落首行缩进的字符个数
+   * @default "2em"
+   */
+  textIndent?: string
+  /**
+   * 用于在`open`和`close`事件中当作回调参数返回
+   */
+  name?: string | number
+  /**
+   * 内容被展开时触发
+   * @param name props中传入的`name`参数值
+   */
+  onOpen?: (name: any) => any
+  /**
+   * 内容被收起时触发
+   * @param name props中传入的`name`参数值
+   */
+  onClose?: (name: any) => any
+}
+
+declare interface _ReadMoreRef {
+  /**
+   * 重新初始化组件内部高度计算过程,如果内嵌u-parse组件时可能需要用到
+   */
+  init: () => void
+}
+
+declare interface _ReadMore {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      ReadMoreProps
+  }
+}
+
+export declare const ReadMore: _ReadMore
+
+export declare const ReadMoreRef: _ReadMoreRef
diff --git a/uni_modules/uview-plus/types/comps/row.d.ts b/uni_modules/uview-plus/types/comps/row.d.ts
new file mode 100644
index 0000000..8b874c8
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/row.d.ts
@@ -0,0 +1,34 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+
+declare interface RowProps {
+  /**
+   * 栅格间隔,左右各为此值的一半,单位任意
+   * @default 0
+   */
+  gutter?: string | number
+  /**
+   * 水平排列方式(微信小程序暂不支持)
+   * @default "start"
+   */
+  justify?: 'start' | 'flex-start' | 'end' | 'flex-end' | 'center' | 'around' | 'space-around' | 'between' | 'space-between'
+  /**
+   * 垂直排列方式
+   * @default "center"
+   */
+  align?: 'top' | 'center' | 'bottom'
+  /**
+   * 点击触发事件
+   */
+  onClick?: () => any
+}
+
+declare interface _Row {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      RowProps
+  }
+}
+
+export declare const Row: _Row
diff --git a/uni_modules/uview-plus/types/comps/scrollList.d.ts b/uni_modules/uview-plus/types/comps/scrollList.d.ts
new file mode 100644
index 0000000..d2fdd66
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/scrollList.d.ts
@@ -0,0 +1,51 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface ScrollListProps {
+  /**
+   * 指示器的整体宽度
+   * @default 50
+   */
+  indicatorWidth?: string | number
+  /**
+   * 滑块的宽度
+   * @default 20
+   */
+  indicatorBarWidth?: string | number
+  /**
+   * 是否显示面板指示器
+   * @default true
+   */
+  indicator?: boolean
+  /**
+   * 指示器非激活颜色
+   * @default "#f2f2f2"
+   */
+  indicatorColor?: string
+  /**
+   * 指示器滑块颜色
+   * @default "#3c9cff"
+   */
+  indicatorActiveColor?: string
+  /**
+   * 指示器样式,可通过bottom,left,right进行定位
+   */
+  indicatorStyle: string | Record<string, any>
+  /**
+   * 滑动到左边时触发
+   */
+  onLeft?: () => any
+  /**
+   * 滑动到右边时触发
+   */
+  onRight?: () => any
+}
+
+declare interface _ScrollList {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      ScrollListProps
+  }
+}
+
+export declare const ScrollList: _ScrollList
diff --git a/uni_modules/uview-plus/types/comps/search.d.ts b/uni_modules/uview-plus/types/comps/search.d.ts
new file mode 100644
index 0000000..26c3337
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/search.d.ts
@@ -0,0 +1,167 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+
+declare interface SearchProps {
+  /**
+   * 双向绑定输入框搜索值
+   */
+  ['v-model']?: string
+  /**
+   * 搜索框形状,round-圆形,square-方形
+   * @default "round"
+   */
+  shape?: 'round' | 'square'
+  /**
+   * 搜索框背景颜色
+   * @default "#f2f2f2"
+   */
+  bgColor?: string
+  /**
+   * 占位文字内容
+   * @default "请输入关键字"
+   */
+  placeholder?: string
+  /**
+   * 是否启用清除控件
+   * @default true
+   */
+  clearabled?: boolean
+  /**
+   * 是否自动获得焦点
+   * @default false
+   */
+  focus?: boolean
+  /**
+   * 是否显示右侧控件(右侧的"搜索"按钮)
+   * @default true
+   */
+  showAction?: boolean
+  /**
+   * 右侧控件的样式,对象形式
+   */
+  actionStyle?: unknown
+  /**
+   * 右侧控件文字
+   * @default "搜索"
+   */
+  actionText?: string
+  /**
+   * 输入框内容水平对齐方式
+   * @default "left"
+   */
+  inputAlign?: 'left' | 'center'  |'right'
+  /**
+   * 自定义输入框样式,对象形式
+   */
+  inputStyle?: unknown
+  /**
+   * 是否启用输入框
+   * @default false
+   */
+  disabled?: boolean
+  /**
+   * 边框颜色,配置了颜色,才会有边框
+   * @default "transparent"
+   */
+  borderColor?: string
+  /**
+   * 搜索图标的颜色,默认同输入框字体颜色
+   * @default "#909399"
+   */
+  searchIconColor?: string
+  /**
+   * 搜索图标的大小
+   * @default 22
+   */
+  searchIconSize?: number
+  /**
+   * 输入框字体颜色
+   * @default "#606266"
+   */
+  color?: string
+  /**
+   * placeholder的颜色
+   * @default "#909399"
+   */
+  placeholderColor?: string
+  /**
+   * 输入框左边的图标,可以为uView图标名称或图片路径
+   * @default "search"
+   */
+  searchIcon?: string
+  /**
+   * 组件与其他上下左右元素之间的距离,带单位的字符串形式,如"30rpx"、"30rpx 20rpx"等写法
+   * @default "0"
+   */
+  margin?: string
+  /**
+   * 是否开启动画,详见[文档](https://www.uviewui.com/components/search.html#%E6%98%AF%E5%90%A6%E5%BC%80%E5%90%AF%E5%8F%B3%E8%BE%B9%E6%8E%A7%E4%BB%B6)
+   * @default false
+   */
+  animation?: boolean
+  /**
+   * 输入框初始值
+   */
+  value?: string
+  /**
+   * 输入框最大能输入的长度,-1为不限制长度
+   * @default -1
+   */
+  maxlength?: string | number
+  /**
+   * 输入框高度,单位rpx
+   * @default 64
+   */
+  height?: string | number
+  /**
+   * 搜索左侧文本信息
+   */
+  label?: string | number
+  /**
+   * 输入框内容发生变化时触发
+   * @param value 输入框的值
+   */
+  onChange?: (value: any) => any
+  /**
+   * 用户确定搜索时触发,用户按回车键,或者手机键盘右下角的"搜索"键时触发
+   * @param value 输入框的值
+   */
+  onSearch?: (value: any) => any
+  /**
+   * 用户点击右侧控件时触发
+   * @param value 输入框的值
+   */
+  onCustom?: (value: any) => any
+  /**
+   * 输入框失去焦点时触发
+   * @param value 输入框的值
+   */
+  onBlur?: (value: any) => any
+  /**
+   * 输入框获得焦点时触发
+   * @param value 输入框的值
+   */
+  onFocus?: (value: any) => any
+  /**
+   * 配置了`clearabled`后,清空内容时会发出此事件
+   */
+  onClear?: () => any
+  /**
+   * `disabled`为`true`时,点击输入框,发出此事件,用于跳转搜索页
+   */
+  onClick?: () => any
+  /**
+   * 左侧icon点击时候时触发
+   */
+  onClickIcon?: () => any
+}
+
+declare interface _Search {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      SearchProps
+  }
+}
+
+export declare const Search: _Search
diff --git a/uni_modules/uview-plus/types/comps/skeleton.d.ts b/uni_modules/uview-plus/types/comps/skeleton.d.ts
new file mode 100644
index 0000000..8442532
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/skeleton.d.ts
@@ -0,0 +1,70 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+
+declare interface SkeletonProps {
+  /**
+   * 是否显示骨架占位图,设置为`false`将会展示子组件内容
+   * @default true
+   */
+  loading?: boolean
+  /**
+   * 是否开启动画效果
+   * @default true
+   */
+  animate?: boolean
+  /**
+   * 段落占位图行数
+   * @default 0
+   */
+  rows?: string | number
+  /**
+   * 段落占位图的宽度,可以为百分比,数值,带单位字符串等,可通过数组传入指定每个段落行的宽度
+   * @default "100%"
+   */
+  rowsWidth?: string | number | any[]
+  /**
+   * 段落的高度
+   * @default 18
+   */
+  rowsHeight?: string | number | any[]
+  /**
+   * 是否展示标题占位图
+   * @default true
+   */
+  title?: boolean
+  /**
+   * 标题的宽度
+   * @default "50%"
+   */
+  titleWidth?: string | number
+  /**
+   * 标题的高度
+   * @default 18
+   */
+  titleHeight?: string | number
+  /**
+   * 是否展示头像占位图
+   * @default false
+   */
+  avatar?: boolean
+  /**
+   * 头像占位图大小
+   * @default 32
+   */
+  avatarSize?: string | number
+  /**
+   * 头像占位图的形状
+   * @default "circle"
+   */
+  avatarShape?: 'circle' | 'square'
+}
+
+declare interface _Skeleton {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      SkeletonProps
+  }
+}
+
+export declare const Skeleton: _Skeleton
diff --git a/uni_modules/uview-plus/types/comps/slider.d.ts b/uni_modules/uview-plus/types/comps/slider.d.ts
new file mode 100644
index 0000000..801fd17
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/slider.d.ts
@@ -0,0 +1,79 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+
+declare interface SliderProps {
+  /**
+   * 双向绑定滑块选择值
+   * @default 0
+   */
+  value?: string | number
+  /**
+   * 滑块的大小
+   * @default 18
+   */
+  blockSize?: string | number
+  /**
+   * 可选的最小值(0-100之间)
+   * @default 1
+   */
+  min?: string | number
+  /**
+   * 可选的最大值(0-100之间)
+   * @default 100
+   */
+  max?: string | number
+  /**
+   * 选择的步长
+   * @default 1
+   */
+  step?: string | number
+  /**
+   * 进度条的激活部分颜色
+   * @default "#2979ff"
+   */
+  activeColor?: string
+  /**
+   * 进度条的背景颜色
+   * @default "#c0c4cc"
+   */
+  inactiveColor?: string
+  /**
+   * 滑块背景颜色
+   * @default "#ffffff"
+   */
+  blockColor?: string
+  /**
+   * 是否显示当前 value
+   * @default false
+   */
+  showValue?: boolean
+  /**
+   * 滑块按钮自定义样式
+   */
+  blockStyle?: unknown
+  /**
+   * 更新v-model的
+   * @param value 当前值
+   */
+  onInput?: (value: any) => any
+  /**
+   * 触发事件(拖动过程中)
+   * @param value 当前值
+   */
+  onChanging?: (value: any) => any
+  /**
+   * 触发事件
+   * @param value 当前值
+   */
+  onChange?: (value: any) => any
+}
+
+declare interface _Slider {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      SliderProps
+  }
+}
+
+export declare const Slider: _Slider
diff --git a/uni_modules/uview-plus/types/comps/steps.d.ts b/uni_modules/uview-plus/types/comps/steps.d.ts
new file mode 100644
index 0000000..ee738c4
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/steps.d.ts
@@ -0,0 +1,48 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+
+declare interface StepsProps {
+  /**
+   * 方向
+   * @default "row"
+   */
+  direction?: 'row' | 'column'
+  /**
+   * 设置当前处于第几步
+   * @default 0
+   */
+  current?: number | string
+  /**
+   * 激活状态颜色
+   * @default "#3c9cff"
+   */
+  activeColor?: string
+  /**
+   * 未激活状态颜色
+   * @default "#969799"
+   */
+  inactiveColor?: string
+  /**
+   * 激活状态的图标
+   */
+  activeIcon?: string
+  /**
+   * 未激活状态图标
+   */
+  inactiveIcon?: string
+  /**
+   * 是否显示点类型
+   * @default false
+   */
+  dot?: boolean
+}
+
+declare interface _Steps {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      StepsProps
+  }
+}
+
+export declare const Steps: _Steps
diff --git a/uni_modules/uview-plus/types/comps/stepsItem.d.ts b/uni_modules/uview-plus/types/comps/stepsItem.d.ts
new file mode 100644
index 0000000..62d11af
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/stepsItem.d.ts
@@ -0,0 +1,41 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+
+declare interface StepsItemProps {
+  /**
+   * 标题文字
+   */
+  title?: string
+  /**
+   * 描述文本
+   */
+  current?: string
+  /**
+   * 图标大小
+   * @default 17
+   */
+  iconSize?: string | number
+  /**
+   * 当前步骤是否处于失败状态
+   * @default false
+   */
+  error?: boolean
+}
+
+declare interface StepsItemSlots {
+  /**
+   * 自定步骤状态内容
+   */
+  ['default']?: () => any
+}
+
+declare interface _StepsItem {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      StepsItemProps
+    $slots: StepsItemSlots
+  }
+}
+
+export declare const StepsItem: _StepsItem
diff --git a/uni_modules/uview-plus/types/comps/sticky.d.ts b/uni_modules/uview-plus/types/comps/sticky.d.ts
new file mode 100644
index 0000000..31458d3
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/sticky.d.ts
@@ -0,0 +1,48 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+
+declare interface StickyProps {
+  /**
+   * 吸顶时与顶部的距离,单位rpx
+   * @default 0
+   */
+  offsetTop?: string | number
+  /**
+   * 导航栏高度,自定义导航栏时,需要传入此值
+   * @default 0
+   */
+  customNavHeight?: string | number
+  /**
+   * 是否禁用吸顶功能
+   * @default false
+   */
+  disabled?: boolean
+  /**
+   * 组件背景颜色
+   * @default #ffffff
+   */
+  bgColor?: string
+  /**
+   * 吸顶时的z-index值,NVUE无效
+   */
+  zIndex?: string | number
+  /**
+   * 自定义标识,用于区分是哪一个组件
+   */
+  index?: string | number
+}
+
+declare interface StickySlots {
+  ['default']?: () => any
+}
+
+declare interface _Sticky {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      StickyProps
+    $slots: StickySlots
+  }
+}
+
+export declare const Sticky: _Sticky
diff --git a/uni_modules/uview-plus/types/comps/subsection.d.ts b/uni_modules/uview-plus/types/comps/subsection.d.ts
new file mode 100644
index 0000000..c98fc1e
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/subsection.d.ts
@@ -0,0 +1,64 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+
+declare interface SubsectionProps {
+  /**
+   * 选项的数组
+   */
+  list?: any[]
+  /**
+   * 初始化时默认选中的选项索引值
+   * @default 0
+   */
+  current?: string | number
+  /**
+   * 激活时的颜色
+   * @default "#3c9cff"
+   */
+  activeColor?: string
+  /**
+   * 未激活时的颜色
+   * @default "#303133"
+   */
+  inactiveColor?: string
+  /**
+   * 模式选择
+   * @default "button"
+   */
+  mode?: 'button' | 'subsection'
+  /**
+   * 字体大小,单位px
+   * @default 12
+   */
+  fontSize?: string | number
+  /**
+   * 激活选项的字体是否加粗
+   * @default true
+   */
+  bold?: boolean
+  /**
+   * 组件背景颜色,`mode`为`button`时有效
+   * @default "#eeeeef"
+   */
+  bgColor?: string
+  /**
+   * 从`list`元素对象中读取的键名
+   * @default "name"
+   */
+  keyName?: string
+  /**
+   * 分段器选项发生改变时触发
+   * @param index 选项的index索引值,从0开始
+   */
+  onChange?: (index: number) => any
+}
+
+declare interface _Subsection {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      SubsectionProps
+  }
+}
+
+export declare const Subsection: _Subsection
diff --git a/uni_modules/uview-plus/types/comps/swipeAction.d.ts b/uni_modules/uview-plus/types/comps/swipeAction.d.ts
new file mode 100644
index 0000000..b66ba9d
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/swipeAction.d.ts
@@ -0,0 +1,24 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface SwipeActionProps {
+  /**
+   * 是否自动关闭其他swipe按钮组
+   * @default true
+   */
+  autoClose?: boolean
+  /**
+   * 点击组件时触发
+   * @param index 索引
+   */
+  onClick?: (index: number) => any
+}
+
+declare interface _SwipeAction {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      SwipeActionProps
+  }
+}
+
+export declare const SwipeAction: _SwipeAction
diff --git a/uni_modules/uview-plus/types/comps/swipeActionItem.d.ts b/uni_modules/uview-plus/types/comps/swipeActionItem.d.ts
new file mode 100644
index 0000000..5555e66
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/swipeActionItem.d.ts
@@ -0,0 +1,58 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface SwipeActionItemProps {
+  /**
+   * 控制打开或者关闭
+   * @default false
+   */
+  show?: boolean
+  /**
+   * 标识符,如果是v-for,可用index索引
+   */
+  index?: string | number
+  /**
+   * 是否禁用
+   * @default false
+   */
+  disabled?: boolean
+  /**
+   * 是否自动关闭其他swipe按钮组
+   * @default true
+   */
+  autoClose?: boolean
+  /**
+   * 滑动距离阈值,只有大于此值,才被认为是要打开菜单
+   * @default 20
+   */
+  threshold?: number
+  /**
+   * 右侧按钮内容
+   */
+  options?: any[]
+  /**
+   * 动画过渡时间,单位ms
+   * @default 300
+   */
+  duration?: string | number
+  /**
+   * 标识符,如果是v-for,可用index索引值
+   */
+  name?: string | number
+  /**
+   * 按钮被点击时触发
+   * @param name props参数`name`的值
+   * @param index 第几个按钮被点击
+   */
+  onClick?: (name: any, index: number) => any
+}
+
+
+declare interface _SwipeActionItem {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      SwipeActionItemProps
+  }
+}
+
+export declare const SwipeActionItem: _SwipeActionItem
diff --git a/uni_modules/uview-plus/types/comps/swiper.d.ts b/uni_modules/uview-plus/types/comps/swiper.d.ts
new file mode 100644
index 0000000..3ab1da8
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/swiper.d.ts
@@ -0,0 +1,142 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+import { ImageMode } from './image'
+
+declare interface SwiperProps {
+  /**
+   * 轮播图数据
+   */
+  list?: any[]
+  /**
+   * 是否显示面板指示器
+   * @default false
+   */
+  indicator?: boolean
+  /**
+   * 指示器激活的颜色
+   * @default "#fff"
+   */
+  indicatorActiveColor?: string
+  /**
+   * 指示器非激活颜色
+   * @default "rgba(255, 255, 255, 0.35)"
+   */
+  indicatorInactiveColor?: string
+  /**
+   * 指示器样式,可通过bottom,left,right进行定位
+   */
+  indicatorStyle?: string | Record<string, any>
+  /**
+   * 指示器模式
+   * @default "line"
+   */
+  indicatorMode?: 'line' | 'dot'
+  /**
+   * 是否自动切换
+   * @default true
+   */
+  autoplay?: boolean
+  /**
+   * 当前所在滑块的 index
+   * @default 0
+   */
+  current?: string | number
+  /**
+   * 当前所在滑块的 item-id ,不能与 current 被同时指定
+   */
+  currentItemId?: string
+  /**
+   * 滑块自动切换时间间隔(ms)
+   * @default 3000
+   */
+  interval?: string | number
+  /**
+   * 滑块切换过程所需时间(ms),nvue不支持
+   * @default 300
+   */
+  duration?: string | number
+  /**
+   * 播放到末尾后是否重新回到开头
+   * @default false
+   */
+  circular?: boolean
+  /**
+   * 前边距,可用于露出前一项的一小部分,nvue和支付宝不支持
+   * @default 0
+   */
+  previousMargin?: string | number
+  /**
+   * 后边距,可用于露出后一项的一小部分,nvue和支付宝不支持
+   * @default 0
+   */
+  nextMargin?: string | number
+  /**
+   * 当开启时,会根据滑动速度,连续滑动多屏,支付宝不支持
+   * @default false
+   */
+  acceleration?: boolean
+  /**
+   * 同时显示的滑块数量,nvue、支付宝小程序不支持
+   * @default 1
+   */
+  displayMultipleItems?: number
+  /**
+   * 指定swiper切换缓动动画类型, 只对微信小程序有效
+   * @default "default"
+   */
+  easingFunction?: 'default' | 'linear' | 'easeInCubic' | 'easeOutCubic' | 'easeInOutCubic'
+  /**
+   * list数组中指定对象的目标属性名
+   * @default "url"
+   */
+  keyName?: string
+  /**
+   * 裁剪模式
+   * @default "aspectFill"
+   */
+  imgMode?: ImageMode
+  /**
+   * 组件高度
+   * @default 130
+   */
+  height?: string | number
+  /**
+   * 背景颜色
+   * @default "#f3f4f6"
+   */
+  bgColor?: string
+  /**
+   * 组件圆角,数值或带单位的字符串
+   * @default 4
+   */
+  radius?: string | number
+  /**
+   * 是否加载中
+   * @default false
+   */
+  loading?: boolean
+  /**
+   * 是否显示标题,要求数组对象中有title属性
+   * @default false
+   */
+  showTitle?: boolean
+  /**
+   * 点击轮播图时触发
+   * @param index 点击了第几张图片,从0开始
+   */
+  onClick?: (index: number) => any
+  /**
+   * 轮播图切换时触发(自动或者手动切换)
+   * @param index 点击了第几张图片,从0开始
+   */
+  onChange?: (index: number) => any
+}
+
+declare interface _Swiper {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      SwiperProps
+  }
+}
+
+export declare const Swiper: _Swiper
diff --git a/uni_modules/uview-plus/types/comps/swiperIndicator.d.ts b/uni_modules/uview-plus/types/comps/swiperIndicator.d.ts
new file mode 100644
index 0000000..a4d7ebf
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/swiperIndicator.d.ts
@@ -0,0 +1,37 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface SwiperIndicatorProps {
+  /**
+   * 轮播的长度
+   * @default 0
+   */
+  length?: string | number
+  /**
+   * 当前处于活动状态的轮播的索引
+   * @default 0
+   */
+  current?: string | number
+  /**
+   * 指示器非激活颜色
+   */
+  indicatorActiveColor?: string
+  /**
+   * 指示器的激活颜色
+   */
+  indicatorInactiveColor?: string
+  /**
+   * 指示器的形式
+   * @default "line"
+   */
+  indicatorStyle?: 'line' | 'dot'
+}
+
+declare interface _SwiperIndicator {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      SwiperIndicatorProps
+  }
+}
+
+export declare const SwiperIndicator: _SwiperIndicator
diff --git a/uni_modules/uview-plus/types/comps/switch.d.ts b/uni_modules/uview-plus/types/comps/switch.d.ts
new file mode 100644
index 0000000..cb0d25a
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/switch.d.ts
@@ -0,0 +1,73 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface SwitchProps {
+  /**
+   * 是否处于加载中
+   * @default false
+   */
+  loading?: boolean
+  /**
+   * 是否禁用
+   * @default false
+   */
+  disabled?: boolean
+  /**
+   * 开关尺寸,单位rpx
+   */
+  size?: string | number
+  /**
+   * 打开时的背景色
+   * @default "#2979ff"
+   */
+  activeColor?: string
+  /**
+   * 关闭时的背景色
+   * @default "#ffffff"
+   */
+  inactiveColor?: string
+  /**
+   * 通过v-model双向绑定的值
+   * @default false
+   */
+  value?: string | number | boolean
+  /**
+   * switch打开时的值
+   * @default true
+   */
+  activeValue?: string | number | boolean
+  /**
+   * switch关闭时的值
+   * @default false
+   */
+  inactiveValue?: string | number | boolean
+  /**
+   * 是否开启异步变更,开启后需要手动控制输入值
+   * @default false
+   */
+  asyncChange?: boolean
+  /**
+   * 圆点与外边框的距离
+   * @default 0
+   */
+  space?: string | number
+  /**
+   * 在`switch`打开或关闭时触发
+   * @param value 打开时为`activeValue`值,关闭时为`inactiveValue`值
+   */
+  onChange?: (value: any) => any
+  /**
+   * 在`switch`打开或关闭时触发(没开启异步)
+   * @param value 打开时为`activeValue`值,关闭时为`inactiveValue`值
+   */
+  onInput?: (value: any) => any
+}
+
+declare interface _Switch {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      SwitchProps
+  }
+}
+
+export declare const Switch: _Switch
diff --git a/uni_modules/uview-plus/types/comps/tabbar.d.ts b/uni_modules/uview-plus/types/comps/tabbar.d.ts
new file mode 100644
index 0000000..1db16d8
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/tabbar.d.ts
@@ -0,0 +1,54 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface TabbarProps {
+  /**
+   * 当前匹配项的name
+   * @default null
+   */
+  value?: string | number
+  /**
+   * 是否为iPhoneX留出底部安全距离
+   * @default true
+   */
+  safeAreaInsetBottom?: boolean
+  /**
+   * 是否显示上方边框
+   * @default true
+   */
+  border?: boolean
+  /**
+   * 元素层级z-index
+   * @default 1
+   */
+  zIndex?: string | number
+  /**
+   * 选中标签的颜色
+   * @default "#1989fa"
+   */
+  activeColor?: string
+  /**
+   * 未选中标签的颜色
+   * @default "#7d7e80"
+   */
+  inactiveColor?: string
+  /**
+   * 是否固定在底部
+   * @default true
+   */
+  fixed?: boolean
+  /**
+   * fixed定位固定在底部时,是否生成一个等高元素防止塌陷
+   * @default true
+   */
+  placeholder?: boolean
+}
+
+declare interface _Tabbar {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      TabbarProps
+  }
+}
+
+export declare const Tabbar: _Tabbar
diff --git a/uni_modules/uview-plus/types/comps/tabbarItem.d.ts b/uni_modules/uview-plus/types/comps/tabbarItem.d.ts
new file mode 100644
index 0000000..f9ababd
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/tabbarItem.d.ts
@@ -0,0 +1,52 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface TabbarItemProps {
+  /**
+   * item标签的名称,作为与u-tabbar的value参数匹配的标识符
+   * @default null
+   */
+  name?: string | number
+  /**
+   * uView内置图标或者绝对路径的图片
+   */
+  icon?: string
+  /**
+   * 右上角的角标提示信息
+   * @default null
+   */
+  badge?: string | number
+  /**
+   * 是否显示圆点,将会覆盖badge参数
+   * @default false
+   */
+  dot?: boolean
+  /**
+   * 描述文本
+   */
+  text?: string
+  /**
+   * 控制徽标的位置
+   * @default "top: 6px;right:2px;"
+   */
+  badgeStyle?: Record<string, any> | string
+  /**
+   * 切换选项时触发
+   * @param index 当前要切换项的name
+   */
+  onChange?: (index: any) => any
+  /**
+   * 切换选项时触发
+   * @param index 当前要切换项的name
+   */
+  onClick?: (index: any) => any
+}
+
+declare interface _TabbarItem {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      TabbarItemProps
+  }
+}
+
+export declare const TabbarItem: _TabbarItem
diff --git a/uni_modules/uview-plus/types/comps/tabs.d.ts b/uni_modules/uview-plus/types/comps/tabs.d.ts
new file mode 100644
index 0000000..5acf9b2
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/tabs.d.ts
@@ -0,0 +1,85 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface TabsProps {
+  /**
+   * 滑块移动一次所需的时间,单位ms
+   * @default 300
+   */
+  duration?: string | number
+  /**
+   * 标签数组,元素为对象
+   */
+  list?: any[]
+  /**
+   * 滑块颜色
+   * @default "#3c9cff"
+   */
+  lineColor?: string
+  /**
+   * 菜单选择中时的样式
+   * @default "{ color: '#303133' }"
+   */
+  activeStyle?: unknown
+  /**
+   * 菜单非选中时的样式
+   * @default "{ color: '#606266' }"
+   */
+  inactiveStyle?: unknown
+  /**
+   * 滑块长度
+   * @default 20
+   */
+  lineWidth?: string | number
+  /**
+   * 滑块高度
+   * @default 3
+   */
+  lineHeight?: string | number
+  /**
+   * 滑块背景显示大小
+   * @default "cover"
+   */
+  lineBgSize?: string
+  /**
+   * 菜单item的样式
+   * @default "{ height: '44px' }"
+   */
+  itemStyle?: unknown
+  /**
+   * 菜单是否可滚动
+   * @default true
+   */
+  scrollable?: boolean
+  /**
+   * 当前选中标签的索引
+   * @default 0
+   */
+  current?: string | number
+  /**
+   * 从`list`元素对象中读取的键名
+   * @default "name"
+   */
+  keyName?: string
+  /**
+   * 点击标签时触发
+   * @param index 标签索引值
+   * @param item 传入的其他值
+   */
+  onClick?: (index: number, item: any) => any
+  /**
+   * 标签索引改变时触发(`disalbed`时不会触发)
+   * @param index 标签索引值
+   * @param item 传入的其他值
+   */
+  onChange?: (index: number, item: any) => any
+}
+
+declare interface _Tabs {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      TabsProps
+  }
+}
+
+export declare const Tabs: _Tabs
diff --git a/uni_modules/uview-plus/types/comps/tag.d.ts b/uni_modules/uview-plus/types/comps/tag.d.ts
new file mode 100644
index 0000000..c130566
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/tag.d.ts
@@ -0,0 +1,93 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface TagProps {
+  /**
+   * 主题类型
+   * @default "primary"
+   */
+  type?: 'primary' | 'success' | 'info' | 'warning' | 'error'
+  /**
+   * 不可用
+   * @default false
+   */
+  disabled?: boolean | string
+  /**
+   * 标签大小
+   * @default "medium"
+   */
+  size?: 'medium' | 'large' | 'mini'
+  /**
+   * 标签形状
+   * @default "square"
+   */
+  shape?: 'square' | 'circle'
+  /**
+   * 标签的文字内容
+   */
+  text?: string | number
+  /**
+   * 背景颜色,默认为空字符串,即不处理
+   * @default "#C6C7CB"
+   */
+  bgColor?: string
+  /**
+   * 标签字体颜色,默认为空字符串,即不处理
+   */
+  color?: string
+  /**
+   * 标签的边框颜色
+   */
+  borderColor?: string
+  /**
+   * 关闭按钮图标的颜色
+   */
+  closeColor?: string
+  /**
+   * 点击时返回的索引值,用于区分例遍的数组哪个元素被点击了
+   */
+  name?: string | number
+  /**
+   * 镂空时是否填充背景色
+   * @default false
+   */
+  plainFill?: boolean
+  /**
+   * 是否镂空
+   * @default false
+   */
+  plain?: boolean
+  /**
+   * 是否可关闭,设置为`true`,文字右边会出现一个关闭图标
+   * @default false
+   */
+  closable?: boolean
+  /**
+   * 标签显示与否
+   * @default true
+   */
+  show?: boolean
+  /**
+   * 内置图标,或绝对路径的图片
+   */
+  icon?: string
+  /**
+   * 点击触发事件
+   * @param index 传递的`index`参数值
+   */
+  onClick?: (index: number) => any
+  /**
+   * `closable`为`true`时,点击标签关闭按钮触发
+   * @param index 传递的`index`参数值
+   */
+  onClose?: (index: number) => any
+}
+
+declare interface _Tag {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      TagProps
+  }
+}
+
+export declare const Tag: _Tag
diff --git a/uni_modules/uview-plus/types/comps/text.d.ts b/uni_modules/uview-plus/types/comps/text.d.ts
new file mode 100644
index 0000000..dad5e2b
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/text.d.ts
@@ -0,0 +1,110 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface TextProps {
+  /**
+   * 主题颜色
+   */
+  type?: string
+  /**
+   * 是否显示
+   * @default true
+   */
+  show?: boolean
+  /**
+   * 显示的值
+   */
+  text?: string | number
+  /**
+   * 前置图标
+   */
+  prefixIcon?: string
+  /**
+   * 后置图标
+   */
+  suffixIcon?: string
+  /**
+   * 文本处理的匹配模式text-普通文本,price-价格,phone-手机号,name-姓名,date-日期,link-超链接
+   */
+  mode?: 'text' | 'price' | 'phone' | 'name' | 'date' | 'link'
+  /**
+   * mode=link下,配置的链接
+   */
+  href?: string
+  /**
+   * 格式化规则
+   */
+  format?: string | ((value: any) => any)
+  /**
+   * mode=phone时,点击文本是否拨打电话
+   * @default false
+   */
+  call?: boolean
+  /**
+   * 小程序的打开方式
+   */
+  openType?: string
+  /**
+   * 是否粗体,默认normal
+   * @default false
+   */
+  bold?: boolean
+  /**
+   * 是否块状
+   */
+  block?: boolean
+  /**
+   * 文本显示的行数,如果设置,超出此行数,将会显示省略号
+   */
+  lines?: string | number
+  /**
+   * 文本颜色
+   * @default "#303133"
+   */
+  color?: string
+  /**
+   * 字体大小
+   * @default 15
+   */
+  size?: string | number
+  /**
+   * 图标的样式
+   */
+  iconStyle?: Record<string, any> | string
+  /**
+   * 文字装饰,下划线,中划线等
+   * @default "none"
+   */
+  decoration?: 'none' | 'underline' | 'line-through'
+  /**
+   * 外边距,对象、字符串,数值形式均可
+   */
+  margin?: Record<string, any> | string | number
+  /**
+   * 文本行高
+   */
+  lineHeight?: number | string
+  /**
+   * 文本对齐方式
+   * @default "left"
+   */
+  align?: 'left' | 'center' | 'right'
+  /**
+   * 文字换行
+   * @default "normal"
+   */
+  wordWrap?: 'normal' | 'break-word' | 'any-where'
+  /**
+   * 点击触发事件
+   */
+  onClick?: () => any
+}
+
+declare interface _Text {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      TextProps
+  }
+}
+
+export declare const Text: _Text
diff --git a/uni_modules/uview-plus/types/comps/textarea.d.ts b/uni_modules/uview-plus/types/comps/textarea.d.ts
new file mode 100644
index 0000000..6ce07fa
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/textarea.d.ts
@@ -0,0 +1,158 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface TextareaProps {
+  /**
+   * 输入框的内容
+   */
+  value?: string | number
+  /**
+   * 输入框为空时占位符
+   */
+  placeholder?: string | number
+  /**
+   * 输入框高度
+   * @default 70
+   */
+  height?: string | number
+  /**
+   * 设置键盘右下角按钮的文字,仅微信小程序,App-vue和H5有效
+   * @default "done"
+   */
+  confirmType?: string
+  /**
+   * 是否禁用
+   * @default false
+   */
+  disabled?: boolean
+  /**
+   * 是否显示统计字数
+   * @default false
+   */
+  count?: boolean
+  /**
+   * 是否自动获取焦点,nvue不支持,H5取决于浏览器的实现
+   * @default false
+   */
+  focus?: boolean
+  /**
+   * 是否自动增加高度
+   * @default false
+   */
+  autoHeight?: boolean
+  /**
+   * 是否忽略组件内对文本合成系统事件的处理。为 false 时将触发 compositionstart、compositionend、compositionupdate 事件,且在文本合成期间会触发 input 事件
+   * @default true
+   */
+  ignoreCompositionEvent?: boolean
+  /**
+   * 如果textarea是在一个position:fixed的区域,需要显示指定属性fixed为true
+   * @default false
+   */
+  fixed?: boolean
+  /**
+   * 指定光标与键盘的距离
+   * @default 0
+   */
+  cursorSpacing?: number
+  /**
+   * 指定focus时的光标位置
+   */
+  cursor?: string | number
+  /**
+   * 是否显示键盘上方带有”完成“按钮那一栏
+   * @default true
+   */
+  showConfirmBar?: boolean
+  /**
+   * 光标起始位置,自动聚焦时有效,需与selection-end搭配使用
+   * @default -1
+   */
+  selectionStart?: number
+  /**
+   * 光标结束位置,自动聚焦时有效,需与selection-start搭配使用
+   * @default -1
+   */
+  selectionEnd?: number
+  /**
+   * 键盘弹起时,是否自动上推页面
+   * @default true
+   */
+  adjustPosition?: boolean
+  /**
+   * 是否去掉 iOS 下的默认内边距,只微信小程序有效
+   * @default false
+   */
+  disableDefaultPadding?: boolean
+  /**
+   * focus时,点击页面的时候不收起键盘,只微信小程序有效
+   * @default false
+   */
+  holdKeyboard?: boolean
+  /**
+   * 最大输入长度,设置为 -1 的时候不限制最大长度
+   * @default 140
+   */
+  maxlength?: string | number
+  /**
+   * 边框类型,surround-四周边框,none-无边框,bottom-底部边框
+   * @default "surround"
+   */
+  border?: 'surround' | 'none' | 'bottom'
+  /**
+   * 指定placeholder的样式类,注意页面或组件的style中写了scoped时,需要在类名前写/deep/
+   * @default "textarea-placeholder"
+   */
+  placeholderClass?: string
+  /**
+   * 指定placeholder的样式
+   * @default "color: #c0c4cc"
+   */
+  placeholderStyle?: unknown
+  /**
+   * 输入过滤或格式化函数(如需兼容微信小程序,则只能通过setFormatter方法)
+   */
+  formatter?: (...args: any) => any
+  /**
+   * 输入框聚焦时触发,event.detail = { value, height },height 为键盘高度
+   */
+  onFocus?: (...args: any) => any
+  /**
+   * 输入框失去焦点时触发,event.detail = {value, cursor}
+   */
+  onBlur?: (...args: any) => any
+  /**
+   * 输入框行数变化时调用,event.detail = {height: 0, heightRpx: 0, lineCount: 0}
+   */
+  onLinechange?: (...args: any) => any
+  /**
+   * 当键盘输入时,触发 input 事件
+   */
+  onInput?: (...args: any) => any
+  /**
+   * 点击完成时, 触发 confirm 事件
+   */
+  onConfirm?: (...args: any) => any
+  /**
+   * 键盘高度发生变化的时候触发此事件
+   */
+  onKeyboardheightchange?: (...args: any) => any
+}
+
+declare interface _TextareaRef {
+  /**
+   * 为兼容微信小程序而暴露的内部方法,详细见[文档](https://www.uviewui.com/components/textarea.html#%E6%A0%BC%E5%BC%8F%E5%8C%96%E5%A4%84%E7%90%86)
+   */
+  setFormatter: (...args: any) => any
+}
+
+declare interface _Textarea {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      TextareaProps
+  }
+}
+
+export declare const Textarea: _Textarea
+
+export declare const TextareaRef: _TextareaRef
diff --git a/uni_modules/uview-plus/types/comps/toast.d.ts b/uni_modules/uview-plus/types/comps/toast.d.ts
new file mode 100644
index 0000000..0fa115c
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/toast.d.ts
@@ -0,0 +1,59 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface ToastProps {
+  /**
+   * 是否加载中
+   * @default false
+   */
+  loading?: boolean
+  /**
+   * 显示的文本
+   */
+  message?: string | number
+  /**
+   * 图标,或者绝对路径的图片
+   */
+  icon?: string
+  /**
+   * toast出现的位置
+   * @default "center"
+   */
+  position?: 'top' | 'center' | 'bottom'
+  /**
+   * 主题类型
+   * @default "default"
+   */
+  type?: 'default' | 'error' | 'success' | 'loading'
+  /**
+   * 跳转的参数
+   */
+  params?: Record<string, any>
+  /**
+   * 展示时间,单位ms
+   * @default 2000
+   */
+  duration?: string | number
+  /**
+   * 执行完后的回调函数
+   */
+  complete?: () => any
+}
+
+declare interface _ToastRef {
+  /**
+   * 显示toast,如需一进入页面就显示toast,请在onReady生命周期调用
+   */
+  show: () => void
+}
+
+declare interface _Toast {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      ToastProps
+  }
+}
+
+export declare const Toast: _Toast
+
+export declare const ToastRef: _ToastRef
diff --git a/uni_modules/uview-plus/types/comps/tooltip.d.ts b/uni_modules/uview-plus/types/comps/tooltip.d.ts
new file mode 100644
index 0000000..e8ade82
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/tooltip.d.ts
@@ -0,0 +1,71 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface TooltipProps {
+  /**
+   * 需要显示的提示文字
+   */
+  text?: string | number
+  /**
+   * 点击复制按钮时,复制的文本,为空则使用text值
+   */
+  copyText?: string | number
+  /**
+   * 文本大小
+   * @default 14
+   */
+  size?: string | number
+  /**
+   * 字体颜色
+   * @default "#606266"
+   */
+  color?: string
+  /**
+   * 弹出提示框时,文本的背景色
+   * @default "transparent"
+   */
+  bgColor?: string
+  /**
+   * 弹出提示的方向
+   * @default "top"
+   */
+  direction?: 'top' | 'bottom'
+  /**
+   * 弹出提示的z-index,nvue无效
+   * @default 10071
+   */
+  zIndex?: string | number
+  /**
+   * 是否显示复制按钮
+   * @default true
+   */
+  showCopy?: boolean
+  /**
+   * 扩展的按钮组
+   */
+  buttons?: any[]
+  /**
+   * 是否显示透明遮罩以防止触摸穿透
+   * @default true
+   */
+  overlay?: boolean
+  /**
+   * 是否显示复制成功或者失败的`toast`
+   * @default true
+   */
+  showToast?: boolean
+  /**
+   * 点击触发事件
+   * @param index 被点击按钮的索引
+   */
+  onClick?: (index: number) => any
+}
+
+declare interface _Tooltip {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      TooltipProps
+  }
+}
+
+export declare const Tooltip: _Tooltip
diff --git a/uni_modules/uview-plus/types/comps/transition.d.ts b/uni_modules/uview-plus/types/comps/transition.d.ts
new file mode 100644
index 0000000..4e89174
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/transition.d.ts
@@ -0,0 +1,61 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+
+declare interface TransitionProps {
+  /**
+   * 是否展示组件
+   * @default false
+   */
+  show?: boolean
+  /**
+   * 使用的动画模式
+   * @default "fade"
+   */
+  mode?: 'fade' | 'fade-up' | 'fade-down' | 'fade-left' | 'fade-right' | 'slide-up' | 'slide-down' | 'slide-left' | 'slide-right' | 'zoom-in' | 'zoom-out'
+  /**
+   * 动画的执行时间,单位ms
+   * @default 300
+   */
+  duration?: string | number
+  /**
+   * 使用的动画过渡函数
+   */
+  timingFunction?: string
+  /**
+   * 自定义样式
+   */
+  customStyle?: unknown
+  /**
+   * 进入前触发
+   */
+  onBeforeEnter?: () => any
+  /**
+   * 进入中触发
+   */
+  onEnter?: () => any
+  /**
+   * 进入后触发
+   */
+  onAfterEnter?: () => any
+  /**
+   * 离开前触发
+   */
+  onBeforeLeave?: () => any
+  /**
+   * 离开中触发
+   */
+  onLeave?: () => any
+  /**
+   * 离开后触发
+   */
+  onAfterLeave?: () => any
+}
+
+declare interface _Transition {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      TransitionProps
+  }
+}
+
+export declare const Transition: _Transition
diff --git a/uni_modules/uview-plus/types/comps/upload.d.ts b/uni_modules/uview-plus/types/comps/upload.d.ts
new file mode 100644
index 0000000..7699168
--- /dev/null
+++ b/uni_modules/uview-plus/types/comps/upload.d.ts
@@ -0,0 +1,163 @@
+import { AllowedComponentProps, VNodeProps } from './_common'
+import { ImageMode } from './image';
+
+declare interface UploadProps {
+  /**
+   * 接受的文件类型,file只支持H5(只有微信小程序才支持把accept配置为all、media)
+   * @default "image"
+   */
+  accept?: 'all' | 'media' | 'image' | 'file' | 'video'
+  /**
+   * 图片或视频拾取模式,当accept为image类型时设置capture可选额外camera可以直接调起摄像头
+   * @default ["album", "camera"]
+   */
+  capture?: 'album' | 'camera' | ('album' | 'camera')[]
+  /**
+   * 当accept为video时生效,是否压缩视频,默认为true
+   * @default true
+   */
+  compressed?: boolean
+  /**
+   * 当accept为video时生效,可选值为back或front
+   * @default "back"
+   */
+  camera?: 'back' | 'front'
+  /**
+   * 当accept为video时生效,拍摄视频最长拍摄时间,单位秒
+   * @default 60
+   */
+  maxDuration?: number
+  /**
+   * 上传区域的图标,只能内置图标
+   * @default "camera-fill"
+   */
+  uploadIcon?: string
+  /**
+   * 上传区域的图标的颜色
+   * @default "#D3D4D6"
+   */
+  uploadIconColor?: string
+  /**
+   * 是否启用(显示/隐藏)组件
+   */
+  useBeforeRead?: boolean
+  /**
+   * 预览全图
+   * @default true
+   */
+  previewFullImage?: boolean
+  /**
+   * 最大选择图片的数量
+   * @default 52
+   */
+  maxCount?: string | number
+  /**
+   * 是否启用(显示/隐藏)组件
+   * @default false
+   */
+  disabled?: boolean
+  /**
+   * 预览上传的图片时的裁剪模式
+   * @default "aspectFill"
+   */
+  imageMode?: ImageMode
+  /**
+   * 标识符,可以在回调函数的第二项参数中获取
+   * @default "file"
+   */
+  name?: string
+  /**
+   * original 原图,compressed 压缩图,默认二者都有,H5无效
+   * @default ["original", "compressed"]
+   */
+  sizeType?: ('original' | 'compressed')[]
+  /**
+   * 是否开启图片多选,部分安卓机型不支持
+   * @default false
+   */
+  multiple?: boolean
+  /**
+   * 是否显示删除图片的按钮
+   * @default true
+   */
+  deletable?: boolean
+  /**
+   * 选择单个文件的最大大小,单位B(byte),默认不限制
+   * @default Number.MAX_VALUE
+   */
+  maxSize?: string | number
+  /**
+   * 显示已上传的文件列表
+   */
+  fileList?: any[]
+  /**
+   * 上传区域的提示文字
+   */
+  uploadText?: string
+  /**
+   * 内部预览图片区域和选择图片按钮的区域宽度,单位rpx,不能是百分比,或者`auto`
+   * @default 80
+   */
+  width?: string | number
+  /**
+   * 内部预览图片区域和选择图片按钮的区域高度,单位rpx,不能是百分比,或者`auto`
+   * @default 80
+   */
+  height?: string | number
+  /**
+   * 是否在上传完成后展示预览图
+   * @default true
+   */
+  previewImage?: boolean
+  /**
+   * 读取后的处理函数
+   */
+  onAfterRead?: (file, lists, name) => any
+  /**
+   * 读取前的处理函数
+   */
+  onBeforeRead?: (file, lists, name) => any
+  /**
+   * 图片大小超出最大允许大小
+   */
+  onOversize?: (file, lists, name) => any
+  /**
+   * 全屏预览图片时触发
+   */
+  onClickPreview?: (file, lists, name) => any
+  /**
+   * 删除图片
+   */
+  onDelete?: (index, file, name) => any
+}
+
+declare interface UploadSlots {
+  /**
+   * 自定义上传样式
+   */
+  ['default']?: () => any
+}
+
+declare interface _UploadRef {
+  /**
+   * 读取后的处理函数
+   */
+  afterRead: (file, lists, name) => any
+  /**
+   * 读取前的处理函数
+   */
+  beforeRead: (file, lists, name) => any
+}
+
+declare interface _Upload {
+  new (): {
+    $props: AllowedComponentProps &
+      VNodeProps &
+      UploadProps
+    $slots: UploadSlots
+  }
+}
+
+export declare const Upload: _Upload
+
+export declare const UploadRef: _UploadRef
diff --git a/uni_modules/uview-plus/types/index.d.ts b/uni_modules/uview-plus/types/index.d.ts
new file mode 100644
index 0000000..3ef8c7d
--- /dev/null
+++ b/uni_modules/uview-plus/types/index.d.ts
@@ -0,0 +1,47 @@
+/// <reference path="./comps.d.ts" />
+declare module 'uview-plus' {
+    export function install(): void  //必要
+    interface test {
+      /** 邮箱格式校验 */
+      email(email: string): boolean
+    }
+    interface $u {
+      route: {},
+      colorGradient: {},
+      hexToRgb: {},
+      rgbToHex: {},
+      colorToRgba: {},
+      test: test,
+      type: {},
+      http: {},
+      config: {},
+      zIndex: {},
+      debounce: {},
+      throttle: {},
+      mixin: {},
+      mpMixin: {},
+      props: {},
+      color: {},
+      platform: {},
+    }
+
+    global {
+      interface Uni {
+        $u: $u
+      }
+    }
+}
+declare type UniCountDownRef = typeof import('./comps/countDown')['CountDownRef']
+declare type UniCountToRef = typeof import('./comps/countTo')['CountToRef']
+declare type UniReadMoreRef = typeof import('./comps/readMore')['ReadMoreRef']
+declare type UniToastRef = typeof import('./comps/toast')['ToastRef']
+declare type UniCollapseRef = typeof import('./comps/collapse')['CollapseRef']
+declare type UniNotifyRef = typeof import('./comps/notify')['NotifyRef']
+declare type UniCodeRef = typeof import('./comps/code')['CodeRef']
+declare type UniInputRef = typeof import('./comps/input')['InputRef']
+declare type UniUploadRef = typeof import('./comps/upload')['UploadRef']
+declare type UniDatetimePickerRef = typeof import('./comps/datetimePicker')['DatetimePickerRef']
+declare type UniPickerRef = typeof import('./comps/picker')['PickerRef']
+declare type UniCalendarRef = typeof import('./comps/calendar')['CalendarRef']
+declare type UniTextareaRef = typeof import('./comps/textarea')['TextareaRef']
+declare type UniFormRef = typeof import('./comps/form')['FormRef']
diff --git a/uni_modules/uview-plus/types/package.json b/uni_modules/uview-plus/types/package.json
new file mode 100644
index 0000000..172c665
--- /dev/null
+++ b/uni_modules/uview-plus/types/package.json
@@ -0,0 +1,26 @@
+{
+  "name": "@uview-plus/types",
+  "version": "3.2.5",
+  "description": "types for uview-plus",
+  "main": "index.d.ts",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/ijry/uview-plus.git"
+  },
+  "keywords": [
+    "uview-plus"
+  ],
+  "author": "jry",
+  "license": "MIT",
+  "types": "./index.d.ts",
+  "bugs": {
+    "url": "https://github.com/ijry/uview-plus/issues"
+  },
+  "homepage": "https://github.com/ijry/uview-plus#readme",
+  "publishConfig": {
+    "registry": "https://registry.npmjs.org/"
+  }
+}
diff --git a/unpackage/dist/dev/mp-weixin/app.js b/unpackage/dist/dev/mp-weixin/app.js
new file mode 100644
index 0000000..92b6707
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/app.js
@@ -0,0 +1,150 @@
+"use strict";
+Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
+const common_vendor = require("./common/vendor.js");
+const uni_modules_uviewPlus_index = require("./uni_modules/uview-plus/index.js");
+require("./uni_modules/uview-plus/libs/mixin/mixin.js");
+require("./uni_modules/uview-plus/libs/function/index.js");
+require("./uni_modules/uview-plus/libs/function/test.js");
+require("./uni_modules/uview-plus/libs/function/digit.js");
+require("./uni_modules/uview-plus/libs/config/config.js");
+require("./uni_modules/uview-plus/libs/util/route.js");
+require("./uni_modules/uview-plus/libs/mixin/mpMixin.js");
+require("./uni_modules/uview-plus/libs/luch-request/core/Request.js");
+require("./uni_modules/uview-plus/libs/luch-request/core/dispatchRequest.js");
+require("./uni_modules/uview-plus/libs/luch-request/adapters/index.js");
+require("./uni_modules/uview-plus/libs/luch-request/helpers/buildURL.js");
+require("./uni_modules/uview-plus/libs/luch-request/utils.js");
+require("./uni_modules/uview-plus/libs/luch-request/core/buildFullPath.js");
+require("./uni_modules/uview-plus/libs/luch-request/helpers/isAbsoluteURL.js");
+require("./uni_modules/uview-plus/libs/luch-request/helpers/combineURLs.js");
+require("./uni_modules/uview-plus/libs/luch-request/core/settle.js");
+require("./uni_modules/uview-plus/libs/luch-request/core/InterceptorManager.js");
+require("./uni_modules/uview-plus/libs/luch-request/core/mergeConfig.js");
+require("./uni_modules/uview-plus/libs/luch-request/core/defaults.js");
+require("./uni_modules/uview-plus/libs/luch-request/utils/clone.js");
+require("./uni_modules/uview-plus/libs/function/colorGradient.js");
+require("./uni_modules/uview-plus/libs/function/debounce.js");
+require("./uni_modules/uview-plus/libs/function/throttle.js");
+require("./uni_modules/uview-plus/libs/config/props.js");
+require("./uni_modules/uview-plus/libs/config/props/actionSheet.js");
+require("./uni_modules/uview-plus/libs/config/props/album.js");
+require("./uni_modules/uview-plus/libs/config/props/alert.js");
+require("./uni_modules/uview-plus/libs/config/props/avatar.js");
+require("./uni_modules/uview-plus/libs/config/props/avatarGroup.js");
+require("./uni_modules/uview-plus/libs/config/props/backtop.js");
+require("./uni_modules/uview-plus/libs/config/props/badge.js");
+require("./uni_modules/uview-plus/libs/config/props/button.js");
+require("./uni_modules/uview-plus/libs/config/props/calendar.js");
+require("./uni_modules/uview-plus/libs/config/props/carKeyboard.js");
+require("./uni_modules/uview-plus/libs/config/props/cell.js");
+require("./uni_modules/uview-plus/libs/config/props/cellGroup.js");
+require("./uni_modules/uview-plus/libs/config/props/checkbox.js");
+require("./uni_modules/uview-plus/libs/config/props/checkboxGroup.js");
+require("./uni_modules/uview-plus/libs/config/props/circleProgress.js");
+require("./uni_modules/uview-plus/libs/config/props/code.js");
+require("./uni_modules/uview-plus/libs/config/props/codeInput.js");
+require("./uni_modules/uview-plus/libs/config/props/col.js");
+require("./uni_modules/uview-plus/libs/config/props/collapse.js");
+require("./uni_modules/uview-plus/libs/config/props/collapseItem.js");
+require("./uni_modules/uview-plus/libs/config/props/columnNotice.js");
+require("./uni_modules/uview-plus/libs/config/props/countDown.js");
+require("./uni_modules/uview-plus/libs/config/props/countTo.js");
+require("./uni_modules/uview-plus/libs/config/props/datetimePicker.js");
+require("./uni_modules/uview-plus/libs/config/props/divider.js");
+require("./uni_modules/uview-plus/libs/config/props/empty.js");
+require("./uni_modules/uview-plus/libs/config/props/form.js");
+require("./uni_modules/uview-plus/libs/config/props/formItem.js");
+require("./uni_modules/uview-plus/libs/config/props/gap.js");
+require("./uni_modules/uview-plus/libs/config/props/grid.js");
+require("./uni_modules/uview-plus/libs/config/props/gridItem.js");
+require("./uni_modules/uview-plus/libs/config/props/icon.js");
+require("./uni_modules/uview-plus/libs/config/props/image.js");
+require("./uni_modules/uview-plus/libs/config/props/indexAnchor.js");
+require("./uni_modules/uview-plus/libs/config/props/indexList.js");
+require("./uni_modules/uview-plus/libs/config/props/input.js");
+require("./uni_modules/uview-plus/libs/config/props/keyboard.js");
+require("./uni_modules/uview-plus/libs/config/props/line.js");
+require("./uni_modules/uview-plus/libs/config/props/lineProgress.js");
+require("./uni_modules/uview-plus/libs/config/props/link.js");
+require("./uni_modules/uview-plus/libs/config/props/list.js");
+require("./uni_modules/uview-plus/libs/config/props/listItem.js");
+require("./uni_modules/uview-plus/libs/config/props/loadingIcon.js");
+require("./uni_modules/uview-plus/libs/config/props/loadingPage.js");
+require("./uni_modules/uview-plus/libs/config/props/loadmore.js");
+require("./uni_modules/uview-plus/libs/config/props/modal.js");
+require("./uni_modules/uview-plus/libs/config/props/navbar.js");
+require("./uni_modules/uview-plus/libs/config/color.js");
+require("./uni_modules/uview-plus/libs/config/props/noNetwork.js");
+require("./uni_modules/uview-plus/libs/config/props/noticeBar.js");
+require("./uni_modules/uview-plus/libs/config/props/notify.js");
+require("./uni_modules/uview-plus/libs/config/props/numberBox.js");
+require("./uni_modules/uview-plus/libs/config/props/numberKeyboard.js");
+require("./uni_modules/uview-plus/libs/config/props/overlay.js");
+require("./uni_modules/uview-plus/libs/config/props/parse.js");
+require("./uni_modules/uview-plus/libs/config/props/picker.js");
+require("./uni_modules/uview-plus/libs/config/props/popup.js");
+require("./uni_modules/uview-plus/libs/config/props/radio.js");
+require("./uni_modules/uview-plus/libs/config/props/radioGroup.js");
+require("./uni_modules/uview-plus/libs/config/props/rate.js");
+require("./uni_modules/uview-plus/libs/config/props/readMore.js");
+require("./uni_modules/uview-plus/libs/config/props/row.js");
+require("./uni_modules/uview-plus/libs/config/props/rowNotice.js");
+require("./uni_modules/uview-plus/libs/config/props/scrollList.js");
+require("./uni_modules/uview-plus/libs/config/props/search.js");
+require("./uni_modules/uview-plus/libs/config/props/section.js");
+require("./uni_modules/uview-plus/libs/config/props/skeleton.js");
+require("./uni_modules/uview-plus/libs/config/props/slider.js");
+require("./uni_modules/uview-plus/libs/config/props/statusBar.js");
+require("./uni_modules/uview-plus/libs/config/props/steps.js");
+require("./uni_modules/uview-plus/libs/config/props/stepsItem.js");
+require("./uni_modules/uview-plus/libs/config/props/sticky.js");
+require("./uni_modules/uview-plus/libs/config/props/subsection.js");
+require("./uni_modules/uview-plus/libs/config/props/swipeAction.js");
+require("./uni_modules/uview-plus/libs/config/props/swipeActionItem.js");
+require("./uni_modules/uview-plus/libs/config/props/swiper.js");
+require("./uni_modules/uview-plus/libs/config/props/swipterIndicator.js");
+require("./uni_modules/uview-plus/libs/config/props/switch.js");
+require("./uni_modules/uview-plus/libs/config/props/tabbar.js");
+require("./uni_modules/uview-plus/libs/config/props/tabbarItem.js");
+require("./uni_modules/uview-plus/libs/config/props/tabs.js");
+require("./uni_modules/uview-plus/libs/config/props/tag.js");
+require("./uni_modules/uview-plus/libs/config/props/text.js");
+require("./uni_modules/uview-plus/libs/config/props/textarea.js");
+require("./uni_modules/uview-plus/libs/config/props/toast.js");
+require("./uni_modules/uview-plus/libs/config/props/toolbar.js");
+require("./uni_modules/uview-plus/libs/config/props/tooltip.js");
+require("./uni_modules/uview-plus/libs/config/props/transition.js");
+require("./uni_modules/uview-plus/libs/config/props/upload.js");
+require("./uni_modules/uview-plus/libs/config/zIndex.js");
+require("./uni_modules/uview-plus/libs/function/platform.js");
+if (!Math) {
+  "./pages/index/index.js";
+  "./pages/login/login.js";
+  "./pages/cart/cart.js";
+  "./pages/my/my.js";
+  "./pages/order/order.js";
+}
+const _sfc_main = {
+  onLaunch: function() {
+    console.log("App Launch");
+  },
+  onShow: function() {
+    console.log("App Show");
+  },
+  onHide: function() {
+    console.log("App Hide");
+  }
+};
+const App = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["__file", "D:/里海数字乡村/purchase-let/App.vue"]]);
+function createApp() {
+  const app = common_vendor.createSSRApp(App);
+  app.use(common_vendor.createPinia());
+  app.use(uni_modules_uviewPlus_index.uviewPlus);
+  return {
+    app,
+    Pinia: common_vendor.Pinia
+    // 此处必须将 Pinia 返回
+  };
+}
+createApp().app.mount("#app");
+exports.createApp = createApp;
diff --git a/unpackage/dist/dev/mp-weixin/app.json b/unpackage/dist/dev/mp-weixin/app.json
new file mode 100644
index 0000000..5ae1b35
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/app.json
@@ -0,0 +1,36 @@
+{
+  "pages": [
+    "pages/index/index",
+    "pages/login/login",
+    "pages/cart/cart",
+    "pages/my/my",
+    "pages/order/order"
+  ],
+  "window": {
+    "navigationBarTextStyle": "black",
+    "navigationBarTitleText": "购物",
+    "navigationBarBackgroundColor": "#F8F8F8",
+    "backgroundColor": "#F8F8F8"
+  },
+  "tabBar": {
+    "color": "#999999",
+    "selectedColor": "#2b9939",
+    "borderStyle": "white",
+    "backgroundColor": "#FFFFFF",
+    "list": [
+      {
+        "pagePath": "pages/index/index",
+        "text": "首页"
+      },
+      {
+        "pagePath": "pages/cart/cart",
+        "text": "购物车"
+      },
+      {
+        "pagePath": "pages/my/my",
+        "text": "我的"
+      }
+    ]
+  },
+  "usingComponents": {}
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/app.wxss b/unpackage/dist/dev/mp-weixin/app.wxss
new file mode 100644
index 0000000..8af421b
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/app.wxss
@@ -0,0 +1,3063 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+/* 颜色变量 */
+/* 行为相关颜色 */
+/* 文字基本颜色 */
+/* 背景颜色 */
+/* 边框颜色 */
+/* 尺寸变量 */
+/* 文字尺寸 */
+/* 图片尺寸 */
+/* Border Radius */
+/* 水平间距 */
+/* 垂直间距 */
+/* 透明度 */
+/* 文章场景相关 */
+/*每个页面公共css */
+.u-line-1 {
+  display: -webkit-box !important;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  word-break: break-all;
+  -webkit-line-clamp: 1;
+  -webkit-box-orient: vertical !important;
+}
+.u-line-2 {
+  display: -webkit-box !important;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  word-break: break-all;
+  -webkit-line-clamp: 2;
+  -webkit-box-orient: vertical !important;
+}
+.u-line-3 {
+  display: -webkit-box !important;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  word-break: break-all;
+  -webkit-line-clamp: 3;
+  -webkit-box-orient: vertical !important;
+}
+.u-line-4 {
+  display: -webkit-box !important;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  word-break: break-all;
+  -webkit-line-clamp: 4;
+  -webkit-box-orient: vertical !important;
+}
+.u-line-5 {
+  display: -webkit-box !important;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  word-break: break-all;
+  -webkit-line-clamp: 5;
+  -webkit-box-orient: vertical !important;
+}
+.u-border {
+  border-width: 0.5px !important;
+  border-color: #dadbde !important;
+  border-style: solid;
+}
+.u-border-top {
+  border-top-width: 0.5px !important;
+  border-color: #dadbde !important;
+  border-top-style: solid;
+}
+.u-border-left {
+  border-left-width: 0.5px !important;
+  border-color: #dadbde !important;
+  border-left-style: solid;
+}
+.u-border-right {
+  border-right-width: 0.5px !important;
+  border-color: #dadbde !important;
+  border-right-style: solid;
+}
+.u-border-bottom {
+  border-bottom-width: 0.5px !important;
+  border-color: #dadbde !important;
+  border-bottom-style: solid;
+}
+.u-border-top-bottom {
+  border-top-width: 0.5px !important;
+  border-bottom-width: 0.5px !important;
+  border-color: #dadbde !important;
+  border-top-style: solid;
+  border-bottom-style: solid;
+}
+.u-reset-button {
+  padding: 0;
+  background-color: transparent;
+  font-size: inherit;
+  line-height: inherit;
+  color: inherit;
+}
+.u-reset-button::after {
+  border: none;
+}
+.u-hover-class {
+  opacity: 0.7;
+}
+.cursor-pointer {
+  cursor: pointer;
+}
+.u-flex,
+.u-flex-row,
+.u-flex-x {
+  display: flex;
+  flex-direction: row;
+}
+.u-flex-y,
+.u-flex-column {
+  display: flex;
+  flex-direction: column;
+}
+.u-flex-x-center {
+  display: flex;
+  flex-direction: row;
+  justify-content: center;
+}
+.u-flex-xy-center {
+  display: flex;
+  flex-direction: row;
+  justify-content: center;
+  align-items: center;
+}
+.u-flex-y-center {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+}
+.u-flex-x-left {
+  display: flex;
+  flex-direction: row;
+}
+.u-flex-x-reverse,
+.u-flex-row-reverse {
+  flex-direction: row-reverse;
+}
+.u-flex-y-reverse,
+.u-flex-column-reverse {
+  flex-direction: column-reverse;
+}
+.u-flex.u-flex-reverse,
+.u-flex-row.u-flex-reverse,
+.u-flex-x.u-flex-reverse {
+  flex-direction: row-reverse;
+}
+.u-flex-column.u-flex-reverse,
+.u-flex-y.u-flex-reverse {
+  flex-direction: column-reverse;
+}
+.u-flex-fill {
+  flex: 1 1 auto;
+}
+.u-margin-top-auto,
+.u-m-t-auto {
+  margin-top: auto !important;
+}
+.u-margin-right-auto,
+.u-m-r-auto {
+  margin-right: auto !important;
+}
+.u-margin-bottom-auto,
+.u-m-b-auto {
+  margin-bottom: auto !important;
+}
+.u-margin-left-auto,
+.u-m-l-auto {
+  margin-left: auto !important;
+}
+.u-margin-center-auto,
+.u-m-c-auto {
+  margin-left: auto !important;
+  margin-right: auto !important;
+}
+.u-margin-middle-auto,
+.u-m-m-auto {
+  margin-top: auto !important;
+  margin-bottom: auto !important;
+}
+.u-flex-wrap {
+  flex-wrap: wrap;
+}
+.u-flex-wrap-reverse {
+  flex-wrap: wrap-reverse;
+}
+.u-flex-start {
+  justify-content: flex-start;
+}
+.u-flex-center {
+  justify-content: center;
+}
+.u-flex-end {
+  justify-content: flex-end;
+}
+.u-flex-between {
+  justify-content: space-between;
+}
+.u-flex-around {
+  justify-content: space-around;
+}
+.u-flex-items-start {
+  align-items: flex-start;
+}
+.u-flex-items-center {
+  align-items: center;
+}
+.u-flex-items-end {
+  align-items: flex-end;
+}
+.u-flex-items-baseline {
+  align-items: baseline;
+}
+.u-flex-items-stretch {
+  align-items: stretch;
+}
+.u-flex-self-start {
+  align-self: flex-start;
+}
+.u-flex-self-center {
+  align-self: center;
+}
+.u-flex-self-end {
+  align-self: flex-end;
+}
+.u-flex-self-baseline {
+  align-self: baseline;
+}
+.u-flex-self-stretch {
+  align-self: stretch;
+}
+.u-flex-content-start {
+  align-content: flex-start;
+}
+.u-flex-content-center {
+  align-content: center;
+}
+.u-flex-content-end {
+  align-content: flex-end;
+}
+.u-flex-content-between {
+  align-content: space-between;
+}
+.u-flex-content-around {
+  align-content: space-around;
+}
+.u-flex-middle {
+  justify-content: center;
+  align-items: center;
+  align-self: center;
+  align-content: center;
+}
+.u-flex-grow {
+  flex-grow: 1;
+}
+.u-flex-shrink {
+  flex-shrink: 1;
+}
+.u-margin-0, .u-m-0 {
+  margin: 0rpx !important;
+}
+.u-padding-0, .u-p-0 {
+  padding: 0rpx !important;
+}
+.u-m-l-0 {
+  margin-left: 0rpx !important;
+}
+.u-p-l-0 {
+  padding-left: 0rpx !important;
+}
+.u-margin-left-0 {
+  margin-left: 0rpx !important;
+}
+.u-padding-left-0 {
+  padding-left: 0rpx !important;
+}
+.u-m-t-0 {
+  margin-top: 0rpx !important;
+}
+.u-p-t-0 {
+  padding-top: 0rpx !important;
+}
+.u-margin-top-0 {
+  margin-top: 0rpx !important;
+}
+.u-padding-top-0 {
+  padding-top: 0rpx !important;
+}
+.u-m-r-0 {
+  margin-right: 0rpx !important;
+}
+.u-p-r-0 {
+  padding-right: 0rpx !important;
+}
+.u-margin-right-0 {
+  margin-right: 0rpx !important;
+}
+.u-padding-right-0 {
+  padding-right: 0rpx !important;
+}
+.u-m-b-0 {
+  margin-bottom: 0rpx !important;
+}
+.u-p-b-0 {
+  padding-bottom: 0rpx !important;
+}
+.u-margin-bottom-0 {
+  margin-bottom: 0rpx !important;
+}
+.u-padding-bottom-0 {
+  padding-bottom: 0rpx !important;
+}
+.u-margin-2, .u-m-2 {
+  margin: 2rpx !important;
+}
+.u-padding-2, .u-p-2 {
+  padding: 2rpx !important;
+}
+.u-m-l-2 {
+  margin-left: 2rpx !important;
+}
+.u-p-l-2 {
+  padding-left: 2rpx !important;
+}
+.u-margin-left-2 {
+  margin-left: 2rpx !important;
+}
+.u-padding-left-2 {
+  padding-left: 2rpx !important;
+}
+.u-m-t-2 {
+  margin-top: 2rpx !important;
+}
+.u-p-t-2 {
+  padding-top: 2rpx !important;
+}
+.u-margin-top-2 {
+  margin-top: 2rpx !important;
+}
+.u-padding-top-2 {
+  padding-top: 2rpx !important;
+}
+.u-m-r-2 {
+  margin-right: 2rpx !important;
+}
+.u-p-r-2 {
+  padding-right: 2rpx !important;
+}
+.u-margin-right-2 {
+  margin-right: 2rpx !important;
+}
+.u-padding-right-2 {
+  padding-right: 2rpx !important;
+}
+.u-m-b-2 {
+  margin-bottom: 2rpx !important;
+}
+.u-p-b-2 {
+  padding-bottom: 2rpx !important;
+}
+.u-margin-bottom-2 {
+  margin-bottom: 2rpx !important;
+}
+.u-padding-bottom-2 {
+  padding-bottom: 2rpx !important;
+}
+.u-margin-4, .u-m-4 {
+  margin: 4rpx !important;
+}
+.u-padding-4, .u-p-4 {
+  padding: 4rpx !important;
+}
+.u-m-l-4 {
+  margin-left: 4rpx !important;
+}
+.u-p-l-4 {
+  padding-left: 4rpx !important;
+}
+.u-margin-left-4 {
+  margin-left: 4rpx !important;
+}
+.u-padding-left-4 {
+  padding-left: 4rpx !important;
+}
+.u-m-t-4 {
+  margin-top: 4rpx !important;
+}
+.u-p-t-4 {
+  padding-top: 4rpx !important;
+}
+.u-margin-top-4 {
+  margin-top: 4rpx !important;
+}
+.u-padding-top-4 {
+  padding-top: 4rpx !important;
+}
+.u-m-r-4 {
+  margin-right: 4rpx !important;
+}
+.u-p-r-4 {
+  padding-right: 4rpx !important;
+}
+.u-margin-right-4 {
+  margin-right: 4rpx !important;
+}
+.u-padding-right-4 {
+  padding-right: 4rpx !important;
+}
+.u-m-b-4 {
+  margin-bottom: 4rpx !important;
+}
+.u-p-b-4 {
+  padding-bottom: 4rpx !important;
+}
+.u-margin-bottom-4 {
+  margin-bottom: 4rpx !important;
+}
+.u-padding-bottom-4 {
+  padding-bottom: 4rpx !important;
+}
+.u-margin-5, .u-m-5 {
+  margin: 5rpx !important;
+}
+.u-padding-5, .u-p-5 {
+  padding: 5rpx !important;
+}
+.u-m-l-5 {
+  margin-left: 5rpx !important;
+}
+.u-p-l-5 {
+  padding-left: 5rpx !important;
+}
+.u-margin-left-5 {
+  margin-left: 5rpx !important;
+}
+.u-padding-left-5 {
+  padding-left: 5rpx !important;
+}
+.u-m-t-5 {
+  margin-top: 5rpx !important;
+}
+.u-p-t-5 {
+  padding-top: 5rpx !important;
+}
+.u-margin-top-5 {
+  margin-top: 5rpx !important;
+}
+.u-padding-top-5 {
+  padding-top: 5rpx !important;
+}
+.u-m-r-5 {
+  margin-right: 5rpx !important;
+}
+.u-p-r-5 {
+  padding-right: 5rpx !important;
+}
+.u-margin-right-5 {
+  margin-right: 5rpx !important;
+}
+.u-padding-right-5 {
+  padding-right: 5rpx !important;
+}
+.u-m-b-5 {
+  margin-bottom: 5rpx !important;
+}
+.u-p-b-5 {
+  padding-bottom: 5rpx !important;
+}
+.u-margin-bottom-5 {
+  margin-bottom: 5rpx !important;
+}
+.u-padding-bottom-5 {
+  padding-bottom: 5rpx !important;
+}
+.u-margin-6, .u-m-6 {
+  margin: 6rpx !important;
+}
+.u-padding-6, .u-p-6 {
+  padding: 6rpx !important;
+}
+.u-m-l-6 {
+  margin-left: 6rpx !important;
+}
+.u-p-l-6 {
+  padding-left: 6rpx !important;
+}
+.u-margin-left-6 {
+  margin-left: 6rpx !important;
+}
+.u-padding-left-6 {
+  padding-left: 6rpx !important;
+}
+.u-m-t-6 {
+  margin-top: 6rpx !important;
+}
+.u-p-t-6 {
+  padding-top: 6rpx !important;
+}
+.u-margin-top-6 {
+  margin-top: 6rpx !important;
+}
+.u-padding-top-6 {
+  padding-top: 6rpx !important;
+}
+.u-m-r-6 {
+  margin-right: 6rpx !important;
+}
+.u-p-r-6 {
+  padding-right: 6rpx !important;
+}
+.u-margin-right-6 {
+  margin-right: 6rpx !important;
+}
+.u-padding-right-6 {
+  padding-right: 6rpx !important;
+}
+.u-m-b-6 {
+  margin-bottom: 6rpx !important;
+}
+.u-p-b-6 {
+  padding-bottom: 6rpx !important;
+}
+.u-margin-bottom-6 {
+  margin-bottom: 6rpx !important;
+}
+.u-padding-bottom-6 {
+  padding-bottom: 6rpx !important;
+}
+.u-margin-8, .u-m-8 {
+  margin: 8rpx !important;
+}
+.u-padding-8, .u-p-8 {
+  padding: 8rpx !important;
+}
+.u-m-l-8 {
+  margin-left: 8rpx !important;
+}
+.u-p-l-8 {
+  padding-left: 8rpx !important;
+}
+.u-margin-left-8 {
+  margin-left: 8rpx !important;
+}
+.u-padding-left-8 {
+  padding-left: 8rpx !important;
+}
+.u-m-t-8 {
+  margin-top: 8rpx !important;
+}
+.u-p-t-8 {
+  padding-top: 8rpx !important;
+}
+.u-margin-top-8 {
+  margin-top: 8rpx !important;
+}
+.u-padding-top-8 {
+  padding-top: 8rpx !important;
+}
+.u-m-r-8 {
+  margin-right: 8rpx !important;
+}
+.u-p-r-8 {
+  padding-right: 8rpx !important;
+}
+.u-margin-right-8 {
+  margin-right: 8rpx !important;
+}
+.u-padding-right-8 {
+  padding-right: 8rpx !important;
+}
+.u-m-b-8 {
+  margin-bottom: 8rpx !important;
+}
+.u-p-b-8 {
+  padding-bottom: 8rpx !important;
+}
+.u-margin-bottom-8 {
+  margin-bottom: 8rpx !important;
+}
+.u-padding-bottom-8 {
+  padding-bottom: 8rpx !important;
+}
+.u-margin-10, .u-m-10 {
+  margin: 10rpx !important;
+}
+.u-padding-10, .u-p-10 {
+  padding: 10rpx !important;
+}
+.u-m-l-10 {
+  margin-left: 10rpx !important;
+}
+.u-p-l-10 {
+  padding-left: 10rpx !important;
+}
+.u-margin-left-10 {
+  margin-left: 10rpx !important;
+}
+.u-padding-left-10 {
+  padding-left: 10rpx !important;
+}
+.u-m-t-10 {
+  margin-top: 10rpx !important;
+}
+.u-p-t-10 {
+  padding-top: 10rpx !important;
+}
+.u-margin-top-10 {
+  margin-top: 10rpx !important;
+}
+.u-padding-top-10 {
+  padding-top: 10rpx !important;
+}
+.u-m-r-10 {
+  margin-right: 10rpx !important;
+}
+.u-p-r-10 {
+  padding-right: 10rpx !important;
+}
+.u-margin-right-10 {
+  margin-right: 10rpx !important;
+}
+.u-padding-right-10 {
+  padding-right: 10rpx !important;
+}
+.u-m-b-10 {
+  margin-bottom: 10rpx !important;
+}
+.u-p-b-10 {
+  padding-bottom: 10rpx !important;
+}
+.u-margin-bottom-10 {
+  margin-bottom: 10rpx !important;
+}
+.u-padding-bottom-10 {
+  padding-bottom: 10rpx !important;
+}
+.u-margin-12, .u-m-12 {
+  margin: 12rpx !important;
+}
+.u-padding-12, .u-p-12 {
+  padding: 12rpx !important;
+}
+.u-m-l-12 {
+  margin-left: 12rpx !important;
+}
+.u-p-l-12 {
+  padding-left: 12rpx !important;
+}
+.u-margin-left-12 {
+  margin-left: 12rpx !important;
+}
+.u-padding-left-12 {
+  padding-left: 12rpx !important;
+}
+.u-m-t-12 {
+  margin-top: 12rpx !important;
+}
+.u-p-t-12 {
+  padding-top: 12rpx !important;
+}
+.u-margin-top-12 {
+  margin-top: 12rpx !important;
+}
+.u-padding-top-12 {
+  padding-top: 12rpx !important;
+}
+.u-m-r-12 {
+  margin-right: 12rpx !important;
+}
+.u-p-r-12 {
+  padding-right: 12rpx !important;
+}
+.u-margin-right-12 {
+  margin-right: 12rpx !important;
+}
+.u-padding-right-12 {
+  padding-right: 12rpx !important;
+}
+.u-m-b-12 {
+  margin-bottom: 12rpx !important;
+}
+.u-p-b-12 {
+  padding-bottom: 12rpx !important;
+}
+.u-margin-bottom-12 {
+  margin-bottom: 12rpx !important;
+}
+.u-padding-bottom-12 {
+  padding-bottom: 12rpx !important;
+}
+.u-margin-14, .u-m-14 {
+  margin: 14rpx !important;
+}
+.u-padding-14, .u-p-14 {
+  padding: 14rpx !important;
+}
+.u-m-l-14 {
+  margin-left: 14rpx !important;
+}
+.u-p-l-14 {
+  padding-left: 14rpx !important;
+}
+.u-margin-left-14 {
+  margin-left: 14rpx !important;
+}
+.u-padding-left-14 {
+  padding-left: 14rpx !important;
+}
+.u-m-t-14 {
+  margin-top: 14rpx !important;
+}
+.u-p-t-14 {
+  padding-top: 14rpx !important;
+}
+.u-margin-top-14 {
+  margin-top: 14rpx !important;
+}
+.u-padding-top-14 {
+  padding-top: 14rpx !important;
+}
+.u-m-r-14 {
+  margin-right: 14rpx !important;
+}
+.u-p-r-14 {
+  padding-right: 14rpx !important;
+}
+.u-margin-right-14 {
+  margin-right: 14rpx !important;
+}
+.u-padding-right-14 {
+  padding-right: 14rpx !important;
+}
+.u-m-b-14 {
+  margin-bottom: 14rpx !important;
+}
+.u-p-b-14 {
+  padding-bottom: 14rpx !important;
+}
+.u-margin-bottom-14 {
+  margin-bottom: 14rpx !important;
+}
+.u-padding-bottom-14 {
+  padding-bottom: 14rpx !important;
+}
+.u-margin-15, .u-m-15 {
+  margin: 15rpx !important;
+}
+.u-padding-15, .u-p-15 {
+  padding: 15rpx !important;
+}
+.u-m-l-15 {
+  margin-left: 15rpx !important;
+}
+.u-p-l-15 {
+  padding-left: 15rpx !important;
+}
+.u-margin-left-15 {
+  margin-left: 15rpx !important;
+}
+.u-padding-left-15 {
+  padding-left: 15rpx !important;
+}
+.u-m-t-15 {
+  margin-top: 15rpx !important;
+}
+.u-p-t-15 {
+  padding-top: 15rpx !important;
+}
+.u-margin-top-15 {
+  margin-top: 15rpx !important;
+}
+.u-padding-top-15 {
+  padding-top: 15rpx !important;
+}
+.u-m-r-15 {
+  margin-right: 15rpx !important;
+}
+.u-p-r-15 {
+  padding-right: 15rpx !important;
+}
+.u-margin-right-15 {
+  margin-right: 15rpx !important;
+}
+.u-padding-right-15 {
+  padding-right: 15rpx !important;
+}
+.u-m-b-15 {
+  margin-bottom: 15rpx !important;
+}
+.u-p-b-15 {
+  padding-bottom: 15rpx !important;
+}
+.u-margin-bottom-15 {
+  margin-bottom: 15rpx !important;
+}
+.u-padding-bottom-15 {
+  padding-bottom: 15rpx !important;
+}
+.u-margin-16, .u-m-16 {
+  margin: 16rpx !important;
+}
+.u-padding-16, .u-p-16 {
+  padding: 16rpx !important;
+}
+.u-m-l-16 {
+  margin-left: 16rpx !important;
+}
+.u-p-l-16 {
+  padding-left: 16rpx !important;
+}
+.u-margin-left-16 {
+  margin-left: 16rpx !important;
+}
+.u-padding-left-16 {
+  padding-left: 16rpx !important;
+}
+.u-m-t-16 {
+  margin-top: 16rpx !important;
+}
+.u-p-t-16 {
+  padding-top: 16rpx !important;
+}
+.u-margin-top-16 {
+  margin-top: 16rpx !important;
+}
+.u-padding-top-16 {
+  padding-top: 16rpx !important;
+}
+.u-m-r-16 {
+  margin-right: 16rpx !important;
+}
+.u-p-r-16 {
+  padding-right: 16rpx !important;
+}
+.u-margin-right-16 {
+  margin-right: 16rpx !important;
+}
+.u-padding-right-16 {
+  padding-right: 16rpx !important;
+}
+.u-m-b-16 {
+  margin-bottom: 16rpx !important;
+}
+.u-p-b-16 {
+  padding-bottom: 16rpx !important;
+}
+.u-margin-bottom-16 {
+  margin-bottom: 16rpx !important;
+}
+.u-padding-bottom-16 {
+  padding-bottom: 16rpx !important;
+}
+.u-margin-18, .u-m-18 {
+  margin: 18rpx !important;
+}
+.u-padding-18, .u-p-18 {
+  padding: 18rpx !important;
+}
+.u-m-l-18 {
+  margin-left: 18rpx !important;
+}
+.u-p-l-18 {
+  padding-left: 18rpx !important;
+}
+.u-margin-left-18 {
+  margin-left: 18rpx !important;
+}
+.u-padding-left-18 {
+  padding-left: 18rpx !important;
+}
+.u-m-t-18 {
+  margin-top: 18rpx !important;
+}
+.u-p-t-18 {
+  padding-top: 18rpx !important;
+}
+.u-margin-top-18 {
+  margin-top: 18rpx !important;
+}
+.u-padding-top-18 {
+  padding-top: 18rpx !important;
+}
+.u-m-r-18 {
+  margin-right: 18rpx !important;
+}
+.u-p-r-18 {
+  padding-right: 18rpx !important;
+}
+.u-margin-right-18 {
+  margin-right: 18rpx !important;
+}
+.u-padding-right-18 {
+  padding-right: 18rpx !important;
+}
+.u-m-b-18 {
+  margin-bottom: 18rpx !important;
+}
+.u-p-b-18 {
+  padding-bottom: 18rpx !important;
+}
+.u-margin-bottom-18 {
+  margin-bottom: 18rpx !important;
+}
+.u-padding-bottom-18 {
+  padding-bottom: 18rpx !important;
+}
+.u-margin-20, .u-m-20 {
+  margin: 20rpx !important;
+}
+.u-padding-20, .u-p-20 {
+  padding: 20rpx !important;
+}
+.u-m-l-20 {
+  margin-left: 20rpx !important;
+}
+.u-p-l-20 {
+  padding-left: 20rpx !important;
+}
+.u-margin-left-20 {
+  margin-left: 20rpx !important;
+}
+.u-padding-left-20 {
+  padding-left: 20rpx !important;
+}
+.u-m-t-20 {
+  margin-top: 20rpx !important;
+}
+.u-p-t-20 {
+  padding-top: 20rpx !important;
+}
+.u-margin-top-20 {
+  margin-top: 20rpx !important;
+}
+.u-padding-top-20 {
+  padding-top: 20rpx !important;
+}
+.u-m-r-20 {
+  margin-right: 20rpx !important;
+}
+.u-p-r-20 {
+  padding-right: 20rpx !important;
+}
+.u-margin-right-20 {
+  margin-right: 20rpx !important;
+}
+.u-padding-right-20 {
+  padding-right: 20rpx !important;
+}
+.u-m-b-20 {
+  margin-bottom: 20rpx !important;
+}
+.u-p-b-20 {
+  padding-bottom: 20rpx !important;
+}
+.u-margin-bottom-20 {
+  margin-bottom: 20rpx !important;
+}
+.u-padding-bottom-20 {
+  padding-bottom: 20rpx !important;
+}
+.u-margin-22, .u-m-22 {
+  margin: 22rpx !important;
+}
+.u-padding-22, .u-p-22 {
+  padding: 22rpx !important;
+}
+.u-m-l-22 {
+  margin-left: 22rpx !important;
+}
+.u-p-l-22 {
+  padding-left: 22rpx !important;
+}
+.u-margin-left-22 {
+  margin-left: 22rpx !important;
+}
+.u-padding-left-22 {
+  padding-left: 22rpx !important;
+}
+.u-m-t-22 {
+  margin-top: 22rpx !important;
+}
+.u-p-t-22 {
+  padding-top: 22rpx !important;
+}
+.u-margin-top-22 {
+  margin-top: 22rpx !important;
+}
+.u-padding-top-22 {
+  padding-top: 22rpx !important;
+}
+.u-m-r-22 {
+  margin-right: 22rpx !important;
+}
+.u-p-r-22 {
+  padding-right: 22rpx !important;
+}
+.u-margin-right-22 {
+  margin-right: 22rpx !important;
+}
+.u-padding-right-22 {
+  padding-right: 22rpx !important;
+}
+.u-m-b-22 {
+  margin-bottom: 22rpx !important;
+}
+.u-p-b-22 {
+  padding-bottom: 22rpx !important;
+}
+.u-margin-bottom-22 {
+  margin-bottom: 22rpx !important;
+}
+.u-padding-bottom-22 {
+  padding-bottom: 22rpx !important;
+}
+.u-margin-24, .u-m-24 {
+  margin: 24rpx !important;
+}
+.u-padding-24, .u-p-24 {
+  padding: 24rpx !important;
+}
+.u-m-l-24 {
+  margin-left: 24rpx !important;
+}
+.u-p-l-24 {
+  padding-left: 24rpx !important;
+}
+.u-margin-left-24 {
+  margin-left: 24rpx !important;
+}
+.u-padding-left-24 {
+  padding-left: 24rpx !important;
+}
+.u-m-t-24 {
+  margin-top: 24rpx !important;
+}
+.u-p-t-24 {
+  padding-top: 24rpx !important;
+}
+.u-margin-top-24 {
+  margin-top: 24rpx !important;
+}
+.u-padding-top-24 {
+  padding-top: 24rpx !important;
+}
+.u-m-r-24 {
+  margin-right: 24rpx !important;
+}
+.u-p-r-24 {
+  padding-right: 24rpx !important;
+}
+.u-margin-right-24 {
+  margin-right: 24rpx !important;
+}
+.u-padding-right-24 {
+  padding-right: 24rpx !important;
+}
+.u-m-b-24 {
+  margin-bottom: 24rpx !important;
+}
+.u-p-b-24 {
+  padding-bottom: 24rpx !important;
+}
+.u-margin-bottom-24 {
+  margin-bottom: 24rpx !important;
+}
+.u-padding-bottom-24 {
+  padding-bottom: 24rpx !important;
+}
+.u-margin-25, .u-m-25 {
+  margin: 25rpx !important;
+}
+.u-padding-25, .u-p-25 {
+  padding: 25rpx !important;
+}
+.u-m-l-25 {
+  margin-left: 25rpx !important;
+}
+.u-p-l-25 {
+  padding-left: 25rpx !important;
+}
+.u-margin-left-25 {
+  margin-left: 25rpx !important;
+}
+.u-padding-left-25 {
+  padding-left: 25rpx !important;
+}
+.u-m-t-25 {
+  margin-top: 25rpx !important;
+}
+.u-p-t-25 {
+  padding-top: 25rpx !important;
+}
+.u-margin-top-25 {
+  margin-top: 25rpx !important;
+}
+.u-padding-top-25 {
+  padding-top: 25rpx !important;
+}
+.u-m-r-25 {
+  margin-right: 25rpx !important;
+}
+.u-p-r-25 {
+  padding-right: 25rpx !important;
+}
+.u-margin-right-25 {
+  margin-right: 25rpx !important;
+}
+.u-padding-right-25 {
+  padding-right: 25rpx !important;
+}
+.u-m-b-25 {
+  margin-bottom: 25rpx !important;
+}
+.u-p-b-25 {
+  padding-bottom: 25rpx !important;
+}
+.u-margin-bottom-25 {
+  margin-bottom: 25rpx !important;
+}
+.u-padding-bottom-25 {
+  padding-bottom: 25rpx !important;
+}
+.u-margin-26, .u-m-26 {
+  margin: 26rpx !important;
+}
+.u-padding-26, .u-p-26 {
+  padding: 26rpx !important;
+}
+.u-m-l-26 {
+  margin-left: 26rpx !important;
+}
+.u-p-l-26 {
+  padding-left: 26rpx !important;
+}
+.u-margin-left-26 {
+  margin-left: 26rpx !important;
+}
+.u-padding-left-26 {
+  padding-left: 26rpx !important;
+}
+.u-m-t-26 {
+  margin-top: 26rpx !important;
+}
+.u-p-t-26 {
+  padding-top: 26rpx !important;
+}
+.u-margin-top-26 {
+  margin-top: 26rpx !important;
+}
+.u-padding-top-26 {
+  padding-top: 26rpx !important;
+}
+.u-m-r-26 {
+  margin-right: 26rpx !important;
+}
+.u-p-r-26 {
+  padding-right: 26rpx !important;
+}
+.u-margin-right-26 {
+  margin-right: 26rpx !important;
+}
+.u-padding-right-26 {
+  padding-right: 26rpx !important;
+}
+.u-m-b-26 {
+  margin-bottom: 26rpx !important;
+}
+.u-p-b-26 {
+  padding-bottom: 26rpx !important;
+}
+.u-margin-bottom-26 {
+  margin-bottom: 26rpx !important;
+}
+.u-padding-bottom-26 {
+  padding-bottom: 26rpx !important;
+}
+.u-margin-28, .u-m-28 {
+  margin: 28rpx !important;
+}
+.u-padding-28, .u-p-28 {
+  padding: 28rpx !important;
+}
+.u-m-l-28 {
+  margin-left: 28rpx !important;
+}
+.u-p-l-28 {
+  padding-left: 28rpx !important;
+}
+.u-margin-left-28 {
+  margin-left: 28rpx !important;
+}
+.u-padding-left-28 {
+  padding-left: 28rpx !important;
+}
+.u-m-t-28 {
+  margin-top: 28rpx !important;
+}
+.u-p-t-28 {
+  padding-top: 28rpx !important;
+}
+.u-margin-top-28 {
+  margin-top: 28rpx !important;
+}
+.u-padding-top-28 {
+  padding-top: 28rpx !important;
+}
+.u-m-r-28 {
+  margin-right: 28rpx !important;
+}
+.u-p-r-28 {
+  padding-right: 28rpx !important;
+}
+.u-margin-right-28 {
+  margin-right: 28rpx !important;
+}
+.u-padding-right-28 {
+  padding-right: 28rpx !important;
+}
+.u-m-b-28 {
+  margin-bottom: 28rpx !important;
+}
+.u-p-b-28 {
+  padding-bottom: 28rpx !important;
+}
+.u-margin-bottom-28 {
+  margin-bottom: 28rpx !important;
+}
+.u-padding-bottom-28 {
+  padding-bottom: 28rpx !important;
+}
+.u-margin-30, .u-m-30 {
+  margin: 30rpx !important;
+}
+.u-padding-30, .u-p-30 {
+  padding: 30rpx !important;
+}
+.u-m-l-30 {
+  margin-left: 30rpx !important;
+}
+.u-p-l-30 {
+  padding-left: 30rpx !important;
+}
+.u-margin-left-30 {
+  margin-left: 30rpx !important;
+}
+.u-padding-left-30 {
+  padding-left: 30rpx !important;
+}
+.u-m-t-30 {
+  margin-top: 30rpx !important;
+}
+.u-p-t-30 {
+  padding-top: 30rpx !important;
+}
+.u-margin-top-30 {
+  margin-top: 30rpx !important;
+}
+.u-padding-top-30 {
+  padding-top: 30rpx !important;
+}
+.u-m-r-30 {
+  margin-right: 30rpx !important;
+}
+.u-p-r-30 {
+  padding-right: 30rpx !important;
+}
+.u-margin-right-30 {
+  margin-right: 30rpx !important;
+}
+.u-padding-right-30 {
+  padding-right: 30rpx !important;
+}
+.u-m-b-30 {
+  margin-bottom: 30rpx !important;
+}
+.u-p-b-30 {
+  padding-bottom: 30rpx !important;
+}
+.u-margin-bottom-30 {
+  margin-bottom: 30rpx !important;
+}
+.u-padding-bottom-30 {
+  padding-bottom: 30rpx !important;
+}
+.u-margin-32, .u-m-32 {
+  margin: 32rpx !important;
+}
+.u-padding-32, .u-p-32 {
+  padding: 32rpx !important;
+}
+.u-m-l-32 {
+  margin-left: 32rpx !important;
+}
+.u-p-l-32 {
+  padding-left: 32rpx !important;
+}
+.u-margin-left-32 {
+  margin-left: 32rpx !important;
+}
+.u-padding-left-32 {
+  padding-left: 32rpx !important;
+}
+.u-m-t-32 {
+  margin-top: 32rpx !important;
+}
+.u-p-t-32 {
+  padding-top: 32rpx !important;
+}
+.u-margin-top-32 {
+  margin-top: 32rpx !important;
+}
+.u-padding-top-32 {
+  padding-top: 32rpx !important;
+}
+.u-m-r-32 {
+  margin-right: 32rpx !important;
+}
+.u-p-r-32 {
+  padding-right: 32rpx !important;
+}
+.u-margin-right-32 {
+  margin-right: 32rpx !important;
+}
+.u-padding-right-32 {
+  padding-right: 32rpx !important;
+}
+.u-m-b-32 {
+  margin-bottom: 32rpx !important;
+}
+.u-p-b-32 {
+  padding-bottom: 32rpx !important;
+}
+.u-margin-bottom-32 {
+  margin-bottom: 32rpx !important;
+}
+.u-padding-bottom-32 {
+  padding-bottom: 32rpx !important;
+}
+.u-margin-34, .u-m-34 {
+  margin: 34rpx !important;
+}
+.u-padding-34, .u-p-34 {
+  padding: 34rpx !important;
+}
+.u-m-l-34 {
+  margin-left: 34rpx !important;
+}
+.u-p-l-34 {
+  padding-left: 34rpx !important;
+}
+.u-margin-left-34 {
+  margin-left: 34rpx !important;
+}
+.u-padding-left-34 {
+  padding-left: 34rpx !important;
+}
+.u-m-t-34 {
+  margin-top: 34rpx !important;
+}
+.u-p-t-34 {
+  padding-top: 34rpx !important;
+}
+.u-margin-top-34 {
+  margin-top: 34rpx !important;
+}
+.u-padding-top-34 {
+  padding-top: 34rpx !important;
+}
+.u-m-r-34 {
+  margin-right: 34rpx !important;
+}
+.u-p-r-34 {
+  padding-right: 34rpx !important;
+}
+.u-margin-right-34 {
+  margin-right: 34rpx !important;
+}
+.u-padding-right-34 {
+  padding-right: 34rpx !important;
+}
+.u-m-b-34 {
+  margin-bottom: 34rpx !important;
+}
+.u-p-b-34 {
+  padding-bottom: 34rpx !important;
+}
+.u-margin-bottom-34 {
+  margin-bottom: 34rpx !important;
+}
+.u-padding-bottom-34 {
+  padding-bottom: 34rpx !important;
+}
+.u-margin-35, .u-m-35 {
+  margin: 35rpx !important;
+}
+.u-padding-35, .u-p-35 {
+  padding: 35rpx !important;
+}
+.u-m-l-35 {
+  margin-left: 35rpx !important;
+}
+.u-p-l-35 {
+  padding-left: 35rpx !important;
+}
+.u-margin-left-35 {
+  margin-left: 35rpx !important;
+}
+.u-padding-left-35 {
+  padding-left: 35rpx !important;
+}
+.u-m-t-35 {
+  margin-top: 35rpx !important;
+}
+.u-p-t-35 {
+  padding-top: 35rpx !important;
+}
+.u-margin-top-35 {
+  margin-top: 35rpx !important;
+}
+.u-padding-top-35 {
+  padding-top: 35rpx !important;
+}
+.u-m-r-35 {
+  margin-right: 35rpx !important;
+}
+.u-p-r-35 {
+  padding-right: 35rpx !important;
+}
+.u-margin-right-35 {
+  margin-right: 35rpx !important;
+}
+.u-padding-right-35 {
+  padding-right: 35rpx !important;
+}
+.u-m-b-35 {
+  margin-bottom: 35rpx !important;
+}
+.u-p-b-35 {
+  padding-bottom: 35rpx !important;
+}
+.u-margin-bottom-35 {
+  margin-bottom: 35rpx !important;
+}
+.u-padding-bottom-35 {
+  padding-bottom: 35rpx !important;
+}
+.u-margin-36, .u-m-36 {
+  margin: 36rpx !important;
+}
+.u-padding-36, .u-p-36 {
+  padding: 36rpx !important;
+}
+.u-m-l-36 {
+  margin-left: 36rpx !important;
+}
+.u-p-l-36 {
+  padding-left: 36rpx !important;
+}
+.u-margin-left-36 {
+  margin-left: 36rpx !important;
+}
+.u-padding-left-36 {
+  padding-left: 36rpx !important;
+}
+.u-m-t-36 {
+  margin-top: 36rpx !important;
+}
+.u-p-t-36 {
+  padding-top: 36rpx !important;
+}
+.u-margin-top-36 {
+  margin-top: 36rpx !important;
+}
+.u-padding-top-36 {
+  padding-top: 36rpx !important;
+}
+.u-m-r-36 {
+  margin-right: 36rpx !important;
+}
+.u-p-r-36 {
+  padding-right: 36rpx !important;
+}
+.u-margin-right-36 {
+  margin-right: 36rpx !important;
+}
+.u-padding-right-36 {
+  padding-right: 36rpx !important;
+}
+.u-m-b-36 {
+  margin-bottom: 36rpx !important;
+}
+.u-p-b-36 {
+  padding-bottom: 36rpx !important;
+}
+.u-margin-bottom-36 {
+  margin-bottom: 36rpx !important;
+}
+.u-padding-bottom-36 {
+  padding-bottom: 36rpx !important;
+}
+.u-margin-38, .u-m-38 {
+  margin: 38rpx !important;
+}
+.u-padding-38, .u-p-38 {
+  padding: 38rpx !important;
+}
+.u-m-l-38 {
+  margin-left: 38rpx !important;
+}
+.u-p-l-38 {
+  padding-left: 38rpx !important;
+}
+.u-margin-left-38 {
+  margin-left: 38rpx !important;
+}
+.u-padding-left-38 {
+  padding-left: 38rpx !important;
+}
+.u-m-t-38 {
+  margin-top: 38rpx !important;
+}
+.u-p-t-38 {
+  padding-top: 38rpx !important;
+}
+.u-margin-top-38 {
+  margin-top: 38rpx !important;
+}
+.u-padding-top-38 {
+  padding-top: 38rpx !important;
+}
+.u-m-r-38 {
+  margin-right: 38rpx !important;
+}
+.u-p-r-38 {
+  padding-right: 38rpx !important;
+}
+.u-margin-right-38 {
+  margin-right: 38rpx !important;
+}
+.u-padding-right-38 {
+  padding-right: 38rpx !important;
+}
+.u-m-b-38 {
+  margin-bottom: 38rpx !important;
+}
+.u-p-b-38 {
+  padding-bottom: 38rpx !important;
+}
+.u-margin-bottom-38 {
+  margin-bottom: 38rpx !important;
+}
+.u-padding-bottom-38 {
+  padding-bottom: 38rpx !important;
+}
+.u-margin-40, .u-m-40 {
+  margin: 40rpx !important;
+}
+.u-padding-40, .u-p-40 {
+  padding: 40rpx !important;
+}
+.u-m-l-40 {
+  margin-left: 40rpx !important;
+}
+.u-p-l-40 {
+  padding-left: 40rpx !important;
+}
+.u-margin-left-40 {
+  margin-left: 40rpx !important;
+}
+.u-padding-left-40 {
+  padding-left: 40rpx !important;
+}
+.u-m-t-40 {
+  margin-top: 40rpx !important;
+}
+.u-p-t-40 {
+  padding-top: 40rpx !important;
+}
+.u-margin-top-40 {
+  margin-top: 40rpx !important;
+}
+.u-padding-top-40 {
+  padding-top: 40rpx !important;
+}
+.u-m-r-40 {
+  margin-right: 40rpx !important;
+}
+.u-p-r-40 {
+  padding-right: 40rpx !important;
+}
+.u-margin-right-40 {
+  margin-right: 40rpx !important;
+}
+.u-padding-right-40 {
+  padding-right: 40rpx !important;
+}
+.u-m-b-40 {
+  margin-bottom: 40rpx !important;
+}
+.u-p-b-40 {
+  padding-bottom: 40rpx !important;
+}
+.u-margin-bottom-40 {
+  margin-bottom: 40rpx !important;
+}
+.u-padding-bottom-40 {
+  padding-bottom: 40rpx !important;
+}
+.u-margin-42, .u-m-42 {
+  margin: 42rpx !important;
+}
+.u-padding-42, .u-p-42 {
+  padding: 42rpx !important;
+}
+.u-m-l-42 {
+  margin-left: 42rpx !important;
+}
+.u-p-l-42 {
+  padding-left: 42rpx !important;
+}
+.u-margin-left-42 {
+  margin-left: 42rpx !important;
+}
+.u-padding-left-42 {
+  padding-left: 42rpx !important;
+}
+.u-m-t-42 {
+  margin-top: 42rpx !important;
+}
+.u-p-t-42 {
+  padding-top: 42rpx !important;
+}
+.u-margin-top-42 {
+  margin-top: 42rpx !important;
+}
+.u-padding-top-42 {
+  padding-top: 42rpx !important;
+}
+.u-m-r-42 {
+  margin-right: 42rpx !important;
+}
+.u-p-r-42 {
+  padding-right: 42rpx !important;
+}
+.u-margin-right-42 {
+  margin-right: 42rpx !important;
+}
+.u-padding-right-42 {
+  padding-right: 42rpx !important;
+}
+.u-m-b-42 {
+  margin-bottom: 42rpx !important;
+}
+.u-p-b-42 {
+  padding-bottom: 42rpx !important;
+}
+.u-margin-bottom-42 {
+  margin-bottom: 42rpx !important;
+}
+.u-padding-bottom-42 {
+  padding-bottom: 42rpx !important;
+}
+.u-margin-44, .u-m-44 {
+  margin: 44rpx !important;
+}
+.u-padding-44, .u-p-44 {
+  padding: 44rpx !important;
+}
+.u-m-l-44 {
+  margin-left: 44rpx !important;
+}
+.u-p-l-44 {
+  padding-left: 44rpx !important;
+}
+.u-margin-left-44 {
+  margin-left: 44rpx !important;
+}
+.u-padding-left-44 {
+  padding-left: 44rpx !important;
+}
+.u-m-t-44 {
+  margin-top: 44rpx !important;
+}
+.u-p-t-44 {
+  padding-top: 44rpx !important;
+}
+.u-margin-top-44 {
+  margin-top: 44rpx !important;
+}
+.u-padding-top-44 {
+  padding-top: 44rpx !important;
+}
+.u-m-r-44 {
+  margin-right: 44rpx !important;
+}
+.u-p-r-44 {
+  padding-right: 44rpx !important;
+}
+.u-margin-right-44 {
+  margin-right: 44rpx !important;
+}
+.u-padding-right-44 {
+  padding-right: 44rpx !important;
+}
+.u-m-b-44 {
+  margin-bottom: 44rpx !important;
+}
+.u-p-b-44 {
+  padding-bottom: 44rpx !important;
+}
+.u-margin-bottom-44 {
+  margin-bottom: 44rpx !important;
+}
+.u-padding-bottom-44 {
+  padding-bottom: 44rpx !important;
+}
+.u-margin-45, .u-m-45 {
+  margin: 45rpx !important;
+}
+.u-padding-45, .u-p-45 {
+  padding: 45rpx !important;
+}
+.u-m-l-45 {
+  margin-left: 45rpx !important;
+}
+.u-p-l-45 {
+  padding-left: 45rpx !important;
+}
+.u-margin-left-45 {
+  margin-left: 45rpx !important;
+}
+.u-padding-left-45 {
+  padding-left: 45rpx !important;
+}
+.u-m-t-45 {
+  margin-top: 45rpx !important;
+}
+.u-p-t-45 {
+  padding-top: 45rpx !important;
+}
+.u-margin-top-45 {
+  margin-top: 45rpx !important;
+}
+.u-padding-top-45 {
+  padding-top: 45rpx !important;
+}
+.u-m-r-45 {
+  margin-right: 45rpx !important;
+}
+.u-p-r-45 {
+  padding-right: 45rpx !important;
+}
+.u-margin-right-45 {
+  margin-right: 45rpx !important;
+}
+.u-padding-right-45 {
+  padding-right: 45rpx !important;
+}
+.u-m-b-45 {
+  margin-bottom: 45rpx !important;
+}
+.u-p-b-45 {
+  padding-bottom: 45rpx !important;
+}
+.u-margin-bottom-45 {
+  margin-bottom: 45rpx !important;
+}
+.u-padding-bottom-45 {
+  padding-bottom: 45rpx !important;
+}
+.u-margin-46, .u-m-46 {
+  margin: 46rpx !important;
+}
+.u-padding-46, .u-p-46 {
+  padding: 46rpx !important;
+}
+.u-m-l-46 {
+  margin-left: 46rpx !important;
+}
+.u-p-l-46 {
+  padding-left: 46rpx !important;
+}
+.u-margin-left-46 {
+  margin-left: 46rpx !important;
+}
+.u-padding-left-46 {
+  padding-left: 46rpx !important;
+}
+.u-m-t-46 {
+  margin-top: 46rpx !important;
+}
+.u-p-t-46 {
+  padding-top: 46rpx !important;
+}
+.u-margin-top-46 {
+  margin-top: 46rpx !important;
+}
+.u-padding-top-46 {
+  padding-top: 46rpx !important;
+}
+.u-m-r-46 {
+  margin-right: 46rpx !important;
+}
+.u-p-r-46 {
+  padding-right: 46rpx !important;
+}
+.u-margin-right-46 {
+  margin-right: 46rpx !important;
+}
+.u-padding-right-46 {
+  padding-right: 46rpx !important;
+}
+.u-m-b-46 {
+  margin-bottom: 46rpx !important;
+}
+.u-p-b-46 {
+  padding-bottom: 46rpx !important;
+}
+.u-margin-bottom-46 {
+  margin-bottom: 46rpx !important;
+}
+.u-padding-bottom-46 {
+  padding-bottom: 46rpx !important;
+}
+.u-margin-48, .u-m-48 {
+  margin: 48rpx !important;
+}
+.u-padding-48, .u-p-48 {
+  padding: 48rpx !important;
+}
+.u-m-l-48 {
+  margin-left: 48rpx !important;
+}
+.u-p-l-48 {
+  padding-left: 48rpx !important;
+}
+.u-margin-left-48 {
+  margin-left: 48rpx !important;
+}
+.u-padding-left-48 {
+  padding-left: 48rpx !important;
+}
+.u-m-t-48 {
+  margin-top: 48rpx !important;
+}
+.u-p-t-48 {
+  padding-top: 48rpx !important;
+}
+.u-margin-top-48 {
+  margin-top: 48rpx !important;
+}
+.u-padding-top-48 {
+  padding-top: 48rpx !important;
+}
+.u-m-r-48 {
+  margin-right: 48rpx !important;
+}
+.u-p-r-48 {
+  padding-right: 48rpx !important;
+}
+.u-margin-right-48 {
+  margin-right: 48rpx !important;
+}
+.u-padding-right-48 {
+  padding-right: 48rpx !important;
+}
+.u-m-b-48 {
+  margin-bottom: 48rpx !important;
+}
+.u-p-b-48 {
+  padding-bottom: 48rpx !important;
+}
+.u-margin-bottom-48 {
+  margin-bottom: 48rpx !important;
+}
+.u-padding-bottom-48 {
+  padding-bottom: 48rpx !important;
+}
+.u-margin-50, .u-m-50 {
+  margin: 50rpx !important;
+}
+.u-padding-50, .u-p-50 {
+  padding: 50rpx !important;
+}
+.u-m-l-50 {
+  margin-left: 50rpx !important;
+}
+.u-p-l-50 {
+  padding-left: 50rpx !important;
+}
+.u-margin-left-50 {
+  margin-left: 50rpx !important;
+}
+.u-padding-left-50 {
+  padding-left: 50rpx !important;
+}
+.u-m-t-50 {
+  margin-top: 50rpx !important;
+}
+.u-p-t-50 {
+  padding-top: 50rpx !important;
+}
+.u-margin-top-50 {
+  margin-top: 50rpx !important;
+}
+.u-padding-top-50 {
+  padding-top: 50rpx !important;
+}
+.u-m-r-50 {
+  margin-right: 50rpx !important;
+}
+.u-p-r-50 {
+  padding-right: 50rpx !important;
+}
+.u-margin-right-50 {
+  margin-right: 50rpx !important;
+}
+.u-padding-right-50 {
+  padding-right: 50rpx !important;
+}
+.u-m-b-50 {
+  margin-bottom: 50rpx !important;
+}
+.u-p-b-50 {
+  padding-bottom: 50rpx !important;
+}
+.u-margin-bottom-50 {
+  margin-bottom: 50rpx !important;
+}
+.u-padding-bottom-50 {
+  padding-bottom: 50rpx !important;
+}
+.u-margin-52, .u-m-52 {
+  margin: 52rpx !important;
+}
+.u-padding-52, .u-p-52 {
+  padding: 52rpx !important;
+}
+.u-m-l-52 {
+  margin-left: 52rpx !important;
+}
+.u-p-l-52 {
+  padding-left: 52rpx !important;
+}
+.u-margin-left-52 {
+  margin-left: 52rpx !important;
+}
+.u-padding-left-52 {
+  padding-left: 52rpx !important;
+}
+.u-m-t-52 {
+  margin-top: 52rpx !important;
+}
+.u-p-t-52 {
+  padding-top: 52rpx !important;
+}
+.u-margin-top-52 {
+  margin-top: 52rpx !important;
+}
+.u-padding-top-52 {
+  padding-top: 52rpx !important;
+}
+.u-m-r-52 {
+  margin-right: 52rpx !important;
+}
+.u-p-r-52 {
+  padding-right: 52rpx !important;
+}
+.u-margin-right-52 {
+  margin-right: 52rpx !important;
+}
+.u-padding-right-52 {
+  padding-right: 52rpx !important;
+}
+.u-m-b-52 {
+  margin-bottom: 52rpx !important;
+}
+.u-p-b-52 {
+  padding-bottom: 52rpx !important;
+}
+.u-margin-bottom-52 {
+  margin-bottom: 52rpx !important;
+}
+.u-padding-bottom-52 {
+  padding-bottom: 52rpx !important;
+}
+.u-margin-54, .u-m-54 {
+  margin: 54rpx !important;
+}
+.u-padding-54, .u-p-54 {
+  padding: 54rpx !important;
+}
+.u-m-l-54 {
+  margin-left: 54rpx !important;
+}
+.u-p-l-54 {
+  padding-left: 54rpx !important;
+}
+.u-margin-left-54 {
+  margin-left: 54rpx !important;
+}
+.u-padding-left-54 {
+  padding-left: 54rpx !important;
+}
+.u-m-t-54 {
+  margin-top: 54rpx !important;
+}
+.u-p-t-54 {
+  padding-top: 54rpx !important;
+}
+.u-margin-top-54 {
+  margin-top: 54rpx !important;
+}
+.u-padding-top-54 {
+  padding-top: 54rpx !important;
+}
+.u-m-r-54 {
+  margin-right: 54rpx !important;
+}
+.u-p-r-54 {
+  padding-right: 54rpx !important;
+}
+.u-margin-right-54 {
+  margin-right: 54rpx !important;
+}
+.u-padding-right-54 {
+  padding-right: 54rpx !important;
+}
+.u-m-b-54 {
+  margin-bottom: 54rpx !important;
+}
+.u-p-b-54 {
+  padding-bottom: 54rpx !important;
+}
+.u-margin-bottom-54 {
+  margin-bottom: 54rpx !important;
+}
+.u-padding-bottom-54 {
+  padding-bottom: 54rpx !important;
+}
+.u-margin-55, .u-m-55 {
+  margin: 55rpx !important;
+}
+.u-padding-55, .u-p-55 {
+  padding: 55rpx !important;
+}
+.u-m-l-55 {
+  margin-left: 55rpx !important;
+}
+.u-p-l-55 {
+  padding-left: 55rpx !important;
+}
+.u-margin-left-55 {
+  margin-left: 55rpx !important;
+}
+.u-padding-left-55 {
+  padding-left: 55rpx !important;
+}
+.u-m-t-55 {
+  margin-top: 55rpx !important;
+}
+.u-p-t-55 {
+  padding-top: 55rpx !important;
+}
+.u-margin-top-55 {
+  margin-top: 55rpx !important;
+}
+.u-padding-top-55 {
+  padding-top: 55rpx !important;
+}
+.u-m-r-55 {
+  margin-right: 55rpx !important;
+}
+.u-p-r-55 {
+  padding-right: 55rpx !important;
+}
+.u-margin-right-55 {
+  margin-right: 55rpx !important;
+}
+.u-padding-right-55 {
+  padding-right: 55rpx !important;
+}
+.u-m-b-55 {
+  margin-bottom: 55rpx !important;
+}
+.u-p-b-55 {
+  padding-bottom: 55rpx !important;
+}
+.u-margin-bottom-55 {
+  margin-bottom: 55rpx !important;
+}
+.u-padding-bottom-55 {
+  padding-bottom: 55rpx !important;
+}
+.u-margin-56, .u-m-56 {
+  margin: 56rpx !important;
+}
+.u-padding-56, .u-p-56 {
+  padding: 56rpx !important;
+}
+.u-m-l-56 {
+  margin-left: 56rpx !important;
+}
+.u-p-l-56 {
+  padding-left: 56rpx !important;
+}
+.u-margin-left-56 {
+  margin-left: 56rpx !important;
+}
+.u-padding-left-56 {
+  padding-left: 56rpx !important;
+}
+.u-m-t-56 {
+  margin-top: 56rpx !important;
+}
+.u-p-t-56 {
+  padding-top: 56rpx !important;
+}
+.u-margin-top-56 {
+  margin-top: 56rpx !important;
+}
+.u-padding-top-56 {
+  padding-top: 56rpx !important;
+}
+.u-m-r-56 {
+  margin-right: 56rpx !important;
+}
+.u-p-r-56 {
+  padding-right: 56rpx !important;
+}
+.u-margin-right-56 {
+  margin-right: 56rpx !important;
+}
+.u-padding-right-56 {
+  padding-right: 56rpx !important;
+}
+.u-m-b-56 {
+  margin-bottom: 56rpx !important;
+}
+.u-p-b-56 {
+  padding-bottom: 56rpx !important;
+}
+.u-margin-bottom-56 {
+  margin-bottom: 56rpx !important;
+}
+.u-padding-bottom-56 {
+  padding-bottom: 56rpx !important;
+}
+.u-margin-58, .u-m-58 {
+  margin: 58rpx !important;
+}
+.u-padding-58, .u-p-58 {
+  padding: 58rpx !important;
+}
+.u-m-l-58 {
+  margin-left: 58rpx !important;
+}
+.u-p-l-58 {
+  padding-left: 58rpx !important;
+}
+.u-margin-left-58 {
+  margin-left: 58rpx !important;
+}
+.u-padding-left-58 {
+  padding-left: 58rpx !important;
+}
+.u-m-t-58 {
+  margin-top: 58rpx !important;
+}
+.u-p-t-58 {
+  padding-top: 58rpx !important;
+}
+.u-margin-top-58 {
+  margin-top: 58rpx !important;
+}
+.u-padding-top-58 {
+  padding-top: 58rpx !important;
+}
+.u-m-r-58 {
+  margin-right: 58rpx !important;
+}
+.u-p-r-58 {
+  padding-right: 58rpx !important;
+}
+.u-margin-right-58 {
+  margin-right: 58rpx !important;
+}
+.u-padding-right-58 {
+  padding-right: 58rpx !important;
+}
+.u-m-b-58 {
+  margin-bottom: 58rpx !important;
+}
+.u-p-b-58 {
+  padding-bottom: 58rpx !important;
+}
+.u-margin-bottom-58 {
+  margin-bottom: 58rpx !important;
+}
+.u-padding-bottom-58 {
+  padding-bottom: 58rpx !important;
+}
+.u-margin-60, .u-m-60 {
+  margin: 60rpx !important;
+}
+.u-padding-60, .u-p-60 {
+  padding: 60rpx !important;
+}
+.u-m-l-60 {
+  margin-left: 60rpx !important;
+}
+.u-p-l-60 {
+  padding-left: 60rpx !important;
+}
+.u-margin-left-60 {
+  margin-left: 60rpx !important;
+}
+.u-padding-left-60 {
+  padding-left: 60rpx !important;
+}
+.u-m-t-60 {
+  margin-top: 60rpx !important;
+}
+.u-p-t-60 {
+  padding-top: 60rpx !important;
+}
+.u-margin-top-60 {
+  margin-top: 60rpx !important;
+}
+.u-padding-top-60 {
+  padding-top: 60rpx !important;
+}
+.u-m-r-60 {
+  margin-right: 60rpx !important;
+}
+.u-p-r-60 {
+  padding-right: 60rpx !important;
+}
+.u-margin-right-60 {
+  margin-right: 60rpx !important;
+}
+.u-padding-right-60 {
+  padding-right: 60rpx !important;
+}
+.u-m-b-60 {
+  margin-bottom: 60rpx !important;
+}
+.u-p-b-60 {
+  padding-bottom: 60rpx !important;
+}
+.u-margin-bottom-60 {
+  margin-bottom: 60rpx !important;
+}
+.u-padding-bottom-60 {
+  padding-bottom: 60rpx !important;
+}
+.u-margin-62, .u-m-62 {
+  margin: 62rpx !important;
+}
+.u-padding-62, .u-p-62 {
+  padding: 62rpx !important;
+}
+.u-m-l-62 {
+  margin-left: 62rpx !important;
+}
+.u-p-l-62 {
+  padding-left: 62rpx !important;
+}
+.u-margin-left-62 {
+  margin-left: 62rpx !important;
+}
+.u-padding-left-62 {
+  padding-left: 62rpx !important;
+}
+.u-m-t-62 {
+  margin-top: 62rpx !important;
+}
+.u-p-t-62 {
+  padding-top: 62rpx !important;
+}
+.u-margin-top-62 {
+  margin-top: 62rpx !important;
+}
+.u-padding-top-62 {
+  padding-top: 62rpx !important;
+}
+.u-m-r-62 {
+  margin-right: 62rpx !important;
+}
+.u-p-r-62 {
+  padding-right: 62rpx !important;
+}
+.u-margin-right-62 {
+  margin-right: 62rpx !important;
+}
+.u-padding-right-62 {
+  padding-right: 62rpx !important;
+}
+.u-m-b-62 {
+  margin-bottom: 62rpx !important;
+}
+.u-p-b-62 {
+  padding-bottom: 62rpx !important;
+}
+.u-margin-bottom-62 {
+  margin-bottom: 62rpx !important;
+}
+.u-padding-bottom-62 {
+  padding-bottom: 62rpx !important;
+}
+.u-margin-64, .u-m-64 {
+  margin: 64rpx !important;
+}
+.u-padding-64, .u-p-64 {
+  padding: 64rpx !important;
+}
+.u-m-l-64 {
+  margin-left: 64rpx !important;
+}
+.u-p-l-64 {
+  padding-left: 64rpx !important;
+}
+.u-margin-left-64 {
+  margin-left: 64rpx !important;
+}
+.u-padding-left-64 {
+  padding-left: 64rpx !important;
+}
+.u-m-t-64 {
+  margin-top: 64rpx !important;
+}
+.u-p-t-64 {
+  padding-top: 64rpx !important;
+}
+.u-margin-top-64 {
+  margin-top: 64rpx !important;
+}
+.u-padding-top-64 {
+  padding-top: 64rpx !important;
+}
+.u-m-r-64 {
+  margin-right: 64rpx !important;
+}
+.u-p-r-64 {
+  padding-right: 64rpx !important;
+}
+.u-margin-right-64 {
+  margin-right: 64rpx !important;
+}
+.u-padding-right-64 {
+  padding-right: 64rpx !important;
+}
+.u-m-b-64 {
+  margin-bottom: 64rpx !important;
+}
+.u-p-b-64 {
+  padding-bottom: 64rpx !important;
+}
+.u-margin-bottom-64 {
+  margin-bottom: 64rpx !important;
+}
+.u-padding-bottom-64 {
+  padding-bottom: 64rpx !important;
+}
+.u-margin-65, .u-m-65 {
+  margin: 65rpx !important;
+}
+.u-padding-65, .u-p-65 {
+  padding: 65rpx !important;
+}
+.u-m-l-65 {
+  margin-left: 65rpx !important;
+}
+.u-p-l-65 {
+  padding-left: 65rpx !important;
+}
+.u-margin-left-65 {
+  margin-left: 65rpx !important;
+}
+.u-padding-left-65 {
+  padding-left: 65rpx !important;
+}
+.u-m-t-65 {
+  margin-top: 65rpx !important;
+}
+.u-p-t-65 {
+  padding-top: 65rpx !important;
+}
+.u-margin-top-65 {
+  margin-top: 65rpx !important;
+}
+.u-padding-top-65 {
+  padding-top: 65rpx !important;
+}
+.u-m-r-65 {
+  margin-right: 65rpx !important;
+}
+.u-p-r-65 {
+  padding-right: 65rpx !important;
+}
+.u-margin-right-65 {
+  margin-right: 65rpx !important;
+}
+.u-padding-right-65 {
+  padding-right: 65rpx !important;
+}
+.u-m-b-65 {
+  margin-bottom: 65rpx !important;
+}
+.u-p-b-65 {
+  padding-bottom: 65rpx !important;
+}
+.u-margin-bottom-65 {
+  margin-bottom: 65rpx !important;
+}
+.u-padding-bottom-65 {
+  padding-bottom: 65rpx !important;
+}
+.u-margin-66, .u-m-66 {
+  margin: 66rpx !important;
+}
+.u-padding-66, .u-p-66 {
+  padding: 66rpx !important;
+}
+.u-m-l-66 {
+  margin-left: 66rpx !important;
+}
+.u-p-l-66 {
+  padding-left: 66rpx !important;
+}
+.u-margin-left-66 {
+  margin-left: 66rpx !important;
+}
+.u-padding-left-66 {
+  padding-left: 66rpx !important;
+}
+.u-m-t-66 {
+  margin-top: 66rpx !important;
+}
+.u-p-t-66 {
+  padding-top: 66rpx !important;
+}
+.u-margin-top-66 {
+  margin-top: 66rpx !important;
+}
+.u-padding-top-66 {
+  padding-top: 66rpx !important;
+}
+.u-m-r-66 {
+  margin-right: 66rpx !important;
+}
+.u-p-r-66 {
+  padding-right: 66rpx !important;
+}
+.u-margin-right-66 {
+  margin-right: 66rpx !important;
+}
+.u-padding-right-66 {
+  padding-right: 66rpx !important;
+}
+.u-m-b-66 {
+  margin-bottom: 66rpx !important;
+}
+.u-p-b-66 {
+  padding-bottom: 66rpx !important;
+}
+.u-margin-bottom-66 {
+  margin-bottom: 66rpx !important;
+}
+.u-padding-bottom-66 {
+  padding-bottom: 66rpx !important;
+}
+.u-margin-68, .u-m-68 {
+  margin: 68rpx !important;
+}
+.u-padding-68, .u-p-68 {
+  padding: 68rpx !important;
+}
+.u-m-l-68 {
+  margin-left: 68rpx !important;
+}
+.u-p-l-68 {
+  padding-left: 68rpx !important;
+}
+.u-margin-left-68 {
+  margin-left: 68rpx !important;
+}
+.u-padding-left-68 {
+  padding-left: 68rpx !important;
+}
+.u-m-t-68 {
+  margin-top: 68rpx !important;
+}
+.u-p-t-68 {
+  padding-top: 68rpx !important;
+}
+.u-margin-top-68 {
+  margin-top: 68rpx !important;
+}
+.u-padding-top-68 {
+  padding-top: 68rpx !important;
+}
+.u-m-r-68 {
+  margin-right: 68rpx !important;
+}
+.u-p-r-68 {
+  padding-right: 68rpx !important;
+}
+.u-margin-right-68 {
+  margin-right: 68rpx !important;
+}
+.u-padding-right-68 {
+  padding-right: 68rpx !important;
+}
+.u-m-b-68 {
+  margin-bottom: 68rpx !important;
+}
+.u-p-b-68 {
+  padding-bottom: 68rpx !important;
+}
+.u-margin-bottom-68 {
+  margin-bottom: 68rpx !important;
+}
+.u-padding-bottom-68 {
+  padding-bottom: 68rpx !important;
+}
+.u-margin-70, .u-m-70 {
+  margin: 70rpx !important;
+}
+.u-padding-70, .u-p-70 {
+  padding: 70rpx !important;
+}
+.u-m-l-70 {
+  margin-left: 70rpx !important;
+}
+.u-p-l-70 {
+  padding-left: 70rpx !important;
+}
+.u-margin-left-70 {
+  margin-left: 70rpx !important;
+}
+.u-padding-left-70 {
+  padding-left: 70rpx !important;
+}
+.u-m-t-70 {
+  margin-top: 70rpx !important;
+}
+.u-p-t-70 {
+  padding-top: 70rpx !important;
+}
+.u-margin-top-70 {
+  margin-top: 70rpx !important;
+}
+.u-padding-top-70 {
+  padding-top: 70rpx !important;
+}
+.u-m-r-70 {
+  margin-right: 70rpx !important;
+}
+.u-p-r-70 {
+  padding-right: 70rpx !important;
+}
+.u-margin-right-70 {
+  margin-right: 70rpx !important;
+}
+.u-padding-right-70 {
+  padding-right: 70rpx !important;
+}
+.u-m-b-70 {
+  margin-bottom: 70rpx !important;
+}
+.u-p-b-70 {
+  padding-bottom: 70rpx !important;
+}
+.u-margin-bottom-70 {
+  margin-bottom: 70rpx !important;
+}
+.u-padding-bottom-70 {
+  padding-bottom: 70rpx !important;
+}
+.u-margin-72, .u-m-72 {
+  margin: 72rpx !important;
+}
+.u-padding-72, .u-p-72 {
+  padding: 72rpx !important;
+}
+.u-m-l-72 {
+  margin-left: 72rpx !important;
+}
+.u-p-l-72 {
+  padding-left: 72rpx !important;
+}
+.u-margin-left-72 {
+  margin-left: 72rpx !important;
+}
+.u-padding-left-72 {
+  padding-left: 72rpx !important;
+}
+.u-m-t-72 {
+  margin-top: 72rpx !important;
+}
+.u-p-t-72 {
+  padding-top: 72rpx !important;
+}
+.u-margin-top-72 {
+  margin-top: 72rpx !important;
+}
+.u-padding-top-72 {
+  padding-top: 72rpx !important;
+}
+.u-m-r-72 {
+  margin-right: 72rpx !important;
+}
+.u-p-r-72 {
+  padding-right: 72rpx !important;
+}
+.u-margin-right-72 {
+  margin-right: 72rpx !important;
+}
+.u-padding-right-72 {
+  padding-right: 72rpx !important;
+}
+.u-m-b-72 {
+  margin-bottom: 72rpx !important;
+}
+.u-p-b-72 {
+  padding-bottom: 72rpx !important;
+}
+.u-margin-bottom-72 {
+  margin-bottom: 72rpx !important;
+}
+.u-padding-bottom-72 {
+  padding-bottom: 72rpx !important;
+}
+.u-margin-74, .u-m-74 {
+  margin: 74rpx !important;
+}
+.u-padding-74, .u-p-74 {
+  padding: 74rpx !important;
+}
+.u-m-l-74 {
+  margin-left: 74rpx !important;
+}
+.u-p-l-74 {
+  padding-left: 74rpx !important;
+}
+.u-margin-left-74 {
+  margin-left: 74rpx !important;
+}
+.u-padding-left-74 {
+  padding-left: 74rpx !important;
+}
+.u-m-t-74 {
+  margin-top: 74rpx !important;
+}
+.u-p-t-74 {
+  padding-top: 74rpx !important;
+}
+.u-margin-top-74 {
+  margin-top: 74rpx !important;
+}
+.u-padding-top-74 {
+  padding-top: 74rpx !important;
+}
+.u-m-r-74 {
+  margin-right: 74rpx !important;
+}
+.u-p-r-74 {
+  padding-right: 74rpx !important;
+}
+.u-margin-right-74 {
+  margin-right: 74rpx !important;
+}
+.u-padding-right-74 {
+  padding-right: 74rpx !important;
+}
+.u-m-b-74 {
+  margin-bottom: 74rpx !important;
+}
+.u-p-b-74 {
+  padding-bottom: 74rpx !important;
+}
+.u-margin-bottom-74 {
+  margin-bottom: 74rpx !important;
+}
+.u-padding-bottom-74 {
+  padding-bottom: 74rpx !important;
+}
+.u-margin-75, .u-m-75 {
+  margin: 75rpx !important;
+}
+.u-padding-75, .u-p-75 {
+  padding: 75rpx !important;
+}
+.u-m-l-75 {
+  margin-left: 75rpx !important;
+}
+.u-p-l-75 {
+  padding-left: 75rpx !important;
+}
+.u-margin-left-75 {
+  margin-left: 75rpx !important;
+}
+.u-padding-left-75 {
+  padding-left: 75rpx !important;
+}
+.u-m-t-75 {
+  margin-top: 75rpx !important;
+}
+.u-p-t-75 {
+  padding-top: 75rpx !important;
+}
+.u-margin-top-75 {
+  margin-top: 75rpx !important;
+}
+.u-padding-top-75 {
+  padding-top: 75rpx !important;
+}
+.u-m-r-75 {
+  margin-right: 75rpx !important;
+}
+.u-p-r-75 {
+  padding-right: 75rpx !important;
+}
+.u-margin-right-75 {
+  margin-right: 75rpx !important;
+}
+.u-padding-right-75 {
+  padding-right: 75rpx !important;
+}
+.u-m-b-75 {
+  margin-bottom: 75rpx !important;
+}
+.u-p-b-75 {
+  padding-bottom: 75rpx !important;
+}
+.u-margin-bottom-75 {
+  margin-bottom: 75rpx !important;
+}
+.u-padding-bottom-75 {
+  padding-bottom: 75rpx !important;
+}
+.u-margin-76, .u-m-76 {
+  margin: 76rpx !important;
+}
+.u-padding-76, .u-p-76 {
+  padding: 76rpx !important;
+}
+.u-m-l-76 {
+  margin-left: 76rpx !important;
+}
+.u-p-l-76 {
+  padding-left: 76rpx !important;
+}
+.u-margin-left-76 {
+  margin-left: 76rpx !important;
+}
+.u-padding-left-76 {
+  padding-left: 76rpx !important;
+}
+.u-m-t-76 {
+  margin-top: 76rpx !important;
+}
+.u-p-t-76 {
+  padding-top: 76rpx !important;
+}
+.u-margin-top-76 {
+  margin-top: 76rpx !important;
+}
+.u-padding-top-76 {
+  padding-top: 76rpx !important;
+}
+.u-m-r-76 {
+  margin-right: 76rpx !important;
+}
+.u-p-r-76 {
+  padding-right: 76rpx !important;
+}
+.u-margin-right-76 {
+  margin-right: 76rpx !important;
+}
+.u-padding-right-76 {
+  padding-right: 76rpx !important;
+}
+.u-m-b-76 {
+  margin-bottom: 76rpx !important;
+}
+.u-p-b-76 {
+  padding-bottom: 76rpx !important;
+}
+.u-margin-bottom-76 {
+  margin-bottom: 76rpx !important;
+}
+.u-padding-bottom-76 {
+  padding-bottom: 76rpx !important;
+}
+.u-margin-78, .u-m-78 {
+  margin: 78rpx !important;
+}
+.u-padding-78, .u-p-78 {
+  padding: 78rpx !important;
+}
+.u-m-l-78 {
+  margin-left: 78rpx !important;
+}
+.u-p-l-78 {
+  padding-left: 78rpx !important;
+}
+.u-margin-left-78 {
+  margin-left: 78rpx !important;
+}
+.u-padding-left-78 {
+  padding-left: 78rpx !important;
+}
+.u-m-t-78 {
+  margin-top: 78rpx !important;
+}
+.u-p-t-78 {
+  padding-top: 78rpx !important;
+}
+.u-margin-top-78 {
+  margin-top: 78rpx !important;
+}
+.u-padding-top-78 {
+  padding-top: 78rpx !important;
+}
+.u-m-r-78 {
+  margin-right: 78rpx !important;
+}
+.u-p-r-78 {
+  padding-right: 78rpx !important;
+}
+.u-margin-right-78 {
+  margin-right: 78rpx !important;
+}
+.u-padding-right-78 {
+  padding-right: 78rpx !important;
+}
+.u-m-b-78 {
+  margin-bottom: 78rpx !important;
+}
+.u-p-b-78 {
+  padding-bottom: 78rpx !important;
+}
+.u-margin-bottom-78 {
+  margin-bottom: 78rpx !important;
+}
+.u-padding-bottom-78 {
+  padding-bottom: 78rpx !important;
+}
+.u-margin-80, .u-m-80 {
+  margin: 80rpx !important;
+}
+.u-padding-80, .u-p-80 {
+  padding: 80rpx !important;
+}
+.u-m-l-80 {
+  margin-left: 80rpx !important;
+}
+.u-p-l-80 {
+  padding-left: 80rpx !important;
+}
+.u-margin-left-80 {
+  margin-left: 80rpx !important;
+}
+.u-padding-left-80 {
+  padding-left: 80rpx !important;
+}
+.u-m-t-80 {
+  margin-top: 80rpx !important;
+}
+.u-p-t-80 {
+  padding-top: 80rpx !important;
+}
+.u-margin-top-80 {
+  margin-top: 80rpx !important;
+}
+.u-padding-top-80 {
+  padding-top: 80rpx !important;
+}
+.u-m-r-80 {
+  margin-right: 80rpx !important;
+}
+.u-p-r-80 {
+  padding-right: 80rpx !important;
+}
+.u-margin-right-80 {
+  margin-right: 80rpx !important;
+}
+.u-padding-right-80 {
+  padding-right: 80rpx !important;
+}
+.u-m-b-80 {
+  margin-bottom: 80rpx !important;
+}
+.u-p-b-80 {
+  padding-bottom: 80rpx !important;
+}
+.u-margin-bottom-80 {
+  margin-bottom: 80rpx !important;
+}
+.u-padding-bottom-80 {
+  padding-bottom: 80rpx !important;
+}
+.u-primary-light {
+  color: #ecf5ff;
+}
+.u-warning-light {
+  color: #fdf6ec;
+}
+.u-success-light {
+  color: #f5fff0;
+}
+.u-error-light {
+  color: #fef0f0;
+}
+.u-info-light {
+  color: #f4f4f5;
+}
+.u-primary-light-bg {
+  background-color: #ecf5ff;
+}
+.u-warning-light-bg {
+  background-color: #fdf6ec;
+}
+.u-success-light-bg {
+  background-color: #f5fff0;
+}
+.u-error-light-bg {
+  background-color: #fef0f0;
+}
+.u-info-light-bg {
+  background-color: #f4f4f5;
+}
+.u-primary-dark {
+  color: #398ade;
+}
+.u-warning-dark {
+  color: #f1a532;
+}
+.u-success-dark {
+  color: #53c21d;
+}
+.u-error-dark {
+  color: #e45656;
+}
+.u-info-dark {
+  color: #767a82;
+}
+.u-primary-dark-bg {
+  background-color: #398ade;
+}
+.u-warning-dark-bg {
+  background-color: #f1a532;
+}
+.u-success-dark-bg {
+  background-color: #53c21d;
+}
+.u-error-dark-bg {
+  background-color: #e45656;
+}
+.u-info-dark-bg {
+  background-color: #767a82;
+}
+.u-primary-disabled {
+  color: #9acafc;
+}
+.u-warning-disabled {
+  color: #f9d39b;
+}
+.u-success-disabled {
+  color: #a9e08f;
+}
+.u-error-disabled {
+  color: #f7b2b2;
+}
+.u-info-disabled {
+  color: #c4c6c9;
+}
+.u-primary {
+  color: #3c9cff;
+}
+.u-warning {
+  color: #f9ae3d;
+}
+.u-success {
+  color: #5ac725;
+}
+.u-error {
+  color: #f56c6c;
+}
+.u-info {
+  color: #909399;
+}
+.u-primary-bg {
+  background-color: #3c9cff;
+}
+.u-warning-bg {
+  background-color: #f9ae3d;
+}
+.u-success-bg {
+  background-color: #5ac725;
+}
+.u-error-bg {
+  background-color: #f56c6c;
+}
+.u-info-bg {
+  background-color: #909399;
+}
+.u-main-color {
+  color: #303133;
+}
+.u-content-color {
+  color: #606266;
+}
+.u-tips-color {
+  color: #909193;
+}
+.u-light-color {
+  color: #c0c4cc;
+}
+.u-safe-area-inset-top {
+  padding-top: 0;
+  padding-top: constant(safe-area-inset-top);
+  padding-top: env(safe-area-inset-top);
+}
+.u-safe-area-inset-right {
+  padding-right: 0;
+  padding-right: constant(safe-area-inset-right);
+  padding-right: env(safe-area-inset-right);
+}
+.u-safe-area-inset-bottom {
+  padding-bottom: 0;
+  padding-bottom: constant(safe-area-inset-bottom);
+  padding-bottom: env(safe-area-inset-bottom);
+}
+.u-safe-area-inset-left {
+  padding-left: 0;
+  padding-left: constant(safe-area-inset-left);
+  padding-left: env(safe-area-inset-left);
+}
+::-webkit-scrollbar {
+  display: none;
+  width: 0 !important;
+  height: 0 !important;
+  -webkit-appearance: none;
+  background: transparent;
+}
+page {
+  font-size: 26rpx;
+  background-color: #eee;
+}page{--status-bar-height:25px;--top-window-height:0px;--window-top:0px;--window-bottom:0px;--window-left:0px;--window-right:0px;--window-magin:0px}[data-c-h="true"]{display: none !important;}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/common/assets.js b/unpackage/dist/dev/mp-weixin/common/assets.js
new file mode 100644
index 0000000..55c844f
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/common/assets.js
@@ -0,0 +1,5 @@
+"use strict";
+const _imports_0 = "/static/icon/n-check.png";
+const _imports_1 = "/static/icon/check.png";
+exports._imports_0 = _imports_0;
+exports._imports_1 = _imports_1;
diff --git a/unpackage/dist/dev/mp-weixin/common/vendor.js b/unpackage/dist/dev/mp-weixin/common/vendor.js
new file mode 100644
index 0000000..2a319ba
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/common/vendor.js
@@ -0,0 +1,7711 @@
+"use strict";
+const _export_sfc = (sfc, props) => {
+  const target = sfc.__vccOpts || sfc;
+  for (const [key, val] of props) {
+    target[key] = val;
+  }
+  return target;
+};
+function makeMap(str, expectsLowerCase) {
+  const map = /* @__PURE__ */ Object.create(null);
+  const list = str.split(",");
+  for (let i = 0; i < list.length; i++) {
+    map[list[i]] = true;
+  }
+  return expectsLowerCase ? (val) => !!map[val.toLowerCase()] : (val) => !!map[val];
+}
+const EMPTY_OBJ = Object.freeze({});
+const EMPTY_ARR = Object.freeze([]);
+const NOOP = () => {
+};
+const NO = () => false;
+const isOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // uppercase letter
+(key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97);
+const isModelListener = (key) => key.startsWith("onUpdate:");
+const extend = Object.assign;
+const remove = (arr, el) => {
+  const i = arr.indexOf(el);
+  if (i > -1) {
+    arr.splice(i, 1);
+  }
+};
+const hasOwnProperty$1 = Object.prototype.hasOwnProperty;
+const hasOwn = (val, key) => hasOwnProperty$1.call(val, key);
+const isArray = Array.isArray;
+const isMap = (val) => toTypeString(val) === "[object Map]";
+const isSet = (val) => toTypeString(val) === "[object Set]";
+const isFunction = (val) => typeof val === "function";
+const isString = (val) => typeof val === "string";
+const isSymbol = (val) => typeof val === "symbol";
+const isObject = (val) => val !== null && typeof val === "object";
+const isPromise = (val) => {
+  return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch);
+};
+const objectToString = Object.prototype.toString;
+const toTypeString = (value) => objectToString.call(value);
+const toRawType = (value) => {
+  return toTypeString(value).slice(8, -1);
+};
+const isPlainObject$1 = (val) => toTypeString(val) === "[object Object]";
+const isIntegerKey = (key) => isString(key) && key !== "NaN" && key[0] !== "-" && "" + parseInt(key, 10) === key;
+const isReservedProp = /* @__PURE__ */ makeMap(
+  // the leading comma is intentional so empty string "" is also included
+  ",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"
+);
+const isBuiltInDirective = /* @__PURE__ */ makeMap(
+  "bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo"
+);
+const cacheStringFunction = (fn) => {
+  const cache = /* @__PURE__ */ Object.create(null);
+  return (str) => {
+    const hit = cache[str];
+    return hit || (cache[str] = fn(str));
+  };
+};
+const camelizeRE = /-(\w)/g;
+const camelize = cacheStringFunction((str) => {
+  return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : "");
+});
+const hyphenateRE = /\B([A-Z])/g;
+const hyphenate = cacheStringFunction(
+  (str) => str.replace(hyphenateRE, "-$1").toLowerCase()
+);
+const capitalize = cacheStringFunction((str) => {
+  return str.charAt(0).toUpperCase() + str.slice(1);
+});
+const toHandlerKey = cacheStringFunction((str) => {
+  const s2 = str ? `on${capitalize(str)}` : ``;
+  return s2;
+});
+const hasChanged = (value, oldValue) => !Object.is(value, oldValue);
+const invokeArrayFns$1 = (fns, arg) => {
+  for (let i = 0; i < fns.length; i++) {
+    fns[i](arg);
+  }
+};
+const def = (obj, key, value) => {
+  Object.defineProperty(obj, key, {
+    configurable: true,
+    enumerable: false,
+    value
+  });
+};
+const looseToNumber = (val) => {
+  const n2 = parseFloat(val);
+  return isNaN(n2) ? val : n2;
+};
+function normalizeStyle(value) {
+  if (isArray(value)) {
+    const res = {};
+    for (let i = 0; i < value.length; i++) {
+      const item = value[i];
+      const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item);
+      if (normalized) {
+        for (const key in normalized) {
+          res[key] = normalized[key];
+        }
+      }
+    }
+    return res;
+  } else if (isString(value) || isObject(value)) {
+    return value;
+  }
+}
+const listDelimiterRE = /;(?![^(]*\))/g;
+const propertyDelimiterRE = /:([^]+)/;
+const styleCommentRE = /\/\*[^]*?\*\//g;
+function parseStringStyle(cssText) {
+  const ret = {};
+  cssText.replace(styleCommentRE, "").split(listDelimiterRE).forEach((item) => {
+    if (item) {
+      const tmp = item.split(propertyDelimiterRE);
+      tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());
+    }
+  });
+  return ret;
+}
+function normalizeClass(value) {
+  let res = "";
+  if (isString(value)) {
+    res = value;
+  } else if (isArray(value)) {
+    for (let i = 0; i < value.length; i++) {
+      const normalized = normalizeClass(value[i]);
+      if (normalized) {
+        res += normalized + " ";
+      }
+    }
+  } else if (isObject(value)) {
+    for (const name in value) {
+      if (value[name]) {
+        res += name + " ";
+      }
+    }
+  }
+  return res.trim();
+}
+const toDisplayString = (val) => {
+  return isString(val) ? val : val == null ? "" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? JSON.stringify(val, replacer, 2) : String(val);
+};
+const replacer = (_key, val) => {
+  if (val && val.__v_isRef) {
+    return replacer(_key, val.value);
+  } else if (isMap(val)) {
+    return {
+      [`Map(${val.size})`]: [...val.entries()].reduce(
+        (entries, [key, val2], i) => {
+          entries[stringifySymbol(key, i) + " =>"] = val2;
+          return entries;
+        },
+        {}
+      )
+    };
+  } else if (isSet(val)) {
+    return {
+      [`Set(${val.size})`]: [...val.values()].map((v) => stringifySymbol(v))
+    };
+  } else if (isSymbol(val)) {
+    return stringifySymbol(val);
+  } else if (isObject(val) && !isArray(val) && !isPlainObject$1(val)) {
+    return String(val);
+  }
+  return val;
+};
+const stringifySymbol = (v, i = "") => {
+  var _a2;
+  return isSymbol(v) ? `Symbol(${(_a2 = v.description) != null ? _a2 : i})` : v;
+};
+const LINEFEED = "\n";
+const SLOT_DEFAULT_NAME = "d";
+const ON_SHOW = "onShow";
+const ON_HIDE = "onHide";
+const ON_LAUNCH = "onLaunch";
+const ON_ERROR = "onError";
+const ON_THEME_CHANGE = "onThemeChange";
+const ON_PAGE_NOT_FOUND = "onPageNotFound";
+const ON_UNHANDLE_REJECTION = "onUnhandledRejection";
+const ON_EXIT = "onExit";
+const ON_LOAD = "onLoad";
+const ON_READY = "onReady";
+const ON_UNLOAD = "onUnload";
+const ON_INIT = "onInit";
+const ON_SAVE_EXIT_STATE = "onSaveExitState";
+const ON_RESIZE = "onResize";
+const ON_BACK_PRESS = "onBackPress";
+const ON_PAGE_SCROLL = "onPageScroll";
+const ON_TAB_ITEM_TAP = "onTabItemTap";
+const ON_REACH_BOTTOM = "onReachBottom";
+const ON_PULL_DOWN_REFRESH = "onPullDownRefresh";
+const ON_SHARE_TIMELINE = "onShareTimeline";
+const ON_ADD_TO_FAVORITES = "onAddToFavorites";
+const ON_SHARE_APP_MESSAGE = "onShareAppMessage";
+const ON_NAVIGATION_BAR_BUTTON_TAP = "onNavigationBarButtonTap";
+const ON_NAVIGATION_BAR_SEARCH_INPUT_CLICKED = "onNavigationBarSearchInputClicked";
+const ON_NAVIGATION_BAR_SEARCH_INPUT_CHANGED = "onNavigationBarSearchInputChanged";
+const ON_NAVIGATION_BAR_SEARCH_INPUT_CONFIRMED = "onNavigationBarSearchInputConfirmed";
+const ON_NAVIGATION_BAR_SEARCH_INPUT_FOCUS_CHANGED = "onNavigationBarSearchInputFocusChanged";
+const customizeRE = /:/g;
+function customizeEvent(str) {
+  return camelize(str.replace(customizeRE, "-"));
+}
+function hasLeadingSlash(str) {
+  return str.indexOf("/") === 0;
+}
+function addLeadingSlash(str) {
+  return hasLeadingSlash(str) ? str : "/" + str;
+}
+const invokeArrayFns = (fns, arg) => {
+  let ret;
+  for (let i = 0; i < fns.length; i++) {
+    ret = fns[i](arg);
+  }
+  return ret;
+};
+function once(fn, ctx = null) {
+  let res;
+  return (...args) => {
+    if (fn) {
+      res = fn.apply(ctx, args);
+      fn = null;
+    }
+    return res;
+  };
+}
+function getValueByDataPath(obj, path) {
+  if (!isString(path)) {
+    return;
+  }
+  path = path.replace(/\[(\d+)\]/g, ".$1");
+  const parts = path.split(".");
+  let key = parts[0];
+  if (!obj) {
+    obj = {};
+  }
+  if (parts.length === 1) {
+    return obj[key];
+  }
+  return getValueByDataPath(obj[key], parts.slice(1).join("."));
+}
+function sortObject(obj) {
+  let sortObj = {};
+  if (isPlainObject$1(obj)) {
+    Object.keys(obj).sort().forEach((key) => {
+      const _key = key;
+      sortObj[_key] = obj[_key];
+    });
+  }
+  return !Object.keys(sortObj) ? obj : sortObj;
+}
+const encode = encodeURIComponent;
+function stringifyQuery(obj, encodeStr = encode) {
+  const res = obj ? Object.keys(obj).map((key) => {
+    let val = obj[key];
+    if (typeof val === void 0 || val === null) {
+      val = "";
+    } else if (isPlainObject$1(val)) {
+      val = JSON.stringify(val);
+    }
+    return encodeStr(key) + "=" + encodeStr(val);
+  }).filter((x) => x.length > 0).join("&") : null;
+  return res ? `?${res}` : "";
+}
+const PAGE_HOOKS = [
+  ON_INIT,
+  ON_LOAD,
+  ON_SHOW,
+  ON_HIDE,
+  ON_UNLOAD,
+  ON_BACK_PRESS,
+  ON_PAGE_SCROLL,
+  ON_TAB_ITEM_TAP,
+  ON_REACH_BOTTOM,
+  ON_PULL_DOWN_REFRESH,
+  ON_SHARE_TIMELINE,
+  ON_SHARE_APP_MESSAGE,
+  ON_ADD_TO_FAVORITES,
+  ON_SAVE_EXIT_STATE,
+  ON_NAVIGATION_BAR_BUTTON_TAP,
+  ON_NAVIGATION_BAR_SEARCH_INPUT_CLICKED,
+  ON_NAVIGATION_BAR_SEARCH_INPUT_CHANGED,
+  ON_NAVIGATION_BAR_SEARCH_INPUT_CONFIRMED,
+  ON_NAVIGATION_BAR_SEARCH_INPUT_FOCUS_CHANGED
+];
+function isRootHook(name) {
+  return PAGE_HOOKS.indexOf(name) > -1;
+}
+const UniLifecycleHooks = [
+  ON_SHOW,
+  ON_HIDE,
+  ON_LAUNCH,
+  ON_ERROR,
+  ON_THEME_CHANGE,
+  ON_PAGE_NOT_FOUND,
+  ON_UNHANDLE_REJECTION,
+  ON_EXIT,
+  ON_INIT,
+  ON_LOAD,
+  ON_READY,
+  ON_UNLOAD,
+  ON_RESIZE,
+  ON_BACK_PRESS,
+  ON_PAGE_SCROLL,
+  ON_TAB_ITEM_TAP,
+  ON_REACH_BOTTOM,
+  ON_PULL_DOWN_REFRESH,
+  ON_SHARE_TIMELINE,
+  ON_ADD_TO_FAVORITES,
+  ON_SHARE_APP_MESSAGE,
+  ON_SAVE_EXIT_STATE,
+  ON_NAVIGATION_BAR_BUTTON_TAP,
+  ON_NAVIGATION_BAR_SEARCH_INPUT_CLICKED,
+  ON_NAVIGATION_BAR_SEARCH_INPUT_CHANGED,
+  ON_NAVIGATION_BAR_SEARCH_INPUT_CONFIRMED,
+  ON_NAVIGATION_BAR_SEARCH_INPUT_FOCUS_CHANGED
+];
+const MINI_PROGRAM_PAGE_RUNTIME_HOOKS = /* @__PURE__ */ (() => {
+  return {
+    onPageScroll: 1,
+    onShareAppMessage: 1 << 1,
+    onShareTimeline: 1 << 2
+  };
+})();
+function isUniLifecycleHook(name, value, checkType = true) {
+  if (checkType && !isFunction(value)) {
+    return false;
+  }
+  if (UniLifecycleHooks.indexOf(name) > -1) {
+    return true;
+  } else if (name.indexOf("on") === 0) {
+    return true;
+  }
+  return false;
+}
+let vueApp;
+const createVueAppHooks = [];
+function onCreateVueApp(hook) {
+  if (vueApp) {
+    return hook(vueApp);
+  }
+  createVueAppHooks.push(hook);
+}
+function invokeCreateVueAppHook(app) {
+  vueApp = app;
+  createVueAppHooks.forEach((hook) => hook(app));
+}
+const invokeCreateErrorHandler = once((app, createErrorHandler2) => {
+  if (isFunction(app._component.onError)) {
+    return createErrorHandler2(app);
+  }
+});
+const E = function() {
+};
+E.prototype = {
+  on: function(name, callback, ctx) {
+    var e2 = this.e || (this.e = {});
+    (e2[name] || (e2[name] = [])).push({
+      fn: callback,
+      ctx
+    });
+    return this;
+  },
+  once: function(name, callback, ctx) {
+    var self = this;
+    function listener() {
+      self.off(name, listener);
+      callback.apply(ctx, arguments);
+    }
+    listener._ = callback;
+    return this.on(name, listener, ctx);
+  },
+  emit: function(name) {
+    var data = [].slice.call(arguments, 1);
+    var evtArr = ((this.e || (this.e = {}))[name] || []).slice();
+    var i = 0;
+    var len = evtArr.length;
+    for (i; i < len; i++) {
+      evtArr[i].fn.apply(evtArr[i].ctx, data);
+    }
+    return this;
+  },
+  off: function(name, callback) {
+    var e2 = this.e || (this.e = {});
+    var evts = e2[name];
+    var liveEvents = [];
+    if (evts && callback) {
+      for (var i = evts.length - 1; i >= 0; i--) {
+        if (evts[i].fn === callback || evts[i].fn._ === callback) {
+          evts.splice(i, 1);
+          break;
+        }
+      }
+      liveEvents = evts;
+    }
+    liveEvents.length ? e2[name] = liveEvents : delete e2[name];
+    return this;
+  }
+};
+var E$1 = E;
+const LOCALE_ZH_HANS = "zh-Hans";
+const LOCALE_ZH_HANT = "zh-Hant";
+const LOCALE_EN = "en";
+const LOCALE_FR = "fr";
+const LOCALE_ES = "es";
+function include(str, parts) {
+  return !!parts.find((part) => str.indexOf(part) !== -1);
+}
+function startsWith(str, parts) {
+  return parts.find((part) => str.indexOf(part) === 0);
+}
+function normalizeLocale(locale, messages) {
+  if (!locale) {
+    return;
+  }
+  locale = locale.trim().replace(/_/g, "-");
+  if (messages && messages[locale]) {
+    return locale;
+  }
+  locale = locale.toLowerCase();
+  if (locale === "chinese") {
+    return LOCALE_ZH_HANS;
+  }
+  if (locale.indexOf("zh") === 0) {
+    if (locale.indexOf("-hans") > -1) {
+      return LOCALE_ZH_HANS;
+    }
+    if (locale.indexOf("-hant") > -1) {
+      return LOCALE_ZH_HANT;
+    }
+    if (include(locale, ["-tw", "-hk", "-mo", "-cht"])) {
+      return LOCALE_ZH_HANT;
+    }
+    return LOCALE_ZH_HANS;
+  }
+  let locales = [LOCALE_EN, LOCALE_FR, LOCALE_ES];
+  if (messages && Object.keys(messages).length > 0) {
+    locales = Object.keys(messages);
+  }
+  const lang = startsWith(locale, locales);
+  if (lang) {
+    return lang;
+  }
+}
+function getBaseSystemInfo() {
+  return wx.getSystemInfoSync();
+}
+function validateProtocolFail(name, msg) {
+  console.warn(`${name}: ${msg}`);
+}
+function validateProtocol(name, data, protocol, onFail) {
+  if (!onFail) {
+    onFail = validateProtocolFail;
+  }
+  for (const key in protocol) {
+    const errMsg = validateProp$1(key, data[key], protocol[key], !hasOwn(data, key));
+    if (isString(errMsg)) {
+      onFail(name, errMsg);
+    }
+  }
+}
+function validateProtocols(name, args, protocol, onFail) {
+  if (!protocol) {
+    return;
+  }
+  if (!isArray(protocol)) {
+    return validateProtocol(name, args[0] || /* @__PURE__ */ Object.create(null), protocol, onFail);
+  }
+  const len = protocol.length;
+  const argsLen = args.length;
+  for (let i = 0; i < len; i++) {
+    const opts = protocol[i];
+    const data = /* @__PURE__ */ Object.create(null);
+    if (argsLen > i) {
+      data[opts.name] = args[i];
+    }
+    validateProtocol(name, data, { [opts.name]: opts }, onFail);
+  }
+}
+function validateProp$1(name, value, prop, isAbsent) {
+  if (!isPlainObject$1(prop)) {
+    prop = { type: prop };
+  }
+  const { type, required, validator } = prop;
+  if (required && isAbsent) {
+    return 'Missing required args: "' + name + '"';
+  }
+  if (value == null && !required) {
+    return;
+  }
+  if (type != null) {
+    let isValid = false;
+    const types = isArray(type) ? type : [type];
+    const expectedTypes = [];
+    for (let i = 0; i < types.length && !isValid; i++) {
+      const { valid, expectedType } = assertType$1(value, types[i]);
+      expectedTypes.push(expectedType || "");
+      isValid = valid;
+    }
+    if (!isValid) {
+      return getInvalidTypeMessage$1(name, value, expectedTypes);
+    }
+  }
+  if (validator) {
+    return validator(value);
+  }
+}
+const isSimpleType$1 = /* @__PURE__ */ makeMap("String,Number,Boolean,Function,Symbol");
+function assertType$1(value, type) {
+  let valid;
+  const expectedType = getType$1(type);
+  if (isSimpleType$1(expectedType)) {
+    const t2 = typeof value;
+    valid = t2 === expectedType.toLowerCase();
+    if (!valid && t2 === "object") {
+      valid = value instanceof type;
+    }
+  } else if (expectedType === "Object") {
+    valid = isObject(value);
+  } else if (expectedType === "Array") {
+    valid = isArray(value);
+  } else {
+    {
+      valid = value instanceof type;
+    }
+  }
+  return {
+    valid,
+    expectedType
+  };
+}
+function getInvalidTypeMessage$1(name, value, expectedTypes) {
+  let message = `Invalid args: type check failed for args "${name}". Expected ${expectedTypes.map(capitalize).join(", ")}`;
+  const expectedType = expectedTypes[0];
+  const receivedType = toRawType(value);
+  const expectedValue = styleValue$1(value, expectedType);
+  const receivedValue = styleValue$1(value, receivedType);
+  if (expectedTypes.length === 1 && isExplicable$1(expectedType) && !isBoolean$1(expectedType, receivedType)) {
+    message += ` with value ${expectedValue}`;
+  }
+  message += `, got ${receivedType} `;
+  if (isExplicable$1(receivedType)) {
+    message += `with value ${receivedValue}.`;
+  }
+  return message;
+}
+function getType$1(ctor) {
+  const match = ctor && ctor.toString().match(/^\s*function (\w+)/);
+  return match ? match[1] : "";
+}
+function styleValue$1(value, type) {
+  if (type === "String") {
+    return `"${value}"`;
+  } else if (type === "Number") {
+    return `${Number(value)}`;
+  } else {
+    return `${value}`;
+  }
+}
+function isExplicable$1(type) {
+  const explicitTypes = ["string", "number", "boolean"];
+  return explicitTypes.some((elem) => type.toLowerCase() === elem);
+}
+function isBoolean$1(...args) {
+  return args.some((elem) => elem.toLowerCase() === "boolean");
+}
+function tryCatch(fn) {
+  return function() {
+    try {
+      return fn.apply(fn, arguments);
+    } catch (e2) {
+      console.error(e2);
+    }
+  };
+}
+let invokeCallbackId = 1;
+const invokeCallbacks = {};
+function addInvokeCallback(id, name, callback, keepAlive = false) {
+  invokeCallbacks[id] = {
+    name,
+    keepAlive,
+    callback
+  };
+  return id;
+}
+function invokeCallback(id, res, extras) {
+  if (typeof id === "number") {
+    const opts = invokeCallbacks[id];
+    if (opts) {
+      if (!opts.keepAlive) {
+        delete invokeCallbacks[id];
+      }
+      return opts.callback(res, extras);
+    }
+  }
+  return res;
+}
+const API_SUCCESS = "success";
+const API_FAIL = "fail";
+const API_COMPLETE = "complete";
+function getApiCallbacks(args) {
+  const apiCallbacks = {};
+  for (const name in args) {
+    const fn = args[name];
+    if (isFunction(fn)) {
+      apiCallbacks[name] = tryCatch(fn);
+      delete args[name];
+    }
+  }
+  return apiCallbacks;
+}
+function normalizeErrMsg$1(errMsg, name) {
+  if (!errMsg || errMsg.indexOf(":fail") === -1) {
+    return name + ":ok";
+  }
+  return name + errMsg.substring(errMsg.indexOf(":fail"));
+}
+function createAsyncApiCallback(name, args = {}, { beforeAll, beforeSuccess } = {}) {
+  if (!isPlainObject$1(args)) {
+    args = {};
+  }
+  const { success, fail, complete } = getApiCallbacks(args);
+  const hasSuccess = isFunction(success);
+  const hasFail = isFunction(fail);
+  const hasComplete = isFunction(complete);
+  const callbackId = invokeCallbackId++;
+  addInvokeCallback(callbackId, name, (res) => {
+    res = res || {};
+    res.errMsg = normalizeErrMsg$1(res.errMsg, name);
+    isFunction(beforeAll) && beforeAll(res);
+    if (res.errMsg === name + ":ok") {
+      isFunction(beforeSuccess) && beforeSuccess(res, args);
+      hasSuccess && success(res);
+    } else {
+      hasFail && fail(res);
+    }
+    hasComplete && complete(res);
+  });
+  return callbackId;
+}
+const HOOK_SUCCESS = "success";
+const HOOK_FAIL = "fail";
+const HOOK_COMPLETE = "complete";
+const globalInterceptors = {};
+const scopedInterceptors = {};
+function wrapperHook(hook, params) {
+  return function(data) {
+    return hook(data, params) || data;
+  };
+}
+function queue$1(hooks, data, params) {
+  let promise = false;
+  for (let i = 0; i < hooks.length; i++) {
+    const hook = hooks[i];
+    if (promise) {
+      promise = Promise.resolve(wrapperHook(hook, params));
+    } else {
+      const res = hook(data, params);
+      if (isPromise(res)) {
+        promise = Promise.resolve(res);
+      }
+      if (res === false) {
+        return {
+          then() {
+          },
+          catch() {
+          }
+        };
+      }
+    }
+  }
+  return promise || {
+    then(callback) {
+      return callback(data);
+    },
+    catch() {
+    }
+  };
+}
+function wrapperOptions(interceptors2, options = {}) {
+  [HOOK_SUCCESS, HOOK_FAIL, HOOK_COMPLETE].forEach((name) => {
+    const hooks = interceptors2[name];
+    if (!isArray(hooks)) {
+      return;
+    }
+    const oldCallback = options[name];
+    options[name] = function callbackInterceptor(res) {
+      queue$1(hooks, res, options).then((res2) => {
+        return isFunction(oldCallback) && oldCallback(res2) || res2;
+      });
+    };
+  });
+  return options;
+}
+function wrapperReturnValue(method, returnValue) {
+  const returnValueHooks = [];
+  if (isArray(globalInterceptors.returnValue)) {
+    returnValueHooks.push(...globalInterceptors.returnValue);
+  }
+  const interceptor = scopedInterceptors[method];
+  if (interceptor && isArray(interceptor.returnValue)) {
+    returnValueHooks.push(...interceptor.returnValue);
+  }
+  returnValueHooks.forEach((hook) => {
+    returnValue = hook(returnValue) || returnValue;
+  });
+  return returnValue;
+}
+function getApiInterceptorHooks(method) {
+  const interceptor = /* @__PURE__ */ Object.create(null);
+  Object.keys(globalInterceptors).forEach((hook) => {
+    if (hook !== "returnValue") {
+      interceptor[hook] = globalInterceptors[hook].slice();
+    }
+  });
+  const scopedInterceptor = scopedInterceptors[method];
+  if (scopedInterceptor) {
+    Object.keys(scopedInterceptor).forEach((hook) => {
+      if (hook !== "returnValue") {
+        interceptor[hook] = (interceptor[hook] || []).concat(scopedInterceptor[hook]);
+      }
+    });
+  }
+  return interceptor;
+}
+function invokeApi(method, api, options, params) {
+  const interceptor = getApiInterceptorHooks(method);
+  if (interceptor && Object.keys(interceptor).length) {
+    if (isArray(interceptor.invoke)) {
+      const res = queue$1(interceptor.invoke, options);
+      return res.then((options2) => {
+        return api(wrapperOptions(getApiInterceptorHooks(method), options2), ...params);
+      });
+    } else {
+      return api(wrapperOptions(interceptor, options), ...params);
+    }
+  }
+  return api(options, ...params);
+}
+function hasCallback(args) {
+  if (isPlainObject$1(args) && [API_SUCCESS, API_FAIL, API_COMPLETE].find((cb) => isFunction(args[cb]))) {
+    return true;
+  }
+  return false;
+}
+function handlePromise(promise) {
+  return promise;
+}
+function promisify$1(name, fn) {
+  return (args = {}, ...rest) => {
+    if (hasCallback(args)) {
+      return wrapperReturnValue(name, invokeApi(name, fn, args, rest));
+    }
+    return wrapperReturnValue(name, handlePromise(new Promise((resolve2, reject) => {
+      invokeApi(name, fn, extend(args, { success: resolve2, fail: reject }), rest);
+    })));
+  };
+}
+function formatApiArgs(args, options) {
+  const params = args[0];
+  if (!options || !isPlainObject$1(options.formatArgs) && isPlainObject$1(params)) {
+    return;
+  }
+  const formatArgs = options.formatArgs;
+  const keys = Object.keys(formatArgs);
+  for (let i = 0; i < keys.length; i++) {
+    const name = keys[i];
+    const formatterOrDefaultValue = formatArgs[name];
+    if (isFunction(formatterOrDefaultValue)) {
+      const errMsg = formatterOrDefaultValue(args[0][name], params);
+      if (isString(errMsg)) {
+        return errMsg;
+      }
+    } else {
+      if (!hasOwn(params, name)) {
+        params[name] = formatterOrDefaultValue;
+      }
+    }
+  }
+}
+function invokeSuccess(id, name, res) {
+  const result = {
+    errMsg: name + ":ok"
+  };
+  return invokeCallback(id, extend(res || {}, result));
+}
+function invokeFail(id, name, errMsg, errRes = {}) {
+  const apiErrMsg = name + ":fail" + (errMsg ? " " + errMsg : "");
+  delete errRes.errCode;
+  return invokeCallback(id, typeof UniError !== "undefined" ? typeof errRes.errCode !== "undefined" ? new UniError(name, errRes.errCode, apiErrMsg) : new UniError(apiErrMsg, errRes) : extend({ errMsg: apiErrMsg }, errRes));
+}
+function beforeInvokeApi(name, args, protocol, options) {
+  {
+    validateProtocols(name, args, protocol);
+  }
+  if (options && options.beforeInvoke) {
+    const errMsg2 = options.beforeInvoke(args);
+    if (isString(errMsg2)) {
+      return errMsg2;
+    }
+  }
+  const errMsg = formatApiArgs(args, options);
+  if (errMsg) {
+    return errMsg;
+  }
+}
+function normalizeErrMsg(errMsg) {
+  if (!errMsg || isString(errMsg)) {
+    return errMsg;
+  }
+  if (errMsg.stack) {
+    console.error(errMsg.message + LINEFEED + errMsg.stack);
+    return errMsg.message;
+  }
+  return errMsg;
+}
+function wrapperTaskApi(name, fn, protocol, options) {
+  return (args) => {
+    const id = createAsyncApiCallback(name, args, options);
+    const errMsg = beforeInvokeApi(name, [args], protocol, options);
+    if (errMsg) {
+      return invokeFail(id, name, errMsg);
+    }
+    return fn(args, {
+      resolve: (res) => invokeSuccess(id, name, res),
+      reject: (errMsg2, errRes) => invokeFail(id, name, normalizeErrMsg(errMsg2), errRes)
+    });
+  };
+}
+function wrapperSyncApi(name, fn, protocol, options) {
+  return (...args) => {
+    const errMsg = beforeInvokeApi(name, args, protocol, options);
+    if (errMsg) {
+      throw new Error(errMsg);
+    }
+    return fn.apply(null, args);
+  };
+}
+function wrapperAsyncApi(name, fn, protocol, options) {
+  return wrapperTaskApi(name, fn, protocol, options);
+}
+function defineSyncApi(name, fn, protocol, options) {
+  return wrapperSyncApi(name, fn, protocol, options);
+}
+function defineAsyncApi(name, fn, protocol, options) {
+  return promisify$1(name, wrapperAsyncApi(name, fn, protocol, options));
+}
+const API_UPX2PX = "upx2px";
+const Upx2pxProtocol = [
+  {
+    name: "upx",
+    type: [Number, String],
+    required: true
+  }
+];
+const EPS = 1e-4;
+const BASE_DEVICE_WIDTH = 750;
+let isIOS = false;
+let deviceWidth = 0;
+let deviceDPR = 0;
+function checkDeviceWidth() {
+  const { platform, pixelRatio, windowWidth } = getBaseSystemInfo();
+  deviceWidth = windowWidth;
+  deviceDPR = pixelRatio;
+  isIOS = platform === "ios";
+}
+const upx2px = defineSyncApi(API_UPX2PX, (number, newDeviceWidth) => {
+  if (deviceWidth === 0) {
+    checkDeviceWidth();
+  }
+  number = Number(number);
+  if (number === 0) {
+    return 0;
+  }
+  let width = newDeviceWidth || deviceWidth;
+  let result = number / BASE_DEVICE_WIDTH * width;
+  if (result < 0) {
+    result = -result;
+  }
+  result = Math.floor(result + EPS);
+  if (result === 0) {
+    if (deviceDPR === 1 || !isIOS) {
+      result = 1;
+    } else {
+      result = 0.5;
+    }
+  }
+  return number < 0 ? -result : result;
+}, Upx2pxProtocol);
+const API_ADD_INTERCEPTOR = "addInterceptor";
+const API_REMOVE_INTERCEPTOR = "removeInterceptor";
+const AddInterceptorProtocol = [
+  {
+    name: "method",
+    type: [String, Object],
+    required: true
+  }
+];
+const RemoveInterceptorProtocol = AddInterceptorProtocol;
+function mergeInterceptorHook(interceptors2, interceptor) {
+  Object.keys(interceptor).forEach((hook) => {
+    if (isFunction(interceptor[hook])) {
+      interceptors2[hook] = mergeHook(interceptors2[hook], interceptor[hook]);
+    }
+  });
+}
+function removeInterceptorHook(interceptors2, interceptor) {
+  if (!interceptors2 || !interceptor) {
+    return;
+  }
+  Object.keys(interceptor).forEach((name) => {
+    const hooks = interceptors2[name];
+    const hook = interceptor[name];
+    if (isArray(hooks) && isFunction(hook)) {
+      remove(hooks, hook);
+    }
+  });
+}
+function mergeHook(parentVal, childVal) {
+  const res = childVal ? parentVal ? parentVal.concat(childVal) : isArray(childVal) ? childVal : [childVal] : parentVal;
+  return res ? dedupeHooks(res) : res;
+}
+function dedupeHooks(hooks) {
+  const res = [];
+  for (let i = 0; i < hooks.length; i++) {
+    if (res.indexOf(hooks[i]) === -1) {
+      res.push(hooks[i]);
+    }
+  }
+  return res;
+}
+const addInterceptor = defineSyncApi(API_ADD_INTERCEPTOR, (method, interceptor) => {
+  if (isString(method) && isPlainObject$1(interceptor)) {
+    mergeInterceptorHook(scopedInterceptors[method] || (scopedInterceptors[method] = {}), interceptor);
+  } else if (isPlainObject$1(method)) {
+    mergeInterceptorHook(globalInterceptors, method);
+  }
+}, AddInterceptorProtocol);
+const removeInterceptor = defineSyncApi(API_REMOVE_INTERCEPTOR, (method, interceptor) => {
+  if (isString(method)) {
+    if (isPlainObject$1(interceptor)) {
+      removeInterceptorHook(scopedInterceptors[method], interceptor);
+    } else {
+      delete scopedInterceptors[method];
+    }
+  } else if (isPlainObject$1(method)) {
+    removeInterceptorHook(globalInterceptors, method);
+  }
+}, RemoveInterceptorProtocol);
+const interceptors = {};
+const API_ON = "$on";
+const OnProtocol = [
+  {
+    name: "event",
+    type: String,
+    required: true
+  },
+  {
+    name: "callback",
+    type: Function,
+    required: true
+  }
+];
+const API_ONCE = "$once";
+const OnceProtocol = OnProtocol;
+const API_OFF = "$off";
+const OffProtocol = [
+  {
+    name: "event",
+    type: [String, Array]
+  },
+  {
+    name: "callback",
+    type: Function
+  }
+];
+const API_EMIT = "$emit";
+const EmitProtocol = [
+  {
+    name: "event",
+    type: String,
+    required: true
+  }
+];
+const emitter = new E$1();
+const $on = defineSyncApi(API_ON, (name, callback) => {
+  emitter.on(name, callback);
+  return () => emitter.off(name, callback);
+}, OnProtocol);
+const $once = defineSyncApi(API_ONCE, (name, callback) => {
+  emitter.once(name, callback);
+  return () => emitter.off(name, callback);
+}, OnceProtocol);
+const $off = defineSyncApi(API_OFF, (name, callback) => {
+  if (!name) {
+    emitter.e = {};
+    return;
+  }
+  if (!isArray(name))
+    name = [name];
+  name.forEach((n2) => emitter.off(n2, callback));
+}, OffProtocol);
+const $emit = defineSyncApi(API_EMIT, (name, ...args) => {
+  emitter.emit(name, ...args);
+}, EmitProtocol);
+let cid;
+let cidErrMsg;
+let enabled;
+function normalizePushMessage(message) {
+  try {
+    return JSON.parse(message);
+  } catch (e2) {
+  }
+  return message;
+}
+function invokePushCallback(args) {
+  if (args.type === "enabled") {
+    enabled = true;
+  } else if (args.type === "clientId") {
+    cid = args.cid;
+    cidErrMsg = args.errMsg;
+    invokeGetPushCidCallbacks(cid, args.errMsg);
+  } else if (args.type === "pushMsg") {
+    const message = {
+      type: "receive",
+      data: normalizePushMessage(args.message)
+    };
+    for (let i = 0; i < onPushMessageCallbacks.length; i++) {
+      const callback = onPushMessageCallbacks[i];
+      callback(message);
+      if (message.stopped) {
+        break;
+      }
+    }
+  } else if (args.type === "click") {
+    onPushMessageCallbacks.forEach((callback) => {
+      callback({
+        type: "click",
+        data: normalizePushMessage(args.message)
+      });
+    });
+  }
+}
+const getPushCidCallbacks = [];
+function invokeGetPushCidCallbacks(cid2, errMsg) {
+  getPushCidCallbacks.forEach((callback) => {
+    callback(cid2, errMsg);
+  });
+  getPushCidCallbacks.length = 0;
+}
+const API_GET_PUSH_CLIENT_ID = "getPushClientId";
+const getPushClientId = defineAsyncApi(API_GET_PUSH_CLIENT_ID, (_, { resolve: resolve2, reject }) => {
+  Promise.resolve().then(() => {
+    if (typeof enabled === "undefined") {
+      enabled = false;
+      cid = "";
+      cidErrMsg = "uniPush is not enabled";
+    }
+    getPushCidCallbacks.push((cid2, errMsg) => {
+      if (cid2) {
+        resolve2({ cid: cid2 });
+      } else {
+        reject(errMsg);
+      }
+    });
+    if (typeof cid !== "undefined") {
+      invokeGetPushCidCallbacks(cid, cidErrMsg);
+    }
+  });
+});
+const onPushMessageCallbacks = [];
+const onPushMessage = (fn) => {
+  if (onPushMessageCallbacks.indexOf(fn) === -1) {
+    onPushMessageCallbacks.push(fn);
+  }
+};
+const offPushMessage = (fn) => {
+  if (!fn) {
+    onPushMessageCallbacks.length = 0;
+  } else {
+    const index2 = onPushMessageCallbacks.indexOf(fn);
+    if (index2 > -1) {
+      onPushMessageCallbacks.splice(index2, 1);
+    }
+  }
+};
+const SYNC_API_RE = /^\$|getLocale|setLocale|sendNativeEvent|restoreGlobal|requireGlobal|getCurrentSubNVue|getMenuButtonBoundingClientRect|^report|interceptors|Interceptor$|getSubNVueById|requireNativePlugin|upx2px|hideKeyboard|canIUse|^create|Sync$|Manager$|base64ToArrayBuffer|arrayBufferToBase64|getDeviceInfo|getAppBaseInfo|getWindowInfo|getSystemSetting|getAppAuthorizeSetting/;
+const CONTEXT_API_RE = /^create|Manager$/;
+const CONTEXT_API_RE_EXC = ["createBLEConnection"];
+const ASYNC_API = ["createBLEConnection"];
+const CALLBACK_API_RE = /^on|^off/;
+function isContextApi(name) {
+  return CONTEXT_API_RE.test(name) && CONTEXT_API_RE_EXC.indexOf(name) === -1;
+}
+function isSyncApi(name) {
+  return SYNC_API_RE.test(name) && ASYNC_API.indexOf(name) === -1;
+}
+function isCallbackApi(name) {
+  return CALLBACK_API_RE.test(name) && name !== "onPush";
+}
+function shouldPromise(name) {
+  if (isContextApi(name) || isSyncApi(name) || isCallbackApi(name)) {
+    return false;
+  }
+  return true;
+}
+if (!Promise.prototype.finally) {
+  Promise.prototype.finally = function(onfinally) {
+    const promise = this.constructor;
+    return this.then((value) => promise.resolve(onfinally && onfinally()).then(() => value), (reason) => promise.resolve(onfinally && onfinally()).then(() => {
+      throw reason;
+    }));
+  };
+}
+function promisify(name, api) {
+  if (!shouldPromise(name)) {
+    return api;
+  }
+  if (!isFunction(api)) {
+    return api;
+  }
+  return function promiseApi(options = {}, ...rest) {
+    if (isFunction(options.success) || isFunction(options.fail) || isFunction(options.complete)) {
+      return wrapperReturnValue(name, invokeApi(name, api, options, rest));
+    }
+    return wrapperReturnValue(name, handlePromise(new Promise((resolve2, reject) => {
+      invokeApi(name, api, extend({}, options, {
+        success: resolve2,
+        fail: reject
+      }), rest);
+    })));
+  };
+}
+const CALLBACKS = ["success", "fail", "cancel", "complete"];
+function initWrapper(protocols2) {
+  function processCallback(methodName, method, returnValue) {
+    return function(res) {
+      return method(processReturnValue(methodName, res, returnValue));
+    };
+  }
+  function processArgs(methodName, fromArgs, argsOption = {}, returnValue = {}, keepFromArgs = false) {
+    if (isPlainObject$1(fromArgs)) {
+      const toArgs = keepFromArgs === true ? fromArgs : {};
+      if (isFunction(argsOption)) {
+        argsOption = argsOption(fromArgs, toArgs) || {};
+      }
+      for (const key in fromArgs) {
+        if (hasOwn(argsOption, key)) {
+          let keyOption = argsOption[key];
+          if (isFunction(keyOption)) {
+            keyOption = keyOption(fromArgs[key], fromArgs, toArgs);
+          }
+          if (!keyOption) {
+            console.warn(`微信小程序 ${methodName} 暂不支持 ${key}`);
+          } else if (isString(keyOption)) {
+            toArgs[keyOption] = fromArgs[key];
+          } else if (isPlainObject$1(keyOption)) {
+            toArgs[keyOption.name ? keyOption.name : key] = keyOption.value;
+          }
+        } else if (CALLBACKS.indexOf(key) !== -1) {
+          const callback = fromArgs[key];
+          if (isFunction(callback)) {
+            toArgs[key] = processCallback(methodName, callback, returnValue);
+          }
+        } else {
+          if (!keepFromArgs && !hasOwn(toArgs, key)) {
+            toArgs[key] = fromArgs[key];
+          }
+        }
+      }
+      return toArgs;
+    } else if (isFunction(fromArgs)) {
+      fromArgs = processCallback(methodName, fromArgs, returnValue);
+    }
+    return fromArgs;
+  }
+  function processReturnValue(methodName, res, returnValue, keepReturnValue = false) {
+    if (isFunction(protocols2.returnValue)) {
+      res = protocols2.returnValue(methodName, res);
+    }
+    return processArgs(methodName, res, returnValue, {}, keepReturnValue);
+  }
+  return function wrapper(methodName, method) {
+    if (!hasOwn(protocols2, methodName)) {
+      return method;
+    }
+    const protocol = protocols2[methodName];
+    if (!protocol) {
+      return function() {
+        console.error(`微信小程序 暂不支持${methodName}`);
+      };
+    }
+    return function(arg1, arg2) {
+      let options = protocol;
+      if (isFunction(protocol)) {
+        options = protocol(arg1);
+      }
+      arg1 = processArgs(methodName, arg1, options.args, options.returnValue);
+      const args = [arg1];
+      if (typeof arg2 !== "undefined") {
+        args.push(arg2);
+      }
+      const returnValue = wx[options.name || methodName].apply(wx, args);
+      if (isSyncApi(methodName)) {
+        return processReturnValue(methodName, returnValue, options.returnValue, isContextApi(methodName));
+      }
+      return returnValue;
+    };
+  };
+}
+const getLocale = () => {
+  const app = isFunction(getApp) && getApp({ allowDefault: true });
+  if (app && app.$vm) {
+    return app.$vm.$locale;
+  }
+  return normalizeLocale(wx.getSystemInfoSync().language) || LOCALE_EN;
+};
+const setLocale = (locale) => {
+  const app = isFunction(getApp) && getApp();
+  if (!app) {
+    return false;
+  }
+  const oldLocale = app.$vm.$locale;
+  if (oldLocale !== locale) {
+    app.$vm.$locale = locale;
+    onLocaleChangeCallbacks.forEach((fn) => fn({ locale }));
+    return true;
+  }
+  return false;
+};
+const onLocaleChangeCallbacks = [];
+const onLocaleChange = (fn) => {
+  if (onLocaleChangeCallbacks.indexOf(fn) === -1) {
+    onLocaleChangeCallbacks.push(fn);
+  }
+};
+if (typeof global !== "undefined") {
+  global.getLocale = getLocale;
+}
+const UUID_KEY = "__DC_STAT_UUID";
+let deviceId;
+function useDeviceId(global2 = wx) {
+  return function addDeviceId(_, toRes) {
+    deviceId = deviceId || global2.getStorageSync(UUID_KEY);
+    if (!deviceId) {
+      deviceId = Date.now() + "" + Math.floor(Math.random() * 1e7);
+      wx.setStorage({
+        key: UUID_KEY,
+        data: deviceId
+      });
+    }
+    toRes.deviceId = deviceId;
+  };
+}
+function addSafeAreaInsets(fromRes, toRes) {
+  if (fromRes.safeArea) {
+    const safeArea = fromRes.safeArea;
+    toRes.safeAreaInsets = {
+      top: safeArea.top,
+      left: safeArea.left,
+      right: fromRes.windowWidth - safeArea.right,
+      bottom: fromRes.screenHeight - safeArea.bottom
+    };
+  }
+}
+function populateParameters(fromRes, toRes) {
+  const { brand = "", model = "", system = "", language = "", theme, version: version2, platform, fontSizeSetting, SDKVersion, pixelRatio, deviceOrientation } = fromRes;
+  let osName = "";
+  let osVersion = "";
+  {
+    osName = system.split(" ")[0] || "";
+    osVersion = system.split(" ")[1] || "";
+  }
+  let hostVersion = version2;
+  let deviceType = getGetDeviceType(fromRes, model);
+  let deviceBrand = getDeviceBrand(brand);
+  let _hostName = getHostName(fromRes);
+  let _deviceOrientation = deviceOrientation;
+  let _devicePixelRatio = pixelRatio;
+  let _SDKVersion = SDKVersion;
+  const hostLanguage = language.replace(/_/g, "-");
+  const parameters = {
+    appId: "__UNI__2BE6000",
+    appName: "purchase-let",
+    appVersion: "1.0.0",
+    appVersionCode: "100",
+    appLanguage: getAppLanguage(hostLanguage),
+    uniCompileVersion: "4.08",
+    uniRuntimeVersion: "4.08",
+    uniPlatform: "mp-weixin",
+    deviceBrand,
+    deviceModel: model,
+    deviceType,
+    devicePixelRatio: _devicePixelRatio,
+    deviceOrientation: _deviceOrientation,
+    osName: osName.toLocaleLowerCase(),
+    osVersion,
+    hostTheme: theme,
+    hostVersion,
+    hostLanguage,
+    hostName: _hostName,
+    hostSDKVersion: _SDKVersion,
+    hostFontSizeSetting: fontSizeSetting,
+    windowTop: 0,
+    windowBottom: 0,
+    // TODO
+    osLanguage: void 0,
+    osTheme: void 0,
+    ua: void 0,
+    hostPackageName: void 0,
+    browserName: void 0,
+    browserVersion: void 0
+  };
+  extend(toRes, parameters);
+}
+function getGetDeviceType(fromRes, model) {
+  let deviceType = fromRes.deviceType || "phone";
+  {
+    const deviceTypeMaps = {
+      ipad: "pad",
+      windows: "pc",
+      mac: "pc"
+    };
+    const deviceTypeMapsKeys = Object.keys(deviceTypeMaps);
+    const _model = model.toLocaleLowerCase();
+    for (let index2 = 0; index2 < deviceTypeMapsKeys.length; index2++) {
+      const _m = deviceTypeMapsKeys[index2];
+      if (_model.indexOf(_m) !== -1) {
+        deviceType = deviceTypeMaps[_m];
+        break;
+      }
+    }
+  }
+  return deviceType;
+}
+function getDeviceBrand(brand) {
+  let deviceBrand = brand;
+  if (deviceBrand) {
+    deviceBrand = deviceBrand.toLocaleLowerCase();
+  }
+  return deviceBrand;
+}
+function getAppLanguage(defaultLanguage) {
+  return getLocale ? getLocale() : defaultLanguage;
+}
+function getHostName(fromRes) {
+  const _platform = "WeChat";
+  let _hostName = fromRes.hostName || _platform;
+  {
+    if (fromRes.environment) {
+      _hostName = fromRes.environment;
+    } else if (fromRes.host && fromRes.host.env) {
+      _hostName = fromRes.host.env;
+    }
+  }
+  return _hostName;
+}
+const getSystemInfo = {
+  returnValue: (fromRes, toRes) => {
+    addSafeAreaInsets(fromRes, toRes);
+    useDeviceId()(fromRes, toRes);
+    populateParameters(fromRes, toRes);
+  }
+};
+const getSystemInfoSync = getSystemInfo;
+const redirectTo = {};
+const previewImage = {
+  args(fromArgs, toArgs) {
+    let currentIndex = parseInt(fromArgs.current);
+    if (isNaN(currentIndex)) {
+      return;
+    }
+    const urls = fromArgs.urls;
+    if (!isArray(urls)) {
+      return;
+    }
+    const len = urls.length;
+    if (!len) {
+      return;
+    }
+    if (currentIndex < 0) {
+      currentIndex = 0;
+    } else if (currentIndex >= len) {
+      currentIndex = len - 1;
+    }
+    if (currentIndex > 0) {
+      toArgs.current = urls[currentIndex];
+      toArgs.urls = urls.filter((item, index2) => index2 < currentIndex ? item !== urls[currentIndex] : true);
+    } else {
+      toArgs.current = urls[0];
+    }
+    return {
+      indicator: false,
+      loop: false
+    };
+  }
+};
+const showActionSheet = {
+  args(fromArgs, toArgs) {
+    toArgs.alertText = fromArgs.title;
+  }
+};
+const getDeviceInfo = {
+  returnValue: (fromRes, toRes) => {
+    const { brand, model } = fromRes;
+    let deviceType = getGetDeviceType(fromRes, model);
+    let deviceBrand = getDeviceBrand(brand);
+    useDeviceId()(fromRes, toRes);
+    toRes = sortObject(extend(toRes, {
+      deviceType,
+      deviceBrand,
+      deviceModel: model
+    }));
+  }
+};
+const getAppBaseInfo = {
+  returnValue: (fromRes, toRes) => {
+    const { version: version2, language, SDKVersion, theme } = fromRes;
+    let _hostName = getHostName(fromRes);
+    let hostLanguage = language.replace(/_/g, "-");
+    toRes = sortObject(extend(toRes, {
+      hostVersion: version2,
+      hostLanguage,
+      hostName: _hostName,
+      hostSDKVersion: SDKVersion,
+      hostTheme: theme,
+      appId: "__UNI__2BE6000",
+      appName: "purchase-let",
+      appVersion: "1.0.0",
+      appVersionCode: "100",
+      appLanguage: getAppLanguage(hostLanguage)
+    }));
+  }
+};
+const getWindowInfo = {
+  returnValue: (fromRes, toRes) => {
+    addSafeAreaInsets(fromRes, toRes);
+    toRes = sortObject(extend(toRes, {
+      windowTop: 0,
+      windowBottom: 0
+    }));
+  }
+};
+const getAppAuthorizeSetting = {
+  returnValue: function(fromRes, toRes) {
+    const { locationReducedAccuracy } = fromRes;
+    toRes.locationAccuracy = "unsupported";
+    if (locationReducedAccuracy === true) {
+      toRes.locationAccuracy = "reduced";
+    } else if (locationReducedAccuracy === false) {
+      toRes.locationAccuracy = "full";
+    }
+  }
+};
+const baseApis = {
+  $on,
+  $off,
+  $once,
+  $emit,
+  upx2px,
+  interceptors,
+  addInterceptor,
+  removeInterceptor,
+  onCreateVueApp,
+  invokeCreateVueAppHook,
+  getLocale,
+  setLocale,
+  onLocaleChange,
+  getPushClientId,
+  onPushMessage,
+  offPushMessage,
+  invokePushCallback
+};
+function initUni(api, protocols2, platform = wx) {
+  const wrapper = initWrapper(protocols2);
+  const UniProxyHandlers = {
+    get(target, key) {
+      if (hasOwn(target, key)) {
+        return target[key];
+      }
+      if (hasOwn(api, key)) {
+        return promisify(key, api[key]);
+      }
+      if (hasOwn(baseApis, key)) {
+        return promisify(key, baseApis[key]);
+      }
+      return promisify(key, wrapper(key, platform[key]));
+    }
+  };
+  return new Proxy({}, UniProxyHandlers);
+}
+function initGetProvider(providers) {
+  return function getProvider2({ service, success, fail, complete }) {
+    let res;
+    if (providers[service]) {
+      res = {
+        errMsg: "getProvider:ok",
+        service,
+        provider: providers[service]
+      };
+      isFunction(success) && success(res);
+    } else {
+      res = {
+        errMsg: "getProvider:fail:服务[" + service + "]不存在"
+      };
+      isFunction(fail) && fail(res);
+    }
+    isFunction(complete) && complete(res);
+  };
+}
+const objectKeys = [
+  "qy",
+  "env",
+  "error",
+  "version",
+  "lanDebug",
+  "cloud",
+  "serviceMarket",
+  "router",
+  "worklet",
+  "__webpack_require_UNI_MP_PLUGIN__"
+];
+const singlePageDisableKey = ["lanDebug", "router", "worklet"];
+const launchOption = wx.getLaunchOptionsSync ? wx.getLaunchOptionsSync() : null;
+function isWxKey(key) {
+  if (launchOption && launchOption.scene === 1154 && singlePageDisableKey.includes(key)) {
+    return false;
+  }
+  return objectKeys.indexOf(key) > -1 || typeof wx[key] === "function";
+}
+function initWx() {
+  const newWx = {};
+  for (const key in wx) {
+    if (isWxKey(key)) {
+      newWx[key] = wx[key];
+    }
+  }
+  if (typeof globalThis !== "undefined" && typeof requireMiniProgram === "undefined") {
+    globalThis.wx = newWx;
+  }
+  return newWx;
+}
+const mocks$1 = ["__route__", "__wxExparserNodeId__", "__wxWebviewId__"];
+const getProvider = initGetProvider({
+  oauth: ["weixin"],
+  share: ["weixin"],
+  payment: ["wxpay"],
+  push: ["weixin"]
+});
+function initComponentMocks(component) {
+  const res = /* @__PURE__ */ Object.create(null);
+  mocks$1.forEach((name) => {
+    res[name] = component[name];
+  });
+  return res;
+}
+function createSelectorQuery() {
+  const query = wx$2.createSelectorQuery();
+  const oldIn = query.in;
+  query.in = function newIn(component) {
+    return oldIn.call(this, initComponentMocks(component));
+  };
+  return query;
+}
+const wx$2 = initWx();
+let baseInfo = wx$2.getAppBaseInfo && wx$2.getAppBaseInfo();
+if (!baseInfo) {
+  baseInfo = wx$2.getSystemInfoSync();
+}
+const host = baseInfo ? baseInfo.host : null;
+const shareVideoMessage = host && host.env === "SAAASDK" ? wx$2.miniapp.shareVideoMessage : wx$2.shareVideoMessage;
+var shims = /* @__PURE__ */ Object.freeze({
+  __proto__: null,
+  createSelectorQuery,
+  getProvider,
+  shareVideoMessage
+});
+const compressImage = {
+  args(fromArgs, toArgs) {
+    if (fromArgs.compressedHeight && !toArgs.compressHeight) {
+      toArgs.compressHeight = fromArgs.compressedHeight;
+    }
+    if (fromArgs.compressedWidth && !toArgs.compressWidth) {
+      toArgs.compressWidth = fromArgs.compressedWidth;
+    }
+  }
+};
+var protocols = /* @__PURE__ */ Object.freeze({
+  __proto__: null,
+  compressImage,
+  getAppAuthorizeSetting,
+  getAppBaseInfo,
+  getDeviceInfo,
+  getSystemInfo,
+  getSystemInfoSync,
+  getWindowInfo,
+  previewImage,
+  redirectTo,
+  showActionSheet
+});
+const wx$1 = initWx();
+var index = initUni(shims, protocols, wx$1);
+function warn$1(msg, ...args) {
+  console.warn(`[Vue warn] ${msg}`, ...args);
+}
+let activeEffectScope;
+class EffectScope {
+  constructor(detached = false) {
+    this.detached = detached;
+    this._active = true;
+    this.effects = [];
+    this.cleanups = [];
+    this.parent = activeEffectScope;
+    if (!detached && activeEffectScope) {
+      this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(this) - 1;
+    }
+  }
+  get active() {
+    return this._active;
+  }
+  run(fn) {
+    if (this._active) {
+      const currentEffectScope = activeEffectScope;
+      try {
+        activeEffectScope = this;
+        return fn();
+      } finally {
+        activeEffectScope = currentEffectScope;
+      }
+    } else {
+      warn$1(`cannot run an inactive effect scope.`);
+    }
+  }
+  /**
+   * This should only be called on non-detached scopes
+   * @internal
+   */
+  on() {
+    activeEffectScope = this;
+  }
+  /**
+   * This should only be called on non-detached scopes
+   * @internal
+   */
+  off() {
+    activeEffectScope = this.parent;
+  }
+  stop(fromParent) {
+    if (this._active) {
+      let i, l;
+      for (i = 0, l = this.effects.length; i < l; i++) {
+        this.effects[i].stop();
+      }
+      for (i = 0, l = this.cleanups.length; i < l; i++) {
+        this.cleanups[i]();
+      }
+      if (this.scopes) {
+        for (i = 0, l = this.scopes.length; i < l; i++) {
+          this.scopes[i].stop(true);
+        }
+      }
+      if (!this.detached && this.parent && !fromParent) {
+        const last = this.parent.scopes.pop();
+        if (last && last !== this) {
+          this.parent.scopes[this.index] = last;
+          last.index = this.index;
+        }
+      }
+      this.parent = void 0;
+      this._active = false;
+    }
+  }
+}
+function effectScope(detached) {
+  return new EffectScope(detached);
+}
+function recordEffectScope(effect, scope = activeEffectScope) {
+  if (scope && scope.active) {
+    scope.effects.push(effect);
+  }
+}
+function getCurrentScope() {
+  return activeEffectScope;
+}
+function onScopeDispose(fn) {
+  if (activeEffectScope) {
+    activeEffectScope.cleanups.push(fn);
+  } else {
+    warn$1(`onScopeDispose() is called when there is no active effect scope to be associated with.`);
+  }
+}
+const createDep = (effects) => {
+  const dep = new Set(effects);
+  dep.w = 0;
+  dep.n = 0;
+  return dep;
+};
+const wasTracked = (dep) => (dep.w & trackOpBit) > 0;
+const newTracked = (dep) => (dep.n & trackOpBit) > 0;
+const initDepMarkers = ({ deps }) => {
+  if (deps.length) {
+    for (let i = 0; i < deps.length; i++) {
+      deps[i].w |= trackOpBit;
+    }
+  }
+};
+const finalizeDepMarkers = (effect) => {
+  const { deps } = effect;
+  if (deps.length) {
+    let ptr = 0;
+    for (let i = 0; i < deps.length; i++) {
+      const dep = deps[i];
+      if (wasTracked(dep) && !newTracked(dep)) {
+        dep.delete(effect);
+      } else {
+        deps[ptr++] = dep;
+      }
+      dep.w &= ~trackOpBit;
+      dep.n &= ~trackOpBit;
+    }
+    deps.length = ptr;
+  }
+};
+const targetMap = /* @__PURE__ */ new WeakMap();
+let effectTrackDepth = 0;
+let trackOpBit = 1;
+const maxMarkerBits = 30;
+let activeEffect;
+const ITERATE_KEY = Symbol("iterate");
+const MAP_KEY_ITERATE_KEY = Symbol("Map key iterate");
+class ReactiveEffect {
+  constructor(fn, scheduler = null, scope) {
+    this.fn = fn;
+    this.scheduler = scheduler;
+    this.active = true;
+    this.deps = [];
+    this.parent = void 0;
+    recordEffectScope(this, scope);
+  }
+  run() {
+    if (!this.active) {
+      return this.fn();
+    }
+    let parent = activeEffect;
+    let lastShouldTrack = shouldTrack;
+    while (parent) {
+      if (parent === this) {
+        return;
+      }
+      parent = parent.parent;
+    }
+    try {
+      this.parent = activeEffect;
+      activeEffect = this;
+      shouldTrack = true;
+      trackOpBit = 1 << ++effectTrackDepth;
+      if (effectTrackDepth <= maxMarkerBits) {
+        initDepMarkers(this);
+      } else {
+        cleanupEffect(this);
+      }
+      return this.fn();
+    } finally {
+      if (effectTrackDepth <= maxMarkerBits) {
+        finalizeDepMarkers(this);
+      }
+      trackOpBit = 1 << --effectTrackDepth;
+      activeEffect = this.parent;
+      shouldTrack = lastShouldTrack;
+      this.parent = void 0;
+      if (this.deferStop) {
+        this.stop();
+      }
+    }
+  }
+  stop() {
+    if (activeEffect === this) {
+      this.deferStop = true;
+    } else if (this.active) {
+      cleanupEffect(this);
+      if (this.onStop) {
+        this.onStop();
+      }
+      this.active = false;
+    }
+  }
+}
+function cleanupEffect(effect) {
+  const { deps } = effect;
+  if (deps.length) {
+    for (let i = 0; i < deps.length; i++) {
+      deps[i].delete(effect);
+    }
+    deps.length = 0;
+  }
+}
+let shouldTrack = true;
+const trackStack = [];
+function pauseTracking() {
+  trackStack.push(shouldTrack);
+  shouldTrack = false;
+}
+function resetTracking() {
+  const last = trackStack.pop();
+  shouldTrack = last === void 0 ? true : last;
+}
+function track(target, type, key) {
+  if (shouldTrack && activeEffect) {
+    let depsMap = targetMap.get(target);
+    if (!depsMap) {
+      targetMap.set(target, depsMap = /* @__PURE__ */ new Map());
+    }
+    let dep = depsMap.get(key);
+    if (!dep) {
+      depsMap.set(key, dep = createDep());
+    }
+    const eventInfo = { effect: activeEffect, target, type, key };
+    trackEffects(dep, eventInfo);
+  }
+}
+function trackEffects(dep, debuggerEventExtraInfo) {
+  let shouldTrack2 = false;
+  if (effectTrackDepth <= maxMarkerBits) {
+    if (!newTracked(dep)) {
+      dep.n |= trackOpBit;
+      shouldTrack2 = !wasTracked(dep);
+    }
+  } else {
+    shouldTrack2 = !dep.has(activeEffect);
+  }
+  if (shouldTrack2) {
+    dep.add(activeEffect);
+    activeEffect.deps.push(dep);
+    if (activeEffect.onTrack) {
+      activeEffect.onTrack(Object.assign({ effect: activeEffect }, debuggerEventExtraInfo));
+    }
+  }
+}
+function trigger(target, type, key, newValue, oldValue, oldTarget) {
+  const depsMap = targetMap.get(target);
+  if (!depsMap) {
+    return;
+  }
+  let deps = [];
+  if (type === "clear") {
+    deps = [...depsMap.values()];
+  } else if (key === "length" && isArray(target)) {
+    const newLength = Number(newValue);
+    depsMap.forEach((dep, key2) => {
+      if (key2 === "length" || key2 >= newLength) {
+        deps.push(dep);
+      }
+    });
+  } else {
+    if (key !== void 0) {
+      deps.push(depsMap.get(key));
+    }
+    switch (type) {
+      case "add":
+        if (!isArray(target)) {
+          deps.push(depsMap.get(ITERATE_KEY));
+          if (isMap(target)) {
+            deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));
+          }
+        } else if (isIntegerKey(key)) {
+          deps.push(depsMap.get("length"));
+        }
+        break;
+      case "delete":
+        if (!isArray(target)) {
+          deps.push(depsMap.get(ITERATE_KEY));
+          if (isMap(target)) {
+            deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));
+          }
+        }
+        break;
+      case "set":
+        if (isMap(target)) {
+          deps.push(depsMap.get(ITERATE_KEY));
+        }
+        break;
+    }
+  }
+  const eventInfo = { target, type, key, newValue, oldValue, oldTarget };
+  if (deps.length === 1) {
+    if (deps[0]) {
+      {
+        triggerEffects(deps[0], eventInfo);
+      }
+    }
+  } else {
+    const effects = [];
+    for (const dep of deps) {
+      if (dep) {
+        effects.push(...dep);
+      }
+    }
+    {
+      triggerEffects(createDep(effects), eventInfo);
+    }
+  }
+}
+function triggerEffects(dep, debuggerEventExtraInfo) {
+  const effects = isArray(dep) ? dep : [...dep];
+  for (const effect of effects) {
+    if (effect.computed) {
+      triggerEffect(effect, debuggerEventExtraInfo);
+    }
+  }
+  for (const effect of effects) {
+    if (!effect.computed) {
+      triggerEffect(effect, debuggerEventExtraInfo);
+    }
+  }
+}
+function triggerEffect(effect, debuggerEventExtraInfo) {
+  if (effect !== activeEffect || effect.allowRecurse) {
+    if (effect.onTrigger) {
+      effect.onTrigger(extend({ effect }, debuggerEventExtraInfo));
+    }
+    if (effect.scheduler) {
+      effect.scheduler();
+    } else {
+      effect.run();
+    }
+  }
+}
+function getDepFromReactive(object, key) {
+  var _a2;
+  return (_a2 = targetMap.get(object)) === null || _a2 === void 0 ? void 0 : _a2.get(key);
+}
+const isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`);
+const builtInSymbols = new Set(
+  /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((key) => key !== "arguments" && key !== "caller").map((key) => Symbol[key]).filter(isSymbol)
+);
+const get$1 = /* @__PURE__ */ createGetter();
+const shallowGet = /* @__PURE__ */ createGetter(false, true);
+const readonlyGet = /* @__PURE__ */ createGetter(true);
+const shallowReadonlyGet = /* @__PURE__ */ createGetter(true, true);
+const arrayInstrumentations = /* @__PURE__ */ createArrayInstrumentations();
+function createArrayInstrumentations() {
+  const instrumentations = {};
+  ["includes", "indexOf", "lastIndexOf"].forEach((key) => {
+    instrumentations[key] = function(...args) {
+      const arr = toRaw(this);
+      for (let i = 0, l = this.length; i < l; i++) {
+        track(arr, "get", i + "");
+      }
+      const res = arr[key](...args);
+      if (res === -1 || res === false) {
+        return arr[key](...args.map(toRaw));
+      } else {
+        return res;
+      }
+    };
+  });
+  ["push", "pop", "shift", "unshift", "splice"].forEach((key) => {
+    instrumentations[key] = function(...args) {
+      pauseTracking();
+      const res = toRaw(this)[key].apply(this, args);
+      resetTracking();
+      return res;
+    };
+  });
+  return instrumentations;
+}
+function hasOwnProperty(key) {
+  const obj = toRaw(this);
+  track(obj, "has", key);
+  return obj.hasOwnProperty(key);
+}
+function createGetter(isReadonly2 = false, shallow = false) {
+  return function get2(target, key, receiver) {
+    if (key === "__v_isReactive") {
+      return !isReadonly2;
+    } else if (key === "__v_isReadonly") {
+      return isReadonly2;
+    } else if (key === "__v_isShallow") {
+      return shallow;
+    } else if (key === "__v_raw" && receiver === (isReadonly2 ? shallow ? shallowReadonlyMap : readonlyMap : shallow ? shallowReactiveMap : reactiveMap).get(target)) {
+      return target;
+    }
+    const targetIsArray = isArray(target);
+    if (!isReadonly2) {
+      if (targetIsArray && hasOwn(arrayInstrumentations, key)) {
+        return Reflect.get(arrayInstrumentations, key, receiver);
+      }
+      if (key === "hasOwnProperty") {
+        return hasOwnProperty;
+      }
+    }
+    const res = Reflect.get(target, key, receiver);
+    if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {
+      return res;
+    }
+    if (!isReadonly2) {
+      track(target, "get", key);
+    }
+    if (shallow) {
+      return res;
+    }
+    if (isRef(res)) {
+      return targetIsArray && isIntegerKey(key) ? res : res.value;
+    }
+    if (isObject(res)) {
+      return isReadonly2 ? readonly(res) : reactive(res);
+    }
+    return res;
+  };
+}
+const set$1 = /* @__PURE__ */ createSetter();
+const shallowSet = /* @__PURE__ */ createSetter(true);
+function createSetter(shallow = false) {
+  return function set2(target, key, value, receiver) {
+    let oldValue = target[key];
+    if (isReadonly(oldValue) && isRef(oldValue) && !isRef(value)) {
+      return false;
+    }
+    if (!shallow) {
+      if (!isShallow(value) && !isReadonly(value)) {
+        oldValue = toRaw(oldValue);
+        value = toRaw(value);
+      }
+      if (!isArray(target) && isRef(oldValue) && !isRef(value)) {
+        oldValue.value = value;
+        return true;
+      }
+    }
+    const hadKey = isArray(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key);
+    const result = Reflect.set(target, key, value, receiver);
+    if (target === toRaw(receiver)) {
+      if (!hadKey) {
+        trigger(target, "add", key, value);
+      } else if (hasChanged(value, oldValue)) {
+        trigger(target, "set", key, value, oldValue);
+      }
+    }
+    return result;
+  };
+}
+function deleteProperty(target, key) {
+  const hadKey = hasOwn(target, key);
+  const oldValue = target[key];
+  const result = Reflect.deleteProperty(target, key);
+  if (result && hadKey) {
+    trigger(target, "delete", key, void 0, oldValue);
+  }
+  return result;
+}
+function has$1(target, key) {
+  const result = Reflect.has(target, key);
+  if (!isSymbol(key) || !builtInSymbols.has(key)) {
+    track(target, "has", key);
+  }
+  return result;
+}
+function ownKeys(target) {
+  track(target, "iterate", isArray(target) ? "length" : ITERATE_KEY);
+  return Reflect.ownKeys(target);
+}
+const mutableHandlers = {
+  get: get$1,
+  set: set$1,
+  deleteProperty,
+  has: has$1,
+  ownKeys
+};
+const readonlyHandlers = {
+  get: readonlyGet,
+  set(target, key) {
+    {
+      warn$1(`Set operation on key "${String(key)}" failed: target is readonly.`, target);
+    }
+    return true;
+  },
+  deleteProperty(target, key) {
+    {
+      warn$1(`Delete operation on key "${String(key)}" failed: target is readonly.`, target);
+    }
+    return true;
+  }
+};
+const shallowReactiveHandlers = /* @__PURE__ */ extend({}, mutableHandlers, {
+  get: shallowGet,
+  set: shallowSet
+});
+const shallowReadonlyHandlers = /* @__PURE__ */ extend({}, readonlyHandlers, {
+  get: shallowReadonlyGet
+});
+const toShallow = (value) => value;
+const getProto = (v) => Reflect.getPrototypeOf(v);
+function get(target, key, isReadonly2 = false, isShallow2 = false) {
+  target = target[
+    "__v_raw"
+    /* ReactiveFlags.RAW */
+  ];
+  const rawTarget = toRaw(target);
+  const rawKey = toRaw(key);
+  if (!isReadonly2) {
+    if (key !== rawKey) {
+      track(rawTarget, "get", key);
+    }
+    track(rawTarget, "get", rawKey);
+  }
+  const { has: has2 } = getProto(rawTarget);
+  const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive;
+  if (has2.call(rawTarget, key)) {
+    return wrap(target.get(key));
+  } else if (has2.call(rawTarget, rawKey)) {
+    return wrap(target.get(rawKey));
+  } else if (target !== rawTarget) {
+    target.get(key);
+  }
+}
+function has(key, isReadonly2 = false) {
+  const target = this[
+    "__v_raw"
+    /* ReactiveFlags.RAW */
+  ];
+  const rawTarget = toRaw(target);
+  const rawKey = toRaw(key);
+  if (!isReadonly2) {
+    if (key !== rawKey) {
+      track(rawTarget, "has", key);
+    }
+    track(rawTarget, "has", rawKey);
+  }
+  return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);
+}
+function size(target, isReadonly2 = false) {
+  target = target[
+    "__v_raw"
+    /* ReactiveFlags.RAW */
+  ];
+  !isReadonly2 && track(toRaw(target), "iterate", ITERATE_KEY);
+  return Reflect.get(target, "size", target);
+}
+function add(value) {
+  value = toRaw(value);
+  const target = toRaw(this);
+  const proto = getProto(target);
+  const hadKey = proto.has.call(target, value);
+  if (!hadKey) {
+    target.add(value);
+    trigger(target, "add", value, value);
+  }
+  return this;
+}
+function set$2(key, value) {
+  value = toRaw(value);
+  const target = toRaw(this);
+  const { has: has2, get: get2 } = getProto(target);
+  let hadKey = has2.call(target, key);
+  if (!hadKey) {
+    key = toRaw(key);
+    hadKey = has2.call(target, key);
+  } else {
+    checkIdentityKeys(target, has2, key);
+  }
+  const oldValue = get2.call(target, key);
+  target.set(key, value);
+  if (!hadKey) {
+    trigger(target, "add", key, value);
+  } else if (hasChanged(value, oldValue)) {
+    trigger(target, "set", key, value, oldValue);
+  }
+  return this;
+}
+function deleteEntry(key) {
+  const target = toRaw(this);
+  const { has: has2, get: get2 } = getProto(target);
+  let hadKey = has2.call(target, key);
+  if (!hadKey) {
+    key = toRaw(key);
+    hadKey = has2.call(target, key);
+  } else {
+    checkIdentityKeys(target, has2, key);
+  }
+  const oldValue = get2 ? get2.call(target, key) : void 0;
+  const result = target.delete(key);
+  if (hadKey) {
+    trigger(target, "delete", key, void 0, oldValue);
+  }
+  return result;
+}
+function clear() {
+  const target = toRaw(this);
+  const hadItems = target.size !== 0;
+  const oldTarget = isMap(target) ? new Map(target) : new Set(target);
+  const result = target.clear();
+  if (hadItems) {
+    trigger(target, "clear", void 0, void 0, oldTarget);
+  }
+  return result;
+}
+function createForEach(isReadonly2, isShallow2) {
+  return function forEach(callback, thisArg) {
+    const observed = this;
+    const target = observed[
+      "__v_raw"
+      /* ReactiveFlags.RAW */
+    ];
+    const rawTarget = toRaw(target);
+    const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive;
+    !isReadonly2 && track(rawTarget, "iterate", ITERATE_KEY);
+    return target.forEach((value, key) => {
+      return callback.call(thisArg, wrap(value), wrap(key), observed);
+    });
+  };
+}
+function createIterableMethod(method, isReadonly2, isShallow2) {
+  return function(...args) {
+    const target = this[
+      "__v_raw"
+      /* ReactiveFlags.RAW */
+    ];
+    const rawTarget = toRaw(target);
+    const targetIsMap = isMap(rawTarget);
+    const isPair = method === "entries" || method === Symbol.iterator && targetIsMap;
+    const isKeyOnly = method === "keys" && targetIsMap;
+    const innerIterator = target[method](...args);
+    const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive;
+    !isReadonly2 && track(rawTarget, "iterate", isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY);
+    return {
+      // iterator protocol
+      next() {
+        const { value, done } = innerIterator.next();
+        return done ? { value, done } : {
+          value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),
+          done
+        };
+      },
+      // iterable protocol
+      [Symbol.iterator]() {
+        return this;
+      }
+    };
+  };
+}
+function createReadonlyMethod(type) {
+  return function(...args) {
+    {
+      const key = args[0] ? `on key "${args[0]}" ` : ``;
+      console.warn(`${capitalize(type)} operation ${key}failed: target is readonly.`, toRaw(this));
+    }
+    return type === "delete" ? false : this;
+  };
+}
+function createInstrumentations() {
+  const mutableInstrumentations2 = {
+    get(key) {
+      return get(this, key);
+    },
+    get size() {
+      return size(this);
+    },
+    has,
+    add,
+    set: set$2,
+    delete: deleteEntry,
+    clear,
+    forEach: createForEach(false, false)
+  };
+  const shallowInstrumentations2 = {
+    get(key) {
+      return get(this, key, false, true);
+    },
+    get size() {
+      return size(this);
+    },
+    has,
+    add,
+    set: set$2,
+    delete: deleteEntry,
+    clear,
+    forEach: createForEach(false, true)
+  };
+  const readonlyInstrumentations2 = {
+    get(key) {
+      return get(this, key, true);
+    },
+    get size() {
+      return size(this, true);
+    },
+    has(key) {
+      return has.call(this, key, true);
+    },
+    add: createReadonlyMethod(
+      "add"
+      /* TriggerOpTypes.ADD */
+    ),
+    set: createReadonlyMethod(
+      "set"
+      /* TriggerOpTypes.SET */
+    ),
+    delete: createReadonlyMethod(
+      "delete"
+      /* TriggerOpTypes.DELETE */
+    ),
+    clear: createReadonlyMethod(
+      "clear"
+      /* TriggerOpTypes.CLEAR */
+    ),
+    forEach: createForEach(true, false)
+  };
+  const shallowReadonlyInstrumentations2 = {
+    get(key) {
+      return get(this, key, true, true);
+    },
+    get size() {
+      return size(this, true);
+    },
+    has(key) {
+      return has.call(this, key, true);
+    },
+    add: createReadonlyMethod(
+      "add"
+      /* TriggerOpTypes.ADD */
+    ),
+    set: createReadonlyMethod(
+      "set"
+      /* TriggerOpTypes.SET */
+    ),
+    delete: createReadonlyMethod(
+      "delete"
+      /* TriggerOpTypes.DELETE */
+    ),
+    clear: createReadonlyMethod(
+      "clear"
+      /* TriggerOpTypes.CLEAR */
+    ),
+    forEach: createForEach(true, true)
+  };
+  const iteratorMethods = ["keys", "values", "entries", Symbol.iterator];
+  iteratorMethods.forEach((method) => {
+    mutableInstrumentations2[method] = createIterableMethod(method, false, false);
+    readonlyInstrumentations2[method] = createIterableMethod(method, true, false);
+    shallowInstrumentations2[method] = createIterableMethod(method, false, true);
+    shallowReadonlyInstrumentations2[method] = createIterableMethod(method, true, true);
+  });
+  return [
+    mutableInstrumentations2,
+    readonlyInstrumentations2,
+    shallowInstrumentations2,
+    shallowReadonlyInstrumentations2
+  ];
+}
+const [mutableInstrumentations, readonlyInstrumentations, shallowInstrumentations, shallowReadonlyInstrumentations] = /* @__PURE__ */ createInstrumentations();
+function createInstrumentationGetter(isReadonly2, shallow) {
+  const instrumentations = shallow ? isReadonly2 ? shallowReadonlyInstrumentations : shallowInstrumentations : isReadonly2 ? readonlyInstrumentations : mutableInstrumentations;
+  return (target, key, receiver) => {
+    if (key === "__v_isReactive") {
+      return !isReadonly2;
+    } else if (key === "__v_isReadonly") {
+      return isReadonly2;
+    } else if (key === "__v_raw") {
+      return target;
+    }
+    return Reflect.get(hasOwn(instrumentations, key) && key in target ? instrumentations : target, key, receiver);
+  };
+}
+const mutableCollectionHandlers = {
+  get: /* @__PURE__ */ createInstrumentationGetter(false, false)
+};
+const shallowCollectionHandlers = {
+  get: /* @__PURE__ */ createInstrumentationGetter(false, true)
+};
+const readonlyCollectionHandlers = {
+  get: /* @__PURE__ */ createInstrumentationGetter(true, false)
+};
+const shallowReadonlyCollectionHandlers = {
+  get: /* @__PURE__ */ createInstrumentationGetter(true, true)
+};
+function checkIdentityKeys(target, has2, key) {
+  const rawKey = toRaw(key);
+  if (rawKey !== key && has2.call(target, rawKey)) {
+    const type = toRawType(target);
+    console.warn(`Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`);
+  }
+}
+const reactiveMap = /* @__PURE__ */ new WeakMap();
+const shallowReactiveMap = /* @__PURE__ */ new WeakMap();
+const readonlyMap = /* @__PURE__ */ new WeakMap();
+const shallowReadonlyMap = /* @__PURE__ */ new WeakMap();
+function targetTypeMap(rawType) {
+  switch (rawType) {
+    case "Object":
+    case "Array":
+      return 1;
+    case "Map":
+    case "Set":
+    case "WeakMap":
+    case "WeakSet":
+      return 2;
+    default:
+      return 0;
+  }
+}
+function getTargetType(value) {
+  return value[
+    "__v_skip"
+    /* ReactiveFlags.SKIP */
+  ] || !Object.isExtensible(value) ? 0 : targetTypeMap(toRawType(value));
+}
+function reactive(target) {
+  if (isReadonly(target)) {
+    return target;
+  }
+  return createReactiveObject(target, false, mutableHandlers, mutableCollectionHandlers, reactiveMap);
+}
+function shallowReactive(target) {
+  return createReactiveObject(target, false, shallowReactiveHandlers, shallowCollectionHandlers, shallowReactiveMap);
+}
+function readonly(target) {
+  return createReactiveObject(target, true, readonlyHandlers, readonlyCollectionHandlers, readonlyMap);
+}
+function shallowReadonly(target) {
+  return createReactiveObject(target, true, shallowReadonlyHandlers, shallowReadonlyCollectionHandlers, shallowReadonlyMap);
+}
+function createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) {
+  if (!isObject(target)) {
+    {
+      console.warn(`value cannot be made reactive: ${String(target)}`);
+    }
+    return target;
+  }
+  if (target[
+    "__v_raw"
+    /* ReactiveFlags.RAW */
+  ] && !(isReadonly2 && target[
+    "__v_isReactive"
+    /* ReactiveFlags.IS_REACTIVE */
+  ])) {
+    return target;
+  }
+  const existingProxy = proxyMap.get(target);
+  if (existingProxy) {
+    return existingProxy;
+  }
+  const targetType = getTargetType(target);
+  if (targetType === 0) {
+    return target;
+  }
+  const proxy = new Proxy(target, targetType === 2 ? collectionHandlers : baseHandlers);
+  proxyMap.set(target, proxy);
+  return proxy;
+}
+function isReactive(value) {
+  if (isReadonly(value)) {
+    return isReactive(value[
+      "__v_raw"
+      /* ReactiveFlags.RAW */
+    ]);
+  }
+  return !!(value && value[
+    "__v_isReactive"
+    /* ReactiveFlags.IS_REACTIVE */
+  ]);
+}
+function isReadonly(value) {
+  return !!(value && value[
+    "__v_isReadonly"
+    /* ReactiveFlags.IS_READONLY */
+  ]);
+}
+function isShallow(value) {
+  return !!(value && value[
+    "__v_isShallow"
+    /* ReactiveFlags.IS_SHALLOW */
+  ]);
+}
+function isProxy(value) {
+  return isReactive(value) || isReadonly(value);
+}
+function toRaw(observed) {
+  const raw = observed && observed[
+    "__v_raw"
+    /* ReactiveFlags.RAW */
+  ];
+  return raw ? toRaw(raw) : observed;
+}
+function markRaw(value) {
+  def(value, "__v_skip", true);
+  return value;
+}
+const toReactive = (value) => isObject(value) ? reactive(value) : value;
+const toReadonly = (value) => isObject(value) ? readonly(value) : value;
+function trackRefValue(ref2) {
+  if (shouldTrack && activeEffect) {
+    ref2 = toRaw(ref2);
+    {
+      trackEffects(ref2.dep || (ref2.dep = createDep()), {
+        target: ref2,
+        type: "get",
+        key: "value"
+      });
+    }
+  }
+}
+function triggerRefValue(ref2, newVal) {
+  ref2 = toRaw(ref2);
+  const dep = ref2.dep;
+  if (dep) {
+    {
+      triggerEffects(dep, {
+        target: ref2,
+        type: "set",
+        key: "value",
+        newValue: newVal
+      });
+    }
+  }
+}
+function isRef(r) {
+  return !!(r && r.__v_isRef === true);
+}
+function ref(value) {
+  return createRef(value, false);
+}
+function createRef(rawValue, shallow) {
+  if (isRef(rawValue)) {
+    return rawValue;
+  }
+  return new RefImpl(rawValue, shallow);
+}
+class RefImpl {
+  constructor(value, __v_isShallow) {
+    this.__v_isShallow = __v_isShallow;
+    this.dep = void 0;
+    this.__v_isRef = true;
+    this._rawValue = __v_isShallow ? value : toRaw(value);
+    this._value = __v_isShallow ? value : toReactive(value);
+  }
+  get value() {
+    trackRefValue(this);
+    return this._value;
+  }
+  set value(newVal) {
+    const useDirectValue = this.__v_isShallow || isShallow(newVal) || isReadonly(newVal);
+    newVal = useDirectValue ? newVal : toRaw(newVal);
+    if (hasChanged(newVal, this._rawValue)) {
+      this._rawValue = newVal;
+      this._value = useDirectValue ? newVal : toReactive(newVal);
+      triggerRefValue(this, newVal);
+    }
+  }
+}
+function unref(ref2) {
+  return isRef(ref2) ? ref2.value : ref2;
+}
+const shallowUnwrapHandlers = {
+  get: (target, key, receiver) => unref(Reflect.get(target, key, receiver)),
+  set: (target, key, value, receiver) => {
+    const oldValue = target[key];
+    if (isRef(oldValue) && !isRef(value)) {
+      oldValue.value = value;
+      return true;
+    } else {
+      return Reflect.set(target, key, value, receiver);
+    }
+  }
+};
+function proxyRefs(objectWithRefs) {
+  return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers);
+}
+function toRefs(object) {
+  if (!isProxy(object)) {
+    console.warn(`toRefs() expects a reactive object but received a plain one.`);
+  }
+  const ret = isArray(object) ? new Array(object.length) : {};
+  for (const key in object) {
+    ret[key] = toRef(object, key);
+  }
+  return ret;
+}
+class ObjectRefImpl {
+  constructor(_object, _key, _defaultValue) {
+    this._object = _object;
+    this._key = _key;
+    this._defaultValue = _defaultValue;
+    this.__v_isRef = true;
+  }
+  get value() {
+    const val = this._object[this._key];
+    return val === void 0 ? this._defaultValue : val;
+  }
+  set value(newVal) {
+    this._object[this._key] = newVal;
+  }
+  get dep() {
+    return getDepFromReactive(toRaw(this._object), this._key);
+  }
+}
+function toRef(object, key, defaultValue) {
+  const val = object[key];
+  return isRef(val) ? val : new ObjectRefImpl(object, key, defaultValue);
+}
+var _a;
+class ComputedRefImpl {
+  constructor(getter, _setter, isReadonly2, isSSR) {
+    this._setter = _setter;
+    this.dep = void 0;
+    this.__v_isRef = true;
+    this[_a] = false;
+    this._dirty = true;
+    this.effect = new ReactiveEffect(getter, () => {
+      if (!this._dirty) {
+        this._dirty = true;
+        triggerRefValue(this);
+      }
+    });
+    this.effect.computed = this;
+    this.effect.active = this._cacheable = !isSSR;
+    this[
+      "__v_isReadonly"
+      /* ReactiveFlags.IS_READONLY */
+    ] = isReadonly2;
+  }
+  get value() {
+    const self = toRaw(this);
+    trackRefValue(self);
+    if (self._dirty || !self._cacheable) {
+      self._dirty = false;
+      self._value = self.effect.run();
+    }
+    return self._value;
+  }
+  set value(newValue) {
+    this._setter(newValue);
+  }
+}
+_a = "__v_isReadonly";
+function computed$1(getterOrOptions, debugOptions, isSSR = false) {
+  let getter;
+  let setter;
+  const onlyGetter = isFunction(getterOrOptions);
+  if (onlyGetter) {
+    getter = getterOrOptions;
+    setter = () => {
+      console.warn("Write operation failed: computed value is readonly");
+    };
+  } else {
+    getter = getterOrOptions.get;
+    setter = getterOrOptions.set;
+  }
+  const cRef = new ComputedRefImpl(getter, setter, onlyGetter || !setter, isSSR);
+  if (debugOptions && !isSSR) {
+    cRef.effect.onTrack = debugOptions.onTrack;
+    cRef.effect.onTrigger = debugOptions.onTrigger;
+  }
+  return cRef;
+}
+const stack = [];
+function pushWarningContext(vnode) {
+  stack.push(vnode);
+}
+function popWarningContext() {
+  stack.pop();
+}
+function warn(msg, ...args) {
+  pauseTracking();
+  const instance = stack.length ? stack[stack.length - 1].component : null;
+  const appWarnHandler = instance && instance.appContext.config.warnHandler;
+  const trace = getComponentTrace();
+  if (appWarnHandler) {
+    callWithErrorHandling(appWarnHandler, instance, 11, [
+      msg + args.join(""),
+      instance && instance.proxy,
+      trace.map(({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>`).join("\n"),
+      trace
+    ]);
+  } else {
+    const warnArgs = [`[Vue warn]: ${msg}`, ...args];
+    if (trace.length && // avoid spamming console during tests
+    true) {
+      warnArgs.push(`
+`, ...formatTrace(trace));
+    }
+    console.warn(...warnArgs);
+  }
+  resetTracking();
+}
+function getComponentTrace() {
+  let currentVNode = stack[stack.length - 1];
+  if (!currentVNode) {
+    return [];
+  }
+  const normalizedStack = [];
+  while (currentVNode) {
+    const last = normalizedStack[0];
+    if (last && last.vnode === currentVNode) {
+      last.recurseCount++;
+    } else {
+      normalizedStack.push({
+        vnode: currentVNode,
+        recurseCount: 0
+      });
+    }
+    const parentInstance = currentVNode.component && currentVNode.component.parent;
+    currentVNode = parentInstance && parentInstance.vnode;
+  }
+  return normalizedStack;
+}
+function formatTrace(trace) {
+  const logs = [];
+  trace.forEach((entry, i) => {
+    logs.push(...i === 0 ? [] : [`
+`], ...formatTraceEntry(entry));
+  });
+  return logs;
+}
+function formatTraceEntry({ vnode, recurseCount }) {
+  const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``;
+  const isRoot = vnode.component ? vnode.component.parent == null : false;
+  const open = ` at <${formatComponentName(vnode.component, vnode.type, isRoot)}`;
+  const close = `>` + postfix;
+  return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close];
+}
+function formatProps(props) {
+  const res = [];
+  const keys = Object.keys(props);
+  keys.slice(0, 3).forEach((key) => {
+    res.push(...formatProp(key, props[key]));
+  });
+  if (keys.length > 3) {
+    res.push(` ...`);
+  }
+  return res;
+}
+function formatProp(key, value, raw) {
+  if (isString(value)) {
+    value = JSON.stringify(value);
+    return raw ? value : [`${key}=${value}`];
+  } else if (typeof value === "number" || typeof value === "boolean" || value == null) {
+    return raw ? value : [`${key}=${value}`];
+  } else if (isRef(value)) {
+    value = formatProp(key, toRaw(value.value), true);
+    return raw ? value : [`${key}=Ref<`, value, `>`];
+  } else if (isFunction(value)) {
+    return [`${key}=fn${value.name ? `<${value.name}>` : ``}`];
+  } else {
+    value = toRaw(value);
+    return raw ? value : [`${key}=`, value];
+  }
+}
+const ErrorTypeStrings = {
+  [
+    "sp"
+    /* LifecycleHooks.SERVER_PREFETCH */
+  ]: "serverPrefetch hook",
+  [
+    "bc"
+    /* LifecycleHooks.BEFORE_CREATE */
+  ]: "beforeCreate hook",
+  [
+    "c"
+    /* LifecycleHooks.CREATED */
+  ]: "created hook",
+  [
+    "bm"
+    /* LifecycleHooks.BEFORE_MOUNT */
+  ]: "beforeMount hook",
+  [
+    "m"
+    /* LifecycleHooks.MOUNTED */
+  ]: "mounted hook",
+  [
+    "bu"
+    /* LifecycleHooks.BEFORE_UPDATE */
+  ]: "beforeUpdate hook",
+  [
+    "u"
+    /* LifecycleHooks.UPDATED */
+  ]: "updated",
+  [
+    "bum"
+    /* LifecycleHooks.BEFORE_UNMOUNT */
+  ]: "beforeUnmount hook",
+  [
+    "um"
+    /* LifecycleHooks.UNMOUNTED */
+  ]: "unmounted hook",
+  [
+    "a"
+    /* LifecycleHooks.ACTIVATED */
+  ]: "activated hook",
+  [
+    "da"
+    /* LifecycleHooks.DEACTIVATED */
+  ]: "deactivated hook",
+  [
+    "ec"
+    /* LifecycleHooks.ERROR_CAPTURED */
+  ]: "errorCaptured hook",
+  [
+    "rtc"
+    /* LifecycleHooks.RENDER_TRACKED */
+  ]: "renderTracked hook",
+  [
+    "rtg"
+    /* LifecycleHooks.RENDER_TRIGGERED */
+  ]: "renderTriggered hook",
+  [
+    0
+    /* ErrorCodes.SETUP_FUNCTION */
+  ]: "setup function",
+  [
+    1
+    /* ErrorCodes.RENDER_FUNCTION */
+  ]: "render function",
+  [
+    2
+    /* ErrorCodes.WATCH_GETTER */
+  ]: "watcher getter",
+  [
+    3
+    /* ErrorCodes.WATCH_CALLBACK */
+  ]: "watcher callback",
+  [
+    4
+    /* ErrorCodes.WATCH_CLEANUP */
+  ]: "watcher cleanup function",
+  [
+    5
+    /* ErrorCodes.NATIVE_EVENT_HANDLER */
+  ]: "native event handler",
+  [
+    6
+    /* ErrorCodes.COMPONENT_EVENT_HANDLER */
+  ]: "component event handler",
+  [
+    7
+    /* ErrorCodes.VNODE_HOOK */
+  ]: "vnode hook",
+  [
+    8
+    /* ErrorCodes.DIRECTIVE_HOOK */
+  ]: "directive hook",
+  [
+    9
+    /* ErrorCodes.TRANSITION_HOOK */
+  ]: "transition hook",
+  [
+    10
+    /* ErrorCodes.APP_ERROR_HANDLER */
+  ]: "app errorHandler",
+  [
+    11
+    /* ErrorCodes.APP_WARN_HANDLER */
+  ]: "app warnHandler",
+  [
+    12
+    /* ErrorCodes.FUNCTION_REF */
+  ]: "ref function",
+  [
+    13
+    /* ErrorCodes.ASYNC_COMPONENT_LOADER */
+  ]: "async component loader",
+  [
+    14
+    /* ErrorCodes.SCHEDULER */
+  ]: "scheduler flush. This is likely a Vue internals bug. Please open an issue at https://new-issue.vuejs.org/?repo=vuejs/core"
+};
+function callWithErrorHandling(fn, instance, type, args) {
+  let res;
+  try {
+    res = args ? fn(...args) : fn();
+  } catch (err) {
+    handleError(err, instance, type);
+  }
+  return res;
+}
+function callWithAsyncErrorHandling(fn, instance, type, args) {
+  if (isFunction(fn)) {
+    const res = callWithErrorHandling(fn, instance, type, args);
+    if (res && isPromise(res)) {
+      res.catch((err) => {
+        handleError(err, instance, type);
+      });
+    }
+    return res;
+  }
+  const values = [];
+  for (let i = 0; i < fn.length; i++) {
+    values.push(callWithAsyncErrorHandling(fn[i], instance, type, args));
+  }
+  return values;
+}
+function handleError(err, instance, type, throwInDev = true) {
+  const contextVNode = instance ? instance.vnode : null;
+  if (instance) {
+    let cur = instance.parent;
+    const exposedInstance = instance.proxy;
+    const errorInfo = ErrorTypeStrings[type] || type;
+    while (cur) {
+      const errorCapturedHooks = cur.ec;
+      if (errorCapturedHooks) {
+        for (let i = 0; i < errorCapturedHooks.length; i++) {
+          if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) {
+            return;
+          }
+        }
+      }
+      cur = cur.parent;
+    }
+    const appErrorHandler = instance.appContext.config.errorHandler;
+    if (appErrorHandler) {
+      callWithErrorHandling(appErrorHandler, null, 10, [err, exposedInstance, errorInfo]);
+      return;
+    }
+  }
+  logError(err, type, contextVNode, throwInDev);
+}
+function logError(err, type, contextVNode, throwInDev = true) {
+  {
+    const info = ErrorTypeStrings[type] || type;
+    if (contextVNode) {
+      pushWarningContext(contextVNode);
+    }
+    warn(`Unhandled error${info ? ` during execution of ${info}` : ``}`);
+    if (contextVNode) {
+      popWarningContext();
+    }
+    if (throwInDev) {
+      console.error(err);
+    } else {
+      console.error(err);
+    }
+  }
+}
+let isFlushing = false;
+let isFlushPending = false;
+const queue = [];
+let flushIndex = 0;
+const pendingPostFlushCbs = [];
+let activePostFlushCbs = null;
+let postFlushIndex = 0;
+const resolvedPromise = /* @__PURE__ */ Promise.resolve();
+let currentFlushPromise = null;
+const RECURSION_LIMIT = 100;
+function nextTick$1(fn) {
+  const p2 = currentFlushPromise || resolvedPromise;
+  return fn ? p2.then(this ? fn.bind(this) : fn) : p2;
+}
+function findInsertionIndex(id) {
+  let start = flushIndex + 1;
+  let end = queue.length;
+  while (start < end) {
+    const middle = start + end >>> 1;
+    const middleJobId = getId(queue[middle]);
+    middleJobId < id ? start = middle + 1 : end = middle;
+  }
+  return start;
+}
+function queueJob(job) {
+  if (!queue.length || !queue.includes(job, isFlushing && job.allowRecurse ? flushIndex + 1 : flushIndex)) {
+    if (job.id == null) {
+      queue.push(job);
+    } else {
+      queue.splice(findInsertionIndex(job.id), 0, job);
+    }
+    queueFlush();
+  }
+}
+function queueFlush() {
+  if (!isFlushing && !isFlushPending) {
+    isFlushPending = true;
+    currentFlushPromise = resolvedPromise.then(flushJobs);
+  }
+}
+function hasQueueJob(job) {
+  return queue.indexOf(job) > -1;
+}
+function invalidateJob(job) {
+  const i = queue.indexOf(job);
+  if (i > flushIndex) {
+    queue.splice(i, 1);
+  }
+}
+function queuePostFlushCb(cb) {
+  if (!isArray(cb)) {
+    if (!activePostFlushCbs || !activePostFlushCbs.includes(cb, cb.allowRecurse ? postFlushIndex + 1 : postFlushIndex)) {
+      pendingPostFlushCbs.push(cb);
+    }
+  } else {
+    pendingPostFlushCbs.push(...cb);
+  }
+  queueFlush();
+}
+function flushPreFlushCbs(seen, i = isFlushing ? flushIndex + 1 : 0) {
+  {
+    seen = seen || /* @__PURE__ */ new Map();
+  }
+  for (; i < queue.length; i++) {
+    const cb = queue[i];
+    if (cb && cb.pre) {
+      if (checkRecursiveUpdates(seen, cb)) {
+        continue;
+      }
+      queue.splice(i, 1);
+      i--;
+      cb();
+    }
+  }
+}
+function flushPostFlushCbs(seen) {
+  if (pendingPostFlushCbs.length) {
+    const deduped = [...new Set(pendingPostFlushCbs)];
+    pendingPostFlushCbs.length = 0;
+    if (activePostFlushCbs) {
+      activePostFlushCbs.push(...deduped);
+      return;
+    }
+    activePostFlushCbs = deduped;
+    {
+      seen = seen || /* @__PURE__ */ new Map();
+    }
+    activePostFlushCbs.sort((a, b) => getId(a) - getId(b));
+    for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) {
+      if (checkRecursiveUpdates(seen, activePostFlushCbs[postFlushIndex])) {
+        continue;
+      }
+      activePostFlushCbs[postFlushIndex]();
+    }
+    activePostFlushCbs = null;
+    postFlushIndex = 0;
+  }
+}
+const getId = (job) => job.id == null ? Infinity : job.id;
+const comparator = (a, b) => {
+  const diff2 = getId(a) - getId(b);
+  if (diff2 === 0) {
+    if (a.pre && !b.pre)
+      return -1;
+    if (b.pre && !a.pre)
+      return 1;
+  }
+  return diff2;
+};
+function flushJobs(seen) {
+  isFlushPending = false;
+  isFlushing = true;
+  {
+    seen = seen || /* @__PURE__ */ new Map();
+  }
+  queue.sort(comparator);
+  const check = (job) => checkRecursiveUpdates(seen, job);
+  try {
+    for (flushIndex = 0; flushIndex < queue.length; flushIndex++) {
+      const job = queue[flushIndex];
+      if (job && job.active !== false) {
+        if (check(job)) {
+          continue;
+        }
+        callWithErrorHandling(
+          job,
+          null,
+          14
+          /* ErrorCodes.SCHEDULER */
+        );
+      }
+    }
+  } finally {
+    flushIndex = 0;
+    queue.length = 0;
+    flushPostFlushCbs(seen);
+    isFlushing = false;
+    currentFlushPromise = null;
+    if (queue.length || pendingPostFlushCbs.length) {
+      flushJobs(seen);
+    }
+  }
+}
+function checkRecursiveUpdates(seen, fn) {
+  if (!seen.has(fn)) {
+    seen.set(fn, 1);
+  } else {
+    const count = seen.get(fn);
+    if (count > RECURSION_LIMIT) {
+      const instance = fn.ownerInstance;
+      const componentName = instance && getComponentName(instance.type);
+      warn(`Maximum recursive updates exceeded${componentName ? ` in component <${componentName}>` : ``}. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.`);
+      return true;
+    } else {
+      seen.set(fn, count + 1);
+    }
+  }
+}
+let devtools;
+let buffer = [];
+let devtoolsNotInstalled = false;
+function emit$1(event, ...args) {
+  if (devtools) {
+    devtools.emit(event, ...args);
+  } else if (!devtoolsNotInstalled) {
+    buffer.push({ event, args });
+  }
+}
+function setDevtoolsHook(hook, target) {
+  var _a2, _b;
+  devtools = hook;
+  if (devtools) {
+    devtools.enabled = true;
+    buffer.forEach(({ event, args }) => devtools.emit(event, ...args));
+    buffer = [];
+  } else if (
+    // handle late devtools injection - only do this if we are in an actual
+    // browser environment to avoid the timer handle stalling test runner exit
+    // (#4815)
+    typeof window !== "undefined" && // some envs mock window but not fully
+    // eslint-disable-next-line no-restricted-globals
+    window.HTMLElement && // also exclude jsdom
+    // eslint-disable-next-line no-restricted-globals
+    !((_b = (_a2 = window.navigator) === null || _a2 === void 0 ? void 0 : _a2.userAgent) === null || _b === void 0 ? void 0 : _b.includes("jsdom"))
+  ) {
+    const replay = target.__VUE_DEVTOOLS_HOOK_REPLAY__ = target.__VUE_DEVTOOLS_HOOK_REPLAY__ || [];
+    replay.push((newHook) => {
+      setDevtoolsHook(newHook, target);
+    });
+    setTimeout(() => {
+      if (!devtools) {
+        target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null;
+        devtoolsNotInstalled = true;
+        buffer = [];
+      }
+    }, 3e3);
+  } else {
+    devtoolsNotInstalled = true;
+    buffer = [];
+  }
+}
+function devtoolsInitApp(app, version2) {
+  emit$1("app:init", app, version2, {
+    Fragment,
+    Text,
+    Comment,
+    Static
+  });
+}
+const devtoolsComponentAdded = /* @__PURE__ */ createDevtoolsComponentHook(
+  "component:added"
+  /* DevtoolsHooks.COMPONENT_ADDED */
+);
+const devtoolsComponentUpdated = /* @__PURE__ */ createDevtoolsComponentHook(
+  "component:updated"
+  /* DevtoolsHooks.COMPONENT_UPDATED */
+);
+const _devtoolsComponentRemoved = /* @__PURE__ */ createDevtoolsComponentHook(
+  "component:removed"
+  /* DevtoolsHooks.COMPONENT_REMOVED */
+);
+const devtoolsComponentRemoved = (component) => {
+  if (devtools && typeof devtools.cleanupBuffer === "function" && // remove the component if it wasn't buffered
+  !devtools.cleanupBuffer(component)) {
+    _devtoolsComponentRemoved(component);
+  }
+};
+function createDevtoolsComponentHook(hook) {
+  return (component) => {
+    emit$1(
+      hook,
+      component.appContext.app,
+      component.uid,
+      // fixed by xxxxxx
+      // 为 0 是 App,无 parent 是 Page 指向 App
+      component.uid === 0 ? void 0 : component.parent ? component.parent.uid : 0,
+      component
+    );
+  };
+}
+const devtoolsPerfStart = /* @__PURE__ */ createDevtoolsPerformanceHook(
+  "perf:start"
+  /* DevtoolsHooks.PERFORMANCE_START */
+);
+const devtoolsPerfEnd = /* @__PURE__ */ createDevtoolsPerformanceHook(
+  "perf:end"
+  /* DevtoolsHooks.PERFORMANCE_END */
+);
+function createDevtoolsPerformanceHook(hook) {
+  return (component, type, time) => {
+    emit$1(hook, component.appContext.app, component.uid, component, type, time);
+  };
+}
+function devtoolsComponentEmit(component, event, params) {
+  emit$1("component:emit", component.appContext.app, component, event, params);
+}
+function emit(instance, event, ...rawArgs) {
+  if (instance.isUnmounted)
+    return;
+  const props = instance.vnode.props || EMPTY_OBJ;
+  {
+    const { emitsOptions, propsOptions: [propsOptions] } = instance;
+    if (emitsOptions) {
+      if (!(event in emitsOptions) && true) {
+        if (!propsOptions || !(toHandlerKey(event) in propsOptions)) {
+          warn(`Component emitted event "${event}" but it is neither declared in the emits option nor as an "${toHandlerKey(event)}" prop.`);
+        }
+      } else {
+        const validator = emitsOptions[event];
+        if (isFunction(validator)) {
+          const isValid = validator(...rawArgs);
+          if (!isValid) {
+            warn(`Invalid event arguments: event validation failed for event "${event}".`);
+          }
+        }
+      }
+    }
+  }
+  let args = rawArgs;
+  const isModelListener2 = event.startsWith("update:");
+  const modelArg = isModelListener2 && event.slice(7);
+  if (modelArg && modelArg in props) {
+    const modifiersKey = `${modelArg === "modelValue" ? "model" : modelArg}Modifiers`;
+    const { number, trim } = props[modifiersKey] || EMPTY_OBJ;
+    if (trim) {
+      args = rawArgs.map((a) => isString(a) ? a.trim() : a);
+    }
+    if (number) {
+      args = rawArgs.map(looseToNumber);
+    }
+  }
+  {
+    devtoolsComponentEmit(instance, event, args);
+  }
+  {
+    const lowerCaseEvent = event.toLowerCase();
+    if (lowerCaseEvent !== event && props[toHandlerKey(lowerCaseEvent)]) {
+      warn(`Event "${lowerCaseEvent}" is emitted in component ${formatComponentName(instance, instance.type)} but the handler is registered for "${event}". Note that HTML attributes are case-insensitive and you cannot use v-on to listen to camelCase events when using in-DOM templates. You should probably use "${hyphenate(event)}" instead of "${event}".`);
+    }
+  }
+  let handlerName;
+  let handler = props[handlerName = toHandlerKey(event)] || // also try camelCase event handler (#2249)
+  props[handlerName = toHandlerKey(camelize(event))];
+  if (!handler && isModelListener2) {
+    handler = props[handlerName = toHandlerKey(hyphenate(event))];
+  }
+  if (handler) {
+    callWithAsyncErrorHandling(handler, instance, 6, args);
+  }
+  const onceHandler = props[handlerName + `Once`];
+  if (onceHandler) {
+    if (!instance.emitted) {
+      instance.emitted = {};
+    } else if (instance.emitted[handlerName]) {
+      return;
+    }
+    instance.emitted[handlerName] = true;
+    callWithAsyncErrorHandling(onceHandler, instance, 6, args);
+  }
+}
+function normalizeEmitsOptions(comp, appContext, asMixin = false) {
+  const cache = appContext.emitsCache;
+  const cached = cache.get(comp);
+  if (cached !== void 0) {
+    return cached;
+  }
+  const raw = comp.emits;
+  let normalized = {};
+  let hasExtends = false;
+  if (!isFunction(comp)) {
+    const extendEmits = (raw2) => {
+      const normalizedFromExtend = normalizeEmitsOptions(raw2, appContext, true);
+      if (normalizedFromExtend) {
+        hasExtends = true;
+        extend(normalized, normalizedFromExtend);
+      }
+    };
+    if (!asMixin && appContext.mixins.length) {
+      appContext.mixins.forEach(extendEmits);
+    }
+    if (comp.extends) {
+      extendEmits(comp.extends);
+    }
+    if (comp.mixins) {
+      comp.mixins.forEach(extendEmits);
+    }
+  }
+  if (!raw && !hasExtends) {
+    if (isObject(comp)) {
+      cache.set(comp, null);
+    }
+    return null;
+  }
+  if (isArray(raw)) {
+    raw.forEach((key) => normalized[key] = null);
+  } else {
+    extend(normalized, raw);
+  }
+  if (isObject(comp)) {
+    cache.set(comp, normalized);
+  }
+  return normalized;
+}
+function isEmitListener(options, key) {
+  if (!options || !isOn(key)) {
+    return false;
+  }
+  key = key.slice(2).replace(/Once$/, "");
+  return hasOwn(options, key[0].toLowerCase() + key.slice(1)) || hasOwn(options, hyphenate(key)) || hasOwn(options, key);
+}
+let currentRenderingInstance = null;
+function setCurrentRenderingInstance(instance) {
+  const prev = currentRenderingInstance;
+  currentRenderingInstance = instance;
+  instance && instance.type.__scopeId || null;
+  return prev;
+}
+function provide(key, value) {
+  if (!currentInstance) {
+    {
+      warn(`provide() can only be used inside setup().`);
+    }
+  } else {
+    let provides = currentInstance.provides;
+    const parentProvides = currentInstance.parent && currentInstance.parent.provides;
+    if (parentProvides === provides) {
+      provides = currentInstance.provides = Object.create(parentProvides);
+    }
+    provides[key] = value;
+    if (currentInstance.type.mpType === "app") {
+      currentInstance.appContext.app.provide(key, value);
+    }
+  }
+}
+function inject(key, defaultValue, treatDefaultAsFactory = false) {
+  const instance = currentInstance || currentRenderingInstance;
+  if (instance) {
+    const provides = instance.parent == null ? instance.vnode.appContext && instance.vnode.appContext.provides : instance.parent.provides;
+    if (provides && key in provides) {
+      return provides[key];
+    } else if (arguments.length > 1) {
+      return treatDefaultAsFactory && isFunction(defaultValue) ? defaultValue.call(instance.proxy) : defaultValue;
+    } else {
+      warn(`injection "${String(key)}" not found.`);
+    }
+  } else {
+    warn(`inject() can only be used inside setup() or functional components.`);
+  }
+}
+const INITIAL_WATCHER_VALUE = {};
+function watch(source, cb, options) {
+  if (!isFunction(cb)) {
+    warn(`\`watch(fn, options?)\` signature has been moved to a separate API. Use \`watchEffect(fn, options?)\` instead. \`watch\` now only supports \`watch(source, cb, options?) signature.`);
+  }
+  return doWatch(source, cb, options);
+}
+function doWatch(source, cb, { immediate, deep, flush, onTrack, onTrigger } = EMPTY_OBJ) {
+  if (!cb) {
+    if (immediate !== void 0) {
+      warn(`watch() "immediate" option is only respected when using the watch(source, callback, options?) signature.`);
+    }
+    if (deep !== void 0) {
+      warn(`watch() "deep" option is only respected when using the watch(source, callback, options?) signature.`);
+    }
+  }
+  const warnInvalidSource = (s2) => {
+    warn(`Invalid watch source: `, s2, `A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.`);
+  };
+  const instance = getCurrentScope() === (currentInstance === null || currentInstance === void 0 ? void 0 : currentInstance.scope) ? currentInstance : null;
+  let getter;
+  let forceTrigger = false;
+  let isMultiSource = false;
+  if (isRef(source)) {
+    getter = () => source.value;
+    forceTrigger = isShallow(source);
+  } else if (isReactive(source)) {
+    getter = () => source;
+    deep = true;
+  } else if (isArray(source)) {
+    isMultiSource = true;
+    forceTrigger = source.some((s2) => isReactive(s2) || isShallow(s2));
+    getter = () => source.map((s2) => {
+      if (isRef(s2)) {
+        return s2.value;
+      } else if (isReactive(s2)) {
+        return traverse(s2);
+      } else if (isFunction(s2)) {
+        return callWithErrorHandling(
+          s2,
+          instance,
+          2
+          /* ErrorCodes.WATCH_GETTER */
+        );
+      } else {
+        warnInvalidSource(s2);
+      }
+    });
+  } else if (isFunction(source)) {
+    if (cb) {
+      getter = () => callWithErrorHandling(
+        source,
+        instance,
+        2
+        /* ErrorCodes.WATCH_GETTER */
+      );
+    } else {
+      getter = () => {
+        if (instance && instance.isUnmounted) {
+          return;
+        }
+        if (cleanup) {
+          cleanup();
+        }
+        return callWithAsyncErrorHandling(source, instance, 3, [onCleanup]);
+      };
+    }
+  } else {
+    getter = NOOP;
+    warnInvalidSource(source);
+  }
+  if (cb && deep) {
+    const baseGetter = getter;
+    getter = () => traverse(baseGetter());
+  }
+  let cleanup;
+  let onCleanup = (fn) => {
+    cleanup = effect.onStop = () => {
+      callWithErrorHandling(
+        fn,
+        instance,
+        4
+        /* ErrorCodes.WATCH_CLEANUP */
+      );
+    };
+  };
+  let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE;
+  const job = () => {
+    if (!effect.active) {
+      return;
+    }
+    if (cb) {
+      const newValue = effect.run();
+      if (deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue)) || false) {
+        if (cleanup) {
+          cleanup();
+        }
+        callWithAsyncErrorHandling(cb, instance, 3, [
+          newValue,
+          // pass undefined as the old value when it's changed for the first time
+          oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue,
+          onCleanup
+        ]);
+        oldValue = newValue;
+      }
+    } else {
+      effect.run();
+    }
+  };
+  job.allowRecurse = !!cb;
+  let scheduler;
+  if (flush === "sync") {
+    scheduler = job;
+  } else if (flush === "post") {
+    scheduler = () => queuePostRenderEffect$1(job, instance && instance.suspense);
+  } else {
+    job.pre = true;
+    if (instance)
+      job.id = instance.uid;
+    scheduler = () => queueJob(job);
+  }
+  const effect = new ReactiveEffect(getter, scheduler);
+  {
+    effect.onTrack = onTrack;
+    effect.onTrigger = onTrigger;
+  }
+  if (cb) {
+    if (immediate) {
+      job();
+    } else {
+      oldValue = effect.run();
+    }
+  } else if (flush === "post") {
+    queuePostRenderEffect$1(effect.run.bind(effect), instance && instance.suspense);
+  } else {
+    effect.run();
+  }
+  const unwatch = () => {
+    effect.stop();
+    if (instance && instance.scope) {
+      remove(instance.scope.effects, effect);
+    }
+  };
+  return unwatch;
+}
+function instanceWatch(source, value, options) {
+  const publicThis = this.proxy;
+  const getter = isString(source) ? source.includes(".") ? createPathGetter(publicThis, source) : () => publicThis[source] : source.bind(publicThis, publicThis);
+  let cb;
+  if (isFunction(value)) {
+    cb = value;
+  } else {
+    cb = value.handler;
+    options = value;
+  }
+  const cur = currentInstance;
+  setCurrentInstance(this);
+  const res = doWatch(getter, cb.bind(publicThis), options);
+  if (cur) {
+    setCurrentInstance(cur);
+  } else {
+    unsetCurrentInstance();
+  }
+  return res;
+}
+function createPathGetter(ctx, path) {
+  const segments = path.split(".");
+  return () => {
+    let cur = ctx;
+    for (let i = 0; i < segments.length && cur; i++) {
+      cur = cur[segments[i]];
+    }
+    return cur;
+  };
+}
+function traverse(value, seen) {
+  if (!isObject(value) || value[
+    "__v_skip"
+    /* ReactiveFlags.SKIP */
+  ]) {
+    return value;
+  }
+  seen = seen || /* @__PURE__ */ new Set();
+  if (seen.has(value)) {
+    return value;
+  }
+  seen.add(value);
+  if (isRef(value)) {
+    traverse(value.value, seen);
+  } else if (isArray(value)) {
+    for (let i = 0; i < value.length; i++) {
+      traverse(value[i], seen);
+    }
+  } else if (isSet(value) || isMap(value)) {
+    value.forEach((v) => {
+      traverse(v, seen);
+    });
+  } else if (isPlainObject$1(value)) {
+    for (const key in value) {
+      traverse(value[key], seen);
+    }
+  }
+  return value;
+}
+const isKeepAlive = (vnode) => vnode.type.__isKeepAlive;
+function onActivated(hook, target) {
+  registerKeepAliveHook(hook, "a", target);
+}
+function onDeactivated(hook, target) {
+  registerKeepAliveHook(hook, "da", target);
+}
+function registerKeepAliveHook(hook, type, target = currentInstance) {
+  const wrappedHook = hook.__wdc || (hook.__wdc = () => {
+    let current = target;
+    while (current) {
+      if (current.isDeactivated) {
+        return;
+      }
+      current = current.parent;
+    }
+    return hook();
+  });
+  injectHook(type, wrappedHook, target);
+  if (target) {
+    let current = target.parent;
+    while (current && current.parent) {
+      if (isKeepAlive(current.parent.vnode)) {
+        injectToKeepAliveRoot(wrappedHook, type, target, current);
+      }
+      current = current.parent;
+    }
+  }
+}
+function injectToKeepAliveRoot(hook, type, target, keepAliveRoot) {
+  const injected = injectHook(
+    type,
+    hook,
+    keepAliveRoot,
+    true
+    /* prepend */
+  );
+  onUnmounted(() => {
+    remove(keepAliveRoot[type], injected);
+  }, target);
+}
+function injectHook(type, hook, target = currentInstance, prepend = false) {
+  if (target) {
+    if (isRootHook(type)) {
+      target = target.root;
+    }
+    const hooks = target[type] || (target[type] = []);
+    const wrappedHook = hook.__weh || (hook.__weh = (...args) => {
+      if (target.isUnmounted) {
+        return;
+      }
+      pauseTracking();
+      setCurrentInstance(target);
+      const res = callWithAsyncErrorHandling(hook, target, type, args);
+      unsetCurrentInstance();
+      resetTracking();
+      return res;
+    });
+    if (prepend) {
+      hooks.unshift(wrappedHook);
+    } else {
+      hooks.push(wrappedHook);
+    }
+    return wrappedHook;
+  } else {
+    const apiName = toHandlerKey((ErrorTypeStrings[type] || type.replace(/^on/, "")).replace(/ hook$/, ""));
+    warn(`${apiName} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup().`);
+  }
+}
+const createHook = (lifecycle) => (hook, target = currentInstance) => (
+  // post-create lifecycle registrations are noops during SSR (except for serverPrefetch)
+  (!isInSSRComponentSetup || lifecycle === "sp") && injectHook(lifecycle, (...args) => hook(...args), target)
+);
+const onBeforeMount = createHook(
+  "bm"
+  /* LifecycleHooks.BEFORE_MOUNT */
+);
+const onMounted = createHook(
+  "m"
+  /* LifecycleHooks.MOUNTED */
+);
+const onBeforeUpdate = createHook(
+  "bu"
+  /* LifecycleHooks.BEFORE_UPDATE */
+);
+const onUpdated = createHook(
+  "u"
+  /* LifecycleHooks.UPDATED */
+);
+const onBeforeUnmount = createHook(
+  "bum"
+  /* LifecycleHooks.BEFORE_UNMOUNT */
+);
+const onUnmounted = createHook(
+  "um"
+  /* LifecycleHooks.UNMOUNTED */
+);
+const onServerPrefetch = createHook(
+  "sp"
+  /* LifecycleHooks.SERVER_PREFETCH */
+);
+const onRenderTriggered = createHook(
+  "rtg"
+  /* LifecycleHooks.RENDER_TRIGGERED */
+);
+const onRenderTracked = createHook(
+  "rtc"
+  /* LifecycleHooks.RENDER_TRACKED */
+);
+function onErrorCaptured(hook, target = currentInstance) {
+  injectHook("ec", hook, target);
+}
+function validateDirectiveName(name) {
+  if (isBuiltInDirective(name)) {
+    warn("Do not use built-in directive ids as custom directive id: " + name);
+  }
+}
+const COMPONENTS = "components";
+function resolveComponent(name, maybeSelfReference) {
+  return resolveAsset(COMPONENTS, name, true, maybeSelfReference) || name;
+}
+function resolveAsset(type, name, warnMissing = true, maybeSelfReference = false) {
+  const instance = currentRenderingInstance || currentInstance;
+  if (instance) {
+    const Component2 = instance.type;
+    if (type === COMPONENTS) {
+      const selfName = getComponentName(
+        Component2,
+        false
+        /* do not include inferred name to avoid breaking existing code */
+      );
+      if (selfName && (selfName === name || selfName === camelize(name) || selfName === capitalize(camelize(name)))) {
+        return Component2;
+      }
+    }
+    const res = (
+      // local registration
+      // check instance[type] first which is resolved for options API
+      resolve(instance[type] || Component2[type], name) || // global registration
+      resolve(instance.appContext[type], name)
+    );
+    if (!res && maybeSelfReference) {
+      return Component2;
+    }
+    if (warnMissing && !res) {
+      const extra = type === COMPONENTS ? `
+If this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.` : ``;
+      warn(`Failed to resolve ${type.slice(0, -1)}: ${name}${extra}`);
+    }
+    return res;
+  } else {
+    warn(`resolve${capitalize(type.slice(0, -1))} can only be used in render() or setup().`);
+  }
+}
+function resolve(registry, name) {
+  return registry && (registry[name] || registry[camelize(name)] || registry[capitalize(camelize(name))]);
+}
+const getPublicInstance = (i) => {
+  if (!i)
+    return null;
+  if (isStatefulComponent(i))
+    return getExposeProxy(i) || i.proxy;
+  return getPublicInstance(i.parent);
+};
+const publicPropertiesMap = (
+  // Move PURE marker to new line to workaround compiler discarding it
+  // due to type annotation
+  /* @__PURE__ */ extend(/* @__PURE__ */ Object.create(null), {
+    $: (i) => i,
+    // fixed by xxxxxx vue-i18n 在 dev 模式,访问了 $el,故模拟一个假的
+    // $el: i => i.vnode.el,
+    $el: (i) => i.__$el || (i.__$el = {}),
+    $data: (i) => i.data,
+    $props: (i) => shallowReadonly(i.props),
+    $attrs: (i) => shallowReadonly(i.attrs),
+    $slots: (i) => shallowReadonly(i.slots),
+    $refs: (i) => shallowReadonly(i.refs),
+    $parent: (i) => getPublicInstance(i.parent),
+    $root: (i) => getPublicInstance(i.root),
+    $emit: (i) => i.emit,
+    $options: (i) => resolveMergedOptions(i),
+    $forceUpdate: (i) => i.f || (i.f = () => queueJob(i.update)),
+    // $nextTick: i => i.n || (i.n = nextTick.bind(i.proxy!)),// fixed by xxxxxx
+    $watch: (i) => instanceWatch.bind(i)
+  })
+);
+const isReservedPrefix = (key) => key === "_" || key === "$";
+const hasSetupBinding = (state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn(state, key);
+const PublicInstanceProxyHandlers = {
+  get({ _: instance }, key) {
+    const { ctx, setupState, data, props, accessCache, type, appContext } = instance;
+    if (key === "__isVue") {
+      return true;
+    }
+    let normalizedProps;
+    if (key[0] !== "$") {
+      const n2 = accessCache[key];
+      if (n2 !== void 0) {
+        switch (n2) {
+          case 1:
+            return setupState[key];
+          case 2:
+            return data[key];
+          case 4:
+            return ctx[key];
+          case 3:
+            return props[key];
+        }
+      } else if (hasSetupBinding(setupState, key)) {
+        accessCache[key] = 1;
+        return setupState[key];
+      } else if (data !== EMPTY_OBJ && hasOwn(data, key)) {
+        accessCache[key] = 2;
+        return data[key];
+      } else if (
+        // only cache other properties when instance has declared (thus stable)
+        // props
+        (normalizedProps = instance.propsOptions[0]) && hasOwn(normalizedProps, key)
+      ) {
+        accessCache[key] = 3;
+        return props[key];
+      } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {
+        accessCache[key] = 4;
+        return ctx[key];
+      } else if (shouldCacheAccess) {
+        accessCache[key] = 0;
+      }
+    }
+    const publicGetter = publicPropertiesMap[key];
+    let cssModule, globalProperties;
+    if (publicGetter) {
+      if (key === "$attrs") {
+        track(instance, "get", key);
+      }
+      return publicGetter(instance);
+    } else if (
+      // css module (injected by vue-loader)
+      (cssModule = type.__cssModules) && (cssModule = cssModule[key])
+    ) {
+      return cssModule;
+    } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {
+      accessCache[key] = 4;
+      return ctx[key];
+    } else if (
+      // global properties
+      globalProperties = appContext.config.globalProperties, hasOwn(globalProperties, key)
+    ) {
+      {
+        return globalProperties[key];
+      }
+    } else if (currentRenderingInstance && (!isString(key) || // #1091 avoid internal isRef/isVNode checks on component instance leading
+    // to infinite warning loop
+    key.indexOf("__v") !== 0)) {
+      if (data !== EMPTY_OBJ && isReservedPrefix(key[0]) && hasOwn(data, key)) {
+        warn(`Property ${JSON.stringify(key)} must be accessed via $data because it starts with a reserved character ("$" or "_") and is not proxied on the render context.`);
+      } else if (instance === currentRenderingInstance) {
+        warn(`Property ${JSON.stringify(key)} was accessed during render but is not defined on instance.`);
+      }
+    }
+  },
+  set({ _: instance }, key, value) {
+    const { data, setupState, ctx } = instance;
+    if (hasSetupBinding(setupState, key)) {
+      setupState[key] = value;
+      return true;
+    } else if (setupState.__isScriptSetup && hasOwn(setupState, key)) {
+      warn(`Cannot mutate <script setup> binding "${key}" from Options API.`);
+      return false;
+    } else if (data !== EMPTY_OBJ && hasOwn(data, key)) {
+      data[key] = value;
+      return true;
+    } else if (hasOwn(instance.props, key)) {
+      warn(`Attempting to mutate prop "${key}". Props are readonly.`);
+      return false;
+    }
+    if (key[0] === "$" && key.slice(1) in instance) {
+      warn(`Attempting to mutate public property "${key}". Properties starting with $ are reserved and readonly.`);
+      return false;
+    } else {
+      if (key in instance.appContext.config.globalProperties) {
+        Object.defineProperty(ctx, key, {
+          enumerable: true,
+          configurable: true,
+          value
+        });
+      } else {
+        ctx[key] = value;
+      }
+    }
+    return true;
+  },
+  has({ _: { data, setupState, accessCache, ctx, appContext, propsOptions } }, key) {
+    let normalizedProps;
+    return !!accessCache[key] || data !== EMPTY_OBJ && hasOwn(data, key) || hasSetupBinding(setupState, key) || (normalizedProps = propsOptions[0]) && hasOwn(normalizedProps, key) || hasOwn(ctx, key) || hasOwn(publicPropertiesMap, key) || hasOwn(appContext.config.globalProperties, key);
+  },
+  defineProperty(target, key, descriptor) {
+    if (descriptor.get != null) {
+      target._.accessCache[key] = 0;
+    } else if (hasOwn(descriptor, "value")) {
+      this.set(target, key, descriptor.value, null);
+    }
+    return Reflect.defineProperty(target, key, descriptor);
+  }
+};
+{
+  PublicInstanceProxyHandlers.ownKeys = (target) => {
+    warn(`Avoid app logic that relies on enumerating keys on a component instance. The keys will be empty in production mode to avoid performance overhead.`);
+    return Reflect.ownKeys(target);
+  };
+}
+function createDevRenderContext(instance) {
+  const target = {};
+  Object.defineProperty(target, `_`, {
+    configurable: true,
+    enumerable: false,
+    get: () => instance
+  });
+  Object.keys(publicPropertiesMap).forEach((key) => {
+    Object.defineProperty(target, key, {
+      configurable: true,
+      enumerable: false,
+      get: () => publicPropertiesMap[key](instance),
+      // intercepted by the proxy so no need for implementation,
+      // but needed to prevent set errors
+      set: NOOP
+    });
+  });
+  return target;
+}
+function exposePropsOnRenderContext(instance) {
+  const { ctx, propsOptions: [propsOptions] } = instance;
+  if (propsOptions) {
+    Object.keys(propsOptions).forEach((key) => {
+      Object.defineProperty(ctx, key, {
+        enumerable: true,
+        configurable: true,
+        get: () => instance.props[key],
+        set: NOOP
+      });
+    });
+  }
+}
+function exposeSetupStateOnRenderContext(instance) {
+  const { ctx, setupState } = instance;
+  Object.keys(toRaw(setupState)).forEach((key) => {
+    if (!setupState.__isScriptSetup) {
+      if (isReservedPrefix(key[0])) {
+        warn(`setup() return property ${JSON.stringify(key)} should not start with "$" or "_" which are reserved prefixes for Vue internals.`);
+        return;
+      }
+      Object.defineProperty(ctx, key, {
+        enumerable: true,
+        configurable: true,
+        get: () => setupState[key],
+        set: NOOP
+      });
+    }
+  });
+}
+function createDuplicateChecker() {
+  const cache = /* @__PURE__ */ Object.create(null);
+  return (type, key) => {
+    if (cache[key]) {
+      warn(`${type} property "${key}" is already defined in ${cache[key]}.`);
+    } else {
+      cache[key] = type;
+    }
+  };
+}
+let shouldCacheAccess = true;
+function applyOptions$1(instance) {
+  const options = resolveMergedOptions(instance);
+  const publicThis = instance.proxy;
+  const ctx = instance.ctx;
+  shouldCacheAccess = false;
+  if (options.beforeCreate) {
+    callHook$1(
+      options.beforeCreate,
+      instance,
+      "bc"
+      /* LifecycleHooks.BEFORE_CREATE */
+    );
+  }
+  const {
+    // state
+    data: dataOptions,
+    computed: computedOptions,
+    methods,
+    watch: watchOptions,
+    provide: provideOptions,
+    inject: injectOptions,
+    // lifecycle
+    created,
+    beforeMount,
+    mounted,
+    beforeUpdate,
+    updated,
+    activated,
+    deactivated,
+    beforeDestroy,
+    beforeUnmount,
+    destroyed,
+    unmounted,
+    render,
+    renderTracked,
+    renderTriggered,
+    errorCaptured,
+    serverPrefetch,
+    // public API
+    expose,
+    inheritAttrs,
+    // assets
+    components,
+    directives,
+    filters
+  } = options;
+  const checkDuplicateProperties = createDuplicateChecker();
+  {
+    const [propsOptions] = instance.propsOptions;
+    if (propsOptions) {
+      for (const key in propsOptions) {
+        checkDuplicateProperties("Props", key);
+      }
+    }
+  }
+  if (injectOptions) {
+    resolveInjections(injectOptions, ctx, checkDuplicateProperties, instance.appContext.config.unwrapInjectedRef);
+  }
+  if (methods) {
+    for (const key in methods) {
+      const methodHandler = methods[key];
+      if (isFunction(methodHandler)) {
+        {
+          Object.defineProperty(ctx, key, {
+            value: methodHandler.bind(publicThis),
+            configurable: true,
+            enumerable: true,
+            writable: true
+          });
+        }
+        {
+          checkDuplicateProperties("Methods", key);
+        }
+      } else {
+        warn(`Method "${key}" has type "${typeof methodHandler}" in the component definition. Did you reference the function correctly?`);
+      }
+    }
+  }
+  if (dataOptions) {
+    if (!isFunction(dataOptions)) {
+      warn(`The data option must be a function. Plain object usage is no longer supported.`);
+    }
+    const data = dataOptions.call(publicThis, publicThis);
+    if (isPromise(data)) {
+      warn(`data() returned a Promise - note data() cannot be async; If you intend to perform data fetching before component renders, use async setup() + <Suspense>.`);
+    }
+    if (!isObject(data)) {
+      warn(`data() should return an object.`);
+    } else {
+      instance.data = reactive(data);
+      {
+        for (const key in data) {
+          checkDuplicateProperties("Data", key);
+          if (!isReservedPrefix(key[0])) {
+            Object.defineProperty(ctx, key, {
+              configurable: true,
+              enumerable: true,
+              get: () => data[key],
+              set: NOOP
+            });
+          }
+        }
+      }
+    }
+  }
+  shouldCacheAccess = true;
+  if (computedOptions) {
+    for (const key in computedOptions) {
+      const opt = computedOptions[key];
+      const get2 = isFunction(opt) ? opt.bind(publicThis, publicThis) : isFunction(opt.get) ? opt.get.bind(publicThis, publicThis) : NOOP;
+      if (get2 === NOOP) {
+        warn(`Computed property "${key}" has no getter.`);
+      }
+      const set2 = !isFunction(opt) && isFunction(opt.set) ? opt.set.bind(publicThis) : () => {
+        warn(`Write operation failed: computed property "${key}" is readonly.`);
+      };
+      const c = computed({
+        get: get2,
+        set: set2
+      });
+      Object.defineProperty(ctx, key, {
+        enumerable: true,
+        configurable: true,
+        get: () => c.value,
+        set: (v) => c.value = v
+      });
+      {
+        checkDuplicateProperties("Computed", key);
+      }
+    }
+  }
+  if (watchOptions) {
+    for (const key in watchOptions) {
+      createWatcher(watchOptions[key], ctx, publicThis, key);
+    }
+  }
+  {
+    if (provideOptions) {
+      const provides = isFunction(provideOptions) ? provideOptions.call(publicThis) : provideOptions;
+      Reflect.ownKeys(provides).forEach((key) => {
+        provide(key, provides[key]);
+      });
+    }
+  }
+  {
+    if (created) {
+      callHook$1(
+        created,
+        instance,
+        "c"
+        /* LifecycleHooks.CREATED */
+      );
+    }
+  }
+  function registerLifecycleHook(register, hook) {
+    if (isArray(hook)) {
+      hook.forEach((_hook) => register(_hook.bind(publicThis)));
+    } else if (hook) {
+      register(hook.bind(publicThis));
+    }
+  }
+  registerLifecycleHook(onBeforeMount, beforeMount);
+  registerLifecycleHook(onMounted, mounted);
+  registerLifecycleHook(onBeforeUpdate, beforeUpdate);
+  registerLifecycleHook(onUpdated, updated);
+  registerLifecycleHook(onActivated, activated);
+  registerLifecycleHook(onDeactivated, deactivated);
+  registerLifecycleHook(onErrorCaptured, errorCaptured);
+  registerLifecycleHook(onRenderTracked, renderTracked);
+  registerLifecycleHook(onRenderTriggered, renderTriggered);
+  registerLifecycleHook(onBeforeUnmount, beforeUnmount);
+  registerLifecycleHook(onUnmounted, unmounted);
+  registerLifecycleHook(onServerPrefetch, serverPrefetch);
+  if (isArray(expose)) {
+    if (expose.length) {
+      const exposed = instance.exposed || (instance.exposed = {});
+      expose.forEach((key) => {
+        Object.defineProperty(exposed, key, {
+          get: () => publicThis[key],
+          set: (val) => publicThis[key] = val
+        });
+      });
+    } else if (!instance.exposed) {
+      instance.exposed = {};
+    }
+  }
+  if (render && instance.render === NOOP) {
+    instance.render = render;
+  }
+  if (inheritAttrs != null) {
+    instance.inheritAttrs = inheritAttrs;
+  }
+  if (components)
+    instance.components = components;
+  if (directives)
+    instance.directives = directives;
+  if (instance.ctx.$onApplyOptions) {
+    instance.ctx.$onApplyOptions(options, instance, publicThis);
+  }
+}
+function resolveInjections(injectOptions, ctx, checkDuplicateProperties = NOOP, unwrapRef = false) {
+  if (isArray(injectOptions)) {
+    injectOptions = normalizeInject(injectOptions);
+  }
+  for (const key in injectOptions) {
+    const opt = injectOptions[key];
+    let injected;
+    if (isObject(opt)) {
+      if ("default" in opt) {
+        injected = inject(
+          opt.from || key,
+          opt.default,
+          true
+          /* treat default function as factory */
+        );
+      } else {
+        injected = inject(opt.from || key);
+      }
+    } else {
+      injected = inject(opt);
+    }
+    if (isRef(injected)) {
+      if (unwrapRef) {
+        Object.defineProperty(ctx, key, {
+          enumerable: true,
+          configurable: true,
+          get: () => injected.value,
+          set: (v) => injected.value = v
+        });
+      } else {
+        {
+          warn(`injected property "${key}" is a ref and will be auto-unwrapped and no longer needs \`.value\` in the next minor release. To opt-in to the new behavior now, set \`app.config.unwrapInjectedRef = true\` (this config is temporary and will not be needed in the future.)`);
+        }
+        ctx[key] = injected;
+      }
+    } else {
+      ctx[key] = injected;
+    }
+    {
+      checkDuplicateProperties("Inject", key);
+    }
+  }
+}
+function callHook$1(hook, instance, type) {
+  callWithAsyncErrorHandling(isArray(hook) ? hook.map((h) => h.bind(instance.proxy)) : hook.bind(instance.proxy), instance, type);
+}
+function createWatcher(raw, ctx, publicThis, key) {
+  const getter = key.includes(".") ? createPathGetter(publicThis, key) : () => publicThis[key];
+  if (isString(raw)) {
+    const handler = ctx[raw];
+    if (isFunction(handler)) {
+      watch(getter, handler);
+    } else {
+      warn(`Invalid watch handler specified by key "${raw}"`, handler);
+    }
+  } else if (isFunction(raw)) {
+    watch(getter, raw.bind(publicThis));
+  } else if (isObject(raw)) {
+    if (isArray(raw)) {
+      raw.forEach((r) => createWatcher(r, ctx, publicThis, key));
+    } else {
+      const handler = isFunction(raw.handler) ? raw.handler.bind(publicThis) : ctx[raw.handler];
+      if (isFunction(handler)) {
+        watch(getter, handler, raw);
+      } else {
+        warn(`Invalid watch handler specified by key "${raw.handler}"`, handler);
+      }
+    }
+  } else {
+    warn(`Invalid watch option: "${key}"`, raw);
+  }
+}
+function resolveMergedOptions(instance) {
+  const base = instance.type;
+  const { mixins, extends: extendsOptions } = base;
+  const { mixins: globalMixins, optionsCache: cache, config: { optionMergeStrategies } } = instance.appContext;
+  const cached = cache.get(base);
+  let resolved;
+  if (cached) {
+    resolved = cached;
+  } else if (!globalMixins.length && !mixins && !extendsOptions) {
+    {
+      resolved = base;
+    }
+  } else {
+    resolved = {};
+    if (globalMixins.length) {
+      globalMixins.forEach((m) => mergeOptions(resolved, m, optionMergeStrategies, true));
+    }
+    mergeOptions(resolved, base, optionMergeStrategies);
+  }
+  if (isObject(base)) {
+    cache.set(base, resolved);
+  }
+  return resolved;
+}
+function mergeOptions(to, from, strats, asMixin = false) {
+  const { mixins, extends: extendsOptions } = from;
+  if (extendsOptions) {
+    mergeOptions(to, extendsOptions, strats, true);
+  }
+  if (mixins) {
+    mixins.forEach((m) => mergeOptions(to, m, strats, true));
+  }
+  for (const key in from) {
+    if (asMixin && key === "expose") {
+      warn(`"expose" option is ignored when declared in mixins or extends. It should only be declared in the base component itself.`);
+    } else {
+      const strat = internalOptionMergeStrats[key] || strats && strats[key];
+      to[key] = strat ? strat(to[key], from[key]) : from[key];
+    }
+  }
+  return to;
+}
+const internalOptionMergeStrats = {
+  data: mergeDataFn,
+  props: mergeObjectOptions,
+  emits: mergeObjectOptions,
+  // objects
+  methods: mergeObjectOptions,
+  computed: mergeObjectOptions,
+  // lifecycle
+  beforeCreate: mergeAsArray$1,
+  created: mergeAsArray$1,
+  beforeMount: mergeAsArray$1,
+  mounted: mergeAsArray$1,
+  beforeUpdate: mergeAsArray$1,
+  updated: mergeAsArray$1,
+  beforeDestroy: mergeAsArray$1,
+  beforeUnmount: mergeAsArray$1,
+  destroyed: mergeAsArray$1,
+  unmounted: mergeAsArray$1,
+  activated: mergeAsArray$1,
+  deactivated: mergeAsArray$1,
+  errorCaptured: mergeAsArray$1,
+  serverPrefetch: mergeAsArray$1,
+  // assets
+  components: mergeObjectOptions,
+  directives: mergeObjectOptions,
+  // watch
+  watch: mergeWatchOptions,
+  // provide / inject
+  provide: mergeDataFn,
+  inject: mergeInject
+};
+function mergeDataFn(to, from) {
+  if (!from) {
+    return to;
+  }
+  if (!to) {
+    return from;
+  }
+  return function mergedDataFn() {
+    return extend(isFunction(to) ? to.call(this, this) : to, isFunction(from) ? from.call(this, this) : from);
+  };
+}
+function mergeInject(to, from) {
+  return mergeObjectOptions(normalizeInject(to), normalizeInject(from));
+}
+function normalizeInject(raw) {
+  if (isArray(raw)) {
+    const res = {};
+    for (let i = 0; i < raw.length; i++) {
+      res[raw[i]] = raw[i];
+    }
+    return res;
+  }
+  return raw;
+}
+function mergeAsArray$1(to, from) {
+  return to ? [...new Set([].concat(to, from))] : from;
+}
+function mergeObjectOptions(to, from) {
+  return to ? extend(extend(/* @__PURE__ */ Object.create(null), to), from) : from;
+}
+function mergeWatchOptions(to, from) {
+  if (!to)
+    return from;
+  if (!from)
+    return to;
+  const merged = extend(/* @__PURE__ */ Object.create(null), to);
+  for (const key in from) {
+    merged[key] = mergeAsArray$1(to[key], from[key]);
+  }
+  return merged;
+}
+function initProps$1(instance, rawProps, isStateful, isSSR = false) {
+  const props = {};
+  const attrs = {};
+  instance.propsDefaults = /* @__PURE__ */ Object.create(null);
+  setFullProps(instance, rawProps, props, attrs);
+  for (const key in instance.propsOptions[0]) {
+    if (!(key in props)) {
+      props[key] = void 0;
+    }
+  }
+  {
+    validateProps(rawProps || {}, props, instance);
+  }
+  if (isStateful) {
+    instance.props = isSSR ? props : shallowReactive(props);
+  } else {
+    if (!instance.type.props) {
+      instance.props = attrs;
+    } else {
+      instance.props = props;
+    }
+  }
+  instance.attrs = attrs;
+}
+function isInHmrContext(instance) {
+  while (instance) {
+    if (instance.type.__hmrId)
+      return true;
+    instance = instance.parent;
+  }
+}
+function updateProps(instance, rawProps, rawPrevProps, optimized) {
+  const { props, attrs, vnode: { patchFlag } } = instance;
+  const rawCurrentProps = toRaw(props);
+  const [options] = instance.propsOptions;
+  let hasAttrsChanged = false;
+  if (
+    // always force full diff in dev
+    // - #1942 if hmr is enabled with sfc component
+    // - vite#872 non-sfc component used by sfc component
+    !isInHmrContext(instance) && (optimized || patchFlag > 0) && !(patchFlag & 16)
+  ) {
+    if (patchFlag & 8) {
+      const propsToUpdate = instance.vnode.dynamicProps;
+      for (let i = 0; i < propsToUpdate.length; i++) {
+        let key = propsToUpdate[i];
+        if (isEmitListener(instance.emitsOptions, key)) {
+          continue;
+        }
+        const value = rawProps[key];
+        if (options) {
+          if (hasOwn(attrs, key)) {
+            if (value !== attrs[key]) {
+              attrs[key] = value;
+              hasAttrsChanged = true;
+            }
+          } else {
+            const camelizedKey = camelize(key);
+            props[camelizedKey] = resolvePropValue(
+              options,
+              rawCurrentProps,
+              camelizedKey,
+              value,
+              instance,
+              false
+              /* isAbsent */
+            );
+          }
+        } else {
+          if (value !== attrs[key]) {
+            attrs[key] = value;
+            hasAttrsChanged = true;
+          }
+        }
+      }
+    }
+  } else {
+    if (setFullProps(instance, rawProps, props, attrs)) {
+      hasAttrsChanged = true;
+    }
+    let kebabKey;
+    for (const key in rawCurrentProps) {
+      if (!rawProps || // for camelCase
+      !hasOwn(rawProps, key) && // it's possible the original props was passed in as kebab-case
+      // and converted to camelCase (#955)
+      ((kebabKey = hyphenate(key)) === key || !hasOwn(rawProps, kebabKey))) {
+        if (options) {
+          if (rawPrevProps && // for camelCase
+          (rawPrevProps[key] !== void 0 || // for kebab-case
+          rawPrevProps[kebabKey] !== void 0)) {
+            props[key] = resolvePropValue(
+              options,
+              rawCurrentProps,
+              key,
+              void 0,
+              instance,
+              true
+              /* isAbsent */
+            );
+          }
+        } else {
+          delete props[key];
+        }
+      }
+    }
+    if (attrs !== rawCurrentProps) {
+      for (const key in attrs) {
+        if (!rawProps || !hasOwn(rawProps, key) && true) {
+          delete attrs[key];
+          hasAttrsChanged = true;
+        }
+      }
+    }
+  }
+  if (hasAttrsChanged) {
+    trigger(instance, "set", "$attrs");
+  }
+  {
+    validateProps(rawProps || {}, props, instance);
+  }
+}
+function setFullProps(instance, rawProps, props, attrs) {
+  const [options, needCastKeys] = instance.propsOptions;
+  let hasAttrsChanged = false;
+  let rawCastValues;
+  if (rawProps) {
+    for (let key in rawProps) {
+      if (isReservedProp(key)) {
+        continue;
+      }
+      const value = rawProps[key];
+      let camelKey;
+      if (options && hasOwn(options, camelKey = camelize(key))) {
+        if (!needCastKeys || !needCastKeys.includes(camelKey)) {
+          props[camelKey] = value;
+        } else {
+          (rawCastValues || (rawCastValues = {}))[camelKey] = value;
+        }
+      } else if (!isEmitListener(instance.emitsOptions, key)) {
+        if (!(key in attrs) || value !== attrs[key]) {
+          attrs[key] = value;
+          hasAttrsChanged = true;
+        }
+      }
+    }
+  }
+  if (needCastKeys) {
+    const rawCurrentProps = toRaw(props);
+    const castValues = rawCastValues || EMPTY_OBJ;
+    for (let i = 0; i < needCastKeys.length; i++) {
+      const key = needCastKeys[i];
+      props[key] = resolvePropValue(options, rawCurrentProps, key, castValues[key], instance, !hasOwn(castValues, key));
+    }
+  }
+  return hasAttrsChanged;
+}
+function resolvePropValue(options, props, key, value, instance, isAbsent) {
+  const opt = options[key];
+  if (opt != null) {
+    const hasDefault = hasOwn(opt, "default");
+    if (hasDefault && value === void 0) {
+      const defaultValue = opt.default;
+      if (opt.type !== Function && isFunction(defaultValue)) {
+        const { propsDefaults } = instance;
+        if (key in propsDefaults) {
+          value = propsDefaults[key];
+        } else {
+          setCurrentInstance(instance);
+          value = propsDefaults[key] = defaultValue.call(null, props);
+          unsetCurrentInstance();
+        }
+      } else {
+        value = defaultValue;
+      }
+    }
+    if (opt[
+      0
+      /* BooleanFlags.shouldCast */
+    ]) {
+      if (isAbsent && !hasDefault) {
+        value = false;
+      } else if (opt[
+        1
+        /* BooleanFlags.shouldCastTrue */
+      ] && (value === "" || value === hyphenate(key))) {
+        value = true;
+      }
+    }
+  }
+  return value;
+}
+function normalizePropsOptions(comp, appContext, asMixin = false) {
+  const cache = appContext.propsCache;
+  const cached = cache.get(comp);
+  if (cached) {
+    return cached;
+  }
+  const raw = comp.props;
+  const normalized = {};
+  const needCastKeys = [];
+  let hasExtends = false;
+  if (!isFunction(comp)) {
+    const extendProps = (raw2) => {
+      hasExtends = true;
+      const [props, keys] = normalizePropsOptions(raw2, appContext, true);
+      extend(normalized, props);
+      if (keys)
+        needCastKeys.push(...keys);
+    };
+    if (!asMixin && appContext.mixins.length) {
+      appContext.mixins.forEach(extendProps);
+    }
+    if (comp.extends) {
+      extendProps(comp.extends);
+    }
+    if (comp.mixins) {
+      comp.mixins.forEach(extendProps);
+    }
+  }
+  if (!raw && !hasExtends) {
+    if (isObject(comp)) {
+      cache.set(comp, EMPTY_ARR);
+    }
+    return EMPTY_ARR;
+  }
+  if (isArray(raw)) {
+    for (let i = 0; i < raw.length; i++) {
+      if (!isString(raw[i])) {
+        warn(`props must be strings when using array syntax.`, raw[i]);
+      }
+      const normalizedKey = camelize(raw[i]);
+      if (validatePropName(normalizedKey)) {
+        normalized[normalizedKey] = EMPTY_OBJ;
+      }
+    }
+  } else if (raw) {
+    if (!isObject(raw)) {
+      warn(`invalid props options`, raw);
+    }
+    for (const key in raw) {
+      const normalizedKey = camelize(key);
+      if (validatePropName(normalizedKey)) {
+        const opt = raw[key];
+        const prop = normalized[normalizedKey] = isArray(opt) || isFunction(opt) ? { type: opt } : Object.assign({}, opt);
+        if (prop) {
+          const booleanIndex = getTypeIndex(Boolean, prop.type);
+          const stringIndex = getTypeIndex(String, prop.type);
+          prop[
+            0
+            /* BooleanFlags.shouldCast */
+          ] = booleanIndex > -1;
+          prop[
+            1
+            /* BooleanFlags.shouldCastTrue */
+          ] = stringIndex < 0 || booleanIndex < stringIndex;
+          if (booleanIndex > -1 || hasOwn(prop, "default")) {
+            needCastKeys.push(normalizedKey);
+          }
+        }
+      }
+    }
+  }
+  const res = [normalized, needCastKeys];
+  if (isObject(comp)) {
+    cache.set(comp, res);
+  }
+  return res;
+}
+function validatePropName(key) {
+  if (key[0] !== "$") {
+    return true;
+  } else {
+    warn(`Invalid prop name: "${key}" is a reserved property.`);
+  }
+  return false;
+}
+function getType(ctor) {
+  const match = ctor && ctor.toString().match(/^\s*(function|class) (\w+)/);
+  return match ? match[2] : ctor === null ? "null" : "";
+}
+function isSameType(a, b) {
+  return getType(a) === getType(b);
+}
+function getTypeIndex(type, expectedTypes) {
+  if (isArray(expectedTypes)) {
+    return expectedTypes.findIndex((t2) => isSameType(t2, type));
+  } else if (isFunction(expectedTypes)) {
+    return isSameType(expectedTypes, type) ? 0 : -1;
+  }
+  return -1;
+}
+function validateProps(rawProps, props, instance) {
+  const resolvedValues = toRaw(props);
+  const options = instance.propsOptions[0];
+  for (const key in options) {
+    let opt = options[key];
+    if (opt == null)
+      continue;
+    validateProp(key, resolvedValues[key], opt, !hasOwn(rawProps, key) && !hasOwn(rawProps, hyphenate(key)));
+  }
+}
+function validateProp(name, value, prop, isAbsent) {
+  const { type, required, validator } = prop;
+  if (required && isAbsent) {
+    warn('Missing required prop: "' + name + '"');
+    return;
+  }
+  if (value == null && !prop.required) {
+    return;
+  }
+  if (type != null && type !== true) {
+    let isValid = false;
+    const types = isArray(type) ? type : [type];
+    const expectedTypes = [];
+    for (let i = 0; i < types.length && !isValid; i++) {
+      const { valid, expectedType } = assertType(value, types[i]);
+      expectedTypes.push(expectedType || "");
+      isValid = valid;
+    }
+    if (!isValid) {
+      warn(getInvalidTypeMessage(name, value, expectedTypes));
+      return;
+    }
+  }
+  if (validator && !validator(value)) {
+    warn('Invalid prop: custom validator check failed for prop "' + name + '".');
+  }
+}
+const isSimpleType = /* @__PURE__ */ makeMap("String,Number,Boolean,Function,Symbol,BigInt");
+function assertType(value, type) {
+  let valid;
+  const expectedType = getType(type);
+  if (isSimpleType(expectedType)) {
+    const t2 = typeof value;
+    valid = t2 === expectedType.toLowerCase();
+    if (!valid && t2 === "object") {
+      valid = value instanceof type;
+    }
+  } else if (expectedType === "Object") {
+    valid = isObject(value);
+  } else if (expectedType === "Array") {
+    valid = isArray(value);
+  } else if (expectedType === "null") {
+    valid = value === null;
+  } else {
+    valid = value instanceof type;
+  }
+  return {
+    valid,
+    expectedType
+  };
+}
+function getInvalidTypeMessage(name, value, expectedTypes) {
+  let message = `Invalid prop: type check failed for prop "${name}". Expected ${expectedTypes.map(capitalize).join(" | ")}`;
+  const expectedType = expectedTypes[0];
+  const receivedType = toRawType(value);
+  const expectedValue = styleValue(value, expectedType);
+  const receivedValue = styleValue(value, receivedType);
+  if (expectedTypes.length === 1 && isExplicable(expectedType) && !isBoolean(expectedType, receivedType)) {
+    message += ` with value ${expectedValue}`;
+  }
+  message += `, got ${receivedType} `;
+  if (isExplicable(receivedType)) {
+    message += `with value ${receivedValue}.`;
+  }
+  return message;
+}
+function styleValue(value, type) {
+  if (type === "String") {
+    return `"${value}"`;
+  } else if (type === "Number") {
+    return `${Number(value)}`;
+  } else {
+    return `${value}`;
+  }
+}
+function isExplicable(type) {
+  const explicitTypes = ["string", "number", "boolean"];
+  return explicitTypes.some((elem) => type.toLowerCase() === elem);
+}
+function isBoolean(...args) {
+  return args.some((elem) => elem.toLowerCase() === "boolean");
+}
+function createAppContext() {
+  return {
+    app: null,
+    config: {
+      isNativeTag: NO,
+      performance: false,
+      globalProperties: {},
+      optionMergeStrategies: {},
+      errorHandler: void 0,
+      warnHandler: void 0,
+      compilerOptions: {}
+    },
+    mixins: [],
+    components: {},
+    directives: {},
+    provides: /* @__PURE__ */ Object.create(null),
+    optionsCache: /* @__PURE__ */ new WeakMap(),
+    propsCache: /* @__PURE__ */ new WeakMap(),
+    emitsCache: /* @__PURE__ */ new WeakMap()
+  };
+}
+let uid$1 = 0;
+function createAppAPI(render, hydrate) {
+  return function createApp2(rootComponent, rootProps = null) {
+    if (!isFunction(rootComponent)) {
+      rootComponent = Object.assign({}, rootComponent);
+    }
+    if (rootProps != null && !isObject(rootProps)) {
+      warn(`root props passed to app.mount() must be an object.`);
+      rootProps = null;
+    }
+    const context = createAppContext();
+    const installedPlugins = /* @__PURE__ */ new Set();
+    const app = context.app = {
+      _uid: uid$1++,
+      _component: rootComponent,
+      _props: rootProps,
+      _container: null,
+      _context: context,
+      _instance: null,
+      version,
+      get config() {
+        return context.config;
+      },
+      set config(v) {
+        {
+          warn(`app.config cannot be replaced. Modify individual options instead.`);
+        }
+      },
+      use(plugin2, ...options) {
+        if (installedPlugins.has(plugin2)) {
+          warn(`Plugin has already been applied to target app.`);
+        } else if (plugin2 && isFunction(plugin2.install)) {
+          installedPlugins.add(plugin2);
+          plugin2.install(app, ...options);
+        } else if (isFunction(plugin2)) {
+          installedPlugins.add(plugin2);
+          plugin2(app, ...options);
+        } else {
+          warn(`A plugin must either be a function or an object with an "install" function.`);
+        }
+        return app;
+      },
+      mixin(mixin) {
+        {
+          if (!context.mixins.includes(mixin)) {
+            context.mixins.push(mixin);
+          } else {
+            warn("Mixin has already been applied to target app" + (mixin.name ? `: ${mixin.name}` : ""));
+          }
+        }
+        return app;
+      },
+      component(name, component) {
+        {
+          validateComponentName(name, context.config);
+        }
+        if (!component) {
+          return context.components[name];
+        }
+        if (context.components[name]) {
+          warn(`Component "${name}" has already been registered in target app.`);
+        }
+        context.components[name] = component;
+        return app;
+      },
+      directive(name, directive) {
+        {
+          validateDirectiveName(name);
+        }
+        if (!directive) {
+          return context.directives[name];
+        }
+        if (context.directives[name]) {
+          warn(`Directive "${name}" has already been registered in target app.`);
+        }
+        context.directives[name] = directive;
+        return app;
+      },
+      // fixed by xxxxxx
+      mount() {
+      },
+      // fixed by xxxxxx
+      unmount() {
+      },
+      provide(key, value) {
+        if (key in context.provides) {
+          warn(`App already provides property with key "${String(key)}". It will be overwritten with the new value.`);
+        }
+        context.provides[key] = value;
+        return app;
+      }
+    };
+    return app;
+  };
+}
+let supported;
+let perf;
+function startMeasure(instance, type) {
+  if (instance.appContext.config.performance && isSupported()) {
+    perf.mark(`vue-${type}-${instance.uid}`);
+  }
+  {
+    devtoolsPerfStart(instance, type, isSupported() ? perf.now() : Date.now());
+  }
+}
+function endMeasure(instance, type) {
+  if (instance.appContext.config.performance && isSupported()) {
+    const startTag = `vue-${type}-${instance.uid}`;
+    const endTag = startTag + `:end`;
+    perf.mark(endTag);
+    perf.measure(`<${formatComponentName(instance, instance.type)}> ${type}`, startTag, endTag);
+    perf.clearMarks(startTag);
+    perf.clearMarks(endTag);
+  }
+  {
+    devtoolsPerfEnd(instance, type, isSupported() ? perf.now() : Date.now());
+  }
+}
+function isSupported() {
+  if (supported !== void 0) {
+    return supported;
+  }
+  if (typeof window !== "undefined" && window.performance) {
+    supported = true;
+    perf = window.performance;
+  } else {
+    supported = false;
+  }
+  return supported;
+}
+const queuePostRenderEffect$1 = queuePostFlushCb;
+const Fragment = Symbol("Fragment");
+const Text = Symbol("Text");
+const Comment = Symbol("Comment");
+const Static = Symbol("Static");
+function isVNode(value) {
+  return value ? value.__v_isVNode === true : false;
+}
+const InternalObjectKey = `__vInternal`;
+function guardReactiveProps(props) {
+  if (!props)
+    return null;
+  return isProxy(props) || InternalObjectKey in props ? extend({}, props) : props;
+}
+const emptyAppContext = createAppContext();
+let uid = 0;
+function createComponentInstance(vnode, parent, suspense) {
+  const type = vnode.type;
+  const appContext = (parent ? parent.appContext : vnode.appContext) || emptyAppContext;
+  const instance = {
+    uid: uid++,
+    vnode,
+    type,
+    parent,
+    appContext,
+    root: null,
+    next: null,
+    subTree: null,
+    effect: null,
+    update: null,
+    scope: new EffectScope(
+      true
+      /* detached */
+    ),
+    render: null,
+    proxy: null,
+    exposed: null,
+    exposeProxy: null,
+    withProxy: null,
+    provides: parent ? parent.provides : Object.create(appContext.provides),
+    accessCache: null,
+    renderCache: [],
+    // local resolved assets
+    components: null,
+    directives: null,
+    // resolved props and emits options
+    propsOptions: normalizePropsOptions(type, appContext),
+    emitsOptions: normalizeEmitsOptions(type, appContext),
+    // emit
+    emit: null,
+    emitted: null,
+    // props default value
+    propsDefaults: EMPTY_OBJ,
+    // inheritAttrs
+    inheritAttrs: type.inheritAttrs,
+    // state
+    ctx: EMPTY_OBJ,
+    data: EMPTY_OBJ,
+    props: EMPTY_OBJ,
+    attrs: EMPTY_OBJ,
+    slots: EMPTY_OBJ,
+    refs: EMPTY_OBJ,
+    setupState: EMPTY_OBJ,
+    setupContext: null,
+    // suspense related
+    suspense,
+    suspenseId: suspense ? suspense.pendingId : 0,
+    asyncDep: null,
+    asyncResolved: false,
+    // lifecycle hooks
+    // not using enums here because it results in computed properties
+    isMounted: false,
+    isUnmounted: false,
+    isDeactivated: false,
+    bc: null,
+    c: null,
+    bm: null,
+    m: null,
+    bu: null,
+    u: null,
+    um: null,
+    bum: null,
+    da: null,
+    a: null,
+    rtg: null,
+    rtc: null,
+    ec: null,
+    sp: null
+  };
+  {
+    instance.ctx = createDevRenderContext(instance);
+  }
+  instance.root = parent ? parent.root : instance;
+  instance.emit = emit.bind(null, instance);
+  if (vnode.ce) {
+    vnode.ce(instance);
+  }
+  return instance;
+}
+let currentInstance = null;
+const getCurrentInstance = () => currentInstance || currentRenderingInstance;
+const setCurrentInstance = (instance) => {
+  currentInstance = instance;
+  instance.scope.on();
+};
+const unsetCurrentInstance = () => {
+  currentInstance && currentInstance.scope.off();
+  currentInstance = null;
+};
+const isBuiltInTag = /* @__PURE__ */ makeMap("slot,component");
+function validateComponentName(name, config) {
+  const appIsNativeTag = config.isNativeTag || NO;
+  if (isBuiltInTag(name) || appIsNativeTag(name)) {
+    warn("Do not use built-in or reserved HTML elements as component id: " + name);
+  }
+}
+function isStatefulComponent(instance) {
+  return instance.vnode.shapeFlag & 4;
+}
+let isInSSRComponentSetup = false;
+function setupComponent(instance, isSSR = false) {
+  isInSSRComponentSetup = isSSR;
+  const {
+    props
+    /*, children*/
+  } = instance.vnode;
+  const isStateful = isStatefulComponent(instance);
+  initProps$1(instance, props, isStateful, isSSR);
+  const setupResult = isStateful ? setupStatefulComponent(instance, isSSR) : void 0;
+  isInSSRComponentSetup = false;
+  return setupResult;
+}
+function setupStatefulComponent(instance, isSSR) {
+  const Component2 = instance.type;
+  {
+    if (Component2.name) {
+      validateComponentName(Component2.name, instance.appContext.config);
+    }
+    if (Component2.components) {
+      const names = Object.keys(Component2.components);
+      for (let i = 0; i < names.length; i++) {
+        validateComponentName(names[i], instance.appContext.config);
+      }
+    }
+    if (Component2.directives) {
+      const names = Object.keys(Component2.directives);
+      for (let i = 0; i < names.length; i++) {
+        validateDirectiveName(names[i]);
+      }
+    }
+    if (Component2.compilerOptions && isRuntimeOnly()) {
+      warn(`"compilerOptions" is only supported when using a build of Vue that includes the runtime compiler. Since you are using a runtime-only build, the options should be passed via your build tool config instead.`);
+    }
+  }
+  instance.accessCache = /* @__PURE__ */ Object.create(null);
+  instance.proxy = markRaw(new Proxy(instance.ctx, PublicInstanceProxyHandlers));
+  {
+    exposePropsOnRenderContext(instance);
+  }
+  const { setup } = Component2;
+  if (setup) {
+    const setupContext = instance.setupContext = setup.length > 1 ? createSetupContext(instance) : null;
+    setCurrentInstance(instance);
+    pauseTracking();
+    const setupResult = callWithErrorHandling(setup, instance, 0, [shallowReadonly(instance.props), setupContext]);
+    resetTracking();
+    unsetCurrentInstance();
+    if (isPromise(setupResult)) {
+      setupResult.then(unsetCurrentInstance, unsetCurrentInstance);
+      {
+        warn(`setup() returned a Promise, but the version of Vue you are using does not support it yet.`);
+      }
+    } else {
+      handleSetupResult(instance, setupResult, isSSR);
+    }
+  } else {
+    finishComponentSetup(instance, isSSR);
+  }
+}
+function handleSetupResult(instance, setupResult, isSSR) {
+  if (isFunction(setupResult)) {
+    {
+      instance.render = setupResult;
+    }
+  } else if (isObject(setupResult)) {
+    if (isVNode(setupResult)) {
+      warn(`setup() should not return VNodes directly - return a render function instead.`);
+    }
+    {
+      instance.devtoolsRawSetupState = setupResult;
+    }
+    instance.setupState = proxyRefs(setupResult);
+    {
+      exposeSetupStateOnRenderContext(instance);
+    }
+  } else if (setupResult !== void 0) {
+    warn(`setup() should return an object. Received: ${setupResult === null ? "null" : typeof setupResult}`);
+  }
+  finishComponentSetup(instance, isSSR);
+}
+let compile;
+const isRuntimeOnly = () => !compile;
+function finishComponentSetup(instance, isSSR, skipOptions) {
+  const Component2 = instance.type;
+  if (!instance.render) {
+    instance.render = Component2.render || NOOP;
+  }
+  {
+    setCurrentInstance(instance);
+    pauseTracking();
+    applyOptions$1(instance);
+    resetTracking();
+    unsetCurrentInstance();
+  }
+  if (!Component2.render && instance.render === NOOP && !isSSR) {
+    if (Component2.template) {
+      warn(
+        `Component provided template option but runtime compilation is not supported in this build of Vue. Configure your bundler to alias "vue" to "vue/dist/vue.esm-bundler.js".`
+        /* should not happen */
+      );
+    } else {
+      warn(`Component is missing template or render function.`);
+    }
+  }
+}
+function createAttrsProxy(instance) {
+  return new Proxy(
+    instance.attrs,
+    {
+      get(target, key) {
+        track(instance, "get", "$attrs");
+        return target[key];
+      },
+      set() {
+        warn(`setupContext.attrs is readonly.`);
+        return false;
+      },
+      deleteProperty() {
+        warn(`setupContext.attrs is readonly.`);
+        return false;
+      }
+    }
+  );
+}
+function createSetupContext(instance) {
+  const expose = (exposed) => {
+    {
+      if (instance.exposed) {
+        warn(`expose() should be called only once per setup().`);
+      }
+      if (exposed != null) {
+        let exposedType = typeof exposed;
+        if (exposedType === "object") {
+          if (isArray(exposed)) {
+            exposedType = "array";
+          } else if (isRef(exposed)) {
+            exposedType = "ref";
+          }
+        }
+        if (exposedType !== "object") {
+          warn(`expose() should be passed a plain object, received ${exposedType}.`);
+        }
+      }
+    }
+    instance.exposed = exposed || {};
+  };
+  let attrs;
+  {
+    return Object.freeze({
+      get attrs() {
+        return attrs || (attrs = createAttrsProxy(instance));
+      },
+      get slots() {
+        return shallowReadonly(instance.slots);
+      },
+      get emit() {
+        return (event, ...args) => instance.emit(event, ...args);
+      },
+      expose
+    });
+  }
+}
+function getExposeProxy(instance) {
+  if (instance.exposed) {
+    return instance.exposeProxy || (instance.exposeProxy = new Proxy(proxyRefs(markRaw(instance.exposed)), {
+      get(target, key) {
+        if (key in target) {
+          return target[key];
+        }
+        return instance.proxy[key];
+      },
+      has(target, key) {
+        return key in target || key in publicPropertiesMap;
+      }
+    }));
+  }
+}
+const classifyRE = /(?:^|[-_])(\w)/g;
+const classify = (str) => str.replace(classifyRE, (c) => c.toUpperCase()).replace(/[-_]/g, "");
+function getComponentName(Component2, includeInferred = true) {
+  return isFunction(Component2) ? Component2.displayName || Component2.name : Component2.name || includeInferred && Component2.__name;
+}
+function formatComponentName(instance, Component2, isRoot = false) {
+  let name = getComponentName(Component2);
+  if (!name && Component2.__file) {
+    const match = Component2.__file.match(/([^/\\]+)\.\w+$/);
+    if (match) {
+      name = match[1];
+    }
+  }
+  if (!name && instance && instance.parent) {
+    const inferFromRegistry = (registry) => {
+      for (const key in registry) {
+        if (registry[key] === Component2) {
+          return key;
+        }
+      }
+    };
+    name = inferFromRegistry(instance.components || instance.parent.type.components) || inferFromRegistry(instance.appContext.components);
+  }
+  return name ? classify(name) : isRoot ? `App` : `Anonymous`;
+}
+const computed = (getterOrOptions, debugOptions) => {
+  return computed$1(getterOrOptions, debugOptions, isInSSRComponentSetup);
+};
+const version = "3.2.47";
+function unwrapper(target) {
+  return unref(target);
+}
+const ARRAYTYPE = "[object Array]";
+const OBJECTTYPE = "[object Object]";
+function diff(current, pre) {
+  const result = {};
+  syncKeys(current, pre);
+  _diff(current, pre, "", result);
+  return result;
+}
+function syncKeys(current, pre) {
+  current = unwrapper(current);
+  if (current === pre)
+    return;
+  const rootCurrentType = toTypeString(current);
+  const rootPreType = toTypeString(pre);
+  if (rootCurrentType == OBJECTTYPE && rootPreType == OBJECTTYPE) {
+    for (let key in pre) {
+      const currentValue = current[key];
+      if (currentValue === void 0) {
+        current[key] = null;
+      } else {
+        syncKeys(currentValue, pre[key]);
+      }
+    }
+  } else if (rootCurrentType == ARRAYTYPE && rootPreType == ARRAYTYPE) {
+    if (current.length >= pre.length) {
+      pre.forEach((item, index2) => {
+        syncKeys(current[index2], item);
+      });
+    }
+  }
+}
+function _diff(current, pre, path, result) {
+  current = unwrapper(current);
+  if (current === pre)
+    return;
+  const rootCurrentType = toTypeString(current);
+  const rootPreType = toTypeString(pre);
+  if (rootCurrentType == OBJECTTYPE) {
+    if (rootPreType != OBJECTTYPE || Object.keys(current).length < Object.keys(pre).length) {
+      setResult(result, path, current);
+    } else {
+      for (let key in current) {
+        const currentValue = unwrapper(current[key]);
+        const preValue = pre[key];
+        const currentType = toTypeString(currentValue);
+        const preType = toTypeString(preValue);
+        if (currentType != ARRAYTYPE && currentType != OBJECTTYPE) {
+          if (currentValue != preValue) {
+            setResult(result, (path == "" ? "" : path + ".") + key, currentValue);
+          }
+        } else if (currentType == ARRAYTYPE) {
+          if (preType != ARRAYTYPE) {
+            setResult(result, (path == "" ? "" : path + ".") + key, currentValue);
+          } else {
+            if (currentValue.length < preValue.length) {
+              setResult(result, (path == "" ? "" : path + ".") + key, currentValue);
+            } else {
+              currentValue.forEach((item, index2) => {
+                _diff(item, preValue[index2], (path == "" ? "" : path + ".") + key + "[" + index2 + "]", result);
+              });
+            }
+          }
+        } else if (currentType == OBJECTTYPE) {
+          if (preType != OBJECTTYPE || Object.keys(currentValue).length < Object.keys(preValue).length) {
+            setResult(result, (path == "" ? "" : path + ".") + key, currentValue);
+          } else {
+            for (let subKey in currentValue) {
+              _diff(currentValue[subKey], preValue[subKey], (path == "" ? "" : path + ".") + key + "." + subKey, result);
+            }
+          }
+        }
+      }
+    }
+  } else if (rootCurrentType == ARRAYTYPE) {
+    if (rootPreType != ARRAYTYPE) {
+      setResult(result, path, current);
+    } else {
+      if (current.length < pre.length) {
+        setResult(result, path, current);
+      } else {
+        current.forEach((item, index2) => {
+          _diff(item, pre[index2], path + "[" + index2 + "]", result);
+        });
+      }
+    }
+  } else {
+    setResult(result, path, current);
+  }
+}
+function setResult(result, k, v) {
+  result[k] = v;
+}
+function hasComponentEffect(instance) {
+  return queue.includes(instance.update);
+}
+function flushCallbacks(instance) {
+  const ctx = instance.ctx;
+  const callbacks = ctx.__next_tick_callbacks;
+  if (callbacks && callbacks.length) {
+    const copies = callbacks.slice(0);
+    callbacks.length = 0;
+    for (let i = 0; i < copies.length; i++) {
+      copies[i]();
+    }
+  }
+}
+function nextTick(instance, fn) {
+  const ctx = instance.ctx;
+  if (!ctx.__next_tick_pending && !hasComponentEffect(instance)) {
+    return nextTick$1(fn && fn.bind(instance.proxy));
+  }
+  let _resolve;
+  if (!ctx.__next_tick_callbacks) {
+    ctx.__next_tick_callbacks = [];
+  }
+  ctx.__next_tick_callbacks.push(() => {
+    if (fn) {
+      callWithErrorHandling(
+        fn.bind(instance.proxy),
+        instance,
+        14
+        /* ErrorCodes.SCHEDULER */
+      );
+    } else if (_resolve) {
+      _resolve(instance.proxy);
+    }
+  });
+  return new Promise((resolve2) => {
+    _resolve = resolve2;
+  });
+}
+function clone(src, seen) {
+  src = unwrapper(src);
+  const type = typeof src;
+  if (type === "object" && src !== null) {
+    let copy = seen.get(src);
+    if (typeof copy !== "undefined") {
+      return copy;
+    }
+    if (isArray(src)) {
+      const len = src.length;
+      copy = new Array(len);
+      seen.set(src, copy);
+      for (let i = 0; i < len; i++) {
+        copy[i] = clone(src[i], seen);
+      }
+    } else {
+      copy = {};
+      seen.set(src, copy);
+      for (const name in src) {
+        if (hasOwn(src, name)) {
+          copy[name] = clone(src[name], seen);
+        }
+      }
+    }
+    return copy;
+  }
+  if (type !== "symbol") {
+    return src;
+  }
+}
+function deepCopy(src) {
+  return clone(src, typeof WeakMap !== "undefined" ? /* @__PURE__ */ new WeakMap() : /* @__PURE__ */ new Map());
+}
+function getMPInstanceData(instance, keys) {
+  const data = instance.data;
+  const ret = /* @__PURE__ */ Object.create(null);
+  keys.forEach((key) => {
+    ret[key] = data[key];
+  });
+  return ret;
+}
+function patch(instance, data, oldData) {
+  if (!data) {
+    return;
+  }
+  data = deepCopy(data);
+  const ctx = instance.ctx;
+  const mpType = ctx.mpType;
+  if (mpType === "page" || mpType === "component") {
+    data.r0 = 1;
+    const mpInstance = ctx.$scope;
+    const keys = Object.keys(data);
+    const diffData = diff(data, oldData || getMPInstanceData(mpInstance, keys));
+    if (Object.keys(diffData).length) {
+      ctx.__next_tick_pending = true;
+      mpInstance.setData(diffData, () => {
+        ctx.__next_tick_pending = false;
+        flushCallbacks(instance);
+      });
+      flushPreFlushCbs();
+    } else {
+      flushCallbacks(instance);
+    }
+  }
+}
+function initAppConfig(appConfig) {
+  appConfig.globalProperties.$nextTick = function $nextTick(fn) {
+    return nextTick(this.$, fn);
+  };
+}
+function onApplyOptions(options, instance, publicThis) {
+  instance.appContext.config.globalProperties.$applyOptions(options, instance, publicThis);
+  const computedOptions = options.computed;
+  if (computedOptions) {
+    const keys = Object.keys(computedOptions);
+    if (keys.length) {
+      const ctx = instance.ctx;
+      if (!ctx.$computedKeys) {
+        ctx.$computedKeys = [];
+      }
+      ctx.$computedKeys.push(...keys);
+    }
+  }
+  delete instance.ctx.$onApplyOptions;
+}
+function setRef$1(instance, isUnmount = false) {
+  const { setupState, $templateRefs, ctx: { $scope, $mpPlatform } } = instance;
+  if ($mpPlatform === "mp-alipay") {
+    return;
+  }
+  if (!$templateRefs || !$scope) {
+    return;
+  }
+  if (isUnmount) {
+    return $templateRefs.forEach((templateRef) => setTemplateRef(templateRef, null, setupState));
+  }
+  const check = $mpPlatform === "mp-baidu" || $mpPlatform === "mp-toutiao";
+  const doSetByRefs = (refs) => {
+    const mpComponents = (
+      // 字节小程序 selectAllComponents 可能返回 null
+      // https://github.com/dcloudio/uni-app/issues/3954
+      ($scope.selectAllComponents(".r") || []).concat($scope.selectAllComponents(".r-i-f") || [])
+    );
+    return refs.filter((templateRef) => {
+      const refValue = findComponentPublicInstance(mpComponents, templateRef.i);
+      if (check && refValue === null) {
+        return true;
+      }
+      setTemplateRef(templateRef, refValue, setupState);
+      return false;
+    });
+  };
+  const doSet = () => {
+    const refs = doSetByRefs($templateRefs);
+    if (refs.length && instance.proxy && instance.proxy.$scope) {
+      instance.proxy.$scope.setData({ r1: 1 }, () => {
+        doSetByRefs(refs);
+      });
+    }
+  };
+  if ($scope._$setRef) {
+    $scope._$setRef(doSet);
+  } else {
+    nextTick(instance, doSet);
+  }
+}
+function toSkip(value) {
+  if (isObject(value)) {
+    markRaw(value);
+  }
+  return value;
+}
+function findComponentPublicInstance(mpComponents, id) {
+  const mpInstance = mpComponents.find((com) => com && (com.properties || com.props).uI === id);
+  if (mpInstance) {
+    const vm = mpInstance.$vm;
+    if (vm) {
+      return getExposeProxy(vm.$) || vm;
+    }
+    return toSkip(mpInstance);
+  }
+  return null;
+}
+function setTemplateRef({ r, f: f2 }, refValue, setupState) {
+  if (isFunction(r)) {
+    r(refValue, {});
+  } else {
+    const _isString = isString(r);
+    const _isRef = isRef(r);
+    if (_isString || _isRef) {
+      if (f2) {
+        if (!_isRef) {
+          return;
+        }
+        if (!isArray(r.value)) {
+          r.value = [];
+        }
+        const existing = r.value;
+        if (existing.indexOf(refValue) === -1) {
+          existing.push(refValue);
+          if (!refValue) {
+            return;
+          }
+          onBeforeUnmount(() => remove(existing, refValue), refValue.$);
+        }
+      } else if (_isString) {
+        if (hasOwn(setupState, r)) {
+          setupState[r] = refValue;
+        }
+      } else if (isRef(r)) {
+        r.value = refValue;
+      } else {
+        warnRef(r);
+      }
+    } else {
+      warnRef(r);
+    }
+  }
+}
+function warnRef(ref2) {
+  warn("Invalid template ref type:", ref2, `(${typeof ref2})`);
+}
+var MPType;
+(function(MPType2) {
+  MPType2["APP"] = "app";
+  MPType2["PAGE"] = "page";
+  MPType2["COMPONENT"] = "component";
+})(MPType || (MPType = {}));
+const queuePostRenderEffect = queuePostFlushCb;
+function mountComponent(initialVNode, options) {
+  const instance = initialVNode.component = createComponentInstance(initialVNode, options.parentComponent, null);
+  {
+    instance.ctx.$onApplyOptions = onApplyOptions;
+    instance.ctx.$children = [];
+  }
+  if (options.mpType === "app") {
+    instance.render = NOOP;
+  }
+  if (options.onBeforeSetup) {
+    options.onBeforeSetup(instance, options);
+  }
+  {
+    pushWarningContext(initialVNode);
+    startMeasure(instance, `mount`);
+  }
+  {
+    startMeasure(instance, `init`);
+  }
+  setupComponent(instance);
+  {
+    endMeasure(instance, `init`);
+  }
+  {
+    if (options.parentComponent && instance.proxy) {
+      options.parentComponent.ctx.$children.push(getExposeProxy(instance) || instance.proxy);
+    }
+  }
+  setupRenderEffect(instance);
+  {
+    popWarningContext();
+    endMeasure(instance, `mount`);
+  }
+  return instance.proxy;
+}
+const getFunctionalFallthrough = (attrs) => {
+  let res;
+  for (const key in attrs) {
+    if (key === "class" || key === "style" || isOn(key)) {
+      (res || (res = {}))[key] = attrs[key];
+    }
+  }
+  return res;
+};
+function renderComponentRoot(instance) {
+  const { type: Component2, vnode, proxy, withProxy, props, propsOptions: [propsOptions], slots, attrs, emit: emit2, render, renderCache, data, setupState, ctx, uid: uid2, appContext: { app: { config: { globalProperties: { pruneComponentPropsCache: pruneComponentPropsCache2 } } } }, inheritAttrs } = instance;
+  instance.$templateRefs = [];
+  instance.$ei = 0;
+  pruneComponentPropsCache2(uid2);
+  instance.__counter = instance.__counter === 0 ? 1 : 0;
+  let result;
+  const prev = setCurrentRenderingInstance(instance);
+  try {
+    if (vnode.shapeFlag & 4) {
+      fallthroughAttrs(inheritAttrs, props, propsOptions, attrs);
+      const proxyToUse = withProxy || proxy;
+      result = render.call(proxyToUse, proxyToUse, renderCache, props, setupState, data, ctx);
+    } else {
+      fallthroughAttrs(inheritAttrs, props, propsOptions, Component2.props ? attrs : getFunctionalFallthrough(attrs));
+      const render2 = Component2;
+      result = render2.length > 1 ? render2(props, { attrs, slots, emit: emit2 }) : render2(
+        props,
+        null
+        /* we know it doesn't need it */
+      );
+    }
+  } catch (err) {
+    handleError(
+      err,
+      instance,
+      1
+      /* ErrorCodes.RENDER_FUNCTION */
+    );
+    result = false;
+  }
+  setRef$1(instance);
+  setCurrentRenderingInstance(prev);
+  return result;
+}
+function fallthroughAttrs(inheritAttrs, props, propsOptions, fallthroughAttrs2) {
+  if (props && fallthroughAttrs2 && inheritAttrs !== false) {
+    const keys = Object.keys(fallthroughAttrs2).filter((key) => key !== "class" && key !== "style");
+    if (!keys.length) {
+      return;
+    }
+    if (propsOptions && keys.some(isModelListener)) {
+      keys.forEach((key) => {
+        if (!isModelListener(key) || !(key.slice(9) in propsOptions)) {
+          props[key] = fallthroughAttrs2[key];
+        }
+      });
+    } else {
+      keys.forEach((key) => props[key] = fallthroughAttrs2[key]);
+    }
+  }
+}
+const updateComponentPreRender = (instance) => {
+  pauseTracking();
+  flushPreFlushCbs();
+  resetTracking();
+};
+function componentUpdateScopedSlotsFn() {
+  const scopedSlotsData = this.$scopedSlotsData;
+  if (!scopedSlotsData || scopedSlotsData.length === 0) {
+    return;
+  }
+  const mpInstance = this.ctx.$scope;
+  const oldData = mpInstance.data;
+  const diffData = /* @__PURE__ */ Object.create(null);
+  scopedSlotsData.forEach(({ path, index: index2, data }) => {
+    const oldScopedSlotData = getValueByDataPath(oldData, path);
+    const diffPath = isString(index2) ? `${path}.${index2}` : `${path}[${index2}]`;
+    if (typeof oldScopedSlotData === "undefined" || typeof oldScopedSlotData[index2] === "undefined") {
+      diffData[diffPath] = data;
+    } else {
+      const diffScopedSlotData = diff(data, oldScopedSlotData[index2]);
+      Object.keys(diffScopedSlotData).forEach((name) => {
+        diffData[diffPath + "." + name] = diffScopedSlotData[name];
+      });
+    }
+  });
+  scopedSlotsData.length = 0;
+  if (Object.keys(diffData).length) {
+    mpInstance.setData(diffData);
+  }
+}
+function toggleRecurse({ effect, update }, allowed) {
+  effect.allowRecurse = update.allowRecurse = allowed;
+}
+function setupRenderEffect(instance) {
+  const updateScopedSlots = componentUpdateScopedSlotsFn.bind(instance);
+  instance.$updateScopedSlots = () => nextTick$1(() => queueJob(updateScopedSlots));
+  const componentUpdateFn = () => {
+    if (!instance.isMounted) {
+      onBeforeUnmount(() => {
+        setRef$1(instance, true);
+      }, instance);
+      {
+        startMeasure(instance, `patch`);
+      }
+      patch(instance, renderComponentRoot(instance));
+      {
+        endMeasure(instance, `patch`);
+      }
+      {
+        devtoolsComponentAdded(instance);
+      }
+    } else {
+      const { next, bu, u } = instance;
+      {
+        pushWarningContext(next || instance.vnode);
+      }
+      toggleRecurse(instance, false);
+      updateComponentPreRender();
+      if (bu) {
+        invokeArrayFns$1(bu);
+      }
+      toggleRecurse(instance, true);
+      {
+        startMeasure(instance, `patch`);
+      }
+      patch(instance, renderComponentRoot(instance));
+      {
+        endMeasure(instance, `patch`);
+      }
+      if (u) {
+        queuePostRenderEffect(u);
+      }
+      {
+        devtoolsComponentUpdated(instance);
+      }
+      {
+        popWarningContext();
+      }
+    }
+  };
+  const effect = instance.effect = new ReactiveEffect(
+    componentUpdateFn,
+    () => queueJob(instance.update),
+    instance.scope
+    // track it in component's effect scope
+  );
+  const update = instance.update = effect.run.bind(effect);
+  update.id = instance.uid;
+  toggleRecurse(instance, true);
+  {
+    effect.onTrack = instance.rtc ? (e2) => invokeArrayFns$1(instance.rtc, e2) : void 0;
+    effect.onTrigger = instance.rtg ? (e2) => invokeArrayFns$1(instance.rtg, e2) : void 0;
+    update.ownerInstance = instance;
+  }
+  update();
+}
+function unmountComponent(instance) {
+  const { bum, scope, update, um } = instance;
+  if (bum) {
+    invokeArrayFns$1(bum);
+  }
+  scope.stop();
+  if (update) {
+    update.active = false;
+  }
+  if (um) {
+    queuePostRenderEffect(um);
+  }
+  queuePostRenderEffect(() => {
+    instance.isUnmounted = true;
+  });
+  {
+    devtoolsComponentRemoved(instance);
+  }
+}
+const oldCreateApp = createAppAPI();
+function getTarget() {
+  if (typeof window !== "undefined") {
+    return window;
+  }
+  if (typeof globalThis !== "undefined") {
+    return globalThis;
+  }
+  if (typeof global !== "undefined") {
+    return global;
+  }
+  if (typeof my !== "undefined") {
+    return my;
+  }
+}
+function createVueApp(rootComponent, rootProps = null) {
+  const target = getTarget();
+  target.__VUE__ = true;
+  {
+    setDevtoolsHook(target.__VUE_DEVTOOLS_GLOBAL_HOOK__, target);
+  }
+  const app = oldCreateApp(rootComponent, rootProps);
+  const appContext = app._context;
+  initAppConfig(appContext.config);
+  const createVNode = (initialVNode) => {
+    initialVNode.appContext = appContext;
+    initialVNode.shapeFlag = 6;
+    return initialVNode;
+  };
+  const createComponent2 = function createComponent3(initialVNode, options) {
+    return mountComponent(createVNode(initialVNode), options);
+  };
+  const destroyComponent = function destroyComponent2(component) {
+    return component && unmountComponent(component.$);
+  };
+  app.mount = function mount() {
+    rootComponent.render = NOOP;
+    const instance = mountComponent(createVNode({ type: rootComponent }), {
+      mpType: MPType.APP,
+      mpInstance: null,
+      parentComponent: null,
+      slots: [],
+      props: null
+    });
+    app._instance = instance.$;
+    {
+      devtoolsInitApp(app, version);
+    }
+    instance.$app = app;
+    instance.$createComponent = createComponent2;
+    instance.$destroyComponent = destroyComponent;
+    appContext.$appInstance = instance;
+    return instance;
+  };
+  app.unmount = function unmount() {
+    warn(`Cannot unmount an app.`);
+  };
+  return app;
+}
+function injectLifecycleHook(name, hook, publicThis, instance) {
+  if (isFunction(hook)) {
+    injectHook(name, hook.bind(publicThis), instance);
+  }
+}
+function initHooks$1(options, instance, publicThis) {
+  const mpType = options.mpType || publicThis.$mpType;
+  if (!mpType || mpType === "component") {
+    return;
+  }
+  Object.keys(options).forEach((name) => {
+    if (isUniLifecycleHook(name, options[name], false)) {
+      const hooks = options[name];
+      if (isArray(hooks)) {
+        hooks.forEach((hook) => injectLifecycleHook(name, hook, publicThis, instance));
+      } else {
+        injectLifecycleHook(name, hooks, publicThis, instance);
+      }
+    }
+  });
+}
+function applyOptions$2(options, instance, publicThis) {
+  initHooks$1(options, instance, publicThis);
+}
+function set$3(target, key, val) {
+  return target[key] = val;
+}
+function $callMethod(method, ...args) {
+  const fn = this[method];
+  if (fn) {
+    return fn(...args);
+  }
+  console.error(`method ${method} not found`);
+  return null;
+}
+function createErrorHandler(app) {
+  return function errorHandler(err, instance, _info) {
+    if (!instance) {
+      throw err;
+    }
+    const appInstance = app._instance;
+    if (!appInstance || !appInstance.proxy) {
+      throw err;
+    }
+    {
+      appInstance.proxy.$callHook(ON_ERROR, err);
+    }
+  };
+}
+function mergeAsArray(to, from) {
+  return to ? [...new Set([].concat(to, from))] : from;
+}
+function initOptionMergeStrategies(optionMergeStrategies) {
+  UniLifecycleHooks.forEach((name) => {
+    optionMergeStrategies[name] = mergeAsArray;
+  });
+}
+let realAtob;
+const b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
+const b64re = /^(?:[A-Za-z\d+/]{4})*?(?:[A-Za-z\d+/]{2}(?:==)?|[A-Za-z\d+/]{3}=?)?$/;
+if (typeof atob !== "function") {
+  realAtob = function(str) {
+    str = String(str).replace(/[\t\n\f\r ]+/g, "");
+    if (!b64re.test(str)) {
+      throw new Error("Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded.");
+    }
+    str += "==".slice(2 - (str.length & 3));
+    var bitmap;
+    var result = "";
+    var r1;
+    var r2;
+    var i = 0;
+    for (; i < str.length; ) {
+      bitmap = b64.indexOf(str.charAt(i++)) << 18 | b64.indexOf(str.charAt(i++)) << 12 | (r1 = b64.indexOf(str.charAt(i++))) << 6 | (r2 = b64.indexOf(str.charAt(i++)));
+      result += r1 === 64 ? String.fromCharCode(bitmap >> 16 & 255) : r2 === 64 ? String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255) : String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255, bitmap & 255);
+    }
+    return result;
+  };
+} else {
+  realAtob = atob;
+}
+function b64DecodeUnicode(str) {
+  return decodeURIComponent(realAtob(str).split("").map(function(c) {
+    return "%" + ("00" + c.charCodeAt(0).toString(16)).slice(-2);
+  }).join(""));
+}
+function getCurrentUserInfo() {
+  const token = index.getStorageSync("uni_id_token") || "";
+  const tokenArr = token.split(".");
+  if (!token || tokenArr.length !== 3) {
+    return {
+      uid: null,
+      role: [],
+      permission: [],
+      tokenExpired: 0
+    };
+  }
+  let userInfo;
+  try {
+    userInfo = JSON.parse(b64DecodeUnicode(tokenArr[1]));
+  } catch (error) {
+    throw new Error("获取当前用户信息出错,详细错误信息为:" + error.message);
+  }
+  userInfo.tokenExpired = userInfo.exp * 1e3;
+  delete userInfo.exp;
+  delete userInfo.iat;
+  return userInfo;
+}
+function uniIdMixin(globalProperties) {
+  globalProperties.uniIDHasRole = function(roleId) {
+    const { role } = getCurrentUserInfo();
+    return role.indexOf(roleId) > -1;
+  };
+  globalProperties.uniIDHasPermission = function(permissionId) {
+    const { permission } = getCurrentUserInfo();
+    return this.uniIDHasRole("admin") || permission.indexOf(permissionId) > -1;
+  };
+  globalProperties.uniIDTokenValid = function() {
+    const { tokenExpired } = getCurrentUserInfo();
+    return tokenExpired > Date.now();
+  };
+}
+function initApp(app) {
+  const appConfig = app._context.config;
+  appConfig.errorHandler = invokeCreateErrorHandler(app, createErrorHandler);
+  initOptionMergeStrategies(appConfig.optionMergeStrategies);
+  const globalProperties = appConfig.globalProperties;
+  {
+    uniIdMixin(globalProperties);
+  }
+  {
+    globalProperties.$set = set$3;
+    globalProperties.$applyOptions = applyOptions$2;
+    globalProperties.$callMethod = $callMethod;
+  }
+  {
+    index.invokeCreateVueAppHook(app);
+  }
+}
+const propsCaches = /* @__PURE__ */ Object.create(null);
+function renderProps(props) {
+  const { uid: uid2, __counter } = getCurrentInstance();
+  const propsId = (propsCaches[uid2] || (propsCaches[uid2] = [])).push(guardReactiveProps(props)) - 1;
+  return uid2 + "," + propsId + "," + __counter;
+}
+function pruneComponentPropsCache(uid2) {
+  delete propsCaches[uid2];
+}
+function findComponentPropsData(up) {
+  if (!up) {
+    return;
+  }
+  const [uid2, propsId] = up.split(",");
+  if (!propsCaches[uid2]) {
+    return;
+  }
+  return propsCaches[uid2][parseInt(propsId)];
+}
+var plugin = {
+  install(app) {
+    initApp(app);
+    app.config.globalProperties.pruneComponentPropsCache = pruneComponentPropsCache;
+    const oldMount = app.mount;
+    app.mount = function mount(rootContainer) {
+      const instance = oldMount.call(app, rootContainer);
+      const createApp2 = getCreateApp();
+      if (createApp2) {
+        createApp2(instance);
+      } else {
+        if (typeof createMiniProgramApp !== "undefined") {
+          createMiniProgramApp(instance);
+        }
+      }
+      return instance;
+    };
+  }
+};
+function getCreateApp() {
+  const method = "createApp";
+  if (typeof global !== "undefined" && typeof global[method] !== "undefined") {
+    return global[method];
+  } else if (typeof my !== "undefined") {
+    return my[method];
+  }
+}
+function vOn(value, key) {
+  const instance = getCurrentInstance();
+  const ctx = instance.ctx;
+  const extraKey = typeof key !== "undefined" && (ctx.$mpPlatform === "mp-weixin" || ctx.$mpPlatform === "mp-qq") && (isString(key) || typeof key === "number") ? "_" + key : "";
+  const name = "e" + instance.$ei++ + extraKey;
+  const mpInstance = ctx.$scope;
+  if (!value) {
+    delete mpInstance[name];
+    return name;
+  }
+  const existingInvoker = mpInstance[name];
+  if (existingInvoker) {
+    existingInvoker.value = value;
+  } else {
+    mpInstance[name] = createInvoker(value, instance);
+  }
+  return name;
+}
+function createInvoker(initialValue, instance) {
+  const invoker = (e2) => {
+    patchMPEvent(e2);
+    let args = [e2];
+    if (e2.detail && e2.detail.__args__) {
+      args = e2.detail.__args__;
+    }
+    const eventValue = invoker.value;
+    const invoke = () => callWithAsyncErrorHandling(patchStopImmediatePropagation(e2, eventValue), instance, 5, args);
+    const eventTarget = e2.target;
+    const eventSync = eventTarget ? eventTarget.dataset ? String(eventTarget.dataset.eventsync) === "true" : false : false;
+    if (bubbles.includes(e2.type) && !eventSync) {
+      setTimeout(invoke);
+    } else {
+      const res = invoke();
+      if (e2.type === "input" && (isArray(res) || isPromise(res))) {
+        return;
+      }
+      return res;
+    }
+  };
+  invoker.value = initialValue;
+  return invoker;
+}
+const bubbles = [
+  // touch事件暂不做延迟,否则在 Android 上会影响性能,比如一些拖拽跟手手势等
+  // 'touchstart',
+  // 'touchmove',
+  // 'touchcancel',
+  // 'touchend',
+  "tap",
+  "longpress",
+  "longtap",
+  "transitionend",
+  "animationstart",
+  "animationiteration",
+  "animationend",
+  "touchforcechange"
+];
+function patchMPEvent(event) {
+  if (event.type && event.target) {
+    event.preventDefault = NOOP;
+    event.stopPropagation = NOOP;
+    event.stopImmediatePropagation = NOOP;
+    if (!hasOwn(event, "detail")) {
+      event.detail = {};
+    }
+    if (hasOwn(event, "markerId")) {
+      event.detail = typeof event.detail === "object" ? event.detail : {};
+      event.detail.markerId = event.markerId;
+    }
+    if (isPlainObject$1(event.detail) && hasOwn(event.detail, "checked") && !hasOwn(event.detail, "value")) {
+      event.detail.value = event.detail.checked;
+    }
+    if (isPlainObject$1(event.detail)) {
+      event.target = extend({}, event.target, event.detail);
+    }
+  }
+}
+function patchStopImmediatePropagation(e2, value) {
+  if (isArray(value)) {
+    const originalStop = e2.stopImmediatePropagation;
+    e2.stopImmediatePropagation = () => {
+      originalStop && originalStop.call(e2);
+      e2._stopped = true;
+    };
+    return value.map((fn) => (e3) => !e3._stopped && fn(e3));
+  } else {
+    return value;
+  }
+}
+function vFor(source, renderItem) {
+  let ret;
+  if (isArray(source) || isString(source)) {
+    ret = new Array(source.length);
+    for (let i = 0, l = source.length; i < l; i++) {
+      ret[i] = renderItem(source[i], i, i);
+    }
+  } else if (typeof source === "number") {
+    if (!Number.isInteger(source)) {
+      warn(`The v-for range expect an integer value but got ${source}.`);
+      return [];
+    }
+    ret = new Array(source);
+    for (let i = 0; i < source; i++) {
+      ret[i] = renderItem(i + 1, i, i);
+    }
+  } else if (isObject(source)) {
+    if (source[Symbol.iterator]) {
+      ret = Array.from(source, (item, i) => renderItem(item, i, i));
+    } else {
+      const keys = Object.keys(source);
+      ret = new Array(keys.length);
+      for (let i = 0, l = keys.length; i < l; i++) {
+        const key = keys[i];
+        ret[i] = renderItem(source[key], key, i);
+      }
+    }
+  } else {
+    ret = [];
+  }
+  return ret;
+}
+function stringifyStyle(value) {
+  if (isString(value)) {
+    return value;
+  }
+  return stringify(normalizeStyle(value));
+}
+function stringify(styles) {
+  let ret = "";
+  if (!styles || isString(styles)) {
+    return ret;
+  }
+  for (const key in styles) {
+    ret += `${key.startsWith(`--`) ? key : hyphenate(key)}:${styles[key]};`;
+  }
+  return ret;
+}
+function setRef(ref2, id, opts = {}) {
+  const { $templateRefs } = getCurrentInstance();
+  $templateRefs.push({ i: id, r: ref2, k: opts.k, f: opts.f });
+}
+const o = (value, key) => vOn(value, key);
+const f = (source, renderItem) => vFor(source, renderItem);
+const s = (value) => stringifyStyle(value);
+const e = (target, ...sources) => extend(target, ...sources);
+const n = (value) => normalizeClass(value);
+const t = (val) => toDisplayString(val);
+const p = (props) => renderProps(props);
+const sr = (ref2, id, opts) => setRef(ref2, id, opts);
+function createApp$1(rootComponent, rootProps = null) {
+  rootComponent && (rootComponent.mpType = "app");
+  return createVueApp(rootComponent, rootProps).use(plugin);
+}
+const createSSRApp = createApp$1;
+const MP_METHODS = [
+  "createSelectorQuery",
+  "createIntersectionObserver",
+  "selectAllComponents",
+  "selectComponent"
+];
+function createEmitFn(oldEmit, ctx) {
+  return function emit2(event, ...args) {
+    const scope = ctx.$scope;
+    if (scope && event) {
+      const detail = { __args__: args };
+      {
+        scope.triggerEvent(event, detail);
+      }
+    }
+    return oldEmit.apply(this, [event, ...args]);
+  };
+}
+function initBaseInstance(instance, options) {
+  const ctx = instance.ctx;
+  ctx.mpType = options.mpType;
+  ctx.$mpType = options.mpType;
+  ctx.$mpPlatform = "mp-weixin";
+  ctx.$scope = options.mpInstance;
+  ctx.$mp = {};
+  {
+    ctx._self = {};
+  }
+  instance.slots = {};
+  if (isArray(options.slots) && options.slots.length) {
+    options.slots.forEach((name) => {
+      instance.slots[name] = true;
+    });
+    if (instance.slots[SLOT_DEFAULT_NAME]) {
+      instance.slots.default = true;
+    }
+  }
+  ctx.getOpenerEventChannel = function() {
+    {
+      return options.mpInstance.getOpenerEventChannel();
+    }
+  };
+  ctx.$hasHook = hasHook;
+  ctx.$callHook = callHook;
+  instance.emit = createEmitFn(instance.emit, ctx);
+}
+function initComponentInstance(instance, options) {
+  initBaseInstance(instance, options);
+  const ctx = instance.ctx;
+  MP_METHODS.forEach((method) => {
+    ctx[method] = function(...args) {
+      const mpInstance = ctx.$scope;
+      if (mpInstance && mpInstance[method]) {
+        return mpInstance[method].apply(mpInstance, args);
+      }
+    };
+  });
+}
+function initMocks(instance, mpInstance, mocks2) {
+  const ctx = instance.ctx;
+  mocks2.forEach((mock) => {
+    if (hasOwn(mpInstance, mock)) {
+      instance[mock] = ctx[mock] = mpInstance[mock];
+    }
+  });
+}
+function hasHook(name) {
+  const hooks = this.$[name];
+  if (hooks && hooks.length) {
+    return true;
+  }
+  return false;
+}
+function callHook(name, args) {
+  if (name === "mounted") {
+    callHook.call(this, "bm");
+    this.$.isMounted = true;
+    name = "m";
+  }
+  const hooks = this.$[name];
+  return hooks && invokeArrayFns(hooks, args);
+}
+const PAGE_INIT_HOOKS = [
+  ON_LOAD,
+  ON_SHOW,
+  ON_HIDE,
+  ON_UNLOAD,
+  ON_RESIZE,
+  ON_TAB_ITEM_TAP,
+  ON_REACH_BOTTOM,
+  ON_PULL_DOWN_REFRESH,
+  ON_ADD_TO_FAVORITES
+  // 'onReady', // lifetimes.ready
+  // 'onPageScroll', // 影响性能,开发者手动注册
+  // 'onShareTimeline', // 右上角菜单,开发者手动注册
+  // 'onShareAppMessage' // 右上角菜单,开发者手动注册
+];
+function findHooks(vueOptions, hooks = /* @__PURE__ */ new Set()) {
+  if (vueOptions) {
+    Object.keys(vueOptions).forEach((name) => {
+      if (isUniLifecycleHook(name, vueOptions[name])) {
+        hooks.add(name);
+      }
+    });
+    {
+      const { extends: extendsOptions, mixins } = vueOptions;
+      if (mixins) {
+        mixins.forEach((mixin) => findHooks(mixin, hooks));
+      }
+      if (extendsOptions) {
+        findHooks(extendsOptions, hooks);
+      }
+    }
+  }
+  return hooks;
+}
+function initHook(mpOptions, hook, excludes) {
+  if (excludes.indexOf(hook) === -1 && !hasOwn(mpOptions, hook)) {
+    mpOptions[hook] = function(args) {
+      return this.$vm && this.$vm.$callHook(hook, args);
+    };
+  }
+}
+const EXCLUDE_HOOKS = [ON_READY];
+function initHooks(mpOptions, hooks, excludes = EXCLUDE_HOOKS) {
+  hooks.forEach((hook) => initHook(mpOptions, hook, excludes));
+}
+function initUnknownHooks(mpOptions, vueOptions, excludes = EXCLUDE_HOOKS) {
+  findHooks(vueOptions).forEach((hook) => initHook(mpOptions, hook, excludes));
+}
+function initRuntimeHooks(mpOptions, runtimeHooks) {
+  if (!runtimeHooks) {
+    return;
+  }
+  const hooks = Object.keys(MINI_PROGRAM_PAGE_RUNTIME_HOOKS);
+  hooks.forEach((hook) => {
+    if (runtimeHooks & MINI_PROGRAM_PAGE_RUNTIME_HOOKS[hook]) {
+      initHook(mpOptions, hook, []);
+    }
+  });
+}
+const findMixinRuntimeHooks = /* @__PURE__ */ once(() => {
+  const runtimeHooks = [];
+  const app = isFunction(getApp) && getApp({ allowDefault: true });
+  if (app && app.$vm && app.$vm.$) {
+    const mixins = app.$vm.$.appContext.mixins;
+    if (isArray(mixins)) {
+      const hooks = Object.keys(MINI_PROGRAM_PAGE_RUNTIME_HOOKS);
+      mixins.forEach((mixin) => {
+        hooks.forEach((hook) => {
+          if (hasOwn(mixin, hook) && !runtimeHooks.includes(hook)) {
+            runtimeHooks.push(hook);
+          }
+        });
+      });
+    }
+  }
+  return runtimeHooks;
+});
+function initMixinRuntimeHooks(mpOptions) {
+  initHooks(mpOptions, findMixinRuntimeHooks());
+}
+const HOOKS = [
+  ON_SHOW,
+  ON_HIDE,
+  ON_ERROR,
+  ON_THEME_CHANGE,
+  ON_PAGE_NOT_FOUND,
+  ON_UNHANDLE_REJECTION
+];
+function parseApp(instance, parseAppOptions) {
+  const internalInstance = instance.$;
+  const appOptions = {
+    globalData: instance.$options && instance.$options.globalData || {},
+    $vm: instance,
+    onLaunch(options) {
+      this.$vm = instance;
+      const ctx = internalInstance.ctx;
+      if (this.$vm && ctx.$scope) {
+        return;
+      }
+      initBaseInstance(internalInstance, {
+        mpType: "app",
+        mpInstance: this,
+        slots: []
+      });
+      ctx.globalData = this.globalData;
+      instance.$callHook(ON_LAUNCH, options);
+    }
+  };
+  const { onError } = internalInstance;
+  if (onError) {
+    internalInstance.appContext.config.errorHandler = (err) => {
+      instance.$callHook(ON_ERROR, err);
+    };
+  }
+  initLocale(instance);
+  const vueOptions = instance.$.type;
+  initHooks(appOptions, HOOKS);
+  initUnknownHooks(appOptions, vueOptions);
+  {
+    const methods = vueOptions.methods;
+    methods && extend(appOptions, methods);
+  }
+  if (parseAppOptions) {
+    parseAppOptions.parse(appOptions);
+  }
+  return appOptions;
+}
+function initCreateApp(parseAppOptions) {
+  return function createApp2(vm) {
+    return App(parseApp(vm, parseAppOptions));
+  };
+}
+function initCreateSubpackageApp(parseAppOptions) {
+  return function createApp2(vm) {
+    const appOptions = parseApp(vm, parseAppOptions);
+    const app = isFunction(getApp) && getApp({
+      allowDefault: true
+    });
+    if (!app)
+      return;
+    vm.$.ctx.$scope = app;
+    const globalData = app.globalData;
+    if (globalData) {
+      Object.keys(appOptions.globalData).forEach((name) => {
+        if (!hasOwn(globalData, name)) {
+          globalData[name] = appOptions.globalData[name];
+        }
+      });
+    }
+    Object.keys(appOptions).forEach((name) => {
+      if (!hasOwn(app, name)) {
+        app[name] = appOptions[name];
+      }
+    });
+    initAppLifecycle(appOptions, vm);
+  };
+}
+function initAppLifecycle(appOptions, vm) {
+  if (isFunction(appOptions.onLaunch)) {
+    const args = wx.getLaunchOptionsSync && wx.getLaunchOptionsSync();
+    appOptions.onLaunch(args);
+  }
+  if (isFunction(appOptions.onShow) && wx.onAppShow) {
+    wx.onAppShow((args) => {
+      vm.$callHook("onShow", args);
+    });
+  }
+  if (isFunction(appOptions.onHide) && wx.onAppHide) {
+    wx.onAppHide((args) => {
+      vm.$callHook("onHide", args);
+    });
+  }
+}
+function initLocale(appVm) {
+  const locale = ref(normalizeLocale(wx.getSystemInfoSync().language) || LOCALE_EN);
+  Object.defineProperty(appVm, "$locale", {
+    get() {
+      return locale.value;
+    },
+    set(v) {
+      locale.value = v;
+    }
+  });
+}
+function initVueIds(vueIds, mpInstance) {
+  if (!vueIds) {
+    return;
+  }
+  const ids = vueIds.split(",");
+  const len = ids.length;
+  if (len === 1) {
+    mpInstance._$vueId = ids[0];
+  } else if (len === 2) {
+    mpInstance._$vueId = ids[0];
+    mpInstance._$vuePid = ids[1];
+  }
+}
+const EXTRAS = ["externalClasses"];
+function initExtraOptions(miniProgramComponentOptions, vueOptions) {
+  EXTRAS.forEach((name) => {
+    if (hasOwn(vueOptions, name)) {
+      miniProgramComponentOptions[name] = vueOptions[name];
+    }
+  });
+}
+const WORKLET_RE = /_(.*)_worklet_factory_/;
+function initWorkletMethods(mpMethods, vueMethods) {
+  if (vueMethods) {
+    Object.keys(vueMethods).forEach((name) => {
+      const matches = name.match(WORKLET_RE);
+      if (matches) {
+        const workletName = matches[1];
+        mpMethods[name] = vueMethods[name];
+        mpMethods[workletName] = vueMethods[workletName];
+      }
+    });
+  }
+}
+function initWxsCallMethods(methods, wxsCallMethods) {
+  if (!isArray(wxsCallMethods)) {
+    return;
+  }
+  wxsCallMethods.forEach((callMethod) => {
+    methods[callMethod] = function(args) {
+      return this.$vm[callMethod](args);
+    };
+  });
+}
+function selectAllComponents(mpInstance, selector, $refs) {
+  const components = mpInstance.selectAllComponents(selector);
+  components.forEach((component) => {
+    const ref2 = component.properties.uR;
+    $refs[ref2] = component.$vm || component;
+  });
+}
+function initRefs(instance, mpInstance) {
+  Object.defineProperty(instance, "refs", {
+    get() {
+      const $refs = {};
+      selectAllComponents(mpInstance, ".r", $refs);
+      const forComponents = mpInstance.selectAllComponents(".r-i-f");
+      forComponents.forEach((component) => {
+        const ref2 = component.properties.uR;
+        if (!ref2) {
+          return;
+        }
+        if (!$refs[ref2]) {
+          $refs[ref2] = [];
+        }
+        $refs[ref2].push(component.$vm || component);
+      });
+      return $refs;
+    }
+  });
+}
+function findVmByVueId(instance, vuePid) {
+  const $children = instance.$children;
+  for (let i = $children.length - 1; i >= 0; i--) {
+    const childVm = $children[i];
+    if (childVm.$scope._$vueId === vuePid) {
+      return childVm;
+    }
+  }
+  let parentVm;
+  for (let i = $children.length - 1; i >= 0; i--) {
+    parentVm = findVmByVueId($children[i], vuePid);
+    if (parentVm) {
+      return parentVm;
+    }
+  }
+}
+const builtInProps = [
+  // 百度小程序,快手小程序自定义组件不支持绑定动态事件,动态dataset,故通过props传递事件信息
+  // event-opts
+  "eO",
+  // 组件 ref
+  "uR",
+  // 组件 ref-in-for
+  "uRIF",
+  // 组件 id
+  "uI",
+  // 组件类型 m: 小程序组件
+  "uT",
+  // 组件 props
+  "uP",
+  // 小程序不能直接定义 $slots 的 props,所以通过 vueSlots 转换到 $slots
+  "uS"
+];
+function initDefaultProps(options, isBehavior = false) {
+  const properties = {};
+  if (!isBehavior) {
+    builtInProps.forEach((name) => {
+      properties[name] = {
+        type: null,
+        value: ""
+      };
+    });
+    properties.uS = {
+      type: null,
+      value: [],
+      observer: function(newVal) {
+        const $slots = /* @__PURE__ */ Object.create(null);
+        newVal && newVal.forEach((slotName) => {
+          $slots[slotName] = true;
+        });
+        this.setData({
+          $slots
+        });
+      }
+    };
+  }
+  if (options.behaviors) {
+    if (options.behaviors.includes("wx://form-field")) {
+      if (!options.properties || !options.properties.name) {
+        properties.name = {
+          type: null,
+          value: ""
+        };
+      }
+      if (!options.properties || !options.properties.value) {
+        properties.value = {
+          type: null,
+          value: ""
+        };
+      }
+    }
+  }
+  return properties;
+}
+function initVirtualHostProps(options) {
+  const properties = {};
+  {
+    if (options && options.virtualHost) {
+      properties.virtualHostStyle = {
+        type: null,
+        value: ""
+      };
+      properties.virtualHostClass = {
+        type: null,
+        value: ""
+      };
+    }
+  }
+  return properties;
+}
+function initProps(mpComponentOptions) {
+  if (!mpComponentOptions.properties) {
+    mpComponentOptions.properties = {};
+  }
+  extend(mpComponentOptions.properties, initDefaultProps(mpComponentOptions), initVirtualHostProps(mpComponentOptions.options));
+}
+const PROP_TYPES = [String, Number, Boolean, Object, Array, null];
+function parsePropType(type, defaultValue) {
+  if (isArray(type) && type.length === 1) {
+    return type[0];
+  }
+  return type;
+}
+function normalizePropType(type, defaultValue) {
+  const res = parsePropType(type);
+  return PROP_TYPES.indexOf(res) !== -1 ? res : null;
+}
+function initPageProps({ properties }, rawProps) {
+  if (isArray(rawProps)) {
+    rawProps.forEach((key) => {
+      properties[key] = {
+        type: String,
+        value: ""
+      };
+    });
+  } else if (isPlainObject$1(rawProps)) {
+    Object.keys(rawProps).forEach((key) => {
+      const opts = rawProps[key];
+      if (isPlainObject$1(opts)) {
+        let value = opts.default;
+        if (isFunction(value)) {
+          value = value();
+        }
+        const type = opts.type;
+        opts.type = normalizePropType(type);
+        properties[key] = {
+          type: opts.type,
+          value
+        };
+      } else {
+        properties[key] = {
+          type: normalizePropType(opts)
+        };
+      }
+    });
+  }
+}
+function findPropsData(properties, isPage2) {
+  return (isPage2 ? findPagePropsData(properties) : findComponentPropsData(properties.uP)) || {};
+}
+function findPagePropsData(properties) {
+  const propsData = {};
+  if (isPlainObject$1(properties)) {
+    Object.keys(properties).forEach((name) => {
+      if (builtInProps.indexOf(name) === -1) {
+        propsData[name] = properties[name];
+      }
+    });
+  }
+  return propsData;
+}
+function initFormField(vm) {
+  const vueOptions = vm.$options;
+  if (isArray(vueOptions.behaviors) && vueOptions.behaviors.includes("uni://form-field")) {
+    vm.$watch("modelValue", () => {
+      vm.$scope && vm.$scope.setData({
+        name: vm.name,
+        value: vm.modelValue
+      });
+    }, {
+      immediate: true
+    });
+  }
+}
+function initData(_) {
+  return {};
+}
+function initPropsObserver(componentOptions) {
+  const observe = function observe2() {
+    const up = this.properties.uP;
+    if (!up) {
+      return;
+    }
+    if (this.$vm) {
+      updateComponentProps(up, this.$vm.$);
+    } else if (this.properties.uT === "m") {
+      updateMiniProgramComponentProperties(up, this);
+    }
+  };
+  {
+    if (!componentOptions.observers) {
+      componentOptions.observers = {};
+    }
+    componentOptions.observers.uP = observe;
+  }
+}
+function updateMiniProgramComponentProperties(up, mpInstance) {
+  const prevProps = mpInstance.properties;
+  const nextProps = findComponentPropsData(up) || {};
+  if (hasPropsChanged(prevProps, nextProps, false)) {
+    mpInstance.setData(nextProps);
+  }
+}
+function updateComponentProps(up, instance) {
+  const prevProps = toRaw(instance.props);
+  const nextProps = findComponentPropsData(up) || {};
+  if (hasPropsChanged(prevProps, nextProps)) {
+    updateProps(instance, nextProps, prevProps, false);
+    if (hasQueueJob(instance.update)) {
+      invalidateJob(instance.update);
+    }
+    {
+      instance.update();
+    }
+  }
+}
+function hasPropsChanged(prevProps, nextProps, checkLen = true) {
+  const nextKeys = Object.keys(nextProps);
+  if (checkLen && nextKeys.length !== Object.keys(prevProps).length) {
+    return true;
+  }
+  for (let i = 0; i < nextKeys.length; i++) {
+    const key = nextKeys[i];
+    if (nextProps[key] !== prevProps[key]) {
+      return true;
+    }
+  }
+  return false;
+}
+function initBehaviors(vueOptions) {
+  const vueBehaviors = vueOptions.behaviors;
+  let vueProps = vueOptions.props;
+  if (!vueProps) {
+    vueOptions.props = vueProps = [];
+  }
+  const behaviors = [];
+  if (isArray(vueBehaviors)) {
+    vueBehaviors.forEach((behavior) => {
+      behaviors.push(behavior.replace("uni://", "wx://"));
+      if (behavior === "uni://form-field") {
+        if (isArray(vueProps)) {
+          vueProps.push("name");
+          vueProps.push("modelValue");
+        } else {
+          vueProps.name = {
+            type: String,
+            default: ""
+          };
+          vueProps.modelValue = {
+            type: [String, Number, Boolean, Array, Object, Date],
+            default: ""
+          };
+        }
+      }
+    });
+  }
+  return behaviors;
+}
+function applyOptions(componentOptions, vueOptions) {
+  componentOptions.data = initData();
+  componentOptions.behaviors = initBehaviors(vueOptions);
+}
+function parseComponent(vueOptions, { parse, mocks: mocks2, isPage: isPage2, initRelation: initRelation2, handleLink: handleLink2, initLifetimes: initLifetimes2 }) {
+  vueOptions = vueOptions.default || vueOptions;
+  const options = {
+    multipleSlots: true,
+    // styleIsolation: 'apply-shared',
+    addGlobalClass: true,
+    pureDataPattern: /^uP$/
+  };
+  if (isArray(vueOptions.mixins)) {
+    vueOptions.mixins.forEach((item) => {
+      if (isObject(item.options)) {
+        extend(options, item.options);
+      }
+    });
+  }
+  if (vueOptions.options) {
+    extend(options, vueOptions.options);
+  }
+  const mpComponentOptions = {
+    options,
+    lifetimes: initLifetimes2({ mocks: mocks2, isPage: isPage2, initRelation: initRelation2, vueOptions }),
+    pageLifetimes: {
+      show() {
+        this.$vm && this.$vm.$callHook("onPageShow");
+      },
+      hide() {
+        this.$vm && this.$vm.$callHook("onPageHide");
+      },
+      resize(size2) {
+        this.$vm && this.$vm.$callHook("onPageResize", size2);
+      }
+    },
+    methods: {
+      __l: handleLink2
+    }
+  };
+  {
+    applyOptions(mpComponentOptions, vueOptions);
+  }
+  initProps(mpComponentOptions);
+  initPropsObserver(mpComponentOptions);
+  initExtraOptions(mpComponentOptions, vueOptions);
+  initWxsCallMethods(mpComponentOptions.methods, vueOptions.wxsCallMethods);
+  {
+    initWorkletMethods(mpComponentOptions.methods, vueOptions.methods);
+  }
+  if (parse) {
+    parse(mpComponentOptions, { handleLink: handleLink2 });
+  }
+  return mpComponentOptions;
+}
+function initCreateComponent(parseOptions2) {
+  return function createComponent2(vueComponentOptions) {
+    return Component(parseComponent(vueComponentOptions, parseOptions2));
+  };
+}
+let $createComponentFn;
+let $destroyComponentFn;
+function getAppVm() {
+  return getApp().$vm;
+}
+function $createComponent(initialVNode, options) {
+  if (!$createComponentFn) {
+    $createComponentFn = getAppVm().$createComponent;
+  }
+  const proxy = $createComponentFn(initialVNode, options);
+  return getExposeProxy(proxy.$) || proxy;
+}
+function $destroyComponent(instance) {
+  if (!$destroyComponentFn) {
+    $destroyComponentFn = getAppVm().$destroyComponent;
+  }
+  return $destroyComponentFn(instance);
+}
+function parsePage(vueOptions, parseOptions2) {
+  const { parse, mocks: mocks2, isPage: isPage2, initRelation: initRelation2, handleLink: handleLink2, initLifetimes: initLifetimes2 } = parseOptions2;
+  const miniProgramPageOptions = parseComponent(vueOptions, {
+    mocks: mocks2,
+    isPage: isPage2,
+    initRelation: initRelation2,
+    handleLink: handleLink2,
+    initLifetimes: initLifetimes2
+  });
+  initPageProps(miniProgramPageOptions, (vueOptions.default || vueOptions).props);
+  const methods = miniProgramPageOptions.methods;
+  methods.onLoad = function(query) {
+    this.options = query;
+    this.$page = {
+      fullPath: addLeadingSlash(this.route + stringifyQuery(query))
+    };
+    return this.$vm && this.$vm.$callHook(ON_LOAD, query);
+  };
+  initHooks(methods, PAGE_INIT_HOOKS);
+  {
+    initUnknownHooks(methods, vueOptions);
+  }
+  initRuntimeHooks(methods, vueOptions.__runtimeHooks);
+  initMixinRuntimeHooks(methods);
+  parse && parse(miniProgramPageOptions, { handleLink: handleLink2 });
+  return miniProgramPageOptions;
+}
+function initCreatePage(parseOptions2) {
+  return function createPage2(vuePageOptions) {
+    return Component(parsePage(vuePageOptions, parseOptions2));
+  };
+}
+function initCreatePluginApp(parseAppOptions) {
+  return function createApp2(vm) {
+    initAppLifecycle(parseApp(vm, parseAppOptions), vm);
+  };
+}
+const MPPage = Page;
+const MPComponent = Component;
+function initTriggerEvent(mpInstance) {
+  const oldTriggerEvent = mpInstance.triggerEvent;
+  const newTriggerEvent = function(event, ...args) {
+    return oldTriggerEvent.apply(mpInstance, [customizeEvent(event), ...args]);
+  };
+  try {
+    mpInstance.triggerEvent = newTriggerEvent;
+  } catch (error) {
+    mpInstance._triggerEvent = newTriggerEvent;
+  }
+}
+function initMiniProgramHook(name, options, isComponent) {
+  const oldHook = options[name];
+  if (!oldHook) {
+    options[name] = function() {
+      initTriggerEvent(this);
+    };
+  } else {
+    options[name] = function(...args) {
+      initTriggerEvent(this);
+      return oldHook.apply(this, args);
+    };
+  }
+}
+Page = function(options) {
+  initMiniProgramHook(ON_LOAD, options);
+  return MPPage(options);
+};
+Component = function(options) {
+  initMiniProgramHook("created", options);
+  const isVueComponent = options.properties && options.properties.uP;
+  if (!isVueComponent) {
+    initProps(options);
+    initPropsObserver(options);
+  }
+  return MPComponent(options);
+};
+function initLifetimes({ mocks: mocks2, isPage: isPage2, initRelation: initRelation2, vueOptions }) {
+  return {
+    attached() {
+      let properties = this.properties;
+      initVueIds(properties.uI, this);
+      const relationOptions = {
+        vuePid: this._$vuePid
+      };
+      initRelation2(this, relationOptions);
+      const mpInstance = this;
+      const isMiniProgramPage = isPage2(mpInstance);
+      let propsData = properties;
+      this.$vm = $createComponent({
+        type: vueOptions,
+        props: findPropsData(propsData, isMiniProgramPage)
+      }, {
+        mpType: isMiniProgramPage ? "page" : "component",
+        mpInstance,
+        slots: properties.uS || {},
+        parentComponent: relationOptions.parent && relationOptions.parent.$,
+        onBeforeSetup(instance, options) {
+          initRefs(instance, mpInstance);
+          initMocks(instance, mpInstance, mocks2);
+          initComponentInstance(instance, options);
+        }
+      });
+      if (!isMiniProgramPage) {
+        initFormField(this.$vm);
+      }
+    },
+    ready() {
+      if (this.$vm) {
+        {
+          this.$vm.$callHook("mounted");
+          this.$vm.$callHook(ON_READY);
+        }
+      }
+    },
+    detached() {
+      if (this.$vm) {
+        pruneComponentPropsCache(this.$vm.$.uid);
+        $destroyComponent(this.$vm);
+      }
+    }
+  };
+}
+const mocks = ["__route__", "__wxExparserNodeId__", "__wxWebviewId__"];
+function isPage(mpInstance) {
+  return !!mpInstance.route;
+}
+function initRelation(mpInstance, detail) {
+  mpInstance.triggerEvent("__l", detail);
+}
+function handleLink(event) {
+  const detail = event.detail || event.value;
+  const vuePid = detail.vuePid;
+  let parentVm;
+  if (vuePid) {
+    parentVm = findVmByVueId(this.$vm, vuePid);
+  }
+  if (!parentVm) {
+    parentVm = this.$vm;
+  }
+  detail.parent = parentVm;
+}
+var parseOptions = /* @__PURE__ */ Object.freeze({
+  __proto__: null,
+  handleLink,
+  initLifetimes,
+  initRelation,
+  isPage,
+  mocks
+});
+const createApp = initCreateApp();
+const createPage = initCreatePage(parseOptions);
+const createComponent = initCreateComponent(parseOptions);
+const createPluginApp = initCreatePluginApp();
+const createSubpackageApp = initCreateSubpackageApp();
+{
+  wx.createApp = global.createApp = createApp;
+  wx.createPage = createPage;
+  wx.createComponent = createComponent;
+  wx.createPluginApp = global.createPluginApp = createPluginApp;
+  wx.createSubpackageApp = global.createSubpackageApp = createSubpackageApp;
+}
+var isVue2 = false;
+function set(target, key, val) {
+  if (Array.isArray(target)) {
+    target.length = Math.max(target.length, key);
+    target.splice(key, 1, val);
+    return val;
+  }
+  target[key] = val;
+  return val;
+}
+function del(target, key) {
+  if (Array.isArray(target)) {
+    target.splice(key, 1);
+    return;
+  }
+  delete target[key];
+}
+/*!
+  * pinia v2.0.33
+  * (c) 2023 Eduardo San Martin Morote
+  * @license MIT
+  */
+let activePinia;
+const setActivePinia = (pinia) => activePinia = pinia;
+const getActivePinia = () => getCurrentInstance() && inject(piniaSymbol) || activePinia;
+const piniaSymbol = Symbol("pinia");
+function isPlainObject(o2) {
+  return o2 && typeof o2 === "object" && Object.prototype.toString.call(o2) === "[object Object]" && typeof o2.toJSON !== "function";
+}
+var MutationType;
+(function(MutationType2) {
+  MutationType2["direct"] = "direct";
+  MutationType2["patchObject"] = "patch object";
+  MutationType2["patchFunction"] = "patch function";
+})(MutationType || (MutationType = {}));
+const IS_CLIENT = typeof window !== "undefined";
+const USE_DEVTOOLS = IS_CLIENT;
+const componentStateTypes = [];
+const getStoreType = (id) => "🍍 " + id;
+function registerPiniaDevtools(app, pinia) {
+}
+function addStoreToDevtools(app, store) {
+  if (!componentStateTypes.includes(getStoreType(store.$id))) {
+    componentStateTypes.push(getStoreType(store.$id));
+  }
+}
+function patchActionForGrouping(store, actionNames) {
+  const actions = actionNames.reduce((storeActions, actionName) => {
+    storeActions[actionName] = toRaw(store)[actionName];
+    return storeActions;
+  }, {});
+  for (const actionName in actions) {
+    store[actionName] = function() {
+      const trackedStore = new Proxy(store, {
+        get(...args) {
+          return Reflect.get(...args);
+        },
+        set(...args) {
+          return Reflect.set(...args);
+        }
+      });
+      return actions[actionName].apply(trackedStore, arguments);
+    };
+  }
+}
+function devtoolsPlugin({ app, store, options }) {
+  if (store.$id.startsWith("__hot:")) {
+    return;
+  }
+  if (options.state) {
+    store._isOptionsAPI = true;
+  }
+  if (typeof options.state === "function") {
+    patchActionForGrouping(
+      // @ts-expect-error: can cast the store...
+      store,
+      Object.keys(options.actions)
+    );
+    const originalHotUpdate = store._hotUpdate;
+    toRaw(store)._hotUpdate = function(newStore) {
+      originalHotUpdate.apply(this, arguments);
+      patchActionForGrouping(store, Object.keys(newStore._hmrPayload.actions));
+    };
+  }
+  addStoreToDevtools(
+    app,
+    // FIXME: is there a way to allow the assignment from Store<Id, S, G, A> to StoreGeneric?
+    store
+  );
+}
+function createPinia() {
+  const scope = effectScope(true);
+  const state = scope.run(() => ref({}));
+  let _p = [];
+  let toBeInstalled = [];
+  const pinia = markRaw({
+    install(app) {
+      setActivePinia(pinia);
+      {
+        pinia._a = app;
+        app.provide(piniaSymbol, pinia);
+        app.config.globalProperties.$pinia = pinia;
+        toBeInstalled.forEach((plugin2) => _p.push(plugin2));
+        toBeInstalled = [];
+      }
+    },
+    use(plugin2) {
+      if (!this._a && !isVue2) {
+        toBeInstalled.push(plugin2);
+      } else {
+        _p.push(plugin2);
+      }
+      return this;
+    },
+    _p,
+    // it's actually undefined here
+    // @ts-expect-error
+    _a: null,
+    _e: scope,
+    _s: /* @__PURE__ */ new Map(),
+    state
+  });
+  if (USE_DEVTOOLS && typeof Proxy !== "undefined") {
+    pinia.use(devtoolsPlugin);
+  }
+  return pinia;
+}
+const isUseStore = (fn) => {
+  return typeof fn === "function" && typeof fn.$id === "string";
+};
+function patchObject(newState, oldState) {
+  for (const key in oldState) {
+    const subPatch = oldState[key];
+    if (!(key in newState)) {
+      continue;
+    }
+    const targetValue = newState[key];
+    if (isPlainObject(targetValue) && isPlainObject(subPatch) && !isRef(subPatch) && !isReactive(subPatch)) {
+      newState[key] = patchObject(targetValue, subPatch);
+    } else {
+      {
+        newState[key] = subPatch;
+      }
+    }
+  }
+  return newState;
+}
+function acceptHMRUpdate(initialUseStore, hot) {
+  return (newModule) => {
+    const pinia = hot.data.pinia || initialUseStore._pinia;
+    if (!pinia) {
+      return;
+    }
+    hot.data.pinia = pinia;
+    for (const exportName in newModule) {
+      const useStore = newModule[exportName];
+      if (isUseStore(useStore) && pinia._s.has(useStore.$id)) {
+        const id = useStore.$id;
+        if (id !== initialUseStore.$id) {
+          console.warn(`The id of the store changed from "${initialUseStore.$id}" to "${id}". Reloading.`);
+          return hot.invalidate();
+        }
+        const existingStore = pinia._s.get(id);
+        if (!existingStore) {
+          console.log(`[Pinia]: skipping hmr because store doesn't exist yet`);
+          return;
+        }
+        useStore(pinia, existingStore);
+      }
+    }
+  };
+}
+const noop = () => {
+};
+function addSubscription(subscriptions, callback, detached, onCleanup = noop) {
+  subscriptions.push(callback);
+  const removeSubscription = () => {
+    const idx = subscriptions.indexOf(callback);
+    if (idx > -1) {
+      subscriptions.splice(idx, 1);
+      onCleanup();
+    }
+  };
+  if (!detached && getCurrentScope()) {
+    onScopeDispose(removeSubscription);
+  }
+  return removeSubscription;
+}
+function triggerSubscriptions(subscriptions, ...args) {
+  subscriptions.slice().forEach((callback) => {
+    callback(...args);
+  });
+}
+function mergeReactiveObjects(target, patchToApply) {
+  if (target instanceof Map && patchToApply instanceof Map) {
+    patchToApply.forEach((value, key) => target.set(key, value));
+  }
+  if (target instanceof Set && patchToApply instanceof Set) {
+    patchToApply.forEach(target.add, target);
+  }
+  for (const key in patchToApply) {
+    if (!patchToApply.hasOwnProperty(key))
+      continue;
+    const subPatch = patchToApply[key];
+    const targetValue = target[key];
+    if (isPlainObject(targetValue) && isPlainObject(subPatch) && target.hasOwnProperty(key) && !isRef(subPatch) && !isReactive(subPatch)) {
+      target[key] = mergeReactiveObjects(targetValue, subPatch);
+    } else {
+      target[key] = subPatch;
+    }
+  }
+  return target;
+}
+const skipHydrateSymbol = Symbol("pinia:skipHydration");
+function skipHydrate(obj) {
+  return Object.defineProperty(obj, skipHydrateSymbol, {});
+}
+function shouldHydrate(obj) {
+  return !isPlainObject(obj) || !obj.hasOwnProperty(skipHydrateSymbol);
+}
+const { assign } = Object;
+function isComputed(o2) {
+  return !!(isRef(o2) && o2.effect);
+}
+function createOptionsStore(id, options, pinia, hot) {
+  const { state, actions, getters } = options;
+  const initialState = pinia.state.value[id];
+  let store;
+  function setup() {
+    if (!initialState && !hot) {
+      {
+        pinia.state.value[id] = state ? state() : {};
+      }
+    }
+    const localState = hot ? (
+      // use ref() to unwrap refs inside state TODO: check if this is still necessary
+      toRefs(ref(state ? state() : {}).value)
+    ) : toRefs(pinia.state.value[id]);
+    return assign(localState, actions, Object.keys(getters || {}).reduce((computedGetters, name) => {
+      if (name in localState) {
+        console.warn(`[🍍]: A getter cannot have the same name as another state property. Rename one of them. Found with "${name}" in store "${id}".`);
+      }
+      computedGetters[name] = markRaw(computed(() => {
+        setActivePinia(pinia);
+        const store2 = pinia._s.get(id);
+        return getters[name].call(store2, store2);
+      }));
+      return computedGetters;
+    }, {}));
+  }
+  store = createSetupStore(id, setup, options, pinia, hot, true);
+  return store;
+}
+function createSetupStore($id, setup, options = {}, pinia, hot, isOptionsStore) {
+  let scope;
+  const optionsForPlugin = assign({ actions: {} }, options);
+  if (!pinia._e.active) {
+    throw new Error("Pinia destroyed");
+  }
+  const $subscribeOptions = {
+    deep: true
+    // flush: 'post',
+  };
+  {
+    $subscribeOptions.onTrigger = (event) => {
+      if (isListening) {
+        debuggerEvents = event;
+      } else if (isListening == false && !store._hotUpdating) {
+        if (Array.isArray(debuggerEvents)) {
+          debuggerEvents.push(event);
+        } else {
+          console.error("🍍 debuggerEvents should be an array. This is most likely an internal Pinia bug.");
+        }
+      }
+    };
+  }
+  let isListening;
+  let isSyncListening;
+  let subscriptions = markRaw([]);
+  let actionSubscriptions = markRaw([]);
+  let debuggerEvents;
+  const initialState = pinia.state.value[$id];
+  if (!isOptionsStore && !initialState && !hot) {
+    {
+      pinia.state.value[$id] = {};
+    }
+  }
+  const hotState = ref({});
+  let activeListener;
+  function $patch(partialStateOrMutator) {
+    let subscriptionMutation;
+    isListening = isSyncListening = false;
+    {
+      debuggerEvents = [];
+    }
+    if (typeof partialStateOrMutator === "function") {
+      partialStateOrMutator(pinia.state.value[$id]);
+      subscriptionMutation = {
+        type: MutationType.patchFunction,
+        storeId: $id,
+        events: debuggerEvents
+      };
+    } else {
+      mergeReactiveObjects(pinia.state.value[$id], partialStateOrMutator);
+      subscriptionMutation = {
+        type: MutationType.patchObject,
+        payload: partialStateOrMutator,
+        storeId: $id,
+        events: debuggerEvents
+      };
+    }
+    const myListenerId = activeListener = Symbol();
+    nextTick$1().then(() => {
+      if (activeListener === myListenerId) {
+        isListening = true;
+      }
+    });
+    isSyncListening = true;
+    triggerSubscriptions(subscriptions, subscriptionMutation, pinia.state.value[$id]);
+  }
+  const $reset = isOptionsStore ? function $reset2() {
+    const { state } = options;
+    const newState = state ? state() : {};
+    this.$patch(($state) => {
+      assign($state, newState);
+    });
+  } : (
+    /* istanbul ignore next */
+    () => {
+      throw new Error(`🍍: Store "${$id}" is built using the setup syntax and does not implement $reset().`);
+    }
+  );
+  function $dispose() {
+    scope.stop();
+    subscriptions = [];
+    actionSubscriptions = [];
+    pinia._s.delete($id);
+  }
+  function wrapAction(name, action) {
+    return function() {
+      setActivePinia(pinia);
+      const args = Array.from(arguments);
+      const afterCallbackList = [];
+      const onErrorCallbackList = [];
+      function after(callback) {
+        afterCallbackList.push(callback);
+      }
+      function onError(callback) {
+        onErrorCallbackList.push(callback);
+      }
+      triggerSubscriptions(actionSubscriptions, {
+        args,
+        name,
+        store,
+        after,
+        onError
+      });
+      let ret;
+      try {
+        ret = action.apply(this && this.$id === $id ? this : store, args);
+      } catch (error) {
+        triggerSubscriptions(onErrorCallbackList, error);
+        throw error;
+      }
+      if (ret instanceof Promise) {
+        return ret.then((value) => {
+          triggerSubscriptions(afterCallbackList, value);
+          return value;
+        }).catch((error) => {
+          triggerSubscriptions(onErrorCallbackList, error);
+          return Promise.reject(error);
+        });
+      }
+      triggerSubscriptions(afterCallbackList, ret);
+      return ret;
+    };
+  }
+  const _hmrPayload = /* @__PURE__ */ markRaw({
+    actions: {},
+    getters: {},
+    state: [],
+    hotState
+  });
+  const partialStore = {
+    _p: pinia,
+    // _s: scope,
+    $id,
+    $onAction: addSubscription.bind(null, actionSubscriptions),
+    $patch,
+    $reset,
+    $subscribe(callback, options2 = {}) {
+      const removeSubscription = addSubscription(subscriptions, callback, options2.detached, () => stopWatcher());
+      const stopWatcher = scope.run(() => watch(() => pinia.state.value[$id], (state) => {
+        if (options2.flush === "sync" ? isSyncListening : isListening) {
+          callback({
+            storeId: $id,
+            type: MutationType.direct,
+            events: debuggerEvents
+          }, state);
+        }
+      }, assign({}, $subscribeOptions, options2)));
+      return removeSubscription;
+    },
+    $dispose
+  };
+  const store = reactive(
+    assign(
+      {
+        _hmrPayload,
+        _customProperties: markRaw(/* @__PURE__ */ new Set())
+        // devtools custom properties
+      },
+      partialStore
+      // must be added later
+      // setupStore
+    )
+  );
+  pinia._s.set($id, store);
+  const setupStore = pinia._e.run(() => {
+    scope = effectScope();
+    return scope.run(() => setup());
+  });
+  for (const key in setupStore) {
+    const prop = setupStore[key];
+    if (isRef(prop) && !isComputed(prop) || isReactive(prop)) {
+      if (hot) {
+        set(hotState.value, key, toRef(setupStore, key));
+      } else if (!isOptionsStore) {
+        if (initialState && shouldHydrate(prop)) {
+          if (isRef(prop)) {
+            prop.value = initialState[key];
+          } else {
+            mergeReactiveObjects(prop, initialState[key]);
+          }
+        }
+        {
+          pinia.state.value[$id][key] = prop;
+        }
+      }
+      {
+        _hmrPayload.state.push(key);
+      }
+    } else if (typeof prop === "function") {
+      const actionValue = hot ? prop : wrapAction(key, prop);
+      {
+        setupStore[key] = actionValue;
+      }
+      {
+        _hmrPayload.actions[key] = prop;
+      }
+      optionsForPlugin.actions[key] = prop;
+    } else {
+      if (isComputed(prop)) {
+        _hmrPayload.getters[key] = isOptionsStore ? (
+          // @ts-expect-error
+          options.getters[key]
+        ) : prop;
+        if (IS_CLIENT) {
+          const getters = setupStore._getters || // @ts-expect-error: same
+          (setupStore._getters = markRaw([]));
+          getters.push(key);
+        }
+      }
+    }
+  }
+  {
+    assign(store, setupStore);
+    assign(toRaw(store), setupStore);
+  }
+  Object.defineProperty(store, "$state", {
+    get: () => hot ? hotState.value : pinia.state.value[$id],
+    set: (state) => {
+      if (hot) {
+        throw new Error("cannot set hotState");
+      }
+      $patch(($state) => {
+        assign($state, state);
+      });
+    }
+  });
+  {
+    store._hotUpdate = markRaw((newStore) => {
+      store._hotUpdating = true;
+      newStore._hmrPayload.state.forEach((stateKey) => {
+        if (stateKey in store.$state) {
+          const newStateTarget = newStore.$state[stateKey];
+          const oldStateSource = store.$state[stateKey];
+          if (typeof newStateTarget === "object" && isPlainObject(newStateTarget) && isPlainObject(oldStateSource)) {
+            patchObject(newStateTarget, oldStateSource);
+          } else {
+            newStore.$state[stateKey] = oldStateSource;
+          }
+        }
+        set(store, stateKey, toRef(newStore.$state, stateKey));
+      });
+      Object.keys(store.$state).forEach((stateKey) => {
+        if (!(stateKey in newStore.$state)) {
+          del(store, stateKey);
+        }
+      });
+      isListening = false;
+      isSyncListening = false;
+      pinia.state.value[$id] = toRef(newStore._hmrPayload, "hotState");
+      isSyncListening = true;
+      nextTick$1().then(() => {
+        isListening = true;
+      });
+      for (const actionName in newStore._hmrPayload.actions) {
+        const action = newStore[actionName];
+        set(store, actionName, wrapAction(actionName, action));
+      }
+      for (const getterName in newStore._hmrPayload.getters) {
+        const getter = newStore._hmrPayload.getters[getterName];
+        const getterValue = isOptionsStore ? (
+          // special handling of options api
+          computed(() => {
+            setActivePinia(pinia);
+            return getter.call(store, store);
+          })
+        ) : getter;
+        set(store, getterName, getterValue);
+      }
+      Object.keys(store._hmrPayload.getters).forEach((key) => {
+        if (!(key in newStore._hmrPayload.getters)) {
+          del(store, key);
+        }
+      });
+      Object.keys(store._hmrPayload.actions).forEach((key) => {
+        if (!(key in newStore._hmrPayload.actions)) {
+          del(store, key);
+        }
+      });
+      store._hmrPayload = newStore._hmrPayload;
+      store._getters = newStore._getters;
+      store._hotUpdating = false;
+    });
+  }
+  if (USE_DEVTOOLS) {
+    const nonEnumerable = {
+      writable: true,
+      configurable: true,
+      // avoid warning on devtools trying to display this property
+      enumerable: false
+    };
+    ["_p", "_hmrPayload", "_getters", "_customProperties"].forEach((p2) => {
+      Object.defineProperty(store, p2, assign({ value: store[p2] }, nonEnumerable));
+    });
+  }
+  pinia._p.forEach((extender) => {
+    if (USE_DEVTOOLS) {
+      const extensions = scope.run(() => extender({
+        store,
+        app: pinia._a,
+        pinia,
+        options: optionsForPlugin
+      }));
+      Object.keys(extensions || {}).forEach((key) => store._customProperties.add(key));
+      assign(store, extensions);
+    } else {
+      assign(store, scope.run(() => extender({
+        store,
+        app: pinia._a,
+        pinia,
+        options: optionsForPlugin
+      })));
+    }
+  });
+  if (store.$state && typeof store.$state === "object" && typeof store.$state.constructor === "function" && !store.$state.constructor.toString().includes("[native code]")) {
+    console.warn(`[🍍]: The "state" must be a plain object. It cannot be
+	state: () => new MyClass()
+Found in store "${store.$id}".`);
+  }
+  if (initialState && isOptionsStore && options.hydrate) {
+    options.hydrate(store.$state, initialState);
+  }
+  isListening = true;
+  isSyncListening = true;
+  return store;
+}
+function defineStore(idOrOptions, setup, setupOptions) {
+  let id;
+  let options;
+  const isSetupStore = typeof setup === "function";
+  if (typeof idOrOptions === "string") {
+    id = idOrOptions;
+    options = isSetupStore ? setupOptions : setup;
+  } else {
+    options = idOrOptions;
+    id = idOrOptions.id;
+  }
+  function useStore(pinia, hot) {
+    const currentInstance2 = getCurrentInstance();
+    pinia = // in test mode, ignore the argument provided as we can always retrieve a
+    // pinia instance with getActivePinia()
+    pinia || currentInstance2 && inject(piniaSymbol, null);
+    if (pinia)
+      setActivePinia(pinia);
+    if (!activePinia) {
+      throw new Error(`[🍍]: getActivePinia was called with no active Pinia. Did you forget to install pinia?
+	const pinia = createPinia()
+	app.use(pinia)
+This will fail in production.`);
+    }
+    pinia = activePinia;
+    if (!pinia._s.has(id)) {
+      if (isSetupStore) {
+        createSetupStore(id, setup, options, pinia);
+      } else {
+        createOptionsStore(id, options, pinia);
+      }
+      {
+        useStore._pinia = pinia;
+      }
+    }
+    const store = pinia._s.get(id);
+    if (hot) {
+      const hotId = "__hot:" + id;
+      const newStore = isSetupStore ? createSetupStore(hotId, setup, options, pinia, true) : createOptionsStore(hotId, assign({}, options), pinia, true);
+      hot._hotUpdate(newStore);
+      delete pinia.state.value[hotId];
+      pinia._s.delete(hotId);
+    }
+    if (IS_CLIENT && currentInstance2 && currentInstance2.proxy && // avoid adding stores that are just built for hot module replacement
+    !hot) {
+      const vm = currentInstance2.proxy;
+      const cache = "_pStores" in vm ? vm._pStores : vm._pStores = {};
+      cache[id] = store;
+    }
+    return store;
+  }
+  useStore.$id = id;
+  return useStore;
+}
+let mapStoreSuffix = "Store";
+function setMapStoreSuffix(suffix) {
+  mapStoreSuffix = suffix;
+}
+function mapStores(...stores) {
+  if (Array.isArray(stores[0])) {
+    console.warn(`[🍍]: Directly pass all stores to "mapStores()" without putting them in an array:
+Replace
+	mapStores([useAuthStore, useCartStore])
+with
+	mapStores(useAuthStore, useCartStore)
+This will fail in production if not fixed.`);
+    stores = stores[0];
+  }
+  return stores.reduce((reduced, useStore) => {
+    reduced[useStore.$id + mapStoreSuffix] = function() {
+      return useStore(this.$pinia);
+    };
+    return reduced;
+  }, {});
+}
+function mapState(useStore, keysOrMapper) {
+  return Array.isArray(keysOrMapper) ? keysOrMapper.reduce((reduced, key) => {
+    reduced[key] = function() {
+      return useStore(this.$pinia)[key];
+    };
+    return reduced;
+  }, {}) : Object.keys(keysOrMapper).reduce((reduced, key) => {
+    reduced[key] = function() {
+      const store = useStore(this.$pinia);
+      const storeKey = keysOrMapper[key];
+      return typeof storeKey === "function" ? storeKey.call(this, store) : store[storeKey];
+    };
+    return reduced;
+  }, {});
+}
+const mapGetters = mapState;
+function mapActions(useStore, keysOrMapper) {
+  return Array.isArray(keysOrMapper) ? keysOrMapper.reduce((reduced, key) => {
+    reduced[key] = function(...args) {
+      return useStore(this.$pinia)[key](...args);
+    };
+    return reduced;
+  }, {}) : Object.keys(keysOrMapper).reduce((reduced, key) => {
+    reduced[key] = function(...args) {
+      return useStore(this.$pinia)[keysOrMapper[key]](...args);
+    };
+    return reduced;
+  }, {});
+}
+function mapWritableState(useStore, keysOrMapper) {
+  return Array.isArray(keysOrMapper) ? keysOrMapper.reduce((reduced, key) => {
+    reduced[key] = {
+      get() {
+        return useStore(this.$pinia)[key];
+      },
+      set(value) {
+        return useStore(this.$pinia)[key] = value;
+      }
+    };
+    return reduced;
+  }, {}) : Object.keys(keysOrMapper).reduce((reduced, key) => {
+    reduced[key] = {
+      get() {
+        return useStore(this.$pinia)[keysOrMapper[key]];
+      },
+      set(value) {
+        return useStore(this.$pinia)[keysOrMapper[key]] = value;
+      }
+    };
+    return reduced;
+  }, {});
+}
+function storeToRefs(store) {
+  {
+    store = toRaw(store);
+    const refs = {};
+    for (const key in store) {
+      const value = store[key];
+      if (isRef(value) || isReactive(value)) {
+        refs[key] = // ---
+        toRef(store, key);
+      }
+    }
+    return refs;
+  }
+}
+const PiniaVuePlugin = function(_Vue) {
+  _Vue.mixin({
+    beforeCreate() {
+      const options = this.$options;
+      if (options.pinia) {
+        const pinia = options.pinia;
+        if (!this._provided) {
+          const provideCache = {};
+          Object.defineProperty(this, "_provided", {
+            get: () => provideCache,
+            set: (v) => Object.assign(provideCache, v)
+          });
+        }
+        this._provided[piniaSymbol] = pinia;
+        if (!this.$pinia) {
+          this.$pinia = pinia;
+        }
+        pinia._a = this;
+        if (IS_CLIENT) {
+          setActivePinia(pinia);
+        }
+        if (USE_DEVTOOLS) {
+          registerPiniaDevtools(pinia._a);
+        }
+      } else if (!this.$pinia && options.parent && options.parent.$pinia) {
+        this.$pinia = options.parent.$pinia;
+      }
+    },
+    destroyed() {
+      delete this._pStores;
+    }
+  });
+};
+const Pinia = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
+  __proto__: null,
+  get MutationType() {
+    return MutationType;
+  },
+  PiniaVuePlugin,
+  acceptHMRUpdate,
+  createPinia,
+  defineStore,
+  getActivePinia,
+  mapActions,
+  mapGetters,
+  mapState,
+  mapStores,
+  mapWritableState,
+  setActivePinia,
+  setMapStoreSuffix,
+  skipHydrate,
+  storeToRefs
+}, Symbol.toStringTag, { value: "Module" }));
+exports.Pinia = Pinia;
+exports._export_sfc = _export_sfc;
+exports.createPinia = createPinia;
+exports.createSSRApp = createSSRApp;
+exports.defineStore = defineStore;
+exports.e = e;
+exports.f = f;
+exports.index = index;
+exports.n = n;
+exports.o = o;
+exports.p = p;
+exports.ref = ref;
+exports.resolveComponent = resolveComponent;
+exports.s = s;
+exports.sr = sr;
+exports.t = t;
diff --git a/unpackage/dist/dev/mp-weixin/components/viewPopup/index.js b/unpackage/dist/dev/mp-weixin/components/viewPopup/index.js
new file mode 100644
index 0000000..d48e1ca
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/components/viewPopup/index.js
@@ -0,0 +1,58 @@
+"use strict";
+const common_vendor = require("../../common/vendor.js");
+if (!Array) {
+  const _easycom_up_icon2 = common_vendor.resolveComponent("up-icon");
+  _easycom_up_icon2();
+}
+const _easycom_up_icon = () => "../../uni_modules/uview-plus/components/u-icon/u-icon.js";
+if (!Math) {
+  _easycom_up_icon();
+}
+const _sfc_main = {
+  __name: "index",
+  props: {
+    nav: {
+      type: Boolean,
+      default: false
+    },
+    show: {
+      type: Boolean,
+      default: false
+    }
+  },
+  emits: ["close", "click"],
+  setup(__props, { emit: __emit }) {
+    const emit = __emit;
+    const close = () => {
+      emit("close");
+    };
+    const height = common_vendor.ref(0);
+    common_vendor.index.getSystemInfo({
+      success: (res) => {
+        const statusBarHeight = res.statusBarHeight || 0;
+        const menuButtonInfo = common_vendor.index.getMenuButtonBoundingClientRect();
+        const navBarHeight = menuButtonInfo.height + (menuButtonInfo.top - statusBarHeight) * 2;
+        const topIconDistance = statusBarHeight + navBarHeight;
+        console.log("顶部图标距离:", topIconDistance);
+        height.value = topIconDistance;
+      },
+      fail: (err) => {
+        console.error("获取系统信息失败:", err);
+      }
+    });
+    return (_ctx, _cache) => {
+      return common_vendor.e({
+        a: __props.nav
+      }, __props.nav ? {
+        b: height.value + "px"
+      } : {}, {
+        c: common_vendor.p({
+          name: "arrow-up"
+        }),
+        d: common_vendor.o(close)
+      });
+    };
+  }
+};
+const Component = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["__scopeId", "data-v-db7dc4ea"], ["__file", "D:/里海数字乡村/purchase-let/components/viewPopup/index.vue"]]);
+wx.createComponent(Component);
diff --git a/unpackage/dist/dev/mp-weixin/components/viewPopup/index.json b/unpackage/dist/dev/mp-weixin/components/viewPopup/index.json
new file mode 100644
index 0000000..12b0b18
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/components/viewPopup/index.json
@@ -0,0 +1,6 @@
+{
+  "component": true,
+  "usingComponents": {
+    "up-icon": "../../uni_modules/uview-plus/components/u-icon/u-icon"
+  }
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/components/viewPopup/index.wxml b/unpackage/dist/dev/mp-weixin/components/viewPopup/index.wxml
new file mode 100644
index 0000000..f7fd0eb
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/components/viewPopup/index.wxml
@@ -0,0 +1 @@
+<view class="view-popup data-v-db7dc4ea"><view wx:if="{{a}}" class="data-v-db7dc4ea" style="{{'width:100%' + ';' + ('height:' + b)}}"></view><view class="center data-v-db7dc4ea"><slot></slot><view class="up data-v-db7dc4ea" bindtap="{{d}}"><text class="data-v-db7dc4ea">点击收起</text><up-icon wx:if="{{c}}" class="data-v-db7dc4ea" u-i="db7dc4ea-0" bind:__l="__l" u-p="{{c}}"></up-icon></view></view></view>
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/components/viewPopup/index.wxss b/unpackage/dist/dev/mp-weixin/components/viewPopup/index.wxss
new file mode 100644
index 0000000..39c6f53
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/components/viewPopup/index.wxss
@@ -0,0 +1,58 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+/* 颜色变量 */
+/* 行为相关颜色 */
+/* 文字基本颜色 */
+/* 背景颜色 */
+/* 边框颜色 */
+/* 尺寸变量 */
+/* 文字尺寸 */
+/* 图片尺寸 */
+/* Border Radius */
+/* 水平间距 */
+/* 垂直间距 */
+/* 透明度 */
+/* 文章场景相关 */
+.view-popup.data-v-db7dc4ea {
+  height: 100vh;
+  width: 100%;
+  background-color: rgba(0, 0, 0, 0.3);
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 10;
+}
+.view-popup .center.data-v-db7dc4ea {
+  animation: slideDown-db7dc4ea 0.3s forwards;
+}
+.view-popup .up.data-v-db7dc4ea {
+  width: 100%;
+  height: 80rpx;
+  background-color: #fff;
+  border-radius: 0 0 28rpx 28rpx;
+  border-top: 1rpx solid #eee;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  font-size: 24rpx;
+}
+@keyframes slideDown-db7dc4ea {
+from {
+    transform: translateY(-100%);
+    /* 初始状态:向上偏移100% */
+}
+to {
+    transform: translateY(0);
+    /* 最终状态:无偏移 */
+}
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/pages/cart/cart.js b/unpackage/dist/dev/mp-weixin/pages/cart/cart.js
new file mode 100644
index 0000000..514ce18
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages/cart/cart.js
@@ -0,0 +1,71 @@
+"use strict";
+const common_vendor = require("../../common/vendor.js");
+const common_assets = require("../../common/assets.js");
+if (!Array) {
+  const _easycom_up_navbar2 = common_vendor.resolveComponent("up-navbar");
+  const _easycom_u__icon2 = common_vendor.resolveComponent("u--icon");
+  (_easycom_up_navbar2 + _easycom_u__icon2)();
+}
+const _easycom_up_navbar = () => "../../uni_modules/uview-plus/components/u-navbar/u-navbar.js";
+const _easycom_u__icon = () => "../../uni_modules/uview-plus/components/u-icon/u-icon.js";
+if (!Math) {
+  (_easycom_up_navbar + _easycom_u__icon)();
+}
+const _sfc_main = {
+  __name: "cart",
+  setup(__props) {
+    const list = common_vendor.ref(["购物车", "常买", "收藏"]);
+    const tabsActive = common_vendor.ref(0);
+    const changeTab = (e) => {
+      tabsActive.value = e;
+    };
+    const swiperCurrent = common_vendor.ref(0);
+    const animationfinish = ({ detail: { current } }) => {
+      swiperCurrent.value = current;
+      tabsActive.value = current;
+    };
+    return (_ctx, _cache) => {
+      return common_vendor.e({
+        a: common_vendor.f(list.value, (item, index, i0) => {
+          return {
+            a: common_vendor.t(item),
+            b: tabsActive.value == index ? 1 : "",
+            c: common_vendor.o(($event) => changeTab(index))
+          };
+        }),
+        b: common_vendor.p({
+          placeholder: true
+        })
+      }, {}, {
+        c: common_vendor.f(20, (item, index, i0) => {
+          return common_vendor.e({
+            a: index % 3 == 0
+          }, index % 3 == 0 ? {
+            b: common_assets._imports_0
+          } : {
+            c: common_assets._imports_1
+          }, {
+            d: "da603134-1-" + i0,
+            e: "da603134-2-" + i0,
+            f: index
+          });
+        }),
+        d: common_vendor.p({
+          name: "minus-circle-fill",
+          size: "20",
+          color: "#20b128"
+        }),
+        e: common_vendor.t(1),
+        f: common_vendor.p({
+          name: "plus-circle-fill",
+          size: "20",
+          color: "#20b128"
+        }),
+        g: swiperCurrent.value,
+        h: common_vendor.o(animationfinish)
+      });
+    };
+  }
+};
+const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["__file", "D:/里海数字乡村/purchase-let/pages/cart/cart.vue"]]);
+wx.createPage(MiniProgramPage);
diff --git a/unpackage/dist/dev/mp-weixin/pages/cart/cart.json b/unpackage/dist/dev/mp-weixin/pages/cart/cart.json
new file mode 100644
index 0000000..5bb97bf
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages/cart/cart.json
@@ -0,0 +1,9 @@
+{
+  "navigationBarTitleText": "购物车",
+  "enablePullDownRefresh": false,
+  "navigationStyle": "custom",
+  "usingComponents": {
+    "up-navbar": "../../uni_modules/uview-plus/components/u-navbar/u-navbar",
+    "u--icon": "../../uni_modules/uview-plus/components/u-icon/u-icon"
+  }
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/pages/cart/cart.wxml b/unpackage/dist/dev/mp-weixin/pages/cart/cart.wxml
new file mode 100644
index 0000000..519bd89
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages/cart/cart.wxml
@@ -0,0 +1 @@
+<view><up-navbar wx:if="{{b}}" u-s="{{['left']}}" u-i="da603134-0" bind:__l="__l" u-p="{{b}}"><view style="display:flex" slot="left"><view wx:for="{{a}}" wx:for-item="item" class="{{['tabs', item.b && 'tabs-active']}}" bindtap="{{item.c}}">{{item.a}}</view></view></up-navbar><swiper class="swiper-box" current="{{g}}" bindanimationfinish="{{h}}"><swiper-item class="swiper-item"><scroll-view scroll-y style="height:100%;width:100%"><view class="page-box1"><view class="total"><view>共计<text style="color:#20B128">3</text>件</view><view wx:if="{{true}}">管理</view><view wx:else>完成</view></view><view class="list"><view wx:for="{{c}}" wx:for-item="item" wx:key="f" class="shop-item"><view class="shop-check"><image wx:if="{{item.a}}" src="{{item.b}}"></image><image wx:else src="{{item.c}}"></image></view><image class="shop-img" src="https://cdn.uviewui.com/uview/album/1.jpg"></image><view class="shop-content"><view class="title"><view class="name u-line-2">好吃的瓜果</view><view class="tip u-line-1">香味辛辣|葱香味浓|调味增香香味辛辣|葱香味浓|调味增香</view></view><view class="price-btn"><view class="price">¥12.00</view><view class="btn"><u--icon wx:if="{{d}}" u-i="{{item.d}}" bind:__l="__l" u-p="{{d}}"></u--icon><view class="num">{{e}}</view><u--icon wx:if="{{f}}" u-i="{{item.e}}" bind:__l="__l" u-p="{{f}}"></u--icon></view></view></view></view></view><view style="width:100%;height:200rpx"></view></view></scroll-view></swiper-item></swiper><view class="cart-btn"></view></view>
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/pages/cart/cart.wxss b/unpackage/dist/dev/mp-weixin/pages/cart/cart.wxss
new file mode 100644
index 0000000..1d670b5
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages/cart/cart.wxss
@@ -0,0 +1,120 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+/* 颜色变量 */
+/* 行为相关颜色 */
+/* 文字基本颜色 */
+/* 背景颜色 */
+/* 边框颜色 */
+/* 尺寸变量 */
+/* 文字尺寸 */
+/* 图片尺寸 */
+/* Border Radius */
+/* 水平间距 */
+/* 垂直间距 */
+/* 透明度 */
+/* 文章场景相关 */
+.tabs {
+  color: #444444;
+  font-size: 32rpx;
+  margin-right: 30rpx;
+}
+.tabs-active {
+  color: #20B128;
+  font-size: 34rpx;
+  transition: 300ms;
+}
+.swiper-box {
+  flex: 1;
+  height: calc(100vh - var(--window-top) - var(--window-bottom));
+  width: 100%;
+}
+.swiper-box .swiper-item {
+  height: 100%;
+}
+.page-box1 {
+  position: relative;
+}
+.page-box1 .total {
+  padding: 0 20rpx;
+  display: flex;
+  justify-content: space-between;
+  position: fixed;
+  top: var(--window-top);
+  left: 0;
+  right: 0;
+  background-color: #eee;
+  z-index: 100;
+  height: 60rpx;
+  line-height: 60rpx;
+  font-size: 26rpx;
+  color: #444;
+}
+.page-box1 .list {
+  margin: 20rpx;
+  margin-top: 80rpx;
+  border-radius: 20rpx;
+  overflow: hidden;
+}
+.page-box1 .list .shop-item {
+  padding: 20rpx;
+  border-bottom: 1rpx solid #eee;
+  background-color: #fff;
+  display: flex;
+}
+.page-box1 .list .shop-item .shop-check {
+  width: 60rpx;
+  height: 160rpx;
+  display: flex;
+  align-items: center;
+}
+.page-box1 .list .shop-item .shop-check image {
+  width: 40rpx;
+  height: 40rpx;
+}
+.page-box1 .list .shop-item .shop-img {
+  height: 160rpx;
+  width: 160rpx;
+  margin-right: 20rpx;
+  border-radius: 14rpx;
+}
+.page-box1 .list .shop-item .shop-content {
+  width: 430rpx;
+  display: flex;
+  flex-direction: column;
+  justify-content: space-between;
+}
+.page-box1 .list .shop-item .shop-content .title .name {
+  font-size: 28rpx;
+}
+.page-box1 .list .shop-item .shop-content .title .tip {
+  color: #999;
+  font-size: 24rpx;
+  margin: 12rpx 0;
+}
+.page-box1 .list .shop-item .shop-content .price {
+  font-size: 30rpx;
+  font-weight: bold;
+  color: #F55726;
+}
+.page-box1 .list .shop-item .shop-content .price-btn {
+  display: flex;
+  justify-content: space-between;
+}
+.page-box1 .list .shop-item .shop-content .price-btn .btn {
+  display: flex;
+  align-items: center;
+}
+.page-box1 .list .shop-item .shop-content .price-btn .btn .num {
+  width: 60rpx;
+  text-align: center;
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/pages/index/index.js b/unpackage/dist/dev/mp-weixin/pages/index/index.js
new file mode 100644
index 0000000..dc3be81
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages/index/index.js
@@ -0,0 +1,113 @@
+"use strict";
+const common_vendor = require("../../common/vendor.js");
+if (!Array) {
+  const _easycom_up_search2 = common_vendor.resolveComponent("up-search");
+  const _easycom_up_navbar2 = common_vendor.resolveComponent("up-navbar");
+  const _easycom_up_icon2 = common_vendor.resolveComponent("up-icon");
+  const _easycom_u__icon2 = common_vendor.resolveComponent("u--icon");
+  (_easycom_up_search2 + _easycom_up_navbar2 + _easycom_up_icon2 + _easycom_u__icon2)();
+}
+const _easycom_up_search = () => "../../uni_modules/uview-plus/components/u-search/u-search.js";
+const _easycom_up_navbar = () => "../../uni_modules/uview-plus/components/u-navbar/u-navbar.js";
+const _easycom_up_icon = () => "../../uni_modules/uview-plus/components/u-icon/u-icon.js";
+const _easycom_u__icon = () => "../../uni_modules/uview-plus/components/u-icon/u-icon.js";
+if (!Math) {
+  (_easycom_up_search + _easycom_up_navbar + _easycom_up_icon + viewPopup + _easycom_u__icon)();
+}
+const viewPopup = () => "../../components/viewPopup/index.js";
+const _sfc_main = {
+  __name: "index",
+  setup(__props) {
+    const topActive = common_vendor.ref(0);
+    const leftActive = common_vendor.ref(2);
+    const rightActive = common_vendor.ref(1);
+    const show = common_vendor.ref(0);
+    const keyword = common_vendor.ref("");
+    return (_ctx, _cache) => {
+      return common_vendor.e({
+        a: common_vendor.o(($event) => keyword.value = $event),
+        b: common_vendor.p({
+          placeholder: "请输入商品",
+          showAction: false,
+          modelValue: keyword.value
+        }),
+        c: common_vendor.p({
+          placeholder: true
+        }),
+        d: common_vendor.f(10, (item, index, i0) => {
+          return {
+            a: common_vendor.t(item),
+            b: topActive.value == index ? 1 : "",
+            c: index
+          };
+        }),
+        e: common_vendor.p({
+          name: "list"
+        }),
+        f: common_vendor.o(($event) => show.value = 1),
+        g: show.value === 1
+      }, show.value === 1 ? {
+        h: common_vendor.f(55, (item, index, i0) => {
+          return {
+            a: common_vendor.t(item),
+            b: topActive.value == index ? 1 : "",
+            c: index
+          };
+        }),
+        i: common_vendor.o(($event) => show.value = 0),
+        j: common_vendor.p({
+          nav: true
+        })
+      } : {}, {
+        k: common_vendor.f(20, (item, index, i0) => {
+          return {
+            a: common_vendor.t(item),
+            b: leftActive.value == index ? 1 : "",
+            c: index
+          };
+        }),
+        l: common_vendor.f(6, (item, index, i0) => {
+          return {
+            a: rightActive.value == index ? 1 : "",
+            b: index
+          };
+        }),
+        m: common_vendor.p({
+          name: "arrow-down"
+        }),
+        n: common_vendor.o(($event) => show.value = 2),
+        o: show.value === 2
+      }, show.value === 2 ? {
+        p: common_vendor.f(6, (item, index, i0) => {
+          return {
+            a: rightActive.value == index ? 1 : "",
+            b: index
+          };
+        }),
+        q: common_vendor.o(($event) => show.value = 0)
+      } : {}, {
+        r: common_vendor.f(20, (item, index, i0) => {
+          return {
+            a: common_vendor.t(item),
+            b: "1ba6254c-6-" + i0,
+            c: "1ba6254c-7-" + i0,
+            d: index
+          };
+        }),
+        s: common_vendor.p({
+          name: "minus-circle-fill",
+          size: "20",
+          color: "#20b128"
+        }),
+        t: common_vendor.t(1),
+        v: common_vendor.p({
+          name: "plus-circle-fill",
+          size: "20",
+          color: "#20b128"
+        })
+      });
+    };
+  }
+};
+const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["__file", "D:/里海数字乡村/purchase-let/pages/index/index.vue"]]);
+wx.createPage(MiniProgramPage);
diff --git a/unpackage/dist/dev/mp-weixin/pages/index/index.json b/unpackage/dist/dev/mp-weixin/pages/index/index.json
new file mode 100644
index 0000000..a9a3b6c
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages/index/index.json
@@ -0,0 +1,12 @@
+{
+  "navigationBarTitleText": "购物",
+  "disableScroll": true,
+  "navigationStyle": "custom",
+  "usingComponents": {
+    "up-search": "../../uni_modules/uview-plus/components/u-search/u-search",
+    "up-navbar": "../../uni_modules/uview-plus/components/u-navbar/u-navbar",
+    "up-icon": "../../uni_modules/uview-plus/components/u-icon/u-icon",
+    "u--icon": "../../uni_modules/uview-plus/components/u-icon/u-icon",
+    "view-popup": "../../components/viewPopup/index"
+  }
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/pages/index/index.wxml b/unpackage/dist/dev/mp-weixin/pages/index/index.wxml
new file mode 100644
index 0000000..2170d04
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages/index/index.wxml
@@ -0,0 +1 @@
+<view class="content"><up-navbar wx:if="{{c}}" u-s="{{['left']}}" style="z-index:10080" u-i="1ba6254c-0" bind:__l="__l" u-p="{{c}}"><view style="width:540rpx" slot="left"><up-search wx:if="{{b}}" u-i="1ba6254c-1,1ba6254c-0" bind:__l="__l" bindupdateModelValue="{{a}}" u-p="{{b}}"></up-search></view></up-navbar><view style="position:relative;overflow:hidden"><scroll-view class="head-view" scroll-x><view class="list"><view wx:for="{{d}}" wx:for-item="item" wx:key="c" class="{{['item', item.b && 'item-active']}}"><image class="c-img" src="https://cdn.uviewui.com/uview/album/1.jpg"></image><view class="c-text u-line-1">惠农生活{{item.a}}</view></view><view class="item" style="width:80rpx;height:20rpx"></view></view></scroll-view><view class="r-btn" bindtap="{{f}}"><view>全</view><view>部</view><up-icon wx:if="{{e}}" u-i="1ba6254c-2" bind:__l="__l" u-p="{{e}}"></up-icon></view></view><view-popup wx:if="{{g}}" u-s="{{['d']}}" bindclose="{{i}}" u-i="1ba6254c-3" bind:__l="__l" u-p="{{j}}"><view class="cateOne"><view class="head-title">全部分类</view><scroll-view scroll-y style="height:60vh"><view class="list"><view wx:for="{{h}}" wx:for-item="item" wx:key="c" class="{{['item', item.b && 'item-active']}}"><image class="c-img" src="https://cdn.uviewui.com/uview/album/1.jpg"></image><view class="c-text u-line-1">惠农生活{{item.a}}</view></view></view></scroll-view></view></view-popup><view class="scroll-box"><scroll-view class="left" scroll-y><view wx:for="{{k}}" wx:for-item="item" wx:key="c" class="{{['item', 'u-line-1', item.b && 'item-active']}}">惠农生活{{item.a}}</view><view style="width:100%;height:200rpx"></view></scroll-view><view class="right"><view class="classify"><scroll-view style="height:90rpx" scroll-x><view class="classify-list"><view wx:for="{{l}}" wx:for-item="item" wx:key="b" class="{{['classify-list-item', 'u-line-1', item.a && 'item-active']}}"> 牛肉 </view><view style="width:70rpx;flex-shrink:0"></view></view></scroll-view><view class="done" bindtap="{{n}}"><up-icon wx:if="{{m}}" u-i="1ba6254c-4" bind:__l="__l" u-p="{{m}}"></up-icon></view><view class="order-by"><view class="item">综合</view><view class="item">价格</view><view class="item">销量</view></view></view><view-popup wx:if="{{o}}" u-s="{{['d']}}" bindclose="{{q}}" u-i="1ba6254c-5" bind:__l="__l"><view class="cateOne"><scroll-view scroll-y style="height:230rpx"><view class="classify-list"><view wx:for="{{p}}" wx:for-item="item" wx:key="b" class="{{['classify-list-item', 'u-line-1', item.a && 'item-active']}}"> 牛肉 </view></view></scroll-view></view></view-popup><scroll-view class="list" scroll-y><view wx:for="{{r}}" wx:for-item="item" wx:key="d" class="shop-item"><image class="shop-img" src="https://cdn.uviewui.com/uview/album/1.jpg"></image><view class="shop-content"><view class="title"><view class="name u-line-2">好吃的瓜果{{item.a}}</view><view class="tip u-line-1">香味辛辣|葱香味浓|调味增香香味辛辣|葱香味浓|调味增香</view></view><view class="price-btn"><view class="price">¥12.00</view><view class="btn"><u--icon wx:if="{{s}}" u-i="{{item.b}}" bind:__l="__l" u-p="{{s}}"></u--icon><view class="num">{{t}}</view><u--icon wx:if="{{v}}" u-i="{{item.c}}" bind:__l="__l" u-p="{{v}}"></u--icon></view></view></view></view><view style="width:100%;height:200rpx"></view></scroll-view></view></view></view>
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/pages/index/index.wxss b/unpackage/dist/dev/mp-weixin/pages/index/index.wxss
new file mode 100644
index 0000000..d951fe5
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages/index/index.wxss
@@ -0,0 +1,283 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+/* 颜色变量 */
+/* 行为相关颜色 */
+/* 文字基本颜色 */
+/* 背景颜色 */
+/* 边框颜色 */
+/* 尺寸变量 */
+/* 文字尺寸 */
+/* 图片尺寸 */
+/* Border Radius */
+/* 水平间距 */
+/* 垂直间距 */
+/* 透明度 */
+/* 文章场景相关 */
+.content {
+  background-color: #fff;
+}
+.head-view {
+  background-color: #fff;
+  height: 180rpx;
+  width: 750rpx;
+}
+.head-view .list {
+  height: 100%;
+  display: flex;
+  align-items: center;
+  padding: 0 20rpx;
+  font-size: 22rpx;
+}
+.head-view .list .item {
+  width: 120rpx;
+  flex-shrink: 0;
+  margin-right: 20rpx;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
+.head-view .list .item .c-img {
+  height: 100rpx;
+  width: 100rpx;
+  flex-shrink: 0;
+  border-radius: 50%;
+  border: 2px solid transparent;
+}
+.head-view .list .item .c-text {
+  width: 100%;
+  text-align: center;
+  box-sizing: border-box;
+  padding: 2rpx 4rpx 3rpx 4rpx;
+  border-radius: 50rpx;
+  margin-top: 5rpx;
+}
+.head-view .list .item-active .c-img {
+  border: 2px solid #20b128;
+}
+.head-view .list .item-active .c-text {
+  background-color: #20b128;
+  color: #fff;
+}
+.r-btn {
+  position: absolute;
+  right: 0;
+  top: 0;
+  height: 100%;
+  width: 60rpx;
+  font-size: 24rpx;
+  background-color: #fff;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  box-shadow: -10rpx 0 60rpx 1rpx rgba(0, 0, 0, 0.3);
+}
+.cateOne {
+  background-color: #fff;
+}
+.cateOne .head-title {
+  color: #666666;
+  font-size: 30rpx;
+  height: 80rpx;
+  line-height: 80rpx;
+  padding-left: 30rpx;
+}
+.cateOne .list {
+  padding: 20rpx 0;
+  font-size: 22rpx;
+  display: grid;
+  grid-template-columns: auto auto auto auto auto;
+  justify-content: center;
+  grid-gap: 20rpx;
+}
+.cateOne .list .item {
+  width: 120rpx;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
+.cateOne .list .item .c-img {
+  height: 100rpx;
+  width: 100rpx;
+  flex-shrink: 0;
+  border-radius: 50%;
+  border: 2px solid transparent;
+}
+.cateOne .list .item .c-text {
+  width: 100%;
+  text-align: center;
+  box-sizing: border-box;
+  padding: 2rpx 4rpx 3rpx 4rpx;
+  border-radius: 50rpx;
+  margin-top: 5rpx;
+}
+.cateOne .list .item-active .c-img {
+  border: 2px solid #20b128;
+}
+.cateOne .list .item-active .c-text {
+  background-color: #20b128;
+  color: #fff;
+}
+.cateOne .classify-list {
+  padding: 20rpx 0;
+  font-size: 22rpx;
+  display: grid;
+  grid-template-columns: auto auto auto;
+  justify-content: center;
+  grid-gap: 20rpx;
+}
+.cateOne .classify-list .classify-list-item {
+  flex-shrink: 0;
+  text-align: center;
+  width: 150rpx;
+  height: 42rpx;
+  line-height: 42rpx;
+  background: #F6F6F6;
+  border-radius: 22rpx 22rpx 22rpx 22rpx;
+  border: 1rpx solid transparent;
+}
+.cateOne .classify-list .item-active {
+  border: 1rpx solid #20b128;
+  color: #20b128;
+  background-color: rgba(32, 177, 40, 0.1);
+}
+.scroll-box {
+  display: flex;
+}
+.scroll-box .left {
+  height: calc(100vh - var(--window-top) - var(--window-bottom) - 180rpx);
+  width: 170rpx;
+  box-sizing: border-box;
+  background-color: #eee;
+  font-size: 24rpx;
+}
+.scroll-box .left .item {
+  height: 96rpx;
+  line-height: 96rpx;
+  text-align: center;
+}
+.scroll-box .left .item-active {
+  background-color: #fff;
+  position: relative;
+  color: #20b128;
+}
+.scroll-box .left .item-active::before {
+  content: "";
+  background-color: #20b128;
+  width: 6rpx;
+  height: 48rpx;
+  border-radius: 10rpx;
+  position: absolute;
+  left: 0;
+  top: 50%;
+  transform: translate(0, -50%);
+}
+.scroll-box .right {
+  height: calc(100vh - var(--window-top) - var(--window-bottom) - 180rpx);
+  width: 580rpx;
+  box-sizing: border-box;
+  position: relative;
+  overflow: hidden;
+}
+.scroll-box .right .classify {
+  height: 150rpx;
+  background-color: #fff;
+  border-bottom: 1rpx solid #eee;
+  position: relative;
+  font-size: 24rpx;
+}
+.scroll-box .right .classify .classify-list {
+  display: flex;
+  padding: 20rpx;
+}
+.scroll-box .right .classify .classify-list .classify-list-item {
+  flex-shrink: 0;
+  text-align: center;
+  width: 108rpx;
+  height: 42rpx;
+  line-height: 42rpx;
+  background: #F6F6F6;
+  border-radius: 22rpx 22rpx 22rpx 22rpx;
+  margin-right: 20rpx;
+  border: 1rpx solid transparent;
+}
+.scroll-box .right .classify .classify-list .item-active {
+  border: 1rpx solid #20b128;
+  color: #20b128;
+  background-color: rgba(32, 177, 40, 0.1);
+}
+.scroll-box .right .classify .done {
+  height: 90rpx;
+  width: 60rpx;
+  position: absolute;
+  top: 0;
+  right: 0;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  background-color: #fff;
+}
+.scroll-box .right .classify .order-by {
+  display: flex;
+  justify-content: flex-end;
+  align-items: center;
+}
+.scroll-box .right .classify .order-by .item {
+  padding-right: 20rpx;
+}
+.scroll-box .right .list {
+  height: calc(100vh - var(--window-top) - var(--window-bottom) - 180rpx - 150rpx);
+}
+.scroll-box .right .list .shop-item {
+  padding: 20rpx;
+  border-bottom: 1rpx solid #eee;
+  background-color: #fff;
+  display: flex;
+}
+.scroll-box .right .list .shop-item .shop-img {
+  height: 160rpx;
+  width: 160rpx;
+  margin-right: 20rpx;
+  border-radius: 14rpx;
+}
+.scroll-box .right .list .shop-item .shop-content {
+  width: 380rpx;
+  display: flex;
+  flex-direction: column;
+  justify-content: space-between;
+}
+.scroll-box .right .list .shop-item .shop-content .title .name {
+  font-size: 28rpx;
+}
+.scroll-box .right .list .shop-item .shop-content .title .tip {
+  color: #999;
+  font-size: 24rpx;
+  margin: 12rpx 0;
+}
+.scroll-box .right .list .shop-item .shop-content .price {
+  font-size: 30rpx;
+  font-weight: bold;
+  color: #F55726;
+}
+.scroll-box .right .list .shop-item .shop-content .price-btn {
+  display: flex;
+  justify-content: space-between;
+}
+.scroll-box .right .list .shop-item .shop-content .price-btn .btn {
+  display: flex;
+  align-items: center;
+}
+.scroll-box .right .list .shop-item .shop-content .price-btn .btn .num {
+  width: 60rpx;
+  text-align: center;
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/pages/login/login.js b/unpackage/dist/dev/mp-weixin/pages/login/login.js
new file mode 100644
index 0000000..83b3486
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages/login/login.js
@@ -0,0 +1,14 @@
+"use strict";
+const store_user = require("../../store/user.js");
+const common_vendor = require("../../common/vendor.js");
+const _sfc_main = {
+  __name: "login",
+  setup(__props) {
+    store_user.useUserStore();
+    return (_ctx, _cache) => {
+      return {};
+    };
+  }
+};
+const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["__file", "D:/里海数字乡村/purchase-let/pages/login/login.vue"]]);
+wx.createPage(MiniProgramPage);
diff --git a/unpackage/dist/dev/mp-weixin/pages/login/login.json b/unpackage/dist/dev/mp-weixin/pages/login/login.json
new file mode 100644
index 0000000..b3e7122
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages/login/login.json
@@ -0,0 +1,5 @@
+{
+  "navigationBarTitleText": "登录",
+  "enablePullDownRefresh": false,
+  "usingComponents": {}
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/pages/login/login.wxml b/unpackage/dist/dev/mp-weixin/pages/login/login.wxml
new file mode 100644
index 0000000..8dcff42
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages/login/login.wxml
@@ -0,0 +1 @@
+<view></view>
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/pages/login/login.wxss b/unpackage/dist/dev/mp-weixin/pages/login/login.wxss
new file mode 100644
index 0000000..e69de29
diff --git a/unpackage/dist/dev/mp-weixin/pages/my/my.js b/unpackage/dist/dev/mp-weixin/pages/my/my.js
new file mode 100644
index 0000000..1b41535
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages/my/my.js
@@ -0,0 +1,80 @@
+"use strict";
+const common_vendor = require("../../common/vendor.js");
+if (!Array) {
+  const _easycom_up_icon2 = common_vendor.resolveComponent("up-icon");
+  const _easycom_up_navbar2 = common_vendor.resolveComponent("up-navbar");
+  const _easycom_up_avatar2 = common_vendor.resolveComponent("up-avatar");
+  const _easycom_up_cell2 = common_vendor.resolveComponent("up-cell");
+  const _easycom_up_cell_group2 = common_vendor.resolveComponent("up-cell-group");
+  (_easycom_up_icon2 + _easycom_up_navbar2 + _easycom_up_avatar2 + _easycom_up_cell2 + _easycom_up_cell_group2)();
+}
+const _easycom_up_icon = () => "../../uni_modules/uview-plus/components/u-icon/u-icon.js";
+const _easycom_up_navbar = () => "../../uni_modules/uview-plus/components/u-navbar/u-navbar.js";
+const _easycom_up_avatar = () => "../../uni_modules/uview-plus/components/u-avatar/u-avatar.js";
+const _easycom_up_cell = () => "../../uni_modules/uview-plus/components/u-cell/u-cell.js";
+const _easycom_up_cell_group = () => "../../uni_modules/uview-plus/components/u-cell-group/u-cell-group.js";
+if (!Math) {
+  (_easycom_up_icon + _easycom_up_navbar + _easycom_up_avatar + _easycom_up_cell + _easycom_up_cell_group)();
+}
+const _sfc_main = {
+  __name: "my",
+  setup(__props) {
+    common_vendor.ref("");
+    common_vendor.ref(true);
+    return (_ctx, _cache) => {
+      return {
+        a: common_vendor.p({
+          name: "camera-fill",
+          color: "#000000",
+          size: "48"
+        }),
+        b: common_vendor.p({
+          fixed: false,
+          ["is-back"]: false,
+          title: "个人中心",
+          ["border-bottom"]: false
+        }),
+        c: common_vendor.p({
+          src: "https://cdn.uviewui.com/uview/album/1.jpg",
+          size: "140"
+        }),
+        d: common_vendor.p({
+          name: "scan",
+          color: "#969799",
+          size: "28"
+        }),
+        e: common_vendor.p({
+          name: "arrow-right",
+          color: "#969799",
+          size: "28"
+        }),
+        f: common_vendor.p({
+          icon: "rmb-circle",
+          title: "支付"
+        }),
+        g: common_vendor.p({
+          icon: "star",
+          title: "收藏"
+        }),
+        h: common_vendor.p({
+          icon: "photo",
+          title: "相册"
+        }),
+        i: common_vendor.p({
+          icon: "coupon",
+          title: "卡券"
+        }),
+        j: common_vendor.p({
+          icon: "heart",
+          title: "关注"
+        }),
+        k: common_vendor.p({
+          icon: "setting",
+          title: "设置"
+        })
+      };
+    };
+  }
+};
+const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["__file", "D:/里海数字乡村/purchase-let/pages/my/my.vue"]]);
+wx.createPage(MiniProgramPage);
diff --git a/unpackage/dist/dev/mp-weixin/pages/my/my.json b/unpackage/dist/dev/mp-weixin/pages/my/my.json
new file mode 100644
index 0000000..0153542
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages/my/my.json
@@ -0,0 +1,12 @@
+{
+  "navigationBarTitleText": "个人中心",
+  "enablePullDownRefresh": false,
+  "navigationStyle": "custom",
+  "usingComponents": {
+    "up-icon": "../../uni_modules/uview-plus/components/u-icon/u-icon",
+    "up-navbar": "../../uni_modules/uview-plus/components/u-navbar/u-navbar",
+    "up-avatar": "../../uni_modules/uview-plus/components/u-avatar/u-avatar",
+    "up-cell": "../../uni_modules/uview-plus/components/u-cell/u-cell",
+    "up-cell-group": "../../uni_modules/uview-plus/components/u-cell-group/u-cell-group"
+  }
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/pages/my/my.wxml b/unpackage/dist/dev/mp-weixin/pages/my/my.wxml
new file mode 100644
index 0000000..8730562
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages/my/my.wxml
@@ -0,0 +1 @@
+<view><up-navbar wx:if="{{b}}" u-s="{{['d']}}" u-i="39cfeb26-0" bind:__l="__l" u-p="{{b}}"><view class="u-flex u-row-right" style="width:100%"><view class="camera u-flex u-row-center"><up-icon wx:if="{{a}}" u-i="39cfeb26-1,39cfeb26-0" bind:__l="__l" u-p="{{a}}"></up-icon></view></view></up-navbar><view class="u-flex u-flex-y-center u-flex-around user-box u-p-l-30 u-p-r-20 u-p-b-30"><view class="u-m-r-10"><up-avatar wx:if="{{c}}" u-i="39cfeb26-2" bind:__l="__l" u-p="{{c}}"></up-avatar></view><view class="u-flex-1"><view class="u-font-18 u-p-b-20">uview plus</view><view class="u-font-14 u-tips-color">微信号:test</view></view><view class="u-m-l-10 u-p-10"><up-icon wx:if="{{d}}" u-i="39cfeb26-3" bind:__l="__l" u-p="{{d}}"></up-icon></view><view class="u-m-l-10 u-p-10"><up-icon wx:if="{{e}}" u-i="39cfeb26-4" bind:__l="__l" u-p="{{e}}"></up-icon></view></view><view class="u-m-t-20"><up-cell-group u-s="{{['d']}}" u-i="39cfeb26-5" bind:__l="__l"><up-cell wx:if="{{f}}" u-i="39cfeb26-6,39cfeb26-5" bind:__l="__l" u-p="{{f}}"></up-cell></up-cell-group></view><view class="u-m-t-20"><up-cell-group u-s="{{['d']}}" u-i="39cfeb26-7" bind:__l="__l"><up-cell wx:if="{{g}}" u-i="39cfeb26-8,39cfeb26-7" bind:__l="__l" u-p="{{g}}"></up-cell><up-cell wx:if="{{h}}" u-i="39cfeb26-9,39cfeb26-7" bind:__l="__l" u-p="{{h}}"></up-cell><up-cell wx:if="{{i}}" u-i="39cfeb26-10,39cfeb26-7" bind:__l="__l" u-p="{{i}}"></up-cell><up-cell wx:if="{{j}}" u-i="39cfeb26-11,39cfeb26-7" bind:__l="__l" u-p="{{j}}"></up-cell></up-cell-group></view><view class="u-m-t-20"><up-cell-group u-s="{{['d']}}" u-i="39cfeb26-12" bind:__l="__l"><up-cell wx:if="{{k}}" u-i="39cfeb26-13,39cfeb26-12" bind:__l="__l" u-p="{{k}}"></up-cell></up-cell-group></view></view>
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/pages/my/my.wxss b/unpackage/dist/dev/mp-weixin/pages/my/my.wxss
new file mode 100644
index 0000000..11604cc
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages/my/my.wxss
@@ -0,0 +1,41 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+/* 颜色变量 */
+/* 行为相关颜色 */
+/* 文字基本颜色 */
+/* 背景颜色 */
+/* 边框颜色 */
+/* 尺寸变量 */
+/* 文字尺寸 */
+/* 图片尺寸 */
+/* Border Radius */
+/* 水平间距 */
+/* 垂直间距 */
+/* 透明度 */
+/* 文章场景相关 */
+page {
+  background-color: #ededed;
+}
+.camera {
+  width: 54px;
+  height: 44px;
+}
+.camera:active {
+  background-color: #ededed;
+}
+.user-box {
+  background-color: #fff;
+}
+.u-cell-group {
+  background-color: #fff;
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/pages/order/order.js b/unpackage/dist/dev/mp-weixin/pages/order/order.js
new file mode 100644
index 0000000..43323f3
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages/order/order.js
@@ -0,0 +1,365 @@
+"use strict";
+const common_vendor = require("../../common/vendor.js");
+const _sfc_main = {
+  data() {
+    return {
+      orderList: [[], [], [], []],
+      dataList: [
+        {
+          id: 1,
+          store: "夏日流星限定贩卖",
+          deal: "交易成功",
+          goodsList: [
+            {
+              goodsUrl: "//img13.360buyimg.com/n7/jfs/t1/103005/7/17719/314825/5e8c19faEb7eed50d/5b81ae4b2f7f3bb7.jpg",
+              title: "【冬日限定】现货 原创jk制服女2020冬装新款小清新宽松软糯毛衣外套女开衫短款百搭日系甜美风",
+              type: "灰色;M",
+              deliveryTime: "付款后30天内发货",
+              price: "348.58",
+              number: 2
+            },
+            {
+              goodsUrl: "//img12.360buyimg.com/n7/jfs/t1/102191/19/9072/330688/5e0af7cfE17698872/c91c00d713bf729a.jpg",
+              title: "【葡萄藤】现货 小清新学院风制服格裙百褶裙女短款百搭日系甜美风原创jk制服女2020新款",
+              type: "45cm;S",
+              deliveryTime: "付款后30天内发货",
+              price: "135.00",
+              number: 1
+            }
+          ]
+        },
+        {
+          id: 2,
+          store: "江南皮革厂",
+          deal: "交易失败",
+          goodsList: [
+            {
+              goodsUrl: "//img14.360buyimg.com/n7/jfs/t1/60319/15/6105/406802/5d43f68aE9f00db8c/0affb7ac46c345e2.jpg",
+              title: "【冬日限定】现货 原创jk制服女2020冬装新款小清新宽松软糯毛衣外套女开衫短款百搭日系甜美风",
+              type: "粉色;M",
+              deliveryTime: "付款后7天内发货",
+              price: "128.05",
+              number: 1
+            }
+          ]
+        },
+        {
+          id: 3,
+          store: "三星旗舰店",
+          deal: "交易失败",
+          goodsList: [
+            {
+              goodsUrl: "//img11.360buyimg.com/n7/jfs/t1/94448/29/2734/524808/5dd4cc16E990dfb6b/59c256f85a8c3757.jpg",
+              title: "三星(SAMSUNG)京品家电 UA65RUF70AJXXZ 65英寸4K超高清 HDR 京东微联 智能语音 教育资源液晶电视机",
+              type: "4K,广色域",
+              deliveryTime: "保质5年",
+              price: "1998",
+              number: 3
+            },
+            {
+              goodsUrl: "//img14.360buyimg.com/n7/jfs/t6007/205/4099529191/294869/ae4e6d4f/595dcf19Ndce3227d.jpg!q90.jpg",
+              title: "美的(Midea)639升 对开门冰箱 19分钟急速净味 一级能效冷藏双开门杀菌智能家用双变频节能 BCD-639WKPZM(E)",
+              type: "容量大,速冻",
+              deliveryTime: "保质5年",
+              price: "2354",
+              number: 1
+            }
+          ]
+        },
+        {
+          id: 4,
+          store: "三星旗舰店",
+          deal: "交易失败",
+          goodsList: [
+            {
+              goodsUrl: "//img10.360buyimg.com/n7/jfs/t22300/31/1505958241/171936/9e201a89/5b2b12ffNe6dbb594.jpg!q90.jpg",
+              title: "法国进口红酒 拉菲(LAFITE)传奇波尔多干红葡萄酒750ml*6整箱装",
+              type: "4K,广色域",
+              deliveryTime: "珍藏10年好酒",
+              price: "1543",
+              number: 3
+            },
+            {
+              goodsUrl: "//img10.360buyimg.com/n7/jfs/t1/107598/17/3766/525060/5e143aacE9a94d43c/03573ae60b8bf0ee.jpg",
+              title: "蓝妹(BLUE GIRL)酷爽啤酒 清啤 原装进口啤酒 罐装 500ml*9听 整箱装",
+              type: "一打",
+              deliveryTime: "口感好",
+              price: "120",
+              number: 1
+            }
+          ]
+        },
+        {
+          id: 5,
+          store: "三星旗舰店",
+          deal: "交易成功",
+          goodsList: [
+            {
+              goodsUrl: "//img12.360buyimg.com/n7/jfs/t1/52408/35/3554/78293/5d12e9cfEfd118ba1/ba5995e62cbd747f.jpg!q90.jpg",
+              title: "企业微信 中控人脸指纹识别考勤机刷脸机 无线签到异地多店打卡机WX108",
+              type: "识别效率高",
+              deliveryTime: "使用方便",
+              price: "451",
+              number: 9
+            }
+          ]
+        }
+      ],
+      list: [
+        {
+          name: "待付款"
+        },
+        {
+          name: "待发货"
+        },
+        {
+          name: "待收货"
+        },
+        {
+          name: "待评价",
+          count: 12
+        }
+      ],
+      current: 0,
+      swiperCurrent: 0,
+      tabsHeight: 0,
+      dx: 0,
+      loadStatus: ["loadmore", "loadmore", "loadmore", "loadmore"]
+    };
+  },
+  onLoad() {
+    this.getOrderList(0);
+    this.getOrderList(1);
+    this.getOrderList(3);
+  },
+  computed: {
+    // 价格小数
+    priceDecimal() {
+      return (val) => {
+        if (val !== parseInt(val))
+          return val.slice(-2);
+        else
+          return "00";
+      };
+    },
+    // 价格整数
+    priceInt() {
+      return (val) => {
+        if (val !== parseInt(val))
+          return val.split(".")[0];
+        else
+          return val;
+      };
+    }
+  },
+  methods: {
+    reachBottom() {
+      if (this.current != 2) {
+        this.loadStatus.splice(this.current, 1, "loading");
+        setTimeout(() => {
+          this.getOrderList(this.current);
+        }, 1200);
+      }
+    },
+    // 页面数据
+    getOrderList(idx) {
+      for (let i = 0; i < 5; i++) {
+        let index = this.$u.random(0, this.dataList.length - 1);
+        let data = JSON.parse(JSON.stringify(this.dataList[index]));
+        data.id = this.$u.guid();
+        this.orderList[idx].push(data);
+      }
+      this.loadStatus.splice(this.current, 1, "loadmore");
+    },
+    // 总价
+    totalPrice(item) {
+      let price = 0;
+      item.map((val) => {
+        price += parseFloat(val.price);
+      });
+      return price.toFixed(2);
+    },
+    // 总件数
+    totalNum(item) {
+      let num = 0;
+      item.map((val) => {
+        num += val.number;
+      });
+      return num;
+    },
+    // tab栏切换
+    change(e) {
+      console.log(e);
+      this.swiperCurrent = e.index;
+      this.getOrderList(e.index);
+    },
+    transition({ detail: { dx } }) {
+    },
+    animationfinish({ detail: { current } }) {
+      this.swiperCurrent = current;
+      this.current = current;
+    }
+  }
+};
+if (!Array) {
+  const _easycom_u_tabs2 = common_vendor.resolveComponent("u-tabs");
+  const _easycom_u_icon2 = common_vendor.resolveComponent("u-icon");
+  const _easycom_u_loadmore2 = common_vendor.resolveComponent("u-loadmore");
+  (_easycom_u_tabs2 + _easycom_u_icon2 + _easycom_u_loadmore2)();
+}
+const _easycom_u_tabs = () => "../../uni_modules/uview-plus/components/u-tabs/u-tabs.js";
+const _easycom_u_icon = () => "../../uni_modules/uview-plus/components/u-icon/u-icon.js";
+const _easycom_u_loadmore = () => "../../uni_modules/uview-plus/components/u-loadmore/u-loadmore.js";
+if (!Math) {
+  (_easycom_u_tabs + _easycom_u_icon + _easycom_u_loadmore)();
+}
+function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
+  return {
+    a: common_vendor.sr("tabs", "93207a4f-0"),
+    b: common_vendor.o($options.change),
+    c: common_vendor.p({
+      activeColor: "#f29100",
+      list: $data.list,
+      current: $data.current,
+      ["is-scroll"]: false,
+      swiperWidth: "750"
+    }),
+    d: common_vendor.f($data.orderList[0], (res, index, i0) => {
+      return {
+        a: "93207a4f-1-" + i0,
+        b: common_vendor.t(res.store),
+        c: "93207a4f-2-" + i0,
+        d: common_vendor.t(res.deal),
+        e: common_vendor.f(res.goodsList, (item, index2, i1) => {
+          return {
+            a: item.goodsUrl,
+            b: common_vendor.t(item.title),
+            c: common_vendor.t(item.type),
+            d: common_vendor.t(item.deliveryTime),
+            e: common_vendor.t($options.priceInt(item.price)),
+            f: common_vendor.t($options.priceDecimal(item.price)),
+            g: common_vendor.t(item.number),
+            h: index2
+          };
+        }),
+        f: common_vendor.t($options.totalNum(res.goodsList)),
+        g: common_vendor.t($options.priceInt($options.totalPrice(res.goodsList))),
+        h: common_vendor.t($options.priceDecimal($options.totalPrice(res.goodsList))),
+        i: "93207a4f-3-" + i0,
+        j: res.id
+      };
+    }),
+    e: common_vendor.p({
+      name: "home",
+      size: 30,
+      color: "rgb(94,94,94)"
+    }),
+    f: common_vendor.p({
+      name: "arrow-right",
+      color: "rgb(203,203,203)",
+      size: 26
+    }),
+    g: common_vendor.p({
+      name: "more-dot-fill",
+      color: "rgb(203,203,203)"
+    }),
+    h: common_vendor.p({
+      status: $data.loadStatus[0],
+      bgColor: "#f2f2f2"
+    }),
+    i: common_vendor.o((...args) => $options.reachBottom && $options.reachBottom(...args)),
+    j: common_vendor.f($data.orderList[1], (res, index, i0) => {
+      return {
+        a: "93207a4f-5-" + i0,
+        b: common_vendor.t(res.store),
+        c: "93207a4f-6-" + i0,
+        d: common_vendor.t(res.deal),
+        e: common_vendor.f(res.goodsList, (item, index2, i1) => {
+          return {
+            a: item.goodsUrl,
+            b: common_vendor.t(item.title),
+            c: common_vendor.t(item.type),
+            d: common_vendor.t(item.deliveryTime),
+            e: common_vendor.t($options.priceInt(item.price)),
+            f: common_vendor.t($options.priceDecimal(item.price)),
+            g: common_vendor.t(item.number),
+            h: index2
+          };
+        }),
+        f: common_vendor.t($options.totalNum(res.goodsList)),
+        g: common_vendor.t($options.priceInt($options.totalPrice(res.goodsList))),
+        h: common_vendor.t($options.priceDecimal($options.totalPrice(res.goodsList))),
+        i: "93207a4f-7-" + i0,
+        j: res.id
+      };
+    }),
+    k: common_vendor.p({
+      name: "home",
+      size: 30,
+      color: "rgb(94,94,94)"
+    }),
+    l: common_vendor.p({
+      name: "arrow-right",
+      color: "rgb(203,203,203)",
+      size: 26
+    }),
+    m: common_vendor.p({
+      name: "more-dot-fill",
+      color: "rgb(203,203,203)"
+    }),
+    n: common_vendor.p({
+      status: $data.loadStatus[1],
+      bgColor: "#f2f2f2"
+    }),
+    o: common_vendor.o((...args) => $options.reachBottom && $options.reachBottom(...args)),
+    p: common_vendor.f($data.orderList[3], (res, index, i0) => {
+      return {
+        a: "93207a4f-9-" + i0,
+        b: common_vendor.t(res.store),
+        c: "93207a4f-10-" + i0,
+        d: common_vendor.t(res.deal),
+        e: common_vendor.f(res.goodsList, (item, index2, i1) => {
+          return {
+            a: item.goodsUrl,
+            b: common_vendor.t(item.title),
+            c: common_vendor.t(item.type),
+            d: common_vendor.t(item.deliveryTime),
+            e: common_vendor.t($options.priceInt(item.price)),
+            f: common_vendor.t($options.priceDecimal(item.price)),
+            g: common_vendor.t(item.number),
+            h: index2
+          };
+        }),
+        f: common_vendor.t($options.totalNum(res.goodsList)),
+        g: common_vendor.t($options.priceInt($options.totalPrice(res.goodsList))),
+        h: common_vendor.t($options.priceDecimal($options.totalPrice(res.goodsList))),
+        i: "93207a4f-11-" + i0,
+        j: res.id
+      };
+    }),
+    q: common_vendor.p({
+      name: "home",
+      size: 30,
+      color: "rgb(94,94,94)"
+    }),
+    r: common_vendor.p({
+      name: "arrow-right",
+      color: "rgb(203,203,203)",
+      size: 26
+    }),
+    s: common_vendor.p({
+      name: "more-dot-fill",
+      color: "rgb(203,203,203)"
+    }),
+    t: common_vendor.p({
+      status: $data.loadStatus[3],
+      bgColor: "#f2f2f2"
+    }),
+    v: common_vendor.o((...args) => $options.reachBottom && $options.reachBottom(...args)),
+    w: $data.swiperCurrent,
+    x: common_vendor.o((...args) => $options.transition && $options.transition(...args)),
+    y: common_vendor.o((...args) => $options.animationfinish && $options.animationfinish(...args))
+  };
+}
+const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-93207a4f"], ["__file", "D:/里海数字乡村/purchase-let/pages/order/order.vue"]]);
+wx.createPage(MiniProgramPage);
diff --git a/unpackage/dist/dev/mp-weixin/pages/order/order.json b/unpackage/dist/dev/mp-weixin/pages/order/order.json
new file mode 100644
index 0000000..c621f98
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages/order/order.json
@@ -0,0 +1,9 @@
+{
+  "navigationBarTitleText": "订单",
+  "enablePullDownRefresh": false,
+  "usingComponents": {
+    "u-tabs": "../../uni_modules/uview-plus/components/u-tabs/u-tabs",
+    "u-icon": "../../uni_modules/uview-plus/components/u-icon/u-icon",
+    "u-loadmore": "../../uni_modules/uview-plus/components/u-loadmore/u-loadmore"
+  }
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/pages/order/order.wxml b/unpackage/dist/dev/mp-weixin/pages/order/order.wxml
new file mode 100644
index 0000000..7b4c1e2
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages/order/order.wxml
@@ -0,0 +1 @@
+<view class="data-v-93207a4f"><view class="wrap data-v-93207a4f"><view class="u-tabs-box data-v-93207a4f"><u-tabs wx:if="{{c}}" class="r data-v-93207a4f" u-r="tabs" bindchange="{{b}}" u-i="93207a4f-0" bind:__l="__l" u-p="{{c}}"></u-tabs></view><swiper class="swiper-box data-v-93207a4f" current="{{w}}" bindtransition="{{x}}" bindanimationfinish="{{y}}"><swiper-item class="swiper-item data-v-93207a4f"><scroll-view class="data-v-93207a4f" scroll-y style="height:100%;width:100%" bindscrolltolower="{{i}}"><view class="page-box data-v-93207a4f"><view wx:for="{{d}}" wx:for-item="res" wx:key="j" class="order data-v-93207a4f"><view class="top data-v-93207a4f"><view class="left data-v-93207a4f"><u-icon wx:if="{{e}}" class="data-v-93207a4f" u-i="{{res.a}}" bind:__l="__l" u-p="{{e}}"></u-icon><view class="store data-v-93207a4f">{{res.b}}</view><u-icon wx:if="{{f}}" class="data-v-93207a4f" u-i="{{res.c}}" bind:__l="__l" u-p="{{f}}"></u-icon></view><view class="right data-v-93207a4f">{{res.d}}</view></view><view wx:for="{{res.e}}" wx:for-item="item" wx:key="h" class="item data-v-93207a4f"><view class="left data-v-93207a4f"><image class="data-v-93207a4f" src="{{item.a}}" mode="aspectFill"></image></view><view class="content data-v-93207a4f"><view class="title u-line-2 data-v-93207a4f">{{item.b}}</view><view class="type data-v-93207a4f">{{item.c}}</view><view class="delivery-time data-v-93207a4f">发货时间 {{item.d}}</view></view><view class="right data-v-93207a4f"><view class="price data-v-93207a4f"> ¥{{item.e}} <text class="decimal data-v-93207a4f">.{{item.f}}</text></view><view class="number data-v-93207a4f">x{{item.g}}</view></view></view><view class="total data-v-93207a4f"> 共{{res.f}}件商品 合计: <text class="total-price data-v-93207a4f"> ¥{{res.g}}. <text class="decimal data-v-93207a4f">{{res.h}}</text></text></view><view class="bottom data-v-93207a4f"><view class="more data-v-93207a4f"><u-icon wx:if="{{g}}" class="data-v-93207a4f" u-i="{{res.i}}" bind:__l="__l" u-p="{{g}}"></u-icon></view><view class="logistics btn data-v-93207a4f">查看物流</view><view class="exchange btn data-v-93207a4f">卖了换钱</view><view class="evaluate btn data-v-93207a4f">评价</view></view></view><u-loadmore wx:if="{{h}}" class="data-v-93207a4f" u-i="93207a4f-4" bind:__l="__l" u-p="{{h}}"></u-loadmore></view></scroll-view></swiper-item><swiper-item class="swiper-item data-v-93207a4f"><scroll-view class="data-v-93207a4f" scroll-y style="height:100%;width:100%" bindscrolltolower="{{o}}"><view class="page-box data-v-93207a4f"><view wx:for="{{j}}" wx:for-item="res" wx:key="j" class="order data-v-93207a4f"><view class="top data-v-93207a4f"><view class="left data-v-93207a4f"><u-icon wx:if="{{k}}" class="data-v-93207a4f" u-i="{{res.a}}" bind:__l="__l" u-p="{{k}}"></u-icon><view class="store data-v-93207a4f">{{res.b}}</view><u-icon wx:if="{{l}}" class="data-v-93207a4f" u-i="{{res.c}}" bind:__l="__l" u-p="{{l}}"></u-icon></view><view class="right data-v-93207a4f">{{res.d}}</view></view><view wx:for="{{res.e}}" wx:for-item="item" wx:key="h" class="item data-v-93207a4f"><view class="left data-v-93207a4f"><image class="data-v-93207a4f" src="{{item.a}}" mode="aspectFill"></image></view><view class="content data-v-93207a4f"><view class="title u-line-2 data-v-93207a4f">{{item.b}}</view><view class="type data-v-93207a4f">{{item.c}}</view><view class="delivery-time data-v-93207a4f">发货时间 {{item.d}}</view></view><view class="right data-v-93207a4f"><view class="price data-v-93207a4f"> ¥{{item.e}} <text class="decimal data-v-93207a4f">.{{item.f}}</text></view><view class="number data-v-93207a4f">x{{item.g}}</view></view></view><view class="total data-v-93207a4f"> 共{{res.f}}件商品 合计: <text class="total-price data-v-93207a4f"> ¥{{res.g}}. <text class="decimal data-v-93207a4f">{{res.h}}</text></text></view><view class="bottom data-v-93207a4f"><view class="more data-v-93207a4f"><u-icon wx:if="{{m}}" class="data-v-93207a4f" u-i="{{res.i}}" bind:__l="__l" u-p="{{m}}"></u-icon></view><view class="logistics btn data-v-93207a4f">查看物流</view><view class="exchange btn data-v-93207a4f">卖了换钱</view><view class="evaluate btn data-v-93207a4f">评价</view></view></view><u-loadmore wx:if="{{n}}" class="data-v-93207a4f" u-i="93207a4f-8" bind:__l="__l" u-p="{{n}}"></u-loadmore></view></scroll-view></swiper-item><swiper-item class="swiper-item data-v-93207a4f"><scroll-view class="data-v-93207a4f" scroll-y style="height:100%;width:100%"><view class="page-box data-v-93207a4f"><view class="data-v-93207a4f"><view class="centre data-v-93207a4f"><image class="data-v-93207a4f" src="https://cdn.uviewui.com/uview/template/taobao-order.png" mode=""></image><view class="explain data-v-93207a4f"> 您还没有相关的订单 <view class="tips data-v-93207a4f">可以去看看有那些想买的</view></view><view class="btn data-v-93207a4f">随便逛逛</view></view></view></view></scroll-view></swiper-item><swiper-item class="swiper-item data-v-93207a4f"><scroll-view class="data-v-93207a4f" scroll-y style="height:100%;width:100%" bindscrolltolower="{{v}}"><view class="page-box data-v-93207a4f"><view wx:for="{{p}}" wx:for-item="res" wx:key="j" class="order data-v-93207a4f"><view class="top data-v-93207a4f"><view class="left data-v-93207a4f"><u-icon wx:if="{{q}}" class="data-v-93207a4f" u-i="{{res.a}}" bind:__l="__l" u-p="{{q}}"></u-icon><view class="store data-v-93207a4f">{{res.b}}</view><u-icon wx:if="{{r}}" class="data-v-93207a4f" u-i="{{res.c}}" bind:__l="__l" u-p="{{r}}"></u-icon></view><view class="right data-v-93207a4f">{{res.d}}</view></view><view wx:for="{{res.e}}" wx:for-item="item" wx:key="h" class="item data-v-93207a4f"><view class="left data-v-93207a4f"><image class="data-v-93207a4f" src="{{item.a}}" mode="aspectFill"></image></view><view class="content data-v-93207a4f"><view class="title u-line-2 data-v-93207a4f">{{item.b}}</view><view class="type data-v-93207a4f">{{item.c}}</view><view class="delivery-time data-v-93207a4f">发货时间 {{item.d}}</view></view><view class="right data-v-93207a4f"><view class="price data-v-93207a4f"> ¥{{item.e}} <text class="decimal data-v-93207a4f">.{{item.f}}</text></view><view class="number data-v-93207a4f">x{{item.g}}</view></view></view><view class="total data-v-93207a4f"> 共{{res.f}}件商品 合计: <text class="total-price data-v-93207a4f"> ¥{{res.g}}. <text class="decimal data-v-93207a4f">{{res.h}}</text></text></view><view class="bottom data-v-93207a4f"><view class="more data-v-93207a4f"><u-icon wx:if="{{s}}" class="data-v-93207a4f" u-i="{{res.i}}" bind:__l="__l" u-p="{{s}}"></u-icon></view><view class="logistics btn data-v-93207a4f">查看物流</view><view class="exchange btn data-v-93207a4f">卖了换钱</view><view class="evaluate btn data-v-93207a4f">评价</view></view></view><u-loadmore wx:if="{{t}}" class="data-v-93207a4f" u-i="93207a4f-12" bind:__l="__l" u-p="{{t}}"></u-loadmore></view></scroll-view></swiper-item></swiper></view></view>
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/pages/order/order.wxss b/unpackage/dist/dev/mp-weixin/pages/order/order.wxss
new file mode 100644
index 0000000..4793dd5
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages/order/order.wxss
@@ -0,0 +1,161 @@
+
+page {
+	height: 100%;
+	background-color: #f2f2f2;
+}
+
+
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+/* 颜色变量 */
+/* 行为相关颜色 */
+/* 文字基本颜色 */
+/* 背景颜色 */
+/* 边框颜色 */
+/* 尺寸变量 */
+/* 文字尺寸 */
+/* 图片尺寸 */
+/* Border Radius */
+/* 水平间距 */
+/* 垂直间距 */
+/* 透明度 */
+/* 文章场景相关 */
+.order.data-v-93207a4f {
+  width: 710rpx;
+  background-color: #ffffff;
+  margin: 20rpx auto;
+  border-radius: 20rpx;
+  box-sizing: border-box;
+  padding: 20rpx;
+  font-size: 28rpx;
+}
+.order .top.data-v-93207a4f {
+  display: flex;
+  justify-content: space-between;
+}
+.order .top .left.data-v-93207a4f {
+  display: flex;
+  align-items: center;
+}
+.order .top .left .store.data-v-93207a4f {
+  margin: 0 10rpx;
+  font-size: 32rpx;
+  font-weight: bold;
+}
+.order .top .right.data-v-93207a4f {
+  color: #f1a532;
+}
+.order .item.data-v-93207a4f {
+  display: flex;
+  margin: 20rpx 0 0;
+}
+.order .item .left.data-v-93207a4f {
+  margin-right: 20rpx;
+}
+.order .item .left image.data-v-93207a4f {
+  width: 200rpx;
+  height: 200rpx;
+  border-radius: 10rpx;
+}
+.order .item .content .title.data-v-93207a4f {
+  font-size: 28rpx;
+  line-height: 50rpx;
+}
+.order .item .content .type.data-v-93207a4f {
+  margin: 10rpx 0;
+  font-size: 24rpx;
+  color: #909193;
+}
+.order .item .content .delivery-time.data-v-93207a4f {
+  color: #e5d001;
+  font-size: 24rpx;
+}
+.order .item .right.data-v-93207a4f {
+  margin-left: 10rpx;
+  padding-top: 20rpx;
+  text-align: right;
+}
+.order .item .right .decimal.data-v-93207a4f {
+  font-size: 24rpx;
+  margin-top: 4rpx;
+}
+.order .item .right .number.data-v-93207a4f {
+  color: #909193;
+  font-size: 24rpx;
+}
+.order .total.data-v-93207a4f {
+  margin-top: 20rpx;
+  text-align: right;
+  font-size: 24rpx;
+}
+.order .total .total-price.data-v-93207a4f {
+  font-size: 32rpx;
+}
+.order .bottom.data-v-93207a4f {
+  display: flex;
+  margin-top: 40rpx;
+  padding: 0 10rpx;
+  justify-content: space-between;
+  align-items: center;
+}
+.order .bottom .btn.data-v-93207a4f {
+  line-height: 52rpx;
+  width: 160rpx;
+  border-radius: 26rpx;
+  border: 2rpx solid #dadbde;
+  font-size: 26rpx;
+  text-align: center;
+  color: #767a82;
+}
+.order .bottom .evaluate.data-v-93207a4f {
+  color: #f1a532;
+  border-color: #f1a532;
+}
+.centre.data-v-93207a4f {
+  text-align: center;
+  margin: 200rpx auto;
+  font-size: 32rpx;
+}
+.centre image.data-v-93207a4f {
+  width: 164rpx;
+  height: 164rpx;
+  border-radius: 50%;
+  margin-bottom: 20rpx;
+}
+.centre .tips.data-v-93207a4f {
+  font-size: 24rpx;
+  color: #999999;
+  margin-top: 20rpx;
+}
+.centre .btn.data-v-93207a4f {
+  margin: 80rpx auto;
+  width: 200rpx;
+  border-radius: 32rpx;
+  line-height: 64rpx;
+  color: #ffffff;
+  font-size: 26rpx;
+  background: linear-gradient(270deg, #f9745a 0%, #ff9e01 100%);
+}
+.wrap.data-v-93207a4f {
+  display: flex;
+  flex-direction: column;
+  height: calc(100vh - var(--window-top));
+  width: 100%;
+}
+.swiper-box.data-v-93207a4f {
+  flex: 1;
+  height: calc(100vh - var(--window-top));
+}
+.swiper-item.data-v-93207a4f {
+  height: 100%;
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/project.config.json b/unpackage/dist/dev/mp-weixin/project.config.json
new file mode 100644
index 0000000..5cc071b
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/project.config.json
@@ -0,0 +1,31 @@
+{
+  "description": "项目配置文件。",
+  "packOptions": {
+    "ignore": [],
+    "include": []
+  },
+  "setting": {
+    "urlCheck": false,
+    "es6": true,
+    "postcss": false,
+    "minified": false,
+    "newFeature": true,
+    "bigPackageSizeSupport": true,
+    "babelSetting": {
+      "ignore": [],
+      "disablePlugins": [],
+      "outputPath": ""
+    },
+    "condition": false,
+    "ignoreUploadUnusedFiles": false
+  },
+  "compileType": "miniprogram",
+  "libVersion": "3.3.4",
+  "appid": "touristappid",
+  "projectname": "purchase-let",
+  "condition": {},
+  "editorSetting": {
+    "tabIndent": "insertSpaces",
+    "tabSize": 2
+  }
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/project.private.config.json b/unpackage/dist/dev/mp-weixin/project.private.config.json
new file mode 100644
index 0000000..5095b97
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/project.private.config.json
@@ -0,0 +1,7 @@
+{
+  "description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html",
+  "projectname": "purchase-let",
+  "setting": {
+    "compileHotReLoad": true
+  }
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/static/icon/check.png b/unpackage/dist/dev/mp-weixin/static/icon/check.png
new file mode 100644
index 0000000..41ae5cd
Binary files /dev/null and b/unpackage/dist/dev/mp-weixin/static/icon/check.png differ
diff --git a/unpackage/dist/dev/mp-weixin/static/icon/n-check.png b/unpackage/dist/dev/mp-weixin/static/icon/n-check.png
new file mode 100644
index 0000000..1e9f45a
Binary files /dev/null and b/unpackage/dist/dev/mp-weixin/static/icon/n-check.png differ
diff --git a/unpackage/dist/dev/mp-weixin/static/logo.png b/unpackage/dist/dev/mp-weixin/static/logo.png
new file mode 100644
index 0000000..b5771e2
Binary files /dev/null and b/unpackage/dist/dev/mp-weixin/static/logo.png differ
diff --git a/unpackage/dist/dev/mp-weixin/store/user.js b/unpackage/dist/dev/mp-weixin/store/user.js
new file mode 100644
index 0000000..3fdcbeb
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/store/user.js
@@ -0,0 +1,12 @@
+"use strict";
+const common_vendor = require("../common/vendor.js");
+const useUserStore = common_vendor.defineStore("user", () => {
+  const userInfo = common_vendor.ref(common_vendor.index.getStorageSync("userInfo") || {});
+  const token = common_vendor.ref(common_vendor.index.getStorageSync("token") || "");
+  const setToken = (data) => {
+    token.value = data;
+    common_vendor.index.setStorageSync("token", data);
+  };
+  return { userInfo, setToken, token, setToken };
+});
+exports.useUserStore = useUserStore;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-avatar/props.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-avatar/props.js
new file mode 100644
index 0000000..73867bc
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-avatar/props.js
@@ -0,0 +1,82 @@
+"use strict";
+const uni_modules_uviewPlus_libs_config_props = require("../../libs/config/props.js");
+const uni_modules_uviewPlus_libs_function_test = require("../../libs/function/test.js");
+const props = {
+  props: {
+    // 头像图片路径(不能为相对路径)
+    src: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.avatar.src
+    },
+    // 头像形状,circle-圆形,square-方形
+    shape: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.avatar.shape
+    },
+    // 头像尺寸
+    size: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.avatar.size
+    },
+    // 裁剪模式
+    mode: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.avatar.mode
+    },
+    // 显示的文字
+    text: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.avatar.text
+    },
+    // 背景色
+    bgColor: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.avatar.bgColor
+    },
+    // 文字颜色
+    color: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.avatar.color
+    },
+    // 文字大小
+    fontSize: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.avatar.fontSize
+    },
+    // 显示的图标
+    icon: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.avatar.icon
+    },
+    // 显示小程序头像,只对百度,微信,QQ小程序有效
+    mpAvatar: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.avatar.mpAvatar
+    },
+    // 是否使用随机背景色
+    randomBgColor: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.avatar.randomBgColor
+    },
+    // 加载失败的默认头像(组件有内置默认图片)
+    defaultUrl: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.avatar.defaultUrl
+    },
+    // 如果配置了randomBgColor为true,且配置了此值,则从默认的背景色数组中取出对应索引的颜色值,取值0-19之间
+    colorIndex: {
+      type: [String, Number],
+      // 校验参数规则,索引在0-19之间
+      validator(n) {
+        return uni_modules_uviewPlus_libs_function_test.test.range(n, [0, 19]) || n === "";
+      },
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.avatar.colorIndex
+    },
+    // 组件标识符
+    name: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.avatar.name
+    }
+  }
+};
+exports.props = props;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-avatar/u-avatar.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-avatar/u-avatar.js
new file mode 100644
index 0000000..d5d14c8
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-avatar/u-avatar.js
@@ -0,0 +1,234 @@
+"use strict";
+const uni_modules_uviewPlus_components_uAvatar_props = require("./props.js");
+const uni_modules_uviewPlus_libs_mixin_mpMixin = require("../../libs/mixin/mpMixin.js");
+const uni_modules_uviewPlus_libs_mixin_mixin = require("../../libs/mixin/mixin.js");
+const uni_modules_uviewPlus_libs_function_index = require("../../libs/function/index.js");
+const common_vendor = require("../../../../common/vendor.js");
+require("../../libs/config/props.js");
+require("../../libs/config/config.js");
+require("../../libs/config/props/actionSheet.js");
+require("../../libs/config/props/album.js");
+require("../../libs/config/props/alert.js");
+require("../../libs/config/props/avatar.js");
+require("../../libs/config/props/avatarGroup.js");
+require("../../libs/config/props/backtop.js");
+require("../../libs/config/props/badge.js");
+require("../../libs/config/props/button.js");
+require("../../libs/config/props/calendar.js");
+require("../../libs/config/props/carKeyboard.js");
+require("../../libs/config/props/cell.js");
+require("../../libs/config/props/cellGroup.js");
+require("../../libs/config/props/checkbox.js");
+require("../../libs/config/props/checkboxGroup.js");
+require("../../libs/config/props/circleProgress.js");
+require("../../libs/config/props/code.js");
+require("../../libs/config/props/codeInput.js");
+require("../../libs/config/props/col.js");
+require("../../libs/config/props/collapse.js");
+require("../../libs/config/props/collapseItem.js");
+require("../../libs/config/props/columnNotice.js");
+require("../../libs/config/props/countDown.js");
+require("../../libs/config/props/countTo.js");
+require("../../libs/config/props/datetimePicker.js");
+require("../../libs/config/props/divider.js");
+require("../../libs/config/props/empty.js");
+require("../../libs/config/props/form.js");
+require("../../libs/config/props/formItem.js");
+require("../../libs/config/props/gap.js");
+require("../../libs/config/props/grid.js");
+require("../../libs/config/props/gridItem.js");
+require("../../libs/config/props/icon.js");
+require("../../libs/config/props/image.js");
+require("../../libs/config/props/indexAnchor.js");
+require("../../libs/config/props/indexList.js");
+require("../../libs/config/props/input.js");
+require("../../libs/config/props/keyboard.js");
+require("../../libs/config/props/line.js");
+require("../../libs/config/props/lineProgress.js");
+require("../../libs/config/props/link.js");
+require("../../libs/config/props/list.js");
+require("../../libs/config/props/listItem.js");
+require("../../libs/config/props/loadingIcon.js");
+require("../../libs/config/props/loadingPage.js");
+require("../../libs/config/props/loadmore.js");
+require("../../libs/config/props/modal.js");
+require("../../libs/config/props/navbar.js");
+require("../../libs/config/color.js");
+require("../../libs/config/props/noNetwork.js");
+require("../../libs/config/props/noticeBar.js");
+require("../../libs/config/props/notify.js");
+require("../../libs/config/props/numberBox.js");
+require("../../libs/config/props/numberKeyboard.js");
+require("../../libs/config/props/overlay.js");
+require("../../libs/config/props/parse.js");
+require("../../libs/config/props/picker.js");
+require("../../libs/config/props/popup.js");
+require("../../libs/config/props/radio.js");
+require("../../libs/config/props/radioGroup.js");
+require("../../libs/config/props/rate.js");
+require("../../libs/config/props/readMore.js");
+require("../../libs/config/props/row.js");
+require("../../libs/config/props/rowNotice.js");
+require("../../libs/config/props/scrollList.js");
+require("../../libs/config/props/search.js");
+require("../../libs/config/props/section.js");
+require("../../libs/config/props/skeleton.js");
+require("../../libs/config/props/slider.js");
+require("../../libs/config/props/statusBar.js");
+require("../../libs/config/props/steps.js");
+require("../../libs/config/props/stepsItem.js");
+require("../../libs/config/props/sticky.js");
+require("../../libs/config/props/subsection.js");
+require("../../libs/config/props/swipeAction.js");
+require("../../libs/config/props/swipeActionItem.js");
+require("../../libs/config/props/swiper.js");
+require("../../libs/config/props/swipterIndicator.js");
+require("../../libs/config/props/switch.js");
+require("../../libs/config/props/tabbar.js");
+require("../../libs/config/props/tabbarItem.js");
+require("../../libs/config/props/tabs.js");
+require("../../libs/config/props/tag.js");
+require("../../libs/config/props/text.js");
+require("../../libs/config/props/textarea.js");
+require("../../libs/config/props/toast.js");
+require("../../libs/config/props/toolbar.js");
+require("../../libs/config/props/tooltip.js");
+require("../../libs/config/props/transition.js");
+require("../../libs/config/props/upload.js");
+require("../../libs/function/test.js");
+require("../../libs/util/route.js");
+require("../../libs/function/digit.js");
+const base64Avatar = "data:image/jpg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAA8AAD/4QMraHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjMtYzAxMSA2Ni4xNDU2NjEsIDIwMTIvMDIvMDYtMTQ6NTY6MjcgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjREMEQwRkY0RjgwNDExRUE5OTY2RDgxODY3NkJFODMxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjREMEQwRkY1RjgwNDExRUE5OTY2RDgxODY3NkJFODMxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NEQwRDBGRjJGODA0MTFFQTk5NjZEODE4Njc2QkU4MzEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NEQwRDBGRjNGODA0MTFFQTk5NjZEODE4Njc2QkU4MzEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/7gAOQWRvYmUAZMAAAAAB/9sAhAAGBAQEBQQGBQUGCQYFBgkLCAYGCAsMCgoLCgoMEAwMDAwMDBAMDg8QDw4MExMUFBMTHBsbGxwfHx8fHx8fHx8fAQcHBw0MDRgQEBgaFREVGh8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx//wAARCADIAMgDAREAAhEBAxEB/8QAcQABAQEAAwEBAAAAAAAAAAAAAAUEAQMGAgcBAQAAAAAAAAAAAAAAAAAAAAAQAAIBAwICBgkDBQAAAAAAAAABAhEDBCEFMVFBYXGREiKBscHRMkJSEyOh4XLxYjNDFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8A/fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHbHFyZ/Dam+yLA+Z2L0Pjtyj2poD4AAAAAAAAAAAAAAAAAAAAAAAAKWFs9y6lcvvwQeqj8z9wFaziY1n/HbUX9XF97A7QAGXI23EvJ1goyfzR0YEfN269jeZ+a03pNe0DIAAAAAAAAAAAAAAAAAAAACvtO3RcVkXlWutuL9YFYAAAAAOJRjKLjJVi9GmB5/csH/mu1h/in8PU+QGMAAAAAAAAAAAAAAAAAAaMDG/6MmMH8C80+xAelSSVFolwQAAAAAAAHVlWI37ErUulaPk+hgeYnCUJuElSUXRrrQHAAAAAAAAAAAAAAAAABa2Oz4bM7r4zdF2ICmAAAAAAAAAg7zZ8GX41wuJP0rRgYAAAAAAAAAAAAAAAAAD0m2R8ODaXU33tsDSAAAAAAAAAlb9HyWZcnJd9PcBHAAAAAAAAAAAAAAAAAPS7e64Vn+KA0AAAAAAAAAJm+v8Ftf3ewCKAAAAAAAAAAAAAAAAAX9muqeGo9NttP06+0DcAAAAAAAAAjb7dTu2ra+VOT9P8AQCWAAAAAAAAAAAAAAAAAUNmyPt5Ltv4bui/kuAF0AAAAAAADiUlGLlJ0SVW+oDzOXfd/Ind6JPRdS0QHSAAAAAAAAAAAAAAAAAE2nVaNcGB6Lbs6OTao9LsF51z60BrAAAAAABJ3jOVHjW3r/sa9QEgAAAAAAAAAAAAAAAAAAAPu1duWriuW34ZR4MC9hbnZyEoy8l36XwfYBsAAADaSq9EuLAlZ+7xSdrGdW9Hc5dgEdtt1erfFgAAAAAAAAAAAAAAAAADVjbblX6NR8MH80tEBRs7HYivyzlN8lovaBPzduvY0m6eK10TXtAyAarO55lpJK54orolr+4GqO/Xaea1FvqbXvA+Z77kNeW3GPbV+4DJfzcm/pcm3H6Vou5AdAFLC2ed2Pjv1txa8sV8T6wOL+yZEKu1JXFy4MDBOE4ScZxcZLinoB8gAAAAAAAAAAAB242LeyJ+C3GvN9C7QLmJtePYpKS+5c+p8F2IDYAANJqj1T4oCfk7Nj3G5Wn9qXJax7gJ93Z82D8sVNc4v30A6Xg5i42Z+iLfqARwcyT0sz9MWvWBps7LlTf5Grce9/oBTxdtxseklHxT+uWr9AGoAB138ezfj4bsFJdD6V2MCPm7RdtJzs1uW1xXzL3gTgAAAAAAAAADRhYc8q74I6RWs5ckB6GxYtWLat21SK731sDsAAAAAAAAAAAAAAAASt021NO/YjrxuQXT1oCOAAAAAAABzGLlJRSq26JAelwsWONYjbXxcZvmwO8AAAAAAAAAAAAAAAAAAef3TEWPkVivx3NY9T6UBiAAAAAABo2+VmGXblddIJ8eivRUD0oAAAAAAAAAAAAAAAAAAAYt4tKeFKVNYNSXfRgefAAAAAAAAr7VuSSWPedKaW5v1MCsAAAAAAAAAAAAAAAAAAIe6bj96Ts2n+JPzSXzP3ATgAAAAAAAAFbbt1UUrOQ9FpC4/UwK6aaqtU+DAAAAAAAAAAAAAAA4lKMIuUmoxWrb4ARNx3R3q2rLpa4Sl0y/YCcAAAAAAAAAAANmFud7G8r89r6X0dgFvGzLGRGtuWvTF6NAdwAAAAAAAAAAAy5W442PVN+K59EePp5ARMvOv5MvO6QXCC4AZwAAAAAAAAAAAAAcxlKLUotprg1owN+PvORborq+7Hnwl3gUbO74VzRydt8pKn68ANcJwmqwkpLmnUDkAAAAfNy9atqtyagut0AxXt5xIV8Fbj6lRd7Am5G65V6qUvtwfyx94GMAAAAAAAAAAAAAAAAAAAOU2nVOj5gdsc3LiqRvTpyqwOxbnnrhdfpSfrQB7pnv/AGvuS9gHXPMy5/Fem1yq0v0A6W29XqwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//Z";
+const _sfc_main = {
+  name: "u-avatar",
+  mixins: [uni_modules_uviewPlus_libs_mixin_mpMixin.mpMixin, uni_modules_uviewPlus_libs_mixin_mixin.mixin, uni_modules_uviewPlus_components_uAvatar_props.props],
+  data() {
+    return {
+      // 如果配置randomBgColor参数为true,在图标或者文字的模式下,会随机从中取出一个颜色值当做背景色
+      colors: [
+        "#ffb34b",
+        "#f2bba9",
+        "#f7a196",
+        "#f18080",
+        "#88a867",
+        "#bfbf39",
+        "#89c152",
+        "#94d554",
+        "#f19ec2",
+        "#afaae4",
+        "#e1b0df",
+        "#c38cc1",
+        "#72dcdc",
+        "#9acdcb",
+        "#77b1cc",
+        "#448aca",
+        "#86cefa",
+        "#98d1ee",
+        "#73d1f1",
+        "#80a7dc"
+      ],
+      avatarUrl: this.src,
+      allowMp: false
+    };
+  },
+  watch: {
+    // 监听头像src的变化,赋值给内部的avatarUrl变量,因为图片加载失败时,需要修改图片的src为默认值
+    // 而组件内部不能直接修改props的值,所以需要一个中间变量
+    src: {
+      immediate: true,
+      handler(newVal) {
+        this.avatarUrl = newVal;
+        if (!newVal) {
+          this.errorHandler();
+        }
+      }
+    }
+  },
+  computed: {
+    imageStyle() {
+      const style = {};
+      return style;
+    }
+  },
+  created() {
+    this.init();
+  },
+  emits: ["click"],
+  methods: {
+    addStyle: uni_modules_uviewPlus_libs_function_index.addStyle,
+    addUnit: uni_modules_uviewPlus_libs_function_index.addUnit,
+    random: uni_modules_uviewPlus_libs_function_index.random,
+    init() {
+      this.allowMp = true;
+    },
+    // 判断传入的name属性,是否图片路径,只要带有"/"均认为是图片形式
+    isImg() {
+      return this.src.indexOf("/") !== -1;
+    },
+    // 图片加载时失败时触发
+    errorHandler() {
+      this.avatarUrl = this.defaultUrl || base64Avatar;
+    },
+    clickHandler() {
+      this.$emit("click", this.name);
+    }
+  }
+};
+if (!Array) {
+  const _easycom_u_icon2 = common_vendor.resolveComponent("u-icon");
+  const _easycom_up_text2 = common_vendor.resolveComponent("up-text");
+  (_easycom_u_icon2 + _easycom_up_text2)();
+}
+const _easycom_u_icon = () => "../u-icon/u-icon.js";
+const _easycom_up_text = () => "../u-text/u-text.js";
+if (!Math) {
+  (_easycom_u_icon + _easycom_up_text)();
+}
+function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
+  return common_vendor.e({
+    a: _ctx.mpAvatar && $data.allowMp
+  }, _ctx.mpAvatar && $data.allowMp ? {
+    b: common_vendor.s({
+      width: $options.addUnit(_ctx.size),
+      height: $options.addUnit(_ctx.size)
+    })
+  } : {}, {
+    c: _ctx.mpAvatar && $data.allowMp
+  }, _ctx.mpAvatar && $data.allowMp ? {} : _ctx.icon ? {
+    e: common_vendor.p({
+      name: _ctx.icon,
+      size: _ctx.fontSize,
+      color: _ctx.color
+    })
+  } : _ctx.text ? {
+    g: common_vendor.p({
+      text: _ctx.text,
+      size: _ctx.fontSize,
+      color: _ctx.color,
+      align: "center",
+      customStyle: "justify-content: center"
+    })
+  } : {
+    h: common_vendor.n(`u-avatar__image--${_ctx.shape}`),
+    i: $data.avatarUrl || _ctx.defaultUrl,
+    j: _ctx.mode,
+    k: common_vendor.o((...args) => $options.errorHandler && $options.errorHandler(...args)),
+    l: common_vendor.s({
+      width: $options.addUnit(_ctx.size),
+      height: $options.addUnit(_ctx.size)
+    })
+  }, {
+    d: _ctx.icon,
+    f: _ctx.text,
+    m: common_vendor.n(`u-avatar--${_ctx.shape}`),
+    n: common_vendor.s({
+      backgroundColor: _ctx.text || _ctx.icon ? _ctx.randomBgColor ? $data.colors[_ctx.colorIndex !== "" ? _ctx.colorIndex : $options.random(0, 19)] : _ctx.bgColor : "transparent",
+      width: $options.addUnit(_ctx.size),
+      height: $options.addUnit(_ctx.size)
+    }),
+    o: common_vendor.s($options.addStyle(_ctx.customStyle)),
+    p: common_vendor.o((...args) => $options.clickHandler && $options.clickHandler(...args))
+  });
+}
+const Component = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-34d954f9"], ["__file", "D:/里海数字乡村/purchase-let/uni_modules/uview-plus/components/u-avatar/u-avatar.vue"]]);
+wx.createComponent(Component);
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-avatar/u-avatar.json b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-avatar/u-avatar.json
new file mode 100644
index 0000000..3185d42
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-avatar/u-avatar.json
@@ -0,0 +1,7 @@
+{
+  "component": true,
+  "usingComponents": {
+    "u-icon": "../u-icon/u-icon",
+    "up-text": "../u-text/u-text"
+  }
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-avatar/u-avatar.wxml b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-avatar/u-avatar.wxml
new file mode 100644
index 0000000..a9e0510
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-avatar/u-avatar.wxml
@@ -0,0 +1 @@
+<view class="{{['u-avatar', 'data-v-34d954f9', m]}}" style="{{n + ';' + o}}" bindtap="{{p}}"><block wx:if="{{$slots.d}}"><slot></slot></block><block wx:else><open-data wx:if="{{a}}" class="data-v-34d954f9" type="userAvatarUrl" style="{{b}}"/><block wx:if="{{c}}"></block><u-icon wx:elif="{{d}}" class="data-v-34d954f9" u-i="34d954f9-0" bind:__l="__l" u-p="{{e}}"></u-icon><up-text wx:elif="{{f}}" class="data-v-34d954f9" u-i="34d954f9-1" bind:__l="__l" u-p="{{g}}"></up-text><image wx:else class="{{['u-avatar__image', 'data-v-34d954f9', h]}}" src="{{i}}" mode="{{j}}" binderror="{{k}}" style="{{l}}"></image></block></view>
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-avatar/u-avatar.wxss b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-avatar/u-avatar.wxss
new file mode 100644
index 0000000..4cf4dfb
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-avatar/u-avatar.wxss
@@ -0,0 +1,60 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+/* 颜色变量 */
+/* 行为相关颜色 */
+/* 文字基本颜色 */
+/* 背景颜色 */
+/* 边框颜色 */
+/* 尺寸变量 */
+/* 文字尺寸 */
+/* 图片尺寸 */
+/* Border Radius */
+/* 水平间距 */
+/* 垂直间距 */
+/* 透明度 */
+/* 文章场景相关 */
+.u-empty.data-v-34d954f9,
+.u-empty__wrap.data-v-34d954f9,
+.u-tabs.data-v-34d954f9,
+.u-tabs__wrapper.data-v-34d954f9,
+.u-tabs__wrapper__scroll-view-wrapper.data-v-34d954f9,
+.u-tabs__wrapper__scroll-view.data-v-34d954f9,
+.u-tabs__wrapper__nav.data-v-34d954f9,
+.u-tabs__wrapper__nav__line.data-v-34d954f9 {
+  display: flex;
+  flex-direction: column;
+  flex-shrink: 0;
+  flex-grow: 0;
+  flex-basis: auto;
+  align-items: stretch;
+  align-content: flex-start;
+}
+.u-avatar.data-v-34d954f9 {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: center;
+}
+.u-avatar--circle.data-v-34d954f9 {
+  border-radius: 100px;
+}
+.u-avatar--square.data-v-34d954f9 {
+  border-radius: 4px;
+}
+.u-avatar__image--circle.data-v-34d954f9 {
+  border-radius: 100px;
+  overflow: hidden;
+}
+.u-avatar__image--square.data-v-34d954f9 {
+  border-radius: 4px;
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-badge/props.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-badge/props.js
new file mode 100644
index 0000000..405fa3f
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-badge/props.js
@@ -0,0 +1,80 @@
+"use strict";
+const uni_modules_uviewPlus_libs_config_props = require("../../libs/config/props.js");
+const props = {
+  props: {
+    // 是否显示圆点
+    isDot: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.badge.isDot
+    },
+    // 显示的内容
+    value: {
+      type: [Number, String],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.badge.value
+    },
+    // 显示的内容
+    modelValue: {
+      type: [Number, String],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.badge.modelValue
+    },
+    // 是否显示
+    show: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.badge.show
+    },
+    // 最大值,超过最大值会显示 '{max}+'
+    max: {
+      type: [Number, String],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.badge.max
+    },
+    // 主题类型,error|warning|success|primary
+    type: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.badge.type
+    },
+    // 当数值为 0 时,是否展示 Badge
+    showZero: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.badge.showZero
+    },
+    // 背景颜色,优先级比type高,如设置,type参数会失效
+    bgColor: {
+      type: [String, null],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.badge.bgColor
+    },
+    // 字体颜色
+    color: {
+      type: [String, null],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.badge.color
+    },
+    // 徽标形状,circle-四角均为圆角,horn-左下角为直角
+    shape: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.badge.shape
+    },
+    // 设置数字的显示方式,overflow|ellipsis|limit
+    // overflow会根据max字段判断,超出显示`${max}+`
+    // ellipsis会根据max判断,超出显示`${max}...`
+    // limit会依据1000作为判断条件,超出1000,显示`${value/1000}K`,比如2.2k、3.34w,最多保留2位小数
+    numberType: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.badge.numberType
+    },
+    // 设置badge的位置偏移,格式为 [x, y],也即设置的为top和right的值,absolute为true时有效
+    offset: {
+      type: Array,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.badge.offset
+    },
+    // 是否反转背景和字体颜色
+    inverted: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.badge.inverted
+    },
+    // 是否绝对定位
+    absolute: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.badge.absolute
+    }
+  }
+};
+exports.props = props;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-badge/u-badge.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-badge/u-badge.js
new file mode 100644
index 0000000..5a04a48
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-badge/u-badge.js
@@ -0,0 +1,161 @@
+"use strict";
+const uni_modules_uviewPlus_components_uBadge_props = require("./props.js");
+const uni_modules_uviewPlus_libs_mixin_mpMixin = require("../../libs/mixin/mpMixin.js");
+const uni_modules_uviewPlus_libs_mixin_mixin = require("../../libs/mixin/mixin.js");
+const uni_modules_uviewPlus_libs_function_index = require("../../libs/function/index.js");
+const common_vendor = require("../../../../common/vendor.js");
+require("../../libs/config/props.js");
+require("../../libs/config/config.js");
+require("../../libs/config/props/actionSheet.js");
+require("../../libs/config/props/album.js");
+require("../../libs/config/props/alert.js");
+require("../../libs/config/props/avatar.js");
+require("../../libs/config/props/avatarGroup.js");
+require("../../libs/config/props/backtop.js");
+require("../../libs/config/props/badge.js");
+require("../../libs/config/props/button.js");
+require("../../libs/config/props/calendar.js");
+require("../../libs/config/props/carKeyboard.js");
+require("../../libs/config/props/cell.js");
+require("../../libs/config/props/cellGroup.js");
+require("../../libs/config/props/checkbox.js");
+require("../../libs/config/props/checkboxGroup.js");
+require("../../libs/config/props/circleProgress.js");
+require("../../libs/config/props/code.js");
+require("../../libs/config/props/codeInput.js");
+require("../../libs/config/props/col.js");
+require("../../libs/config/props/collapse.js");
+require("../../libs/config/props/collapseItem.js");
+require("../../libs/config/props/columnNotice.js");
+require("../../libs/config/props/countDown.js");
+require("../../libs/config/props/countTo.js");
+require("../../libs/config/props/datetimePicker.js");
+require("../../libs/config/props/divider.js");
+require("../../libs/config/props/empty.js");
+require("../../libs/config/props/form.js");
+require("../../libs/config/props/formItem.js");
+require("../../libs/config/props/gap.js");
+require("../../libs/config/props/grid.js");
+require("../../libs/config/props/gridItem.js");
+require("../../libs/config/props/icon.js");
+require("../../libs/config/props/image.js");
+require("../../libs/config/props/indexAnchor.js");
+require("../../libs/config/props/indexList.js");
+require("../../libs/config/props/input.js");
+require("../../libs/config/props/keyboard.js");
+require("../../libs/config/props/line.js");
+require("../../libs/config/props/lineProgress.js");
+require("../../libs/config/props/link.js");
+require("../../libs/config/props/list.js");
+require("../../libs/config/props/listItem.js");
+require("../../libs/config/props/loadingIcon.js");
+require("../../libs/config/props/loadingPage.js");
+require("../../libs/config/props/loadmore.js");
+require("../../libs/config/props/modal.js");
+require("../../libs/config/props/navbar.js");
+require("../../libs/config/color.js");
+require("../../libs/config/props/noNetwork.js");
+require("../../libs/config/props/noticeBar.js");
+require("../../libs/config/props/notify.js");
+require("../../libs/config/props/numberBox.js");
+require("../../libs/config/props/numberKeyboard.js");
+require("../../libs/config/props/overlay.js");
+require("../../libs/config/props/parse.js");
+require("../../libs/config/props/picker.js");
+require("../../libs/config/props/popup.js");
+require("../../libs/config/props/radio.js");
+require("../../libs/config/props/radioGroup.js");
+require("../../libs/config/props/rate.js");
+require("../../libs/config/props/readMore.js");
+require("../../libs/config/props/row.js");
+require("../../libs/config/props/rowNotice.js");
+require("../../libs/config/props/scrollList.js");
+require("../../libs/config/props/search.js");
+require("../../libs/config/props/section.js");
+require("../../libs/config/props/skeleton.js");
+require("../../libs/config/props/slider.js");
+require("../../libs/config/props/statusBar.js");
+require("../../libs/config/props/steps.js");
+require("../../libs/config/props/stepsItem.js");
+require("../../libs/config/props/sticky.js");
+require("../../libs/config/props/subsection.js");
+require("../../libs/config/props/swipeAction.js");
+require("../../libs/config/props/swipeActionItem.js");
+require("../../libs/config/props/swiper.js");
+require("../../libs/config/props/swipterIndicator.js");
+require("../../libs/config/props/switch.js");
+require("../../libs/config/props/tabbar.js");
+require("../../libs/config/props/tabbarItem.js");
+require("../../libs/config/props/tabs.js");
+require("../../libs/config/props/tag.js");
+require("../../libs/config/props/text.js");
+require("../../libs/config/props/textarea.js");
+require("../../libs/config/props/toast.js");
+require("../../libs/config/props/toolbar.js");
+require("../../libs/config/props/tooltip.js");
+require("../../libs/config/props/transition.js");
+require("../../libs/config/props/upload.js");
+require("../../libs/function/test.js");
+require("../../libs/util/route.js");
+require("../../libs/function/digit.js");
+const _sfc_main = {
+  name: "u-badge",
+  mixins: [uni_modules_uviewPlus_libs_mixin_mpMixin.mpMixin, uni_modules_uviewPlus_components_uBadge_props.props, uni_modules_uviewPlus_libs_mixin_mixin.mixin],
+  computed: {
+    // 是否将badge中心与父组件右上角重合
+    boxStyle() {
+      let style = {};
+      return style;
+    },
+    // 整个组件的样式
+    badgeStyle() {
+      const style = {};
+      if (this.color) {
+        style.color = this.color;
+      }
+      if (this.bgColor && !this.inverted) {
+        style.backgroundColor = this.bgColor;
+      }
+      if (this.absolute) {
+        style.position = "absolute";
+        if (this.offset.length) {
+          const top = this.offset[0];
+          const right = this.offset[1] || top;
+          style.top = uni_modules_uviewPlus_libs_function_index.addUnit(top);
+          style.right = uni_modules_uviewPlus_libs_function_index.addUnit(right);
+        }
+      }
+      return style;
+    },
+    showValue() {
+      switch (this.numberType) {
+        case "overflow":
+          return Number(this.value) > Number(this.max) ? this.max + "+" : this.value;
+        case "ellipsis":
+          return Number(this.value) > Number(this.max) ? "..." : this.value;
+        case "limit":
+          return Number(this.value) > 999 ? Number(this.value) >= 9999 ? Math.floor(this.value / 1e4 * 100) / 100 + "w" : Math.floor(this.value / 1e3 * 100) / 100 + "k" : this.value;
+        default:
+          return Number(this.value);
+      }
+    }
+  },
+  methods: {
+    addStyle: uni_modules_uviewPlus_libs_function_index.addStyle
+  }
+};
+function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
+  return common_vendor.e({
+    a: _ctx.show && ((Number(_ctx.value) === 0 ? _ctx.showZero : true) || _ctx.isDot)
+  }, _ctx.show && ((Number(_ctx.value) === 0 ? _ctx.showZero : true) || _ctx.isDot) ? {
+    b: common_vendor.t(_ctx.isDot ? "" : $options.showValue),
+    c: common_vendor.n(_ctx.isDot ? "u-badge--dot" : "u-badge--not-dot"),
+    d: common_vendor.n(_ctx.inverted && "u-badge--inverted"),
+    e: common_vendor.n(_ctx.shape === "horn" && "u-badge--horn"),
+    f: common_vendor.n(`u-badge--${_ctx.type}${_ctx.inverted ? "--inverted" : ""}`),
+    g: common_vendor.s($options.addStyle(_ctx.customStyle)),
+    h: common_vendor.s($options.badgeStyle)
+  } : {});
+}
+const Component = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-06cca9b7"], ["__file", "D:/里海数字乡村/purchase-let/uni_modules/uview-plus/components/u-badge/u-badge.vue"]]);
+wx.createComponent(Component);
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-badge/u-badge.json b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-badge/u-badge.json
new file mode 100644
index 0000000..e8cfaaf
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-badge/u-badge.json
@@ -0,0 +1,4 @@
+{
+  "component": true,
+  "usingComponents": {}
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-badge/u-badge.wxml b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-badge/u-badge.wxml
new file mode 100644
index 0000000..1b6ac5d
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-badge/u-badge.wxml
@@ -0,0 +1 @@
+<text wx:if="{{a}}" class="{{[c, d, e, f, 'u-badge', 'data-v-06cca9b7']}}" style="{{g + ';' + h}}">{{b}}</text>
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-badge/u-badge.wxss b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-badge/u-badge.wxss
new file mode 100644
index 0000000..a555a68
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-badge/u-badge.wxss
@@ -0,0 +1,96 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+/* 颜色变量 */
+/* 行为相关颜色 */
+/* 文字基本颜色 */
+/* 背景颜色 */
+/* 边框颜色 */
+/* 尺寸变量 */
+/* 文字尺寸 */
+/* 图片尺寸 */
+/* Border Radius */
+/* 水平间距 */
+/* 垂直间距 */
+/* 透明度 */
+/* 文章场景相关 */
+.u-empty.data-v-06cca9b7,
+.u-empty__wrap.data-v-06cca9b7,
+.u-tabs.data-v-06cca9b7,
+.u-tabs__wrapper.data-v-06cca9b7,
+.u-tabs__wrapper__scroll-view-wrapper.data-v-06cca9b7,
+.u-tabs__wrapper__scroll-view.data-v-06cca9b7,
+.u-tabs__wrapper__nav.data-v-06cca9b7,
+.u-tabs__wrapper__nav__line.data-v-06cca9b7 {
+  display: flex;
+  flex-direction: column;
+  flex-shrink: 0;
+  flex-grow: 0;
+  flex-basis: auto;
+  align-items: stretch;
+  align-content: flex-start;
+}
+.u-badge.data-v-06cca9b7 {
+  border-top-right-radius: 100px;
+  border-top-left-radius: 100px;
+  border-bottom-left-radius: 100px;
+  border-bottom-right-radius: 100px;
+  display: flex;
+  flex-direction: row;
+  line-height: 11px;
+  text-align: center;
+  font-size: 11px;
+  color: #FFFFFF;
+}
+.u-badge--dot.data-v-06cca9b7 {
+  height: 8px;
+  width: 8px;
+}
+.u-badge--inverted.data-v-06cca9b7 {
+  font-size: 13px;
+}
+.u-badge--not-dot.data-v-06cca9b7 {
+  padding: 2px 5px;
+}
+.u-badge--horn.data-v-06cca9b7 {
+  border-bottom-left-radius: 0;
+}
+.u-badge--primary.data-v-06cca9b7 {
+  background-color: #3c9cff;
+}
+.u-badge--primary--inverted.data-v-06cca9b7 {
+  color: #3c9cff;
+}
+.u-badge--error.data-v-06cca9b7 {
+  background-color: #f56c6c;
+}
+.u-badge--error--inverted.data-v-06cca9b7 {
+  color: #f56c6c;
+}
+.u-badge--success.data-v-06cca9b7 {
+  background-color: #5ac725;
+}
+.u-badge--success--inverted.data-v-06cca9b7 {
+  color: #5ac725;
+}
+.u-badge--info.data-v-06cca9b7 {
+  background-color: #909399;
+}
+.u-badge--info--inverted.data-v-06cca9b7 {
+  color: #909399;
+}
+.u-badge--warning.data-v-06cca9b7 {
+  background-color: #f9ae3d;
+}
+.u-badge--warning--inverted.data-v-06cca9b7 {
+  color: #f9ae3d;
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-cell-group/props.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-cell-group/props.js
new file mode 100644
index 0000000..6cf2b98
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-cell-group/props.js
@@ -0,0 +1,17 @@
+"use strict";
+const uni_modules_uviewPlus_libs_config_props = require("../../libs/config/props.js");
+const props = {
+  props: {
+    // 分组标题
+    title: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.cellGroup.title
+    },
+    // 是否显示外边框
+    border: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.cellGroup.border
+    }
+  }
+};
+exports.props = props;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-cell-group/u-cell-group.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-cell-group/u-cell-group.js
new file mode 100644
index 0000000..7bfc981
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-cell-group/u-cell-group.js
@@ -0,0 +1,129 @@
+"use strict";
+const uni_modules_uviewPlus_components_uCellGroup_props = require("./props.js");
+const uni_modules_uviewPlus_libs_mixin_mpMixin = require("../../libs/mixin/mpMixin.js");
+const uni_modules_uviewPlus_libs_mixin_mixin = require("../../libs/mixin/mixin.js");
+const uni_modules_uviewPlus_libs_function_index = require("../../libs/function/index.js");
+const common_vendor = require("../../../../common/vendor.js");
+require("../../libs/config/props.js");
+require("../../libs/config/config.js");
+require("../../libs/config/props/actionSheet.js");
+require("../../libs/config/props/album.js");
+require("../../libs/config/props/alert.js");
+require("../../libs/config/props/avatar.js");
+require("../../libs/config/props/avatarGroup.js");
+require("../../libs/config/props/backtop.js");
+require("../../libs/config/props/badge.js");
+require("../../libs/config/props/button.js");
+require("../../libs/config/props/calendar.js");
+require("../../libs/config/props/carKeyboard.js");
+require("../../libs/config/props/cell.js");
+require("../../libs/config/props/cellGroup.js");
+require("../../libs/config/props/checkbox.js");
+require("../../libs/config/props/checkboxGroup.js");
+require("../../libs/config/props/circleProgress.js");
+require("../../libs/config/props/code.js");
+require("../../libs/config/props/codeInput.js");
+require("../../libs/config/props/col.js");
+require("../../libs/config/props/collapse.js");
+require("../../libs/config/props/collapseItem.js");
+require("../../libs/config/props/columnNotice.js");
+require("../../libs/config/props/countDown.js");
+require("../../libs/config/props/countTo.js");
+require("../../libs/config/props/datetimePicker.js");
+require("../../libs/config/props/divider.js");
+require("../../libs/config/props/empty.js");
+require("../../libs/config/props/form.js");
+require("../../libs/config/props/formItem.js");
+require("../../libs/config/props/gap.js");
+require("../../libs/config/props/grid.js");
+require("../../libs/config/props/gridItem.js");
+require("../../libs/config/props/icon.js");
+require("../../libs/config/props/image.js");
+require("../../libs/config/props/indexAnchor.js");
+require("../../libs/config/props/indexList.js");
+require("../../libs/config/props/input.js");
+require("../../libs/config/props/keyboard.js");
+require("../../libs/config/props/line.js");
+require("../../libs/config/props/lineProgress.js");
+require("../../libs/config/props/link.js");
+require("../../libs/config/props/list.js");
+require("../../libs/config/props/listItem.js");
+require("../../libs/config/props/loadingIcon.js");
+require("../../libs/config/props/loadingPage.js");
+require("../../libs/config/props/loadmore.js");
+require("../../libs/config/props/modal.js");
+require("../../libs/config/props/navbar.js");
+require("../../libs/config/color.js");
+require("../../libs/config/props/noNetwork.js");
+require("../../libs/config/props/noticeBar.js");
+require("../../libs/config/props/notify.js");
+require("../../libs/config/props/numberBox.js");
+require("../../libs/config/props/numberKeyboard.js");
+require("../../libs/config/props/overlay.js");
+require("../../libs/config/props/parse.js");
+require("../../libs/config/props/picker.js");
+require("../../libs/config/props/popup.js");
+require("../../libs/config/props/radio.js");
+require("../../libs/config/props/radioGroup.js");
+require("../../libs/config/props/rate.js");
+require("../../libs/config/props/readMore.js");
+require("../../libs/config/props/row.js");
+require("../../libs/config/props/rowNotice.js");
+require("../../libs/config/props/scrollList.js");
+require("../../libs/config/props/search.js");
+require("../../libs/config/props/section.js");
+require("../../libs/config/props/skeleton.js");
+require("../../libs/config/props/slider.js");
+require("../../libs/config/props/statusBar.js");
+require("../../libs/config/props/steps.js");
+require("../../libs/config/props/stepsItem.js");
+require("../../libs/config/props/sticky.js");
+require("../../libs/config/props/subsection.js");
+require("../../libs/config/props/swipeAction.js");
+require("../../libs/config/props/swipeActionItem.js");
+require("../../libs/config/props/swiper.js");
+require("../../libs/config/props/swipterIndicator.js");
+require("../../libs/config/props/switch.js");
+require("../../libs/config/props/tabbar.js");
+require("../../libs/config/props/tabbarItem.js");
+require("../../libs/config/props/tabs.js");
+require("../../libs/config/props/tag.js");
+require("../../libs/config/props/text.js");
+require("../../libs/config/props/textarea.js");
+require("../../libs/config/props/toast.js");
+require("../../libs/config/props/toolbar.js");
+require("../../libs/config/props/tooltip.js");
+require("../../libs/config/props/transition.js");
+require("../../libs/config/props/upload.js");
+require("../../libs/function/test.js");
+require("../../libs/util/route.js");
+require("../../libs/function/digit.js");
+const _sfc_main = {
+  name: "u-cell-group",
+  mixins: [uni_modules_uviewPlus_libs_mixin_mpMixin.mpMixin, uni_modules_uviewPlus_libs_mixin_mixin.mixin, uni_modules_uviewPlus_components_uCellGroup_props.props],
+  methods: {
+    addStyle: uni_modules_uviewPlus_libs_function_index.addStyle
+  }
+};
+if (!Array) {
+  const _easycom_u_line2 = common_vendor.resolveComponent("u-line");
+  _easycom_u_line2();
+}
+const _easycom_u_line = () => "../u-line/u-line.js";
+if (!Math) {
+  _easycom_u_line();
+}
+function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
+  return common_vendor.e({
+    a: _ctx.title
+  }, _ctx.title ? {
+    b: common_vendor.t(_ctx.title)
+  } : {}, {
+    c: _ctx.border
+  }, _ctx.border ? {} : {}, {
+    d: common_vendor.s($options.addStyle(_ctx.customStyle)),
+    e: common_vendor.n(_ctx.customClass)
+  });
+}
+const Component = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-014d39dc"], ["__file", "D:/里海数字乡村/purchase-let/uni_modules/uview-plus/components/u-cell-group/u-cell-group.vue"]]);
+wx.createComponent(Component);
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-cell-group/u-cell-group.json b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-cell-group/u-cell-group.json
new file mode 100644
index 0000000..55b89cc
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-cell-group/u-cell-group.json
@@ -0,0 +1,6 @@
+{
+  "component": true,
+  "usingComponents": {
+    "u-line": "../u-line/u-line"
+  }
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-cell-group/u-cell-group.wxml b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-cell-group/u-cell-group.wxml
new file mode 100644
index 0000000..a5d3ad3
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-cell-group/u-cell-group.wxml
@@ -0,0 +1 @@
+<view style="{{d}}" class="{{[e, 'u-cell-group', 'data-v-014d39dc']}}"><view wx:if="{{a}}" class="u-cell-group__title data-v-014d39dc"><block wx:if="{{$slots.title}}"><slot name="title"></slot></block><block wx:else><text class="u-cell-group__title__text data-v-014d39dc">{{b}}</text></block></view><view class="u-cell-group__wrapper data-v-014d39dc"><u-line wx:if="{{c}}" class="data-v-014d39dc" u-i="014d39dc-0" bind:__l="__l"></u-line><slot/></view></view>
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-cell-group/u-cell-group.wxss b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-cell-group/u-cell-group.wxss
new file mode 100644
index 0000000..28f385d
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-cell-group/u-cell-group.wxss
@@ -0,0 +1,55 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+/* 颜色变量 */
+/* 行为相关颜色 */
+/* 文字基本颜色 */
+/* 背景颜色 */
+/* 边框颜色 */
+/* 尺寸变量 */
+/* 文字尺寸 */
+/* 图片尺寸 */
+/* Border Radius */
+/* 水平间距 */
+/* 垂直间距 */
+/* 透明度 */
+/* 文章场景相关 */
+.u-empty.data-v-014d39dc,
+.u-empty__wrap.data-v-014d39dc,
+.u-tabs.data-v-014d39dc,
+.u-tabs__wrapper.data-v-014d39dc,
+.u-tabs__wrapper__scroll-view-wrapper.data-v-014d39dc,
+.u-tabs__wrapper__scroll-view.data-v-014d39dc,
+.u-tabs__wrapper__nav.data-v-014d39dc,
+.u-tabs__wrapper__nav__line.data-v-014d39dc {
+  display: flex;
+  flex-direction: column;
+  flex-shrink: 0;
+  flex-grow: 0;
+  flex-basis: auto;
+  align-items: stretch;
+  align-content: flex-start;
+}
+.u-cell-group.data-v-014d39dc {
+  flex: 1;
+}
+.u-cell-group__title.data-v-014d39dc {
+  padding: 16px 16px 8px;
+}
+.u-cell-group__title__text.data-v-014d39dc {
+  font-size: 15px;
+  line-height: 16px;
+  color: #303133;
+}
+.u-cell-group__wrapper.data-v-014d39dc {
+  position: relative;
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-cell/props.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-cell/props.js
new file mode 100644
index 0000000..39a6f51
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-cell/props.js
@@ -0,0 +1,113 @@
+"use strict";
+const uni_modules_uviewPlus_libs_config_props = require("../../libs/config/props.js");
+const props = {
+  props: {
+    // 标题
+    title: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.cell.title
+    },
+    // 标题下方的描述信息
+    label: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.cell.label
+    },
+    // 右侧的内容
+    value: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.cell.value
+    },
+    // 左侧图标名称,或者图片链接(本地文件建议使用绝对地址)
+    icon: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.cell.icon
+    },
+    // 是否禁用cell
+    disabled: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.cell.disabled
+    },
+    // 是否显示下边框
+    border: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.cell.border
+    },
+    // 内容是否垂直居中(主要是针对右侧的value部分)
+    center: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.cell.center
+    },
+    // 点击后跳转的URL地址
+    url: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.cell.url
+    },
+    // 链接跳转的方式,内部使用的是uView封装的route方法,可能会进行拦截操作
+    linkType: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.cell.linkType
+    },
+    // 是否开启点击反馈(表现为点击时加上灰色背景)
+    clickable: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.cell.clickable
+    },
+    // 是否展示右侧箭头并开启点击反馈
+    isLink: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.cell.isLink
+    },
+    // 是否显示表单状态下的必填星号(此组件可能会内嵌入input组件)
+    required: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.cell.required
+    },
+    // 右侧的图标箭头
+    rightIcon: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.cell.rightIcon
+    },
+    // 右侧箭头的方向,可选值为:left,up,down
+    arrowDirection: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.cell.arrowDirection
+    },
+    // 左侧图标样式
+    iconStyle: {
+      type: [Object, String],
+      default: () => {
+        return uni_modules_uviewPlus_libs_config_props.defProps.cell.iconStyle;
+      }
+    },
+    // 右侧箭头图标的样式
+    rightIconStyle: {
+      type: [Object, String],
+      default: () => {
+        return uni_modules_uviewPlus_libs_config_props.defProps.cell.rightIconStyle;
+      }
+    },
+    // 标题的样式
+    titleStyle: {
+      type: [Object, String],
+      default: () => {
+        return uni_modules_uviewPlus_libs_config_props.defProps.cell.titleStyle;
+      }
+    },
+    // 单位元的大小,可选值为large
+    size: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.cell.size
+    },
+    // 点击cell是否阻止事件传播
+    stop: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.cell.stop
+    },
+    // 标识符,cell被点击时返回
+    name: {
+      type: [Number, String],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.cell.name
+    }
+  }
+};
+exports.props = props;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-cell/u-cell.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-cell/u-cell.js
new file mode 100644
index 0000000..fe1a40e
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-cell/u-cell.js
@@ -0,0 +1,197 @@
+"use strict";
+const uni_modules_uviewPlus_components_uCell_props = require("./props.js");
+const uni_modules_uviewPlus_libs_mixin_mpMixin = require("../../libs/mixin/mpMixin.js");
+const uni_modules_uviewPlus_libs_mixin_mixin = require("../../libs/mixin/mixin.js");
+const uni_modules_uviewPlus_libs_function_index = require("../../libs/function/index.js");
+const uni_modules_uviewPlus_libs_function_test = require("../../libs/function/test.js");
+const common_vendor = require("../../../../common/vendor.js");
+require("../../libs/config/props.js");
+require("../../libs/config/config.js");
+require("../../libs/config/props/actionSheet.js");
+require("../../libs/config/props/album.js");
+require("../../libs/config/props/alert.js");
+require("../../libs/config/props/avatar.js");
+require("../../libs/config/props/avatarGroup.js");
+require("../../libs/config/props/backtop.js");
+require("../../libs/config/props/badge.js");
+require("../../libs/config/props/button.js");
+require("../../libs/config/props/calendar.js");
+require("../../libs/config/props/carKeyboard.js");
+require("../../libs/config/props/cell.js");
+require("../../libs/config/props/cellGroup.js");
+require("../../libs/config/props/checkbox.js");
+require("../../libs/config/props/checkboxGroup.js");
+require("../../libs/config/props/circleProgress.js");
+require("../../libs/config/props/code.js");
+require("../../libs/config/props/codeInput.js");
+require("../../libs/config/props/col.js");
+require("../../libs/config/props/collapse.js");
+require("../../libs/config/props/collapseItem.js");
+require("../../libs/config/props/columnNotice.js");
+require("../../libs/config/props/countDown.js");
+require("../../libs/config/props/countTo.js");
+require("../../libs/config/props/datetimePicker.js");
+require("../../libs/config/props/divider.js");
+require("../../libs/config/props/empty.js");
+require("../../libs/config/props/form.js");
+require("../../libs/config/props/formItem.js");
+require("../../libs/config/props/gap.js");
+require("../../libs/config/props/grid.js");
+require("../../libs/config/props/gridItem.js");
+require("../../libs/config/props/icon.js");
+require("../../libs/config/props/image.js");
+require("../../libs/config/props/indexAnchor.js");
+require("../../libs/config/props/indexList.js");
+require("../../libs/config/props/input.js");
+require("../../libs/config/props/keyboard.js");
+require("../../libs/config/props/line.js");
+require("../../libs/config/props/lineProgress.js");
+require("../../libs/config/props/link.js");
+require("../../libs/config/props/list.js");
+require("../../libs/config/props/listItem.js");
+require("../../libs/config/props/loadingIcon.js");
+require("../../libs/config/props/loadingPage.js");
+require("../../libs/config/props/loadmore.js");
+require("../../libs/config/props/modal.js");
+require("../../libs/config/props/navbar.js");
+require("../../libs/config/color.js");
+require("../../libs/config/props/noNetwork.js");
+require("../../libs/config/props/noticeBar.js");
+require("../../libs/config/props/notify.js");
+require("../../libs/config/props/numberBox.js");
+require("../../libs/config/props/numberKeyboard.js");
+require("../../libs/config/props/overlay.js");
+require("../../libs/config/props/parse.js");
+require("../../libs/config/props/picker.js");
+require("../../libs/config/props/popup.js");
+require("../../libs/config/props/radio.js");
+require("../../libs/config/props/radioGroup.js");
+require("../../libs/config/props/rate.js");
+require("../../libs/config/props/readMore.js");
+require("../../libs/config/props/row.js");
+require("../../libs/config/props/rowNotice.js");
+require("../../libs/config/props/scrollList.js");
+require("../../libs/config/props/search.js");
+require("../../libs/config/props/section.js");
+require("../../libs/config/props/skeleton.js");
+require("../../libs/config/props/slider.js");
+require("../../libs/config/props/statusBar.js");
+require("../../libs/config/props/steps.js");
+require("../../libs/config/props/stepsItem.js");
+require("../../libs/config/props/sticky.js");
+require("../../libs/config/props/subsection.js");
+require("../../libs/config/props/swipeAction.js");
+require("../../libs/config/props/swipeActionItem.js");
+require("../../libs/config/props/swiper.js");
+require("../../libs/config/props/swipterIndicator.js");
+require("../../libs/config/props/switch.js");
+require("../../libs/config/props/tabbar.js");
+require("../../libs/config/props/tabbarItem.js");
+require("../../libs/config/props/tabs.js");
+require("../../libs/config/props/tag.js");
+require("../../libs/config/props/text.js");
+require("../../libs/config/props/textarea.js");
+require("../../libs/config/props/toast.js");
+require("../../libs/config/props/toolbar.js");
+require("../../libs/config/props/tooltip.js");
+require("../../libs/config/props/transition.js");
+require("../../libs/config/props/upload.js");
+require("../../libs/util/route.js");
+require("../../libs/function/digit.js");
+const _sfc_main = {
+  name: "u-cell",
+  data() {
+    return {};
+  },
+  mixins: [uni_modules_uviewPlus_libs_mixin_mpMixin.mpMixin, uni_modules_uviewPlus_libs_mixin_mixin.mixin, uni_modules_uviewPlus_components_uCell_props.props],
+  computed: {
+    titleTextStyle() {
+      return uni_modules_uviewPlus_libs_function_index.addStyle(this.titleStyle);
+    }
+  },
+  emits: ["click"],
+  methods: {
+    addStyle: uni_modules_uviewPlus_libs_function_index.addStyle,
+    testEmpty: uni_modules_uviewPlus_libs_function_test.test.empty,
+    // 点击cell
+    clickHandler(e) {
+      if (this.disabled)
+        return;
+      this.$emit("click", {
+        name: this.name
+      });
+      this.openPage();
+      this.stop && this.preventEvent(e);
+    }
+  }
+};
+if (!Array) {
+  const _easycom_u_icon2 = common_vendor.resolveComponent("u-icon");
+  const _easycom_u_line2 = common_vendor.resolveComponent("u-line");
+  (_easycom_u_icon2 + _easycom_u_line2)();
+}
+const _easycom_u_icon = () => "../u-icon/u-icon.js";
+const _easycom_u_line = () => "../u-line/u-line.js";
+if (!Math) {
+  (_easycom_u_icon + _easycom_u_line)();
+}
+function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
+  return common_vendor.e({
+    a: _ctx.$slots.icon || _ctx.icon
+  }, _ctx.$slots.icon || _ctx.icon ? common_vendor.e({
+    b: _ctx.$slots.icon
+  }, _ctx.$slots.icon ? {} : {
+    c: common_vendor.p({
+      name: _ctx.icon,
+      ["custom-style"]: _ctx.iconStyle,
+      size: _ctx.size === "large" ? 22 : 18
+    })
+  }) : {}, {
+    d: _ctx.$slots.title || !_ctx.title
+  }, _ctx.$slots.title || !_ctx.title ? {} : {
+    e: common_vendor.t(_ctx.title),
+    f: common_vendor.s($options.titleTextStyle),
+    g: common_vendor.n(_ctx.disabled && "u-cell--disabled"),
+    h: common_vendor.n(_ctx.size === "large" && "u-cell__title-text--large")
+  }, {
+    i: _ctx.label
+  }, _ctx.label ? {
+    j: common_vendor.t(_ctx.label),
+    k: common_vendor.n(_ctx.disabled && "u-cell--disabled"),
+    l: common_vendor.n(_ctx.size === "large" && "u-cell__label--large")
+  } : {}, {
+    m: !$options.testEmpty(_ctx.value)
+  }, !$options.testEmpty(_ctx.value) ? {
+    n: common_vendor.t(_ctx.value),
+    o: common_vendor.n(_ctx.disabled && "u-cell--disabled"),
+    p: common_vendor.n(_ctx.size === "large" && "u-cell__value--large")
+  } : {}, {
+    q: _ctx.$slots["right-icon"] || _ctx.isLink
+  }, _ctx.$slots["right-icon"] || _ctx.isLink ? common_vendor.e({
+    r: _ctx.rightIcon && !_ctx.$slots["right-icon"]
+  }, _ctx.rightIcon && !_ctx.$slots["right-icon"] ? {
+    s: common_vendor.p({
+      name: _ctx.rightIcon,
+      ["custom-style"]: _ctx.rightIconStyle,
+      color: _ctx.disabled ? "#c8c9cc" : "info",
+      size: _ctx.size === "large" ? 18 : 16
+    })
+  } : {}, {
+    t: common_vendor.n(`u-cell__right-icon-wrap--${_ctx.arrowDirection}`)
+  }) : {}, {
+    v: _ctx.$slots["righticon"]
+  }, _ctx.$slots["righticon"] ? {
+    w: common_vendor.n(`u-cell__right-icon-wrap--${_ctx.arrowDirection}`)
+  } : {}, {
+    x: common_vendor.n(_ctx.center && "u-cell--center"),
+    y: common_vendor.n(_ctx.size === "large" && "u-cell__body--large"),
+    z: _ctx.border
+  }, _ctx.border ? {} : {}, {
+    A: common_vendor.n(_ctx.customClass),
+    B: common_vendor.s($options.addStyle(_ctx.customStyle)),
+    C: !_ctx.disabled && (_ctx.clickable || _ctx.isLink) ? "u-cell--clickable" : "",
+    D: common_vendor.o((...args) => $options.clickHandler && $options.clickHandler(...args))
+  });
+}
+const Component = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-3fd6feca"], ["__file", "D:/里海数字乡村/purchase-let/uni_modules/uview-plus/components/u-cell/u-cell.vue"]]);
+wx.createComponent(Component);
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-cell/u-cell.json b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-cell/u-cell.json
new file mode 100644
index 0000000..9dd4979
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-cell/u-cell.json
@@ -0,0 +1,7 @@
+{
+  "component": true,
+  "usingComponents": {
+    "u-icon": "../u-icon/u-icon",
+    "u-line": "../u-line/u-line"
+  }
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-cell/u-cell.wxml b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-cell/u-cell.wxml
new file mode 100644
index 0000000..5630337
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-cell/u-cell.wxml
@@ -0,0 +1 @@
+<view class="{{['u-cell', 'data-v-3fd6feca', A]}}" style="{{B}}" hover-class="{{C}}" hover-stay-time="{{250}}" bindtap="{{D}}"><view class="{{['u-cell__body', 'data-v-3fd6feca', x, y]}}"><view class="u-cell__body__content data-v-3fd6feca"><view wx:if="{{a}}" class="u-cell__left-icon-wrap data-v-3fd6feca"><slot wx:if="{{b}}" name="icon"></slot><u-icon wx:else class="data-v-3fd6feca" u-i="3fd6feca-0" bind:__l="__l" u-p="{{c||''}}"></u-icon></view><view class="u-cell__title data-v-3fd6feca"><slot wx:if="{{d}}" name="title"></slot><text wx:else style="{{f}}" class="{{['u-cell__title-text', 'data-v-3fd6feca', g, h]}}">{{e}}</text><block wx:if="{{$slots.label}}"><slot name="label"></slot></block><block wx:else><text wx:if="{{i}}" class="{{['u-cell__label', 'data-v-3fd6feca', k, l]}}">{{j}}</text></block></view></view><block wx:if="{{$slots.value}}"><slot name="value"></slot></block><block wx:else><text wx:if="{{m}}" class="{{['u-cell__value', 'data-v-3fd6feca', o, p]}}">{{n}}</text></block><view wx:if="{{q}}" class="{{['u-cell__right-icon-wrap', 'data-v-3fd6feca', t]}}"><u-icon wx:if="{{r}}" class="data-v-3fd6feca" u-i="3fd6feca-1" bind:__l="__l" u-p="{{s}}"></u-icon><slot wx:else name="right-icon"></slot></view><view wx:if="{{v}}" class="{{['u-cell__right-icon-wrap', 'data-v-3fd6feca', w]}}"><slot name="righticon"></slot></view></view><u-line wx:if="{{z}}" class="data-v-3fd6feca" u-i="3fd6feca-2" bind:__l="__l"></u-line></view>
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-cell/u-cell.wxss b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-cell/u-cell.wxss
new file mode 100644
index 0000000..f97ec61
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-cell/u-cell.wxss
@@ -0,0 +1,119 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+/* 颜色变量 */
+/* 行为相关颜色 */
+/* 文字基本颜色 */
+/* 背景颜色 */
+/* 边框颜色 */
+/* 尺寸变量 */
+/* 文字尺寸 */
+/* 图片尺寸 */
+/* Border Radius */
+/* 水平间距 */
+/* 垂直间距 */
+/* 透明度 */
+/* 文章场景相关 */
+.u-empty.data-v-3fd6feca,
+.u-empty__wrap.data-v-3fd6feca,
+.u-tabs.data-v-3fd6feca,
+.u-tabs__wrapper.data-v-3fd6feca,
+.u-tabs__wrapper__scroll-view-wrapper.data-v-3fd6feca,
+.u-tabs__wrapper__scroll-view.data-v-3fd6feca,
+.u-tabs__wrapper__nav.data-v-3fd6feca,
+.u-tabs__wrapper__nav__line.data-v-3fd6feca {
+  display: flex;
+  flex-direction: column;
+  flex-shrink: 0;
+  flex-grow: 0;
+  flex-basis: auto;
+  align-items: stretch;
+  align-content: flex-start;
+}
+.u-cell__body.data-v-3fd6feca {
+  display: flex;
+  flex-direction: row;
+  box-sizing: border-box;
+  padding: 13px 15px;
+  font-size: 15px;
+  color: #303133;
+  align-items: center;
+}
+.u-cell__body__content.data-v-3fd6feca {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  flex: 1;
+}
+.u-cell__body--large.data-v-3fd6feca {
+  padding-top: 13px;
+  padding-bottom: 13px;
+}
+.u-cell__left-icon-wrap.data-v-3fd6feca, .u-cell__right-icon-wrap.data-v-3fd6feca {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  font-size: 16px;
+}
+.u-cell__left-icon-wrap.data-v-3fd6feca {
+  margin-right: 4px;
+}
+.u-cell__right-icon-wrap.data-v-3fd6feca {
+  margin-left: 4px;
+  transition: transform 0.3s;
+}
+.u-cell__right-icon-wrap--up.data-v-3fd6feca {
+  transform: rotate(-90deg);
+}
+.u-cell__right-icon-wrap--down.data-v-3fd6feca {
+  transform: rotate(90deg);
+}
+.u-cell__title.data-v-3fd6feca {
+  flex: 1;
+}
+.u-cell__title-text.data-v-3fd6feca {
+  font-size: 15px;
+  line-height: 22px;
+  color: #303133;
+}
+.u-cell__title-text--large.data-v-3fd6feca {
+  font-size: 16px;
+}
+.u-cell__label.data-v-3fd6feca {
+  margin-top: 5px;
+  font-size: 12px;
+  color: #909193;
+  line-height: 18px;
+}
+.u-cell__label--large.data-v-3fd6feca {
+  font-size: 14px;
+}
+.u-cell__value.data-v-3fd6feca {
+  text-align: right;
+  margin-left: auto;
+  font-size: 14px;
+  line-height: 24px;
+  color: #606266;
+}
+.u-cell__value--large.data-v-3fd6feca {
+  font-size: 15px;
+}
+.u-cell--clickable.data-v-3fd6feca {
+  background-color: #f3f4f6;
+}
+.u-cell--disabled.data-v-3fd6feca {
+  color: #c8c9cc;
+  cursor: not-allowed;
+}
+.u-cell--center.data-v-3fd6feca {
+  align-items: center;
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-icon/icons.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-icon/icons.js
new file mode 100644
index 0000000..744b3a7
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-icon/icons.js
@@ -0,0 +1,216 @@
+"use strict";
+const icons = {
+  "uicon-level": "",
+  "uicon-column-line": "",
+  "uicon-checkbox-mark": "",
+  "uicon-folder": "",
+  "uicon-movie": "",
+  "uicon-star-fill": "",
+  "uicon-star": "",
+  "uicon-phone-fill": "",
+  "uicon-phone": "",
+  "uicon-apple-fill": "",
+  "uicon-chrome-circle-fill": "",
+  "uicon-backspace": "",
+  "uicon-attach": "",
+  "uicon-cut": "",
+  "uicon-empty-car": "",
+  "uicon-empty-coupon": "",
+  "uicon-empty-address": "",
+  "uicon-empty-favor": "",
+  "uicon-empty-permission": "",
+  "uicon-empty-news": "",
+  "uicon-empty-search": "",
+  "uicon-github-circle-fill": "",
+  "uicon-rmb": "",
+  "uicon-person-delete-fill": "",
+  "uicon-reload": "",
+  "uicon-order": "",
+  "uicon-server-man": "",
+  "uicon-search": "",
+  "uicon-fingerprint": "",
+  "uicon-more-dot-fill": "",
+  "uicon-scan": "",
+  "uicon-share-square": "",
+  "uicon-map": "",
+  "uicon-map-fill": "",
+  "uicon-tags": "",
+  "uicon-tags-fill": "",
+  "uicon-bookmark-fill": "",
+  "uicon-bookmark": "",
+  "uicon-eye": "",
+  "uicon-eye-fill": "",
+  "uicon-mic": "",
+  "uicon-mic-off": "",
+  "uicon-calendar": "",
+  "uicon-calendar-fill": "",
+  "uicon-trash": "",
+  "uicon-trash-fill": "",
+  "uicon-play-left": "",
+  "uicon-play-right": "",
+  "uicon-minus": "",
+  "uicon-plus": "",
+  "uicon-info": "",
+  "uicon-info-circle": "",
+  "uicon-info-circle-fill": "",
+  "uicon-question": "",
+  "uicon-error": "",
+  "uicon-close": "",
+  "uicon-checkmark": "",
+  "uicon-android-circle-fill": "",
+  "uicon-android-fill": "",
+  "uicon-ie": "",
+  "uicon-IE-circle-fill": "",
+  "uicon-google": "",
+  "uicon-google-circle-fill": "",
+  "uicon-setting-fill": "",
+  "uicon-setting": "",
+  "uicon-minus-square-fill": "",
+  "uicon-plus-square-fill": "",
+  "uicon-heart": "",
+  "uicon-heart-fill": "",
+  "uicon-camera": "",
+  "uicon-camera-fill": "",
+  "uicon-more-circle": "",
+  "uicon-more-circle-fill": "",
+  "uicon-chat": "",
+  "uicon-chat-fill": "",
+  "uicon-bag-fill": "",
+  "uicon-bag": "",
+  "uicon-error-circle-fill": "",
+  "uicon-error-circle": "",
+  "uicon-close-circle": "",
+  "uicon-close-circle-fill": "",
+  "uicon-checkmark-circle": "",
+  "uicon-checkmark-circle-fill": "",
+  "uicon-question-circle-fill": "",
+  "uicon-question-circle": "",
+  "uicon-share": "",
+  "uicon-share-fill": "",
+  "uicon-shopping-cart": "",
+  "uicon-shopping-cart-fill": "",
+  "uicon-bell": "",
+  "uicon-bell-fill": "",
+  "uicon-list": "",
+  "uicon-list-dot": "",
+  "uicon-zhihu": "",
+  "uicon-zhihu-circle-fill": "",
+  "uicon-zhifubao": "",
+  "uicon-zhifubao-circle-fill": "",
+  "uicon-weixin-circle-fill": "",
+  "uicon-weixin-fill": "",
+  "uicon-twitter-circle-fill": "",
+  "uicon-twitter": "",
+  "uicon-taobao-circle-fill": "",
+  "uicon-taobao": "",
+  "uicon-weibo-circle-fill": "",
+  "uicon-weibo": "",
+  "uicon-qq-fill": "",
+  "uicon-qq-circle-fill": "",
+  "uicon-moments-circel-fill": "",
+  "uicon-moments": "",
+  "uicon-qzone": "",
+  "uicon-qzone-circle-fill": "",
+  "uicon-baidu-circle-fill": "",
+  "uicon-baidu": "",
+  "uicon-facebook-circle-fill": "",
+  "uicon-facebook": "",
+  "uicon-car": "",
+  "uicon-car-fill": "",
+  "uicon-warning-fill": "",
+  "uicon-warning": "",
+  "uicon-clock-fill": "",
+  "uicon-clock": "",
+  "uicon-edit-pen": "",
+  "uicon-edit-pen-fill": "",
+  "uicon-email": "",
+  "uicon-email-fill": "",
+  "uicon-minus-circle": "",
+  "uicon-minus-circle-fill": "",
+  "uicon-plus-circle": "",
+  "uicon-plus-circle-fill": "",
+  "uicon-file-text": "",
+  "uicon-file-text-fill": "",
+  "uicon-pushpin": "",
+  "uicon-pushpin-fill": "",
+  "uicon-grid": "",
+  "uicon-grid-fill": "",
+  "uicon-play-circle": "",
+  "uicon-play-circle-fill": "",
+  "uicon-pause-circle-fill": "",
+  "uicon-pause": "",
+  "uicon-pause-circle": "",
+  "uicon-eye-off": "",
+  "uicon-eye-off-outline": "",
+  "uicon-gift-fill": "",
+  "uicon-gift": "",
+  "uicon-rmb-circle-fill": "",
+  "uicon-rmb-circle": "",
+  "uicon-kefu-ermai": "",
+  "uicon-server-fill": "",
+  "uicon-coupon-fill": "",
+  "uicon-coupon": "",
+  "uicon-integral": "",
+  "uicon-integral-fill": "",
+  "uicon-home-fill": "",
+  "uicon-home": "",
+  "uicon-hourglass-half-fill": "",
+  "uicon-hourglass": "",
+  "uicon-account": "",
+  "uicon-plus-people-fill": "",
+  "uicon-minus-people-fill": "",
+  "uicon-account-fill": "",
+  "uicon-thumb-down-fill": "",
+  "uicon-thumb-down": "",
+  "uicon-thumb-up": "",
+  "uicon-thumb-up-fill": "",
+  "uicon-lock-fill": "",
+  "uicon-lock-open": "",
+  "uicon-lock-opened-fill": "",
+  "uicon-lock": "",
+  "uicon-red-packet-fill": "",
+  "uicon-photo-fill": "",
+  "uicon-photo": "",
+  "uicon-volume-off-fill": "",
+  "uicon-volume-off": "",
+  "uicon-volume-fill": "",
+  "uicon-volume": "",
+  "uicon-red-packet": "",
+  "uicon-download": "",
+  "uicon-arrow-up-fill": "",
+  "uicon-arrow-down-fill": "",
+  "uicon-play-left-fill": "",
+  "uicon-play-right-fill": "",
+  "uicon-rewind-left-fill": "",
+  "uicon-rewind-right-fill": "",
+  "uicon-arrow-downward": "",
+  "uicon-arrow-leftward": "",
+  "uicon-arrow-rightward": "",
+  "uicon-arrow-upward": "",
+  "uicon-arrow-down": "",
+  "uicon-arrow-right": "",
+  "uicon-arrow-left": "",
+  "uicon-arrow-up": "",
+  "uicon-skip-back-left": "",
+  "uicon-skip-forward-right": "",
+  "uicon-rewind-right": "",
+  "uicon-rewind-left": "",
+  "uicon-arrow-right-double": "",
+  "uicon-arrow-left-double": "",
+  "uicon-wifi-off": "",
+  "uicon-wifi": "",
+  "uicon-empty-data": "",
+  "uicon-empty-history": "",
+  "uicon-empty-list": "",
+  "uicon-empty-page": "",
+  "uicon-empty-order": "",
+  "uicon-man": "",
+  "uicon-woman": "",
+  "uicon-man-add": "",
+  "uicon-man-add-fill": "",
+  "uicon-man-delete": "",
+  "uicon-man-delete-fill": "",
+  "uicon-zh": "",
+  "uicon-en": ""
+};
+exports.icons = icons;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-icon/props.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-icon/props.js
new file mode 100644
index 0000000..5f830e9
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-icon/props.js
@@ -0,0 +1,92 @@
+"use strict";
+const uni_modules_uviewPlus_libs_config_props = require("../../libs/config/props.js");
+const props = {
+  props: {
+    // 图标类名
+    name: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.icon.name
+    },
+    // 图标颜色,可接受主题色
+    color: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.icon.color
+    },
+    // 字体大小,单位px
+    size: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.icon.size
+    },
+    // 是否显示粗体
+    bold: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.icon.bold
+    },
+    // 点击图标的时候传递事件出去的index(用于区分点击了哪一个)
+    index: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.icon.index
+    },
+    // 触摸图标时的类名
+    hoverClass: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.icon.hoverClass
+    },
+    // 自定义扩展前缀,方便用户扩展自己的图标库
+    customPrefix: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.icon.customPrefix
+    },
+    // 图标右边或者下面的文字
+    label: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.icon.label
+    },
+    // label的位置,只能右边或者下边
+    labelPos: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.icon.labelPos
+    },
+    // label的大小
+    labelSize: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.icon.labelSize
+    },
+    // label的颜色
+    labelColor: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.icon.labelColor
+    },
+    // label与图标的距离
+    space: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.icon.space
+    },
+    // 图片的mode
+    imgMode: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.icon.imgMode
+    },
+    // 用于显示图片小图标时,图片的宽度
+    width: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.icon.width
+    },
+    // 用于显示图片小图标时,图片的高度
+    height: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.icon.height
+    },
+    // 用于解决某些情况下,让图标垂直居中的用途
+    top: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.icon.top
+    },
+    // 是否阻止事件传播
+    stop: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.icon.stop
+    }
+  }
+};
+exports.props = props;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-icon/u-icon.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-icon/u-icon.js
new file mode 100644
index 0000000..d27929b
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-icon/u-icon.js
@@ -0,0 +1,191 @@
+"use strict";
+const uni_modules_uviewPlus_components_uIcon_icons = require("./icons.js");
+const uni_modules_uviewPlus_components_uIcon_props = require("./props.js");
+const uni_modules_uviewPlus_libs_mixin_mpMixin = require("../../libs/mixin/mpMixin.js");
+const uni_modules_uviewPlus_libs_mixin_mixin = require("../../libs/mixin/mixin.js");
+const uni_modules_uviewPlus_libs_function_index = require("../../libs/function/index.js");
+const uni_modules_uviewPlus_libs_config_config = require("../../libs/config/config.js");
+const common_vendor = require("../../../../common/vendor.js");
+require("../../libs/config/props.js");
+require("../../libs/config/props/actionSheet.js");
+require("../../libs/config/props/album.js");
+require("../../libs/config/props/alert.js");
+require("../../libs/config/props/avatar.js");
+require("../../libs/config/props/avatarGroup.js");
+require("../../libs/config/props/backtop.js");
+require("../../libs/config/props/badge.js");
+require("../../libs/config/props/button.js");
+require("../../libs/config/props/calendar.js");
+require("../../libs/config/props/carKeyboard.js");
+require("../../libs/config/props/cell.js");
+require("../../libs/config/props/cellGroup.js");
+require("../../libs/config/props/checkbox.js");
+require("../../libs/config/props/checkboxGroup.js");
+require("../../libs/config/props/circleProgress.js");
+require("../../libs/config/props/code.js");
+require("../../libs/config/props/codeInput.js");
+require("../../libs/config/props/col.js");
+require("../../libs/config/props/collapse.js");
+require("../../libs/config/props/collapseItem.js");
+require("../../libs/config/props/columnNotice.js");
+require("../../libs/config/props/countDown.js");
+require("../../libs/config/props/countTo.js");
+require("../../libs/config/props/datetimePicker.js");
+require("../../libs/config/props/divider.js");
+require("../../libs/config/props/empty.js");
+require("../../libs/config/props/form.js");
+require("../../libs/config/props/formItem.js");
+require("../../libs/config/props/gap.js");
+require("../../libs/config/props/grid.js");
+require("../../libs/config/props/gridItem.js");
+require("../../libs/config/props/icon.js");
+require("../../libs/config/props/image.js");
+require("../../libs/config/props/indexAnchor.js");
+require("../../libs/config/props/indexList.js");
+require("../../libs/config/props/input.js");
+require("../../libs/config/props/keyboard.js");
+require("../../libs/config/props/line.js");
+require("../../libs/config/props/lineProgress.js");
+require("../../libs/config/props/link.js");
+require("../../libs/config/props/list.js");
+require("../../libs/config/props/listItem.js");
+require("../../libs/config/props/loadingIcon.js");
+require("../../libs/config/props/loadingPage.js");
+require("../../libs/config/props/loadmore.js");
+require("../../libs/config/props/modal.js");
+require("../../libs/config/props/navbar.js");
+require("../../libs/config/color.js");
+require("../../libs/config/props/noNetwork.js");
+require("../../libs/config/props/noticeBar.js");
+require("../../libs/config/props/notify.js");
+require("../../libs/config/props/numberBox.js");
+require("../../libs/config/props/numberKeyboard.js");
+require("../../libs/config/props/overlay.js");
+require("../../libs/config/props/parse.js");
+require("../../libs/config/props/picker.js");
+require("../../libs/config/props/popup.js");
+require("../../libs/config/props/radio.js");
+require("../../libs/config/props/radioGroup.js");
+require("../../libs/config/props/rate.js");
+require("../../libs/config/props/readMore.js");
+require("../../libs/config/props/row.js");
+require("../../libs/config/props/rowNotice.js");
+require("../../libs/config/props/scrollList.js");
+require("../../libs/config/props/search.js");
+require("../../libs/config/props/section.js");
+require("../../libs/config/props/skeleton.js");
+require("../../libs/config/props/slider.js");
+require("../../libs/config/props/statusBar.js");
+require("../../libs/config/props/steps.js");
+require("../../libs/config/props/stepsItem.js");
+require("../../libs/config/props/sticky.js");
+require("../../libs/config/props/subsection.js");
+require("../../libs/config/props/swipeAction.js");
+require("../../libs/config/props/swipeActionItem.js");
+require("../../libs/config/props/swiper.js");
+require("../../libs/config/props/swipterIndicator.js");
+require("../../libs/config/props/switch.js");
+require("../../libs/config/props/tabbar.js");
+require("../../libs/config/props/tabbarItem.js");
+require("../../libs/config/props/tabs.js");
+require("../../libs/config/props/tag.js");
+require("../../libs/config/props/text.js");
+require("../../libs/config/props/textarea.js");
+require("../../libs/config/props/toast.js");
+require("../../libs/config/props/toolbar.js");
+require("../../libs/config/props/tooltip.js");
+require("../../libs/config/props/transition.js");
+require("../../libs/config/props/upload.js");
+require("../../libs/function/test.js");
+require("../../libs/util/route.js");
+require("../../libs/function/digit.js");
+const _sfc_main = {
+  name: "u-icon",
+  data() {
+    return {};
+  },
+  emits: ["click"],
+  mixins: [uni_modules_uviewPlus_libs_mixin_mpMixin.mpMixin, uni_modules_uviewPlus_libs_mixin_mixin.mixin, uni_modules_uviewPlus_components_uIcon_props.props],
+  computed: {
+    uClasses() {
+      let classes = [];
+      classes.push(this.customPrefix + "-" + this.name);
+      if (this.customPrefix == "uicon") {
+        classes.push("u-iconfont");
+      } else {
+        classes.push(this.customPrefix);
+      }
+      if (this.color && uni_modules_uviewPlus_libs_config_config.config.type.includes(this.color))
+        classes.push("u-icon__icon--" + this.color);
+      return classes;
+    },
+    iconStyle() {
+      let style = {};
+      style = {
+        fontSize: uni_modules_uviewPlus_libs_function_index.addUnit(this.size),
+        lineHeight: uni_modules_uviewPlus_libs_function_index.addUnit(this.size),
+        fontWeight: this.bold ? "bold" : "normal",
+        // 某些特殊情况需要设置一个到顶部的距离,才能更好的垂直居中
+        top: uni_modules_uviewPlus_libs_function_index.addUnit(this.top)
+      };
+      if (this.color && !uni_modules_uviewPlus_libs_config_config.config.type.includes(this.color))
+        style.color = this.color;
+      return style;
+    },
+    // 判断传入的name属性,是否图片路径,只要带有"/"均认为是图片形式
+    isImg() {
+      return this.name.indexOf("/") !== -1;
+    },
+    imgStyle() {
+      let style = {};
+      style.width = this.width ? uni_modules_uviewPlus_libs_function_index.addUnit(this.width) : uni_modules_uviewPlus_libs_function_index.addUnit(this.size);
+      style.height = this.height ? uni_modules_uviewPlus_libs_function_index.addUnit(this.height) : uni_modules_uviewPlus_libs_function_index.addUnit(this.size);
+      return style;
+    },
+    // 通过图标名,查找对应的图标
+    icon() {
+      if (this.customPrefix !== "uicon")
+        return "";
+      return uni_modules_uviewPlus_components_uIcon_icons.icons["uicon-" + this.name] || this.name;
+    }
+  },
+  methods: {
+    addStyle: uni_modules_uviewPlus_libs_function_index.addStyle,
+    addUnit: uni_modules_uviewPlus_libs_function_index.addUnit,
+    clickHandler(e) {
+      this.$emit("click", this.index);
+      this.stop && this.preventEvent(e);
+    }
+  }
+};
+function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
+  return common_vendor.e({
+    a: $options.isImg
+  }, $options.isImg ? {
+    b: _ctx.name,
+    c: _ctx.imgMode,
+    d: common_vendor.s($options.imgStyle),
+    e: common_vendor.s($options.addStyle(_ctx.customStyle))
+  } : {
+    f: common_vendor.t($options.icon),
+    g: common_vendor.n($options.uClasses),
+    h: common_vendor.s($options.iconStyle),
+    i: common_vendor.s($options.addStyle(_ctx.customStyle)),
+    j: _ctx.hoverClass
+  }, {
+    k: _ctx.label !== ""
+  }, _ctx.label !== "" ? {
+    l: common_vendor.t(_ctx.label),
+    m: _ctx.labelColor,
+    n: $options.addUnit(_ctx.labelSize),
+    o: _ctx.labelPos == "right" ? $options.addUnit(_ctx.space) : 0,
+    p: _ctx.labelPos == "bottom" ? $options.addUnit(_ctx.space) : 0,
+    q: _ctx.labelPos == "left" ? $options.addUnit(_ctx.space) : 0,
+    r: _ctx.labelPos == "top" ? $options.addUnit(_ctx.space) : 0
+  } : {}, {
+    s: common_vendor.o((...args) => $options.clickHandler && $options.clickHandler(...args)),
+    t: common_vendor.n("u-icon--" + _ctx.labelPos)
+  });
+}
+const Component = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-ac70166d"], ["__file", "D:/里海数字乡村/purchase-let/uni_modules/uview-plus/components/u-icon/u-icon.vue"]]);
+wx.createComponent(Component);
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-icon/u-icon.json b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-icon/u-icon.json
new file mode 100644
index 0000000..e8cfaaf
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-icon/u-icon.json
@@ -0,0 +1,4 @@
+{
+  "component": true,
+  "usingComponents": {}
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-icon/u-icon.wxml b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-icon/u-icon.wxml
new file mode 100644
index 0000000..48fb96f
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-icon/u-icon.wxml
@@ -0,0 +1 @@
+<view bindtap="{{s}}" class="{{['u-icon', 'data-v-ac70166d', t]}}"><image wx:if="{{a}}" class="u-icon__img data-v-ac70166d" src="{{b}}" mode="{{c}}" style="{{d + ';' + e}}"></image><text wx:else class="{{['u-icon__icon', 'data-v-ac70166d', g]}}" style="{{h + ';' + i}}" hover-class="{{j}}">{{f}}</text><text wx:if="{{k}}" class="u-icon__label data-v-ac70166d" style="{{'color:' + m + ';' + ('font-size:' + n) + ';' + ('margin-left:' + o) + ';' + ('margin-top:' + p) + ';' + ('margin-right:' + q) + ';' + ('margin-bottom:' + r)}}">{{l}}</text></view>
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-icon/u-icon.wxss b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-icon/u-icon.wxss
new file mode 100644
index 0000000..cd4911c
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-icon/u-icon.wxss
@@ -0,0 +1,94 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+/* 颜色变量 */
+/* 行为相关颜色 */
+/* 文字基本颜色 */
+/* 背景颜色 */
+/* 边框颜色 */
+/* 尺寸变量 */
+/* 文字尺寸 */
+/* 图片尺寸 */
+/* Border Radius */
+/* 水平间距 */
+/* 垂直间距 */
+/* 透明度 */
+/* 文章场景相关 */
+.u-empty.data-v-ac70166d,
+.u-empty__wrap.data-v-ac70166d,
+.u-tabs.data-v-ac70166d,
+.u-tabs__wrapper.data-v-ac70166d,
+.u-tabs__wrapper__scroll-view-wrapper.data-v-ac70166d,
+.u-tabs__wrapper__scroll-view.data-v-ac70166d,
+.u-tabs__wrapper__nav.data-v-ac70166d,
+.u-tabs__wrapper__nav__line.data-v-ac70166d {
+  display: flex;
+  flex-direction: column;
+  flex-shrink: 0;
+  flex-grow: 0;
+  flex-basis: auto;
+  align-items: stretch;
+  align-content: flex-start;
+}
+@font-face {
+  font-family: "uicon-iconfont";
+  src: url("https://at.alicdn.com/t/font_2225171_8kdcwk4po24.ttf") format("truetype");
+}
+.u-icon.data-v-ac70166d {
+  display: flex;
+  align-items: center;
+}
+.u-icon--left.data-v-ac70166d {
+  flex-direction: row-reverse;
+  align-items: center;
+}
+.u-icon--right.data-v-ac70166d {
+  flex-direction: row;
+  align-items: center;
+}
+.u-icon--top.data-v-ac70166d {
+  flex-direction: column-reverse;
+  justify-content: center;
+}
+.u-icon--bottom.data-v-ac70166d {
+  flex-direction: column;
+  justify-content: center;
+}
+.u-icon__icon.data-v-ac70166d {
+  font-family: uicon-iconfont;
+  position: relative;
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+}
+.u-icon__icon--primary.data-v-ac70166d {
+  color: #3c9cff;
+}
+.u-icon__icon--success.data-v-ac70166d {
+  color: #5ac725;
+}
+.u-icon__icon--error.data-v-ac70166d {
+  color: #f56c6c;
+}
+.u-icon__icon--warning.data-v-ac70166d {
+  color: #f9ae3d;
+}
+.u-icon__icon--info.data-v-ac70166d {
+  color: #909399;
+}
+.u-icon__img.data-v-ac70166d {
+  height: auto;
+  will-change: transform;
+}
+.u-icon__label.data-v-ac70166d {
+  line-height: 1;
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-line/props.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-line/props.js
new file mode 100644
index 0000000..073dfa9
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-line/props.js
@@ -0,0 +1,36 @@
+"use strict";
+const uni_modules_uviewPlus_libs_config_props = require("../../libs/config/props.js");
+const props = {
+  props: {
+    color: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.line.color
+    },
+    // 长度,竖向时表现为高度,横向时表现为长度,可以为百分比,带px单位的值等
+    length: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.line.length
+    },
+    // 线条方向,col-竖向,row-横向
+    direction: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.line.direction
+    },
+    // 是否显示细边框
+    hairline: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.line.hairline
+    },
+    // 线条与上下左右元素的间距,字符串形式,如"30px"、"20px 30px"
+    margin: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.line.margin
+    },
+    // 是否虚线,true-虚线,false-实线
+    dashed: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.line.dashed
+    }
+  }
+};
+exports.props = props;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-line/u-line.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-line/u-line.js
new file mode 100644
index 0000000..94b3c63
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-line/u-line.js
@@ -0,0 +1,132 @@
+"use strict";
+const uni_modules_uviewPlus_components_uLine_props = require("./props.js");
+const uni_modules_uviewPlus_libs_mixin_mpMixin = require("../../libs/mixin/mpMixin.js");
+const uni_modules_uviewPlus_libs_mixin_mixin = require("../../libs/mixin/mixin.js");
+const uni_modules_uviewPlus_libs_function_index = require("../../libs/function/index.js");
+const common_vendor = require("../../../../common/vendor.js");
+require("../../libs/config/props.js");
+require("../../libs/config/config.js");
+require("../../libs/config/props/actionSheet.js");
+require("../../libs/config/props/album.js");
+require("../../libs/config/props/alert.js");
+require("../../libs/config/props/avatar.js");
+require("../../libs/config/props/avatarGroup.js");
+require("../../libs/config/props/backtop.js");
+require("../../libs/config/props/badge.js");
+require("../../libs/config/props/button.js");
+require("../../libs/config/props/calendar.js");
+require("../../libs/config/props/carKeyboard.js");
+require("../../libs/config/props/cell.js");
+require("../../libs/config/props/cellGroup.js");
+require("../../libs/config/props/checkbox.js");
+require("../../libs/config/props/checkboxGroup.js");
+require("../../libs/config/props/circleProgress.js");
+require("../../libs/config/props/code.js");
+require("../../libs/config/props/codeInput.js");
+require("../../libs/config/props/col.js");
+require("../../libs/config/props/collapse.js");
+require("../../libs/config/props/collapseItem.js");
+require("../../libs/config/props/columnNotice.js");
+require("../../libs/config/props/countDown.js");
+require("../../libs/config/props/countTo.js");
+require("../../libs/config/props/datetimePicker.js");
+require("../../libs/config/props/divider.js");
+require("../../libs/config/props/empty.js");
+require("../../libs/config/props/form.js");
+require("../../libs/config/props/formItem.js");
+require("../../libs/config/props/gap.js");
+require("../../libs/config/props/grid.js");
+require("../../libs/config/props/gridItem.js");
+require("../../libs/config/props/icon.js");
+require("../../libs/config/props/image.js");
+require("../../libs/config/props/indexAnchor.js");
+require("../../libs/config/props/indexList.js");
+require("../../libs/config/props/input.js");
+require("../../libs/config/props/keyboard.js");
+require("../../libs/config/props/line.js");
+require("../../libs/config/props/lineProgress.js");
+require("../../libs/config/props/link.js");
+require("../../libs/config/props/list.js");
+require("../../libs/config/props/listItem.js");
+require("../../libs/config/props/loadingIcon.js");
+require("../../libs/config/props/loadingPage.js");
+require("../../libs/config/props/loadmore.js");
+require("../../libs/config/props/modal.js");
+require("../../libs/config/props/navbar.js");
+require("../../libs/config/color.js");
+require("../../libs/config/props/noNetwork.js");
+require("../../libs/config/props/noticeBar.js");
+require("../../libs/config/props/notify.js");
+require("../../libs/config/props/numberBox.js");
+require("../../libs/config/props/numberKeyboard.js");
+require("../../libs/config/props/overlay.js");
+require("../../libs/config/props/parse.js");
+require("../../libs/config/props/picker.js");
+require("../../libs/config/props/popup.js");
+require("../../libs/config/props/radio.js");
+require("../../libs/config/props/radioGroup.js");
+require("../../libs/config/props/rate.js");
+require("../../libs/config/props/readMore.js");
+require("../../libs/config/props/row.js");
+require("../../libs/config/props/rowNotice.js");
+require("../../libs/config/props/scrollList.js");
+require("../../libs/config/props/search.js");
+require("../../libs/config/props/section.js");
+require("../../libs/config/props/skeleton.js");
+require("../../libs/config/props/slider.js");
+require("../../libs/config/props/statusBar.js");
+require("../../libs/config/props/steps.js");
+require("../../libs/config/props/stepsItem.js");
+require("../../libs/config/props/sticky.js");
+require("../../libs/config/props/subsection.js");
+require("../../libs/config/props/swipeAction.js");
+require("../../libs/config/props/swipeActionItem.js");
+require("../../libs/config/props/swiper.js");
+require("../../libs/config/props/swipterIndicator.js");
+require("../../libs/config/props/switch.js");
+require("../../libs/config/props/tabbar.js");
+require("../../libs/config/props/tabbarItem.js");
+require("../../libs/config/props/tabs.js");
+require("../../libs/config/props/tag.js");
+require("../../libs/config/props/text.js");
+require("../../libs/config/props/textarea.js");
+require("../../libs/config/props/toast.js");
+require("../../libs/config/props/toolbar.js");
+require("../../libs/config/props/tooltip.js");
+require("../../libs/config/props/transition.js");
+require("../../libs/config/props/upload.js");
+require("../../libs/function/test.js");
+require("../../libs/util/route.js");
+require("../../libs/function/digit.js");
+const _sfc_main = {
+  name: "u-line",
+  mixins: [uni_modules_uviewPlus_libs_mixin_mpMixin.mpMixin, uni_modules_uviewPlus_libs_mixin_mixin.mixin, uni_modules_uviewPlus_components_uLine_props.props],
+  computed: {
+    lineStyle() {
+      const style = {};
+      style.margin = this.margin;
+      if (this.direction === "row") {
+        style.borderBottomWidth = "1px";
+        style.borderBottomStyle = this.dashed ? "dashed" : "solid";
+        style.width = uni_modules_uviewPlus_libs_function_index.addUnit(this.length);
+        if (this.hairline)
+          style.transform = "scaleY(0.5)";
+      } else {
+        style.borderLeftWidth = "1px";
+        style.borderLeftStyle = this.dashed ? "dashed" : "solid";
+        style.height = uni_modules_uviewPlus_libs_function_index.addUnit(this.length);
+        if (this.hairline)
+          style.transform = "scaleX(0.5)";
+      }
+      style.borderColor = this.color;
+      return uni_modules_uviewPlus_libs_function_index.deepMerge(style, uni_modules_uviewPlus_libs_function_index.addStyle(this.customStyle));
+    }
+  }
+};
+function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
+  return {
+    a: common_vendor.s($options.lineStyle)
+  };
+}
+const Component = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-72791e59"], ["__file", "D:/里海数字乡村/purchase-let/uni_modules/uview-plus/components/u-line/u-line.vue"]]);
+wx.createComponent(Component);
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-line/u-line.json b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-line/u-line.json
new file mode 100644
index 0000000..e8cfaaf
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-line/u-line.json
@@ -0,0 +1,4 @@
+{
+  "component": true,
+  "usingComponents": {}
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-line/u-line.wxml b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-line/u-line.wxml
new file mode 100644
index 0000000..ef0a44b
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-line/u-line.wxml
@@ -0,0 +1 @@
+<view class="u-line data-v-72791e59" style="{{a}}"></view>
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-line/u-line.wxss b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-line/u-line.wxss
new file mode 100644
index 0000000..99c46d8
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-line/u-line.wxss
@@ -0,0 +1,44 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+/* 颜色变量 */
+/* 行为相关颜色 */
+/* 文字基本颜色 */
+/* 背景颜色 */
+/* 边框颜色 */
+/* 尺寸变量 */
+/* 文字尺寸 */
+/* 图片尺寸 */
+/* Border Radius */
+/* 水平间距 */
+/* 垂直间距 */
+/* 透明度 */
+/* 文章场景相关 */
+.u-empty.data-v-72791e59,
+.u-empty__wrap.data-v-72791e59,
+.u-tabs.data-v-72791e59,
+.u-tabs__wrapper.data-v-72791e59,
+.u-tabs__wrapper__scroll-view-wrapper.data-v-72791e59,
+.u-tabs__wrapper__scroll-view.data-v-72791e59,
+.u-tabs__wrapper__nav.data-v-72791e59,
+.u-tabs__wrapper__nav__line.data-v-72791e59 {
+  display: flex;
+  flex-direction: column;
+  flex-shrink: 0;
+  flex-grow: 0;
+  flex-basis: auto;
+  align-items: stretch;
+  align-content: flex-start;
+}
+.u-line.data-v-72791e59 {
+  vertical-align: middle;
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-link/props.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-link/props.js
new file mode 100644
index 0000000..ac2a5aa
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-link/props.js
@@ -0,0 +1,42 @@
+"use strict";
+const uni_modules_uviewPlus_libs_config_props = require("../../libs/config/props.js");
+const props = {
+  props: {
+    // 文字颜色
+    color: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.link.color
+    },
+    // 字体大小,单位px
+    fontSize: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.link.fontSize
+    },
+    // 是否显示下划线
+    underLine: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.link.underLine
+    },
+    // 要跳转的链接
+    href: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.link.href
+    },
+    // 小程序中复制到粘贴板的提示语
+    mpTips: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.link.mpTips
+    },
+    // 下划线颜色
+    lineColor: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.link.lineColor
+    },
+    // 超链接的问题,不使用slot形式传入,是因为nvue下无法修改颜色
+    text: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.link.text
+    }
+  }
+};
+exports.props = props;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-link/u-link.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-link/u-link.js
new file mode 100644
index 0000000..12d0da1
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-link/u-link.js
@@ -0,0 +1,142 @@
+"use strict";
+const common_vendor = require("../../../../common/vendor.js");
+const uni_modules_uviewPlus_components_uLink_props = require("./props.js");
+const uni_modules_uviewPlus_libs_mixin_mpMixin = require("../../libs/mixin/mpMixin.js");
+const uni_modules_uviewPlus_libs_mixin_mixin = require("../../libs/mixin/mixin.js");
+const uni_modules_uviewPlus_libs_function_index = require("../../libs/function/index.js");
+require("../../libs/config/props.js");
+require("../../libs/config/config.js");
+require("../../libs/config/props/actionSheet.js");
+require("../../libs/config/props/album.js");
+require("../../libs/config/props/alert.js");
+require("../../libs/config/props/avatar.js");
+require("../../libs/config/props/avatarGroup.js");
+require("../../libs/config/props/backtop.js");
+require("../../libs/config/props/badge.js");
+require("../../libs/config/props/button.js");
+require("../../libs/config/props/calendar.js");
+require("../../libs/config/props/carKeyboard.js");
+require("../../libs/config/props/cell.js");
+require("../../libs/config/props/cellGroup.js");
+require("../../libs/config/props/checkbox.js");
+require("../../libs/config/props/checkboxGroup.js");
+require("../../libs/config/props/circleProgress.js");
+require("../../libs/config/props/code.js");
+require("../../libs/config/props/codeInput.js");
+require("../../libs/config/props/col.js");
+require("../../libs/config/props/collapse.js");
+require("../../libs/config/props/collapseItem.js");
+require("../../libs/config/props/columnNotice.js");
+require("../../libs/config/props/countDown.js");
+require("../../libs/config/props/countTo.js");
+require("../../libs/config/props/datetimePicker.js");
+require("../../libs/config/props/divider.js");
+require("../../libs/config/props/empty.js");
+require("../../libs/config/props/form.js");
+require("../../libs/config/props/formItem.js");
+require("../../libs/config/props/gap.js");
+require("../../libs/config/props/grid.js");
+require("../../libs/config/props/gridItem.js");
+require("../../libs/config/props/icon.js");
+require("../../libs/config/props/image.js");
+require("../../libs/config/props/indexAnchor.js");
+require("../../libs/config/props/indexList.js");
+require("../../libs/config/props/input.js");
+require("../../libs/config/props/keyboard.js");
+require("../../libs/config/props/line.js");
+require("../../libs/config/props/lineProgress.js");
+require("../../libs/config/props/link.js");
+require("../../libs/config/props/list.js");
+require("../../libs/config/props/listItem.js");
+require("../../libs/config/props/loadingIcon.js");
+require("../../libs/config/props/loadingPage.js");
+require("../../libs/config/props/loadmore.js");
+require("../../libs/config/props/modal.js");
+require("../../libs/config/props/navbar.js");
+require("../../libs/config/color.js");
+require("../../libs/config/props/noNetwork.js");
+require("../../libs/config/props/noticeBar.js");
+require("../../libs/config/props/notify.js");
+require("../../libs/config/props/numberBox.js");
+require("../../libs/config/props/numberKeyboard.js");
+require("../../libs/config/props/overlay.js");
+require("../../libs/config/props/parse.js");
+require("../../libs/config/props/picker.js");
+require("../../libs/config/props/popup.js");
+require("../../libs/config/props/radio.js");
+require("../../libs/config/props/radioGroup.js");
+require("../../libs/config/props/rate.js");
+require("../../libs/config/props/readMore.js");
+require("../../libs/config/props/row.js");
+require("../../libs/config/props/rowNotice.js");
+require("../../libs/config/props/scrollList.js");
+require("../../libs/config/props/search.js");
+require("../../libs/config/props/section.js");
+require("../../libs/config/props/skeleton.js");
+require("../../libs/config/props/slider.js");
+require("../../libs/config/props/statusBar.js");
+require("../../libs/config/props/steps.js");
+require("../../libs/config/props/stepsItem.js");
+require("../../libs/config/props/sticky.js");
+require("../../libs/config/props/subsection.js");
+require("../../libs/config/props/swipeAction.js");
+require("../../libs/config/props/swipeActionItem.js");
+require("../../libs/config/props/swiper.js");
+require("../../libs/config/props/swipterIndicator.js");
+require("../../libs/config/props/switch.js");
+require("../../libs/config/props/tabbar.js");
+require("../../libs/config/props/tabbarItem.js");
+require("../../libs/config/props/tabs.js");
+require("../../libs/config/props/tag.js");
+require("../../libs/config/props/text.js");
+require("../../libs/config/props/textarea.js");
+require("../../libs/config/props/toast.js");
+require("../../libs/config/props/toolbar.js");
+require("../../libs/config/props/tooltip.js");
+require("../../libs/config/props/transition.js");
+require("../../libs/config/props/upload.js");
+require("../../libs/function/test.js");
+require("../../libs/util/route.js");
+require("../../libs/function/digit.js");
+const _sfc_main = {
+  name: "u-link",
+  mixins: [uni_modules_uviewPlus_libs_mixin_mpMixin.mpMixin, uni_modules_uviewPlus_libs_mixin_mixin.mixin, uni_modules_uviewPlus_components_uLink_props.props],
+  computed: {
+    linkStyle() {
+      const style = {
+        color: this.color,
+        fontSize: uni_modules_uviewPlus_libs_function_index.addUnit(this.fontSize),
+        // line-height设置为比字体大小多2px
+        lineHeight: uni_modules_uviewPlus_libs_function_index.addUnit(uni_modules_uviewPlus_libs_function_index.getPx(this.fontSize) + 2),
+        textDecoration: this.underLine ? "underline" : "none"
+      };
+      return style;
+    }
+  },
+  emits: ["click"],
+  methods: {
+    addStyle: uni_modules_uviewPlus_libs_function_index.addStyle,
+    openLink() {
+      common_vendor.index.setClipboardData({
+        data: this.href,
+        success: () => {
+          common_vendor.index.hideToast();
+          this.$nextTick(() => {
+            uni_modules_uviewPlus_libs_function_index.toast(this.mpTips);
+          });
+        }
+      });
+      this.$emit("click");
+    }
+  }
+};
+function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
+  return {
+    a: common_vendor.t(_ctx.text),
+    b: common_vendor.o((...args) => $options.openLink && $options.openLink(...args)),
+    c: common_vendor.s($options.linkStyle),
+    d: common_vendor.s($options.addStyle(_ctx.customStyle))
+  };
+}
+const Component = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-12f6646d"], ["__file", "D:/里海数字乡村/purchase-let/uni_modules/uview-plus/components/u-link/u-link.vue"]]);
+wx.createComponent(Component);
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-link/u-link.json b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-link/u-link.json
new file mode 100644
index 0000000..e8cfaaf
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-link/u-link.json
@@ -0,0 +1,4 @@
+{
+  "component": true,
+  "usingComponents": {}
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-link/u-link.wxml b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-link/u-link.wxml
new file mode 100644
index 0000000..4f6e968
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-link/u-link.wxml
@@ -0,0 +1 @@
+<text class="u-link data-v-12f6646d" catchtap="{{b}}" style="{{c + ';' + d}}">{{a}}</text>
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-link/u-link.wxss b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-link/u-link.wxss
new file mode 100644
index 0000000..0138dda
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-link/u-link.wxss
@@ -0,0 +1,48 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+/* 颜色变量 */
+/* 行为相关颜色 */
+/* 文字基本颜色 */
+/* 背景颜色 */
+/* 边框颜色 */
+/* 尺寸变量 */
+/* 文字尺寸 */
+/* 图片尺寸 */
+/* Border Radius */
+/* 水平间距 */
+/* 垂直间距 */
+/* 透明度 */
+/* 文章场景相关 */
+.u-empty.data-v-12f6646d,
+.u-empty__wrap.data-v-12f6646d,
+.u-tabs.data-v-12f6646d,
+.u-tabs__wrapper.data-v-12f6646d,
+.u-tabs__wrapper__scroll-view-wrapper.data-v-12f6646d,
+.u-tabs__wrapper__scroll-view.data-v-12f6646d,
+.u-tabs__wrapper__nav.data-v-12f6646d,
+.u-tabs__wrapper__nav__line.data-v-12f6646d {
+  display: flex;
+  flex-direction: column;
+  flex-shrink: 0;
+  flex-grow: 0;
+  flex-basis: auto;
+  align-items: stretch;
+  align-content: flex-start;
+}
+.u-link.data-v-12f6646d {
+  line-height: 1;
+  display: flex;
+  flex-direction: row;
+  flex-wrap: wrap;
+  flex: 1;
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-loading-icon/props.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-loading-icon/props.js
new file mode 100644
index 0000000..29d2e19
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-loading-icon/props.js
@@ -0,0 +1,62 @@
+"use strict";
+const uni_modules_uviewPlus_libs_config_props = require("../../libs/config/props.js");
+const props = {
+  props: {
+    // 是否显示组件
+    show: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.loadingIcon.show
+    },
+    // 颜色
+    color: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.loadingIcon.color
+    },
+    // 提示文字颜色
+    textColor: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.loadingIcon.textColor
+    },
+    // 文字和图标是否垂直排列
+    vertical: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.loadingIcon.vertical
+    },
+    // 模式选择,circle-圆形,spinner-花朵形,semicircle-半圆形
+    mode: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.loadingIcon.mode
+    },
+    // 图标大小,单位默认px
+    size: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.loadingIcon.size
+    },
+    // 文字大小
+    textSize: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.loadingIcon.textSize
+    },
+    // 文字内容
+    text: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.loadingIcon.text
+    },
+    // 动画模式
+    timingFunction: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.loadingIcon.timingFunction
+    },
+    // 动画执行周期时间
+    duration: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.loadingIcon.duration
+    },
+    // mode=circle时的暗边颜色
+    inactiveColor: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.loadingIcon.inactiveColor
+    }
+  }
+};
+exports.props = props;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-loading-icon/u-loading-icon.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-loading-icon/u-loading-icon.js
new file mode 100644
index 0000000..f6392cd
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-loading-icon/u-loading-icon.js
@@ -0,0 +1,199 @@
+"use strict";
+const uni_modules_uviewPlus_components_uLoadingIcon_props = require("./props.js");
+const uni_modules_uviewPlus_libs_mixin_mpMixin = require("../../libs/mixin/mpMixin.js");
+const uni_modules_uviewPlus_libs_mixin_mixin = require("../../libs/mixin/mixin.js");
+const uni_modules_uviewPlus_libs_function_index = require("../../libs/function/index.js");
+const uni_modules_uviewPlus_libs_function_colorGradient = require("../../libs/function/colorGradient.js");
+const common_vendor = require("../../../../common/vendor.js");
+require("../../libs/config/props.js");
+require("../../libs/config/config.js");
+require("../../libs/config/props/actionSheet.js");
+require("../../libs/config/props/album.js");
+require("../../libs/config/props/alert.js");
+require("../../libs/config/props/avatar.js");
+require("../../libs/config/props/avatarGroup.js");
+require("../../libs/config/props/backtop.js");
+require("../../libs/config/props/badge.js");
+require("../../libs/config/props/button.js");
+require("../../libs/config/props/calendar.js");
+require("../../libs/config/props/carKeyboard.js");
+require("../../libs/config/props/cell.js");
+require("../../libs/config/props/cellGroup.js");
+require("../../libs/config/props/checkbox.js");
+require("../../libs/config/props/checkboxGroup.js");
+require("../../libs/config/props/circleProgress.js");
+require("../../libs/config/props/code.js");
+require("../../libs/config/props/codeInput.js");
+require("../../libs/config/props/col.js");
+require("../../libs/config/props/collapse.js");
+require("../../libs/config/props/collapseItem.js");
+require("../../libs/config/props/columnNotice.js");
+require("../../libs/config/props/countDown.js");
+require("../../libs/config/props/countTo.js");
+require("../../libs/config/props/datetimePicker.js");
+require("../../libs/config/props/divider.js");
+require("../../libs/config/props/empty.js");
+require("../../libs/config/props/form.js");
+require("../../libs/config/props/formItem.js");
+require("../../libs/config/props/gap.js");
+require("../../libs/config/props/grid.js");
+require("../../libs/config/props/gridItem.js");
+require("../../libs/config/props/icon.js");
+require("../../libs/config/props/image.js");
+require("../../libs/config/props/indexAnchor.js");
+require("../../libs/config/props/indexList.js");
+require("../../libs/config/props/input.js");
+require("../../libs/config/props/keyboard.js");
+require("../../libs/config/props/line.js");
+require("../../libs/config/props/lineProgress.js");
+require("../../libs/config/props/link.js");
+require("../../libs/config/props/list.js");
+require("../../libs/config/props/listItem.js");
+require("../../libs/config/props/loadingIcon.js");
+require("../../libs/config/props/loadingPage.js");
+require("../../libs/config/props/loadmore.js");
+require("../../libs/config/props/modal.js");
+require("../../libs/config/props/navbar.js");
+require("../../libs/config/color.js");
+require("../../libs/config/props/noNetwork.js");
+require("../../libs/config/props/noticeBar.js");
+require("../../libs/config/props/notify.js");
+require("../../libs/config/props/numberBox.js");
+require("../../libs/config/props/numberKeyboard.js");
+require("../../libs/config/props/overlay.js");
+require("../../libs/config/props/parse.js");
+require("../../libs/config/props/picker.js");
+require("../../libs/config/props/popup.js");
+require("../../libs/config/props/radio.js");
+require("../../libs/config/props/radioGroup.js");
+require("../../libs/config/props/rate.js");
+require("../../libs/config/props/readMore.js");
+require("../../libs/config/props/row.js");
+require("../../libs/config/props/rowNotice.js");
+require("../../libs/config/props/scrollList.js");
+require("../../libs/config/props/search.js");
+require("../../libs/config/props/section.js");
+require("../../libs/config/props/skeleton.js");
+require("../../libs/config/props/slider.js");
+require("../../libs/config/props/statusBar.js");
+require("../../libs/config/props/steps.js");
+require("../../libs/config/props/stepsItem.js");
+require("../../libs/config/props/sticky.js");
+require("../../libs/config/props/subsection.js");
+require("../../libs/config/props/swipeAction.js");
+require("../../libs/config/props/swipeActionItem.js");
+require("../../libs/config/props/swiper.js");
+require("../../libs/config/props/swipterIndicator.js");
+require("../../libs/config/props/switch.js");
+require("../../libs/config/props/tabbar.js");
+require("../../libs/config/props/tabbarItem.js");
+require("../../libs/config/props/tabs.js");
+require("../../libs/config/props/tag.js");
+require("../../libs/config/props/text.js");
+require("../../libs/config/props/textarea.js");
+require("../../libs/config/props/toast.js");
+require("../../libs/config/props/toolbar.js");
+require("../../libs/config/props/tooltip.js");
+require("../../libs/config/props/transition.js");
+require("../../libs/config/props/upload.js");
+require("../../libs/function/test.js");
+require("../../libs/util/route.js");
+require("../../libs/function/digit.js");
+const _sfc_main = {
+  name: "u-loading-icon",
+  mixins: [uni_modules_uviewPlus_libs_mixin_mpMixin.mpMixin, uni_modules_uviewPlus_libs_mixin_mixin.mixin, uni_modules_uviewPlus_components_uLoadingIcon_props.props],
+  data() {
+    return {
+      // Array.form可以通过一个伪数组对象创建指定长度的数组
+      // https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/from
+      array12: Array.from({
+        length: 12
+      }),
+      // 这里需要设置默认值为360,否则在安卓nvue上,会延迟一个duration周期后才执行
+      // 在iOS nvue上,则会一开始默认执行两个周期的动画
+      aniAngel: 360,
+      // 动画旋转角度
+      webviewHide: false,
+      // 监听webview的状态,如果隐藏了页面,则停止动画,以免性能消耗
+      loading: false
+      // 是否运行中,针对nvue使用
+    };
+  },
+  computed: {
+    // 当为circle类型时,给其另外三边设置一个更轻一些的颜色
+    // 之所以需要这么做的原因是,比如父组件传了color为红色,那么需要另外的三个边为浅红色
+    // 而不能是固定的某一个其他颜色(因为这个固定的颜色可能浅蓝,导致效果没有那么细腻良好)
+    otherBorderColor() {
+      const lightColor = uni_modules_uviewPlus_libs_function_colorGradient.colorGradient$1(this.color, "#ffffff", 100)[80];
+      if (this.mode === "circle") {
+        return this.inactiveColor ? this.inactiveColor : lightColor;
+      } else {
+        return "transparent";
+      }
+    }
+  },
+  watch: {
+    show(n) {
+    }
+  },
+  mounted() {
+    this.init();
+  },
+  methods: {
+    addUnit: uni_modules_uviewPlus_libs_function_index.addUnit,
+    addStyle: uni_modules_uviewPlus_libs_function_index.addStyle,
+    init() {
+      setTimeout(() => {
+      }, 20);
+    },
+    // 监听webview的显示与隐藏
+    addEventListenerToWebview() {
+      const pages = getCurrentPages();
+      const page = pages[pages.length - 1];
+      const currentWebview = page.$getAppWebview();
+      currentWebview.addEventListener("hide", () => {
+        this.webviewHide = true;
+      });
+      currentWebview.addEventListener("show", () => {
+        this.webviewHide = false;
+      });
+    }
+  }
+};
+function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
+  return common_vendor.e({
+    a: _ctx.show
+  }, _ctx.show ? common_vendor.e({
+    b: !$data.webviewHide
+  }, !$data.webviewHide ? common_vendor.e({
+    c: _ctx.mode === "spinner"
+  }, _ctx.mode === "spinner" ? {
+    d: common_vendor.f($data.array12, (item, index, i0) => {
+      return {
+        a: index
+      };
+    })
+  } : {}, {
+    e: common_vendor.n(`u-loading-icon__spinner--${_ctx.mode}`),
+    f: _ctx.color,
+    g: $options.addUnit(_ctx.size),
+    h: $options.addUnit(_ctx.size),
+    i: _ctx.color,
+    j: $options.otherBorderColor,
+    k: $options.otherBorderColor,
+    l: $options.otherBorderColor,
+    m: `${_ctx.duration}ms`,
+    n: _ctx.mode === "semicircle" || _ctx.mode === "circle" ? _ctx.timingFunction : ""
+  }) : {}, {
+    o: _ctx.text
+  }, _ctx.text ? {
+    p: common_vendor.t(_ctx.text),
+    q: $options.addUnit(_ctx.textSize),
+    r: _ctx.textColor
+  } : {}, {
+    s: common_vendor.s($options.addStyle(_ctx.customStyle)),
+    t: common_vendor.n(_ctx.vertical && "u-loading-icon--vertical")
+  }) : {});
+}
+const Component = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-2af81691"], ["__file", "D:/里海数字乡村/purchase-let/uni_modules/uview-plus/components/u-loading-icon/u-loading-icon.vue"]]);
+wx.createComponent(Component);
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-loading-icon/u-loading-icon.json b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-loading-icon/u-loading-icon.json
new file mode 100644
index 0000000..e8cfaaf
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-loading-icon/u-loading-icon.json
@@ -0,0 +1,4 @@
+{
+  "component": true,
+  "usingComponents": {}
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-loading-icon/u-loading-icon.wxml b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-loading-icon/u-loading-icon.wxml
new file mode 100644
index 0000000..cd9ab4b
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-loading-icon/u-loading-icon.wxml
@@ -0,0 +1 @@
+<view wx:if="{{a}}" style="{{s}}" class="{{['u-loading-icon', 'data-v-2af81691', t]}}"><view wx:if="{{b}}" class="{{['u-loading-icon__spinner', 'data-v-2af81691', e]}}" ref="ani" style="{{'color:' + f + ';' + ('width:' + g) + ';' + ('height:' + h) + ';' + ('border-top-color:' + i) + ';' + ('border-bottom-color:' + j) + ';' + ('border-left-color:' + k) + ';' + ('border-right-color:' + l) + ';' + ('animation-duration:' + m) + ';' + ('animation-timing-function:' + n)}}"><block wx:if="{{c}}"><view wx:for="{{d}}" wx:for-item="item" wx:key="a" class="u-loading-icon__dot data-v-2af81691"></view></block></view><text wx:if="{{o}}" class="u-loading-icon__text data-v-2af81691" style="{{'font-size:' + q + ';' + ('color:' + r)}}">{{p}}</text></view>
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-loading-icon/u-loading-icon.wxss b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-loading-icon/u-loading-icon.wxss
new file mode 100644
index 0000000..7915e46
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-loading-icon/u-loading-icon.wxss
@@ -0,0 +1,172 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+/* 颜色变量 */
+/* 行为相关颜色 */
+/* 文字基本颜色 */
+/* 背景颜色 */
+/* 边框颜色 */
+/* 尺寸变量 */
+/* 文字尺寸 */
+/* 图片尺寸 */
+/* Border Radius */
+/* 水平间距 */
+/* 垂直间距 */
+/* 透明度 */
+/* 文章场景相关 */
+.u-empty.data-v-2af81691,
+.u-empty__wrap.data-v-2af81691,
+.u-tabs.data-v-2af81691,
+.u-tabs__wrapper.data-v-2af81691,
+.u-tabs__wrapper__scroll-view-wrapper.data-v-2af81691,
+.u-tabs__wrapper__scroll-view.data-v-2af81691,
+.u-tabs__wrapper__nav.data-v-2af81691,
+.u-tabs__wrapper__nav__line.data-v-2af81691 {
+  display: flex;
+  flex-direction: column;
+  flex-shrink: 0;
+  flex-grow: 0;
+  flex-basis: auto;
+  align-items: stretch;
+  align-content: flex-start;
+}
+.u-loading-icon.data-v-2af81691 {
+  flex-direction: row;
+  align-items: center;
+  justify-content: center;
+  color: #c8c9cc;
+}
+.u-loading-icon__text.data-v-2af81691 {
+  margin-left: 4px;
+  color: #606266;
+  font-size: 14px;
+  line-height: 20px;
+}
+.u-loading-icon__spinner.data-v-2af81691 {
+  width: 30px;
+  height: 30px;
+  position: relative;
+  box-sizing: border-box;
+  max-width: 100%;
+  max-height: 100%;
+  animation: u-rotate-2af81691 1s linear infinite;
+}
+.u-loading-icon__spinner--semicircle.data-v-2af81691 {
+  border-width: 2px;
+  border-color: transparent;
+  border-top-right-radius: 100px;
+  border-top-left-radius: 100px;
+  border-bottom-left-radius: 100px;
+  border-bottom-right-radius: 100px;
+  border-style: solid;
+}
+.u-loading-icon__spinner--circle.data-v-2af81691 {
+  border-top-right-radius: 100px;
+  border-top-left-radius: 100px;
+  border-bottom-left-radius: 100px;
+  border-bottom-right-radius: 100px;
+  border-width: 2px;
+  border-top-color: #e5e5e5;
+  border-right-color: #e5e5e5;
+  border-bottom-color: #e5e5e5;
+  border-left-color: #e5e5e5;
+  border-style: solid;
+}
+.u-loading-icon--vertical.data-v-2af81691 {
+  flex-direction: column;
+}
+.data-v-2af81691:host {
+  font-size: 0px;
+  line-height: 1;
+}
+.u-loading-icon__spinner--spinner.data-v-2af81691 {
+  animation-timing-function: steps(12);
+}
+.u-loading-icon__text.data-v-2af81691:empty {
+  display: none;
+}
+.u-loading-icon--vertical .u-loading-icon__text.data-v-2af81691 {
+  margin: 6px 0 0;
+  color: #606266;
+}
+.u-loading-icon__dot.data-v-2af81691 {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+}
+.u-loading-icon__dot.data-v-2af81691:before {
+  display: block;
+  width: 2px;
+  height: 25%;
+  margin: 0 auto;
+  background-color: currentColor;
+  border-radius: 40%;
+  content: " ";
+}
+.u-loading-icon__dot.data-v-2af81691:nth-of-type(1) {
+  transform: rotate(30deg);
+  opacity: 1;
+}
+.u-loading-icon__dot.data-v-2af81691:nth-of-type(2) {
+  transform: rotate(60deg);
+  opacity: 0.9375;
+}
+.u-loading-icon__dot.data-v-2af81691:nth-of-type(3) {
+  transform: rotate(90deg);
+  opacity: 0.875;
+}
+.u-loading-icon__dot.data-v-2af81691:nth-of-type(4) {
+  transform: rotate(120deg);
+  opacity: 0.8125;
+}
+.u-loading-icon__dot.data-v-2af81691:nth-of-type(5) {
+  transform: rotate(150deg);
+  opacity: 0.75;
+}
+.u-loading-icon__dot.data-v-2af81691:nth-of-type(6) {
+  transform: rotate(180deg);
+  opacity: 0.6875;
+}
+.u-loading-icon__dot.data-v-2af81691:nth-of-type(7) {
+  transform: rotate(210deg);
+  opacity: 0.625;
+}
+.u-loading-icon__dot.data-v-2af81691:nth-of-type(8) {
+  transform: rotate(240deg);
+  opacity: 0.5625;
+}
+.u-loading-icon__dot.data-v-2af81691:nth-of-type(9) {
+  transform: rotate(270deg);
+  opacity: 0.5;
+}
+.u-loading-icon__dot.data-v-2af81691:nth-of-type(10) {
+  transform: rotate(300deg);
+  opacity: 0.4375;
+}
+.u-loading-icon__dot.data-v-2af81691:nth-of-type(11) {
+  transform: rotate(330deg);
+  opacity: 0.375;
+}
+.u-loading-icon__dot.data-v-2af81691:nth-of-type(12) {
+  transform: rotate(360deg);
+  opacity: 0.3125;
+}
+@keyframes u-rotate-2af81691 {
+0% {
+    transform: rotate(0deg);
+}
+to {
+    transform: rotate(1turn);
+}
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-loadmore/props.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-loadmore/props.js
new file mode 100644
index 0000000..8afdab3
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-loadmore/props.js
@@ -0,0 +1,97 @@
+"use strict";
+const uni_modules_uviewPlus_libs_config_props = require("../../libs/config/props.js");
+const props = {
+  props: {
+    // 组件状态,loadmore-加载前的状态,loading-加载中的状态,nomore-没有更多的状态
+    status: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.loadmore.status
+    },
+    // 组件背景色
+    bgColor: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.loadmore.bgColor
+    },
+    // 是否显示加载中的图标
+    icon: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.loadmore.icon
+    },
+    // 字体大小
+    fontSize: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.loadmore.fontSize
+    },
+    // 图标大小
+    iconSize: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.loadmore.iconSize
+    },
+    // 字体颜色
+    color: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.loadmore.color
+    },
+    // 加载中状态的图标,spinner-花朵状图标,circle-圆圈状,semicircle-半圆
+    loadingIcon: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.loadmore.loadingIcon
+    },
+    // 加载前的提示语
+    loadmoreText: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.loadmore.loadmoreText
+    },
+    // 加载中提示语
+    loadingText: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.loadmore.loadingText
+    },
+    // 没有更多的提示语
+    nomoreText: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.loadmore.nomoreText
+    },
+    // 在“没有更多”状态下,是否显示粗点
+    isDot: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.loadmore.isDot
+    },
+    // 加载中图标的颜色
+    iconColor: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.loadmore.iconColor
+    },
+    // 上边距
+    marginTop: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.loadmore.marginTop
+    },
+    // 下边距
+    marginBottom: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.loadmore.marginBottom
+    },
+    // 高度,单位px
+    height: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.loadmore.height
+    },
+    // 是否显示左边分割线
+    line: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.loadmore.line
+    },
+    // 线条颜色
+    lineColor: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.loadmore.lineColor
+    },
+    // 是否虚线,true-虚线,false-实线
+    dashed: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.loadmore.dashed
+    }
+  }
+};
+exports.props = props;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-loadmore/u-loadmore.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-loadmore/u-loadmore.js
new file mode 100644
index 0000000..7877f9d
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-loadmore/u-loadmore.js
@@ -0,0 +1,197 @@
+"use strict";
+const uni_modules_uviewPlus_components_uLoadmore_props = require("./props.js");
+const uni_modules_uviewPlus_libs_mixin_mpMixin = require("../../libs/mixin/mpMixin.js");
+const uni_modules_uviewPlus_libs_mixin_mixin = require("../../libs/mixin/mixin.js");
+const uni_modules_uviewPlus_libs_function_index = require("../../libs/function/index.js");
+const common_vendor = require("../../../../common/vendor.js");
+require("../../libs/config/props.js");
+require("../../libs/config/config.js");
+require("../../libs/config/props/actionSheet.js");
+require("../../libs/config/props/album.js");
+require("../../libs/config/props/alert.js");
+require("../../libs/config/props/avatar.js");
+require("../../libs/config/props/avatarGroup.js");
+require("../../libs/config/props/backtop.js");
+require("../../libs/config/props/badge.js");
+require("../../libs/config/props/button.js");
+require("../../libs/config/props/calendar.js");
+require("../../libs/config/props/carKeyboard.js");
+require("../../libs/config/props/cell.js");
+require("../../libs/config/props/cellGroup.js");
+require("../../libs/config/props/checkbox.js");
+require("../../libs/config/props/checkboxGroup.js");
+require("../../libs/config/props/circleProgress.js");
+require("../../libs/config/props/code.js");
+require("../../libs/config/props/codeInput.js");
+require("../../libs/config/props/col.js");
+require("../../libs/config/props/collapse.js");
+require("../../libs/config/props/collapseItem.js");
+require("../../libs/config/props/columnNotice.js");
+require("../../libs/config/props/countDown.js");
+require("../../libs/config/props/countTo.js");
+require("../../libs/config/props/datetimePicker.js");
+require("../../libs/config/props/divider.js");
+require("../../libs/config/props/empty.js");
+require("../../libs/config/props/form.js");
+require("../../libs/config/props/formItem.js");
+require("../../libs/config/props/gap.js");
+require("../../libs/config/props/grid.js");
+require("../../libs/config/props/gridItem.js");
+require("../../libs/config/props/icon.js");
+require("../../libs/config/props/image.js");
+require("../../libs/config/props/indexAnchor.js");
+require("../../libs/config/props/indexList.js");
+require("../../libs/config/props/input.js");
+require("../../libs/config/props/keyboard.js");
+require("../../libs/config/props/line.js");
+require("../../libs/config/props/lineProgress.js");
+require("../../libs/config/props/link.js");
+require("../../libs/config/props/list.js");
+require("../../libs/config/props/listItem.js");
+require("../../libs/config/props/loadingIcon.js");
+require("../../libs/config/props/loadingPage.js");
+require("../../libs/config/props/loadmore.js");
+require("../../libs/config/props/modal.js");
+require("../../libs/config/props/navbar.js");
+require("../../libs/config/color.js");
+require("../../libs/config/props/noNetwork.js");
+require("../../libs/config/props/noticeBar.js");
+require("../../libs/config/props/notify.js");
+require("../../libs/config/props/numberBox.js");
+require("../../libs/config/props/numberKeyboard.js");
+require("../../libs/config/props/overlay.js");
+require("../../libs/config/props/parse.js");
+require("../../libs/config/props/picker.js");
+require("../../libs/config/props/popup.js");
+require("../../libs/config/props/radio.js");
+require("../../libs/config/props/radioGroup.js");
+require("../../libs/config/props/rate.js");
+require("../../libs/config/props/readMore.js");
+require("../../libs/config/props/row.js");
+require("../../libs/config/props/rowNotice.js");
+require("../../libs/config/props/scrollList.js");
+require("../../libs/config/props/search.js");
+require("../../libs/config/props/section.js");
+require("../../libs/config/props/skeleton.js");
+require("../../libs/config/props/slider.js");
+require("../../libs/config/props/statusBar.js");
+require("../../libs/config/props/steps.js");
+require("../../libs/config/props/stepsItem.js");
+require("../../libs/config/props/sticky.js");
+require("../../libs/config/props/subsection.js");
+require("../../libs/config/props/swipeAction.js");
+require("../../libs/config/props/swipeActionItem.js");
+require("../../libs/config/props/swiper.js");
+require("../../libs/config/props/swipterIndicator.js");
+require("../../libs/config/props/switch.js");
+require("../../libs/config/props/tabbar.js");
+require("../../libs/config/props/tabbarItem.js");
+require("../../libs/config/props/tabs.js");
+require("../../libs/config/props/tag.js");
+require("../../libs/config/props/text.js");
+require("../../libs/config/props/textarea.js");
+require("../../libs/config/props/toast.js");
+require("../../libs/config/props/toolbar.js");
+require("../../libs/config/props/tooltip.js");
+require("../../libs/config/props/transition.js");
+require("../../libs/config/props/upload.js");
+require("../../libs/function/test.js");
+require("../../libs/util/route.js");
+require("../../libs/function/digit.js");
+const _sfc_main = {
+  name: "u-loadmore",
+  mixins: [uni_modules_uviewPlus_libs_mixin_mpMixin.mpMixin, uni_modules_uviewPlus_libs_mixin_mixin.mixin, uni_modules_uviewPlus_components_uLoadmore_props.props],
+  data() {
+    return {
+      // 粗点
+      dotText: "●"
+    };
+  },
+  computed: {
+    // 加载的文字显示的样式
+    loadTextStyle() {
+      return {
+        color: this.color,
+        fontSize: uni_modules_uviewPlus_libs_function_index.addUnit(this.fontSize),
+        lineHeight: uni_modules_uviewPlus_libs_function_index.addUnit(this.fontSize),
+        backgroundColor: this.bgColor
+      };
+    },
+    // 显示的提示文字
+    showText() {
+      let text = "";
+      if (this.status == "loadmore")
+        text = this.loadmoreText;
+      else if (this.status == "loading")
+        text = this.loadingText;
+      else if (this.status == "nomore" && this.isDot)
+        text = this.dotText;
+      else
+        text = this.nomoreText;
+      return text;
+    }
+  },
+  emits: ["loadmore"],
+  methods: {
+    addStyle: uni_modules_uviewPlus_libs_function_index.addStyle,
+    addUnit: uni_modules_uviewPlus_libs_function_index.addUnit,
+    loadMore() {
+      if (this.status == "loadmore")
+        this.$emit("loadmore");
+    }
+  }
+};
+if (!Array) {
+  const _easycom_u_line2 = common_vendor.resolveComponent("u-line");
+  const _easycom_u_loading_icon2 = common_vendor.resolveComponent("u-loading-icon");
+  (_easycom_u_line2 + _easycom_u_loading_icon2)();
+}
+const _easycom_u_line = () => "../u-line/u-line.js";
+const _easycom_u_loading_icon = () => "../u-loading-icon/u-loading-icon.js";
+if (!Math) {
+  (_easycom_u_line + _easycom_u_loading_icon)();
+}
+function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
+  return common_vendor.e({
+    a: _ctx.line
+  }, _ctx.line ? {
+    b: common_vendor.p({
+      length: "140rpx",
+      color: _ctx.lineColor,
+      hairline: false,
+      dashed: _ctx.dashed
+    })
+  } : {}, {
+    c: _ctx.status === "loading" && _ctx.icon
+  }, _ctx.status === "loading" && _ctx.icon ? {
+    d: common_vendor.p({
+      color: _ctx.iconColor,
+      size: _ctx.iconSize,
+      mode: _ctx.loadingIcon
+    })
+  } : {}, {
+    e: common_vendor.t($options.showText),
+    f: common_vendor.s($options.loadTextStyle),
+    g: common_vendor.n(_ctx.status == "nomore" && _ctx.isDot == true ? "u-loadmore__content__dot-text" : "u-loadmore__content__text"),
+    h: common_vendor.o((...args) => $options.loadMore && $options.loadMore(...args)),
+    i: common_vendor.n(_ctx.status == "loadmore" || _ctx.status == "nomore" ? "u-more" : ""),
+    j: _ctx.line
+  }, _ctx.line ? {
+    k: common_vendor.p({
+      length: "140rpx",
+      color: _ctx.lineColor,
+      hairline: false,
+      dashed: _ctx.dashed
+    })
+  } : {}, {
+    l: common_vendor.s($options.addStyle(_ctx.customStyle)),
+    m: common_vendor.s({
+      backgroundColor: _ctx.bgColor,
+      marginBottom: $options.addUnit(_ctx.marginBottom),
+      marginTop: $options.addUnit(_ctx.marginTop),
+      height: $options.addUnit(_ctx.height)
+    })
+  });
+}
+const Component = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-4ccc1478"], ["__file", "D:/里海数字乡村/purchase-let/uni_modules/uview-plus/components/u-loadmore/u-loadmore.vue"]]);
+wx.createComponent(Component);
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-loadmore/u-loadmore.json b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-loadmore/u-loadmore.json
new file mode 100644
index 0000000..8a324fe
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-loadmore/u-loadmore.json
@@ -0,0 +1,7 @@
+{
+  "component": true,
+  "usingComponents": {
+    "u-line": "../u-line/u-line",
+    "u-loading-icon": "../u-loading-icon/u-loading-icon"
+  }
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-loadmore/u-loadmore.wxml b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-loadmore/u-loadmore.wxml
new file mode 100644
index 0000000..5d04b35
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-loadmore/u-loadmore.wxml
@@ -0,0 +1 @@
+<view class="u-loadmore data-v-4ccc1478" style="{{l + ';' + m}}"><u-line wx:if="{{a}}" class="data-v-4ccc1478" u-i="4ccc1478-0" bind:__l="__l" u-p="{{b}}"></u-line><view class="{{[i, 'u-loadmore__content', 'data-v-4ccc1478']}}"><view wx:if="{{c}}" class="u-loadmore__content__icon-wrap data-v-4ccc1478"><u-loading-icon wx:if="{{d}}" class="data-v-4ccc1478" u-i="4ccc1478-1" bind:__l="__l" u-p="{{d}}"></u-loading-icon></view><text style="{{f}}" class="{{['u-line-1', 'data-v-4ccc1478', g]}}" bindtap="{{h}}">{{e}}</text></view><u-line wx:if="{{j}}" class="data-v-4ccc1478" u-i="4ccc1478-2" bind:__l="__l" u-p="{{k}}"></u-line></view>
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-loadmore/u-loadmore.wxss b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-loadmore/u-loadmore.wxss
new file mode 100644
index 0000000..f9c88e4
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-loadmore/u-loadmore.wxss
@@ -0,0 +1,66 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+/* 颜色变量 */
+/* 行为相关颜色 */
+/* 文字基本颜色 */
+/* 背景颜色 */
+/* 边框颜色 */
+/* 尺寸变量 */
+/* 文字尺寸 */
+/* 图片尺寸 */
+/* Border Radius */
+/* 水平间距 */
+/* 垂直间距 */
+/* 透明度 */
+/* 文章场景相关 */
+.u-empty.data-v-4ccc1478,
+.u-empty__wrap.data-v-4ccc1478,
+.u-tabs.data-v-4ccc1478,
+.u-tabs__wrapper.data-v-4ccc1478,
+.u-tabs__wrapper__scroll-view-wrapper.data-v-4ccc1478,
+.u-tabs__wrapper__scroll-view.data-v-4ccc1478,
+.u-tabs__wrapper__nav.data-v-4ccc1478,
+.u-tabs__wrapper__nav__line.data-v-4ccc1478 {
+  display: flex;
+  flex-direction: column;
+  flex-shrink: 0;
+  flex-grow: 0;
+  flex-basis: auto;
+  align-items: stretch;
+  align-content: flex-start;
+}
+.u-loadmore.data-v-4ccc1478 {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: center;
+  flex: 1;
+}
+.u-loadmore__content.data-v-4ccc1478 {
+  margin: 0 15px;
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: center;
+}
+.u-loadmore__content__icon-wrap.data-v-4ccc1478 {
+  margin-right: 8px;
+}
+.u-loadmore__content__text.data-v-4ccc1478 {
+  font-size: 14px;
+  color: #606266;
+}
+.u-loadmore__content__dot-text.data-v-4ccc1478 {
+  font-size: 15px;
+  color: #909193;
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-navbar/props.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-navbar/props.js
new file mode 100644
index 0000000..4356a13
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-navbar/props.js
@@ -0,0 +1,87 @@
+"use strict";
+const uni_modules_uviewPlus_libs_config_props = require("../../libs/config/props.js");
+const props = {
+  props: {
+    // 是否开启顶部安全区适配
+    safeAreaInsetTop: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.navbar.safeAreaInsetTop
+    },
+    // 固定在顶部时,是否生成一个等高元素,以防止塌陷
+    placeholder: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.navbar.placeholder
+    },
+    // 是否固定在顶部
+    fixed: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.navbar.fixed
+    },
+    // 是否显示下边框
+    border: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.navbar.border
+    },
+    // 左边的图标
+    leftIcon: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.navbar.leftIcon
+    },
+    // 左边的提示文字
+    leftText: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.navbar.leftText
+    },
+    // 左右的提示文字
+    rightText: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.navbar.rightText
+    },
+    // 右边的图标
+    rightIcon: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.navbar.rightIcon
+    },
+    // 标题
+    title: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.navbar.title
+    },
+    // 背景颜色
+    bgColor: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.navbar.bgColor
+    },
+    // 标题的宽度
+    titleWidth: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.navbar.titleWidth
+    },
+    // 导航栏高度
+    height: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.navbar.height
+    },
+    // 左侧返回图标的大小
+    leftIconSize: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.navbar.leftIconSize
+    },
+    // 左侧返回图标的颜色
+    leftIconColor: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.navbar.leftIconColor
+    },
+    // 点击左侧区域(返回图标),是否自动返回上一页
+    autoBack: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.navbar.autoBack
+    },
+    // 标题的样式,对象或字符串
+    titleStyle: {
+      type: [String, Object],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.navbar.titleStyle
+    }
+  }
+};
+exports.props = props;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-navbar/u-navbar.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-navbar/u-navbar.js
new file mode 100644
index 0000000..c5c9354
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-navbar/u-navbar.js
@@ -0,0 +1,189 @@
+"use strict";
+const common_vendor = require("../../../../common/vendor.js");
+const uni_modules_uviewPlus_components_uNavbar_props = require("./props.js");
+const uni_modules_uviewPlus_libs_mixin_mpMixin = require("../../libs/mixin/mpMixin.js");
+const uni_modules_uviewPlus_libs_mixin_mixin = require("../../libs/mixin/mixin.js");
+const uni_modules_uviewPlus_libs_function_index = require("../../libs/function/index.js");
+require("../../libs/config/props.js");
+require("../../libs/config/config.js");
+require("../../libs/config/props/actionSheet.js");
+require("../../libs/config/props/album.js");
+require("../../libs/config/props/alert.js");
+require("../../libs/config/props/avatar.js");
+require("../../libs/config/props/avatarGroup.js");
+require("../../libs/config/props/backtop.js");
+require("../../libs/config/props/badge.js");
+require("../../libs/config/props/button.js");
+require("../../libs/config/props/calendar.js");
+require("../../libs/config/props/carKeyboard.js");
+require("../../libs/config/props/cell.js");
+require("../../libs/config/props/cellGroup.js");
+require("../../libs/config/props/checkbox.js");
+require("../../libs/config/props/checkboxGroup.js");
+require("../../libs/config/props/circleProgress.js");
+require("../../libs/config/props/code.js");
+require("../../libs/config/props/codeInput.js");
+require("../../libs/config/props/col.js");
+require("../../libs/config/props/collapse.js");
+require("../../libs/config/props/collapseItem.js");
+require("../../libs/config/props/columnNotice.js");
+require("../../libs/config/props/countDown.js");
+require("../../libs/config/props/countTo.js");
+require("../../libs/config/props/datetimePicker.js");
+require("../../libs/config/props/divider.js");
+require("../../libs/config/props/empty.js");
+require("../../libs/config/props/form.js");
+require("../../libs/config/props/formItem.js");
+require("../../libs/config/props/gap.js");
+require("../../libs/config/props/grid.js");
+require("../../libs/config/props/gridItem.js");
+require("../../libs/config/props/icon.js");
+require("../../libs/config/props/image.js");
+require("../../libs/config/props/indexAnchor.js");
+require("../../libs/config/props/indexList.js");
+require("../../libs/config/props/input.js");
+require("../../libs/config/props/keyboard.js");
+require("../../libs/config/props/line.js");
+require("../../libs/config/props/lineProgress.js");
+require("../../libs/config/props/link.js");
+require("../../libs/config/props/list.js");
+require("../../libs/config/props/listItem.js");
+require("../../libs/config/props/loadingIcon.js");
+require("../../libs/config/props/loadingPage.js");
+require("../../libs/config/props/loadmore.js");
+require("../../libs/config/props/modal.js");
+require("../../libs/config/props/navbar.js");
+require("../../libs/config/color.js");
+require("../../libs/config/props/noNetwork.js");
+require("../../libs/config/props/noticeBar.js");
+require("../../libs/config/props/notify.js");
+require("../../libs/config/props/numberBox.js");
+require("../../libs/config/props/numberKeyboard.js");
+require("../../libs/config/props/overlay.js");
+require("../../libs/config/props/parse.js");
+require("../../libs/config/props/picker.js");
+require("../../libs/config/props/popup.js");
+require("../../libs/config/props/radio.js");
+require("../../libs/config/props/radioGroup.js");
+require("../../libs/config/props/rate.js");
+require("../../libs/config/props/readMore.js");
+require("../../libs/config/props/row.js");
+require("../../libs/config/props/rowNotice.js");
+require("../../libs/config/props/scrollList.js");
+require("../../libs/config/props/search.js");
+require("../../libs/config/props/section.js");
+require("../../libs/config/props/skeleton.js");
+require("../../libs/config/props/slider.js");
+require("../../libs/config/props/statusBar.js");
+require("../../libs/config/props/steps.js");
+require("../../libs/config/props/stepsItem.js");
+require("../../libs/config/props/sticky.js");
+require("../../libs/config/props/subsection.js");
+require("../../libs/config/props/swipeAction.js");
+require("../../libs/config/props/swipeActionItem.js");
+require("../../libs/config/props/swiper.js");
+require("../../libs/config/props/swipterIndicator.js");
+require("../../libs/config/props/switch.js");
+require("../../libs/config/props/tabbar.js");
+require("../../libs/config/props/tabbarItem.js");
+require("../../libs/config/props/tabs.js");
+require("../../libs/config/props/tag.js");
+require("../../libs/config/props/text.js");
+require("../../libs/config/props/textarea.js");
+require("../../libs/config/props/toast.js");
+require("../../libs/config/props/toolbar.js");
+require("../../libs/config/props/tooltip.js");
+require("../../libs/config/props/transition.js");
+require("../../libs/config/props/upload.js");
+require("../../libs/function/test.js");
+require("../../libs/util/route.js");
+require("../../libs/function/digit.js");
+const _sfc_main = {
+  name: "u-navbar",
+  mixins: [uni_modules_uviewPlus_libs_mixin_mpMixin.mpMixin, uni_modules_uviewPlus_libs_mixin_mixin.mixin, uni_modules_uviewPlus_components_uNavbar_props.props],
+  data() {
+    return {};
+  },
+  emits: ["leftClick", "rightClick"],
+  methods: {
+    addStyle: uni_modules_uviewPlus_libs_function_index.addStyle,
+    addUnit: uni_modules_uviewPlus_libs_function_index.addUnit,
+    sys: uni_modules_uviewPlus_libs_function_index.sys,
+    getPx: uni_modules_uviewPlus_libs_function_index.getPx,
+    // 点击左侧区域
+    leftClick() {
+      this.$emit("leftClick");
+      if (this.autoBack) {
+        common_vendor.index.navigateBack();
+      }
+    },
+    // 点击右侧区域
+    rightClick() {
+      this.$emit("rightClick");
+    }
+  }
+};
+if (!Array) {
+  const _easycom_u_status_bar2 = common_vendor.resolveComponent("u-status-bar");
+  const _easycom_u_icon2 = common_vendor.resolveComponent("u-icon");
+  (_easycom_u_status_bar2 + _easycom_u_icon2)();
+}
+const _easycom_u_status_bar = () => "../u-status-bar/u-status-bar.js";
+const _easycom_u_icon = () => "../u-icon/u-icon.js";
+if (!Math) {
+  (_easycom_u_status_bar + _easycom_u_icon)();
+}
+function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
+  return common_vendor.e({
+    a: _ctx.fixed && _ctx.placeholder
+  }, _ctx.fixed && _ctx.placeholder ? {
+    b: $options.addUnit($options.getPx(_ctx.height) + $options.sys().statusBarHeight, "px")
+  } : {}, {
+    c: _ctx.safeAreaInsetTop
+  }, _ctx.safeAreaInsetTop ? {
+    d: common_vendor.p({
+      bgColor: _ctx.bgColor
+    })
+  } : {}, {
+    e: _ctx.leftIcon
+  }, _ctx.leftIcon ? {
+    f: common_vendor.p({
+      name: _ctx.leftIcon,
+      size: _ctx.leftIconSize,
+      color: _ctx.leftIconColor
+    })
+  } : {}, {
+    g: _ctx.leftText
+  }, _ctx.leftText ? {
+    h: common_vendor.t(_ctx.leftText),
+    i: _ctx.leftIconColor
+  } : {}, {
+    j: common_vendor.o((...args) => $options.leftClick && $options.leftClick(...args)),
+    k: common_vendor.t(_ctx.title),
+    l: common_vendor.s({
+      width: $options.addUnit(_ctx.titleWidth)
+    }),
+    m: common_vendor.s($options.addStyle(_ctx.titleStyle)),
+    n: _ctx.$slots.right || _ctx.rightIcon || _ctx.rightText
+  }, _ctx.$slots.right || _ctx.rightIcon || _ctx.rightText ? common_vendor.e({
+    o: _ctx.rightIcon
+  }, _ctx.rightIcon ? {
+    p: common_vendor.p({
+      name: _ctx.rightIcon,
+      size: "20"
+    })
+  } : {}, {
+    q: _ctx.rightText
+  }, _ctx.rightText ? {
+    r: common_vendor.t(_ctx.rightText)
+  } : {}, {
+    s: common_vendor.o((...args) => $options.rightClick && $options.rightClick(...args))
+  }) : {}, {
+    t: common_vendor.n(_ctx.border && "u-border-bottom"),
+    v: $options.addUnit(_ctx.height),
+    w: _ctx.bgColor,
+    x: common_vendor.n(_ctx.fixed && "u-navbar--fixed")
+  });
+}
+const Component = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-f631659b"], ["__file", "D:/里海数字乡村/purchase-let/uni_modules/uview-plus/components/u-navbar/u-navbar.vue"]]);
+wx.createComponent(Component);
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-navbar/u-navbar.json b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-navbar/u-navbar.json
new file mode 100644
index 0000000..a66abe3
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-navbar/u-navbar.json
@@ -0,0 +1,7 @@
+{
+  "component": true,
+  "usingComponents": {
+    "u-status-bar": "../u-status-bar/u-status-bar",
+    "u-icon": "../u-icon/u-icon"
+  }
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-navbar/u-navbar.wxml b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-navbar/u-navbar.wxml
new file mode 100644
index 0000000..fdd76f5
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-navbar/u-navbar.wxml
@@ -0,0 +1 @@
+<view class="u-navbar data-v-f631659b"><view wx:if="{{a}}" class="u-navbar__placeholder data-v-f631659b" style="{{'height:' + b}}"></view><view class="{{['data-v-f631659b', x]}}"><u-status-bar wx:if="{{c}}" class="data-v-f631659b" u-i="f631659b-0" bind:__l="__l" u-p="{{d}}"></u-status-bar><view class="{{['u-navbar__content', 'data-v-f631659b', t]}}" style="{{'height:' + v + ';' + ('background-color:' + w)}}"><view class="u-navbar__content__left data-v-f631659b" hover-class="u-navbar__content__left--hover" hover-start-time="150" bindtap="{{j}}"><block wx:if="{{$slots.left}}"><slot name="left"></slot></block><block wx:else><u-icon wx:if="{{e}}" class="data-v-f631659b" u-i="f631659b-1" bind:__l="__l" u-p="{{f}}"></u-icon><text wx:if="{{g}}" style="{{'color:' + i}}" class="u-navbar__content__left__text data-v-f631659b">{{h}}</text></block></view><block wx:if="{{$slots.center}}"><slot name="center"></slot></block><block wx:else><text class="u-line-1 u-navbar__content__title data-v-f631659b" style="{{l + ';' + m}}">{{k}}</text></block><view wx:if="{{n}}" class="u-navbar__content__right data-v-f631659b" bindtap="{{s}}"><block wx:if="{{$slots.right}}"><slot name="right"></slot></block><block wx:else><u-icon wx:if="{{o}}" class="data-v-f631659b" u-i="f631659b-2" bind:__l="__l" u-p="{{p}}"></u-icon><text wx:if="{{q}}" class="u-navbar__content__right__text data-v-f631659b">{{r}}</text></block></view></view></view></view>
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-navbar/u-navbar.wxss b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-navbar/u-navbar.wxss
new file mode 100644
index 0000000..7e72cfb
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-navbar/u-navbar.wxss
@@ -0,0 +1,88 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+/* 颜色变量 */
+/* 行为相关颜色 */
+/* 文字基本颜色 */
+/* 背景颜色 */
+/* 边框颜色 */
+/* 尺寸变量 */
+/* 文字尺寸 */
+/* 图片尺寸 */
+/* Border Radius */
+/* 水平间距 */
+/* 垂直间距 */
+/* 透明度 */
+/* 文章场景相关 */
+.u-empty.data-v-f631659b,
+.u-empty__wrap.data-v-f631659b,
+.u-tabs.data-v-f631659b,
+.u-tabs__wrapper.data-v-f631659b,
+.u-tabs__wrapper__scroll-view-wrapper.data-v-f631659b,
+.u-tabs__wrapper__scroll-view.data-v-f631659b,
+.u-tabs__wrapper__nav.data-v-f631659b,
+.u-tabs__wrapper__nav__line.data-v-f631659b {
+  display: flex;
+  flex-direction: column;
+  flex-shrink: 0;
+  flex-grow: 0;
+  flex-basis: auto;
+  align-items: stretch;
+  align-content: flex-start;
+}
+.u-navbar--fixed.data-v-f631659b {
+  position: fixed;
+  left: 0;
+  right: 0;
+  top: 0;
+  z-index: 11;
+}
+.u-navbar__content.data-v-f631659b {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  height: 44px;
+  background-color: #9acafc;
+  position: relative;
+  justify-content: center;
+}
+.u-navbar__content__left.data-v-f631659b, .u-navbar__content__right.data-v-f631659b {
+  padding: 0 13px;
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+}
+.u-navbar__content__left.data-v-f631659b {
+  left: 0;
+}
+.u-navbar__content__left--hover.data-v-f631659b {
+  opacity: 0.7;
+}
+.u-navbar__content__left__text.data-v-f631659b {
+  font-size: 15px;
+  margin-left: 3px;
+}
+.u-navbar__content__title.data-v-f631659b {
+  text-align: center;
+  font-size: 16px;
+  color: #303133;
+}
+.u-navbar__content__right.data-v-f631659b {
+  right: 0;
+}
+.u-navbar__content__right__text.data-v-f631659b {
+  font-size: 15px;
+  margin-left: 3px;
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-search/props.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-search/props.js
new file mode 100644
index 0000000..d2e7648
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-search/props.js
@@ -0,0 +1,125 @@
+"use strict";
+const uni_modules_uviewPlus_libs_config_props = require("../../libs/config/props.js");
+const props = {
+  props: {
+    // 搜索框形状,round-圆形,square-方形
+    shape: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.search.shape
+    },
+    // 搜索框背景色,默认值#f2f2f2
+    bgColor: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.search.bgColor
+    },
+    // 占位提示文字
+    placeholder: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.search.placeholder
+    },
+    // 是否启用清除控件
+    clearabled: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.search.clearabled
+    },
+    // 是否自动聚焦
+    focus: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.search.focus
+    },
+    // 是否在搜索框右侧显示取消按钮
+    showAction: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.search.showAction
+    },
+    // 右边控件的样式
+    actionStyle: {
+      type: Object,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.search.actionStyle
+    },
+    // 取消按钮文字
+    actionText: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.search.actionText
+    },
+    // 输入框内容对齐方式,可选值为 left|center|right
+    inputAlign: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.search.inputAlign
+    },
+    // input输入框的样式,可以定义文字颜色,大小等,对象形式
+    inputStyle: {
+      type: Object,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.search.inputStyle
+    },
+    // 是否启用输入框
+    disabled: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.search.disabled
+    },
+    // 边框颜色
+    borderColor: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.search.borderColor
+    },
+    // 搜索图标的颜色,默认同输入框字体颜色
+    searchIconColor: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.search.searchIconColor
+    },
+    // 输入框字体颜色
+    color: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.search.color
+    },
+    // placeholder的颜色
+    placeholderColor: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.search.placeholderColor
+    },
+    // 左边输入框的图标,可以为uView图标名称或图片路径
+    searchIcon: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.search.searchIcon
+    },
+    searchIconSize: {
+      type: [Number, String],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.search.searchIconSize
+    },
+    // 组件与其他上下左右元素之间的距离,带单位的字符串形式,如"30px"、"30px 20px"等写法
+    margin: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.search.margin
+    },
+    // 开启showAction时,是否在input获取焦点时才显示
+    animation: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.search.animation
+    },
+    // 输入框的初始化内容
+    modelValue: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.search.value
+    },
+    value: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.search.value
+    },
+    // 输入框最大能输入的长度,-1为不限制长度(来自uniapp文档)
+    maxlength: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.search.maxlength
+    },
+    // 搜索框高度,单位px
+    height: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.search.height
+    },
+    // 搜索框左侧文本
+    label: {
+      type: [String, Number, null],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.search.label
+    }
+  }
+};
+exports.props = props;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-search/u-search.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-search/u-search.js
new file mode 100644
index 0000000..60bc9ce
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-search/u-search.js
@@ -0,0 +1,257 @@
+"use strict";
+const common_vendor = require("../../../../common/vendor.js");
+const uni_modules_uviewPlus_components_uSearch_props = require("./props.js");
+const uni_modules_uviewPlus_libs_mixin_mpMixin = require("../../libs/mixin/mpMixin.js");
+const uni_modules_uviewPlus_libs_mixin_mixin = require("../../libs/mixin/mixin.js");
+const uni_modules_uviewPlus_libs_function_index = require("../../libs/function/index.js");
+require("../../libs/config/props.js");
+require("../../libs/config/config.js");
+require("../../libs/config/props/actionSheet.js");
+require("../../libs/config/props/album.js");
+require("../../libs/config/props/alert.js");
+require("../../libs/config/props/avatar.js");
+require("../../libs/config/props/avatarGroup.js");
+require("../../libs/config/props/backtop.js");
+require("../../libs/config/props/badge.js");
+require("../../libs/config/props/button.js");
+require("../../libs/config/props/calendar.js");
+require("../../libs/config/props/carKeyboard.js");
+require("../../libs/config/props/cell.js");
+require("../../libs/config/props/cellGroup.js");
+require("../../libs/config/props/checkbox.js");
+require("../../libs/config/props/checkboxGroup.js");
+require("../../libs/config/props/circleProgress.js");
+require("../../libs/config/props/code.js");
+require("../../libs/config/props/codeInput.js");
+require("../../libs/config/props/col.js");
+require("../../libs/config/props/collapse.js");
+require("../../libs/config/props/collapseItem.js");
+require("../../libs/config/props/columnNotice.js");
+require("../../libs/config/props/countDown.js");
+require("../../libs/config/props/countTo.js");
+require("../../libs/config/props/datetimePicker.js");
+require("../../libs/config/props/divider.js");
+require("../../libs/config/props/empty.js");
+require("../../libs/config/props/form.js");
+require("../../libs/config/props/formItem.js");
+require("../../libs/config/props/gap.js");
+require("../../libs/config/props/grid.js");
+require("../../libs/config/props/gridItem.js");
+require("../../libs/config/props/icon.js");
+require("../../libs/config/props/image.js");
+require("../../libs/config/props/indexAnchor.js");
+require("../../libs/config/props/indexList.js");
+require("../../libs/config/props/input.js");
+require("../../libs/config/props/keyboard.js");
+require("../../libs/config/props/line.js");
+require("../../libs/config/props/lineProgress.js");
+require("../../libs/config/props/link.js");
+require("../../libs/config/props/list.js");
+require("../../libs/config/props/listItem.js");
+require("../../libs/config/props/loadingIcon.js");
+require("../../libs/config/props/loadingPage.js");
+require("../../libs/config/props/loadmore.js");
+require("../../libs/config/props/modal.js");
+require("../../libs/config/props/navbar.js");
+require("../../libs/config/color.js");
+require("../../libs/config/props/noNetwork.js");
+require("../../libs/config/props/noticeBar.js");
+require("../../libs/config/props/notify.js");
+require("../../libs/config/props/numberBox.js");
+require("../../libs/config/props/numberKeyboard.js");
+require("../../libs/config/props/overlay.js");
+require("../../libs/config/props/parse.js");
+require("../../libs/config/props/picker.js");
+require("../../libs/config/props/popup.js");
+require("../../libs/config/props/radio.js");
+require("../../libs/config/props/radioGroup.js");
+require("../../libs/config/props/rate.js");
+require("../../libs/config/props/readMore.js");
+require("../../libs/config/props/row.js");
+require("../../libs/config/props/rowNotice.js");
+require("../../libs/config/props/scrollList.js");
+require("../../libs/config/props/search.js");
+require("../../libs/config/props/section.js");
+require("../../libs/config/props/skeleton.js");
+require("../../libs/config/props/slider.js");
+require("../../libs/config/props/statusBar.js");
+require("../../libs/config/props/steps.js");
+require("../../libs/config/props/stepsItem.js");
+require("../../libs/config/props/sticky.js");
+require("../../libs/config/props/subsection.js");
+require("../../libs/config/props/swipeAction.js");
+require("../../libs/config/props/swipeActionItem.js");
+require("../../libs/config/props/swiper.js");
+require("../../libs/config/props/swipterIndicator.js");
+require("../../libs/config/props/switch.js");
+require("../../libs/config/props/tabbar.js");
+require("../../libs/config/props/tabbarItem.js");
+require("../../libs/config/props/tabs.js");
+require("../../libs/config/props/tag.js");
+require("../../libs/config/props/text.js");
+require("../../libs/config/props/textarea.js");
+require("../../libs/config/props/toast.js");
+require("../../libs/config/props/toolbar.js");
+require("../../libs/config/props/tooltip.js");
+require("../../libs/config/props/transition.js");
+require("../../libs/config/props/upload.js");
+require("../../libs/function/test.js");
+require("../../libs/util/route.js");
+require("../../libs/function/digit.js");
+const _sfc_main = {
+  name: "u-search",
+  mixins: [uni_modules_uviewPlus_libs_mixin_mpMixin.mpMixin, uni_modules_uviewPlus_libs_mixin_mixin.mixin, uni_modules_uviewPlus_components_uSearch_props.props],
+  data() {
+    return {
+      keyword: "",
+      showClear: false,
+      // 是否显示右边的清除图标
+      show: false,
+      // 标记input当前状态是否处于聚焦中,如果是,才会显示右侧的清除控件
+      focused: this.focus
+      // 绑定输入框的值
+      // inputValue: this.value
+    };
+  },
+  watch: {
+    keyword(nVal) {
+      this.$emit("update:modelValue", nVal);
+      this.$emit("change", nVal);
+    },
+    modelValue: {
+      immediate: true,
+      handler(nVal) {
+        this.keyword = nVal;
+      }
+    }
+  },
+  computed: {
+    showActionBtn() {
+      return !this.animation && this.showAction;
+    }
+  },
+  emits: ["clear", "search", "custom", "focus", "blur", "click", "clickIcon", "update:modelValue", "change"],
+  methods: {
+    addStyle: uni_modules_uviewPlus_libs_function_index.addStyle,
+    addUnit: uni_modules_uviewPlus_libs_function_index.addUnit,
+    // 目前HX2.6.9 v-model双向绑定无效,故监听input事件获取输入框内容的变化
+    inputChange(e) {
+      this.keyword = e.detail.value;
+    },
+    // 清空输入
+    // 也可以作为用户通过this.$refs形式调用清空输入框内容
+    clear() {
+      this.keyword = "";
+      this.$nextTick(() => {
+        this.$emit("clear");
+      });
+    },
+    // 确定搜索
+    search(e) {
+      this.$emit("search", e.detail.value);
+      try {
+        common_vendor.index.hideKeyboard();
+      } catch (e2) {
+      }
+    },
+    // 点击右边自定义按钮的事件
+    custom() {
+      this.$emit("custom", this.keyword);
+      try {
+        common_vendor.index.hideKeyboard();
+      } catch (e) {
+      }
+    },
+    // 获取焦点
+    getFocus() {
+      this.focused = true;
+      if (this.animation && this.showAction)
+        this.show = true;
+      this.$emit("focus", this.keyword);
+    },
+    // 失去焦点
+    blur() {
+      setTimeout(() => {
+        this.focused = false;
+      }, 100);
+      this.show = false;
+      this.$emit("blur", this.keyword);
+    },
+    // 点击搜索框,只有disabled=true时才发出事件,因为禁止了输入,意味着是想跳转真正的搜索页
+    clickHandler() {
+      if (this.disabled)
+        this.$emit("click");
+    },
+    // 点击左边图标
+    clickIcon(e) {
+      this.$emit("clickIcon", this.keyword);
+      try {
+        common_vendor.index.hideKeyboard();
+      } catch (e2) {
+      }
+    }
+  }
+};
+if (!Array) {
+  const _easycom_u_icon2 = common_vendor.resolveComponent("u-icon");
+  _easycom_u_icon2();
+}
+const _easycom_u_icon = () => "../u-icon/u-icon.js";
+if (!Math) {
+  _easycom_u_icon();
+}
+function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
+  return common_vendor.e({
+    a: _ctx.$slots.label || _ctx.label !== null
+  }, _ctx.$slots.label || _ctx.label !== null ? {
+    b: common_vendor.t(_ctx.label)
+  } : {}, {
+    c: common_vendor.o($options.clickIcon),
+    d: common_vendor.p({
+      size: _ctx.searchIconSize,
+      name: _ctx.searchIcon,
+      color: _ctx.searchIconColor ? _ctx.searchIconColor : _ctx.color
+    }),
+    e: common_vendor.o((...args) => $options.blur && $options.blur(...args)),
+    f: $data.keyword,
+    g: common_vendor.o((...args) => $options.search && $options.search(...args)),
+    h: common_vendor.o((...args) => $options.inputChange && $options.inputChange(...args)),
+    i: _ctx.disabled,
+    j: common_vendor.o((...args) => $options.getFocus && $options.getFocus(...args)),
+    k: _ctx.focus,
+    l: _ctx.maxlength,
+    m: _ctx.placeholder,
+    n: `color: ${_ctx.placeholderColor}`,
+    o: common_vendor.s({
+      textAlign: _ctx.inputAlign,
+      color: _ctx.color,
+      backgroundColor: _ctx.bgColor,
+      height: $options.addUnit(_ctx.height)
+    }),
+    p: common_vendor.s(_ctx.inputStyle),
+    q: $data.keyword && _ctx.clearabled && $data.focused
+  }, $data.keyword && _ctx.clearabled && $data.focused ? {
+    r: common_vendor.p({
+      name: "close",
+      size: "11",
+      color: "#ffffff",
+      customStyle: "line-height: 12px"
+    }),
+    s: common_vendor.o((...args) => $options.clear && $options.clear(...args))
+  } : {}, {
+    t: _ctx.bgColor,
+    v: _ctx.shape == "round" ? "100px" : "4px",
+    w: _ctx.borderColor,
+    x: common_vendor.t(_ctx.actionText),
+    y: common_vendor.s(_ctx.actionStyle),
+    z: common_vendor.n(($options.showActionBtn || $data.show) && "u-search__action--active"),
+    A: common_vendor.o((...args) => $options.custom && $options.custom(...args)),
+    B: common_vendor.o((...args) => $options.clickHandler && $options.clickHandler(...args)),
+    C: common_vendor.s({
+      margin: _ctx.margin
+    }),
+    D: common_vendor.s($options.addStyle(_ctx.customStyle))
+  });
+}
+const Component = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-e082a34a"], ["__file", "D:/里海数字乡村/purchase-let/uni_modules/uview-plus/components/u-search/u-search.vue"]]);
+wx.createComponent(Component);
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-search/u-search.json b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-search/u-search.json
new file mode 100644
index 0000000..fcde44c
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-search/u-search.json
@@ -0,0 +1,6 @@
+{
+  "component": true,
+  "usingComponents": {
+    "u-icon": "../u-icon/u-icon"
+  }
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-search/u-search.wxml b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-search/u-search.wxml
new file mode 100644
index 0000000..89c4fa5
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-search/u-search.wxml
@@ -0,0 +1 @@
+<view class="u-search data-v-e082a34a" bindtap="{{B}}" style="{{C + ';' + D}}"><view class="u-search__content data-v-e082a34a" style="{{'background-color:' + t + ';' + ('border-radius:' + v) + ';' + ('border-color:' + w)}}"><block wx:if="{{a}}"><block wx:if="{{$slots.label}}"><slot name="label"></slot></block><block wx:else><text class="u-search__content__label data-v-e082a34a">{{b}}</text></block></block><view class="u-search__content__icon data-v-e082a34a"><u-icon wx:if="{{d}}" class="data-v-e082a34a" bindtap="{{c}}" u-i="e082a34a-0" bind:__l="__l" u-p="{{d}}"></u-icon></view><input confirm-type="search" bindblur="{{e}}" value="{{f}}" bindconfirm="{{g}}" bindinput="{{h}}" disabled="{{i}}" bindfocus="{{j}}" focus="{{k}}" maxlength="{{l}}" placeholder-class="u-search__content__input--placeholder" placeholder="{{m}}" placeholder-style="{{n}}" class="u-search__content__input data-v-e082a34a" type="text" style="{{o + ';' + p}}"/><view wx:if="{{q}}" class="u-search__content__icon u-search__content__close data-v-e082a34a" bindtap="{{s}}"><u-icon wx:if="{{r}}" class="data-v-e082a34a" u-i="e082a34a-1" bind:__l="__l" u-p="{{r}}"></u-icon></view></view><text style="{{y}}" class="{{['u-search__action', 'data-v-e082a34a', z]}}" catchtap="{{A}}">{{x}}</text></view>
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-search/u-search.wxss b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-search/u-search.wxss
new file mode 100644
index 0000000..964cd2a
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-search/u-search.wxss
@@ -0,0 +1,107 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+/* 颜色变量 */
+/* 行为相关颜色 */
+/* 文字基本颜色 */
+/* 背景颜色 */
+/* 边框颜色 */
+/* 尺寸变量 */
+/* 文字尺寸 */
+/* 图片尺寸 */
+/* Border Radius */
+/* 水平间距 */
+/* 垂直间距 */
+/* 透明度 */
+/* 文章场景相关 */
+.u-empty.data-v-e082a34a,
+.u-empty__wrap.data-v-e082a34a,
+.u-tabs.data-v-e082a34a,
+.u-tabs__wrapper.data-v-e082a34a,
+.u-tabs__wrapper__scroll-view-wrapper.data-v-e082a34a,
+.u-tabs__wrapper__scroll-view.data-v-e082a34a,
+.u-tabs__wrapper__nav.data-v-e082a34a,
+.u-tabs__wrapper__nav__line.data-v-e082a34a {
+  display: flex;
+  flex-direction: column;
+  flex-shrink: 0;
+  flex-grow: 0;
+  flex-basis: auto;
+  align-items: stretch;
+  align-content: flex-start;
+}
+.u-search.data-v-e082a34a {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  flex: 1;
+}
+.u-search__content.data-v-e082a34a {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  padding: 0 10px;
+  flex: 1;
+  justify-content: space-between;
+  border-width: 1px;
+  border-color: transparent;
+  border-style: solid;
+  overflow: hidden;
+}
+.u-search__content__icon.data-v-e082a34a {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+}
+.u-search__content__label.data-v-e082a34a {
+  color: #303133;
+  font-size: 14px;
+  margin: 0 4px;
+}
+.u-search__content__close.data-v-e082a34a {
+  width: 20px;
+  height: 20px;
+  border-top-left-radius: 100px;
+  border-top-right-radius: 100px;
+  border-bottom-left-radius: 100px;
+  border-bottom-right-radius: 100px;
+  background-color: #C6C7CB;
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: center;
+  transform: scale(0.82);
+}
+.u-search__content__input.data-v-e082a34a {
+  flex: 1;
+  font-size: 14px;
+  line-height: 1;
+  margin: 0 5px;
+  color: #303133;
+}
+.u-search__content__input--placeholder.data-v-e082a34a {
+  color: #909193;
+}
+.u-search__action.data-v-e082a34a {
+  font-size: 14px;
+  color: #303133;
+  width: 0;
+  overflow: hidden;
+  transition-property: width;
+  transition-duration: 0.3s;
+  white-space: nowrap;
+  text-align: center;
+}
+.u-search__action--active.data-v-e082a34a {
+  width: 40px;
+  margin-left: 5px;
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-status-bar/props.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-status-bar/props.js
new file mode 100644
index 0000000..a3cb5f4
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-status-bar/props.js
@@ -0,0 +1,11 @@
+"use strict";
+const uni_modules_uviewPlus_libs_config_props = require("../../libs/config/props.js");
+const props = {
+  props: {
+    bgColor: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.statusBar.bgColor
+    }
+  }
+};
+exports.props = props;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-status-bar/u-status-bar.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-status-bar/u-status-bar.js
new file mode 100644
index 0000000..17985a7
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-status-bar/u-status-bar.js
@@ -0,0 +1,122 @@
+"use strict";
+const uni_modules_uviewPlus_components_uStatusBar_props = require("./props.js");
+const uni_modules_uviewPlus_libs_mixin_mpMixin = require("../../libs/mixin/mpMixin.js");
+const uni_modules_uviewPlus_libs_mixin_mixin = require("../../libs/mixin/mixin.js");
+const uni_modules_uviewPlus_libs_function_index = require("../../libs/function/index.js");
+const common_vendor = require("../../../../common/vendor.js");
+require("../../libs/config/props.js");
+require("../../libs/config/config.js");
+require("../../libs/config/props/actionSheet.js");
+require("../../libs/config/props/album.js");
+require("../../libs/config/props/alert.js");
+require("../../libs/config/props/avatar.js");
+require("../../libs/config/props/avatarGroup.js");
+require("../../libs/config/props/backtop.js");
+require("../../libs/config/props/badge.js");
+require("../../libs/config/props/button.js");
+require("../../libs/config/props/calendar.js");
+require("../../libs/config/props/carKeyboard.js");
+require("../../libs/config/props/cell.js");
+require("../../libs/config/props/cellGroup.js");
+require("../../libs/config/props/checkbox.js");
+require("../../libs/config/props/checkboxGroup.js");
+require("../../libs/config/props/circleProgress.js");
+require("../../libs/config/props/code.js");
+require("../../libs/config/props/codeInput.js");
+require("../../libs/config/props/col.js");
+require("../../libs/config/props/collapse.js");
+require("../../libs/config/props/collapseItem.js");
+require("../../libs/config/props/columnNotice.js");
+require("../../libs/config/props/countDown.js");
+require("../../libs/config/props/countTo.js");
+require("../../libs/config/props/datetimePicker.js");
+require("../../libs/config/props/divider.js");
+require("../../libs/config/props/empty.js");
+require("../../libs/config/props/form.js");
+require("../../libs/config/props/formItem.js");
+require("../../libs/config/props/gap.js");
+require("../../libs/config/props/grid.js");
+require("../../libs/config/props/gridItem.js");
+require("../../libs/config/props/icon.js");
+require("../../libs/config/props/image.js");
+require("../../libs/config/props/indexAnchor.js");
+require("../../libs/config/props/indexList.js");
+require("../../libs/config/props/input.js");
+require("../../libs/config/props/keyboard.js");
+require("../../libs/config/props/line.js");
+require("../../libs/config/props/lineProgress.js");
+require("../../libs/config/props/link.js");
+require("../../libs/config/props/list.js");
+require("../../libs/config/props/listItem.js");
+require("../../libs/config/props/loadingIcon.js");
+require("../../libs/config/props/loadingPage.js");
+require("../../libs/config/props/loadmore.js");
+require("../../libs/config/props/modal.js");
+require("../../libs/config/props/navbar.js");
+require("../../libs/config/color.js");
+require("../../libs/config/props/noNetwork.js");
+require("../../libs/config/props/noticeBar.js");
+require("../../libs/config/props/notify.js");
+require("../../libs/config/props/numberBox.js");
+require("../../libs/config/props/numberKeyboard.js");
+require("../../libs/config/props/overlay.js");
+require("../../libs/config/props/parse.js");
+require("../../libs/config/props/picker.js");
+require("../../libs/config/props/popup.js");
+require("../../libs/config/props/radio.js");
+require("../../libs/config/props/radioGroup.js");
+require("../../libs/config/props/rate.js");
+require("../../libs/config/props/readMore.js");
+require("../../libs/config/props/row.js");
+require("../../libs/config/props/rowNotice.js");
+require("../../libs/config/props/scrollList.js");
+require("../../libs/config/props/search.js");
+require("../../libs/config/props/section.js");
+require("../../libs/config/props/skeleton.js");
+require("../../libs/config/props/slider.js");
+require("../../libs/config/props/statusBar.js");
+require("../../libs/config/props/steps.js");
+require("../../libs/config/props/stepsItem.js");
+require("../../libs/config/props/sticky.js");
+require("../../libs/config/props/subsection.js");
+require("../../libs/config/props/swipeAction.js");
+require("../../libs/config/props/swipeActionItem.js");
+require("../../libs/config/props/swiper.js");
+require("../../libs/config/props/swipterIndicator.js");
+require("../../libs/config/props/switch.js");
+require("../../libs/config/props/tabbar.js");
+require("../../libs/config/props/tabbarItem.js");
+require("../../libs/config/props/tabs.js");
+require("../../libs/config/props/tag.js");
+require("../../libs/config/props/text.js");
+require("../../libs/config/props/textarea.js");
+require("../../libs/config/props/toast.js");
+require("../../libs/config/props/toolbar.js");
+require("../../libs/config/props/tooltip.js");
+require("../../libs/config/props/transition.js");
+require("../../libs/config/props/upload.js");
+require("../../libs/function/test.js");
+require("../../libs/util/route.js");
+require("../../libs/function/digit.js");
+const _sfc_main = {
+  name: "u-status-bar",
+  mixins: [uni_modules_uviewPlus_libs_mixin_mpMixin.mpMixin, uni_modules_uviewPlus_libs_mixin_mixin.mixin, uni_modules_uviewPlus_components_uStatusBar_props.props],
+  data() {
+    return {};
+  },
+  computed: {
+    style() {
+      const style = {};
+      style.height = uni_modules_uviewPlus_libs_function_index.addUnit(uni_modules_uviewPlus_libs_function_index.sys().statusBarHeight, "px");
+      style.backgroundColor = this.bgColor;
+      return uni_modules_uviewPlus_libs_function_index.deepMerge(style, uni_modules_uviewPlus_libs_function_index.addStyle(this.customStyle));
+    }
+  }
+};
+function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
+  return {
+    a: common_vendor.s($options.style)
+  };
+}
+const Component = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-eb8e0cdd"], ["__file", "D:/里海数字乡村/purchase-let/uni_modules/uview-plus/components/u-status-bar/u-status-bar.vue"]]);
+wx.createComponent(Component);
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-status-bar/u-status-bar.json b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-status-bar/u-status-bar.json
new file mode 100644
index 0000000..e8cfaaf
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-status-bar/u-status-bar.json
@@ -0,0 +1,4 @@
+{
+  "component": true,
+  "usingComponents": {}
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-status-bar/u-status-bar.wxml b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-status-bar/u-status-bar.wxml
new file mode 100644
index 0000000..1a92718
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-status-bar/u-status-bar.wxml
@@ -0,0 +1 @@
+<view style="{{a}}" class="u-status-bar data-v-eb8e0cdd"><slot/></view>
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-status-bar/u-status-bar.wxss b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-status-bar/u-status-bar.wxss
new file mode 100644
index 0000000..cd549cd
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-status-bar/u-status-bar.wxss
@@ -0,0 +1,28 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+/* 颜色变量 */
+/* 行为相关颜色 */
+/* 文字基本颜色 */
+/* 背景颜色 */
+/* 边框颜色 */
+/* 尺寸变量 */
+/* 文字尺寸 */
+/* 图片尺寸 */
+/* Border Radius */
+/* 水平间距 */
+/* 垂直间距 */
+/* 透明度 */
+/* 文章场景相关 */
+.u-status-bar.data-v-eb8e0cdd {
+  width: 100%;
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-tabs/props.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-tabs/props.js
new file mode 100644
index 0000000..de479e5
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-tabs/props.js
@@ -0,0 +1,67 @@
+"use strict";
+const uni_modules_uviewPlus_libs_config_props = require("../../libs/config/props.js");
+const props = {
+  props: {
+    // 滑块的移动过渡时间,单位ms
+    duration: {
+      type: Number,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.tabs.duration
+    },
+    // tabs标签数组
+    list: {
+      type: Array,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.tabs.list
+    },
+    // 滑块颜色
+    lineColor: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.tabs.lineColor
+    },
+    // 菜单选择中时的样式
+    activeStyle: {
+      type: [String, Object],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.tabs.activeStyle
+    },
+    // 菜单非选中时的样式
+    inactiveStyle: {
+      type: [String, Object],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.tabs.inactiveStyle
+    },
+    // 滑块长度
+    lineWidth: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.tabs.lineWidth
+    },
+    // 滑块高度
+    lineHeight: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.tabs.lineHeight
+    },
+    // 滑块背景显示大小,当滑块背景设置为图片时使用
+    lineBgSize: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.tabs.lineBgSize
+    },
+    // 菜单item的样式
+    itemStyle: {
+      type: [String, Object],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.tabs.itemStyle
+    },
+    // 菜单是否可滚动
+    scrollable: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.tabs.scrollable
+    },
+    // 当前选中标签的索引
+    current: {
+      type: [Number, String],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.tabs.current
+    },
+    // 默认读取的键名
+    keyName: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.tabs.keyName
+    }
+  }
+};
+exports.props = props;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-tabs/u-tabs.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-tabs/u-tabs.js
new file mode 100644
index 0000000..e6372ec
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-tabs/u-tabs.js
@@ -0,0 +1,303 @@
+"use strict";
+const common_vendor = require("../../../../common/vendor.js");
+const uni_modules_uviewPlus_components_uTabs_props = require("./props.js");
+const uni_modules_uviewPlus_libs_mixin_mpMixin = require("../../libs/mixin/mpMixin.js");
+const uni_modules_uviewPlus_libs_mixin_mixin = require("../../libs/mixin/mixin.js");
+const uni_modules_uviewPlus_libs_config_props = require("../../libs/config/props.js");
+const uni_modules_uviewPlus_libs_function_index = require("../../libs/function/index.js");
+require("../../libs/function/test.js");
+require("../../libs/util/route.js");
+require("../../libs/config/config.js");
+require("../../libs/config/props/actionSheet.js");
+require("../../libs/config/props/album.js");
+require("../../libs/config/props/alert.js");
+require("../../libs/config/props/avatar.js");
+require("../../libs/config/props/avatarGroup.js");
+require("../../libs/config/props/backtop.js");
+require("../../libs/config/props/badge.js");
+require("../../libs/config/props/button.js");
+require("../../libs/config/props/calendar.js");
+require("../../libs/config/props/carKeyboard.js");
+require("../../libs/config/props/cell.js");
+require("../../libs/config/props/cellGroup.js");
+require("../../libs/config/props/checkbox.js");
+require("../../libs/config/props/checkboxGroup.js");
+require("../../libs/config/props/circleProgress.js");
+require("../../libs/config/props/code.js");
+require("../../libs/config/props/codeInput.js");
+require("../../libs/config/props/col.js");
+require("../../libs/config/props/collapse.js");
+require("../../libs/config/props/collapseItem.js");
+require("../../libs/config/props/columnNotice.js");
+require("../../libs/config/props/countDown.js");
+require("../../libs/config/props/countTo.js");
+require("../../libs/config/props/datetimePicker.js");
+require("../../libs/config/props/divider.js");
+require("../../libs/config/props/empty.js");
+require("../../libs/config/props/form.js");
+require("../../libs/config/props/formItem.js");
+require("../../libs/config/props/gap.js");
+require("../../libs/config/props/grid.js");
+require("../../libs/config/props/gridItem.js");
+require("../../libs/config/props/icon.js");
+require("../../libs/config/props/image.js");
+require("../../libs/config/props/indexAnchor.js");
+require("../../libs/config/props/indexList.js");
+require("../../libs/config/props/input.js");
+require("../../libs/config/props/keyboard.js");
+require("../../libs/config/props/line.js");
+require("../../libs/config/props/lineProgress.js");
+require("../../libs/config/props/link.js");
+require("../../libs/config/props/list.js");
+require("../../libs/config/props/listItem.js");
+require("../../libs/config/props/loadingIcon.js");
+require("../../libs/config/props/loadingPage.js");
+require("../../libs/config/props/loadmore.js");
+require("../../libs/config/props/modal.js");
+require("../../libs/config/props/navbar.js");
+require("../../libs/config/color.js");
+require("../../libs/config/props/noNetwork.js");
+require("../../libs/config/props/noticeBar.js");
+require("../../libs/config/props/notify.js");
+require("../../libs/config/props/numberBox.js");
+require("../../libs/config/props/numberKeyboard.js");
+require("../../libs/config/props/overlay.js");
+require("../../libs/config/props/parse.js");
+require("../../libs/config/props/picker.js");
+require("../../libs/config/props/popup.js");
+require("../../libs/config/props/radio.js");
+require("../../libs/config/props/radioGroup.js");
+require("../../libs/config/props/rate.js");
+require("../../libs/config/props/readMore.js");
+require("../../libs/config/props/row.js");
+require("../../libs/config/props/rowNotice.js");
+require("../../libs/config/props/scrollList.js");
+require("../../libs/config/props/search.js");
+require("../../libs/config/props/section.js");
+require("../../libs/config/props/skeleton.js");
+require("../../libs/config/props/slider.js");
+require("../../libs/config/props/statusBar.js");
+require("../../libs/config/props/steps.js");
+require("../../libs/config/props/stepsItem.js");
+require("../../libs/config/props/sticky.js");
+require("../../libs/config/props/subsection.js");
+require("../../libs/config/props/swipeAction.js");
+require("../../libs/config/props/swipeActionItem.js");
+require("../../libs/config/props/swiper.js");
+require("../../libs/config/props/swipterIndicator.js");
+require("../../libs/config/props/switch.js");
+require("../../libs/config/props/tabbar.js");
+require("../../libs/config/props/tabbarItem.js");
+require("../../libs/config/props/tabs.js");
+require("../../libs/config/props/tag.js");
+require("../../libs/config/props/text.js");
+require("../../libs/config/props/textarea.js");
+require("../../libs/config/props/toast.js");
+require("../../libs/config/props/toolbar.js");
+require("../../libs/config/props/tooltip.js");
+require("../../libs/config/props/transition.js");
+require("../../libs/config/props/upload.js");
+require("../../libs/function/digit.js");
+const _sfc_main = {
+  name: "u-tabs",
+  mixins: [uni_modules_uviewPlus_libs_mixin_mpMixin.mpMixin, uni_modules_uviewPlus_libs_mixin_mixin.mixin, uni_modules_uviewPlus_components_uTabs_props.props],
+  data() {
+    return {
+      firstTime: true,
+      scrollLeft: 0,
+      scrollViewWidth: 0,
+      lineOffsetLeft: 0,
+      tabsRect: {
+        left: 0
+      },
+      innerCurrent: 0,
+      moving: false
+    };
+  },
+  watch: {
+    current: {
+      immediate: true,
+      handler(newValue, oldValue) {
+        if (newValue !== this.innerCurrent) {
+          this.innerCurrent = newValue;
+          this.$nextTick(() => {
+            this.resize();
+          });
+        }
+      }
+    },
+    // list变化时,重新渲染list各项信息
+    list() {
+      this.$nextTick(() => {
+        this.resize();
+      });
+    }
+  },
+  computed: {
+    textStyle() {
+      return (index) => {
+        const style = {};
+        const customeStyle = index === this.innerCurrent ? uni_modules_uviewPlus_libs_function_index.addStyle(this.activeStyle) : common_vendor.index.$u.addStyle(
+          this.inactiveStyle
+        );
+        if (this.list[index].disabled) {
+          style.color = "#c8c9cc";
+        }
+        return uni_modules_uviewPlus_libs_function_index.deepMerge(customeStyle, style);
+      };
+    },
+    propsBadge() {
+      return uni_modules_uviewPlus_libs_config_props.defProps.badge;
+    }
+  },
+  async mounted() {
+    this.init();
+  },
+  emits: ["click", "change"],
+  methods: {
+    addStyle: uni_modules_uviewPlus_libs_function_index.addStyle,
+    addUnit: uni_modules_uviewPlus_libs_function_index.addUnit,
+    setLineLeft() {
+      const tabItem = this.list[this.innerCurrent];
+      if (!tabItem) {
+        return;
+      }
+      let lineOffsetLeft = this.list.slice(0, this.innerCurrent).reduce((total, curr) => total + curr.rect.width, 0);
+      const lineWidth = uni_modules_uviewPlus_libs_function_index.getPx(this.lineWidth);
+      this.lineOffsetLeft = lineOffsetLeft + (tabItem.rect.width - lineWidth) / 2;
+      if (this.firstTime) {
+        setTimeout(() => {
+          this.firstTime = false;
+        }, 10);
+      }
+    },
+    // nvue下设置滑块的位置
+    animation(x, duration = 0) {
+    },
+    // 点击某一个标签
+    clickHandler(item, index) {
+      this.$emit("click", {
+        ...item,
+        index
+      });
+      if (item.disabled)
+        return;
+      this.innerCurrent = index;
+      this.resize();
+      this.$emit("change", {
+        ...item,
+        index
+      });
+    },
+    init() {
+      uni_modules_uviewPlus_libs_function_index.sleep().then(() => {
+        this.resize();
+      });
+    },
+    setScrollLeft() {
+      const tabRect = this.list[this.innerCurrent];
+      const offsetLeft = this.list.slice(0, this.innerCurrent).reduce((total, curr) => {
+        return total + curr.rect.width;
+      }, 0);
+      const windowWidth = uni_modules_uviewPlus_libs_function_index.sys().windowWidth;
+      let scrollLeft = offsetLeft - (this.tabsRect.width - tabRect.rect.width) / 2 - (windowWidth - this.tabsRect.right) / 2 + this.tabsRect.left / 2;
+      scrollLeft = Math.min(scrollLeft, this.scrollViewWidth - this.tabsRect.width);
+      this.scrollLeft = Math.max(0, scrollLeft);
+    },
+    // 获取所有标签的尺寸
+    resize() {
+      if (this.list.length === 0) {
+        return;
+      }
+      Promise.all([this.getTabsRect(), this.getAllItemRect()]).then(([tabsRect, itemRect = []]) => {
+        this.tabsRect = tabsRect;
+        this.scrollViewWidth = 0;
+        itemRect.map((item, index) => {
+          this.scrollViewWidth += item.width;
+          this.list[index].rect = item;
+        });
+        this.setLineLeft();
+        this.setScrollLeft();
+      });
+    },
+    // 获取导航菜单的尺寸
+    getTabsRect() {
+      return new Promise((resolve) => {
+        this.queryRect("u-tabs__wrapper__scroll-view").then((size) => resolve(size));
+      });
+    },
+    // 获取所有标签的尺寸
+    getAllItemRect() {
+      return new Promise((resolve) => {
+        const promiseAllArr = this.list.map((item, index) => this.queryRect(
+          `u-tabs__wrapper__nav__item-${index}`,
+          true
+        ));
+        Promise.all(promiseAllArr).then((sizes) => resolve(sizes));
+      });
+    },
+    // 获取各个标签的尺寸
+    queryRect(el, item) {
+      return new Promise((resolve) => {
+        this.$uGetRect(`.${el}`).then((size) => {
+          resolve(size);
+        });
+      });
+    }
+  }
+};
+if (!Array) {
+  const _easycom_u_badge2 = common_vendor.resolveComponent("u-badge");
+  _easycom_u_badge2();
+}
+const _easycom_u_badge = () => "../u-badge/u-badge.js";
+if (!Math) {
+  _easycom_u_badge();
+}
+function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
+  return {
+    a: common_vendor.f(_ctx.list, (item, index, i0) => {
+      return {
+        a: common_vendor.t(item[_ctx.keyName]),
+        b: common_vendor.n(item.disabled && "u-tabs__wrapper__nav__item__text--disabled"),
+        c: common_vendor.s($options.textStyle(index)),
+        d: "02b0c54f-0-" + i0,
+        e: common_vendor.p({
+          show: !!(item.badge && (item.badge.show || item.badge.isDot || item.badge.value)),
+          isDot: item.badge && item.badge.isDot || $options.propsBadge.isDot,
+          value: item.badge && item.badge.value || $options.propsBadge.value,
+          max: item.badge && item.badge.max || $options.propsBadge.max,
+          type: item.badge && item.badge.type || $options.propsBadge.type,
+          showZero: item.badge && item.badge.showZero || $options.propsBadge.showZero,
+          bgColor: item.badge && item.badge.bgColor || $options.propsBadge.bgColor,
+          color: item.badge && item.badge.color || $options.propsBadge.color,
+          shape: item.badge && item.badge.shape || $options.propsBadge.shape,
+          numberType: item.badge && item.badge.numberType || $options.propsBadge.numberType,
+          inverted: item.badge && item.badge.inverted || $options.propsBadge.inverted,
+          customStyle: "margin-left: 4px;"
+        }),
+        f: index,
+        g: common_vendor.o(($event) => $options.clickHandler(item, index), index),
+        h: `u-tabs__wrapper__nav__item-${index}`,
+        i: common_vendor.n(`u-tabs__wrapper__nav__item-${index}`),
+        j: common_vendor.n(item.disabled && "u-tabs__wrapper__nav__item--disabled")
+      };
+    }),
+    b: common_vendor.s($options.addStyle(_ctx.itemStyle)),
+    c: common_vendor.s({
+      flex: _ctx.scrollable ? "" : 1
+    }),
+    d: common_vendor.s({
+      width: $options.addUnit(_ctx.lineWidth),
+      transform: `translate(${$data.lineOffsetLeft}px)`,
+      transitionDuration: `${$data.firstTime ? 0 : _ctx.duration}ms`,
+      height: $options.addUnit(_ctx.lineHeight),
+      background: _ctx.lineColor,
+      backgroundSize: _ctx.lineBgSize
+    }),
+    e: _ctx.scrollable,
+    f: $data.scrollLeft
+  };
+}
+const Component = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-02b0c54f"], ["__file", "D:/里海数字乡村/purchase-let/uni_modules/uview-plus/components/u-tabs/u-tabs.vue"]]);
+wx.createComponent(Component);
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-tabs/u-tabs.json b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-tabs/u-tabs.json
new file mode 100644
index 0000000..ac418c8
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-tabs/u-tabs.json
@@ -0,0 +1,6 @@
+{
+  "component": true,
+  "usingComponents": {
+    "u-badge": "../u-badge/u-badge"
+  }
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-tabs/u-tabs.wxml b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-tabs/u-tabs.wxml
new file mode 100644
index 0000000..d06b016
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-tabs/u-tabs.wxml
@@ -0,0 +1 @@
+<view class="u-tabs data-v-02b0c54f"><view class="u-tabs__wrapper data-v-02b0c54f"><slot name="left"/><view class="u-tabs__wrapper__scroll-view-wrapper data-v-02b0c54f"><scroll-view scroll-x="{{e}}" scroll-left="{{f}}" scroll-with-animation class="u-tabs__wrapper__scroll-view data-v-02b0c54f" show-scrollbar="{{false}}" ref="u-tabs__wrapper__scroll-view"><view class="u-tabs__wrapper__nav data-v-02b0c54f" ref="u-tabs__wrapper__nav"><view wx:for="{{a}}" wx:for-item="item" wx:key="f" bindtap="{{item.g}}" ref="{{item.h}}" style="{{b + ';' + c}}" class="{{['u-tabs__wrapper__nav__item', 'data-v-02b0c54f', item.i, item.j]}}"><text class="{{[item.b, 'u-tabs__wrapper__nav__item__text', 'data-v-02b0c54f']}}" style="{{item.c}}">{{item.a}}</text><u-badge wx:if="{{item.e}}" class="data-v-02b0c54f" u-i="{{item.d}}" bind:__l="__l" u-p="{{item.e}}"></u-badge></view><view class="u-tabs__wrapper__nav__line data-v-02b0c54f" ref="u-tabs__wrapper__nav__line" style="{{d}}"></view></view></scroll-view></view><slot name="right"/></view></view>
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-tabs/u-tabs.wxss b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-tabs/u-tabs.wxss
new file mode 100644
index 0000000..250683b
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-tabs/u-tabs.wxss
@@ -0,0 +1,88 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+/* 颜色变量 */
+/* 行为相关颜色 */
+/* 文字基本颜色 */
+/* 背景颜色 */
+/* 边框颜色 */
+/* 尺寸变量 */
+/* 文字尺寸 */
+/* 图片尺寸 */
+/* Border Radius */
+/* 水平间距 */
+/* 垂直间距 */
+/* 透明度 */
+/* 文章场景相关 */
+.u-empty.data-v-02b0c54f,
+.u-empty__wrap.data-v-02b0c54f,
+.u-tabs.data-v-02b0c54f,
+.u-tabs__wrapper.data-v-02b0c54f,
+.u-tabs__wrapper__scroll-view-wrapper.data-v-02b0c54f,
+.u-tabs__wrapper__scroll-view.data-v-02b0c54f,
+.u-tabs__wrapper__nav.data-v-02b0c54f,
+.u-tabs__wrapper__nav__line.data-v-02b0c54f {
+  display: flex;
+  flex-direction: column;
+  flex-shrink: 0;
+  flex-grow: 0;
+  flex-basis: auto;
+  align-items: stretch;
+  align-content: flex-start;
+}
+.u-tabs__wrapper.data-v-02b0c54f {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+}
+.u-tabs__wrapper__scroll-view-wrapper.data-v-02b0c54f {
+  flex: 1;
+  overflow: auto hidden;
+}
+.u-tabs__wrapper__scroll-view.data-v-02b0c54f {
+  display: flex;
+  flex-direction: row;
+  flex: 1;
+}
+.u-tabs__wrapper__nav.data-v-02b0c54f {
+  display: flex;
+  flex-direction: row;
+  position: relative;
+}
+.u-tabs__wrapper__nav__item.data-v-02b0c54f {
+  padding: 0 11px;
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: center;
+}
+.u-tabs__wrapper__nav__item--disabled.data-v-02b0c54f {
+  cursor: not-allowed;
+}
+.u-tabs__wrapper__nav__item__text.data-v-02b0c54f {
+  font-size: 15px;
+  color: #606266;
+  white-space: nowrap;
+}
+.u-tabs__wrapper__nav__item__text--disabled.data-v-02b0c54f {
+  color: #c8c9cc !important;
+}
+.u-tabs__wrapper__nav__line.data-v-02b0c54f {
+  height: 3px;
+  background: #3c9cff;
+  width: 30px;
+  position: absolute;
+  bottom: 2px;
+  border-radius: 100px;
+  transition-property: transform;
+  transition-duration: 300ms;
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-text/props.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-text/props.js
new file mode 100644
index 0000000..6b25313
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-text/props.js
@@ -0,0 +1,113 @@
+"use strict";
+const uni_modules_uviewPlus_libs_config_props = require("../../libs/config/props.js");
+const props = {
+  props: {
+    // 主题颜色
+    type: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.text.type
+    },
+    // 是否显示
+    show: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.text.show
+    },
+    // 显示的值
+    text: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.text.text
+    },
+    // 前置图标
+    prefixIcon: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.text.prefixIcon
+    },
+    // 后置图标
+    suffixIcon: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.text.suffixIcon
+    },
+    // 文本处理的匹配模式
+    // text-普通文本,price-价格,phone-手机号,name-姓名,date-日期,link-超链接
+    mode: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.text.mode
+    },
+    // mode=link下,配置的链接
+    href: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.text.href
+    },
+    // 格式化规则
+    format: {
+      type: [String, Function],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.text.format
+    },
+    // mode=phone时,点击文本是否拨打电话
+    call: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.text.call
+    },
+    // 小程序的打开方式
+    openType: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.text.openType
+    },
+    // 是否粗体,默认normal
+    bold: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.text.bold
+    },
+    // 是否块状
+    block: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.text.block
+    },
+    // 文本显示的行数,如果设置,超出此行数,将会显示省略号
+    lines: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.text.lines
+    },
+    // 文本颜色
+    color: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.text.color
+    },
+    // 字体大小
+    size: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.text.size
+    },
+    // 图标的样式
+    iconStyle: {
+      type: [Object, String],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.text.iconStyle
+    },
+    // 文字装饰,下划线,中划线等,可选值 none|underline|line-through
+    decoration: {
+      tepe: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.text.decoration
+    },
+    // 外边距,对象、字符串,数值形式均可
+    margin: {
+      type: [Object, String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.text.margin
+    },
+    // 文本行高
+    lineHeight: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.text.lineHeight
+    },
+    // 文本对齐方式,可选值left|center|right
+    align: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.text.align
+    },
+    // 文字换行,可选值break-word|normal|anywhere
+    wordWrap: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.text.wordWrap
+    }
+  }
+};
+exports.props = props;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-text/u-text.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-text/u-text.js
new file mode 100644
index 0000000..3b2b1ce
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-text/u-text.js
@@ -0,0 +1,223 @@
+"use strict";
+const common_vendor = require("../../../../common/vendor.js");
+const uni_modules_uviewPlus_components_uText_props = require("./props.js");
+const uni_modules_uviewPlus_components_uText_value = require("./value.js");
+const uni_modules_uviewPlus_libs_mixin_mpMixin = require("../../libs/mixin/mpMixin.js");
+const uni_modules_uviewPlus_libs_mixin_mixin = require("../../libs/mixin/mixin.js");
+const uni_modules_uviewPlus_libs_mixin_button = require("../../libs/mixin/button.js");
+const uni_modules_uviewPlus_libs_mixin_openType = require("../../libs/mixin/openType.js");
+const uni_modules_uviewPlus_libs_function_index = require("../../libs/function/index.js");
+require("../../libs/config/props.js");
+require("../../libs/config/config.js");
+require("../../libs/config/props/actionSheet.js");
+require("../../libs/config/props/album.js");
+require("../../libs/config/props/alert.js");
+require("../../libs/config/props/avatar.js");
+require("../../libs/config/props/avatarGroup.js");
+require("../../libs/config/props/backtop.js");
+require("../../libs/config/props/badge.js");
+require("../../libs/config/props/button.js");
+require("../../libs/config/props/calendar.js");
+require("../../libs/config/props/carKeyboard.js");
+require("../../libs/config/props/cell.js");
+require("../../libs/config/props/cellGroup.js");
+require("../../libs/config/props/checkbox.js");
+require("../../libs/config/props/checkboxGroup.js");
+require("../../libs/config/props/circleProgress.js");
+require("../../libs/config/props/code.js");
+require("../../libs/config/props/codeInput.js");
+require("../../libs/config/props/col.js");
+require("../../libs/config/props/collapse.js");
+require("../../libs/config/props/collapseItem.js");
+require("../../libs/config/props/columnNotice.js");
+require("../../libs/config/props/countDown.js");
+require("../../libs/config/props/countTo.js");
+require("../../libs/config/props/datetimePicker.js");
+require("../../libs/config/props/divider.js");
+require("../../libs/config/props/empty.js");
+require("../../libs/config/props/form.js");
+require("../../libs/config/props/formItem.js");
+require("../../libs/config/props/gap.js");
+require("../../libs/config/props/grid.js");
+require("../../libs/config/props/gridItem.js");
+require("../../libs/config/props/icon.js");
+require("../../libs/config/props/image.js");
+require("../../libs/config/props/indexAnchor.js");
+require("../../libs/config/props/indexList.js");
+require("../../libs/config/props/input.js");
+require("../../libs/config/props/keyboard.js");
+require("../../libs/config/props/line.js");
+require("../../libs/config/props/lineProgress.js");
+require("../../libs/config/props/link.js");
+require("../../libs/config/props/list.js");
+require("../../libs/config/props/listItem.js");
+require("../../libs/config/props/loadingIcon.js");
+require("../../libs/config/props/loadingPage.js");
+require("../../libs/config/props/loadmore.js");
+require("../../libs/config/props/modal.js");
+require("../../libs/config/props/navbar.js");
+require("../../libs/config/color.js");
+require("../../libs/config/props/noNetwork.js");
+require("../../libs/config/props/noticeBar.js");
+require("../../libs/config/props/notify.js");
+require("../../libs/config/props/numberBox.js");
+require("../../libs/config/props/numberKeyboard.js");
+require("../../libs/config/props/overlay.js");
+require("../../libs/config/props/parse.js");
+require("../../libs/config/props/picker.js");
+require("../../libs/config/props/popup.js");
+require("../../libs/config/props/radio.js");
+require("../../libs/config/props/radioGroup.js");
+require("../../libs/config/props/rate.js");
+require("../../libs/config/props/readMore.js");
+require("../../libs/config/props/row.js");
+require("../../libs/config/props/rowNotice.js");
+require("../../libs/config/props/scrollList.js");
+require("../../libs/config/props/search.js");
+require("../../libs/config/props/section.js");
+require("../../libs/config/props/skeleton.js");
+require("../../libs/config/props/slider.js");
+require("../../libs/config/props/statusBar.js");
+require("../../libs/config/props/steps.js");
+require("../../libs/config/props/stepsItem.js");
+require("../../libs/config/props/sticky.js");
+require("../../libs/config/props/subsection.js");
+require("../../libs/config/props/swipeAction.js");
+require("../../libs/config/props/swipeActionItem.js");
+require("../../libs/config/props/swiper.js");
+require("../../libs/config/props/swipterIndicator.js");
+require("../../libs/config/props/switch.js");
+require("../../libs/config/props/tabbar.js");
+require("../../libs/config/props/tabbarItem.js");
+require("../../libs/config/props/tabs.js");
+require("../../libs/config/props/tag.js");
+require("../../libs/config/props/text.js");
+require("../../libs/config/props/textarea.js");
+require("../../libs/config/props/toast.js");
+require("../../libs/config/props/toolbar.js");
+require("../../libs/config/props/tooltip.js");
+require("../../libs/config/props/transition.js");
+require("../../libs/config/props/upload.js");
+require("../../libs/function/test.js");
+require("../../libs/util/route.js");
+require("../../libs/function/digit.js");
+const _sfc_main = {
+  name: "u--text",
+  mixins: [uni_modules_uviewPlus_libs_mixin_mpMixin.mpMixin, uni_modules_uviewPlus_libs_mixin_mixin.mixin, uni_modules_uviewPlus_components_uText_value.value, uni_modules_uviewPlus_libs_mixin_button.button, uni_modules_uviewPlus_libs_mixin_openType.openType, uni_modules_uviewPlus_components_uText_props.props],
+  emits: ["click"],
+  computed: {
+    valueStyle() {
+      const style = {
+        textDecoration: this.decoration,
+        fontWeight: this.bold ? "bold" : "normal",
+        wordWrap: this.wordWrap,
+        fontSize: uni_modules_uviewPlus_libs_function_index.addUnit(this.size)
+      };
+      !this.type && (style.color = this.color);
+      this.isNvue && this.lines && (style.lines = this.lines);
+      this.lineHeight && (style.lineHeight = uni_modules_uviewPlus_libs_function_index.addUnit(this.lineHeight));
+      !this.isNvue && this.block && (style.display = "block");
+      return uni_modules_uviewPlus_libs_function_index.deepMerge(style, uni_modules_uviewPlus_libs_function_index.addStyle(this.customStyle));
+    },
+    isNvue() {
+      let nvue = false;
+      return nvue;
+    },
+    isMp() {
+      let mp = false;
+      mp = true;
+      return mp;
+    }
+  },
+  data() {
+    return {};
+  },
+  methods: {
+    addStyle: uni_modules_uviewPlus_libs_function_index.addStyle,
+    clickHandler() {
+      if (this.call && this.mode === "phone") {
+        common_vendor.index.makePhoneCall({
+          phoneNumber: this.text
+        });
+      }
+      this.$emit("click");
+    }
+  }
+};
+if (!Array) {
+  const _easycom_u_icon2 = common_vendor.resolveComponent("u-icon");
+  const _easycom_u_link2 = common_vendor.resolveComponent("u-link");
+  (_easycom_u_icon2 + _easycom_u_link2)();
+}
+const _easycom_u_icon = () => "../u-icon/u-icon.js";
+const _easycom_u_link = () => "../u-link/u-link.js";
+if (!Math) {
+  (_easycom_u_icon + _easycom_u_link)();
+}
+function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
+  return common_vendor.e({
+    a: _ctx.show
+  }, _ctx.show ? common_vendor.e({
+    b: _ctx.mode === "price"
+  }, _ctx.mode === "price" ? {
+    c: common_vendor.n(_ctx.type && `u-text__value--${_ctx.type}`),
+    d: common_vendor.s($options.valueStyle)
+  } : {}, {
+    e: _ctx.prefixIcon
+  }, _ctx.prefixIcon ? {
+    f: common_vendor.p({
+      name: _ctx.prefixIcon,
+      customStyle: $options.addStyle(_ctx.iconStyle)
+    })
+  } : {}, {
+    g: _ctx.mode === "link"
+  }, _ctx.mode === "link" ? {
+    h: $options.valueStyle.fontWeight,
+    i: $options.valueStyle.wordWrap,
+    j: $options.valueStyle.fontSize,
+    k: common_vendor.n(_ctx.type && `u-text__value--${_ctx.type}`),
+    l: common_vendor.n(_ctx.lines && `u-line-${_ctx.lines}`),
+    m: common_vendor.p({
+      text: _ctx.value,
+      href: _ctx.href,
+      underLine: true
+    })
+  } : _ctx.openType && $options.isMp ? {
+    o: common_vendor.t(_ctx.value),
+    p: common_vendor.s($options.valueStyle),
+    q: _ctx.index,
+    r: _ctx.openType,
+    s: common_vendor.o((...args) => _ctx.onGetUserInfo && _ctx.onGetUserInfo(...args)),
+    t: common_vendor.o((...args) => _ctx.onContact && _ctx.onContact(...args)),
+    v: common_vendor.o((...args) => _ctx.onGetPhoneNumber && _ctx.onGetPhoneNumber(...args)),
+    w: common_vendor.o((...args) => _ctx.onError && _ctx.onError(...args)),
+    x: common_vendor.o((...args) => _ctx.onLaunchApp && _ctx.onLaunchApp(...args)),
+    y: common_vendor.o((...args) => _ctx.onOpenSetting && _ctx.onOpenSetting(...args)),
+    z: _ctx.lang,
+    A: _ctx.sessionFrom,
+    B: _ctx.sendMessageTitle,
+    C: _ctx.sendMessagePath,
+    D: _ctx.sendMessageImg,
+    E: _ctx.showMessageCard,
+    F: _ctx.appParameter
+  } : {
+    G: common_vendor.t(_ctx.value),
+    H: common_vendor.s($options.valueStyle),
+    I: common_vendor.n(_ctx.type && `u-text__value--${_ctx.type}`),
+    J: common_vendor.n(_ctx.lines && `u-line-${_ctx.lines}`)
+  }, {
+    n: _ctx.openType && $options.isMp,
+    K: _ctx.suffixIcon
+  }, _ctx.suffixIcon ? {
+    L: common_vendor.p({
+      name: _ctx.suffixIcon,
+      customStyle: $options.addStyle(_ctx.iconStyle)
+    })
+  } : {}, {
+    M: _ctx.margin,
+    N: _ctx.align === "left" ? "flex-start" : _ctx.align === "center" ? "center" : "flex-end",
+    O: common_vendor.o((...args) => $options.clickHandler && $options.clickHandler(...args))
+  }) : {});
+}
+const Component = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-0a574502"], ["__file", "D:/里海数字乡村/purchase-let/uni_modules/uview-plus/components/u-text/u-text.vue"]]);
+wx.createComponent(Component);
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-text/u-text.json b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-text/u-text.json
new file mode 100644
index 0000000..2056454
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-text/u-text.json
@@ -0,0 +1,7 @@
+{
+  "component": true,
+  "usingComponents": {
+    "u-icon": "../u-icon/u-icon",
+    "u-link": "../u-link/u-link"
+  }
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-text/u-text.wxml b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-text/u-text.wxml
new file mode 100644
index 0000000..3d48963
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-text/u-text.wxml
@@ -0,0 +1 @@
+<view wx:if="{{a}}" class="{{['u-text', 'data-v-0a574502']}}" style="{{'margin:' + M + ';' + ('justify-content:' + N)}}" bindtap="{{O}}"><text wx:if="{{b}}" class="{{['data-v-0a574502', 'u-text__price', c]}}" style="{{d}}">¥</text><view wx:if="{{e}}" class="u-text__prefix-icon data-v-0a574502"><u-icon wx:if="{{f}}" class="data-v-0a574502" u-i="0a574502-0" bind:__l="__l" u-p="{{f}}"></u-icon></view><u-link wx:if="{{g}}" style="{{'font-weight:' + h + ';' + ('word-wrap:' + i) + ';' + ('font-size:' + j)}}" class="{{['u-text__value', 'data-v-0a574502', k, l]}}" u-i="0a574502-1" bind:__l="__l" u-p="{{m}}"></u-link><block wx:elif="{{n}}"><button class="u-reset-button u-text__value data-v-0a574502" style="{{p}}" data-index="{{q}}" openType="{{r}}" bindgetuserinfo="{{s}}" bindcontact="{{t}}" bindgetphonenumber="{{v}}" binderror="{{w}}" bindlaunchapp="{{x}}" bindopensetting="{{y}}" lang="{{z}}" session-from="{{A}}" send-message-title="{{B}}" send-message-path="{{C}}" send-message-img="{{D}}" show-message-card="{{E}}" app-parameter="{{F}}">{{o}}</button></block><text wx:else style="{{H}}" class="{{['u-text__value', 'data-v-0a574502', I, J]}}">{{G}}</text><view wx:if="{{K}}" class="u-text__suffix-icon data-v-0a574502"><u-icon wx:if="{{L}}" class="data-v-0a574502" u-i="0a574502-2" bind:__l="__l" u-p="{{L}}"></u-icon></view></view>
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-text/u-text.wxss b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-text/u-text.wxss
new file mode 100644
index 0000000..04a2eed
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-text/u-text.wxss
@@ -0,0 +1,89 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+/* 颜色变量 */
+/* 行为相关颜色 */
+/* 文字基本颜色 */
+/* 背景颜色 */
+/* 边框颜色 */
+/* 尺寸变量 */
+/* 文字尺寸 */
+/* 图片尺寸 */
+/* Border Radius */
+/* 水平间距 */
+/* 垂直间距 */
+/* 透明度 */
+/* 文章场景相关 */
+.u-empty.data-v-0a574502,
+.u-empty__wrap.data-v-0a574502,
+.u-tabs.data-v-0a574502,
+.u-tabs__wrapper.data-v-0a574502,
+.u-tabs__wrapper__scroll-view-wrapper.data-v-0a574502,
+.u-tabs__wrapper__scroll-view.data-v-0a574502,
+.u-tabs__wrapper__nav.data-v-0a574502,
+.u-tabs__wrapper__nav__line.data-v-0a574502 {
+  display: flex;
+  flex-direction: column;
+  flex-shrink: 0;
+  flex-grow: 0;
+  flex-basis: auto;
+  align-items: stretch;
+  align-content: flex-start;
+}
+.u-text.data-v-0a574502 {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  flex-wrap: nowrap;
+  flex: 1;
+  width: 100%;
+}
+.u-text__price.data-v-0a574502 {
+  font-size: 14px;
+  color: #606266;
+}
+.u-text__value.data-v-0a574502 {
+  font-size: 14px;
+  display: flex;
+  flex-direction: row;
+  color: #606266;
+  flex-wrap: wrap;
+  text-overflow: ellipsis;
+  align-items: center;
+}
+.u-text__value--primary.data-v-0a574502 {
+  color: #3c9cff;
+}
+.u-text__value--warning.data-v-0a574502 {
+  color: #f9ae3d;
+}
+.u-text__value--success.data-v-0a574502 {
+  color: #5ac725;
+}
+.u-text__value--info.data-v-0a574502 {
+  color: #909399;
+}
+.u-text__value--error.data-v-0a574502 {
+  color: #f56c6c;
+}
+.u-text__value--main.data-v-0a574502 {
+  color: #303133;
+}
+.u-text__value--content.data-v-0a574502 {
+  color: #606266;
+}
+.u-text__value--tips.data-v-0a574502 {
+  color: #909193;
+}
+.u-text__value--light.data-v-0a574502 {
+  color: #c0c4cc;
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-text/value.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-text/value.js
new file mode 100644
index 0000000..f53b748
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-text/value.js
@@ -0,0 +1,78 @@
+"use strict";
+const uni_modules_uviewPlus_libs_function_index = require("../../libs/function/index.js");
+const uni_modules_uviewPlus_libs_function_test = require("../../libs/function/test.js");
+const value = {
+  computed: {
+    // 经处理后需要显示的值
+    value() {
+      const {
+        text,
+        mode,
+        format,
+        href
+      } = this;
+      if (mode === "price") {
+        if (!/^\d+(\.\d+)?$/.test(text)) {
+          uni_modules_uviewPlus_libs_function_index.error("金额模式下,text参数需要为金额格式");
+        }
+        if (uni_modules_uviewPlus_libs_function_test.test.func(format)) {
+          return format(text);
+        }
+        return uni_modules_uviewPlus_libs_function_index.priceFormat(text, 2);
+      }
+      if (mode === "date") {
+        !uni_modules_uviewPlus_libs_function_test.test.date(text) && uni_modules_uviewPlus_libs_function_index.error("日期模式下,text参数需要为日期或时间戳格式");
+        if (uni_modules_uviewPlus_libs_function_test.test.func(format)) {
+          return format(text);
+        }
+        if (format) {
+          return uni_modules_uviewPlus_libs_function_index.timeFormat(text, format);
+        }
+        return uni_modules_uviewPlus_libs_function_index.timeFormat(text, "yyyy-mm-dd");
+      }
+      if (mode === "phone") {
+        if (uni_modules_uviewPlus_libs_function_test.test.func(format)) {
+          return format(text);
+        }
+        if (format === "encrypt") {
+          return `${text.substr(0, 3)}****${text.substr(7)}`;
+        }
+        return text;
+      }
+      if (mode === "name") {
+        !(typeof text === "string") && uni_modules_uviewPlus_libs_function_index.error("姓名模式下,text参数需要为字符串格式");
+        if (uni_modules_uviewPlus_libs_function_test.test.func(format)) {
+          return format(text);
+        }
+        if (format === "encrypt") {
+          return this.formatName(text);
+        }
+        return text;
+      }
+      if (mode === "link") {
+        !uni_modules_uviewPlus_libs_function_test.test.url(href) && uni_modules_uviewPlus_libs_function_index.error("超链接模式下,href参数需要为URL格式");
+        return text;
+      }
+      return text;
+    }
+  },
+  methods: {
+    // 默认的姓名脱敏规则
+    formatName(name) {
+      let value2 = "";
+      if (name.length === 2) {
+        value2 = name.substr(0, 1) + "*";
+      } else if (name.length > 2) {
+        let char = "";
+        for (let i = 0, len = name.length - 2; i < len; i++) {
+          char += "*";
+        }
+        value2 = name.substr(0, 1) + char + name.substr(-1, 1);
+      } else {
+        value2 = name;
+      }
+      return value2;
+    }
+  }
+};
+exports.value = value;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-transition/props.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-transition/props.js
new file mode 100644
index 0000000..ef233bc
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-transition/props.js
@@ -0,0 +1,27 @@
+"use strict";
+const uni_modules_uviewPlus_libs_config_props = require("../../libs/config/props.js");
+const props = {
+  props: {
+    // 是否展示组件
+    show: {
+      type: Boolean,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.transition.show
+    },
+    // 使用的动画模式
+    mode: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.transition.mode
+    },
+    // 动画的执行时间,单位ms
+    duration: {
+      type: [String, Number],
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.transition.duration
+    },
+    // 使用的动画过渡函数
+    timingFunction: {
+      type: String,
+      default: () => uni_modules_uviewPlus_libs_config_props.defProps.transition.timingFunction
+    }
+  }
+};
+exports.props = props;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-transition/transition.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-transition/transition.js
new file mode 100644
index 0000000..a7765db
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-transition/transition.js
@@ -0,0 +1,62 @@
+"use strict";
+const common_vendor = require("../../../../common/vendor.js");
+const uni_modules_uviewPlus_libs_function_index = require("../../libs/function/index.js");
+const getClassNames = (name) => ({
+  enter: `u-${name}-enter u-${name}-enter-active`,
+  "enter-to": `u-${name}-enter-to u-${name}-enter-active`,
+  leave: `u-${name}-leave u-${name}-leave-active`,
+  "leave-to": `u-${name}-leave-to u-${name}-leave-active`
+});
+const transition = {
+  methods: {
+    // 组件被点击发出事件
+    clickHandler() {
+      this.$emit("click");
+    },
+    // vue版本的组件进场处理
+    async vueEnter() {
+      const classNames = getClassNames(this.mode);
+      this.status = "enter";
+      this.$emit("beforeEnter");
+      this.inited = true;
+      this.display = true;
+      this.classes = classNames.enter;
+      await common_vendor.nextTick$1();
+      {
+        await uni_modules_uviewPlus_libs_function_index.sleep(20);
+        this.$emit("enter");
+        this.transitionEnded = false;
+        this.$emit("afterEnter");
+        this.classes = classNames["enter-to"];
+      }
+    },
+    // 动画离场处理
+    async vueLeave() {
+      if (!this.display)
+        return;
+      const classNames = getClassNames(this.mode);
+      this.status = "leave";
+      this.$emit("beforeLeave");
+      this.classes = classNames.leave;
+      await common_vendor.nextTick$1();
+      {
+        this.transitionEnded = false;
+        this.$emit("leave");
+        setTimeout(this.onTransitionEnd, this.duration);
+        this.classes = classNames["leave-to"];
+      }
+    },
+    // 完成过渡后触发
+    onTransitionEnd() {
+      if (this.transitionEnded)
+        return;
+      this.transitionEnded = true;
+      this.$emit(this.status === "leave" ? "afterLeave" : "afterEnter");
+      if (!this.show && this.display) {
+        this.display = false;
+        this.inited = false;
+      }
+    }
+  }
+};
+exports.transition = transition;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-transition/u-transition.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-transition/u-transition.js
new file mode 100644
index 0000000..675318b
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-transition/u-transition.js
@@ -0,0 +1,157 @@
+"use strict";
+const uni_modules_uviewPlus_components_uTransition_props = require("./props.js");
+const uni_modules_uviewPlus_libs_mixin_mpMixin = require("../../libs/mixin/mpMixin.js");
+const uni_modules_uviewPlus_libs_mixin_mixin = require("../../libs/mixin/mixin.js");
+const uni_modules_uviewPlus_libs_function_index = require("../../libs/function/index.js");
+const uni_modules_uviewPlus_components_uTransition_transition = require("./transition.js");
+const common_vendor = require("../../../../common/vendor.js");
+require("../../libs/config/props.js");
+require("../../libs/config/config.js");
+require("../../libs/config/props/actionSheet.js");
+require("../../libs/config/props/album.js");
+require("../../libs/config/props/alert.js");
+require("../../libs/config/props/avatar.js");
+require("../../libs/config/props/avatarGroup.js");
+require("../../libs/config/props/backtop.js");
+require("../../libs/config/props/badge.js");
+require("../../libs/config/props/button.js");
+require("../../libs/config/props/calendar.js");
+require("../../libs/config/props/carKeyboard.js");
+require("../../libs/config/props/cell.js");
+require("../../libs/config/props/cellGroup.js");
+require("../../libs/config/props/checkbox.js");
+require("../../libs/config/props/checkboxGroup.js");
+require("../../libs/config/props/circleProgress.js");
+require("../../libs/config/props/code.js");
+require("../../libs/config/props/codeInput.js");
+require("../../libs/config/props/col.js");
+require("../../libs/config/props/collapse.js");
+require("../../libs/config/props/collapseItem.js");
+require("../../libs/config/props/columnNotice.js");
+require("../../libs/config/props/countDown.js");
+require("../../libs/config/props/countTo.js");
+require("../../libs/config/props/datetimePicker.js");
+require("../../libs/config/props/divider.js");
+require("../../libs/config/props/empty.js");
+require("../../libs/config/props/form.js");
+require("../../libs/config/props/formItem.js");
+require("../../libs/config/props/gap.js");
+require("../../libs/config/props/grid.js");
+require("../../libs/config/props/gridItem.js");
+require("../../libs/config/props/icon.js");
+require("../../libs/config/props/image.js");
+require("../../libs/config/props/indexAnchor.js");
+require("../../libs/config/props/indexList.js");
+require("../../libs/config/props/input.js");
+require("../../libs/config/props/keyboard.js");
+require("../../libs/config/props/line.js");
+require("../../libs/config/props/lineProgress.js");
+require("../../libs/config/props/link.js");
+require("../../libs/config/props/list.js");
+require("../../libs/config/props/listItem.js");
+require("../../libs/config/props/loadingIcon.js");
+require("../../libs/config/props/loadingPage.js");
+require("../../libs/config/props/loadmore.js");
+require("../../libs/config/props/modal.js");
+require("../../libs/config/props/navbar.js");
+require("../../libs/config/color.js");
+require("../../libs/config/props/noNetwork.js");
+require("../../libs/config/props/noticeBar.js");
+require("../../libs/config/props/notify.js");
+require("../../libs/config/props/numberBox.js");
+require("../../libs/config/props/numberKeyboard.js");
+require("../../libs/config/props/overlay.js");
+require("../../libs/config/props/parse.js");
+require("../../libs/config/props/picker.js");
+require("../../libs/config/props/popup.js");
+require("../../libs/config/props/radio.js");
+require("../../libs/config/props/radioGroup.js");
+require("../../libs/config/props/rate.js");
+require("../../libs/config/props/readMore.js");
+require("../../libs/config/props/row.js");
+require("../../libs/config/props/rowNotice.js");
+require("../../libs/config/props/scrollList.js");
+require("../../libs/config/props/search.js");
+require("../../libs/config/props/section.js");
+require("../../libs/config/props/skeleton.js");
+require("../../libs/config/props/slider.js");
+require("../../libs/config/props/statusBar.js");
+require("../../libs/config/props/steps.js");
+require("../../libs/config/props/stepsItem.js");
+require("../../libs/config/props/sticky.js");
+require("../../libs/config/props/subsection.js");
+require("../../libs/config/props/swipeAction.js");
+require("../../libs/config/props/swipeActionItem.js");
+require("../../libs/config/props/swiper.js");
+require("../../libs/config/props/swipterIndicator.js");
+require("../../libs/config/props/switch.js");
+require("../../libs/config/props/tabbar.js");
+require("../../libs/config/props/tabbarItem.js");
+require("../../libs/config/props/tabs.js");
+require("../../libs/config/props/tag.js");
+require("../../libs/config/props/text.js");
+require("../../libs/config/props/textarea.js");
+require("../../libs/config/props/toast.js");
+require("../../libs/config/props/toolbar.js");
+require("../../libs/config/props/tooltip.js");
+require("../../libs/config/props/transition.js");
+require("../../libs/config/props/upload.js");
+require("../../libs/function/test.js");
+require("../../libs/util/route.js");
+require("../../libs/function/digit.js");
+const _sfc_main = {
+  name: "u-transition",
+  data() {
+    return {
+      inited: false,
+      // 是否显示/隐藏组件
+      viewStyle: {},
+      // 组件内部的样式
+      status: "",
+      // 记录组件动画的状态
+      transitionEnded: false,
+      // 组件是否结束的标记
+      display: false,
+      // 组件是否展示
+      classes: ""
+      // 应用的类名
+    };
+  },
+  emits: ["click", "beforeEnter", "enter", "afterEnter", "beforeLeave", "leave", "afterLeave"],
+  computed: {
+    mergeStyle() {
+      const { viewStyle, customStyle } = this;
+      return {
+        transitionDuration: `${this.duration}ms`,
+        // display: `${this.display ? '' : 'none'}`,
+        transitionTimingFunction: this.timingFunction,
+        // 避免自定义样式影响到动画属性,所以写在viewStyle前面
+        ...uni_modules_uviewPlus_libs_function_index.addStyle(customStyle),
+        ...viewStyle
+      };
+    }
+  },
+  // 将mixin挂在到组件中,实际上为一个vue格式对象。
+  mixins: [uni_modules_uviewPlus_libs_mixin_mpMixin.mpMixin, uni_modules_uviewPlus_libs_mixin_mixin.mixin, uni_modules_uviewPlus_components_uTransition_transition.transition, uni_modules_uviewPlus_components_uTransition_props.props],
+  watch: {
+    show: {
+      handler(newVal) {
+        newVal ? this.vueEnter() : this.vueLeave();
+      },
+      // 表示同时监听初始化时的props的show的意思
+      immediate: true
+    }
+  }
+};
+function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
+  return common_vendor.e({
+    a: $data.inited
+  }, $data.inited ? {
+    b: common_vendor.o((...args) => _ctx.clickHandler && _ctx.clickHandler(...args)),
+    c: common_vendor.n($data.classes),
+    d: common_vendor.s($options.mergeStyle),
+    e: common_vendor.o((...args) => _ctx.noop && _ctx.noop(...args))
+  } : {});
+}
+const Component = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-5cec8177"], ["__file", "D:/里海数字乡村/purchase-let/uni_modules/uview-plus/components/u-transition/u-transition.vue"]]);
+wx.createComponent(Component);
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-transition/u-transition.json b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-transition/u-transition.json
new file mode 100644
index 0000000..e8cfaaf
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-transition/u-transition.json
@@ -0,0 +1,4 @@
+{
+  "component": true,
+  "usingComponents": {}
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-transition/u-transition.wxml b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-transition/u-transition.wxml
new file mode 100644
index 0000000..3f40498
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-transition/u-transition.wxml
@@ -0,0 +1 @@
+<view wx:if="{{a}}" ref="u-transition" bindtap="{{b}}" class="{{['u-transition', 'data-v-5cec8177', c]}}" style="{{d}}" bindtouchmove="{{e}}"><slot/></view>
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-transition/u-transition.wxss b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-transition/u-transition.wxss
new file mode 100644
index 0000000..94c647f
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/components/u-transition/u-transition.wxss
@@ -0,0 +1,136 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+/* 颜色变量 */
+/* 行为相关颜色 */
+/* 文字基本颜色 */
+/* 背景颜色 */
+/* 边框颜色 */
+/* 尺寸变量 */
+/* 文字尺寸 */
+/* 图片尺寸 */
+/* Border Radius */
+/* 水平间距 */
+/* 垂直间距 */
+/* 透明度 */
+/* 文章场景相关 */
+.u-empty.data-v-5cec8177,
+.u-empty__wrap.data-v-5cec8177,
+.u-tabs.data-v-5cec8177,
+.u-tabs__wrapper.data-v-5cec8177,
+.u-tabs__wrapper__scroll-view-wrapper.data-v-5cec8177,
+.u-tabs__wrapper__scroll-view.data-v-5cec8177,
+.u-tabs__wrapper__nav.data-v-5cec8177,
+.u-tabs__wrapper__nav__line.data-v-5cec8177 {
+  display: flex;
+  flex-direction: column;
+  flex-shrink: 0;
+  flex-grow: 0;
+  flex-basis: auto;
+  align-items: stretch;
+  align-content: flex-start;
+}
+/**
+ * vue版本动画内置的动画模式有如下:
+ * fade:淡入
+ * zoom:缩放
+ * fade-zoom:缩放淡入
+ * fade-up:上滑淡入
+ * fade-down:下滑淡入
+ * fade-left:左滑淡入
+ * fade-right:右滑淡入
+ * slide-up:上滑进入
+ * slide-down:下滑进入
+ * slide-left:左滑进入
+ * slide-right:右滑进入
+ */
+.u-fade-enter-active.data-v-5cec8177,
+.u-fade-leave-active.data-v-5cec8177 {
+  transition-property: opacity;
+}
+.u-fade-enter.data-v-5cec8177,
+.u-fade-leave-to.data-v-5cec8177 {
+  opacity: 0;
+}
+.u-fade-zoom-enter.data-v-5cec8177,
+.u-fade-zoom-leave-to.data-v-5cec8177 {
+  transform: scale(0.95);
+  opacity: 0;
+}
+.u-fade-zoom-enter-active.data-v-5cec8177,
+.u-fade-zoom-leave-active.data-v-5cec8177 {
+  transition-property: transform, opacity;
+}
+.u-fade-down-enter-active.data-v-5cec8177,
+.u-fade-down-leave-active.data-v-5cec8177,
+.u-fade-left-enter-active.data-v-5cec8177,
+.u-fade-left-leave-active.data-v-5cec8177,
+.u-fade-right-enter-active.data-v-5cec8177,
+.u-fade-right-leave-active.data-v-5cec8177,
+.u-fade-up-enter-active.data-v-5cec8177,
+.u-fade-up-leave-active.data-v-5cec8177 {
+  transition-property: opacity, transform;
+}
+.u-fade-up-enter.data-v-5cec8177,
+.u-fade-up-leave-to.data-v-5cec8177 {
+  transform: translate3d(0, 100%, 0);
+  opacity: 0;
+}
+.u-fade-down-enter.data-v-5cec8177,
+.u-fade-down-leave-to.data-v-5cec8177 {
+  transform: translate3d(0, -100%, 0);
+  opacity: 0;
+}
+.u-fade-left-enter.data-v-5cec8177,
+.u-fade-left-leave-to.data-v-5cec8177 {
+  transform: translate3d(-100%, 0, 0);
+  opacity: 0;
+}
+.u-fade-right-enter.data-v-5cec8177,
+.u-fade-right-leave-to.data-v-5cec8177 {
+  transform: translate3d(100%, 0, 0);
+  opacity: 0;
+}
+.u-slide-down-enter-active.data-v-5cec8177,
+.u-slide-down-leave-active.data-v-5cec8177,
+.u-slide-left-enter-active.data-v-5cec8177,
+.u-slide-left-leave-active.data-v-5cec8177,
+.u-slide-right-enter-active.data-v-5cec8177,
+.u-slide-right-leave-active.data-v-5cec8177,
+.u-slide-up-enter-active.data-v-5cec8177,
+.u-slide-up-leave-active.data-v-5cec8177 {
+  transition-property: transform;
+}
+.u-slide-up-enter.data-v-5cec8177,
+.u-slide-up-leave-to.data-v-5cec8177 {
+  transform: translate3d(0, 100%, 0);
+}
+.u-slide-down-enter.data-v-5cec8177,
+.u-slide-down-leave-to.data-v-5cec8177 {
+  transform: translate3d(0, -100%, 0);
+}
+.u-slide-left-enter.data-v-5cec8177,
+.u-slide-left-leave-to.data-v-5cec8177 {
+  transform: translate3d(-100%, 0, 0);
+}
+.u-slide-right-enter.data-v-5cec8177,
+.u-slide-right-leave-to.data-v-5cec8177 {
+  transform: translate3d(100%, 0, 0);
+}
+.u-zoom-enter-active.data-v-5cec8177,
+.u-zoom-leave-active.data-v-5cec8177 {
+  transition-property: transform;
+}
+.u-zoom-enter.data-v-5cec8177,
+.u-zoom-leave-to.data-v-5cec8177 {
+  transform: scale(0.95);
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/index.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/index.js
new file mode 100644
index 0000000..a860c5b
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/index.js
@@ -0,0 +1,57 @@
+"use strict";
+const common_vendor = require("../../common/vendor.js");
+const uni_modules_uviewPlus_libs_mixin_mixin = require("./libs/mixin/mixin.js");
+const uni_modules_uviewPlus_libs_mixin_mpMixin = require("./libs/mixin/mpMixin.js");
+const uni_modules_uviewPlus_libs_luchRequest_core_Request = require("./libs/luch-request/core/Request.js");
+const uni_modules_uviewPlus_libs_util_route = require("./libs/util/route.js");
+const uni_modules_uviewPlus_libs_function_colorGradient = require("./libs/function/colorGradient.js");
+const uni_modules_uviewPlus_libs_function_test = require("./libs/function/test.js");
+const uni_modules_uviewPlus_libs_function_debounce = require("./libs/function/debounce.js");
+const uni_modules_uviewPlus_libs_function_throttle = require("./libs/function/throttle.js");
+const uni_modules_uviewPlus_libs_function_index = require("./libs/function/index.js");
+const uni_modules_uviewPlus_libs_config_config = require("./libs/config/config.js");
+const uni_modules_uviewPlus_libs_config_props = require("./libs/config/props.js");
+const uni_modules_uviewPlus_libs_config_zIndex = require("./libs/config/zIndex.js");
+const uni_modules_uviewPlus_libs_config_color = require("./libs/config/color.js");
+const uni_modules_uviewPlus_libs_function_platform = require("./libs/function/platform.js");
+const http = new uni_modules_uviewPlus_libs_luchRequest_core_Request.Request();
+let themeType = ["primary", "success", "error", "warning", "info"];
+function setConfig(configs) {
+  uni_modules_uviewPlus_libs_function_index.index.shallowMerge(uni_modules_uviewPlus_libs_config_config.config, configs.config || {});
+  uni_modules_uviewPlus_libs_function_index.index.shallowMerge(uni_modules_uviewPlus_libs_config_props.defProps, configs.props || {});
+  uni_modules_uviewPlus_libs_function_index.index.shallowMerge(uni_modules_uviewPlus_libs_config_color.color, configs.color || {});
+  uni_modules_uviewPlus_libs_function_index.index.shallowMerge(uni_modules_uviewPlus_libs_config_zIndex.zIndex, configs.zIndex || {});
+}
+uni_modules_uviewPlus_libs_function_index.index.setConfig = setConfig;
+const $u = {
+  route: uni_modules_uviewPlus_libs_util_route.route,
+  date: uni_modules_uviewPlus_libs_function_index.index.timeFormat,
+  // 另名date
+  colorGradient: uni_modules_uviewPlus_libs_function_colorGradient.colorGradient.colorGradient,
+  hexToRgb: uni_modules_uviewPlus_libs_function_colorGradient.colorGradient.hexToRgb,
+  rgbToHex: uni_modules_uviewPlus_libs_function_colorGradient.colorGradient.rgbToHex,
+  colorToRgba: uni_modules_uviewPlus_libs_function_colorGradient.colorGradient.colorToRgba,
+  test: uni_modules_uviewPlus_libs_function_test.test,
+  type: themeType,
+  http,
+  config: uni_modules_uviewPlus_libs_config_config.config,
+  // uview-plus配置信息相关,比如版本号
+  zIndex: uni_modules_uviewPlus_libs_config_zIndex.zIndex,
+  debounce: uni_modules_uviewPlus_libs_function_debounce.debounce,
+  throttle: uni_modules_uviewPlus_libs_function_throttle.throttle,
+  mixin: uni_modules_uviewPlus_libs_mixin_mixin.mixin,
+  mpMixin: uni_modules_uviewPlus_libs_mixin_mpMixin.mpMixin,
+  props: uni_modules_uviewPlus_libs_config_props.defProps,
+  ...uni_modules_uviewPlus_libs_function_index.index,
+  color: uni_modules_uviewPlus_libs_config_color.color,
+  platform: uni_modules_uviewPlus_libs_function_platform.platform
+};
+common_vendor.index.$u = $u;
+const install = (Vue) => {
+  Vue.config.globalProperties.$u = $u;
+  Vue.mixin(uni_modules_uviewPlus_libs_mixin_mixin.mixin);
+};
+const uviewPlus = {
+  install
+};
+exports.uviewPlus = uviewPlus;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/color.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/color.js
new file mode 100644
index 0000000..4b22b1b
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/color.js
@@ -0,0 +1,15 @@
+"use strict";
+const color = {
+  primary: "#3c9cff",
+  info: "#909399",
+  default: "#909399",
+  warning: "#f9ae3d",
+  error: "#f56c6c",
+  success: "#5ac725",
+  mainColor: "#303133",
+  contentColor: "#606266",
+  tipsColor: "#909399",
+  lightColor: "#c0c4cc",
+  borderColor: "#e4e7ed"
+};
+exports.color = color;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/config.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/config.js
new file mode 100644
index 0000000..b27b988
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/config.js
@@ -0,0 +1,35 @@
+"use strict";
+const version = "3";
+{
+  console.log(`
+ %c uview-plus V${version} %c https://ijry.github.io/uview-plus/ 
+
+`, "color: #ffffff; background: #3c9cff; padding:5px 0;", "color: #3c9cff;background: #ffffff; padding:5px 0;");
+}
+const config = {
+  v: version,
+  version,
+  // 主题名称
+  type: [
+    "primary",
+    "success",
+    "info",
+    "error",
+    "warning"
+  ],
+  // 颜色部分,本来可以通过scss的:export导出供js使用,但是奈何nvue不支持
+  color: {
+    "u-primary": "#2979ff",
+    "u-warning": "#ff9900",
+    "u-success": "#19be6b",
+    "u-error": "#fa3534",
+    "u-info": "#909399",
+    "u-main-color": "#303133",
+    "u-content-color": "#606266",
+    "u-tips-color": "#909399",
+    "u-light-color": "#c0c4cc"
+  },
+  // 默认单位,可以通过配置为rpx,那么在用于传入组件大小参数为数值时,就默认为rpx
+  unit: "px"
+};
+exports.config = config;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props.js
new file mode 100644
index 0000000..702e202
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props.js
@@ -0,0 +1,181 @@
+"use strict";
+require("./config.js");
+const uni_modules_uviewPlus_libs_config_props_actionSheet = require("./props/actionSheet.js");
+const uni_modules_uviewPlus_libs_config_props_album = require("./props/album.js");
+const uni_modules_uviewPlus_libs_config_props_alert = require("./props/alert.js");
+const uni_modules_uviewPlus_libs_config_props_avatar = require("./props/avatar.js");
+const uni_modules_uviewPlus_libs_config_props_avatarGroup = require("./props/avatarGroup.js");
+const uni_modules_uviewPlus_libs_config_props_backtop = require("./props/backtop.js");
+const uni_modules_uviewPlus_libs_config_props_badge = require("./props/badge.js");
+const uni_modules_uviewPlus_libs_config_props_button = require("./props/button.js");
+const uni_modules_uviewPlus_libs_config_props_calendar = require("./props/calendar.js");
+const uni_modules_uviewPlus_libs_config_props_carKeyboard = require("./props/carKeyboard.js");
+const uni_modules_uviewPlus_libs_config_props_cell = require("./props/cell.js");
+const uni_modules_uviewPlus_libs_config_props_cellGroup = require("./props/cellGroup.js");
+const uni_modules_uviewPlus_libs_config_props_checkbox = require("./props/checkbox.js");
+const uni_modules_uviewPlus_libs_config_props_checkboxGroup = require("./props/checkboxGroup.js");
+const uni_modules_uviewPlus_libs_config_props_circleProgress = require("./props/circleProgress.js");
+const uni_modules_uviewPlus_libs_config_props_code = require("./props/code.js");
+const uni_modules_uviewPlus_libs_config_props_codeInput = require("./props/codeInput.js");
+const uni_modules_uviewPlus_libs_config_props_col = require("./props/col.js");
+const uni_modules_uviewPlus_libs_config_props_collapse = require("./props/collapse.js");
+const uni_modules_uviewPlus_libs_config_props_collapseItem = require("./props/collapseItem.js");
+const uni_modules_uviewPlus_libs_config_props_columnNotice = require("./props/columnNotice.js");
+const uni_modules_uviewPlus_libs_config_props_countDown = require("./props/countDown.js");
+const uni_modules_uviewPlus_libs_config_props_countTo = require("./props/countTo.js");
+const uni_modules_uviewPlus_libs_config_props_datetimePicker = require("./props/datetimePicker.js");
+const uni_modules_uviewPlus_libs_config_props_divider = require("./props/divider.js");
+const uni_modules_uviewPlus_libs_config_props_empty = require("./props/empty.js");
+const uni_modules_uviewPlus_libs_config_props_form = require("./props/form.js");
+const uni_modules_uviewPlus_libs_config_props_formItem = require("./props/formItem.js");
+const uni_modules_uviewPlus_libs_config_props_gap = require("./props/gap.js");
+const uni_modules_uviewPlus_libs_config_props_grid = require("./props/grid.js");
+const uni_modules_uviewPlus_libs_config_props_gridItem = require("./props/gridItem.js");
+const uni_modules_uviewPlus_libs_config_props_icon = require("./props/icon.js");
+const uni_modules_uviewPlus_libs_config_props_image = require("./props/image.js");
+const uni_modules_uviewPlus_libs_config_props_indexAnchor = require("./props/indexAnchor.js");
+const uni_modules_uviewPlus_libs_config_props_indexList = require("./props/indexList.js");
+const uni_modules_uviewPlus_libs_config_props_input = require("./props/input.js");
+const uni_modules_uviewPlus_libs_config_props_keyboard = require("./props/keyboard.js");
+const uni_modules_uviewPlus_libs_config_props_line = require("./props/line.js");
+const uni_modules_uviewPlus_libs_config_props_lineProgress = require("./props/lineProgress.js");
+const uni_modules_uviewPlus_libs_config_props_link = require("./props/link.js");
+const uni_modules_uviewPlus_libs_config_props_list = require("./props/list.js");
+const uni_modules_uviewPlus_libs_config_props_listItem = require("./props/listItem.js");
+const uni_modules_uviewPlus_libs_config_props_loadingIcon = require("./props/loadingIcon.js");
+const uni_modules_uviewPlus_libs_config_props_loadingPage = require("./props/loadingPage.js");
+const uni_modules_uviewPlus_libs_config_props_loadmore = require("./props/loadmore.js");
+const uni_modules_uviewPlus_libs_config_props_modal = require("./props/modal.js");
+const uni_modules_uviewPlus_libs_config_props_navbar = require("./props/navbar.js");
+const uni_modules_uviewPlus_libs_config_props_noNetwork = require("./props/noNetwork.js");
+const uni_modules_uviewPlus_libs_config_props_noticeBar = require("./props/noticeBar.js");
+const uni_modules_uviewPlus_libs_config_props_notify = require("./props/notify.js");
+const uni_modules_uviewPlus_libs_config_props_numberBox = require("./props/numberBox.js");
+const uni_modules_uviewPlus_libs_config_props_numberKeyboard = require("./props/numberKeyboard.js");
+const uni_modules_uviewPlus_libs_config_props_overlay = require("./props/overlay.js");
+const uni_modules_uviewPlus_libs_config_props_parse = require("./props/parse.js");
+const uni_modules_uviewPlus_libs_config_props_picker = require("./props/picker.js");
+const uni_modules_uviewPlus_libs_config_props_popup = require("./props/popup.js");
+const uni_modules_uviewPlus_libs_config_props_radio = require("./props/radio.js");
+const uni_modules_uviewPlus_libs_config_props_radioGroup = require("./props/radioGroup.js");
+const uni_modules_uviewPlus_libs_config_props_rate = require("./props/rate.js");
+const uni_modules_uviewPlus_libs_config_props_readMore = require("./props/readMore.js");
+const uni_modules_uviewPlus_libs_config_props_row = require("./props/row.js");
+const uni_modules_uviewPlus_libs_config_props_rowNotice = require("./props/rowNotice.js");
+const uni_modules_uviewPlus_libs_config_props_scrollList = require("./props/scrollList.js");
+const uni_modules_uviewPlus_libs_config_props_search = require("./props/search.js");
+const uni_modules_uviewPlus_libs_config_props_section = require("./props/section.js");
+const uni_modules_uviewPlus_libs_config_props_skeleton = require("./props/skeleton.js");
+const uni_modules_uviewPlus_libs_config_props_slider = require("./props/slider.js");
+const uni_modules_uviewPlus_libs_config_props_statusBar = require("./props/statusBar.js");
+const uni_modules_uviewPlus_libs_config_props_steps = require("./props/steps.js");
+const uni_modules_uviewPlus_libs_config_props_stepsItem = require("./props/stepsItem.js");
+const uni_modules_uviewPlus_libs_config_props_sticky = require("./props/sticky.js");
+const uni_modules_uviewPlus_libs_config_props_subsection = require("./props/subsection.js");
+const uni_modules_uviewPlus_libs_config_props_swipeAction = require("./props/swipeAction.js");
+const uni_modules_uviewPlus_libs_config_props_swipeActionItem = require("./props/swipeActionItem.js");
+const uni_modules_uviewPlus_libs_config_props_swiper = require("./props/swiper.js");
+const uni_modules_uviewPlus_libs_config_props_swipterIndicator = require("./props/swipterIndicator.js");
+const uni_modules_uviewPlus_libs_config_props_switch = require("./props/switch.js");
+const uni_modules_uviewPlus_libs_config_props_tabbar = require("./props/tabbar.js");
+const uni_modules_uviewPlus_libs_config_props_tabbarItem = require("./props/tabbarItem.js");
+const uni_modules_uviewPlus_libs_config_props_tabs = require("./props/tabs.js");
+const uni_modules_uviewPlus_libs_config_props_tag = require("./props/tag.js");
+const uni_modules_uviewPlus_libs_config_props_text = require("./props/text.js");
+const uni_modules_uviewPlus_libs_config_props_textarea = require("./props/textarea.js");
+const uni_modules_uviewPlus_libs_config_props_toast = require("./props/toast.js");
+const uni_modules_uviewPlus_libs_config_props_toolbar = require("./props/toolbar.js");
+const uni_modules_uviewPlus_libs_config_props_tooltip = require("./props/tooltip.js");
+const uni_modules_uviewPlus_libs_config_props_transition = require("./props/transition.js");
+const uni_modules_uviewPlus_libs_config_props_upload = require("./props/upload.js");
+const defProps = {
+  ...uni_modules_uviewPlus_libs_config_props_actionSheet.ActionSheet,
+  ...uni_modules_uviewPlus_libs_config_props_album.Album,
+  ...uni_modules_uviewPlus_libs_config_props_alert.Alert,
+  ...uni_modules_uviewPlus_libs_config_props_avatar.Avatar,
+  ...uni_modules_uviewPlus_libs_config_props_avatarGroup.AvatarGroup,
+  ...uni_modules_uviewPlus_libs_config_props_backtop.Backtop,
+  ...uni_modules_uviewPlus_libs_config_props_badge.Badge,
+  ...uni_modules_uviewPlus_libs_config_props_button.Button,
+  ...uni_modules_uviewPlus_libs_config_props_calendar.Calendar,
+  ...uni_modules_uviewPlus_libs_config_props_carKeyboard.CarKeyboard,
+  ...uni_modules_uviewPlus_libs_config_props_cell.Cell,
+  ...uni_modules_uviewPlus_libs_config_props_cellGroup.CellGroup,
+  ...uni_modules_uviewPlus_libs_config_props_checkbox.Checkbox,
+  ...uni_modules_uviewPlus_libs_config_props_checkboxGroup.CheckboxGroup,
+  ...uni_modules_uviewPlus_libs_config_props_circleProgress.CircleProgress,
+  ...uni_modules_uviewPlus_libs_config_props_code.Code,
+  ...uni_modules_uviewPlus_libs_config_props_codeInput.CodeInput,
+  ...uni_modules_uviewPlus_libs_config_props_col.Col,
+  ...uni_modules_uviewPlus_libs_config_props_collapse.Collapse,
+  ...uni_modules_uviewPlus_libs_config_props_collapseItem.CollapseItem,
+  ...uni_modules_uviewPlus_libs_config_props_columnNotice.ColumnNotice,
+  ...uni_modules_uviewPlus_libs_config_props_countDown.CountDown,
+  ...uni_modules_uviewPlus_libs_config_props_countTo.CountTo,
+  ...uni_modules_uviewPlus_libs_config_props_datetimePicker.DatetimePicker,
+  ...uni_modules_uviewPlus_libs_config_props_divider.Divider,
+  ...uni_modules_uviewPlus_libs_config_props_empty.Empty,
+  ...uni_modules_uviewPlus_libs_config_props_form.Form,
+  ...uni_modules_uviewPlus_libs_config_props_formItem.GormItem,
+  ...uni_modules_uviewPlus_libs_config_props_gap.Gap,
+  ...uni_modules_uviewPlus_libs_config_props_grid.Grid,
+  ...uni_modules_uviewPlus_libs_config_props_gridItem.GridItem,
+  ...uni_modules_uviewPlus_libs_config_props_icon.Icon,
+  ...uni_modules_uviewPlus_libs_config_props_image.Image,
+  ...uni_modules_uviewPlus_libs_config_props_indexAnchor.IndexAnchor,
+  ...uni_modules_uviewPlus_libs_config_props_indexList.IndexList,
+  ...uni_modules_uviewPlus_libs_config_props_input.Input,
+  ...uni_modules_uviewPlus_libs_config_props_keyboard.Keyboard,
+  ...uni_modules_uviewPlus_libs_config_props_line.Line,
+  ...uni_modules_uviewPlus_libs_config_props_lineProgress.LineProgress,
+  ...uni_modules_uviewPlus_libs_config_props_link.Link,
+  ...uni_modules_uviewPlus_libs_config_props_list.List,
+  ...uni_modules_uviewPlus_libs_config_props_listItem.ListItem,
+  ...uni_modules_uviewPlus_libs_config_props_loadingIcon.LoadingIcon,
+  ...uni_modules_uviewPlus_libs_config_props_loadingPage.LoadingPage,
+  ...uni_modules_uviewPlus_libs_config_props_loadmore.Loadmore,
+  ...uni_modules_uviewPlus_libs_config_props_modal.Modal,
+  ...uni_modules_uviewPlus_libs_config_props_navbar.Navbar,
+  ...uni_modules_uviewPlus_libs_config_props_noNetwork.NoNetwork,
+  ...uni_modules_uviewPlus_libs_config_props_noticeBar.NoticeBar,
+  ...uni_modules_uviewPlus_libs_config_props_notify.Notify,
+  ...uni_modules_uviewPlus_libs_config_props_numberBox.NumberBox,
+  ...uni_modules_uviewPlus_libs_config_props_numberKeyboard.NumberKeyboard,
+  ...uni_modules_uviewPlus_libs_config_props_overlay.Overlay,
+  ...uni_modules_uviewPlus_libs_config_props_parse.Parse,
+  ...uni_modules_uviewPlus_libs_config_props_picker.Picker,
+  ...uni_modules_uviewPlus_libs_config_props_popup.Popup,
+  ...uni_modules_uviewPlus_libs_config_props_radio.Radio,
+  ...uni_modules_uviewPlus_libs_config_props_radioGroup.RadioGroup,
+  ...uni_modules_uviewPlus_libs_config_props_rate.Rate,
+  ...uni_modules_uviewPlus_libs_config_props_readMore.ReadMore,
+  ...uni_modules_uviewPlus_libs_config_props_row.Row,
+  ...uni_modules_uviewPlus_libs_config_props_rowNotice.RowNotice,
+  ...uni_modules_uviewPlus_libs_config_props_scrollList.ScrollList,
+  ...uni_modules_uviewPlus_libs_config_props_search.Search,
+  ...uni_modules_uviewPlus_libs_config_props_section.Section,
+  ...uni_modules_uviewPlus_libs_config_props_skeleton.Skeleton,
+  ...uni_modules_uviewPlus_libs_config_props_slider.Slider,
+  ...uni_modules_uviewPlus_libs_config_props_statusBar.StatusBar,
+  ...uni_modules_uviewPlus_libs_config_props_steps.Steps,
+  ...uni_modules_uviewPlus_libs_config_props_stepsItem.StepsItem,
+  ...uni_modules_uviewPlus_libs_config_props_sticky.Sticky,
+  ...uni_modules_uviewPlus_libs_config_props_subsection.Subsection,
+  ...uni_modules_uviewPlus_libs_config_props_swipeAction.SwipeAction,
+  ...uni_modules_uviewPlus_libs_config_props_swipeActionItem.SwipeActionItem,
+  ...uni_modules_uviewPlus_libs_config_props_swiper.Swiper,
+  ...uni_modules_uviewPlus_libs_config_props_swipterIndicator.SwipterIndicator,
+  ...uni_modules_uviewPlus_libs_config_props_switch.Switch,
+  ...uni_modules_uviewPlus_libs_config_props_tabbar.Tabbar,
+  ...uni_modules_uviewPlus_libs_config_props_tabbarItem.TabbarItem,
+  ...uni_modules_uviewPlus_libs_config_props_tabs.Tabs,
+  ...uni_modules_uviewPlus_libs_config_props_tag.Tag,
+  ...uni_modules_uviewPlus_libs_config_props_text.Text,
+  ...uni_modules_uviewPlus_libs_config_props_textarea.Textarea,
+  ...uni_modules_uviewPlus_libs_config_props_toast.Toast,
+  ...uni_modules_uviewPlus_libs_config_props_toolbar.Toolbar,
+  ...uni_modules_uviewPlus_libs_config_props_tooltip.Tooltip,
+  ...uni_modules_uviewPlus_libs_config_props_transition.Transition,
+  ...uni_modules_uviewPlus_libs_config_props_upload.Upload
+};
+exports.defProps = defProps;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/actionSheet.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/actionSheet.js
new file mode 100644
index 0000000..8f43f6d
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/actionSheet.js
@@ -0,0 +1,18 @@
+"use strict";
+const ActionSheet = {
+  // action-sheet组件
+  actionSheet: {
+    show: false,
+    title: "",
+    description: "",
+    actions: [],
+    index: "",
+    cancelText: "",
+    closeOnClickAction: true,
+    safeAreaInsetBottom: true,
+    openType: "",
+    closeOnClickOverlay: true,
+    round: 0
+  }
+};
+exports.ActionSheet = ActionSheet;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/album.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/album.js
new file mode 100644
index 0000000..43c5de3
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/album.js
@@ -0,0 +1,18 @@
+"use strict";
+const Album = {
+  // album 组件
+  album: {
+    urls: [],
+    keyName: "",
+    singleSize: 180,
+    multipleSize: 70,
+    space: 6,
+    singleMode: "scaleToFill",
+    multipleMode: "aspectFill",
+    maxCount: 9,
+    previewFullImage: true,
+    rowCount: 3,
+    showMore: true
+  }
+};
+exports.Album = Album;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/alert.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/alert.js
new file mode 100644
index 0000000..3c050f0
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/alert.js
@@ -0,0 +1,15 @@
+"use strict";
+const Alert = {
+  // alert警告组件
+  alert: {
+    title: "",
+    type: "warning",
+    description: "",
+    closable: false,
+    showIcon: false,
+    effect: "light",
+    center: false,
+    fontSize: 14
+  }
+};
+exports.Alert = Alert;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/avatar.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/avatar.js
new file mode 100644
index 0000000..adb967f
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/avatar.js
@@ -0,0 +1,21 @@
+"use strict";
+const Avatar = {
+  // avatar 组件
+  avatar: {
+    src: "",
+    shape: "circle",
+    size: 40,
+    mode: "scaleToFill",
+    text: "",
+    bgColor: "#c0c4cc",
+    color: "#ffffff",
+    fontSize: 18,
+    icon: "",
+    mpAvatar: false,
+    randomBgColor: false,
+    defaultUrl: "",
+    colorIndex: "",
+    name: ""
+  }
+};
+exports.Avatar = Avatar;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/avatarGroup.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/avatarGroup.js
new file mode 100644
index 0000000..72feff8
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/avatarGroup.js
@@ -0,0 +1,16 @@
+"use strict";
+const AvatarGroup = {
+  // avatarGroup 组件
+  avatarGroup: {
+    urls: [],
+    maxCount: 5,
+    shape: "circle",
+    mode: "scaleToFill",
+    showMore: true,
+    size: 40,
+    keyName: "",
+    gap: 0.5,
+    extraValue: 0
+  }
+};
+exports.AvatarGroup = AvatarGroup;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/backtop.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/backtop.js
new file mode 100644
index 0000000..2059f38
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/backtop.js
@@ -0,0 +1,20 @@
+"use strict";
+const Backtop = {
+  // backtop组件
+  backtop: {
+    mode: "circle",
+    icon: "arrow-upward",
+    text: "",
+    duration: 100,
+    scrollTop: 0,
+    top: 400,
+    bottom: 100,
+    right: 20,
+    zIndex: 9,
+    iconStyle: {
+      color: "#909399",
+      fontSize: "19px"
+    }
+  }
+};
+exports.Backtop = Backtop;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/badge.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/badge.js
new file mode 100644
index 0000000..fdd6e11
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/badge.js
@@ -0,0 +1,20 @@
+"use strict";
+const Badge = {
+  // 徽标数组件
+  badge: {
+    isDot: false,
+    value: "",
+    show: true,
+    max: 999,
+    type: "error",
+    showZero: false,
+    bgColor: null,
+    color: null,
+    shape: "circle",
+    numberType: "overflow",
+    offset: [],
+    inverted: false,
+    absolute: false
+  }
+};
+exports.Badge = Badge;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/button.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/button.js
new file mode 100644
index 0000000..19cb822
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/button.js
@@ -0,0 +1,35 @@
+"use strict";
+const Button = {
+  // button组件
+  button: {
+    hairline: false,
+    type: "info",
+    size: "normal",
+    shape: "square",
+    plain: false,
+    disabled: false,
+    loading: false,
+    loadingText: "",
+    loadingMode: "spinner",
+    loadingSize: 15,
+    openType: "",
+    formType: "",
+    appParameter: "",
+    hoverStopPropagation: true,
+    lang: "en",
+    sessionFrom: "",
+    sendMessageTitle: "",
+    sendMessagePath: "",
+    sendMessageImg: "",
+    showMessageCard: false,
+    dataName: "",
+    throttleTime: 0,
+    hoverStartTime: 0,
+    hoverStayTime: 200,
+    text: "",
+    icon: "",
+    iconColor: "",
+    color: ""
+  }
+};
+exports.Button = Button;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/calendar.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/calendar.js
new file mode 100644
index 0000000..e2ae09f
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/calendar.js
@@ -0,0 +1,37 @@
+"use strict";
+const Calendar = {
+  // calendar 组件
+  calendar: {
+    title: "日期选择",
+    showTitle: true,
+    showSubtitle: true,
+    mode: "single",
+    startText: "开始",
+    endText: "结束",
+    customList: [],
+    color: "#3c9cff",
+    minDate: 0,
+    maxDate: 0,
+    defaultDate: null,
+    maxCount: Number.MAX_SAFE_INTEGER,
+    // Infinity
+    rowHeight: 56,
+    formatter: null,
+    showLunar: false,
+    showMark: true,
+    confirmText: "确定",
+    confirmDisabledText: "确定",
+    show: false,
+    closeOnClickOverlay: false,
+    readonly: false,
+    showConfirm: true,
+    maxRange: Number.MAX_SAFE_INTEGER,
+    // Infinity
+    rangePrompt: "",
+    showRangePrompt: true,
+    allowSameDay: false,
+    round: 0,
+    monthNum: 3
+  }
+};
+exports.Calendar = Calendar;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/carKeyboard.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/carKeyboard.js
new file mode 100644
index 0000000..3f93147
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/carKeyboard.js
@@ -0,0 +1,8 @@
+"use strict";
+const CarKeyboard = {
+  // 车牌号键盘
+  carKeyboard: {
+    random: false
+  }
+};
+exports.CarKeyboard = CarKeyboard;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/cell.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/cell.js
new file mode 100644
index 0000000..c62d23b
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/cell.js
@@ -0,0 +1,28 @@
+"use strict";
+const Cell = {
+  // cell组件的props
+  cell: {
+    customClass: "",
+    title: "",
+    label: "",
+    value: "",
+    icon: "",
+    disabled: false,
+    border: true,
+    center: false,
+    url: "",
+    linkType: "navigateTo",
+    clickable: false,
+    isLink: false,
+    required: false,
+    arrowDirection: "",
+    iconStyle: {},
+    rightIconStyle: {},
+    rightIcon: "arrow-right",
+    titleStyle: {},
+    size: "",
+    stop: true,
+    name: ""
+  }
+};
+exports.Cell = Cell;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/cellGroup.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/cellGroup.js
new file mode 100644
index 0000000..2c2543e
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/cellGroup.js
@@ -0,0 +1,10 @@
+"use strict";
+const CellGroup = {
+  // cell-group组件的props
+  cellGroup: {
+    title: "",
+    border: true,
+    customStyle: {}
+  }
+};
+exports.CellGroup = CellGroup;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/checkbox.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/checkbox.js
new file mode 100644
index 0000000..1780b45
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/checkbox.js
@@ -0,0 +1,20 @@
+"use strict";
+const Checkbox = {
+  // checkbox组件
+  checkbox: {
+    name: "",
+    shape: "",
+    size: "",
+    checkbox: false,
+    disabled: "",
+    activeColor: "",
+    inactiveColor: "",
+    iconSize: "",
+    iconColor: "",
+    label: "",
+    labelSize: "",
+    labelColor: "",
+    labelDisabled: ""
+  }
+};
+exports.Checkbox = Checkbox;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/checkboxGroup.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/checkboxGroup.js
new file mode 100644
index 0000000..bbd71e6
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/checkboxGroup.js
@@ -0,0 +1,22 @@
+"use strict";
+const CheckboxGroup = {
+  // checkbox-group组件
+  checkboxGroup: {
+    name: "",
+    value: [],
+    shape: "square",
+    disabled: false,
+    activeColor: "#2979ff",
+    inactiveColor: "#c8c9cc",
+    size: 18,
+    placement: "row",
+    labelSize: 14,
+    labelColor: "#303133",
+    labelDisabled: false,
+    iconColor: "#ffffff",
+    iconSize: 12,
+    iconPlacement: "left",
+    borderBottom: false
+  }
+};
+exports.CheckboxGroup = CheckboxGroup;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/circleProgress.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/circleProgress.js
new file mode 100644
index 0000000..e413aa9
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/circleProgress.js
@@ -0,0 +1,8 @@
+"use strict";
+const CircleProgress = {
+  // circleProgress 组件
+  circleProgress: {
+    percentage: 30
+  }
+};
+exports.CircleProgress = CircleProgress;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/code.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/code.js
new file mode 100644
index 0000000..c4dad2d
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/code.js
@@ -0,0 +1,13 @@
+"use strict";
+const Code = {
+  // code 组件
+  code: {
+    seconds: 60,
+    startText: "获取验证码",
+    changeText: "X秒重新获取",
+    endText: "重新获取",
+    keepRunning: false,
+    uniqueKey: ""
+  }
+};
+exports.Code = Code;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/codeInput.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/codeInput.js
new file mode 100644
index 0000000..0d45915
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/codeInput.js
@@ -0,0 +1,22 @@
+"use strict";
+const CodeInput = {
+  // codeInput 组件
+  codeInput: {
+    adjustPosition: true,
+    maxlength: 6,
+    dot: false,
+    mode: "box",
+    hairline: false,
+    space: 10,
+    value: "",
+    focus: false,
+    bold: false,
+    color: "#606266",
+    fontSize: 18,
+    size: 35,
+    disabledKeyboard: false,
+    borderColor: "#c9cacc",
+    disabledDot: true
+  }
+};
+exports.CodeInput = CodeInput;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/col.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/col.js
new file mode 100644
index 0000000..821f3e0
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/col.js
@@ -0,0 +1,12 @@
+"use strict";
+const Col = {
+  // col 组件
+  col: {
+    span: 12,
+    offset: 0,
+    justify: "start",
+    align: "stretch",
+    textAlign: "left"
+  }
+};
+exports.Col = Col;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/collapse.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/collapse.js
new file mode 100644
index 0000000..5a12af0
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/collapse.js
@@ -0,0 +1,10 @@
+"use strict";
+const Collapse = {
+  // collapse 组件
+  collapse: {
+    value: null,
+    accordion: false,
+    border: true
+  }
+};
+exports.Collapse = Collapse;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/collapseItem.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/collapseItem.js
new file mode 100644
index 0000000..b992c63
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/collapseItem.js
@@ -0,0 +1,18 @@
+"use strict";
+const CollapseItem = {
+  // collapseItem 组件
+  collapseItem: {
+    title: "",
+    value: "",
+    label: "",
+    disabled: false,
+    isLink: true,
+    clickable: true,
+    border: true,
+    align: "left",
+    name: "",
+    icon: "",
+    duration: 300
+  }
+};
+exports.CollapseItem = CollapseItem;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/columnNotice.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/columnNotice.js
new file mode 100644
index 0000000..865db55
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/columnNotice.js
@@ -0,0 +1,17 @@
+"use strict";
+const ColumnNotice = {
+  // columnNotice 组件
+  columnNotice: {
+    text: "",
+    icon: "volume",
+    mode: "",
+    color: "#f9ae3d",
+    bgColor: "#fdf6ec",
+    fontSize: 14,
+    speed: 80,
+    step: false,
+    duration: 1500,
+    disableTouch: true
+  }
+};
+exports.ColumnNotice = ColumnNotice;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/countDown.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/countDown.js
new file mode 100644
index 0000000..27fb20c
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/countDown.js
@@ -0,0 +1,11 @@
+"use strict";
+const CountDown = {
+  // u-count-down 计时器组件
+  countDown: {
+    time: 0,
+    format: "HH:mm:ss",
+    autoStart: true,
+    millisecond: false
+  }
+};
+exports.CountDown = CountDown;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/countTo.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/countTo.js
new file mode 100644
index 0000000..8346e31
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/countTo.js
@@ -0,0 +1,18 @@
+"use strict";
+const CountTo = {
+  // countTo 组件
+  countTo: {
+    startVal: 0,
+    endVal: 0,
+    duration: 2e3,
+    autoplay: true,
+    decimals: 0,
+    useEasing: true,
+    decimal: ".",
+    color: "#606266",
+    fontSize: 22,
+    bold: false,
+    separator: ""
+  }
+};
+exports.CountTo = CountTo;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/datetimePicker.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/datetimePicker.js
new file mode 100644
index 0000000..42fc474
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/datetimePicker.js
@@ -0,0 +1,30 @@
+"use strict";
+const DatetimePicker = {
+  // datetimePicker 组件
+  datetimePicker: {
+    show: false,
+    popupMode: "bottom",
+    showToolbar: true,
+    value: "",
+    title: "",
+    mode: "datetime",
+    maxDate: new Date((/* @__PURE__ */ new Date()).getFullYear() + 10, 0, 1).getTime(),
+    minDate: new Date((/* @__PURE__ */ new Date()).getFullYear() - 10, 0, 1).getTime(),
+    minHour: 0,
+    maxHour: 23,
+    minMinute: 0,
+    maxMinute: 59,
+    filter: null,
+    formatter: null,
+    loading: false,
+    itemHeight: 44,
+    cancelText: "取消",
+    confirmText: "确认",
+    cancelColor: "#909193",
+    confirmColor: "#3c9cff",
+    visibleItemCount: 5,
+    closeOnClickOverlay: false,
+    defaultIndex: []
+  }
+};
+exports.DatetimePicker = DatetimePicker;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/divider.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/divider.js
new file mode 100644
index 0000000..6740b3e
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/divider.js
@@ -0,0 +1,15 @@
+"use strict";
+const Divider = {
+  // divider组件
+  divider: {
+    dashed: false,
+    hairline: true,
+    dot: false,
+    textPosition: "center",
+    text: "",
+    textSize: 14,
+    textColor: "#909399",
+    lineColor: "#dcdfe6"
+  }
+};
+exports.Divider = Divider;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/empty.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/empty.js
new file mode 100644
index 0000000..6be8b07
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/empty.js
@@ -0,0 +1,18 @@
+"use strict";
+const Empty = {
+  // empty组件
+  empty: {
+    icon: "",
+    text: "",
+    textColor: "#c0c4cc",
+    textSize: 14,
+    iconColor: "#c0c4cc",
+    iconSize: 90,
+    mode: "data",
+    width: 160,
+    height: 160,
+    show: true,
+    marginTop: 0
+  }
+};
+exports.Empty = Empty;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/form.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/form.js
new file mode 100644
index 0000000..9909c33
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/form.js
@@ -0,0 +1,15 @@
+"use strict";
+const Form = {
+  // form 组件
+  form: {
+    model: {},
+    rules: {},
+    errorType: "message",
+    borderBottom: true,
+    labelPosition: "left",
+    labelWidth: 45,
+    labelAlign: "left",
+    labelStyle: {}
+  }
+};
+exports.Form = Form;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/formItem.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/formItem.js
new file mode 100644
index 0000000..db4271c
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/formItem.js
@@ -0,0 +1,17 @@
+"use strict";
+const GormItem = {
+  // formItem 组件
+  formItem: {
+    label: "",
+    prop: "",
+    rule: "",
+    borderBottom: "",
+    labelPosition: "",
+    labelWidth: "",
+    rightIcon: "",
+    leftIcon: "",
+    required: false,
+    leftIconStyle: ""
+  }
+};
+exports.GormItem = GormItem;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/gap.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/gap.js
new file mode 100644
index 0000000..31b6419
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/gap.js
@@ -0,0 +1,12 @@
+"use strict";
+const Gap = {
+  // gap组件
+  gap: {
+    bgColor: "transparent",
+    height: 20,
+    marginTop: 0,
+    marginBottom: 0,
+    customStyle: {}
+  }
+};
+exports.Gap = Gap;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/grid.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/grid.js
new file mode 100644
index 0000000..fc4563b
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/grid.js
@@ -0,0 +1,10 @@
+"use strict";
+const Grid = {
+  // grid组件
+  grid: {
+    col: 3,
+    border: false,
+    align: "left"
+  }
+};
+exports.Grid = Grid;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/gridItem.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/gridItem.js
new file mode 100644
index 0000000..01a77a9
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/gridItem.js
@@ -0,0 +1,9 @@
+"use strict";
+const GridItem = {
+  // grid-item组件
+  gridItem: {
+    name: null,
+    bgColor: "transparent"
+  }
+};
+exports.GridItem = GridItem;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/icon.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/icon.js
new file mode 100644
index 0000000..cd29753
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/icon.js
@@ -0,0 +1,28 @@
+"use strict";
+const uni_modules_uviewPlus_libs_config_config = require("../config.js");
+const {
+  color
+} = uni_modules_uviewPlus_libs_config_config.config;
+const Icon = {
+  // icon组件
+  icon: {
+    name: "",
+    color: color["u-content-color"],
+    size: "16px",
+    bold: false,
+    index: "",
+    hoverClass: "",
+    customPrefix: "uicon",
+    label: "",
+    labelPos: "right",
+    labelSize: "15px",
+    labelColor: color["u-content-color"],
+    space: "3px",
+    imgMode: "",
+    width: "",
+    height: "",
+    top: 0,
+    stop: false
+  }
+};
+exports.Icon = Icon;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/image.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/image.js
new file mode 100644
index 0000000..74678ef
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/image.js
@@ -0,0 +1,23 @@
+"use strict";
+const Image = {
+  // image组件
+  image: {
+    src: "",
+    mode: "aspectFill",
+    width: "300",
+    height: "225",
+    shape: "square",
+    radius: 0,
+    lazyLoad: true,
+    showMenuByLongpress: true,
+    loadingIcon: "photo",
+    errorIcon: "error-circle",
+    showLoading: true,
+    showError: true,
+    fade: true,
+    webp: false,
+    duration: 500,
+    bgColor: "#f3f4f6"
+  }
+};
+exports.Image = Image;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/indexAnchor.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/indexAnchor.js
new file mode 100644
index 0000000..f8e0939
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/indexAnchor.js
@@ -0,0 +1,12 @@
+"use strict";
+const IndexAnchor = {
+  // indexAnchor 组件
+  indexAnchor: {
+    text: "",
+    color: "#606266",
+    size: 14,
+    bgColor: "#dedede",
+    height: 32
+  }
+};
+exports.IndexAnchor = IndexAnchor;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/indexList.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/indexList.js
new file mode 100644
index 0000000..99d11a5
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/indexList.js
@@ -0,0 +1,12 @@
+"use strict";
+const IndexList = {
+  // indexList 组件
+  indexList: {
+    inactiveColor: "#606266",
+    activeColor: "#5677fc",
+    indexList: [],
+    sticky: true,
+    customNavHeight: 0
+  }
+};
+exports.IndexList = IndexList;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/input.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/input.js
new file mode 100644
index 0000000..bd4a3fb
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/input.js
@@ -0,0 +1,41 @@
+"use strict";
+const Input = {
+  // index 组件
+  input: {
+    value: "",
+    type: "text",
+    fixed: false,
+    disabled: false,
+    disabledColor: "#f5f7fa",
+    clearable: false,
+    password: false,
+    maxlength: -1,
+    placeholder: null,
+    placeholderClass: "input-placeholder",
+    placeholderStyle: "color: #c0c4cc",
+    showWordLimit: false,
+    confirmType: "done",
+    confirmHold: false,
+    holdKeyboard: false,
+    focus: false,
+    autoBlur: false,
+    disableDefaultPadding: false,
+    cursor: -1,
+    cursorSpacing: 30,
+    selectionStart: -1,
+    selectionEnd: -1,
+    adjustPosition: true,
+    inputAlign: "left",
+    fontSize: "15px",
+    color: "#303133",
+    prefixIcon: "",
+    prefixIconStyle: "",
+    suffixIcon: "",
+    suffixIconStyle: "",
+    border: "surround",
+    readonly: false,
+    shape: "square",
+    formatter: null
+  }
+};
+exports.Input = Input;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/keyboard.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/keyboard.js
new file mode 100644
index 0000000..6cae386
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/keyboard.js
@@ -0,0 +1,23 @@
+"use strict";
+const Keyboard = {
+  // 键盘组件
+  keyboard: {
+    mode: "number",
+    dotDisabled: false,
+    tooltip: true,
+    showTips: true,
+    tips: "",
+    showCancel: true,
+    showConfirm: true,
+    random: false,
+    safeAreaInsetBottom: true,
+    closeOnClickOverlay: true,
+    show: false,
+    overlay: true,
+    zIndex: 10075,
+    cancelText: "取消",
+    confirmText: "确定",
+    autoChange: false
+  }
+};
+exports.Keyboard = Keyboard;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/line.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/line.js
new file mode 100644
index 0000000..531b6a5
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/line.js
@@ -0,0 +1,13 @@
+"use strict";
+const Line = {
+  // line组件
+  line: {
+    color: "#d6d7d9",
+    length: "100%",
+    direction: "row",
+    hairline: true,
+    margin: 0,
+    dashed: false
+  }
+};
+exports.Line = Line;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/lineProgress.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/lineProgress.js
new file mode 100644
index 0000000..213aa72
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/lineProgress.js
@@ -0,0 +1,12 @@
+"use strict";
+const LineProgress = {
+  // lineProgress 组件
+  lineProgress: {
+    activeColor: "#19be6b",
+    inactiveColor: "#ececec",
+    percentage: 0,
+    showText: true,
+    height: 12
+  }
+};
+exports.LineProgress = LineProgress;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/link.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/link.js
new file mode 100644
index 0000000..40c796a
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/link.js
@@ -0,0 +1,18 @@
+"use strict";
+const uni_modules_uviewPlus_libs_config_config = require("../config.js");
+const {
+  color
+} = uni_modules_uviewPlus_libs_config_config.config;
+const Link = {
+  // link超链接组件props参数
+  link: {
+    color: color["u-primary"],
+    fontSize: 15,
+    underLine: false,
+    href: "",
+    mpTips: "链接已复制,请在浏览器打开",
+    lineColor: "",
+    text: ""
+  }
+};
+exports.Link = Link;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/list.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/list.js
new file mode 100644
index 0000000..53a9e52
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/list.js
@@ -0,0 +1,21 @@
+"use strict";
+const List = {
+  // list 组件
+  list: {
+    showScrollbar: false,
+    lowerThreshold: 50,
+    upperThreshold: 0,
+    scrollTop: 0,
+    offsetAccuracy: 10,
+    enableFlex: false,
+    pagingEnabled: false,
+    scrollable: true,
+    scrollIntoView: "",
+    scrollWithAnimation: false,
+    enableBackToTop: false,
+    height: 0,
+    width: 0,
+    preLoadScreen: 1
+  }
+};
+exports.List = List;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/listItem.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/listItem.js
new file mode 100644
index 0000000..070d306
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/listItem.js
@@ -0,0 +1,8 @@
+"use strict";
+const ListItem = {
+  // listItem 组件
+  listItem: {
+    anchor: ""
+  }
+};
+exports.ListItem = ListItem;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/loadingIcon.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/loadingIcon.js
new file mode 100644
index 0000000..73cc072
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/loadingIcon.js
@@ -0,0 +1,22 @@
+"use strict";
+const uni_modules_uviewPlus_libs_config_config = require("../config.js");
+const {
+  color
+} = uni_modules_uviewPlus_libs_config_config.config;
+const LoadingIcon = {
+  // loading-icon加载中图标组件
+  loadingIcon: {
+    show: true,
+    color: color["u-tips-color"],
+    textColor: color["u-tips-color"],
+    vertical: false,
+    mode: "spinner",
+    size: 24,
+    textSize: 15,
+    text: "",
+    timingFunction: "ease-in-out",
+    duration: 1200,
+    inactiveColor: ""
+  }
+};
+exports.LoadingIcon = LoadingIcon;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/loadingPage.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/loadingPage.js
new file mode 100644
index 0000000..c928d56
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/loadingPage.js
@@ -0,0 +1,16 @@
+"use strict";
+const LoadingPage = {
+  // loading-page组件
+  loadingPage: {
+    loadingText: "正在加载",
+    image: "",
+    loadingMode: "circle",
+    loading: false,
+    bgColor: "#ffffff",
+    color: "#C8C8C8",
+    fontSize: 19,
+    iconSize: 28,
+    loadingColor: "#C8C8C8"
+  }
+};
+exports.LoadingPage = LoadingPage;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/loadmore.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/loadmore.js
new file mode 100644
index 0000000..0f55dfd
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/loadmore.js
@@ -0,0 +1,25 @@
+"use strict";
+const Loadmore = {
+  // loadmore 组件
+  loadmore: {
+    status: "loadmore",
+    bgColor: "transparent",
+    icon: true,
+    fontSize: 14,
+    iconSize: 17,
+    color: "#606266",
+    loadingIcon: "spinner",
+    loadmoreText: "加载更多",
+    loadingText: "正在加载...",
+    nomoreText: "没有更多了",
+    isDot: false,
+    iconColor: "#b7b7b7",
+    marginTop: 10,
+    marginBottom: 10,
+    height: "auto",
+    line: false,
+    lineColor: "#E6E8EB",
+    dashed: false
+  }
+};
+exports.Loadmore = Loadmore;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/modal.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/modal.js
new file mode 100644
index 0000000..e237c80
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/modal.js
@@ -0,0 +1,23 @@
+"use strict";
+const Modal = {
+  // modal 组件
+  modal: {
+    show: false,
+    title: "",
+    content: "",
+    confirmText: "确认",
+    cancelText: "取消",
+    showConfirmButton: true,
+    showCancelButton: false,
+    confirmColor: "#2979ff",
+    cancelColor: "#606266",
+    buttonReverse: false,
+    zoom: true,
+    asyncClose: false,
+    closeOnClickOverlay: false,
+    negativeTop: 0,
+    width: "650rpx",
+    confirmButtonShape: ""
+  }
+};
+exports.Modal = Modal;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/navbar.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/navbar.js
new file mode 100644
index 0000000..ec4da47
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/navbar.js
@@ -0,0 +1,24 @@
+"use strict";
+const uni_modules_uviewPlus_libs_config_color = require("../color.js");
+const Navbar = {
+  // navbar 组件
+  navbar: {
+    safeAreaInsetTop: true,
+    placeholder: false,
+    fixed: true,
+    border: false,
+    leftIcon: "arrow-left",
+    leftText: "",
+    rightText: "",
+    rightIcon: "",
+    title: "",
+    bgColor: "#ffffff",
+    titleWidth: "400rpx",
+    height: "44px",
+    leftIconSize: 20,
+    leftIconColor: uni_modules_uviewPlus_libs_config_color.color.mainColor,
+    autoBack: false,
+    titleStyle: ""
+  }
+};
+exports.Navbar = Navbar;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/noNetwork.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/noNetwork.js
new file mode 100644
index 0000000..4df838c
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/noNetwork.js
@@ -0,0 +1,10 @@
+"use strict";
+const NoNetwork = {
+  // noNetwork
+  noNetwork: {
+    tips: "哎呀,网络信号丢失",
+    zIndex: "",
+    image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAYAAAB5fY51AAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAABLKADAAQAAAABAAABLAAAAADYYILnAABAAElEQVR4Ae29CZhkV3kefNeq6m2W7tn3nl0aCbHIAgmQPGB+sLCNzSID9g9PYrAf57d/+4+DiW0cy8QBJ06c2In/PLFDHJ78+MGCGNsYgyxwIwktwEijAc1ohtmnZ+2Z7p5eq6vu9r/vuXWrq25VdVV1V3dXVX9Hmj73nv285963vvOd75yraeIEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQaD8E9PbrkvRopSMwMBBYRs+5O/yJS68cPnzYXel4tFP/jXbqjPRFEAiCQNe6Bw/6gdFn9Oy9Q90LLG2DgBBW2wyldIQIPPPCte2a5q3jtR+4ff/4wuBuXotrDwSEsNpjHKUXQODppy+udYJMEUEZgbd94DvnNwlA7YGAEFZ7jOOK78Xp06eTTkq7sxwQhmXuf/754VXl4iSstRAQwmqt8ZLWlkHg0UcD49qYfUjXfLtMtOZ7npExJu4iqZWLl7DWQUAIq3XGSlpaAYHD77q8xwuCOSUoXw8Sl0eMux977DGzQjES3AIICGG1wCBJEysj8PXnz230XXdr5RQFMYbRvWnv6w8UhMhliyGwYghr4Pjg3oEXL34ey9zyC9tiD2ml5h47dr1LN7S6CMjz/A3PvHh1Z6UyJby5EVgRhKUe7Kz/JU0LfvrJo5f+Y3MPibSuFgQGBgasYSd9l6GDsup0WS/T/9RTp9fXmU2SNwECdQ92E7S57iaMeJnPQLK6ixkDLfjlb7546RfrLkQyNBcC3dsP6oHWMd9G+V3JgwPHh7rnm1/yLQ8CbU9Y33zp0j+nZFUMb/DHmB7+SHGY3LUKAk8cObtD00xlHDrfNge+Z2ozU3c9dvx4Yr5lSL6lR6CtCWvg6OAPw9z538ZhhZRl6XrwhW8du1KX/iNejtwvPQIDR8+vSRqJ/obU7GupjdNdh2gW0ZDypJBFR6BtB2rg2OVtuub9JcmpHIpBoK1xfffLzx4f7C0XL2HNiYDp6bs9z23Ypn1fC1Y/9PCFDc3ZW2lVHIG2JKzTp4Ok7nv/G6Q054MIvda+bNb74pEgKGtwGAdL7pcfAa8vOKEZ2kyjWuLr7uDh+/qvN6o8KWdxEWhLwroyeek/g4zuqwU6kNrhyZcu/UktaSXN8iNwuL9/RuvVXtJ9PbPQ1vhmcP6t9+47u9ByJP/SIdB2hDVw9MJHQFYfrQdCph84evFX68kjaZcPAZJWwjMXRFpJ2zr91tfuvrh8vZCa54NA2xGWrunvmg8QWCJ/N4ir7fCYDxatkOeBB7an501agXbygVdvv9IK/ZQ2FiPQdi9osGbH+zRNf7y4m9Xu9Me7N9nv0HXdr5ZS4psHgXpJC9P/wDRTx0Vn1TxjWG9LGrbaUm/Fi5meSvcrkxf/Cg/ow9XqAUk91v3qHT97r6471dJKfHMi8Oyzgx1Z03t1YAQVT2MwgsC3u+yXHzi0faQ5eyGtqgWBtpOw2Ol9+/TM+sTOn8L08MtzgQCy+tOHXr3jA0JWc6HU/HF5Scssr4jXcYqfP6V/T8iq+ceyWgvbUsKKOn38eJAYyl56TAuCEr2WYei//9Crd/5GlFb81kdASVopSFrerKRlaoZj9HR+700H10+0fg+lB21NWBxe2lhNHsUpDZr27mi4dV379R9+za4/iO7Fbx8ECknLCPTsTDJ17O33bJpqnx6u7J60PWFxeAcCbMV56dJfQKf1bkMLfuGh1+76zMoe9vbuPUnLsb2DtmOe5HSxvXsrvWtLBEhaTx29+Ma27Jx0ShAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQaEsEVoQdVluO3BJ06ptHL34b1XRjp4Ch6Rq24+kmjG4Nwwg+9uA9u/73EjRBqhAEihAoe3xwUQq5WTYEzp0b3ZnV/Ncf6O/9AvY9wlh/6dy3X7ncN512Zw9BVLXjuAP4np44vnQtkZoEgVkEhLBmsWiKqwsXpjbPBOn3gRfenwnc+7GBe+zsjclvonFDS9nA9Iy/u3x9+vAP3735VPk4CRUEFhcBIazFxbfm0k9fHD7k+v4nQFaPQIrx8Gmyx/GJ0J/t7ez7mw0b9MmaC2pQQgh0/ZSm4g5TwueWWtqLt0HuVy4CQljLPPYnB0depTn+b3t+8B4t0AdBUv93h2H9xc6da0aXs2m+r1WQsLRnl7NdUvfKRkAIa5nG//r1oGtsZvjTgev/kqYHF/TA+AXoqv4npJemOEiQU1Eo2l+G0movBK1UBBPU7s9E1+ILAkuNgKwSLjXiqO/khVtvARH8dxDBRkMzPrF/V+9/BlG5y9CUqlXinHv9mRPXtvuus88L9H3JPv2zD2yXExCqAicJBIFWRwAvv3Xqwq0/Pnn+lv/K+ZvfPH3p9p5W75O0fxaBp793ce3AwIDMWmYhafiVgNtwSMsXeHp4eNXJC8Nf0PAdRCiuf/XgrnWUqsqotcvnl9DmRkCdweX4b9N7+m/ih+mbMraLM14yJVwcXItKpT1VRve+ArC3Qqn+3gM7132jKEGZm6tXg86J7OhDfuA/iHwPUpfUZSfu2L59tXxEoQxeyxkEgjKeOnLxHb4RqC+NY5H3+2953d4XlrNN7Vq3ENYij+yZwbG9jpt9GkBPQ5H9zgP9607OVeWp87cOQtn9zwJf+xDMNFfj+jryPqXpxj8c2Nn7P+SXey70lidu4IXzb0DNB4tr9751+HV7zxSHyd1CERDCWiiCc+QPjUCnsaqmZ62O5IN7N/VUNP48ee7mAZDTf4Tt049iUG4Guv4ZfNLos9UIbo7qJWoJEHjy+bP7fNsoOcnW0A0/aacef8PdG28sQTNWTBVCWIs01OfPj66BpfqTmq732UnjgT1bei+Vq4pTv7HM8Ceg2/o1qLQug7T+FaaM3IqTLZdewpoHgYEjV9fphvOj+OShWa5V+CxvZtpzv/LwG/aNl4uXsPoRwI+4uEYjAJ2GmdG8L0FK2mYa+tsrkdXZy+P7x2ZuHdW14P+BLdank9q6Qwd3rf+ckFWjR6Tx5Q2cP58K9Jm3VCIr1ogt48lO237r3//96YofeG18y9q7RFklXITxPXV+5DchKb3ZDMy37Nu5tuxG4R9cHH6b42QfAzlds+3EPXu2rfrBIjRFilwkBIIR7SHoJDurFU89ZOd680Gke6JaWomvjoBIWNUxqivFD87fej0e0n8Fwvr0/t1rnyqX+QfnRz7g+8FX8Rv8vL3auF/IqhxKzR2WCPxXqKeq3krDTdj2ierpJEUtCIgOqxaUakwzNBR0D09yiqePHOjveyOkpxLr9VMXb73V97S/h3nDXx7Y2fdPkAYbncW1IgIDxy5vM7LZt/hgrnLtxyaBrJNxv/72N+6tuNhSLp+EVUZACKsyNnXHvHL+1qcgNf2KbSXu2bt9dcmS9qlzo/fARgcmCtpzB3b1/Vg5QiuslLowENyDWDn8cSjl98PgdBviu03N+rl9/WufLEwr18uDwLdevLTF1YK3xnVZ2HI1bUxrT7z5zTuXdRP78qCyeLUKYTUI25OXbm4JPO00TBj+6I7+db8ZL3ZwMOiYdG4dA1lN9HWte2iuI2NAVPapC8O/CGPR34Ip/AZIbIMo7yX8G9QMbcS09P+2b1vf5XgdrXaPfiYns9oeLLEd8D1/B7Dp0E1jGP042pXQj7RKf546cmGzp+tv1TRf6YQD35/QO3seP3xow5IfC9QqmM23naJ0ny9ysXwgq98BWc0kVhv/Nhalbqe8kd/Fr8MOSEr3zEVWrwyO3I29hl+E9LUHGf+nAXI6sGPdd8uV2YphIKnE5IyL6bLxk7cn3bdkHHefrpvJAExMZ1uBZmqeNzXtfzUzk/m/ens7LjV7Px+8d9e1579/44l0duZtge+Np5zEEw8c2pBu9na3YvtEwmrAqNE8IZvNHsep5//yjl3r/0O8yFOXbv0QCO05gP0JGIL+fjw+uj91YeRh/Dp/PtCDM7Zpfmjvjt6Xo7hW9ycmJjaYduf7Hdf/8HTGfa3rG9rYxLSWnsloPg7fijZV8oFM2Ja2a9t6EJd7bCztvHP7us4rrdD/r3/7ct9I99jEI4cOiQ3dIg2YEFYDgOUJDFj1e8TqX7cT4kImXuQr5279A4DeBEX8ayvprU4N3rovcALot/TH13T0fXDTJn0qXk4r3k9OTm4y7a6PzjjORzOOvn1kbEqbnEprPhRzwAKzwFLHk05hv6Yd6N+o3R6beG50aPSdr3qV6IJKkVp5ITIlXOCYn4Yexr0w/DO6YXymHFlR0e5r7tsM3fxgJbI6fW1ivTeT+SsYmr54cFff+5Cu5X+hb94Merp6/J/PusGvTE6724eGJ7RpSFOkKPCUZvBPBccoHBet3Rwe13rX9tw/PjXzZ5hKvr8SfhWKkeA2REAIa4GD6p0feRdWBnvxjv2PckVhVfBf4A29uG/X2i+Ui2eYn8n8NryuDr3jPfWSFV5k44UT137eshIP2K7/64cObbheqZ6lCp+Ydt8TBO7vTM5od1+/NR4SFVhoLpKKt410lnE8LTMzo3V2dLznxLkhYgQ9obiVjEDln7mVjEodfYcpw+MAsftg/7qSDbAnb97sCSb0Yei2fqOcbovVqKNnNO8HmAE9Cv3Wp+uoWjt27HpXNqH9WTKR+kBHKqEFbvo5y3N/avfu4g23R45f3WGa1k9ZicTd0zPTf/f6O7f8dT311Jp2fHzmgJlI/N70jPPe4bEZ6Kg4qw0lqlrLiNKBiLWerpTW25PUbkPXZViW62ecHz+4d8PXojTirzwEyhq8rTwYFtRjvpX/rlwJ+iSXugPbMuyKBOHo3geRJtuT7PujcmVUCuPJlhnL/9NUqvMD2eyM5sxMaIlE4n7XML907tyNjcxHQjty4sZv66Z1xEok/xNW5n4uZSf+8sT5m++vVO58wkEu5sR09pd9w/rWyET2vReujiqygrSopn/zKZN5qMeirotKeTyolm7p/+X06Wvr51ue5Gt9BISwFjiGsLl6N6SrvylXDNTK70D4mX071pwtF88w6Jd/DG/1E1u26NOV0pQL71y3/8PJVOcHMzPTWkcCH2YGOaTTaS2RTN6f1fQvvvDK1bdnbO2JZCr1SeRfn05Pa1PTU0gXJBKW+ecnzlxvCGndhFQ1NRP8bcY1/vjS9bF1V26MwHwsVKiXa3etYVw1TNhYJ3TDjQCO42jJVMcez7J+t9YyJF37ISCEtahjGjxkGDr2DJZ31D8h5vUQJL5RPkXlUMM07u3qSGidICvkzzuSlmlZb0olrK9hD9v9JCrPC196JoPMAolFg6CV+PPj54YeyWecx8Vk2v1Q0rSfhFT18LnBmzBRyNalp5qrSuq7kiAsh4SFa7oZ9M0wzI+cPHOjZPo9V1kS1z4ICGEt4lhiCvZrSa2jol7qzPXJPk6nIGbVbWfUvcr7hO9MP97ZVXpggOu6ajplYStj7l1XvbRMXbPAbp6HzSSBlkraNknrvfVCcPt2sHYi7f3pTDb47KUbYxuvKqkKpYBXKBnV869c3WgbDEixAck0FGFFfEzJzbIsO9C1TyrcymWWsLZGIHoW2rqTzdo5dXyykz0NC8l779i5vu4zwM+eHVntGP5jqVTq/6AkVc5NZ3wNH2lVxNWZNIukMSjiNd9z0+CHp5DXAdX4SAg203w8GB5IATtODHzdK8C15kEjhXvNS9rWA11dnfcMDY9prscss48RySakrOLWqODCoIKAgkuVgsS0urtD60haeV1YYVbbtjUn6/74HXvW/11huFy3PwKzT1r797Upe3jq4sib9u9Y+wxe+vh7W1N7jx49v6ZzbffnQD4/Cj1Pfjx54XiBls6GVuTUc9mQsOIO9mPQFdkIRlz4fy5JLm2ZMOqTcJaXIqpcqnixVe+rdbZ3dbc2OT0D0wZIibHSksmklslknvx+//q3PiKnXcTQae/b+LPQ3r1t0969cOL6G7o6E09qgZegdMJBpVQ1DbKCpyUt6oPKz/4NEJalCAuZFIuEVBJd+jgLh4rvAiFqUVGkhJZMWFp3Z0obGSu/d5gSnWmavuO6h+/cvYHSobgVgoAYjrb4QPMUiGtj1/79jBMkLBwiTlMASlYzTkhWCJyTrGAyMOFkst/BoYMmuIIyGJYcMXMMdNwHPhYN1qWS1t6ZLGaKZL8yzFXTr15BooLLMugHMBRNKgW+It8y9TEcJGt4rvcRFCCEVQbFdg0Swmrxkb0+cf2XOzq73kgdFieEXF2jdEUJKQH6SVWQrNjtZDKlpTPp38U58iUbthk/Ph7sN6zg/xudSGvD4xkq6otcnnjyF0XRRTflkyC0IIJE1JG0QbqGNpMNp5xFhRTcZDNoj66988SFm5vv3LX+WkGUXLYxAuXnCW3c4XbqGs9hwjv+a9lsuN+ahOJSCoLjNDAFvVUll0p1aNPp6adTweSflEszPO48oFn+4yOTmR+6enOshKyYhzWpf/jDuuf6x2aV/qNRaPG/1d0gUXWCA0uu7GhMmkqmerEc8KOVU0lMuyFQ+Ylut562YX9Sncmf7Ojo3BDZWbGLtMkiUVXSWTFNuMqWuYG530f7+/tnGFboxsfdd9mm8XdDo9O7rg6NFq0CFqZr5DWlK9qV0fZqGvZchSuPlevB2VmG/hOV4yWm3RAQwmrhEcW64qu4ykfJho52Vp3J8quBYQooqWDKADftBd6HD+5efyoKj/zR8ew/hWXY56/cnFh7a3RCTTGjuMX0SVB9qzu1qfQM+jO3dBW1g6uVSHv/qVNX10Vh4rc3AkJYLTy+WA/8ou9kJjo7bOh+DLVFZ64TEbCyBktxI5PJZj56R//Gx+NdH5vM4vuI+p8NXh9LjU1iw3EZhXc8TyPuuV9wDaaCfBjTM06N0hVWQmHBDzvSDZ5tvqYR7ZAymh8BIazmH6OKLbzv0KZvJEz3ZzEFnEolaEtV2XEaCLKadrIz//TQnk1/EU85NuH8th8Yf4j9gMZUOrNkZEVZCnsbtTU9KW18GqcKFyjh420sd2+j33pg3F8uTsLaDwEhrBYf04O7N/2t7/o/C2FoGnsIy/YGlvAwSfCvZzLOe+8oR1ZT3u/5uvHJC9dGtJlMrfqjslXVHwjpat2aLi2rjFFLjUSrFUjlO0juddXSSXx7ICCE1QbjiHO0/hofbPgwpnDTOR2V6hWNQqGUx34890noet5yaO+Gko3Y45PO7/uB/lvnrwxrWdha1absbgxo1FWtwplXqYSJY5Nn5lU3bLHQmGA/yko0plVSSjMjIITVzKNTR9sO7dv8RSeb/T9BWmMkKv4D+YzBXuljV7yxd+zfte6VeHGKrHTz4+cv38JWmyUmKzSGG5z7VndoE7kz3uPtq+Welvhwm39weVjOyaoFsBZPI4TV4gNY2Pw79mz8KyebeRIH+VEZTaX0sf27+v794TKmCxNTzr/2NOPj5wZBVjjdYSklq6jN69dyKuhqmWztivYob+RTSkPbe/xMdlMUJn77IiCE1W5jq+s4dYEO6mzsYAmvi/+CrH7LDYxPcBq4HGTFVcG1ULLT5orS1ULIkoSFI2cMHKG8obiXcteOCAhhtdmo6gaOh4EWWlkyYU9gvHswXfgV19d/7+LVkSWfBrItJJhObL/p7elQR8fUZnEV70XxPc01sM+xrzhU7toRgZIHuh07uZL6xA3LBaYB+Ar8rBsfz34YX1j+D5eu317QNGy2xPquSE4mDuXb2IujY2AgytNE67RiKFshzuwCR5s9ZSMlsK0QEMJqq+GkBKOF5yFzRoidK5BoFCeMjM/8mG+a//Xy0Li55KYLBRiTrGjwOQ1br4VMBQuKVJeQKVPxMLlvPwSEsNpsTEECmBLSgbHUpwD1YGwse59l2p+9fmuig4fiNZIowrqq/6Xeqm9Vh9JbjcOKvqFtACX7gV8kTVZvkaRoRQSEsFpx1OZoM2iKxxuHLtDcsZlgLzYZfv7m7XSv+r7fIm234XSP/8o5ktWqzqSyZr89PoXPYDTYkZvziw0NLluKayoEyq4iNVULpTF1IaDjHHZmoAW4aep9geN8fiLt998cGYdtVp7K6iqzXGJFUCAi7jdkuapsBJKcPBwgyP8YRyV7B04Q3dDbpY3jg6gupoMNla5U41BbUN9n0sr1ScKaHwEhrOYfo7paCAW0WiWknihhW/0Tabf/6tDtxpIVSIhGnz1dSXUkDL8fSHKi4/lWPId9Kp3Vxqegp8J/m9f14D6DQ/nmb281FwgkZ1Dj7bnSSFx7ICCE1R7jmO8FJJr8jCvjeNrIxFjDJBpKVaSlXhwDw384MyucBoLAGEfHI5ptO6n1YAq4FjorH9IWjUOnFlF3pj62aui3whbI33ZGQAir/UY3XCVEvzgdw/8NcSyGUhSlpVWQrFg2p39xp0JYLyIohaXxdZ2FGofG6yi85/QS32F0Asu8URgu1+2JgCjd22xcsVElPC85169Gaa1YTkRWJKpSqooBiQQzONvq9sRULKKxtzzAEJw1api2EFZjoW3K0oSwmnJY5tcoSD09HanEDztubnfO/IopyUWC6sUmZUpW5aSqkgwgK04DxxaZrFivacCaIdAuH9zaM1rSDgloOwSEsNpoSMenvU93dXb+EE5taFivKElRqd67qrNmsqIF+yjMF/i56MV2JqadYKxXMDXM6+4Wu04pf/kQEMJaPuwbWvPticwj4Il/NnTrdl7JrqaDC5wTUle1GmdWWVCw1+JotjA6PgnThsIdQrXknF8arkJi/+R355dbcrUaArU9ha3WqxXW3tHR9C5dN//T9eEJ3aGdUwP7T0V7F86Mr0VW4mF6o2NTS/ilaB2HDmb8wA2+08AuS1FNjIAQVhMPTi1NgwRkGKbxRxMz3uaJSRzVUkumOtLwo6Zc7aOkVdEhynN9NQ1cyuNqeEqD67mX9TXGyxXbJhFthYAQVosP58S0909czfqJqzdGODVqaG/IUbCWr2p0yukfp4FUtDfeir1yl8IPUGjPHFy/fqJyKolpJwSEsFp4NEfT6Z3YBvOp8MvMc0hAi9hHNQ1cBrJil5TUZxhfXsTuSdFNhoAQVpMNSD3NMTzzU1PZYAM/ProYkg3UV5rHT8lXmA7SwnwEq4FLLVkRI04HM+n0LdvzvlEPZpK2tREQwmrR8ZucCd7hePr7rw2N5PfxLUZXON1zHKz4kb0KnIttP6Njk8tyaimbwXPrsW/yq3v3bhoqaJZctjkCQlgtOMCYCnU4GedTI+NpQ32XbxH7QOmKG5nzdIWZJz8HNkKygqI9TmSL2JSiovGVn0A39c8WBcpN2yMghNWCQ4zPc0HRbr6GEs6chJFnmfl3knZO4/hmII1B6fiFG9br0s6qAeXPp2WUrhzHeXH/jr6n5pNf8rQuAkJYLTZ2kK7Wul7w6zeGx9DyUsZovOodOizosTg1TM9k1Wogpa7lIisOF+w48E/7E5B1Y/cgtdizsBKbK6c1tNioT6X9n3MDcyePOo7OoJqrC6S0+ZIYV+GSOHxvc18PJCxXG4ed13I727axqTp9yk9rX1jutkj9S4+ASFhLj/m8axwdDdbgELxfGsLpoZyqVXPVU1QugVJUV0dC27p+FaaBWWxknq6ceAljTNMiAf/BoUMbJpewWqmqSRAQCatJBqKWZpgJ731Zx9pJM4aK0hXe5vlKVFEbKFlxs3PvqpSSqpbzKztRm+gnEkktnU6/2GFMfa4wXK5XDgJCWC0y1iAR6/Z49iOjY7C5qkG6mk+3SFQGlEP8FFdnygrNFqBsn1OxP5+K5pGHbcBhqhT8fqu/v39mHkVIljZAQAirRQYx7Wj3Zj3tddQjVVJ4l50CMjHe8mqOTJCCvmoTyIrENXx7Uinbm4Gs2PZUqkObnp76i0N7N36tWl8kvn0RaGnCGhgILKPn3B3+xKVXDh8+nPseX3sOlpt13+P4uonv71WeDqLr1ampFB8S1JrulNaHc9rTMxltcpofOeWns0rTLkeIZUHRnpm5YibMf7kc9UudzYNAyyrd8ZLpWvfgQT8w+oyevXeo++bBtaEtQd9s1/ffRsV3I6eDJCp+nourgH04UZQnhIYfWm1o8xdUGCU8/E/bil89sH3dlQUVJplbHoGWJaxnXri2HTvd1nEEcCBS3z++MLi75UejQgcmJjL92ax/gNJPo6QekhVXAbdvXI3D+XQ1Bcxiu02zTAEjKFIdHTQS/S8Hd2/4YhQm/spFoCUJ6+mnL651gkwRQRmBt33gO+c3teNQYin/oG6aKX5rcKEukqqoWN+Ij5vy81v8UATDG0WGC21jlJ96K6wKPpWd8H8jChN/ZSPQcoR1+vTppJPS7iw3bIZl7n/++eFV5eJaOczX9Z2YvM1LPxWpocBHKv8qHHdMqSphGUqqahaThfj40ITBcbLnsDj6oXvu2bS4n96JVy73TYtASxHWo48GxrUx+5Cu+XY5RH3PMzLGxF0ktXLxrRoGNVPPfNtOolIrgElLGYH2wbZqcipdIFVFlDbfGhqfj9bskCaHHS/7gTt3r73Y+BqkxFZFoKUI6/C7Lu/Bl1jmlKB8PUhcHjHufuyxx/g5lbZw+BL7bX4EoiZqyS0T0uM0j1+82QSl+ua+bhxj7GjD2LicwWkLzaarigbKsmDJ7gcTmezMBw/t3ixntUfAiK8QaBmzhq8/f26j77pbaxo3w+jetPf1B5D2RE3pmzyR4/nH+Mti4Wx1dUrCHO0lSVGqskFUnakkpn6mhu086jgYHkWTW3Wbo4Tli6L5gqYHE47vfeDufVv+YflaIjU3KwItIWEdO3a9Szc0ElDNDqcLbHjmxas7a87QxAnX9ljfxcr+Mzs29ykpi1O8iJjoR/cm5o7dnUl89LRLW93dyWmVIip+Kp7pmlWqIvQ8Mga9Gslm3Efu3LX+K008HNK0ZUSgplnGMrZPGxgYsIKeXa/TA61jPu0w0+7xBx/cd3M+eZspD0wbDgWm+RXP13cODY/jWGKuGAb48jG+agNpilbqlKZoWDqDY2AyjtNUlupzYZlKpXgaxIVMNv0zd+/d+uxcaSVuZSPQ/IT13TN34QRvZW81n6HSDdMLUqmjh9tgd//Fi8OHEl3JL3Z2dh3MzGA7XU664llVWRz/QhLjNYmsmaWp/DjCjqIDdlaZTOZZ1/A+fGj7hjP5OLkQBMog0NSE9cSRszuswNhdpt31BRnazM3U9IuPHDrUuG+419eChqU+cvzqjp7u5P9KJpMPpqc51Zv9QntLkFQBEqZluVCw/7nhaP9i376+8YIouRQEyiLQtIQ1cPT8GjOw7vE8tyFtxBrb2MBXdh579FF99g0vC0nzB548ebNHT2l/aFmJj1BPBYyav9EFLaQ+jdPAVNL8/pZ13a8qiJLLOhAAjvrTRy/d0enbF+69d0tzHFhWR/vnk7Rple6mp+9uFFkRGF8LVj/08IUN8wGp2fIcPLh+4sCu9R+F3ucj0MLf4vaVVnChqYWmdaQS2jpY2vd0djh86Vqh7c3Yxm8dudTPxaW0lrn7yJEjZW0Tm7HdC2lT0xKW1xecgHE3FDWNcb7uDh6+r/96Y0prjlIO7ur7TOD5b3ayzt9ylY0Gl83qKFXZsCXrXdOlrV3djf2LBr556JOshLDmMWhPPXV6vav5O5jVxYLUhNl3iIbV8yiqpbI0bQcP85C2Xu0l3dczC0XUN4Pzb71339mFltOM+Q/0rzu5f2fvu1zH+QDOt3uZ0pbVRMRFouJK5qqeTkhVqyBdtdUmhGV5JI4cudrpd5kHiyp3tTU/8s6r+4rC2vCmaQmLWJO0Ep65INJK2tbpt75298U2HLuiLh3oX/95L+0/kHUyvwTieiUJHVEimVzy1UKeWMqv2pCoKEVFRNXT1aHawnBx80eAZj7TwcxdAc5Gi5fiaNnNT37nCk4xaV/X1IRF2B94YHt63qQVaCcfePX2K+07fMU9U7qtHev+xE/7r3cc70O+6w1gxuV0dHZiusgvJS/O7IskRXLs6KCxqj+B26t9a3uUREWi4plbQlTFYzXvu+7tB3EIUGel/L6e3TNw5NS8zYAqldss4YvzBC9C7559drAja3qvDoyg6pwCP+KBZaVOPPjazS1vMLpQKE9fuPnawDB+EqehPwzWuAuSl8LPg90WVxhJJPWQCUmPBAWTBEz1TFUGpqO3wYYvIPgr2az35a2b1/50V6f1e1NTlVcvEzB0xRekj67usu5FmS2/crvQcaol/zeeObfTSOj91dIq28PxiaOHDx9quy8LtQxhcZBqIS0Dhkl2l/3yA4e2j1Qb2JUUD1Iyz1waOQib0vsxKXsAFvH3wMB0JySwtZC+DBPTN5BOCEnhrI1BuKe9l6tIzsVCiD6E0DOabrwI2elZ09aP7N3aNxjheXvK+a1OENa0EFYEyYL9rz072Ju03ZpNQKj7Xd899cKhNrA9LASvZTY/s9GcHoK0XsrakLS8UklLxyl+/rj+/Qfu2367sJNyTS7SuZfneO7ffweBGScu3NwAqWgrTvTc5jjBZmw87tMCfRXYKQWOgula4OiBOQUZ7DZuhrAGdQXxV0zPuCaGnkv3VPGHOpPw7+QPR62OM5HhdNddGOeX2kmCbSnC4mDlSStVTFr4eLljdHV+702vWz9R66Cu5HS5h5hmHvz3QiOxwJTRo2BGgY06dm7OVhewYGAY6s75oD+ZDs4JPY9JyqSCQ7ABqftd5VFM3/j2Ja4mtsWpJQSq6ZXu5UZTKeJnsHpohiYPRqBn04nkS2+CQWW59BK2dAjwS0Y4IHDz2ERWG8Gnwm7iK9W3sFmbvrqGPzw6gW8eTmvTM07XmTPX28KYd7EQ3rjnvv1QFHbPt3zT9DcMPHd+13zzN1s+/hC2rKOo7NjeQdsxT5LEWrYjbdLw05eHtwWe9jl0542u62HZHZIVpalY/yIlP5X3MHYddLLZfy4fmYiBhNuB509vw+rG3tKY+kOwGHLi7W/cS91jS7v4s9TSnZHGLx8CICH9lXNDX+zpWfXuycnaBV2e3e567nAm4973qv0bzy1fD5qr5oEB7KXt0u7B3Loh7yhWVfypbOalh9+wr6U3mbfklLC5Hi1pDRE4ef7Wj+EEiZ+amqpvJT2bzWjJRLIPR3n9riA5i4DZg720DSIrlsrvHXSZ9p7ZGlrzSgirNcetqVp9/vz5FJTqj6JRejTdq6eBMzNpHP9s//QrF4bvrydfO6f1JrCX1mvcXlo98Kembjotr3wXwmrnp36J+pYNeh5JdqRem83O77gxkpxtW3bgOZ/g1HKJmt3U1Rw+3D+zrc89aunagnWzpq6PdxujLz388L4F78tdbtCEsJZ7BFq8/sHBoMPX/I9hyrGgnuDUUZzrnnz7yQu3HlxQQW2Ued++fZmJ1e5LoPB5k5ZpWCPXz+08du+99zrtAI0QVjuM4jL2YcIZeh+2+9wF49MFtYJSlgmHE0g/JlLWLJQPg7RmhtyXsJ18eja0tivsXhj6xy9ve/mRR5TRcG2ZmjyViN9NPkDN3Dz1FW5z9XM4i+s1ME1YcFNpUIrVLHzJzHnwjl0bn1twgW1UwPHjxxPXpztejR0HFTc+F3YXRwxdfdM9W08D0zrs4wtLaM5rkbCac1xaolWOvurhZIPIih0OdVm2haNTfqUlAFjCRnJP4HBn+iUqz6tVa2nGpTe/etsP2o2s2G8hrGqjL/FlEQC5GHghfplSUSMdvwaEA/9+4vjpa3c2stx2KIsfUek2dr+EuXNF2xEjSJx98w/tbFt7NiGsdniSl6EPp84O3W/Z1oPzXRms1GRKWdCJdeCIlJ+vlGYlh997r+70+EPH8NHJEtLCauCph+7bmj81ox1xEsJqx1Fdij4Zxi9AT2KSYBrtslgxhOD2gWOyz7AstFzx6zFHj1mGobYUYAgC9cHge3ddK5uhjQKFsNpoMJeqK6+8cm0X6noXiWUxHA8WxAdWNyQM45HFKL8dyiRpueM7jllmMGpnjO+1w9fNaxmXxiogaqlR0jQdAkeOBPjczrnOiQ6jw88ESSOA6KT7iQzOHEvavu1pZsLQg4QPP/DdZG9Xx/vWrOr+mfR03SvtNffdxleAQIgvTzjBT0w409Mpu2faufZy+vDhw5WPMa25dEnYqggIYbXqyNXY7i/jCyvdfmaVb5hdVsLp9LJGp43j1/1A7/RdvdMwPRzEboRnLVHe9vEvL3eXBOB4ZMta22H+TiqV2LJQ26u5u6Bju44Z3J7O/Lvp6cwPmBanOwQ4uNHRTWMK21bSvh1Mm642nTWCtKkH07rnTE72aOO0XZq7bIltVQSEsFp15HLthg5J/+aJE12m3tVjOPYq1/dW4cTjHnwMYhXOce8xDd3y/PJW6OpMdsTRVy4iK/rKMR/jwvz825VIHFzT3fkx13UW/dnhRy3GJyeeHEs7n1XNibUPFvY6vtGDw5vV9w0Vofn81qGhZfDhi3HX8SfQ/3HPMse9CWcCX0gel2OIFJIt+2fRH7qWRaYJG85NxldGzV4tGayFSLQ24+q9ULyu9gJfMU5ELTn6wUISTl03NHz1KzyiJLqmX657OLLdSJgoXTO7cBxyN172blier4YCvBsFdSNXV2dC35tKJrbzfPfFdjwvC/qs9MSMxxNRsSqmT6LhUDQHE+jUBE7UnATXTuLsrRn01K2l/x6+qItiR3TNG8V59KNB0DGSfNXGUXwJY2Gm+osNhpSvEBDCasIHgVLTt75/aQ0MnXpBNb2QgNYEntfr4wu/nBYpKQLtxtdwAh0SBX3VDe7nM/Ha5vf1Fb/CURS2bCTAWWuxR229qRsbQQQbUed61LfW14JVKKsTJ5sk8WUcHbtlNANyTOhgcmAGKH7p3m1FWpqtuZCu+LByVdKHVMjpKEQrBwIW9tnpXOIH+QTDSH/D9f0bmCLewDn1I4HmwtAypPDZ/oe9oXKf/aMPsWxSs/RR13FHrURiZE1gDR86tKHEdCDMKX+XCwEhrOVCvqBeHNaW6ui11/mWDtLQ1kEiWodXE4rwYgepAPssTPCMOjIdAk94TZ8pMZjch8HjDorGFUTUAwlkh64be0A9/ZCatiDZWtOyE7ClQmIdJICJFYhA+TRV4Fo5/QIHiUvrTEbkVRCxiJfsSBbfYk87OTExXxdazY5yUgiRKfpHQ1YSkONmAZY+gV4NIeVFfCXoLNA5h/Plb5LzWAyzF+IVXdNnvO/6GcsyhjC1vmWZ7s2pO3fdOqzriy9asnJxZREoerDLppDAhiIAEtCfO3F5rW0a6z1PX4/nf53nG5RqqrpieSnULEVh8cx4E7ugH78H8tG9eP/24oVezY+pkpA8b/abhPF8le75BqdsXUtaFeaTlTI2IByEoU1l8oq1mkokcZHElIRoWmpejMMCMyCvQXyy7JjjuUcgOl4tLCzCMpTHgFpcgkViX/dH/ax2Szf8m2Yqc/MN+1r7BM/C/rfCtRDWEozSkbMjq7NTY5t13dqE6dhG3wsSqlp+C9DDi0ifLrqmT1f6BgUaPjiHN0lJAGAfvpWcI4XjiHIMF6ocO/EjmMa9HeelQ1LT1PRpoce/sJwOTCQtc+kfGQp6Uxl+9JWtmL+jNEaJ0gKBgbsygR58B4sHfwV5aliVWg3vCHv6ymHcdG868IzrVsK6pnd71+/dsmXxbD3m3/W2ybn0T1/bQFe5I8euX+9ybuqbXMPbDA7ZCKV4uMOecyz+9OfmWvj9x9zEw6JW+JuOX298WhE6qtwLEV3TL1tb/AWj7sqwfqaro/sdmcyM+vBp2XzzDEzaBiQsNH+e+eeTjQ+ohwqnG0BYhfVzNYKrkOmpyauYYH8KvD8G6RPBszrC6Jq+ystl0ghzXEZjR5+O4+iZwTh+eG7Yqa5rq/3hGzzTSkXKn4YgIITVABjBP+ZzP7i8ydasrZCetuCHvIvFRs92SEdlpnCYE2LOQi12OA7RNf1yjrphHIyE9yOXPnfNMDg70DpdTf8DWDKs5rRvMVwChAWrUgh21HzllD0NrigqlxKVC7bKQuOOWeGiuI7OTkhb6T8C/Xw3xkel9cXxj6eIxiY3Hhx3X9dHsWJwDaa3l1+zd9Mt/F4tUk/ijWnP+/DBb8++LWqvnh0c7NDGta0pO7kl6zpb8AJzEUr91kYEFdeBRCt69Nm4+AsSl6jwjVGckY6VwPwUpLhLURx9xliWvxFHi/w+zB0SWCnLsVpxnoXesSI2ngp4zmRJXPgf/0IleGH51R6uwjeX5MR76qtITh7+8N9Cp4GF7Sm8Zl1s35pVXVomm/5c1vG+Wm284njHJeJq44/FjixUAld8w7uijW6+xo3MhW2S6+oIVHumqpewglJ87+LFtcFUcqur+1vxwPcZJqYPMOyhXw6GKI4+4/GwQpjCBhe+6XDIpFb06PM+np5hhS5eXzw9bLJ2pBLGv4Fe36BU4kA6IQGw8MUY6MJywVeqDs54Z69zrWdY7jI3G1ZtUiSV6zzDI3IqLLew/wu9jspl+yywrA1pEed5QceXPT3jBb/DLrA5ua5UHZ/4eMTbFx+fwvE3DJO8fANrjlctL7giJhRx9MrfR89R+VgJ1Y6currONuwd0FNsxwtV02mPlWGLy1TxlPHf6Hh8PH9xesvw9yRM+5PIRT2ZIgVKKZxWUY/PT8aTFPji0i3m4Ed1hDWV/7uY9bNGtiGqAyorJRWSqCgdkrQiR5KddrwPlsq8xfhG6efvx8dvtiQczDdmmPaldDBxSVYeZ3GJXxUMWzxq5d4fPz7Ym7X1HTAL2A7NqtJHEQ3qtCPjw3LoxB/v+OMZ5VVzR5aHWRuErYA+y4uu6fM+Xl9J/lh7bFvbY+vmv0bWos9tsXAWSLIiaSnyApHxJz6SbFSFuXTw8i86r5vVRW1m+6IHmUREAuI0lcREP5q2ztWPrO9/YK54xsXHI56+cePvj3qBfimZNS+J5FWMcrjptThsRd4dPX9+DcwEd5iQphwozfkCwJKaLv9ewHYKeicfSudwShcnJDBBOD3MTwGRO0cqLIj73jQTaejDBYaPHTBgJ/i5+HyYijd95sFhRzkzB7yL2IrCtGwezj9nOQVTUlfPwiicifnu5J0qHHd8mXHIG6ZD7JQqIk9kJK6QwAokMWRUhMaSeJ0vcfaiXNhs7PyuwpYV51Vh+EM/Pu2M9GckpyiOuZm2Wvtom+Y4me8xPbvIIujzPu6Wbvyt1ejL3U7Sv/v754ZHsORwaX3KGdwiJhO5pzY+Mivk/urVq52jTnIXlEc78LKu8qAMx/G8kHhyOicosz0ovM3IrIDKb15HSvDoOoqv+hMLYCOWI8ash0vmufryZVcqLz4u8fym3ov1xT/EVp4UDUTn4/iS0xW+sZTMojASmLqGp64iH4FRXJQ2TKj+lv7JVRTVxwQkm9APyaboGnGMzSVR6VR87ipsVT645ovOzi5tamb6zzB1/nqzjz+s9YetwLioZW5C8jq08K9+1IxS8yQsfF6ap1WL2BK8VOaJc6NbPcPrx7wJ++hmHQUPvOaQgMJ3ETtVlERDP0wVsQ19uPgcLQyt/Dc+p4jlL6k/1xa2qVyh5ApEzEoErm/DsPOTXV3de6anq36roFyRdYWVbVSshHJEMt98saIXfIu9koplYZL6m/hUz7kS/Jt0/PE8+Jj6X/Y6k+fv2tA1BKIvB/OC8WnGAmp5dpqx3XW36fjgYK/upXbhFd+BrRlqn16MfkrspkoC4hnirYjbUVWzs4rHx8uL3cerjwt0TA4RcBcsuX8Rn97q54okVsCKJJ9YkSvy1gJR4aOtnAr6OJP+L13d+BKBKMEzHhAfgDh6yzD+vqHjTDDvYpAxLqwEfVdbE9bpIEi6V27tdLP+LnzPrWS/XrRTnz5d4e79+LNY7r4kP+Z7Jv7z1LyPL0B4Tb+ci9cXLy+eJ54e8Rw//rqqcUR+HOrgYVprJbBl5E2w63oI64J7k8mUDZLGhmAXs19ucVkxP8gKQu4ptCxbMy2TW3KAGI4u1P207ztH3CDx/7bL+Cdse8h1Zy5ev7Dp8uHD7blJuy0J69TV8XW6l92Dl3cbLG6g98idbhDgdANcY1ZY9o2N4mpNr96GRf1Da3Wui0RW69F1bWslvp81LD2xDTOGu9DhQzBc7AcYfYlkAqo6A6ozqHNBYJTESGitTGShsp0qQSxT4AcoPJQw0LBlEPhBFakHDjoLvY+XgVIyg7WK77tG8n9pvpHXBbXL+OMBd7FN6KLu+uf27esbX9RHdIkLbxvCGhgYsDb3v2a7obt7YHakpKmYiqgE2ioqJbzIOszXcSov/DAzRRNehyJKvPx4+igv/ZLKEaCkoZxUFMYXE1I8f7Xyq/UHp9CkAlfbCF3NdlhS7IQguA0N2wiJYy1ktC5IISb1Okr5jSYruy2SGlYkIkKLSC3yy/WrUWGzSnjaTUX/QEhYQuNewLCdwBFKRkpOuAfr4sBnwwfDg6B0MHagORhBHNqHw5WxTwYav6lAt/42MBLfrYZXHO9w3Ftr/B0Hp0pY+tkD29ddAz5ln8NGjddSlNPyhHV8aKjbzAS7Dd3egRcvgRHJWyrHASw9Pyp+vlSxEluH0jWAGQF9VVZMpxHVRZ/xSKQU4PR5Xy0+/sLQZCFS9DN/XKtSeh5WrL2x+sMyZv+W67+vwz5eC7oDx12rm9pakNg639B68XL3Qh+2Bm94DySxHhg0daBHSQhiCbyyyMS9SDi8RhEHyYP1qD9qak0S4VGn5VYrSTRKEkKHWYYiHuQmCYb/YKYLqS+3H5LYckxJmz6qhSYJ5yNgzgtuclESpncBfN8Fj3lgJdCSGpHcGECoxrouMoHjzO+4evLLMB1VKxJV8Wyj8Q80Ix043jnTu32hlTdkh08Yn7UWcnio9Qs3pzZm0lN7LCOxIdIZxbuQ1+lAVFFxJB7aMeUIiPkiPRPjo2v6dPF4FVjHnxi/oQK0Az/bymf5uI7ayGLj6eM63nrbF5VNXzV7nv3HViQL3JAEaSV1z0iBNJIgJBCYkSKJYbdjEiSHw7a0BI5s6QBBbINUswMUsQ6E11UojZGccA9dcZDBdQY+TgyFTgkiEKYyIBvstAQzIRk8cBJ+A2j4gZFDFWAqjAp3V5IhQYYwwUJ57ByS0QINzMYK8FyrRxt3KNbXb2qG/UVNT5wDyCt6/A0boGbdqzPA4tD21SPquWihPy1FWHjQzYs3xnZkM95ePIZd8RccBx1xez/UPowp46I4+uVcLD9/8Plq0Gfy6Jp+uez5uqPyY+UtNN5DuVQc06drpv4bIDXsjtsMpdkOSC79QK4Xog3PzwF4IBNCBiIhpBSpoE8jioqWaM2KCRuOqwLXgIQItKIe0lCYD/lZjoqgGIo0+J++SsmMKA8eqQ21qHuUh2PfzQHN6vgG6vVK8GfmQhcbr3Yff+AEi3rtdCtNF8u/eIWD2ATXx4Mg0XH1Vr/hm7sDQw8PvyvTrriKWocEE0C6oM/kJRJHrAykgj6WGlq+JUifu6YfS6pu4/UVa6AgQcXKi78ApekhcWFBwMstEkTX9MvVHw+Lt2ex+4+Pg62CxgsHEwZbAdgWIJfA+ICkfDRYtyAwWWB7Ay8F8VT/KB0bOJ4Gx/CQfUKSwZGrJJs8iZHYgB0zMB+zk8hopQ8hEcEog2ERASIBAOL5fIrVIKLxXKtzKPZLgZUckvGf+/nH5HsK0+Uz3316zeAjj3D23Lwu90w0ZwNpiZ72UnvwfO/AXIFnXfLBxLOsHn6yiLqmr3oQ04LHX9hq6TFHI6txrlYWkHj98UT1lh8vryR/rIKq6aO204drdP8hRWF3itmLUw42QnW1CSTSA2IAIXkWOBYKLWw8wjVqNkEaFqjFwLQNJhWI4ZiFoiq6QX0SbsEo6HMoWVFCYprwjw6FP65BXCSoXJwiOwpnFK9A6yiWkQhRDwA9XAfpwLS/AqnqSKP7jwapquiznXFXMn6x8Yg/X/HySvLHKqiaPlZfvf0H6BloAM/v3tpzHkJwUx59Uxb4GE5Lfnt2ZGS16SX3+F5mq4llfegtwnaSR6J5EC8hPUV6IDaS6aDnoZ5DpYe6AtdgOr4pyhXLNPH0KKCo/DDP7N+S+mI6qHzbQr7AbdgW+iylWn0l5cf6E29ftfSN6L9lGl04x30tOtMHklmLhxpClW9BL4S1T+i2uNPRp+0FflD0AN9A9LHnmHGBBfJCE3QL9ALiguoJqiu+64gDzWGIIAlhzhaSDsMV/yjJi3BxyY9khP9BXBSzEMY/AFORGMmM1yyKZfmm+ZKuJf4uMHV1THEj+o+S864E7zYd/8Dliqp2MamvPbt9uw4dY/M4DnXTuMuXx/scK9iHLcbryzfKwvOJBSGNPl10Tb8WV0xYyMFymDdXXv46Kq+ueChJQI4WlSUqf8StOf5CNdXqr9afxe8/Gm6AoLAqGKyCGLSG350ACFzKM2FvaeOseEhFOsjItdQ2S6wYYmkOdl2+CfLBvmpIV55vYY2Qn6uAxAWC40zbhxSmWArcQj0TSIiSU37mx0kgVesgLereOSz8E5EWJa6Qzyh1hZEcO7xY4Ct9WLfNvwa+5xA2h6uGP6vMPxMsZ8WNf0Gf+cOCw9usq51a5+kNG9Sn1IjJsjoO0LI7EpVra/vxhPdFs7JyjYriohlbTAKGxO1C6oJEljseOLqmTxfPX66OucJK66OUNzuDjK7p05UIbGwX25I/vrj4BYrnD0uZ/Rtvfzz9fPsPIkgkbL0DZNMFRVEHFEY2ZCBTcwMLdfCsCCVN4SwpE9YG+ARNgD24IDHYSYB1yNCYDkLRFoC8oOUG40AKQx5IYyAmlQ6SF7dDoSof0hbJiApzqLs43aPc5UG+AvVQ/4T7nGQFQiJ5kdbAkmgH2Sz0FaWB4gLrad22v4nmuvPt/yzCc1+V4t0e4z93r8PYwDCvNANxLSthkai0jmCf5+jq6y6Y4SkjTfoKprgWufj9Dg3AozBmiK7pl3H8WDH3u0YfLY6u6c/HVS2vSvsxoygyTF2q/qNenEyjJ5NJPYGPRidME1M1/JYqwyoNq32Ihu4J0z5M+WA2DoqwEI9wfmEaEhQJzPNsKNOh0jJwrfRVJqbnNOrC6IGwQFzgHiKrpCuq2kE+FizrMXWE7IWCEKemg7hSiimOQchNIC3EchqpHlBO95TshQThkwF5TL9k+Mm/MZLGzVo3AlQdLzagDle1vCYd/wU9/5Z5ZcyZPnNow/J8ZHZZCGtsbKw3rdn7nIzTx42o0WfP1cPKuYJ6XPFs5q7p8zmKx5v8cdcxDeMPOR1fj+gh4X10TV/dukiC+nJPeLy8eH1hrtm/UVvpKxcrP2oL/dlcs1eQ9PCeo73wGcp+R2Xyvlp74vH19B9EkoA2CYKUlcQqJCQj6vkoyBjh/IurcJiy4Zxy2FMptRBO7sK3kClR0UYUZAX+wMqfC1ICiYHMYBsKSQsSFKaAUEqZLoiK00ASFsgpN0UEUWE6yOkiiArE6NmUb91OWwAAEuNJREFUszCNxA0c/uBoF04W86YOarWQAYjGmHBBEIkUiXEqib025hNmInWknv6zKo77Sh3/RvcfSx5Xl4O4yr5Y7NxiuEEQFT4uvs8yrF5VvosX28LLS185vsiRHkc9YPiJtrCbJIzHyx3gJdfpl80flZWPR6qIxJghus7xjSqj4E9UNn2VvN76Csqq6XIR+48OYEeGlcAaXhLfQwxNQcgQEI9IErOOxBUuCuDLz9Arm5iyOTaYy7Jty8hAb2VCm43ZmwnwQTbgFpAWyA4SGEKhaMdgYNpngKAcpeMCAfFjYGE4yAqco3RZ0LorUqOkxVkf6AgzvFBPFbISSsOUD+WRrWijpcwbmI4Gomj4yxAIv4bPVU+q9sfxk/EP36UlfP49N3vNWr/m9CZdX/zzjDDofAoW3XHVr9NPHdB8p2+uORl/mjFLUktMbBTtkSJbpLCRxYyD5OpJps/4+DJuvq5IIgoLqfi3pLzcRuloM7QSzKImsBSWG80LVKkxkSvOkFHaCjL5QvrPN9rwvaSVtEg2ICmQCNRQkGjwnlOpNktMxdds+GxcRFrIyCmhTQMEUJjl4qwtzPbAOVC8o0DUZroGiMmBpEUfRBZ4DvRUJC4/1GOpij1ML9XU0PJdFxIZGsOpJkkOQ0YdFh5CPodKl0WfRqQkVUhTIEf1iN4GkdJU4Rx/xsJfHkpfMv4cd+IAUJb1+YdkfSU7NXp6+/bti7qquKiEdfVq0Gl2TO2DonYzAcUTCv0slCB8FuGia/q8j7iAPl30aNIPHVKq55w+00MvjFLo05WmV8H5P9XLzydVF/H0xbGl9UGfjm226B98po2u6fO+0f3H9M7SbT1h+FoS00ybSmm+5/RZHxzbwWvVHtSvNuLRR4BKl0vPtHRhWh1SESUsNBkH0qjvNiAx4MA1JDBc4yBmTPmwJArJCFM+dA1SE5XsmFIqRTzKUrZYkMio78IUkauFoW6Mcbin1GWrOR8nqOEUEUQFmuK3ZdEw6NFg92s9j3XLp0CIsAuS8VdPkcKhCZ9/KAc81x/c3NdzFjy6KHZc0YPNh7VhDg9jYnh4co9n2dvx1nLalys7Rimx2xLGigfEJBQ0Xr149FkBVb04BQiTlPAFbTiDxRGKM1pJf5AgarPKG0sQu413N07hkCANO5m0fSebtCwziW5DqMISHTRMJCDF23inYbmsauNCHq+Vn1ta5dErzKN8psP/RiIXVpAegKJQ30Y06AQSEXdAIpdL0wbTNsLpoSIeCwRJHZYBpTusIFAIlPC0iqL5AxoCcmLPQkkLdITRCc0dSFqQD1A51g4pLOXmhZCwDMO2BpH9q6ZtDoU4oKQIy5yEynFnv+mzw+0+/q3Sf5yT4aYs89zq1alLIK7wYeQANcCpgW5AOaqIARzxcudrXrMTz+cuFAxBI1Rw06eLKz3xsnDikt+Mmr9mWBlXrbySeJAlTt8MXJImXHRNv0zx2GpWZ3r0KKqzXHlRHH26+fQf+mkbg56ADjppUuihMJl7BEhGtmnj+4Phj1lEUAzjaQcgJkzcqPPmlI/yjdJV8Trf/+hbeYyP0uMS0zSVF8SEaSELxkhR6a7IC1IVHkNMBWEkCljxYQ7YXgWKrDCHw2ohJDDKSkr5Tst3TANBp7DdgkTFKSOpxYMtV2i3hXQoJjwbBo3L4oibAajdXmSbCl01PEvi6x3PetMvwfi3cv+xHpPRk8GZvo6Oq5y5FvZlvtfqQZ5v5igfH7iRdHqrn/H24McyEb6ejCUxkCwqEATi8JDNKtWRIxI6wrLj+aOyQgIqLT/KTZ+OLYnCFGHE60PdSgzIgVmcfrbt5evjYkB97VeNyv8plx/UYoChElhYgB7KtD3PAUWRpejIVNzNAjNzyDuYRqnrMF5dIx4CkTrlAJQRps2FhZIX5lqYwfFLOygTBeSmkUhDEgNvIC7MR5ML6JhozoCpn+858G1utbH4j7BRT0Z9VlZzbTyOKJCKeCjkqYbkFBJh+DXCPVcKuXKIFURlm8WBoZSFOBCYmk6i33ioT+Kw1CegEMspcFfe+M8+rRySNum/YUwm9I7TPT04NWOBDg/nwtz16xMbEp3mPswIOuI6G7wBSlynz1pQWZEIP0smIcEEWN3QsfJDn+nj9FFSPh73wilgdE2f+eOumo4pPqWI2kI/LKu4RVXLq7H/kJopRUFhnkj4joNT9KC/BlZgAIVD1I+cwASVUBgCIsF1KEQxJLpGPKHGP5LYrAs5ikREnmJ61KF4K5cG1+REVS6HC1JauGroYYcOrLWUEp6MSF0UpoZgK5hV2dgEzeNLYbMBnRQZEUPnOwGMT6GOp57Kg/0WTCMYjnsQHpDmlJFTR5IcNt/alvV1PdF5NsKcLSpGG03L6QcjnWDpeIXqgFYb//A9wGi1+fMPDeqY7nae6uvT530KKp+JebkhHJyX6Fqz33X83tCgRr1d6gXBH+XnFtEwDmEVMBfAtbK7UvHxVTb1gGLQokbFVBZMDtUJHmT+dsPxmqSRU2nkrxkWxhfbOfEVwLov4sIaonSRr1qZy6vy8xliPbn+qPjYHxSm6mJwdB357DfaVtJ/BMLeW0/ayVQSR6TA5AB7h8kwmFeRrFBUSFYkJk7GsM+F5SuiCQmFBEriCskHYcxfEM9ozBjBS/yaKD//rBzndjD3BHswAcmqwFdhOWGugCw5owwpEt9sxMlVGWQEK4GlcAOi1XAcL6eLICfdcMFmNDnH7xdO/YTCHTkxM2B6EiSPbuXmHrZO5eJy4Iu6lfo2Gu8orFfA+PM9UMjnHpBIx9v+/Q9Wm8nMfcMTE1d7u7vP4Ec6fzy1wqOGP3xI63JHjgT2/rsy/boTbMP0pe78dVUWS5wjK0VUjIqNN3kA62ZYeIcfxofXDFNFUZBTT4W6m71mWBlXrb4yWSoEYWh0jVIUdJEmzA6o18mRDN7dCplCEkK8IiP4WRAU9OO8j5wimZB3SAhKYlJEphLkJCaSEP7PEdxsfVG5UWFxP6qPPngTlvBED6IWLN8dTPmg8ocFPPRXWBdlFWqqCEmLlhAgLRtKdLaAkpQNfRUM6DUQGOUiTimNEaT7FvRVw/F6K91XG4/mHf9KPaovvJ36jzfSS1mpc6mUdhnvhZL4a0GjZsKBKK+n0+kt0AHvztCAsIzjeeAeUKVPF1l101cBWCICxcGmcPalUeHRnyguIsJYej79fFnpKxdjrKhu+spVK69Ke+OW6SXlh7Xk/8b7D5umJKY6nUiQAEmp5ZKoD5Ay8kTFzcAsJIrL+ZREYCWAaU4ubXRNP8wfpuSuGubHMwCJhSuGPCiYJIMw5GV6xkfY0Wd+WoPiBAlEhvnzNluw3SKZYTkQHIQ5J1RQDg7Lw/QQGUIdFp4wcC9KgQ/7KkxjucEHROVmc3ZaCFfEjMxUvlPvBZ0WhT1Q1zG06hQKyGPA9qEh4bPRJuO/0p//WvoPyXpa77BPr9L1mn64QiJRT0vlP3jg1oyn0/th1dnN6VOkQyh8wVRuPpLUH9GHi+sckD4vLaj43NSHLwfv8cKjbGxdgc97JUpFpIRbpovKYHTUltkpHYkyEqNYf1gWfZU+Vn+JiMZERS4qKyTAMv1hmwoItLT/aL6OL9cn8A4mknhDkR5CUuh43ExhAXjnIQVxRQ9UwnU1JM73meHISINzlY/1Ir3jwNQBtui5IpU3K2mFZbEUEhgJiHlZhkqI8rws7hPFxBHlZ5romu1CGRSv2HyQEQiLPkwefJcSk2o0mU+F8Z46KswbKd8qvRUWiq7BsuoYlF/q+Jd839p4/KNnFHhw+Fbc819r/y3dHO7qsk9D2lLPBvEq59SLXC6CYSCq1OTk5F48g+FxLyQSvvyzhFK8taaYL1ACiYdkkSOg/HVO4irmAySLlR8+yHy5wnaWysTF7YmnRxdyecMXFDcxx3KjNCUEGUtb2r4Iixwh5qebxEG58v2Hkh0ERqlLp5kClNLkngLSyF8XExrZi089SYbFm9DRg1FCbEKyoxQE8sqFkTOgTwrDVIPCP/k8qpRcGrxMEXmxnpwjUeXbhjpgA2bBNsp0HPQWOiwNOnddw5YcNIdSFyzTlUKehEbrLDxDNn7osjCXPw5FO22qgPfKHn/pf8XxxxetvSvYlX8BxBVKCdGDmPPDhz0W+Oijjxof//jHt+Hh2oko/qKqFx4l0BJQmQIwS3RNn/fxZXqGFbq4nQzimI9tKFs+S1S1KJ9XoQkEfUQwtKg98fSzefMMwmx5F28/IqK2RLjM2b54/gX0H0v6+IiDZSVgHJogfYWNzDMUpCtsUkKg4pKIUJAsnNTlkjNWzfBCPMOhi8JAiCSqPBmyMFVQ1OdctQwLywNZ5cPCpDl80D6IhjzBASQF0sUeREpSJCyE4ceSpJXbEO2612AHepaTSRn/YrtEAD3n8xV/ntv4+S96nyGRO9gccQZmEPiBK3bRi5kPHcG+v2T32n2+53bxNY8oQyWIB0SR9OmqxMeTh5lm/8azx8srEbCQNSqTpUTX+eagwCiPqiWeQAXO/olHV2tPaYUFjWCxsQJjt7MV564K6iOB2Xj1adNGa3PqDMFl4XwSSnAQCUIibqFPlwtTwbiOkoSR+JvLx3KYv9BXaSrlLyifSegQBNMFTAWhiIeFArRZnoX+8Y2EzKhbnuNlYO9wFpZXkwoH5Kmj/6qOFTz+0n8+Y4Y/2pVIcJqY35+YJ6wjEN33ZzL9kPY3hWjx6Sv+RcByLIQAZZYQJSn2C944FRF/QkvjQ31XZDcV04GVPOGl+WdJEhVGbaNPV3d7Va7ZP83U/1ACgzTjkg4gjUFvHhGWkrPAPnnBLNeFSEKKfAbzOu9yBAUdVj6cZURpZuU3XOUILioD93x2IEnxxFGc9c6M+M93cHSNZVzHquBQDeMn4x898wQ2us7pgGvAbyU8/z5e5EupVEqtJirCgp4KHxVI7sbrQIYKHyKF3+yvIvEEX8FsQNk9qXwgBpgQwNo7p9OKrukzfdzF08+WTmYrV35YF+tU8bEpYImInGtLVH+8PkzZ8iQcVpjrawXCLOHH5uo/9JmWjbXHJMQcNhVW8bOklbsumnJw7Q+cgtVK2mJxAUNNKKncp54KHuzAwnjCE01B1UIHA1A80ik/IkdIfTj6mE8MXh2sSKZhdHUd+IcDykwFLj4eMv7Fv+il75c8/xEmeHaojD+jZ4LgbsPVVvO5iutg4oSAFCCiAqVp/jrUKRU8mzVexsube05ff3tiD0Q1wkP/ojrYgeiaftiheHsjLKL4GrudTxYvb0H9h94bpzeAwCD4cAqJf5SmlBjFH5D8ChVC1Q8KyIkrjtgbE64y4lqtINJHel5Hq4q4ZdsYzsWBWaU+rkFWtFzQbiNNnWciNbT/qD4+Hitq/FdE/3mWzmvQU+W4hZZPenQuRHRNfylcvfVjpUqz0Tj6dNE1/fm4euufTx1z5am3/hr6z6lj9A9ElneKwPJ3IYEVEpqKys0YFeUhoDBP4TV/+bjVIkfqKuu8/ixC/+tqR73111V4DYnrrb+G8a+h1tkk9dY/m7MxV7XUzwdP3ApBgCYG6Co+L6/+kcB4X0g0ERFFzwXjojBc5q8ZhqOKtWEoROmLEwSWBIHowVySyqSS5kIABEYhisRFEov8SgRWGD6K9OMgq8IwBIkTBBYXASGsxcW3pUoHgfF5iIiLPv9x+03kuLxMqaqsUj1KJL4gsFgICGEtFrJtUG6OwDhtJHHhqLOl+dBAG0AnXRAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBIGVhMD/D0fV/fpMMM+gAAAAAElFTkSuQmCC"
+  }
+};
+exports.NoNetwork = NoNetwork;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/noticeBar.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/noticeBar.js
new file mode 100644
index 0000000..54f4159
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/noticeBar.js
@@ -0,0 +1,20 @@
+"use strict";
+const NoticeBar = {
+  // noticeBar
+  noticeBar: {
+    text: [],
+    direction: "row",
+    step: false,
+    icon: "volume",
+    mode: "",
+    color: "#f9ae3d",
+    bgColor: "#fdf6ec",
+    speed: 80,
+    fontSize: 14,
+    duration: 2e3,
+    disableTouch: true,
+    url: "",
+    linkType: "navigateTo"
+  }
+};
+exports.NoticeBar = NoticeBar;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/notify.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/notify.js
new file mode 100644
index 0000000..cc2cf75
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/notify.js
@@ -0,0 +1,15 @@
+"use strict";
+const Notify = {
+  // notify组件
+  notify: {
+    top: 0,
+    type: "primary",
+    color: "#ffffff",
+    bgColor: "",
+    message: "",
+    duration: 3e3,
+    fontSize: 15,
+    safeAreaInsetTop: false
+  }
+};
+exports.Notify = Notify;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/numberBox.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/numberBox.js
new file mode 100644
index 0000000..e9dc5e0
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/numberBox.js
@@ -0,0 +1,28 @@
+"use strict";
+const NumberBox = {
+  // 步进器组件
+  numberBox: {
+    name: "",
+    value: 0,
+    min: 1,
+    max: Number.MAX_SAFE_INTEGER,
+    step: 1,
+    integer: false,
+    disabled: false,
+    disabledInput: false,
+    asyncChange: false,
+    inputWidth: 35,
+    showMinus: true,
+    showPlus: true,
+    decimalLength: null,
+    longPress: true,
+    color: "#323233",
+    buttonSize: 30,
+    bgColor: "#EBECEE",
+    cursorSpacing: 100,
+    disableMinus: false,
+    disablePlus: false,
+    iconStyle: ""
+  }
+};
+exports.NumberBox = NumberBox;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/numberKeyboard.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/numberKeyboard.js
new file mode 100644
index 0000000..0e7e48c
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/numberKeyboard.js
@@ -0,0 +1,10 @@
+"use strict";
+const NumberKeyboard = {
+  // 数字键盘
+  numberKeyboard: {
+    mode: "number",
+    dotDisabled: false,
+    random: false
+  }
+};
+exports.NumberKeyboard = NumberKeyboard;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/overlay.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/overlay.js
new file mode 100644
index 0000000..41f56be
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/overlay.js
@@ -0,0 +1,11 @@
+"use strict";
+const Overlay = {
+  // overlay组件
+  overlay: {
+    show: false,
+    zIndex: 10070,
+    duration: 300,
+    opacity: 0.5
+  }
+};
+exports.Overlay = Overlay;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/parse.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/parse.js
new file mode 100644
index 0000000..aca1624
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/parse.js
@@ -0,0 +1,15 @@
+"use strict";
+const Parse = {
+  // parse
+  parse: {
+    copyLink: true,
+    errorImg: "",
+    lazyLoad: false,
+    loadingImg: "",
+    pauseVideo: true,
+    previewImg: true,
+    setTitle: true,
+    showImgMenu: true
+  }
+};
+exports.Parse = Parse;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/picker.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/picker.js
new file mode 100644
index 0000000..cdd3048
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/picker.js
@@ -0,0 +1,23 @@
+"use strict";
+const Picker = {
+  // picker
+  picker: {
+    show: false,
+    popupMode: "bottom",
+    showToolbar: true,
+    title: "",
+    columns: [],
+    loading: false,
+    itemHeight: 44,
+    cancelText: "取消",
+    confirmText: "确定",
+    cancelColor: "#909193",
+    confirmColor: "#3c9cff",
+    visibleItemCount: 5,
+    keyName: "text",
+    closeOnClickOverlay: false,
+    defaultIndex: [],
+    immediateChange: false
+  }
+};
+exports.Picker = Picker;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/popup.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/popup.js
new file mode 100644
index 0000000..de3ed75
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/popup.js
@@ -0,0 +1,22 @@
+"use strict";
+const Popup = {
+  // popup组件
+  popup: {
+    show: false,
+    overlay: true,
+    mode: "bottom",
+    duration: 300,
+    closeable: false,
+    overlayStyle: {},
+    closeOnClickOverlay: true,
+    zIndex: 10075,
+    safeAreaInsetBottom: true,
+    safeAreaInsetTop: false,
+    closeIconPos: "top-right",
+    round: 0,
+    zoom: true,
+    bgColor: "",
+    overlayOpacity: 0.5
+  }
+};
+exports.Popup = Popup;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/radio.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/radio.js
new file mode 100644
index 0000000..c44b5b2
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/radio.js
@@ -0,0 +1,20 @@
+"use strict";
+const Radio = {
+  // radio组件
+  radio: {
+    name: "",
+    shape: "",
+    disabled: "",
+    labelDisabled: "",
+    activeColor: "",
+    inactiveColor: "",
+    iconSize: "",
+    labelSize: "",
+    label: "",
+    labelColor: "",
+    size: "",
+    iconColor: "",
+    placement: ""
+  }
+};
+exports.Radio = Radio;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/radioGroup.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/radioGroup.js
new file mode 100644
index 0000000..3f22099
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/radioGroup.js
@@ -0,0 +1,23 @@
+"use strict";
+const RadioGroup = {
+  // radio-group组件
+  radioGroup: {
+    value: "",
+    disabled: false,
+    shape: "circle",
+    activeColor: "#2979ff",
+    inactiveColor: "#c8c9cc",
+    name: "",
+    size: 18,
+    placement: "row",
+    label: "",
+    labelColor: "#303133",
+    labelSize: 14,
+    labelDisabled: false,
+    iconColor: "#ffffff",
+    iconSize: 12,
+    borderBottom: false,
+    iconPlacement: "left"
+  }
+};
+exports.RadioGroup = RadioGroup;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/rate.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/rate.js
new file mode 100644
index 0000000..97aa987
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/rate.js
@@ -0,0 +1,19 @@
+"use strict";
+const Rate = {
+  // rate组件
+  rate: {
+    value: 1,
+    count: 5,
+    disabled: false,
+    size: 18,
+    inactiveColor: "#b2b2b2",
+    activeColor: "#FA3534",
+    gutter: 4,
+    minCount: 1,
+    allowHalf: false,
+    activeIcon: "star-fill",
+    inactiveIcon: "star",
+    touchable: true
+  }
+};
+exports.Rate = Rate;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/readMore.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/readMore.js
new file mode 100644
index 0000000..a78b216
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/readMore.js
@@ -0,0 +1,15 @@
+"use strict";
+const ReadMore = {
+  // readMore
+  readMore: {
+    showHeight: 400,
+    toggle: false,
+    closeText: "展开阅读全文",
+    openText: "收起",
+    color: "#2979ff",
+    fontSize: 14,
+    textIndent: "2em",
+    name: ""
+  }
+};
+exports.ReadMore = ReadMore;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/row.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/row.js
new file mode 100644
index 0000000..faa9d7d
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/row.js
@@ -0,0 +1,10 @@
+"use strict";
+const Row = {
+  // row
+  row: {
+    gutter: 0,
+    justify: "start",
+    align: "center"
+  }
+};
+exports.Row = Row;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/rowNotice.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/rowNotice.js
new file mode 100644
index 0000000..0b4c5fa
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/rowNotice.js
@@ -0,0 +1,14 @@
+"use strict";
+const RowNotice = {
+  // rowNotice
+  rowNotice: {
+    text: "",
+    icon: "volume",
+    mode: "",
+    color: "#f9ae3d",
+    bgColor: "#fdf6ec",
+    fontSize: 14,
+    speed: 80
+  }
+};
+exports.RowNotice = RowNotice;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/scrollList.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/scrollList.js
new file mode 100644
index 0000000..a196408
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/scrollList.js
@@ -0,0 +1,13 @@
+"use strict";
+const ScrollList = {
+  // scrollList
+  scrollList: {
+    indicatorWidth: 50,
+    indicatorBarWidth: 20,
+    indicator: true,
+    indicatorColor: "#f2f2f2",
+    indicatorActiveColor: "#3c9cff",
+    indicatorStyle: ""
+  }
+};
+exports.ScrollList = ScrollList;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/search.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/search.js
new file mode 100644
index 0000000..4602106
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/search.js
@@ -0,0 +1,30 @@
+"use strict";
+const Search = {
+  // search
+  search: {
+    shape: "round",
+    bgColor: "#f2f2f2",
+    placeholder: "请输入关键字",
+    clearabled: true,
+    focus: false,
+    showAction: true,
+    actionStyle: {},
+    actionText: "搜索",
+    inputAlign: "left",
+    inputStyle: {},
+    disabled: false,
+    borderColor: "transparent",
+    searchIconColor: "#909399",
+    searchIconSize: 22,
+    color: "#606266",
+    placeholderColor: "#909399",
+    searchIcon: "search",
+    margin: "0",
+    animation: false,
+    value: "",
+    maxlength: "-1",
+    height: 32,
+    label: null
+  }
+};
+exports.Search = Search;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/section.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/section.js
new file mode 100644
index 0000000..3d64d5f
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/section.js
@@ -0,0 +1,17 @@
+"use strict";
+const Section = {
+  // u-section组件
+  section: {
+    title: "",
+    subTitle: "更多",
+    right: true,
+    fontSize: 15,
+    bold: true,
+    color: "#303133",
+    subColor: "#909399",
+    showLine: true,
+    lineColor: "",
+    arrow: true
+  }
+};
+exports.Section = Section;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/skeleton.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/skeleton.js
new file mode 100644
index 0000000..b47320a
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/skeleton.js
@@ -0,0 +1,18 @@
+"use strict";
+const Skeleton = {
+  // skeleton
+  skeleton: {
+    loading: true,
+    animate: true,
+    rows: 0,
+    rowsWidth: "100%",
+    rowsHeight: 18,
+    title: true,
+    titleWidth: "50%",
+    titleHeight: 18,
+    avatar: false,
+    avatarSize: 32,
+    avatarShape: "circle"
+  }
+};
+exports.Skeleton = Skeleton;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/slider.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/slider.js
new file mode 100644
index 0000000..bab9330
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/slider.js
@@ -0,0 +1,18 @@
+"use strict";
+const Slider = {
+  // slider组件
+  slider: {
+    value: 0,
+    blockSize: 18,
+    min: 0,
+    max: 100,
+    step: 1,
+    activeColor: "#2979ff",
+    inactiveColor: "#c0c4cc",
+    blockColor: "#ffffff",
+    showValue: false,
+    disabled: false,
+    blockStyle: {}
+  }
+};
+exports.Slider = Slider;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/statusBar.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/statusBar.js
new file mode 100644
index 0000000..35e4836
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/statusBar.js
@@ -0,0 +1,8 @@
+"use strict";
+const StatusBar = {
+  // statusBar
+  statusBar: {
+    bgColor: "transparent"
+  }
+};
+exports.StatusBar = StatusBar;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/steps.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/steps.js
new file mode 100644
index 0000000..4d10536
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/steps.js
@@ -0,0 +1,14 @@
+"use strict";
+const Steps = {
+  // steps组件
+  steps: {
+    direction: "row",
+    current: 0,
+    activeColor: "#3c9cff",
+    inactiveColor: "#969799",
+    activeIcon: "",
+    inactiveIcon: "",
+    dot: false
+  }
+};
+exports.Steps = Steps;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/stepsItem.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/stepsItem.js
new file mode 100644
index 0000000..1530b2d
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/stepsItem.js
@@ -0,0 +1,11 @@
+"use strict";
+const StepsItem = {
+  // steps-item组件
+  stepsItem: {
+    title: "",
+    desc: "",
+    iconSize: 17,
+    error: false
+  }
+};
+exports.StepsItem = StepsItem;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/sticky.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/sticky.js
new file mode 100644
index 0000000..8ee378a
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/sticky.js
@@ -0,0 +1,13 @@
+"use strict";
+const Sticky = {
+  // sticky组件
+  sticky: {
+    offsetTop: 0,
+    customNavHeight: 0,
+    disabled: false,
+    bgColor: "transparent",
+    zIndex: "",
+    index: ""
+  }
+};
+exports.Sticky = Sticky;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/subsection.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/subsection.js
new file mode 100644
index 0000000..539cb65
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/subsection.js
@@ -0,0 +1,16 @@
+"use strict";
+const Subsection = {
+  // subsection组件
+  subsection: {
+    list: [],
+    current: 0,
+    activeColor: "#3c9cff",
+    inactiveColor: "#303133",
+    mode: "button",
+    fontSize: 12,
+    bold: true,
+    bgColor: "#eeeeef",
+    keyName: "name"
+  }
+};
+exports.Subsection = Subsection;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/swipeAction.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/swipeAction.js
new file mode 100644
index 0000000..a6deb66
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/swipeAction.js
@@ -0,0 +1,8 @@
+"use strict";
+const SwipeAction = {
+  // swipe-action组件
+  swipeAction: {
+    autoClose: true
+  }
+};
+exports.SwipeAction = SwipeAction;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/swipeActionItem.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/swipeActionItem.js
new file mode 100644
index 0000000..2754ebf
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/swipeActionItem.js
@@ -0,0 +1,14 @@
+"use strict";
+const SwipeActionItem = {
+  // swipeActionItem 组件
+  swipeActionItem: {
+    show: false,
+    name: "",
+    disabled: false,
+    threshold: 20,
+    autoClose: true,
+    options: [],
+    duration: 300
+  }
+};
+exports.SwipeActionItem = SwipeActionItem;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/swiper.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/swiper.js
new file mode 100644
index 0000000..fccb1a6
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/swiper.js
@@ -0,0 +1,31 @@
+"use strict";
+const Swiper = {
+  // swiper 组件
+  swiper: {
+    list: [],
+    indicator: false,
+    indicatorActiveColor: "#FFFFFF",
+    indicatorInactiveColor: "rgba(255, 255, 255, 0.35)",
+    indicatorStyle: "",
+    indicatorMode: "line",
+    autoplay: true,
+    current: 0,
+    currentItemId: "",
+    interval: 3e3,
+    duration: 300,
+    circular: false,
+    previousMargin: 0,
+    nextMargin: 0,
+    acceleration: false,
+    displayMultipleItems: 1,
+    easingFunction: "default",
+    keyName: "url",
+    imgMode: "aspectFill",
+    height: 130,
+    bgColor: "#f3f4f6",
+    radius: 4,
+    loading: false,
+    showTitle: false
+  }
+};
+exports.Swiper = Swiper;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/swipterIndicator.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/swipterIndicator.js
new file mode 100644
index 0000000..db3258d
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/swipterIndicator.js
@@ -0,0 +1,12 @@
+"use strict";
+const SwipterIndicator = {
+  // swiperIndicator 组件
+  swiperIndicator: {
+    length: 0,
+    current: 0,
+    indicatorActiveColor: "",
+    indicatorInactiveColor: "",
+    indicatorMode: "line"
+  }
+};
+exports.SwipterIndicator = SwipterIndicator;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/switch.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/switch.js
new file mode 100644
index 0000000..7b7c272
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/switch.js
@@ -0,0 +1,17 @@
+"use strict";
+const Switch = {
+  // switch
+  switch: {
+    loading: false,
+    disabled: false,
+    size: 25,
+    activeColor: "#2979ff",
+    inactiveColor: "#ffffff",
+    value: false,
+    activeValue: true,
+    inactiveValue: false,
+    asyncChange: false,
+    space: 0
+  }
+};
+exports.Switch = Switch;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/tabbar.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/tabbar.js
new file mode 100644
index 0000000..40f245e
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/tabbar.js
@@ -0,0 +1,15 @@
+"use strict";
+const Tabbar = {
+  // tabbar
+  tabbar: {
+    value: null,
+    safeAreaInsetBottom: true,
+    border: true,
+    zIndex: 1,
+    activeColor: "#1989fa",
+    inactiveColor: "#7d7e80",
+    fixed: true,
+    placeholder: true
+  }
+};
+exports.Tabbar = Tabbar;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/tabbarItem.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/tabbarItem.js
new file mode 100644
index 0000000..e0b926f
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/tabbarItem.js
@@ -0,0 +1,13 @@
+"use strict";
+const TabbarItem = {
+  //
+  tabbarItem: {
+    name: null,
+    icon: "",
+    badge: null,
+    dot: false,
+    text: "",
+    badgeStyle: "top: 6px;right:2px;"
+  }
+};
+exports.TabbarItem = TabbarItem;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/tabs.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/tabs.js
new file mode 100644
index 0000000..716935f
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/tabs.js
@@ -0,0 +1,25 @@
+"use strict";
+const Tabs = {
+  //
+  tabs: {
+    duration: 300,
+    list: [],
+    lineColor: "#3c9cff",
+    activeStyle: {
+      color: "#303133"
+    },
+    inactiveStyle: {
+      color: "#606266"
+    },
+    lineWidth: 20,
+    lineHeight: 3,
+    lineBgSize: "cover",
+    itemStyle: {
+      height: "44px"
+    },
+    scrollable: true,
+    current: 0,
+    keyName: "name"
+  }
+};
+exports.Tabs = Tabs;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/tag.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/tag.js
new file mode 100644
index 0000000..37b1c9f
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/tag.js
@@ -0,0 +1,23 @@
+"use strict";
+const Tag = {
+  // tag 组件
+  tag: {
+    type: "primary",
+    disabled: false,
+    size: "medium",
+    shape: "square",
+    text: "",
+    bgColor: "",
+    color: "",
+    borderColor: "",
+    closeColor: "#C6C7CB",
+    name: "",
+    plainFill: false,
+    plain: false,
+    closable: false,
+    show: true,
+    icon: "",
+    iconColor: ""
+  }
+};
+exports.Tag = Tag;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/text.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/text.js
new file mode 100644
index 0000000..9aeaf88
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/text.js
@@ -0,0 +1,30 @@
+"use strict";
+const Text = {
+  // text 组件
+  text: {
+    type: "",
+    show: true,
+    text: "",
+    prefixIcon: "",
+    suffixIcon: "",
+    mode: "",
+    href: "",
+    format: "",
+    call: false,
+    openType: "",
+    bold: false,
+    block: false,
+    lines: "",
+    color: "#303133",
+    size: 15,
+    iconStyle: {
+      fontSize: "15px"
+    },
+    decoration: "none",
+    margin: 0,
+    lineHeight: "",
+    align: "left",
+    wordWrap: "normal"
+  }
+};
+exports.Text = Text;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/textarea.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/textarea.js
new file mode 100644
index 0000000..591eb85
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/textarea.js
@@ -0,0 +1,29 @@
+"use strict";
+const Textarea = {
+  // textarea 组件
+  textarea: {
+    value: "",
+    placeholder: "",
+    placeholderClass: "textarea-placeholder",
+    placeholderStyle: "color: #c0c4cc",
+    height: 70,
+    confirmType: "done",
+    disabled: false,
+    count: false,
+    focus: false,
+    autoHeight: false,
+    fixed: false,
+    cursorSpacing: 0,
+    cursor: "",
+    showConfirmBar: true,
+    selectionStart: -1,
+    selectionEnd: -1,
+    adjustPosition: true,
+    disableDefaultPadding: false,
+    holdKeyboard: false,
+    maxlength: 140,
+    border: "surround",
+    formatter: null
+  }
+};
+exports.Textarea = Textarea;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/toast.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/toast.js
new file mode 100644
index 0000000..d4a014a
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/toast.js
@@ -0,0 +1,22 @@
+"use strict";
+const Toast = {
+  // toast组件
+  toast: {
+    zIndex: 10090,
+    loading: false,
+    text: "",
+    icon: "",
+    type: "",
+    loadingMode: "",
+    show: "",
+    overlay: false,
+    position: "center",
+    params: {},
+    duration: 2e3,
+    isTab: false,
+    url: "",
+    callback: null,
+    back: false
+  }
+};
+exports.Toast = Toast;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/toolbar.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/toolbar.js
new file mode 100644
index 0000000..aabe47d
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/toolbar.js
@@ -0,0 +1,13 @@
+"use strict";
+const Toolbar = {
+  // toolbar 组件
+  toolbar: {
+    show: true,
+    cancelText: "取消",
+    confirmText: "确认",
+    cancelColor: "#909193",
+    confirmColor: "#3c9cff",
+    title: ""
+  }
+};
+exports.Toolbar = Toolbar;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/tooltip.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/tooltip.js
new file mode 100644
index 0000000..1a82f6b
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/tooltip.js
@@ -0,0 +1,18 @@
+"use strict";
+const Tooltip = {
+  // tooltip 组件
+  tooltip: {
+    text: "",
+    copyText: "",
+    size: 14,
+    color: "#606266",
+    bgColor: "transparent",
+    direction: "top",
+    zIndex: 10071,
+    showCopy: true,
+    buttons: [],
+    overlay: true,
+    showToast: true
+  }
+};
+exports.Tooltip = Tooltip;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/transition.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/transition.js
new file mode 100644
index 0000000..f819e1b
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/transition.js
@@ -0,0 +1,11 @@
+"use strict";
+const Transition = {
+  // transition动画组件的props
+  transition: {
+    show: false,
+    mode: "fade",
+    duration: "300",
+    timingFunction: "ease-out"
+  }
+};
+exports.Transition = Transition;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/upload.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/upload.js
new file mode 100644
index 0000000..933a0f9
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/props/upload.js
@@ -0,0 +1,29 @@
+"use strict";
+const Upload = {
+  // upload组件
+  upload: {
+    accept: "image",
+    capture: ["album", "camera"],
+    compressed: true,
+    camera: "back",
+    maxDuration: 60,
+    uploadIcon: "camera-fill",
+    uploadIconColor: "#D3D4D6",
+    useBeforeRead: false,
+    previewFullImage: true,
+    maxCount: 52,
+    disabled: false,
+    imageMode: "aspectFill",
+    name: "",
+    sizeType: ["original", "compressed"],
+    multiple: false,
+    deletable: true,
+    maxSize: Number.MAX_VALUE,
+    fileList: [],
+    uploadText: "",
+    width: 80,
+    height: 80,
+    previewImage: true
+  }
+};
+exports.Upload = Upload;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/zIndex.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/zIndex.js
new file mode 100644
index 0000000..7ab3fce
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/config/zIndex.js
@@ -0,0 +1,13 @@
+"use strict";
+const zIndex = {
+  toast: 10090,
+  noNetwork: 10080,
+  // popup包含popup,actionsheet,keyboard,picker的值
+  popup: 10075,
+  mask: 10070,
+  navbar: 980,
+  topTips: 975,
+  sticky: 970,
+  indexListSticky: 965
+};
+exports.zIndex = zIndex;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/function/colorGradient.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/function/colorGradient.js
new file mode 100644
index 0000000..66fd04a
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/function/colorGradient.js
@@ -0,0 +1,113 @@
+"use strict";
+function colorGradient(startColor = "rgb(0, 0, 0)", endColor = "rgb(255, 255, 255)", step = 10) {
+  const startRGB = hexToRgb(startColor, false);
+  const startR = startRGB[0];
+  const startG = startRGB[1];
+  const startB = startRGB[2];
+  const endRGB = hexToRgb(endColor, false);
+  const endR = endRGB[0];
+  const endG = endRGB[1];
+  const endB = endRGB[2];
+  const sR = (endR - startR) / step;
+  const sG = (endG - startG) / step;
+  const sB = (endB - startB) / step;
+  const colorArr = [];
+  for (let i = 0; i < step; i++) {
+    let hex = rgbToHex(`rgb(${Math.round(sR * i + startR)},${Math.round(sG * i + startG)},${Math.round(sB * i + startB)})`);
+    if (i === 0)
+      hex = rgbToHex(startColor);
+    if (i === step - 1)
+      hex = rgbToHex(endColor);
+    colorArr.push(hex);
+  }
+  return colorArr;
+}
+function hexToRgb(sColor, str = true) {
+  const reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
+  sColor = String(sColor).toLowerCase();
+  if (sColor && reg.test(sColor)) {
+    if (sColor.length === 4) {
+      let sColorNew = "#";
+      for (let i = 1; i < 4; i += 1) {
+        sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1));
+      }
+      sColor = sColorNew;
+    }
+    const sColorChange = [];
+    for (let i = 1; i < 7; i += 2) {
+      sColorChange.push(parseInt(`0x${sColor.slice(i, i + 2)}`));
+    }
+    if (!str) {
+      return sColorChange;
+    }
+    return `rgb(${sColorChange[0]},${sColorChange[1]},${sColorChange[2]})`;
+  }
+  if (/^(rgb|RGB)/.test(sColor)) {
+    const arr = sColor.replace(/(?:\(|\)|rgb|RGB)*/g, "").split(",");
+    return arr.map((val) => Number(val));
+  }
+  return sColor;
+}
+function rgbToHex(rgb) {
+  const _this = rgb;
+  const reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
+  if (/^(rgb|RGB)/.test(_this)) {
+    const aColor = _this.replace(/(?:\(|\)|rgb|RGB)*/g, "").split(",");
+    let strHex = "#";
+    for (let i = 0; i < aColor.length; i++) {
+      let hex = Number(aColor[i]).toString(16);
+      hex = String(hex).length == 1 ? `${0}${hex}` : hex;
+      if (hex === "0") {
+        hex += hex;
+      }
+      strHex += hex;
+    }
+    if (strHex.length !== 7) {
+      strHex = _this;
+    }
+    return strHex;
+  }
+  if (reg.test(_this)) {
+    const aNum = _this.replace(/#/, "").split("");
+    if (aNum.length === 6) {
+      return _this;
+    }
+    if (aNum.length === 3) {
+      let numHex = "#";
+      for (let i = 0; i < aNum.length; i += 1) {
+        numHex += aNum[i] + aNum[i];
+      }
+      return numHex;
+    }
+  } else {
+    return _this;
+  }
+}
+function colorToRgba(color, alpha) {
+  color = rgbToHex(color);
+  const reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
+  let sColor = String(color).toLowerCase();
+  if (sColor && reg.test(sColor)) {
+    if (sColor.length === 4) {
+      let sColorNew = "#";
+      for (let i = 1; i < 4; i += 1) {
+        sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1));
+      }
+      sColor = sColorNew;
+    }
+    const sColorChange = [];
+    for (let i = 1; i < 7; i += 2) {
+      sColorChange.push(parseInt(`0x${sColor.slice(i, i + 2)}`));
+    }
+    return `rgba(${sColorChange.join(",")},${alpha})`;
+  }
+  return sColor;
+}
+const colorGradient$1 = {
+  colorGradient,
+  hexToRgb,
+  rgbToHex,
+  colorToRgba
+};
+exports.colorGradient = colorGradient$1;
+exports.colorGradient$1 = colorGradient;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/function/debounce.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/function/debounce.js
new file mode 100644
index 0000000..1a1bc26
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/function/debounce.js
@@ -0,0 +1,19 @@
+"use strict";
+let timeout = null;
+function debounce(func, wait = 500, immediate = false) {
+  if (timeout !== null)
+    clearTimeout(timeout);
+  if (immediate) {
+    const callNow = !timeout;
+    timeout = setTimeout(() => {
+      timeout = null;
+    }, wait);
+    if (callNow)
+      typeof func === "function" && func();
+  } else {
+    timeout = setTimeout(() => {
+      typeof func === "function" && func();
+    }, wait);
+  }
+}
+exports.debounce = debounce;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/function/digit.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/function/digit.js
new file mode 100644
index 0000000..8067c9c
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/function/digit.js
@@ -0,0 +1,63 @@
+"use strict";
+function strip(num, precision = 15) {
+  return +parseFloat(Number(num).toPrecision(precision));
+}
+function digitLength(num) {
+  const eSplit = num.toString().split(/[eE]/);
+  const len = (eSplit[0].split(".")[1] || "").length - +(eSplit[1] || 0);
+  return len > 0 ? len : 0;
+}
+function float2Fixed(num) {
+  if (num.toString().indexOf("e") === -1) {
+    return Number(num.toString().replace(".", ""));
+  }
+  const dLen = digitLength(num);
+  return dLen > 0 ? strip(Number(num) * Math.pow(10, dLen)) : Number(num);
+}
+function checkBoundary(num) {
+  {
+    if (num > Number.MAX_SAFE_INTEGER || num < Number.MIN_SAFE_INTEGER) {
+      console.warn(`${num} 超出了精度限制,结果可能不正确`);
+    }
+  }
+}
+function iteratorOperation(arr, operation) {
+  const [num1, num2, ...others] = arr;
+  let res = operation(num1, num2);
+  others.forEach((num) => {
+    res = operation(res, num);
+  });
+  return res;
+}
+function times(...nums) {
+  if (nums.length > 2) {
+    return iteratorOperation(nums, times);
+  }
+  const [num1, num2] = nums;
+  const num1Changed = float2Fixed(num1);
+  const num2Changed = float2Fixed(num2);
+  const baseNum = digitLength(num1) + digitLength(num2);
+  const leftValue = num1Changed * num2Changed;
+  checkBoundary(leftValue);
+  return leftValue / Math.pow(10, baseNum);
+}
+function divide(...nums) {
+  if (nums.length > 2) {
+    return iteratorOperation(nums, divide);
+  }
+  const [num1, num2] = nums;
+  const num1Changed = float2Fixed(num1);
+  const num2Changed = float2Fixed(num2);
+  checkBoundary(num1Changed);
+  checkBoundary(num2Changed);
+  return times(num1Changed / num2Changed, strip(Math.pow(10, digitLength(num2) - digitLength(num1))));
+}
+function round(num, ratio) {
+  const base = Math.pow(10, ratio);
+  let result = divide(Math.round(Math.abs(times(num, base))), base);
+  if (num < 0 && result !== 0) {
+    result = times(result, -1);
+  }
+  return result;
+}
+exports.round = round;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/function/index.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/function/index.js
new file mode 100644
index 0000000..7668008
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/function/index.js
@@ -0,0 +1,506 @@
+"use strict";
+const common_vendor = require("../../../../common/vendor.js");
+const uni_modules_uviewPlus_libs_function_test = require("./test.js");
+const uni_modules_uviewPlus_libs_function_digit = require("./digit.js");
+const uni_modules_uviewPlus_libs_config_config = require("../config/config.js");
+function range(min = 0, max = 0, value = 0) {
+  return Math.max(min, Math.min(max, Number(value)));
+}
+function getPx(value, unit = false) {
+  if (uni_modules_uviewPlus_libs_function_test.number(value)) {
+    return unit ? `${value}px` : Number(value);
+  }
+  if (/(rpx|upx)$/.test(value)) {
+    return unit ? `${common_vendor.index.rpx2px(parseInt(value))}px` : Number(common_vendor.index.rpx2px(parseInt(value)));
+  }
+  return unit ? `${parseInt(value)}px` : parseInt(value);
+}
+function sleep(value = 30) {
+  return new Promise((resolve) => {
+    setTimeout(() => {
+      resolve();
+    }, value);
+  });
+}
+function os() {
+  return common_vendor.index.getSystemInfoSync().platform.toLowerCase();
+}
+function sys() {
+  return common_vendor.index.getSystemInfoSync();
+}
+function random(min, max) {
+  if (min >= 0 && max > 0 && max >= min) {
+    const gab = max - min + 1;
+    return Math.floor(Math.random() * gab + min);
+  }
+  return 0;
+}
+function guid(len = 32, firstU = true, radix = null) {
+  const chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split("");
+  const uuid = [];
+  radix = radix || chars.length;
+  if (len) {
+    for (let i = 0; i < len; i++)
+      uuid[i] = chars[0 | Math.random() * radix];
+  } else {
+    let r;
+    uuid[8] = uuid[13] = uuid[18] = uuid[23] = "-";
+    uuid[14] = "4";
+    for (let i = 0; i < 36; i++) {
+      if (!uuid[i]) {
+        r = 0 | Math.random() * 16;
+        uuid[i] = chars[i == 19 ? r & 3 | 8 : r];
+      }
+    }
+  }
+  if (firstU) {
+    uuid.shift();
+    return `u${uuid.join("")}`;
+  }
+  return uuid.join("");
+}
+function $parent(name = void 0) {
+  let parent = this.$parent;
+  while (parent) {
+    if (parent.$options && parent.$options.name !== name) {
+      parent = parent.$parent;
+    } else {
+      return parent;
+    }
+  }
+  return false;
+}
+function addStyle(customStyle, target = "object") {
+  if (uni_modules_uviewPlus_libs_function_test.empty(customStyle) || typeof customStyle === "object" && target === "object" || target === "string" && typeof customStyle === "string") {
+    return customStyle;
+  }
+  if (target === "object") {
+    customStyle = trim(customStyle);
+    const styleArray = customStyle.split(";");
+    const style = {};
+    for (let i = 0; i < styleArray.length; i++) {
+      if (styleArray[i]) {
+        const item = styleArray[i].split(":");
+        style[trim(item[0])] = trim(item[1]);
+      }
+    }
+    return style;
+  }
+  let string = "";
+  if (typeof customStyle === "object") {
+    customStyle.forEach((val, i) => {
+      const key = i.replace(/([A-Z])/g, "-$1").toLowerCase();
+      string += `${key}:${val};`;
+    });
+  }
+  return trim(string);
+}
+function addUnit(value = "auto", unit = "") {
+  if (!unit) {
+    unit = uni_modules_uviewPlus_libs_config_config.config.unit || "px";
+  }
+  value = String(value);
+  return uni_modules_uviewPlus_libs_function_test.number(value) ? `${value}${unit}` : value;
+}
+function deepClone(obj) {
+  if ([null, void 0, NaN, false].includes(obj))
+    return obj;
+  if (typeof obj !== "object" && typeof obj !== "function") {
+    return obj;
+  }
+  const o = uni_modules_uviewPlus_libs_function_test.array(obj) ? [] : {};
+  for (const i in obj) {
+    if (obj.hasOwnProperty(i)) {
+      o[i] = typeof obj[i] === "object" ? deepClone(obj[i]) : obj[i];
+    }
+  }
+  return o;
+}
+function deepMerge(targetOrigin = {}, source = {}) {
+  let target = deepClone(targetOrigin);
+  if (typeof target !== "object" || typeof source !== "object")
+    return false;
+  for (const prop in source) {
+    if (!source.hasOwnProperty(prop))
+      continue;
+    if (prop in target) {
+      if (source[prop] == null) {
+        target[prop] = source[prop];
+      } else if (typeof target[prop] !== "object") {
+        target[prop] = source[prop];
+      } else if (typeof source[prop] !== "object") {
+        target[prop] = source[prop];
+      } else if (target[prop].concat && source[prop].concat) {
+        target[prop] = target[prop].concat(source[prop]);
+      } else {
+        target[prop] = deepMerge(target[prop], source[prop]);
+      }
+    } else {
+      target[prop] = source[prop];
+    }
+  }
+  return target;
+}
+function shallowMerge(target, source = {}) {
+  if (typeof target !== "object" || typeof source !== "object")
+    return false;
+  for (const prop in source) {
+    if (!source.hasOwnProperty(prop))
+      continue;
+    if (prop in target) {
+      if (source[prop] == null) {
+        target[prop] = source[prop];
+      } else if (typeof target[prop] !== "object") {
+        target[prop] = source[prop];
+      } else if (typeof source[prop] !== "object") {
+        target[prop] = source[prop];
+      } else if (target[prop].concat && source[prop].concat) {
+        target[prop] = target[prop].concat(source[prop]);
+      } else {
+        target[prop] = shallowMerge(target[prop], source[prop]);
+      }
+    } else {
+      target[prop] = source[prop];
+    }
+  }
+  return target;
+}
+function error(err) {
+  {
+    console.error(`uView提示:${err}`);
+  }
+}
+function randomArray(array = []) {
+  return array.sort(() => Math.random() - 0.5);
+}
+if (!String.prototype.padStart) {
+  String.prototype.padStart = function(maxLength, fillString = " ") {
+    if (Object.prototype.toString.call(fillString) !== "[object String]") {
+      throw new TypeError(
+        "fillString must be String"
+      );
+    }
+    const str = this;
+    if (str.length >= maxLength)
+      return String(str);
+    const fillLength = maxLength - str.length;
+    let times = Math.ceil(fillLength / fillString.length);
+    while (times >>= 1) {
+      fillString += fillString;
+      if (times === 1) {
+        fillString += fillString;
+      }
+    }
+    return fillString.slice(0, fillLength) + str;
+  };
+}
+function timeFormat(dateTime = null, formatStr = "yyyy-mm-dd") {
+  let date;
+  if (!dateTime) {
+    date = /* @__PURE__ */ new Date();
+  } else if (/^\d{10}$/.test(dateTime.toString().trim())) {
+    date = new Date(dateTime * 1e3);
+  } else if (typeof dateTime === "string" && /^\d+$/.test(dateTime.trim())) {
+    date = new Date(Number(dateTime));
+  } else {
+    date = new Date(
+      typeof dateTime === "string" ? dateTime.replace(/-/g, "/") : dateTime
+    );
+  }
+  const timeSource = {
+    "y": date.getFullYear().toString(),
+    // 年
+    "m": (date.getMonth() + 1).toString().padStart(2, "0"),
+    // 月
+    "d": date.getDate().toString().padStart(2, "0"),
+    // 日
+    "h": date.getHours().toString().padStart(2, "0"),
+    // 时
+    "M": date.getMinutes().toString().padStart(2, "0"),
+    // 分
+    "s": date.getSeconds().toString().padStart(2, "0")
+    // 秒
+    // 有其他格式化字符需求可以继续添加,必须转化成字符串
+  };
+  for (const key in timeSource) {
+    const [ret] = new RegExp(`${key}+`).exec(formatStr) || [];
+    if (ret) {
+      const beginIndex = key === "y" && ret.length === 2 ? 2 : 0;
+      formatStr = formatStr.replace(ret, timeSource[key].slice(beginIndex));
+    }
+  }
+  return formatStr;
+}
+function timeFrom(timestamp = null, format = "yyyy-mm-dd") {
+  if (timestamp == null)
+    timestamp = Number(/* @__PURE__ */ new Date());
+  timestamp = parseInt(timestamp);
+  if (timestamp.toString().length == 10)
+    timestamp *= 1e3;
+  let timer = (/* @__PURE__ */ new Date()).getTime() - timestamp;
+  timer = parseInt(timer / 1e3);
+  let tips = "";
+  switch (true) {
+    case timer < 300:
+      tips = "刚刚";
+      break;
+    case (timer >= 300 && timer < 3600):
+      tips = `${parseInt(timer / 60)}分钟前`;
+      break;
+    case (timer >= 3600 && timer < 86400):
+      tips = `${parseInt(timer / 3600)}小时前`;
+      break;
+    case (timer >= 86400 && timer < 2592e3):
+      tips = `${parseInt(timer / 86400)}天前`;
+      break;
+    default:
+      if (format === false) {
+        if (timer >= 2592e3 && timer < 365 * 86400) {
+          tips = `${parseInt(timer / (86400 * 30))}个月前`;
+        } else {
+          tips = `${parseInt(timer / (86400 * 365))}年前`;
+        }
+      } else {
+        tips = timeFormat(timestamp, format);
+      }
+  }
+  return tips;
+}
+function trim(str, pos = "both") {
+  str = String(str);
+  if (pos == "both") {
+    return str.replace(/^\s+|\s+$/g, "");
+  }
+  if (pos == "left") {
+    return str.replace(/^\s*/, "");
+  }
+  if (pos == "right") {
+    return str.replace(/(\s*$)/g, "");
+  }
+  if (pos == "all") {
+    return str.replace(/\s+/g, "");
+  }
+  return str;
+}
+function queryParams(data = {}, isPrefix = true, arrayFormat = "brackets") {
+  const prefix = isPrefix ? "?" : "";
+  const _result = [];
+  if (["indices", "brackets", "repeat", "comma"].indexOf(arrayFormat) == -1)
+    arrayFormat = "brackets";
+  for (const key in data) {
+    const value = data[key];
+    if (["", void 0, null].indexOf(value) >= 0) {
+      continue;
+    }
+    if (value.constructor === Array) {
+      switch (arrayFormat) {
+        case "indices":
+          for (let i = 0; i < value.length; i++) {
+            _result.push(`${key}[${i}]=${value[i]}`);
+          }
+          break;
+        case "brackets":
+          value.forEach((_value) => {
+            _result.push(`${key}[]=${_value}`);
+          });
+          break;
+        case "repeat":
+          value.forEach((_value) => {
+            _result.push(`${key}=${_value}`);
+          });
+          break;
+        case "comma":
+          let commaStr = "";
+          value.forEach((_value) => {
+            commaStr += (commaStr ? "," : "") + _value;
+          });
+          _result.push(`${key}=${commaStr}`);
+          break;
+        default:
+          value.forEach((_value) => {
+            _result.push(`${key}[]=${_value}`);
+          });
+      }
+    } else {
+      _result.push(`${key}=${value}`);
+    }
+  }
+  return _result.length ? prefix + _result.join("&") : "";
+}
+function toast(title, duration = 2e3) {
+  common_vendor.index.showToast({
+    title: String(title),
+    icon: "none",
+    duration
+  });
+}
+function type2icon(type = "success", fill = false) {
+  if (["primary", "info", "error", "warning", "success"].indexOf(type) == -1)
+    type = "success";
+  let iconName = "";
+  switch (type) {
+    case "primary":
+      iconName = "info-circle";
+      break;
+    case "info":
+      iconName = "info-circle";
+      break;
+    case "error":
+      iconName = "close-circle";
+      break;
+    case "warning":
+      iconName = "error-circle";
+      break;
+    case "success":
+      iconName = "checkmark-circle";
+      break;
+    default:
+      iconName = "checkmark-circle";
+  }
+  if (fill)
+    iconName += "-fill";
+  return iconName;
+}
+function priceFormat(number, decimals = 0, decimalPoint = ".", thousandsSeparator = ",") {
+  number = `${number}`.replace(/[^0-9+-Ee.]/g, "");
+  const n = !isFinite(+number) ? 0 : +number;
+  const prec = !isFinite(+decimals) ? 0 : Math.abs(decimals);
+  const sep = typeof thousandsSeparator === "undefined" ? "," : thousandsSeparator;
+  const dec = typeof decimalPoint === "undefined" ? "." : decimalPoint;
+  let s = "";
+  s = (prec ? uni_modules_uviewPlus_libs_function_digit.round(n, prec) + "" : `${Math.round(n)}`).split(".");
+  const re = /(-?\d+)(\d{3})/;
+  while (re.test(s[0])) {
+    s[0] = s[0].replace(re, `$1${sep}$2`);
+  }
+  if ((s[1] || "").length < prec) {
+    s[1] = s[1] || "";
+    s[1] += new Array(prec - s[1].length + 1).join("0");
+  }
+  return s.join(dec);
+}
+function getDuration(value, unit = true) {
+  const valueNum = parseInt(value);
+  if (unit) {
+    if (/s$/.test(value))
+      return value;
+    return value > 30 ? `${value}ms` : `${value}s`;
+  }
+  if (/ms$/.test(value))
+    return valueNum;
+  if (/s$/.test(value))
+    return valueNum > 30 ? valueNum : valueNum * 1e3;
+  return valueNum;
+}
+function padZero(value) {
+  return `00${value}`.slice(-2);
+}
+function formValidate(instance, event) {
+  const formItem = $parent.call(instance, "u-form-item");
+  const form = $parent.call(instance, "u-form");
+  if (formItem && form) {
+    form.validateField(formItem.prop, () => {
+    }, event);
+  }
+}
+function getProperty(obj, key) {
+  if (typeof obj !== "object" || null == obj) {
+    return "";
+  }
+  if (typeof key !== "string" || key === "") {
+    return "";
+  }
+  if (key.indexOf(".") !== -1) {
+    const keys = key.split(".");
+    let firstObj = obj[keys[0]] || {};
+    for (let i = 1; i < keys.length; i++) {
+      if (firstObj) {
+        firstObj = firstObj[keys[i]];
+      }
+    }
+    return firstObj;
+  }
+  return obj[key];
+}
+function setProperty(obj, key, value) {
+  if (typeof obj !== "object" || null == obj) {
+    return;
+  }
+  const inFn = function(_obj, keys, v) {
+    if (keys.length === 1) {
+      _obj[keys[0]] = v;
+      return;
+    }
+    while (keys.length > 1) {
+      const k = keys[0];
+      if (!_obj[k] || typeof _obj[k] !== "object") {
+        _obj[k] = {};
+      }
+      keys.shift();
+      inFn(_obj[k], keys, v);
+    }
+  };
+  if (typeof key !== "string" || key === "")
+    ;
+  else if (key.indexOf(".") !== -1) {
+    const keys = key.split(".");
+    inFn(obj, keys, value);
+  } else {
+    obj[key] = value;
+  }
+}
+function page() {
+  const pages2 = getCurrentPages();
+  return `/${pages2[pages2.length - 1].route || ""}`;
+}
+function pages() {
+  const pages2 = getCurrentPages();
+  return pages2;
+}
+const index = {
+  range,
+  getPx,
+  sleep,
+  os,
+  sys,
+  random,
+  guid,
+  $parent,
+  addStyle,
+  addUnit,
+  deepClone,
+  deepMerge,
+  shallowMerge,
+  error,
+  randomArray,
+  timeFormat,
+  timeFrom,
+  trim,
+  queryParams,
+  toast,
+  type2icon,
+  priceFormat,
+  getDuration,
+  padZero,
+  formValidate,
+  getProperty,
+  setProperty,
+  page,
+  pages
+  // setConfig
+};
+exports.$parent = $parent;
+exports.addStyle = addStyle;
+exports.addUnit = addUnit;
+exports.deepMerge = deepMerge;
+exports.error = error;
+exports.getPx = getPx;
+exports.index = index;
+exports.page = page;
+exports.priceFormat = priceFormat;
+exports.queryParams = queryParams;
+exports.random = random;
+exports.sleep = sleep;
+exports.sys = sys;
+exports.timeFormat = timeFormat;
+exports.toast = toast;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/function/platform.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/function/platform.js
new file mode 100644
index 0000000..7744c7f
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/function/platform.js
@@ -0,0 +1,7 @@
+"use strict";
+let platform = "none";
+platform = "vue3";
+platform = "mp";
+platform = "weixin";
+const platform$1 = platform;
+exports.platform = platform$1;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/function/test.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/function/test.js
new file mode 100644
index 0000000..0221324
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/function/test.js
@@ -0,0 +1,177 @@
+"use strict";
+function email(value) {
+  return /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/.test(value);
+}
+function mobile(value) {
+  return /^1[23456789]\d{9}$/.test(value);
+}
+function url(value) {
+  return /^((https|http|ftp|rtsp|mms):\/\/)(([0-9a-zA-Z_!~*'().&=+$%-]+: )?[0-9a-zA-Z_!~*'().&=+$%-]+@)?(([0-9]{1,3}.){3}[0-9]{1,3}|([0-9a-zA-Z_!~*'()-]+.)*([0-9a-zA-Z][0-9a-zA-Z-]{0,61})?[0-9a-zA-Z].[a-zA-Z]{2,6})(:[0-9]{1,4})?((\/?)|(\/[0-9a-zA-Z_!~*'().;?:@&=+$,%#-]+)+\/?)$/.test(value);
+}
+function date(value) {
+  if (!value)
+    return false;
+  if (number(value))
+    value = +value;
+  return !/Invalid|NaN/.test(new Date(value).toString());
+}
+function dateISO(value) {
+  return /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(value);
+}
+function number(value) {
+  return /^[\+-]?(\d+\.?\d*|\.\d+|\d\.\d+e\+\d+)$/.test(value);
+}
+function string(value) {
+  return typeof value === "string";
+}
+function digits(value) {
+  return /^\d+$/.test(value);
+}
+function idCard(value) {
+  return /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
+    value
+  );
+}
+function carNo(value) {
+  const xreg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF]$)|([DF][A-HJ-NP-Z0-9][0-9]{4}$))/;
+  const creg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1}$/;
+  if (value.length === 7) {
+    return creg.test(value);
+  }
+  if (value.length === 8) {
+    return xreg.test(value);
+  }
+  return false;
+}
+function amount(value) {
+  return /^[1-9]\d*(,\d{3})*(\.\d{1,2})?$|^0\.\d{1,2}$/.test(value);
+}
+function chinese(value) {
+  const reg = /^[\u4e00-\u9fa5]+$/gi;
+  return reg.test(value);
+}
+function letter(value) {
+  return /^[a-zA-Z]*$/.test(value);
+}
+function enOrNum(value) {
+  const reg = /^[0-9a-zA-Z]*$/g;
+  return reg.test(value);
+}
+function contains(value, param) {
+  return value.indexOf(param) >= 0;
+}
+function range(value, param) {
+  return value >= param[0] && value <= param[1];
+}
+function rangeLength(value, param) {
+  return value.length >= param[0] && value.length <= param[1];
+}
+function landline(value) {
+  const reg = /^\d{3,4}-\d{7,8}(-\d{3,4})?$/;
+  return reg.test(value);
+}
+function empty(value) {
+  switch (typeof value) {
+    case "undefined":
+      return true;
+    case "string":
+      if (value.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g, "").length == 0)
+        return true;
+      break;
+    case "boolean":
+      if (!value)
+        return true;
+      break;
+    case "number":
+      if (value === 0 || isNaN(value))
+        return true;
+      break;
+    case "object":
+      if (value === null || value.length === 0)
+        return true;
+      for (const i in value) {
+        return false;
+      }
+      return true;
+  }
+  return false;
+}
+function jsonString(value) {
+  if (typeof value === "string") {
+    try {
+      const obj = JSON.parse(value);
+      if (typeof obj === "object" && obj) {
+        return true;
+      }
+      return false;
+    } catch (e) {
+      return false;
+    }
+  }
+  return false;
+}
+function array(value) {
+  if (typeof Array.isArray === "function") {
+    return Array.isArray(value);
+  }
+  return Object.prototype.toString.call(value) === "[object Array]";
+}
+function object(value) {
+  return Object.prototype.toString.call(value) === "[object Object]";
+}
+function code(value, len = 6) {
+  return new RegExp(`^\\d{${len}}$`).test(value);
+}
+function func(value) {
+  return typeof value === "function";
+}
+function promise(value) {
+  return object(value) && func(value.then) && func(value.catch);
+}
+function image(value) {
+  const newValue = value.split("?")[0];
+  const IMAGE_REGEXP = /\.(jpeg|jpg|gif|png|svg|webp|jfif|bmp|dpg)/i;
+  return IMAGE_REGEXP.test(newValue);
+}
+function video(value) {
+  const VIDEO_REGEXP = /\.(mp4|mpg|mpeg|dat|asf|avi|rm|rmvb|mov|wmv|flv|mkv|m3u8)/i;
+  return VIDEO_REGEXP.test(value);
+}
+function regExp(o) {
+  return o && Object.prototype.toString.call(o) === "[object RegExp]";
+}
+const test = {
+  email,
+  mobile,
+  url,
+  date,
+  dateISO,
+  number,
+  digits,
+  idCard,
+  carNo,
+  amount,
+  chinese,
+  letter,
+  enOrNum,
+  contains,
+  range,
+  rangeLength,
+  empty,
+  isEmpty: empty,
+  jsonString,
+  landline,
+  object,
+  array,
+  code,
+  func,
+  promise,
+  video,
+  image,
+  regExp,
+  string
+};
+exports.array = array;
+exports.empty = empty;
+exports.number = number;
+exports.test = test;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/function/throttle.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/function/throttle.js
new file mode 100644
index 0000000..54f47b8
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/function/throttle.js
@@ -0,0 +1,20 @@
+"use strict";
+let flag;
+function throttle(func, wait = 500, immediate = true) {
+  if (immediate) {
+    if (!flag) {
+      flag = true;
+      typeof func === "function" && func();
+      setTimeout(() => {
+        flag = false;
+      }, wait);
+    }
+  } else if (!flag) {
+    flag = true;
+    setTimeout(() => {
+      flag = false;
+      typeof func === "function" && func();
+    }, wait);
+  }
+}
+exports.throttle = throttle;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/adapters/index.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/adapters/index.js
new file mode 100644
index 0000000..96d1cf7
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/adapters/index.js
@@ -0,0 +1,61 @@
+"use strict";
+const common_vendor = require("../../../../../common/vendor.js");
+const uni_modules_uviewPlus_libs_luchRequest_helpers_buildURL = require("../helpers/buildURL.js");
+const uni_modules_uviewPlus_libs_luchRequest_core_buildFullPath = require("../core/buildFullPath.js");
+const uni_modules_uviewPlus_libs_luchRequest_core_settle = require("../core/settle.js");
+const uni_modules_uviewPlus_libs_luchRequest_utils = require("../utils.js");
+const mergeKeys = (keys, config2) => {
+  const config = {};
+  keys.forEach((prop) => {
+    if (!uni_modules_uviewPlus_libs_luchRequest_utils.isUndefined(config2[prop])) {
+      config[prop] = config2[prop];
+    }
+  });
+  return config;
+};
+const adapter = (config) => new Promise((resolve, reject) => {
+  const fullPath = uni_modules_uviewPlus_libs_luchRequest_helpers_buildURL.buildURL(uni_modules_uviewPlus_libs_luchRequest_core_buildFullPath.buildFullPath(config.baseURL, config.url), config.params);
+  const _config = {
+    url: fullPath,
+    header: config.header,
+    complete: (response) => {
+      config.fullPath = fullPath;
+      response.config = config;
+      try {
+        if (typeof response.data === "string") {
+          response.data = JSON.parse(response.data);
+        }
+      } catch (e) {
+      }
+      uni_modules_uviewPlus_libs_luchRequest_core_settle.settle(resolve, reject, response);
+    }
+  };
+  let requestTask;
+  if (config.method === "UPLOAD") {
+    delete _config.header["content-type"];
+    delete _config.header["Content-Type"];
+    const otherConfig = {
+      filePath: config.filePath,
+      name: config.name
+    };
+    const optionalKeys = [
+      "formData"
+    ];
+    requestTask = common_vendor.index.uploadFile({ ..._config, ...otherConfig, ...mergeKeys(optionalKeys, config) });
+  } else if (config.method === "DOWNLOAD") {
+    requestTask = common_vendor.index.downloadFile(_config);
+  } else {
+    const optionalKeys = [
+      "data",
+      "method",
+      "timeout",
+      "dataType",
+      "responseType"
+    ];
+    requestTask = common_vendor.index.request({ ..._config, ...mergeKeys(optionalKeys, config) });
+  }
+  if (config.getTask) {
+    config.getTask(requestTask, config);
+  }
+});
+exports.adapter = adapter;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/core/InterceptorManager.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/core/InterceptorManager.js
new file mode 100644
index 0000000..1d547dc
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/core/InterceptorManager.js
@@ -0,0 +1,24 @@
+"use strict";
+function InterceptorManager() {
+  this.handlers = [];
+}
+InterceptorManager.prototype.use = function use(fulfilled, rejected) {
+  this.handlers.push({
+    fulfilled,
+    rejected
+  });
+  return this.handlers.length - 1;
+};
+InterceptorManager.prototype.eject = function eject(id) {
+  if (this.handlers[id]) {
+    this.handlers[id] = null;
+  }
+};
+InterceptorManager.prototype.forEach = function forEach(fn) {
+  this.handlers.forEach((h) => {
+    if (h !== null) {
+      fn(h);
+    }
+  });
+};
+exports.InterceptorManager = InterceptorManager;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/core/Request.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/core/Request.js
new file mode 100644
index 0000000..0f082a5
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/core/Request.js
@@ -0,0 +1,144 @@
+"use strict";
+const uni_modules_uviewPlus_libs_luchRequest_core_dispatchRequest = require("./dispatchRequest.js");
+const uni_modules_uviewPlus_libs_luchRequest_core_InterceptorManager = require("./InterceptorManager.js");
+const uni_modules_uviewPlus_libs_luchRequest_core_mergeConfig = require("./mergeConfig.js");
+const uni_modules_uviewPlus_libs_luchRequest_core_defaults = require("./defaults.js");
+const uni_modules_uviewPlus_libs_luchRequest_utils = require("../utils.js");
+const uni_modules_uviewPlus_libs_luchRequest_utils_clone = require("../utils/clone.js");
+class Request {
+  /**
+  * @param {Object} arg - 全局配置
+  * @param {String} arg.baseURL - 全局根路径
+  * @param {Object} arg.header - 全局header
+  * @param {String} arg.method = [GET|POST|PUT|DELETE|CONNECT|HEAD|OPTIONS|TRACE] - 全局默认请求方式
+  * @param {String} arg.dataType = [json] - 全局默认的dataType
+  * @param {String} arg.responseType = [text|arraybuffer] - 全局默认的responseType。支付宝小程序不支持
+  * @param {Object} arg.custom - 全局默认的自定义参数
+  * @param {Number} arg.timeout - 全局默认的超时时间,单位 ms。默认60000。H5(HBuilderX 2.9.9+)、APP(HBuilderX 2.9.9+)、微信小程序(2.10.0)、支付宝小程序
+  * @param {Boolean} arg.sslVerify - 全局默认的是否验证 ssl 证书。默认true.仅App安卓端支持(HBuilderX 2.3.3+)
+  * @param {Boolean} arg.withCredentials - 全局默认的跨域请求时是否携带凭证(cookies)。默认false。仅H5支持(HBuilderX 2.6.15+)
+  * @param {Boolean} arg.firstIpv4 - 全DNS解析时优先使用ipv4。默认false。仅 App-Android 支持 (HBuilderX 2.8.0+)
+  * @param {Function(statusCode):Boolean} arg.validateStatus - 全局默认的自定义验证器。默认statusCode >= 200 && statusCode < 300
+  */
+  constructor(arg = {}) {
+    if (!uni_modules_uviewPlus_libs_luchRequest_utils.isPlainObject(arg)) {
+      arg = {};
+      console.warn("设置全局参数必须接收一个Object");
+    }
+    this.config = uni_modules_uviewPlus_libs_luchRequest_utils_clone.clone({ ...uni_modules_uviewPlus_libs_luchRequest_core_defaults.defaults, ...arg });
+    this.interceptors = {
+      request: new uni_modules_uviewPlus_libs_luchRequest_core_InterceptorManager.InterceptorManager(),
+      response: new uni_modules_uviewPlus_libs_luchRequest_core_InterceptorManager.InterceptorManager()
+    };
+  }
+  /**
+  * @Function
+  * @param {Request~setConfigCallback} f - 设置全局默认配置
+  */
+  setConfig(f) {
+    this.config = f(this.config);
+  }
+  middleware(config) {
+    config = uni_modules_uviewPlus_libs_luchRequest_core_mergeConfig.mergeConfig(this.config, config);
+    const chain = [uni_modules_uviewPlus_libs_luchRequest_core_dispatchRequest.dispatchRequest, void 0];
+    let promise = Promise.resolve(config);
+    this.interceptors.request.forEach((interceptor) => {
+      chain.unshift(interceptor.fulfilled, interceptor.rejected);
+    });
+    this.interceptors.response.forEach((interceptor) => {
+      chain.push(interceptor.fulfilled, interceptor.rejected);
+    });
+    while (chain.length) {
+      promise = promise.then(chain.shift(), chain.shift());
+    }
+    return promise;
+  }
+  /**
+  * @Function
+  * @param {Object} config - 请求配置项
+  * @prop {String} options.url - 请求路径
+  * @prop {Object} options.data - 请求参数
+  * @prop {Object} [options.responseType = config.responseType] [text|arraybuffer] - 响应的数据类型
+  * @prop {Object} [options.dataType = config.dataType] - 如果设为 json,会尝试对返回的数据做一次 JSON.parse
+  * @prop {Object} [options.header = config.header] - 请求header
+  * @prop {Object} [options.method = config.method] - 请求方法
+  * @returns {Promise<unknown>}
+  */
+  request(config = {}) {
+    return this.middleware(config);
+  }
+  get(url, options = {}) {
+    return this.middleware({
+      url,
+      method: "GET",
+      ...options
+    });
+  }
+  post(url, data, options = {}) {
+    return this.middleware({
+      url,
+      data,
+      method: "POST",
+      ...options
+    });
+  }
+  put(url, data, options = {}) {
+    return this.middleware({
+      url,
+      data,
+      method: "PUT",
+      ...options
+    });
+  }
+  delete(url, data, options = {}) {
+    return this.middleware({
+      url,
+      data,
+      method: "DELETE",
+      ...options
+    });
+  }
+  connect(url, data, options = {}) {
+    return this.middleware({
+      url,
+      data,
+      method: "CONNECT",
+      ...options
+    });
+  }
+  head(url, data, options = {}) {
+    return this.middleware({
+      url,
+      data,
+      method: "HEAD",
+      ...options
+    });
+  }
+  options(url, data, options = {}) {
+    return this.middleware({
+      url,
+      data,
+      method: "OPTIONS",
+      ...options
+    });
+  }
+  trace(url, data, options = {}) {
+    return this.middleware({
+      url,
+      data,
+      method: "TRACE",
+      ...options
+    });
+  }
+  upload(url, config = {}) {
+    config.url = url;
+    config.method = "UPLOAD";
+    return this.middleware(config);
+  }
+  download(url, config = {}) {
+    config.url = url;
+    config.method = "DOWNLOAD";
+    return this.middleware(config);
+  }
+}
+exports.Request = Request;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/core/buildFullPath.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/core/buildFullPath.js
new file mode 100644
index 0000000..4e2998f
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/core/buildFullPath.js
@@ -0,0 +1,10 @@
+"use strict";
+const uni_modules_uviewPlus_libs_luchRequest_helpers_isAbsoluteURL = require("../helpers/isAbsoluteURL.js");
+const uni_modules_uviewPlus_libs_luchRequest_helpers_combineURLs = require("../helpers/combineURLs.js");
+function buildFullPath(baseURL, requestedURL) {
+  if (baseURL && !uni_modules_uviewPlus_libs_luchRequest_helpers_isAbsoluteURL.isAbsoluteURL(requestedURL)) {
+    return uni_modules_uviewPlus_libs_luchRequest_helpers_combineURLs.combineURLs(baseURL, requestedURL);
+  }
+  return requestedURL;
+}
+exports.buildFullPath = buildFullPath;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/core/defaults.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/core/defaults.js
new file mode 100644
index 0000000..ccf42fb
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/core/defaults.js
@@ -0,0 +1,14 @@
+"use strict";
+const defaults = {
+  baseURL: "",
+  header: {},
+  method: "GET",
+  dataType: "json",
+  responseType: "text",
+  custom: {},
+  timeout: 6e4,
+  validateStatus: function validateStatus(status) {
+    return status >= 200 && status < 300;
+  }
+};
+exports.defaults = defaults;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/core/dispatchRequest.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/core/dispatchRequest.js
new file mode 100644
index 0000000..fc5f7a4
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/core/dispatchRequest.js
@@ -0,0 +1,4 @@
+"use strict";
+const uni_modules_uviewPlus_libs_luchRequest_adapters_index = require("../adapters/index.js");
+const dispatchRequest = (config) => uni_modules_uviewPlus_libs_luchRequest_adapters_index.adapter(config);
+exports.dispatchRequest = dispatchRequest;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/core/mergeConfig.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/core/mergeConfig.js
new file mode 100644
index 0000000..352a997
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/core/mergeConfig.js
@@ -0,0 +1,52 @@
+"use strict";
+const uni_modules_uviewPlus_libs_luchRequest_utils = require("../utils.js");
+const mergeKeys = (keys, globalsConfig, config2) => {
+  const config = {};
+  keys.forEach((prop) => {
+    if (!uni_modules_uviewPlus_libs_luchRequest_utils.isUndefined(config2[prop])) {
+      config[prop] = config2[prop];
+    } else if (!uni_modules_uviewPlus_libs_luchRequest_utils.isUndefined(globalsConfig[prop])) {
+      config[prop] = globalsConfig[prop];
+    }
+  });
+  return config;
+};
+const mergeConfig = (globalsConfig, config2 = {}) => {
+  const method = config2.method || globalsConfig.method || "GET";
+  let config = {
+    baseURL: globalsConfig.baseURL || "",
+    method,
+    url: config2.url || "",
+    params: config2.params || {},
+    custom: { ...globalsConfig.custom || {}, ...config2.custom || {} },
+    header: uni_modules_uviewPlus_libs_luchRequest_utils.deepMerge(globalsConfig.header || {}, config2.header || {})
+  };
+  const defaultToConfig2Keys = ["getTask", "validateStatus"];
+  config = { ...config, ...mergeKeys(defaultToConfig2Keys, globalsConfig, config2) };
+  if (method === "DOWNLOAD")
+    ;
+  else if (method === "UPLOAD") {
+    delete config.header["content-type"];
+    delete config.header["Content-Type"];
+    const uploadKeys = [
+      "filePath",
+      "name",
+      "formData"
+    ];
+    uploadKeys.forEach((prop) => {
+      if (!uni_modules_uviewPlus_libs_luchRequest_utils.isUndefined(config2[prop])) {
+        config[prop] = config2[prop];
+      }
+    });
+  } else {
+    const defaultsKeys = [
+      "data",
+      "timeout",
+      "dataType",
+      "responseType"
+    ];
+    config = { ...config, ...mergeKeys(defaultsKeys, globalsConfig, config2) };
+  }
+  return config;
+};
+exports.mergeConfig = mergeConfig;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/core/settle.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/core/settle.js
new file mode 100644
index 0000000..517c4fb
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/core/settle.js
@@ -0,0 +1,11 @@
+"use strict";
+function settle(resolve, reject, response) {
+  const { validateStatus } = response.config;
+  const status = response.statusCode;
+  if (status && (!validateStatus || validateStatus(status))) {
+    resolve(response);
+  } else {
+    reject(response);
+  }
+}
+exports.settle = settle;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/helpers/buildURL.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/helpers/buildURL.js
new file mode 100644
index 0000000..0a732f6
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/helpers/buildURL.js
@@ -0,0 +1,44 @@
+"use strict";
+const uni_modules_uviewPlus_libs_luchRequest_utils = require("../utils.js");
+function encode(val) {
+  return encodeURIComponent(val).replace(/%40/gi, "@").replace(/%3A/gi, ":").replace(/%24/g, "$").replace(/%2C/gi, ",").replace(/%20/g, "+").replace(/%5B/gi, "[").replace(/%5D/gi, "]");
+}
+function buildURL(url, params) {
+  if (!params) {
+    return url;
+  }
+  let serializedParams;
+  if (uni_modules_uviewPlus_libs_luchRequest_utils.isURLSearchParams(params)) {
+    serializedParams = params.toString();
+  } else {
+    const parts = [];
+    uni_modules_uviewPlus_libs_luchRequest_utils.forEach(params, (val, key) => {
+      if (val === null || typeof val === "undefined") {
+        return;
+      }
+      if (uni_modules_uviewPlus_libs_luchRequest_utils.isArray(val)) {
+        key = `${key}[]`;
+      } else {
+        val = [val];
+      }
+      uni_modules_uviewPlus_libs_luchRequest_utils.forEach(val, (v) => {
+        if (uni_modules_uviewPlus_libs_luchRequest_utils.isDate(v)) {
+          v = v.toISOString();
+        } else if (uni_modules_uviewPlus_libs_luchRequest_utils.isObject(v)) {
+          v = JSON.stringify(v);
+        }
+        parts.push(`${encode(key)}=${encode(v)}`);
+      });
+    });
+    serializedParams = parts.join("&");
+  }
+  if (serializedParams) {
+    const hashmarkIndex = url.indexOf("#");
+    if (hashmarkIndex !== -1) {
+      url = url.slice(0, hashmarkIndex);
+    }
+    url += (url.indexOf("?") === -1 ? "?" : "&") + serializedParams;
+  }
+  return url;
+}
+exports.buildURL = buildURL;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/helpers/combineURLs.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/helpers/combineURLs.js
new file mode 100644
index 0000000..0e3eb45
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/helpers/combineURLs.js
@@ -0,0 +1,5 @@
+"use strict";
+function combineURLs(baseURL, relativeURL) {
+  return relativeURL ? `${baseURL.replace(/\/+$/, "")}/${relativeURL.replace(/^\/+/, "")}` : baseURL;
+}
+exports.combineURLs = combineURLs;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/helpers/isAbsoluteURL.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/helpers/isAbsoluteURL.js
new file mode 100644
index 0000000..6a0e800
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/helpers/isAbsoluteURL.js
@@ -0,0 +1,5 @@
+"use strict";
+function isAbsoluteURL(url) {
+  return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url);
+}
+exports.isAbsoluteURL = isAbsoluteURL;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/index.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/index.js
new file mode 100644
index 0000000..4b57420
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/index.js
@@ -0,0 +1,2 @@
+"use strict";
+const uni_modules_uviewPlus_libs_luchRequest_core_Request = require("./core/Request.js");
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/utils.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/utils.js
new file mode 100644
index 0000000..9b5a305
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/utils.js
@@ -0,0 +1,63 @@
+"use strict";
+const { toString } = Object.prototype;
+function isArray(val) {
+  return toString.call(val) === "[object Array]";
+}
+function isObject(val) {
+  return val !== null && typeof val === "object";
+}
+function isDate(val) {
+  return toString.call(val) === "[object Date]";
+}
+function isURLSearchParams(val) {
+  return typeof URLSearchParams !== "undefined" && val instanceof URLSearchParams;
+}
+function forEach(obj, fn) {
+  if (obj === null || typeof obj === "undefined") {
+    return;
+  }
+  if (typeof obj !== "object") {
+    obj = [obj];
+  }
+  if (isArray(obj)) {
+    for (let i = 0, l = obj.length; i < l; i++) {
+      fn.call(null, obj[i], i, obj);
+    }
+  } else {
+    for (const key in obj) {
+      if (Object.prototype.hasOwnProperty.call(obj, key)) {
+        fn.call(null, obj[key], key, obj);
+      }
+    }
+  }
+}
+function isPlainObject(obj) {
+  return Object.prototype.toString.call(obj) === "[object Object]";
+}
+function deepMerge() {
+  const result = {};
+  function assignValue(val, key) {
+    if (typeof result[key] === "object" && typeof val === "object") {
+      result[key] = deepMerge(result[key], val);
+    } else if (typeof val === "object") {
+      result[key] = deepMerge({}, val);
+    } else {
+      result[key] = val;
+    }
+  }
+  for (let i = 0, l = arguments.length; i < l; i++) {
+    forEach(arguments[i], assignValue);
+  }
+  return result;
+}
+function isUndefined(val) {
+  return typeof val === "undefined";
+}
+exports.deepMerge = deepMerge;
+exports.forEach = forEach;
+exports.isArray = isArray;
+exports.isDate = isDate;
+exports.isObject = isObject;
+exports.isPlainObject = isPlainObject;
+exports.isURLSearchParams = isURLSearchParams;
+exports.isUndefined = isUndefined;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/utils/clone.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/utils/clone.js
new file mode 100644
index 0000000..046cdc1
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/luch-request/utils/clone.js
@@ -0,0 +1,195 @@
+"use strict";
+var clone = function() {
+  function _instanceof(obj, type) {
+    return type != null && obj instanceof type;
+  }
+  var nativeMap;
+  try {
+    nativeMap = Map;
+  } catch (_) {
+    nativeMap = function() {
+    };
+  }
+  var nativeSet;
+  try {
+    nativeSet = Set;
+  } catch (_) {
+    nativeSet = function() {
+    };
+  }
+  var nativePromise;
+  try {
+    nativePromise = Promise;
+  } catch (_) {
+    nativePromise = function() {
+    };
+  }
+  function clone2(parent, circular, depth, prototype, includeNonEnumerable) {
+    if (typeof circular === "object") {
+      depth = circular.depth;
+      prototype = circular.prototype;
+      includeNonEnumerable = circular.includeNonEnumerable;
+      circular = circular.circular;
+    }
+    var allParents = [];
+    var allChildren = [];
+    var useBuffer = typeof Buffer != "undefined";
+    if (typeof circular == "undefined")
+      circular = true;
+    if (typeof depth == "undefined")
+      depth = Infinity;
+    function _clone(parent2, depth2) {
+      if (parent2 === null)
+        return null;
+      if (depth2 === 0)
+        return parent2;
+      var child;
+      var proto;
+      if (typeof parent2 != "object") {
+        return parent2;
+      }
+      if (_instanceof(parent2, nativeMap)) {
+        child = new nativeMap();
+      } else if (_instanceof(parent2, nativeSet)) {
+        child = new nativeSet();
+      } else if (_instanceof(parent2, nativePromise)) {
+        child = new nativePromise(function(resolve, reject) {
+          parent2.then(function(value) {
+            resolve(_clone(value, depth2 - 1));
+          }, function(err) {
+            reject(_clone(err, depth2 - 1));
+          });
+        });
+      } else if (clone2.__isArray(parent2)) {
+        child = [];
+      } else if (clone2.__isRegExp(parent2)) {
+        child = new RegExp(parent2.source, __getRegExpFlags(parent2));
+        if (parent2.lastIndex)
+          child.lastIndex = parent2.lastIndex;
+      } else if (clone2.__isDate(parent2)) {
+        child = new Date(parent2.getTime());
+      } else if (useBuffer && Buffer.isBuffer(parent2)) {
+        if (Buffer.from) {
+          child = Buffer.from(parent2);
+        } else {
+          child = new Buffer(parent2.length);
+          parent2.copy(child);
+        }
+        return child;
+      } else if (_instanceof(parent2, Error)) {
+        child = Object.create(parent2);
+      } else {
+        if (typeof prototype == "undefined") {
+          proto = Object.getPrototypeOf(parent2);
+          child = Object.create(proto);
+        } else {
+          child = Object.create(prototype);
+          proto = prototype;
+        }
+      }
+      if (circular) {
+        var index = allParents.indexOf(parent2);
+        if (index != -1) {
+          return allChildren[index];
+        }
+        allParents.push(parent2);
+        allChildren.push(child);
+      }
+      if (_instanceof(parent2, nativeMap)) {
+        parent2.forEach(function(value, key) {
+          var keyChild = _clone(key, depth2 - 1);
+          var valueChild = _clone(value, depth2 - 1);
+          child.set(keyChild, valueChild);
+        });
+      }
+      if (_instanceof(parent2, nativeSet)) {
+        parent2.forEach(function(value) {
+          var entryChild = _clone(value, depth2 - 1);
+          child.add(entryChild);
+        });
+      }
+      for (var i in parent2) {
+        var attrs = Object.getOwnPropertyDescriptor(parent2, i);
+        if (attrs) {
+          child[i] = _clone(parent2[i], depth2 - 1);
+        }
+        try {
+          var objProperty = Object.getOwnPropertyDescriptor(parent2, i);
+          if (objProperty.set === "undefined") {
+            continue;
+          }
+          child[i] = _clone(parent2[i], depth2 - 1);
+        } catch (e) {
+          if (e instanceof TypeError) {
+            continue;
+          } else if (e instanceof ReferenceError) {
+            continue;
+          }
+        }
+      }
+      if (Object.getOwnPropertySymbols) {
+        var symbols = Object.getOwnPropertySymbols(parent2);
+        for (var i = 0; i < symbols.length; i++) {
+          var symbol = symbols[i];
+          var descriptor = Object.getOwnPropertyDescriptor(parent2, symbol);
+          if (descriptor && !descriptor.enumerable && !includeNonEnumerable) {
+            continue;
+          }
+          child[symbol] = _clone(parent2[symbol], depth2 - 1);
+          Object.defineProperty(child, symbol, descriptor);
+        }
+      }
+      if (includeNonEnumerable) {
+        var allPropertyNames = Object.getOwnPropertyNames(parent2);
+        for (var i = 0; i < allPropertyNames.length; i++) {
+          var propertyName = allPropertyNames[i];
+          var descriptor = Object.getOwnPropertyDescriptor(parent2, propertyName);
+          if (descriptor && descriptor.enumerable) {
+            continue;
+          }
+          child[propertyName] = _clone(parent2[propertyName], depth2 - 1);
+          Object.defineProperty(child, propertyName, descriptor);
+        }
+      }
+      return child;
+    }
+    return _clone(parent, depth);
+  }
+  clone2.clonePrototype = function clonePrototype(parent) {
+    if (parent === null)
+      return null;
+    var c = function() {
+    };
+    c.prototype = parent;
+    return new c();
+  };
+  function __objToStr(o) {
+    return Object.prototype.toString.call(o);
+  }
+  clone2.__objToStr = __objToStr;
+  function __isDate(o) {
+    return typeof o === "object" && __objToStr(o) === "[object Date]";
+  }
+  clone2.__isDate = __isDate;
+  function __isArray(o) {
+    return typeof o === "object" && __objToStr(o) === "[object Array]";
+  }
+  clone2.__isArray = __isArray;
+  function __isRegExp(o) {
+    return typeof o === "object" && __objToStr(o) === "[object RegExp]";
+  }
+  clone2.__isRegExp = __isRegExp;
+  function __getRegExpFlags(re) {
+    var flags = "";
+    if (re.global)
+      flags += "g";
+    if (re.ignoreCase)
+      flags += "i";
+    if (re.multiline)
+      flags += "m";
+    return flags;
+  }
+  clone2.__getRegExpFlags = __getRegExpFlags;
+  return clone2;
+}();
+exports.clone = clone;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/mixin/button.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/mixin/button.js
new file mode 100644
index 0000000..0ef0536
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/mixin/button.js
@@ -0,0 +1,15 @@
+"use strict";
+const button = {
+  props: {
+    lang: String,
+    sessionFrom: String,
+    sendMessageTitle: String,
+    sendMessagePath: String,
+    sendMessageImg: String,
+    showMessageCard: Boolean,
+    appParameter: String,
+    formType: String,
+    openType: String
+  }
+};
+exports.button = button;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/mixin/mixin.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/mixin/mixin.js
new file mode 100644
index 0000000..1473de7
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/mixin/mixin.js
@@ -0,0 +1,135 @@
+"use strict";
+const common_vendor = require("../../../../common/vendor.js");
+const uni_modules_uviewPlus_libs_function_index = require("../function/index.js");
+const uni_modules_uviewPlus_libs_function_test = require("../function/test.js");
+const uni_modules_uviewPlus_libs_util_route = require("../util/route.js");
+const mixin = {
+  // 定义每个组件都可能需要用到的外部样式以及类名
+  props: {
+    // 每个组件都有的父组件传递的样式,可以为字符串或者对象形式
+    customStyle: {
+      type: [Object, String],
+      default: () => ({})
+    },
+    customClass: {
+      type: String,
+      default: ""
+    },
+    // 跳转的页面路径
+    url: {
+      type: String,
+      default: ""
+    },
+    // 页面跳转的类型
+    linkType: {
+      type: String,
+      default: "navigateTo"
+    }
+  },
+  data() {
+    return {};
+  },
+  onLoad() {
+    this.$u.getRect = this.$uGetRect;
+  },
+  created() {
+    this.$u.getRect = this.$uGetRect;
+  },
+  computed: {
+    // 在2.x版本中,将会把$u挂载到uni对象下,导致在模板中无法使用uni.$u.xxx形式
+    // 所以这里通过computed计算属性将其附加到this.$u上,就可以在模板或者js中使用uni.$u.xxx
+    // 只在nvue环境通过此方式引入完整的$u,其他平台会出现性能问题,非nvue则按需引入(主要原因是props过大)
+    $u() {
+      return uni_modules_uviewPlus_libs_function_index.deepMerge(common_vendor.index.$u, {
+        props: void 0,
+        http: void 0,
+        mixin: void 0
+      });
+    },
+    /**
+     * 生成bem规则类名
+     * 由于微信小程序,H5,nvue之间绑定class的差异,无法通过:class="[bem()]"的形式进行同用
+     * 故采用如下折中做法,最后返回的是数组(一般平台)或字符串(支付宝和字节跳动平台),类似['a', 'b', 'c']或'a b c'的形式
+     * @param {String} name 组件名称
+     * @param {Array} fixed 一直会存在的类名
+     * @param {Array} change 会根据变量值为true或者false而出现或者隐藏的类名
+     * @returns {Array|string}
+     */
+    bem() {
+      return function(name, fixed, change) {
+        const prefix = `u-${name}--`;
+        const classes = {};
+        if (fixed) {
+          fixed.map((item) => {
+            classes[prefix + this[item]] = true;
+          });
+        }
+        if (change) {
+          change.map((item) => {
+            this[item] ? classes[prefix + item] = this[item] : delete classes[prefix + item];
+          });
+        }
+        return Object.keys(classes);
+      };
+    }
+  },
+  methods: {
+    // 跳转某一个页面
+    openPage(urlKey = "url") {
+      const url = this[urlKey];
+      if (url) {
+        uni_modules_uviewPlus_libs_util_route.route({ type: this.linkType, url });
+      }
+    },
+    // 查询节点信息
+    // 目前此方法在支付宝小程序中无法获取组件跟接点的尺寸,为支付宝的bug(2020-07-21)
+    // 解决办法为在组件根部再套一个没有任何作用的view元素
+    $uGetRect(selector, all) {
+      return new Promise((resolve) => {
+        common_vendor.index.createSelectorQuery().in(this)[all ? "selectAll" : "select"](selector).boundingClientRect((rect) => {
+          if (all && Array.isArray(rect) && rect.length) {
+            resolve(rect);
+          }
+          if (!all && rect) {
+            resolve(rect);
+          }
+        }).exec();
+      });
+    },
+    getParentData(parentName = "") {
+      if (!this.parent)
+        this.parent = {};
+      this.parent = uni_modules_uviewPlus_libs_function_index.$parent.call(this, parentName);
+      if (this.parent.children) {
+        this.parent.children.indexOf(this) === -1 && this.parent.children.push(this);
+      }
+      if (this.parent && this.parentData) {
+        Object.keys(this.parentData).map((key) => {
+          this.parentData[key] = this.parent[key];
+        });
+      }
+    },
+    // 阻止事件冒泡
+    preventEvent(e) {
+      e && typeof e.stopPropagation === "function" && e.stopPropagation();
+    },
+    // 空操作
+    noop(e) {
+      this.preventEvent(e);
+    }
+  },
+  onReachBottom() {
+    common_vendor.index.$emit("uOnReachBottom");
+  },
+  beforeUnmount() {
+    if (this.parent && uni_modules_uviewPlus_libs_function_test.test.array(this.parent.children)) {
+      const childrenList = this.parent.children;
+      childrenList.map((child, index) => {
+        if (child === this) {
+          childrenList.splice(index, 1);
+        }
+      });
+    }
+  }
+};
+exports.mixin = mixin;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/mixin/mpMixin.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/mixin/mpMixin.js
new file mode 100644
index 0000000..476c28f
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/mixin/mpMixin.js
@@ -0,0 +1,8 @@
+"use strict";
+const mpMixin = {
+  // 将自定义节点设置成虚拟的,更加接近Vue组件的表现,能更好的使用flex属性
+  options: {
+    virtualHost: true
+  }
+};
+exports.mpMixin = mpMixin;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/mixin/openType.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/mixin/openType.js
new file mode 100644
index 0000000..ab04c10
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/mixin/openType.js
@@ -0,0 +1,27 @@
+"use strict";
+const openType = {
+  props: {
+    openType: String
+  },
+  methods: {
+    onGetUserInfo(event) {
+      this.$emit("getuserinfo", event.detail);
+    },
+    onContact(event) {
+      this.$emit("contact", event.detail);
+    },
+    onGetPhoneNumber(event) {
+      this.$emit("getphonenumber", event.detail);
+    },
+    onError(event) {
+      this.$emit("error", event.detail);
+    },
+    onLaunchApp(event) {
+      this.$emit("launchapp", event.detail);
+    },
+    onOpenSetting(event) {
+      this.$emit("opensetting", event.detail);
+    }
+  }
+};
+exports.openType = openType;
diff --git a/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/util/route.js b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/util/route.js
new file mode 100644
index 0000000..fd73d28
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/uni_modules/uview-plus/libs/util/route.js
@@ -0,0 +1,102 @@
+"use strict";
+const common_vendor = require("../../../../common/vendor.js");
+const uni_modules_uviewPlus_libs_function_index = require("../function/index.js");
+class Router {
+  constructor() {
+    this.config = {
+      type: "navigateTo",
+      url: "",
+      delta: 1,
+      // navigateBack页面后退时,回退的层数
+      params: {},
+      // 传递的参数
+      animationType: "pop-in",
+      // 窗口动画,只在APP有效
+      animationDuration: 300,
+      // 窗口动画持续时间,单位毫秒,只在APP有效
+      intercept: false
+      // 是否需要拦截
+    };
+    this.route = this.route.bind(this);
+  }
+  // 判断url前面是否有"/",如果没有则加上,否则无法跳转
+  addRootPath(url) {
+    return url[0] === "/" ? url : `/${url}`;
+  }
+  // 整合路由参数
+  mixinParam(url, params) {
+    url = url && this.addRootPath(url);
+    let query = "";
+    if (/.*\/.*\?.*=.*/.test(url)) {
+      query = uni_modules_uviewPlus_libs_function_index.queryParams(params, false);
+      return url += `&${query}`;
+    }
+    query = uni_modules_uviewPlus_libs_function_index.queryParams(params);
+    return url += query;
+  }
+  // 对外的方法名称
+  async route(options = {}, params = {}) {
+    let mergeConfig = {};
+    if (typeof options === "string") {
+      mergeConfig.url = this.mixinParam(options, params);
+      mergeConfig.type = "navigateTo";
+    } else {
+      mergeConfig = uni_modules_uviewPlus_libs_function_index.deepMerge(this.config, options);
+      mergeConfig.url = this.mixinParam(options.url, options.params);
+    }
+    if (mergeConfig.url === uni_modules_uviewPlus_libs_function_index.page())
+      return;
+    if (params.intercept) {
+      this.config.intercept = params.intercept;
+    }
+    mergeConfig.params = params;
+    mergeConfig = uni_modules_uviewPlus_libs_function_index.deepMerge(this.config, mergeConfig);
+    if (typeof common_vendor.index.$u.routeIntercept === "function") {
+      const isNext = await new Promise((resolve, reject) => {
+        common_vendor.index.$u.routeIntercept(mergeConfig, resolve);
+      });
+      isNext && this.openPage(mergeConfig);
+    } else {
+      this.openPage(mergeConfig);
+    }
+  }
+  // 执行路由跳转
+  openPage(config) {
+    const {
+      url,
+      type,
+      delta,
+      animationType,
+      animationDuration
+    } = config;
+    if (config.type == "navigateTo" || config.type == "to") {
+      common_vendor.index.navigateTo({
+        url,
+        animationType,
+        animationDuration
+      });
+    }
+    if (config.type == "redirectTo" || config.type == "redirect") {
+      common_vendor.index.redirectTo({
+        url
+      });
+    }
+    if (config.type == "switchTab" || config.type == "tab") {
+      common_vendor.index.switchTab({
+        url
+      });
+    }
+    if (config.type == "reLaunch" || config.type == "launch") {
+      common_vendor.index.reLaunch({
+        url
+      });
+    }
+    if (config.type == "navigateBack" || config.type == "back") {
+      common_vendor.index.navigateBack({
+        delta
+      });
+    }
+  }
+}
+const route = new Router().route;
+exports.route = route;
diff --git a/utils/request.js b/utils/request.js
new file mode 100644
index 0000000..28677fd
--- /dev/null
+++ b/utils/request.js
@@ -0,0 +1,88 @@
+import {
+  config
+} from '@/config/app';
+
+import useUserStore from '@/store/user';
+
+const userStore = useUserStore();
+
+function baseRequest(url, method, data, {
+  noAuth = false,
+  noVerify = false,
+  onReLogin = false
+}) {
+  let Url = config.HTTP_REQUEST_URL,
+    header = config.HEADER;
+  if (userStore.userInfo) {
+    header.TOKEN = userStore.token
+  }
+
+  return new Promise((reslove, reject) => {
+    uni.request({
+      url: Url + 'api' + url,
+      method: method || 'GET',
+      header: {
+        ...header
+      },
+      data: method != 'GET' ? data || {} : {},
+      params: method == 'GET' ? data : {},
+      success: (res) => {
+        if (res.data.show) {
+          uni.showToast({
+            title: res.data.msg || '操作成功',
+            icon: 'success',
+          })
+        }
+        if (noVerify)
+          reslove(res.data);
+        else if (res.data.code == -1) {
+          if (res.data.msg == "登录超时,请重新登录") {
+            uni.showToast({
+              title: res.data.msg,
+              icon: 'none',
+            })
+            uni.reLaunch({
+              url: '/pages/Login/login'
+            })
+          }
+        } else if (res.data.code == 0) {
+          if (res.data.msg != '用户信息不存在') {
+            uni.showToast({
+              title: res.data.msg || '请检查网络',
+              icon: 'none',
+            })
+          }
+          reslove(res.data);
+        } else if (res.data.code == 1) {
+          reslove(res.data);
+        } else if (res.data.code == 200) {
+          reslove(res.data.data);
+        } else if ([410000, 410001, 410002, 40000].indexOf(res.data.code) !== -1) {
+          reject(res.data);
+        } else if (res.data.code == 501) {
+          reject(res.data);
+        } else {
+          uni.showToast({
+            title: res.data.msg || '请检查网络',
+            icon: 'none'
+          })
+          reject(res.data.msg || '请检查网络');
+        }
+      },
+      fail: (message) => {
+        console.log(message, '错误')
+        uni.showToast({
+          title: '网络错误',
+          icon: 'none'
+        })
+        reject('请求失败');
+      }
+    })
+  });
+}
+const syhttp = {};
+
+['options', 'get', 'post', 'put', 'head', 'delete', 'trace', 'connect'].forEach((method) => {
+  syhttp[method] = (api, data, opt) => baseRequest(api, method, data, opt || {})
+});
+export default syhttp;
\ No newline at end of file