一盏薄酒 2 년 전
커밋
fe6aae3b3b
100개의 변경된 파일8043개의 추가작업 그리고 0개의 파일을 삭제
  1. 31 0
      .eslintrc.js
  2. 19 0
      app.js
  3. 14 0
      app.json
  4. 10 0
      app.wxss
  5. 48 0
      pages/index/index.js
  6. 3 0
      pages/index/index.json
  7. 23 0
      pages/index/index.wxml
  8. 19 0
      pages/index/index.wxss
  9. 7 0
      pages/index/miniprogram_npm/dayjs/index.js
  10. 0 0
      pages/index/miniprogram_npm/dayjs/index.js.map
  11. 3895 0
      pages/index/miniprogram_npm/tdesign-miniprogram/.wechatide.ib.json
  12. 24 0
      pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/README.en-US.md
  13. 107 0
      pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/README.md
  14. 66 0
      pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/action-sheet.d.ts
  15. 94 0
      pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/action-sheet.js
  16. 10 0
      pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/action-sheet.json
  17. 41 0
      pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/action-sheet.wxml
  18. 19 0
      pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/action-sheet.wxs
  19. 165 0
      pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/action-sheet.wxss
  20. 3 0
      pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/index.d.ts
  21. 3 0
      pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/index.js
  22. 3 0
      pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/props.d.ts
  23. 38 0
      pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/props.js
  24. 31 0
      pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/show.d.ts
  25. 33 0
      pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/show.js
  26. 49 0
      pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/template/grid.wxml
  27. 14 0
      pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/template/list.wxml
  28. 43 0
      pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/type.d.ts
  29. 1 0
      pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/type.js
  30. 28 0
      pages/index/miniprogram_npm/tdesign-miniprogram/avatar-group/avatar-group.d.ts
  31. 86 0
      pages/index/miniprogram_npm/tdesign-miniprogram/avatar-group/avatar-group.js
  32. 6 0
      pages/index/miniprogram_npm/tdesign-miniprogram/avatar-group/avatar-group.json
  33. 20 0
      pages/index/miniprogram_npm/tdesign-miniprogram/avatar-group/avatar-group.wxml
  34. 137 0
      pages/index/miniprogram_npm/tdesign-miniprogram/avatar-group/avatar-group.wxss
  35. 3 0
      pages/index/miniprogram_npm/tdesign-miniprogram/avatar-group/props.d.ts
  36. 20 0
      pages/index/miniprogram_npm/tdesign-miniprogram/avatar-group/props.js
  37. 27 0
      pages/index/miniprogram_npm/tdesign-miniprogram/avatar-group/type.d.ts
  38. 1 0
      pages/index/miniprogram_npm/tdesign-miniprogram/avatar-group/type.js
  39. 33 0
      pages/index/miniprogram_npm/tdesign-miniprogram/avatar/README.en-US.md
  40. 87 0
      pages/index/miniprogram_npm/tdesign-miniprogram/avatar/README.md
  41. 23 0
      pages/index/miniprogram_npm/tdesign-miniprogram/avatar/avatar.d.ts
  42. 77 0
      pages/index/miniprogram_npm/tdesign-miniprogram/avatar/avatar.js
  43. 8 0
      pages/index/miniprogram_npm/tdesign-miniprogram/avatar/avatar.json
  44. 54 0
      pages/index/miniprogram_npm/tdesign-miniprogram/avatar/avatar.wxml
  45. 26 0
      pages/index/miniprogram_npm/tdesign-miniprogram/avatar/avatar.wxs
  46. 104 0
      pages/index/miniprogram_npm/tdesign-miniprogram/avatar/avatar.wxss
  47. 3 0
      pages/index/miniprogram_npm/tdesign-miniprogram/avatar/props.d.ts
  48. 39 0
      pages/index/miniprogram_npm/tdesign-miniprogram/avatar/props.js
  49. 48 0
      pages/index/miniprogram_npm/tdesign-miniprogram/avatar/type.d.ts
  50. 1 0
      pages/index/miniprogram_npm/tdesign-miniprogram/avatar/type.js
  51. 19 0
      pages/index/miniprogram_npm/tdesign-miniprogram/back-top/README.en-US.md
  52. 42 0
      pages/index/miniprogram_npm/tdesign-miniprogram/back-top/README.md
  53. 24 0
      pages/index/miniprogram_npm/tdesign-miniprogram/back-top/back-top.d.ts
  54. 67 0
      pages/index/miniprogram_npm/tdesign-miniprogram/back-top/back-top.js
  55. 6 0
      pages/index/miniprogram_npm/tdesign-miniprogram/back-top/back-top.json
  56. 16 0
      pages/index/miniprogram_npm/tdesign-miniprogram/back-top/back-top.wxml
  57. 89 0
      pages/index/miniprogram_npm/tdesign-miniprogram/back-top/back-top.wxss
  58. 3 0
      pages/index/miniprogram_npm/tdesign-miniprogram/back-top/props.d.ts
  59. 22 0
      pages/index/miniprogram_npm/tdesign-miniprogram/back-top/props.js
  60. 26 0
      pages/index/miniprogram_npm/tdesign-miniprogram/back-top/type.d.ts
  61. 1 0
      pages/index/miniprogram_npm/tdesign-miniprogram/back-top/type.js
  62. 17 0
      pages/index/miniprogram_npm/tdesign-miniprogram/badge/README.en-US.md
  63. 47 0
      pages/index/miniprogram_npm/tdesign-miniprogram/badge/README.md
  64. 21 0
      pages/index/miniprogram_npm/tdesign-miniprogram/badge/badge.d.ts
  65. 43 0
      pages/index/miniprogram_npm/tdesign-miniprogram/badge/badge.js
  66. 5 0
      pages/index/miniprogram_npm/tdesign-miniprogram/badge/badge.json
  67. 44 0
      pages/index/miniprogram_npm/tdesign-miniprogram/badge/badge.wxml
  68. 70 0
      pages/index/miniprogram_npm/tdesign-miniprogram/badge/badge.wxs
  69. 108 0
      pages/index/miniprogram_npm/tdesign-miniprogram/badge/badge.wxss
  70. 3 0
      pages/index/miniprogram_npm/tdesign-miniprogram/badge/index.d.ts
  71. 3 0
      pages/index/miniprogram_npm/tdesign-miniprogram/badge/index.js
  72. 3 0
      pages/index/miniprogram_npm/tdesign-miniprogram/badge/props.d.ts
  73. 41 0
      pages/index/miniprogram_npm/tdesign-miniprogram/badge/props.js
  74. 46 0
      pages/index/miniprogram_npm/tdesign-miniprogram/badge/type.d.ts
  75. 1 0
      pages/index/miniprogram_npm/tdesign-miniprogram/badge/type.js
  76. 46 0
      pages/index/miniprogram_npm/tdesign-miniprogram/button/README.en-US.md
  77. 107 0
      pages/index/miniprogram_npm/tdesign-miniprogram/button/README.md
  78. 35 0
      pages/index/miniprogram_npm/tdesign-miniprogram/button/button.d.ts
  79. 97 0
      pages/index/miniprogram_npm/tdesign-miniprogram/button/button.js
  80. 7 0
      pages/index/miniprogram_npm/tdesign-miniprogram/button/button.json
  81. 59 0
      pages/index/miniprogram_npm/tdesign-miniprogram/button/button.wxml
  82. 451 0
      pages/index/miniprogram_npm/tdesign-miniprogram/button/button.wxss
  83. 3 0
      pages/index/miniprogram_npm/tdesign-miniprogram/button/index.d.ts
  84. 3 0
      pages/index/miniprogram_npm/tdesign-miniprogram/button/index.js
  85. 3 0
      pages/index/miniprogram_npm/tdesign-miniprogram/button/props.d.ts
  86. 100 0
      pages/index/miniprogram_npm/tdesign-miniprogram/button/props.js
  87. 108 0
      pages/index/miniprogram_npm/tdesign-miniprogram/button/type.d.ts
  88. 1 0
      pages/index/miniprogram_npm/tdesign-miniprogram/button/type.js
  89. 28 0
      pages/index/miniprogram_npm/tdesign-miniprogram/calendar/README.en-US.md
  90. 80 0
      pages/index/miniprogram_npm/tdesign-miniprogram/calendar/README.md
  91. 44 0
      pages/index/miniprogram_npm/tdesign-miniprogram/calendar/calendar.d.ts
  92. 165 0
      pages/index/miniprogram_npm/tdesign-miniprogram/calendar/calendar.js
  93. 8 0
      pages/index/miniprogram_npm/tdesign-miniprogram/calendar/calendar.json
  94. 13 0
      pages/index/miniprogram_npm/tdesign-miniprogram/calendar/calendar.wxml
  95. 30 0
      pages/index/miniprogram_npm/tdesign-miniprogram/calendar/calendar.wxs
  96. 187 0
      pages/index/miniprogram_npm/tdesign-miniprogram/calendar/calendar.wxss
  97. 2 0
      pages/index/miniprogram_npm/tdesign-miniprogram/calendar/index.d.ts
  98. 2 0
      pages/index/miniprogram_npm/tdesign-miniprogram/calendar/index.js
  99. 3 0
      pages/index/miniprogram_npm/tdesign-miniprogram/calendar/props.d.ts
  100. 50 0
      pages/index/miniprogram_npm/tdesign-miniprogram/calendar/props.js

+ 31 - 0
.eslintrc.js

@@ -0,0 +1,31 @@
+/*
+ * Eslint config file
+ * Documentation: https://eslint.org/docs/user-guide/configuring/
+ * Install the Eslint extension before using this feature.
+ */
+module.exports = {
+  env: {
+    es6: true,
+    browser: true,
+    node: true,
+  },
+  ecmaFeatures: {
+    modules: true,
+  },
+  parserOptions: {
+    ecmaVersion: 2018,
+    sourceType: 'module',
+  },
+  globals: {
+    wx: true,
+    App: true,
+    Page: true,
+    getCurrentPages: true,
+    getApp: true,
+    Component: true,
+    requirePlugin: true,
+    requireMiniProgram: true,
+  },
+  // extends: 'eslint:recommended',
+  rules: {},
+}

+ 19 - 0
app.js

@@ -0,0 +1,19 @@
+// app.js
+App({
+  onLaunch() {
+    // 展示本地存储能力
+    const logs = wx.getStorageSync('logs') || []
+    logs.unshift(Date.now())
+    wx.setStorageSync('logs', logs)
+
+    // 登录
+    wx.login({
+      success: res => {
+        // 发送 res.code 到后台换取 openId, sessionKey, unionId
+      }
+    })
+  },
+  globalData: {
+    userInfo: null
+  }
+})

+ 14 - 0
app.json

@@ -0,0 +1,14 @@
+{
+  "pages":[
+    "pages/index/index",
+    "pages/logs/logs"
+  ],
+  "window":{
+    "backgroundTextStyle":"light",
+    "navigationBarBackgroundColor": "#fff",
+    "navigationBarTitleText": "Weixin",
+    "navigationBarTextStyle":"black"
+  },
+  "style": "v2",
+  "sitemapLocation": "sitemap.json"
+}

+ 10 - 0
app.wxss

@@ -0,0 +1,10 @@
+/**app.wxss**/
+.container {
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: space-between;
+  padding: 200rpx 0;
+  box-sizing: border-box;
+} 

+ 48 - 0
pages/index/index.js

@@ -0,0 +1,48 @@
+// index.js
+// 获取应用实例
+const app = getApp()
+
+Page({
+  data: {
+    motto: 'Hello World',
+    userInfo: {},
+    hasUserInfo: false,
+    canIUse: wx.canIUse('button.open-type.getUserInfo'),
+    canIUseGetUserProfile: false,
+    canIUseOpenData: wx.canIUse('open-data.type.userAvatarUrl') && wx.canIUse('open-data.type.userNickName') // 如需尝试获取用户信息可改为false
+  },
+  // 事件处理函数
+  bindViewTap() {
+    wx.navigateTo({
+      url: '../logs/logs'
+    })
+  },
+  onLoad() {
+    if (wx.getUserProfile) {
+      this.setData({
+        canIUseGetUserProfile: true
+      })
+    }
+  },
+  getUserProfile(e) {
+    // 推荐使用wx.getUserProfile获取用户信息,开发者每次通过该接口获取用户个人信息均需用户确认,开发者妥善保管用户快速填写的头像昵称,避免重复弹窗
+    wx.getUserProfile({
+      desc: '展示用户信息', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
+      success: (res) => {
+        console.log(res)
+        this.setData({
+          userInfo: res.userInfo,
+          hasUserInfo: true
+        })
+      }
+    })
+  },
+  getUserInfo(e) {
+    // 不推荐使用getUserInfo获取用户信息,预计自2021年4月13日起,getUserInfo将不再弹出弹窗,并直接返回匿名的用户个人信息
+    console.log(e)
+    this.setData({
+      userInfo: e.detail.userInfo,
+      hasUserInfo: true
+    })
+  }
+})

+ 3 - 0
pages/index/index.json

@@ -0,0 +1,3 @@
+{
+  "usingComponents": {}
+}

+ 23 - 0
pages/index/index.wxml

@@ -0,0 +1,23 @@
+<!--index.wxml-->
+<view class="container">
+  <view class="userinfo">
+    <block wx:if="{{canIUseOpenData}}">
+      <view class="userinfo-avatar" bindtap="bindViewTap">
+        <open-data type="userAvatarUrl"></open-data>
+      </view>
+      <open-data type="userNickName"></open-data>
+    </block>
+    <block wx:elif="{{!hasUserInfo}}">
+      <button wx:if="{{canIUseGetUserProfile}}" bindtap="getUserProfile"> 获取头像昵称 </button>
+      <button wx:elif="{{canIUse}}" open-type="getUserInfo" bindgetuserinfo="getUserInfo"> 获取头像昵称 </button>
+      <view wx:else> 请使用1.4.4及以上版本基础库 </view>
+    </block>
+    <block wx:else>
+      <image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" mode="cover"></image>
+      <text class="userinfo-nickname">{{userInfo.nickName}}</text>
+    </block>
+  </view>
+  <view class="usermotto">
+    <text class="user-motto">{{motto}}</text>
+  </view>
+</view>

+ 19 - 0
pages/index/index.wxss

@@ -0,0 +1,19 @@
+/**index.wxss**/
+.userinfo {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  color: #aaa;
+}
+
+.userinfo-avatar {
+  overflow: hidden;
+  width: 128rpx;
+  height: 128rpx;
+  margin: 20rpx;
+  border-radius: 50%;
+}
+
+.usermotto {
+  margin-top: 200px;
+}

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 7 - 0
pages/index/miniprogram_npm/dayjs/index.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
pages/index/miniprogram_npm/dayjs/index.js.map


+ 3895 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/.wechatide.ib.json

@@ -0,0 +1,3895 @@
+{
+  "key": "TDesign",
+  "label": "Tdesign",
+  "components": {
+    "t-action-sheet": {
+      "key": "t-action-sheet",
+      "label": "动作面板",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-actionsheet.png",
+      "properties": [
+        {
+          "key": "cancelText",
+          "type": ["String"],
+          "desc": "设置取消按钮的文本",
+          "label": ""
+        },
+        {
+          "key": "count",
+          "type": ["Number"],
+          "desc": "设置每页展示菜单的数量,仅当 type=grid 时有效",
+          "label": ""
+        },
+        {
+          "key": "items",
+          "type": ["Array"],
+          "desc": "菜单项",
+          "label": ""
+        },
+        {
+          "key": "showCancel",
+          "type": ["Boolean"],
+          "desc": "是否显示取消按钮",
+          "label": ""
+        },
+        {
+          "key": "theme",
+          "type": ["String"],
+          "desc": "展示类型,列表和表格形式展示",
+          "label": ""
+        },
+        {
+          "key": "visible",
+          "type": ["Boolean"],
+          "desc": "显示与隐藏",
+          "label": ""
+        }
+      ],
+      "events": [
+        {
+          "key": "bind:cancel",
+          "desc": "点击取消按钮时触发",
+          "label": ""
+        },
+        {
+          "key": "bind:close",
+          "desc": "关闭时触发",
+          "label": ""
+        },
+        {
+          "key": "bind:selected",
+          "desc": "选择菜单项时触发",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-action-sheet id=\"t-action-sheet-imperative\" visible=\"{{false}}\"></t-action-sheet>",
+      "path": "./action-sheet/action-sheet"
+    },
+    "t-avatar-group": {
+      "key": "t-avatar-group",
+      "label": "头像组",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-avatar.png",
+      "properties": [
+        {
+          "key": "cascading",
+          "type": ["String"],
+          "desc": "图片之间的层叠关系,可选值:左侧图片在上和右侧图片在上",
+          "label": ""
+        },
+        {
+          "key": "collapseAvatar",
+          "type": ["String"],
+          "desc": "头像数量超出时,会出现一个头像折叠元素。该元素内容可自定义。默认为 `+N`。示例:`+5`,`...`, `更多`",
+          "label": ""
+        },
+        {
+          "key": "max",
+          "type": ["Number"],
+          "desc": "能够同时显示的最多头像数量",
+          "label": ""
+        },
+        {
+          "key": "size",
+          "type": ["String"],
+          "desc": "尺寸,示例值:small/medium/large/24px/38px 等。优先级低于 Avatar.size",
+          "label": ""
+        }
+      ],
+      "externalClasses": ["t-class", "t-class-image", "t-class-content"],
+      "tpl": "<t-avatar-group max=\"2\" collapseAvatar=\"+5\"><t-avatar wx:for=\"{{['https://cdn-we-retail.ym.tencent.com/retail-ui/components-exp/avatar/avatar-v2/1.png','https://cdn-we-retail.ym.tencent.com/retail-ui/components-exp/avatar/avatar-v2/2.png','https://cdn-we-retail.ym.tencent.com/retail-ui/components-exp/avatar/avatar-v2/3.png']}}\" wx:key=\"index\" image=\"{{item}}\" style=\"margin-right: -16rpx\" /></t-avatar-group>",
+      "require": {
+        "t-avatar": "./avatar/avatar"
+      },
+      "path": "./avatar/avatar-group"
+    },
+    "t-avatar": {
+      "key": "t-avatar",
+      "label": "头像",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-avatar.png",
+      "properties": [
+        {
+          "key": "alt",
+          "type": ["String"],
+          "desc": "头像替换文本,仅当图片加载失败时有效",
+          "label": ""
+        },
+        {
+          "key": "badgeProps",
+          "type": ["Object"],
+          "desc": "头像右上角提示信息,继承 Badge 组件的全部特性。如:小红点,或者数字",
+          "label": ""
+        },
+        {
+          "key": "hideOnLoadFailed",
+          "type": ["Boolean"],
+          "desc": "加载失败时隐藏图片",
+          "label": ""
+        },
+        {
+          "key": "icon",
+          "type": ["String"],
+          "desc": "图标",
+          "label": ""
+        },
+        {
+          "key": "image",
+          "type": ["String"],
+          "desc": "图片地址",
+          "label": ""
+        },
+        {
+          "key": "shape",
+          "type": ["String"],
+          "desc": "形状",
+          "label": ""
+        },
+        {
+          "key": "size",
+          "type": ["String"],
+          "desc": "尺寸,示例值:small/medium/large/24px/38px 等,默认为 large",
+          "label": ""
+        }
+      ],
+      "externalClasses": ["t-class"],
+      "events": [
+        {
+          "key": "bind:error",
+          "desc": "图片加载失败时触发",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-avatar icon=\"user\" alt=\"avatar\"/>",
+      "path": "./avatar/avatar"
+    },
+    "t-back-top": {
+      "key": "t-back-top",
+      "label": "回到顶部",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-backtop.png",
+      "properties": [
+        {
+          "key": "fixed",
+          "type": ["Boolean"],
+          "desc": "是否绝对定位固定到屏幕右下方",
+          "label": ""
+        },
+        {
+          "key": "icon",
+          "type": ["String"],
+          "desc": "图标",
+          "label": ""
+        },
+        {
+          "key": "text",
+          "type": ["String"],
+          "desc": "文案",
+          "label": ""
+        },
+        {
+          "key": "theme",
+          "type": ["String"],
+          "desc": "预设的样式类型",
+          "label": ""
+        }
+      ],
+      "externalClasses": ["t-class", "t-class-icon", "t-class-text"],
+      "events": [
+        {
+          "key": "bind:to-top",
+          "desc": "点击触发",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-back-top />",
+      "path": "./back-top/back-top"
+    },
+    "t-badge": {
+      "key": "t-badge",
+      "label": "徽标数",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-badge.png",
+      "properties": [
+        {
+          "key": "color",
+          "type": ["String"],
+          "desc": "颜色",
+          "label": ""
+        },
+        {
+          "key": "content",
+          "type": ["String"],
+          "desc": "徽标内容,示例:`content='自定义内容'`。也可以使用默认插槽定义",
+          "label": ""
+        },
+        {
+          "key": "count",
+          "type": ["String", "Number"],
+          "desc": "徽标右上角内容。可以是数字,也可以是文字。如:'new'/3/99+。特殊:值为空表示使用插槽渲染",
+          "label": ""
+        },
+        {
+          "key": "dot",
+          "type": ["Boolean"],
+          "desc": "是否为红点",
+          "label": ""
+        },
+        {
+          "key": "maxCount",
+          "type": ["Number"],
+          "desc": "封顶的数字值",
+          "label": ""
+        },
+        {
+          "key": "offset",
+          "type": ["Array"],
+          "desc": "设置状态点的位置偏移,示例:[-10, 20] 或 ['10em', '8rem']",
+          "label": ""
+        },
+        {
+          "key": "shape",
+          "type": ["String"],
+          "desc": "形状",
+          "label": ""
+        },
+        {
+          "key": "showZero",
+          "type": ["Boolean"],
+          "desc": "当数值为 0 时,是否展示徽标",
+          "label": ""
+        },
+        {
+          "key": "size",
+          "type": ["String"],
+          "desc": "尺寸",
+          "label": ""
+        }
+      ],
+      "externalClasses": ["t-class", "t-class-content", "t-class-count"],
+      "tpl": "<t-badge content=\"消息\" dot />",
+      "path": "./badge/badge"
+    },
+    "t-button": {
+      "key": "t-button",
+      "label": "按钮",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-button.png",
+      "properties": [
+        {
+          "key": "block",
+          "type": ["Boolean"],
+          "desc": "是否为块级元素",
+          "label": ""
+        },
+        {
+          "key": "content",
+          "type": ["String"],
+          "desc": "按钮内容",
+          "label": ""
+        },
+        {
+          "key": "customDataset",
+          "type": ["Object"],
+          "desc": "自定义 dataset,可通过 event.currentTarget.dataset.custom 获取",
+          "label": ""
+        },
+        {
+          "key": "disabled",
+          "type": ["Boolean"],
+          "desc": "是否禁用按钮",
+          "label": ""
+        },
+        {
+          "key": "ghost",
+          "type": ["Boolean"],
+          "desc": "是否为幽灵按钮(镂空按钮)",
+          "label": ""
+        },
+        {
+          "key": "icon",
+          "type": ["String"],
+          "desc": "图标名称",
+          "label": ""
+        },
+        {
+          "key": "loading",
+          "type": ["Boolean"],
+          "desc": "是否显示为加载状态",
+          "label": ""
+        },
+        {
+          "key": "shape",
+          "type": ["String"],
+          "desc": "按钮形状,有 4 种:长方形、正方形、圆角长方形、圆形",
+          "label": ""
+        },
+        {
+          "key": "size",
+          "type": ["String"],
+          "desc": "组件尺寸",
+          "label": ""
+        },
+        {
+          "key": "theme",
+          "type": ["String"],
+          "desc": "组件风格,依次为品牌色、危险色",
+          "label": ""
+        },
+        {
+          "key": "type",
+          "type": ["String"],
+          "desc": "同小程序的 formType",
+          "label": ""
+        },
+        {
+          "key": "variant",
+          "type": ["String"],
+          "desc": "按钮形式,基础、线框、文字",
+          "label": ""
+        }
+      ],
+      "externalClasses": ["t-class", "t-class-icon"],
+      "events": [
+        {
+          "key": "bind:click",
+          "desc": "点击时触发",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-button theme=\"primary\" block content=\"强按钮\"></t-button>",
+      "path": "./button/button"
+    },
+    "t-cell-group": {
+      "key": "t-cell-group",
+      "label": "单元格组",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-cell.png",
+      "properties": [
+        {
+          "key": "bordered",
+          "type": ["Boolean"],
+          "desc": "是否显示组边框",
+          "label": ""
+        },
+        {
+          "key": "title",
+          "type": ["String"],
+          "desc": "单元格组标题",
+          "label": ""
+        }
+      ],
+      "externalClasses": ["t-class"],
+      "tpl": "<t-cell-group title=\"01 基础用法\"><t-cell title=\"单行标题\" required /><t-cell title=\"单行标题\" hover note=\"辅助信息\" /><t-cell title=\"单行标题\" hover arrow /><t-cell title=\"单行标题\" hover note=\"辅助信息\" arrow /></t-cell-group>",
+      "require": {
+        "t-cell": "./cell/cell"
+      },
+      "path": "./cell-group/cell-group"
+    },
+    "t-cell": {
+      "key": "t-cell",
+      "label": "单元格",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-cell.png",
+      "properties": [
+        {
+          "key": "align",
+          "type": ["String"],
+          "desc": "内容的对齐方式,默认居中对齐",
+          "label": ""
+        },
+        {
+          "key": "arrow",
+          "type": ["Boolean"],
+          "desc": "是否显示右侧箭头",
+          "label": ""
+        },
+        {
+          "key": "bordered",
+          "type": ["Boolean"],
+          "desc": "是否显示下边框",
+          "label": ""
+        },
+        {
+          "key": "description",
+          "type": ["String"],
+          "desc": "下方内容描述",
+          "label": ""
+        },
+        {
+          "key": "hover",
+          "type": ["Boolean"],
+          "desc": "是否开启点击反馈",
+          "label": ""
+        },
+        {
+          "key": "image",
+          "type": ["String"],
+          "desc": "主图",
+          "label": ""
+        },
+        {
+          "key": "jumpType",
+          "type": ["String"],
+          "desc": "链接跳转类型",
+          "label": ""
+        },
+        {
+          "key": "leftIcon",
+          "type": ["String"],
+          "desc": "左侧图标,出现在单元格标题的左侧",
+          "label": ""
+        },
+        {
+          "key": "note",
+          "type": ["String"],
+          "desc": "和标题同行的说明文字",
+          "label": ""
+        },
+        {
+          "key": "required",
+          "type": ["Boolean"],
+          "desc": "是否显示表单必填星号",
+          "label": ""
+        },
+        {
+          "key": "rightIcon",
+          "type": ["String"],
+          "desc": "最右侧图标",
+          "label": ""
+        },
+        {
+          "key": "title",
+          "type": ["String"],
+          "desc": "标题",
+          "label": ""
+        },
+        {
+          "key": "url",
+          "type": ["String"],
+          "desc": "点击后跳转链接地址。如果值为空,则表示不需要跳转",
+          "label": ""
+        }
+      ],
+      "externalClasses": [
+        "t-class",
+        "t-class-title",
+        "t-class-note",
+        "t-class-description",
+        "t-class-thumb",
+        "t-class-hover",
+        "t-class-left",
+        "t-class-right"
+      ],
+      "events": [
+        {
+          "key": "bind:click",
+          "desc": "右侧内容",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-cell title=\"单行标题\" hover />",
+      "path": "./cell/cell"
+    },
+    "t-check-tag": {
+      "key": "t-check-tag",
+      "label": "可选标签",
+      "icon": "",
+      "properties": [
+        {
+          "key": "checked",
+          "type": ["Boolean"],
+          "desc": "标签选中的状态,默认风格(theme=default)才有选中态",
+          "label": ""
+        },
+        {
+          "key": "closable",
+          "type": ["Boolean"],
+          "desc": "标签是否可关闭",
+          "label": ""
+        },
+        {
+          "key": "content",
+          "type": ["String", "Number"],
+          "desc": "组件子元素",
+          "label": ""
+        },
+        {
+          "key": "disabled",
+          "type": ["Boolean"],
+          "desc": "标签禁用态,失效标签不能触发事件。默认风格(theme=default)才有禁用态",
+          "label": ""
+        },
+        {
+          "key": "icon",
+          "type": ["String"],
+          "desc": "标签中的图标,可自定义图标呈现",
+          "label": ""
+        },
+        {
+          "key": "shape",
+          "type": ["String"],
+          "desc": "标签类型,有三种:方形、圆角方形、标记型",
+          "label": ""
+        },
+        {
+          "key": "size",
+          "type": ["String"],
+          "desc": "标签尺寸",
+          "label": ""
+        }
+      ],
+      "events": [
+        {
+          "key": "bind:change",
+          "desc": "组件子元素",
+          "label": ""
+        },
+        {
+          "key": "bind:click",
+          "desc": "点击标签时触发",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-check-tag>check tag</t-check-tag>",
+      "path": "./check-tag/check-tag"
+    },
+    "t-checkbox-group": {
+      "key": "t-checkbox-group",
+      "label": "多选框组",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-checkbox.png",
+      "properties": [
+        {
+          "key": "disabled",
+          "type": ["Boolean"],
+          "desc": "是否禁用组件",
+          "label": ""
+        },
+        {
+          "key": "max",
+          "type": ["Number"],
+          "desc": "支持最多选中的数量",
+          "label": ""
+        },
+        {
+          "key": "name",
+          "type": ["String"],
+          "desc": "统一设置内部复选框 HTML 属性",
+          "label": ""
+        },
+        {
+          "key": "options",
+          "type": ["Array"],
+          "desc": "以配置形式设置子元素。示例1:`['北京', '上海']` ,示例2: `[{ label: '全选', checkAll: true }, { label: '上海', value: 'shanghai' }]`。checkAll 值为 true 表示当前选项为「全选选项」",
+          "label": ""
+        },
+        {
+          "key": "value",
+          "type": ["Array"],
+          "desc": "选中值",
+          "label": ""
+        }
+      ],
+      "events": [
+        {
+          "key": "bind:change",
+          "desc": "值变化时触发。`context.current` 表示当前变化的数据项,如果是全选则为空;`context.type` 表示引起选中数据变化的是选中或是取消选中,`context.option` 表示当前变化的数据项",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-checkbox-group value=\"{{['checkbox1']}}\"><t-checkbox value=\"checkbox1\" label=\"多选\" /><t-checkbox value=\"checkbox2\" label=\"多选\" /><t-checkbox value=\"checkbox3\" label=\"多选\" /></t-checkbox-group>",
+      "require": {
+        "t-checkbox": "./checkbox/checkbox"
+      },
+      "path": "./checkbox-group/checkbox-group"
+    },
+    "t-checkbox": {
+      "key": "t-checkbox",
+      "label": "多选框",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-checkbox.png",
+      "properties": [
+        {
+          "key": "align",
+          "type": ["String"],
+          "desc": "多选框和内容相对位置",
+          "label": ""
+        },
+        {
+          "key": "checkAll",
+          "type": ["Boolean"],
+          "desc": "用于标识是否为「全选选项」。单独使用无效,需在 CheckboxGroup 中使用",
+          "label": ""
+        },
+        {
+          "key": "checked",
+          "type": ["Boolean"],
+          "desc": "是否选中",
+          "label": ""
+        },
+        {
+          "key": "color",
+          "type": ["String"],
+          "desc": "多选框颜色",
+          "label": ""
+        },
+        {
+          "key": "content",
+          "type": ["String"],
+          "desc": "多选框内容",
+          "label": ""
+        },
+        {
+          "key": "contentDisabled",
+          "type": ["Boolean"],
+          "desc": "是否禁用组件内容(content)触发选中",
+          "label": ""
+        },
+        {
+          "key": "disabled",
+          "type": ["Boolean"],
+          "desc": "是否禁用组件",
+          "label": ""
+        },
+        {
+          "key": "icon",
+          "type": ["Array"],
+          "desc": "自定义选中图标和非选中图标。示例:[选中态图标地址,非选中态图标地址]",
+          "label": ""
+        },
+        {
+          "key": "indeterminate",
+          "type": ["Boolean"],
+          "desc": "是否为半选",
+          "label": ""
+        },
+        {
+          "key": "label",
+          "type": ["String"],
+          "desc": "主文案",
+          "label": ""
+        },
+        {
+          "key": "maxContentRow",
+          "type": ["Number"],
+          "desc": "内容最大行数限制",
+          "label": ""
+        },
+        {
+          "key": "maxLabelRow",
+          "type": ["Number"],
+          "desc": "主文案最大行数限制",
+          "label": ""
+        },
+        {
+          "key": "name",
+          "type": ["String"],
+          "desc": "HTML 元素原生属性",
+          "label": ""
+        },
+        {
+          "key": "readonly",
+          "type": ["Boolean"],
+          "desc": "只读状态",
+          "label": ""
+        },
+        {
+          "key": "value",
+          "type": ["String", "Number"],
+          "desc": "多选框的值",
+          "label": ""
+        }
+      ],
+      "externalClasses": ["t-class", "t-class-icon", "t-class-label", "t-class-content", "t-class-border"],
+      "events": [
+        {
+          "key": "bind:change",
+          "desc": "值变化时触发",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-checkbox label=\"多选框\" checked=\"{{true}}\"></t-checkbox>",
+      "path": "./checkbox/checkbox"
+    },
+    "t-collapse-panel": {
+      "key": "t-collapse-panel",
+      "label": "折叠面板",
+      "icon": "",
+      "properties": [
+        {
+          "key": "content",
+          "type": ["String"],
+          "desc": "折叠面板内容",
+          "label": ""
+        },
+        {
+          "key": "disabled",
+          "type": ["Boolean"],
+          "desc": "禁止当前面板展开,优先级大于 Collapse 的同名属性",
+          "label": ""
+        },
+        {
+          "key": "expandIcon",
+          "type": ["Boolean"],
+          "desc": "当前折叠面板展开图标,优先级大于 Collapse 的同名属性",
+          "label": ""
+        },
+        {
+          "key": "header",
+          "type": ["String"],
+          "desc": "面板头内容",
+          "label": ""
+        },
+        {
+          "key": "headerRightContent",
+          "type": ["String"],
+          "desc": "面板头的右侧区域,一般用于呈现面板操作",
+          "label": ""
+        },
+        {
+          "key": "value",
+          "type": ["String", "Number"],
+          "desc": "当前面板唯一标识,如果值为空则取当前面下标兜底作为唯一标识",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-collapse-panel header=\"折叠面板标题\" value=\"{{0}}\">此处可自定义内容</t-collapse-panel>",
+      "path": "./collapse/collapse-panel"
+    },
+    "t-collapse": {
+      "key": "t-collapse",
+      "label": "折叠",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-collapse.png",
+      "properties": [
+        {
+          "key": "defaultExpandAll",
+          "type": ["Boolean"],
+          "desc": "默认是否展开全部",
+          "label": ""
+        },
+        {
+          "key": "disabled",
+          "type": ["Boolean"],
+          "desc": "是否禁用面板展开/收起操作",
+          "label": ""
+        },
+        {
+          "key": "expandIcon",
+          "type": ["Boolean"],
+          "desc": "展开图标。值为 undefined 或 false 则不显示展开图标;值为 true 显示默认图标;值类型为函数,则表示完全自定义展开图标",
+          "label": ""
+        },
+        {
+          "key": "expandMutex",
+          "type": ["Boolean"],
+          "desc": "每个面板互斥展开,每次只展开一个面板",
+          "label": ""
+        },
+        {
+          "key": "value",
+          "type": ["Array"],
+          "desc": "展开的面板集合",
+          "label": ""
+        }
+      ],
+      "events": [
+        {
+          "key": "bind:change",
+          "desc": "切换面板时触发,返回变化的值",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-collapse value=\"{{[0]}}\"><t-collapse-panel header=\"折叠面板标题\" value=\"{{0}}\">此处可自定义内容</t-collapse-panel></t-collapse>",
+      "require": {
+        "t-collapse-panel": "./collapse/collapse-panel"
+      },
+      "path": "./collapse/collapse"
+    },
+    "t-date-time-picker": {
+      "key": "t-date-time-picker",
+      "label": "日期时间选择器",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-datetimepicker.png",
+      "properties": [
+        {
+          "key": "cancelBtn",
+          "type": ["String"],
+          "desc": "取消按钮文字",
+          "label": ""
+        },
+        {
+          "key": "confirmBtn",
+          "type": ["String"],
+          "desc": "确定按钮文字",
+          "label": ""
+        },
+        {
+          "key": "end",
+          "type": ["String", "Number"],
+          "desc": "选择器的结束时间",
+          "label": ""
+        },
+        {
+          "key": "footer",
+          "type": ["String"],
+          "desc": "底部内容",
+          "label": ""
+        },
+        {
+          "key": "format",
+          "type": ["String"],
+          "desc": "用于格式化日期,[详细文档](https://day.js.org/docs/en/display/format)",
+          "label": ""
+        },
+        {
+          "key": "header",
+          "type": ["Boolean"],
+          "desc": "头部内容。值为 true 显示空白头部,值为 false 不显示任何内容,值类型为 TNode 表示自定义头部内容",
+          "label": ""
+        },
+        {
+          "key": "mode",
+          "type": ["String", "Array"],
+          "desc": "选择器模式,用于表示可以选择到哪一个层级。【示例一】year 或者 ['year'] 表示纯日期选择器,只能选择到年份,只显示年份。【示例二】'hour' 或 ['hour'] 表示纯时间选择器,只能选择到小时维度。【示例三】['year', 'month', 'date', 'hour', 'minute'] 表示,日期和时间 混合选择器,可以选择到具体哪一分钟,显示全部时间:年/月/日/时/分",
+          "label": ""
+        },
+        {
+          "key": "showWeek",
+          "type": ["Boolean"],
+          "desc": "【开发中】是否在日期旁边显示周几(如周一,周二,周日等)",
+          "label": ""
+        },
+        {
+          "key": "start",
+          "type": ["String", "Number"],
+          "desc": "选择器的开始时间",
+          "label": ""
+        },
+        {
+          "key": "title",
+          "type": ["String"],
+          "desc": "标题",
+          "label": ""
+        },
+        {
+          "key": "value",
+          "type": ["String", "Number"],
+          "desc": "选中值",
+          "label": ""
+        },
+        {
+          "key": "visible",
+          "type": ["Boolean"],
+          "desc": "是否显示",
+          "label": ""
+        }
+      ],
+      "externalClasses": ["t-class", "t-class-confirm", "t-class-cancel", "t-class-title"],
+      "events": [
+        {
+          "key": "bind:cancel",
+          "desc": "取消按钮点击时触发",
+          "label": ""
+        },
+        {
+          "key": "bind:change",
+          "desc": "选中值发生变化时触发",
+          "label": ""
+        },
+        {
+          "key": "bind:column-change",
+          "desc": "每一列选中数据变化时触发",
+          "label": ""
+        },
+        {
+          "key": "bind:confirm",
+          "desc": "确认按钮点击时触发",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-date-time-picker title=\"选择日期\" visible=\"{{true}}\" mode=\"{{['date']}}\" format=\"YYYY-MM-DD\"></t-date-time-picker>",
+      "path": "./date-time-picker/date-time-picker"
+    },
+    "t-dialog": {
+      "key": "t-dialog",
+      "label": "对话框",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-dialog.png",
+      "properties": [
+        {
+          "key": "actions",
+          "type": ["Array"],
+          "desc": "操作栏",
+          "label": ""
+        },
+        {
+          "key": "buttonLayout",
+          "type": ["String"],
+          "desc": "多按钮排列方式",
+          "label": ""
+        },
+        {
+          "key": "cancelBtn",
+          "type": ["String", "Object"],
+          "desc": "取消按钮,可自定义。值为 null 则不显示取消按钮。值类型为字符串,则表示自定义按钮文本,值类型为 Object 则表示透传 Button 组件属性。使用 TNode 自定义按钮时,需自行控制取消事件",
+          "label": ""
+        },
+        {
+          "key": "closeOnOverlayClick",
+          "type": ["Boolean"],
+          "desc": "点击蒙层时是否触发关闭事件",
+          "label": ""
+        },
+        {
+          "key": "confirmBtn",
+          "type": ["String", "Object"],
+          "desc": "确认按钮。值为 null 则不显示确认按钮。值类型为字符串,则表示自定义按钮文本,值类型为 Object 则表示透传 Button 组件属性。使用 TNode 自定义按钮时,需自行控制确认事件",
+          "label": ""
+        },
+        {
+          "key": "content",
+          "type": ["String"],
+          "desc": "内容",
+          "label": ""
+        },
+        {
+          "key": "preventScrollThrough",
+          "type": ["Boolean"],
+          "desc": "防止滚动穿透",
+          "label": ""
+        },
+        {
+          "key": "showInAttachedElement",
+          "type": ["Boolean"],
+          "desc": "【开发中】仅在挂载元素中显示抽屉,默认在浏览器可视区域显示。父元素需要有定位属性,如:position: relative",
+          "label": ""
+        },
+        {
+          "key": "showOverlay",
+          "type": ["Boolean"],
+          "desc": "是否显示遮罩层",
+          "label": ""
+        },
+        {
+          "key": "title",
+          "type": ["String"],
+          "desc": "标题",
+          "label": ""
+        },
+        {
+          "key": "visible",
+          "type": ["Boolean"],
+          "desc": "控制对话框是否显示",
+          "label": ""
+        },
+        {
+          "key": "zIndex",
+          "type": ["Number"],
+          "desc": "对话框层级,Web 侧样式默认为 2500,移动端和小程序样式默认为 1500",
+          "label": ""
+        }
+      ],
+      "externalClasses": ["t-class", "t-class-content", "t-class-confirm", "t-class-cancel"],
+      "events": [
+        {
+          "key": "bind:cancel",
+          "desc": "如果“取消”按钮存在,则点击“取消”按钮时触发,同时触发关闭事件",
+          "label": ""
+        },
+        {
+          "key": "bind:close",
+          "desc": "关闭事件,点击 取消按钮 或 点击蒙层 时触发",
+          "label": ""
+        },
+        {
+          "key": "bind:overlay-click",
+          "desc": "如果蒙层存在,点击蒙层时触发",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-dialog visible=\"{{true}}\" title=\"对话框标题\" content=\"告知当前状态、信息和解决方法,等内容。描述文案尽可能控制在三行内\" confirm-btn=\"我知道了\" />",
+      "path": "./dialog/dialog"
+    },
+    "t-divider": {
+      "key": "t-divider",
+      "label": "分割线",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-divider.png",
+      "properties": [
+        {
+          "key": "align",
+          "type": ["String"],
+          "desc": "文本位置(仅在水平分割线有效)",
+          "label": ""
+        },
+        {
+          "key": "content",
+          "type": ["String"],
+          "desc": "子元素",
+          "label": ""
+        },
+        {
+          "key": "dashed",
+          "type": ["Boolean"],
+          "desc": "是否虚线(仅在水平分割线有效)",
+          "label": ""
+        },
+        {
+          "key": "layout",
+          "type": ["String"],
+          "desc": "分隔线类型有两种:水平和垂直",
+          "label": ""
+        },
+        {
+          "key": "lineColor",
+          "type": ["String"],
+          "desc": "分隔线颜色",
+          "label": ""
+        }
+      ],
+      "externalClasses": ["t-class", "t-class-line", "t-class-content"],
+      "tpl": "<t-divider />",
+      "path": "./divider/divider"
+    },
+    "t-drawer": {
+      "key": "t-drawer",
+      "label": "模态抽屉",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-drawer.png",
+      "properties": [
+        {
+          "key": "closeOnOverlayClick",
+          "type": ["Boolean"],
+          "desc": "点击蒙层时是否触发抽屉关闭事件",
+          "label": ""
+        },
+        {
+          "key": "destroyOnClose",
+          "type": ["Boolean"],
+          "desc": "抽屉关闭时是否销毁节点",
+          "label": ""
+        },
+        {
+          "key": "items",
+          "type": ["Array"],
+          "desc": "抽屉里的列表项",
+          "label": ""
+        },
+        {
+          "key": "placement",
+          "type": ["String"],
+          "desc": "抽屉方向",
+          "label": ""
+        },
+        {
+          "key": "showOverlay",
+          "type": ["Boolean"],
+          "desc": "是否显示遮罩层",
+          "label": ""
+        },
+        {
+          "key": "visible",
+          "type": ["Boolean"],
+          "desc": "组件是否可见",
+          "label": ""
+        },
+        {
+          "key": "zIndex",
+          "type": ["Number"],
+          "desc": "抽屉层级,样式默认为 1500",
+          "label": ""
+        }
+      ],
+      "events": [
+        {
+          "key": "bind:close",
+          "desc": "关闭事件,取消按钮点击时、关闭按钮点击时、点击蒙层时均会触发",
+          "label": ""
+        },
+        {
+          "key": "bind:item-click",
+          "desc": "点击抽屉里的列表项",
+          "label": ""
+        },
+        {
+          "key": "bind:overlay-click",
+          "desc": "如果蒙层存在,点击蒙层时触发",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-drawer visible=\"{{true}}\" placement=\"left\" items=\"{{[{title: '菜单一'},{title: '菜单二'}]}}\"></t-drawer>",
+      "path": "./drawer/drawer"
+    },
+    "t-dropdown-item": {
+      "key": "t-dropdown-item",
+      "label": "下拉菜单子项",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-dropdownmenu.png",
+      "properties": [
+        {
+          "key": "disabled",
+          "type": ["Boolean"],
+          "desc": "是否禁用",
+          "label": ""
+        },
+        {
+          "key": "label",
+          "type": ["String"],
+          "desc": "标题",
+          "label": ""
+        },
+        {
+          "key": "multiple",
+          "type": ["Boolean"],
+          "desc": "是否多选",
+          "label": ""
+        },
+        {
+          "key": "options",
+          "type": ["Array"],
+          "desc": "选项数据",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-dropdown-item label=\"菜单\" options=\"{{[{label:'选项一',value:'option_1',disabled:false},{label:'选项二',value:'option_2',disabled:false},{label:'选项三',value:'option_3',disabled:false}]}}\" defaultValue=\"option_3\" /><t-dropdown-item label=\"菜单\" options=\"{{[{label:'选项一',value:'option_1',disabled:false},{label:'选项二',value:'option_2',disabled:false},{label:'选项三',value:'option_3',disabled:false}]}}\" defaultValue=\"option_3\" />",
+      "path": "./dropdown-menu/dropdown-item"
+    },
+    "t-dropdown-menu": {
+      "key": "t-dropdown-menu",
+      "label": "下拉菜单",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-dropdownmenu.png",
+      "properties": [
+        {
+          "key": "activeColor",
+          "type": ["String"],
+          "desc": "【讨论中】菜单标题和选项的选中态颜色",
+          "label": ""
+        },
+        {
+          "key": "closeOnClickOverlay",
+          "type": ["Boolean"],
+          "desc": "是否在点击遮罩层后关闭菜单",
+          "label": ""
+        },
+        {
+          "key": "duration",
+          "type": ["String", "Number"],
+          "desc": "动画时长",
+          "label": ""
+        },
+        {
+          "key": "showOverlay",
+          "type": ["Boolean"],
+          "desc": "是否显示遮罩层",
+          "label": ""
+        },
+        {
+          "key": "zIndex",
+          "type": ["Number"],
+          "desc": "菜单栏 z-index 层级",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-dropdown-menu><t-dropdown-item label=\"菜单\" options=\"{{[{label:'选项一',value:'option_1',disabled:false},{label:'选项二',value:'option_2',disabled:false},{label:'选项三',value:'option_3',disabled:false}]}}\" defaultValue=\"option_3\" /><t-dropdown-item label=\"菜单\" options=\"{{[{label:'选项一',value:'option_1',disabled:false},{label:'选项二',value:'option_2',disabled:false},{label:'选项三',value:'option_3',disabled:false}]}}\" defaultValue=\"option_3\" /></t-dropdown-menu>",
+      "require": {
+        "t-dropdown-item": "./dropdown-menu/dropdown-item"
+      },
+      "path": "./dropdown-menu/dropdown-menu"
+    },
+    "t-empty": {
+      "key": "t-empty",
+      "label": "空状态",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-empty.png",
+      "properties": [
+        {
+          "key": "action",
+          "type": ["String"],
+          "desc": "操作按钮",
+          "label": ""
+        },
+        {
+          "key": "description",
+          "type": ["String"],
+          "desc": "描述文字",
+          "label": ""
+        },
+        {
+          "key": "icon",
+          "type": ["String"],
+          "desc": "图标名称",
+          "label": ""
+        },
+        {
+          "key": "image",
+          "type": ["String"],
+          "desc": "图片地址",
+          "label": ""
+        }
+      ],
+      "externalClasses": ["t-class", "t-class-description", "t-class-image", "t-class-actions"],
+      "tpl": "<t-empty icon=\"info-circle-filled\" />",
+      "path": "./empty/empty"
+    },
+    "t-fab": {
+      "key": "t-fab",
+      "label": "悬浮按钮",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-fab.png",
+      "properties": [
+        {
+          "key": "buttonProps",
+          "type": ["Object"],
+          "desc": "透传至 Button 组件",
+          "label": ""
+        },
+        {
+          "key": "icon",
+          "type": ["String"],
+          "desc": "图标",
+          "label": ""
+        },
+        {
+          "key": "style",
+          "type": ["String"],
+          "desc": "悬浮按钮的样式,常用于调整位置",
+          "label": ""
+        },
+        {
+          "key": "text",
+          "type": ["String"],
+          "desc": "文本内容",
+          "label": ""
+        }
+      ],
+      "events": [
+        {
+          "key": "bind:click",
+          "desc": "悬浮按钮点击事件",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-fab icon=\"add\" />",
+      "path": "./fab/fab"
+    },
+    "t-footer": {
+      "key": "t-footer",
+      "label": "布局-底部内容",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-footer.png",
+      "properties": [
+        {
+          "key": "copyright",
+          "type": ["String"],
+          "desc": "版权信息,type 为`text`生效",
+          "label": ""
+        },
+        {
+          "key": "logo",
+          "type": ["Object"],
+          "desc": "图标配置,type 为`logo`生效。`logo.icon` 表示图标链接地址,`logo.title` 表示标题文本,`logo.url` 表示链接跳转地址",
+          "label": ""
+        },
+        {
+          "key": "textLinkList",
+          "type": ["Array"],
+          "desc": "链接列表,type 为`text`生效。name 表示链接名称, url 表示链接 page 路径,目前只支持小程序内部跳转,openType 表示跳转方式",
+          "label": ""
+        },
+        {
+          "key": "theme",
+          "type": ["String"],
+          "desc": "页脚展示类型",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-footer theme=\"text\" copyright=\"Copyright © 2021-2031 TD.All Rights Reserved.\" />",
+      "path": "./footer/footer"
+    },
+    "t-grid-item": {
+      "key": "t-grid-item",
+      "label": "宫格子项",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-grid.png",
+      "properties": [
+        {
+          "key": "badgeProps",
+          "type": ["Object"],
+          "desc": "头像右上角提示信息,继承 Badge 组件的全部特性。如:小红点,或者数字",
+          "label": ""
+        },
+        {
+          "key": "description",
+          "type": ["String"],
+          "desc": "文本以外的更多描述,辅助信息。可以通过 Props 传入文本,也可以自定义标题节点",
+          "label": ""
+        },
+        {
+          "key": "image",
+          "type": ["String"],
+          "desc": "图片,可以是图片地址,也可以自定义图片节点",
+          "label": ""
+        },
+        {
+          "key": "jumpType",
+          "type": ["String"],
+          "desc": "链接跳转类型",
+          "label": ""
+        },
+        {
+          "key": "layout",
+          "type": ["String"],
+          "desc": "内容布局方式",
+          "label": ""
+        },
+        {
+          "key": "text",
+          "type": ["String"],
+          "desc": "文本,可以通过 Props 传入文本,也可以自定义标题节点",
+          "label": ""
+        },
+        {
+          "key": "url",
+          "type": ["String"],
+          "desc": "点击后的跳转链接",
+          "label": ""
+        }
+      ],
+      "externalClasses": ["t-class", "t-class-image", "t-class-text", "t-class-description"],
+      "tpl": "<t-grid-item text=\"标题文字\"><image style=\"width: 96rpx; height: 96rpx\" src=\"https://tdesign.gtimg.com/mobile/%E5%9B%BE%E7%89%87.png\" slot=\"image\" /></t-grid-item>",
+      "path": "./grid-item/grid-item"
+    },
+    "t-grid": {
+      "key": "t-grid",
+      "label": "栅格",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-grid.png",
+      "properties": [
+        {
+          "key": "align",
+          "type": ["String"],
+          "desc": "内容对齐方式",
+          "label": ""
+        },
+        {
+          "key": "border",
+          "type": ["Boolean", "Object"],
+          "desc": "边框,默认不显示。值为 true 则显示默认边框,值类型为 object 则表示自定义边框样式",
+          "label": ""
+        },
+        {
+          "key": "column",
+          "type": ["Number"],
+          "desc": "每一行的列数量",
+          "label": ""
+        },
+        {
+          "key": "gutter",
+          "type": ["Number"],
+          "desc": "间隔大小",
+          "label": ""
+        },
+        {
+          "key": "hover",
+          "type": ["Boolean"],
+          "desc": "是否开启点击反馈",
+          "label": ""
+        }
+      ],
+      "externalClasses": ["t-class"],
+      "tpl": "<t-grid column=\"{{2}}\"><t-grid-item text=\"标题文字\"><image style=\"width: 96rpx; height: 96rpx\" src=\"https://tdesign.gtimg.com/mobile/%E5%9B%BE%E7%89%87.png\" slot=\"image\" /></t-grid-item><t-grid-item text=\"标题文字\"><image style=\"width: 96rpx; height: 96rpx\" src=\"https://tdesign.gtimg.com/mobile/%E5%9B%BE%E7%89%87.png\" slot=\"image\" /></t-grid-item></t-grid>",
+      "require": {
+        "t-grid-item": "./grid-item/grid-item"
+      },
+      "path": "./grid/grid"
+    },
+    "t-icon": {
+      "key": "t-icon",
+      "label": "图标",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-icon.png",
+      "properties": [
+        {
+          "key": "classPrefix",
+          "type": ["String"],
+          "desc": "自定义icon前缀",
+          "label": ""
+        },
+        {
+          "key": "color",
+          "type": ["String"],
+          "desc": "图标颜色",
+          "label": ""
+        },
+        {
+          "key": "style",
+          "type": ["String"],
+          "desc": "自定义样式",
+          "label": ""
+        },
+        {
+          "key": "name",
+          "type": ["String"],
+          "desc": "图标名称",
+          "label": ""
+        },
+        {
+          "key": "size",
+          "type": ["String", "Number"],
+          "desc": "图标名称",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-icon name=\"add-circle\" />",
+      "path": "./icon/icon"
+    },
+    "t-image": {
+      "key": "t-image",
+      "label": "图片",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-image.png",
+      "properties": [
+        {
+          "key": "error",
+          "type": ["String"],
+          "desc": "加载失败时显示的内容。值为 `default` 则表示使用默认加载失败风格;值为空或者 `slot` 表示使用插槽渲染,插槽名称为 `error`;值为其他则表示普通文本内容,如“加载失败”",
+          "label": ""
+        },
+        {
+          "key": "lazy",
+          "type": ["Boolean"],
+          "desc": "是否开启图片懒加载",
+          "label": ""
+        },
+        {
+          "key": "loading",
+          "type": ["String"],
+          "desc": "加载态内容。值为 `default` 则表示使用默认加载中风格;值为空或者 `slot` 表示使用插槽渲染,插槽名称为 `loading`;值为其他则表示普通文本内容,如“加载中”",
+          "label": ""
+        },
+        {
+          "key": "shape",
+          "type": ["String"],
+          "desc": "图片圆角类型",
+          "label": ""
+        },
+        {
+          "key": "src",
+          "type": ["String"],
+          "desc": "图片链接",
+          "label": ""
+        }
+      ],
+      "externalClasses": ["t-class", "t-class-load"],
+      "events": [
+        {
+          "key": "bind:error",
+          "desc": "图片加载失败时触发",
+          "label": ""
+        },
+        {
+          "key": "bind:load",
+          "desc": "图片加载完成时触发",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-image src=\"https://tdesign.gtimg.com/mobile/%E5%9B%BE%E7%89%87.png\" mode=\"aspectFill\"></t-image>",
+      "path": "./image/image"
+    },
+    "t-indexes": {
+      "key": "t-indexes",
+      "label": "索引",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-indexes.png",
+      "properties": [
+        {
+          "key": "height",
+          "type": ["Number"],
+          "desc": "列表高度,未设置默认占满设备高度",
+          "label": ""
+        },
+        {
+          "key": "list",
+          "type": ["Array"],
+          "desc": "索引列表的列表数据。每个元素包含三个子元素,index(string):索引值,例如1,2,3,...或A,B,C等;title(string): 索引标题,可不填将默认设为索引值;children(Array<{title: string}>): 子元素列表,title为子元素的展示文案。",
+          "label": ""
+        },
+        {
+          "key": "sticky",
+          "type": ["Boolean"],
+          "desc": "索引是否吸顶,默认为true",
+          "label": ""
+        }
+      ],
+      "events": [
+        {
+          "key": "bind:select",
+          "desc": "点击行元素时触发事件",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-indexes id=\"bar\" list=\"{{ [{ title: 'A开头', index: 'A', children: [{ title: '阿坝' }]},{ title: 'B开头', index: 'B', children: [{ title: '北京' }]}] }}\" />",
+      "path": "./indexes/indexes"
+    },
+    "t-input": {
+      "key": "t-input",
+      "label": "输入框",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-input.png",
+      "properties": [
+        {
+          "key": "align",
+          "type": ["String"],
+          "desc": "文本内容位置,居左/居中/居右",
+          "label": ""
+        },
+        {
+          "key": "borderless",
+          "type": ["Boolean"],
+          "desc": "【讨论中】是否开启无边框模式",
+          "label": ""
+        },
+        {
+          "key": "clearable",
+          "type": ["Boolean"],
+          "desc": "是否可清空",
+          "label": ""
+        },
+        {
+          "key": "disabled",
+          "type": ["Boolean"],
+          "desc": "是否禁用输入框",
+          "label": ""
+        },
+        {
+          "key": "errorMessage",
+          "type": ["String"],
+          "desc": "错误提示文本,值为空不显示(废弃属性,如果需要,请更为使用 status 和 tips)",
+          "label": ""
+        },
+        {
+          "key": "format",
+          "type": ["String"],
+          "desc": "【开发中】指定输入框展示值的格式",
+          "label": ""
+        },
+        {
+          "key": "label",
+          "type": ["String"],
+          "desc": "左侧文本",
+          "label": ""
+        },
+        {
+          "key": "maxcharacter",
+          "type": ["Number"],
+          "desc": "用户最多可以输入的字符个数,一个中文汉字表示两个字符长度。`maxcharacter` 和 `maxlength` 二选一使用",
+          "label": ""
+        },
+        {
+          "key": "maxlength",
+          "type": ["Number"],
+          "desc": "用户最多可以输入的文本长度,一个中文等于一个计数长度。值小于等于 0 的时候,则表示不限制输入长度。`maxcharacter` 和 `maxlength` 二选一使用",
+          "label": ""
+        },
+        {
+          "key": "placeholder",
+          "type": ["String"],
+          "desc": "占位符",
+          "label": ""
+        },
+        {
+          "key": "prefixIcon",
+          "type": ["String"],
+          "desc": "组件前置图标,值为字符串则表示图标名称",
+          "label": ""
+        },
+        {
+          "key": "readonly",
+          "type": ["Boolean"],
+          "desc": "只读状态",
+          "label": ""
+        },
+        {
+          "key": "size",
+          "type": ["String"],
+          "desc": "输入框尺寸",
+          "label": ""
+        },
+        {
+          "key": "status",
+          "type": ["String"],
+          "desc": "输入框状态",
+          "label": ""
+        },
+        {
+          "key": "suffix",
+          "type": ["String"],
+          "desc": "后置图标前的后置内容",
+          "label": ""
+        },
+        {
+          "key": "suffixIcon",
+          "type": ["String"],
+          "desc": "后置文本内容,值为字符串则表示图标名称",
+          "label": ""
+        },
+        {
+          "key": "tips",
+          "type": ["String"],
+          "desc": "输入框下方提示文本,会根据不同的 `status` 呈现不同的样式",
+          "label": ""
+        },
+        {
+          "key": "value",
+          "type": ["String", "Number"],
+          "desc": "输入框的值",
+          "label": ""
+        }
+      ],
+      "externalClasses": ["t-class", "t-class-input", "t-class-placeholder", "t-class-error-msg"],
+      "events": [
+        {
+          "key": "bind:blur",
+          "desc": "失去焦点时触发",
+          "label": ""
+        },
+        {
+          "key": "bind:change",
+          "desc": "输入框值发生变化时触发",
+          "label": ""
+        },
+        {
+          "key": "bind:clear",
+          "desc": "清空按钮点击时触发",
+          "label": ""
+        },
+        {
+          "key": "bind:enter",
+          "desc": "回车键按下时触发",
+          "label": ""
+        },
+        {
+          "key": "bind:focus",
+          "desc": "获得焦点时触发",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-input placeholder=\"请输入文字\" />",
+      "path": "./input/input"
+    },
+    "t-loading": {
+      "key": "t-loading",
+      "label": "加载中",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-loading.png",
+      "properties": [
+        {
+          "key": "delay",
+          "type": ["Number"],
+          "desc": "延迟显示加载效果的时间,用于防止请求速度过快引起的加载闪烁,单位:毫秒",
+          "label": ""
+        },
+        {
+          "key": "duration",
+          "type": ["Number"],
+          "desc": "加载动画执行完成一次的时间,单位:毫秒",
+          "label": ""
+        },
+        {
+          "key": "indicator",
+          "type": ["Boolean"],
+          "desc": "是否显示加载指示符",
+          "label": ""
+        },
+        {
+          "key": "inheritColor",
+          "type": ["Boolean"],
+          "desc": "是否继承父元素颜色",
+          "label": ""
+        },
+        {
+          "key": "layout",
+          "type": ["String"],
+          "desc": "对齐方式",
+          "label": ""
+        },
+        {
+          "key": "loading",
+          "type": ["Boolean"],
+          "desc": "是否处于加载状态",
+          "label": ""
+        },
+        {
+          "key": "pause",
+          "type": ["Boolean"],
+          "desc": "是否暂停动画",
+          "label": ""
+        },
+        {
+          "key": "progress",
+          "type": ["Number"],
+          "desc": "加载进度",
+          "label": ""
+        },
+        {
+          "key": "reverse",
+          "type": ["Boolean"],
+          "desc": "加载动画是否反向",
+          "label": ""
+        },
+        {
+          "key": "size",
+          "type": ["String"],
+          "desc": "尺寸,示例:40rpx/20px",
+          "label": ""
+        },
+        {
+          "key": "text",
+          "type": ["String"],
+          "desc": "加载提示文案",
+          "label": ""
+        },
+        {
+          "key": "theme",
+          "type": ["String"],
+          "desc": "加载组件类型",
+          "label": ""
+        }
+      ],
+      "externalClasses": ["t-class", "t-class-text", "t-class-indicator"],
+      "tpl": "<t-loading theme=\"circular\" size=\"40rpx\"></t-loading>",
+      "path": "./loading/loading"
+    },
+    "t-message": {
+      "key": "t-message",
+      "label": "全局提醒",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-message.png",
+      "properties": [
+        {
+          "key": "action",
+          "type": ["String"],
+          "desc": "操作",
+          "label": ""
+        },
+        {
+          "key": "align",
+          "type": ["String"],
+          "desc": "文本对齐方式",
+          "label": ""
+        },
+        {
+          "key": "closeBtn",
+          "type": ["String", "Boolean"],
+          "desc": "关闭按钮,可以自定义。值为 true 显示默认关闭按钮,值为 false 不显示关闭按钮。值类型为 string 则直接显示值,如:“关闭”。也可以完全自定义按钮",
+          "label": ""
+        },
+        {
+          "key": "content",
+          "type": ["String"],
+          "desc": "用于自定义消息弹出内容",
+          "label": ""
+        },
+        {
+          "key": "duration",
+          "type": ["Number"],
+          "desc": "消息内置计时器,计时到达时会触发 duration-end 事件。单位:毫秒。值为 0 则表示没有计时器。",
+          "label": ""
+        },
+        {
+          "key": "icon",
+          "type": ["String", "Boolean"],
+          "desc": "消息提醒前面的图标。值为 true 则根据 theme 显示对应的图标,值为 false 则不显示图标。值为 'info' 或 'bell' 则显示组件内置图标。也可以完全自定义图标节点",
+          "label": ""
+        },
+        {
+          "key": "marquee",
+          "type": ["Boolean", "Object"],
+          "desc": "跑马灯效果。speed 指速度控制;loop 指循环播放次数,值为 -1 表示循环播放,值为 0 表示不循环播放;delay 表示延迟多久开始播放",
+          "label": ""
+        },
+        {
+          "key": "offset",
+          "type": ["Array"],
+          "desc": "相对于 placement 的偏移量,示例:[-10, 20] 或 ['10rpx', '8rpx']",
+          "label": ""
+        },
+        {
+          "key": "theme",
+          "type": ["String"],
+          "desc": "消息组件风格",
+          "label": ""
+        },
+        {
+          "key": "visible",
+          "type": ["Boolean"],
+          "desc": "是否显示,隐藏时默认销毁组件",
+          "label": ""
+        },
+        {
+          "key": "zIndex",
+          "type": ["Number"],
+          "desc": "元素层级,样式默认为 5000",
+          "label": ""
+        }
+      ],
+      "externalClasses": ["t-class", "t-class-content", "t-class-icon", "t-class-action", "t-class-close-btn"],
+      "events": [
+        {
+          "key": "bind:action-btn-click",
+          "desc": "当操作按钮存在时,用户点击操作按钮时触发",
+          "label": ""
+        },
+        {
+          "key": "bind:close-btn-click",
+          "desc": "当关闭按钮存在时,用户点击关闭按钮触发",
+          "label": ""
+        },
+        {
+          "key": "bind:duration-end",
+          "desc": "计时结束后触发",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-message id=\"t-message\" />",
+      "path": "./message/message"
+    },
+    "t-navbar": {
+      "key": "t-navbar",
+      "label": "导航条",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-navbar.png",
+      "properties": [
+        {
+          "key": "animation",
+          "type": ["Boolean"],
+          "desc": "是否添加动画效果",
+          "label": ""
+        },
+        {
+          "key": "background",
+          "type": ["String"],
+          "desc": "背景",
+          "label": ""
+        },
+        {
+          "key": "delta",
+          "type": ["Number"],
+          "desc": "后退按钮后退层数,含义参考 [wx.navigateBack](https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.navigateBack.html),特殊的,传入 0 不会发生执行 wx.navigateBack,只会触发一个 goback 事件供自行处理。",
+          "label": ""
+        },
+        {
+          "key": "fixed",
+          "type": ["Boolean"],
+          "desc": "是否固定在顶部",
+          "label": ""
+        },
+        {
+          "key": "homeIcon",
+          "type": ["String"],
+          "desc": "首页图标地址。值为 '' 或者 undefiend 则表示不显示返回图标,值为 'circle' 表示显示默认图标,值为 'slot' 表示使用插槽渲染,值为其他则表示图标地址",
+          "label": ""
+        },
+        {
+          "key": "leftIcon",
+          "type": ["String"],
+          "desc": "左侧图标地址,值为 '' 或者 undefiend 则表示不显示返回图标,值为 'arrow-left' 表示显示返回图标,值为 'slot' 表示使用插槽渲染,值为其他则表示图标地址",
+          "label": ""
+        },
+        {
+          "key": "title",
+          "type": ["String"],
+          "desc": "页面标题",
+          "label": ""
+        },
+        {
+          "key": "titleMaxLength",
+          "type": ["Number"],
+          "desc": "标题文字最大长度,超出的范围使用 `...` 表示",
+          "label": ""
+        },
+        {
+          "key": "visible",
+          "type": ["Boolean"],
+          "desc": "是否显示",
+          "label": ""
+        }
+      ],
+      "externalClasses": ["t-class", "t-class-title", "t-class-left-icon", "t-class-home-icon", "t-class-capsule"],
+      "events": [
+        {
+          "key": "bind:complete",
+          "desc": "navigateBack 执行完成后触发(失败或成功均会触发)",
+          "label": ""
+        },
+        {
+          "key": "bind:fail",
+          "desc": "navigateBack 执行失败后触发",
+          "label": ""
+        },
+        {
+          "key": "bind:go-back",
+          "desc": "delta 值为 0 时,点击返回,触发该事件",
+          "label": ""
+        },
+        {
+          "key": "bind:go-home",
+          "desc": "点击 Home 触发",
+          "label": ""
+        },
+        {
+          "key": "bind:success",
+          "desc": "navigateBack 执行成功后触发",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-navbar title=\"标题\" />",
+      "path": "./navbar/navbar"
+    },
+    "t-picker-item": {
+      "key": "t-picker-item",
+      "label": "选择器子项",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-picker.png",
+      "properties": [
+        {
+          "key": "format",
+          "type": ["String"],
+          "desc": "格式化标签",
+          "label": ""
+        },
+        {
+          "key": "options",
+          "type": ["Array"],
+          "desc": "数据源",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-picker-item options=\"{{[{ label: '上海', value: '上海' },{ label: '广州', value: '广州' },{ label: '深圳', value: '深圳' }]}}\" value=\"广州\"></t-picker-item>",
+      "path": "./picker-item/picker-item"
+    },
+    "t-picker": {
+      "key": "t-picker",
+      "label": "选择器",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-picker.png",
+      "properties": [
+        {
+          "key": "cancelBtn",
+          "type": ["String", "Object"],
+          "desc": "取消按钮文字",
+          "label": ""
+        },
+        {
+          "key": "confirmBtn",
+          "type": ["String", "Object"],
+          "desc": "确定按钮文字",
+          "label": ""
+        },
+        {
+          "key": "footer",
+          "type": ["String"],
+          "desc": "底部内容",
+          "label": ""
+        },
+        {
+          "key": "header",
+          "type": ["Boolean"],
+          "desc": "头部内容。值为 true 显示空白头部,值为 false 不显示任何内容,值类型为 TNode 表示自定义头部内容",
+          "label": ""
+        },
+        {
+          "key": "title",
+          "type": ["String"],
+          "desc": "标题",
+          "label": ""
+        },
+        {
+          "key": "value",
+          "type": ["Array"],
+          "desc": "选中值",
+          "label": ""
+        },
+        {
+          "key": "visible",
+          "type": ["Boolean"],
+          "desc": "是否显示",
+          "label": ""
+        }
+      ],
+      "events": [
+        {
+          "key": "bind:cancel",
+          "desc": "点击取消按钮时触发",
+          "label": ""
+        },
+        {
+          "key": "bind:change",
+          "desc": "选中变化时候触发",
+          "label": ""
+        },
+        {
+          "key": "bind:pick",
+          "desc": "任何一列选中都会触发,不同的列参数不同。`context.column` 表示第几列变化,`context.index` 表示变化那一列的选中项下标",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-picker visible=\"{{true}}\" cancelBtn=\"取消\" confirmBtn=\"确认\"><t-picker-item options=\"{{[{ label: '上海', value: '上海' },{ label: '广州', value: '广州' },{ label: '深圳', value: '深圳' }]}}\" value=\"广州\"></t-picker-item></t-picker>",
+      "require": {
+        "t-picker-item": "./picker-item/picker-item"
+      },
+      "path": "./picker/picker"
+    },
+    "t-popup": {
+      "key": "t-popup",
+      "label": "气泡框",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-popup.png",
+      "properties": [
+        {
+          "key": "closeBtn",
+          "type": ["Boolean"],
+          "desc": "关闭按钮,值类型为 Boolean 时表示是否显示关闭按钮。也可以自定义关闭按钮",
+          "label": ""
+        },
+        {
+          "key": "closeOnOverlayClick",
+          "type": ["Boolean"],
+          "desc": "点击遮罩层是否关闭",
+          "label": ""
+        },
+        {
+          "key": "content",
+          "type": ["String"],
+          "desc": "浮层里面的内容",
+          "label": ""
+        },
+        {
+          "key": "placement",
+          "type": ["String"],
+          "desc": "浮层出现位置",
+          "label": ""
+        },
+        {
+          "key": "preventScrollThrough",
+          "type": ["Boolean"],
+          "desc": "防止滚动穿透",
+          "label": ""
+        },
+        {
+          "key": "showOverlay",
+          "type": ["Boolean"],
+          "desc": "是否显示遮罩层",
+          "label": ""
+        },
+        {
+          "key": "transitionProps",
+          "type": ["Object"],
+          "desc": "动画效果定义",
+          "label": ""
+        },
+        {
+          "key": "visible",
+          "type": ["Boolean"],
+          "desc": "是否显示浮层",
+          "label": ""
+        },
+        {
+          "key": "zIndex",
+          "type": ["Number"],
+          "desc": "组件层级,Web 侧样式默认为 5500,移动端和小程序样式默认为 1500",
+          "label": ""
+        }
+      ],
+      "externalClasses": ["t-class", "t-class-overlay", "t-class-content"],
+      "events": [
+        {
+          "key": "bind:visible-change",
+          "desc": "当浮层隐藏或显示时触发",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-popup visible=\"{{true}}\" placement=\"top\"><view style=\"width: 100vw; height: 35vh; background: #fff\" /></t-popup>",
+      "path": "./popup/popup"
+    },
+    "t-progress": {
+      "key": "t-progress",
+      "label": "进度条",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-progress.png",
+      "properties": [
+        {
+          "key": "color",
+          "type": ["String", "Object", "Array"],
+          "desc": "进度条颜色。示例:'#ED7B2F' 或 'orange' 或 `['#f00', '#0ff', '#f0f']` 或 `{ '0%': '#f00', '100%': '#0ff' }` 或  `{ from: '#000', to: '#000' }` 等",
+          "label": ""
+        },
+        {
+          "key": "label",
+          "type": ["String", "Boolean"],
+          "desc": "进度百分比,可自定义",
+          "label": ""
+        },
+        {
+          "key": "percentage",
+          "type": ["Number"],
+          "desc": "进度条百分比",
+          "label": ""
+        },
+        {
+          "key": "size",
+          "type": ["String", "Number"],
+          "desc": "进度条尺寸,示例:small/medium/large/240。small 值为 72; medium 值为 112;large 值为 160",
+          "label": ""
+        },
+        {
+          "key": "status",
+          "type": ["String"],
+          "desc": "进度条状态",
+          "label": ""
+        },
+        {
+          "key": "strokeWidth",
+          "type": ["String", "Number"],
+          "desc": "进度条线宽。宽度数值不能超过 size 的一半,否则不能输出环形进度",
+          "label": ""
+        },
+        {
+          "key": "theme",
+          "type": ["String"],
+          "desc": "进度条风格。值为 line,标签(label)显示在进度条右侧;值为 plump,标签(label)显示在进度条里面;值为 circle,标签(label)显示在进度条正中间",
+          "label": ""
+        },
+        {
+          "key": "trackColor",
+          "type": ["String"],
+          "desc": "进度条未完成部分颜色",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-progress></t-progress>",
+      "path": "./progress/progress"
+    },
+    "t-pull-down-refresh": {
+      "key": "t-pull-down-refresh",
+      "label": "下拉刷新",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-pulldownrefresh.png",
+      "properties": [
+        {
+          "key": "loadingBarHeight",
+          "type": ["String", "Number"],
+          "desc": "加载中下拉高度,如果值为数字则单位是:'px'",
+          "label": ""
+        },
+        {
+          "key": "loadingProps",
+          "type": ["Object"],
+          "desc": "加载loading样式",
+          "label": ""
+        },
+        {
+          "key": "loadingTexts",
+          "type": ["Array"],
+          "desc": "提示语,组件内部默认值为 ['下拉刷新', '松手刷新', '正在刷新', '刷新完成']",
+          "label": ""
+        },
+        {
+          "key": "maxBarHeight",
+          "type": ["String", "Number"],
+          "desc": "最大下拉高度,如果值为数字则单位是:'px'",
+          "label": ""
+        },
+        {
+          "key": "refreshTimeout",
+          "type": ["Number"],
+          "desc": "刷新超时时间",
+          "label": ""
+        },
+        {
+          "key": "value",
+          "type": ["Boolean"],
+          "desc": "组件状态,值为 `true` 表示下拉状态,值为 `false` 表示收起状态",
+          "label": ""
+        }
+      ],
+      "externalClasses": ["t-class", "t-class-loading", "t-class-text", "t-class-indicator"],
+      "events": [
+        {
+          "key": "bind:change",
+          "desc": "下拉或收起时触发,用户手势往下滑动触发下拉状态,手势松开触发收起状态",
+          "label": ""
+        },
+        {
+          "key": "bind:refresh",
+          "desc": "结束下拉时触发",
+          "label": ""
+        },
+        {
+          "key": "bind:timeout",
+          "desc": "刷新超时触发",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-pull-down-refresh id=\"pull-down-refresh\" loadingTexts=\"{{['继续拉哦', '该松手啦', '努力刷新中', '完成~']}}\"><view style=\"height: 300rpx; background: #fff; text-align: center\">拖拽该区域演示 中间下拉刷新</view></t-pull-down-refresh>",
+      "path": "./pull-down-refresh/pull-down-refresh"
+    },
+    "t-radio-group": {
+      "key": "t-radio-group",
+      "label": "单选框组",
+      "icon": "",
+      "properties": [
+        {
+          "key": "disabled",
+          "type": ["Boolean"],
+          "desc": "是否禁用全部子单选框",
+          "label": ""
+        },
+        {
+          "key": "name",
+          "type": ["String"],
+          "desc": "HTML 元素原生属性",
+          "label": ""
+        },
+        {
+          "key": "options",
+          "type": ["Array"],
+          "desc": "单选组件按钮形式。RadioOption 数据类型为 string 或 number 时,表示 label 和 value 值相同",
+          "label": ""
+        },
+        {
+          "key": "value",
+          "type": ["String", "Number", "Boolean"],
+          "desc": "选中的值",
+          "label": ""
+        }
+      ],
+      "events": [
+        {
+          "key": "bind:change",
+          "desc": "选中值发生变化时触发",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-radio-group defaultValue=\"radio1\"><t-radio value=\"radio1\" label=\"单选\" /><t-radio value=\"radio2\" label=\"单选\" /></t-radio-group>",
+      "require": {
+        "t-radio": "./radio/radio"
+      },
+      "path": "./radio-group/radio-group"
+    },
+    "t-radio": {
+      "key": "t-radio",
+      "label": "单选框",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-radio.png",
+      "properties": [
+        {
+          "key": "align",
+          "type": ["String"],
+          "desc": "复选框和内容相对位置",
+          "label": ""
+        },
+        {
+          "key": "allowUncheck",
+          "type": ["Boolean"],
+          "desc": "是否允许取消选中",
+          "label": ""
+        },
+        {
+          "key": "checked",
+          "type": ["Boolean"],
+          "desc": "是否选中",
+          "label": ""
+        },
+        {
+          "key": "color",
+          "type": ["String"],
+          "desc": "单选按钮颜色",
+          "label": ""
+        },
+        {
+          "key": "content",
+          "type": ["String"],
+          "desc": "单选内容",
+          "label": ""
+        },
+        {
+          "key": "contentDisabled",
+          "type": ["Boolean"],
+          "desc": "是否禁用组件内容(content)触发选中",
+          "label": ""
+        },
+        {
+          "key": "disabled",
+          "type": ["Boolean"],
+          "desc": "是否为禁用态",
+          "label": ""
+        },
+        {
+          "key": "icon",
+          "type": ["String", "Array"],
+          "desc": "自定义选中图标和非选中图标。示例:[选中态图标,非选中态图标]。值为 fill-circle 表示图标为填充型图标,值为 stroke-line 表示图标为描边型图标",
+          "label": ""
+        },
+        {
+          "key": "label",
+          "type": ["String"],
+          "desc": "主文案",
+          "label": ""
+        },
+        {
+          "key": "maxContentRow",
+          "type": ["Number"],
+          "desc": "内容最大行数限制",
+          "label": ""
+        },
+        {
+          "key": "maxLabelRow",
+          "type": ["Number"],
+          "desc": "主文案最大行数限制",
+          "label": ""
+        },
+        {
+          "key": "name",
+          "type": ["String"],
+          "desc": "HTML 元素原生属性",
+          "label": ""
+        },
+        {
+          "key": "value",
+          "type": ["String", "Number", "Boolean"],
+          "desc": "单选按钮的值",
+          "label": ""
+        }
+      ],
+      "externalClasses": ["t-class", "t-class-icon", "t-class-label", "t-class-content", "t-class-border"],
+      "events": [
+        {
+          "key": "bind:change",
+          "desc": "值变化时触发",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-radio value=\"radio\" label=\"单选\" />",
+      "path": "./radio/radio"
+    },
+    "t-rate": {
+      "key": "t-rate",
+      "label": "评分",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-rate.png",
+      "properties": [
+        {
+          "key": "allowHalf",
+          "type": ["Boolean"],
+          "desc": "是否允许半选",
+          "label": ""
+        },
+        {
+          "key": "color",
+          "type": ["String", "Array"],
+          "desc": "评分图标的颜色,样式中默认为 #ED7B2F。一个值表示设置选中高亮的五角星颜色,示例:[选中颜色]。数组则表示分别设置 选中高亮的五角星颜色 和 未选中暗灰的五角星颜色,[选中颜色,未选中颜色]。示例:['#ED7B2F', '#E3E6EB']",
+          "label": ""
+        },
+        {
+          "key": "count",
+          "type": ["Number"],
+          "desc": "评分的数量",
+          "label": ""
+        },
+        {
+          "key": "disabled",
+          "type": ["Boolean"],
+          "desc": "是否禁用评分",
+          "label": ""
+        },
+        {
+          "key": "gap",
+          "type": ["Number"],
+          "desc": "评分图标的间距",
+          "label": ""
+        },
+        {
+          "key": "showText",
+          "type": ["Boolean"],
+          "desc": "是否显示对应的辅助文字",
+          "label": ""
+        },
+        {
+          "key": "size",
+          "type": ["String"],
+          "desc": "评分图标的大小,示例:`20`",
+          "label": ""
+        },
+        {
+          "key": "texts",
+          "type": ["Array"],
+          "desc": "评分等级对应的辅助文字。组件内置默认值为:['极差', '失望', '一般', '满意', '惊喜']。自定义值示例:['1分', '2分', '3分', '4分', '5分']",
+          "label": ""
+        },
+        {
+          "key": "value",
+          "type": ["Number"],
+          "desc": "选择评分的值",
+          "label": ""
+        },
+        {
+          "key": "variant",
+          "type": ["String"],
+          "desc": "形状类型,有描边类型和填充类型两种",
+          "label": ""
+        }
+      ],
+      "events": [
+        {
+          "key": "bind:change",
+          "desc": "评分数改变时触发",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-rate defaultValue=\"{{4}}\" variant=\"filled\"></t-rate>",
+      "path": "./rate/rate"
+    },
+    "t-search": {
+      "key": "t-search",
+      "label": "搜索",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-search.png",
+      "properties": [
+        {
+          "key": "action",
+          "type": ["String"],
+          "desc": "自定义右侧操作按钮文字",
+          "label": ""
+        },
+        {
+          "key": "center",
+          "type": ["Boolean"],
+          "desc": "是否居中",
+          "label": ""
+        },
+        {
+          "key": "disabled",
+          "type": ["Boolean"],
+          "desc": "是否禁用",
+          "label": ""
+        },
+        {
+          "key": "focus",
+          "type": ["Boolean"],
+          "desc": "是否聚焦",
+          "label": ""
+        },
+        {
+          "key": "label",
+          "type": ["String"],
+          "desc": "左侧文本",
+          "label": ""
+        },
+        {
+          "key": "leftIcon",
+          "type": ["String"],
+          "desc": "左侧图标",
+          "label": ""
+        },
+        {
+          "key": "placeholder",
+          "type": ["String"],
+          "desc": "占位符",
+          "label": ""
+        },
+        {
+          "key": "rightIcon",
+          "type": ["String"],
+          "desc": "右侧图标",
+          "label": ""
+        },
+        {
+          "key": "shape",
+          "type": ["String"],
+          "desc": "搜索框形状",
+          "label": ""
+        },
+        {
+          "key": "value",
+          "type": ["String"],
+          "desc": "值",
+          "label": ""
+        }
+      ],
+      "externalClasses": [
+        "t-class",
+        "t-class-input",
+        "t-class-input-container",
+        "t-class-cancel",
+        "t-class-left",
+        "t-class-right"
+      ],
+      "events": [
+        {
+          "key": "bind:action-click",
+          "desc": "点击右侧操作按钮文字时触发",
+          "label": ""
+        },
+        {
+          "key": "bind:blur",
+          "desc": "失去焦点时触发",
+          "label": ""
+        },
+        {
+          "key": "bind:change",
+          "desc": "值发生变化时触发",
+          "label": ""
+        },
+        {
+          "key": "bind:clear",
+          "desc": "点击清除时触发",
+          "label": ""
+        },
+        {
+          "key": "bind:focus",
+          "desc": "聚焦时触发",
+          "label": ""
+        },
+        {
+          "key": "bind:submit",
+          "desc": "提交时触发",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-search></t-search>",
+      "path": "./search/search"
+    },
+    "t-skeleton": {
+      "key": "t-skeleton",
+      "label": "骨架屏",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-skeleton.png",
+      "properties": [
+        {
+          "key": "animation",
+          "type": ["String"],
+          "desc": "动画效果,有「渐变加载动画」和「闪烁加载动画」两种。值为 'none' 则表示没有动画",
+          "label": ""
+        },
+        {
+          "key": "delay",
+          "type": ["Number"],
+          "desc": "【开发中】延迟显示加载效果的时间,用于防止请求速度过快引起的加载闪烁,单位:毫秒",
+          "label": ""
+        },
+        {
+          "key": "loading",
+          "type": ["Boolean"],
+          "desc": "是否为加载状态,如果是则显示骨架图,如果不是则显示加载完成的内容",
+          "label": ""
+        },
+        {
+          "key": "rowCol",
+          "type": ["Array"],
+          "desc": "用于设置行列数量、宽度高度、间距等。【示例一】,`[1, 1, 2]` 表示输出三行骨架图,第一行一列,第二行一列,第三行两列。【示例二】,`[1, 1, { width: '100px' }]` 表示自定义第三行的宽度为 `100px`。【示例三】,`[1, 2, [{ width, height }, { width, height, marginLeft }]]` 表示第三行有两列,且自定义宽度、高度和间距",
+          "label": ""
+        },
+        {
+          "key": "theme",
+          "type": ["String"],
+          "desc": "骨架图风格,有基础、头像组合等两大类",
+          "label": ""
+        }
+      ],
+      "externalClasses": ["t-class", "t-class-avatar", "t-class-image", "t-class-text"],
+      "tpl": "<t-skeleton rowCol=\"{{ [{ width: '686rpx', height: '32rpx' }, 1, 1, { width: '380rpx', height: '32rpx' }]}}\" loading></t-skeleton>",
+      "path": "./skeleton/skeleton"
+    },
+    "t-slider": {
+      "key": "t-slider",
+      "label": "滑块",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-slider.png",
+      "properties": [
+        {
+          "key": "colors",
+          "type": ["Array"],
+          "desc": "颜色,[已选择, 未选择]",
+          "label": ""
+        },
+        {
+          "key": "disabled",
+          "type": ["Boolean"],
+          "desc": "是否禁用组件",
+          "label": ""
+        },
+        {
+          "key": "disabledColor",
+          "type": ["Array"],
+          "desc": "禁用状态滑动条的颜色,[已选, 未选]",
+          "label": ""
+        },
+        {
+          "key": "label",
+          "type": ["String", "Boolean"],
+          "desc": "滑块当前值文本。<br />值为 true 显示默认文案;值为 false 不显示滑块当前值文本;<br />值为 `${value}%` 则表示组件会根据占位符渲染文案;<br />值类型为函数时,参数 `value` 标识滑块值,参数 `position=start` 表示范围滑块的起始值,参数 `position=end` 表示范围滑块的终点值",
+          "label": ""
+        },
+        {
+          "key": "marks",
+          "type": ["Object", "Array"],
+          "desc": "刻度标记,示例:`[0, 10, 40, 200]` 或者 `{ 5:  '5¥', 10: '10%' }`",
+          "label": ""
+        },
+        {
+          "key": "max",
+          "type": ["Number"],
+          "desc": "滑块范围最大值",
+          "label": ""
+        },
+        {
+          "key": "min",
+          "type": ["Number"],
+          "desc": "滑块范围最小值",
+          "label": ""
+        },
+        {
+          "key": "range",
+          "type": ["Boolean"],
+          "desc": "双游标滑块",
+          "label": ""
+        },
+        {
+          "key": "showExtremeValue",
+          "type": ["Boolean"],
+          "desc": "是否边界值",
+          "label": ""
+        },
+        {
+          "key": "step",
+          "type": ["Number"],
+          "desc": "步长",
+          "label": ""
+        },
+        {
+          "key": "value",
+          "type": ["Number", "Array"],
+          "desc": "滑块值",
+          "label": ""
+        }
+      ],
+      "externalClasses": ["t-class", "t-class-bar", "t-class-bar-active", "t-class-bar-disabled", "t-class-cursor"],
+      "events": [
+        {
+          "key": "bind:change",
+          "desc": "滑块值变化时触发",
+          "label": ""
+        },
+        {
+          "key": "bind:dragend",
+          "desc": "结束拖动时触发",
+          "label": ""
+        },
+        {
+          "key": "bind:dragstart",
+          "desc": "开始拖动时触发",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-slider />",
+      "path": "./slider/slider"
+    },
+    "t-step-item": {
+      "key": "t-step-item",
+      "label": "步骤",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-steps.png",
+      "properties": [
+        {
+          "key": "content",
+          "type": ["String"],
+          "desc": "步骤描述",
+          "label": ""
+        },
+        {
+          "key": "icon",
+          "type": ["String"],
+          "desc": "图标。传入 slot 代表使用插槽,其他字符串代表使用内置图标",
+          "label": ""
+        },
+        {
+          "key": "status",
+          "type": ["String"],
+          "desc": "当前步骤的状态",
+          "label": ""
+        },
+        {
+          "key": "subStepItems",
+          "type": ["Array"],
+          "desc": "子步骤条,仅支持 layout  = 'vertical' 时",
+          "label": ""
+        },
+        {
+          "key": "title",
+          "type": ["String"],
+          "desc": "标题",
+          "label": ""
+        }
+      ],
+      "externalClasses": ["t-class", "t-class-content", "t-class-title", "t-class-description", "t-class-extra"],
+      "tpl": "<t-step-item title=\"步骤描述\"></t-step-item>",
+      "path": "./step-item/step-item"
+    },
+    "t-stepper": {
+      "key": "t-stepper",
+      "label": "步进器",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-stepper.png",
+      "properties": [
+        {
+          "key": "disabled",
+          "type": ["Boolean"],
+          "desc": "禁用全部操作",
+          "label": ""
+        },
+        {
+          "key": "disableInput",
+          "type": ["Boolean"],
+          "desc": "禁用输入框",
+          "label": ""
+        },
+        {
+          "key": "inputWidth",
+          "type": ["Number"],
+          "desc": "输入框宽度",
+          "label": ""
+        },
+        {
+          "key": "max",
+          "type": ["Number"],
+          "desc": "最大值",
+          "label": ""
+        },
+        {
+          "key": "min",
+          "type": ["Number"],
+          "desc": "最小值",
+          "label": ""
+        },
+        {
+          "key": "step",
+          "type": ["Number"],
+          "desc": "步长",
+          "label": ""
+        },
+        {
+          "key": "theme",
+          "type": ["String"],
+          "desc": "组件风格",
+          "label": ""
+        },
+        {
+          "key": "value",
+          "type": ["String", "Number"],
+          "desc": "值",
+          "label": ""
+        }
+      ],
+      "externalClasses": ["t-class", "t-class-input", "t-class-add", "t-class-minus"],
+      "events": [
+        {
+          "key": "bind:blur",
+          "desc": "输入框失去焦点时触发",
+          "label": ""
+        },
+        {
+          "key": "bind:change",
+          "desc": "数值发生变更时触发",
+          "label": ""
+        },
+        {
+          "key": "bind:overlimit",
+          "desc": "数值超出限制时触发",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-stepper />",
+      "path": "./stepper/stepper"
+    },
+    "t-steps": {
+      "key": "t-steps",
+      "label": "步骤条",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-steps.png",
+      "properties": [
+        {
+          "key": "current",
+          "type": ["String", "Number"],
+          "desc": "当前步骤,即整个步骤条进度。默认根据步骤下标判断步骤的完成状态,当前步骤为进行中,当前步骤之前的步骤为已完成,当前步骤之后的步骤为未开始。如果每个步骤没有设置 value,current 值为步骤长度则表示所有步骤已完成。如果每个步骤设置了自定义 value,则 current = 'FINISH' 表示所有状态完成",
+          "label": ""
+        },
+        {
+          "key": "currentStatus",
+          "type": ["String"],
+          "desc": "用于控制 current 指向的步骤条的状态",
+          "label": ""
+        },
+        {
+          "key": "layout",
+          "type": ["String"],
+          "desc": "步骤条方向,有两种:横向和纵向",
+          "label": ""
+        },
+        {
+          "key": "readonly",
+          "type": ["Boolean"],
+          "desc": "只读状态",
+          "label": ""
+        },
+        {
+          "key": "separator",
+          "type": ["String"],
+          "desc": "步骤条分割符",
+          "label": ""
+        },
+        {
+          "key": "theme",
+          "type": ["String"],
+          "desc": "步骤条风格",
+          "label": ""
+        }
+      ],
+      "externalClasses": ["t-class"],
+      "events": [
+        {
+          "key": "bind:change",
+          "desc": "当前步骤发生变化时触发",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-steps><t-step-item title=\"步骤描述1\" /><t-step-item title=\"步骤描述2\" /></t-steps>",
+      "require": {
+        "t-step-item": "./step-item/step-item"
+      },
+      "path": "./steps/steps"
+    },
+    "t-sticky": {
+      "key": "t-sticky",
+      "label": "吸顶容器",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-sticky.png",
+      "properties": [
+        {
+          "key": "container",
+          "type": ["String"],
+          "desc": "函数返回容器对应的 NodesRef 节点,将对应节点指定为组件的外部容器,滚动时组件会始终保持在容器范围内,当组件即将超出容器底部时,会返回原位置。",
+          "label": ""
+        },
+        {
+          "key": "disabled",
+          "type": ["Boolean"],
+          "desc": "是否禁用组件",
+          "label": ""
+        },
+        {
+          "key": "offsetTop",
+          "type": ["String", "Number"],
+          "desc": "吸顶时与顶部的距离,单位`px`",
+          "label": ""
+        },
+        {
+          "key": "zIndex",
+          "type": ["Number"],
+          "desc": "吸顶时的 z-index",
+          "label": ""
+        }
+      ],
+      "externalClasses": ["t-class"],
+      "events": [
+        {
+          "key": "bind:scroll",
+          "desc": "滚动时触发,scrollTop: 距离顶部位置,isFixed: 是否吸顶",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-sticky></t-sticky>",
+      "path": "./sticky/sticky"
+    },
+    "t-swipe-cell": {
+      "key": "t-swipe-cell",
+      "label": "滑动操作",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-swipecell.png",
+      "properties": [
+        {
+          "key": "disabled",
+          "type": ["Boolean"],
+          "desc": "是否禁用滑动",
+          "label": ""
+        },
+        {
+          "key": "expanded",
+          "type": ["String"],
+          "desc": "操作项是否呈现为打开态",
+          "label": ""
+        },
+        {
+          "key": "left",
+          "type": ["Array"],
+          "desc": "左侧滑动操作项。所有行为同 `right`",
+          "label": ""
+        },
+        {
+          "key": "right",
+          "type": ["Array"],
+          "desc": "右侧滑动操作项。有两种定义方式,一种是使用数组,二种是使用插槽。`right.text` 表示操作文本,`right.className` 表示操作项类名,`right.style` 表示操作项样式,`right.onClick` 表示点击操作项后执行的回调函数。示例:`[{ text: '删除', style: 'background-color: red', onClick: () => {} }]`",
+          "label": ""
+        }
+      ],
+      "events": [
+        {
+          "key": "bind:click",
+          "desc": "操作项点击时触发(插槽写法组件不触发,业务侧自定义内容和事件)",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-swipe-cell><t-cell title=\"列表-左滑单操作\" note=\"辅助信息\" /><view slot=\"right\">删除</view></t-swipe-cell>",
+      "require": {
+        "t-cell": "./cell/cell"
+      },
+      "path": "./swipe-cell/swipe-cell"
+    },
+    "t-swiper": {
+      "key": "t-swiper",
+      "label": "轮播",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-swiper.png",
+      "properties": [
+        {
+          "key": "animation",
+          "type": ["String"],
+          "desc": "轮播切换动画效果类型",
+          "label": ""
+        },
+        {
+          "key": "autoplay",
+          "type": ["Boolean"],
+          "desc": "是否自动播放",
+          "label": ""
+        },
+        {
+          "key": "current",
+          "type": ["Number"],
+          "desc": "当前轮播在哪一项(下标)",
+          "label": ""
+        },
+        {
+          "key": "direction",
+          "type": ["String"],
+          "desc": "轮播滑动方向,包括横向滑动和纵向滑动两个方向",
+          "label": ""
+        },
+        {
+          "key": "duration",
+          "type": ["Number"],
+          "desc": "滑动动画时长",
+          "label": ""
+        },
+        {
+          "key": "height",
+          "type": ["Number"],
+          "desc": "当使用垂直方向滚动时的高度",
+          "label": ""
+        },
+        {
+          "key": "interval",
+          "type": ["Number"],
+          "desc": "轮播间隔时间",
+          "label": ""
+        },
+        {
+          "key": "loop",
+          "type": ["Boolean"],
+          "desc": "是否循环播放",
+          "label": ""
+        },
+        {
+          "key": "navigation",
+          "type": ["Object"],
+          "desc": "导航器全部配置",
+          "label": ""
+        }
+      ],
+      "events": [
+        {
+          "key": "bind:change",
+          "desc": "轮播切换时触发",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-swiper current=\"{{1}}\" autoplay=\"{{true}}\" duration=\"{{500}}\" interval=\"{{5000}}\" navigation><t-swiper-item wx:for=\"{{[{image: 'https://tdesign.gtimg.com/site/swiper/01.png'},{image: 'https://tdesign.gtimg.com/site/swiper/02.png'}]}}\" wx:key=\"index\"><image src=\"{{item.image}}\" style=\"width: 100%; height: 100%\" /></t-swiper-item></t-swiper>",
+      "require": {
+        "t-swiper-item": "./swiper/swiper-item"
+      },
+      "path": "./swiper/swiper"
+    },
+    "t-switch": {
+      "key": "t-switch",
+      "label": "开关",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-switch.png",
+      "properties": [
+        {
+          "key": "colors",
+          "type": ["Array"],
+          "desc": "自定义颜色,[打开时的颜色,关闭时的颜色]。组件默认颜色为 ['#0052d9', 'rgba(0, 0, 0, .26']。示例:[blue, gray]",
+          "label": ""
+        },
+        {
+          "key": "customValue",
+          "type": ["Array"],
+          "desc": "开关内容,[打开时的值,关闭时的值]。默认为 [true, false]。示例:[1, 0]",
+          "label": ""
+        },
+        {
+          "key": "disabled",
+          "type": ["Boolean"],
+          "desc": "是否禁用组件",
+          "label": ""
+        },
+        {
+          "key": "label",
+          "type": ["String"],
+          "desc": "开关的标签",
+          "label": ""
+        },
+        {
+          "key": "loading",
+          "type": ["Boolean"],
+          "desc": "是否处于加载中状态",
+          "label": ""
+        },
+        {
+          "key": "size",
+          "type": ["String"],
+          "desc": "开关尺寸",
+          "label": ""
+        },
+        {
+          "key": "value",
+          "type": ["String", "Number", "Boolean"],
+          "desc": "开关值",
+          "label": ""
+        }
+      ],
+      "events": [
+        {
+          "key": "bind:change",
+          "desc": "数据发生变化时触发",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-switch defaultValue=\"{{true}}\" />",
+      "path": "./switch/switch"
+    },
+    "t-tab-bar-item": {
+      "key": "t-tab-bar-item",
+      "label": "标签栏选项",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-tabbar.png",
+      "properties": [
+        {
+          "key": "badgeProps",
+          "type": ["Object"],
+          "desc": "图标右上角提示信息",
+          "label": ""
+        },
+        {
+          "key": "icon",
+          "type": ["String"],
+          "desc": "图标名称",
+          "label": ""
+        },
+        {
+          "key": "subTabBar",
+          "type": ["Array"],
+          "desc": "二级菜单",
+          "label": ""
+        },
+        {
+          "key": "value",
+          "type": ["String", "Number"],
+          "desc": "标识符",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-tab-bar-item wx:for=\"{{[{value: 'label_1',label: '标签栏一',icon: 'app'},{value: 'label_2',label: '标签栏二',icon: 'app'}]}}\" wx:for-item=\"item\" wx:for-index=\"index\" wx:key=\"index\" value=\"{{item.value}}\">{{item.label}}</t-tab-bar-item>",
+      "path": "./tab-bar-item/tab-bar-item"
+    },
+    "t-tab-bar": {
+      "key": "t-tab-bar",
+      "label": "标签栏",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-tabbar.png",
+      "properties": [
+        {
+          "key": "bordered",
+          "type": ["Boolean"],
+          "desc": "是否显示外边框",
+          "label": ""
+        },
+        {
+          "key": "color",
+          "type": ["Array"],
+          "desc": "标签颜色设置。示例:[选中标签的颜色, 未选中的标签颜色]",
+          "label": ""
+        },
+        {
+          "key": "fixed",
+          "type": ["Boolean"],
+          "desc": "是否固定在底部",
+          "label": ""
+        },
+        {
+          "key": "safeAreaInsetBottom",
+          "type": ["Boolean"],
+          "desc": "是否为 iPhoneX 留出底部安全距离",
+          "label": ""
+        },
+        {
+          "key": "split",
+          "type": ["Boolean"],
+          "desc": "是否需要分割线",
+          "label": ""
+        },
+        {
+          "key": "value",
+          "type": ["String", "Number", "Array"],
+          "desc": "当前选中标签的索引",
+          "label": ""
+        }
+      ],
+      "externalClasses": ["t-class"],
+      "events": [
+        {
+          "key": "bind:change",
+          "desc": "选中标签切换时触发",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-tab-bar value=\"label_1\"><t-tab-bar-item wx:for=\"{{[{value: 'label_1',label: '标签栏一',icon: 'app'},{value: 'label_2',label: '标签栏二',icon: 'app'}]}}\" wx:for-item=\"item\" wx:for-index=\"index\" wx:key=\"index\" value=\"{{item.value}}\">{{item.label}}</t-tab-bar-item></t-tab-bar>",
+      "require": {
+        "t-tab-bar-item": "./tab-bar-item/tab-bar-item"
+      },
+      "path": "./tab-bar/tab-bar"
+    },
+    "t-tab-panel": {
+      "key": "t-tab-panel",
+      "label": "选项卡面板",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-tabs.png",
+      "properties": [
+        {
+          "key": "destroyOnHide",
+          "type": ["Boolean"],
+          "desc": "选项卡内容隐藏时是否销毁",
+          "label": ""
+        },
+        {
+          "key": "disabled",
+          "type": ["Boolean"],
+          "desc": "是否禁用当前选项卡",
+          "label": ""
+        },
+        {
+          "key": "label",
+          "type": ["String"],
+          "desc": "选项卡名称",
+          "label": ""
+        },
+        {
+          "key": "panel",
+          "type": ["String"],
+          "desc": "用于自定义选项卡面板内容",
+          "label": ""
+        },
+        {
+          "key": "value",
+          "type": ["String", "Number"],
+          "desc": "选项卡的值,唯一标识",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-tab-panel label=\"标签页一\" value=\"0\">标签一内容</t-tab-panel>",
+      "path": "./tab-panel/tab-panel"
+    },
+    "t-tabs": {
+      "key": "t-tabs",
+      "label": "选项卡",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-tabs.png",
+      "properties": [
+        {
+          "key": "animation",
+          "type": ["Object"],
+          "desc": "动画效果设置。其中 duration 表示动画时长",
+          "label": ""
+        },
+        {
+          "key": "placement",
+          "type": ["String"],
+          "desc": "选项卡位置",
+          "label": ""
+        },
+        {
+          "key": "showBottomLine",
+          "type": ["Boolean"],
+          "desc": "是否展示底部激活线条",
+          "label": ""
+        },
+        {
+          "key": "stickyProps",
+          "type": ["Object"],
+          "desc": "是否支持吸顶",
+          "label": ""
+        },
+        {
+          "key": "value",
+          "type": ["String", "Number"],
+          "desc": "激活的选项卡值",
+          "label": ""
+        }
+      ],
+      "externalClasses": ["t-class", "t-class-item", "t-class-active", "t-class-track"],
+      "events": [
+        {
+          "key": "bind:change",
+          "desc": "激活的选项卡发生变化时触发",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-tabs defaultValue=\"{{0}}\"><t-tab-panel label=\"标签页一\" value=\"0\">标签一内容</t-tab-panel><t-tab-panel label=\"标签页二\" value=\"1\">标签二内容</t-tab-panel></t-tabs>",
+      "require": {
+        "t-tab-panel": "./tab-panel/tab-panel"
+      },
+      "path": "./tabs/tabs"
+    },
+    "t-tag": {
+      "key": "t-tag",
+      "label": "标签",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-tag.png",
+      "properties": [
+        {
+          "key": "closable",
+          "type": ["Boolean"],
+          "desc": "标签是否可关闭",
+          "label": ""
+        },
+        {
+          "key": "disabled",
+          "type": ["Boolean"],
+          "desc": "标签禁用态,失效标签不能触发事件。默认风格(theme=default)才有禁用态",
+          "label": ""
+        },
+        {
+          "key": "icon",
+          "type": ["String"],
+          "desc": "标签中的图标,可自定义图标呈现",
+          "label": ""
+        },
+        {
+          "key": "maxWidth",
+          "type": ["String", "Number"],
+          "desc": "标签最大宽度,宽度超出后会出现省略号。示例:'50px' / 80",
+          "label": ""
+        },
+        {
+          "key": "shape",
+          "type": ["String"],
+          "desc": "标签类型,有三种:方形、圆角方形、标记型",
+          "label": ""
+        },
+        {
+          "key": "size",
+          "type": ["String"],
+          "desc": "标签尺寸",
+          "label": ""
+        },
+        {
+          "key": "theme",
+          "type": ["String"],
+          "desc": "组件风格,用于描述组件不同的应用场景",
+          "label": ""
+        },
+        {
+          "key": "variant",
+          "type": ["String"],
+          "desc": "标签风格变体",
+          "label": ""
+        }
+      ],
+      "externalClasses": ["t-class"],
+      "events": [
+        {
+          "key": "bind:click",
+          "desc": "点击时触发",
+          "label": ""
+        },
+        {
+          "key": "bind:close",
+          "desc": "如果关闭按钮存在,点击关闭按钮时触发",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-tag theme=\"primary\">重要</t-tag>",
+      "path": "./tag/tag"
+    },
+    "t-textarea": {
+      "key": "t-textarea",
+      "label": "文本输入框",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-textarea.png",
+      "properties": [
+        {
+          "key": "adjustPosition",
+          "type": ["Boolean"],
+          "desc": "键盘弹起时,是否自动上推页面",
+          "label": ""
+        },
+        {
+          "key": "autofocus",
+          "type": ["Boolean"],
+          "desc": "自动聚焦,拉起键盘",
+          "label": ""
+        },
+        {
+          "key": "autosize",
+          "type": ["Boolean"],
+          "desc": "是否自动增高,值为 autosize 时,style.height 不生效",
+          "label": ""
+        },
+        {
+          "key": "confirmHold",
+          "type": ["Boolean"],
+          "desc": "点击键盘右下角按钮时是否保持键盘不收起点",
+          "label": ""
+        },
+        {
+          "key": "confirmType",
+          "type": ["String"],
+          "desc": "设置键盘右下角按钮的文字,仅在 type='text'时生效",
+          "label": ""
+        },
+        {
+          "key": "disabled",
+          "type": ["Boolean"],
+          "desc": "是否禁用文本框",
+          "label": ""
+        },
+        {
+          "key": "focus",
+          "type": ["Boolean"],
+          "desc": "自动聚焦",
+          "label": ""
+        },
+        {
+          "key": "label",
+          "type": ["String"],
+          "desc": "左侧文本",
+          "label": ""
+        },
+        {
+          "key": "maxcharacter",
+          "type": ["Number"],
+          "desc": "用户最多可以输入的字符个数,一个中文汉字表示两个字符长度",
+          "label": ""
+        },
+        {
+          "key": "maxlength",
+          "type": ["Number"],
+          "desc": "用户最多可以输入的字符个数",
+          "label": ""
+        },
+        {
+          "key": "placeholder",
+          "type": ["String"],
+          "desc": "占位符",
+          "label": ""
+        },
+        {
+          "key": "value",
+          "type": ["String"],
+          "desc": "文本框值",
+          "label": ""
+        }
+      ],
+      "externalClasses": ["t-class", "t-class-textarea", "t-class-placeholder", "t-class-name"],
+      "events": [
+        {
+          "key": "bind:blur",
+          "desc": "失去焦点时触发",
+          "label": ""
+        },
+        {
+          "key": "bind:change",
+          "desc": "输入内容变化时触发",
+          "label": ""
+        },
+        {
+          "key": "bind:enter",
+          "desc": "点击完成时触发",
+          "label": ""
+        },
+        {
+          "key": "bind:focus",
+          "desc": "获得焦点时触发",
+          "label": ""
+        },
+        {
+          "key": "bind:line-change",
+          "desc": "行高发生变化时触发",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-textarea />",
+      "path": "./textarea/textarea"
+    },
+    "t-toast": {
+      "key": "t-toast",
+      "label": "轻提示",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-toast.png",
+      "properties": [
+        {
+          "key": "direction",
+          "type": ["String"],
+          "desc": "图标排列方式",
+          "label": ""
+        },
+        {
+          "key": "duration",
+          "type": ["Number"],
+          "desc": "弹窗显示毫秒数",
+          "label": ""
+        },
+        {
+          "key": "icon",
+          "type": ["String"],
+          "desc": "自定义图标",
+          "label": ""
+        },
+        {
+          "key": "message",
+          "type": ["String"],
+          "desc": "弹窗显示文字",
+          "label": ""
+        },
+        {
+          "key": "overlayProps",
+          "type": ["Object"],
+          "desc": "遮罩层属性,透传至 Overlay",
+          "label": ""
+        },
+        {
+          "key": "placement",
+          "type": ["String"],
+          "desc": "弹窗展示位置",
+          "label": ""
+        },
+        {
+          "key": "preventScrollThrough",
+          "type": ["Boolean"],
+          "desc": "防止滚动穿透,即不允许点击和滚动",
+          "label": ""
+        },
+        {
+          "key": "showOverlay",
+          "type": ["Boolean"],
+          "desc": "是否显示遮罩层",
+          "label": ""
+        },
+        {
+          "key": "theme",
+          "type": ["String"],
+          "desc": "提示类型",
+          "label": ""
+        }
+      ],
+      "externalClasses": ["t-class"],
+      "tpl": "<t-toast id=\"t-toast\" />",
+      "path": "./toast/toast"
+    },
+    "t-transition": {
+      "key": "t-transition",
+      "label": "动画",
+      "icon": "",
+      "properties": [
+        {
+          "key": "appear",
+          "type": ["Boolean"],
+          "desc": "首次出现是否展示动画",
+          "label": ""
+        },
+        {
+          "key": "customClass",
+          "type": ["String"],
+          "desc": "自定义容器类名",
+          "label": ""
+        },
+        {
+          "key": "destoryOnClose",
+          "type": ["Boolean"],
+          "desc": "隐藏时是否销毁内容",
+          "label": ""
+        },
+        {
+          "key": "duration",
+          "type": ["Number"],
+          "desc": "指定过渡时间",
+          "label": ""
+        },
+        {
+          "key": "name",
+          "type": ["String"],
+          "desc": "过渡类名",
+          "label": ""
+        },
+        {
+          "key": "visible",
+          "type": ["Boolean"],
+          "desc": "是否显示",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-transition visible appear></t-transition>",
+      "path": "./transition/transition"
+    },
+    "t-upload": {
+      "key": "t-upload",
+      "label": "上传",
+      "icon": "https://tdesign.gtimg.com/site/miniprogram-doc/doc-upload.png",
+      "properties": [
+        {
+          "key": "addContent",
+          "type": ["String"],
+          "desc": "添加按钮内容。值为空,使用默认图标渲染;值为 slot 则表示使用插槽渲染;其他值无效。",
+          "label": ""
+        },
+        {
+          "key": "allowUploadDuplicateFile",
+          "type": ["Boolean"],
+          "desc": "是否允许重复上传相同文件名的文件",
+          "label": ""
+        },
+        {
+          "key": "config",
+          "type": ["Object"],
+          "desc": "图片上传配置,视频上传配置,文件上传配置等,包含图片尺寸、图片来源、视频来源、视频拍摄最长时间等。更多细节查看小程序官网。[图片上传](https://developers.weixin.qq.com/miniprogram/dev/api/media/image/wx.chooseImage.html)。[视频上传](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/wx.chooseVideo.html)",
+          "label": ""
+        },
+        {
+          "key": "deleteBtn",
+          "type": ["String"],
+          "desc": "删除图标。值为空,使用默认图标渲染;值为 slot 则表示使用插槽渲染;其他值无效。",
+          "label": ""
+        },
+        {
+          "key": "fileListDisplay",
+          "type": ["String"],
+          "desc": "用于完全自定义文件列表内容",
+          "label": ""
+        },
+        {
+          "key": "files",
+          "type": ["Array"],
+          "desc": "已上传文件列表",
+          "label": ""
+        },
+        {
+          "key": "gridConfig",
+          "type": ["Object"],
+          "desc": "upload组件每行上传图片列数以及图片的宽度和高度",
+          "label": ""
+        },
+        {
+          "key": "gutter",
+          "type": ["Number"],
+          "desc": "预览窗格的 `gutter` 大小,单位 rpx",
+          "label": ""
+        },
+        {
+          "key": "imageProps",
+          "type": ["Object"],
+          "desc": "透传 Image 组件全部属性",
+          "label": ""
+        },
+        {
+          "key": "max",
+          "type": ["Number"],
+          "desc": "用于控制文件上传数量,值为 0 则不限制",
+          "label": ""
+        },
+        {
+          "key": "mediaType",
+          "type": ["Array"],
+          "desc": "支持上传的文件类型,图片或视频",
+          "label": ""
+        },
+        {
+          "key": "requestMethod",
+          "type": ["String"],
+          "desc": "自定义上传方法",
+          "label": ""
+        },
+        {
+          "key": "sizeLimit",
+          "type": ["Number", "Object"],
+          "desc": "图片文件大小限制,单位 KB。可选单位有:`'B' | 'KB' | 'MB' | 'GB'`。示例一:`1000`。示例二:`{ size: 2, unit: 'MB', message: '图片大小不超过 {sizeLimit} MB' }`",
+          "label": ""
+        }
+      ],
+      "events": [
+        {
+          "key": "bind:add",
+          "desc": "上传成功后触发,仅包含本次选择的照片;`url` 表示选定视频的临时文件路径 (本地路径)。`duration` 表示选定视频的时间长度。`size`选定视频的数据量大小。更多描述参考 wx.chooseMedia 小程序官网描述",
+          "label": ""
+        },
+        {
+          "key": "bind:complete",
+          "desc": "上传成功或失败后触发",
+          "label": ""
+        },
+        {
+          "key": "bind:fail",
+          "desc": "上传失败后触发",
+          "label": ""
+        },
+        {
+          "key": "bind:remove",
+          "desc": "移除文件时触发",
+          "label": ""
+        },
+        {
+          "key": "bind:select-change",
+          "desc": "选择文件或图片之后,上传之前,触发该事件。<br />`files` 表示之前已经上传完成的文件列表。<br />`currentSelectedFiles` 表示本次上传选中的文件列表",
+          "label": ""
+        },
+        {
+          "key": "bind:success",
+          "desc": "上传成功后触发,包含所有上传的文件;`url` 表示选定视频的临时文件路径 (本地路径)。`duration` 表示选定视频的时间长度。`size`选定视频的数据量大小。更多描述参考 wx.chooseMedia 小程序官网描述",
+          "label": ""
+        }
+      ],
+      "tpl": "<t-upload />",
+      "path": "./upload/upload"
+    }
+  },
+  "common": {
+    "properties": {},
+    "events": {}
+  },
+  "menu": [
+    {
+      "key": "menu-basic",
+      "label": "基础",
+      "submenu": [
+        {
+          "key": "subMenu-button",
+          "label": "Button 按钮",
+          "components": ["t-button"]
+        },
+        {
+          "key": "subMenu-divider",
+          "label": "Divider 分割线",
+          "components": ["t-divider"]
+        },
+        {
+          "key": "subMenu-fab",
+          "label": "Fab 悬浮按钮",
+          "components": ["t-fab"]
+        },
+        {
+          "key": "subMenu-icon",
+          "label": "Icon 图标",
+          "components": ["t-icon"]
+        }
+      ]
+    },
+    {
+      "key": "menu-nav",
+      "label": "导航",
+      "submenu": [
+        {
+          "key": "subMenu-drawer",
+          "label": "Drawer 抽屉",
+          "components": ["t-drawer"]
+        },
+        {
+          "key": "subMenu-indexes",
+          "label": "Indexes 索引",
+          "components": ["t-indexes"]
+        },
+        {
+          "key": "subMenu-navbar",
+          "label": "Navbar 导航条",
+          "components": ["t-navbar"]
+        },
+        {
+          "key": "subMenu-steps",
+          "label": "Steps 步骤条",
+          "components": ["t-steps"]
+        },
+        {
+          "key": "subMenu-tabbar",
+          "label": "TabBar 标签栏",
+          "components": ["t-tab-bar"]
+        },
+        {
+          "key": "subMenu-tabs",
+          "label": "Tabs 选项卡",
+          "components": ["t-tabs"]
+        }
+      ]
+    },
+    {
+      "key": "menu-input",
+      "label": "输入",
+      "submenu": [
+        {
+          "key": "subMenu-checkbox",
+          "label": "CheckBox 复选框",
+          "components": ["t-checkbox"]
+        },
+        {
+          "key": "subMenu-dateTimePicker",
+          "label": "DateTimePicker 时间选择器",
+          "components": ["t-date-time-picker"]
+        },
+        {
+          "key": "subMenu-input",
+          "label": "Input 输入框",
+          "components": ["t-input"]
+        },
+        {
+          "key": "subMenu-picker",
+          "label": "Picker 选择器",
+          "components": ["t-picker"]
+        },
+        {
+          "key": "subMenu-radio",
+          "label": "Radio 单选框",
+          "components": ["t-radio"]
+        },
+        {
+          "key": "subMenu-rate",
+          "label": "Rate 评分",
+          "components": ["t-rate"]
+        },
+        {
+          "key": "subMenu-search",
+          "label": "Search 搜索框",
+          "components": ["t-search"]
+        },
+        {
+          "key": "subMenu-slider",
+          "label": "Slider 滑动选择器",
+          "components": ["t-slider"]
+        },
+        {
+          "key": "subMenu-stepper",
+          "label": "Stepper 步进器",
+          "components": ["t-stepper"]
+        },
+        {
+          "key": "subMenu-switch",
+          "label": "Switch 开关",
+          "components": ["t-switch"]
+        },
+        {
+          "key": "subMenu-textarea",
+          "label": "Textarea 多行文本框",
+          "components": ["t-textarea"]
+        },
+        {
+          "key": "subMenu-upload",
+          "label": "UpLoad 上传",
+          "components": ["t-upload"]
+        }
+      ]
+    },
+    {
+      "key": "menu-data",
+      "label": "数据展示",
+      "submenu": [
+        {
+          "key": "subMenu-avatar",
+          "label": "Avatar 头像",
+          "components": ["t-avatar"]
+        },
+        {
+          "key": "subMenu-badge",
+          "label": "Badge 徽标",
+          "components": ["t-badge"]
+        },
+        {
+          "key": "subMenu-cell",
+          "label": "Cell 单元格",
+          "components": ["t-cell"]
+        },
+        {
+          "key": "subMenu-collapse",
+          "label": "Collapse 折叠面板",
+          "components": ["t-collapse"]
+        },
+        {
+          "key": "subMenu-dropdown-menu",
+          "label": "DropdownMenu 下拉菜单",
+          "components": ["t-dropdown-menu"]
+        },
+        {
+          "key": "subMenu-empty",
+          "label": "Empty 空状态",
+          "components": ["t-empty"]
+        },
+        {
+          "key": "subMenu-footer",
+          "label": "Footer 页脚",
+          "components": ["t-footer"]
+        },
+        {
+          "key": "subMenu-grid",
+          "label": "Grid 宫格",
+          "components": ["t-grid"]
+        },
+        {
+          "key": "subMenu-image",
+          "label": "Image 图片",
+          "components": ["t-image"]
+        },
+        {
+          "key": "subMenu-skeleton",
+          "label": "Skeleton 骨架屏",
+          "components": ["t-skeleton"]
+        },
+        {
+          "key": "subMenu-sticky",
+          "label": "Sticky 吸顶容器",
+          "components": ["t-sticky"]
+        },
+        {
+          "key": "subMenu-swiper",
+          "label": "Swiper 轮播图",
+          "components": ["t-swiper"]
+        },
+        {
+          "key": "subMenu-tag",
+          "label": "Tag 标签",
+          "components": ["t-tag"]
+        }
+      ]
+    },
+    {
+      "key": "menu-info",
+      "label": "消息提醒",
+      "submenu": [
+        {
+          "key": "subMenu-actionsheet",
+          "label": "ActionSheet 动作面板",
+          "components": ["t-action-sheet"]
+        },
+        {
+          "key": "subMenu-back-top",
+          "label": "BackTop 返回顶部",
+          "components": ["t-back-top"]
+        },
+        {
+          "key": "subMenu-dialog",
+          "label": "Dialog 弹出框",
+          "components": ["t-dialog"]
+        },
+        {
+          "key": "subMenu-loading",
+          "label": "Loading 加载",
+          "components": ["t-loading"]
+        },
+        {
+          "key": "subMenu-message",
+          "label": "Message 消息通知",
+          "components": ["t-message"]
+        },
+        {
+          "key": "subMenu-popup",
+          "label": "Popup 弹出层",
+          "components": ["t-popup"]
+        },
+        {
+          "key": "subMenu-progress",
+          "label": "Progress 进度条",
+          "components": ["t-progress"]
+        },
+        {
+          "key": "subMenu-pullDownRefresh",
+          "label": "PullDownRefresh 下拉刷新",
+          "components": ["t-pull-down-refresh"]
+        },
+        {
+          "key": "subMenu-swipeCell",
+          "label": "SwipeCell 滑动操作",
+          "components": ["t-swipe-cell"]
+        },
+        {
+          "key": "subMenu-toast",
+          "label": "Toast 轻提示",
+          "components": ["t-toast"]
+        }
+      ]
+    }
+  ]
+}

+ 24 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/README.en-US.md

@@ -0,0 +1,24 @@
+:: BASE_DOC ::
+
+## API
+### ActionSheet Props
+
+name | type | default | description | required
+-- | -- | -- | -- | --
+align | String | center | `0.29.0`。options:center/left | N
+cancel-text | String | - | \- | N
+count | Number | 8 | \- | N
+description | String | - | `0.29.0` | N
+items | Array | - | required。Typescript:`Array<string \| ActionSheetItem>` `interface ActionSheetItem {label: string; color?: string; disabled?: boolean }`。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/action-sheet/type.ts) | Y
+show-cancel | Boolean | true | \- | N
+theme | String | list | options:list/grid | N
+visible | Boolean | false | required | Y
+default-visible | Boolean | undefined | required。uncontrolled property | Y
+
+### ActionSheet Events
+
+name | params | description
+-- | -- | --
+cancel | \- | \-
+close | `(trigger: TriggerSource)` | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/action-sheet/type.ts)。<br/>`type TriggerSource = 'overlay' \| 'command' \| 'select' `<br/>
+selected | `(selected: ActionSheetItem \| string, index: number)` | \-

+ 107 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/README.md

@@ -0,0 +1,107 @@
+---
+title: ActionSheet 动作面板
+description: 由用户操作后触发的一种特定的模态弹出框 ,呈现一组与当前情境相关的两个或多个选项。
+spline: data
+isComponent: true
+---
+
+<span class="coverages-badge" style="margin-right: 10px"><img src="https://img.shields.io/badge/coverages%3A%20lines-100%25-blue" /></span><span class="coverages-badge" style="margin-right: 10px"><img src="https://img.shields.io/badge/coverages%3A%20functions-100%25-blue" /></span><span class="coverages-badge" style="margin-right: 10px"><img src="https://img.shields.io/badge/coverages%3A%20statements-100%25-blue" /></span><span class="coverages-badge" style="margin-right: 10px"><img src="https://img.shields.io/badge/coverages%3A%20branches-89%25-blue" /></span>
+
+<div style="background: #ecf2fe; display: flex; align-items: center; line-height: 20px; padding: 14px 24px; border-radius: 3px; color: #555a65">
+  <svg fill="none" viewBox="0 0 16 16" width="16px" height="16px" style="margin-right: 5px">
+    <path fill="#0052d9" d="M8 15A7 7 0 108 1a7 7 0 000 14zM7.4 4h1.2v1.2H7.4V4zm.1 2.5h1V12h-1V6.5z" fillOpacity="0.9"></path>
+  </svg>
+  该组件于 0.9.0 版本上线,请留意版本。
+</div>
+
+## 引入
+
+全局引入,在 miniprogram 根目录下的`app.json`中配置,局部引入,在需要引入的页面或组件的`index.json`中配置。
+
+```json
+"usingComponents": {
+  "t-action-sheet": "tdesign-miniprogram/action-sheet/action-sheet",
+}
+```
+
+## 代码演示
+
+### 组件类型
+
+列表型动作面板
+
+{{ list }}
+
+宫格型动作面板
+
+{{ grid }}
+
+### 组件状态
+
+宫格型动作面板
+
+{{ status }}
+
+### 组件样式
+
+列表型对齐方式
+
+{{ align }}
+
+### 支持指令调用
+
+```javascript
+import ActionSheet, { ActionSheetTheme } from 'tdesign-miniprogram/action-sheet/index';
+
+// 指令调用不同于组件引用不需要传入visible
+const basicListOption: ActionSheetShowOption = {
+  theme: ActionSheetTheme.List,
+  selector: '#t-action-sheet',
+  items: [
+    {
+      label: '默认选项',
+    },
+    {
+      label: '失效选项',
+      disabled: true,
+    },
+    {
+      label: '警告选项',
+      color: '#e34d59',
+    },
+  ],
+};
+
+const handler = ActionSheet.show(basicListOption);
+```
+
+指令调用的关闭如下
+
+```javascript
+handler.close();
+```
+
+
+## API
+### ActionSheet Props
+
+名称 | 类型 | 默认值 | 说明 | 必传
+-- | -- | -- | -- | --
+align | String | center | `0.29.0`。水平对齐方式。可选项:center/left | N
+cancel-text | String | - | 设置取消按钮的文本 | N
+count | Number | 8 | 设置每页展示菜单的数量,仅当 type=grid 时有效 | N
+description | String | - | `0.29.0`。动作面板描述文字 | N
+items | Array | - | 必需。菜单项。TS 类型:`Array<string \| ActionSheetItem>` `interface ActionSheetItem {label: string; color?: string; disabled?: boolean }`。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/action-sheet/type.ts) | Y
+show-cancel | Boolean | true | 是否显示取消按钮 | N
+theme | String | list | 展示类型,列表和表格形式展示。可选项:list/grid | N
+visible | Boolean | false | 必需。显示与隐藏 | Y
+default-visible | Boolean | undefined | 必需。显示与隐藏。非受控属性 | Y
+external-classes | Array | - | 组件类名,用于设置组件外层元素类名。`['t-class', 't-class-content', 't-class-cancel']` | N
+
+### ActionSheet Events
+
+名称 | 参数 | 描述
+-- | -- | --
+cancel | \- | 点击取消按钮时触发
+close | `(trigger: TriggerSource)` | 关闭时触发。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/action-sheet/type.ts)。<br/>`type TriggerSource = 'overlay' \| 'command' \| 'select' `<br/>
+selected | `(selected: ActionSheetItem \| string, index: number)` | 选择菜单项时触发

+ 66 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/action-sheet.d.ts

@@ -0,0 +1,66 @@
+import { SuperComponent } from '../common/src/index';
+export default class ActionSheet extends SuperComponent {
+    static show: (options: import("./show").ActionSheetShowOption) => WechatMiniprogram.Component.TrivialInstance;
+    externalClasses: string[];
+    properties: {
+        align?: {
+            type: StringConstructor;
+            value?: "center" | "left";
+        };
+        cancelText?: {
+            type: StringConstructor;
+            value?: string;
+        };
+        count?: {
+            type: NumberConstructor;
+            value?: number;
+        };
+        description?: {
+            type: StringConstructor;
+            value?: string;
+        };
+        items: {
+            type: ArrayConstructor;
+            value?: (string | import("./type").ActionSheetItem)[];
+        };
+        showCancel?: {
+            type: BooleanConstructor;
+            value?: boolean;
+        };
+        theme?: {
+            type: StringConstructor;
+            value?: "list" | "grid";
+        };
+        visible: {
+            type: BooleanConstructor;
+            value?: boolean;
+        };
+        defaultVisible: {
+            type: BooleanConstructor;
+            value?: boolean;
+        };
+    };
+    data: {
+        prefix: string;
+        classPrefix: string;
+        gridThemeItems: any[];
+        currentSwiperIndex: number;
+    };
+    controlledProps: {
+        key: string;
+        event: string;
+    }[];
+    ready(): void;
+    methods: {
+        onSwiperChange(e: WechatMiniprogram.TouchEvent): void;
+        splitGridThemeActions(): void;
+        show(options: any): void;
+        memoInitialData(): void;
+        close(): void;
+        onPopupVisibleChange({ detail }: {
+            detail: any;
+        }): void;
+        onSelect(event: WechatMiniprogram.TouchEvent): void;
+        onCancel(): void;
+    };
+}

+ 94 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/action-sheet.js

@@ -0,0 +1,94 @@
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+    return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+import { chunk } from '../common/utils';
+import { SuperComponent, wxComponent } from '../common/src/index';
+import config from '../common/config';
+import { ActionSheetTheme, show } from './show';
+import props from './props';
+const { prefix } = config;
+const name = `${prefix}-action-sheet`;
+let ActionSheet = class ActionSheet extends SuperComponent {
+    constructor() {
+        super(...arguments);
+        this.externalClasses = [`${prefix}-class`, `${prefix}-class-content`, `${prefix}-class-cancel`];
+        this.properties = Object.assign({}, props);
+        this.data = {
+            prefix,
+            classPrefix: name,
+            gridThemeItems: [],
+            currentSwiperIndex: 0,
+        };
+        this.controlledProps = [
+            {
+                key: 'visible',
+                event: 'visible-change',
+            },
+        ];
+        this.methods = {
+            onSwiperChange(e) {
+                const { detail: { current }, } = e;
+                this.setData({
+                    currentSwiperIndex: current,
+                });
+            },
+            splitGridThemeActions() {
+                if (this.data.theme !== ActionSheetTheme.Grid)
+                    return;
+                this.setData({
+                    gridThemeItems: chunk(this.data.items, this.data.count),
+                });
+            },
+            show(options) {
+                this.setData(Object.assign(Object.assign(Object.assign({}, this.initialData), options), { visible: true }));
+                this.splitGridThemeActions();
+                this.autoClose = true;
+                this._trigger('visible-change', { visible: true });
+            },
+            memoInitialData() {
+                this.initialData = Object.assign(Object.assign({}, this.properties), this.data);
+            },
+            close() {
+                this.triggerEvent('close', { trigger: 'command' });
+                this._trigger('visible-change', { visible: false });
+            },
+            onPopupVisibleChange({ detail }) {
+                if (!detail.visible) {
+                    this.triggerEvent('close', { trigger: 'overlay' });
+                    this._trigger('visible-change', { visible: false });
+                }
+                if (this.autoClose) {
+                    this.setData({ visible: false });
+                    this.autoClose = false;
+                }
+            },
+            onSelect(event) {
+                const { currentSwiperIndex, items, gridThemeItems, count, theme } = this.data;
+                const { index } = event.currentTarget.dataset;
+                const isSwiperMode = theme === ActionSheetTheme.Grid;
+                const item = isSwiperMode ? gridThemeItems[currentSwiperIndex][index] : items[index];
+                const realIndex = isSwiperMode ? index + currentSwiperIndex * count : index;
+                if (item) {
+                    this.triggerEvent('selected', { selected: item, index: realIndex });
+                    this.triggerEvent('close', { trigger: 'select' });
+                    this._trigger('visible-change', { visible: false });
+                }
+            },
+            onCancel() {
+                this.triggerEvent('cancel');
+            },
+        };
+    }
+    ready() {
+        this.memoInitialData();
+        this.splitGridThemeActions();
+    }
+};
+ActionSheet.show = show;
+ActionSheet = __decorate([
+    wxComponent()
+], ActionSheet);
+export default ActionSheet;

+ 10 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/action-sheet.json

@@ -0,0 +1,10 @@
+{
+  "component": true,
+  "usingComponents": {
+    "t-icon": "../icon/icon",
+    "t-popup": "../popup/popup",
+    "t-grid": "../grid/grid",
+    "t-grid-item": "../grid-item/grid-item",
+    "t-swiper-nav": "../swiper-nav/swiper-nav"
+  }
+}

+ 41 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/action-sheet.wxml

@@ -0,0 +1,41 @@
+<wxs src="./action-sheet.wxs" module="this" />
+<wxs src="../common/utils.wxs" module="_" />
+<import src="./template/list.wxml" />
+<import src="./template/grid.wxml" />
+
+<view id="{{classPrefix}}" style="{{_._style([style, customStyle])}}" class="{{classPrefix}} class {{prefix}}-class">
+  <t-popup visible="{{visible}}" placement="bottom" bind:visible-change="onPopupVisibleChange">
+    <view
+      class="{{_.cls(classPrefix + '__content', [['grid', gridThemeItems.length]])}} {{prefix}}-class-content"
+      tabindex="0"
+    >
+      <view wx:if="{{description}}" tabindex="0" class="{{_.cls(classPrefix + '__description', [align])}}"
+        >{{description}}</view
+      >
+      <block wx:if="{{gridThemeItems.length}}">
+        <template is="grid" data="{{classPrefix, prefix, gridThemeItems, count, currentSwiperIndex}}" />
+      </block>
+      <view wx:elif="{{items && items.length}}" class="{{classPrefix}}__list">
+        <block wx:for="{{ items }}" wx:key="index">
+          <template
+            is="list"
+            data="{{index, classPrefix, listThemeItemClass: _.cls(classPrefix + '__list-item', [align, [disabled, item.disabled]]), item}}"
+          />
+        </block>
+      </view>
+    </view>
+    <slot />
+    <view wx:if="{{showCancel}}" class="{{classPrefix}}__footer">
+      <view class="{{classPrefix}}__gap-{{theme}}" />
+      <view
+        class="{{classPrefix}}__cancel {{prefix}}-class-cancel"
+        hover-class="{{classPrefix}}__cancel--hover"
+        hover-stay-time="70"
+        bind:tap="onCancel"
+        aria-role="button"
+      >
+        {{ cancelText }}
+      </view>
+    </view>
+  </t-popup>
+</view>

+ 19 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/action-sheet.wxs

@@ -0,0 +1,19 @@
+var getListThemeItemClass = function (props) {
+  var classPrefix = props.classPrefix;
+  var item = props.item;
+  var prefix = props.prefix;
+  var classList = [classPrefix + '__list-item'];
+  if (item.disabled) {
+    classList.push(prefix + '-is-disabled');
+  }
+  return classList.join(' ');
+};
+
+var isImage = function (name) {
+  return name.indexOf('/') !== -1;
+};
+
+module.exports = {
+  getListThemeItemClass: getListThemeItemClass,
+  isImage: isImage,
+};

+ 165 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/action-sheet.wxss

@@ -0,0 +1,165 @@
+.t-float-left {
+  float: left;
+}
+.t-float-right {
+  float: right;
+}
+@keyframes tdesign-fade-out {
+  from {
+    opacity: 1;
+  }
+  to {
+    opacity: 0;
+  }
+}
+.hotspot-expanded.relative {
+  position: relative;
+}
+.hotspot-expanded::after {
+  content: '';
+  display: block;
+  position: absolute;
+  left: 0;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  transform: scale(1.5);
+}
+.t-action-sheet__content {
+  color: var(--td-action-sheet-color, var(--td-font-gray-1, rgba(0, 0, 0, 0.9)));
+  border-top-left-radius: var(--td-action-sheet-border-radius, var(--td-radius-extra-large, 24rpx));
+  border-top-right-radius: var(--td-action-sheet-border-radius, var(--td-radius-extra-large, 24rpx));
+  background-color: var(--td-bg-color-container, var(--td-font-white-1, #ffffff));
+  overflow: hidden;
+}
+.t-action-sheet__content--grid {
+  padding-top: 16rpx;
+}
+.t-action-sheet__content:focus {
+  outline: 0;
+}
+.t-action-sheet__grid {
+  padding-bottom: 16rpx;
+}
+.t-action-sheet__grid--swiper {
+  padding-bottom: 48rpx;
+}
+.t-action-sheet__description {
+  color: var(--td-action-sheet-description-color, var(--td-font-gray-3, rgba(0, 0, 0, 0.4)));
+  line-height: 44rpx;
+  font-size: 28rpx;
+  text-align: var(--td-action-sheet-text-align, center);
+  padding: 24rpx 32rpx;
+  position: relative;
+}
+.t-action-sheet__description:focus {
+  outline: 0;
+}
+.t-action-sheet__description::after {
+  content: '';
+  display: block;
+  position: absolute;
+  top: unset;
+  bottom: 0;
+  left: unset;
+  right: unset;
+  background-color: var(--td-action-sheet-border-color, var(--td-gray-color-1, #f3f3f3));
+}
+.t-action-sheet__description::after {
+  height: 1px;
+  left: 0;
+  right: 0;
+  transform: scaleY(0.5);
+}
+.t-action-sheet__description--left {
+  text-align: left;
+}
+.t-action-sheet__description--left::after {
+  left: 32rpx;
+}
+.t-action-sheet__list-item {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  position: relative;
+  height: var(--td-action-sheet-list-item-height, 112rpx);
+  padding: 0 32rpx;
+}
+.t-action-sheet__list-item::after {
+  content: '';
+  display: block;
+  position: absolute;
+  top: unset;
+  bottom: 0;
+  left: unset;
+  right: unset;
+  background-color: var(--td-action-sheet-border-color, var(--td-gray-color-1, #f3f3f3));
+}
+.t-action-sheet__list-item::after {
+  height: 1px;
+  left: 0;
+  right: 0;
+  transform: scaleY(0.5);
+}
+.t-action-sheet__list-item:focus {
+  outline: 0;
+}
+.t-action-sheet__list-item--left {
+  justify-content: start;
+}
+.t-action-sheet__list-item--left::after {
+  left: 32rpx;
+}
+.t-action-sheet__list-item--disabled {
+  color: var(--td-action-sheet-list-item-disabled-color, var(--td-font-gray-4, rgba(0, 0, 0, 0.26)));
+}
+.t-action-sheet__list-item-text {
+  font-size: var(--td-font-size-m, 32rpx);
+  word-wrap: normal;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+.t-action-sheet__list-item-icon {
+  margin-right: 16rpx;
+}
+.t-action-sheet__swiper-wrap {
+  margin-top: 8rpx;
+  position: relative;
+}
+.t-action-sheet__footer {
+  background-color: var(--td-bg-color-container, var(--td-font-white-1, #ffffff));
+}
+.t-action-sheet__gap-list {
+  height: 16rpx;
+  background-color: var(--td-action-sheet-border-color, var(--td-gray-color-1, #f3f3f3));
+}
+.t-action-sheet__gap-grid {
+  height: 1rpx;
+  background-color: var(--td-action-sheet-border-color, var(--td-gray-color-1, #f3f3f3));
+}
+.t-action-sheet__cancel {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  height: var(--td-action-sheet-cancel-height, 96rpx);
+}
+.t-action-sheet__dots {
+  position: absolute;
+  left: 50%;
+  bottom: 32rpx;
+  transform: translateX(-50%);
+  display: flex;
+  flex-direction: row;
+}
+.t-action-sheet__dots-item {
+  width: 16rpx;
+  height: 16rpx;
+  background-color: #dcdcdc;
+  border-radius: 50%;
+  margin: 0 16rpx;
+  transition: all 0.4s ease-in;
+}
+.t-action-sheet__dots-item.t-is-active {
+  background-color: #0052d9;
+}

+ 3 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/index.d.ts

@@ -0,0 +1,3 @@
+import ActionSheet from './action-sheet';
+export * from './show';
+export default ActionSheet;

+ 3 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/index.js

@@ -0,0 +1,3 @@
+import ActionSheet from './action-sheet';
+export * from './show';
+export default ActionSheet;

+ 3 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/props.d.ts

@@ -0,0 +1,3 @@
+import { TdActionSheetProps } from './type';
+declare const props: TdActionSheetProps;
+export default props;

+ 38 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/props.js

@@ -0,0 +1,38 @@
+const props = {
+    align: {
+        type: String,
+        value: 'center',
+    },
+    cancelText: {
+        type: String,
+        value: '取消',
+    },
+    count: {
+        type: Number,
+        value: 8,
+    },
+    description: {
+        type: String,
+        value: '',
+    },
+    items: {
+        type: Array,
+    },
+    showCancel: {
+        type: Boolean,
+        value: true,
+    },
+    theme: {
+        type: String,
+        value: 'list',
+    },
+    visible: {
+        type: Boolean,
+        value: null,
+    },
+    defaultVisible: {
+        type: Boolean,
+        value: false,
+    },
+};
+export default props;

+ 31 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/show.d.ts

@@ -0,0 +1,31 @@
+/// <reference types="miniprogram-api-typings" />
+/// <reference types="miniprogram-api-typings" />
+export interface ActionSheetItem {
+    label: string;
+    color?: string;
+    disabled?: boolean;
+    icon?: string;
+}
+declare type Context = WechatMiniprogram.Page.TrivialInstance | WechatMiniprogram.Component.TrivialInstance;
+export declare enum ActionSheetTheme {
+    List = "list",
+    Grid = "grid"
+}
+interface ActionSheetProps {
+    align: 'center' | 'left';
+    cancelText?: string;
+    count?: number;
+    description: string;
+    items: Array<string | ActionSheetItem>;
+    showCancel?: boolean;
+    theme?: ActionSheetTheme;
+    visible: boolean;
+    defaultVisible?: boolean;
+}
+export interface ActionSheetShowOption extends Omit<ActionSheetProps, 'visible'> {
+    context?: Context;
+    selector?: string;
+}
+export declare const show: (options: ActionSheetShowOption) => WechatMiniprogram.Component.TrivialInstance;
+export declare const close: (options: ActionSheetShowOption) => void;
+export {};

+ 33 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/show.js

@@ -0,0 +1,33 @@
+var __rest = (this && this.__rest) || function (s, e) {
+    var t = {};
+    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
+        t[p] = s[p];
+    if (s != null && typeof Object.getOwnPropertySymbols === "function")
+        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
+            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
+                t[p[i]] = s[p[i]];
+        }
+    return t;
+};
+import { getInstance } from '../common/utils';
+export var ActionSheetTheme;
+(function (ActionSheetTheme) {
+    ActionSheetTheme["List"] = "list";
+    ActionSheetTheme["Grid"] = "grid";
+})(ActionSheetTheme || (ActionSheetTheme = {}));
+export const show = function (options) {
+    const _a = Object.assign({}, options), { context, selector = '#t-action-sheet' } = _a, otherOptions = __rest(_a, ["context", "selector"]);
+    const instance = getInstance(context, selector);
+    if (instance) {
+        instance.show(Object.assign({}, otherOptions));
+        return instance;
+    }
+    console.error('未找到组件,请确认 selector && context 是否正确');
+};
+export const close = function (options) {
+    const { context, selector = '#t-action-sheet' } = Object.assign({}, options);
+    const instance = getInstance(context, selector);
+    if (instance) {
+        instance.close();
+    }
+};

+ 49 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/template/grid.wxml

@@ -0,0 +1,49 @@
+<template name="grid">
+  <block wx:if="{{gridThemeItems.length === 1}}">
+    <t-grid align="center" t-class="{{classPrefix}}__grid" column="{{count / 2}}" class="{{classPrefix}}__single-wrap">
+      <t-grid-item
+        t-class="{{classPrefix}}__grid-item"
+        class="{{classPrefix}}__square"
+        wx:for="{{gridThemeItems[0]}}"
+        wx:key="index"
+        bind:tap="onSelect"
+        data-index="{{index}}"
+        icon="{{item.icon}}"
+        text="{{item.label}}"
+        image="{{item.image}}"
+      >
+      </t-grid-item>
+    </t-grid>
+  </block>
+  <block wx:elif="{{gridThemeItems.length > 1}}">
+    <view class="{{classPrefix}}__swiper-wrap">
+      <swiper style="height: 456rpx" autoplay="{{false}}" current="{{currentSwiperIndex}}" bindchange="onSwiperChange">
+        <swiper-item wx:for="{{gridThemeItems}}" wx:key="index">
+          <t-grid align="center" t-class="{{classPrefix}}__grid {{classPrefix}}__grid--swiper" column="{{count / 2}}">
+            <t-grid-item
+              t-class="{{classPrefix}}__grid-item"
+              class="{{classPrefix}}__square"
+              wx:for="{{item}}"
+              wx:key="index"
+              data-index="{{index}}"
+              bind:tap="onSelect"
+              icon="{{item.icon}}"
+              text="{{item.label}}"
+              image="{{item.image}}"
+            >
+            </t-grid-item>
+          </t-grid>
+        </swiper-item>
+      </swiper>
+      <view class="{{classPrefix}}__nav">
+        <view class="{{classPrefix}}__dots">
+          <view
+            wx:for="{{gridThemeItems.length}}"
+            wx:key="index"
+            class="{{classPrefix}}__dots-item {{index === currentSwiperIndex ? prefix + '-is-active' : ''}}"
+          />
+        </view>
+      </view>
+    </view>
+  </block>
+</template>

+ 14 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/template/list.wxml

@@ -0,0 +1,14 @@
+<template name="list">
+  <view
+    data-index="{{index}}"
+    style="{{ item.color ? 'color: ' + item.color : '' }}"
+    class="{{listThemeItemClass}}"
+    bind:tap="onSelect"
+    aria-role="{{ariaRole || 'button'}}"
+    aria-label="{{item.label || item}}"
+    tabindex="0"
+  >
+    <t-icon wx:if="{{item.icon}}" name="{{item.icon}}" class="{{classPrefix}}__list-item-icon" size="48rpx"></t-icon>
+    <view class="{{classPrefix}}__list-item-text">{{item.label || item}}</view>
+  </view>
+</template>

+ 43 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/type.d.ts

@@ -0,0 +1,43 @@
+export interface TdActionSheetProps {
+    align?: {
+        type: StringConstructor;
+        value?: 'center' | 'left';
+    };
+    cancelText?: {
+        type: StringConstructor;
+        value?: string;
+    };
+    count?: {
+        type: NumberConstructor;
+        value?: number;
+    };
+    description?: {
+        type: StringConstructor;
+        value?: string;
+    };
+    items: {
+        type: ArrayConstructor;
+        value?: Array<string | ActionSheetItem>;
+    };
+    showCancel?: {
+        type: BooleanConstructor;
+        value?: boolean;
+    };
+    theme?: {
+        type: StringConstructor;
+        value?: 'list' | 'grid';
+    };
+    visible: {
+        type: BooleanConstructor;
+        value?: boolean;
+    };
+    defaultVisible: {
+        type: BooleanConstructor;
+        value?: boolean;
+    };
+}
+export interface ActionSheetItem {
+    label: string;
+    color?: string;
+    disabled?: boolean;
+}

+ 1 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/action-sheet/type.js

@@ -0,0 +1 @@
+export {};

+ 28 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/avatar-group/avatar-group.d.ts

@@ -0,0 +1,28 @@
+import { SuperComponent, RelationsOptions } from '../common/src/index';
+export default class AvatarGroup extends SuperComponent {
+    externalClasses: string[];
+    properties: import("./type").TdAvatarGroupProps;
+    data: {
+        prefix: string;
+        classPrefix: string;
+        hasChild: boolean;
+        length: number;
+        className: string;
+    };
+    options: {
+        multipleSlots: boolean;
+    };
+    relations: RelationsOptions;
+    lifetimes: {
+        attached(): void;
+        ready(): void;
+    };
+    observers: {
+        'cascading, size'(): void;
+    };
+    methods: {
+        setClass(): void;
+        handleMax(): void;
+        handleChildCascading(): void;
+    };
+}

+ 86 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/avatar-group/avatar-group.js

@@ -0,0 +1,86 @@
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+    return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+import { SuperComponent, wxComponent } from '../common/src/index';
+import config from '../common/config';
+import avatarGroupProps from './props';
+const { prefix } = config;
+const name = `${prefix}-avatar-group`;
+let AvatarGroup = class AvatarGroup extends SuperComponent {
+    constructor() {
+        super(...arguments);
+        this.externalClasses = [`${prefix}-class`, `${prefix}-class-content`, `${prefix}-class-image`];
+        this.properties = avatarGroupProps;
+        this.data = {
+            prefix,
+            classPrefix: name,
+            hasChild: true,
+            length: 0,
+            className: '',
+        };
+        this.options = {
+            multipleSlots: true,
+        };
+        this.relations = {
+            '../avatar/avatar': {
+                type: 'descendant',
+            },
+        };
+        this.lifetimes = {
+            attached() {
+                this.setClass();
+            },
+            ready() {
+                this.setData({
+                    length: this.$children.length,
+                });
+                this.handleMax();
+                this.handleChildCascading();
+            },
+        };
+        this.observers = {
+            'cascading, size'() {
+                this.setClass();
+            },
+        };
+        this.methods = {
+            setClass() {
+                const { cascading, size } = this.properties;
+                const direction = cascading.split('-')[0];
+                const classList = [
+                    name,
+                    `${prefix}-class`,
+                    `${name}-offset-${direction}-${size.indexOf('px') > -1 ? 'medium' : size}`,
+                ];
+                this.setData({
+                    className: classList.join(' '),
+                });
+            },
+            handleMax() {
+                const { max } = this.data;
+                const len = this.$children.length;
+                if (!max || max > len)
+                    return;
+                const restAvatars = this.$children.splice(max, len - max);
+                restAvatars.forEach((child) => {
+                    child.hide();
+                });
+            },
+            handleChildCascading() {
+                if (this.properties.cascading === 'right-up')
+                    return;
+                const defaultZIndex = 100;
+                this.$children.forEach((child, index) => {
+                    child.updateCascading(defaultZIndex - index * 10);
+                });
+            },
+        };
+    }
+};
+AvatarGroup = __decorate([
+    wxComponent()
+], AvatarGroup);
+export default AvatarGroup;

+ 6 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/avatar-group/avatar-group.json

@@ -0,0 +1,6 @@
+{
+  "component": true,
+  "usingComponents": {
+    "t-avatar": "../avatar/avatar"
+  }
+}

+ 20 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/avatar-group/avatar-group.wxml

@@ -0,0 +1,20 @@
+<wxs src="../common/utils.wxs" module="_" />
+
+<view style="{{_._style([style, customStyle])}}" class="{{className}} class">
+  <slot />
+  <!-- 自定义折叠元素 -->
+  <view class="{{classPrefix}}__collapse--slot">
+    <slot name="collapse-avatar" />
+  </view>
+  <!-- 默认折叠元素 -->
+  <view class="{{classPrefix}}__collapse--default" wx:if="{{max && (max < length)}}">
+    <t-avatar
+      t-class-image="{{prefix}}-avatar--border {{prefix}}-avatar--border-{{size}} {{prefix}}-class-image"
+      t-class-content="{{prefix}}-class-content"
+      size="{{size}}"
+      icon="{{ collapseAvatar ? '' : 'user-add'}}"
+      aria-role="none"
+      >{{collapseAvatar}}</t-avatar
+    >
+  </view>
+</view>

+ 137 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/avatar-group/avatar-group.wxss

@@ -0,0 +1,137 @@
+.t-float-left {
+  float: left;
+}
+.t-float-right {
+  float: right;
+}
+@keyframes tdesign-fade-out {
+  from {
+    opacity: 1;
+  }
+  to {
+    opacity: 0;
+  }
+}
+.hotspot-expanded.relative {
+  position: relative;
+}
+.hotspot-expanded::after {
+  content: '';
+  display: block;
+  position: absolute;
+  left: 0;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  transform: scale(1.5);
+}
+.t-avatar {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  box-sizing: border-box;
+  background-color: var(--td-avatar-bg-color, var(--td-brand-color-light-active, var(--td-primary-color-2, #d9e1ff)));
+  color: var(--td-avatar-content-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));
+}
+.t-avatar__wrapper {
+  display: inline-flex;
+  position: relative;
+  vertical-align: top;
+  margin-left: var(--td-avatar-margin-left, 0);
+}
+.t-avatar--large {
+  width: var(--td-avatar-large-width, 128rpx);
+  height: var(--td-avatar-large-width, 128rpx);
+  font-size: var(--td-avatar-text-large-font-size, 16px);
+}
+.t-avatar--large .t-avatar__icon {
+  font-size: var(--td-avatar-icon-large-font-size, 64rpx);
+}
+.t-avatar--medium {
+  width: var(--td-avatar-medium-width, 96rpx);
+  height: var(--td-avatar-medium-width, 96rpx);
+  font-size: var(--td-avatar-text-medium-font-size, var(--td-font-size-base, 28rpx));
+}
+.t-avatar--medium .t-avatar__icon {
+  font-size: var(--td-avatar-icon-medium-font-size, 48rpx);
+}
+.t-avatar--small {
+  width: var(--td-avatar-small-width, 80rpx);
+  height: var(--td-avatar-small-width, 80rpx);
+  font-size: var(--td-avatar-text-small-font-size, var(--td-font-size-s, 24rpx));
+}
+.t-avatar--small .t-avatar__icon {
+  font-size: var(--td-avatar-icon-small-font-size, 40rpx);
+}
+.t-avatar .t-image,
+.t-avatar__image {
+  width: 100%;
+  height: 100%;
+}
+.t-avatar--circle {
+  border-radius: var(--td-avatar-circle-border-radius, var(--td-radius-circle, 50%));
+  overflow: hidden;
+}
+.t-avatar--round {
+  border-radius: var(--td-avatar-round-border-radius, var(--td-radius-default, 12rpx));
+  overflow: hidden;
+}
+.t-avatar__text,
+.t-avatar__icon {
+  width: 100%;
+  height: 100%;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+.t-avatar__text:empty,
+.t-avatar__icon:empty {
+  width: 0;
+  height: 0;
+}
+.t-avatar--border {
+  border-color: var(--td-avatar-border-color, #fff);
+  border-style: solid;
+}
+.t-avatar--border-small {
+  border-width: var(--td-avatar-border-width-small, 4rpx);
+}
+.t-avatar--border-medium {
+  border-width: var(--td-avatar-border-width-medium, 6rpx);
+}
+.t-avatar--border-large {
+  border-width: var(--td-avatar-border-width-large, 8rpx);
+}
+.t-avatar-group {
+  display: inline-flex;
+  align-items: center;
+}
+.t-avatar-group-offset-left-small {
+  --td-avatar-margin-left: var(--td-avatar-group-margin-left-small, -4px);
+}
+.t-avatar-group-offset-left-medium {
+  --td-avatar-margin-left: var(--td-avatar-group-margin-left-medium, -6px);
+}
+.t-avatar-group-offset-left-large {
+  --td-avatar-margin-left: var(--td-avatar-group-margin-left-large, -8px);
+}
+.t-avatar-group-offset-right-small {
+  --td-avatar-margin-left: var(--td-avatar-group-margin-left-small, -4px);
+}
+.t-avatar-group-offset-right-medium {
+  --td-avatar-margin-left: var(--td-avatar-group-margin-left-medium, -6px);
+}
+.t-avatar-group-offset-right-large {
+  --td-avatar-margin-left: var(--td-avatar-group-margin-left-large, -8px);
+}
+.t-avatar-group__collapse--slot {
+  float: left;
+}
+.t-avatar-group__collapse--slot:not(:empty) + .t-avatar-group__collapse--default {
+  display: none;
+  float: left;
+}
+.t-avatar-group__collapse--slot:empty + .t-avatar-group__collapse--default {
+  display: block;
+  float: left;
+}

+ 3 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/avatar-group/props.d.ts

@@ -0,0 +1,3 @@
+import { TdAvatarGroupProps } from './type';
+declare const props: TdAvatarGroupProps;
+export default props;

+ 20 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/avatar-group/props.js

@@ -0,0 +1,20 @@
+const props = {
+    cascading: {
+        type: String,
+        value: 'left-up',
+    },
+    collapseAvatar: {
+        type: String,
+    },
+    externalClasses: {
+        type: Array,
+    },
+    max: {
+        type: Number,
+    },
+    size: {
+        type: String,
+        value: 'medium',
+    },
+};
+export default props;

+ 27 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/avatar-group/type.d.ts

@@ -0,0 +1,27 @@
+export interface TdAvatarGroupProps {
+    cascading?: {
+        type: StringConstructor;
+        value?: CascadingValue;
+    };
+    collapseAvatar?: {
+        type: StringConstructor;
+        value?: string;
+    };
+    style?: {
+        type: StringConstructor;
+        value?: string;
+    };
+    externalClasses?: {
+        type: ArrayConstructor;
+        value?: ['t-class', 't-class-image', 't-class-content'];
+    };
+    max?: {
+        type: NumberConstructor;
+        value?: number;
+    };
+    size?: {
+        type: StringConstructor;
+        value?: string;
+    };
+}
+export declare type CascadingValue = 'left-up' | 'right-up';

+ 1 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/avatar-group/type.js

@@ -0,0 +1 @@
+export {};

+ 33 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/avatar/README.en-US.md

@@ -0,0 +1,33 @@
+:: BASE_DOC ::
+
+## API
+### Avatar Props
+
+name | type | default | description | required
+-- | -- | -- | -- | --
+alt | String | - | show it when url is not valid | N
+badge-props | Object | - | Typescript:`BadgeProps`,[Badge API Documents](./badge?tab=api)。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/avatar/type.ts) | N
+bordered | Boolean | false | \- | N
+external-classes | Array | - | `['t-class', 't-class-image', 't-class-icon', 't-class-alt', 't-class-content']` | N
+hide-on-load-failed | Boolean | false | hide image when loading image failed | N
+icon | String / Object | - | \- | N
+image | String | - | images url | N
+image-props | Object | - | \- | N
+shape | String | circle | shape。options:circle/round。Typescript:`ShapeEnum ` `type ShapeEnum = 'circle' \| 'round'`。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/avatar/type.ts) | N
+size | String | medium | size | N
+
+### Avatar Events
+
+name | params | description
+-- | -- | --
+error | \- | trigger on image load failed
+
+### AvatarGroup Props
+
+name | type | default | description | required
+-- | -- | -- | -- | --
+cascading | String | 'right-up' | multiple images cascading。options:left-up/right-up。Typescript:`CascadingValue` `type CascadingValue = 'left-up' \| 'right-up'`。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/avatar-group/type.ts) | N
+collapse-avatar | String / Slot | - | \- | N
+external-classes | Array | - | `['t-class', 't-class-image', 't-class-content']` | N
+max | Number | - | \- | N
+size | String | medium | size | N

+ 87 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/avatar/README.md

@@ -0,0 +1,87 @@
+---
+title: Avatar 头像
+description: 用于展示用户头像信息,除了纯展示也可点击进入个人详情等操作。
+spline: data
+isComponent: true
+---
+
+<span class="coverages-badge" style="margin-right: 10px"><img src="https://img.shields.io/badge/coverages%3A%20lines-100%25-blue" /></span><span class="coverages-badge" style="margin-right: 10px"><img src="https://img.shields.io/badge/coverages%3A%20functions-100%25-blue" /></span><span class="coverages-badge" style="margin-right: 10px"><img src="https://img.shields.io/badge/coverages%3A%20statements-99%25-blue" /></span><span class="coverages-badge" style="margin-right: 10px"><img src="https://img.shields.io/badge/coverages%3A%20branches-85%25-blue" /></span>
+## 引入
+
+全局引入,在 miniprogram 根目录下的`app.json`中配置,局部引入,在需要引入的页面或组件的`index.json`中配置。
+
+```json
+"usingComponents": {
+  "t-avatar": "tdesign-miniprogram/avatar/avatar",
+  "t-avatar-group": "tdesign-miniprogram/avatar-group/avatar-group"
+}
+```
+
+## 代码演示
+
+### 头像类型
+
+图片头像
+
+{{ image-avatar }}
+
+字符头像
+
+{{ character-avatar }}
+
+图标头像
+
+{{ icon-avatar }}
+
+徽标头像
+
+{{ badge-avatar }}
+
+
+### 组合头像
+
+纯展示
+
+{{ exhibition }}
+
+带操作
+
+{{ action }}
+
+### 头像尺寸
+
+头像 large/medium/small 尺寸
+
+{{ size }}
+
+## API
+### Avatar Props
+
+名称 | 类型 | 默认值 | 说明 | 必传
+-- | -- | -- | -- | --
+alt | String | - | 头像替换文本,仅当图片加载失败时有效 | N
+badge-props | Object | - | 头像右上角提示信息,继承 Badge 组件的全部特性。如:小红点,或者数字。TS 类型:`BadgeProps`,[Badge API Documents](./badge?tab=api)。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/avatar/type.ts) | N
+bordered | Boolean | false | 已废弃。是否显示外边框 | N
+external-classes | Array | - | 组件类名,用于设置组件外层元素类名。`['t-class', 't-class-image', 't-class-icon', 't-class-alt', 't-class-content']` | N
+hide-on-load-failed | Boolean | false | 加载失败时隐藏图片 | N
+icon | String / Object | - | 图标。值为字符串表示图标名称,值为 `Object` 类型,表示透传至 `icon`。 | N
+image | String | - | 图片地址 | N
+image-props | Object | - | 透传至 Image 组件 | N
+shape | String | circle | 形状。可选项:circle/round。TS 类型:`ShapeEnum ` `type ShapeEnum = 'circle' \| 'round'`。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/avatar/type.ts) | N
+size | String | medium | 尺寸,示例值:small/medium/large/24px/38px 等 | N
+
+### Avatar Events
+
+名称 | 参数 | 描述
+-- | -- | --
+error | \- | 图片加载失败时触发
+
+### AvatarGroup Props
+
+名称 | 类型 | 默认值 | 说明 | 必传
+-- | -- | -- | -- | --
+cascading | String | 'left-up' | 图片之间的层叠关系,可选值:左侧图片在上和右侧图片在上。可选项:left-up/right-up。TS 类型:`CascadingValue` `type CascadingValue = 'left-up' \| 'right-up'`。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/avatar-group/type.ts) | N
+collapse-avatar | String / Slot | - | 头像数量超出时,会出现一个头像折叠元素。该元素内容可自定义。默认为 `+N`。示例:`+5`,`...`, `更多` | N
+external-classes | Array | - | 组件类名,用于设置组件外层元素类名。`['t-class', 't-class-image', 't-class-content']` | N
+max | Number | - | 能够同时显示的最多头像数量 | N
+size | String | medium | 尺寸,示例值:small/medium/large/24px/38px 等。优先级低于 Avatar.size | N

+ 23 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/avatar/avatar.d.ts

@@ -0,0 +1,23 @@
+/// <reference types="miniprogram-api-typings" />
+import { SuperComponent, RelationsOptions } from '../common/src/index';
+export default class Avatar extends SuperComponent {
+    options: WechatMiniprogram.Component.ComponentOptions;
+    externalClasses: string[];
+    properties: import("./type").TdAvatarProps;
+    data: {
+        prefix: string;
+        classPrefix: string;
+        isShow: boolean;
+        zIndex: number;
+        borderedWithGroup: boolean;
+    };
+    relations: RelationsOptions;
+    observers: {
+        icon(icon: any): void;
+    };
+    methods: {
+        hide(): void;
+        updateCascading(zIndex: any): void;
+        onLoadError(e: WechatMiniprogram.CustomEvent): void;
+    };
+}

+ 77 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/avatar/avatar.js

@@ -0,0 +1,77 @@
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+    return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+import { SuperComponent, wxComponent } from '../common/src/index';
+import config from '../common/config';
+import avatarProps from './props';
+import { setIcon } from '../common/utils';
+const { prefix } = config;
+const name = `${prefix}-avatar`;
+let Avatar = class Avatar extends SuperComponent {
+    constructor() {
+        super(...arguments);
+        this.options = {
+            multipleSlots: true,
+            styleIsolation: 'apply-shared',
+        };
+        this.externalClasses = [
+            `${prefix}-class`,
+            `${prefix}-class-image`,
+            `${prefix}-class-icon`,
+            `${prefix}-class-alt`,
+            `${prefix}-class-content`,
+        ];
+        this.properties = avatarProps;
+        this.data = {
+            prefix,
+            classPrefix: name,
+            isShow: true,
+            zIndex: 0,
+            borderedWithGroup: false,
+        };
+        this.relations = {
+            '../avatar-group/avatar-group': {
+                type: 'ancestor',
+                linked(parent) {
+                    var _a;
+                    this.parent = parent;
+                    this.setData({
+                        size: (_a = this.data.size) !== null && _a !== void 0 ? _a : parent.data.size,
+                        borderedWithGroup: true,
+                    });
+                },
+            },
+        };
+        this.observers = {
+            icon(icon) {
+                const obj = setIcon('icon', icon, '');
+                this.setData(Object.assign({}, obj));
+            },
+        };
+        this.methods = {
+            hide() {
+                this.setData({
+                    isShow: false,
+                });
+            },
+            updateCascading(zIndex) {
+                this.setData({ zIndex });
+            },
+            onLoadError(e) {
+                if (this.properties.hideOnLoadFailed) {
+                    this.setData({
+                        isShow: false,
+                    });
+                }
+                this.triggerEvent('error', e.detail);
+            },
+        };
+    }
+};
+Avatar = __decorate([
+    wxComponent()
+], Avatar);
+export default Avatar;

+ 8 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/avatar/avatar.json

@@ -0,0 +1,8 @@
+{
+  "component": true,
+  "usingComponents": {
+    "t-icon": "../icon/icon",
+    "t-badge": "../badge/badge",
+    "t-image": "../image/image"
+  }
+}

+ 54 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/avatar/avatar.wxml

@@ -0,0 +1,54 @@
+<import src="../common/template/icon.wxml" />
+<wxs src="../common/utils.wxs" module="_" />
+<wxs src="./avatar.wxs" module="this" />
+
+<view
+  class="{{classPrefix}}__wrapper class {{prefix}}-class"
+  style="{{_._style([this.getStyles(isShow, zIndex), style, customStyle])}}"
+>
+  <t-badge
+    color="{{badgeProps.color || ''}}"
+    content="{{badgeProps.content || ''}}"
+    count="{{badgeProps.count || 0}}"
+    dot="{{badgeProps.dot || false}}"
+    max-count="{{badgeProps.maxCount || 99}}"
+    offset="{{badgeProps.offset || []}}"
+    shape="{{badgeProps.shape || 'circle'}}"
+    show-zero="{{badgeProps.showZero || false}}"
+    size="{{badgeProps.size || 'medium'}}"
+    t-class="{{badgeProps.tClass}}"
+    t-class-content="{{badgeProps.tClassContent}}"
+    t-class-count="{{badgeProps.tClassCount}}"
+  >
+    <view
+      class="{{this.getClass(classPrefix, size, shape, bordered || borderedWithGroup)}} {{prefix}}-class-image"
+      style="{{this.getSize(size)}}"
+      aria-label="{{ ariaLabel || alt ||'头像'}}"
+      aria-role="{{ ariaRole || 'img'}}"
+      aria-hidden="{{ ariaHidden }}"
+    >
+      <t-image
+        wx:if="{{image}}"
+        t-class="{{prefix}}-image {{classPrefix}}__image"
+        t-class-load="{{prefix}}-class-alt"
+        style="{{imageProps.style || ''}}"
+        src="{{image}}"
+        mode="{{imageProps.mode || 'aspectFill'}}"
+        lazy="{{imageProps.lazy || false}}"
+        loading="{{imageProps.loading || 'default'}}"
+        shape="{{imageProps.shape || 'round'}}"
+        webp="{{imageProps.webp || false}}"
+        error="{{alt || 'default'}}"
+        bind:error="onLoadError"
+      />
+      <template
+        wx:elif="{{iconName || _.isNoEmptyObj(iconData)}}"
+        is="icon"
+        data="{{class: classPrefix + '__icon', tClass: prefix + '-class-icon', name: iconName, ...iconData}}"
+      />
+      <view wx:else class="{{classPrefix}}__text {{prefix}}-class-content">
+        <slot />
+      </view>
+    </view>
+  </t-badge>
+</view>

+ 26 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/avatar/avatar.wxs

@@ -0,0 +1,26 @@
+module.exports = {
+  getClass: function (classPrefix, size, shape, bordered) {
+    var hasPx = (size || '').indexOf('px') > -1;
+    var borderSize = hasPx ? 'medium' : size;
+    var classNames = [
+      classPrefix,
+      classPrefix + (shape === 'round' ? '--round' : '--circle'),
+      bordered ? classPrefix + '--border' + ' ' + classPrefix + '--border-' + borderSize : '',
+      hasPx ? '' : classPrefix + '--' + size,
+    ];
+    return classNames.join(' ');
+  },
+
+  getSize: function (size = 'medium') {
+    var pxIndex = size.indexOf('px');
+    if (pxIndex > -1) {
+      return 'width:' + size + ';height:' + size + ';font-size:' + ((size.slice(0, pxIndex) / 8) * 3 + 2) + 'px;';
+    }
+  },
+
+  getStyles: function (isShow, zIndex) {
+    var displayStyle = isShow ? '' : 'display: none;';
+    var zIndexStyle = zIndex ? 'z-index:' + zIndex + ';' : '';
+    return displayStyle + zIndexStyle;
+  },
+};

+ 104 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/avatar/avatar.wxss

@@ -0,0 +1,104 @@
+.t-float-left {
+  float: left;
+}
+.t-float-right {
+  float: right;
+}
+@keyframes tdesign-fade-out {
+  from {
+    opacity: 1;
+  }
+  to {
+    opacity: 0;
+  }
+}
+.hotspot-expanded.relative {
+  position: relative;
+}
+.hotspot-expanded::after {
+  content: '';
+  display: block;
+  position: absolute;
+  left: 0;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  transform: scale(1.5);
+}
+.t-avatar {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  box-sizing: border-box;
+  background-color: var(--td-avatar-bg-color, var(--td-brand-color-light-active, var(--td-primary-color-2, #d9e1ff)));
+  color: var(--td-avatar-content-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));
+}
+.t-avatar__wrapper {
+  display: inline-flex;
+  position: relative;
+  vertical-align: top;
+  margin-left: var(--td-avatar-margin-left, 0);
+}
+.t-avatar--large {
+  width: var(--td-avatar-large-width, 128rpx);
+  height: var(--td-avatar-large-width, 128rpx);
+  font-size: var(--td-avatar-text-large-font-size, 16px);
+}
+.t-avatar--large .t-avatar__icon {
+  font-size: var(--td-avatar-icon-large-font-size, 64rpx);
+}
+.t-avatar--medium {
+  width: var(--td-avatar-medium-width, 96rpx);
+  height: var(--td-avatar-medium-width, 96rpx);
+  font-size: var(--td-avatar-text-medium-font-size, var(--td-font-size-base, 28rpx));
+}
+.t-avatar--medium .t-avatar__icon {
+  font-size: var(--td-avatar-icon-medium-font-size, 48rpx);
+}
+.t-avatar--small {
+  width: var(--td-avatar-small-width, 80rpx);
+  height: var(--td-avatar-small-width, 80rpx);
+  font-size: var(--td-avatar-text-small-font-size, var(--td-font-size-s, 24rpx));
+}
+.t-avatar--small .t-avatar__icon {
+  font-size: var(--td-avatar-icon-small-font-size, 40rpx);
+}
+.t-avatar .t-image,
+.t-avatar__image {
+  width: 100%;
+  height: 100%;
+}
+.t-avatar--circle {
+  border-radius: var(--td-avatar-circle-border-radius, var(--td-radius-circle, 50%));
+  overflow: hidden;
+}
+.t-avatar--round {
+  border-radius: var(--td-avatar-round-border-radius, var(--td-radius-default, 12rpx));
+  overflow: hidden;
+}
+.t-avatar__text,
+.t-avatar__icon {
+  width: 100%;
+  height: 100%;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+.t-avatar__text:empty,
+.t-avatar__icon:empty {
+  width: 0;
+  height: 0;
+}
+.t-avatar--border {
+  border-color: var(--td-avatar-border-color, #fff);
+  border-style: solid;
+}
+.t-avatar--border-small {
+  border-width: var(--td-avatar-border-width-small, 4rpx);
+}
+.t-avatar--border-medium {
+  border-width: var(--td-avatar-border-width-medium, 6rpx);
+}
+.t-avatar--border-large {
+  border-width: var(--td-avatar-border-width-large, 8rpx);
+}

+ 3 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/avatar/props.d.ts

@@ -0,0 +1,3 @@
+import { TdAvatarProps } from './type';
+declare const props: TdAvatarProps;
+export default props;

+ 39 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/avatar/props.js

@@ -0,0 +1,39 @@
+const props = {
+    alt: {
+        type: String,
+        value: '',
+    },
+    badgeProps: {
+        type: Object,
+    },
+    bordered: {
+        type: Boolean,
+        value: false,
+    },
+    externalClasses: {
+        type: Array,
+    },
+    hideOnLoadFailed: {
+        type: Boolean,
+        value: false,
+    },
+    icon: {
+        type: null,
+    },
+    image: {
+        type: String,
+        value: '',
+    },
+    imageProps: {
+        type: Object,
+    },
+    shape: {
+        type: String,
+        value: 'circle',
+    },
+    size: {
+        type: String,
+        value: 'medium',
+    },
+};
+export default props;

+ 48 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/avatar/type.d.ts

@@ -0,0 +1,48 @@
+import { BadgeProps } from '../badge/index';
+export interface TdAvatarProps {
+    alt?: {
+        type: StringConstructor;
+        value?: string;
+    };
+    badgeProps?: {
+        type: ObjectConstructor;
+        value?: BadgeProps;
+    };
+    bordered?: {
+        type: BooleanConstructor;
+        value?: boolean;
+    };
+    style?: {
+        type: StringConstructor;
+        value?: string;
+    };
+    externalClasses?: {
+        type: ArrayConstructor;
+        value?: ['t-class', 't-class-image', 't-class-icon', 't-class-alt', 't-class-content'];
+    };
+    hideOnLoadFailed?: {
+        type: BooleanConstructor;
+        value?: boolean;
+    };
+    icon?: {
+        type: null;
+        value?: string | object;
+    };
+    image?: {
+        type: StringConstructor;
+        value?: string;
+    };
+    imageProps?: {
+        type: ObjectConstructor;
+        value?: object;
+    };
+    shape?: {
+        type: StringConstructor;
+        value?: ShapeEnum;
+    };
+    size?: {
+        type: StringConstructor;
+        value?: string;
+    };
+}
+export declare type ShapeEnum = 'circle' | 'round';

+ 1 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/avatar/type.js

@@ -0,0 +1 @@
+export {};

+ 19 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/back-top/README.en-US.md

@@ -0,0 +1,19 @@
+:: BASE_DOC ::
+
+## API
+
+### BackTop Props
+
+name | type | default | description | required
+-- | -- | -- | -- | --
+external-classes | Array | - | `['t-class', 't-class-icon', 't-class-text']` | N
+fixed | Boolean | true | \- | N
+icon | String / Boolean / Object / Slot | - | \- | N
+text | String | '' | \- | N
+theme | String | round | options:round/half-round/round-dark/half-round-dark | N
+
+### BackTop Events
+
+name | params | description
+-- | -- | --
+to-top | \- | \-

+ 42 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/back-top/README.md

@@ -0,0 +1,42 @@
+---
+title: BackTop 返回顶部
+description: 用于当页面过长往下滑动时,帮助用户快速回到页面顶部。
+spline: navigation
+isComponent: true
+---
+
+<span class="coverages-badge" style="margin-right: 10px"><img src="https://img.shields.io/badge/coverages%3A%20lines-100%25-blue" /></span><span class="coverages-badge" style="margin-right: 10px"><img src="https://img.shields.io/badge/coverages%3A%20functions-100%25-blue" /></span><span class="coverages-badge" style="margin-right: 10px"><img src="https://img.shields.io/badge/coverages%3A%20statements-100%25-blue" /></span><span class="coverages-badge" style="margin-right: 10px"><img src="https://img.shields.io/badge/coverages%3A%20branches-100%25-blue" /></span>
+## 引入
+
+全局引入,在 miniprogram 根目录下的`app.json`中配置,局部引入,在需要引入的页面或组件的`index.json`中配置。
+
+```json
+"usingComponents": {
+"t-back-top": "tdesign-miniprogram/back-top/back-top",
+}
+```
+
+## 代码演示
+
+<img src="https://tdesign.gtimg.com/miniprogram/readme/backtop-1.png" width="375px" height="50%">
+
+### 基础返回顶部
+
+{{ base }}
+
+## API
+### BackTop Props
+
+名称 | 类型 | 默认值 | 说明 | 必传
+-- | -- | -- | -- | --
+external-classes | Array | - | 组件类名,分别用于设置外层元素、图标、文本内容等元素类名。`['t-class', 't-class-icon', 't-class-text']` | N
+fixed | Boolean | true | 是否绝对定位固定到屏幕右下方 | N
+icon | String / Boolean / Object / Slot | true | 图标。值为 `false` 表示不显示图标。不传表示使用默认图标 `'backtop'` | N
+text | String | '' | 文案 | N
+theme | String | round | 预设的样式类型。可选项:round/half-round/round-dark/half-round-dark | N
+
+### BackTop Events
+
+名称 | 参数 | 描述
+-- | -- | --
+to-top | \- | 点击触发

+ 24 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/back-top/back-top.d.ts

@@ -0,0 +1,24 @@
+import { SuperComponent, RelationsOptions } from '../common/src/index';
+export default class BackTop extends SuperComponent {
+    externalClasses: string[];
+    options: {
+        multipleSlots: boolean;
+    };
+    properties: import("./type").TdBackTopProps;
+    relations: RelationsOptions;
+    data: {
+        prefix: string;
+        classPrefix: string;
+        _icon: any;
+    };
+    observers: {
+        icon(): void;
+    };
+    lifetimes: {
+        ready(): void;
+    };
+    methods: {
+        setIcon(v: any): void;
+        toTop(): void;
+    };
+}

+ 67 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/back-top/back-top.js

@@ -0,0 +1,67 @@
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+    return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+import { SuperComponent, wxComponent } from '../common/src/index';
+import config from '../common/config';
+import props from './props';
+import { calcIcon } from '../common/utils';
+const { prefix } = config;
+const name = `${prefix}-back-top`;
+let BackTop = class BackTop extends SuperComponent {
+    constructor() {
+        super(...arguments);
+        this.externalClasses = [`${prefix}-class`, `${prefix}-class-icon`, `${prefix}-class-text`];
+        this.options = {
+            multipleSlots: true,
+        };
+        this.properties = props;
+        this.relations = {
+            '../pull-down-refresh/pull-down-refresh': {
+                type: 'ancestor',
+            },
+        };
+        this.data = {
+            prefix,
+            classPrefix: name,
+            _icon: null,
+        };
+        this.observers = {
+            icon() {
+                this.setIcon();
+            },
+        };
+        this.lifetimes = {
+            ready() {
+                const { icon } = this.properties;
+                this.setIcon(icon);
+            },
+        };
+        this.methods = {
+            setIcon(v) {
+                this.setData({
+                    _icon: calcIcon(v, 'backtop'),
+                });
+            },
+            toTop() {
+                var _a;
+                this.triggerEvent('to-top');
+                if (this.$parent) {
+                    (_a = this.$parent) === null || _a === void 0 ? void 0 : _a.setScrollTop(0);
+                }
+                else {
+                    wx.pageScrollTo({
+                        scrollTop: 0,
+                        duration: 300,
+                    });
+                }
+            },
+        };
+    }
+};
+BackTop = __decorate([
+    wxComponent()
+], BackTop);
+export default BackTop;

+ 6 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/back-top/back-top.json

@@ -0,0 +1,6 @@
+{
+  "component": true,
+  "usingComponents": {
+    "t-icon": "../icon/icon"
+  }
+}

+ 16 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/back-top/back-top.wxml

@@ -0,0 +1,16 @@
+<import src="../common/template/icon.wxml" />
+<wxs src="../common/utils.wxs" module="_" />
+
+<view
+  style="{{_._style([style, customStyle])}}"
+  class="class {{prefix}}-class {{_.cls(classPrefix, [['fixed', fixed], theme])}}"
+  bindtap="toTop"
+  aria-role="button"
+>
+  <view class="{{classPrefix}}__icon" aria-hidden>
+    <slot name="icon" />
+    <template wx:if="{{_icon}}" is="icon" data="{{tClass: prefix + '-class-icon', ..._icon }}" />
+  </view>
+  <view wx:if="{{!!text}}" class="{{classPrefix}}__text--{{theme}} {{prefix}}-class-text">{{text}}</view>
+  <slot />
+</view>

+ 89 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/back-top/back-top.wxss

@@ -0,0 +1,89 @@
+.t-float-left {
+  float: left;
+}
+.t-float-right {
+  float: right;
+}
+@keyframes tdesign-fade-out {
+  from {
+    opacity: 1;
+  }
+  to {
+    opacity: 0;
+  }
+}
+.hotspot-expanded.relative {
+  position: relative;
+}
+.hotspot-expanded::after {
+  content: '';
+  display: block;
+  position: absolute;
+  left: 0;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  transform: scale(1.5);
+}
+.t-back-top {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  background-color: transparent;
+  overflow: hidden;
+  box-sizing: border-box;
+  transition: height 0.2s;
+  height: auto;
+}
+.t-back-top--fixed {
+  position: fixed;
+  right: var(--td-spacer, 16rpx);
+  bottom: var(--td-spacer-2, 32rpx);
+}
+.t-back-top--round,
+.t-back-top--round-dark {
+  width: 96rpx;
+  height: 96rpx;
+  border-radius: var(--td-back-top-round-border-radius, var(--td-radius-circle, 50%));
+}
+.t-back-top--round,
+.t-back-top--half-round {
+  color: var(--td-back-top-round-color, var(--td-font-gray-1, rgba(0, 0, 0, 0.9)));
+  border: 1rpx solid var(--td-back-top-round-border-color, var(--td-component-border, var(--td-gray-color-4, #dcdcdc)));
+  background-color: var(--td-back-top-round-bg-color, var(--td-font-white-1, #ffffff));
+}
+.t-back-top--round-dark,
+.t-back-top--half-round-dark {
+  color: var(--td-back-top-round-dark-color, var(--td-font-white-1, #ffffff));
+  background-color: var(--td-back-top-round-dark-bg-color, var(--td-gray-color-14, #181818));
+}
+.t-back-top--half-round,
+.t-back-top--half-round-dark {
+  width: 120rpx;
+  height: 80rpx;
+  border-radius: var(--td-back-top-half-round-border-radius, var(--td-radius-round, 999px)) 0 0 var(--td-back-top-half-round-border-radius, var(--td-radius-round, 999px));
+  flex-direction: row;
+  right: 0;
+}
+.t-back-top__text--round,
+.t-back-top__text--round-dark,
+.t-back-top__text--half-round,
+.t-back-top__text--half-round-dark {
+  font-size: var(--td-font-size, 20rpx);
+  line-height: 24rpx;
+}
+.t-back-top__text--half-round,
+.t-back-top__text--half-round-dark {
+  width: 2em;
+}
+.t-back-top__icon:not(:empty) + .t-back-top__text--half-round,
+.t-back-top__icon:not(:empty) + .t-back-top__text--half-round-dark {
+  margin-left: 8rpx;
+}
+.t-back-top__icon {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  font-size: 44rpx;
+}

+ 3 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/back-top/props.d.ts

@@ -0,0 +1,3 @@
+import { TdBackTopProps } from './type';
+declare const props: TdBackTopProps;
+export default props;

+ 22 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/back-top/props.js

@@ -0,0 +1,22 @@
+const props = {
+    externalClasses: {
+        type: Array,
+    },
+    fixed: {
+        type: Boolean,
+        value: true,
+    },
+    icon: {
+        type: null,
+        value: true,
+    },
+    text: {
+        type: String,
+        value: '',
+    },
+    theme: {
+        type: String,
+        value: 'round',
+    },
+};
+export default props;

+ 26 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/back-top/type.d.ts

@@ -0,0 +1,26 @@
+export interface TdBackTopProps {
+    style?: {
+        type: StringConstructor;
+        value?: string;
+    };
+    externalClasses?: {
+        type: ArrayConstructor;
+        value?: ['t-class', 't-class-icon', 't-class-text'];
+    };
+    fixed?: {
+        type: BooleanConstructor;
+        value?: boolean;
+    };
+    icon?: {
+        type: null;
+        value?: boolean | string | object;
+    };
+    text?: {
+        type: StringConstructor;
+        value?: string;
+    };
+    theme?: {
+        type: StringConstructor;
+        value?: 'round' | 'half-round' | 'round-dark' | 'half-round-dark';
+    };
+}

+ 1 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/back-top/type.js

@@ -0,0 +1 @@
+export {};

+ 17 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/badge/README.en-US.md

@@ -0,0 +1,17 @@
+:: BASE_DOC ::
+
+## API
+### Badge Props
+
+name | type | default | description | required
+-- | -- | -- | -- | --
+color | String | - | \- | N
+content | String | - | \- | N
+count | String / Number / Slot | 0 | \- | N
+dot | Boolean | false | \- | N
+external-classes | Array | - | `['t-class', 't-class-content', 't-class-count']` | N
+max-count | Number | 99 | \- | N
+offset | Array | - | Typescript:`Array<string \| number>` | N
+shape | String | circle | options:circle/round/ribbon/bubble | N
+show-zero | Boolean | false | \- | N
+size | String | medium | options:small/medium | N

+ 47 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/badge/README.md

@@ -0,0 +1,47 @@
+---
+title: Badge 徽标
+description: 用于告知用户,该区域的状态变化或者待处理任务的数量。
+spline: data
+isComponent: true
+---
+
+<span class="coverages-badge" style="margin-right: 10px"><img src="https://img.shields.io/badge/coverages%3A%20lines-100%25-blue" /></span><span class="coverages-badge" style="margin-right: 10px"><img src="https://img.shields.io/badge/coverages%3A%20functions-100%25-blue" /></span><span class="coverages-badge" style="margin-right: 10px"><img src="https://img.shields.io/badge/coverages%3A%20statements-100%25-blue" /></span><span class="coverages-badge" style="margin-right: 10px"><img src="https://img.shields.io/badge/coverages%3A%20branches-100%25-blue" /></span>
+## 引入
+
+全局引入,在 miniprogram 根目录下的`app.json`中配置,局部引入,在需要引入的页面或组件的`index.json`中配置。
+
+```json
+"usingComponents": {
+  "t-badge": "tdesign-miniprogram/badge/badge"
+}
+```
+
+## 代码演示
+
+### 组件类型
+
+{{ base }}
+
+### 组件样式
+
+{{ theme }}
+
+### 组件尺寸
+
+{{ size }}
+
+## API
+### Badge Props
+
+名称 | 类型 | 默认值 | 说明 | 必传
+-- | -- | -- | -- | --
+color | String | - | 颜色 | N
+content | String | - | 徽标内容,示例:`content='自定义内容'`。也可以使用默认插槽定义 | N
+count | String / Number / Slot | 0 | 徽标右上角内容。可以是数字,也可以是文字。如:'new'/3/99+。特殊:值为空表示使用插槽渲染 | N
+dot | Boolean | false | 是否为红点 | N
+external-classes | Array | - | 组件类名,分别用于设置外层元素、默认内容、右上角内容等元素类名。`['t-class', 't-class-content', 't-class-count']` | N
+max-count | Number | 99 | 封顶的数字值 | N
+offset | Array | - | 设置状态点的位置偏移,示例:[-10, 20] 或 ['10em', '8rem']。TS 类型:`Array<string \| number>` | N
+shape | String | circle | 形状。可选项:circle/round/ribbon/bubble | N
+show-zero | Boolean | false | 当数值为 0 时,是否展示徽标 | N
+size | String | medium | 尺寸。可选项:small/medium | N

+ 21 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/badge/badge.d.ts

@@ -0,0 +1,21 @@
+import { SuperComponent } from '../common/src/index';
+import type { TdBadgeProps } from './type';
+export interface BadgeProps extends TdBadgeProps {
+}
+export default class Badge extends SuperComponent {
+    options: {
+        multipleSlots: boolean;
+    };
+    externalClasses: string[];
+    properties: TdBadgeProps;
+    data: {
+        prefix: string;
+        classPrefix: string;
+        value: string;
+        labelID: string;
+        descriptionID: string;
+    };
+    lifetimes: {
+        ready(): void;
+    };
+}

+ 43 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/badge/badge.js

@@ -0,0 +1,43 @@
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+    return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+import { SuperComponent, wxComponent } from '../common/src/index';
+import config from '../common/config';
+import props from './props';
+import { uniqueFactory } from '../common/utils';
+const { prefix } = config;
+const name = `${prefix}-badge`;
+const getUniqueID = uniqueFactory('badge');
+let Badge = class Badge extends SuperComponent {
+    constructor() {
+        super(...arguments);
+        this.options = {
+            multipleSlots: true,
+        };
+        this.externalClasses = [`${prefix}-class`, `${prefix}-class-count`, `${prefix}-class-content`];
+        this.properties = props;
+        this.data = {
+            prefix,
+            classPrefix: name,
+            value: '',
+            labelID: '',
+            descriptionID: '',
+        };
+        this.lifetimes = {
+            ready() {
+                const uniqueID = getUniqueID();
+                this.setData({
+                    labelID: `${uniqueID}_label`,
+                    descriptionID: `${uniqueID}_description`,
+                });
+            },
+        };
+    }
+};
+Badge = __decorate([
+    wxComponent()
+], Badge);
+export default Badge;

+ 5 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/badge/badge.json

@@ -0,0 +1,5 @@
+{
+  "component": true,
+  "usingComponents": {}
+}
+

+ 44 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/badge/badge.wxml

@@ -0,0 +1,44 @@
+<wxs src="./badge.wxs" module="this" />
+<wxs src="../common/utils.wxs" module="_" />
+
+<!--
+  1. labelID 用于描述当前元素的文本
+  2. descriptionID 用于描述badge消息的文本
+  3. role=option一般用于多个内容合并焦点连续朗读
+-->
+
+<view
+  style="{{_._style([style, customStyle])}}"
+  class="{{this.getBadgeOuterClass({shape})}} class {{prefix}}-class"
+  aria-labelledby="{{labelID}}"
+  aria-describedby="{{descriptionID}}"
+  aria-role="{{ ariaRole || 'option'}}"
+>
+  <view id="{{labelID}}" class="{{classPrefix}}__content {{prefix}}-class-content" aria-hidden="true">
+    <slot wx:if="{{!content}}" class="{{classPrefix}}__content-slot" />
+    <text wx:else class="{{classPrefix}}__content-text">{{content}}</text>
+  </view>
+  <view
+    aria-hidden="true"
+    aria-label="{{ ariaLabel || _.getBadgeAriaLabel({dot, count, maxCount}) }}"
+    wx:if="{{this.isShowBadge({dot,count,showZero})}}"
+    id="{{descriptionID}}"
+    class="{{this.getBadgeInnerClass({dot, size, shape, count})}} {{prefix}}-has-count {{prefix}}-class-count"
+    style="{{this.getBadgeStyles({color, offset})}}"
+    aria-hidden="true"
+    aria-label="{{ ariaLabel || _.getBadgeAriaLabel({dot, count, maxCount}) }}"
+  >
+    <view
+      wx:if="{{shape == 'ribbon'}}"
+      class="t-badge__ribbon--before"
+      style="{{color ? 'border-color: ' + color : ''}}"
+    />
+    {{ this.getBadgeValue({dot, count, maxCount}) }}
+    <view
+      wx:if="{{shape == 'ribbon'}}"
+      class="t-badge__ribbon--after"
+      style="{{color ? 'border-color: ' + color : ''}}"
+    />
+  </view>
+  <slot name="count" />
+</view>

+ 70 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/badge/badge.wxs

@@ -0,0 +1,70 @@
+var getBadgeValue = function (props) {
+  if (props.dot) {
+    return '';
+  }
+  if (isNaN(props.count) || isNaN(props.maxCount)) {
+    return props.count;
+  }
+  return parseInt(props.count) > props.maxCount ? props.maxCount + '+' : props.count;
+};
+
+var hasUnit = function (unit) {
+  return (
+    unit.indexOf('px') > 0 ||
+    unit.indexOf('rpx') > 0 ||
+    unit.indexOf('em') > 0 ||
+    unit.indexOf('rem') > 0 ||
+    unit.indexOf('%') > 0 ||
+    unit.indexOf('vh') > 0 ||
+    unit.indexOf('vm') > 0
+  );
+};
+
+var getBadgeStyles = function (props) {
+  var styleStr = '';
+  if (props.color) {
+    styleStr += 'background:' + props.color + ';';
+  }
+  if (props.offset[0]) {
+    styleStr += 'right:' + (hasUnit(props.offset[0].toString()) ? props.offset[0] : props.offset[0] + 'px') + ';';
+  }
+  if (props.offset[1]) {
+    styleStr += 'top:' + (hasUnit(props.offset[1].toString()) ? props.offset[1] : props.offset[1] + 'px') + ';';
+  }
+  return styleStr;
+};
+
+var getBadgeOuterClass = function (props) {
+  var baseClass = 't-badge';
+  var classNames = [baseClass, props.shape === 'ribbon' ? baseClass + '__ribbon-outer' : ''];
+  return classNames.join(' ');
+};
+
+var getBadgeInnerClass = function (props) {
+  var baseClass = 't-badge';
+  var classNames = [
+    baseClass + '--basic',
+    props.dot ? baseClass + '--dot' : '',
+    baseClass + '--' + props.size,
+    baseClass + '--' + props.shape,
+    !props.dot && props.count ? baseClass + '--count' : '',
+  ];
+  return classNames.join(' ');
+};
+
+var isShowBadge = function (props) {
+  if (props.dot) {
+    return true;
+  }
+  if (!props.showZero && !isNaN(props.count) && parseInt(props.count) === 0) {
+    return false;
+  }
+  if (props.count == null) return false;
+  return true;
+};
+
+module.exports.getBadgeValue = getBadgeValue;
+module.exports.getBadgeStyles = getBadgeStyles;
+module.exports.getBadgeOuterClass = getBadgeOuterClass;
+module.exports.getBadgeInnerClass = getBadgeInnerClass;
+module.exports.isShowBadge = isShowBadge;

+ 108 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/badge/badge.wxss

@@ -0,0 +1,108 @@
+.t-float-left {
+  float: left;
+}
+.t-float-right {
+  float: right;
+}
+@keyframes tdesign-fade-out {
+  from {
+    opacity: 1;
+  }
+  to {
+    opacity: 0;
+  }
+}
+.hotspot-expanded.relative {
+  position: relative;
+}
+.hotspot-expanded::after {
+  content: '';
+  display: block;
+  position: absolute;
+  left: 0;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  transform: scale(1.5);
+}
+.t-badge {
+  position: relative;
+  display: inline-block;
+  vertical-align: top;
+}
+.t-badge--basic {
+  z-index: 100;
+  padding: 0 var(--td-badge-basic-padding, 8rpx);
+  font-size: var(--td-badge-font-size, var(--td-font-size-xs, var(--td-font-size, 20rpx)));
+  color: var(--td-badge-text-color, var(--td-font-white-1, #ffffff));
+  background-color: var(--td-badge-bg-color, var(--td-error-color, var(--td-error-color-6, #d54941)));
+  text-align: center;
+  height: var(--td-badge-basic-height, 32rpx);
+  line-height: var(--td-badge-basic-height, 32rpx);
+  font-weight: var(--td-badge-font-weight, 600);
+  border-radius: var(--td-badge-border-radius, 4rpx);
+}
+.t-badge--dot {
+  height: var(--td-badge-dot-size, 16rpx);
+  border-radius: 50%;
+  min-width: var(--td-badge-dot-size, 16rpx);
+  padding: 0;
+}
+.t-badge--count {
+  min-width: var(--td-badge-basic-width, 32rpx);
+  white-space: nowrap;
+  box-sizing: border-box;
+}
+.t-badge--circle {
+  border-radius: calc(var(--td-badge-basic-height, 32rpx) / 2);
+}
+.t-badge__ribbon-outer {
+  position: absolute;
+  top: 0;
+  right: 0;
+}
+.t-badge__ribbon--before,
+.t-badge__ribbon--after {
+  content: '';
+  position: absolute;
+  width: 0;
+  height: 0;
+  bottom: 0;
+  border-bottom: var(--td-badge-basic-height, 32rpx) solid var(--td-badge-bg-color, var(--td-error-color, var(--td-error-color-6, #d54941)));
+}
+.t-badge__ribbon--before {
+  left: calc(-1 * var(--td-badge-basic-height, 32rpx) + 1rpx);
+  border-left: var(--td-badge-basic-height, 32rpx) solid transparent;
+}
+.t-badge__ribbon--after {
+  right: calc(-1 * var(--td-badge-basic-height, 32rpx) + 1rpx);
+  border-right: var(--td-badge-basic-height, 32rpx) solid transparent;
+}
+.t-badge--ribbon {
+  display: inline-block;
+  transform: rotate(45deg);
+  border-radius: 0;
+}
+.t-badge--bubble {
+  border-radius: var(--td-badge-bubble-border-radius, 20rpx 20rpx 20rpx 1px);
+}
+.t-badge--large {
+  font-size: var(--td-badge-large-font-size, var(--td-font-size-s, 24rpx));
+  height: var(--td-badge-large-height, 40rpx);
+  min-width: var(--td-badge-large-height, 40rpx);
+  line-height: var(--td-badge-large-height, 40rpx);
+  padding: 0 var(--td-badge-large-padding, 10rpx);
+}
+.t-badge--large.t-badge--circle {
+  border-radius: calc(var(--td-badge-large-height, 40rpx) / 2);
+}
+.t-badge__content:not(:empty) + .t-has-count {
+  transform: translate(50%, -50%);
+  position: absolute;
+  right: 0;
+  top: 0;
+}
+.t-badge__content-text {
+  display: block;
+  line-height: 48rpx;
+}

+ 3 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/badge/index.d.ts

@@ -0,0 +1,3 @@
+export * from './type';
+export * from './props';
+export * from './badge';

+ 3 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/badge/index.js

@@ -0,0 +1,3 @@
+export * from './type';
+export * from './props';
+export * from './badge';

+ 3 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/badge/props.d.ts

@@ -0,0 +1,3 @@
+import { TdBadgeProps } from './type';
+declare const props: TdBadgeProps;
+export default props;

+ 41 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/badge/props.js

@@ -0,0 +1,41 @@
+const props = {
+    color: {
+        type: String,
+        value: '',
+    },
+    content: {
+        type: String,
+        value: '',
+    },
+    count: {
+        type: null,
+        value: 0,
+    },
+    dot: {
+        type: Boolean,
+        value: false,
+    },
+    externalClasses: {
+        type: Array,
+    },
+    maxCount: {
+        type: Number,
+        value: 99,
+    },
+    offset: {
+        type: Array,
+    },
+    shape: {
+        type: String,
+        value: 'circle',
+    },
+    showZero: {
+        type: Boolean,
+        value: false,
+    },
+    size: {
+        type: String,
+        value: 'medium',
+    },
+};
+export default props;

+ 46 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/badge/type.d.ts

@@ -0,0 +1,46 @@
+export interface TdBadgeProps {
+    color?: {
+        type: StringConstructor;
+        value?: string;
+    };
+    content?: {
+        type: StringConstructor;
+        value?: string;
+    };
+    count?: {
+        type: null;
+        value?: string | number;
+    };
+    style?: {
+        type: StringConstructor;
+        value?: string;
+    };
+    dot?: {
+        type: BooleanConstructor;
+        value?: boolean;
+    };
+    externalClasses?: {
+        type: ArrayConstructor;
+        value?: ['t-class', 't-class-content', 't-class-count'];
+    };
+    maxCount?: {
+        type: NumberConstructor;
+        value?: number;
+    };
+    offset?: {
+        type: ArrayConstructor;
+        value?: Array<string | number>;
+    };
+    shape?: {
+        type: StringConstructor;
+        value?: 'circle' | 'round' | 'ribbon' | 'bubble';
+    };
+    showZero?: {
+        type: BooleanConstructor;
+        value?: boolean;
+    };
+    size?: {
+        type: StringConstructor;
+        value?: 'small' | 'medium';
+    };
+}

+ 1 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/badge/type.js

@@ -0,0 +1 @@
+export {};

+ 46 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/button/README.en-US.md

@@ -0,0 +1,46 @@
+:: BASE_DOC ::
+
+## API
+### Button Props
+
+name | type | default | description | required
+-- | -- | -- | -- | --
+block | Boolean | false | make button to be a block-level element | N
+content | String / Slot | - | button's children elements | N
+custom-dataset | Object | - | Typescript:`any` | N
+disabled | Boolean | false | disable the button, make it can not be clicked | N
+external-classes | Array | - | `['t-class', 't-class-icon', 't-class-loading']` | N
+ghost | Boolean | false | make background-color to be transparent | N
+icon | String / Object | - | icon name | N
+loading | Boolean | false | set button to be loading state | N
+loading-props | Object | - | Typescript:`LoadingProps`,[Loading API Documents](./loading?tab=api)。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/button/type.ts) | N
+shape | String | rectangle | button shape。options:rectangle/square/round/circle | N
+size | String | medium | a button has three size。options:small/medium/large。Typescript:`SizeEnum` | N
+suffix | Slot | - | \- | N
+theme | String | default | button theme。options:default/primary/danger | N
+type | String | - | type of button element, same as formType of Miniprogram。options:submit/reset | N
+variant | String | base | button variant。options:base/outline/text | N
+open-type | String | - | options:contact/share/getPhoneNumber/getUserInfo/launchApp/openSetting/feedback/chooseAvatar | N
+hover-stop-propagation | Boolean | false | \- | N
+hover-start-time | Number | 20 | \- | N
+hover-stay-time | Number | 70 | \- | N
+lang | String | en | options:en/zh_CN/zh_TW | N
+session-from | String | - | \- | N
+send-message-title | String | 当前标题 | \- | N
+send-message-path | String | 当前分享路径 | \- | N
+send-message-img | String | 截图 | \- | N
+app-parameter | String | - | \- | N
+show-message-card | Boolean | false | \- | N
+bindgetuserinfo | Eventhandle | - | \- | N
+bindcontact | Eventhandle | - | \- | N
+bindgetphonenumber | Eventhandle | - | \- | N
+binderror | Eventhandle | - | \- | N
+bindopensetting | Eventhandle | - | \- | N
+bindlaunchapp | Eventhandle | - | \- | N
+bindchooseavatar | Eventhandle | - | \- | N
+
+### Button Events
+
+name | params | description
+-- | -- | --
+tap | `(e: MouseEvent)` | trigger on click

+ 107 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/button/README.md

@@ -0,0 +1,107 @@
+---
+title: Button 按钮
+description: 用于开启一个闭环的操作任务,如“删除”对象、“购买”商品等。
+spline: base
+isComponent: true
+---
+
+<span class="coverages-badge" style="margin-right: 10px"><img src="https://img.shields.io/badge/coverages%3A%20lines-100%25-blue" /></span><span class="coverages-badge" style="margin-right: 10px"><img src="https://img.shields.io/badge/coverages%3A%20functions-100%25-blue" /></span><span class="coverages-badge" style="margin-right: 10px"><img src="https://img.shields.io/badge/coverages%3A%20statements-100%25-blue" /></span><span class="coverages-badge" style="margin-right: 10px"><img src="https://img.shields.io/badge/coverages%3A%20branches-83%25-blue" /></span>
+## 引入
+
+全局引入,在 miniprogram 根目录下的`app.json`中配置,局部引入,在需要引入的页面或组件的`index.json`中配置。
+
+```json
+"usingComponents": {
+  "t-button": "tdesign-miniprogram/button/button"
+}
+```
+
+## 代码演示
+
+### 01 组件类型
+
+基础按钮
+
+{{ base }}
+
+图标按钮
+
+{{ icon-btn }}
+
+幽灵按钮
+
+{{ ghost-btn }}
+
+组合按钮
+
+{{ group-btn }}
+
+通栏按钮
+
+{{ block-btn }}
+
+### 02 组件状态
+
+按钮禁用态
+
+{{ disabled }}
+
+### 03 组件样式
+
+按钮尺寸
+
+{{ size }}
+
+按钮形状
+
+{{ shape }}
+
+按钮主题
+
+{{ theme }}
+
+## API
+### Button Props
+
+名称 | 类型 | 默认值 | 说明 | 必传
+-- | -- | -- | -- | --
+block | Boolean | false | 是否为块级元素 | N
+content | String / Slot | - | 按钮内容 | N
+custom-dataset | Object | - | 自定义 dataset,可通过 event.currentTarget.dataset.custom 获取。TS 类型:`any` | N
+disabled | Boolean | false | 禁用状态 | N
+external-classes | Array | - | 组件类名。`['t-class', 't-class-icon', 't-class-loading']` | N
+ghost | Boolean | false | 是否为幽灵按钮(镂空按钮) | N
+icon | String / Object | - | 图标名称。值为字符串表示图标名称,值为 `Object` 类型,表示透传至 `icon`。 | N
+loading | Boolean | false | 是否显示为加载状态 | N
+loading-props | Object | - | 透传至 Loading 组件。TS 类型:`LoadingProps`,[Loading API Documents](./loading?tab=api)。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/button/type.ts) | N
+shape | String | rectangle | 按钮形状,有 4 种:长方形、正方形、圆角长方形、圆形。可选项:rectangle/square/round/circle | N
+size | String | medium | 组件尺寸。可选项:extra-small/small/medium/large。TS 类型:`SizeEnum` | N
+suffix | Slot | - | 右侧内容,可用于定义右侧图标 | N
+theme | String | default | 组件风格,依次为品牌色、危险色。可选项:default/primary/danger/light | N
+type | String | - | 同小程序的 formType。可选项:submit/reset | N
+variant | String | base | 按钮形式,基础、线框、文字。可选项:base/outline/dashed/text | N
+open-type | String | - | 微信开放能力。<br />具体释义:<br />`contact` 打开客服会话,如果用户在会话中点击消息卡片后返回小程序,可以从 bindcontact 回调中获得具体信息,<a href="https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/customer-message/customer-message.html">具体说明</a> (*小程序插件中不能使用*);<br />`share` 触发用户转发,使用前建议先阅读<a href="https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/share.html#使用指引">使用指引</a>;<br />`getPhoneNumber` 获取用户手机号,可以从 bindgetphonenumber 回调中获取到用户信息,<a href="https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html">具体说明</a> (*小程序插件中不能使用*);<br />`getUserInfo` 获取用户信息,可以从 bindgetuserinfo 回调中获取到用户信息 (*小程序插件中不能使用*);<br />`launchApp` 打开APP,可以通过 app-parameter 属性设定向 APP 传的参数<a href="https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/launchApp.html">具体说明</a>;<br />`openSetting` 打开授权设置页;<br />`feedback` 打开“意见反馈”页面,用户可提交反馈内容并上传<a href="https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/wx.getLogManager.html">日志</a>,开发者可以登录<a href="https://mp.weixin.qq.com/">小程序管理后台</a>后进入左侧菜单“客服反馈”页面获取到反馈内容;<br />`chooseAvatar` 获取用户头像,可以从 bindchooseavatar 回调中获取到头像信息。<br />[小程序官方文档](https://developers.weixin.qq.com/miniprogram/dev/component/button.html)。可选项:contact/share/getPhoneNumber/getUserInfo/launchApp/openSetting/feedback/chooseAvatar | N
+hover-class | String | '' | 指定按钮按下去的样式类,按钮不为加载或禁用状态时有效。当 `hover-class="none"` 时,没有点击态效果 | N
+hover-stop-propagation | Boolean | false | 指定是否阻止本节点的祖先节点出现点击态 | N
+hover-start-time | Number | 20 | 按住后多久出现点击态,单位毫秒 | N
+hover-stay-time | Number | 70 | 手指松开后点击态保留时间,单位毫秒 | N
+lang | String | en | 指定返回用户信息的语言,zh_CN 简体中文,zh_TW 繁体中文,en 英文。。<br />具体释义:<br />`en` 英文;<br />`zh_CN` 简体中文;<br />`zh_TW` 繁体中文。<br />[小程序官方文档](https://developers.weixin.qq.com/miniprogram/dev/component/button.html)。可选项:en/zh_CN/zh_TW | N
+session-from | String | - | 会话来源,open-type="contact"时有效 | N
+send-message-title | String | 当前标题 | 会话内消息卡片标题,open-type="contact"时有效 | N
+send-message-path | String | 当前分享路径 | 会话内消息卡片点击跳转小程序路径,open-type="contact"时有效 | N
+send-message-img | String | 截图 | 会话内消息卡片图片,open-type="contact"时有效 | N
+app-parameter | String | - | 打开 APP 时,向 APP 传递的参数,open-type=launchApp时有效 | N
+show-message-card | Boolean | false | 是否显示会话内消息卡片,设置此参数为 true,用户进入客服会话会在右下角显示"可能要发送的小程序"提示,用户点击后可以快速发送小程序消息,open-type="contact"时有效 | N
+bindgetuserinfo | Eventhandle | - | 用户点击该按钮时,会返回获取到的用户信息,回调的 detail 数据与<a href="https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserInfo.html">wx.getUserInfo</a>返回的一致,open-type="getUserInfo"时有效 | N
+bindcontact | Eventhandle | - | 客服消息回调,open-type="contact"时有效 | N
+bindgetphonenumber | Eventhandle | - | 获取用户手机号回调,open-type=getPhoneNumber时有效 | N
+binderror | Eventhandle | - | 当使用开放能力时,发生错误的回调,open-type=launchApp时有效 | N
+bindopensetting | Eventhandle | - | 在打开授权设置页后回调,open-type=openSetting时有效 | N
+bindlaunchapp | Eventhandle | - | 打开 APP 成功的回调,open-type=launchApp时有效 | N
+bindchooseavatar | Eventhandle | - | 获取用户头像回调,open-type=chooseAvatar时有效 | N
+
+### Button Events
+
+名称 | 参数 | 描述
+-- | -- | --
+tap | `event` | 点击按钮,当按钮不为加载或禁用状态时触发

+ 35 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/button/button.d.ts

@@ -0,0 +1,35 @@
+import { SuperComponent } from '../common/src/index';
+import type { TdButtonProps } from './type';
+export interface ButtonProps extends TdButtonProps {
+}
+export default class Button extends SuperComponent {
+    externalClasses: string[];
+    behaviors: string[];
+    properties: TdButtonProps;
+    options: {
+        multipleSlots: boolean;
+    };
+    data: {
+        prefix: string;
+        className: string;
+        classPrefix: string;
+    };
+    observers: {
+        'theme, size, plain, block, shape, disabled, loading'(): void;
+        icon(icon: any): void;
+    };
+    lifetimes: {
+        attached(): void;
+    };
+    methods: {
+        setClass(): void;
+        getuserinfo(e: any): void;
+        contact(e: any): void;
+        getphonenumber(e: any): void;
+        error(e: any): void;
+        opensetting(e: any): void;
+        launchapp(e: any): void;
+        chooseavatar(e: any): void;
+        handleTap(e: any): void;
+    };
+}

+ 97 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/button/button.js

@@ -0,0 +1,97 @@
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+    return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+import { SuperComponent, wxComponent } from '../common/src/index';
+import config from '../common/config';
+import props from './props';
+import { canIUseFormFieldButton } from '../common/version';
+import { setIcon } from '../common/utils';
+const { prefix } = config;
+const name = `${prefix}-button`;
+let Button = class Button extends SuperComponent {
+    constructor() {
+        super(...arguments);
+        this.externalClasses = [`${prefix}-class`, `${prefix}-class-icon`, `${prefix}-class-loading`];
+        this.behaviors = canIUseFormFieldButton() ? ['wx://form-field-button'] : [];
+        this.properties = props;
+        this.options = {
+            multipleSlots: true,
+        };
+        this.data = {
+            prefix,
+            className: '',
+            classPrefix: name,
+        };
+        this.observers = {
+            'theme, size, plain, block, shape, disabled, loading'() {
+                this.setClass();
+            },
+            icon(icon) {
+                const obj = setIcon('icon', icon, '');
+                this.setData(Object.assign({}, obj));
+            },
+        };
+        this.lifetimes = {
+            attached() {
+                this.setClass();
+            },
+        };
+        this.methods = {
+            setClass() {
+                const classList = [
+                    name,
+                    `${prefix}-class`,
+                    `${name}--${this.data.variant || 'base'}`,
+                    `${name}--${this.data.theme || 'default'}`,
+                    `${name}--${this.data.shape || 'rectangle'}`,
+                    `${name}--size-${this.data.size || 'medium'}`,
+                ];
+                if (this.data.block) {
+                    classList.push(`${name}--block`);
+                }
+                if (this.data.disabled) {
+                    classList.push(`${name}--disabled`);
+                }
+                if (this.data.ghost) {
+                    classList.push(`${name}--ghost`);
+                }
+                this.setData({
+                    className: classList.join(' '),
+                });
+            },
+            getuserinfo(e) {
+                this.triggerEvent('getuserinfo', e.detail);
+            },
+            contact(e) {
+                this.triggerEvent('contact', e.detail);
+            },
+            getphonenumber(e) {
+                this.triggerEvent('getphonenumber', e.detail);
+            },
+            error(e) {
+                this.triggerEvent('error', e.detail);
+            },
+            opensetting(e) {
+                this.triggerEvent('opensetting', e.detail);
+            },
+            launchapp(e) {
+                this.triggerEvent('launchapp', e.detail);
+            },
+            chooseavatar(e) {
+                this.triggerEvent('chooseavatar', e.detail);
+            },
+            handleTap(e) {
+                if (this.data.disabled || this.data.loading)
+                    return;
+                this.triggerEvent('tap', e);
+            },
+        };
+    }
+};
+Button = __decorate([
+    wxComponent()
+], Button);
+export default Button;

+ 7 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/button/button.json

@@ -0,0 +1,7 @@
+{
+  "component": true,
+  "usingComponents": {
+    "t-icon": "../icon/icon",
+    "t-loading": "../loading/loading"
+  }
+}

+ 59 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/button/button.wxml

@@ -0,0 +1,59 @@
+<import src="../common/template/icon.wxml" />
+<wxs src="../common/utils.wxs" module="_" />
+
+<button
+  style="{{_._style([style, customStyle])}}"
+  data-custom="{{ customDataset }}"
+  class="class {{className}}"
+  form-type="{{disabled || loading ? '' : type}}"
+  open-type="{{disabled || loading ? '' : openType}}"
+  hover-stop-propagation="{{hoverStopPropagation}}"
+  hover-start-time="{{hoverStartTime}}"
+  hover-stay-time="{{hoverStayTime}}"
+  lang="{{lang}}"
+  session-from="{{sessionFrom}}"
+  hover-class="{{disabled || loading ? '' : (hoverClass || classPrefix + '--hover')}}"
+  send-message-title="{{sendMessageTitle}}"
+  send-message-path="{{sendMessagePath}}"
+  send-message-img="{{sendMessageImg}}"
+  app-parameter="{{appParameter}}"
+  show-message-card="{{showMessageCard}}"
+  catch:tap="handleTap"
+  bind:getuserinfo="getuserinfo"
+  bind:contact="contact"
+  bind:getphonenumber="getphonenumber"
+  bind:error="error"
+  bind:opensetting="opensetting"
+  bind:launchapp="launchapp"
+  bind:chooseavatar="chooseavatar"
+  aria-label="{{ariaLabel}}"
+>
+  <template
+    wx:if="{{iconName || _.isNoEmptyObj(iconData)}}"
+    is="icon"
+    data="{{class: classPrefix + '__icon', tClass: prefix + '-class-icon', ariaHidden: true, name: iconName, ...iconData}}"
+  />
+  <t-loading
+    wx:if="{{loading}}"
+    delay="{{loadingProps.delay || 0}}"
+    duration="{{loadingProps.duration || 800}}"
+    indicator="{{loadingProps.indicator || true}}"
+    inheritColor="{{loadingProps.indicator || false}}"
+    layout="{{loadingProps.layout || 'horizontal'}}"
+    pause="{{loadingProps.pause || false}}"
+    progress="{{loadingProps.progress || 0}}"
+    reverse="{{loadingProps.reverse || false}}"
+    size="{{loadingProps.size || '40rpx'}}"
+    text="{{loadingProps.text || '' }}"
+    theme="{{loadingProps.theme || 'circular'}}"
+    loading
+    t-class="{{classPrefix}}__loading {{classPrefix}}__loading--wrapper"
+    t-class-indicator="{{classPrefix}}__loading--indicator {{prefix}}-class-loading"
+  />
+  <view class="{{classPrefix}}__content">
+    <slot name="content" />
+    <block>{{content}}</block>
+    <slot />
+  </view>
+  <slot name="suffix" />
+</button>

+ 451 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/button/button.wxss

@@ -0,0 +1,451 @@
+.t-float-left {
+  float: left;
+}
+.t-float-right {
+  float: right;
+}
+@keyframes tdesign-fade-out {
+  from {
+    opacity: 1;
+  }
+  to {
+    opacity: 0;
+  }
+}
+.hotspot-expanded.relative {
+  position: relative;
+}
+.hotspot-expanded::after {
+  content: '';
+  display: block;
+  position: absolute;
+  left: 0;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  transform: scale(1.5);
+}
+.t-button--size-extra-small {
+  font-size: var(--td-button-extra-small-font-size, var(--td-font-size-base, 28rpx));
+  padding-left: var(--td-button-extra-small-padding-horizontal, 16rpx);
+  padding-right: var(--td-button-extra-small-padding-horizontal, 16rpx);
+  height: var(--td-button-extra-small-height, 56rpx);
+  line-height: var(--td-button-extra-small-height, 56rpx);
+}
+.t-button--size-extra-small .t-button__icon {
+  font-size: var(--td-button-extra-small-icon-font-size, 36rpx);
+}
+.t-button--size-small {
+  font-size: var(--td-button-small-font-size, var(--td-font-size-base, 28rpx));
+  padding-left: var(--td-button-small-padding-horizontal, 24rpx);
+  padding-right: var(--td-button-small-padding-horizontal, 24rpx);
+  height: var(--td-button-small-height, 64rpx);
+  line-height: var(--td-button-small-height, 64rpx);
+}
+.t-button--size-small .t-button__icon {
+  font-size: var(--td-button-small-icon-font-size, 36rpx);
+}
+.t-button--size-medium {
+  font-size: var(--td-button-medium-font-size, var(--td-font-size-m, 32rpx));
+  padding-left: var(--td-button-medium-padding-horizontal, 32rpx);
+  padding-right: var(--td-button-medium-padding-horizontal, 32rpx);
+  height: var(--td-button-medium-height, 80rpx);
+  line-height: var(--td-button-medium-height, 80rpx);
+}
+.t-button--size-medium .t-button__icon {
+  font-size: var(--td-button-medium-icon-font-size, 40rpx);
+}
+.t-button--size-large {
+  font-size: var(--td-button-large-font-size, var(--td-font-size-m, 32rpx));
+  padding-left: var(--td-button-large-padding-horizontal, 40rpx);
+  padding-right: var(--td-button-large-padding-horizontal, 40rpx);
+  height: var(--td-button-large-height, 96rpx);
+  line-height: var(--td-button-large-height, 96rpx);
+}
+.t-button--size-large .t-button__icon {
+  font-size: var(--td-button-large-icon-font-size, 48rpx);
+}
+.t-button--default {
+  color: var(--td-button-default-color, var(--td-font-gray-1, rgba(0, 0, 0, 0.9)));
+  background-color: var(--td-button-default-bg-color, var(--td-bg-color-component, var(--td-gray-color-3, #e7e7e7)));
+}
+.t-button--default::after {
+  border-width: var(--td-button-border-width, 4rpx);
+  border-color: var(--td-button-default-border-color, var(--td-bg-color-component, var(--td-gray-color-3, #e7e7e7)));
+}
+.t-button--default.t-button--hover {
+  z-index: 0;
+}
+.t-button--default.t-button--hover::after {
+  background-color: var(--td-button-default-active-bg-color, var(--td-bg-color-component-active, var(--td-gray-color-6, #a6a6a6)));
+  border-color: var(--td-button-default-active-border-color, var(--td-bg-color-component-active, var(--td-gray-color-6, #a6a6a6)));
+}
+.t-button--default.t-button--disabled {
+  color: var(--td-button-default-disabled-color, var(--td-font-gray-4, rgba(0, 0, 0, 0.26)));
+  background-color: var(--td-button-default-disabled-bg, var(--td-bg-color-component-disabled, var(--td-gray-color-2, #eeeeee)));
+}
+.t-button--default.t-button--disabled::after {
+  border-color: var(--td-button-default-disabled-border-color, var(--td-bg-color-component-disabled, var(--td-gray-color-2, #eeeeee)));
+}
+.t-button--primary {
+  color: var(--td-button-primary-color, var(--td-font-white-1, #ffffff));
+  background-color: var(--td-button-primary-bg-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));
+}
+.t-button--primary::after {
+  border-width: var(--td-button-border-width, 4rpx);
+  border-color: var(--td-button-primary-border-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));
+}
+.t-button--primary.t-button--hover {
+  z-index: 0;
+}
+.t-button--primary.t-button--hover::after {
+  background-color: var(--td-button-primary-active-bg-color, var(--td-brand-color-active, var(--td-primary-color-8, #003cab)));
+  border-color: var(--td-button-primary-active-border-color, var(--td-brand-color-active, var(--td-primary-color-8, #003cab)));
+}
+.t-button--primary.t-button--disabled {
+  color: var(--td-button-primary-disabled-color, var(--td-font-white-1, #ffffff));
+  background-color: var(--td-button-primary-disabled-bg, var(--td-brand-color-disabled, var(--td-primary-color-3, #b5c7ff)));
+}
+.t-button--primary.t-button--disabled::after {
+  border-color: var(--td-button-primary-disabled-border-color, var(--td-brand-color-disabled, var(--td-primary-color-3, #b5c7ff)));
+}
+.t-button--light {
+  color: var(--td-button-light-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));
+  background-color: var(--td-button-light-bg-color, var(--td-brand-color-light, var(--td-primary-color-1, #f2f3ff)));
+}
+.t-button--light::after {
+  border-width: var(--td-button-border-width, 4rpx);
+  border-color: var(--td-button-light-border-color, var(--td-brand-color-light, var(--td-primary-color-1, #f2f3ff)));
+}
+.t-button--light.t-button--hover {
+  z-index: 0;
+}
+.t-button--light.t-button--hover::after {
+  background-color: var(--td-button-light-active-bg-color, var(--td-brand-color-light-active, var(--td-primary-color-2, #d9e1ff)));
+  border-color: var(--td-button-light-active-border-color, var(--td-brand-color-light-active, var(--td-primary-color-2, #d9e1ff)));
+}
+.t-button--light.t-button--disabled {
+  color: var(--td-button-light-disabled-color, var(--td-brand-color-disabled, var(--td-primary-color-3, #b5c7ff)));
+  background-color: var(--td-button-light-disabled-bg, var(--td-brand-color-light, var(--td-primary-color-1, #f2f3ff)));
+}
+.t-button--light.t-button--disabled::after {
+  border-color: var(--td-button-light-disabled-border-color, var(--td-brand-color-light, var(--td-primary-color-1, #f2f3ff)));
+}
+.t-button--danger {
+  color: var(--td-button-danger-color, var(--td-font-white-1, #ffffff));
+  background-color: var(--td-button-danger-bg-color, var(--td-error-color, var(--td-error-color-6, #d54941)));
+}
+.t-button--danger::after {
+  border-width: var(--td-button-border-width, 4rpx);
+  border-color: var(--td-button-danger-border-color, var(--td-error-color, var(--td-error-color-6, #d54941)));
+}
+.t-button--danger.t-button--hover {
+  z-index: 0;
+}
+.t-button--danger.t-button--hover::after {
+  background-color: var(--td-button-danger-active-bg-color, var(--td-error-color-7, #ad352f));
+  border-color: var(--td-button-danger-active-border-color, var(--td-error-color-7, #ad352f));
+}
+.t-button--danger.t-button--disabled {
+  color: var(--td-button-danger-disabled-color, var(--td-font-white-1, #ffffff));
+  background-color: var(--td-button-danger-disabled-bg, var(--td-error-color-3, #ffb9b0));
+}
+.t-button--danger.t-button--disabled::after {
+  border-color: var(--td-button-danger-disabled-border-color, var(--td-error-color-3, #ffb9b0));
+}
+.t-button {
+  display: inline-flex;
+  align-items: center;
+  justify-content: center;
+  position: relative;
+  white-space: nowrap;
+  text-align: center;
+  background-image: none;
+  transition: all 0.3s;
+  touch-action: manipulation;
+  border-radius: var(--td-button-border-radius, var(--td-radius-default, 12rpx));
+  outline: none;
+  font-family: PingFang SC, Microsoft YaHei, Arial Regular;
+  font-weight: var(--td-button-font-weight, 600);
+  vertical-align: top;
+  cursor: pointer;
+  -webkit-tap-highlight-color: transparent;
+  -webkit-user-select: none;
+  user-select: none;
+  /* stylelint-disable-next-line */
+  -webkit-appearance: none;
+}
+.t-button::after {
+  border-radius: calc(var(--td-button-border-radius, var(--td-radius-default, 12rpx)) * 2);
+}
+.t-button--text {
+  color: var(--td-button-default-color, var(--td-font-gray-1, rgba(0, 0, 0, 0.9)));
+  background: none;
+}
+.t-button--text::after {
+  border: 0;
+}
+.t-button--text.t-button--hover::after {
+  background-color: var(--td-button-default-text-active-bg-color, var(--td-bg-color-container-active, var(--td-gray-color-3, #e7e7e7)));
+}
+.t-button--text.t-button--primary {
+  color: var(--td-button-primary-text-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));
+  background: none;
+}
+.t-button--text.t-button--primary.t-button--hover::after {
+  background-color: var(--td-button-primary-text-active-bg-color, var(--td-bg-color-container-active, var(--td-gray-color-3, #e7e7e7)));
+}
+.t-button--text.t-button--primary.t-button--disabled {
+  color: var(--td-button-primary-text-disabled-color, var(--td-brand-color-disabled, var(--td-primary-color-3, #b5c7ff)));
+  background: none;
+}
+.t-button--text.t-button--danger {
+  color: var(--td-button-danger-text-color, var(--td-error-color, var(--td-error-color-6, #d54941)));
+  background: none;
+}
+.t-button--text.t-button--danger.t-button--hover::after {
+  background-color: var(--td-button-danger-text-active-bg-color, var(--td-bg-color-container-active, var(--td-gray-color-3, #e7e7e7)));
+}
+.t-button--text.t-button--danger.t-button--disabled {
+  color: var(--td-button-danger-text-disabled-color, var(--td-button-danger-disabled-color, var(--td-font-white-1, #ffffff)));
+  background: none;
+}
+.t-button--text.t-button--light {
+  color: var(--td-button-light-text-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));
+  background: none;
+}
+.t-button--text.t-button--light.t-button--hover::after {
+  background-color: var(--td-button-light-text-active-bg-color, var(--td-bg-color-container-active, var(--td-gray-color-3, #e7e7e7)));
+}
+.t-button--text.t-button--disabled {
+  color: var(--td-button-default-disabled-color, var(--td-font-gray-4, rgba(0, 0, 0, 0.26)));
+}
+.t-button--ghost {
+  background-color: transparent;
+  color: var(--td-button-ghost-color, var(--td-bg-color-container, var(--td-font-white-1, #ffffff)));
+}
+.t-button--ghost::after {
+  border-color: var(--td-button-ghost-border-color, var(--td-button-ghost-color, var(--td-bg-color-container, var(--td-font-white-1, #ffffff))));
+}
+.t-button--ghost.t-button--hover::after {
+  background: none;
+}
+.t-button--ghost.t-button--primary {
+  color: var(--td-button-ghost-primary-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));
+}
+.t-button--ghost.t-button--primary::after {
+  border-color: var(--td-button-ghost-primary-border-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));
+}
+.t-button--ghost.t-button--danger {
+  color: var(--td-button-ghost-danger-color, var(--td-error-color, var(--td-error-color-6, #d54941)));
+}
+.t-button--ghost.t-button--danger::after {
+  border-color: var(--td-button-ghost-danger-border-color, var(--td-error-color, var(--td-error-color-6, #d54941)));
+}
+.t-button--ghost.t-button--disabled {
+  background-color: transparent;
+  color: var(--td-button-ghost-disabled-color, rgba(255, 255, 255, 0.35));
+}
+.t-button--ghost.t-button--disabled::after {
+  border-color: var(--td-button-ghost-disabled-color, rgba(255, 255, 255, 0.35));
+}
+.t-button--outline {
+  color: var(--td-button-default-outline-color, var(--td-font-gray-1, rgba(0, 0, 0, 0.9)));
+  background-color: transparent;
+}
+.t-button--outline::after {
+  border-color: var(--td-button-default-outline-border-color, var(--td-component-border, var(--td-gray-color-4, #dcdcdc)));
+}
+.t-button--outline.t-button--hover::after {
+  background-color: var(--td-button-default-outline-active-bg-color, var(--td-bg-color-container-active, var(--td-gray-color-3, #e7e7e7)));
+  border-color: var(--td-button-default-outline-active-border-color, var(--td-component-border, var(--td-gray-color-4, #dcdcdc)));
+}
+.t-button--outline.t-button--disabled {
+  color: var(--td-button-default-outline-disabled-color, var(--td-component-border, var(--td-gray-color-4, #dcdcdc)));
+}
+.t-button--outline.t-button--disabled::after {
+  border-color: var(--td-button-default-outline-disabled-color, var(--td-component-border, var(--td-gray-color-4, #dcdcdc)));
+}
+.t-button--outline.t-button--primary {
+  color: var(--td-button-primary-outline-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));
+}
+.t-button--outline.t-button--primary::after {
+  border-color: var(--td-button-primary-outline-border-color, var(--td-button-primary-outline-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9))));
+}
+.t-button--outline.t-button--primary.t-button--hover {
+  color: var(--td-button-primary-outline-active-border-color, var(--td-brand-color-active, var(--td-primary-color-8, #003cab)));
+}
+.t-button--outline.t-button--primary.t-button--hover::after {
+  background-color: var(--td-button-primary-outline-active-bg-color, var(--td-bg-color-container-active, var(--td-gray-color-3, #e7e7e7)));
+  border-color: var(--td-button-primary-outline-active-border-color, var(--td-brand-color-active, var(--td-primary-color-8, #003cab)));
+}
+.t-button--outline.t-button--primary.t-button--disabled {
+  background-color: transparent;
+  color: var(--td-button-primary-outline-disabled-color, var(--td-brand-color-disabled, var(--td-primary-color-3, #b5c7ff)));
+}
+.t-button--outline.t-button--primary.t-button--disabled::after {
+  border-color: var(--td-button-primary-outline-disabled-color, var(--td-brand-color-disabled, var(--td-primary-color-3, #b5c7ff)));
+}
+.t-button--outline.t-button--danger {
+  color: var(--td-button-danger-outline-color, var(--td-error-color, var(--td-error-color-6, #d54941)));
+}
+.t-button--outline.t-button--danger::after {
+  border-color: var(--td-button-danger-outline-border-color, var(--td-button-danger-outline-color, var(--td-error-color, var(--td-error-color-6, #d54941))));
+}
+.t-button--outline.t-button--danger.t-button--hover {
+  color: var(--td-button-danger-outline-active-border-color, var(--td-error-color-7, #ad352f));
+}
+.t-button--outline.t-button--danger.t-button--hover::after {
+  background-color: var(--td-button-danger-outline-active-bg-color, var(--td-bg-color-container-active, var(--td-gray-color-3, #e7e7e7)));
+  border-color: var(--td-button-danger-outline-active-border-color, var(--td-error-color-7, #ad352f));
+}
+.t-button--outline.t-button--danger.t-button--disabled {
+  background-color: transparent;
+  color: var(--td-button-danger-outline-disabled-color, var(--td-error-color-3, #ffb9b0));
+}
+.t-button--outline.t-button--danger.t-button--disabled::after {
+  border-color: var(--td-button-danger-outline-disabled-color, var(--td-error-color-3, #ffb9b0));
+}
+.t-button--outline.t-button--light {
+  color: var(--td-button-light-outline-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));
+  background-color: var(--td-button-light-outline-bg-color, var(--td-brand-color-light, var(--td-primary-color-1, #f2f3ff)));
+}
+.t-button--outline.t-button--light::after {
+  border-color: var(--td-button-light-outline-border-color, var(--td-button-light-outline-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9))));
+}
+.t-button--outline.t-button--light.t-button--hover {
+  color: var(--td-button-light-outline-active-border-color, var(--td-brand-color-active, var(--td-primary-color-8, #003cab)));
+}
+.t-button--outline.t-button--light.t-button--hover::after {
+  background-color: var(--td-button-light-outline-active-bg-color, var(--td-brand-color-light-active, var(--td-primary-color-2, #d9e1ff)));
+  border-color: var(--td-button-light-outline-active-border-color, var(--td-brand-color-active, var(--td-primary-color-8, #003cab)));
+}
+.t-button--outline.t-button--light.t-button--disabled {
+  background-color: transparent;
+  color: var(--td-button-light-outline-disabled-color, var(--td-brand-color-disabled, var(--td-primary-color-3, #b5c7ff)));
+}
+.t-button--outline.t-button--light.t-button--disabled::after {
+  border-color: var(--td-button-light-outline-disabled-color, var(--td-brand-color-disabled, var(--td-primary-color-3, #b5c7ff)));
+}
+.t-button--dashed {
+  background-color: transparent;
+  border-style: dashed;
+}
+.t-button--dashed.t-button--primary {
+  color: var(--td-button-primary-dashed-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));
+}
+.t-button--dashed.t-button--primary::after {
+  border-color: var(--td-button-primary-dashed-border-color, var(--td-button-primary-dashed-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9))));
+}
+.t-button--dashed.t-button--primary.t-button--disabled {
+  background-color: transparent;
+  color: var(--td-button-primary-dashed-disabled-color, var(--td-brand-color-disabled, var(--td-primary-color-3, #b5c7ff)));
+}
+.t-button--dashed.t-button--primary.t-button--disabled::after {
+  border-color: var(--td-button-primary-dashed-disabled-color, var(--td-brand-color-disabled, var(--td-primary-color-3, #b5c7ff)));
+}
+.t-button--dashed.t-button--danger {
+  color: var(--td-button-danger-dashed-color, var(--td-error-color, var(--td-error-color-6, #d54941)));
+}
+.t-button--dashed.t-button--danger::after {
+  border-color: var(--td-button-danger-dashed-border-color, var(--td-button-danger-dashed-color, var(--td-error-color, var(--td-error-color-6, #d54941))));
+}
+.t-button--dashed.t-button--danger.t-button--disabled {
+  background-color: transparent;
+  color: var(--td-button-danger-dashed-disabled-color, var(--td-button-danger-disabled-color, var(--td-font-white-1, #ffffff)));
+}
+.t-button--dashed.t-button--danger.t-button--disabled::after {
+  border-color: var(--td-button-danger-dashed-disabled-color, var(--td-button-danger-disabled-color, var(--td-font-white-1, #ffffff)));
+}
+.t-button__loading + .t-button__content:not(:empty),
+.t-button__icon + .t-button__content:not(:empty) {
+  margin-left: 8rpx;
+}
+.t-button__icon {
+  border-radius: var(--td-button-icon-border-radius, 8rpx);
+}
+.t-button--round.t-button--size-large {
+  border-radius: calc(var(--td-button-large-height, 96rpx) / 2);
+}
+.t-button--round.t-button--size-large::after {
+  border-radius: var(--td-button-large-height, 96rpx);
+}
+.t-button--round.t-button--size-medium {
+  border-radius: calc(var(--td-button-medium-height, 80rpx) / 2);
+}
+.t-button--round.t-button--size-medium::after {
+  border-radius: var(--td-button-medium-height, 80rpx);
+}
+.t-button--round.t-button--size-small {
+  border-radius: calc(var(--td-button-small-height, 64rpx) / 2);
+}
+.t-button--round.t-button--size-small::after {
+  border-radius: var(--td-button-small-height, 64rpx);
+}
+.t-button--round.t-button--size-extra-small {
+  border-radius: calc(var(--td-button-extra-small-height, 56rpx) / 2);
+}
+.t-button--round.t-button--size-extra-small::after {
+  border-radius: var(--td-button-extra-small-height, 56rpx);
+}
+.t-button--square {
+  padding: 0;
+}
+.t-button--square.t-button--size-large {
+  width: var(--td-button-large-height, 96rpx);
+}
+.t-button--square.t-button--size-medium {
+  width: var(--td-button-medium-height, 80rpx);
+}
+.t-button--square.t-button--size-small {
+  width: var(--td-button-small-height, 64rpx);
+}
+.t-button--square.t-button--size-extra-small {
+  width: var(--td-button-extra-small-height, 56rpx);
+}
+.t-button--circle {
+  padding: 0;
+  border-radius: 50%;
+}
+.t-button--circle.t-button--size-large {
+  width: var(--td-button-large-height, 96rpx);
+}
+.t-button--circle.t-button--size-large::after {
+  border-radius: 50%;
+}
+.t-button--circle.t-button--size-medium {
+  width: var(--td-button-medium-height, 80rpx);
+}
+.t-button--circle.t-button--size-medium::after {
+  border-radius: 50%;
+}
+.t-button--circle.t-button--size-small {
+  width: var(--td-button-small-height, 64rpx);
+}
+.t-button--circle.t-button--size-small::after {
+  border-radius: 50%;
+}
+.t-button--circle.t-button--size-extra-small {
+  width: var(--td-button-extra-small-height, 56rpx);
+}
+.t-button--circle.t-button--size-extra-small::after {
+  border-radius: 50%;
+}
+.t-button--block {
+  display: flex;
+  width: 100%;
+}
+.t-button--disabled {
+  cursor: not-allowed;
+}
+.t-button__loading--wrapper {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+.t-button__loading--indicator {
+  color: var(--td-font-white-1, #ffffff);
+}
+.t-button.t-button--hover::after {
+  z-index: -1;
+}

+ 3 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/button/index.d.ts

@@ -0,0 +1,3 @@
+export * from './props';
+export * from './type';
+export * from './button';

+ 3 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/button/index.js

@@ -0,0 +1,3 @@
+export * from './props';
+export * from './type';
+export * from './button';

+ 3 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/button/props.d.ts

@@ -0,0 +1,3 @@
+import { TdButtonProps } from './type';
+declare const props: TdButtonProps;
+export default props;

+ 100 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/button/props.js

@@ -0,0 +1,100 @@
+const props = {
+    block: {
+        type: Boolean,
+        value: false,
+    },
+    content: {
+        type: String,
+    },
+    customDataset: {
+        type: null,
+    },
+    disabled: {
+        type: Boolean,
+        value: false,
+    },
+    externalClasses: {
+        type: Array,
+    },
+    ghost: {
+        type: Boolean,
+        value: false,
+    },
+    icon: {
+        type: null,
+    },
+    loading: {
+        type: Boolean,
+        value: false,
+    },
+    loadingProps: {
+        type: Object,
+    },
+    shape: {
+        type: String,
+        value: 'rectangle',
+    },
+    size: {
+        type: String,
+        value: 'medium',
+    },
+    theme: {
+        type: String,
+        value: 'default',
+    },
+    type: {
+        type: String,
+    },
+    variant: {
+        type: String,
+        value: 'base',
+    },
+    openType: {
+        type: String,
+    },
+    hoverClass: {
+        type: String,
+        value: '',
+    },
+    hoverStopPropagation: {
+        type: Boolean,
+        value: false,
+    },
+    hoverStartTime: {
+        type: Number,
+        value: 20,
+    },
+    hoverStayTime: {
+        type: Number,
+        value: 70,
+    },
+    lang: {
+        type: String,
+        value: 'en',
+    },
+    sessionFrom: {
+        type: String,
+        value: '',
+    },
+    sendMessageTitle: {
+        type: String,
+        value: '',
+    },
+    sendMessagePath: {
+        type: String,
+        value: '',
+    },
+    sendMessageImg: {
+        type: String,
+        value: '',
+    },
+    appParameter: {
+        type: String,
+        value: '',
+    },
+    showMessageCard: {
+        type: Boolean,
+        value: false,
+    },
+};
+export default props;

+ 108 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/button/type.d.ts

@@ -0,0 +1,108 @@
+import { LoadingProps } from '../loading/index';
+import { SizeEnum } from '../common/common';
+export interface TdButtonProps {
+    block?: {
+        type: BooleanConstructor;
+        value?: boolean;
+    };
+    content?: {
+        type: StringConstructor;
+        value?: string;
+    };
+    customDataset?: {
+        type: ObjectConstructor;
+        value?: any;
+    };
+    disabled?: {
+        type: BooleanConstructor;
+        value?: boolean;
+    };
+    externalClasses?: {
+        type: ArrayConstructor;
+        value?: ['t-class', 't-class-icon', 't-class-loading'];
+    };
+    ghost?: {
+        type: BooleanConstructor;
+        value?: boolean;
+    };
+    icon?: {
+        type: null;
+        value?: string | object;
+    };
+    loading?: {
+        type: BooleanConstructor;
+        value?: boolean;
+    };
+    loadingProps?: {
+        type: ObjectConstructor;
+        value?: LoadingProps;
+    };
+    shape?: {
+        type: StringConstructor;
+        value?: 'rectangle' | 'square' | 'round' | 'circle';
+    };
+    size?: {
+        type: StringConstructor;
+        value?: SizeEnum;
+    };
+    theme?: {
+        type: StringConstructor;
+        value?: 'default' | 'primary' | 'danger';
+    };
+    type?: {
+        type: StringConstructor;
+        value?: 'submit' | 'reset';
+    };
+    variant?: {
+        type: StringConstructor;
+        value?: 'base' | 'outline' | 'text';
+    };
+    openType?: {
+        type: StringConstructor;
+        value?: 'contact' | 'share' | 'getPhoneNumber' | 'getUserInfo' | 'launchApp' | 'openSetting' | 'feedback' | 'chooseAvatar';
+    };
+    hoverClass?: {
+        type: StringConstructor;
+        value?: string;
+    };
+    hoverStopPropagation?: {
+        type: BooleanConstructor;
+        value?: boolean;
+    };
+    hoverStartTime?: {
+        type: NumberConstructor;
+        value?: number;
+    };
+    hoverStayTime?: {
+        type: NumberConstructor;
+        value?: number;
+    };
+    lang?: {
+        type: StringConstructor;
+        value?: 'en' | 'zh_CN' | 'zh_TW';
+    };
+    sessionFrom?: {
+        type: StringConstructor;
+        value?: string;
+    };
+    sendMessageTitle?: {
+        type: StringConstructor;
+        value?: string;
+    };
+    sendMessagePath?: {
+        type: StringConstructor;
+        value?: string;
+    };
+    sendMessageImg?: {
+        type: StringConstructor;
+        value?: string;
+    };
+    appParameter?: {
+        type: StringConstructor;
+        value?: string;
+    };
+    showMessageCard?: {
+        type: BooleanConstructor;
+        value?: boolean;
+    };
+}

+ 1 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/button/type.js

@@ -0,0 +1 @@
+export {};

+ 28 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/calendar/README.en-US.md

@@ -0,0 +1,28 @@
+:: BASE_DOC ::
+
+## API
+### Calendar Props
+
+name | type | default | description | required
+-- | -- | -- | -- | --
+auto-close | Boolean | true | `0.34.0` | N
+confirm-btn | String / Object / Slot | '' | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/calendar/type.ts) | N
+first-day-of-week | Number | 0 | \- | N
+format | Function | - | Typescript:`CalendarFormatType ` `type CalendarFormatType = (day: TDate) => TDate` `type TDateType = 'selected' \| 'disabled' \| 'start' \| 'centre' \| 'end' \| ''` `interface TDate { date: Date; day: number; type: TDateType; className?: string; prefix?: string; suffix?: string;}`。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/calendar/type.ts) | N
+max-date | Number | - | \- | N
+min-date | Number | - | \- | N
+title | String / Slot | - | \- | N
+type | String | single | options:single/multiple/range | N
+use-popup | Boolean | true | `0.32.0` | N
+value | Number / Array | - | Typescript:`number \| number[]` | N
+default-value | Number / Array | undefined | uncontrolled property。Typescript:`number \| number[]` | N
+visible | Boolean | false | \- | N
+
+### Calendar Events
+
+name | params | description
+-- | -- | --
+change | `(value: timestamp)` | `0.28.0`
+close | `(trigger: CalendarTrigger)` | `0.34.0`。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/calendar/type.ts)。<br/>`type CalendarTrigger = 'close-btn' \| 'confirm-btn' \| 'overlay'`<br/>
+confirm | `(value: timestamp)` | \-
+select | `(value: timestamp)` | `0.28.0`

+ 80 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/calendar/README.md

@@ -0,0 +1,80 @@
+---
+title: Calendar 日历
+description: 按照日历形式展示数据或日期的容器。
+spline: form
+isComponent: true
+---
+<span class="coverages-badge" style="margin-right: 10px"><img src="https://img.shields.io/badge/coverages%3A%20lines-100%25-blue" /></span><span class="coverages-badge" style="margin-right: 10px"><img src="https://img.shields.io/badge/coverages%3A%20functions-100%25-blue" /></span><span class="coverages-badge" style="margin-right: 10px"><img src="https://img.shields.io/badge/coverages%3A%20statements-100%25-blue" /></span><span class="coverages-badge" style="margin-right: 10px"><img src="https://img.shields.io/badge/coverages%3A%20branches-100%25-blue" /></span>
+
+<div style="background: #ecf2fe; display: flex; align-items: center; line-height: 20px; padding: 14px 24px; border-radius: 3px; color: #555a65">
+  <svg fill="none" viewBox="0 0 16 16" width="16px" height="16px" style="margin-right: 5px">
+    <path fill="#0052d9" d="M8 15A7 7 0 108 1a7 7 0 000 14zM7.4 4h1.2v1.2H7.4V4zm.1 2.5h1V12h-1V6.5z" fillOpacity="0.9"></path>
+  </svg>
+  该组件于 0.22.0 版本上线,请留意版本。
+</div>
+
+## 引入
+
+全局引入,在 miniprogram 根目录下的`app.json`中配置,局部引入,在需要引入的页面或组件的`index.json`中配置。
+
+```json
+"usingComponents": {
+  "t-calendar": "tdesign-miniprogram/calendar/calendar"
+}
+```
+
+## 代码演示
+
+### 组件类型
+#### 单个选择日期
+
+{{ base }}
+
+#### 多个选择日期
+
+{{ multiple }}
+
+#### 区间选择日期
+
+{{ range }}
+
+### 组件样式
+
+#### 自定义文案
+
+{{ custom-text }}
+
+#### 自定义区间
+
+{{ custom-range }}
+
+#### 不使用 Popup
+
+{{ without-popup }}
+
+## API
+### Calendar Props
+
+名称 | 类型 | 默认值 | 说明 | 必传
+-- | -- | -- | -- | --
+auto-close | Boolean | true | `0.34.0`。自动关闭;在点击关闭按钮、确认按钮、遮罩层时自动关闭,不需要手动设置 visible | N
+confirm-btn | String / Object / Slot | '' | 确认按钮。值为 null 则不显示确认按钮。值类型为字符串,则表示自定义按钮文本,值类型为 Object 则表示透传 Button 组件属性。。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/calendar/type.ts) | N
+first-day-of-week | Number | 0 | 第一天从星期几开始,默认 0 = 周日 | N
+format | Function | - | 用于格式化日期的函数。TS 类型:`CalendarFormatType ` `type CalendarFormatType = (day: TDate) => TDate` `type TDateType = 'selected' \| 'disabled' \| 'start' \| 'centre' \| 'end' \| ''` `interface TDate { date: Date; day: number; type: TDateType; className?: string; prefix?: string; suffix?: string;}`。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/calendar/type.ts) | N
+max-date | Number | - | 最大可选的日期,不传则默认半年后 | N
+min-date | Number | - | 最小可选的日期,不传则默认今天 | N
+title | String / Slot | - | 标题,不传默认为“请选择日期” | N
+type | String | single | 日历的选择类型,single = 单选;multiple = 多选; range = 区间选择。可选项:single/multiple/range | N
+use-popup | Boolean | true | `0.32.0`。是否使用弹出层包裹日历 | N
+value | Number / Array | - | 当前选择的日期,不传则默认今天,当 type = multiple 或 range 时传入数组。TS 类型:`number \| number[]` | N
+default-value | Number / Array | undefined | 当前选择的日期,不传则默认今天,当 type = multiple 或 range 时传入数组。非受控属性。TS 类型:`number \| number[]` | N
+visible | Boolean | false | 是否显示日历;`usePopup` 为 true 时有效 | N
+
+### Calendar Events
+
+名称 | 参数 | 描述
+-- | -- | --
+change | `(value: timestamp)` | `0.28.0`。不显示 confirm-btn 时,完成选择时触发(暂不支持 type = multiple)
+close | `(trigger: CalendarTrigger)` | `0.34.0`。关闭按钮时触发。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/calendar/type.ts)。<br/>`type CalendarTrigger = 'close-btn' \| 'confirm-btn' \| 'overlay'`<br/>
+confirm | `(value: timestamp)` | 点击确认按钮时触发
+select | `(value: timestamp)` | `0.28.0`。点击日期时触发

+ 44 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/calendar/calendar.d.ts

@@ -0,0 +1,44 @@
+/// <reference types="miniprogram-api-typings" />
+import { SuperComponent } from '../common/src/index';
+import { TdCalendarProps } from './type';
+export interface CalendarProps extends TdCalendarProps {
+}
+export default class Calendar extends SuperComponent {
+    externalClasses: string[];
+    options: WechatMiniprogram.Component.ComponentOptions;
+    properties: TdCalendarProps;
+    data: {
+        prefix: string;
+        classPrefix: string;
+        months: any[];
+        scrollIntoView: string;
+        innerConfirmBtn: {
+            content: string;
+        };
+    };
+    controlledProps: {
+        key: string;
+        event: string;
+    }[];
+    lifetimes: {
+        ready(): void;
+    };
+    observers: {
+        confirmBtn(v: any): void;
+        'firstDayOfWeek,minDate,maxDate'(firstDayOfWeek: any, minDate: any, maxDate: any): void;
+        value(v: any): void;
+        visible(v: any): void;
+        format(v: any): void;
+    };
+    methods: {
+        initialValue(): void;
+        scrollIntoView(): void;
+        calcMonths(): void;
+        close(trigger: any): void;
+        onVisibleChange(): void;
+        handleClose(): void;
+        handleSelect(e: any): void;
+        onTplButtonTap(): void;
+        toTime(val: any): any;
+    };
+}

+ 165 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/calendar/calendar.js

@@ -0,0 +1,165 @@
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+    return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+import { SuperComponent, wxComponent } from '../common/src/index';
+import config from '../common/config';
+import props from './props';
+import TCalendar from '../common/shared/calendar/index';
+const { prefix } = config;
+const name = `${prefix}-calendar`;
+let Calendar = class Calendar extends SuperComponent {
+    constructor() {
+        super(...arguments);
+        this.externalClasses = [`${prefix}-class`];
+        this.options = {
+            multipleSlots: true,
+            styleIsolation: 'apply-shared',
+        };
+        this.properties = props;
+        this.data = {
+            prefix,
+            classPrefix: name,
+            months: [],
+            scrollIntoView: '',
+            innerConfirmBtn: { content: '确定' },
+        };
+        this.controlledProps = [
+            {
+                key: 'value',
+                event: 'confirm',
+            },
+            {
+                key: 'value',
+                event: 'change',
+            },
+        ];
+        this.lifetimes = {
+            ready() {
+                this.base = new TCalendar(this.properties);
+                this.initialValue();
+                this.setData({
+                    days: this.base.getDays(),
+                });
+                this.calcMonths();
+            },
+        };
+        this.observers = {
+            confirmBtn(v) {
+                if (typeof v === 'string') {
+                    this.setData({ innerConfirmBtn: v === 'slot' ? 'slot' : { content: v } });
+                }
+                else if (typeof v === 'object') {
+                    this.setData({ innerConfirmBtn: v });
+                }
+            },
+            'firstDayOfWeek,minDate,maxDate'(firstDayOfWeek, minDate, maxDate) {
+                if (this.base) {
+                    this.base.firstDayOfWeek = firstDayOfWeek;
+                    this.base.minDate = minDate;
+                    this.base.maxDate = maxDate;
+                    this.calcMonths();
+                }
+            },
+            value(v) {
+                if (this.base) {
+                    this.base.value = v;
+                }
+            },
+            visible(v) {
+                if (v) {
+                    this.scrollIntoView();
+                    if (this.base) {
+                        this.base.value = this.data.value;
+                        this.calcMonths();
+                    }
+                }
+            },
+            format(v) {
+                this.base.format = v;
+                if (this.base && !this.data.usePopup) {
+                    this.calcMonths();
+                }
+            },
+        };
+        this.methods = {
+            initialValue() {
+                const { value, type, minDate } = this.data;
+                if (!value) {
+                    const today = new Date();
+                    const now = minDate || new Date(today.getFullYear(), today.getMonth(), today.getDate()).getTime();
+                    const initialValue = type === 'single' ? now : [now];
+                    if (type === 'range') {
+                        initialValue[1] = now + 24 * 3600 * 1000;
+                    }
+                    this.setData({
+                        value: initialValue,
+                    });
+                    this.base.value = initialValue;
+                }
+            },
+            scrollIntoView() {
+                const { value } = this.data;
+                if (!value)
+                    return;
+                const date = new Date(Array.isArray(value) ? value[0] : value);
+                if (date) {
+                    this.setData({
+                        scrollIntoView: `year_${date.getFullYear()}_month_${date.getMonth()}`,
+                    });
+                }
+            },
+            calcMonths() {
+                const months = this.base.getMonths();
+                this.setData({
+                    months,
+                });
+            },
+            close(trigger) {
+                if (this.data.autoClose) {
+                    this.setData({ visible: false });
+                }
+                this.triggerEvent('close', { trigger });
+            },
+            onVisibleChange() {
+                this.close('overlay');
+            },
+            handleClose() {
+                this.close('close-btn');
+            },
+            handleSelect(e) {
+                const { date, year, month } = e.currentTarget.dataset;
+                if (date.type === 'disabled')
+                    return;
+                const rawValue = this.base.select({ cellType: date.type, year, month, date: date.day });
+                const value = this.toTime(rawValue);
+                this.calcMonths();
+                if (this.data.confirmBtn == null) {
+                    if (this.data.type === 'single' || rawValue.length === 2) {
+                        this.setData({ visible: false });
+                        this._trigger('change', { value });
+                    }
+                }
+                this.triggerEvent('select', { value });
+            },
+            onTplButtonTap() {
+                const rawValue = this.base.getTrimValue();
+                const value = this.toTime(rawValue);
+                this.close('confirm-btn');
+                this._trigger('confirm', { value });
+            },
+            toTime(val) {
+                if (Array.isArray(val)) {
+                    return val.map((item) => item.getTime());
+                }
+                return val.getTime();
+            },
+        };
+    }
+};
+Calendar = __decorate([
+    wxComponent()
+], Calendar);
+export default Calendar;

+ 8 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/calendar/calendar.json

@@ -0,0 +1,8 @@
+{
+  "component": true,
+  "usingComponents": {
+    "t-popup": "../popup/popup",
+    "t-button": "../button/button",
+    "t-icon": "../icon/icon"
+  }
+}

+ 13 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/calendar/calendar.wxml

@@ -0,0 +1,13 @@
+<wxs src="./calendar.wxs" module="this" />
+<wxs src="../common/utils.wxs" module="_" />
+
+<t-popup
+  wx:if="{{usePopup}}"
+  class="class"
+  visible="{{visible}}"
+  bind:visible-change="onVisibleChange"
+  placement="bottom"
+>
+  <include src="./template.wxml" />
+</t-popup>
+<include wx:else src="./template.wxml" />

+ 30 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/calendar/calendar.wxs

@@ -0,0 +1,30 @@
+function getDateLabel(monthItem, dateItem) {
+  var weekdayText = ['日', '一', '二', '三', '四', '五', '六'];
+  var weekday = (monthItem.weekdayOfFirstDay + dateItem.day - 1) % 7;
+  var label = monthItem.month + 1 + '月' + dateItem.day + '日, 星期' + weekdayText[weekday];
+  if (dateItem.type === 'start') {
+    label = '开始日期:' + label;
+  }
+  if (dateItem.type === 'end') {
+    label = '结束日期:' + label;
+  }
+  if (isDateSelected(dateItem)) {
+    label = '已选中, ' + label;
+  }
+  if (dateItem.prefix) {
+    label += ', ' + dateItem.prefix;
+  }
+  if (dateItem.suffix) {
+    label += ', ' + dateItem.suffix;
+  }
+  return label;
+}
+
+function isDateSelected(dateItem) {
+  return ['start', 'end', 'selected', 'centre'].indexOf(dateItem.type) >= 0;
+}
+
+module.exports = {
+  getDateLabel: getDateLabel,
+  isDateSelected: isDateSelected,
+};

+ 187 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/calendar/calendar.wxss

@@ -0,0 +1,187 @@
+.t-float-left {
+  float: left;
+}
+.t-float-right {
+  float: right;
+}
+@keyframes tdesign-fade-out {
+  from {
+    opacity: 1;
+  }
+  to {
+    opacity: 0;
+  }
+}
+.hotspot-expanded.relative {
+  position: relative;
+}
+.hotspot-expanded::after {
+  content: '';
+  display: block;
+  position: absolute;
+  left: 0;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  transform: scale(1.5);
+}
+.t-calendar {
+  position: relative;
+  z-index: 9999;
+  background: var(--td-calendar-bg-color, var(--td-bg-color-container, var(--td-font-white-1, #ffffff)));
+  overflow-x: hidden;
+}
+.t-calendar--popup {
+  border-top-left-radius: var(--td-calendar-radius, 24rpx);
+  border-top-right-radius: var(--td-calendar-radius, 24rpx);
+}
+.t-calendar__title {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  font-size: var(--td-calendar-title-font-size, 18px);
+  font-weight: 600;
+  color: var(--td-calendar-title-color, var(--td-font-gray-1, rgba(0, 0, 0, 0.9)));
+  height: 52rpx;
+  padding: 32rpx;
+}
+.t-calendar__title:focus {
+  outline: 0;
+}
+.t-calendar__close-btn {
+  position: absolute;
+  top: 32rpx;
+  right: 32rpx;
+  margin: -24rpx;
+  padding: 24rpx;
+}
+.t-calendar__days {
+  display: grid;
+  grid-template-columns: repeat(7, 1fr);
+  grid-column-gap: 8rpx;
+  padding: 0 32rpx;
+  text-align: center;
+  line-height: 92rpx;
+}
+.t-calendar__days-item {
+  height: 92rpx;
+  font-size: 28rpx;
+  color: var(--td-calendar-days-color, var(--td-font-gray-2, rgba(0, 0, 0, 0.6)));
+}
+.t-calendar__content {
+  min-height: 400rpx;
+  display: flex;
+  flex-direction: column;
+}
+.t-calendar__month {
+  font-size: 28rpx;
+  color: var(--td-calendar-title-color, var(--td-font-gray-1, rgba(0, 0, 0, 0.9)));
+  font-weight: 600;
+  padding: 32rpx 0 0;
+}
+.t-calendar__months {
+  height: 60vh;
+  padding: 0 32rpx 32rpx;
+  box-sizing: border-box;
+}
+.t-calendar__months::-webkit-scrollbar {
+  display: none;
+}
+.t-calendar__dates {
+  flex: 1;
+  display: grid;
+  grid-template-columns: repeat(7, 1fr);
+  grid-column-gap: 8rpx;
+}
+.t-calendar__dates-item {
+  position: relative;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  font-size: 32rpx;
+  border-radius: 16rpx;
+  height: 120rpx;
+  line-height: 48rpx;
+  font-weight: 600;
+  margin-top: 16rpx;
+  cursor: pointer;
+  -webkit-tap-highlight-color: transparent;
+  -webkit-user-select: none;
+  user-select: none;
+}
+.t-calendar__dates-item-prefix,
+.t-calendar__dates-item-suffix {
+  position: absolute;
+  font-size: 20rpx;
+  line-height: 32rpx;
+  width: 100%;
+  text-align: center;
+  font-weight: 400;
+}
+.t-calendar__dates-item-prefix {
+  top: 8rpx;
+}
+.t-calendar__dates-item-suffix {
+  bottom: 8rpx;
+  color: var(--td-calendar-item-suffix-color, var(--td-font-gray-3, rgba(0, 0, 0, 0.4)));
+}
+.t-calendar__dates-item-suffix--selected,
+.t-calendar__dates-item-suffix--start,
+.t-calendar__dates-item-suffix--end {
+  color: var(--td-calendar-selected-color, var(--td-font-white-1, #ffffff));
+}
+.t-calendar__dates-item-suffix--disabled {
+  color: var(--td-calendar-item-disabled-color, var(--td-font-gray-4, rgba(0, 0, 0, 0.26)));
+}
+.t-calendar__dates-item--selected,
+.t-calendar__dates-item--start,
+.t-calendar__dates-item--end {
+  background: var(--td-calendar-active-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));
+  color: var(--td-calendar-selected-color, var(--td-font-white-1, #ffffff));
+  border-radius: 8rpx;
+}
+.t-calendar__dates-item--start {
+  border-radius: 8rpx 0 0 8rpx;
+}
+.t-calendar__dates-item--end {
+  border-radius: 0 8rpx 8rpx 0;
+}
+.t-calendar__dates-item--start + .t-calendar__dates-item--end::before {
+  content: '';
+  display: block;
+  position: absolute;
+  top: 0;
+  width: 8rpx;
+  height: 100%;
+  background: var(--td-calendar-active-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));
+}
+.t-calendar__dates-item--start + .t-calendar__dates-item--end:before {
+  left: -8rpx;
+}
+.t-calendar__dates-item--centre {
+  border-radius: 0;
+  background-color: var(--td-calendar-item-centre-color, var(--td-brand-color-light, var(--td-primary-color-1, #f2f3ff)));
+}
+.t-calendar__dates-item--centre::before,
+.t-calendar__dates-item--centre::after {
+  content: '';
+  display: block;
+  position: absolute;
+  top: 0;
+  width: 8rpx;
+  height: 100%;
+  background-color: var(--td-calendar-item-centre-color, var(--td-brand-color-light, var(--td-primary-color-1, #f2f3ff)));
+}
+.t-calendar__dates-item--centre:before {
+  left: -8rpx;
+}
+.t-calendar__dates-item--centre:after {
+  right: -8rpx;
+}
+.t-calendar__dates-item--disabled {
+  color: var(--td-calendar-item-disabled-color, var(--td-font-gray-4, rgba(0, 0, 0, 0.26)));
+  cursor: default;
+}
+.t-calendar__footer {
+  padding: 32rpx;
+}

+ 2 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/calendar/index.d.ts

@@ -0,0 +1,2 @@
+export * from './type';
+export * from './calendar';

+ 2 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/calendar/index.js

@@ -0,0 +1,2 @@
+export * from './type';
+export * from './calendar';

+ 3 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/calendar/props.d.ts

@@ -0,0 +1,3 @@
+import { TdCalendarProps } from './type';
+declare const props: TdCalendarProps;
+export default props;

+ 50 - 0
pages/index/miniprogram_npm/tdesign-miniprogram/calendar/props.js

@@ -0,0 +1,50 @@
+const props = {
+    autoClose: {
+        type: Boolean,
+        value: true,
+    },
+    confirmBtn: {
+        type: null,
+        value: '',
+    },
+    style: {
+        type: String,
+        value: '',
+    },
+    firstDayOfWeek: {
+        type: Number,
+        value: 0,
+    },
+    format: {
+        type: null,
+    },
+    maxDate: {
+        type: Number,
+    },
+    minDate: {
+        type: Number,
+    },
+    title: {
+        type: String,
+    },
+    type: {
+        type: String,
+        value: 'single',
+    },
+    usePopup: {
+        type: Boolean,
+        value: true,
+    },
+    value: {
+        type: null,
+        value: null,
+    },
+    defaultValue: {
+        type: null,
+    },
+    visible: {
+        type: Boolean,
+        value: false,
+    },
+};
+export default props;

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.