"
+ ]
+ },
+ /* ios打包配置 */
+ "ios" : {},
+ /* SDK配置 */
+ "sdkConfigs" : {}
+ }
+ },
+ /* 快应用特有相关 */
+ "quickapp" : {},
+ /* 小程序特有相关 */
+ "mp-weixin" : {
+ "appid" : "wxb25de48f873c4843",
+ "setting" : {
+ "urlCheck" : true,
+ "minified" : true,
+ "postcss" : true,
+ "es6" : true,
+ "ignoreDevUnusedFiles" : false
+ },
+ "requiredPrivateInfos" : [ "chooseAddress" ],
+ "usingComponents" : true,
+ "permission" : {}
+ },
+ "mp-alipay" : {
+ "usingComponents" : true
+ },
+ "mp-baidu" : {
+ "usingComponents" : true
+ },
+ "mp-toutiao" : {
+ "usingComponents" : true
+ },
+ "uniStatistics" : {
+ "enable" : false
+ },
+ "vueVersion" : "3",
+ "fallbackLocale" : "zh-Hans"
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..734a1c7
--- /dev/null
+++ b/package.json
@@ -0,0 +1,19 @@
+{
+ "id": "da-tree",
+ "name": "da-tree 树组件(支持单选、多选、无限级、主题色,Vue3版) ",
+ "displayName": "da-tree 树组件(支持单选、多选、无限级、主题色,Vue3版) ",
+ "version": "1.4.2",
+ "description": "一个基于 Vue3 的tree(树)组件,支持主题换色,可能是最适合你的tree(树)组件",
+ "keywords": [
+ "tree",
+ "树",
+ "树组件",
+ "da系列"
+ ],
+ "dcloudext": {
+ "category": [
+ "前端组件",
+ "通用组件"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/pages.json b/pages.json
new file mode 100644
index 0000000..b30da98
--- /dev/null
+++ b/pages.json
@@ -0,0 +1,246 @@
+{
+ "tabBar": {
+ "custom": false,
+ "color": "#000000",
+ "selectedColor": "#8d7bfb",
+ "borderStyle": "black",
+ "list": [{
+ "pagePath": "pages/index/index",
+ "iconPath": "static/tabbar/home.png",
+ "selectedIconPath": "static/tabbar/home-active.png",
+ "text": "首页"
+ },
+ // {
+ // "pagePath": "pages/cart/index",
+ // "iconPath": "static/tabbar/cart.png",
+ // "selectedIconPath": "static/tabbar/cart-active.png",
+ // "text": "购物车"
+ // },
+ // {
+ // "pagePath": "pages/cart/parts/index",
+ // "iconPath": "static/tabbar/cart.png",
+ // "selectedIconPath": "static/tabbar/cart-active.png",
+ // "text": "购物车"
+ // },
+ {
+ "pagePath": "pages/mine/index",
+ "iconPath": "static/tabbar/user.png",
+ "selectedIconPath": "/static/tabbar/user-active.png",
+ "text": "我的"
+ }
+ ]
+ },
+ "pages": [
+ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
+
+ {
+ "path": "pages/index/index",
+ "style": {
+ "navigationBarTitleText": "主页",
+ "navigationStyle": "custom",
+ "enablePullDownRefresh": false
+ }
+ },
+ // {
+ // "path": "pages/cart/index",
+ // "style": {
+ // "navigationBarTitleText": "购物车"
+ // }
+ // },
+ // {
+ // "path": "pages/cart/parts/index",
+ // "style": {
+ // "navigationBarTitleText": "购物车"
+ // }
+ // },
+ {
+ "path": "pages/mine/index",
+ "style": {
+ "navigationBarTitleText": "我的"
+ }
+ },
+ {
+ "path": "pages/mall/detail",
+ "style": {
+ "navigationBarTitleText": "店铺商品详情"
+ }
+ },
+ {
+ "path": "pages/mall/houseDetail",
+ "style": {
+ "navigationBarTitleText": "仓库商品详情"
+ }
+ },
+ // {
+ // "path": "pages/mall/index/index",
+ // "style": {
+ // "navigationBarTitleText": "精选二手机"
+ // }
+ // },
+ // {
+ // "path": "pages/mall/parts/item/index",
+ // "style": {
+ // "navigationBarTitleText": "配件详情"
+ // }
+ // },
+ // {
+ // "path": "pages/mall/parts/index/index",
+ // "style": {
+ // "navigationBarTitleText": "精选配件"
+ // }
+ // },
+ {
+ "path": "pages/order/preview",
+ "style": {
+ "navigationBarTitleText": "提交订单"
+ }
+ },
+ {
+ "path": "pages/order/housePreview",
+ "style": {
+ "navigationBarTitleText": "提交订单"
+ }
+ },
+ {
+ "path": "pages/order/index",
+ "style": {
+ "navigationBarTitleText": "我的订单"
+ }
+ },
+ {
+ "path": "pages/order/detail",
+ "style": {
+ "navigationBarTitleText": "订单详情"
+ }
+ },
+
+ // {
+ // "path": "pages/order/preview",
+ // "style": {
+ // "navigationBarTitleText": "提交订单"
+ // }
+ // },
+
+
+
+ // {
+ // "path": "pages/webview/index",
+ // "style": {
+ // "navigationStyle": "custom"
+ // }
+ // },
+ {
+ "path": "pages/login/index",
+ "style": {
+ "navigationBarTitleText": "授权登录"
+ }
+ },
+ {
+ "path": "pages/login/phoneAuthorization",
+ "style": {
+ "navigationBarTitleText": "授权手机号"
+ }
+ },
+ // {
+ // "path": "pages/control/goods/index",
+ // "style": {
+ // "navigationBarTitleText": "商品管理"
+ // }
+ // },
+ {
+ "path": "pages/config/store",
+ "style": {
+ "navigationBarTitleText": "商城配置"
+ }
+ },
+ {
+ "path": "pages/config/price",
+ "style": {
+ "navigationBarTitleText": "价格调整",
+ "enablePullDownRefresh": false
+ }
+ },
+ {
+ "path": "pages/config/goodsList",
+ "style": {
+ "navigationBarTitleText": "商品管理",
+ "enablePullDownRefresh": false
+ }
+ },
+ {
+ "path": "pages/config/goodsAdd",
+ "style": {
+ "navigationBarTitleText": "新增商品",
+ "enablePullDownRefresh": false
+ }
+ },
+ {
+ "path": "pages/config/goodsEdit",
+ "style": {
+ "navigationBarTitleText": "编辑商品",
+ "enablePullDownRefresh": false
+ }
+ },
+ {
+ "path": "pages/config/goodsDetail",
+ "style": {
+ "navigationBarTitleText": "店铺商品详情",
+ "enablePullDownRefresh": false
+ }
+ },
+ {
+ "path": "pages/config/shopOrder/index",
+ "style": {
+ "navigationBarTitleText": "店铺订单"
+ }
+ },
+ {
+ "path": "pages/config/shopOrder/detail",
+ "style": {
+ "navigationBarTitleText": "店铺订单-详情"
+ }
+ }
+ // {
+ // "path": "pages/control/parts/index",
+ // "style": {
+ // "navigationBarTitleText": "配件管理"
+ // }
+ // },
+ // {
+ // "path": "pages/order/parts/list/index",
+ // "style": {
+ // "navigationBarTitleText": "配件订单中心"
+ // }
+ // },
+ // {
+ // "path": "pages/order/parts/detail/index",
+ // "style": {
+ // "navigationBarTitleText": "配件订单详情"
+ // }
+ // },
+ // {
+ // "path": "pages/order/parts/preview/index",
+ // "style": {
+ // "navigationBarTitleText": "配件订单预览"
+ // }
+ // }
+ ],
+ "globalStyle": {
+ "navigationBarTextStyle": "black",
+ "navigationBarTitleText": "远阳数码",
+ "navigationBarBackgroundColor": "#fff",
+ "backgroundTextStyle": "dark",
+ "backgroundColor": "#F2F3F5",
+ "backgroundColorBottom": "#F2F3F5",
+ "backgroundColorTop": "#F2F3F5",
+ "onReachBottomDistance": 50
+ },
+ "uniIdRouter": {},
+ "easycom": {
+ "autoscan": true,
+ "custom": {
+ "^nut-(.*)?-(.*)": "@/uni_modules/nutui-uni/components/$1$2/$1$2.vue",
+ "^nut-(.*)": "@/uni_modules/nutui-uni/components/$1/$1.vue"
+ }
+ }
+}
\ No newline at end of file
diff --git a/pages/cart/index.vue b/pages/cart/index.vue
new file mode 100644
index 0000000..3e673b6
--- /dev/null
+++ b/pages/cart/index.vue
@@ -0,0 +1,342 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/config/goodsAdd.vue b/pages/config/goodsAdd.vue
new file mode 100644
index 0000000..7e9c7e6
--- /dev/null
+++ b/pages/config/goodsAdd.vue
@@ -0,0 +1,413 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 下架
+ 上架
+
+
+
+
+ 成色
+
+
+ {{form.degree_name}}
+
+
+
+
+
+
+ 机型
+
+
+ {{form.type_name}},{{form.brand_name}},{{form.product_name}}
+
+
+
+
+
+ 商品图片
+
+
+
+
+
+
+
+
+
+
+ 新增商品
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/config/goodsDetail.vue b/pages/config/goodsDetail.vue
new file mode 100644
index 0000000..0bdc429
--- /dev/null
+++ b/pages/config/goodsDetail.vue
@@ -0,0 +1,341 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ¥
+ {{detail.goods_price}}
+
+
+
+
+
+
+ {{detail.degree?.degree_name}}
+
+ {{detail.goods_name}}
+
+
+ {{detail.content}}
+
+
+
+
+
+ 服务
+ {{serviceTxt}}
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/config/goodsEdit.vue b/pages/config/goodsEdit.vue
new file mode 100644
index 0000000..aa4e7a4
--- /dev/null
+++ b/pages/config/goodsEdit.vue
@@ -0,0 +1,339 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 下架
+ 上架
+
+
+
+
+ 成色
+
+
+ {{form.degree_name}}
+
+
+
+
+
+
+ 机型
+
+
+ {{form.type_name}},{{form.brand_name}},{{form.product_name}}
+
+
+
+
+
+ 商品图片
+
+
+
+
+
+
+
+
+
+ 保存修改
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/config/goodsList.vue b/pages/config/goodsList.vue
new file mode 100644
index 0000000..22acfe4
--- /dev/null
+++ b/pages/config/goodsList.vue
@@ -0,0 +1,793 @@
+
+
+
+
+
+
+ 新增商品
+
+
+
+
+ 搜索
+
+
+
+
+
+
+
+
+
+
+
+ {{item.text}}
+
+
+
+
+
+
+
+
+
+
+ {{type.name}}
+
+
+
+
+
+
+ {{item.label}}
+
+
+
+
+
+
+ {{item.label}}
+
+
+
+
+
+
+
+ 重置
+
+
+ 确认
+
+
+
+
+
+
+
+
+
+
+ {{item.text}}
+
+
+
+
+ 重置
+
+
+ 确认
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.content}}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/config/price.vue b/pages/config/price.vue
new file mode 100644
index 0000000..b39e770
--- /dev/null
+++ b/pages/config/price.vue
@@ -0,0 +1,1238 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 新增规则
+ 保存配置
+
+
+
+
+
+ 最低价
+
+
+
+ 最高价
+
+
+
+
+
+
+ 加价金额/百分比
+
+
+
+ 加价类型
+
+ 固定加价
+ 百分比加价
+
+
+
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.text}}
+
+
+
+
+
+
+
+
+
+
+ {{type.name}}
+
+
+
+
+
+
+ {{item.label}}
+
+
+
+
+
+
+ {{item.label}}
+
+
+
+
+
+
+
+ 重置
+
+
+ 确认
+
+
+
+
+
+
+
+
+
+
+ {{item.text}}
+
+
+
+
+ 重置
+
+
+ 确认
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.goods_house.content}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 调整价格
+
+
+
+
+
+
+
+
+
+
+
+ 是否开启整仓调价
+
+
+
+
+
+
+
+
+ 加价金额/百分比
+
+
+
+ 加价类型
+
+ 固定加价
+ 百分比加价
+
+
+
+
+
+
+
+ 保存规则
+
+
+
+ 注意:如果开启了整仓调价,那么区间调价将不会生效(不影响单机调价),如果需要区间调价请关闭整仓调价。
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/config/shopOrder/detail.vue b/pages/config/shopOrder/detail.vue
new file mode 100644
index 0000000..1135731
--- /dev/null
+++ b/pages/config/shopOrder/detail.vue
@@ -0,0 +1,188 @@
+
+
+
+ 1
+ 2
+ 3
+ 4
+
+
+
+
+
+ {{detail.address_info.user_name}} - {{detail.address_info.tel_number}}
+ {{detail.address_info.province_name + detail.address_info.city_name + detail.address_info.county_name + detail.address_info.street_name + detail.address_info.detail_info_new}}
+
+
+
+
+
+
+
+
+
+
+
+ {{goods.snapshot_info.degree.degree_name}}
+ {{goods.goods_name}}
+
+ 串号:{{goods.goods_no}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 商品总额
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/config/shopOrder/index.vue b/pages/config/shopOrder/index.vue
new file mode 100644
index 0000000..575809a
--- /dev/null
+++ b/pages/config/shopOrder/index.vue
@@ -0,0 +1,634 @@
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+
+
+
+
+
+
+
+ {{item.title}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{goods.snapshot_info.degree.degree_name}}
+ {{goods.goods_name}}
+
+ 串号:{{goods.goods_no}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 确定发货
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/config/store.vue b/pages/config/store.vue
new file mode 100644
index 0000000..e4965fd
--- /dev/null
+++ b/pages/config/store.vue
@@ -0,0 +1,318 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存收货地址
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 收款二维码
+
+
+
+
+
+ 微信二维码
+
+
+
+
+
+
+
+
+
+
+ 保存配置
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/control/goods/index.vue- b/pages/control/goods/index.vue-
new file mode 100644
index 0000000..7973135
--- /dev/null
+++ b/pages/control/goods/index.vue-
@@ -0,0 +1,429 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.goods_no }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 成色
+
+
+ {{form.degree_name}}
+
+
+
+
+ 机型
+
+
+ {{form.type_name}},{{form.brand_name}},{{form.product_name}}
+
+
+
+
+ 商品图片
+
+
+
+
+ 验机报告
+
+
+ 点击勾选
+
+
+
+
+
+ 保存修改
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/index/index - 副本.vue b/pages/index/index - 副本.vue
new file mode 100644
index 0000000..95d2798
--- /dev/null
+++ b/pages/index/index - 副本.vue
@@ -0,0 +1,283 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{item.name}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 陈一鸣
+ 13156107870
+
+ 山东省济南市天桥区凤凰广场B座803室
+
+
+
+
+
+
+
+
+
+ 陈一鸣
+ 13156107870
+
+ 山东省济南市天桥区凤凰广场B座803室
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/index/index.vue b/pages/index/index.vue
new file mode 100644
index 0000000..f9c25b6
--- /dev/null
+++ b/pages/index/index.vue
@@ -0,0 +1,1427 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+
+
+
+
+
+
+
+
+
+ {{item.text}}
+
+
+
+
+
+
+
+
+
+
+ {{type.name}}
+
+
+
+
+
+
+ {{item.label}}
+
+
+
+
+
+
+ {{item.label}}
+
+
+
+
+
+
+
+ 重置
+
+
+ 确认
+
+
+
+
+
+
+
+
+
+
+ {{item.text}}
+
+
+
+
+ 重置
+
+
+ 确认
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+
+
+
+
+
+
+
+
+ {{item.text}}
+
+
+
+
+
+
+
+
+
+
+ {{type.name}}
+
+
+
+
+
+
+ {{item.label}}
+
+
+
+
+
+
+ {{item.label}}
+
+
+
+
+
+
+
+ 重置
+
+
+ 确认
+
+
+
+
+
+
+
+
+
+
+ {{item.text}}
+
+
+
+
+ 重置
+
+
+ 确认
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item?.goods_house?.content}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.content}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/login/index.vue b/pages/login/index.vue
new file mode 100644
index 0000000..d448b3c
--- /dev/null
+++ b/pages/login/index.vue
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 申请获取以下权限
+ 获得你的公开信息(昵称、头像等)
+
+
+ 授权登录
+
+
+ 暂不登录
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/login/phoneAuthorization.vue b/pages/login/phoneAuthorization.vue
new file mode 100644
index 0000000..d67953e
--- /dev/null
+++ b/pages/login/phoneAuthorization.vue
@@ -0,0 +1,108 @@
+
+
+
+
+ 申请获取以下权限
+ 获得你的手机号信息
+
+
+ 授权手机号
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/mall/detail.vue b/pages/mall/detail.vue
new file mode 100644
index 0000000..b49028a
--- /dev/null
+++ b/pages/mall/detail.vue
@@ -0,0 +1,379 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ¥
+ {{detail.goods_price}}
+
+
+
+
+
+
+ {{detail.degree?.degree_name}}
+
+ {{detail.goods_name}}
+
+
+ {{detail.content}}
+
+
+
+
+
+ 服务
+ {{serviceTxt}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 立即购买
+
+
+ 暂不支持购买
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/mall/houseDetail.vue b/pages/mall/houseDetail.vue
new file mode 100644
index 0000000..a9c8069
--- /dev/null
+++ b/pages/mall/houseDetail.vue
@@ -0,0 +1,579 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ¥
+ {{getPrice(detail)}}
+
+
+
+
+
+
+ {{detail.degree?.degree_name}}
+
+ {{detail.goods_name}}
+
+
+ {{detail.content}}
+
+
+
+
+
+ 服务
+ {{detail.service_txt}}
+
+
+
+
+
+
+ 瑕疵项
+
+
+
+
+ {{detail.report_tags?.bad_count}}项
+
+
+
+
+ {{item.name}}
+
+
+
+ {{iitem.name}}
+
+
+
+
+
+
+
+
+ 正常项
+
+
+
+
+ {{detail.report_tags?.ok_count}}项
+
+
+
+
+ {{item.name}}
+
+
+
+ {{iitem.name}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 立即购买
+
+
+
+
+
+ 已锁定
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/mine/index.vue b/pages/mine/index.vue
new file mode 100644
index 0000000..a1ef74d
--- /dev/null
+++ b/pages/mine/index.vue
@@ -0,0 +1,278 @@
+
+
+
+
+ 用户
+
+
+
+ {{ userInfo.nickName }}
+ UID:{{ userInfo.user_id }}
+
+
+
+
+
+
+
+
+
+ 点击登录
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ countInfo.all }}
+ {{ countInfo.payment }}
+ {{ countInfo.delivery }}
+ {{ countInfo.received }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/order/detail.vue b/pages/order/detail.vue
new file mode 100644
index 0000000..9ecbbc6
--- /dev/null
+++ b/pages/order/detail.vue
@@ -0,0 +1,211 @@
+
+
+
+ 1
+ 2
+ 3
+ 4
+
+
+
+
+
+ {{detail.address_info.user_name}} - {{detail.address_info.tel_number}}
+ {{detail.address_info.province_name + detail.address_info.city_name + detail.address_info.county_name + detail.address_info.street_name + detail.address_info.detail_info_new}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{goods.snapshot_info.degree.degree_name}}
+ {{goods.goods_name}}
+
+ 串号:{{goods.goods_no}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 商品总额
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 点我付款
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/order/detail/index copy.vue b/pages/order/detail/index copy.vue
new file mode 100644
index 0000000..4759725
--- /dev/null
+++ b/pages/order/detail/index copy.vue
@@ -0,0 +1,155 @@
+
+
+
+ 1
+ 2
+ 3
+ 4
+
+
+
+
+
+ {{detail.address_info.user_name}} - {{detail.address_info.tel_number}}
+ {{detail.address_info.province_name + detail.address_info.city_name + detail.address_info.county_name + detail.address_info.street_name + detail.address_info.detail_info_new}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{goods.snapshot_info.degree.degree_name}}
+ {{goods.goods_name}}
+
+ 串号:{{goods.goods_no}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 商品总额
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 点我付款
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/order/housePreview.vue b/pages/order/housePreview.vue
new file mode 100644
index 0000000..fef9aee
--- /dev/null
+++ b/pages/order/housePreview.vue
@@ -0,0 +1,396 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ goods?.goods_house?.degree?.degree_name }}
+ {{ goods?.goods_house?.goods_name }}
+
+ 串号:{{ goods?.goods_house?.goods_no }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 件数
+ {{ order_total_num }}件
+
+
+
+
+ 商品总额
+
+
+
+
+
+
+ 合计:
+
+
+
+ 确认下单
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/order/index.vue b/pages/order/index.vue
new file mode 100644
index 0000000..c94a3f3
--- /dev/null
+++ b/pages/order/index.vue
@@ -0,0 +1,428 @@
+
+
+
+
+
+
+
+
+ 搜索
+
+
+
+
+
+
+
+ {{item.title}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{goods.snapshot_info.degree.degree_name}}
+ {{goods.goods_name}}
+
+ 串号:{{goods.goods_no}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/order/preview.vue b/pages/order/preview.vue
new file mode 100644
index 0000000..46711b5
--- /dev/null
+++ b/pages/order/preview.vue
@@ -0,0 +1,301 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ goods.degree.degree_name }}
+ {{ goods.goods_name }}
+
+ 串号:{{ goods.goods_no }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 件数
+ {{ order_total_num }}件
+
+
+
+
+ 商品总额
+
+
+
+
+
+
+
+
+
+
+ 合计:
+
+
+
+ 确认下单
+
+
+
+
+
+
+
diff --git a/pages/webview/index.vue- b/pages/webview/index.vue-
new file mode 100644
index 0000000..f5e12d8
--- /dev/null
+++ b/pages/webview/index.vue-
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/static/empty.png b/static/empty.png
new file mode 100644
index 0000000..b458a1f
Binary files /dev/null and b/static/empty.png differ
diff --git a/static/iconfont/parts-icon.svg b/static/iconfont/parts-icon.svg
new file mode 100644
index 0000000..0e9da50
--- /dev/null
+++ b/static/iconfont/parts-icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/static/iconfont/phone-icon.svg b/static/iconfont/phone-icon.svg
new file mode 100644
index 0000000..28fdbb1
--- /dev/null
+++ b/static/iconfont/phone-icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/static/logo.png b/static/logo.png
new file mode 100644
index 0000000..b5771e2
Binary files /dev/null and b/static/logo.png differ
diff --git a/static/package.svg b/static/package.svg
new file mode 100644
index 0000000..74ab161
--- /dev/null
+++ b/static/package.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/static/scan.png b/static/scan.png
new file mode 100644
index 0000000..e9bf8fc
Binary files /dev/null and b/static/scan.png differ
diff --git a/static/search.png b/static/search.png
new file mode 100644
index 0000000..9e42970
Binary files /dev/null and b/static/search.png differ
diff --git a/static/tabbar/2.png b/static/tabbar/2.png
new file mode 100644
index 0000000..109e274
Binary files /dev/null and b/static/tabbar/2.png differ
diff --git a/static/tabbar/2_a.png b/static/tabbar/2_a.png
new file mode 100644
index 0000000..247d686
Binary files /dev/null and b/static/tabbar/2_a.png differ
diff --git a/static/tabbar/5.png b/static/tabbar/5.png
new file mode 100644
index 0000000..d8f4190
Binary files /dev/null and b/static/tabbar/5.png differ
diff --git a/static/tabbar/5_a.png b/static/tabbar/5_a.png
new file mode 100644
index 0000000..df51f97
Binary files /dev/null and b/static/tabbar/5_a.png differ
diff --git a/static/tabbar/cart-active.png b/static/tabbar/cart-active.png
new file mode 100644
index 0000000..d50b399
Binary files /dev/null and b/static/tabbar/cart-active.png differ
diff --git a/static/tabbar/cart.png b/static/tabbar/cart.png
new file mode 100644
index 0000000..7bb3a5d
Binary files /dev/null and b/static/tabbar/cart.png differ
diff --git a/static/tabbar/cate-active.png b/static/tabbar/cate-active.png
new file mode 100644
index 0000000..0718f58
Binary files /dev/null and b/static/tabbar/cate-active.png differ
diff --git a/static/tabbar/cate.png b/static/tabbar/cate.png
new file mode 100644
index 0000000..8290f99
Binary files /dev/null and b/static/tabbar/cate.png differ
diff --git a/static/tabbar/home-active.png b/static/tabbar/home-active.png
new file mode 100644
index 0000000..194e4cf
Binary files /dev/null and b/static/tabbar/home-active.png differ
diff --git a/static/tabbar/home.png b/static/tabbar/home.png
new file mode 100644
index 0000000..26eeb5a
Binary files /dev/null and b/static/tabbar/home.png differ
diff --git a/static/tabbar/user-active.png b/static/tabbar/user-active.png
new file mode 100644
index 0000000..34646bc
Binary files /dev/null and b/static/tabbar/user-active.png differ
diff --git a/static/tabbar/user.png b/static/tabbar/user.png
new file mode 100644
index 0000000..5a06b27
Binary files /dev/null and b/static/tabbar/user.png differ
diff --git a/types/contorl.d.ts b/types/contorl.d.ts
new file mode 100644
index 0000000..817948e
--- /dev/null
+++ b/types/contorl.d.ts
@@ -0,0 +1,40 @@
+export
+interface EditGoodsParams {
+ /**
+ * 子类
+ */
+ degree_id: number;
+ /**
+ * 配件id
+ */
+ goods_id: number;
+ /**
+ * 价格
+ */
+ goods_price: number;
+ /**
+ * 排序
+ */
+ goods_sort: number;
+ /**
+ * 状态 10 上架 20 下架
+ */
+ goods_status: number;
+ /**
+ * 库存
+ */
+ goods_stock: number;
+ /**
+ * 图片传递id数组
+ */
+ images: number[];
+ /**
+ * 机型
+ */
+ product_id: number;
+ /**
+ * 分类
+ */
+ type_id: number;
+ [property: string]: any;
+}
\ No newline at end of file
diff --git a/types/tabbar.d.ts b/types/tabbar.d.ts
new file mode 100644
index 0000000..be034c1
--- /dev/null
+++ b/types/tabbar.d.ts
@@ -0,0 +1,8 @@
+
+export interface TabItem {
+ pagePath : string;
+ iconPath : string;
+ selectedIconPath : string;
+ text : string;
+ // badge ?: number | string;
+}
\ No newline at end of file
diff --git a/uni.promisify.adaptor.js b/uni.promisify.adaptor.js
new file mode 100644
index 0000000..5fec4f3
--- /dev/null
+++ b/uni.promisify.adaptor.js
@@ -0,0 +1,13 @@
+uni.addInterceptor({
+ returnValue (res) {
+ if (!(!!res && (typeof res === "object" || typeof res === "function") && typeof res.then === "function")) {
+ return res;
+ }
+ return new Promise((resolve, reject) => {
+ res.then((res) => {
+ if (!res) return resolve(res)
+ return res[0] ? reject(res[0]) : resolve(res[1])
+ });
+ });
+ },
+});
\ No newline at end of file
diff --git a/uni.scss b/uni.scss
new file mode 100644
index 0000000..7d54617
--- /dev/null
+++ b/uni.scss
@@ -0,0 +1,154 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+
+/* 颜色变量 */
+
+/* 行为相关颜色 */
+$uni-color-primary: #007aff;
+$uni-color-success: #4cd964;
+$uni-color-warning: #f0ad4e;
+$uni-color-error: #dd524d;
+
+/* 文字基本颜色 */
+$uni-text-color:#333;//基本色
+$uni-text-color-inverse:#fff;//反色
+$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息
+$uni-text-color-placeholder: #808080;
+$uni-text-color-disable:#c0c0c0;
+
+/* 背景颜色 */
+$uni-bg-color:#ffffff;
+$uni-bg-color-grey:#f8f8f8;
+$uni-bg-color-hover:#f1f1f1;//点击状态颜色
+$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色
+
+/* 边框颜色 */
+$uni-border-color:#c8c7cc;
+
+/* 尺寸变量 */
+
+/* 文字尺寸 */
+$uni-font-size-sm:12px;
+$uni-font-size-base:14px;
+$uni-font-size-lg:16px;
+
+/* 图片尺寸 */
+$uni-img-size-sm:20px;
+$uni-img-size-base:26px;
+$uni-img-size-lg:40px;
+
+/* Border Radius */
+$uni-border-radius-sm: 2px;
+$uni-border-radius-base: 3px;
+$uni-border-radius-lg: 6px;
+$uni-border-radius-circle: 50%;
+
+/* 水平间距 */
+$uni-spacing-row-sm: 5px;
+$uni-spacing-row-base: 10px;
+$uni-spacing-row-lg: 15px;
+
+/* 垂直间距 */
+$uni-spacing-col-sm: 4px;
+$uni-spacing-col-base: 8px;
+$uni-spacing-col-lg: 12px;
+
+/* 透明度 */
+$uni-opacity-disabled: 0.3; // 组件禁用态的透明度
+
+/* 文章场景相关 */
+$uni-color-title: #2C405A; // 文章标题颜色
+$uni-font-size-title:20px;
+$uni-color-subtitle: #555555; // 二级标题颜色
+$uni-font-size-subtitle:26px;
+$uni-color-paragraph: #3F536E; // 文章段落颜色
+$uni-font-size-paragraph:15px;
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+
+/* 颜色变量 */
+
+/* 行为相关颜色 */
+$uni-color-primary: #007aff;
+$uni-color-success: #4cd964;
+$uni-color-warning: #f0ad4e;
+$uni-color-error: #dd524d;
+
+/* 文字基本颜色 */
+$uni-text-color:#333;//基本色
+$uni-text-color-inverse:#fff;//反色
+$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息
+$uni-text-color-placeholder: #808080;
+$uni-text-color-disable:#c0c0c0;
+
+/* 背景颜色 */
+$uni-bg-color:#ffffff;
+$uni-bg-color-grey:#f8f8f8;
+$uni-bg-color-hover:#f1f1f1;//点击状态颜色
+$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色
+
+/* 边框颜色 */
+$uni-border-color:#c8c7cc;
+
+/* 尺寸变量 */
+
+/* 文字尺寸 */
+$uni-font-size-sm:12px;
+$uni-font-size-base:14px;
+$uni-font-size-lg:16px;
+
+/* 图片尺寸 */
+$uni-img-size-sm:20px;
+$uni-img-size-base:26px;
+$uni-img-size-lg:40px;
+
+/* Border Radius */
+$uni-border-radius-sm: 2px;
+$uni-border-radius-base: 3px;
+$uni-border-radius-lg: 6px;
+$uni-border-radius-circle: 50%;
+
+/* 水平间距 */
+$uni-spacing-row-sm: 5px;
+$uni-spacing-row-base: 10px;
+$uni-spacing-row-lg: 15px;
+
+/* 垂直间距 */
+$uni-spacing-col-sm: 4px;
+$uni-spacing-col-base: 8px;
+$uni-spacing-col-lg: 12px;
+
+/* 透明度 */
+$uni-opacity-disabled: 0.3; // 组件禁用态的透明度
+
+/* 文章场景相关 */
+$uni-color-title: #2C405A; // 文章标题颜色
+$uni-font-size-title:20px;
+$uni-color-subtitle: #555555; // 二级标题颜色
+$uni-font-size-subtitle:26px;
+$uni-color-paragraph: #3F536E; // 文章段落颜色
+$uni-font-size-paragraph:15px;
+
+@import "@/uni_modules/nutui-uni/styles/variables.scss";
\ No newline at end of file
diff --git a/uni_modules/nutui-uni/LICENSE b/uni_modules/nutui-uni/LICENSE
new file mode 100644
index 0000000..a4b4433
--- /dev/null
+++ b/uni_modules/nutui-uni/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2022 yang1206
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/uni_modules/nutui-uni/README.md b/uni_modules/nutui-uni/README.md
new file mode 100644
index 0000000..3a9c353
--- /dev/null
+++ b/uni_modules/nutui-uni/README.md
@@ -0,0 +1,83 @@
+
+
+
+nutui-uniapp
+京东风格的轻量级 uni-app 组件库,支持移动端 H5 和 小程序开发
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+## 感谢
+
+- [ano-ui](https://github.com/ano-ui/ano-ui)
+- [NutUi](https://github.com/jdf2e/nutui)
+- [Uni-NutUi](https://github.com/jwaterwater/uni-nutui)
+- [vin-ui](https://github.com/vingogo/vin-ui)
+- [uni-helper](https://github.com/uni-helper)
+
+## License
+
+[MIT](https://github.com/nutui-uniapp/nutui-uniapp/blob/main/LICENSE) License © 2023-PRESENT [Yang1206](https://github.com/yang1206) and all contributors.
diff --git a/uni_modules/nutui-uni/attributes.json b/uni_modules/nutui-uni/attributes.json
new file mode 100644
index 0000000..01196a7
--- /dev/null
+++ b/uni_modules/nutui-uni/attributes.json
@@ -0,0 +1,4318 @@
+{
+ "nut-button/type": {
+ "type": "string",
+ "description": "default: default.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/button.html#props)"
+ },
+ "nut-button/form-type": {
+ "type": "string",
+ "description": "default: button.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/button.html#props)"
+ },
+ "nut-button/size": {
+ "type": "string",
+ "description": "default: normal.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/button.html#props)"
+ },
+ "nut-button/shape": {
+ "type": "string",
+ "description": "default: round.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/button.html#props)"
+ },
+ "nut-button/custom-color": {
+ "type": "string",
+ "description": "[Docs](https://nutui-uniapp.pages.dev/components/basic/button.html#props)"
+ },
+ "nut-button/plain": {
+ "type": "boolean",
+ "description": "default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/button.html#props)"
+ },
+ "nut-button/disabled": {
+ "type": "boolean",
+ "description": "default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/button.html#props)"
+ },
+ "nut-button/block": {
+ "type": "boolean",
+ "description": "default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/button.html#props)"
+ },
+ "nut-button/loading": {
+ "type": "boolean",
+ "description": "default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/button.html#props)"
+ },
+ "nut-button/open-type`v1.1.5`": {
+ "type": "string",
+ "description": "[Docs](https://nutui-uniapp.pages.dev/components/basic/button.html#props)"
+ },
+ "nut-button/lang`v1.1.5`": {
+ "type": "string",
+ "description": "default: en.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/button.html#props)"
+ },
+ "nut-button/session-from`v1.1.5`": {
+ "type": "string",
+ "description": "[Docs](https://nutui-uniapp.pages.dev/components/basic/button.html#props)"
+ },
+ "nut-button/send-message-title`v1.1.5`": {
+ "type": "string",
+ "description": "[Docs](https://nutui-uniapp.pages.dev/components/basic/button.html#props)"
+ },
+ "nut-button/send-message-path`v1.1.5`": {
+ "type": "string",
+ "description": "[Docs](https://nutui-uniapp.pages.dev/components/basic/button.html#props)"
+ },
+ "nut-button/send-message-img`v1.1.5`": {
+ "type": "string",
+ "description": "[Docs](https://nutui-uniapp.pages.dev/components/basic/button.html#props)"
+ },
+ "nut-button/show-message-card`v1.1.5`": {
+ "type": "string",
+ "description": "[Docs](https://nutui-uniapp.pages.dev/components/basic/button.html#props)"
+ },
+ "nut-button/hover-class`v1.6.7`": {
+ "type": "string",
+ "description": "default: button-hover.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/button.html#props)"
+ },
+ "nut-button/hover-start-time`v1.6.7`": {
+ "type": "number",
+ "description": "default: 20.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/button.html#props)"
+ },
+ "nut-button/hover-stay-time`v1.6.7`": {
+ "type": "number",
+ "description": "default: 70.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/button.html#props)"
+ },
+ "nut-button/click": {
+ "type": "event",
+ "description": "点击按钮时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/button.html#events)"
+ },
+ "nut-button/getphonenumber": {
+ "type": "event",
+ "description": "查看[button](https://uniapp.dcloud.net.cn/component/button.html)\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/button.html#events)"
+ },
+ "nut-button/getuserinfo": {
+ "type": "event",
+ "description": "查看[button](https://uniapp.dcloud.net.cn/component/button.html)\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/button.html#events)"
+ },
+ "nut-button/error": {
+ "type": "event",
+ "description": "查看[button](https://uniapp.dcloud.net.cn/component/button.html)\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/button.html#events)"
+ },
+ "nut-button/opensetting": {
+ "type": "event",
+ "description": "查看[button](https://uniapp.dcloud.net.cn/component/button.html)\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/button.html#events)"
+ },
+ "nut-button/launchapp": {
+ "type": "event",
+ "description": "查看[button](https://uniapp.dcloud.net.cn/component/button.html)\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/button.html#events)"
+ },
+ "nut-button/contact": {
+ "type": "event",
+ "description": "查看[button](https://uniapp.dcloud.net.cn/component/button.html)\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/button.html#events)"
+ },
+ "nut-button/chooseavatar": {
+ "type": "event",
+ "description": "查看[button](https://uniapp.dcloud.net.cn/component/button.html)\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/button.html#events)"
+ },
+ "nut-button/agreeprivacyauthorization": {
+ "type": "event",
+ "description": "查看[button](https://uniapp.dcloud.net.cn/component/button.html)\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/button.html#events)"
+ },
+ "nut-button/addgroupapp": {
+ "type": "event",
+ "description": "查看[button](https://uniapp.dcloud.net.cn/component/button.html)\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/button.html#events)"
+ },
+ "nut-button/chooseaddress": {
+ "type": "event",
+ "description": "查看[button](https://uniapp.dcloud.net.cn/component/button.html)\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/button.html#events)"
+ },
+ "nut-button/chooseinvoicetitle": {
+ "type": "event",
+ "description": "查看[button](https://uniapp.dcloud.net.cn/component/button.html)\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/button.html#events)"
+ },
+ "nut-button/subscribe": {
+ "type": "event",
+ "description": "查看[button](https://uniapp.dcloud.net.cn/component/button.html)\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/button.html#events)"
+ },
+ "nut-button/login": {
+ "type": "event",
+ "description": "查看[button](https://uniapp.dcloud.net.cn/component/button.html)\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/button.html#events)"
+ },
+ "nut-button/im": {
+ "type": "event",
+ "description": "查看[button](https://uniapp.dcloud.net.cn/component/button.html)\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/button.html#events)"
+ },
+ "nut-cell-group/title": {
+ "type": "string",
+ "description": "分组标题\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/cell.html#cellgroup-props)"
+ },
+ "nut-cell-group/desc": {
+ "type": "string",
+ "description": "分组描述\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/cell.html#cellgroup-props)"
+ },
+ "nut-cell/title": {
+ "type": "string",
+ "description": "标题名称\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/cell.html#cell-props)"
+ },
+ "nut-cell/sub-title": {
+ "type": "string",
+ "description": "左侧副标题\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/cell.html#cell-props)"
+ },
+ "nut-cell/desc": {
+ "type": "string",
+ "description": "右侧描述\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/cell.html#cell-props)"
+ },
+ "nut-cell/desc-text-align": {
+ "type": "string",
+ "description": "右侧描述文本对齐方式 [text-align](https://www.w3school.com.cn/cssref/pr_text_text-align.asp), default: right.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/cell.html#cell-props)"
+ },
+ "nut-cell/is-link": {
+ "type": "boolean",
+ "description": "是否展示右侧箭头并开启点击反馈, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/cell.html#cell-props)"
+ },
+ "nut-cell/to": {
+ "type": "string",
+ "description": "跳转地址(uni.navigateTo的url参数)\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/cell.html#cell-props)"
+ },
+ "nut-cell/round-radius": {
+ "type": "number",
+ "description": "圆角半径, default: 6px.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/cell.html#cell-props)"
+ },
+ "nut-cell/center": {
+ "type": "boolean",
+ "description": "是否使内容垂直居中, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/cell.html#cell-props)"
+ },
+ "nut-cell/size": {
+ "type": "string",
+ "description": "单元格大小,可选值为 `large`\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/cell.html#cell-props)"
+ },
+ "nut-cell/click": {
+ "type": "event",
+ "description": "点击事件\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/cell.html#cell-events)"
+ },
+ "nut-config-provider/theme": {
+ "type": "string",
+ "description": "主题风格,设置为 `dark` 来开启深色模式,全局生效\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/configprovider.html#props)"
+ },
+ "nut-config-provider/theme-vars": {
+ "type": "object",
+ "description": "自定义主题变量\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/configprovider.html#props)"
+ },
+ "nut-config-provider/z-index": {
+ "type": "number",
+ "description": "设置所有弹窗类组件的 z-index,该属性对全局生效, default: 2000.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/configprovider.html#props)"
+ },
+ "nut-icon/name": {
+ "type": "String",
+ "description": "图标名称或图片链接\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/icon.html#props)"
+ },
+ "nut-icon/custom-color": {
+ "type": "String",
+ "description": "图标颜色\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/icon.html#props)"
+ },
+ "nut-icon/size": {
+ "type": "String or Number",
+ "description": "图标大小,如 `20px` `2em` `2rem`\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/icon.html#props)"
+ },
+ "nut-icon/font-class-name": {
+ "type": "String",
+ "description": "自定义 icon 字体基础类名, default: nutui-iconfont.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/icon.html#props)"
+ },
+ "nut-icon/class-prefix": {
+ "type": "String",
+ "description": "自定义 icon 类名前缀,用于使用自定义图标, default: nut-icon.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/icon.html#props)"
+ },
+ "nut-icon/click": {
+ "type": "event",
+ "description": "点击图标时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/icon.html#events)"
+ },
+ "nut-overlay/v-model:visible": {
+ "type": "boolean",
+ "description": "控制遮罩的显示/隐藏, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/overlay.html#props)"
+ },
+ "nut-overlay/z-index": {
+ "type": "string | number",
+ "description": "自定义遮罩层级, default: 300.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/overlay.html#props)"
+ },
+ "nut-overlay/duration": {
+ "type": "string | number",
+ "description": "显示/隐藏的动画时长,单位毫秒, default: 300.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/overlay.html#props)"
+ },
+ "nut-overlay/overlay-class": {
+ "type": "string",
+ "description": "自定义遮罩类名\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/overlay.html#props)"
+ },
+ "nut-overlay/overlay-style": {
+ "type": "CSSProperties",
+ "description": "自定义遮罩样式\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/overlay.html#props)"
+ },
+ "nut-overlay/lock-scroll": {
+ "type": "boolean",
+ "description": "遮罩显示时的背景是否锁定, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/overlay.html#props)"
+ },
+ "nut-overlay/close-on-click-overlay": {
+ "type": "boolean",
+ "description": "点击遮罩时是否关闭, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/overlay.html#props)"
+ },
+ "nut-overlay/click": {
+ "type": "event",
+ "description": "点击时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/overlay.html#events)"
+ },
+ "nut-popup/v-model:visible": {
+ "type": "boolean",
+ "description": "控制当前组件显示/隐藏, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/popup.html#props)"
+ },
+ "nut-popup/z-index": {
+ "type": "string | number",
+ "description": "遮罩层级, default: 2000+.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/popup.html#props)"
+ },
+ "nut-popup/duration": {
+ "type": "string | number",
+ "description": "组件显示/隐藏的动画时长,单位秒, default: 0.3.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/popup.html#props)"
+ },
+ "nut-popup/lock-scroll": {
+ "type": "boolean",
+ "description": "背景是否锁定, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/popup.html#props)"
+ },
+ "nut-popup/overlay": {
+ "type": "boolean",
+ "description": "是否显示遮罩, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/popup.html#props)"
+ },
+ "nut-popup/close-on-click-overlay": {
+ "type": "boolean",
+ "description": "是否点击遮罩关闭, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/popup.html#props)"
+ },
+ "nut-popup/position": {
+ "type": "string",
+ "description": "弹出位置(top,bottom,left,right,center), default: center.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/popup.html#props)"
+ },
+ "nut-popup/transition": {
+ "type": "string",
+ "description": "动画名\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/popup.html#props)"
+ },
+ "nut-popup/custom-style": {
+ "type": "CSSProperties",
+ "description": "自定义弹框样式\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/popup.html#props)"
+ },
+ "nut-popup/pop-class": {
+ "type": "string",
+ "description": "自定义弹框类名\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/popup.html#props)"
+ },
+ "nut-popup/closeable": {
+ "type": "boolean",
+ "description": "是否显示关闭按钮, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/popup.html#props)"
+ },
+ "nut-popup/close-icon-position": {
+ "type": "string",
+ "description": "关闭按钮位置(top-left,top-right,bottom-left,bottom-right), default: top-right.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/popup.html#props)"
+ },
+ "nut-popup/close-icon": {
+ "type": "string",
+ "description": "[图标名称](/components/basic/icon) 或图片链接, default: close.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/popup.html#props)"
+ },
+ "nut-popup/destroy-on-close": {
+ "type": "boolean",
+ "description": "弹层关闭后 `slot`内容会不会清空, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/popup.html#props)"
+ },
+ "nut-popup/round": {
+ "type": "boolean",
+ "description": "是否显示圆角, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/popup.html#props)"
+ },
+ "nut-popup/overlay-class": {
+ "type": "string",
+ "description": "自定义遮罩层类名\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/popup.html#props)"
+ },
+ "nut-popup/overlay-style": {
+ "type": "string",
+ "description": "自定义遮罩层样式\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/popup.html#props)"
+ },
+ "nut-popup/safe-area-inset-bottom": {
+ "type": "boolean",
+ "description": "是否开启 iphone 系列全面屏底部安全区适配,仅当 `position` 为 `bottom` 时有效, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/popup.html#props)"
+ },
+ "nut-popup/click-pop": {
+ "type": "event",
+ "description": "点击弹出层时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/popup.html#events)"
+ },
+ "nut-popup/click-close-icon": {
+ "type": "event",
+ "description": "点击关闭图标时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/popup.html#events)"
+ },
+ "nut-popup/open": {
+ "type": "event",
+ "description": "打开弹框时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/popup.html#events)"
+ },
+ "nut-popup/close": {
+ "type": "event",
+ "description": "关闭弹框时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/popup.html#events)"
+ },
+ "nut-popup/opened": {
+ "type": "event",
+ "description": "遮罩打开动画结束时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/popup.html#events)"
+ },
+ "nut-popup/closed": {
+ "type": "event",
+ "description": "遮罩关闭动画结束时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/popup.html#events)"
+ },
+ "nut-popup/click-overlay": {
+ "type": "event",
+ "description": "点击遮罩触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/popup.html#events)"
+ },
+ "nut-transition/name": {
+ "type": "`NutAnimationName`",
+ "description": "内置动画名称,可选值为 `fade` `fade-up` `fade-down` f`ade-left` `fade-right` `slide-up` `slide-down` `slide-left` `slide-right` `zoom`, default: fade.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/transition.html#props)"
+ },
+ "nut-transition/show": {
+ "type": "boolean",
+ "description": "是否展示过渡动画级, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/transition.html#props)"
+ },
+ "nut-transition/duration": {
+ "type": "string | number",
+ "description": "动画时长,单位为毫秒, default: 300.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/transition.html#props)"
+ },
+ "nut-transition/timingFunction": {
+ "type": "`NutAnimationtimingFunction`",
+ "description": "动画函数, default: ease.\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/transition.html#props)"
+ },
+ "nut-transition/customClass": {
+ "type": "`ClassType`",
+ "description": "自定义class\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/transition.html#props)"
+ },
+ "nut-transition/customStyle": {
+ "type": "`StyleValue`",
+ "description": "自定义style\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/transition.html#props)"
+ },
+ "nut-transition/before-enter": {
+ "type": "event",
+ "description": "进入过渡动画前触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/transition.html#events)"
+ },
+ "nut-transition/enter": {
+ "type": "event",
+ "description": "进入过渡动画时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/transition.html#events)"
+ },
+ "nut-transition/after-enter": {
+ "type": "event",
+ "description": "进入过渡动画后触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/transition.html#events)"
+ },
+ "nut-transition/before-leave": {
+ "type": "event",
+ "description": "离开过渡动画前触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/transition.html#events)"
+ },
+ "nut-transition/leave": {
+ "type": "event",
+ "description": "离开过渡动画时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/transition.html#events)"
+ },
+ "nut-transition/after-leave": {
+ "type": "event",
+ "description": "离开过渡动画后触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/basic/transition.html#events)"
+ },
+ "nut-doll-machine/prize-list": {
+ "type": "Array",
+ "description": "奖品列表, default: 目前需要至少 4 个奖品.\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/dollmachine.html#props)"
+ },
+ "nut-doll-machine/default-claw": {
+ "type": "string",
+ "description": "初始化爪子的图片链接\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/dollmachine.html#props)"
+ },
+ "nut-doll-machine/active-claw": {
+ "type": "string",
+ "description": "爪子抓到奖品的图片链接\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/dollmachine.html#props)"
+ },
+ "nut-doll-machine/prize-index": {
+ "type": "Number",
+ "description": "中奖奖品在列表的索引位置, default: -1(-1 未中奖).\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/dollmachine.html#props)"
+ },
+ "nut-doll-machine/init": {
+ "type": "event",
+ "description": "游戏初始化\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/dollmachine.html#events)"
+ },
+ "nut-doll-machine/start-turns": {
+ "type": "event",
+ "description": "爪子开始下伸,赋值到 prize-index\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/dollmachine.html#events)"
+ },
+ "nut-doll-machine/end-turns": {
+ "type": "event",
+ "description": "爪子已经抓到/未抓到奖品触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/dollmachine.html#events)"
+ },
+ "nut-gift-box/init": {
+ "type": "event",
+ "description": "礼盒初始化\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/giftbox.html#events)"
+ },
+ "nut-gift-box/start-turns": {
+ "type": "event",
+ "description": "礼盒打开时候的回调函数\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/giftbox.html#events)"
+ },
+ "nut-gift-box/end-turns": {
+ "type": "event",
+ "description": "礼盒打开后的回调函数\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/giftbox.html#events)"
+ },
+ "nut-hiteggs/num": {
+ "type": "number",
+ "description": "金蛋个数, default: 9.\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/hiteggs.html#props)"
+ },
+ "nut-hiteggs/intact-img": {
+ "type": "String",
+ "description": "完整金蛋图片地址\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/hiteggs.html#props)"
+ },
+ "nut-hiteggs/hammer": {
+ "type": "String",
+ "description": "锤子图片\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/hiteggs.html#props)"
+ },
+ "nut-hiteggs/width": {
+ "type": "String",
+ "description": "金蛋图片宽度, default: 80px.\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/hiteggs.html#props)"
+ },
+ "nut-hiteggs/height": {
+ "type": "String",
+ "description": "金蛋图片高度, default: 80px.\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/hiteggs.html#props)"
+ },
+ "nut-hiteggs/click": {
+ "type": "event",
+ "description": "砸击金蛋后触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/hiteggs.html#events)"
+ },
+ "nut-marquee/prize-list": {
+ "type": "Array",
+ "description": "奖品列表, default: [].\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/marquee.html#props)"
+ },
+ "nut-marquee/prize-index": {
+ "type": "Number",
+ "description": "中奖奖品在列表的索引位置, default: -1.\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/marquee.html#props)"
+ },
+ "nut-marquee/speed": {
+ "type": "Number",
+ "description": "转动速度, default: 150.\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/marquee.html#props)"
+ },
+ "nut-marquee/circle": {
+ "type": "Number",
+ "description": "转动圈数, default: 30.\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/marquee.html#props)"
+ },
+ "nut-marquee/disabled": {
+ "type": "Boolean",
+ "description": "是否禁用开始抽奖点击数, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/marquee.html#props)"
+ },
+ "nut-marquee/style-opt": {
+ "type": "Object",
+ "description": "跑马灯中的样式:bgStyle-整个容器样式,itemStyle-每个奖品样式,startStyle-中间按钮样式, default: {bgStyle: {},itemStyle: {},startStyle:{}}.\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/marquee.html#props)"
+ },
+ "nut-marquee/start-turns": {
+ "type": "event",
+ "description": "开始跑动的回调函数,此时将接口中的中奖索引,赋值到 prize-index\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/marquee.html#events)"
+ },
+ "nut-marquee/end-turns": {
+ "type": "event",
+ "description": "停止跑动后的回调函数\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/marquee.html#events)"
+ },
+ "nut-shake-dice/time": {
+ "type": "string",
+ "description": "旋转时间, default: 1.\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/shakedice.html#props)"
+ },
+ "nut-shake-dice/speed": {
+ "type": "number",
+ "description": "旋转速度,ms, default: 3000.\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/shakedice.html#props)"
+ },
+ "nut-shake-dice/id": {
+ "type": "number",
+ "description": "中奖的 id(1 为 1 点,依次类推), default: 1.\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/shakedice.html#props)"
+ },
+ "nut-shake-dice/shake": {
+ "type": "event",
+ "description": "骰子开始摇动\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/shakedice.html#events)"
+ },
+ "nut-shake-dice/end": {
+ "type": "event",
+ "description": "骰子摇动结束\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/shakedice.html#events)"
+ },
+ "nut-turntable/width": {
+ "type": "String",
+ "description": "转盘的宽度, default: 300px.\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/turntable.html#props)"
+ },
+ "nut-turntable/height": {
+ "type": "String",
+ "description": "转盘的高度, default: 300px.\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/turntable.html#props)"
+ },
+ "nut-turntable/prize-list": {
+ "type": "Array",
+ "description": "奖品列表\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/turntable.html#props)"
+ },
+ "nut-turntable/turns-number": {
+ "type": "Number",
+ "description": "转动的圈数, default: 5.\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/turntable.html#props)"
+ },
+ "nut-turntable/turns-time": {
+ "type": "Number",
+ "description": "从开始转动到结束所用时间, default: 5(单位是秒).\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/turntable.html#props)"
+ },
+ "nut-turntable/prize-index": {
+ "type": "Number",
+ "description": "中奖奖品在列表的索引位置, default: -1.\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/turntable.html#props)"
+ },
+ "nut-turntable/lock-time": {
+ "type": "Number",
+ "description": "下次抽奖的间隔时间, default: 0(单位是秒).\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/turntable.html#props)"
+ },
+ "nut-turntable/style-opt": {
+ "type": "Object",
+ "description": "转盘中的样式,包括每个扇区的背景颜色(在每条数据中页可单独设置 prizeColor),扇区的边框颜色, default: {prizeBgColors: [],borderColor: }.\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/turntable.html#props)"
+ },
+ "nut-turntable/pointer-style": {
+ "type": "Object",
+ "description": "转盘中指针的样式,包括背景图片、大小等, default: {width: 80px,height: 80px}.\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/turntable.html#props)"
+ },
+ "nut-turntable/rotate-turns": {
+ "type": "event",
+ "description": "开始滚动,手动触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/turntable.html#events)"
+ },
+ "nut-turntable/start-turns": {
+ "type": "event",
+ "description": "转盘开始转动的回调函数,此时将接口中的中奖索引,赋值到 prize-index\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/turntable.html#events)"
+ },
+ "nut-turntable/end-turns": {
+ "type": "event",
+ "description": "转盘中停止转动后的回调函数\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/turntable.html#events)"
+ },
+ "nut-turntable/lock-turns": {
+ "type": "event",
+ "description": "禁止抽奖时回调函数\n\n[Docs](https://nutui-uniapp.pages.dev/components/bingo/turntable.html#events)"
+ },
+ "nut-address/v-model:visible": {
+ "type": "boolean",
+ "description": "是否打开地址选择, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/address.html#props)"
+ },
+ "nut-address/v-model:value": {
+ "type": "Array",
+ "description": "设置默认选中值, default: [].\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/address.html#props)"
+ },
+ "nut-address/type": {
+ "type": "string",
+ "description": "地址选择类型 `exist/custom/custom2`, default: custom.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/address.html#props)"
+ },
+ "nut-address/province": {
+ "type": "Array",
+ "description": "省,每个省的对象中,必须有 `name` 字段,如果类型选择 `custom2`,必须指定 `title` 字段为首字母, default: [].\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/address.html#props)"
+ },
+ "nut-address/city": {
+ "type": "Array",
+ "description": "市,每个市的对象中,必须有 `name` 字段,如果类型选择 `custom2`,必须指定 `title` 字段为首字母, default: [].\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/address.html#props)"
+ },
+ "nut-address/country": {
+ "type": "Array",
+ "description": "县,每个县的对象中,必须有 `name` 字段,如果类型选择 `custom2`,必须指定 `title` 字段为首字母, default: [].\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/address.html#props)"
+ },
+ "nut-address/town": {
+ "type": "Array",
+ "description": "乡/镇,每个乡/镇的对象中,必须有 `name` 字段,如果类型选择 `custom2`,必须指定 `title` 字段为首字母, default: [].\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/address.html#props)"
+ },
+ "nut-address/height": {
+ "type": "string | number",
+ "description": "弹层中内容容器的高度,仅在 `type=\"custom2\"` 时有效, default: 200px.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/address.html#props)"
+ },
+ "nut-address/exist-address": {
+ "type": "Array",
+ "description": "已存在地址列表,每个地址对象中,必传值 `provinceName`、`cityName`、`countyName`、`townName`、`addressDetail`、`selectedAddress`(字段解释见下), default: [].\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/address.html#props)"
+ },
+ "nut-address/is-show-custom-address": {
+ "type": "boolean",
+ "description": "是否可以切换自定义地址选择,`type=‘exist’` 时生效, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/address.html#props)"
+ },
+ "nut-address/custom-address-title": {
+ "type": "string",
+ "description": "自定义地址选择文案,`type='custom'` 时生效, default: 请选择所在地区.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/address.html#props)"
+ },
+ "nut-address/exist-address-title": {
+ "type": "string",
+ "description": "已有地址文案 ,`type=‘exist’` 时生效, default: 配送至.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/address.html#props)"
+ },
+ "nut-address/custom-and-exist-title": {
+ "type": "string",
+ "description": "自定义地址与已有地址切换按钮文案 ,`type=‘exist’` 时生效, default: 选择其他地址.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/address.html#props)"
+ },
+ "nut-address/columns-placeholder": {
+ "type": "string | Array",
+ "description": "列提示文字, default: 请选择.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/address.html#props)"
+ },
+ "nut-address/change": {
+ "type": "event",
+ "description": "自定义选择地址时,选择地区时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/address.html#events)"
+ },
+ "nut-address/selected": {
+ "type": "event",
+ "description": "选择已有地址列表时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/address.html#events)"
+ },
+ "nut-address/close": {
+ "type": "event",
+ "description": "地址选择弹框关闭时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/address.html#events)"
+ },
+ "nut-address/close-mask": {
+ "type": "event",
+ "description": "点击遮罩层或点击右上角叉号关闭时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/address.html#events)"
+ },
+ "nut-address/switch-module": {
+ "type": "event",
+ "description": "点击‘选择其他地址’或自定义地址选择左上角返回按钮触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/address.html#events)"
+ },
+ "nut-address-list/data": {
+ "type": "Array",
+ "description": "地址数组\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/addresslist.html#props)"
+ },
+ "nut-address-list/long-press": {
+ "type": "boolean",
+ "description": "长按功能, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/addresslist.html#props)"
+ },
+ "nut-address-list/swipe-edition": {
+ "type": "boolean",
+ "description": "右滑功能, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/addresslist.html#props)"
+ },
+ "nut-address-list/show-bottom-button": {
+ "type": "boolean",
+ "description": "是否展示底部按钮, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/addresslist.html#props)"
+ },
+ "nut-address-list/options": {
+ "type": "Object",
+ "description": "自定义 `key` 值时,设置映射关系\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/addresslist.html#props)"
+ },
+ "nut-address-list/del-icon": {
+ "type": "event",
+ "description": "点击删除图标\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/addresslist.html#events)"
+ },
+ "nut-address-list/edit-icon": {
+ "type": "event",
+ "description": "点击编辑图标\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/addresslist.html#events)"
+ },
+ "nut-address-list/click-item": {
+ "type": "event",
+ "description": "点击地址列表每一项\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/addresslist.html#events)"
+ },
+ "nut-address-list/add": {
+ "type": "event",
+ "description": "点击底部添加地址按钮\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/addresslist.html#events)"
+ },
+ "nut-address-list/long-copy": {
+ "type": "event",
+ "description": "点击复制地址按钮\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/addresslist.html#events)"
+ },
+ "nut-address-list/long-set": {
+ "type": "event",
+ "description": "点击设置默认按钮\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/addresslist.html#events)"
+ },
+ "nut-address-list/long-del": {
+ "type": "event",
+ "description": "点击删除地址按钮\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/addresslist.html#events)"
+ },
+ "nut-address-list/swipe-del": {
+ "type": "event",
+ "description": "默认右滑删除按钮\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/addresslist.html#events)"
+ },
+ "nut-barrage/danmu": {
+ "type": "Array",
+ "description": "弹幕列表数据, default: [].\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/barrage.html#props)"
+ },
+ "nut-barrage/frequency": {
+ "type": "number",
+ "description": "可视区域内每个弹幕出现的时间间隔, default: 500.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/barrage.html#props)"
+ },
+ "nut-barrage/speeds": {
+ "type": "number",
+ "description": "每个弹幕的滚动时间, default: 5000.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/barrage.html#props)"
+ },
+ "nut-barrage/rows": {
+ "type": "number",
+ "description": "弹幕行数,分几行展示, default: 3.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/barrage.html#props)"
+ },
+ "nut-barrage/top": {
+ "type": "number",
+ "description": "弹幕垂直距离, default: 10.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/barrage.html#props)"
+ },
+ "nut-barrage/loop": {
+ "type": "boolean",
+ "description": "是否循环播放, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/barrage.html#props)"
+ },
+ "nut-barrage/add": {
+ "type": "event",
+ "description": "添加数据(通过 ref 实例使用)\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/barrage.html#events)"
+ },
+ "nut-card/img-url": {
+ "type": "string",
+ "description": "左侧图片 `Url`\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/card.html#props)"
+ },
+ "nut-card/title": {
+ "type": "string",
+ "description": "标题\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/card.html#props)"
+ },
+ "nut-card/price": {
+ "type": "string",
+ "description": "商品价格\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/card.html#props)"
+ },
+ "nut-card/vip-price": {
+ "type": "string",
+ "description": "会员价格\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/card.html#props)"
+ },
+ "nut-card/shop-desc": {
+ "type": "string",
+ "description": "店铺介绍\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/card.html#props)"
+ },
+ "nut-card/delivery": {
+ "type": "string",
+ "description": "配送方式\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/card.html#props)"
+ },
+ "nut-card/shop-name": {
+ "type": "string",
+ "description": "店铺名称\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/card.html#props)"
+ },
+ "nut-card/is-need-price": {
+ "type": "boolean",
+ "description": "是否需要价格展示, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/card.html#props)"
+ },
+ "nut-card/click": {
+ "type": "event",
+ "description": "点击事件\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/card.html#events)"
+ },
+ "nut-category/type": {
+ "type": "string",
+ "description": "分类模式:`classify`,`text`,`custom`, default: classify.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/category.html#category-props)"
+ },
+ "nut-category/category": {
+ "type": "Array",
+ "description": "左侧导航栏数据列表, default: [].\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/category.html#category-props)"
+ },
+ "nut-category/change": {
+ "type": "event",
+ "description": "经典分类,点击左侧导航栏,获取右侧数据列表\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/category.html#category-events)"
+ },
+ "nut-category/change-text": {
+ "type": "event",
+ "description": "文本分类模式,更点击左侧导航栏,获取右侧数据列表\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/category.html#category-events)"
+ },
+ "nut-category/change-custom": {
+ "type": "event",
+ "description": "自定义,点击左侧导航栏,获取右侧数据列表\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/category.html#category-events)"
+ },
+ "nut-category-pane/category-child": {
+ "type": "Array",
+ "description": "右侧展示当前分类数据, default: [].\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/category.html#categorypane-props)"
+ },
+ "nut-category-pane/custom-category": {
+ "type": "Array",
+ "description": "自定义分类数据, default: [].\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/category.html#categorypane-props)"
+ },
+ "nut-category-pane/on-change": {
+ "type": "event",
+ "description": "点击右侧分类数据触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/category.html#categorypane-events)"
+ },
+ "nut-comment/header-type": {
+ "type": "string",
+ "description": "头部样式展示类型,可选: `default`,`complex`, default: default.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/comment.html#props)"
+ },
+ "nut-comment/images-rows": {
+ "type": "string",
+ "description": "评论图片展示行数,可选: `one`,`multi`, default: one.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/comment.html#props)"
+ },
+ "nut-comment/ellipsis": {
+ "type": "string | number",
+ "description": "设置评论内容省略行数, default: 2.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/comment.html#props)"
+ },
+ "nut-comment/videos": {
+ "type": "Array",
+ "description": "视频信息, default: [].\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/comment.html#props)"
+ },
+ "nut-comment/images": {
+ "type": "Array",
+ "description": "图片信息, default: [].\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/comment.html#props)"
+ },
+ "nut-comment/info": {
+ "type": "object",
+ "description": "评论详情, default: {}.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/comment.html#props)"
+ },
+ "nut-comment/follow": {
+ "type": "object",
+ "description": "追评内容, default: {}.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/comment.html#props)"
+ },
+ "nut-comment/operation": {
+ "type": "Array",
+ "description": "配置底部按钮, default: [replay, like, more].\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/comment.html#props)"
+ },
+ "nut-comment/click-operate": {
+ "type": "event",
+ "description": "点击底部操作按钮回调函数\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/comment.html#events)"
+ },
+ "nut-comment/click": {
+ "type": "event",
+ "description": "点击评论内容回调函数\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/comment.html#events)"
+ },
+ "nut-comment/click-images": {
+ "type": "event",
+ "description": "点击图片或视频触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/comment.html#events)"
+ },
+ "nut-ecard/model-value": {
+ "type": "number \\ string",
+ "description": "购买电子卡所需价钱, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/ecard.html#props)"
+ },
+ "nut-ecard/list": {
+ "type": "EcardDataItem[]",
+ "description": "电子卡面值预设列表, default: [].\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/ecard.html#props)"
+ },
+ "nut-ecard/choose-text": {
+ "type": "string",
+ "description": "选择面值文案, default: 请选择电子卡面值.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/ecard.html#props)"
+ },
+ "nut-ecard/show-other": {
+ "type": "boolean",
+ "description": "是否显示其他面值控制, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/ecard.html#props)"
+ },
+ "nut-ecard/other-value-text": {
+ "type": "string",
+ "description": "其他面值文案, default: 其他面值.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/ecard.html#props)"
+ },
+ "nut-ecard/placeholder": {
+ "type": "string",
+ "description": "其他面值默认提示语, default: 请输入1-5000整数.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/ecard.html#props)"
+ },
+ "nut-ecard/suffix": {
+ "type": "string",
+ "description": "符号标识, default: ¥.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/ecard.html#props)"
+ },
+ "nut-ecard/card-amount-min": {
+ "type": "number \\ string",
+ "description": "其它面值最小值, default: 1.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/ecard.html#props)"
+ },
+ "nut-ecard/card-amount-max": {
+ "type": "number \\ string",
+ "description": "其他面值最大值, default: 9999.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/ecard.html#props)"
+ },
+ "nut-ecard/show-step": {
+ "type": "boolean",
+ "description": "是否显示是否显示数量步进, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/ecard.html#props)"
+ },
+ "nut-ecard/card-buy-min": {
+ "type": "number",
+ "description": "购买数量最小值, default: 1.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/ecard.html#props)"
+ },
+ "nut-ecard/card-buy-max": {
+ "type": "number",
+ "description": "购买数量最大值, default: 9999.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/ecard.html#props)"
+ },
+ "nut-ecard/update": {
+ "type": "event",
+ "description": "合计金额变化\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/ecard.html#events)"
+ },
+ "nut-ecard/change": {
+ "type": "event",
+ "description": "切换预设面值\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/ecard.html#events)"
+ },
+ "nut-ecard/input-change": {
+ "type": "event",
+ "description": "输入其他面值\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/ecard.html#events)"
+ },
+ "nut-ecard/change-step": {
+ "type": "event",
+ "description": "数量变化\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/ecard.html#events)"
+ },
+ "nut-ecard/input-click": {
+ "type": "event",
+ "description": "点击输入框\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/ecard.html#events)"
+ },
+ "nut-invoice/data": {
+ "type": "Array",
+ "description": "发票数据\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/invoice.html#props)"
+ },
+ "nut-invoice/form-value": {
+ "type": "object",
+ "description": "表单数据对象(使用表单校验时,_必填_)\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/invoice.html#props)"
+ },
+ "nut-invoice/submit": {
+ "type": "boolean",
+ "description": "是否显示提交按钮, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/invoice.html#props)"
+ },
+ "nut-invoice/on-submit": {
+ "type": "event",
+ "description": "提交表单的方法\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/invoice.html#events)"
+ },
+ "nut-signature/custom-class": {
+ "type": "string",
+ "description": "自定义 `class`\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/signature.html#props)"
+ },
+ "nut-signature/line-width": {
+ "type": "number",
+ "description": "线条的宽度, default: 3.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/signature.html#props)"
+ },
+ "nut-signature/stroke-style": {
+ "type": "string",
+ "description": "绘图笔触颜色, default: #000.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/signature.html#props)"
+ },
+ "nut-signature/type": {
+ "type": "string",
+ "description": "图片格式, default: png.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/signature.html#props)"
+ },
+ "nut-signature/un-support-tpl": {
+ "type": "string",
+ "description": "不支持Canvas情况下的展示文案, default: 对不起,当前浏览器不支持Canvas,无法使用本控件!.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/signature.html#props)"
+ },
+ "nut-signature/start": {
+ "type": "event",
+ "description": "签名开始回调函数(指某次笔画的开始)\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/signature.html#events)"
+ },
+ "nut-signature/signing": {
+ "type": "event",
+ "description": "正在签名的回调函数(指某次笔画进行中)\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/signature.html#events)"
+ },
+ "nut-signature/end": {
+ "type": "event",
+ "description": "签名结束回调函数(指某次笔画的结束)\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/signature.html#events)"
+ },
+ "nut-signature/confirm": {
+ "type": "event",
+ "description": "点击确认按钮触发事件回调函数\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/signature.html#events)"
+ },
+ "nut-signature/clear": {
+ "type": "event",
+ "description": "点击重签按钮触发事件回调函数\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/signature.html#events)"
+ },
+ "nut-sku/v-model:visible": {
+ "type": "boolean",
+ "description": "是否显示商品规格弹框, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/sku.html#props)"
+ },
+ "nut-sku/sku": {
+ "type": "Array",
+ "description": "商品 sku 数据, default: [].\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/sku.html#props)"
+ },
+ "nut-sku/goods": {
+ "type": "object",
+ "description": "商品信息\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/sku.html#props)"
+ },
+ "nut-sku/stepper-max": {
+ "type": "string | number",
+ "description": "设置 inputNumber 最大值, default: 99999.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/sku.html#props)"
+ },
+ "nut-sku/stepper-min": {
+ "type": "string | number",
+ "description": "设置 inputNumber 最小值, default: 1.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/sku.html#props)"
+ },
+ "nut-sku/btn-options": {
+ "type": "Array",
+ "description": "底部按钮设置。[`confirm`, `buy`, `cart`] 分别对应确定、立即购买、加入购物车, default: [confirm].\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/sku.html#props)"
+ },
+ "nut-sku/btn-extra-text": {
+ "type": "string",
+ "description": "按钮上部添加文案,默认为空,有值时显示\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/sku.html#props)"
+ },
+ "nut-sku/stepper-title": {
+ "type": "string",
+ "description": "数量选择组件左侧文案, default: 购买数量.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/sku.html#props)"
+ },
+ "nut-sku/stepper-extra-text": {
+ "type": "Function | boolean",
+ "description": "InputNumber 与标题之间的文案, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/sku.html#props)"
+ },
+ "nut-sku/buy-text": {
+ "type": "string",
+ "description": "立即购买按钮文案, default: 立即购买.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/sku.html#props)"
+ },
+ "nut-sku/add-cart-text": {
+ "type": "string",
+ "description": "加入购物车按钮文案, default: 加入购物车.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/sku.html#props)"
+ },
+ "nut-sku/confirm-text": {
+ "type": "string",
+ "description": "确定按钮文案, default: 确定.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/sku.html#props)"
+ },
+ "nut-sku/select-sku": {
+ "type": "event",
+ "description": "切换规格类目时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/sku.html#events)"
+ },
+ "nut-sku/add": {
+ "type": "event",
+ "description": "InputNumber 点击增加按钮时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/sku.html#events)"
+ },
+ "nut-sku/reduce": {
+ "type": "event",
+ "description": "InputNumber 点击减少按钮时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/sku.html#events)"
+ },
+ "nut-sku/overLimit": {
+ "type": "event",
+ "description": "InputNumber 点击不可用的按钮时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/sku.html#events)"
+ },
+ "nut-sku/change-stepper": {
+ "type": "event",
+ "description": "购买变化时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/sku.html#events)"
+ },
+ "nut-sku/click-btn-operate": {
+ "type": "event",
+ "description": "点击底部按钮时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/sku.html#events)"
+ },
+ "nut-sku/click-close-icon": {
+ "type": "event",
+ "description": "点击左上角关闭 icon 时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/sku.html#events)"
+ },
+ "nut-sku/click-overlay": {
+ "type": "event",
+ "description": "点击遮罩时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/sku.html#events)"
+ },
+ "nut-sku/close": {
+ "type": "event",
+ "description": "关闭弹层时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/sku.html#events)"
+ },
+ "nut-time-select/visible": {
+ "type": "boolean",
+ "description": "是否显示弹层, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/timeselect.html#timeselect-props)"
+ },
+ "nut-time-select/height": {
+ "type": "string",
+ "description": "弹层的高度, default: 20%.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/timeselect.html#timeselect-props)"
+ },
+ "nut-time-select/title": {
+ "type": "string",
+ "description": "弹层标题, default: 取件时间.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/timeselect.html#timeselect-props)"
+ },
+ "nut-time-select/current-key": {
+ "type": "string | number",
+ "description": "唯一标识, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/timeselect.html#timeselect-props)"
+ },
+ "nut-time-select/current-time": {
+ "type": "Array",
+ "description": "当前选择的时间,数组元素包含:key: string; list: string[], default: [].\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/timeselect.html#timeselect-props)"
+ },
+ "nut-time-select/lock-scroll": {
+ "type": "boolean",
+ "description": "背景是否锁定, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/timeselect.html#timeselect-props)"
+ },
+ "nut-time-pannel/name": {
+ "type": "string",
+ "description": "显示的名称\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/timeselect.html#timepannel-props)"
+ },
+ "nut-time-pannel/pannel-key": {
+ "type": "string | number",
+ "description": "唯一标识,和 current-key一起标识当前选择的天, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/timeselect.html#timepannel-props)"
+ },
+ "nut-time-detail/times": {
+ "type": "Array",
+ "description": "可选择的时间,数组元素同 `current-time`, default: [].\n\n[Docs](https://nutui-uniapp.pages.dev/components/business/timeselect.html#timedetail-props)"
+ },
+ "nut-calendar/v-model:visible": {
+ "type": "boolean",
+ "description": "是否可见, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/calendar.html#props)"
+ },
+ "nut-calendar/type": {
+ "type": "string",
+ "description": "类型,日期单择`one`,区间选择`range`,日期多选`multiple`,周选择`week`, default: one.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/calendar.html#props)"
+ },
+ "nut-calendar/poppable": {
+ "type": "boolean",
+ "description": "是否弹窗状态展示, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/calendar.html#props)"
+ },
+ "nut-calendar/is-auto-back-fill": {
+ "type": "boolean",
+ "description": "自动回填, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/calendar.html#props)"
+ },
+ "nut-calendar/title": {
+ "type": "string",
+ "description": "显示标题, default: 日期选择.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/calendar.html#props)"
+ },
+ "nut-calendar/default-value": {
+ "type": "string | string[]",
+ "description": "默认值,单个日期选择 `string`,其他为 `string[]`, default: null.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/calendar.html#props)"
+ },
+ "nut-calendar/start-date": {
+ "type": "string",
+ "description": "开始日期, default: 今天.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/calendar.html#props)"
+ },
+ "nut-calendar/end-date": {
+ "type": "string",
+ "description": "结束日期, default: 距离今天 365 天.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/calendar.html#props)"
+ },
+ "nut-calendar/show-today": {
+ "type": "boolean",
+ "description": "是否展示今天标记, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/calendar.html#props)"
+ },
+ "nut-calendar/start-text": {
+ "type": "string",
+ "description": "范围选择,开始信息文案, default: 开始.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/calendar.html#props)"
+ },
+ "nut-calendar/end-text": {
+ "type": "string",
+ "description": "范围选择,结束信息文案, default: 结束.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/calendar.html#props)"
+ },
+ "nut-calendar/confirm-text": {
+ "type": "string",
+ "description": "底部确认按钮文案, default: 确认.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/calendar.html#props)"
+ },
+ "nut-calendar/show-title": {
+ "type": "boolean",
+ "description": "是否在展示日历标题, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/calendar.html#props)"
+ },
+ "nut-calendar/show-sub-title": {
+ "type": "boolean",
+ "description": "是否展示日期标题, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/calendar.html#props)"
+ },
+ "nut-calendar/to-date-animation": {
+ "type": "boolean",
+ "description": "是否启动滚动动画, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/calendar.html#props)"
+ },
+ "nut-calendar/first-day-of-week": {
+ "type": "0-6",
+ "description": "设置周起始日, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/calendar.html#props)"
+ },
+ "nut-calendar/disabled-date": {
+ "type": "function",
+ "description": "一个用来判断该日期是否被禁用的函数,接受一个`年-月-日`作为参数。 应该返回一个 Boolean 值。\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/calendar.html#props)"
+ },
+ "nut-calendar/footer-slot": {
+ "type": "Boolean",
+ "description": "是否使用footer插槽,如果使用,此值必须为 true, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/calendar.html#props)"
+ },
+ "nut-calendar/btn-slot": {
+ "type": "Boolean",
+ "description": "是否使用btn插槽,如果使用,此值必须为 true, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/calendar.html#props)"
+ },
+ "nut-calendar/choose": {
+ "type": "event",
+ "description": "选择之后或是点击确认按钮触发,日期数组(包含年月日和星期)\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/calendar.html#events)"
+ },
+ "nut-calendar/close": {
+ "type": "event",
+ "description": "关闭时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/calendar.html#events)"
+ },
+ "nut-calendar/select": {
+ "type": "event",
+ "description": "点击/选择后触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/calendar.html#events)"
+ },
+ "nut-calendar/click-close-icon": {
+ "type": "event",
+ "description": "点击关闭图标后触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/calendar.html#events)"
+ },
+ "nut-calendar/click-overlay": {
+ "type": "event",
+ "description": "点击遮罩关闭后触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/calendar.html#events)"
+ },
+ "nut-cascader/model-value": {
+ "type": "Array",
+ "description": "选中值,双向绑定\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/cascader.html#props)"
+ },
+ "nut-cascader/v-model:visible": {
+ "type": "boolean",
+ "description": "显示选择层, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/cascader.html#props)"
+ },
+ "nut-cascader/options": {
+ "type": "Array",
+ "description": "级联数据\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/cascader.html#props)"
+ },
+ "nut-cascader/lazy": {
+ "type": "boolean",
+ "description": "是否开启动态加载\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/cascader.html#props)"
+ },
+ "nut-cascader/lazy-load": {
+ "type": "Function",
+ "description": "动态加载回调,开启动态加载时生效\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/cascader.html#props)"
+ },
+ "nut-cascader/value-key": {
+ "type": "string",
+ "description": "自定义 `options` 结构中 `value` 的字段\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/cascader.html#props)"
+ },
+ "nut-cascader/text-key": {
+ "type": "string",
+ "description": "自定义 `options` 结构中 `text` 的字段\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/cascader.html#props)"
+ },
+ "nut-cascader/children-key": {
+ "type": "string",
+ "description": "自定义 `options` 结构中 `children` 的字段\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/cascader.html#props)"
+ },
+ "nut-cascader/convert-config": {
+ "type": "object",
+ "description": "当 `options` 为可转换为树形结构的扁平结构时,配置转换规则\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/cascader.html#props)"
+ },
+ "nut-cascader/title": {
+ "type": "string",
+ "description": "标题\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/cascader.html#props)"
+ },
+ "nut-cascader/close-icon-position": {
+ "type": "string",
+ "description": "取消按钮位置,继承 `Popup` 组件, default: top-right.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/cascader.html#props)"
+ },
+ "nut-cascader/closeable": {
+ "type": "boolean",
+ "description": "是否显示关闭按钮,继承 `Popup` 组件, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/cascader.html#props)"
+ },
+ "nut-cascader/poppable": {
+ "type": "boolean",
+ "description": "是否需要弹层展示(设置为 `false` 后,`title` 失效), default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/cascader.html#props)"
+ },
+ "nut-cascader/title-gutter": {
+ "type": "number | string",
+ "description": "标签间隙, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/cascader.html#props)"
+ },
+ "nut-cascader/title-size": {
+ "type": "string",
+ "description": "标签栏字体尺寸大小 可选值 large normal small, default: normal.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/cascader.html#props)"
+ },
+ "nut-cascader/title-ellipsis": {
+ "type": "boolean",
+ "description": "是否省略过长的标题文字, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/cascader.html#props)"
+ },
+ "nut-cascader/title-type": {
+ "type": "string",
+ "description": "选中底部展示样式 可选值 line、smile, default: line.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/cascader.html#props)"
+ },
+ "nut-cascader/change": {
+ "type": "event",
+ "description": "选中值改变时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/cascader.html#events)"
+ },
+ "nut-cascader/path-change": {
+ "type": "event",
+ "description": "选中项改变时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/cascader.html#events)"
+ },
+ "nut-checkbox/model-value": {
+ "type": "boolean",
+ "description": "是否处于选中状态, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/checkbox.html#checkbox-props)"
+ },
+ "nut-checkbox/disabled": {
+ "type": "boolean",
+ "description": "是否禁用选择, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/checkbox.html#checkbox-props)"
+ },
+ "nut-checkbox/text-position": {
+ "type": "string",
+ "description": "文本所在的位置,可选值:`left`,`right`, default: right.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/checkbox.html#checkbox-props)"
+ },
+ "nut-checkbox/icon-size": {
+ "type": "string | number",
+ "description": "[图标尺寸](/components/basic/icon), default: 18.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/checkbox.html#checkbox-props)"
+ },
+ "nut-checkbox/label": {
+ "type": "string",
+ "description": "复选框的文本内容\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/checkbox.html#checkbox-props)"
+ },
+ "nut-checkbox/indeterminate": {
+ "type": "boolean",
+ "description": "当前是否支持半选状态,一般用在全选操作中, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/checkbox.html#checkbox-props)"
+ },
+ "nut-checkbox/shape": {
+ "type": "String",
+ "description": "形状,可选值:`button`、`round`, default: round.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/checkbox.html#checkbox-props)"
+ },
+ "nut-checkbox/change": {
+ "type": "event",
+ "description": "值变化时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/checkbox.html#checkbox-events)"
+ },
+ "nut-checkbox-group/model-value": {
+ "type": "Array",
+ "description": "当前选中项的标识符,和 `label` 相对应\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/checkbox.html#checkboxgroup-props)"
+ },
+ "nut-checkbox-group/disabled": {
+ "type": "boolean",
+ "description": "是否禁用选择,将用于其下的全部复选框, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/checkbox.html#checkboxgroup-props)"
+ },
+ "nut-checkbox-group/max": {
+ "type": "number",
+ "description": "限制选择的数量,不能和`全选/取消/反选`一起使用, `0`表示没有限制, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/checkbox.html#checkboxgroup-props)"
+ },
+ "nut-checkbox-group/change": {
+ "type": "event",
+ "description": "值变化时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/checkbox.html#checkboxgroup-events)"
+ },
+ "nut-code-input/model-value": {
+ "type": "string",
+ "description": "输入值,双向绑定\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/codeinput.html#props)"
+ },
+ "nut-code-input/adjustPosition": {
+ "type": "Boolean",
+ "description": "键盘弹起时,是否自动上推页面, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/codeinput.html#props)"
+ },
+ "nut-code-input/maxlength": {
+ "type": "`String | Number`",
+ "description": "输入字符个数, default: 4.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/codeinput.html#props)"
+ },
+ "nut-code-input/dot": {
+ "type": "boolean",
+ "description": "是否用圆点填充, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/codeinput.html#props)"
+ },
+ "nut-code-input/mode": {
+ "type": "`box | line`",
+ "description": "选择样式为边框或者横线, default: box.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/codeinput.html#props)"
+ },
+ "nut-code-input/hairline": {
+ "type": "Boolean",
+ "description": "是否细边框, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/codeinput.html#props)"
+ },
+ "nut-code-input/space": {
+ "type": "`String | Number`",
+ "description": "字符间的距离, default: 10.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/codeinput.html#props)"
+ },
+ "nut-code-input/focus": {
+ "type": "Boolean",
+ "description": "是否自动获取焦点, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/codeinput.html#props)"
+ },
+ "nut-code-input/custom-color": {
+ "type": "String",
+ "description": "字体颜色, default: #606266.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/codeinput.html#props)"
+ },
+ "nut-code-input/font-size": {
+ "type": "`String | Number`",
+ "description": "字体大小,单位rpx, default: 18.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/codeinput.html#props)"
+ },
+ "nut-code-input/size": {
+ "type": "`String | Number`",
+ "description": "输入框的大小,宽等于高, default: 35.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/codeinput.html#props)"
+ },
+ "nut-code-input/disabledKeyboard": {
+ "type": "Boolean",
+ "description": "禁止点击输入框唤起系统键盘, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/codeinput.html#props)"
+ },
+ "nut-code-input/border-color": {
+ "type": "String",
+ "description": "边框和线条颜色, default: #c9cacc.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/codeinput.html#props)"
+ },
+ "nut-code-input/disabledDot": {
+ "type": "boolean",
+ "description": "是否禁止输入\".\"符号, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/codeinput.html#props)"
+ },
+ "nut-code-input/change": {
+ "type": "event",
+ "description": "输入内容发生改变时触发,具体见上方说明\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/codeinput.html#events)"
+ },
+ "nut-code-input/finish": {
+ "type": "event",
+ "description": "输入字符个数达maxlength值时触发,见上方说明\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/codeinput.html#events)"
+ },
+ "nut-date-picker/model-value": {
+ "type": "Date",
+ "description": "选中值\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/datepicker.html#props)"
+ },
+ "nut-date-picker/type": {
+ "type": "string",
+ "description": "时间类型,可选值 `date`(年月日) `time`(时分秒) `year-month`(年月) `month-day`(月日) `datehour`(年月日时) `hour-minute`(时分) `datetime`(年月日时分), default: date.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/datepicker.html#props)"
+ },
+ "nut-date-picker/show-toolbar": {
+ "type": "boolean",
+ "description": "是否显示顶部导航, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/datepicker.html#props)"
+ },
+ "nut-date-picker/title": {
+ "type": "string",
+ "description": "设置标题\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/datepicker.html#props)"
+ },
+ "nut-date-picker/ok-text": {
+ "type": "string",
+ "description": "确定按钮文案, default: 确定.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/datepicker.html#props)"
+ },
+ "nut-date-picker/cancel-text": {
+ "type": "string",
+ "description": "取消按钮文案, default: 取消.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/datepicker.html#props)"
+ },
+ "nut-date-picker/is-show-chinese": {
+ "type": "boolean",
+ "description": "每列是否展示中文, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/datepicker.html#props)"
+ },
+ "nut-date-picker/minute-step": {
+ "type": "number",
+ "description": "分钟步进值, default: 1.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/datepicker.html#props)"
+ },
+ "nut-date-picker/min-date": {
+ "type": "date",
+ "description": "开始日期, default: 十年前.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/datepicker.html#props)"
+ },
+ "nut-date-picker/max-date": {
+ "type": "date",
+ "description": "结束日期, default: 十年后.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/datepicker.html#props)"
+ },
+ "nut-date-picker/formatter": {
+ "type": "(type: DatePickerColumnType, option: PickerOption) => PickerOption",
+ "description": "选项格式化函数\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/datepicker.html#props)"
+ },
+ "nut-date-picker/filter": {
+ "type": "(type: DatePickerColumnType, options: PickerOption[]) => PickerOption[]",
+ "description": "选项过滤函数\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/datepicker.html#props)"
+ },
+ "nut-date-picker/three-dimensional": {
+ "type": "boolean",
+ "description": "是否开启3D效果, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/datepicker.html#props)"
+ },
+ "nut-date-picker/swipe-duration": {
+ "type": "number \\ string",
+ "description": "惯性滚动时长, default: 1000.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/datepicker.html#props)"
+ },
+ "nut-date-picker/visible-option-num": {
+ "type": "number \\ string",
+ "description": "可见的选项个数, default: 7.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/datepicker.html#props)"
+ },
+ "nut-date-picker/option-height": {
+ "type": "number \\ string",
+ "description": "选项高度, default: 36.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/datepicker.html#props)"
+ },
+ "nut-date-picker/change": {
+ "type": "event",
+ "description": "选项改变时触发(`1.7.7` 新增 `date` 参数)\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/datepicker.html#events)"
+ },
+ "nut-date-picker/confirm": {
+ "type": "event",
+ "description": "点击确定按钮时触发(`1.7.7` 新增 `date` 参数)\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/datepicker.html#events)"
+ },
+ "nut-date-picker/cancel": {
+ "type": "event",
+ "description": "点击取消按钮时触发(`1.7.7` 新增 `date` 参数)\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/datepicker.html#events)"
+ },
+ "nut-form/model-value": {
+ "type": "object",
+ "description": "表单数据对象(使用表单校验时,_必填_)\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/form.html#form-props)"
+ },
+ "nut-form/rules": {
+ "type": "`{ prop: FormItemRule[] }`",
+ "description": "统一配置每个 `FormItem` 的 `rules`, default: {}.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/form.html#form-props)"
+ },
+ "nut-form/disabled": {
+ "type": "boolean",
+ "description": "禁用表单下的所有数据录入组件, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/form.html#form-props)"
+ },
+ "nut-form/label-position`v1.5.7`": {
+ "type": "`top` | `left` | `right`",
+ "description": "表单项 label 的位置, default: left.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/form.html#form-props)"
+ },
+ "nut-form/star-position`v1.5.7`": {
+ "type": "`left` | `right`",
+ "description": "必填表单项 label 的红色星标位置, default: left.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/form.html#form-props)"
+ },
+ "nut-form/validate": {
+ "type": "event",
+ "description": "任一表单项被校验失败后触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/form.html#form-events)"
+ },
+ "nut-form-item/required": {
+ "type": "boolean",
+ "description": "是否显示必填字段的标签旁边的红色星号, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/form.html#formitem-props)"
+ },
+ "nut-form-item/prop": {
+ "type": "string",
+ "description": "表单域 `v-model` 字段, 在使用表单校验功能的情况下,该属性是必填的\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/form.html#formitem-props)"
+ },
+ "nut-form-item/rules": {
+ "type": "`FormItemRule[]`",
+ "description": "定义校验规则, default: [].\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/form.html#formitem-props)"
+ },
+ "nut-form-item/label-width": {
+ "type": "number | string",
+ "description": "表单项 `label` 宽度,默认单位为`px`, default: 90.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/form.html#formitem-props)"
+ },
+ "nut-form-item/label-align": {
+ "type": "string",
+ "description": "表单项 `label` 对齐方式,可选值为 `center` `right`, default: left.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/form.html#formitem-props)"
+ },
+ "nut-form-item/body-align": {
+ "type": "string",
+ "description": "右侧插槽对齐方式,可选值为 `center` `right`, default: left.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/form.html#formitem-props)"
+ },
+ "nut-form-item/error-message-align": {
+ "type": "string",
+ "description": "错误提示文案对齐方式,可选值为 `center` `right`, default: left.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/form.html#formitem-props)"
+ },
+ "nut-form-item/show-error-line": {
+ "type": "boolean",
+ "description": "是否在校验不通过时标红输入框, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/form.html#formitem-props)"
+ },
+ "nut-form-item/show-error-message": {
+ "type": "boolean",
+ "description": "是否在校验不通过时在输入框下方展示错误提示, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/form.html#formitem-props)"
+ },
+ "nut-form-item/label-position`v1.5.7`": {
+ "type": "`top` | `left` | `right`",
+ "description": "表单项 label 的位置,优先级高于 form 中的 label-position\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/form.html#formitem-props)"
+ },
+ "nut-form-item/star-position`v1.5.7`": {
+ "type": "`left` | `right`",
+ "description": "必填表单项 label 的红色星标位置,优先级高于 form 中的 star-position\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/form.html#formitem-props)"
+ },
+ "nut-input/model-value": {
+ "type": "string | number",
+ "description": "输入值,双向绑定\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#props)"
+ },
+ "nut-input/type": {
+ "type": "string",
+ "description": "输入框类型 [有效值](https://uniapp.dcloud.net.cn/component/input.html#type), default: text.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#props)"
+ },
+ "nut-input/input-mode": {
+ "type": "string",
+ "description": "输入框模式 是一个枚举属性,它提供了用户在编辑元素或其内容时可能输入的数据类型的提示 [有效值](https://uniapp.dcloud.net.cn/component/input.html#inputmode), default: text.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#props)"
+ },
+ "nut-input/input-style": {
+ "type": "`StyleValue`",
+ "description": "输入框自定义样式\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#props)"
+ },
+ "nut-input/input-class": {
+ "type": "`ClassType`",
+ "description": "输入框自定义类名\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#props)"
+ },
+ "nut-input/placeholder": {
+ "type": "string",
+ "description": "输入框为空时占位符\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#props)"
+ },
+ "nut-input/placeholder-style": {
+ "type": "string",
+ "description": "指定 placeholder 的样式\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#props)"
+ },
+ "nut-input/placeholder-class": {
+ "type": "string",
+ "description": "指定 placeholder 的样式类, default: input-placeholder.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#props)"
+ },
+ "nut-input/input-align": {
+ "type": "string",
+ "description": "输入框内容对齐方式,可选值 `left`、`center`、`right`, default: left.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#props)"
+ },
+ "nut-input/required": {
+ "type": "boolean",
+ "description": "是否显示必填字段的标签旁边的红色星号, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#props)"
+ },
+ "nut-input/border": {
+ "type": "boolean",
+ "description": "是否显示下边框, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#props)"
+ },
+ "nut-input/disabled": {
+ "type": "boolean",
+ "description": "是否禁用, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#props)"
+ },
+ "nut-input/readonly": {
+ "type": "boolean",
+ "description": "是否只读, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#props)"
+ },
+ "nut-input/autofocus": {
+ "type": "boolean",
+ "description": "是否自动获得焦点,`iOS` 系统不支持该属性, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#props)"
+ },
+ "nut-input/max-length": {
+ "type": "string | number",
+ "description": "限制最长输入字符\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#props)"
+ },
+ "nut-input/clearable": {
+ "type": "boolean",
+ "description": "展示清除 `Icon`, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#props)"
+ },
+ "nut-input/show-clear-icon": {
+ "type": "boolean",
+ "description": "是否在失去焦点后,继续展示清除按钮,在设置 `clearable` 时生效, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#props)"
+ },
+ "nut-input/clear-size": {
+ "type": "string",
+ "description": "清除图标的 `font-size` 大小, default: 14.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#props)"
+ },
+ "nut-input/show-word-limit": {
+ "type": "boolean",
+ "description": "是否显示限制最长输入字符,需要设置 `max-length` 属性, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#props)"
+ },
+ "nut-input/error": {
+ "type": "boolean",
+ "description": "是否标红, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#props)"
+ },
+ "nut-input/formatter": {
+ "type": "`(val: string) => string`",
+ "description": "输入内容格式化函数\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#props)"
+ },
+ "nut-input/format-trigger": {
+ "type": "string",
+ "description": "格式化函数触发的时机,可选值为 `onChange`、`onBlur`, default: onChange.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#props)"
+ },
+ "nut-input/confirm-type": {
+ "type": "string",
+ "description": "键盘右下角按钮的文字,仅在`type='text'`时生效,可选值 `send`:发送、`search`:搜索、`next`:下一个、`go`:前往、`done`:完成, default: done.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#props)"
+ },
+ "nut-input/adjust-position": {
+ "type": "boolean",
+ "description": "键盘弹起时,是否自动上推页面, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#props)"
+ },
+ "nut-input/always-system": {
+ "type": "boolean",
+ "description": "是否强制使用系统键盘和 `Web-view` 创建的 `input` 元素。为 `true` 时,`confirm-type`、`confirm-hold` 可能失效, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#props)"
+ },
+ "nut-input/cursor-spacing": {
+ "type": "number",
+ "description": "指定光标与键盘的距离,取 input 距离底部的距离和 cursor-spacing 指定的距离的最小值作为光标与键盘的距离, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#props)"
+ },
+ "nut-input/always-embed": {
+ "type": "boolean",
+ "description": "强制 input 处于同层状态,默认 focus 时 input 会切到非同层状态 (仅在 iOS 下生效), default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#props)"
+ },
+ "nut-input/confirm-hold": {
+ "type": "boolean",
+ "description": "点击键盘右下角按钮时是否保持键盘不收起, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#props)"
+ },
+ "nut-input/cursor": {
+ "type": "number",
+ "description": "指定focus时的光标位置\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#props)"
+ },
+ "nut-input/selection-start": {
+ "type": "number",
+ "description": "光标起始位置,自动聚集时有效,需与selection-end搭配使用, default: -1.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#props)"
+ },
+ "nut-input/selection-end": {
+ "type": "number",
+ "description": "光标结束位置,自动聚集时有效,需与selection-start搭配使用, default: -1.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#props)"
+ },
+ "nut-input/hold-keyboard": {
+ "type": "boolean",
+ "description": "focus时,点击页面的时候不收起键盘, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#props)"
+ },
+ "nut-input/update:model-value": {
+ "type": "event",
+ "description": "输入框内容变化时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#events)"
+ },
+ "nut-input/focus": {
+ "type": "event",
+ "description": "输入框聚焦时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#events)"
+ },
+ "nut-input/blur": {
+ "type": "event",
+ "description": "输入框失焦时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#events)"
+ },
+ "nut-input/clear": {
+ "type": "event",
+ "description": "点击清除按钮时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#events)"
+ },
+ "nut-input/click": {
+ "type": "event",
+ "description": "点击组件时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#events)"
+ },
+ "nut-input/click-input": {
+ "type": "event",
+ "description": "点击输入区域时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#events)"
+ },
+ "nut-input/confirm": {
+ "type": "event",
+ "description": "点击完成按钮时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#events)"
+ },
+ "nut-input/input": {
+ "type": "event",
+ "description": "键盘输入时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/input.html#events)"
+ },
+ "nut-input-number/model-value": {
+ "type": "string | number",
+ "description": "初始值\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/inputnumber.html#props)"
+ },
+ "nut-input-number/input-width": {
+ "type": "string",
+ "description": "输入框宽度\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/inputnumber.html#props)"
+ },
+ "nut-input-number/button-size": {
+ "type": "string",
+ "description": "操作符+、-尺寸\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/inputnumber.html#props)"
+ },
+ "nut-input-number/min": {
+ "type": "string | number",
+ "description": "最小值限制, default: 1.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/inputnumber.html#props)"
+ },
+ "nut-input-number/max": {
+ "type": "string | number",
+ "description": "最大值限制, default: 9999.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/inputnumber.html#props)"
+ },
+ "nut-input-number/step": {
+ "type": "string | number",
+ "description": "步长, default: 1.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/inputnumber.html#props)"
+ },
+ "nut-input-number/decimal-places": {
+ "type": "string | number",
+ "description": "设置保留的小数位, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/inputnumber.html#props)"
+ },
+ "nut-input-number/disabled": {
+ "type": "boolean",
+ "description": "禁用所有功能, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/inputnumber.html#props)"
+ },
+ "nut-input-number/readonly": {
+ "type": "boolean",
+ "description": "只读状态禁用输入框操作行为, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/inputnumber.html#props)"
+ },
+ "nut-input-number/add": {
+ "type": "event",
+ "description": "点击增加按钮时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/inputnumber.html#events)"
+ },
+ "nut-input-number/reduce": {
+ "type": "event",
+ "description": "点击减少按钮时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/inputnumber.html#events)"
+ },
+ "nut-input-number/overlimit": {
+ "type": "event",
+ "description": "点击不可用的按钮时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/inputnumber.html#events)"
+ },
+ "nut-input-number/change": {
+ "type": "event",
+ "description": "值改变时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/inputnumber.html#events)"
+ },
+ "nut-input-number/blur": {
+ "type": "event",
+ "description": "输入框失去焦点时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/inputnumber.html#events)"
+ },
+ "nut-input-number/focus": {
+ "type": "event",
+ "description": "输入框获得焦点时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/inputnumber.html#events)"
+ },
+ "nut-number-keyboard/v-model:visible": {
+ "type": "boolean",
+ "description": "是否显示键盘, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/numberkeyboard.html#props)"
+ },
+ "nut-number-keyboard/model-value": {
+ "type": "string",
+ "description": "当前输入值\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/numberkeyboard.html#props)"
+ },
+ "nut-number-keyboard/title": {
+ "type": "string",
+ "description": "键盘标题\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/numberkeyboard.html#props)"
+ },
+ "nut-number-keyboard/type": {
+ "type": "string",
+ "description": "键盘模式, default: default:默认样式
rightColumn:带右侧栏.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/numberkeyboard.html#props)"
+ },
+ "nut-number-keyboard/random-keys": {
+ "type": "boolean",
+ "description": "随机数, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/numberkeyboard.html#props)"
+ },
+ "nut-number-keyboard/custom-key": {
+ "type": "string []",
+ "description": "自定义键盘额外的键, default: 数组形式最多支持添加2个,超出默认取前2项.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/numberkeyboard.html#props)"
+ },
+ "nut-number-keyboard/overlay": {
+ "type": "boolean",
+ "description": "是否显示遮罩, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/numberkeyboard.html#props)"
+ },
+ "nut-number-keyboard/maxlength": {
+ "type": "number | string",
+ "description": "输入值最大长度,结合 v-model 使用, default: 6.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/numberkeyboard.html#props)"
+ },
+ "nut-number-keyboard/confirm-text": {
+ "type": "string",
+ "description": "自定义完成按钮文字,如\"支付\",\"下一步\",\"提交\"等, default: 完成.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/numberkeyboard.html#props)"
+ },
+ "nut-number-keyboard/pop-class": {
+ "type": "string",
+ "description": "自定义弹框类名\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/numberkeyboard.html#props)"
+ },
+ "nut-number-keyboard/input": {
+ "type": "event",
+ "description": "点击按键时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/numberkeyboard.html#events)"
+ },
+ "nut-number-keyboard/delete": {
+ "type": "event",
+ "description": "点击删除键时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/numberkeyboard.html#events)"
+ },
+ "nut-number-keyboard/close": {
+ "type": "event",
+ "description": "点击关闭按钮或非键盘区域时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/numberkeyboard.html#events)"
+ },
+ "nut-number-keyboard/confirm": {
+ "type": "event",
+ "description": "点击确认按钮\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/numberkeyboard.html#events)"
+ },
+ "nut-picker/model-value": {
+ "type": "(string | number)[]",
+ "description": "选中项, default: [].\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/picker.html#props)"
+ },
+ "nut-picker/columns": {
+ "type": "(PickerOption | PickerOption[])[]",
+ "description": "对象数组,配置每一列显示的数据, default: [].\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/picker.html#props)"
+ },
+ "nut-picker/show-toolbar": {
+ "type": "boolean",
+ "description": "是否显示顶部导航, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/picker.html#props)"
+ },
+ "nut-picker/title": {
+ "type": "string",
+ "description": "设置标题\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/picker.html#props)"
+ },
+ "nut-picker/ok-text": {
+ "type": "string",
+ "description": "确定按钮文案, default: 确定.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/picker.html#props)"
+ },
+ "nut-picker/cancel-text": {
+ "type": "string",
+ "description": "取消按钮文案, default: 取消.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/picker.html#props)"
+ },
+ "nut-picker/three-dimensional": {
+ "type": "boolean",
+ "description": "是否开启3D效果, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/picker.html#props)"
+ },
+ "nut-picker/swipe-duration": {
+ "type": "number \\ string",
+ "description": "惯性滚动时长, default: 1000.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/picker.html#props)"
+ },
+ "nut-picker/visible-option-num": {
+ "type": "number \\ string",
+ "description": "可见的选项个数, default: 7.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/picker.html#props)"
+ },
+ "nut-picker/option-height": {
+ "type": "number \\ string",
+ "description": "选项高度, default: 36.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/picker.html#props)"
+ },
+ "nut-picker/field-names": {
+ "type": "object",
+ "description": "自定义 columns 中的字段, default: { text: text, value: value, children: children, className: className }.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/picker.html#props)"
+ },
+ "nut-picker/change": {
+ "type": "event",
+ "description": "选项发生改变时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/picker.html#events)"
+ },
+ "nut-picker/confirm": {
+ "type": "event",
+ "description": "点击确定按钮时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/picker.html#events)"
+ },
+ "nut-picker/cancel": {
+ "type": "event",
+ "description": "点击取消按钮时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/picker.html#events)"
+ },
+ "nut-radio/disabled": {
+ "type": "boolean",
+ "description": "是否禁用选择, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/radio.html#radio-props)"
+ },
+ "nut-radio/icon-size": {
+ "type": "string | number",
+ "description": "[图标尺寸](/components/basic/icon), default: 18.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/radio.html#radio-props)"
+ },
+ "nut-radio/label": {
+ "type": "string | number | boolean",
+ "description": "单选框标识\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/radio.html#radio-props)"
+ },
+ "nut-radio/shape": {
+ "type": "string",
+ "description": "形状,可选值为 button、round, default: round.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/radio.html#radio-props)"
+ },
+ "nut-radio/size": {
+ "type": "string",
+ "description": "尺寸,可选值为 `large` `small` `mini` `normal`,仅在 shape 为 `button` 时生效, default: normal.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/radio.html#radio-props)"
+ },
+ "nut-radio-group/model-value": {
+ "type": "string | number | boolean",
+ "description": "当前选中项的标识符,与 `label` 值一致时呈选中状态\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/radio.html#radiogroup-props)"
+ },
+ "nut-radio-group/text-position": {
+ "type": "string",
+ "description": "文本所在的位置,可选值:`left`,`right`, default: right.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/radio.html#radiogroup-props)"
+ },
+ "nut-radio-group/direction": {
+ "type": "string",
+ "description": "使用横纵方向 可选值 `horizontal、vertical`, default: vertical.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/radio.html#radiogroup-props)"
+ },
+ "nut-radio-group/change": {
+ "type": "event",
+ "description": "值变化时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/radio.html#radiogroup-events)"
+ },
+ "nut-range/change": {
+ "type": "event",
+ "description": "进度变化且结束拖动后触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/range.html#events)"
+ },
+ "nut-range/drag-start": {
+ "type": "event",
+ "description": "开始拖动时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/range.html#events)"
+ },
+ "nut-range/drag-end": {
+ "type": "event",
+ "description": "结束拖动时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/range.html#events)"
+ },
+ "nut-rate/model-value": {
+ "type": "number | string",
+ "description": "当前 `star` 数,可使用 `v-model` 双向绑定数据\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/rate.html#props)"
+ },
+ "nut-rate/count": {
+ "type": "number | string",
+ "description": "`star` 总数, default: 5.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/rate.html#props)"
+ },
+ "nut-rate/active-color": {
+ "type": "string",
+ "description": "图标选中颜色, default: #fa200c.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/rate.html#props)"
+ },
+ "nut-rate/void-color": {
+ "type": "string",
+ "description": "图标未选中颜色, default: #ccc.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/rate.html#props)"
+ },
+ "nut-rate/allow-half": {
+ "type": "Boolean",
+ "description": "是否半星, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/rate.html#props)"
+ },
+ "nut-rate/readonly": {
+ "type": "Boolean",
+ "description": "是否只读, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/rate.html#props)"
+ },
+ "nut-rate/disabled": {
+ "type": "Boolean",
+ "description": "是否禁用, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/rate.html#props)"
+ },
+ "nut-rate/spacing": {
+ "type": "number | string",
+ "description": "间距, default: 20.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/rate.html#props)"
+ },
+ "nut-rate/size": {
+ "type": "number | string",
+ "description": "`Icon` 尺寸大小,如 `20px` `2em` `2rem`\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/rate.html#props)"
+ },
+ "nut-rate/custom-icon": {
+ "type": "string",
+ "description": "自定义 `Icon`, default: star-fill-n.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/rate.html#props)"
+ },
+ "nut-rate/change": {
+ "type": "event",
+ "description": "当前分值修改时时触发的事件\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/rate.html#events)"
+ },
+ "nut-searchbar/model-value": {
+ "type": "number \\ string",
+ "description": "当前输入的值\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/searchbar.html#props)"
+ },
+ "nut-searchbar/shape": {
+ "type": "string",
+ "description": "搜索框形状,可选值为 `square` `round`, default: round.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/searchbar.html#props)"
+ },
+ "nut-searchbar/max-length": {
+ "description": "最大输入长度\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/searchbar.html#props)"
+ },
+ "nut-searchbar/input-type": {
+ "type": "string",
+ "description": "输入框类型, default: text.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/searchbar.html#props)"
+ },
+ "nut-searchbar/placeholder": {
+ "type": "string",
+ "description": "输入框默认暗纹, default: 请输入.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/searchbar.html#props)"
+ },
+ "nut-searchbar/clearable": {
+ "type": "boolean",
+ "description": "是否展示清除按钮, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/searchbar.html#props)"
+ },
+ "nut-searchbar/clear-icon": {
+ "type": "Object",
+ "description": "自定义清除按钮图标, default: circle-close.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/searchbar.html#props)"
+ },
+ "nut-searchbar/background": {
+ "type": "string",
+ "description": "输入框外部背景, default: #fff.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/searchbar.html#props)"
+ },
+ "nut-searchbar/input-background": {
+ "type": "string",
+ "description": "输入框内部背景, default: #f7f7f7.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/searchbar.html#props)"
+ },
+ "nut-searchbar/confirm-type": {
+ "type": "string",
+ "description": "键盘右下角按钮的文字, default: done.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/searchbar.html#props)"
+ },
+ "nut-searchbar/autofocus": {
+ "type": "boolean",
+ "description": "是否自动聚焦, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/searchbar.html#props)"
+ },
+ "nut-searchbar/focus-style": {
+ "type": "Object",
+ "description": "聚焦时搜索框样式\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/searchbar.html#props)"
+ },
+ "nut-searchbar/disabled": {
+ "type": "boolean",
+ "description": "是否禁用输入框, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/searchbar.html#props)"
+ },
+ "nut-searchbar/readonly": {
+ "type": "boolean",
+ "description": "输入框只读, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/searchbar.html#props)"
+ },
+ "nut-searchbar/input-align": {
+ "type": "string",
+ "description": "对齐方式,可选 `left` `center` `right`, default: left.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/searchbar.html#props)"
+ },
+ "nut-searchbar/safe-area-inset-bottom": {
+ "type": "boolean",
+ "description": "是否开启 iphone 系列全面屏底部安全区适配, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/searchbar.html#props)"
+ },
+ "nut-searchbar/cursor-spacing": {
+ "type": "number",
+ "description": "指定光标与键盘的距离,取 input 距离底部的距离和 cursor-spacing 指定的距离的最小值作为光标与键盘的距离, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/searchbar.html#props)"
+ },
+ "nut-searchbar/change": {
+ "type": "event",
+ "description": "输入内容时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/searchbar.html#events)"
+ },
+ "nut-searchbar/focus": {
+ "type": "event",
+ "description": "聚焦时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/searchbar.html#events)"
+ },
+ "nut-searchbar/blur": {
+ "type": "event",
+ "description": "失焦时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/searchbar.html#events)"
+ },
+ "nut-searchbar/clear": {
+ "type": "event",
+ "description": "点击清空时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/searchbar.html#events)"
+ },
+ "nut-searchbar/search": {
+ "type": "event",
+ "description": "按下 ENTER 键时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/searchbar.html#events)"
+ },
+ "nut-searchbar/click-input": {
+ "type": "event",
+ "description": "点击输入区域时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/searchbar.html#events)"
+ },
+ "nut-searchbar/click-left-icon": {
+ "type": "event",
+ "description": "点击左侧图标时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/searchbar.html#events)"
+ },
+ "nut-searchbar/click-right-icon": {
+ "type": "event",
+ "description": "点击右侧图标时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/searchbar.html#events)"
+ },
+ "nut-short-password/model-value": {
+ "type": "string",
+ "description": "密码初始值\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/shortpassword.html#props)"
+ },
+ "nut-short-password/v-model:visible": {
+ "type": "boolean",
+ "description": "是否展示短密码框, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/shortpassword.html#props)"
+ },
+ "nut-short-password/title": {
+ "type": "string",
+ "description": "标题, default: 请输入密码.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/shortpassword.html#props)"
+ },
+ "nut-short-password/desc": {
+ "type": "string",
+ "description": "密码框描述, default: 您使用了虚拟资产,请进行验证.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/shortpassword.html#props)"
+ },
+ "nut-short-password/tips": {
+ "type": "string",
+ "description": "提示语, default: 忘记密码.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/shortpassword.html#props)"
+ },
+ "nut-short-password/close-on-click-overlay": {
+ "type": "boolean",
+ "description": "是否点击遮罩关闭, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/shortpassword.html#props)"
+ },
+ "nut-short-password/length": {
+ "type": "string | number",
+ "description": "密码长度,取值为4~6, default: 6.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/shortpassword.html#props)"
+ },
+ "nut-short-password/error-msg": {
+ "type": "string",
+ "description": "错误信息提示\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/shortpassword.html#props)"
+ },
+ "nut-short-password/close": {
+ "type": "event",
+ "description": "点击关闭图标或者遮罩时触发事件\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/shortpassword.html#events)"
+ },
+ "nut-short-password/complete": {
+ "type": "event",
+ "description": "输入完成的回调\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/shortpassword.html#events)"
+ },
+ "nut-short-password/focus": {
+ "type": "event",
+ "description": "输入框聚焦时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/shortpassword.html#events)"
+ },
+ "nut-textarea/model-value": {
+ "type": "string",
+ "description": "输入值,支持双向绑定\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/textarea.html#props)"
+ },
+ "nut-textarea/textarea-style": {
+ "type": "`StyleValue`",
+ "description": "文本域自定义样式\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/textarea.html#props)"
+ },
+ "nut-textarea/textarea-class": {
+ "type": "`ClassType`",
+ "description": "文本域自定义类名\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/textarea.html#props)"
+ },
+ "nut-textarea/placeholder": {
+ "type": "string",
+ "description": "设置占位提示文字, default: 请输入内容.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/textarea.html#props)"
+ },
+ "nut-textarea/placeholder-style": {
+ "type": "string",
+ "description": "指定 placeholder 的样式\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/textarea.html#props)"
+ },
+ "nut-textarea/placeholder-class": {
+ "type": "string",
+ "description": "指定 placeholder 的样式类, default: textarea-placeholder.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/textarea.html#props)"
+ },
+ "nut-textarea/max-length": {
+ "type": "string | number",
+ "description": "限制最长输入字符\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/textarea.html#props)"
+ },
+ "nut-textarea/rows": {
+ "type": "string | number",
+ "description": "textarea的高度,优先级高于autosize属性 `仅支持 H5`, default: 2.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/textarea.html#props)"
+ },
+ "nut-textarea/limit-show": {
+ "type": "boolean",
+ "description": "textarea是否展示输入字符。须配合`max-length`使用, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/textarea.html#props)"
+ },
+ "nut-textarea/autosize": {
+ "type": "boolean | `{maxHeight?: number; minHeight?: number}`",
+ "description": "是否自适应内容高度,也可传入对象,
如 `{ maxHeight: 200, minHeight: 100 }`,单位为`px`, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/textarea.html#props)"
+ },
+ "nut-textarea/text-align": {
+ "type": "string",
+ "description": "文本位置,可选值`left`,`center`,`right`\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/textarea.html#props)"
+ },
+ "nut-textarea/readonly": {
+ "type": "boolean",
+ "description": "只读属性, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/textarea.html#props)"
+ },
+ "nut-textarea/disabled": {
+ "type": "boolean",
+ "description": "禁用属性, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/textarea.html#props)"
+ },
+ "nut-textarea/autofocus": {
+ "type": "boolean",
+ "description": "自动获取焦点, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/textarea.html#props)"
+ },
+ "nut-textarea/cursor-spacing": {
+ "type": "number",
+ "description": "指定光标与键盘的距离。取textarea距离底部的距离和cursor-spacing指定的距离的最小值作为光标与键盘的距离, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/textarea.html#props)"
+ },
+ "nut-textarea/cursor": {
+ "type": "number",
+ "description": "指定focus时的光标位置, default: -1.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/textarea.html#props)"
+ },
+ "nut-textarea/show-confirm-bar": {
+ "type": "boolean",
+ "description": "是否显示键盘上方带有”完成“按钮那一栏, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/textarea.html#props)"
+ },
+ "nut-textarea/selection-start": {
+ "type": "number",
+ "description": "光标起始位置,自动聚集时有效,需与selection-end搭配使用, default: -1.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/textarea.html#props)"
+ },
+ "nut-textarea/selection-end": {
+ "type": "number",
+ "description": "光标结束位置,自动聚集时有效,需与selection-start搭配使用, default: -1.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/textarea.html#props)"
+ },
+ "nut-textarea/adjust-position": {
+ "type": "boolean",
+ "description": "键盘弹起时,是否自动上推页面, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/textarea.html#props)"
+ },
+ "nut-textarea/hold-keyboard": {
+ "type": "boolean",
+ "description": "focus时,点击页面的时候不收起键盘, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/textarea.html#props)"
+ },
+ "nut-textarea/disable-default-padding": {
+ "type": "boolean",
+ "description": "是否去掉 iOS 下的默认内边距, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/textarea.html#props)"
+ },
+ "nut-textarea/confirm-type": {
+ "type": "string",
+ "description": "设置键盘右下角按钮的文字,可选值 `send` `search` `next` `go` `done` `return`, default: return.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/textarea.html#props)"
+ },
+ "nut-textarea/confirm-hold": {
+ "type": "boolean",
+ "description": "点击键盘右下角按钮时是否保持键盘不收起, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/textarea.html#props)"
+ },
+ "nut-textarea/adjust-keyboard-to": {
+ "type": "string",
+ "description": "键盘对齐位置,可选值 `cursor` `bottom`, default: cursor.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/textarea.html#props)"
+ },
+ "nut-textarea/change": {
+ "type": "event",
+ "description": "输入框值改变时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/textarea.html#events)"
+ },
+ "nut-textarea/focus": {
+ "type": "event",
+ "description": "聚焦时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/textarea.html#events)"
+ },
+ "nut-textarea/blur": {
+ "type": "event",
+ "description": "失焦时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/textarea.html#events)"
+ },
+ "nut-textarea/confirm": {
+ "type": "event",
+ "description": "点击完成按钮时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/textarea.html#events)"
+ },
+ "nut-textarea/input": {
+ "type": "event",
+ "description": "键盘输入时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/textarea.html#events)"
+ },
+ "nut-uploader/auto-upload": {
+ "type": "Boolean",
+ "description": "是否在选取文件后立即进行上传,`false` 时需要手动执行 ref submit 方法进行上传, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/uploader.html#props)"
+ },
+ "nut-uploader/name": {
+ "type": "String",
+ "description": "发到后台的文件参数名, default: file.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/uploader.html#props)"
+ },
+ "nut-uploader/url": {
+ "type": "String",
+ "description": "上传服务器的接口地址\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/uploader.html#props)"
+ },
+ "nut-uploader/v-model:file-list": {
+ "type": "FileItem[]",
+ "description": "默认已经上传的文件列表, default: [].\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/uploader.html#props)"
+ },
+ "nut-uploader/is-preview": {
+ "type": "Boolean",
+ "description": "是否上传成功后展示预览图, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/uploader.html#props)"
+ },
+ "nut-uploader/is-deletable": {
+ "type": "Boolean",
+ "description": "是否展示删除按钮, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/uploader.html#props)"
+ },
+ "nut-uploader/method": {
+ "type": "String",
+ "description": "上传请求的 http method, default: post.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/uploader.html#props)"
+ },
+ "nut-uploader/list-type": {
+ "type": "String",
+ "description": "上传列表的内建样式,支持两种基础样式 `picture`、`list`, default: picture.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/uploader.html#props)"
+ },
+ "nut-uploader/maximize": {
+ "type": "Number | String",
+ "description": "可以设定最大上传文件的大小(字节), default: Number.MAX_VALUE.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/uploader.html#props)"
+ },
+ "nut-uploader/maximum": {
+ "type": "Number | String",
+ "description": "最多可以选择的文件个数,微信基础库2.25.0前,最多可支持9个文件,2.25.0及以后最多可支持20个文件, default: 1.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/uploader.html#props)"
+ },
+ "nut-uploader/source-type": {
+ "type": "Array",
+ "description": "[选择文件的来源](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/wx.chooseMedia.html), default: [album,camera].\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/uploader.html#props)"
+ },
+ "nut-uploader/camera`仅支持WEAPP`": {
+ "type": "String",
+ "description": "仅在 `source-type` 为 `camera` 时生效,使用前置或后置摄像头, default: back.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/uploader.html#props)"
+ },
+ "nut-uploader/size-type": {
+ "type": "Array",
+ "description": "[是否压缩所选文件](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/wx.chooseMedia.html), default: [original,compressed].\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/uploader.html#props)"
+ },
+ "nut-uploader/media-type`仅支持WEAPP`": {
+ "type": "Array",
+ "description": "[选择文件类型](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/wx.chooseMedia.html), default: [image, video, mix].\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/uploader.html#props)"
+ },
+ "nut-uploader/max-duration`仅支持WEAPP`": {
+ "type": "Number",
+ "description": "拍摄视频最长拍摄时间,单位秒。时间范围为 3s 至 60s 之间。不限制相册。, default: 10.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/uploader.html#props)"
+ },
+ "nut-uploader/accept": {
+ "type": "String",
+ "description": "允许上传的文件类型, default: [image,media,video,all].\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/uploader.html#props)"
+ },
+ "nut-uploader/headers": {
+ "type": "object",
+ "description": "设置上传的请求头部, default: {}.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/uploader.html#props)"
+ },
+ "nut-uploader/data": {
+ "type": "object",
+ "description": "附加上传的信息 formData, default: {}.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/uploader.html#props)"
+ },
+ "nut-uploader/xhr-state": {
+ "type": "Number",
+ "description": "接口响应的成功状态(status)值, default: 200.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/uploader.html#props)"
+ },
+ "nut-uploader/disabled": {
+ "type": "Boolean",
+ "description": "是否禁用文件上传, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/uploader.html#props)"
+ },
+ "nut-uploader/multiple": {
+ "type": "Boolean",
+ "description": "是否支持文件多选, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/uploader.html#props)"
+ },
+ "nut-uploader/timeout": {
+ "type": "Number | String",
+ "description": "超时时间,单位为毫秒, default: 1000 * 30.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/uploader.html#props)"
+ },
+ "nut-uploader/before-upload": {
+ "type": "Function(uni.uploadFile,option)",
+ "description": "执行 `uni.uploadFile` 上传时,自定义方法, default: null.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/uploader.html#props)"
+ },
+ "nut-uploader/before-delete": {
+ "type": "Function(file): boolean 丨 Promise",
+ "description": "除文件时的回调,返回值为 false 时不移除。支持返回一个 `Promise` 对象,`Promise` 对象 resolve(false) 或 reject 时不移除\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/uploader.html#props)"
+ },
+ "nut-uploader/mode": {
+ "type": "查阅 uniapp[文档](https:||uniapp.dcloud.net.cn|component|image.html)",
+ "description": "预览图片的 mode 属性, default: aspectFit.\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/uploader.html#props)"
+ },
+ "nut-uploader/start": {
+ "type": "event",
+ "description": "文件上传开始\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/uploader.html#events)"
+ },
+ "nut-uploader/progress": {
+ "type": "event",
+ "description": "文件上传的进度\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/uploader.html#events)"
+ },
+ "nut-uploader/oversize": {
+ "type": "event",
+ "description": "文件大小超过限制时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/uploader.html#events)"
+ },
+ "nut-uploader/success": {
+ "type": "event",
+ "description": "上传成功\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/uploader.html#events)"
+ },
+ "nut-uploader/failure": {
+ "type": "event",
+ "description": "上传失败\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/uploader.html#events)"
+ },
+ "nut-uploader/change": {
+ "type": "event",
+ "description": "上传文件改变时的状态\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/uploader.html#events)"
+ },
+ "nut-uploader/delete": {
+ "type": "event",
+ "description": "文件删除事件\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/uploader.html#events)"
+ },
+ "nut-uploader/file-item-click": {
+ "type": "event",
+ "description": "文件上传成功后点击触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/dentry/uploader.html#events)"
+ },
+ "nut-animate/show": {
+ "type": "boolean",
+ "description": "控制动画,当值从 false 变为 true 时会触发一次动画, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/animate.html#props)"
+ },
+ "nut-animate/type": {
+ "type": "string",
+ "description": "动画类型,见下方 `type` 值说明\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/animate.html#props)"
+ },
+ "nut-animate/loop": {
+ "type": "boolean",
+ "description": "是否循环执行。`true`-循环执行; `false`-执行一次, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/animate.html#props)"
+ },
+ "nut-animate/duration": {
+ "type": "number | string",
+ "description": "动画时长,单位 ms\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/animate.html#props)"
+ },
+ "nut-animate/action": {
+ "type": "string",
+ "description": "(不能与 show 同时使用)触发方式,`initial`-初始化执行; `click`-点击执行\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/animate.html#props)"
+ },
+ "nut-animate/animate": {
+ "type": "event",
+ "description": "动画触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/animate.html#events)"
+ },
+ "nut-animate/click": {
+ "type": "event",
+ "description": "点击元素时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/animate.html#events)"
+ },
+ "nut-avatar/size": {
+ "type": "string | number",
+ "description": "头像的大小,可选值为:`large`、`normal`、`small`,支持输入数字, default: normal.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/avatar.html#avatar-props)"
+ },
+ "nut-avatar/shape": {
+ "type": "string",
+ "description": "头像的形状,可选值为:`square`、`round`, default: round.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/avatar.html#avatar-props)"
+ },
+ "nut-avatar/custom-color": {
+ "type": "string",
+ "description": "字体颜色, default: #666.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/avatar.html#avatar-props)"
+ },
+ "nut-avatar/bg-color": {
+ "type": "string",
+ "description": "背景色, default: #eee.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/avatar.html#avatar-props)"
+ },
+ "nut-avatar-group/max-count": {
+ "type": "string | number",
+ "description": "显示的最大头像个数\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/avatar.html#avatargroup-props)"
+ },
+ "nut-avatar-group/max-content": {
+ "type": "string",
+ "description": "头像数量超出时,会出现一个头像折叠元素,该元素内容可为`...`、`more`、`N`, default: N.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/avatar.html#avatargroup-props)"
+ },
+ "nut-avatar-group/size": {
+ "type": "string | number",
+ "description": "头像的大小,可选值为:`large`、`normal`、`small`,支持直接输入数字, default: normal.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/avatar.html#avatargroup-props)"
+ },
+ "nut-avatar-group/shape": {
+ "type": "string",
+ "description": "头像的形状,可选值为:`square`、`round`, default: round.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/avatar.html#avatargroup-props)"
+ },
+ "nut-avatar-group/max-color": {
+ "type": "string",
+ "description": "头像折叠元素的字体颜色, default: #666.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/avatar.html#avatargroup-props)"
+ },
+ "nut-avatar-group/max-bg-color": {
+ "type": "string",
+ "description": "头像折叠元素的背景色, default: #eee.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/avatar.html#avatargroup-props)"
+ },
+ "nut-avatar-group/span": {
+ "type": "string",
+ "description": "头像之间的间距, default: -8.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/avatar.html#avatargroup-props)"
+ },
+ "nut-avatar-group/z-index": {
+ "type": "string",
+ "description": "组合头像之间的层级方向,可选值为:`left`、`right`, default: left.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/avatar.html#avatargroup-props)"
+ },
+ "nut-badge/value": {
+ "type": "string",
+ "description": "显示的内容\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/badge.html#props-)"
+ },
+ "nut-badge/max": {
+ "type": "number",
+ "description": "`value` 为数值时,最大值, default: 10000.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/badge.html#props-)"
+ },
+ "nut-badge/z-index": {
+ "type": "number",
+ "description": "徽标的 `z-index` 值, default: 10.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/badge.html#props-)"
+ },
+ "nut-badge/dot": {
+ "type": "boolean",
+ "description": "是否为小点, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/badge.html#props-)"
+ },
+ "nut-badge/bubble(`>v4.0.0`)": {
+ "type": "Boolean",
+ "description": "是否为气泡形状, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/badge.html#props-)"
+ },
+ "nut-badge/hidden": {
+ "type": "boolean",
+ "description": "是否隐藏, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/badge.html#props-)"
+ },
+ "nut-badge/top": {
+ "type": "number",
+ "description": "上下偏移量,支持单位设置,可设置为:`5px` 等, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/badge.html#props-)"
+ },
+ "nut-badge/right": {
+ "type": "number",
+ "description": "左右偏移量,支持单位设置,可设置为:`5px` 等, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/badge.html#props-)"
+ },
+ "nut-badge/custom-color": {
+ "type": "string",
+ "description": "徽标背景颜色, default: #fa2c19.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/badge.html#props-)"
+ },
+ "nut-circle-progress/progress": {
+ "type": "number | string",
+ "description": "百分比, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/circleprogress.html#props)"
+ },
+ "nut-circle-progress/stroke-width": {
+ "type": "number | string",
+ "description": "圆弧的宽度, default: 5.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/circleprogress.html#props)"
+ },
+ "nut-circle-progress/radius": {
+ "type": "number | string",
+ "description": "半径, default: 50.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/circleprogress.html#props)"
+ },
+ "nut-circle-progress/custom-color": {
+ "type": "object | string",
+ "description": "圆环进度条颜色, default: #fa2c19.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/circleprogress.html#props)"
+ },
+ "nut-circle-progress/path-color": {
+ "type": "string",
+ "description": "圆环轨道颜色, default: #d9d9d9.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/circleprogress.html#props)"
+ },
+ "nut-circle-progress/stroke-linecap": {
+ "type": "string",
+ "description": "圆环进度条端点形状可选值为 `square` `butt`, default: round.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/circleprogress.html#props)"
+ },
+ "nut-circle-progress/clockwise": {
+ "type": "boolean",
+ "description": "是否顺时针展示, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/circleprogress.html#props)"
+ },
+ "nut-collapse/model-value": {
+ "type": "手风琴模式:string | number
非手风琴模式:(string | number)[]",
+ "description": "当前展开面板的 `name`\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/collapse.html#collapse-props)"
+ },
+ "nut-collapse/accordion": {
+ "type": "boolean",
+ "description": "是否开启手风琴模式, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/collapse.html#collapse-props)"
+ },
+ "nut-collapse-item/name": {
+ "type": "string | number",
+ "description": "唯一标识符,必填, default: -1.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/collapse.html#collapseitem-props)"
+ },
+ "nut-collapse-item/title": {
+ "type": "string",
+ "description": "标题栏左侧内容,支持插槽传入(`props` 传入的优先级更高)\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/collapse.html#collapseitem-props)"
+ },
+ "nut-collapse-item/value": {
+ "type": "string",
+ "description": "标题栏右侧内容,支持插槽传入(`props` 传入的优先级更高)\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/collapse.html#collapseitem-props)"
+ },
+ "nut-collapse-item/icon": {
+ "description": "标题栏左侧图标组件,等同于 `nutui-icon` 组件\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/collapse.html#collapseitem-props)"
+ },
+ "nut-collapse-item/label": {
+ "type": "number | string",
+ "description": "标题栏描述信息\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/collapse.html#collapseitem-props)"
+ },
+ "nut-collapse-item/rotate": {
+ "type": "string | number",
+ "description": "点击折叠和展开的旋转角度,在自定义图标模式下生效, default: 180.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/collapse.html#collapseitem-props)"
+ },
+ "nut-collapse-item/disabled": {
+ "type": "boolean",
+ "description": "标题栏是否禁用, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/collapse.html#collapseitem-props)"
+ },
+ "nut-collapse-item/border": {
+ "type": "boolean",
+ "description": "是否显示边框, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/collapse.html#collapseitem-props)"
+ },
+ "nut-collapse/change": {
+ "type": "event",
+ "description": "切换面板时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/collapse.html#events)"
+ },
+ "nut-countdown/model-value": {
+ "type": "object",
+ "description": "当前时间,自定义展示内容时生效, default: {}.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/countdown.html#props)"
+ },
+ "nut-countdown/start-time": {
+ "type": "string | number",
+ "description": "开始时间, default: Date.now().\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/countdown.html#props)"
+ },
+ "nut-countdown/end-time": {
+ "type": "string | number",
+ "description": "结束时间, default: Date.now().\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/countdown.html#props)"
+ },
+ "nut-countdown/format": {
+ "type": "string",
+ "description": "时间格式, default: HH:mm:ss.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/countdown.html#props)"
+ },
+ "nut-countdown/millisecond": {
+ "type": "boolean",
+ "description": "是否开启毫秒级渲染, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/countdown.html#props)"
+ },
+ "nut-countdown/auto-start": {
+ "type": "boolean",
+ "description": "是否自动开始倒计时, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/countdown.html#props)"
+ },
+ "nut-countdown/time": {
+ "type": "string | number",
+ "description": "倒计时显示时间,单位是毫秒。`autoStart` 为 `false` 时生效, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/countdown.html#props)"
+ },
+ "nut-countdown/paused": {
+ "type": "boolean",
+ "description": "是否暂停, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/countdown.html#props)"
+ },
+ "nut-countdown/on-end": {
+ "type": "event",
+ "description": "倒计时结束时\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/countdown.html#events)"
+ },
+ "nut-countdown/on-paused": {
+ "type": "event",
+ "description": "暂停时\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/countdown.html#events)"
+ },
+ "nut-countdown/on-restart": {
+ "type": "event",
+ "description": "暂停时\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/countdown.html#events)"
+ },
+ "nut-countup/init-num": {
+ "type": "number",
+ "description": "初始数字, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/countup.html#props)"
+ },
+ "nut-countup/end-num": {
+ "type": "number",
+ "description": "结束数字, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/countup.html#props)"
+ },
+ "nut-countup/speed": {
+ "type": "number",
+ "description": "间隔数字,目前仅支持基础用法, default: 1.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/countup.html#props)"
+ },
+ "nut-countup/to-fixed": {
+ "type": "number",
+ "description": "保留小数点后几位, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/countup.html#props)"
+ },
+ "nut-countup/start-flag": {
+ "type": "boolean",
+ "description": "触发数字滚动的标识, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/countup.html#props)"
+ },
+ "nut-countup/during": {
+ "type": "number",
+ "description": "滚动一次运行时间, default: 1000.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/countup.html#props)"
+ },
+ "nut-countup/num-width": {
+ "type": "number",
+ "description": "数字宽度,常用于自定义无缝滚动, default: 20.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/countup.html#props)"
+ },
+ "nut-countup/num-height": {
+ "type": "number",
+ "description": "数字高度,常用于自定义无缝滚动(抽奖功能必传), default: 20.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/countup.html#props)"
+ },
+ "nut-countup/custom-change-num": {
+ "type": "number",
+ "description": "要变化的数字(用于自定义图片,`initNum`、`endNum` 在此无效), default: 1.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/countup.html#props)"
+ },
+ "nut-countup/custom-bg-img": {
+ "type": "string",
+ "description": "自定义图片(建议使用雪碧图实现,使用抽奖功能必须使用雪碧图)\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/countup.html#props)"
+ },
+ "nut-countup/custom-spac-num": {
+ "type": "number",
+ "description": "图片中数字之间可能会存在间距, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/countup.html#props)"
+ },
+ "nut-countup/type": {
+ "type": "string",
+ "description": "抽奖功能传 machine,可选值为 `machine` `' '`\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/countup.html#props)"
+ },
+ "nut-countup/machine-prize-num": {
+ "type": "number",
+ "description": "奖品个数,一共多少个奖品,必传, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/countup.html#props)"
+ },
+ "nut-countup/machine-num": {
+ "type": "number",
+ "description": "抽奖位,即滚动几个,必传, default: 3.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/countup.html#props)"
+ },
+ "nut-countup/machine-prize-level": {
+ "type": "number",
+ "description": "中奖图标,图标在雪碧图中的位置, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/countup.html#props)"
+ },
+ "nut-countup/machine-turn-more": {
+ "type": "number",
+ "description": "滚动圈数, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/countup.html#props)"
+ },
+ "nut-countup/scroll-end": {
+ "type": "event",
+ "description": "滚动结束后回调函数\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/countup.html#events)"
+ },
+ "nut-ellipsis/content": {
+ "type": "string",
+ "description": "文本内容\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/ellipsis.html#props)"
+ },
+ "nut-ellipsis/direction": {
+ "type": "string",
+ "description": "省略位置,可选值 `start` | `end` | `middle`, default: end.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/ellipsis.html#props)"
+ },
+ "nut-ellipsis/rows": {
+ "type": "number",
+ "description": "展示几行, default: 1.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/ellipsis.html#props)"
+ },
+ "nut-ellipsis/expand-text": {
+ "type": "string",
+ "description": "展开操作的文案\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/ellipsis.html#props)"
+ },
+ "nut-ellipsis/collapse-text": {
+ "type": "string",
+ "description": "收起操作的文案\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/ellipsis.html#props)"
+ },
+ "nut-ellipsis/symbol": {
+ "type": "string",
+ "description": "省略的符号, default: ....\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/ellipsis.html#props)"
+ },
+ "nut-ellipsis/line-height": {
+ "type": "string | number",
+ "description": "容器的行高, default: 20.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/ellipsis.html#props)"
+ },
+ "nut-ellipsis/click": {
+ "type": "event",
+ "description": "文本点击是触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/ellipsis.html#events)"
+ },
+ "nut-ellipsis/change": {
+ "type": "event",
+ "description": "点击展开收起时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/ellipsis.html#events)"
+ },
+ "nut-empty/image": {
+ "type": "string",
+ "description": "图片类型,可选值为 `empty`、`error`、`network`,支持传入图片 `URL`, default: empty.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/empty.html#props)"
+ },
+ "nut-empty/image-size": {
+ "type": "number | string",
+ "description": "图片大小,单位为 `px`\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/empty.html#props)"
+ },
+ "nut-empty/description": {
+ "type": "string",
+ "description": "图片下方的描述文字\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/empty.html#props)"
+ },
+ "nut-image-preview/show": {
+ "type": "boolean",
+ "description": "是否展示预览图片, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/imagepreview.html#props)"
+ },
+ "nut-image-preview/images": {
+ "type": "ImageArray[]",
+ "description": "预览图片数组, default: [].\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/imagepreview.html#props)"
+ },
+ "nut-image-preview/autoplay": {
+ "type": "number | string",
+ "description": "自动轮播时长,0 表示不会自动轮播, default: 3000.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/imagepreview.html#props)"
+ },
+ "nut-image-preview/init-no": {
+ "type": "number",
+ "description": "初始页码, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/imagepreview.html#props)"
+ },
+ "nut-image-preview/pagination-visible": {
+ "type": "boolean",
+ "description": "分页指示器是否展示, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/imagepreview.html#props)"
+ },
+ "nut-image-preview/pagination-color": {
+ "type": "string",
+ "description": "分页指示器选中的颜色, default: #fff.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/imagepreview.html#props)"
+ },
+ "nut-image-preview/content-close": {
+ "type": "boolean",
+ "description": "点击图片可以退出预览, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/imagepreview.html#props)"
+ },
+ "nut-image-preview/show-index": {
+ "type": "boolean",
+ "description": "是否显示页码, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/imagepreview.html#props)"
+ },
+ "nut-image-preview/closeable": {
+ "type": "boolean",
+ "description": "是否显示关闭图标, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/imagepreview.html#props)"
+ },
+ "nut-image-preview/close-icon-position": {
+ "type": "string",
+ "description": "关闭图标位置,可选值:`top-left`, default: top-right.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/imagepreview.html#props)"
+ },
+ "nut-image-preview/before-close": {
+ "type": "(active: number) => boolean | Promise<`boolean`>",
+ "description": "关闭前的回调函数,返回 `false` 可阻止关闭,支持返回 `Promise`\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/imagepreview.html#props)"
+ },
+ "nut-image-preview/is-Loop": {
+ "type": "boolean",
+ "description": "是否循环播放, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/imagepreview.html#props)"
+ },
+ "nut-image-preview/scale": {
+ "type": "boolean",
+ "description": "是否支持双指缩放, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/imagepreview.html#props)"
+ },
+ "nut-image-preview/close": {
+ "type": "event",
+ "description": "点击遮罩关闭图片预览时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/imagepreview.html#events)"
+ },
+ "nut-image-preview/change": {
+ "type": "event",
+ "description": "切换图片时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/imagepreview.html#events)"
+ },
+ "nut-image-preview/long-press": {
+ "type": "event",
+ "description": "小程序长按图片触发的事件\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/imagepreview.html#events)"
+ },
+ "nut-list/height": {
+ "type": "Number",
+ "description": "列表项的高度/预估高度,支持不固定高度, default: 80.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/list.html#props)"
+ },
+ "nut-list/list-data": {
+ "type": "any[]",
+ "description": "列表数据, default: [].\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/list.html#props)"
+ },
+ "nut-list/container-height": {
+ "type": "Number",
+ "description": "容器高度(最大值不能超过可视区), default: 可视区高度.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/list.html#props)"
+ },
+ "nut-list/scroll": {
+ "type": "event",
+ "description": "滚动到底部时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/list.html#events)"
+ },
+ "nut-loading-page/loading": {
+ "type": "boolean",
+ "description": "是否加载中, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/loadingpage.html#props)"
+ },
+ "nut-loading-page/loadingText": {
+ "type": "string",
+ "description": "提示内容, default: 正在加载.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/loadingpage.html#props)"
+ },
+ "nut-loading-page/image": {
+ "type": "`String`",
+ "description": "文字上方用于替换loading动画的图片\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/loadingpage.html#props)"
+ },
+ "nut-loading-page/bgColor": {
+ "type": "string",
+ "description": "背景颜色, default: #fff.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/loadingpage.html#props)"
+ },
+ "nut-loading-page/custom-color": {
+ "type": "String",
+ "description": "字体颜色, default: #606266.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/loadingpage.html#props)"
+ },
+ "nut-loading-page/font-size": {
+ "type": "`String | Number`",
+ "description": "字体大小,单位rpx, default: 18.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/loadingpage.html#props)"
+ },
+ "nut-loading-page/iconSize": {
+ "type": "`String`",
+ "description": "加载中图标的颜色, default: 35.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/loadingpage.html#props)"
+ },
+ "nut-loading-page/loadingColor": {
+ "type": "String",
+ "description": "边框和线条颜色, default: #C8C8C8.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/loadingpage.html#props)"
+ },
+ "nut-(direction=vertical)/list": {
+ "type": "array",
+ "description": "纵向滚动数据列表, default: [].\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/noticebar.html#props(direction=vertical))"
+ },
+ "nut-(direction=vertical)/speed": {
+ "type": "number",
+ "description": "滚动的速度, default: 50.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/noticebar.html#props(direction=vertical))"
+ },
+ "nut-(direction=vertical)/stand-time": {
+ "type": "number",
+ "description": "停留时间(毫秒), default: 1000.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/noticebar.html#props(direction=vertical))"
+ },
+ "nut-(direction=vertical)/complex-am": {
+ "type": "boolean",
+ "description": "稍复杂的动画,耗能会高, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/noticebar.html#props(direction=vertical))"
+ },
+ "nut-(direction=vertical)/height": {
+ "type": "number",
+ "description": "每一个滚动列的高度(px), default: 40.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/noticebar.html#props(direction=vertical))"
+ },
+ "nut-(direction=vertical)/close-mode": {
+ "type": "boolean",
+ "description": "是否启用右侧关闭图标,可以通过 `slot[name=rightIcon]`自定义图标, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/noticebar.html#props(direction=vertical))"
+ },
+ "nut-(direction=vertical)/field-name": {
+ "type": "string",
+ "description": "如果传递数组对象,显示文字的字段名\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/noticebar.html#props(direction=vertical))"
+ },
+ "nut-noticebar/click": {
+ "type": "event",
+ "description": "外层点击事件回调\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/noticebar.html#events)"
+ },
+ "nut-noticebar/close": {
+ "type": "event",
+ "description": "关闭通知栏时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/noticebar.html#events)"
+ },
+ "nut-popover/list": {
+ "type": "List[]",
+ "description": "选项列表, default: [].\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/popover.html#props-)"
+ },
+ "nut-popover/visible": {
+ "type": "boolean",
+ "description": "是否展示气泡弹出层, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/popover.html#props-)"
+ },
+ "nut-popover/theme": {
+ "type": "string",
+ "description": "主题风格,可选值为 dark, default: light.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/popover.html#props-)"
+ },
+ "nut-popover/location": {
+ "type": "string",
+ "description": "弹出位置, default: bottom.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/popover.html#props-)"
+ },
+ "nut-popover/offset": {
+ "type": "[number,number]",
+ "description": "出现位置的偏移量, default: [0, 12].\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/popover.html#props-)"
+ },
+ "nut-popover/show-arrow": {
+ "type": "boolean",
+ "description": "是否显示小箭头, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/popover.html#props-)"
+ },
+ "nut-popover/custom-class": {
+ "type": "string",
+ "description": "自定义 class 值\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/popover.html#props-)"
+ },
+ "nut-popover/duration": {
+ "type": "number | string",
+ "description": "动画时长,单位毫秒, default: 300.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/popover.html#props-)"
+ },
+ "nut-popover/overlay": {
+ "type": "boolean",
+ "description": "是否显示遮罩层, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/popover.html#props-)"
+ },
+ "nut-popover/overlay-class": {
+ "type": "string",
+ "description": "自定义遮罩层类名\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/popover.html#props-)"
+ },
+ "nut-popover/overlay-style": {
+ "type": "string",
+ "description": "自定义遮罩层样式\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/popover.html#props-)"
+ },
+ "nut-popover/close-on-click-overlay": {
+ "type": "boolean",
+ "description": "是否在点击遮罩层后关闭菜单, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/popover.html#props-)"
+ },
+ "nut-popover/close-on-click-action": {
+ "type": "boolean",
+ "description": "是否在点击选项后关闭, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/popover.html#props-)"
+ },
+ "nut-popover/close-on-click-outside": {
+ "type": "boolean",
+ "description": "是否在点击外部元素后关闭菜单, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/popover.html#props-)"
+ },
+ "nut-popover/bg-color": {
+ "type": "string",
+ "description": "自定义背景色\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/popover.html#props-)"
+ },
+ "nut-popover/arrow-offset": {
+ "type": "number",
+ "description": "小箭头的偏移量, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/popover.html#props-)"
+ },
+ "nut-popover/choose": {
+ "type": "event",
+ "description": "点击选项时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/popover.html#events)"
+ },
+ "nut-popover/open": {
+ "type": "event",
+ "description": "打开菜单时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/popover.html#events)"
+ },
+ "nut-popover/close": {
+ "type": "event",
+ "description": "关闭菜单时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/popover.html#events)"
+ },
+ "nut-price/price": {
+ "type": "number | string",
+ "description": "价格数量, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/price.html#props)"
+ },
+ "nut-price/need-symbol": {
+ "type": "boolean",
+ "description": "是否需要加上 symbol 符号, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/price.html#props)"
+ },
+ "nut-price/symbol": {
+ "type": "string",
+ "description": "符号类型, default: ¥.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/price.html#props)"
+ },
+ "nut-price/decimal-digits": {
+ "type": "number",
+ "description": "小数位位数, default: 2.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/price.html#props)"
+ },
+ "nut-price/thousands": {
+ "type": "boolean",
+ "description": "是否按照千分号形式显示, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/price.html#props)"
+ },
+ "nut-price/position": {
+ "type": "string",
+ "description": "符号显示在价格前或者后,`before`、`after`, default: before.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/price.html#props)"
+ },
+ "nut-price/size": {
+ "type": "string",
+ "description": "价格尺寸,`small`、`normal`、`large`, default: normal.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/price.html#props)"
+ },
+ "nut-price/strike-through": {
+ "type": "Boolean",
+ "description": "是否展示划线价, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/price.html#props)"
+ },
+ "nut-progress/percentage": {
+ "type": "number",
+ "description": "百分比, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/progress.html#props)"
+ },
+ "nut-progress/is-show-percentage": {
+ "type": "boolean",
+ "description": "是否需要展示百分号, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/progress.html#props)"
+ },
+ "nut-progress/stroke-color": {
+ "type": "string",
+ "description": "进度条背景色, default: #f30.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/progress.html#props)"
+ },
+ "nut-progress/stroke-width": {
+ "type": "string",
+ "description": "进度条宽度\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/progress.html#props)"
+ },
+ "nut-progress/size": {
+ "type": "string",
+ "description": "进度条及文字尺寸,可选值 `small` `base` `large`, default: base.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/progress.html#props)"
+ },
+ "nut-progress/show-text": {
+ "type": "boolean",
+ "description": "是否显示进度条文字内容, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/progress.html#props)"
+ },
+ "nut-progress/text-inside": {
+ "type": "boolean",
+ "description": "进度条文字显示位置(false:外显,true:内显), default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/progress.html#props)"
+ },
+ "nut-progress/text-color": {
+ "type": "string",
+ "description": "进度条文字颜色设置, default: #333.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/progress.html#props)"
+ },
+ "nut-progress/text-background": {
+ "type": "string",
+ "description": "进度条文字背景颜色设置\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/progress.html#props)"
+ },
+ "nut-progress/status": {
+ "type": "string",
+ "description": "进度条当前状态,可选值`active(展示动画效果)` `icon(展示icon标签)`, default: text.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/progress.html#props)"
+ },
+ "nut-skeleton/loading": {
+ "type": "boolean",
+ "description": "是否显示骨架屏, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/skeleton.html#props)"
+ },
+ "nut-skeleton/width": {
+ "type": "string",
+ "description": "每行宽度, default: default.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/skeleton.html#props)"
+ },
+ "nut-skeleton/height": {
+ "type": "string",
+ "description": "每行高度, default: 15px.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/skeleton.html#props)"
+ },
+ "nut-skeleton/animated": {
+ "type": "boolean",
+ "description": "是否开启骨架屏动画, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/skeleton.html#props)"
+ },
+ "nut-skeleton/avatar": {
+ "type": "boolean",
+ "description": "是否显示头像, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/skeleton.html#props)"
+ },
+ "nut-skeleton/avatar-shape": {
+ "type": "string",
+ "description": "头像形状:正方形/圆形, default: round.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/skeleton.html#props)"
+ },
+ "nut-skeleton/avatar-size": {
+ "type": "string",
+ "description": "头像大小, default: 50px.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/skeleton.html#props)"
+ },
+ "nut-skeleton/round": {
+ "type": "boolean",
+ "description": "标题/段落是否采用圆角风格, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/skeleton.html#props)"
+ },
+ "nut-skeleton/row": {
+ "type": "string",
+ "description": "设置段落行数, default: 1.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/skeleton.html#props)"
+ },
+ "nut-skeleton/title": {
+ "type": "boolean",
+ "description": "是否显示段落标题, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/skeleton.html#props)"
+ },
+ "nut-steps/direction": {
+ "type": "string",
+ "description": "显示方向,`horizontal`,`vertical`, default: horizontal.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/steps.html#steps-props)"
+ },
+ "nut-steps/current": {
+ "type": "number | string",
+ "description": "当前所在的步骤, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/steps.html#steps-props)"
+ },
+ "nut-steps/progress-dot": {
+ "type": "boolean",
+ "description": "点状步骤条, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/steps.html#steps-props)"
+ },
+ "nut-steps/click-step": {
+ "type": "event",
+ "description": "点击步骤的标题或图标时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/steps.html#steps-events)"
+ },
+ "nut-step/title": {
+ "type": "string",
+ "description": "流程步骤的标题, default: 步骤.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/steps.html#step-props)"
+ },
+ "nut-step/content": {
+ "type": "string",
+ "description": "流程步骤的描述性文字(支持 html 结构), default: 步骤描述.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/steps.html#step-props)"
+ },
+ "nut-swiper/width": {
+ "type": "number | string",
+ "description": "轮播卡片的宽度\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/swiper.html#props)"
+ },
+ "nut-swiper/height": {
+ "type": "number | string",
+ "description": "轮播卡片的高度\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/swiper.html#props)"
+ },
+ "nut-swiper/direction": {
+ "type": "string",
+ "description": "轮播方向,可选值`horizontal`,`vertical`, default: horizontal.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/swiper.html#props)"
+ },
+ "nut-swiper/pagination-visible": {
+ "type": "boolean",
+ "description": "分页指示器是否展示, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/swiper.html#props)"
+ },
+ "nut-swiper/pagination-color": {
+ "type": "string",
+ "description": "分页指示器选中的颜色, default: #fff.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/swiper.html#props)"
+ },
+ "nut-swiper/pagination-unselected-color": {
+ "type": "string",
+ "description": "分页指示器没有选中的颜色, default: #ddd.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/swiper.html#props)"
+ },
+ "nut-swiper/loop": {
+ "type": "boolean",
+ "description": "是否循环轮播, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/swiper.html#props)"
+ },
+ "nut-swiper/duration": {
+ "type": "number | string",
+ "description": "动画时长(单位是ms), default: 500.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/swiper.html#props)"
+ },
+ "nut-swiper/auto-play": {
+ "type": "number | string",
+ "description": "自动轮播时长,0表示不会自动轮播, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/swiper.html#props)"
+ },
+ "nut-swiper/init-page": {
+ "type": "number | string",
+ "description": "初始化索引值, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/swiper.html#props)"
+ },
+ "nut-swiper/touchable": {
+ "type": "boolean",
+ "description": "是否可触摸滑动, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/swiper.html#props)"
+ },
+ "nut-swiper/is-prevent-default": {
+ "type": "boolean",
+ "description": "滑动过程中是否禁用默认事件, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/swiper.html#props)"
+ },
+ "nut-swiper/is-stop-propagation": {
+ "type": "boolean",
+ "description": "滑动过程中是否禁止冒泡, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/swiper.html#props)"
+ },
+ "nut-swiper/change": {
+ "type": "event",
+ "description": "滑动之后的回调\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/swiper.html#events)"
+ },
+ "nut-table-column/key": {
+ "type": "string",
+ "description": "列的唯一标识\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/table.html#tablecolumnprops)"
+ },
+ "nut-table-column/title": {
+ "type": "string",
+ "description": "表头标题\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/table.html#tablecolumnprops)"
+ },
+ "nut-table-column/stylehead": {
+ "type": "string",
+ "description": "表头样式\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/table.html#tablecolumnprops)"
+ },
+ "nut-table-column/stylecolumn": {
+ "type": "string",
+ "description": "列样式\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/table.html#tablecolumnprops)"
+ },
+ "nut-table-column/align": {
+ "type": "string",
+ "description": "列的对齐方式,可选值`left`,`center`,`right`, default: left.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/table.html#tablecolumnprops)"
+ },
+ "nut-table-column/sorter": {
+ "type": "boolean | Function | string",
+ "description": "排序,可选值有 `true`,`function`, `default`, 其中 `default`表示点击之后可能会依赖接口, `function`可以返回具体的排序函数, `default`表示采用默认的排序算法\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/table.html#tablecolumnprops)"
+ },
+ "nut-table-column/render": {
+ "type": "Function(record)",
+ "description": "自定义渲染列数据,优先级高\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/table.html#tablecolumnprops)"
+ },
+ "nut-table/bordered": {
+ "type": "boolean",
+ "description": "是否显示边框, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/table.html#props)"
+ },
+ "nut-table/columns": {
+ "type": "TableColumnProps[]",
+ "description": "表头数据, default: [].\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/table.html#props)"
+ },
+ "nut-table/data": {
+ "type": "object[]",
+ "description": "表格数据, default: [].\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/table.html#props)"
+ },
+ "nut-table/summary": {
+ "type": "Function",
+ "description": "是否显示简介\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/table.html#props)"
+ },
+ "nut-table/striped": {
+ "type": "boolean",
+ "description": "条纹是否明暗交替, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/table.html#props)"
+ },
+ "nut-table/sorter": {
+ "type": "event",
+ "description": "点击排序按钮触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/table.html#events)"
+ },
+ "nut-tag/type": {
+ "type": "string",
+ "description": "标签类型,可选值为 `primary`、`success`、`danger`、`warning`, default: default.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/tag.html#props)"
+ },
+ "nut-tag/custom-color": {
+ "type": "string",
+ "description": "标签颜色\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/tag.html#props)"
+ },
+ "nut-tag/text-color": {
+ "type": "string",
+ "description": "文本颜色\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/tag.html#props)"
+ },
+ "nut-tag/plain": {
+ "type": "boolean",
+ "description": "是否为空心样式, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/tag.html#props)"
+ },
+ "nut-tag/round": {
+ "type": "boolean",
+ "description": "是否为圆角样式, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/tag.html#props)"
+ },
+ "nut-tag/mark": {
+ "type": "boolean",
+ "description": "是否为标记样式, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/tag.html#props)"
+ },
+ "nut-tag/closeable": {
+ "type": "boolean",
+ "description": "是否为可关闭标签, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/tag.html#props)"
+ },
+ "nut-tag/close-icon-size": {
+ "type": "number | string",
+ "description": "关闭图标大小, default: 11px.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/tag.html#props)"
+ },
+ "nut-tag/disabled": {
+ "type": "boolean",
+ "description": "是否禁用, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/tag.html#props)"
+ },
+ "nut-tag/click": {
+ "type": "event",
+ "description": "点击事件\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/tag.html#events)"
+ },
+ "nut-tag/close": {
+ "type": "event",
+ "description": "关闭事件\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/tag.html#events)"
+ },
+ "nut-tour/model-value": {
+ "type": "boolean",
+ "description": "是否展示引导弹出层, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/tour.html#props-)"
+ },
+ "nut-tour/type": {
+ "type": "string",
+ "description": "引导类型, default: step.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/tour.html#props-)"
+ },
+ "nut-tour/steps": {
+ "type": "StepOptions[]",
+ "description": "引导步骤内容, default: [].\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/tour.html#props-)"
+ },
+ "nut-tour/offset": {
+ "type": "[number, number]",
+ "description": "镂空遮罩相对于目标元素的偏移量, default: [8, 10].\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/tour.html#props-)"
+ },
+ "nut-tour/current": {
+ "type": "number",
+ "description": "类型为 `step` 时,默认展示第几步, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/tour.html#props-)"
+ },
+ "nut-tour/custom-class": {
+ "type": "string",
+ "description": "自定义 class 值\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/tour.html#props-)"
+ },
+ "nut-tour/location": {
+ "type": "string",
+ "description": "弹出层位置,同 Popopver 的[location 属性](/components/exhibition/popover), default: bottom.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/tour.html#props-)"
+ },
+ "nut-tour/next-step-Txt": {
+ "type": "string",
+ "description": "下一步按钮文案, default: 下一步.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/tour.html#props-)"
+ },
+ "nut-tour/prev-step-Txt": {
+ "type": "string",
+ "description": "上一步按钮文案, default: 上一步.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/tour.html#props-)"
+ },
+ "nut-tour/complete-txt": {
+ "type": "string",
+ "description": "完成按钮文案, default: 完成.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/tour.html#props-)"
+ },
+ "nut-tour/mask": {
+ "type": "boolean",
+ "description": "是否显示镂空遮罩, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/tour.html#props-)"
+ },
+ "nut-tour/bg-color": {
+ "type": "boolean",
+ "description": "自定义背景色\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/tour.html#props-)"
+ },
+ "nut-tour/theme": {
+ "type": "string",
+ "description": "气泡遮罩层主题,同 Popopver 的[theme 属性](/components/exhibition/popover), default: light.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/tour.html#props-)"
+ },
+ "nut-tour/mask-width": {
+ "type": "number |string",
+ "description": "镂空遮罩层宽度\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/tour.html#props-)"
+ },
+ "nut-tour/mask-height": {
+ "type": "number |string",
+ "description": "镂空遮罩层高度\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/tour.html#props-)"
+ },
+ "nut-tour/close-on-click-overlay": {
+ "type": "Boolean",
+ "description": "是否在点击镂空遮罩层后关闭,同 Popopver 的[closeOnClickOverlay 属性](/components/exhibition/popover), default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/tour.html#props-)"
+ },
+ "nut-tour/show-prev-step": {
+ "type": "boolean",
+ "description": "是否展示上一步按钮, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/tour.html#props-)"
+ },
+ "nut-tour/show-title-bar": {
+ "type": "boolean",
+ "description": "是否展示标题栏, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/tour.html#props-)"
+ },
+ "nut-tour/change": {
+ "type": "event",
+ "description": "切换步骤时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/tour.html#events)"
+ },
+ "nut-tour/close": {
+ "type": "event",
+ "description": "气泡层关闭时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/tour.html#events)"
+ },
+ "nut-trendarrow/rate": {
+ "type": "number",
+ "description": "数值,大于0时箭头向上,小于0时箭头向下\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/trendarrow.html#props)"
+ },
+ "nut-trendarrow/digits": {
+ "type": "number",
+ "description": "小数位精度, default: 2.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/trendarrow.html#props)"
+ },
+ "nut-trendarrow/show-sign": {
+ "type": "boolean",
+ "description": "是否显示加减号, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/trendarrow.html#props)"
+ },
+ "nut-trendarrow/show-zero": {
+ "type": "boolean",
+ "description": "是否显示 0, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/trendarrow.html#props)"
+ },
+ "nut-trendarrow/arrow-left": {
+ "type": "boolean",
+ "description": "是否在数字左侧显示箭头, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/trendarrow.html#props)"
+ },
+ "nut-trendarrow/sync-text-color": {
+ "type": "boolean",
+ "description": "文字颜色是否与箭头同步, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/trendarrow.html#props)"
+ },
+ "nut-trendarrow/text-color": {
+ "type": "string",
+ "description": "文字颜色, default: #333333.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/trendarrow.html#props)"
+ },
+ "nut-trendarrow/rise-color": {
+ "type": "string",
+ "description": "向上箭头颜色, default: #fa2c19.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/trendarrow.html#props)"
+ },
+ "nut-trendarrow/drop-color": {
+ "type": "string",
+ "description": "向下箭头颜色, default: #64b578.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/trendarrow.html#props)"
+ },
+ "nut-watermark/width": {
+ "type": "number",
+ "description": "水印的宽度, default: 120.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/watermark.html#props)"
+ },
+ "nut-watermark/height": {
+ "type": "number",
+ "description": "水印的高度, default: 64.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/watermark.html#props)"
+ },
+ "nut-watermark/rotate": {
+ "type": "number",
+ "description": "水印绘制时,旋转的角度, default: -22.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/watermark.html#props)"
+ },
+ "nut-watermark/image": {
+ "type": "string",
+ "description": "图片源,建议导出 2 倍或 3 倍图,优先使用图片渲染水印\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/watermark.html#props)"
+ },
+ "nut-watermark/image-width": {
+ "type": "number",
+ "description": "图片宽度, default: 120.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/watermark.html#props)"
+ },
+ "nut-watermark/image-height": {
+ "type": "number",
+ "description": "图片高度, default: 64.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/watermark.html#props)"
+ },
+ "nut-watermark/z-index": {
+ "type": "number",
+ "description": "追加的水印元素的 z-index, default: 2000.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/watermark.html#props)"
+ },
+ "nut-watermark/content": {
+ "type": "string | string[]",
+ "description": "水印文字内容\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/watermark.html#props)"
+ },
+ "nut-watermark/font-color": {
+ "type": "string",
+ "description": "水印文字颜色, default: rgba(0, 0, 0, .15).\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/watermark.html#props)"
+ },
+ "nut-watermark/font-size": {
+ "type": "string | number",
+ "description": "文字大小, default: 16.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/watermark.html#props)"
+ },
+ "nut-watermark/gap-x": {
+ "type": "number",
+ "description": "水印之间的水平间距, default: 24.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/watermark.html#props)"
+ },
+ "nut-watermark/gap-y": {
+ "type": "number",
+ "description": "水印之间的垂直间距, default: 48.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/watermark.html#props)"
+ },
+ "nut-watermark/full-page": {
+ "type": "boolean",
+ "description": "是否覆盖整个页面, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/watermark.html#props)"
+ },
+ "nut-watermark/font-family": {
+ "type": "boolean",
+ "description": "水印文字字体, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/exhibition/watermark.html#props)"
+ },
+ "nut-action-sheet/v-model:visible": {
+ "type": "boolean",
+ "description": "是否展示动作面板, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/actionsheet.html#props)"
+ },
+ "nut-action-sheet/menu-items": {
+ "type": "MenuItems[]",
+ "description": "列表项, default: [].\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/actionsheet.html#props)"
+ },
+ "nut-action-sheet/option-tag": {
+ "type": "string",
+ "description": "设置列表项标题展示使用参数, default: name.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/actionsheet.html#props)"
+ },
+ "nut-action-sheet/option-sub-tag": {
+ "type": "string",
+ "description": "设置列表项二级标题展示使用参数, default: subname.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/actionsheet.html#props)"
+ },
+ "nut-action-sheet/choose-tag-value": {
+ "type": "string",
+ "description": "设置选中项的值,和 `'option-tag'` 的值对应\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/actionsheet.html#props)"
+ },
+ "nut-action-sheet/custom-color": {
+ "type": "string",
+ "description": "选中项颜色,当 `choose-tag-value == option-tag` 的值 生效, default: #ee0a24.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/actionsheet.html#props)"
+ },
+ "nut-action-sheet/title": {
+ "type": "string",
+ "description": "设置列表项标题\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/actionsheet.html#props)"
+ },
+ "nut-action-sheet/description": {
+ "type": "string",
+ "description": "设置列表项副标题/描述\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/actionsheet.html#props)"
+ },
+ "nut-action-sheet/cancel-txt": {
+ "type": "string",
+ "description": "取消文案, default: 取消.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/actionsheet.html#props)"
+ },
+ "nut-action-sheet/close-abled": {
+ "type": "boolean",
+ "description": "遮罩层是否可关闭, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/actionsheet.html#props)"
+ },
+ "nut-action-sheet/round": {
+ "type": "boolean",
+ "description": "是否显示圆角, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/actionsheet.html#props)"
+ },
+ "nut-action-sheet/overlay": {
+ "type": "boolean",
+ "description": "是否显示遮罩, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/actionsheet.html#props)"
+ },
+ "nut-action-sheet/pop-class": {
+ "type": "string",
+ "description": "自定义弹框类名\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/actionsheet.html#props)"
+ },
+ "nut-action-sheet/pop-style": {
+ "type": "CSSProperties",
+ "description": "自定义弹框样式\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/actionsheet.html#props)"
+ },
+ "nut-action-sheet/overlay-class": {
+ "type": "string",
+ "description": "自定义遮罩层类名\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/actionsheet.html#props)"
+ },
+ "nut-action-sheet/overlay-style": {
+ "type": "string",
+ "description": "自定义遮罩层样式\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/actionsheet.html#props)"
+ },
+ "nut-action-sheet/lock-scroll": {
+ "type": "boolean",
+ "description": "遮罩显示时的背景是否锁定, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/actionsheet.html#props)"
+ },
+ "nut-action-sheet/safe-area-inset-bottom": {
+ "type": "boolean",
+ "description": "是否开启 iphone 系列全面屏底部安全区适配, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/actionsheet.html#props)"
+ },
+ "nut-action-sheet/choose": {
+ "type": "event",
+ "description": "选择之后触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/actionsheet.html#events)"
+ },
+ "nut-action-sheet/cancel": {
+ "type": "event",
+ "description": "点击取消文案时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/actionsheet.html#events)"
+ },
+ "nut-action-sheet/close": {
+ "type": "event",
+ "description": "点击遮罩层时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/actionsheet.html#events)"
+ },
+ "nut-backtop/height": {
+ "type": "string",
+ "description": "滚动区域的高度, default: 100vh.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/backtop.html#props-)"
+ },
+ "nut-backtop/bottom": {
+ "type": "number",
+ "description": "距离页面底部距离, default: 20.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/backtop.html#props-)"
+ },
+ "nut-backtop/right": {
+ "type": "number",
+ "description": "距离页面右侧距离, default: 10.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/backtop.html#props-)"
+ },
+ "nut-backtop/distance": {
+ "type": "number",
+ "description": "页面垂直滚动多高后出现, default: 200.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/backtop.html#props-)"
+ },
+ "nut-backtop/z-index": {
+ "type": "number",
+ "description": "设置组件页面层级, default: 10.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/backtop.html#props-)"
+ },
+ "nut-backtop/custom-color": {
+ "type": "string",
+ "description": "自定义图标颜色\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/backtop.html#props-)"
+ },
+ "nut-backtop/click": {
+ "type": "event",
+ "description": "按钮点击时触发事件\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/backtop.html#events)"
+ },
+ "nut-dialog/title": {
+ "type": "string",
+ "description": "标题\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/dialog.html#props)"
+ },
+ "nut-dialog/content": {
+ "type": "string",
+ "description": "内容,支持 `HTML`\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/dialog.html#props)"
+ },
+ "nut-dialog/close-on-click-overlay": {
+ "type": "boolean",
+ "description": "点击蒙层是否关闭对话框, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/dialog.html#props)"
+ },
+ "nut-dialog/no-footer": {
+ "type": "boolean",
+ "description": "是否隐藏底部按钮栏, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/dialog.html#props)"
+ },
+ "nut-dialog/no-ok-btn": {
+ "type": "boolean",
+ "description": "是否隐藏确定按钮, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/dialog.html#props)"
+ },
+ "nut-dialog/no-cancel-btn": {
+ "type": "boolean",
+ "description": "是否隐藏取消按钮, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/dialog.html#props)"
+ },
+ "nut-dialog/cancel-text": {
+ "type": "string",
+ "description": "取消按钮文案, default: ”取消“.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/dialog.html#props)"
+ },
+ "nut-dialog/ok-text": {
+ "type": "string",
+ "description": "确定按钮文案, default: ”确 定“.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/dialog.html#props)"
+ },
+ "nut-dialog/cancel-auto-close": {
+ "type": "boolean",
+ "description": "取消按钮是否默认关闭弹窗, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/dialog.html#props)"
+ },
+ "nut-dialog/text-align": {
+ "type": "string",
+ "description": "文字对齐方向,可选值同 `css` 的 `text-align`, default: center.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/dialog.html#props)"
+ },
+ "nut-dialog/close-on-popstate": {
+ "type": "boolean",
+ "description": "是否在页面回退时自动关闭, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/dialog.html#props)"
+ },
+ "nut-dialog/lock-scroll": {
+ "type": "boolean",
+ "description": "背景是否锁定, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/dialog.html#props)"
+ },
+ "nut-dialog/footer-direction": {
+ "type": "string",
+ "description": "使用横纵方向 可选值 `horizontal`、`vertical`, default: horizontal.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/dialog.html#props)"
+ },
+ "nut-dialog/overlay-class": {
+ "type": "string",
+ "description": "自定义遮罩类名\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/dialog.html#props)"
+ },
+ "nut-dialog/overlay-style": {
+ "type": "CSSProperties",
+ "description": "自定义遮罩样式\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/dialog.html#props)"
+ },
+ "nut-dialog/pop-class": {
+ "type": "string",
+ "description": "自定义 `popup` 弹框类名\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/dialog.html#props)"
+ },
+ "nut-dialog/pop-style": {
+ "type": "CSSProperties",
+ "description": "自定义 `popup` 弹框样式\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/dialog.html#props)"
+ },
+ "nut-dialog/custom-class": {
+ "type": "string",
+ "description": "自定义 `class`\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/dialog.html#props)"
+ },
+ "nut-dialog/before-close": {
+ "type": "Function(action: string)",
+ "description": "关闭前的回调函数,返回 `false` 可阻止关闭,支持返回 `Promise`\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/dialog.html#props)"
+ },
+ "nut-dialog/ok-auto-close": {
+ "type": "boolean",
+ "description": "确认按钮是否默认关闭弹窗, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/dialog.html#props)"
+ },
+ "nut-dialog/ok": {
+ "type": "event",
+ "description": "确定按钮回调\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/dialog.html#events)"
+ },
+ "nut-dialog/cancel": {
+ "type": "event",
+ "description": "取消按钮回调\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/dialog.html#events)"
+ },
+ "nut-dialog/closed": {
+ "type": "event",
+ "description": "关闭弹框回调\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/dialog.html#events)"
+ },
+ "nut-dialog/opened": {
+ "type": "event",
+ "description": "打开弹框回调\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/dialog.html#events)"
+ },
+ "nut-drag/attract": {
+ "type": "boolean",
+ "description": "是否开启自动吸边(根据 screenWidth 进行吸边), default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/drag.html#props)"
+ },
+ "nut-drag/direction": {
+ "type": "string",
+ "description": "拖拽元素的拖拽方向限制,**x**/**y**/**all** 三选一, default: all.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/drag.html#props)"
+ },
+ "nut-drag/boundary": {
+ "type": "object",
+ "description": "拖拽元素的拖拽边界, default: {top: 0,left: 0,right: 0,bottom: 0}.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/drag.html#props)"
+ },
+ "nut-notify/type": {
+ "type": "string",
+ "description": "提示的信息类型,可选值为`primary` `success` `danger` `warning`, default: danger.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/notify.html#props)"
+ },
+ "nut-notify/visible": {
+ "type": "boolean",
+ "description": "显示与否, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/notify.html#props)"
+ },
+ "nut-notify/msg": {
+ "type": "string",
+ "description": "展示文案,支持通过`\\n`换行\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/notify.html#props)"
+ },
+ "nut-notify/duration": {
+ "type": "number",
+ "description": "展示时长(ms),值为 0 时,notify 不会消失, default: 3000.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/notify.html#props)"
+ },
+ "nut-notify/custom-color": {
+ "type": "string",
+ "description": "字体颜色\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/notify.html#props)"
+ },
+ "nut-notify/background": {
+ "type": "string",
+ "description": "背景颜色\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/notify.html#props)"
+ },
+ "nut-notify/class-name": {
+ "type": "string | number",
+ "description": "自定义类名, default: 1.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/notify.html#props)"
+ },
+ "nut-notify/position": {
+ "type": "string",
+ "description": "自定义位置,可选值为 `top` `bottom` `left` `right` `center`, default: top.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/notify.html#props)"
+ },
+ "nut-notify/safe-area-inset-top": {
+ "type": "boolean",
+ "description": "是否留出顶部安全距离(默认为状态栏高度), default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/notify.html#props)"
+ },
+ "nut-notify/safe-height": {
+ "type": "number",
+ "description": "顶部安全高度(默认为状态栏高度), default: 设备状态栏高度.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/notify.html#props)"
+ },
+ "nut-notify/click": {
+ "type": "event",
+ "description": "点击事件回调\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/notify.html#events)"
+ },
+ "nut-notify/closed": {
+ "type": "event",
+ "description": "关闭事件回调\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/notify.html#events)"
+ },
+ "nut-swipe/lock": {
+ "type": "boolean",
+ "description": "控制内部 Swipe 互斥,即滑动打开某一个 Swipe 时,触发其余 Swipe 的 close 方法, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/swipe.html#props)"
+ },
+ "nut-swipe/open": {
+ "type": "event",
+ "description": "开启时触发,left 指向左滑,right 指向右滑\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/swipe.html#events)"
+ },
+ "nut-swipe/close": {
+ "type": "event",
+ "description": "关闭时触发,同上\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/swipe.html#events)"
+ },
+ "nut-switch/model-value": {
+ "type": "boolean | string | number",
+ "description": "开关状态, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/switch.html#props)"
+ },
+ "nut-switch/disabled": {
+ "type": "boolean",
+ "description": "禁用状态, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/switch.html#props)"
+ },
+ "nut-switch/loading": {
+ "type": "boolean",
+ "description": "加载状态, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/switch.html#props)"
+ },
+ "nut-switch/active-color": {
+ "type": "string",
+ "description": "打开时的背景颜色, default: #fa2c19.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/switch.html#props)"
+ },
+ "nut-switch/inactive-color": {
+ "type": "string",
+ "description": "关闭时的背景颜色, default: #ebebeb.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/switch.html#props)"
+ },
+ "nut-switch/active-text": {
+ "type": "string",
+ "description": "打开时文字描述\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/switch.html#props)"
+ },
+ "nut-switch/inactive-text": {
+ "type": "string",
+ "description": "关闭时文字描述\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/switch.html#props)"
+ },
+ "nut-switch/active-value": {
+ "type": "boolean | string |number",
+ "description": "打开时组件的值, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/switch.html#props)"
+ },
+ "nut-switch/inactive-value": {
+ "type": "boolean | string |number",
+ "description": "关闭组件的值, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/switch.html#props)"
+ },
+ "nut-switch/change": {
+ "type": "event",
+ "description": "切换开关时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/switch.html#events)"
+ },
+ "nut-toast/visible": {
+ "type": "boolean",
+ "description": "是否显示, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/toast.html#props)"
+ },
+ "nut-toast/selector": {
+ "type": "string",
+ "description": "配置注入的key\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/toast.html#props)"
+ },
+ "nut-toast/type": {
+ "type": "string",
+ "options": [
+ "text,success,error,warning,loading"
+ ],
+ "description": "弹框类型, default: text.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/toast.html#props)"
+ },
+ "nut-toast/title": {
+ "type": "string",
+ "description": "标题\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/toast.html#props)"
+ },
+ "nut-toast/msg": {
+ "type": "string",
+ "description": "消息文本内容,支持传入HTML\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/toast.html#props)"
+ },
+ "nut-toast/duration": {
+ "type": "number",
+ "description": "展示时长(单位:ms)(组合式函数用法/Ref用法中,loading类型默认为0), default: 2000.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/toast.html#props)"
+ },
+ "nut-toast/size": {
+ "type": "string",
+ "options": [
+ "small,base,large"
+ ],
+ "description": "文案尺寸, default: base.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/toast.html#props)"
+ },
+ "nut-toast/z-index": {
+ "type": "number",
+ "description": "组件z-index, default: 50.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/toast.html#props)"
+ },
+ "nut-toast/icon": {
+ "type": "string",
+ "description": "自定义图标\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/toast.html#props)"
+ },
+ "nut-toast/icon-size": {
+ "type": "number|string",
+ "description": "图标大小, default: 20px.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/toast.html#props)"
+ },
+ "nut-toast/bg-color": {
+ "type": "string",
+ "description": "背景颜色\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/toast.html#props)"
+ },
+ "nut-toast/cover": {
+ "type": "boolean",
+ "description": "是否显示遮罩层(组合式函数用法/Ref用法中,loading类型默认为true)\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/toast.html#props)"
+ },
+ "nut-toast/cover-color": {
+ "type": "string",
+ "description": "遮罩层颜色,默认透明\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/toast.html#props)"
+ },
+ "nut-toast/center": {
+ "type": "boolean",
+ "description": "是否展示在页面中部(为false时展示在底部), default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/toast.html#props)"
+ },
+ "nut-toast/bottom": {
+ "type": "number|string",
+ "description": "距页面底部的距离(center为false时生效), default: 30px.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/toast.html#props)"
+ },
+ "nut-toast/text-align-center": {
+ "type": "boolean",
+ "description": "文案是否居中, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/toast.html#props)"
+ },
+ "nut-toast/loading-rotate": {
+ "type": "boolean",
+ "description": "loading图标是否旋转(仅对loading类型生效), default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/toast.html#props)"
+ },
+ "nut-toast/close-on-click-overlay": {
+ "type": "boolean",
+ "description": "是否在点击遮罩层后关闭提示, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/toast.html#props)"
+ },
+ "nut-toast/on-close": {
+ "type": "Function",
+ "description": "关闭时触发的事件\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/toast.html#props)"
+ },
+ "nut-toast/on-closed": {
+ "type": "Function",
+ "description": "关闭动画完成时触发的事件\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/toast.html#props)"
+ },
+ "nut-toast/close": {
+ "type": "event",
+ "description": "关闭时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/toast.html#events)"
+ },
+ "nut-toast/closed": {
+ "type": "event",
+ "description": "关闭动画完成时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/feedback/toast.html#events)"
+ },
+ "nut-divider/dashed": {
+ "type": "boolean",
+ "description": "是否使用虚线, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/layout/divider.html#props)"
+ },
+ "nut-divider/hairline": {
+ "type": "boolean",
+ "description": "是否使用 `0.5px` 线, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/layout/divider.html#props)"
+ },
+ "nut-divider/content-position": {
+ "type": "string",
+ "description": "内容位置,可选值为 `left`、`right`, default: center.\n\n[Docs](https://nutui-uniapp.pages.dev/components/layout/divider.html#props)"
+ },
+ "nut-divider/direction": {
+ "type": "string",
+ "description": "水平还是垂直类型, default: horizontal.\n\n[Docs](https://nutui-uniapp.pages.dev/components/layout/divider.html#props)"
+ },
+ "nut-grid/column-num": {
+ "type": "number | string",
+ "description": "列数, default: 4.\n\n[Docs](https://nutui-uniapp.pages.dev/components/layout/grid.html#grid-props)"
+ },
+ "nut-grid/border": {
+ "type": "boolean",
+ "description": "是否显示边框, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/layout/grid.html#grid-props)"
+ },
+ "nut-grid/gutter": {
+ "type": "number | string",
+ "description": "格子之间的间距,默认单位为 `px`, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/layout/grid.html#grid-props)"
+ },
+ "nut-grid/center": {
+ "type": "boolean",
+ "description": "是否将格子内容居中显示, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/layout/grid.html#grid-props)"
+ },
+ "nut-grid/square": {
+ "type": "boolean",
+ "description": "是否将格子固定为正方形, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/layout/grid.html#grid-props)"
+ },
+ "nut-grid/reverse": {
+ "type": "boolean",
+ "description": "内容翻转, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/layout/grid.html#grid-props)"
+ },
+ "nut-grid/direction": {
+ "type": "string",
+ "description": "格子内容排列的方向,可选值为 `horizontal`, default: vertical.\n\n[Docs](https://nutui-uniapp.pages.dev/components/layout/grid.html#grid-props)"
+ },
+ "nut-grid/clickable": {
+ "type": "boolean",
+ "description": "是否开启格子点击反馈, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/layout/grid.html#grid-props)"
+ },
+ "nut-grid-item/text": {
+ "type": "string",
+ "description": "文字\n\n[Docs](https://nutui-uniapp.pages.dev/components/layout/grid.html#griditem-props)"
+ },
+ "nut-grid-item/click": {
+ "type": "event",
+ "description": "点击格子时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/layout/grid.html#griditem-events)"
+ },
+ "nut-row/type": {
+ "type": "string",
+ "description": "布局方式,可选值为 `flex`\n\n[Docs](https://nutui-uniapp.pages.dev/components/layout/layout.html#row-props)"
+ },
+ "nut-row/gutter": {
+ "type": "string | number",
+ "description": "列元素之间的间距(单位为 `px`)\n\n[Docs](https://nutui-uniapp.pages.dev/components/layout/layout.html#row-props)"
+ },
+ "nut-row/justify": {
+ "type": "string",
+ "description": "`Flex` 主轴对齐方式,可选值为 `start` `end` `center` `space-around` `space-between` `space-evenly`, default: start.\n\n[Docs](https://nutui-uniapp.pages.dev/components/layout/layout.html#row-props)"
+ },
+ "nut-row/align": {
+ "type": "string",
+ "description": "`Flex` 交叉轴对齐方式,可选值为 `flex-start` `center` `flex-end`, default: flex-start.\n\n[Docs](https://nutui-uniapp.pages.dev/components/layout/layout.html#row-props)"
+ },
+ "nut-row/flex-wrap": {
+ "type": "string",
+ "description": "`Flex` 是否换行,可选值为 `nowrap` `wrap` `reverse`, default: nowrap.\n\n[Docs](https://nutui-uniapp.pages.dev/components/layout/layout.html#row-props)"
+ },
+ "nut-row/click": {
+ "type": "event",
+ "description": "点击时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/layout/layout.html#row-events)"
+ },
+ "nut-col/span": {
+ "type": "string | number",
+ "description": "列元素宽度(共分为 24 份,例如设置一行3个,那么 `span` 值为 8), default: 24.\n\n[Docs](https://nutui-uniapp.pages.dev/components/layout/layout.html#col-props)"
+ },
+ "nut-col/offset": {
+ "type": "string | number",
+ "description": "列元素偏移距离, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/layout/layout.html#col-props)"
+ },
+ "nut-col/click": {
+ "type": "event",
+ "description": "点击时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/layout/layout.html#col-events)"
+ },
+ "nut-safe-area/position": {
+ "type": "`'top' | 'bottom'`",
+ "description": "安全区的位置\n\n[Docs](https://nutui-uniapp.pages.dev/components/layout/safearea.html#props)"
+ },
+ "nut-sticky/offset-top": {
+ "type": "number",
+ "description": "吸顶距离, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/layout/sticky.html#props)"
+ },
+ "nut-sticky/z-index": {
+ "type": "number",
+ "description": "吸附时的层级, default: 2000.\n\n[Docs](https://nutui-uniapp.pages.dev/components/layout/sticky.html#props)"
+ },
+ "nut-sticky/customNavHeight": {
+ "type": "number",
+ "description": "导航栏高度,自定义导航栏时,需要传入此值, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/layout/sticky.html#props)"
+ },
+ "nut-sticky/disabled": {
+ "type": "boolean",
+ "description": "是否禁用吸顶功能, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/layout/sticky.html#props)"
+ },
+ "nut-sticky/bg-color": {
+ "type": "string",
+ "description": "组件背景颜色, default: #ffffff.\n\n[Docs](https://nutui-uniapp.pages.dev/components/layout/sticky.html#props)"
+ },
+ "nut-sticky/index": {
+ "type": "number",
+ "description": "自定义标识,用于区分是哪一个组件\n\n[Docs](https://nutui-uniapp.pages.dev/components/layout/sticky.html#props)"
+ },
+ "nut-elevator/height": {
+ "type": "number | string",
+ "description": "电梯区域的高度, default: 200px.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/elevator.html#props)"
+ },
+ "nut-elevator/accept-key": {
+ "type": "string",
+ "description": "索引 `key` 值, default: title.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/elevator.html#props)"
+ },
+ "nut-elevator/index-list": {
+ "type": "Array( `item` 需包含 `id`、`name` 属性, `name` 支持传入 `html` 结构)",
+ "description": "索引列表, default: [{id: 0, name: }].\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/elevator.html#props)"
+ },
+ "nut-elevator/is-sticky": {
+ "type": "boolean",
+ "description": "索引是否吸顶, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/elevator.html#props)"
+ },
+ "nut-elevator/space-height": {
+ "type": "number",
+ "description": "右侧锚点的上下间距, default: 23.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/elevator.html#props)"
+ },
+ "nut-elevator/title-height": {
+ "type": "number",
+ "description": "左侧索引的高度, default: 35.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/elevator.html#props)"
+ },
+ "nut-elevator/click-item": {
+ "type": "event",
+ "description": "点击内容\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/elevator.html#events)"
+ },
+ "nut-elevator/click-index": {
+ "type": "event",
+ "description": "点击索引\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/elevator.html#events)"
+ },
+ "nut-elevator/change": {
+ "type": "event",
+ "description": "索引改变\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/elevator.html#events)"
+ },
+ "nut-fixed-nav/visible": {
+ "type": "boolean",
+ "description": "是否打开, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/fixednav.html#props)"
+ },
+ "nut-fixed-nav/nav-list": {
+ "type": "Array",
+ "description": "悬浮列表内容数据, default: [].\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/fixednav.html#props)"
+ },
+ "nut-fixed-nav/active-color": {
+ "type": "string",
+ "description": "选中按钮文案颜色, default: #fa2c19 默认集成主题色.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/fixednav.html#props)"
+ },
+ "nut-fixed-nav/active-text": {
+ "type": "string",
+ "description": "收起列表按钮文案, default: 收起导航.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/fixednav.html#props)"
+ },
+ "nut-fixed-nav/un-active-text": {
+ "type": "string",
+ "description": "展开列表按钮文案, default: 快速导航.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/fixednav.html#props)"
+ },
+ "nut-fixed-nav/type": {
+ "type": "string",
+ "description": "导航方向,可选值 `left` `right`, default: right.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/fixednav.html#props)"
+ },
+ "nut-fixed-nav/overlay": {
+ "type": "boolean",
+ "description": "展开时是否显示遮罩, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/fixednav.html#props)"
+ },
+ "nut-fixed-nav/position": {
+ "type": "object",
+ "description": "fixed 垂直位置, default: {top: auto,bottom: auto}.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/fixednav.html#props)"
+ },
+ "nut-fixed-nav/selected": {
+ "type": "event",
+ "description": "选择之后触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/fixednav.html#events)"
+ },
+ "nut-indicator/current": {
+ "type": "number",
+ "description": "当前步骤, default: 1.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/indicator.html#props)"
+ },
+ "nut-indicator/size": {
+ "type": "number",
+ "description": "步骤长度, default: 3.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/indicator.html#props)"
+ },
+ "nut-indicator/block": {
+ "type": "boolean",
+ "description": "是否启用块级布局, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/indicator.html#props)"
+ },
+ "nut-indicator/align": {
+ "type": "string",
+ "description": "对齐方式,仅在 `block` 为 `true` 时生效, 可选值 `left`, `right`, `center`, default: left.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/indicator.html#props)"
+ },
+ "nut-indicator/fill-zero": {
+ "type": "boolean",
+ "description": "单数前面是否补 0, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/indicator.html#props)"
+ },
+ "nut-menu/active-color": {
+ "type": "string",
+ "description": "选项的选中态图标颜色, default: #F2270C.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/menu.html#menu-props)"
+ },
+ "nut-menu/close-on-click-overlay": {
+ "type": "boolean",
+ "description": "是否在点击遮罩层后关闭菜单, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/menu.html#menu-props)"
+ },
+ "nut-menu/scroll-fixed": {
+ "type": "boolean | string | number",
+ "description": "滚动后是否固定,可设置固定位置(参考 [滚动固定](#滚动固定) 部分的说明), default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/menu.html#menu-props)"
+ },
+ "nut-menu/scroll-top": {
+ "type": "number",
+ "description": "页面的滚动距离,通过 `onPageScroll` 获取, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/menu.html#menu-props)"
+ },
+ "nut-menu/title-class": {
+ "type": "string",
+ "description": "自定义标题样式类\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/menu.html#menu-props)"
+ },
+ "nut-menu/lock-scroll": {
+ "type": "boolean",
+ "description": "背景是否锁定, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/menu.html#menu-props)"
+ },
+ "nut-menu/title-icon": {
+ "type": "string",
+ "description": "自定义标题图标\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/menu.html#menu-props)"
+ },
+ "nut-menu/direction": {
+ "type": "string",
+ "description": "展开方向,可选值为`up` `down`\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/menu.html#menu-props)"
+ },
+ "nut-menu/up-icon": {
+ "type": "string",
+ "description": "收起的图标, default: rect-up.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/menu.html#menu-props)"
+ },
+ "nut-menu/down-icon": {
+ "type": "string",
+ "description": "展开的图标, default: rect-down.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/menu.html#menu-props)"
+ },
+ "nut-menu-item/title": {
+ "type": "string",
+ "description": "菜单项标题, default: 当前选中项文字.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/menu.html#menuitem-props)"
+ },
+ "nut-menu-item/options": {
+ "type": "Array",
+ "description": "选项数组\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/menu.html#menuitem-props)"
+ },
+ "nut-menu-item/disabled": {
+ "type": "boolean",
+ "description": "是否禁用菜单, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/menu.html#menuitem-props)"
+ },
+ "nut-menu-item/cols": {
+ "type": "number",
+ "description": "可以设置一行展示多少列 `options`, default: 1.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/menu.html#menuitem-props)"
+ },
+ "nut-menu-item/direction": {
+ "type": "string",
+ "description": "菜单展开方向,可选值为 `up`, default: down.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/menu.html#menuitem-props)"
+ },
+ "nut-menu-item/active-title-class": {
+ "type": "string",
+ "description": "选项选中时自定义标题样式类\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/menu.html#menuitem-props)"
+ },
+ "nut-menu-item/inactive-title-class": {
+ "type": "string",
+ "description": "选项非选中时自定义标题样式类\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/menu.html#menuitem-props)"
+ },
+ "nut-menu-item/change": {
+ "type": "event",
+ "description": "选择选项时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/menu.html#menuitem-events)"
+ },
+ "nut-menu-item/open": {
+ "type": "event",
+ "description": "打开菜单栏时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/menu.html#menuitem-events)"
+ },
+ "nut-menu-item/close": {
+ "type": "event",
+ "description": "关闭菜单栏时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/menu.html#menuitem-events)"
+ },
+ "nut-menu-item/item-click": {
+ "type": "event",
+ "description": "点击选项时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/menu.html#menuitem-events)"
+ },
+ "nut-navbar/title": {
+ "type": "string",
+ "description": "标题名称\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/navbar.html#props)"
+ },
+ "nut-navbar/left-text": {
+ "type": "string",
+ "description": "左侧文案\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/navbar.html#props)"
+ },
+ "nut-navbar/desc": {
+ "type": "string",
+ "description": "右侧描述\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/navbar.html#props)"
+ },
+ "nut-navbar/left-show": {
+ "type": "boolean",
+ "description": "是否展示左侧箭头, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/navbar.html#props)"
+ },
+ "nut-navbar/title-icon": {
+ "type": "boolean",
+ "description": "标题中是否展示 `icon`, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/navbar.html#props)"
+ },
+ "nut-navbar/border": {
+ "type": "boolean",
+ "description": "是否显示下边框, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/navbar.html#props)"
+ },
+ "nut-navbar/fixed": {
+ "type": "boolean",
+ "description": "是否固定到顶部, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/navbar.html#props)"
+ },
+ "nut-navbar/placeholder": {
+ "type": "boolean",
+ "description": "固定在顶部时,是否在标签位置生成一个等高的占位元素, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/navbar.html#props)"
+ },
+ "nut-navbar/safe-area-inset-top": {
+ "type": "boolean",
+ "description": "是否开启顶部安全区适配, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/navbar.html#props)"
+ },
+ "nut-navbar/z-index": {
+ "type": "number | string",
+ "description": "导航栏 `z-index`, default: 10.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/navbar.html#props)"
+ },
+ "nut-navbar/size": {
+ "type": "number | string",
+ "description": "图标与字体大小\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/navbar.html#props)"
+ },
+ "nut-navbar/custom-color": {
+ "type": "number | string",
+ "description": "图标与字体颜色, default: #979797.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/navbar.html#props)"
+ },
+ "nut-navbar/on-click-title": {
+ "type": "event",
+ "description": "点击页面标题事件\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/navbar.html#events)"
+ },
+ "nut-navbar/on-click-icon": {
+ "type": "event",
+ "description": "点击页面标题icon事件\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/navbar.html#events)"
+ },
+ "nut-navbar/on-click-right": {
+ "type": "event",
+ "description": "点击右侧按钮事件\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/navbar.html#events)"
+ },
+ "nut-navbar/on-click-back": {
+ "type": "event",
+ "description": "点击左侧图标事件\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/navbar.html#events)"
+ },
+ "nut-pagination/model-value": {
+ "type": "number",
+ "description": "当前页码, default: 1.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/pagination.html#props)"
+ },
+ "nut-pagination/mode": {
+ "type": "string",
+ "description": "显示模式,可选值为 `simple`, default: multi.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/pagination.html#props)"
+ },
+ "nut-pagination/prev-text": {
+ "type": "string",
+ "description": "上一页按钮文字, default: 上一页.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/pagination.html#props)"
+ },
+ "nut-pagination/next-text": {
+ "type": "string",
+ "description": "下一页按钮文字, default: 下一页.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/pagination.html#props)"
+ },
+ "nut-pagination/page-count": {
+ "type": "string | number",
+ "description": "总页数, default: 传入/根据页数计算.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/pagination.html#props)"
+ },
+ "nut-pagination/total-items": {
+ "type": "string | number",
+ "description": "总记录数, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/pagination.html#props)"
+ },
+ "nut-pagination/items-per-page": {
+ "type": "string | number",
+ "description": "每页记录数, default: 10.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/pagination.html#props)"
+ },
+ "nut-pagination/show-page-size": {
+ "type": "string | number",
+ "description": "显示的页码个数, default: 5.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/pagination.html#props)"
+ },
+ "nut-pagination/force-ellipses": {
+ "type": "boolean",
+ "description": "是否显示省略号, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/pagination.html#props)"
+ },
+ "nut-pagination/change": {
+ "type": "event",
+ "description": "页码改变时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/pagination.html#events)"
+ },
+ "nut-side-navbar/offset": {
+ "type": "number | string",
+ "description": "导航缩进宽度, default: 15.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/sidenavbar.html#sidenavbar-props)"
+ },
+ "nut-sub-side-navbar/title": {
+ "type": "string",
+ "description": "导航标题\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/sidenavbar.html#subsidenavbar-props)"
+ },
+ "nut-sub-side-navbar/ikey": {
+ "type": "number | string",
+ "description": "导航唯一标识\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/sidenavbar.html#subsidenavbar-props)"
+ },
+ "nut-sub-side-navbar/open": {
+ "type": "boolean",
+ "description": "导航是否默认展开, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/sidenavbar.html#subsidenavbar-props)"
+ },
+ "nut-sub-side-navbar/title-click": {
+ "type": "event",
+ "description": "导航点击\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/sidenavbar.html#subsidenavbar-events)"
+ },
+ "nut-side-navbar-item/title": {
+ "type": "string",
+ "description": "导航标题, default: 15.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/sidenavbar.html#sidenavbaritem-props)"
+ },
+ "nut-side-navbar-item/ikey": {
+ "type": "number | string",
+ "description": "导航唯一标识\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/sidenavbar.html#sidenavbaritem-props)"
+ },
+ "nut-side-navbar-item/click": {
+ "type": "event",
+ "description": "导航点击\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/sidenavbar.html#sidenavbaritem-events)"
+ },
+ "nut-tabbar/model-value": {
+ "type": "number",
+ "description": "选中标签的索引值或者名称, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/tabbar.html#tabbar-props)"
+ },
+ "nut-tabbar/bottom": {
+ "type": "boolean",
+ "description": "是否固定在页面底部, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/tabbar.html#tabbar-props)"
+ },
+ "nut-tabbar/unactive-color": {
+ "type": "string",
+ "description": "icon未激活的颜色, default: #7d7e80.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/tabbar.html#tabbar-props)"
+ },
+ "nut-tabbar/active-color": {
+ "type": "string",
+ "description": "icon激活的颜色, default: #1989fa.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/tabbar.html#tabbar-props)"
+ },
+ "nut-tabbar/safe-area-inset-bottom": {
+ "type": "boolean",
+ "description": "是否开启iphone系列全面屏底部安全区适配, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/tabbar.html#tabbar-props)"
+ },
+ "nut-tabbar/placeholder": {
+ "type": "boolean",
+ "description": "固定在底部时,是否在标签位置生成一个等高的占位元素, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/tabbar.html#tabbar-props)"
+ },
+ "nut-tabbar/tab-switch": {
+ "type": "event",
+ "description": "切换页签时触发事件\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/tabbar.html#tabbar-events)"
+ },
+ "nut-tabbar-item/tab-title": {
+ "type": "string",
+ "description": "标签页的标题, default: --.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/tabbar.html#tabbaritem-props)"
+ },
+ "nut-tabbar-item/name": {
+ "type": "string",
+ "description": "标签名称,作为匹配的标识符, default: 当前标签的索引值.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/tabbar.html#tabbaritem-props)"
+ },
+ "nut-tabbar-item/icon": {
+ "type": "string",
+ "description": "标签页显示的[图标名称](/components/basic/icon), default: --.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/tabbar.html#tabbaritem-props)"
+ },
+ "nut-tabs/model-value": {
+ "type": "number | string",
+ "description": "绑定当前选中标签的标识符, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/tabs.html#tabs-props)"
+ },
+ "nut-tabs/custom-color": {
+ "type": "string",
+ "description": "标签选中色, default: #1a1a1a.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/tabs.html#tabs-props)"
+ },
+ "nut-tabs/background": {
+ "type": "string",
+ "description": "标签栏背景颜色, default: #f5f5f5.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/tabs.html#tabs-props)"
+ },
+ "nut-tabs/direction": {
+ "type": "string",
+ "description": "使用横纵方向 可选值 horizontal、vertical, default: horizontal.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/tabs.html#tabs-props)"
+ },
+ "nut-tabs/type": {
+ "type": "string",
+ "description": "选中底部展示样式 可选值 line、smile, default: line.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/tabs.html#tabs-props)"
+ },
+ "nut-tabs/swipeable": {
+ "type": "boolean",
+ "description": "是否开启手势左右滑动切换, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/tabs.html#tabs-props)"
+ },
+ "nut-tabs/title-scroll": {
+ "type": "boolean",
+ "description": "标签栏是否可以滚动, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/tabs.html#tabs-props)"
+ },
+ "nut-tabs/ellipsis": {
+ "type": "boolean",
+ "description": "是否省略过长的标题文字, default: true.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/tabs.html#tabs-props)"
+ },
+ "nut-tabs/animated-time": {
+ "type": "number | string",
+ "description": "切换动画时长,单位 ms。0 代表无动画,此时必须设置 `pane-key`(_小程序场景数据过大建议设置0,解决切换卡顿问题_), default: 300.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/tabs.html#tabs-props)"
+ },
+ "nut-tabs/title-gutter": {
+ "type": "number | string",
+ "description": "标签间隙, default: 0.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/tabs.html#tabs-props)"
+ },
+ "nut-tabs/size": {
+ "type": "string",
+ "description": "标签栏字体尺寸大小 可选值 large normal small, default: normal.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/tabs.html#tabs-props)"
+ },
+ "nut-tabs/auto-height": {
+ "type": "boolean",
+ "description": "自动高度。设置为 true 时,nut-tabs 和 nut-tabs__content 会随着当前 nut-tab-pane 的高度而发生变化。, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/tabs.html#tabs-props)"
+ },
+ "nut-tabs/name": {
+ "type": "string",
+ "description": "在`uni`环境下,必须设置 name 才能开启 title-scroll 功能,版本 >=1.6.0 时不再需要。\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/tabs.html#tabs-props)"
+ },
+ "nut-tabs/align": {
+ "type": "string",
+ "description": "横轴方向的标题对齐方式,可选值 left、center, default: center.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/tabs.html#tabs-props)"
+ },
+ "nut-tabs/click": {
+ "type": "event",
+ "description": "点击标签时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/tabs.html#tabs-events)"
+ },
+ "nut-tabs/change": {
+ "type": "event",
+ "description": "当前激活的标签改变时触发\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/tabs.html#tabs-events)"
+ },
+ "nut-tab-pane/title": {
+ "type": "string",
+ "description": "标题\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/tabs.html#tabpane-props)"
+ },
+ "nut-tab-pane/pane-key": {
+ "type": "string",
+ "description": "标签 Key , 匹配的标识符, default: 默认索引0,1,2....\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/tabs.html#tabpane-props)"
+ },
+ "nut-tab-pane/disabled": {
+ "type": "boolean",
+ "description": "是否禁用标签, default: false.\n\n[Docs](https://nutui-uniapp.pages.dev/components/nav/tabs.html#tabpane-props)"
+ }
+}
\ No newline at end of file
diff --git a/uni_modules/nutui-uni/changelog.md b/uni_modules/nutui-uni/changelog.md
new file mode 100644
index 0000000..bbd263e
--- /dev/null
+++ b/uni_modules/nutui-uni/changelog.md
@@ -0,0 +1,885 @@
+## 1.8.0(2024-10-14)
+### Bug Fixes
+
+* **dialog:** 修复小程序平台启用 `close-on-popstate` 时 `onMounted` 报错 ([#435](https://github.com/nutui-uniapp/nutui-uniapp/issues/435)) ([93127f5](https://github.com/nutui-uniapp/nutui-uniapp/commit/93127f557ad6cbbf04b88611868f9fb59a786875))
+* **popup:** 修复 `visible` 初始值为 `true` 时丢失 `z-index` 问题 ([#437](https://github.com/nutui-uniapp/nutui-uniapp/issues/437)) ([47adc2a](https://github.com/nutui-uniapp/nutui-uniapp/commit/47adc2a17ac85413d310d7849186782b1414e809))
+* **short-password:** 修复 `close-on-click-overlay` 属性无效 ([#436](https://github.com/nutui-uniapp/nutui-uniapp/issues/436)) ([e62dfb0](https://github.com/nutui-uniapp/nutui-uniapp/commit/e62dfb0ac69fa2b7c4834d640dee0426d43cb5b8))
+
+# [1.8.0](https://github.com/nutui-uniapp/nutui-uniapp/compare/v1.7.17...v1.8.0) (2024-10-14)
+
+### Bug Fixes
+
+* **dialog:** 修复小程序平台启用 `close-on-popstate` 时 `onMounted` 报错 ([#435](https://github.com/nutui-uniapp/nutui-uniapp/issues/435)) ([93127f5](https://github.com/nutui-uniapp/nutui-uniapp/commit/93127f557ad6cbbf04b88611868f9fb59a786875))
+* **popup:** 修复 `visible` 初始值为 `true` 时丢失 `z-index` 问题 ([#437](https://github.com/nutui-uniapp/nutui-uniapp/issues/437)) ([47adc2a](https://github.com/nutui-uniapp/nutui-uniapp/commit/47adc2a17ac85413d310d7849186782b1414e809))
+* **short-password:** 修复 `close-on-click-overlay` 属性无效 ([#436](https://github.com/nutui-uniapp/nutui-uniapp/issues/436)) ([e62dfb0](https://github.com/nutui-uniapp/nutui-uniapp/commit/e62dfb0ac69fa2b7c4834d640dee0426d43cb5b8))
+
+## [1.7.17](https://github.com/xiaohe0601/nutui-uniapp/compare/v1.7.16...v1.7.17) (2024-09-18)
+
+### Bug Fixes
+
+* **inputnumber:** 新增step-strictly属性 ([#421](https://github.com/xiaohe0601/nutui-uniapp/issues/421)) ([c0a3c47](https://github.com/xiaohe0601/nutui-uniapp/commit/c0a3c47099f19db14716704d5ba2b52dc31541ec))
+* **inputnumber:** 修复失焦后未正确按照最大/最小值修改输入值 ([#420](https://github.com/xiaohe0601/nutui-uniapp/issues/420)) ([be3059f](https://github.com/xiaohe0601/nutui-uniapp/commit/be3059f5e82e713a7df5f33eb31cc8fc89b7766a))
+
+### Features
+
+* **cell:** 新增title-width属性 ([#418](https://github.com/xiaohe0601/nutui-uniapp/issues/418)) ([3079495](https://github.com/xiaohe0601/nutui-uniapp/commit/3079495a522af1ae75073efa0830dde43835bd00))
+
+## [1.7.16](https://github.com/xiaohe0601/nutui-uniapp/compare/v1.7.15...v1.7.16) (2024-09-04)
+
+### Bug Fixes
+
+* **popover,shakedice,tour:** fix scss warning ([#413](https://github.com/xiaohe0601/nutui-uniapp/issues/413)) ([28df492](https://github.com/xiaohe0601/nutui-uniapp/commit/28df492f6daa00da26e72f619e8f2d5073489785))
+
+### Features
+
+* **notify:** 新增useNotify ([873b454](https://github.com/xiaohe0601/nutui-uniapp/commit/873b4545ec277b6227ea90d23d8880d0d531edb8))
+
+## [1.7.15](https://github.com/nutui-uniapp/nutui-uniapp/compare/v1.7.14...v1.7.15) (2024-08-17)
+
+### Bug Fixes
+
+* 修复部分机型不支持css inset ([#400](https://github.com/nutui-uniapp/nutui-uniapp/issues/400)) ([f282aad](https://github.com/nutui-uniapp/nutui-uniapp/commit/f282aad819bad85060f2ec6b4302df9c7e1ad61c))
+* **number-keyboard:** 修复部分机型不支持inset ([#396](https://github.com/nutui-uniapp/nutui-uniapp/issues/396)) ([d06336e](https://github.com/nutui-uniapp/nutui-uniapp/commit/d06336e2996fbe264b56de7d8e142c9a5368ddea))
+* **range:** 修复可能存在flex-shrink为0时的样式异常 ([0f3ced7](https://github.com/nutui-uniapp/nutui-uniapp/commit/0f3ced77bdb2edc0c3bbd1691af8a6916cc39da3))
+* **short-password:** 修复部分机型不支持inset ([#397](https://github.com/nutui-uniapp/nutui-uniapp/issues/397)) ([7d4eb7e](https://github.com/nutui-uniapp/nutui-uniapp/commit/7d4eb7ed4caf13a0ff9b76411602e0e359a8a359))
+* **short-password:** 修复忘记密码文本对齐问题 ([#393](https://github.com/nutui-uniapp/nutui-uniapp/issues/393)) ([bb000ae](https://github.com/nutui-uniapp/nutui-uniapp/commit/bb000ae7dc1add2f58a5a1927c9a12339f8dcbe9))
+* **sticky:** 修复降级为fixed实现时效果异常 ([#402](https://github.com/nutui-uniapp/nutui-uniapp/issues/402)) ([15f8338](https://github.com/nutui-uniapp/nutui-uniapp/commit/15f83380e467dfbd3fad6cfe77e157668b024260))
+* update type declaration from '@vue/runtime-core' to 'vue' for Vu… ([#407](https://github.com/nutui-uniapp/nutui-uniapp/issues/407)) ([14d9d78](https://github.com/nutui-uniapp/nutui-uniapp/commit/14d9d785b71b0a8be3437b286f42b2fda5340d42))
+
+### Features
+
+* **form:** 为form组件的validate方法的返回添加类型声明 ([#389](https://github.com/nutui-uniapp/nutui-uniapp/issues/389)) ([b3e2f3b](https://github.com/nutui-uniapp/nutui-uniapp/commit/b3e2f3b6e93f96f9cbf0cdf3b186b6d4a6fcb4ec))
+
+## [1.7.14](https://github.com/nutui-uniapp/nutui-uniapp/compare/v1.7.13...v1.7.14) (2024-08-05)
+
+### Bug Fixes
+
+* **range:** 修复点击控制导致NaN问题 ([415c87c](https://github.com/nutui-uniapp/nutui-uniapp/commit/415c87c7d7738d57f4406387208875409cebfa31))
+
+### Features
+
+* **cell:** 新增icon、clickable属性 ([#384](https://github.com/nutui-uniapp/nutui-uniapp/issues/384)) ([3e4ff54](https://github.com/nutui-uniapp/nutui-uniapp/commit/3e4ff54ff558fbe37ace5201aa2721fbd07e659f))
+* **checkbox:** 新增checked-value、unchecked-value属性 ([#385](https://github.com/nutui-uniapp/nutui-uniapp/issues/385)) ([9ef1b34](https://github.com/nutui-uniapp/nutui-uniapp/commit/9ef1b34f9ac63eb12d54cf60ac5f6ad9c6945043))
+
+## [1.7.13](https://github.com/nutui-uniapp/nutui-uniapp/compare/v1.7.12...v1.7.13) (2024-07-30)
+
+### Bug Fixes
+
+* **avatar:** 修复支付宝小程序不支持??语法 ([b7df6be](https://github.com/nutui-uniapp/nutui-uniapp/commit/b7df6beddf1044a078c67681f75d7f3eb90bf4e6))
+* **navbar:** 修复 navbar safe-area-inset-top 不生效的问题 ([#379](https://github.com/nutui-uniapp/nutui-uniapp/issues/379)) ([74ff480](https://github.com/nutui-uniapp/nutui-uniapp/commit/74ff480985067e7f0ebeebb74d264fe5aa3aa1d4))
+* **popup,safearea:** 修复部分低版本系统safearea不生效问题 ([271e24a](https://github.com/nutui-uniapp/nutui-uniapp/commit/271e24a9b206487627bf5b59a364b306e79f50fa))
+
+### Features
+
+* **menu:** add scroll-top prop ([#377](https://github.com/nutui-uniapp/nutui-uniapp/issues/377)) ([7b31fdf](https://github.com/nutui-uniapp/nutui-uniapp/commit/7b31fdf9db08a0696a6ce4d6c8c52d437666aa64))
+
+## [1.7.12](https://github.com/nutui-uniapp/nutui-uniapp/compare/v1.7.11...v1.7.12) (2024-07-09)
+
+### Bug Fixes
+
+* **input:** 修复由于[#324](https://github.com/nutui-uniapp/nutui-uniapp/issues/324)、[#325](https://github.com/nutui-uniapp/nutui-uniapp/issues/325)引出的blur事件失效 ([afb5c76](https://github.com/nutui-uniapp/nutui-uniapp/commit/afb5c76bf10972321d79c51c7a240be5eb9559a6))
+
+## [1.7.11](https://github.com/nutui-uniapp/nutui-uniapp/compare/v1.7.10...v1.7.11) (2024-07-08)
+
+### Bug Fixes
+
+* 修复comment生产环境web端卡死 ([#352](https://github.com/nutui-uniapp/nutui-uniapp/issues/352)) ([be73ccc](https://github.com/nutui-uniapp/nutui-uniapp/commit/be73cccab1afc1d4a93d8c653437bd17b7ce4a23))
+* **actionsheet:** 修复custom-style表现异常 ([#360](https://github.com/nutui-uniapp/nutui-uniapp/issues/360)) ([25fc6a1](https://github.com/nutui-uniapp/nutui-uniapp/commit/25fc6a12fa943fd1b6c233dc15b529867fd03446))
+* **input:** 修复小程序端clear清除困难问题 ([#324](https://github.com/nutui-uniapp/nutui-uniapp/issues/324)) ([155b00b](https://github.com/nutui-uniapp/nutui-uniapp/commit/155b00bcb3255763634a0227f197894dd2e1aae2))
+* **input:** 修复由于capture引起的blur参数丢失 ([#325](https://github.com/nutui-uniapp/nutui-uniapp/issues/325)) ([a1351ad](https://github.com/nutui-uniapp/nutui-uniapp/commit/a1351addfe187914983fad1da4f9039348574eda))
+* **popup:** 修复z-index表现异常 ([#364](https://github.com/nutui-uniapp/nutui-uniapp/issues/364)) ([cd50fc3](https://github.com/nutui-uniapp/nutui-uniapp/commit/cd50fc31d3b8e13771b30429de003cf6522e81ee))
+* **toast:** 修复部分情况下toast的duration属性无效 ([1885ded](https://github.com/nutui-uniapp/nutui-uniapp/commit/1885ded405a0cadf00dd2adb9865c98a05f7e682))
+
+### Features
+
+* **menuitem:** 新增item-click事件 ([#323](https://github.com/nutui-uniapp/nutui-uniapp/issues/323)) ([df9eeed](https://github.com/nutui-uniapp/nutui-uniapp/commit/df9eeed564f89f3ed111f91f2837c0ec8b0088cc))
+* **tab-pane:** 新增padding、background样式变量 ([#326](https://github.com/nutui-uniapp/nutui-uniapp/issues/326)) ([bf5ebae](https://github.com/nutui-uniapp/nutui-uniapp/commit/bf5ebae39aa9769c9c212fae0910c2e12621fdec))
+
+## [1.7.10](https://github.com/nutui-uniapp/nutui-uniapp/compare/v1.7.9...v1.7.10) (2024-05-08)
+
+### Bug Fixes
+
+* **input-number:** 修复小程序不支持vBind ([60427bc](https://github.com/nutui-uniapp/nutui-uniapp/commit/60427bc61a23383a42985fa276c40ada4a5c6b6d))
+
+## [1.7.9](https://github.com/nutui-uniapp/nutui-uniapp/compare/v1.7.8...v1.7.9) (2024-05-08)
+
+### Features
+
+* **input-number:** 支持透传属性至 input 元素 ([7547ed0](https://github.com/nutui-uniapp/nutui-uniapp/commit/7547ed0d7f458babb76c19ddd3c5bd093e021474))
+* **number-keyboard:** 新增 confirm 事件 ([0a6b06c](https://github.com/nutui-uniapp/nutui-uniapp/commit/0a6b06cfd21fe3e7957e082115947e393a7072f7))
+
+## [1.7.8](https://github.com/nutui-uniapp/nutui-uniapp/compare/v1.7.7...v1.7.8) (2024-04-23)
+
+### Bug Fixes
+
+* 修复useSelectorQuery在app-plus环境获取instance报错 ([#307](https://github.com/nutui-uniapp/nutui-uniapp/issues/307)) ([3499c41](https://github.com/nutui-uniapp/nutui-uniapp/commit/3499c41bd6a3d2420ba32d5272a41b12c8da86d7))
+* 修改tabs选项卡微笑曲线属性,在navbar组件content slot中样式出错bug ([0f04867](https://github.com/nutui-uniapp/nutui-uniapp/commit/0f048670229498aa5a3dc8ec63c0fe744d8cfad2))
+* **address:** 修复在选择地址后,下一级地址无法滚动到顶部 ([#301](https://github.com/nutui-uniapp/nutui-uniapp/issues/301)) ([6971ece](https://github.com/nutui-uniapp/nutui-uniapp/commit/6971ece48b5e039f82d184e672556bad5aafb6af))
+* **cell:** 修复to属性无效 ([#294](https://github.com/nutui-uniapp/nutui-uniapp/issues/294)) ([f691dff](https://github.com/nutui-uniapp/nutui-uniapp/commit/f691dffeed47aed81a83d42aad625526b4efe85a))
+* **sku:** 移除defineExpose导入 ([e10294b](https://github.com/nutui-uniapp/nutui-uniapp/commit/e10294bfd4f6217df21a2bbc5c620c1587a178e9))
+* **tabs:** 修复 vertical 方式 tab 数量过多时滚动定位不准确的问题 ([a1334df](https://github.com/nutui-uniapp/nutui-uniapp/commit/a1334df9eebec32ebe0638242922d70ad5a9fe23))
+* **uploader:** 修复uid生成可能重复 ([1f49808](https://github.com/nutui-uniapp/nutui-uniapp/commit/1f49808b03fbaa0aab5865a2cbe65cbf933ce00c)), closes [#306](https://github.com/nutui-uniapp/nutui-uniapp/issues/306)
+
+### Features
+
+* **sku:** 新增重置商品数量方法 ([#305](https://github.com/nutui-uniapp/nutui-uniapp/issues/305)) ([8e8260b](https://github.com/nutui-uniapp/nutui-uniapp/commit/8e8260bfddf884169a8c4f3f271a7dd58bc0c66a))
+* **switch:** add disabled prop & mark disable deprecated ([#299](https://github.com/nutui-uniapp/nutui-uniapp/issues/299)) ([9e8ac05](https://github.com/nutui-uniapp/nutui-uniapp/commit/9e8ac05e4edd41116fa5f7f80d2cf98f0d3a81cd))
+
+## [1.7.7](https://github.com/nutui-uniapp/nutui-uniapp/compare/v1.7.6...v1.7.7) (2024-04-12)
+
+### Bug Fixes
+
+* **ecard:** 修复输入框表现异常 ([#291](https://github.com/nutui-uniapp/nutui-uniapp/issues/291)) ([5763f25](https://github.com/nutui-uniapp/nutui-uniapp/commit/5763f25855bdd33e0068a9a1c7b2556f1e9dfaaa))
+* **swipe:** 修复组件宽度超出范围以及点击关闭问题 ([#284](https://github.com/nutui-uniapp/nutui-uniapp/issues/284)) ([48cc120](https://github.com/nutui-uniapp/nutui-uniapp/commit/48cc12026e0ec9befb7bc7215621649dee75032c))
+
+### Features
+
+* **datepicker:** 事件新增date参数 ([#289](https://github.com/nutui-uniapp/nutui-uniapp/issues/289)) ([29947b5](https://github.com/nutui-uniapp/nutui-uniapp/commit/29947b5660586650e6d8d281fa353ec47a6e6680))
+* **tag:** 新增disbaled、close-icon-size属性 ([#293](https://github.com/nutui-uniapp/nutui-uniapp/issues/293)) ([85b329c](https://github.com/nutui-uniapp/nutui-uniapp/commit/85b329cdb897164be082f4abe35c56289db1710c))
+
+## [1.7.6](https://github.com/nutui-uniapp/nutui-uniapp/compare/v1.7.5...v1.7.6) (2024-04-10)
+
+### Bug Fixes
+
+* **input:** 修复H5环境下type为number无效 ([#279](https://github.com/nutui-uniapp/nutui-uniapp/issues/279)) ([ec41815](https://github.com/nutui-uniapp/nutui-uniapp/commit/ec41815ae502f56341575706364e3a0eafeb9253))
+* **picker:** 修复非H5平台mask缺失 ([96666cf](https://github.com/nutui-uniapp/nutui-uniapp/commit/96666cf7c93c8e38c5b22c3118e2c1a7fe7a2247))
+* **searchbar:** 修复app端输入框对齐问题 ([#282](https://github.com/nutui-uniapp/nutui-uniapp/issues/282)) ([1f77dab](https://github.com/nutui-uniapp/nutui-uniapp/commit/1f77dab96d3fa0d589e383565c9a1254a309a31a))
+
+### Features
+
+* **addresslist:** 新增是否使用插槽相关属性 ([#274](https://github.com/nutui-uniapp/nutui-uniapp/issues/274)) ([1727859](https://github.com/nutui-uniapp/nutui-uniapp/commit/1727859c45d65322271e3f7121b825f10845ccac))
+* **calendar:** 添加calendar组件点击遮罩关闭事件和点击关闭图标事件 ([#273](https://github.com/nutui-uniapp/nutui-uniapp/issues/273)) ([e70e654](https://github.com/nutui-uniapp/nutui-uniapp/commit/e70e654b57a8884cc4589877f56670652160c33d))
+
+## [1.7.5](https://github.com/nutui-uniapp/nutui-uniapp/compare/v1.7.4...v1.7.5) (2024-03-29)
+
+### Bug Fixes
+
+* **popover:** 修复Popover 气泡弹出框功能问题 ([#269](https://github.com/nutui-uniapp/nutui-uniapp/issues/269)) ([bbf03e5](https://github.com/nutui-uniapp/nutui-uniapp/commit/bbf03e5a973b95d66f76edeb59114872afc606a6))
+* **list:** List 虚拟列表 listData 类型错误 ([8cba423](https://github.com/nutui-uniapp/nutui-uniapp/commit/8cba4236b178c2def23ccfd07ee1528f7530c007))
+* **checkbox:** 修复checkbox重复添加至checkboxgroup.children的问题 ([#266](https://github.com/nutui-uniapp/nutui-uniapp/issues/266)) ([3f2c2b3](https://github.com/nutui-uniapp/nutui-uniapp/commit/3f2c2b3afa0348032eadff9ef5aa8415843ecac8))
+* **dialog:** 修复dialog title响应式失效的问题 ([#267](https://github.com/nutui-uniapp/nutui-uniapp/issues/267)) ([1a0c7cf](https://github.com/nutui-uniapp/nutui-uniapp/commit/1a0c7cf72c448e6e5ff6d7890dd7739e5bbd13b0))
+
+### Features
+
+* **toast:** 新增useToast控制方式 ([#260](https://github.com/nutui-uniapp/nutui-uniapp/issues/260)) ([c014e7a](https://github.com/nutui-uniapp/nutui-uniapp/commit/c014e7a8ed31b9ad4d6bdbf11942528abea1bb26))
+
+### Refactors
+
+* **drag**: 重构 drag组件,修复drag组件多次拖动时位置瞬移到起始点的问题 ([5989869]())
+
+## [1.7.4](https://github.com/nutui-uniapp/nutui-uniapp/compare/v1.7.3...v1.7.4) (2024-03-20)
+
+### Bug Fixes
+
+* **picker:** 修复model-value值污染问题 ([ce2e865](https://github.com/nutui-uniapp/nutui-uniapp/commit/ce2e86546b4c2a03f2f5235899071b00dff98d7f))
+
+### Features
+
+* 新增clone、equal工具方法 ([ef1611c](https://github.com/nutui-uniapp/nutui-uniapp/commit/ef1611c44e7382f5a58fbc154de513c15f1a1e59))
+
+## [1.7.3](https://github.com/nutui-uniapp/nutui-uniapp/compare/v1.7.2...v1.7.3) (2024-03-09)
+
+### Bug Fixes
+
+* **elevator:** 修复app端点击索引无效,并且滚动页面索引无法跟随切换问题 ([#237](https://github.com/nutui-uniapp/nutui-uniapp/issues/237)) ([e149974](https://github.com/nutui-uniapp/nutui-uniapp/commit/e1499747ae9997bda7a5679259c211935e4d1713))
+* **picker:** 修复微信小程序暗黑模式picker背景颜色显示错误的问题 ([#236](https://github.com/nutui-uniapp/nutui-uniapp/issues/236)) ([fa425f7](https://github.com/nutui-uniapp/nutui-uniapp/commit/fa425f72584ff515b4b0a2f5810ca21f4f5760f6))
+* **picker:** 修复ts类型错误 ([#241](https://github.com/nutui-uniapp/nutui-uniapp/issues/241)) ([1e83035](https://github.com/nutui-uniapp/nutui-uniapp/commit/1e83035dab748c311ae2d207950bf219da2bcb11))
+* **sku:** 修复默认底部按钮不显示的问题 ([#238](https://github.com/nutui-uniapp/nutui-uniapp/issues/238)) ([6e2c296](https://github.com/nutui-uniapp/nutui-uniapp/commit/6e2c296ad8c2e77a84f504aa5ffe756002f98061))
+* **sku:** 修复组件内容超出,出现横向滚动条的问题 ([#240](https://github.com/nutui-uniapp/nutui-uniapp/issues/240)) ([c0bf4ab](https://github.com/nutui-uniapp/nutui-uniapp/commit/c0bf4ab341a4adbb142da6d282146825af14601d))
+* **uploader:** 修复禁用时能删除文件的问题 ([#234](https://github.com/nutui-uniapp/nutui-uniapp/issues/234)) ([834f9bc](https://github.com/nutui-uniapp/nutui-uniapp/commit/834f9bc7b00eaa0e9ebde33d9c56e1c9ed990d54))
+
+### Features
+
+* **input,textarea:** 新增输入框单独控制样式属性 ([#233](https://github.com/nutui-uniapp/nutui-uniapp/issues/233)) ([e9749b0](https://github.com/nutui-uniapp/nutui-uniapp/commit/e9749b0faa64d026c4c53e1faf349e1c42154a28))
+
+## [1.7.2](https://github.com/nutui-uniapp/nutui-uniapp/compare/v1.7.1...v1.7.2) (2024-03-04)
+
+### Bug Fixes
+
+* **avatar-group:** 修复z-index无效 ([#215](https://github.com/nutui-uniapp/nutui-uniapp/issues/215)) ([1b64ffc](https://github.com/nutui-uniapp/nutui-uniapp/commit/1b64ffc8be7923ed742cf7e0a7225738657dd81c))
+* **avatar:** 修复size、shape无效以及无法正确从group继承 ([13ce31a](https://github.com/nutui-uniapp/nutui-uniapp/commit/13ce31a8a80bd6895919d2313869c2dcf2491be7))
+* **cascader:** 修复leaf等于false并且children为空时可以选择成功的问题 ([#212](https://github.com/nutui-uniapp/nutui-uniapp/issues/212)) ([a3f27f6](https://github.com/nutui-uniapp/nutui-uniapp/commit/a3f27f6cebf36cd549f4ddab4c155efba2a8533a))
+* **input,textarea:** 修复input事件返回值错误 ([745a19c](https://github.com/nutui-uniapp/nutui-uniapp/commit/745a19c51359d827cc28307f942b6425e02e275f))
+* **textarea:** 修复类型导出缺失 ([1fa9f29](https://github.com/nutui-uniapp/nutui-uniapp/commit/1fa9f2942256bbb975e2dbf276c7c17d2aa096cb))
+* **textarea:** 修复autosize类型错误 ([7c2d56a](https://github.com/nutui-uniapp/nutui-uniapp/commit/7c2d56a3a4c962e5b2b6024e1ab68a75032af240))
+* **uploader:** 修复beforeDelete默认值无效以及不支持promise ([54a9b0a](https://github.com/nutui-uniapp/nutui-uniapp/commit/54a9b0acde8590996729fbf2d750ec6271eb10a6))
+
+### Features
+
+* **textarea:** 新增input事件 ([2a8a898](https://github.com/nutui-uniapp/nutui-uniapp/commit/2a8a8984318c71bcd24ab1a06ca5dd134a8afe2c))
+* **uploader:** 新增accept配置 ([#217](https://github.com/nutui-uniapp/nutui-uniapp/issues/217)) ([a6ba625](https://github.com/nutui-uniapp/nutui-uniapp/commit/a6ba625f0638fdcba1cdd9a34ac0c61dbdb5e095))
+
+### Reverts
+
+* **textarea:** 修复autosize类型错误 ([bc02ceb](https://github.com/nutui-uniapp/nutui-uniapp/commit/bc02ceb8a7882ea363b655cec06aba3268e01b45))
+
+## [1.7.1](https://github.com/nutui-uniapp/nutui-uniapp/compare/v1.7.0...v1.7.1) (2024-02-29)
+
+### Bug Fixes
+
+* **form:** 修复prop类型为数组时required校验无效的问题 ([00453d6](https://github.com/nutui-uniapp/nutui-uniapp/commit/00453d68c21973215b57e5248050da4dc19647a2))
+* **menu:** 偏移位置错误, app 端v-show 无效 ([#197](https://github.com/nutui-uniapp/nutui-uniapp/issues/197)) ([2fba3fe](https://github.com/nutui-uniapp/nutui-uniapp/commit/2fba3fe91b751d63b0aa007442d1ffb94516fd93))
+* **popup,menu:** 修复 popup组件update:visible事件重复调用与menu 组件close 事件在小程序中无法触发 ([#205](https://github.com/nutui-uniapp/nutui-uniapp/issues/205)) ([0ce7d69](https://github.com/nutui-uniapp/nutui-uniapp/commit/0ce7d690b6a401428ab083eba81887e7e4767178)), closes [#196](https://github.com/nutui-uniapp/nutui-uniapp/issues/196)
+* **textarea:** 修复ConfirmType导出类型名称重复以及默认值错误 ([748a849](https://github.com/nutui-uniapp/nutui-uniapp/commit/748a8498df99a543d28b37307f877ececa0fe1b4))
+* **transition:** app端destroyOnClose属性无效 ([1238ef6](https://github.com/nutui-uniapp/nutui-uniapp/commit/1238ef6cd4dd7fe59250d47752e00349f56292a0))
+
+### Features
+
+* 新增辅助样式 ([ae3775b](https://github.com/nutui-uniapp/nutui-uniapp/commit/ae3775b501b78ed8af955aa6a3b57c444d49356c))
+
+# [1.7.0](https://github.com/nutui-uniapp/nutui-uniapp/compare/v1.6.9...v1.7.0) (2024-02-22)
+
+### Bug Fixes
+
+* **input:** 修复readonly无效 ([f1547bd](https://github.com/nutui-uniapp/nutui-uniapp/commit/f1547bdb455771926c5384979ab5132d4d6df5ab))
+* **tabs:** align属性类型错误 ([f9b0eb4](https://github.com/nutui-uniapp/nutui-uniapp/commit/f9b0eb453dc7ce7114c784bb2cc69b5a29eb5d12))
+
+## [1.6.9](https://github.com/nutui-uniapp/nutui-uniapp/compare/v1.6.8...v1.6.9) (2024-02-22)
+
+### Bug Fixes
+
+* **navbar:** 修复在APP上顶部安全距离无效的问题 ([#186](https://github.com/nutui-uniapp/nutui-uniapp/issues/186)) ([e475e7e](https://github.com/nutui-uniapp/nutui-uniapp/commit/e475e7e449e2bddb50484efe0ee8ee03f1febc72))
+* **navbar:** 修复占位元素重复计算状态栏高度的问题 ([#187](https://github.com/nutui-uniapp/nutui-uniapp/issues/187)) ([e35083c](https://github.com/nutui-uniapp/nutui-uniapp/commit/e35083cda311201492719b0deb64e3097dc2dec0))
+
+### Features
+
+* **textarea:** 新增placeholder-style、placeholder-class属性 ([ada249f](https://github.com/nutui-uniapp/nutui-uniapp/commit/ada249ff100f60c2217adb31ab59692a6299f924))
+
+## [1.6.8](https://github.com/nutui-uniapp/nutui-uniapp/compare/v1.6.7...v1.6.8) (2024-02-20)
+
+### Bug Fixes
+
+* **ellipsis:** symbol属性默认值丢失 ([b685f40](https://github.com/nutui-uniapp/nutui-uniapp/commit/b685f40a7192d80e279f91c2784dc76cd0c5327f))
+* **picker:** className option ([60caafb](https://github.com/nutui-uniapp/nutui-uniapp/commit/60caafb83ee9194cdae85333ae80d4b8864c1c87))
+* randomid生成错误 ([2556b99](https://github.com/nutui-uniapp/nutui-uniapp/commit/2556b998452bc75597e5fe5d7b1d3ed870ad1cf3))
+
+### Features
+
+* **form:** 新增 disabled 属性,支持禁用 form 下全部数据录入组件 ([#184](https://github.com/nutui-uniapp/nutui-uniapp/issues/184)) ([ecd03a3](https://github.com/nutui-uniapp/nutui-uniapp/commit/ecd03a3f3d75aa8281d926d270fa5612d02e360e))
+* **marquee:** 新增disabled属性 ([#183](https://github.com/nutui-uniapp/nutui-uniapp/issues/183)) ([d64eca2](https://github.com/nutui-uniapp/nutui-uniapp/commit/d64eca23c4124138ccc8a7dc36fe5439a5e8458c))
+
+## [1.6.7](https://github.com/nutui-uniapp/nutui-uniapp/compare/v1.6.6...v1.6.7) (2024-02-06)
+
+### Bug Fixes
+
+* **input:** 移除InputType重复类型 ([15ac2cd](https://github.com/nutui-uniapp/nutui-uniapp/commit/15ac2cd1dd9955feec57df21e8c3b33126e1ab94))
+* **inputnumber:** 组件输入内容不会触发change事件 ([9d97d4e](https://github.com/nutui-uniapp/nutui-uniapp/commit/9d97d4e6b90d1cd35815328f2b6b66be94b6a806))
+* **navbar:** 修复zIndex无效问题 ([ecfbd16](https://github.com/nutui-uniapp/nutui-uniapp/commit/ecfbd168a7d392604739e6db6bf811e96c7b3dff))
+* **noticebar:** remove blank element of left-icon ([160bc37](https://github.com/nutui-uniapp/nutui-uniapp/commit/160bc3763eb0a1b193c914b967814a0b2a728bed))
+* **table:** data属性ts类型问题 ([91c434c](https://github.com/nutui-uniapp/nutui-uniapp/commit/91c434c669a9a2fed5762150c3aa641c4a61db0a))
+
+### Features
+
+* **button:** 新增hover-class相关属性 ([987185c](https://github.com/nutui-uniapp/nutui-uniapp/commit/987185cf8d93f474de5a0df4a34b908575ef2dc7))
+* **input:** 新增input事件 ([494f10a](https://github.com/nutui-uniapp/nutui-uniapp/commit/494f10ada6143930e421f1a773599cb0fe1f8761))
+
+## [1.6.6](https://github.com/nutui-uniapp/nutui-uniapp/compare/v1.6.5...v1.6.6) (2024-01-26)
+
+### Bug Fixes
+
+* **button:** disabled下 open-type 仍有效 ([af5f5ac](https://github.com/nutui-uniapp/nutui-uniapp/commit/af5f5ac34d9187ac2f0b955935e97d3f815df546)), closes [#173](https://github.com/nutui-uniapp/nutui-uniapp/issues/173)
+
+## [1.6.5](https://github.com/nutui-uniapp/nutui-uniapp/compare/v1.6.4...v1.6.5) (2024-01-23)
+
+### Bug Fixes
+
+* **form:** 修复搭配 input 使用时的样式问题 ([2ce7c20](https://github.com/nutui-uniapp/nutui-uniapp/commit/2ce7c20523694cb8a04dd22bd7a4c533e9ebd297)), closes [#165](https://github.com/nutui-uniapp/nutui-uniapp/issues/165) [#167](https://github.com/nutui-uniapp/nutui-uniapp/issues/167)
+
+### Features
+
+* 添加web-types以提升WebStorm开发体验 ([18795e1](https://github.com/nutui-uniapp/nutui-uniapp/commit/18795e1ad86267cca09ff4abc28f0f9b61aaea7e))
+
+## [1.6.4](https://github.com/nutui-uniapp/nutui-uniapp/compare/v1.6.3...v1.6.4) (2024-01-15)
+
+### Bug Fixes
+
+* **calendar:** 优化初次打开默认值定位问题 ([35931ae](https://github.com/nutui-uniapp/nutui-uniapp/commit/35931ae28c60cd9c0502e3a2e65d154b5fa6c793))
+* **categorypane:** 商品分类面板组件默认插槽不生效 ([1d263e1](https://github.com/nutui-uniapp/nutui-uniapp/commit/1d263e1492e5f831a218d9f9cf57f90466b372a4))
+* **date-picker:** 修复 hour-minute 类型下选项刷新问题 ([291e721](https://github.com/nutui-uniapp/nutui-uniapp/commit/291e72151a66fb68b0e3968252620ce11d8f0209))
+* **date-picker:** 修复数据联动更新问题 ([e4d2d03](https://github.com/nutui-uniapp/nutui-uniapp/commit/e4d2d03ffb56da500d0dd2e1d573775a829512d8))
+* **dialog:** 修复 cancel 按钮的样式问题 ([bb62248](https://github.com/nutui-uniapp/nutui-uniapp/commit/bb62248bedaacc3cbcb3c92f414bcb6dacfaf59e))
+* **menuitem:** close open 事件无效 ([15b73c6](https://github.com/nutui-uniapp/nutui-uniapp/commit/15b73c6a1a2c28a3f688ea9ada38687ad905be8e)), closes [#163](https://github.com/nutui-uniapp/nutui-uniapp/issues/163)
+* **picker:** 修复 Safari 下遮罩层级样式问题 ([1d0149e](https://github.com/nutui-uniapp/nutui-uniapp/commit/1d0149e7a5b56aac62ed12a00f91c3f11e57085c))
+* **picker:** 优化 select、cursor 样式 ([a1ad4b0](https://github.com/nutui-uniapp/nutui-uniapp/commit/a1ad4b0ffd01ac92d99fa397b7ac271099af15b9))
+
+### Features
+
+* **card:** 商品卡片组件增加shopName插槽,用于店铺名称自定义 ([996726d](https://github.com/nutui-uniapp/nutui-uniapp/commit/996726ddc73d97994a394999a7484b858e9e6f00))
+
+## [1.6.3](https://github.com/nutui-uniapp/nutui-uniapp/compare/v1.6.2...v1.6.3) (2024-01-08)
+
+### Performance Improvements
+
+* **input:** 使用computed代替函数调用 ([374e24c](https://github.com/nutui-uniapp/nutui-uniapp/commit/374e24c34c667a72ca754b84a9c73b7850a57771))
+
+## [1.6.2](https://github.com/nutui-uniapp/nutui-uniapp/compare/v1.6.1...v1.6.2) (2024-01-08)
+
+### Bug Fixes
+
+* **calendar:** 日历组件在微信小程序弹窗展示时,无法滚动到默认日期 ([8f3b3aa](https://github.com/nutui-uniapp/nutui-uniapp/commit/8f3b3aa4d157db1fc842825598441ec78d2723ae))
+* **calendar:** 日历组件在微信小程序中无法显示今天标记 ([15aadca](https://github.com/nutui-uniapp/nutui-uniapp/commit/15aadcae48b112eee323b2593e616ccb935e8c77))
+* **calendar:** 优化初始滚动判断条件 ([5961f8e](https://github.com/nutui-uniapp/nutui-uniapp/commit/5961f8edee6ade9835329306a7543f3fcd29cece))
+* **input:** modelValue为空时错误调用方法 ([782676b](https://github.com/nutui-uniapp/nutui-uniapp/commit/782676bfa69c9c82b1a3483f48a5264ee5e09d8a)), closes [#155](https://github.com/nutui-uniapp/nutui-uniapp/issues/155)
+
+## [1.6.1](https://github.com/nutui-uniapp/nutui-uniapp/compare/v1.6.0...v1.6.1) (2024-01-04)
+
+### Features
+
+* **ecard:** 支持配置是否显示自定与步进 ([584f091](https://github.com/nutui-uniapp/nutui-uniapp/commit/584f091d35e78a2ec02e72bd8578ca091628d666))
+
+# [1.6.0](https://github.com/nutui-uniapp/nutui-uniapp/compare/v1.5.10...v1.6.0) (2024-01-04)
+
+### Bug Fixes
+
+* **input:** form下 input 样式错误 ([4c0f900](https://github.com/nutui-uniapp/nutui-uniapp/commit/4c0f9009a7d2543933644b209d223fab4a10217f)), closes [#148](https://github.com/nutui-uniapp/nutui-uniapp/issues/148)
+* **tabs:** 修复 placeholder 展示错误 ([754633e](https://github.com/nutui-uniapp/nutui-uniapp/commit/754633e18bef14c37c13068cda9bcb205f1164e7))
+* **tabs:** 夜间模式样式错误 ([32c679a](https://github.com/nutui-uniapp/nutui-uniapp/commit/32c679a2e716a0f82ddc09d34a4b785ae21192ee))
+
+### Features
+
+* **swiper:** 支持修改未选中时的分页指示器的颜色 ([e9c4058](https://github.com/nutui-uniapp/nutui-uniapp/commit/e9c4058baf0f5bccbfd74c3f6e905ba359109eaa))
+* **tabs:** 开启 title-scroll 时不再需要设置 name ([4085996](https://github.com/nutui-uniapp/nutui-uniapp/commit/4085996b2daf0981e72c97dda5eab1678d1dbda6))
+* **tabs:** 支持配置标题对齐方式 ([d46c8ff](https://github.com/nutui-uniapp/nutui-uniapp/commit/d46c8fffd9840405a8327abc85edfc3fe5f66b5c))
+* **watermark:** 支持多行文字水印 ([8b42b97](https://github.com/nutui-uniapp/nutui-uniapp/commit/8b42b97237f9cbc92e99fb12c807c4cdfee1e687))
+
+## [1.5.10](https://github.com/nutui-uniapp/nutui-uniapp/compare/v1.5.9...v1.5.10) (2023-12-31)
+
+### Bug Fixes
+
+* **popup:** app端show属性无效以及destroy-on-close逻辑错误 ([522f620](https://github.com/nutui-uniapp/nutui-uniapp/commit/522f6200e48cdf67ccd1767eb2aa89c697f03a49))
+* **popup:** destroy-on-close逻辑错误 ([6d9d12c](https://github.com/nutui-uniapp/nutui-uniapp/commit/6d9d12cbf5dd082806b14bb783ce690c1cafc76c))
+* **sku:** 修复SkuStepper依赖循环,样式错误 ([2575b24](https://github.com/nutui-uniapp/nutui-uniapp/commit/2575b24fb2f92d0d0ee41edbb0174f9528b2ce61))
+* textarea启用autosize时readonly样式不统一 ([d6c161b](https://github.com/nutui-uniapp/nutui-uniapp/commit/d6c161bce9e8af50dfa162faa9d4b3be8d31a82f))
+
+## [1.5.9](https://github.com/nutui-uniapp/nutui-uniapp/compare/v1.5.8...v1.5.9) (2023-12-18)
+
+### Bug Fixes
+
+* **navbar:** 修复标题居中等样式问题 ([b5ddff1](https://github.com/nutui-uniapp/nutui-uniapp/commit/b5ddff18ebfbc00137dc88d8993d8d6928c2d3c3))
+* **sku:** 修复小程序下选项内容的滚动问题 ([715a4db](https://github.com/nutui-uniapp/nutui-uniapp/commit/715a4db500fe303ccd5eafc8140b0adb328a3ebb))
+* **tabs:** 修复嵌套使用时的样式错乱问题 ([a8c9822](https://github.com/nutui-uniapp/nutui-uniapp/commit/a8c98229836318b50aa4c7cae83aedf31949eae3))
+
+### Features
+
+* **radio:** 组件设置 button 形状时支持改变大小 ([ff808c0](https://github.com/nutui-uniapp/nutui-uniapp/commit/ff808c06ac6713b69e0383fb4b5b9f6a0544fa3b))
+
+## [1.5.8](https://github.com/nutui-uniapp/nutui-uniapp/compare/v1.5.7...v1.5.8) (2023-12-14)
+
+### Bug Fixes
+
+* **menu:** 去除无效输出 ([3f36ff8](https://github.com/nutui-uniapp/nutui-uniapp/commit/3f36ff8535f662bf90fa09e0d9c97c1aa1775a12))
+* **menu:** 修复menu闪屏动画错误以及位置偏移 ([48c85f5](https://github.com/nutui-uniapp/nutui-uniapp/commit/48c85f5246f1de10bcf3535e31ef202ee8e28d9f)), closes [#138](https://github.com/nutui-uniapp/nutui-uniapp/issues/138)
+* **popup:** 修复destroy-on-close无效 ([0e64ee2](https://github.com/nutui-uniapp/nutui-uniapp/commit/0e64ee2c1f89eba08d9438c5e1378d0ba49f495c)), closes [#136](https://github.com/nutui-uniapp/nutui-uniapp/issues/136)
+
+### Features
+
+* **safearea:** 新增SafeArea组件 ([e346920](https://github.com/nutui-uniapp/nutui-uniapp/commit/e346920108081d0857143d28dbfbd495351c996e))
+
+### Reverts
+
+* Revert "chore: release v1.5.8" ([8c0f8e0](https://github.com/nutui-uniapp/nutui-uniapp/commit/8c0f8e0dfd034a84996b10bafa8c5e1afbbb4535))
+* Revert "docs: update changelog" ([108a458](https://github.com/nutui-uniapp/nutui-uniapp/commit/108a458dea38728bba55d9b36946cc3720260e14))
+
+## [1.5.7](https://github.com/yang1206/uniapp-nutui/compare/v1.5.6...v1.5.7) (2023-12-09)
+
+### Bug Fixes
+
+* **range:** 优化滑动事件处理逻辑 ([be20418](https://github.com/yang1206/uniapp-nutui/commit/be2041839d2c449e9cf22b0029d437eebb4c68fa))
+
+### Features
+
+* **calendar:** 新增 btn-slot属性控制是否使用btn 插槽 ([3b66919](https://github.com/yang1206/uniapp-nutui/commit/3b66919bfd86c0857ce1a8ea265ae5fa9e3f0b9f)), closes [#131](https://github.com/yang1206/uniapp-nutui/issues/131)
+* **form:** 支持配置表单布局 ([882dce4](https://github.com/yang1206/uniapp-nutui/commit/882dce417ad6799cf18f31e43a6734f5cc7cfea7))
+
+## [1.5.6](https://github.com/yang1206/uniapp-nutui/compare/v1.5.5...v1.5.6) (2023-11-29)
+
+### Bug Fixes
+
+* **avatar:** 修复maxCount属性无效 ([341f488](https://github.com/yang1206/uniapp-nutui/commit/341f48806545f1f7f84cd208d6790f73858d749e))
+* **numberkeyboard:** 类名错误 ([6a15803](https://github.com/yang1206/uniapp-nutui/commit/6a15803a4e8875fadf9172b2d388a732f2fc3e71))
+* **utils:** isPromise 判断错误 ([42820e2](https://github.com/yang1206/uniapp-nutui/commit/42820e2ad20c571ea00afc588254ae4dbe5df1b7))
+
+## [1.5.5](https://github.com/yang1206/uniapp-nutui/compare/v1.5.4...v1.5.5) (2023-11-25)
+
+### Bug Fixes
+
+* **formitem:** 提高传入 required 的优先级 ([300ef79](https://github.com/yang1206/uniapp-nutui/commit/300ef797e05c2cacbe2e144bafd1e7402116fc83))
+* **inputnumber:** 修复步进按钮禁用功能无效 ([75fc3cc](https://github.com/yang1206/uniapp-nutui/commit/75fc3cc78a7dd6154b5418db0306f4ce1dcfc25b))
+* **swiper:** 修复 swiper-item 宽高错误问题 ([0840982](https://github.com/yang1206/uniapp-nutui/commit/084098288d3511f43db2f4db0b4c723ddc53c3a5))
+
+## [1.5.4](https://github.com/yang1206/uniapp-nutui/compare/v1.5.3...v1.5.4) (2023-11-23)
+
+### Bug Fixes
+
+* **address:** 选择最后一级时 onChange 缺少 value 字段 ([04d9262](https://github.com/yang1206/uniapp-nutui/commit/04d92627b6b08e9f439208a24c627c8975f91906))
+* **badge:** 修复微信小程序 props编译丢失 ([e95ff0d](https://github.com/yang1206/uniapp-nutui/commit/e95ff0df44abe6cc1a99db1b21b6696135d0c9d6))
+* **elevator:** 修复滚动后无法点击问题 ([6956662](https://github.com/yang1206/uniapp-nutui/commit/695666260596b9b5e5925451de74bd23556b0af0))
+* **picker:** 调整 columns 类型定义 ([42f1b9c](https://github.com/yang1206/uniapp-nutui/commit/42f1b9c3b7fc4f6d434c63791b20b84b09d0bcb0))
+
+### Features
+
+* **cascader:** 新增title插槽 ([80b2f29](https://github.com/yang1206/uniapp-nutui/commit/80b2f291d66920d990dc15a21752400b35fdd4e4)), closes [#119](https://github.com/yang1206/uniapp-nutui/issues/119)
+* **form:** formItem的required的星号支持从rules中自动判断是否显示 ([1ddda92](https://github.com/yang1206/uniapp-nutui/commit/1ddda92b4a6c4e312a502be9d10d6db64da80e31))
+* **input:** modelValue的类型支持number ([2e308e7](https://github.com/yang1206/uniapp-nutui/commit/2e308e741f7c888b5bb96d19b8d2fd02f627db5a))
+
+## [1.5.3](https://github.com/yang1206/uniapp-nutui/compare/v1.5.2...v1.5.3) (2023-11-22)
+
+### Bug Fixes
+
+* 修复支付宝小程序编译错误 ([203f3bd](https://github.com/yang1206/uniapp-nutui/commit/203f3bdd0c164faad471a74ce9eb4bffc7fb29ea)), closes [#117](https://github.com/yang1206/uniapp-nutui/issues/117)
+
+## [1.5.2](https://github.com/yang1206/uniapp-nutui/compare/v1.5.1...v1.5.2) (2023-11-20)
+
+### Bug Fixes
+
+* **menu:** 修复自定义选中颜色失效 ([b441e89](https://github.com/yang1206/uniapp-nutui/commit/b441e89113c25f62eb3a42f75c822eaee6d0a149))
+* **notify:** 修复重复点击偶尔无法触发 ([d044ac9](https://github.com/yang1206/uniapp-nutui/commit/d044ac9592e27dc25ca7453e9579593a188e8337))
+* **rate:** 修复无法自定义图标大小 ([1d38d71](https://github.com/yang1206/uniapp-nutui/commit/1d38d712fa92bd9181f6d4302df547bd090af896)), closes [#111](https://github.com/yang1206/uniapp-nutui/issues/111)
+* **tabs:** 修复h5端滑动切换卡顿 ([a17e35e](https://github.com/yang1206/uniapp-nutui/commit/a17e35edf132488b0b1c8098f87e23d89e30120a))
+* **toast:** 修复重复点击造成卡死 ([4847ae9](https://github.com/yang1206/uniapp-nutui/commit/4847ae964ecd50fd466b336ec92a0121fd589bc9))
+
+### Features
+
+* 全部组件均已支持自定义类名与style ([5a29a83](https://github.com/yang1206/uniapp-nutui/commit/5a29a837a6ba3b7b1ca04edcbf76027877839a8c))
+* **noticebar:** 新增`field-name`属性,支持传入数组对象 ([3f95345](https://github.com/yang1206/uniapp-nutui/commit/3f95345f2d97d9ce9dbb2e2004e269b1cf986d05)), closes [#109](https://github.com/yang1206/uniapp-nutui/issues/109)
+
+## [1.5.1](https://github.com/yang1206/uniapp-nutui/compare/v1.5.0...v1.5.1) (2023-11-17)
+
+### Bug Fixes
+
+* **calendar:** 过期时间未被禁用 ([5b767b8](https://github.com/yang1206/uniapp-nutui/commit/5b767b88be6c32b8c8edf1212eedec2c60929a57))
+* **radio:** 修复`text-position`属性失效 ([1eadf1a](https://github.com/yang1206/uniapp-nutui/commit/1eadf1ac25087fc259d40c30723918e61b818c86))
+
+### Features
+
+* **(signature):** signature组件小程序端支持导出图片 ([2992d39](https://github.com/yang1206/uniapp-nutui/commit/2992d39522e18e5f6dd51f82f237171fdb789d2b))
+
+# [1.5.0](https://github.com/yang1206/uniapp-nutui/compare/v1.4.1...v1.5.0) (2023-11-15)
+
+### Bug Fixes
+
+* **cascader:** 级联二级切换无法被监听到 ([c78f382](https://github.com/yang1206/uniapp-nutui/commit/c78f382c02f76241919037b35c1834a73aeb6337)), closes [#105](https://github.com/yang1206/uniapp-nutui/issues/105)
+* textarea的autosize表现异常 ([d14813d](https://github.com/yang1206/uniapp-nutui/commit/d14813d6b32e2131a48abc7a8d6ec668c89023ce))
+
+* fix(overlay)!: 小程序与 APP平台不再支持`lock-scroll`属性 ([cd3a740](https://github.com/yang1206/uniapp-nutui/commit/cd3a74066829123299915787feaf2d675a8a487c)), closes [#103](https://github.com/yang1206/uniapp-nutui/issues/103)
+
+### Features
+
+* 组件props增加注释说明 ([a585716](https://github.com/yang1206/uniapp-nutui/commit/a585716ca5dc71b9577a491fc15d696a69aed0fb)), closes [#100](https://github.com/yang1206/uniapp-nutui/issues/100)
+
+### BREAKING CHANGES
+
+* 小程序移除`lock-scroll`属性支持
+
+所有依赖overlay的组件的`lock-scroll`属性同理也将不再支持小程序与 APP 平台,禁用滚动穿透方法可参考文档
+
+## [1.4.1](https://github.com/yang1206/uniapp-nutui/compare/v1.4.0...v1.4.1) (2023-11-08)
+
+### Bug Fixes
+
+* **badge:** badge的top、right不支持rpx单位 ([964e4ea](https://github.com/yang1206/uniapp-nutui/commit/964e4ea6e472889c7f43bc70491d3e3ac613cf31))
+
+# [1.4.0](https://github.com/yang1206/uniapp-nutui/compare/v1.3.5...v1.4.0) (2023-11-08)
+
+### Bug Fixes
+
+* **address:** backIcon会一直存在 ([3819937](https://github.com/yang1206/uniapp-nutui/commit/3819937ec0b59d6d869a986a24e1449fd7dd93f1))
+* **card:** price颜色未覆盖 ([2665bd1](https://github.com/yang1206/uniapp-nutui/commit/2665bd137c5d27f57b614ebe70e25299e89ff481))
+* **checkbox:** 修复样式对齐问题 ([155e25b](https://github.com/yang1206/uniapp-nutui/commit/155e25ba84676d1c5b816541da622f4c893db857))
+* **comment:** label 样式无法正确省略 ([5e56649](https://github.com/yang1206/uniapp-nutui/commit/5e56649f4f87d9e3f914c3923a9d68a4d724ae26))
+* **progress:** icon 颜色错误 ([18662d5](https://github.com/yang1206/uniapp-nutui/commit/18662d57046acfb6e5c57e7bef214dde1ce52c88))
+* **uploader:** h5进度遮罩样式错误 ([e4ccf4a](https://github.com/yang1206/uniapp-nutui/commit/e4ccf4abdfeb74141a703cda8685e1576590ae8d))
+
+* fix!: 短横线命名slot无法被正确替换 ([52587ed](https://github.com/yang1206/uniapp-nutui/commit/52587ed78feae3e35cd5f38e92cd6878f4c6c715)), closes [#96](https://github.com/yang1206/uniapp-nutui/issues/96)
+
+### Features
+
+* **calendar:** 增加自定义禁用函数disabled-date ([2b0363f](https://github.com/yang1206/uniapp-nutui/commit/2b0363fc58ca0087768a141b3f9dcfd4e4f15d44))
+* **calendar:** 增加footerSlot属性判断是否使用 footer 插槽 ([6e53d43](https://github.com/yang1206/uniapp-nutui/commit/6e53d435d179d7865087d03e1ecfd323d58f0162))
+* **image-preview:** 新增 long-press 事件 ([42893a5](https://github.com/yang1206/uniapp-nutui/commit/42893a50e1c5d59ec8611d0092f97c92f3797a6e))
+* popup 关联组件增加 z-index 属性 ([fe52d5f](https://github.com/yang1206/uniapp-nutui/commit/fe52d5fa7b05fdfec711b9eff7750cd51c291cf3))
+
+### BREAKING CHANGES
+
+* 组件的slot名称由短横线替换为驼峰格式
+
+受到影响的组件有: address , addresslist , calendar , card , comment , inputnumber , navbar , noticebar ,
+pagination , progress , sku , trendarrow , uploader
+
+## [1.3.5](https://github.com/yang1206/uniapp-nutui/compare/v1.3.4...v1.3.5) (2023-11-07)
+
+## [1.3.4](https://github.com/yang1206/uniapp-nutui/compare/v1.3.3...v1.3.4) (2023-11-06)
+
+### Bug Fixes
+
+* **watermark:** props丢失响应性 ([21984f5](https://github.com/yang1206/uniapp-nutui/commit/21984f551c77027fa4913200a6d72976cb5e9035)), closes [#95](https://github.com/yang1206/uniapp-nutui/issues/95)
+
+## [1.3.3](https://github.com/yang1206/uniapp-nutui/compare/v1.3.2...v1.3.3) (2023-11-05)
+
+## [1.3.2](https://github.com/yang1206/uniapp-nutui/compare/v1.3.1...v1.3.2) (2023-11-03)
+
+### Features
+
+* **price:** 支持customClass与 customStyle ([43516f4](https://github.com/yang1206/uniapp-nutui/commit/43516f43f33540684ed98a4878b4fbd4925116dd))
+
+## [1.3.1](https://github.com/yang1206/uniapp-nutui/compare/v1.3.0...v1.3.1) (2023-11-01)
+
+### Bug Fixes
+
+* **sku:** 小程序真机调试错误 ([1bb8380](https://github.com/yang1206/uniapp-nutui/commit/1bb8380f4c1cabb443938f31dd6e0d1aa84ea104))
+
+# [1.3.0](https://github.com/yang1206/uniapp-nutui/compare/v1.2.4...v1.3.0) (2023-10-31)
+
+### Bug Fixes
+
+* **circle-progress:** 修复数值变化在 iOS 下的 border 闪烁问题 ([f3f3934](https://github.com/yang1206/uniapp-nutui/commit/f3f3934292a11362c7c4e47cf450a7581e92efab))
+* **input:** 优化input属性问题 ([3fe20c7](https://github.com/yang1206/uniapp-nutui/commit/3fe20c76404a1dafc9fe2e66ffb0ea3419c1f07d))
+* **inputnumber:** 修复点击icon后超过min-max范围问题 ([17d8f7e](https://github.com/yang1206/uniapp-nutui/commit/17d8f7e6cb29500934c1d800e59b970390cb7b72))
+* **picker:** 去除columns有值才触发watch监听 ([6e39bc3](https://github.com/yang1206/uniapp-nutui/commit/6e39bc319d6892460a982e01e020435649554e47))
+* **swiper:** 修复动态修改 height 后组件视图未更新问题 ([b9bac98](https://github.com/yang1206/uniapp-nutui/commit/b9bac98a30215a847b536bfa252f5901d21b523d))
+* **swiper:** 修复页面中未设置 z-index 的 fixed 元素无法覆盖 swiper 问题 ([08e559b](https://github.com/yang1206/uniapp-nutui/commit/08e559bf2bc4101732067f5bce8231017aa9f788))
+
+### Features
+
+* **collapse:** 增加自定义插槽icon ([539ba35](https://github.com/yang1206/uniapp-nutui/commit/539ba35fd48506a21faa84af9b30b115f2870485))
+* **comment:** 追评中若是有图片的话,增加响应事件 ([767cea6](https://github.com/yang1206/uniapp-nutui/commit/767cea6f7208a314e6fad0e98be73e4441aa223e))
+* **dialog:** add ok-auto-close ([2957f5a](https://github.com/yang1206/uniapp-nutui/commit/2957f5a98c9f11513c92a511b26bf7afa8807d43))
+* **navbar:** 适配小程序状态栏高度,优化代码 ([4ee0118](https://github.com/yang1206/uniapp-nutui/commit/4ee01186d6ac60ce211464dcb2e833b9eff7933f))
+
+## [1.2.4](https://github.com/yang1206/uniapp-nutui/compare/v1.2.3...v1.2.4) (2023-10-27)
+
+### Bug Fixes
+
+* type error ([0b8ad0f](https://github.com/yang1206/uniapp-nutui/commit/0b8ad0f96d2d7b403023622ea0794e4b141466a7))
+* type error ([8498e02](https://github.com/yang1206/uniapp-nutui/commit/8498e02011786a9638ee2ebbb9a237de7eb5e449))
+
+### Features
+
+* **input:** 新增 placeholder-style 和 placeholder-class 属性 ([1409880](https://github.com/yang1206/uniapp-nutui/commit/14098807bdb90026d179eb24c739b4f854eeaf72))
+* 补充input、textarea部分属性 - by @xiaohe0601 [(b5bc4cf)](https://github.com/nutui-uniapp/nutui-uniapp/commit/b5bc4cf)
+
+## [1.2.3](https://github.com/yang1206/uniapp-nutui/compare/v1.2.2...v1.2.3) (2023-10-23)
+
+### Bug Fixes
+
+* (searchbar) autofocus无效 ([f467a11](https://github.com/yang1206/uniapp-nutui/commit/f467a111337bafcc4963d5fa7a4238de797f46e0))
+
+## [1.2.2](https://github.com/yang1206/uniapp-nutui/compare/v1.2.1...v1.2.2) (2023-10-23)
+
+### Bug Fixes
+
+* (input) 修复 input 事件缺失 ([a34e543](https://github.com/yang1206/uniapp-nutui/commit/a34e543a7ae37ff1d0fad1cee06e79be8f868ecf)), closes [#79](https://github.com/yang1206/uniapp-nutui/issues/79)
+* 修复lockScroll无效 ([520d693](https://github.com/yang1206/uniapp-nutui/commit/520d6939639d76871255b1953ecbbf8045d2318d))
+
+### Features
+
+* (imagepreview) 支持双指缩放图片 ([c7a9a90](https://github.com/yang1206/uniapp-nutui/commit/c7a9a9073fdc017ce93ddc47825c2290b53e34e7))
+
+## [1.2.1](https://github.com/yang1206/uniapp-nutui/compare/v1.2.0...v1.2.1) (2023-10-18)
+
+### Bug Fixes
+
+* (number-keyboard) type="rightColumn"时,某些版本安卓机无法正常显示 ([a5307ba](https://github.com/yang1206/uniapp-nutui/commit/a5307bae5cc65cb0695823646a0b767edde4f399)), closes [#78](https://github.com/yang1206/uniapp-nutui/issues/78)
+
+# [1.2.0](https://github.com/yang1206/uniapp-nutui/compare/v1.1.10...v1.2.0) (2023-10-18)
+
+### Bug Fixes
+
+* (input) clear 事件回调参数错误 ([2d506ba](https://github.com/yang1206/uniapp-nutui/commit/2d506ba86430ed0b46ed223251e959e37ef598e3))
+* (radio) 修复按钮类型激活背景边框样式 ([8736e91](https://github.com/yang1206/uniapp-nutui/commit/8736e9191643c741b20a24ba2fa7ad21640ecc6e))
+* (radio) 修复radio-group的textPosition属性没有响应式 ([85b2fa4](https://github.com/yang1206/uniapp-nutui/commit/85b2fa4ef24beccc3ecdfc55667214351ddb822a))
+* (tabs) 修复item设置disabled时仍可以滑动过去 ([3b7c77a](https://github.com/yang1206/uniapp-nutui/commit/3b7c77ab19fc56231444f5ee87305eb55356ba46))
+* (textarea) 修复readonly 属性失效与无法渲染换行 ([b8d37d4](https://github.com/yang1206/uniapp-nutui/commit/b8d37d40029fe484cd67e482efea00b704d9549f))
+
+### Features
+
+* (searchbar) 增加cursor-spacing属性 ([42393ac](https://github.com/yang1206/uniapp-nutui/commit/42393acf21303d4b8553df8adf5dd9dbd2d0ac3d))
+* (sticky) 重构sticky组件 ([bb9457b](https://github.com/yang1206/uniapp-nutui/commit/bb9457b2ee7d2b90cf1f8fcdcf9b870c84b280a0))
+* 基础组件最外层元素 flex -> inline-flex ([e065f9f](https://github.com/yang1206/uniapp-nutui/commit/e065f9f034d0da2deed659c1a55cef93efde17b0))
+
+## [1.1.10](https://github.com/yang1206/uniapp-nutui/compare/v1.1.9...v1.1.10) (2023-10-12)
+
+## [1.1.9](https://github.com/yang1206/uniapp-nutui/compare/v1.1.8...v1.1.9) (2023-10-10)
+
+### Bug Fixes
+
+* (address-list) 小程序点击事件无法阻止冒泡 ([38616a9](https://github.com/yang1206/uniapp-nutui/commit/38616a967ea792c99cd5ef12a866132467eff88b))
+
+## [1.1.8](https://github.com/yang1206/uniapp-nutui/compare/v1.1.7...v1.1.8) (2023-09-22)
+
+### Bug Fixes
+
+* type error ([85f9daf](https://github.com/yang1206/uniapp-nutui/commit/85f9daf3526233eeba6e3170554e4116886a95d5)), closes [#62](https://github.com/yang1206/uniapp-nutui/issues/62) [#62](https://github.com/yang1206/uniapp-nutui/issues/62)
+
+## [1.1.7](https://github.com/yang1206/uniapp-nutui/compare/v1.1.6...v1.1.7) (2023-09-20)
+
+### Features
+
+* (cascader) 增加标题配置项 ([d1fde7b](https://github.com/yang1206/uniapp-nutui/commit/d1fde7b09c209778f114bccc7a130c4762eb6c04))
+
+## [1.1.6](https://github.com/yang1206/uniapp-nutui/compare/v1.1.5...v1.1.6) (2023-09-20)
+
+### Bug Fixes
+
+* (searchbar) 修复抖音小程序searchbar输入抖动的问题 ([d634587](https://github.com/yang1206/uniapp-nutui/commit/d6345871aeb1a19244b87ca278d9dec4bd936e37))
+
+### Features
+
+* (calendar) 日历底部增加插槽 ([ff956dc](https://github.com/yang1206/uniapp-nutui/commit/ff956dc4bfe67cb57b6bd556efe814dc5f8080f2))
+* (cell) add desc slot ([eb0facf](https://github.com/yang1206/uniapp-nutui/commit/eb0facfe84e1ee7848053c198683d9f63ea73377))
+* (searchbar) 增加safe-area-inset-bottom 属性 ([8fc2907](https://github.com/yang1206/uniapp-nutui/commit/8fc2907ec987bdc2952d7f94c72996a5ba3eb5f9))
+
+## [1.1.5](https://github.com/yang1206/uniapp-nutui/compare/v1.1.4...v1.1.5) (2023-09-18)
+
+### Features
+
+* (button) 支持 open-type 等开放能力属性 ([eb72466](https://github.com/yang1206/uniapp-nutui/commit/eb724660ca3e163387863fc0260155004c832feb)), closes [#58](https://github.com/yang1206/uniapp-nutui/issues/58) [#58](https://github.com/yang1206/uniapp-nutui/issues/58)
+
+## [1.1.4](https://github.com/yang1206/uniapp-nutui/compare/v1.1.3...v1.1.4) (2023-09-14)
+
+### Bug Fixes
+
+* (cascader) 动态加载标题无法正确显示 ([a3d7594](https://github.com/yang1206/uniapp-nutui/commit/a3d7594510bdf5088646b0dd3cfb8ed62eb70b2c))
+
+## [1.1.3](https://github.com/yang1206/uniapp-nutui/compare/v1.1.2...v1.1.3) (2023-09-08)
+
+## [1.1.2](https://github.com/yang1206/uniapp-nutui/compare/v1.1.1...v1.1.2) (2023-09-08)
+
+### Bug Fixes
+
+* 修复支付宝小程序编译失败 ([d814b4f](https://github.com/yang1206/uniapp-nutui/commit/d814b4ff073bc1f11bd971df8d035f0924ff16fe))
+
+## [1.1.1](https://github.com/yang1206/uniapp-nutui/compare/v1.1.0...v1.1.1) (2023-09-07)
+
+### Bug Fixes
+
+* (input) 自动聚焦无效 ([8744788](https://github.com/yang1206/uniapp-nutui/commit/874478877e38272c51b437cf17d20c2f272d8876)), closes [#39](https://github.com/yang1206/uniapp-nutui/issues/39)
+
+# [1.1.0](https://github.com/yang1206/uniapp-nutui/compare/v1.0.1...v1.1.0) (2023-09-07)
+
+### Features
+
+* :sparkles: 新增Input组件customStyle自定义属性 ([c42a5fe](https://github.com/yang1206/uniapp-nutui/commit/c42a5fe0fc6ecb4bf89ff9a7213529055c2c8670))
+
+## [1.0.1](https://github.com/yang1206/uniapp-nutui/compare/v1.0.0...v1.0.1) (2023-09-05)
+
+### Bug Fixes
+
+* :bug: 修改inputnumber组件失去焦点以及change的时候展示错误 ([54d7e50](https://github.com/yang1206/uniapp-nutui/commit/54d7e5036af02f171c0e3dc2e12fb9db20f1bd80))
+* (picker)修复在非h5环境下多余引入导致无法真机调试 ([c9c8236](https://github.com/yang1206/uniapp-nutui/commit/c9c8236376cf190d20708202deb2c4b81cb7b691))
+* **input:** 修复type值number与digit两个校验逻辑反了 ([5c6c3a4](https://github.com/yang1206/uniapp-nutui/commit/5c6c3a4c1dcf24450f966988d93baf293fe4c720))
+
+### Features
+
+* :sparkles: 地址列表组件新增index索引回调 ([3f3bbc0](https://github.com/yang1206/uniapp-nutui/commit/3f3bbc00c74f6673322dc6cfa509f297dacc8299))
+
+# [1.0.0](https://github.com/yang1206/uniapp-nutui/compare/v0.3.1...v1.0.0) (2023-08-30)
+
+### Bug Fixes
+
+* :bug: 解决因组件使用img标签导致微信小程序编译出错问题 ([856f317](https://github.com/yang1206/uniapp-nutui/commit/856f3177ea4a34a6473c51d864324b2b314d5927))
+
+## [0.3.1](https://github.com/yang1206/uniapp-nutui/compare/v0.3.0...v0.3.1) (2023-08-29)
+
+### Features
+
+* (card) 不填写价格则不展示 ([5f3bf98](https://github.com/yang1206/uniapp-nutui/commit/5f3bf98257d58ec530a853c8217b0fa4c6117084))
+
+# [0.3.0](https://github.com/yang1206/uniapp-nutui/compare/v0.2.5...v0.3.0) (2023-08-28)
+
+### Bug Fixes
+
+* (actionsheet) 修复 close-abled 失效问题 ([fabe18d](https://github.com/yang1206/uniapp-nutui/commit/fabe18dca78f30b4146d2fefebb053be1fa85882))
+* (countdown) millisecond format ([086c2a9](https://github.com/yang1206/uniapp-nutui/commit/086c2a93736a5fb8b763447a41275522b3c15f7b))
+* (picker) 小程序环境切换选项无响应 ([06ca0e8](https://github.com/yang1206/uniapp-nutui/commit/06ca0e86c990aa8caec56c1edbdc6217f576a664))
+* (picker) 修复 field-names 在级联模式下的问题 ([a5fa8cf](https://github.com/yang1206/uniapp-nutui/commit/a5fa8cf18fabc526156ff7aec0207b79bc6fc811))
+
+### Features
+
+* (picker) support custom column field names ([808482d](https://github.com/yang1206/uniapp-nutui/commit/808482dbf9b50d7559bbef9c4977fbb6d7a1445e))
+
+## [0.2.5](https://github.com/yang1206/uniapp-nutui/compare/v0.2.4...v0.2.5) (2023-08-24)
+
+### Bug Fixes
+
+* (form) 样式未正确覆盖 ([838db2a](https://github.com/yang1206/uniapp-nutui/commit/838db2ab3af66b79355392e3038cc4c9388168c5)), closes [#28](https://github.com/yang1206/uniapp-nutui/issues/28)
+* (dialog) 修复通过ref调用对话框时,noCancelBtn属性无效的bug ([6f7d516](https://github.com/yang1206/uniapp-nutui/commit/6f7d516320044ca8d96104531725eb8556732367))
+* (input) 修复左右插件默认文字无法显示 ([8b59931](https://github.com/yang1206/uniapp-nutui/commit/8b59931b4c1f6080ee320af9fa0a4072ec03c235))
+
+## [0.2.4](https://github.com/yang1206/uniapp-nutui/compare/v0.2.3...v0.2.4) (2023-08-18)
+
+### Bug Fixes
+
+* (radio) 自定义图标 slot丢失 ([7ac6772](https://github.com/yang1206/uniapp-nutui/commit/7ac6772e0ea1775ff739803386cff1d2a8b17617)), closes [#15](https://github.com/yang1206/uniapp-nutui/issues/15)
+
+## [0.2.3](https://github.com/yang1206/uniapp-nutui/compare/v0.2.2...v0.2.3) (2023-08-18)
+
+### Bug Fixes
+
+* (configProvider) 修复取值错误问题 ([3a5d5fb](https://github.com/yang1206/uniapp-nutui/commit/3a5d5fb36c33ec35394b74aa443c62ad753ec992))
+
+## [0.2.2](https://github.com/yang1206/uniapp-nutui/compare/v0.2.1...v0.2.2) (2023-08-09)
+
+### Bug Fixes
+
+* (form) 调整 label 中 min-width 样式权重 ([c368e2c](https://github.com/yang1206/uniapp-nutui/commit/c368e2c37dae7425b400b20399b0c2fe53403f75))
+* (input) 小程序部分type 属性失效 ([a88fa69](https://github.com/yang1206/uniapp-nutui/commit/a88fa69346dd0ce9b68c6d33b94f59915ab09ae5))
+* (tabbar) 切换事件回调参数丢失 ([9979494](https://github.com/yang1206/uniapp-nutui/commit/9979494fbb4c35b73ced81baee8ba94ea44761dc)), closes [#10](https://github.com/yang1206/uniapp-nutui/issues/10) [#10](https://github.com/yang1206/uniapp-nutui/issues/10)
+
+## [0.2.1](https://github.com/yang1206/uniapp-nutui/compare/v0.2.0...v0.2.1) (2023-08-05)
+
+### Bug Fixes
+
+* (cascader) 修复在 Popup 中的滑动问题 ([302cd53](https://github.com/yang1206/uniapp-nutui/commit/302cd531426f892425810989b73a8376d0231175))
+* (input) 修复空白节点导致的样式对齐问题 ([11b1d87](https://github.com/yang1206/uniapp-nutui/commit/11b1d870030a3a9b4ba9037c2d14735186b65ab0))
+* (uploader) name参数无效 ([b21acd0](https://github.com/yang1206/uniapp-nutui/commit/b21acd0c1b61fae6a6cdd6ecb1d8db7084820bbc)), closes [#9](https://github.com/yang1206/uniapp-nutui/issues/9)
+
+# [0.2.0](https://github.com/yang1206/uniapp-nutui/compare/v0.1.8...v0.2.0) (2023-07-30)
+
+### Bug Fixes
+
+* (animate) 小程序触发动画失效 ([a152121](https://github.com/yang1206/uniapp-nutui/commit/a15212198653e7b8315aa4562663f88fbb91e02b))
+* (calendar) 修复自定义起始日高亮列错误问题 ([dfeaebc](https://github.com/yang1206/uniapp-nutui/commit/dfeaebc7a79102765f7d0cca01f098716137fe71))
+* (countdown) 方法调用错误 ([6aac458](https://github.com/yang1206/uniapp-nutui/commit/6aac458bc5b3599b8f40a6da59539a208e14239d))
+* (form) 小程序验证失效 ([9067f4d](https://github.com/yang1206/uniapp-nutui/commit/9067f4dc167ecc13587bc7714810ae4fea0eb0d4))
+* (price) 修复小程序下符号转义丢失问题 ([9194c4c](https://github.com/yang1206/uniapp-nutui/commit/9194c4c59dab0a64383d5b86eb78473c43e4c019))
+
+## [0.1.8](https://github.com/yang1206/uniapp-nutui/compare/v0.1.7...v0.1.8) (2023-07-24)
+
+### Bug Fixes
+
+* (codeInput) 双向绑定失效 ([b9ef603](https://github.com/yang1206/uniapp-nutui/commit/b9ef6034a79b043991b63e032f2a24212d8bb46a))
+
+## [0.1.7](https://github.com/yang1206/uniapp-nutui/compare/v0.1.6...v0.1.7) (2023-07-22)
+
+### Features
+
+* 同步修复 ([dad75c8](https://github.com/yang1206/uniapp-nutui/commit/dad75c84907a6f9464db94581223d73108af6aab))
+
+## [0.1.6](https://github.com/yang1206/uniapp-nutui/compare/v0.1.5...v0.1.6) (2023-07-15)
+
+### Bug Fixes
+
+* 同步nutui的修复 ([94b3b27](https://github.com/yang1206/uniapp-nutui/commit/94b3b27b7cf097be660e0d254bb6001cca577a07))
+
+## [0.1.5](https://github.com/yang1206/uniapp-nutui/compare/v0.1.4...v0.1.5) (2023-07-13)
+
+### Features
+
+* 新增 codeInput组件 ([9b9516b](https://github.com/yang1206/uniapp-nutui/commit/9b9516ba7ce4a147c731a04f25532dfdaef730b6))
+* 新增loadingpage组件 ([4ae2c12](https://github.com/yang1206/uniapp-nutui/commit/4ae2c125240e933e5b95209411904d4854a89413))
+* 移植nutbingo的部分抽奖组件 ([6e19b1a](https://github.com/yang1206/uniapp-nutui/commit/6e19b1a9c62dd878bf77a32a90fce17b35d83afb))
+
+## [0.1.4](https://github.com/yang1206/uniapp-nutui/compare/v0.1.3...v0.1.4) (2023-07-09)
+
+### Bug Fixes
+
+* 修复elevator在小程序环境文字不显示 ([87fc4e9](https://github.com/yang1206/uniapp-nutui/commit/87fc4e91222e3052d1c0ee849d8b7715d8768177))
+
+### Features
+
+* 增加组件全局类型定义文件 ([c84da47](https://github.com/yang1206/uniapp-nutui/commit/c84da47d8ad9a414965f8bc9f8d033f5bbe90435))
+
+## [0.1.3](https://github.com/yang1206/uniapp-nutui/compare/v0.1.2...v0.1.3) (2023-07-09)
+
+### Bug Fixes
+
+* 修复h5部分组件样式错误 ([cfb1e4b](https://github.com/yang1206/uniapp-nutui/commit/cfb1e4b4a88a8a6d3f674fb0bacf9c5283caabe9))
+
+### Features
+
+* 新增uni_modules安装方式 ([9df523b](https://github.com/yang1206/uniapp-nutui/commit/9df523bd65fcab1b3c57a1686381a0df278855a9))
+
+## [0.1.2](https://github.com/yang1206/uniapp-nutui/compare/v0.1.1...v0.1.2) (2023-07-08)
+
+### Bug Fixes
+
+* 修复运行时环境判断错误 ([ce3b0c7](https://github.com/yang1206/uniapp-nutui/commit/ce3b0c70e18826defb87074117294326240f42ec))
+
+## [0.1.1](https://github.com/yang1206/uniapp-nutui/compare/v0.1.0...v0.1.1) (2023-07-07)
+
+### Bug Fixes
+
+* 修复picker 在h5中适配错误 ([cdd9aa4](https://github.com/yang1206/uniapp-nutui/commit/cdd9aa4da991145776b10c4f76ae02dbc156110b))
+* 修复uploader组件自定义上传错误 ([af87d68](https://github.com/yang1206/uniapp-nutui/commit/af87d6852dca14f7f212141bfbb80f247bcb8cbf))
+
+# [0.1.0](https://github.com/yang1206/uniapp-nutui/compare/v0.0.6...v0.1.0) (2023-07-07)
+
+### Bug Fixes
+
+* 修复小程序暗黑模式失效 ([a445f04](https://github.com/yang1206/uniapp-nutui/commit/a445f042bd8ab1d0ecdc9f738a9eff704a299fe7))
+* 修复支付宝小程序不支持编译错误 ([2c8e0dd](https://github.com/yang1206/uniapp-nutui/commit/2c8e0dda43ad9687211d8f939a6ad20230c4d486))
+* 修复支付宝小程序中部分兼容问题 ([6fa5132](https://github.com/yang1206/uniapp-nutui/commit/6fa513211ffdf60bf9592be198befb2e5c690122))
+* 修复h5组件之间引用样式丢失 ([d884e28](https://github.com/yang1206/uniapp-nutui/commit/d884e28d8210308bed1aeb4a488bc3f9f0963aed))
+
+## [0.0.9](https://github.com/yang1206/uniapp-nutui/compare/v0.0.6...v0.0.9) (2023-07-06)
+
+### Bug Fixes
+
+* 修复小程序暗黑模式失效 ([a445f04](https://github.com/yang1206/uniapp-nutui/commit/a445f042bd8ab1d0ecdc9f738a9eff704a299fe7))
+* 修复支付宝小程序不支持编译错误 ([2c8e0dd](https://github.com/yang1206/uniapp-nutui/commit/2c8e0dda43ad9687211d8f939a6ad20230c4d486))
+* 修复支付宝小程序中部分兼容问题 ([6fa5132](https://github.com/yang1206/uniapp-nutui/commit/6fa513211ffdf60bf9592be198befb2e5c690122))
+* 修复h5组件之间引用样式丢失 ([d884e28](https://github.com/yang1206/uniapp-nutui/commit/d884e28d8210308bed1aeb4a488bc3f9f0963aed))
+
+## [0.0.8](https://github.com/yang1206/uniapp-nutui/compare/v0.0.7...v0.0.8) (2023-07-05)
+
+### Bug Fixes
+
+* 修复支付宝小程序编译错误 ([bdd6540](https://github.com/yang1206/uniapp-nutui/commit/bdd65408d77aff73509da7d18a2d04d11b105904))
+* 修复h5组件之间引用样式丢失 ([b784635](https://github.com/yang1206/uniapp-nutui/commit/b7846354ffb7355a1328f804aa689b1e85487807))
+
+## [0.0.7](https://github.com/yang1206/uniapp-nutui/compare/v0.0.6...v0.0.7) (2023-07-04)
+
+### Bug Fixes
+
+* 修复小程序暗黑模式失效 ([753f87a](https://github.com/yang1206/uniapp-nutui/commit/753f87ae5c7a9f69e789e18b346ac1b4393f581d))
+
+## [0.0.6](https://github.com/yang1206/uniapp-nutui/compare/v0.0.5...v0.0.6) (2023-07-03)
+
+### Bug Fixes
+
+* sku 样式错乱 ([ebdd0df](https://github.com/yang1206/uniapp-nutui/commit/ebdd0dfeba50ba53a6126e8e3dc12b0f69c39f6c))
+
+## [0.0.5](https://github.com/yang1206/uniapp-nutui/compare/v0.0.4...v0.0.5) (2023-07-03)
+
+### Bug Fixes
+
+* 修复addresslist 样式丢失 ([a36e7e2](https://github.com/yang1206/uniapp-nutui/commit/a36e7e248bc5071978574a016b1e6a967053f690))
+
+## [0.0.4](https://github.com/yang1206/uniapp-nutui/compare/v0.0.3...v0.0.4) (2023-07-03)
+
+### Bug Fixes
+
+* 微信小程序打包生成无意义的index.js文件 ([9c9804d](https://github.com/yang1206/uniapp-nutui/commit/9c9804dea5646a74da163feb176058129d0e2e34))
+* 修复steps 在小程序样式混乱 ([72bbb19](https://github.com/yang1206/uniapp-nutui/commit/72bbb19f34d93598fb40f50e3d54c3b5257825ff))
+
+## [0.0.1](https://github.com/yang1206/uniapp-nutui/compare/89499ddbcc62fc62228a0f18ce076511287b5dd5...v0.0.1) (2023-07-02)
+
+### Bug Fixes
+
+* 解决一些已知问题 ([b00a7c4](https://github.com/yang1206/uniapp-nutui/commit/b00a7c416b1f8077968b6e599637b92814481926))
+
+### Features
+
+* 国际化 ([17166d9](https://github.com/yang1206/uniapp-nutui/commit/17166d916e3aa473d463083ba535713b32212f82))
+* addresslist, barrage, card, category, comment, ecard, invoice, timeselect ([a7d1b61](https://github.com/yang1206/uniapp-nutui/commit/a7d1b610c55070c5b8dac02a06fe1b00c128021b))
+* backtop, drag , swipe , switch ([5f8270d](https://github.com/yang1206/uniapp-nutui/commit/5f8270d6e9930199f1a5ac7bc4fe6cd06727ce11))
+* calendar,cascader ([a1f2d76](https://github.com/yang1206/uniapp-nutui/commit/a1f2d76ba520c1833cdab154f3012f319484fceb))
+* cell, overlay , transition ([2fe21ca](https://github.com/yang1206/uniapp-nutui/commit/2fe21cab85d9eb0a25effe2e12befee4cda4c3f5))
+* checkbox, picker , datepicker ([55c72cc](https://github.com/yang1206/uniapp-nutui/commit/55c72cc1165a0940d7e9827644ac7caafa337a41))
+* circleprogress, collapse, animate, countup ([4720c1b](https://github.com/yang1206/uniapp-nutui/commit/4720c1b4af45da56589d1d8e56410014df938944))
+* countdown ([89499dd](https://github.com/yang1206/uniapp-nutui/commit/89499ddbcc62fc62228a0f18ce076511287b5dd5))
+* dark mode ([d275211](https://github.com/yang1206/uniapp-nutui/commit/d275211c6d6c8948423396c8d63d65acccac711d))
+* dialog ([80494b3](https://github.com/yang1206/uniapp-nutui/commit/80494b3fd4bf6c4bbabe1a933de1f5f8b683aaf5))
+* elevator, fixednav, indicator ([0ce90ef](https://github.com/yang1206/uniapp-nutui/commit/0ce90efe571c826c73168e57f374ccf1674ae219))
+* ellipsis, empty, imagepreview, list, swiper ([d20c07f](https://github.com/yang1206/uniapp-nutui/commit/d20c07f4c045dcc9e301bc79e1e913a77315c19e))
+* infiniteloading, divider, grid, layout, sticky ([889d930](https://github.com/yang1206/uniapp-nutui/commit/889d930c81b21c7e766b7f6352814386476b7bbc))
+* input,textarea,inputnumber,numberkeyboard,radio,radiogroup ([97a1c4c](https://github.com/yang1206/uniapp-nutui/commit/97a1c4c1407b3a664245be5b32c9660368e37008))
+* menu ([3ddf33e](https://github.com/yang1206/uniapp-nutui/commit/3ddf33eab33f90c69bbdf336dda7a1c1951e1ba2))
+* noticebar, popover, price, skeleton, steps ([3211db9](https://github.com/yang1206/uniapp-nutui/commit/3211db9431d51c2dbf68e960de6b6e807ee458f0))
+* range, rate , searchbar, shortpassword, uploader, form, progress ([c8595fe](https://github.com/yang1206/uniapp-nutui/commit/c8595fe070dc631d6514e898f9a0fa90d692d8f4))
+* sidenavbar, pagination, tabbar , badge, avatar ([312acf8](https://github.com/yang1206/uniapp-nutui/commit/312acf85c46a770a163fdfadb9da00c0515e9f70))
+* table, tag, tour, trendarrow, watermark, address ([2cb9e78](https://github.com/yang1206/uniapp-nutui/commit/2cb9e78d047e6fee3fcb1a3c2c727865b238229f))
+* tabs ([e31e9f5](https://github.com/yang1206/uniapp-nutui/commit/e31e9f546c2054c2f196212ca2e03d4bba40168d))
+* toast ([281f225](https://github.com/yang1206/uniapp-nutui/commit/281f225ba296b463e124dce51f69689a0bdb3c23))
+* transition 支持自定义动画 ([4fd9314](https://github.com/yang1206/uniapp-nutui/commit/4fd931469a5aa867a040cc625a5b6226b5cb5c77))
diff --git a/uni_modules/nutui-uni/components/_constants/event.ts b/uni_modules/nutui-uni/components/_constants/event.ts
new file mode 100644
index 0000000..1a3c4bc
--- /dev/null
+++ b/uni_modules/nutui-uni/components/_constants/event.ts
@@ -0,0 +1,18 @@
+export const UPDATE_MODEL_EVENT = 'update:modelValue'
+export const UPDATE_VISIBLE_EVENT = 'update:visible'
+export const CHANGE_EVENT = 'change'
+export const INPUT_EVENT = 'input'
+export const CLICK_EVENT = 'click'
+export const OPEN_EVENT = 'open'
+export const CLOSE_EVENT = 'close'
+export const OPENED_EVENT = 'opened'
+export const CLOSED_EVENT = 'closed'
+export const FOCUS_EVENT = 'focus'
+export const BLUR_EVENT = 'blur'
+export const CONFIRM_EVENT = 'confirm'
+export const SEARCH_EVENT = 'search'
+export const CLEAR_EVENT = 'clear'
+export const CANCEL_EVENT = 'cancel'
+export const CHOOSE_EVENT = 'choose'
+export const SELECT_EVENT = 'select'
+export const SELECTED_EVENT = 'selected'
diff --git a/uni_modules/nutui-uni/components/_constants/index.ts b/uni_modules/nutui-uni/components/_constants/index.ts
new file mode 100644
index 0000000..37cd948
--- /dev/null
+++ b/uni_modules/nutui-uni/components/_constants/index.ts
@@ -0,0 +1,3 @@
+export * from './event'
+export * from './prefix'
+export * from './types'
diff --git a/uni_modules/nutui-uni/components/_constants/prefix.ts b/uni_modules/nutui-uni/components/_constants/prefix.ts
new file mode 100644
index 0000000..b5780c1
--- /dev/null
+++ b/uni_modules/nutui-uni/components/_constants/prefix.ts
@@ -0,0 +1 @@
+export const PREFIX = 'nut'
diff --git a/uni_modules/nutui-uni/components/_constants/types.ts b/uni_modules/nutui-uni/components/_constants/types.ts
new file mode 100644
index 0000000..e4945f8
--- /dev/null
+++ b/uni_modules/nutui-uni/components/_constants/types.ts
@@ -0,0 +1,11 @@
+import type { NutAnimationName } from '../transition'
+
+export type Position = 'center' | 'top' | 'bottom' | 'left' | 'right'
+
+export const animationName: Record = {
+ center: 'fade',
+ top: 'slide-down',
+ bottom: 'slide-up',
+ left: 'slide-left',
+ right: 'slide-right',
+}
diff --git a/uni_modules/nutui-uni/components/_hooks/index.ts b/uni_modules/nutui-uni/components/_hooks/index.ts
new file mode 100644
index 0000000..b342ffd
--- /dev/null
+++ b/uni_modules/nutui-uni/components/_hooks/index.ts
@@ -0,0 +1,11 @@
+export * from './useExpose'
+export * from './useGlobalZIndex'
+export * from './useInject'
+export * from './useLockScroll'
+export * from './useProvide'
+export * from './useRect'
+export * from './useRelation'
+export * from './useRouter'
+export * from './useSelectorQuery'
+export * from './useStyle'
+export * from './useTouch'
diff --git a/uni_modules/nutui-uni/components/_hooks/useExpose.ts b/uni_modules/nutui-uni/components/_hooks/useExpose.ts
new file mode 100644
index 0000000..6ace3e7
--- /dev/null
+++ b/uni_modules/nutui-uni/components/_hooks/useExpose.ts
@@ -0,0 +1,8 @@
+import type { ComponentPublicInstance } from 'vue'
+import { getCurrentInstance } from 'vue'
+
+export function useExpose(apis: Record) {
+ const instance = getCurrentInstance()
+ if (instance)
+ Object.assign(instance.proxy as ComponentPublicInstance, apis)
+}
diff --git a/uni_modules/nutui-uni/components/_hooks/useGlobalZIndex.ts b/uni_modules/nutui-uni/components/_hooks/useGlobalZIndex.ts
new file mode 100644
index 0000000..d022d18
--- /dev/null
+++ b/uni_modules/nutui-uni/components/_hooks/useGlobalZIndex.ts
@@ -0,0 +1,9 @@
+let globalZIndex = 2000
+
+export function useGlobalZIndex() {
+ return ++globalZIndex
+}
+
+export function setGlobalZIndex(value: number) {
+ globalZIndex = value
+}
diff --git a/uni_modules/nutui-uni/components/_hooks/useInject.ts b/uni_modules/nutui-uni/components/_hooks/useInject.ts
new file mode 100644
index 0000000..7a21938
--- /dev/null
+++ b/uni_modules/nutui-uni/components/_hooks/useInject.ts
@@ -0,0 +1,32 @@
+import { computed, getCurrentInstance, inject, onUnmounted, ref } from 'vue'
+import type { ComponentInternalInstance, InjectionKey } from 'vue'
+
+type ParentProvide = T & {
+ add: (child: ComponentInternalInstance) => void
+ remove: (child: ComponentInternalInstance) => void
+ internalChildren: ComponentInternalInstance[]
+}
+
+export function useInject(key: InjectionKey>) {
+ const parent = inject(key, null)
+
+ if (parent) {
+ const instance = getCurrentInstance()!
+ const { add, remove, internalChildren } = parent
+
+ add(instance)
+ onUnmounted(() => remove(instance))
+
+ const index = computed(() => internalChildren.indexOf(instance))
+
+ return {
+ parent,
+ index,
+ }
+ }
+
+ return {
+ parent: null,
+ index: ref(-1),
+ }
+}
diff --git a/uni_modules/nutui-uni/components/_hooks/useLockScroll.ts b/uni_modules/nutui-uni/components/_hooks/useLockScroll.ts
new file mode 100644
index 0000000..66d78ab
--- /dev/null
+++ b/uni_modules/nutui-uni/components/_hooks/useLockScroll.ts
@@ -0,0 +1,31 @@
+let count = 0
+
+const CLSNAME = 'nut-overflow-hidden'
+
+export function useLockScroll(isLock: () => boolean) {
+ const lock = () => {
+ if (isLock()) {
+ try {
+ !count && document.body.classList.add(CLSNAME)
+ count++
+ }
+ catch (error) {
+ console.error(error)
+ }
+ }
+ }
+
+ const unlock = () => {
+ if (isLock() && count) {
+ try {
+ count--
+ !count && document.body.classList.remove(CLSNAME)
+ }
+ catch (error) {
+ console.error(error)
+ }
+ }
+ }
+
+ return [lock, unlock]
+}
diff --git a/uni_modules/nutui-uni/components/_hooks/useProvide.ts b/uni_modules/nutui-uni/components/_hooks/useProvide.ts
new file mode 100644
index 0000000..7714b74
--- /dev/null
+++ b/uni_modules/nutui-uni/components/_hooks/useProvide.ts
@@ -0,0 +1,93 @@
+import { getCurrentInstance, markRaw, provide, shallowReactive } from 'vue'
+import type {
+ ComponentInternalInstance,
+ ConcreteComponent,
+ InjectionKey,
+ VNode,
+ VNodeNormalizedChildren,
+} from 'vue'
+
+// TODO: uniapp 不支持 vue 直接导出的 isVNode
+export function isVNode(value: any): value is VNode {
+ return value ? value.__v_isVNode === true : false
+}
+
+export function flattenVNodes(shouldTraverseChildren: VNodeNormalizedChildren, childName?: string) {
+ const result: VNode[] = []
+
+ const traverse = (children: VNodeNormalizedChildren) => {
+ if (!Array.isArray(children))
+ return
+ children.forEach((child) => {
+ if (!isVNode(child))
+ return
+
+ if (childName) {
+ if (child.type && (child.type as ConcreteComponent).name === childName) {
+ result.push(child)
+ return
+ }
+ }
+ else {
+ result.push(child)
+ }
+
+ if (child.component?.subTree)
+ traverse(child.component.subTree.children)
+
+ if (child.children)
+ traverse(child.children)
+ })
+ }
+
+ traverse(shouldTraverseChildren)
+
+ return result
+}
+
+export function sortChildren(
+ parent: ComponentInternalInstance,
+ internalChildren: ComponentInternalInstance[],
+ childName?: string,
+) {
+ const vnodes = flattenVNodes(parent && parent.subTree && parent.subTree.children, childName)
+ internalChildren.sort((a, b) => {
+ return vnodes.indexOf(a.vnode) - vnodes.indexOf(b.vnode)
+ })
+}
+
+// 如果指定组件名称,则只查找此组件并且查到后结束。也就是不关心此组件下的内容,在大部分场景下节省查找消耗。
+export function useProvide(key: InjectionKey, childName?: string) {
+ const internalChildren: ComponentInternalInstance[] = shallowReactive([])
+ const publicChildren = shallowReactive([])
+ const parent = getCurrentInstance()!
+
+ const add = (child: ComponentInternalInstance) => {
+ if (!child.proxy)
+ return
+ internalChildren.push(markRaw(child))
+ publicChildren.push(markRaw(child.proxy))
+ sortChildren(parent, internalChildren, childName)
+ }
+
+ const remove = (child: ComponentInternalInstance) => {
+ if (child.proxy) {
+ internalChildren.splice(internalChildren.indexOf(markRaw(child)), 1)
+ publicChildren.splice(publicChildren.indexOf(markRaw(child.proxy)), 1)
+ }
+ }
+
+ return (value?: ProvideValue) => {
+ provide(key, {
+ add,
+ remove,
+ internalChildren,
+ ...value,
+ } as any)
+
+ return {
+ internalChildren,
+ children: publicChildren,
+ }
+ }
+}
diff --git a/uni_modules/nutui-uni/components/_hooks/useRect.ts b/uni_modules/nutui-uni/components/_hooks/useRect.ts
new file mode 100644
index 0000000..75cfd2c
--- /dev/null
+++ b/uni_modules/nutui-uni/components/_hooks/useRect.ts
@@ -0,0 +1,7 @@
+import type { ComponentInternalInstance } from 'vue'
+import { useSelectorQuery } from './useSelectorQuery'
+
+export function useRect(id: string, instance?: ComponentInternalInstance): Promise {
+ const { getSelectorNodeInfo } = useSelectorQuery(instance)
+ return getSelectorNodeInfo(`#${id}`)
+}
diff --git a/uni_modules/nutui-uni/components/_hooks/useRelation.ts b/uni_modules/nutui-uni/components/_hooks/useRelation.ts
new file mode 100644
index 0000000..decd390
--- /dev/null
+++ b/uni_modules/nutui-uni/components/_hooks/useRelation.ts
@@ -0,0 +1,8 @@
+import type { ComponentPublicInstance } from 'vue'
+import { getCurrentInstance } from 'vue'
+
+export function useExtend(apis: T) {
+ const instance = getCurrentInstance()
+ if (instance)
+ Object.assign(instance.proxy as ComponentPublicInstance, apis)
+}
diff --git a/uni_modules/nutui-uni/components/_hooks/useRouter.ts b/uni_modules/nutui-uni/components/_hooks/useRouter.ts
new file mode 100644
index 0000000..a392e67
--- /dev/null
+++ b/uni_modules/nutui-uni/components/_hooks/useRouter.ts
@@ -0,0 +1,28 @@
+export type NavigateToOptions = string | UniApp.NavigateToOptions
+export type RedirectToOptions = string | UniApp.RedirectToOptions
+
+export type RouterOptions = UniApp.NavigateToOptions | UniApp.RedirectToOptions
+
+export function useRouter() {
+ const push = (options: NavigateToOptions) => {
+ if (typeof options === 'string') {
+ uni.navigateTo({ url: options })
+ return
+ }
+
+ uni.navigateTo(options)
+ }
+ const replace = (options: RedirectToOptions) => {
+ if (typeof options === 'string') {
+ uni.redirectTo({ url: options })
+ return
+ }
+
+ uni.redirectTo(options)
+ }
+
+ return {
+ push,
+ replace,
+ }
+}
diff --git a/uni_modules/nutui-uni/components/_hooks/useSelectorQuery.ts b/uni_modules/nutui-uni/components/_hooks/useSelectorQuery.ts
new file mode 100644
index 0000000..33d917f
--- /dev/null
+++ b/uni_modules/nutui-uni/components/_hooks/useSelectorQuery.ts
@@ -0,0 +1,67 @@
+import { getCurrentInstance } from 'vue'
+import type { ComponentInternalInstance } from 'vue'
+
+export function useSelectorQuery(instance?: ComponentInternalInstance | null) {
+ let query: UniApp.SelectorQuery | null = null
+
+ if (!instance)
+ instance = getCurrentInstance()
+
+ if (!instance)
+ console.warn('useSelectorQuery', 'useSelectorQuery必须在setup函数中使用')
+
+ // #ifndef MP-ALIPAY
+ query = uni.createSelectorQuery().in(instance)
+ // #endif
+ // #ifdef MP-ALIPAY
+ query = uni.createSelectorQuery().in(null)
+ // #endif
+
+ const getSelectorNodeInfo = (selector: string): Promise => {
+ return new Promise((resolve, reject) => {
+ if (query) {
+ query
+ .select(selector)
+ .boundingClientRect((res) => {
+ const selectRes: UniApp.NodeInfo = res as UniApp.NodeInfo
+ if (selectRes)
+ resolve(selectRes)
+ else
+ reject(new Error(`未找到对应节点: ${selector}`))
+ })
+ .exec()
+ }
+ else {
+ reject(new Error('未找到对应的SelectorQuery实例'))
+ }
+ })
+ }
+
+ const getSelectorNodeInfos = (
+ selector: string,
+ ): Promise => {
+ return new Promise((resolve, reject) => {
+ if (query) {
+ query
+ .selectAll(selector)
+ .boundingClientRect((res) => {
+ const selectRes: UniApp.NodeInfo[] = res as UniApp.NodeInfo[]
+ if (selectRes && selectRes.length > 0)
+ resolve(selectRes)
+ else
+ reject(new Error(`未找到对应节点: ${selector}`))
+ })
+ .exec()
+ }
+ else {
+ reject(new Error('未找到对应的SelectorQuery实例'))
+ }
+ })
+ }
+
+ return {
+ query,
+ getSelectorNodeInfo,
+ getSelectorNodeInfos,
+ }
+}
diff --git a/uni_modules/nutui-uni/components/_hooks/useStyle.ts b/uni_modules/nutui-uni/components/_hooks/useStyle.ts
new file mode 100644
index 0000000..d4e7d2b
--- /dev/null
+++ b/uni_modules/nutui-uni/components/_hooks/useStyle.ts
@@ -0,0 +1,29 @@
+import { computed, normalizeClass, normalizeStyle } from 'vue'
+import { stringifyStyle } from '../_utils'
+
+export function useStyleContext(props: any, componentName: string) {
+ const mainClass = computed(() => {
+ const cls = normalizeClass([props.customClass, { [componentName]: true }])
+
+ return cls
+ })
+
+ const mainStyle = computed(() => {
+ return stringifyStyle(normalizeStyle(props.customStyle))
+ })
+
+ const getMainClass = (cls: unknown) => {
+ return normalizeClass([props.customClass, { [componentName]: true }, cls])
+ }
+
+ const getMainStyle = (style: unknown) => {
+ return stringifyStyle(normalizeStyle([props.customStyle, style]))
+ }
+
+ return {
+ mainClass,
+ mainStyle,
+ getMainClass,
+ getMainStyle,
+ }
+}
diff --git a/uni_modules/nutui-uni/components/_hooks/useTouch.ts b/uni_modules/nutui-uni/components/_hooks/useTouch.ts
new file mode 100644
index 0000000..45344d7
--- /dev/null
+++ b/uni_modules/nutui-uni/components/_hooks/useTouch.ts
@@ -0,0 +1,74 @@
+import { ref } from 'vue'
+
+const MIN_DISTANCE = 10
+
+type Direction = '' | 'vertical' | 'horizontal'
+
+function getDirection(x: number, y: number) {
+ if (x > y && x > MIN_DISTANCE)
+ return 'horizontal'
+
+ if (y > x && y > MIN_DISTANCE)
+ return 'vertical'
+
+ return ''
+}
+
+export function useTouch() {
+ const startX = ref(0)
+ const startY = ref(0)
+ const moveX = ref(0)
+ const moveY = ref(0)
+ const deltaX = ref(0)
+ const deltaY = ref(0)
+ const offsetX = ref(0)
+ const offsetY = ref(0)
+ const direction = ref('')
+
+ const isVertical = () => direction.value === 'vertical'
+ const isHorizontal = () => direction.value === 'horizontal'
+
+ const reset = () => {
+ deltaX.value = 0
+ deltaY.value = 0
+ offsetX.value = 0
+ offsetY.value = 0
+ direction.value = ''
+ }
+
+ const start = ((event: TouchEvent) => {
+ reset()
+ startX.value = event.touches[0].clientX
+ startY.value = event.touches[0].clientY
+ }) as EventListener
+
+ const move = ((event: TouchEvent) => {
+ const touch = event.touches[0]
+ deltaX.value = touch.clientX - startX.value
+ deltaY.value = touch.clientY - startY.value
+ moveX.value = touch.clientX
+ moveY.value = touch.clientY
+ offsetX.value = Math.abs(deltaX.value)
+ offsetY.value = Math.abs(deltaY.value)
+
+ if (!direction.value)
+ direction.value = getDirection(offsetX.value, offsetY.value)
+ }) as EventListener
+
+ return {
+ move,
+ start,
+ reset,
+ startX,
+ startY,
+ moveX,
+ moveY,
+ deltaX,
+ deltaY,
+ offsetX,
+ offsetY,
+ direction,
+ isVertical,
+ isHorizontal,
+ }
+}
diff --git a/uni_modules/nutui-uni/components/_utils/common.ts b/uni_modules/nutui-uni/components/_utils/common.ts
new file mode 100644
index 0000000..d678c51
--- /dev/null
+++ b/uni_modules/nutui-uni/components/_utils/common.ts
@@ -0,0 +1,277 @@
+import { isArray, isDef, isObject } from './is'
+
+// 变量类型判断
+export function TypeOfFun(value: any) {
+ if (value === null)
+ return 'null'
+
+ const type = typeof value
+ if (type === 'undefined' || type === 'string')
+ return type
+
+ const typeString = toString.call(value)
+ switch (typeString) {
+ case '[object Array]':
+ return 'array'
+ case '[object Date]':
+ return 'date'
+ case '[object Boolean]':
+ return 'boolean'
+ case '[object Number]':
+ return 'number'
+ case '[object Function]':
+ return 'function'
+ case '[object RegExp]':
+ return 'regexp'
+ case '[object Object]':
+ if (undefined !== value.nodeType) {
+ if (value.nodeType === 3)
+ return /\S/.test(value.nodeValue) ? 'textnode' : 'whitespace'
+ else
+ return 'element'
+ }
+ else {
+ return 'object'
+ }
+ default:
+ return 'unknow'
+ }
+}
+//
+export const objectToString = Object.prototype.toString
+export const toTypeString = (value: unknown): string => objectToString.call(value)
+
+export function toRawType(value: unknown): string {
+ // extract "RawType" from strings like "[object RawType]"
+ return toTypeString(value).slice(8, -1)
+}
+
+export const win = window
+
+export const docu = document
+
+export const body = docu.body
+
+export function getPropByPath(obj: any, keyPath: string) {
+ try {
+ return keyPath.split('.').reduce((prev, curr) => prev[curr], obj)
+ }
+ // eslint-disable-next-line unused-imports/no-unused-vars
+ catch (error) {
+ return ''
+ }
+}
+
+export function floatData(format: any, dataOp: any, mapOps: any) {
+ const mergeFormat = Object.assign({}, format)
+ const mergeMapOps = Object.assign({}, mapOps)
+
+ if (Object.keys(dataOp).length > 0) {
+ Object.keys(mergeFormat).forEach((keys) => {
+ if (Object.prototype.hasOwnProperty.call(mergeMapOps, keys)) {
+ const tof = TypeOfFun(mergeMapOps[keys])
+ if (tof === 'function')
+ mergeFormat[keys] = mergeMapOps[keys](dataOp)
+
+ if (tof === 'string')
+ mergeFormat[keys] = dataOp[mergeMapOps[keys]]
+ }
+ else {
+ if (dataOp[keys])
+ mergeFormat[keys] = dataOp[keys]
+ }
+ })
+ return mergeFormat
+ }
+
+ return format
+}
+
+export function myFixed(num: any, digit = 2) {
+ if (Object.is(Number.parseFloat(num), Number.NaN))
+ return console.warn(`传入的值:${num}不是一个数字`)
+
+ num = Number.parseFloat(num)
+ return (Math.round((num + Number.EPSILON) * 10 ** digit) / 10 ** digit).toFixed(digit)
+}
+
+export function preventDefault(event: Event, isStopPropagation?: boolean) {
+ if (typeof event.cancelable !== 'boolean' || event.cancelable)
+ event.preventDefault()
+
+ if (isStopPropagation)
+ event.stopPropagation()
+}
+
+function cacheStringFunction string>(fn: T): T {
+ const cache: Record = Object.create(null)
+ return ((str: string) => {
+ const hit = cache[str]
+
+ return hit || (cache[str] = fn(str))
+ }) as T
+}
+
+const hyphenateRE = /\B([A-Z])/g
+export const hyphenate = cacheStringFunction((str: string) =>
+ str.replace(hyphenateRE, '-$1').toLowerCase(),
+)
+
+export function padZero(num: number | string, length = 2): string {
+ num += ''
+ while ((num as string).length < length)
+ num = `0${num}`
+
+ return num.toString()
+}
+
+export const clamp = (num: number, min: number, max: number): number => Math.min(Math.max(num, min), max)
+
+export function getScrollTopRoot(): number {
+ return window.scrollY || document.documentElement.scrollTop || document.body.scrollTop || 0
+}
+
+type ObjectIndex = Record
+
+const { hasOwnProperty } = Object.prototype
+
+function assignKey(to: ObjectIndex, from: ObjectIndex, key: string) {
+ const val = from[key]
+
+ if (!isDef(val))
+ return
+
+ if (!hasOwnProperty.call(to, key) || !isObject(val))
+ to[key] = val
+
+ else
+ // eslint-disable-next-line unicorn/new-for-builtins
+ to[key] = deepAssign(Object(to[key]), val)
+}
+
+export function deepAssign(to: ObjectIndex, from: ObjectIndex): ObjectIndex {
+ Object.keys(from).forEach((key) => {
+ assignKey(to, from, key)
+ })
+
+ return to
+}
+
+export function omit(obj: Record, keys: string[]) {
+ if (Object.prototype.toString.call(obj) === '[object Object]')
+ return obj
+
+ return Object.keys(obj).reduce((prev, key) => {
+ if (!keys.includes(key))
+ prev[key] = obj[key]
+
+ return prev
+ }, {} as Record)
+}
+
+export interface Deferred extends Promise {
+ resolve: (value?: T) => void
+ reject: (value?: any) => void
+}
+
+export function createDeferred(): Deferred {
+ let resolve: Deferred['resolve'] = noop
+ let reject: Deferred['reject'] = noop
+ const promise = new Promise((_resolve, _reject) => {
+ resolve = _resolve
+ reject = _reject
+ }) as unknown as Deferred
+
+ promise.resolve = resolve
+ promise.reject = reject
+ return promise
+}
+
+export function toArray(value?: T | T[]): T[] {
+ if (!value)
+ return []
+ return Array.isArray(value) ? value : [value]
+}
+
+export function noop() { }
+
+export function getRandomId() {
+ return Math.random().toString(36).slice(-8)
+}
+
+export function isLooseEqual(a: any, b: any): boolean {
+ if (a === b)
+ return true
+
+ const isObjectA = isObject(a)
+ const isObjectB = isObject(b)
+
+ if (isObjectA && isObjectB)
+ return JSON.stringify(a) === JSON.stringify(b)
+ else if (!isObjectA && !isObjectB)
+ return String(a) === String(b)
+ else
+ return false
+}
+
+export function isEqualArray(a: any, b: any): boolean {
+ if (a === b)
+ return true
+
+ if (!isArray(a) || !isArray(b))
+ return false
+
+ if (a.length !== b.length)
+ return false
+
+ for (let i = 0; i < a.length; i++) {
+ if (!isLooseEqual(a[i], b[i]))
+ return false
+ }
+
+ return true
+}
+
+export function isEqualValue(a: any, b: any): boolean {
+ if (a === b)
+ return true
+
+ if (isArray(a) && isArray(b))
+ return isEqualArray(a, b)
+
+ return isLooseEqual(a, b)
+}
+
+export function cloneDeep(obj: T, cache = new WeakMap()): T {
+ if (obj === null || typeof obj !== 'object')
+ return obj
+ if (cache.has(obj))
+ return cache.get(obj)
+ let clone
+ if (obj instanceof Date) {
+ clone = new Date(obj.getTime())
+ }
+ else if (obj instanceof RegExp) {
+ clone = new RegExp(obj)
+ }
+ else if (obj instanceof Map) {
+ clone = new Map(Array.from(obj, ([key, value]) => [key, cloneDeep(value, cache)]))
+ }
+ else if (obj instanceof Set) {
+ clone = new Set(Array.from(obj, value => cloneDeep(value, cache)))
+ }
+ else if (Array.isArray(obj)) {
+ clone = obj.map(value => cloneDeep(value, cache))
+ }
+ else if (Object.prototype.toString.call(obj) === '[object Object]') {
+ clone = Object.create(Object.getPrototypeOf(obj))
+ cache.set(obj, clone)
+ for (const [key, value] of Object.entries(obj))
+ clone[key] = cloneDeep(value, cache)
+ }
+ else {
+ clone = Object.assign({}, obj)
+ }
+ cache.set(obj, clone)
+ return clone
+}
diff --git a/uni_modules/nutui-uni/components/_utils/date.ts b/uni_modules/nutui-uni/components/_utils/date.ts
new file mode 100644
index 0000000..09b2be4
--- /dev/null
+++ b/uni_modules/nutui-uni/components/_utils/date.ts
@@ -0,0 +1,167 @@
+/**
+ * 时间戳转换 或 获取当前时间的时间戳
+ */
+export function getTimeStamp(timeStr?: string | number) {
+ if (!timeStr)
+ return Date.now()
+ let t = timeStr
+ t = (t as number > 0) ? +t : t.toString().replace(/-/g, '/')
+ return new Date(t).getTime()
+}
+
+/**
+ * 是否为闫年
+ * @return {Boolse} true|false
+ */
+export function isLeapYear(y: number): boolean {
+ return (y % 4 === 0 && y % 100 !== 0) || y % 400 === 0
+}
+
+/**
+ * 返回星期数
+ * @return {string}
+ */
+export function getWhatDay(year: number, month: number, day: number): string {
+ const date = new Date(`${year}/${month}/${day}`)
+ const index = date.getDay()
+ const dayNames = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']
+ return dayNames[index]
+}
+
+/**
+ * 返回星期数
+ * @return {number}
+ */
+export function getMonthPreDay(year: number, month: number): number {
+ const date = new Date(`${year}/${month}/01`)
+ let day = date.getDay()
+ if (day === 0)
+ day = 7
+
+ return day
+}
+
+/**
+ * 返回月份天数
+ * @return {number}
+ */
+export function getMonthDays(year: string, month: string): number {
+ if (month.startsWith('0'))
+ month = month.split('')[1]
+
+ return ([0, 31, isLeapYear(Number(year)) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] as number[])[
+ month as any
+ ]
+}
+
+/**
+ * 补齐数字位数
+ * @return {string}
+ */
+export function getNumTwoBit(n: number): string {
+ n = Number(n)
+ return (n > 9 ? '' : '0') + n
+}
+
+/**
+ * 日期对象转成字符串
+ * @return {string}
+ */
+export function date2Str(date: Date, split?: string): string {
+ split = split || '-'
+ const y = date.getFullYear()
+ const m = getNumTwoBit(date.getMonth() + 1)
+ const d = getNumTwoBit(date.getDate())
+ return [y, m, d].join(split)
+}
+
+/**
+ * 返回日期格式字符串
+ * @param i 0返回今天的日期、1返回明天的日期,2返回后天得日期,依次类推
+ * @return {string} '2014-12-31'
+ */
+export function getDay(i: number): string {
+ i = i || 0
+ let date = new Date()
+ const diff = i * (1000 * 60 * 60 * 24)
+ date = new Date(date.getTime() + diff)
+ return date2Str(date)
+}
+
+/**
+ * 时间比较
+ * @return {boolean}
+ */
+export function compareDate(date1: string, date2: string): boolean {
+ const startTime = new Date(date1.replace('-', '/').replace('-', '/'))
+ const endTime = new Date(date2.replace('-', '/').replace('-', '/'))
+ if (startTime >= endTime)
+ return false
+
+ return true
+}
+
+/**
+ * 时间是否相等
+ * @return {boolean}
+ */
+export function isEqual(date1: string, date2: string): boolean {
+ const startTime = new Date(date1).getTime()
+ const endTime = new Date(date2).getTime()
+ if (startTime === endTime)
+ return true
+
+ return false
+}
+export function getMonthWeek(year: string, month: string, date: string, firstDayOfWeek = 0): number {
+ const dateNow = new Date(Number(year), Number.parseInt(month) - 1, Number(date))
+ let w = dateNow.getDay() // 星期数
+ const d = dateNow.getDate()
+ let remainder = 6 - w
+ if (firstDayOfWeek !== 0) {
+ w = w === 0 ? 7 : w
+ remainder = 7 - w
+ }
+ return Math.ceil((d + remainder) / 7)
+}
+export function getYearWeek(year: string, month: string, date: string): number {
+ const dateNow = new Date(Number(year), Number.parseInt(month) - 1, Number(date))
+ const dateFirst = new Date(Number(year), 0, 1)
+ const dataNumber = Math.round((dateNow.valueOf() - dateFirst.valueOf()) / 86400000)
+ return Math.ceil((dataNumber + (dateFirst.getDay() + 1 - 1)) / 7)
+}
+export function getWeekDate(year: string, month: string, date: string, firstDayOfWeek = 0): string[] {
+ const dateNow = new Date(Number(year), Number.parseInt(month) - 1, Number(date))
+ const nowTime = dateNow.getTime()
+ let day = dateNow.getDay()
+ if (firstDayOfWeek === 0) {
+ const oneDayTime = 24 * 60 * 60 * 1000
+ // 显示周日
+ const SundayTime = nowTime - day * oneDayTime // 本周的周日
+ // 显示周六
+ const SaturdayTime = nowTime + (6 - day) * oneDayTime // 本周的周六
+
+ const sunday = date2Str(new Date(SundayTime))
+ const saturday = date2Str(new Date(SaturdayTime))
+ return [sunday, saturday]
+ }
+ else {
+ day = day === 0 ? 7 : day
+ const oneDayTime = 24 * 60 * 60 * 1000
+ // 显示周一
+ const MondayTime = nowTime - (day - 1) * oneDayTime // 本周的周一
+ // 显示周日
+ const SundayTime = nowTime + (7 - day) * oneDayTime // 本周的周日
+
+ const monday = date2Str(new Date(MondayTime))
+ const sunday = date2Str(new Date(SundayTime))
+ return [monday, sunday]
+ }
+}
+export function formatResultDate(date: string) {
+ const days = [...date.split('-')]
+ days[2] = getNumTwoBit(Number(days[2]))
+ days[3] = `${days[0]}-${days[1]}-${days[2]}`
+ days[4] = getWhatDay(+days[0], +days[1], +days[2])
+ return days
+}
diff --git a/uni_modules/nutui-uni/components/_utils/env.ts b/uni_modules/nutui-uni/components/_utils/env.ts
new file mode 100644
index 0000000..3bf51d1
--- /dev/null
+++ b/uni_modules/nutui-uni/components/_utils/env.ts
@@ -0,0 +1,100 @@
+/** 枚举EPlatform */
+enum EPlatform {
+ /** App */
+ AppPlus = 'APP-PLUS',
+ /** App nvue */
+ AppPlusNvue = 'APP-PLUS-NVUE',
+ /** H5 */
+ H5 = 'H5',
+ /** 微信小程序 */
+ MpWeixin = 'MP-WEIXIN',
+ /** 支付宝小程序 */
+ MpAlipay = 'MP-ALIPAY',
+ /** 百度小程序 */
+ MpBaidu = 'MP-BAIDU',
+ /** 字节跳动小程序 */
+ MpToutiao = 'MP-TOUTIAO',
+ /** QQ小程序 */
+ MpQq = 'MP-QQ',
+ /** 360小程序 */
+ Mp360 = 'MP-360',
+ /** 微信小程序/支付宝小程序/百度小程序/字节跳动小程序/QQ小程序/360小程序 */
+ Mp = 'MP',
+ /** 快应用通用(包含联盟、华为) */
+ QuickappWebview = 'quickapp-webview',
+ /** 快应用联盟 */
+ QuickappWebviewUnion = 'quickapp-webview-union',
+ /** 快应用华为 */
+ QuickappWebviewHuawei = 'quickapp-webview-huawei',
+}
+
+/** 使用条件编译获取平台信息 */
+function ifDefPlatform(): EPlatform {
+ let platform: EPlatform
+ // #ifdef APP-PLUS
+ platform = EPlatform.AppPlus
+ // #endif
+ // #ifdef APP-PLUS-NVUE
+ platform = EPlatform.AppPlusNvue
+ // #endif
+ // #ifdef H5
+ platform = EPlatform.H5
+ // #endif
+ // #ifdef MP-WEIXIN
+ platform = EPlatform.MpWeixin
+ // #endif
+ // #ifdef MP-ALIPAY
+ platform = EPlatform.MpAlipay
+ // #endif
+ // #ifdef MP-BAIDU
+ platform = EPlatform.MpBaidu
+ // #endif
+ // #ifdef MP-TOUTIAO
+ platform = EPlatform.MpToutiao
+ // #endif
+ // #ifdef MP-QQ
+ platform = EPlatform.MpQq
+ // #endif
+ // #ifdef MP-360
+ platform = EPlatform.Mp360
+ // #endif
+ // #ifdef MP
+ platform = EPlatform.Mp
+ // #endif
+ // #ifdef quickapp-webview
+ platform = EPlatform.QuickappWebview
+ // #endif
+ // #ifdef quickapp-webview-union
+ platform = EPlatform.QuickappWebviewUnion
+ // #endif
+ // #ifdef quickapp-webview-huawei
+ platform = EPlatform.QuickappWebviewHuawei
+ // #endif
+ return platform
+}
+
+/** 平台类型 */
+export const platform: EPlatform = ifDefPlatform()
+
+/** H5 */
+export const isH5 = platform === EPlatform.H5
+/** 微信小程序 */
+export const isMpWeixin = platform === EPlatform.MpWeixin
+/** 支付宝小程序 */
+export const isMpAlipay = platform === EPlatform.MpAlipay
+/** 百度小程序 */
+export const isMpBaidu = platform === EPlatform.MpBaidu
+/** 字节跳动小程序 */
+export const isMpToutiao = platform === EPlatform.MpToutiao
+/** QQ小程序 */
+export const isMpQq = platform === EPlatform.MpQq
+/** 360小程序 */
+export const isMp360 = platform === EPlatform.Mp360
+/** 微信小程序/支付宝小程序/百度小程序/字节跳动小程序/QQ小程序/360小程序 */
+export const isMp = platform === EPlatform.Mp
+/** 快应用通用(包含联盟、华为) */
+export const isQuickappWebview = platform === EPlatform.QuickappWebview
+/** 快应用联盟 */
+export const isQuickappWebviewUnion = platform === EPlatform.QuickappWebviewUnion
+/** 快应用华为 */
+export const isQuickappWebviewHuawei = platform === EPlatform.QuickappWebviewHuawei
diff --git a/uni_modules/nutui-uni/components/_utils/index.ts b/uni_modules/nutui-uni/components/_utils/index.ts
new file mode 100644
index 0000000..54cc508
--- /dev/null
+++ b/uni_modules/nutui-uni/components/_utils/index.ts
@@ -0,0 +1,9 @@
+export * from './common'
+export * from './date'
+export * from './env'
+export * from './interceptor'
+export * from './is'
+export * from './props'
+export * from './pxCheck'
+export * from './raf'
+export * from './style'
diff --git a/uni_modules/nutui-uni/components/_utils/interceptor.ts b/uni_modules/nutui-uni/components/_utils/interceptor.ts
new file mode 100644
index 0000000..5970aeb
--- /dev/null
+++ b/uni_modules/nutui-uni/components/_utils/interceptor.ts
@@ -0,0 +1,37 @@
+import { isPromise } from './is'
+
+export type Interceptor = (...args: any[]) => Promise | boolean | undefined | void
+
+export function funInterceptor(interceptor: Interceptor | undefined, {
+ args = [],
+ done,
+ canceled,
+}: {
+ args?: unknown[]
+ done: (val?: any) => void
+ canceled?: () => void
+}) {
+ if (interceptor) {
+ const returnVal = interceptor(null, ...args)
+
+ if (isPromise(returnVal)) {
+ returnVal
+ .then((value) => {
+ if (value)
+ done(value)
+ else if (canceled)
+ canceled()
+ })
+ .catch(() => {})
+ }
+ else if (returnVal) {
+ done()
+ }
+ else if (canceled) {
+ canceled()
+ }
+ }
+ else {
+ done()
+ }
+}
diff --git a/uni_modules/nutui-uni/components/_utils/is.ts b/uni_modules/nutui-uni/components/_utils/is.ts
new file mode 100644
index 0000000..605f10f
--- /dev/null
+++ b/uni_modules/nutui-uni/components/_utils/is.ts
@@ -0,0 +1,96 @@
+const toString = Object.prototype.toString
+
+export function is(val: unknown, type: string) {
+ return toString.call(val) === `[object ${type}]`
+}
+
+export function isDef(val?: T): val is T {
+ return typeof val !== 'undefined'
+}
+
+export function isUnDef(val?: T): val is T {
+ return !isDef(val)
+}
+
+export function isObject(val: any): val is Record {
+ return val !== null && is(val, 'Object')
+}
+
+export function isEmpty(val: T): val is T {
+ if (isArray(val) || isString(val))
+ return val.length === 0
+
+ if (val instanceof Map || val instanceof Set)
+ return val.size === 0
+
+ if (isObject(val))
+ return Object.keys(val).length === 0
+
+ return false
+}
+
+export function isDate(val: unknown): val is Date {
+ return is(val, 'Date')
+}
+
+export function isNull(val: unknown): val is null {
+ return val === null
+}
+
+export function isNullAndUnDef(val: unknown): val is null | undefined {
+ return isUnDef(val) && isNull(val)
+}
+
+export function isNullOrUnDef(val: unknown): val is null | undefined {
+ return isUnDef(val) || isNull(val)
+}
+
+export function isNumber(val: unknown): val is number {
+ return is(val, 'Number')
+}
+
+export function isPromise(val: unknown): val is Promise {
+ return (
+ is(val, 'Promise')
+ || ((isObject(val) || isFunction(val))
+ && isFunction((val as any).then)
+ && isFunction((val as any).catch))
+ )
+}
+
+export function isString(val: unknown): val is string {
+ return is(val, 'String')
+}
+
+export function isFunction(val: unknown): val is () => void {
+ return typeof val === 'function'
+}
+
+export function isBoolean(val: unknown): val is boolean {
+ return is(val, 'Boolean')
+}
+
+export function isRegExp(val: unknown): val is RegExp {
+ return is(val, 'RegExp')
+}
+
+export function isArray(val: any): val is Array {
+ return val && Array.isArray(val)
+}
+
+export function isWindow(val: any): val is Window {
+ return typeof window !== 'undefined' && is(val, 'Window')
+}
+
+export function isElement(val: unknown): val is Element {
+ return isObject(val) && !!val.tagName
+}
+
+export function isMap(val: unknown): val is Map {
+ return is(val, 'Map')
+}
+
+export function isUrl(path: string): boolean {
+ const reg = /^http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w- ./?%&=]*)?/
+ return reg.test(path)
+}
diff --git a/uni_modules/nutui-uni/components/_utils/props.ts b/uni_modules/nutui-uni/components/_utils/props.ts
new file mode 100644
index 0000000..1b638ef
--- /dev/null
+++ b/uni_modules/nutui-uni/components/_utils/props.ts
@@ -0,0 +1,83 @@
+/**
+ * prop type helpers
+ * help us to write less code and reduce bundle size
+ * copy from https://github.com/youzan/vant/blob/main/packages/vant/src/utils/props.ts
+ */
+import type { ExtractPropTypes, PropType, StyleValue } from 'vue'
+
+export const unknownProp = null as unknown as PropType
+
+export const numericProp = [Number, String]
+
+export const truthProp = {
+ type: Boolean,
+ default: true as const,
+}
+
+export const nullableBooleanProp = {
+ type: Boolean as PropType,
+ default: undefined,
+}
+
+export function makeRequiredProp(type: T) {
+ return {
+ type,
+ required: true as const,
+ }
+}
+
+export function makeArrayProp(defaultVal: T[] = []) {
+ return {
+ type: Array as PropType,
+ default: () => defaultVal,
+ }
+}
+
+export function makeObjectProp(defaultVal: T) {
+ return {
+ type: Object as PropType,
+ default: () => defaultVal,
+ }
+}
+
+export function makeNumberProp(defaultVal: T) {
+ return {
+ type: Number,
+ default: defaultVal,
+ }
+}
+
+export function makeNumericProp(defaultVal: T) {
+ return {
+ type: numericProp,
+ default: defaultVal,
+ }
+}
+
+export function makeStringProp(defaultVal: T) {
+ return {
+ type: String as unknown as PropType,
+ default: defaultVal,
+ }
+}
+
+export type ClassType = string | object | Array
+
+export const commonProps = {
+ /**
+ * @description 自定义类名
+ */
+ customClass: {
+ type: [String, Object, Array] as PropType,
+ default: '',
+ },
+ /**
+ * @description 自定义样式
+ */
+ customStyle: {
+ type: [String, Object, Array] as PropType,
+ default: '',
+ },
+}
+
+export type CommonProps = ExtractPropTypes
diff --git a/uni_modules/nutui-uni/components/_utils/pxCheck.ts b/uni_modules/nutui-uni/components/_utils/pxCheck.ts
new file mode 100644
index 0000000..2b260c7
--- /dev/null
+++ b/uni_modules/nutui-uni/components/_utils/pxCheck.ts
@@ -0,0 +1,3 @@
+export function pxCheck(value: string | number): string {
+ return Number.isNaN(Number(value)) ? String(value) : `${value}px`
+}
diff --git a/uni_modules/nutui-uni/components/_utils/raf.ts b/uni_modules/nutui-uni/components/_utils/raf.ts
new file mode 100644
index 0000000..ccc7d11
--- /dev/null
+++ b/uni_modules/nutui-uni/components/_utils/raf.ts
@@ -0,0 +1,30 @@
+const _window = window as any
+
+export const inBrowser = typeof window !== 'undefined'
+
+function requestAniFrame() {
+ if (typeof _window !== 'undefined') {
+ return (
+ _window.requestAnimationFrame
+ || _window.webkitRequestAnimationFrame
+ || function (callback: () => void) {
+ _window.setTimeout(callback, 1000 / 60)
+ }
+ )
+ }
+ else {
+ return function (callback: () => void) {
+ setTimeout(callback, 1000 / 60)
+ }
+ }
+}
+
+export function cancelRaf(id: number) {
+ if (inBrowser)
+ cancelAnimationFrame(id)
+
+ else
+ clearTimeout(id)
+}
+
+export default requestAniFrame()
diff --git a/uni_modules/nutui-uni/components/_utils/style.ts b/uni_modules/nutui-uni/components/_utils/style.ts
new file mode 100644
index 0000000..d80e241
--- /dev/null
+++ b/uni_modules/nutui-uni/components/_utils/style.ts
@@ -0,0 +1,167 @@
+import type { CSSProperties } from 'vue'
+import { hyphenate } from './common'
+import { isArray, isEmpty, isNumber, isObject, isString } from './is'
+import type { CommonProps } from './props'
+
+export type NormalizedStyle = Record
+
+const listDelimiterRE = /;(?![^(]*\))/g
+const propertyDelimiterRE = /:([\s\S]+)/
+const styleCommentRE = /\/\*.*?\*\//g
+
+export function parseStringStyle(cssText: string): NormalizedStyle {
+ const ret: NormalizedStyle = {}
+ cssText
+ .replace(styleCommentRE, '')
+ .split(listDelimiterRE)
+ .forEach((item) => {
+ if (item) {
+ const tmp = item.split(propertyDelimiterRE)
+ tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim())
+ }
+ })
+ return ret
+}
+
+export function stringifyStyle(styles: NormalizedStyle | string | undefined): string {
+ let ret = ''
+ if (!styles || isString(styles))
+ return ret
+
+ for (const key in styles) {
+ const value = styles[key]
+ const normalizedKey = key.startsWith('--') ? key : hyphenate(key)
+ if (isString(value) || typeof value === 'number') {
+ // only render valid values
+ ret += `${normalizedKey}:${value};`
+ }
+ }
+ return ret
+}
+
+export function getPx(value: string | number, unit = false) {
+ if (isNumber(value))
+ return unit ? `${value}px` : Number(value)
+
+ return unit ? `${Number.parseInt(value)}px` : Number.parseInt(value)
+}
+
+/**
+ * @description 样式转换
+ * 对象转字符串,或者字符串转对象
+ * @param {object | string} customStyle 需要转换的目标
+ * @param {string} target 转换的目的,object-转为对象,string-转为字符串
+ */
+export function addStyle(customStyle: string | object, target = 'object') {
+ // 字符串转字符串,对象转对象情形,直接返回
+ if (
+ isEmpty(customStyle)
+ || (typeof customStyle === 'object' && target === 'object')
+ || (target === 'string' && typeof customStyle === 'string')
+ ) {
+ return customStyle
+ }
+
+ // 字符串转对象
+ if (target === 'object') {
+ // 去除字符串样式中的两端空格(中间的空格不能去掉,比如padding: 20px 0如果去掉了就错了),空格是无用的
+ customStyle = trim(customStyle)
+ // 根据";"将字符串转为数组形式
+ const styleArray = customStyle.split(';')
+ const style: any = {}
+ // 历遍数组,拼接成对象
+ for (let i = 0; i < styleArray.length; i++) {
+ // 'font-size:20px;color:red;',如此最后字符串有";"的话,会导致styleArray最后一个元素为空字符串,这里需要过滤
+ if (styleArray[i]) {
+ const item = styleArray[i].split(':')
+ style[trim(item[0])] = trim(item[1])
+ }
+ }
+ return style
+ }
+ // 这里为对象转字符串形式
+ let string = ''
+ for (const i in customStyle as any) {
+ // 驼峰转为中划线的形式,否则css内联样式,无法识别驼峰样式属性名
+ const key = i.replace(/([A-Z])/g, '-$1').toLowerCase()
+ string += `${key}:${customStyle[i]};`
+ }
+ // 去除两端空格
+ return trim(string)
+}
+
+/**
+ * @description 去除空格
+ * @param str 需要去除空格的字符串
+ * @param pos both(左右)|left|right|all 默认both
+ */
+export function trim(str: string, pos = 'both') {
+ str = String(str)
+ if (pos === 'both')
+ return str.replace(/^\s+|\s+$/g, '')
+
+ if (pos === 'left')
+ return str.replace(/^\s*/, '')
+
+ if (pos === 'right')
+ return str.replace(/(\s*$)/g, '')
+
+ if (pos === 'all')
+ return str.replace(/\s+/g, '')
+
+ return str
+}
+
+export function normalizeStyle(value: unknown): NormalizedStyle | string | undefined {
+ if (isArray(value)) {
+ const res: NormalizedStyle = {}
+ for (let i = 0; i < value.length; i++) {
+ const item = value[i]
+ const normalized = isString(item)
+ ? parseStringStyle(item)
+ : (normalizeStyle(item) as NormalizedStyle)
+ if (normalized) {
+ for (const key in normalized) {
+ if (!isEmpty(normalized[key]))
+ res[key] = normalized[key]
+ }
+ }
+ }
+
+ return res
+ }
+ if (isString(value))
+ return value
+
+ if (isObject(value))
+ return value
+}
+
+export function normalizeClass(value: unknown): string {
+ let res = ''
+ if (isString(value)) {
+ res = value
+ }
+ else if (isArray(value)) {
+ for (let i = 0; i < value.length; i++) {
+ const normalized = normalizeClass(value[i])
+ if (normalized)
+ res += `${normalized} `
+ }
+ }
+ else if (isObject(value)) {
+ for (const name in value) {
+ if (value[name])
+ res += `${name} `
+ }
+ }
+ return res.trim()
+}
+
+export function getMainClass(props: CommonProps, componentName: string, cls?: object) {
+ return normalizeClass([props.customClass, { [componentName]: true }, cls])
+}
+
+export function getMainStyle(props: CommonProps, style?: CSSProperties) {
+ return stringifyStyle(normalizeStyle([props.customStyle, style]))
+}
diff --git a/uni_modules/nutui-uni/components/actionsheet/actionsheet.ts b/uni_modules/nutui-uni/components/actionsheet/actionsheet.ts
new file mode 100644
index 0000000..693a6e0
--- /dev/null
+++ b/uni_modules/nutui-uni/components/actionsheet/actionsheet.ts
@@ -0,0 +1,82 @@
+import type { CSSProperties, ExtractPropTypes, PropType } from 'vue'
+import { CANCEL_EVENT, CHOOSE_EVENT, CLOSE_EVENT, UPDATE_VISIBLE_EVENT } from '../_constants'
+import { commonProps, isBoolean, isNumber, makeArrayProp, makeStringProp, truthProp } from '../_utils'
+import { popupProps } from '../popup/popup'
+
+export interface ActionSheetOption {
+ disable?: boolean
+ loading?: boolean
+ color?: string
+ name: string
+ subname?: string
+}
+
+export const actionsheetProps = {
+ ...popupProps,
+ ...commonProps,
+ /**
+ * @description 是否显示圆角
+ */
+ round: truthProp,
+ /**
+ * @description 是否开启 iPhone 系列全面屏底部安全区适配,仅当 `position` 为 `bottom` 时有效
+ */
+ safeAreaInsetBottom: truthProp,
+ /**
+ * @description 遮罩显示时的背景是否锁定
+ */
+ lockScroll: truthProp,
+ /**
+ * @description 自定义 popup 弹框样式
+ */
+ popStyle: {
+ type: Object as PropType,
+ },
+ /**
+ * @description 取消文案
+ */
+ cancelTxt: makeStringProp(''),
+ /**
+ * @description 设置列表项标题展示使用参数
+ */
+ optionTag: makeStringProp('name'),
+ /**
+ * @description 设置列表项二级标题展示使用参数
+ */
+ optionSubTag: makeStringProp('subname'),
+ /**
+ * @description 设置选中项的值,和 'option-tag' 的值对应
+ */
+ chooseTagValue: makeStringProp(''),
+ /**
+ * @description 设置列表项标题
+ */
+ title: makeStringProp(''),
+ /**
+ * @description 选中项颜色,当 choose-tag-value == option-tag 的值 生效
+ */
+ customColor: makeStringProp('#ee0a24'),
+ /**
+ * @description 设置列表项副标题/描述
+ */
+ description: makeStringProp(''),
+ /**
+ * @description 列表项
+ */
+ menuItems: makeArrayProp([]),
+ /**
+ * @description 遮罩层是否可关闭
+ */
+ closeAbled: truthProp,
+}
+
+export type ActionsheetProps = ExtractPropTypes
+
+export const actionsheetEmits = {
+ [CLOSE_EVENT]: () => true,
+ [UPDATE_VISIBLE_EVENT]: (val: boolean) => isBoolean(val),
+ [CANCEL_EVENT]: () => true,
+ [CHOOSE_EVENT]: (item: ActionSheetOption, index: number) => item instanceof Object && isNumber(index),
+}
+
+export type ActionsheetEmits = typeof actionsheetEmits
diff --git a/uni_modules/nutui-uni/components/actionsheet/actionsheet.vue b/uni_modules/nutui-uni/components/actionsheet/actionsheet.vue
new file mode 100644
index 0000000..3a5e687
--- /dev/null
+++ b/uni_modules/nutui-uni/components/actionsheet/actionsheet.vue
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+ {{ props.title }}
+
+
+
+
+
+
+ {{ props.description }}
+
+
+
+
+
+ {{ props.cancelTxt }}
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/actionsheet/index.scss b/uni_modules/nutui-uni/components/actionsheet/index.scss
new file mode 100644
index 0000000..689a1db
--- /dev/null
+++ b/uni_modules/nutui-uni/components/actionsheet/index.scss
@@ -0,0 +1,82 @@
+@import "../popup/index";
+
+.nut-theme-dark {
+ .nut-action-sheet {
+ .nut-action-sheet__cancel {
+ border-top: 1px solid $dark-background2;
+ }
+
+ .nut-action-sheet__title {
+ border-bottom: 1px solid $dark-background2;
+ }
+
+ .nut-action-sheet__cancel,
+ .nut-action-sheet__item,
+ .nut-action-sheet__title {
+ color: $dark-color;
+ background: $dark-background;
+ }
+ }
+}
+
+.nut-action-sheet {
+ display: block;
+
+ .nut-action-sheet__title {
+ display: block;
+ padding: 10px;
+ margin: 0;
+ font-size: $font-size-base;
+ color: $title-color;
+ text-align: center;
+ background-color: $white;
+ border-bottom: 1px solid $actionsheet-light-color;
+ }
+
+ .nut-action-sheet__menu {
+ display: block;
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ }
+
+ .nut-action-sheet__cancel,
+ .nut-action-sheet__item {
+ display: block;
+ padding: 10px;
+ font-size: $actionsheet-item-font-size;
+ line-height: $actionsheet-item-line-height;
+ color: $actionsheet-item-font-color;
+ text-align: center;
+ cursor: pointer;
+ background-color: #fff;
+ border-bottom: $actionsheet-item-border-bottom;
+ }
+
+ .nut-action-sheet__desc {
+ font-size: $actionsheet-item-font-size;
+ color: #999;
+ cursor: default;
+ }
+
+ .nut-action-sheet__subdesc {
+ display: block;
+ font-size: $actionsheet-item-subdesc-font-size;
+ color: #999;
+ }
+
+ .nut-action-sheet__item--disabled {
+ color: #e1e1e1 !important;
+ cursor: not-allowed;
+ }
+
+ .nut-action-sheet__item--loading {
+ cursor: default;
+ }
+
+ .nut-action-sheet__cancel {
+ margin-top: 5px;
+ border-top: $actionsheet-item-cancel-border-top;
+ }
+}
+
diff --git a/uni_modules/nutui-uni/components/actionsheet/index.ts b/uni_modules/nutui-uni/components/actionsheet/index.ts
new file mode 100644
index 0000000..d2a7f95
--- /dev/null
+++ b/uni_modules/nutui-uni/components/actionsheet/index.ts
@@ -0,0 +1 @@
+export * from './actionsheet'
diff --git a/uni_modules/nutui-uni/components/address/address.ts b/uni_modules/nutui-uni/components/address/address.ts
new file mode 100644
index 0000000..bfe8523
--- /dev/null
+++ b/uni_modules/nutui-uni/components/address/address.ts
@@ -0,0 +1,104 @@
+import type { ExtractPropTypes } from 'vue'
+import { CHANGE_EVENT, CLOSE_EVENT, SELECTED_EVENT, UPDATE_MODEL_EVENT, UPDATE_VISIBLE_EVENT } from '../_constants'
+import { commonProps, isBoolean, makeArrayProp, makeNumericProp, makeStringProp, truthProp } from '../_utils'
+import { popupProps } from '../popup'
+import type { AddressExistRegionData, AddressRegionData, AddressType } from './type'
+
+export const addressProps = {
+ ...popupProps,
+ ...commonProps,
+ /**
+ * @description 设置默认选中值
+ */
+ modelValue: makeArrayProp([]),
+
+ /**
+ * @description 是否打开地址选择
+ */
+ visible: Boolean,
+
+ /**
+ * @description 地址选择类型:'exist' | 'custom' | 'custom2'
+ */
+ type: makeStringProp('custom'),
+
+ /**
+ * @description 自定义地址选择标题
+ */
+ customAddressTitle: makeStringProp(''),
+
+ /**
+ * @description 省份数据
+ */
+ province: makeArrayProp([]),
+
+ /**
+ * @description 城市数据
+ */
+ city: makeArrayProp([]),
+
+ /**
+ * @description 县区数据
+ */
+ country: makeArrayProp([]),
+
+ /**
+ * @description 乡镇数据
+ */
+ town: makeArrayProp([]),
+
+ /**
+ * @description 是否显示 '选择其他地区' 按钮。仅在类型为 'exist' 时生效
+ */
+ isShowCustomAddress: truthProp,
+
+ /**
+ * @description 现存地址列表
+ */
+ existAddress: makeArrayProp([]),
+
+ /**
+ * @description 已有地址标题
+ */
+ existAddressTitle: makeStringProp(''),
+
+ /**
+ * @description 切换自定义地址和已有地址的按钮标题
+ */
+ customAndExistTitle: makeStringProp(''),
+
+ /**
+ * @description 弹层中内容容器的高度
+ */
+ height: makeNumericProp('200'),
+
+ /**
+ * @description 列提示文字
+ */
+ columnsPlaceholder: {
+ type: [String, Array],
+ default: '',
+ },
+}
+
+export type AddressProps = ExtractPropTypes
+
+export const addressEmits = {
+ [UPDATE_VISIBLE_EVENT]: (val: boolean) => isBoolean(val),
+ [UPDATE_MODEL_EVENT]: () => true,
+ [CLOSE_EVENT]: (val: {
+ data: any
+ type: string
+ }) => val instanceof Object,
+ [CHANGE_EVENT]: (val: {
+ next?: string
+ value?: AddressRegionData
+ custom: string
+ }) => val instanceof Object,
+ switchModule: (val: { type: AddressType }) => val instanceof Object,
+ closeMask: (val: { closeWay: 'self' | 'mask' | 'cross' }) => val instanceof Object,
+ [SELECTED_EVENT]: (prevExistAdd: AddressExistRegionData, item: AddressExistRegionData, copyExistAdd: AddressExistRegionData[]) => prevExistAdd instanceof Object && item instanceof Object && copyExistAdd instanceof Object,
+
+}
+
+export type AddressEmits = typeof addressEmits
diff --git a/uni_modules/nutui-uni/components/address/address.vue b/uni_modules/nutui-uni/components/address/address.vue
new file mode 100644
index 0000000..4765c9c
--- /dev/null
+++ b/uni_modules/nutui-uni/components/address/address.vue
@@ -0,0 +1,443 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ getTabName(item, index) }}
+
+
+
+ {{ getTabName(null, selectedRegion.length) }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+ {{ item.phone }}
+
+
+
+
+
+ {{ item.provinceName + item.cityName + item.countyName + item.townName + item.addressDetail }}
+
+
+
+
+
+
+
+
+ {{
+ customAndExistTitle || translate('chooseAnotherAddress')
+ }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/address/index.scss b/uni_modules/nutui-uni/components/address/index.scss
new file mode 100644
index 0000000..be6d451
--- /dev/null
+++ b/uni_modules/nutui-uni/components/address/index.scss
@@ -0,0 +1,232 @@
+@import '../popup/index';
+@import '../elevator/index';
+
+.nut-theme-dark {
+ .nut-address {
+ &__header {
+ color: $dark-color;
+
+ &__title {
+ color: $dark-color;
+ }
+ }
+
+ .nut-address__custom {
+ .nut-address__region {
+ color: $dark-color;
+ }
+
+ .nut-address__detail {
+ .nut-address__detail-list {
+ .nut-address__detail-item {
+ color: $dark-color;
+ }
+ }
+ }
+ }
+
+ .nut-address__exist {
+ .nut-address__exist-group {
+ .nut-address__exist-group-list {
+ .nut-address__exist-group-item {
+ color: $dark-color;
+ }
+ }
+ }
+
+ .nut-address__exist-choose {
+ border-top: 1px solid $dark-background;
+ }
+ }
+
+ &-custom-buttom {
+ border-top: 1px solid $dark-background;
+ }
+ }
+}
+
+.nut-address {
+ display: block;
+
+ &__header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ height: 68px;
+ padding: 0 20px;
+ font-weight: bold;
+ color: #333;
+ text-align: center;
+
+ &__title {
+ display: block;
+ font-size: $address-header-title-font-size;
+ color: $address-header-title-color;
+ }
+ }
+
+ // 请选择
+ .nut-address__custom {
+ display: block;
+
+ .nut-address__region {
+ position: relative;
+ display: flex;
+
+ // margin-top: 32px;
+ padding: 0 20px;
+ font-size: $address-region-tab-font-size;
+ color: $address-region-tab-color;
+
+ .nut-address__region-item {
+ position: relative;
+ display: block;
+ min-width: 2px;
+ margin-right: 30px;
+
+ &.active {
+ font-weight: $address-region-tab-active-item-font-weight;
+ }
+
+ view {
+ display: block;
+ max-width: 100px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+
+
+
+ .nut-address__region-line--mini {
+ position: absolute;
+ bottom: -10px;
+ left: 0;
+ display: inline-block;
+ width: 0;
+ height: 3px;
+ margin-top: 5px;
+ background: $address-region-tab-line;
+ transition: 0.2s all linear;
+
+ &.active {
+ width: 26px;
+ }
+ }
+ }
+
+ .nut-address__region-line {
+ position: absolute;
+ bottom: -10px;
+ left: 20px;
+ display: inline-block;
+ width: 26px;
+ height: 3px;
+ margin-top: 5px;
+ background: $address-region-tab-line;
+ border-radius: $address-region-tab-line-border-radius;
+ opacity: $address-region-tab-line-opacity;
+ transition: 0.2s all linear;
+ }
+ }
+
+ .nut-address__detail {
+ display: block;
+ margin: 20px 20px 0;
+
+ .nut-address__detail-list {
+ // overflow-y: auto;
+ box-sizing: border-box;
+ height: 270px;
+ padding: 0;
+ padding-top: 15px;
+
+ .nut-address__detail-item {
+ display: flex;
+ align-items: center;
+ font-size: $address-region-item-font-size;
+ color: $address-region-item-color;
+
+ &.active {
+ font-weight: bold;
+ }
+
+ > view {
+ display: flex;
+ align-items: center;
+ margin: 10px 0;
+ }
+ }
+ }
+ }
+
+ .nut-address__elevator-group {
+ display: flex;
+ margin-top: 20px;
+ }
+ }
+
+ // 配送至
+ .nut-address__exist {
+ display: block;
+ margin-top: 15px;
+
+ .nut-address__exist-group {
+ height: 279px;
+ padding: 15px 20px 0;
+ overflow-y: scroll;
+
+ .nut-address__exist-group-list {
+ box-sizing: border-box;
+ padding: 0;
+
+ .nut-address__exist-group-item {
+ display: flex;
+ align-items: center;
+ margin-bottom: 20px;
+ font-size: $font-size-1;
+ line-height: 14px;
+ color: #333;
+
+ &.active {
+ font-weight: bold;
+ }
+
+ .exist-item-icon {
+ margin-right: $address-item-margin-right;
+ color: $address-icon-color !important;
+ }
+
+ // span {
+ // display: inline-block;
+ // flex: 1;
+ // }
+ }
+ }
+ }
+
+ .nut-address__exist-choose {
+ width: 100%;
+ height: 54px;
+ padding: 6px 0 0;
+ border-top: 1px solid #f2f2f2;
+
+ .nut-address__exist-choose-btn {
+ width: 90%;
+ height: 42px;
+ margin: auto;
+ font-size: 15px;
+ line-height: 42px;
+ color: $white;
+ text-align: center;
+ background: $button-primary-background-color;
+ border-radius: 21px;
+ }
+ }
+ }
+
+ &-select-icon {
+ margin-right: $address-item-margin-right;
+ color: $address-icon-color !important;
+ }
+}
diff --git a/uni_modules/nutui-uni/components/address/index.ts b/uni_modules/nutui-uni/components/address/index.ts
new file mode 100644
index 0000000..2fefb00
--- /dev/null
+++ b/uni_modules/nutui-uni/components/address/index.ts
@@ -0,0 +1,2 @@
+export * from './address'
+export * from './type'
diff --git a/uni_modules/nutui-uni/components/address/type.ts b/uni_modules/nutui-uni/components/address/type.ts
new file mode 100644
index 0000000..d96166e
--- /dev/null
+++ b/uni_modules/nutui-uni/components/address/type.ts
@@ -0,0 +1,23 @@
+export interface AddressRegionData {
+ name: string
+ [key: string]: any
+}
+
+export interface CustomRegionData {
+ title: string
+ list: any[]
+}
+
+export interface AddressExistRegionData {
+ id?: string | number
+ provinceName: string
+ cityName: string
+ countyName: string
+ townName: string
+ addressDetail: string
+ selectedAddress: boolean
+ [key: string]: any
+}
+
+export const addressType = ['exist', 'custom', 'custom2'] as const
+export type AddressType = (typeof addressType)[number]
diff --git a/uni_modules/nutui-uni/components/addresslist/addresslist.ts b/uni_modules/nutui-uni/components/addresslist/addresslist.ts
new file mode 100644
index 0000000..1695345
--- /dev/null
+++ b/uni_modules/nutui-uni/components/addresslist/addresslist.ts
@@ -0,0 +1,42 @@
+import type { ExtractPropTypes } from 'vue'
+import { commonProps, isNumber, isString, makeArrayProp, makeObjectProp, truthProp } from '../_utils'
+import type { AddressListOptions } from './type'
+
+export const addresslistProps = {
+ ...commonProps,
+ /**
+ * @description 地址数组
+ */
+ data: makeArrayProp([]),
+ /**
+ * @description 长按功能
+ */
+ longPress: Boolean,
+ /**
+ * @description 右滑功能
+ */
+ swipeEdition: Boolean,
+ /**
+ * @description 是否展示底部按钮
+ */
+ showBottomButton: truthProp,
+ /**
+ * @description 自定义 `key` 值时,设置映射关系
+ */
+ options: makeObjectProp({}),
+}
+
+export type AddressListProps = ExtractPropTypes
+
+export const addresslistEmits = {
+ delIcon: (val: Event, item: unknown, index: number | string) => (val instanceof Object) && (item instanceof Object) && (isNumber(index) || isString(index)),
+ editIcon: (val: Event, item: unknown, index: number | string) => (val instanceof Object) && (item instanceof Object) && (isNumber(index) || isString(index)),
+ clickItem: (val: Event, item: unknown, index: number | string) => (val instanceof Object) && (item instanceof Object) && (isNumber(index) || isString(index)),
+ longCopy: (val: Event, item: unknown, index: number | string) => (val instanceof Object) && (item instanceof Object) && (isNumber(index) || isString(index)),
+ longSet: (val: Event, item: unknown, index: number | string) => (val instanceof Object) && (item instanceof Object) && (isNumber(index) || isString(index)),
+ longDel: (val: Event, item: unknown, index: number | string) => (val instanceof Object) && (item instanceof Object) && (isNumber(index) || isString(index)),
+ swipeDel: (val: Event, item: unknown, index: number | string) => (val instanceof Object) && (item instanceof Object) && (isNumber(index) || isString(index)),
+ add: (val: Event) => val instanceof Object,
+}
+
+export type AddressListEmits = typeof addresslistEmits
diff --git a/uni_modules/nutui-uni/components/addresslist/addresslist.vue b/uni_modules/nutui-uni/components/addresslist/addresslist.vue
new file mode 100644
index 0000000..2577aa5
--- /dev/null
+++ b/uni_modules/nutui-uni/components/addresslist/addresslist.vue
@@ -0,0 +1,165 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ translate('addAddress') }}
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/addresslist/compoents/Itemcontents.vue b/uni_modules/nutui-uni/components/addresslist/compoents/Itemcontents.vue
new file mode 100644
index 0000000..84343e2
--- /dev/null
+++ b/uni_modules/nutui-uni/components/addresslist/compoents/Itemcontents.vue
@@ -0,0 +1,154 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ props.item.addressName }}
+
+
+ {{ props.item.phone }}
+
+
+ {{ translate('default') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ props.item.fullAddress }}
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/addresslist/compoents/generalshell.vue b/uni_modules/nutui-uni/components/addresslist/compoents/generalshell.vue
new file mode 100644
index 0000000..2600c5a
--- /dev/null
+++ b/uni_modules/nutui-uni/components/addresslist/compoents/generalshell.vue
@@ -0,0 +1,335 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 复制地址
+
+
+ 设置默认
+
+
+ 删除地址
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 删除
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/addresslist/index.scss b/uni_modules/nutui-uni/components/addresslist/index.scss
new file mode 100644
index 0000000..5526de3
--- /dev/null
+++ b/uni_modules/nutui-uni/components/addresslist/index.scss
@@ -0,0 +1,42 @@
+@import "../button/index";
+@import "../swipe/index";
+
+.nut-theme-dark {
+ .nut-address-list {
+ &__bottom {
+ background-color: $dark-background2;
+ }
+ }
+}
+
+.nut-address-list {
+ overflow: hidden;
+
+ &:last-child {
+ padding-bottom: 84px;
+ }
+
+ &__bottom {
+ position: fixed;
+ right: 0;
+ bottom: 0;
+ bottom: constant(safe-area-inset-bottom);
+ bottom: env(safe-area-inset-bottom);
+ left: 0;
+ z-index: 100000;
+ box-sizing: border-box;
+ width: 100%;
+ padding: 12px 18px 24px;
+ background-color: $addresslist-bg;
+ }
+
+ .nut-address-list__mask-bottom {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 2000;
+ background-color: transparent;
+ }
+}
diff --git a/uni_modules/nutui-uni/components/addresslist/index.ts b/uni_modules/nutui-uni/components/addresslist/index.ts
new file mode 100644
index 0000000..5f66496
--- /dev/null
+++ b/uni_modules/nutui-uni/components/addresslist/index.ts
@@ -0,0 +1,2 @@
+export * from './addresslist'
+export * from './type'
diff --git a/uni_modules/nutui-uni/components/addresslist/type.ts b/uni_modules/nutui-uni/components/addresslist/type.ts
new file mode 100644
index 0000000..d911cbb
--- /dev/null
+++ b/uni_modules/nutui-uni/components/addresslist/type.ts
@@ -0,0 +1,3 @@
+export interface AddressListOptions {
+ [key: string]: string
+}
diff --git a/uni_modules/nutui-uni/components/animate/animate.ts b/uni_modules/nutui-uni/components/animate/animate.ts
new file mode 100644
index 0000000..d45d426
--- /dev/null
+++ b/uni_modules/nutui-uni/components/animate/animate.ts
@@ -0,0 +1,44 @@
+import type { ExtractPropTypes } from 'vue'
+import { CLICK_EVENT } from '../_constants'
+import { commonProps, makeNumericProp, makeStringProp } from '../_utils'
+import type { AnimateAction, AnimateType } from './type'
+
+export const animateProps = {
+ ...commonProps,
+ /**
+ * @description 控制动画,当值从 false 变为 true 时会触发一次动画
+ */
+ show: Boolean,
+
+ /**
+ * @description 动画类型
+ * @values 'fade', 'slide', 'zoom', ...
+ */
+ type: makeStringProp(''),
+
+ /**
+ * @description 是否循环执行。`true`-循环执行; `false`-执行一次
+ */
+ loop: Boolean,
+
+ /**
+ * @description 动画时长,单位 ms
+ */
+ duration: makeNumericProp(500),
+
+ /**
+ * @description (不能与 show 同时使用)触发方式,`initial`-初始化执行; `click`-点击执行
+ * @values 'initial', 'click'
+ * @default initial
+ */
+ action: makeStringProp('initial'),
+}
+
+export type AnimateProps = ExtractPropTypes
+
+export const animateEmits = {
+ [CLICK_EVENT]: (evt: MouseEvent) => evt instanceof Object,
+ animate: () => true,
+}
+
+export type AnimateEmits = typeof animateEmits
diff --git a/uni_modules/nutui-uni/components/animate/animate.vue b/uni_modules/nutui-uni/components/animate/animate.vue
new file mode 100644
index 0000000..311eaa3
--- /dev/null
+++ b/uni_modules/nutui-uni/components/animate/animate.vue
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/animate/index.scss b/uni_modules/nutui-uni/components/animate/index.scss
new file mode 100644
index 0000000..30adace
--- /dev/null
+++ b/uni_modules/nutui-uni/components/animate/index.scss
@@ -0,0 +1,316 @@
+.nut-animate {
+ .nut-animate__container {
+ display: inline-block;
+ }
+
+ /* Animation css */
+ [class*="nut-animate-"] {
+ animation-duration: 0.5s;
+ animation-timing-function: ease-out;
+ animation-fill-mode: both;
+ }
+
+ // 抖动
+ .nut-animate-shake {
+ animation-name: shake;
+ }
+
+ // 心跳
+ .nut-animate-ripple {
+ animation-name: ripple;
+ }
+
+ // 漂浮
+ .nut-animate-float {
+ position: relative;
+ animation-name: float-pop;
+ }
+
+ // 呼吸灯
+ .nut-animate-breath {
+ animation-name: breath;
+ animation-duration: 2700ms;
+ animation-timing-function: ease-in-out;
+ animation-direction: alternate;
+ }
+
+ // 右侧向左侧划入
+ .nut-animate-slide-right {
+ animation-name: slide-right;
+ }
+
+ // 右侧向左侧划入
+ .nut-animate-slide-left {
+ animation-name: slide-left;
+ }
+
+ // 上面向下面划入
+ .nut-animate-slide-top {
+ animation-name: slide-top;
+ }
+
+ // 下面向上面划入
+ .nut-animate-slide-bottom {
+ animation-name: slide-bottom;
+ }
+
+ .nut-animate-jump {
+ transform-origin: center center;
+ animation: jump 0.7s linear;
+ }
+
+ // 循环
+ .loop {
+ animation-iteration-count: infinite;
+ }
+
+ // 抖动动画
+ @keyframes shake {
+ 0%,
+ 100% {
+ transform: translateX(0);
+ }
+
+ 10% {
+ transform: translateX(-9px);
+ }
+
+ 20% {
+ transform: translateX(8px);
+ }
+
+ 30% {
+ transform: translateX(-7px);
+ }
+
+ 40% {
+ transform: translateX(6px);
+ }
+
+ 50% {
+ transform: translateX(-5px);
+ }
+
+ 60% {
+ transform: translateX(4px);
+ }
+
+ 70% {
+ transform: translateX(-3px);
+ }
+
+ 80% {
+ transform: translateX(2px);
+ }
+
+ 90% {
+ transform: translateX(-1px);
+ }
+ }
+
+ // 心跳
+ @keyframes ripple {
+ 0% {
+ transform: scale(1);
+ }
+
+ 50% {
+ transform: scale(1.1);
+ }
+ }
+
+ // 呼吸
+ @keyframes breath {
+ 0% {
+ transform: scale(1);
+ }
+
+ 50% {
+ transform: scale(1.1);
+ }
+
+ 100% {
+ transform: scale(1);
+ }
+ }
+
+ // 右侧向左侧划入
+ // stylelint-disable-next-line keyframes-name-pattern
+ @keyframes slide-right {
+ 0% {
+ opacity: 0;
+ transform: translateX(100%);
+ }
+
+ 100% {
+ opacity: 1;
+ transform: translateX(0);
+ }
+ }
+
+ // 左侧向右侧划入
+ // stylelint-disable-next-line keyframes-name-pattern
+ @keyframes slide-left {
+ 0% {
+ opacity: 0;
+ transform: translateX(-100%);
+ }
+
+ 100% {
+ opacity: 1;
+ transform: translateX(0);
+ }
+ }
+
+ // 上面向下面划入
+ // stylelint-disable-next-line keyframes-name-pattern
+ @keyframes slide-top {
+ 0% {
+ opacity: 0;
+ transform: translateY(-100%);
+ }
+
+ 100% {
+ opacity: 1;
+ transform: translateY(0);
+ }
+ }
+
+ // 下面向上面划入
+ // stylelint-disable-next-line keyframes-name-pattern
+ @keyframes slide-bottom {
+ 0% {
+ opacity: 0;
+ transform: translateY(100%);
+ }
+
+ 100% {
+ opacity: 1;
+ transform: translateY(0);
+ }
+ }
+
+ // 漂浮 float
+ // stylelint-disable-next-line keyframes-name-pattern
+ @keyframes float-pop {
+ 0% {
+ top: 0;
+ }
+
+ 25% {
+ top: 1px;
+ }
+
+ 50% {
+ top: 4px;
+ }
+
+ 75% {
+ top: 1px;
+ }
+
+ 100% {
+ top: 0;
+ }
+ }
+
+ // 跳跃
+ @keyframes jump {
+ 0% {
+ transform: rotate(0deg) translateY(0);
+ animation-timing-function: ease-in;
+ }
+
+ 25% {
+ transform: rotate(10deg) translateY(20 * 1px);
+ animation-timing-function: ease-out;
+ }
+
+ 50% {
+ transform: rotate(0deg) translateY(-10 * 1px);
+ animation-timing-function: ease-in;
+ }
+
+ 75% {
+ transform: rotate(-10deg) translateY(20 * 1px);
+ animation-timing-function: ease-out;
+ }
+
+ 100% {
+ transform: rotate(0deg) translateY(0);
+ animation-timing-function: ease-in;
+ }
+ }
+
+ .nut-animate-twinkle {
+ position: relative;
+
+ &::after,
+ &::before {
+ position: absolute;
+ right: 50%;
+ z-index: 1;
+ box-sizing: border-box;
+ width: 60 * 1px;
+ height: 60 * 1px;
+ margin-top: calc(-30 / 2) * 1px;
+ margin-right: calc(-60 / 2) * 1px;
+ content: "";
+ border: 4 * 1px solid rgb(255 255 255 / 60%);
+ border-radius: calc(60 / 2) * 1px;
+ transform: scale(0);
+ animation: twinkle 2s ease-out infinite;
+ }
+
+ &::after {
+ animation-delay: 0.4s;
+ }
+ }
+
+ // 水波
+ @keyframes twinkle {
+ 0% {
+ transform: scale(0);
+ }
+
+ 20% {
+ opacity: 1;
+ }
+
+ 50%,
+ 100% {
+ opacity: 0;
+ transform: scale(1.4);
+ }
+ }
+
+ .nut-animate-flicker {
+ position: relative;
+ overflow: hidden;
+
+ &::after {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100 * 1px;
+ height: 60 * 1px;
+ content: "";
+ background-image: linear-gradient(106deg, rgb(232 224 255 / 0%) 24%, #e8e0ff 91%);
+ filter: blur(3 * 1px);
+ opacity: 0.73;
+ transform: skewX(-20deg);
+ animation: flicker 1.5s linear infinite;
+ }
+ }
+
+ @keyframes flicker {
+ 0% {
+ transform: translateX(-100 * 1px) skewX(-20deg);
+ }
+
+ 40%,
+ 100% {
+ transform: translateX(150 * 1px) skewX(-20deg);
+ }
+ }
+}
diff --git a/uni_modules/nutui-uni/components/animate/index.ts b/uni_modules/nutui-uni/components/animate/index.ts
new file mode 100644
index 0000000..eba882c
--- /dev/null
+++ b/uni_modules/nutui-uni/components/animate/index.ts
@@ -0,0 +1 @@
+export * from './animate'
diff --git a/uni_modules/nutui-uni/components/animate/type.ts b/uni_modules/nutui-uni/components/animate/type.ts
new file mode 100644
index 0000000..9f69c4e
--- /dev/null
+++ b/uni_modules/nutui-uni/components/animate/type.ts
@@ -0,0 +1,4 @@
+export const animateType = ['shake', 'ripple', 'breath', 'float', 'slide-right', 'slide-left', 'slide-top', 'slide-bottom', 'jump', 'twinkle', 'flicker'] as const
+export type AnimateType = (typeof animateType)[number]
+export const animateAction = ['initial', 'click', ''] as const
+export type AnimateAction = (typeof animateAction)[number]
diff --git a/uni_modules/nutui-uni/components/avatar/avatar.ts b/uni_modules/nutui-uni/components/avatar/avatar.ts
new file mode 100644
index 0000000..cb13829
--- /dev/null
+++ b/uni_modules/nutui-uni/components/avatar/avatar.ts
@@ -0,0 +1,25 @@
+import type { ExtractPropTypes } from 'vue'
+import { commonProps, makeNumericProp, makeStringProp } from '../_utils'
+import type { AvatarShape, AvatarSize } from './type'
+
+export const avatarProps = {
+ ...commonProps,
+ /**
+ * @description 头像的大小,可选值为:`large`、`normal`、`small`,支持直接输入数字
+ */
+ size: makeNumericProp(undefined),
+ /**
+ * @description 头像的形状,可选值为:`square`、`round`
+ */
+ shape: makeStringProp(undefined),
+ /**
+ * @description 背景色
+ */
+ bgColor: makeStringProp('#eee'),
+ /**
+ * @description 字体颜色
+ */
+ customColor: makeStringProp('#666'),
+}
+
+export type AvatarProps = ExtractPropTypes
diff --git a/uni_modules/nutui-uni/components/avatar/avatar.vue b/uni_modules/nutui-uni/components/avatar/avatar.vue
new file mode 100644
index 0000000..d1ff1b8
--- /dev/null
+++ b/uni_modules/nutui-uni/components/avatar/avatar.vue
@@ -0,0 +1,139 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/avatar/index.scss b/uni_modules/nutui-uni/components/avatar/index.scss
new file mode 100644
index 0000000..c5d7585
--- /dev/null
+++ b/uni_modules/nutui-uni/components/avatar/index.scss
@@ -0,0 +1,55 @@
+.nut-avatar {
+ position: relative;
+ display: inline-block;
+ flex: 0 0 auto; // 防止被压缩
+ text-align: center;
+ vertical-align: top;
+ background-repeat: no-repeat;
+ background-position: center center;
+ background-size: 100% 100%;
+
+ image {
+ display: block;
+ width: 100%;
+ height: 100%;
+ }
+
+ .nut-icon {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ background-size: 100% 100%;
+ transform: translate(-50%, -50%);
+ }
+}
+
+.nut-avatar-large {
+ width: $avatar-large-width;
+ height: $avatar-large-height;
+ line-height: $avatar-large-height;
+}
+
+.nut-avatar-normal {
+ width: $avatar-normal-width;
+ height: $avatar-normal-height;
+ line-height: $avatar-normal-height;
+}
+
+.nut-avatar-small {
+ width: $avatar-small-width;
+ height: $avatar-small-height;
+ line-height: $avatar-small-height;
+}
+
+.nut-avatar-square {
+ border-radius: $avatar-square;
+}
+
+.nut-avatar-round {
+ border-radius: 50%;
+}
+
+.nut-avatar-square,
+.nut-avatar-round {
+ overflow: hidden;
+}
diff --git a/uni_modules/nutui-uni/components/avatar/index.ts b/uni_modules/nutui-uni/components/avatar/index.ts
new file mode 100644
index 0000000..f0d5b80
--- /dev/null
+++ b/uni_modules/nutui-uni/components/avatar/index.ts
@@ -0,0 +1,2 @@
+export * from './avatar'
+export * from './type'
diff --git a/uni_modules/nutui-uni/components/avatar/type.ts b/uni_modules/nutui-uni/components/avatar/type.ts
new file mode 100644
index 0000000..290df2a
--- /dev/null
+++ b/uni_modules/nutui-uni/components/avatar/type.ts
@@ -0,0 +1,16 @@
+export const avatarSize = ['large', 'normal', 'small'] as const
+export type AvatarSize = (typeof avatarSize)[number]
+
+export const avatarShape = ['round', 'square'] as const
+export type AvatarShape = (typeof avatarShape)[number]
+
+export interface AvatarFinalSize {
+ /**
+ * 是否为预设尺寸
+ */
+ preset: boolean
+ /**
+ * 尺寸值
+ */
+ value: string
+}
diff --git a/uni_modules/nutui-uni/components/avatargroup/avatargroup.ts b/uni_modules/nutui-uni/components/avatargroup/avatargroup.ts
new file mode 100644
index 0000000..3cffe90
--- /dev/null
+++ b/uni_modules/nutui-uni/components/avatargroup/avatargroup.ts
@@ -0,0 +1,50 @@
+import type { ExtractPropTypes } from 'vue'
+import { commonProps, makeNumericProp, makeStringProp } from '../_utils'
+import type { AvatarShape, AvatarSize } from '../avatar'
+
+export const AVATAR_GROUP_KEY = Symbol('avatarGroup')
+
+export const avatargroupProps = {
+ ...commonProps,
+ /**
+ * @description 显示的最大头像个数
+ */
+ maxCount: makeNumericProp(-1),
+
+ /**
+ * @description 头像数量超出时,会出现一个头像折叠元素,该元素内容可为`...`、`more`、`+N`
+ */
+ maxContent: makeStringProp(''),
+
+ /**
+ * @description 头像的大小,可选值为:`large`、`normal`、`small`,支持直接输入数字
+ */
+ size: makeNumericProp('normal'),
+
+ /**
+ * @description 头像的形状,可选值为:`square`、`round`
+ */
+ shape: makeStringProp('round'),
+
+ /**
+ * @description 头像折叠元素的字体颜色
+ */
+ maxColor: makeStringProp('#666'),
+
+ /**
+ * @description 头像折叠元素的背景色
+ */
+ maxBgColor: makeStringProp('#eee'),
+
+ /**
+ * @description 头像之间的间距
+ */
+ span: makeNumericProp('-8'),
+
+ /**
+ * @description 组合头像之间的层级方向,可选值为:`left`、`right`
+ */
+ zIndex: makeStringProp<'left' | 'right'>('left'),
+}
+
+export type AvatarGroupProps = ExtractPropTypes
diff --git a/uni_modules/nutui-uni/components/avatargroup/avatargroup.vue b/uni_modules/nutui-uni/components/avatargroup/avatargroup.vue
new file mode 100644
index 0000000..b50d382
--- /dev/null
+++ b/uni_modules/nutui-uni/components/avatargroup/avatargroup.vue
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+ {{ props.maxContent || foldCount }}
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/avatargroup/index.scss b/uni_modules/nutui-uni/components/avatargroup/index.scss
new file mode 100644
index 0000000..c4f9f08
--- /dev/null
+++ b/uni_modules/nutui-uni/components/avatargroup/index.scss
@@ -0,0 +1,12 @@
+.nut-avatar-group {
+ position: relative;
+ display: flex;
+ flex: 0 0 auto; // 防止被压缩
+ background-repeat: no-repeat;
+ background-position: center center;
+ background-size: 100% 100%;
+
+ .nut-avatar {
+ border: 1px solid #fff;
+ }
+}
diff --git a/uni_modules/nutui-uni/components/avatargroup/index.ts b/uni_modules/nutui-uni/components/avatargroup/index.ts
new file mode 100644
index 0000000..265b302
--- /dev/null
+++ b/uni_modules/nutui-uni/components/avatargroup/index.ts
@@ -0,0 +1 @@
+export * from './avatargroup'
diff --git a/uni_modules/nutui-uni/components/backtop/backtop.ts b/uni_modules/nutui-uni/components/backtop/backtop.ts
new file mode 100644
index 0000000..66fd616
--- /dev/null
+++ b/uni_modules/nutui-uni/components/backtop/backtop.ts
@@ -0,0 +1,44 @@
+import type { ExtractPropTypes } from 'vue'
+import { CLICK_EVENT } from '../_constants'
+import { commonProps, makeNumberProp, makeStringProp } from '../_utils'
+
+export const backtopProps = {
+ ...commonProps,
+ /**
+ * @description 滚动区域的高度
+ */
+ height: makeStringProp('100vh'),
+
+ /**
+ * @description 距离页面底部距离
+ */
+ bottom: makeNumberProp(20),
+
+ /**
+ * @description 距离页面右侧距离
+ */
+ right: makeNumberProp(10),
+
+ /**
+ * @description 页面垂直滚动多高后出现
+ */
+ distance: makeNumberProp(200),
+
+ /**
+ * @description 设置组件页面层级
+ */
+ zIndex: makeNumberProp(10),
+
+ /**
+ * @description 自定义图标颜色
+ */
+ customColor: String,
+}
+
+export type BacktopProps = ExtractPropTypes
+
+export const backtopEmits = {
+ [CLICK_EVENT]: (evt: MouseEvent) => evt instanceof Object,
+}
+
+export type BacktopEmits = typeof backtopEmits
diff --git a/uni_modules/nutui-uni/components/backtop/backtop.vue b/uni_modules/nutui-uni/components/backtop/backtop.vue
new file mode 100644
index 0000000..4dcc0c8
--- /dev/null
+++ b/uni_modules/nutui-uni/components/backtop/backtop.vue
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/backtop/index.scss b/uni_modules/nutui-uni/components/backtop/index.scss
new file mode 100644
index 0000000..aa01056
--- /dev/null
+++ b/uni_modules/nutui-uni/components/backtop/index.scss
@@ -0,0 +1,40 @@
+.nut-theme-dark {
+ .nut-backtop {
+ &.show {
+ color: $dark-color;
+ background: $dark-background;
+ border: 1px solid $dark-background;
+ }
+
+ &-main {
+ color:'#ffffff';
+ }
+ }
+}
+
+.nut-backtop {
+ position: fixed;
+ display: none;
+
+ &.show {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 40px;
+ height: 40px;
+ background: $white;
+ border: 1px solid $backtop-border-color;
+ border-radius: 50%;
+ }
+
+ &.show :active {
+ background: rgb(0 0 0 / 10%);
+ }
+
+ &-main {
+ color:'#000000';
+ transition: all 0.2s ease-in-out
+ }
+}
+
+
diff --git a/uni_modules/nutui-uni/components/backtop/index.ts b/uni_modules/nutui-uni/components/backtop/index.ts
new file mode 100644
index 0000000..60c2c78
--- /dev/null
+++ b/uni_modules/nutui-uni/components/backtop/index.ts
@@ -0,0 +1 @@
+export type * from './backtop'
diff --git a/uni_modules/nutui-uni/components/badge/badge.ts b/uni_modules/nutui-uni/components/badge/badge.ts
new file mode 100644
index 0000000..0d55a05
--- /dev/null
+++ b/uni_modules/nutui-uni/components/badge/badge.ts
@@ -0,0 +1,52 @@
+import type { ExtractPropTypes } from 'vue'
+import { commonProps, makeNumberProp, makeStringProp } from '../_utils'
+
+export const badgeProps = {
+ ...commonProps,
+ /**
+ * @description 显示的内容
+ */
+ value: [String, Number],
+ /**
+ * @description `value` 为数值时,最大值
+ */
+ max: makeNumberProp(10000),
+
+ /**
+ * @description 是否为小点
+ */
+ dot: Boolean,
+
+ /**
+ * @description 是否为气泡形状
+ * @since >v4.0.0
+ */
+ bubble: Boolean,
+
+ /**
+ * @description 是否隐藏
+ */
+ hidden: Boolean,
+
+ /**
+ * @description 上下偏移量,支持单位设置,可设置为:`5px` 等
+ */
+ top: makeStringProp('0'),
+
+ /**
+ * @description 左右偏移量,支持单位设置,可设置为:`5px` 等
+ */
+ right: makeStringProp('0'),
+
+ /**
+ * @description 徽标的 `z-index` 值
+ */
+ zIndex: makeNumberProp(10),
+
+ /**
+ * @description 徽标背景颜色
+ */
+ customColor: makeStringProp(''),
+}
+
+export type BadgeProps = ExtractPropTypes
diff --git a/uni_modules/nutui-uni/components/badge/badge.vue b/uni_modules/nutui-uni/components/badge/badge.vue
new file mode 100644
index 0000000..8aa762f
--- /dev/null
+++ b/uni_modules/nutui-uni/components/badge/badge.vue
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ content }}
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/badge/index.scss b/uni_modules/nutui-uni/components/badge/index.scss
new file mode 100644
index 0000000..cfa7383
--- /dev/null
+++ b/uni_modules/nutui-uni/components/badge/index.scss
@@ -0,0 +1,54 @@
+.nut-theme-dark {
+ .nut-badge {
+ &.show {
+ color: $dark-color;
+ background: $dark-background;
+ }
+ }
+}
+
+.nut-badge {
+ position: relative;
+ display: inline-block;
+
+ .nut-badge__icon {
+ position: absolute;
+ z-index: $badge-z-index;
+ display: flex;
+ align-items: center;
+ padding: $badge-icon-padding;
+ line-height: normal;
+ text-align: center;
+ background: $badge-background-color;
+ border-radius: $badge-border-radius;
+ transform: $badge-content-transform;
+ }
+
+ .nut-badge__content {
+ display: flex;
+ align-items: center;
+ transform: $badge-content-transform;
+
+ &--sup {
+ position: absolute;
+ padding: $badge-padding;
+ font-size: $badge-font-size;
+ font-weight: normal;
+ color: $badge-color;
+ text-align: center;
+ background: $badge-background-color;
+ border-radius: $badge-border-radius;
+ }
+
+ &--dot {
+ width: $badge-dot-width;
+ height: $badge-dot-height;
+ padding: $badge-dot-padding;
+ border-radius: $badge-dot-border-radius;
+ }
+
+ &--bubble {
+ border-bottom-left-radius: 0;
+ }
+ }
+}
diff --git a/uni_modules/nutui-uni/components/badge/index.ts b/uni_modules/nutui-uni/components/badge/index.ts
new file mode 100644
index 0000000..883be94
--- /dev/null
+++ b/uni_modules/nutui-uni/components/badge/index.ts
@@ -0,0 +1 @@
+export * from './badge'
diff --git a/uni_modules/nutui-uni/components/barrage/barrage.ts b/uni_modules/nutui-uni/components/barrage/barrage.ts
new file mode 100644
index 0000000..fcb8119
--- /dev/null
+++ b/uni_modules/nutui-uni/components/barrage/barrage.ts
@@ -0,0 +1,41 @@
+import type { ExtractPropTypes } from 'vue'
+import { commonProps, makeArrayProp, makeNumberProp, truthProp } from '../_utils'
+
+export const barrageProps = {
+ ...commonProps,
+ /**
+ * @description 弹幕列表数据
+ */
+ danmu: makeArrayProp([]),
+
+ /**
+ * @description 可视区域内每个弹幕出现的时间间隔
+ */
+ frequency: makeNumberProp(500),
+
+ /**
+ * @description 每个弹幕的滚动时间
+ */
+ speeds: makeNumberProp(5000),
+
+ /**
+ * @description 弹幕行数,分几行展示
+ */
+ rows: makeNumberProp(3),
+
+ /**
+ * @description 弹幕垂直距离
+ */
+ top: makeNumberProp(10),
+
+ /**
+ * @description 是否循环播放
+ */
+ loop: truthProp,
+}
+
+export type BarrageProps = ExtractPropTypes
+
+export interface BarrageInst {
+ add: (word: string) => void
+}
diff --git a/uni_modules/nutui-uni/components/barrage/barrage.vue b/uni_modules/nutui-uni/components/barrage/barrage.vue
new file mode 100644
index 0000000..1cdde68
--- /dev/null
+++ b/uni_modules/nutui-uni/components/barrage/barrage.vue
@@ -0,0 +1,132 @@
+
+
+
+
+
+
+
+
+
+ {{ item.length > 8 ? `${item.substr(0, 8)}...` : item }}
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/barrage/index.scss b/uni_modules/nutui-uni/components/barrage/index.scss
new file mode 100644
index 0000000..d59c49e
--- /dev/null
+++ b/uni_modules/nutui-uni/components/barrage/index.scss
@@ -0,0 +1,60 @@
+.nut-barrage {
+ position: absolute;
+ top: 0;
+ left: 0;
+ box-sizing: border-box;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+
+ --move-distance: '300%';
+
+ &__item {
+ position: absolute;
+ right: 0;
+ display: block;
+ width: 100px;
+ padding: 3px 25px;
+ font-size: 12px;
+ text-align: center;
+ white-space: pre;
+ background: linear-gradient(to right, rgb(0 0 0 / 15%), rgb(0 0 0 / 0%));
+ border-radius: 50px;
+ transform: translateX(100%);
+
+ &.move {
+ animation-name: moving;
+ animation-play-state: running;
+ animation-timing-function: linear;
+ will-change: transform;
+ }
+
+ @keyframes moving {
+ from {
+ transform: translateX(100%);
+ }
+
+ to {
+ transform: translateX(var(--move-distance));
+ }
+ }
+
+ @keyframes moving {
+ from {
+ transform: translateX(100%);
+ }
+
+ to {
+ transform: translateX(var(--move-distance));
+ }
+ }
+ }
+}
+
+.nut-theme-dark {
+ .nut-barrage {
+ .nut-barrage__item {
+ color: $dark-color-gray;
+ }
+ }
+}
diff --git a/uni_modules/nutui-uni/components/barrage/index.ts b/uni_modules/nutui-uni/components/barrage/index.ts
new file mode 100644
index 0000000..8277623
--- /dev/null
+++ b/uni_modules/nutui-uni/components/barrage/index.ts
@@ -0,0 +1 @@
+export type * from './barrage'
diff --git a/uni_modules/nutui-uni/components/button/button.ts b/uni_modules/nutui-uni/components/button/button.ts
new file mode 100644
index 0000000..dd454c9
--- /dev/null
+++ b/uni_modules/nutui-uni/components/button/button.ts
@@ -0,0 +1,139 @@
+import type { ButtonLang, ButtonOnAddgroupappEvent, ButtonOnAgreeprivacyauthorizationEvent, ButtonOnChooseaddressEvent, ButtonOnChooseavatarEvent, ButtonOnChooseinvoicetitleEvent, ButtonOnErrorEvent, ButtonOnGetphonenumberEvent, ButtonOnLaunchappEvent, ButtonOnLoginEvent, ButtonOnOpensettingEvent, ButtonOnSubscribeEvent, ButtonOpenType } from '@uni-helper/uni-app-types'
+import type { ExtractPropTypes, PropType } from 'vue'
+import { CLICK_EVENT } from '../_constants'
+import { commonProps, makeNumberProp, makeStringProp } from '../_utils'
+import type { ButtonFormType, ButtonShape, ButtonSize, ButtonType } from './type'
+
+export const buttonProps = {
+ ...commonProps,
+ /**
+ * @description 指定按钮按下去的样式类
+ */
+ hoverClass: makeStringProp('button-hover'),
+ /**
+ * @description 按住后多久出现点击态,单位毫秒
+ */
+ hoverStartTime: makeNumberProp(20),
+ /**
+ * @description 手指松开后点击态保留时间,单位毫秒
+ */
+ hoverStayTime: makeNumberProp(70),
+ /**
+ * @description 按钮颜色,支持传入 `linear-gradient` 渐变色
+ */
+ customColor: String,
+ /**
+ * @description 形状,可选值为 `square` `round`
+ */
+ shape: makeStringProp('round'),
+ /**
+ * @description 是否为朴素按钮
+ */
+ plain: Boolean,
+ /**
+ * @description 按钮 `loading` 状态
+ */
+ loading: Boolean,
+ /**
+ * @description 是否禁用按钮
+ */
+ disabled: Boolean,
+ /**
+ * @description 按钮类型,可选值为 `primary` `info` `warning` `danger` `success` `default`
+ */
+ type: makeStringProp('default'),
+ /**
+ * @description 表单类型,可选值 `button` `submit` `reset`
+ */
+ formType: makeStringProp('button'),
+ /**
+ * @description 尺寸,可选值为 `large` `small` `mini` `normal`
+ */
+ size: makeStringProp('normal'),
+ /**
+ * @description 是否为块级元素
+ */
+ block: Boolean,
+ /**
+ * @description 小程序开放能力
+ */
+ openType: String as PropType,
+ /**
+ * @description 指定返回用户信息的语言,zh_CN 简体中文,zh_TW 繁体中文,en 英文
+ */
+ lang: makeStringProp('en'),
+ /**
+ * @description 会话来源,openType="contact"时有效
+ */
+ sessionFrom: String,
+ /**
+ * @description 会话内消息卡片标题,openType="contact"时有效
+ */
+ sendMessageTitle: String,
+ /**
+ * @description 会话内消息卡片点击跳转小程序路径,openType="contact"时有效
+ */
+ sendMessagePath: String,
+ /**
+ * @description 会话内消息卡片图片,openType="contact"时有效
+ */
+ sendMessageImg: String,
+ /**
+ * @description 是否显示会话内消息卡片,设置此参数为 true,用户进入客服会话会在右下角显示"可能要发送的小程序"提示,用户点击后可以快速发送小程序消息,openType="contact"时有效
+ */
+ showMessageCard: Boolean,
+ /**
+ * @description 打开群资料卡时,传递的群号,openType="openGroupProfile"时有效
+ */
+ groupId: String,
+ /**
+ * @description 打开频道页面时,传递的频道号 openType="openGuildProfile"时有效
+ */
+ guildId: makeStringProp(''),
+ /**
+ * @description 打开公众号资料卡时,传递的号码 openType="openPublicProfile"时有效
+ */
+ publicId: String,
+ /**
+ * @description 客服的抖音号,openType="im"时有效
+ */
+ dataImId: String,
+ /**
+ * @description IM卡片类型,openType="im"时有效
+ */
+ dataImType: String,
+ /**
+ * @description 商品的id,仅支持泛知识课程库和生活服务商品库中的商品,openType="im"时有效
+ */
+ dataGoodsId: String,
+ /**
+ * @description 订单的id,仅支持交易2.0订单, openType="im"时有效
+ */
+ dataOrderId: String,
+ /**
+ * @description 商品类型,“1”代表生活服务,“2”代表泛知识。openType="im"时有效
+ */
+ dataBizLine: String,
+} as const
+
+export type ButtonProps = ExtractPropTypes
+
+export const buttonEmits = {
+ [CLICK_EVENT]: (evt: MouseEvent) => evt instanceof Object,
+ getphonenumber: (evt: ButtonOnGetphonenumberEvent) => evt instanceof Object,
+ getuserinfo: (evt: any) => evt instanceof Object,
+ error: (evt: ButtonOnErrorEvent) => evt instanceof Object,
+ opensetting: (evt: ButtonOnOpensettingEvent) => evt instanceof Object,
+ launchapp: (evt: ButtonOnLaunchappEvent) => evt instanceof Object,
+ contact: (evt: any) => evt instanceof Object,
+ chooseavatar: (evt: ButtonOnChooseavatarEvent) => evt instanceof Object,
+ agreeprivacyauthorization: (evt: ButtonOnAgreeprivacyauthorizationEvent) => evt instanceof Object,
+ addgroupapp: (evt: ButtonOnAddgroupappEvent) => evt instanceof Object,
+ chooseaddress: (evt: ButtonOnChooseaddressEvent) => evt instanceof Object,
+ chooseinvoicetitle: (evt: ButtonOnChooseinvoicetitleEvent) => evt instanceof Object,
+ subscribe: (evt: ButtonOnSubscribeEvent) => evt instanceof Object,
+ login: (evt: ButtonOnLoginEvent) => evt instanceof Object,
+ im: (evt: any) => evt instanceof Object,
+}
+
+export type ButtonEmits = typeof buttonEmits
diff --git a/uni_modules/nutui-uni/components/button/button.vue b/uni_modules/nutui-uni/components/button/button.vue
new file mode 100644
index 0000000..e6067ef
--- /dev/null
+++ b/uni_modules/nutui-uni/components/button/button.vue
@@ -0,0 +1,121 @@
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/button/index.scss b/uni_modules/nutui-uni/components/button/index.scss
new file mode 100644
index 0000000..f9c96e1
--- /dev/null
+++ b/uni_modules/nutui-uni/components/button/index.scss
@@ -0,0 +1,292 @@
+.nut-theme-dark {
+ .nut-button {
+ &--default {
+ color: $dark-color3;
+ background: $dark-background2;
+ border: $button-border-width solid $dark-background2;
+ }
+
+ &--plain {
+ background: $dark-background2;
+ }
+
+ &:not(.nut-button--hovercls) {
+ .nut-button--plain:not([disabled]):active {
+ background: $dark-background2;
+ }
+
+ .nut-button--default:not([disabled]):active {
+ color: $dark-color3;
+ background: $dark-background2;
+ border: $button-border-width solid $dark-background2;
+ }
+ }
+ }
+}
+
+.nut-button {
+ position: relative;
+ box-sizing: border-box;
+ display: inline-block;
+ flex-shrink: 0;
+ width: auto;
+ height: $button-default-height;
+ padding: 0;
+ margin: 0;
+ font-size: $button-default-font-size;
+ line-height: $button-default-line-height;
+ text-align: center;
+ vertical-align: bottom;
+ appearance: none;
+ touch-action: manipulation;
+ cursor: pointer;
+ user-select: none;
+ transition: opacity 0.2s;
+ -webkit-tap-highlight-color: rgb(0 0 0 / 0%);
+ -webkit-tap-highlight-color: transparent;
+
+ .nut-button__text {
+ margin-left: 5px;
+ }
+
+ &::before {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ width: 100%;
+ height: 100%;
+ content: "";
+ background-color: $black;
+ border: inherit;
+ border-color: $black;
+ border-radius: inherit;
+ opacity: 0;
+ transform: translate(-50%, -50%);
+ }
+
+ &::after {
+ display: none;
+ }
+
+ &:not(.nut-button--hovercls) {
+ &:active::before {
+ opacity: 0.1;
+ }
+ }
+
+ &__wrap {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+ height: 100%;
+ }
+
+ &--loading,
+ &--disabled {
+ &::before {
+ display: none;
+ }
+ }
+
+ &--default {
+ color: $button-default-color;
+ background: $button-default-bg-color;
+ background-origin: border-box;
+ border: $button-border-width solid $button-default-border-color;
+ }
+
+ &--primary {
+ color: $button-primary-color;
+ background: $button-primary-background-color;
+ background-origin: border-box;
+ border: $button-border-width solid transparent;
+ }
+
+ &--info {
+ color: $button-info-color;
+ background: $button-info-background-color;
+ background-origin: border-box;
+ border: $button-border-width solid transparent;
+ }
+
+ &--success {
+ color: $button-success-color;
+ background: $button-success-background-color;
+ background-origin: border-box;
+ border: $button-border-width solid transparent;
+ }
+
+ &--danger {
+ color: $button-danger-color;
+ background: $button-danger-background-color;
+ background-origin: border-box;
+ border: $button-border-width solid transparent;
+ }
+
+ &--warning {
+ color: $button-warning-color;
+ background: $button-warning-background-color;
+ background-origin: border-box;
+ border: $button-border-width solid transparent;
+ }
+
+ &--plain {
+ background: $button-plain-background-color;
+ background-origin: border-box;
+
+ &.nut-button--primary {
+ color: $button-primary-border-color;
+ border-color: $button-primary-border-color;
+ }
+
+ &.nut-button--info {
+ color: $button-info-border-color;
+ border-color: $button-info-border-color;
+ }
+
+ &.nut-button--success {
+ color: $button-success-border-color;
+ border-color: $button-success-border-color;
+ }
+
+ &.nut-button--danger {
+ color: $button-danger-border-color;
+ border-color: $button-danger-border-color;
+ }
+
+ &.nut-button--warning {
+ color: $button-warning-border-color;
+ border-color: $button-warning-border-color;
+ }
+
+ &:not(.nut-button--hovercls) {
+ &.nut-button--primary:not([disabled]):active {
+ color: $button-primary-border-color;
+ border-color: $button-primary-border-color;
+ }
+
+ &.nut-button--info:not([disabled]):active {
+ color: $button-info-border-color;
+ border-color: $button-info-border-color;
+ }
+
+ &.nut-button--success:not([disabled]):active {
+ color: $button-success-border-color;
+ border-color: $button-success-border-color;
+ }
+
+ &.nut-button--danger:not([disabled]):active {
+ color: $button-danger-border-color;
+ border-color: $button-danger-border-color;
+ }
+
+ &.nut-button--warning:not([disabled]):active {
+ color: $button-warning-border-color;
+ border-color: $button-warning-border-color;
+ }
+ }
+ }
+
+ &--large {
+ width: 100%;
+ height: $button-large-height;
+ font-size: $button-large-font-size;
+ line-height: $button-large-line-height;
+ }
+
+ &--normal {
+ padding: $button-default-padding;
+ font-size: $button-default-font-size;
+ }
+
+ &--small {
+ height: $button-small-height;
+ padding: $button-small-padding;
+ font-size: $button-small-font-size;
+ line-height: $button-small-line-height;
+
+ &.nut-button--round {
+ border-radius: $button-small-round-border-radius;
+ }
+ }
+
+ &--mini {
+ height: $button-mini-height;
+ padding: $button-mini-padding;
+ font-size: $button-mini-font-size;
+ line-height: $button-mini-line-height;
+ }
+
+ &--block {
+ display: block;
+ width: 100%;
+ }
+
+ &--disabled {
+ cursor: not-allowed;
+ opacity: $button-disabled-opacity;
+ }
+
+ &--loading {
+ cursor: default;
+ opacity: 0.9;
+ }
+
+ &--round {
+ border-radius: $button-border-radius;
+ }
+
+ &--square {
+ border-radius: 0;
+ }
+
+ &:not(.nut-button--hovercls) {
+ .nut-button--default:not([disabled]):active {
+ color: $button-default-color;
+ background: $button-default-bg-color;
+ background-origin: border-box;
+ border: $button-border-width solid $button-default-border-color;
+ }
+
+ .nut-button--primary:not([disabled]):active {
+ color: $button-primary-color;
+ background: $button-primary-background-color;
+ background-origin: border-box;
+ border: $button-border-width solid transparent;
+ }
+
+ .nut-button--info:not([disabled]):active {
+ color: $button-info-color;
+ background: $button-info-background-color;
+ background-origin: border-box;
+ border: $button-border-width solid transparent;
+ }
+
+ .nut-button--success:not([disabled]):active {
+ color: $button-success-color;
+ background: $button-success-background-color;
+ background-origin: border-box;
+ border: $button-border-width solid transparent;
+ }
+
+ .nut-button--danger:not([disabled]):active {
+ color: $button-danger-color;
+ background: $button-danger-background-color;
+ background-origin: border-box;
+ border: $button-border-width solid transparent;
+ }
+
+ .nut-button--warning:not([disabled]):active {
+ color: $button-warning-color;
+ background: $button-warning-background-color;
+ background-origin: border-box;
+ border: $button-border-width solid transparent;
+ }
+
+ .nut-button--plain:not([disabled]):active {
+ background: $button-plain-background-color;
+ background-origin: border-box;
+ }
+ }
+}
diff --git a/uni_modules/nutui-uni/components/button/index.ts b/uni_modules/nutui-uni/components/button/index.ts
new file mode 100644
index 0000000..5be113d
--- /dev/null
+++ b/uni_modules/nutui-uni/components/button/index.ts
@@ -0,0 +1,2 @@
+export * from './button'
+export * from './type'
diff --git a/uni_modules/nutui-uni/components/button/type.ts b/uni_modules/nutui-uni/components/button/type.ts
new file mode 100644
index 0000000..cf454ee
--- /dev/null
+++ b/uni_modules/nutui-uni/components/button/type.ts
@@ -0,0 +1,8 @@
+export const buttonType = ['default', 'primary', 'info', 'success', 'warning', 'danger'] as const
+export type ButtonType = (typeof buttonType)[number]
+export const buttonSize = ['large', 'normal', 'small', 'mini'] as const
+export type ButtonSize = (typeof buttonSize)[number]
+export const buttonShape = ['square', 'round'] as const
+export type ButtonShape = (typeof buttonShape)[number]
+export const buttonFormType = ['button', 'submit', 'reset'] as const
+export type ButtonFormType = (typeof buttonFormType)[number]
diff --git a/uni_modules/nutui-uni/components/calendar/calendar.ts b/uni_modules/nutui-uni/components/calendar/calendar.ts
new file mode 100644
index 0000000..3fe9e92
--- /dev/null
+++ b/uni_modules/nutui-uni/components/calendar/calendar.ts
@@ -0,0 +1,125 @@
+import type { ExtractPropTypes, PropType, StyleValue } from 'vue'
+import {
+ CHOOSE_EVENT,
+ CLOSE_EVENT,
+ CLOSED_EVENT,
+ OPEN_EVENT,
+ OPENED_EVENT,
+ SELECT_EVENT,
+ UPDATE_VISIBLE_EVENT,
+} from '../_constants'
+import { commonProps, getDay, makeNumberProp, makeStringProp, truthProp } from '../_utils'
+import { popupProps } from '../popup/popup'
+
+export const calendarProps = {
+ ...popupProps,
+ ...commonProps,
+ /**
+ * @description 是否可见
+ */
+ visible: Boolean,
+ /**
+ * @description 类型,日期单选 `one`,区间选择 `range`,日期多选 `multiple`,周选择 `week`
+ */
+ type: makeStringProp<'one' | 'range' | 'multiple' | 'week'>('one'),
+ /**
+ * @description 是否弹窗状态展示
+ */
+ poppable: truthProp,
+ /**
+ * @description 自动回填
+ */
+ isAutoBackFill: Boolean,
+ /**
+ * @description 显示标题
+ */
+ title: makeStringProp('日期选择'),
+ /**
+ * @description 默认值,单个日期选择为 `string`,其他为 `string[]`
+ */
+ defaultValue: {
+ type: [String, Array] as PropType,
+ },
+ /**
+ * @description 开始日期
+ */
+ startDate: makeStringProp(getDay(0)),
+ /**
+ * @description 结束日期
+ */
+ endDate: makeStringProp(getDay(365)),
+ /**
+ * @description 范围选择,开始信息文案
+ */
+ startText: makeStringProp('开始'),
+ /**
+ * @description 范围选择,结束信息文案
+ */
+ endText: makeStringProp('结束'),
+ /**
+ * @description 底部确认按钮文案
+ */
+ confirmText: makeStringProp('确认'),
+ /**
+ * @description 是否展示今天标记
+ */
+ showToday: truthProp,
+ /**
+ * @description 是否在展示日历标题
+ */
+ showTitle: truthProp,
+ /**
+ * @description 是否展示日期标题
+ */
+ showSubTitle: truthProp,
+ /**
+ * @description 是否启动滚动动画
+ */
+ toDateAnimation: truthProp,
+ /**
+ * @description 设置周起始日
+ */
+ firstDayOfWeek: makeNumberProp(0),
+ /**
+ * @description 一个用来判断该日期是否被禁用的函数,接受一个 `年 - 月 - 日` 作为参数。 应该返回一个 Boolean 值。
+ * @default undefined
+ */
+ disabledDate: Function,
+ /**
+ * @description 是否使用 footer 插槽,如果使用,此值必须为 true
+ */
+ footerSlot: Boolean,
+ /**
+ * @description 是否使用 btn 插槽,如果使用,此值必须为 true
+ */
+ btnSlot: Boolean,
+ /**
+ * @description 自定义弹窗样式
+ */
+ popStyle: {
+ type: [String, Object, Array] as PropType,
+ default: '',
+ },
+ /**
+ * @description 遮罩显示时的背景是否锁定
+ */
+ lockScroll: truthProp,
+}
+
+export type CalendarProps = ExtractPropTypes
+
+/* eslint-disable unused-imports/no-unused-vars */
+export const calendarEmits = {
+ [UPDATE_VISIBLE_EVENT]: (value: boolean) => true,
+ [CHOOSE_EVENT]: (value: string | object) => true,
+ [SELECT_EVENT]: (value: any) => true,
+ clickCloseIcon: () => true,
+ clickOverlay: () => true,
+ [OPEN_EVENT]: () => true,
+ [OPENED_EVENT]: () => true,
+ [CLOSE_EVENT]: () => true,
+ [CLOSED_EVENT]: () => true,
+}
+/* eslint-enable unused-imports/no-unused-vars */
+
+export type CalendarEmits = typeof calendarEmits
diff --git a/uni_modules/nutui-uni/components/calendar/calendar.vue b/uni_modules/nutui-uni/components/calendar/calendar.vue
new file mode 100644
index 0000000..03cd8b4
--- /dev/null
+++ b/uni_modules/nutui-uni/components/calendar/calendar.vue
@@ -0,0 +1,262 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/calendar/index.scss b/uni_modules/nutui-uni/components/calendar/index.scss
new file mode 100644
index 0000000..35586b1
--- /dev/null
+++ b/uni_modules/nutui-uni/components/calendar/index.scss
@@ -0,0 +1 @@
+@import "../popup/index";
diff --git a/uni_modules/nutui-uni/components/calendar/index.ts b/uni_modules/nutui-uni/components/calendar/index.ts
new file mode 100644
index 0000000..e00be3c
--- /dev/null
+++ b/uni_modules/nutui-uni/components/calendar/index.ts
@@ -0,0 +1 @@
+export * from './calendar'
diff --git a/uni_modules/nutui-uni/components/calendaritem/calendaritem.ts b/uni_modules/nutui-uni/components/calendaritem/calendaritem.ts
new file mode 100644
index 0000000..a6e76f1
--- /dev/null
+++ b/uni_modules/nutui-uni/components/calendaritem/calendaritem.ts
@@ -0,0 +1,99 @@
+import type { ExtractPropTypes } from 'vue'
+import { CHOOSE_EVENT, SELECT_EVENT } from '../_constants'
+import { commonProps, getDay, makeNumberProp, makeStringProp, truthProp } from '../_utils'
+
+export const calendaritemProps = {
+ ...commonProps,
+ /**
+ * @description 是否可见
+ */
+ visible: Boolean,
+ /**
+ * @description 类型,日期单选 `one`,区间选择 `range`,日期多选 `multiple`,周选择 `week`
+ */
+ type: makeStringProp<'one' | 'range' | 'multiple' | 'week'>('one'),
+ /**
+ * @description 是否弹窗状态展示
+ */
+ poppable: truthProp,
+ /**
+ * @description 自动回填
+ */
+ isAutoBackFill: Boolean,
+ /**
+ * @description 显示标题
+ */
+ title: makeStringProp('日期选择'),
+ /**
+ * @description 默认值,单个日期选择为 `string`,其他为 `string[]`
+ */
+ defaultValue: {
+ type: [String, Array],
+ },
+ /**
+ * @description 开始日期
+ */
+ startDate: makeStringProp(getDay(0)),
+ /**
+ * @description 结束日期
+ */
+ endDate: makeStringProp(getDay(365)),
+ /**
+ * @description 范围选择,开始信息文案
+ */
+ startText: makeStringProp('开始'),
+ /**
+ * @description 范围选择,结束信息文案
+ */
+ endText: makeStringProp('结束'),
+ /**
+ * @description 底部确认按钮文案
+ */
+ confirmText: makeStringProp('确认'),
+ /**
+ * @description 是否展示今天标记
+ */
+ showToday: truthProp,
+ /**
+ * @description 是否在展示日历标题
+ */
+ showTitle: truthProp,
+ /**
+ * @description 是否展示日期标题
+ */
+ showSubTitle: truthProp,
+ /**
+ * @description 是否启动滚动动画
+ */
+ toDateAnimation: truthProp,
+ /**
+ * @description 设置周起始日
+ */
+ firstDayOfWeek: makeNumberProp(0),
+ /**
+ * @description 一个用来判断该日期是否被禁用的函数,接受一个 `年 - 月 - 日` 作为参数。 应该返回一个 Boolean 值。
+ * @default undefined
+ */
+ disabledDate: Function,
+ /**
+ * @description 是否使用 footer 插槽,如果使用,此值必须为 true
+ */
+ footerSlot: Boolean,
+ /**
+ * @description 是否使用 btn 插槽,如果使用,此值必须为 true
+ */
+ btnSlot: Boolean,
+}
+
+export type CalendarItemProps = ExtractPropTypes
+
+/* eslint-disable unused-imports/no-unused-vars */
+export const calendaritemEmits = {
+ [CHOOSE_EVENT]: (value: string | object) => true,
+ [SELECT_EVENT]: (value: any) => true,
+ update: () => true,
+ close: () => true,
+}
+/* eslint-enable unused-imports/no-unused-vars */
+
+export type CalendarItemEmits = typeof calendaritemEmits
diff --git a/uni_modules/nutui-uni/components/calendaritem/calendaritem.vue b/uni_modules/nutui-uni/components/calendaritem/calendaritem.vue
new file mode 100644
index 0000000..d93236f
--- /dev/null
+++ b/uni_modules/nutui-uni/components/calendaritem/calendaritem.vue
@@ -0,0 +1,860 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ month.title }}
+
+
+
+
+
+
+
+
+
+ {{ day.type === 'curr' ? day.day : '' }}
+
+
+
+
+ {{ day.type === 'curr' ? day.day : '' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ translate('today') }}
+
+
+
+
+
+ {{ translate('today') }}
+
+
+
+
+ {{ props.startText || translate('start') }}
+
+
+
+ {{ props.endText || translate('end') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/calendaritem/index.scss b/uni_modules/nutui-uni/components/calendaritem/index.scss
new file mode 100644
index 0000000..e7cf3d3
--- /dev/null
+++ b/uni_modules/nutui-uni/components/calendaritem/index.scss
@@ -0,0 +1,270 @@
+.nut-theme-dark {
+ .nut-calendar {
+ $block: &;
+
+ &-item {
+ color: $dark-color;
+ background: $dark-background;
+ }
+
+ &__header {
+ color: $dark-color;
+ background: $dark-background;
+ }
+
+ &__content {
+ #{$block}__panel {
+ #{$block}__days {
+ #{$block}__day {
+ &--disabled {
+ color: $dark-calendar-disabled !important;
+ }
+ }
+
+ .calendar-month-day {
+ &-choose {
+ color: $calendar-choose-font-color;
+ background-color: $dark-calendar-choose-color;
+ }
+ }
+ }
+ }
+ }
+
+ &__footer {
+ color: $dark-color;
+ background: $dark-background2;
+ }
+ }
+}
+
+.nut-calendar {
+ $block: &;
+
+ &-item {
+ position: relative;
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+ height: 100%;
+ overflow: hidden;
+ font-size: 16px;
+ color: #333;
+ background-color: $white;
+ }
+
+ {$block}--nopop {
+ #{$block}__header {
+ #{$block}__header-title {
+ font-size: $calendar-base-font;
+ }
+ }
+ }
+
+ .popup-box {
+ height: 100%;
+ }
+
+ ::-webkit-scrollbar {
+ display: none;
+ }
+
+ &__header {
+ display: flex;
+ flex-direction: column;
+ padding-top: 1px;
+ text-align: center;
+ background-color: $white;
+
+ &-title {
+ font-size: $calendar-title-font;
+ font-weight: $calendar-title-font-weight;
+ line-height: 44px;
+ }
+
+ &-slot {
+ min-height: 24px;
+ }
+
+ &-subtitle {
+ padding: 7px 0;
+ font-size: $calendar-sub-title-font;
+ line-height: 22px;
+ }
+
+ #{$block}__weekdays {
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+ height: 36px;
+ border-radius: 0 0 12px 12px;
+ box-shadow: 0 4px 10px 0 rgba($color: #000, $alpha: 6%);
+
+ #{$block}__weekday {
+ &.weekend {
+ color: $calendar-day67-font-color;
+ }
+ }
+ }
+ }
+
+ &__content {
+ display: block;
+ flex: 1;
+ width: 100%;
+ overflow-y: auto;
+
+ #{$block}__panel {
+ position: relative;
+ box-sizing: border-box;
+ display: block;
+ width: 100%;
+ height: auto;
+
+ #{$block}__body {
+ display: block;
+ }
+
+ #{$block}__month {
+ display: flex;
+ flex-direction: column;
+ text-align: center;
+ }
+
+ view:nth-of-type(2) {
+ #{$block}__month-title {
+ padding-top: 0;
+ }
+ }
+
+ .calendar-loading-tip {
+ position: absolute;
+ top: -50px;
+ right: 0;
+ left: 0;
+ height: 50px;
+ font-size: $calendar-text-font;
+ line-height: 50px;
+ color: $text-color;
+ text-align: center;
+ }
+
+ #{$block}__month-title {
+ height: 23px;
+ margin: 8px 0;
+ font-size: $calendar-month-title-font-size;
+ line-height: 23px;
+ }
+
+ #{$block}__days {
+ overflow: hidden;
+
+ #{$block}__day {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ float: left;
+ width: 14.28%;
+ height: 64px;
+ font-weight: $calendar-day-font-weight;
+
+ &.weekend {
+ color: $calendar-day67-font-color;
+ }
+
+ #{$block}__day-tips {
+ position: absolute;
+ width: 100%;
+ }
+
+ #{$block}__day-tips--curr {
+ position: absolute;
+ bottom: 6px;
+ width: 100%;
+ font-size: 12px;
+ line-height: 14px;
+ }
+
+ #{$block}__day-tip {
+ position: absolute;
+ bottom: 6px;
+ width: 100%;
+ font-size: 12px;
+ line-height: 14px;
+ color: $calendar-primary-color;
+ }
+
+ #{$block}__day-tips--top {
+ top: 6px;
+ }
+
+ #{$block}__day-tips--bottom {
+ bottom: 6px;
+ }
+
+ &--active {
+ color: $white !important;
+ background-color: $calendar-primary-color;
+ border-radius: $calendar-day-active-border-radius;
+
+ #{$block}__day-tips {
+ visibility: hidden;
+ }
+
+ #{$block}__day-tips--curr {
+ visibility: hidden;
+ }
+
+ #{$block}__day-tip {
+ color: $white;
+ }
+ }
+
+ &--disabled {
+ color: $calendar-disable-color !important;
+ }
+
+ &--choose {
+ color: $calendar-choose-font-color;
+
+ &::after {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ content: "";
+ background-color: $calendar-choose-color;
+ opacity: 0.09;
+ }
+ }
+
+ #{$block}__day-value {
+ padding: 2px 0;
+ font-size: $calendar-day-font;
+ }
+ }
+ }
+ }
+ }
+
+ &__footer {
+ display: flex;
+ width: 100%;
+ height: 62px;
+ background-color: $white;
+
+ #{$block}__confirm {
+ width: 100%;
+ height: 44px;
+ margin: 10px 18px;
+ line-height: 44px;
+ color: $white;
+ text-align: center;
+ background: $button-primary-background-color;
+ border-radius: 22px;
+ }
+ }
+}
diff --git a/uni_modules/nutui-uni/components/calendaritem/index.ts b/uni_modules/nutui-uni/components/calendaritem/index.ts
new file mode 100644
index 0000000..b76db7a
--- /dev/null
+++ b/uni_modules/nutui-uni/components/calendaritem/index.ts
@@ -0,0 +1 @@
+export * from './calendaritem'
diff --git a/uni_modules/nutui-uni/components/calendaritem/types.ts b/uni_modules/nutui-uni/components/calendaritem/types.ts
new file mode 100644
index 0000000..a64b695
--- /dev/null
+++ b/uni_modules/nutui-uni/components/calendaritem/types.ts
@@ -0,0 +1,65 @@
+export interface TouchParam {
+ startY: number
+ endY: number
+ startTime: number
+ endTime: number
+ lastY: number
+ lastTime: number
+}
+
+export type InputDate = string | string[]
+export type StringArr = string[]
+
+export interface CalendarState {
+ yearMonthTitle: string
+ currDate: string | string[]
+ propStartDate: string
+ propEndDate: string
+ currentIndex: number
+ unLoadPrev: boolean
+ touchParams: TouchParam
+ transformY: number
+ translateY: number
+ scrollDistance: number
+ defaultData: InputDate
+ chooseData: (string | string[])[]
+ monthsData: MonthInfo[]
+ dayPrefix: string
+ startData: InputDate
+ endData: InputDate
+ isRange: boolean
+ timer: number
+ avgHeight: number
+ monthsNum: number
+ defaultRange: number[]
+}
+
+export interface CalendarTaroState extends CalendarState {
+ scrollTop: number
+ containerHeight: string
+}
+
+export interface CalendarDateProp {
+ year: string
+ month: string
+}
+
+export interface Day {
+ day: string
+ type: string
+ year?: string
+ month?: string
+}
+
+export interface MonthInfo {
+ curData: string[] | string
+ title: string
+ monthData: Day[]
+ cssHeight: number
+ cssScrollHeight: number
+}
+
+export interface CalendarInst extends HTMLElement {
+ scrollToDate: (date: string) => void
+ initPosition: () => void
+}
diff --git a/uni_modules/nutui-uni/components/card/card.ts b/uni_modules/nutui-uni/components/card/card.ts
new file mode 100644
index 0000000..36ffc6d
--- /dev/null
+++ b/uni_modules/nutui-uni/components/card/card.ts
@@ -0,0 +1,47 @@
+import type { ExtractPropTypes } from 'vue'
+import { commonProps, makeStringProp, truthProp } from '../_utils'
+
+export const cardProps = {
+ ...commonProps,
+ /**
+ * @description 左侧图片 `Url`
+ */
+ imgUrl: makeStringProp(''),
+
+ /**
+ * @description 标题
+ */
+ title: makeStringProp(''),
+
+ /**
+ * @description 商品价格
+ */
+ price: makeStringProp(''),
+
+ /**
+ * @description 会员价格
+ */
+ vipPrice: makeStringProp(''),
+
+ /**
+ * @description 店铺介绍
+ */
+ shopDesc: makeStringProp(''),
+
+ /**
+ * @description 配送方式
+ */
+ delivery: makeStringProp(''),
+
+ /**
+ * @description 店铺名称
+ */
+ shopName: makeStringProp(''),
+
+ /**
+ * @description 是否需要价格展示
+ */
+ isNeedPrice: truthProp,
+}
+
+export type CardProps = ExtractPropTypes
diff --git a/uni_modules/nutui-uni/components/card/card.vue b/uni_modules/nutui-uni/components/card/card.vue
new file mode 100644
index 0000000..d4b07a8
--- /dev/null
+++ b/uni_modules/nutui-uni/components/card/card.vue
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ shopDesc }}
+
+
+ {{ delivery }}
+
+
+
+
+
+
+ {{ shopName }}
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/card/index.scss b/uni_modules/nutui-uni/components/card/index.scss
new file mode 100644
index 0000000..0fbdf34
--- /dev/null
+++ b/uni_modules/nutui-uni/components/card/index.scss
@@ -0,0 +1,112 @@
+@import '../price/index';
+@import '../tag/index';
+
+.nut-theme-dark {
+ .nut-card {
+ .nut-card__right {
+ color: $dark-color;
+ }
+ }
+}
+
+.nut-card {
+ display: flex;
+ width: 100%;
+
+ .nut-card__left {
+ flex-shrink: 0;
+ width: 120px;
+ height: 120px;
+ background-color: $card-left-background-color;
+ border-radius: $card-left-border-radius;
+
+ > image {
+ display: block;
+ width: 100%;
+ height: 100%;
+ }
+ }
+
+ .nut-card__right {
+ flex: 1;
+ padding: 0 10px 8px;
+
+ .nut-card__right__title {
+ display: -webkit-box;
+ overflow: hidden;
+ font-size: 14px;
+ line-height: 1.5;
+ word-break: break-all;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 2;
+ }
+
+ .nut-card__right__price {
+ display: flex;
+ align-items: center;
+ height: 18px;
+ margin-top: 9px;
+ line-height: 18px;
+
+ .nut-price {
+ .nut-price--symbol-large {
+ font-size: 12px;
+ }
+
+ .nut-price--large {
+ font-size: 18px;
+ }
+
+ .nut-price--decimal-large {
+ font-size: 12px;
+ }
+ }
+
+ .nut-card__right__price__origin {
+ :deep(.nut-price) {
+ margin-left: 2px;
+ color: #d2a448;
+
+ .nut-price--symbol-large {
+ font-size: 12px;
+ }
+
+ .nut-price--large {
+ font-size: 12px;
+ }
+
+ .nut-price--decimal-large {
+ font-size: 12px;
+ }
+ }
+ }
+
+ }
+
+ .nut-card__right__other {
+ display: flex;
+ align-items: center;
+ padding: 5px 0 2px;
+
+ .nut-tag {
+ padding: 0 2px;
+ margin-right: 5px;
+ font-size: $card-font-size-0;
+ border: none;
+ }
+ }
+
+ .nut-card__right__shop {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ margin-top: 4px;
+
+ .nut-card__right__shop__name {
+ font-size: 12px;
+ line-height: 1.5;
+ color: #999;
+ }
+ }
+ }
+}
diff --git a/uni_modules/nutui-uni/components/card/index.ts b/uni_modules/nutui-uni/components/card/index.ts
new file mode 100644
index 0000000..efb3293
--- /dev/null
+++ b/uni_modules/nutui-uni/components/card/index.ts
@@ -0,0 +1 @@
+export * from './card'
diff --git a/uni_modules/nutui-uni/components/cascader/cascader.ts b/uni_modules/nutui-uni/components/cascader/cascader.ts
new file mode 100644
index 0000000..bcbbad6
--- /dev/null
+++ b/uni_modules/nutui-uni/components/cascader/cascader.ts
@@ -0,0 +1,106 @@
+import type { ExtractPropTypes, PropType, StyleValue } from 'vue'
+import {
+ CHANGE_EVENT,
+ CLOSE_EVENT,
+ CLOSED_EVENT,
+ OPEN_EVENT,
+ OPENED_EVENT,
+ UPDATE_MODEL_EVENT,
+ UPDATE_VISIBLE_EVENT,
+} from '../_constants'
+import { commonProps, makeArrayProp, makeNumericProp, makeStringProp, truthProp } from '../_utils'
+import { popupProps } from '../popup/popup'
+import type { CascaderOption, CascaderValue } from './types'
+
+export const cascaderProps = {
+ ...popupProps,
+ ...commonProps,
+ /**
+ * @description 选中值,双向绑定
+ */
+ modelValue: Array,
+ /**
+ * @description 显示选择层
+ */
+ visible: Boolean,
+ /**
+ * @description 级联数据
+ */
+ options: makeArrayProp([]),
+ /**
+ * @description 是否开启动态加载
+ */
+ lazy: Boolean,
+ /**
+ * @description 动态加载回调,开启动态加载时生效
+ */
+ lazyLoad: Function,
+ /**
+ * @description 自定义 `options` 结构中 `value` 的字段
+ */
+ valueKey: makeStringProp('value'),
+ /**
+ * @description 自定义 `options` 结构中 `text` 的字段
+ */
+ textKey: makeStringProp('text'),
+ /**
+ * @description 自定义 `options` 结构中 `children` 的字段
+ */
+ childrenKey: makeStringProp('children'),
+ /**
+ * @description 当 `options` 为可转换为树形结构的扁平结构时,配置转换规则
+ */
+ convertConfig: Object,
+ /**
+ * @description 是否需要弹层展示(设置为 `false` 后,`title` 失效)
+ */
+ poppable: truthProp,
+ /**
+ * @description 标题
+ */
+ title: String,
+ /**
+ * @description 选中底部展示样式 可选值: 'line', 'smile'
+ */
+ titleType: makeStringProp<'line' | 'card' | 'smile'>('line'),
+ /**
+ * @description 标签栏字体尺寸大小 可选值: 'large', 'normal', 'small'
+ */
+ titleSize: makeStringProp<'large' | 'normal' | 'small'>('normal'),
+ /**
+ * @description 标签间隙
+ */
+ titleGutter: makeNumericProp(0),
+ /**
+ * @description 是否省略过长的标题文字
+ */
+ titleEllipsis: truthProp,
+ /**
+ * @description 自定义弹窗样式
+ */
+ popStyle: {
+ type: [String, Object, Array] as PropType,
+ default: '',
+ },
+ /**
+ * @description 遮罩显示时的背景是否锁定
+ */
+ lockScroll: truthProp,
+}
+
+export type CascaderProps = ExtractPropTypes
+
+/* eslint-disable unused-imports/no-unused-vars */
+export const cascaderEmits = {
+ [UPDATE_MODEL_EVENT]: (value: CascaderValue) => true,
+ [UPDATE_VISIBLE_EVENT]: (value: boolean) => true,
+ [CHANGE_EVENT]: (value: CascaderValue, nodes: CascaderOption[]) => true,
+ pathChange: (nodes: CascaderOption[]) => true,
+ [OPEN_EVENT]: () => true,
+ [OPENED_EVENT]: () => true,
+ [CLOSE_EVENT]: () => true,
+ [CLOSED_EVENT]: () => true,
+}
+/* eslint-enable unused-imports/no-unused-vars */
+
+export type CascaderEmits = typeof cascaderEmits
diff --git a/uni_modules/nutui-uni/components/cascader/cascader.vue b/uni_modules/nutui-uni/components/cascader/cascader.vue
new file mode 100644
index 0000000..b8bd676
--- /dev/null
+++ b/uni_modules/nutui-uni/components/cascader/cascader.vue
@@ -0,0 +1,171 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/cascader/helper.ts b/uni_modules/nutui-uni/components/cascader/helper.ts
new file mode 100644
index 0000000..47fcf38
--- /dev/null
+++ b/uni_modules/nutui-uni/components/cascader/helper.ts
@@ -0,0 +1,80 @@
+import type { CascaderConfig, CascaderOption, ConvertConfig } from './types'
+
+export function formatTree(tree: CascaderOption[], parent: CascaderOption | null, config: CascaderConfig): CascaderOption[] {
+ return tree.map((node: CascaderOption) => {
+ const { value: valueKey = 'value', text: textKey = 'text', children: childrenKey = 'children' } = config
+
+ const { [valueKey]: value, [textKey]: text, [childrenKey]: children, ...others } = node
+
+ const newNode: CascaderOption = {
+ loading: false,
+ ...others,
+ level: parent ? ((parent && parent.level) || 0) + 1 : 0,
+ value,
+ text,
+ children,
+ _parent: parent,
+ }
+
+ if (newNode.children && newNode.children.length)
+ newNode.children = formatTree(newNode.children, newNode, config)
+
+ return newNode
+ })
+}
+
+export function eachTree(tree: CascaderOption[], cb: (node: CascaderOption) => any): void {
+ let i = 0
+ let node: CascaderOption
+ /* eslint-disable no-cond-assign */
+ while ((node = tree[i++])) {
+ if (cb(node) === true)
+ break
+
+ if (node.children && node.children.length)
+ eachTree(node.children, cb)
+ }
+}
+
+const defaultConvertConfig = {
+ topId: null,
+ idKey: 'id',
+ pidKey: 'pid',
+ sortKey: '',
+}
+
+export function convertListToOptions(list: CascaderOption[], options: ConvertConfig): CascaderOption[] {
+ const mergedOptions = {
+ ...defaultConvertConfig,
+ ...(options || {}),
+ }
+
+ const { topId, idKey, pidKey, sortKey } = mergedOptions
+
+ let result: CascaderOption[] = []
+ let map: any = {}
+
+ list.forEach((node: CascaderOption) => {
+ node = { ...node }
+ const { [idKey]: id, [pidKey]: pid } = node
+ const children = (map[pid] = map[pid] || [])
+
+ if (!result.length && pid === topId)
+ result = children
+
+ children.push(node)
+
+ node.children = map[id] || (map[id] = [])
+ })
+
+ if (sortKey) {
+ Object.keys(map).forEach((i) => {
+ if (map[i].length > 1)
+ map[i].sort((a: CascaderOption, b: CascaderOption) => a[sortKey] - b[sortKey])
+ })
+ }
+
+ map = null
+
+ return result
+}
diff --git a/uni_modules/nutui-uni/components/cascader/index.scss b/uni_modules/nutui-uni/components/cascader/index.scss
new file mode 100644
index 0000000..b2456e2
--- /dev/null
+++ b/uni_modules/nutui-uni/components/cascader/index.scss
@@ -0,0 +1,110 @@
+.nut-theme-dark {
+ .nut-cascader {
+ .nut-tabs__titles {
+ background: $dark-background3 !important;
+ }
+
+ &__bar {
+ color: $dark-color;
+ background: $dark-background2;
+ }
+
+ &-item {
+ &__inner {
+ color: $dark-color-gray;
+ }
+ }
+ }
+}
+
+.nut-cascader {
+ .nut-tab-pane {
+ padding: 0;
+ }
+
+ .nut-tabs__titles {
+ padding: $cascader-tabs-item-padding;
+ background: #fff;
+ }
+
+ &-item {
+ width: 100%;
+ font-size: $cascader-font-size;
+ line-height: $cascader-line-height;
+
+ $block: &;
+
+ &.nut-tabs {
+ &.horizontal {
+ .nut-tabs__titles {
+ .nut-tabs__titles-item {
+ flex: initial;
+ padding: $cascader-tabs-item-padding;
+ white-space: nowrap;
+ }
+ }
+ }
+ }
+
+ &__inner {
+ display: flex;
+ align-items: center;
+ padding: $cascader-item-padding;
+ margin: 0;
+ font-size: $cascader-item-font-size;
+ color: $cascader-item-color;
+ cursor: pointer;
+ }
+
+ &__title {
+ flex: 1;
+ }
+
+ &__icon-check {
+ margin-left: 10px;
+ visibility: hidden;
+ }
+
+ &__icon-loading {
+ margin-left: 10px;
+ }
+
+ &.active {
+ &:not(.disabled) {
+ color: $cascader-item-active-color;
+ }
+
+ #{$block}__icon-check {
+ color: $cascader-item-active-color;
+ visibility: visible;
+ }
+ }
+
+ &.disabled {
+ cursor: not-allowed;
+ opacity: 0.6;
+ }
+ }
+
+ &__bar {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: $cascader-bar-padding;
+ font-size: $cascader-bar-font-size;
+ font-weight: bold;
+ line-height: $cascader-bar-line-height;
+ color: $cascader-bar-color;
+ text-align: center;
+ }
+
+ &-pane {
+ display: block;
+ width: 100%;
+ height: 342px;
+ padding: 10px 0 0;
+ margin: 0;
+ overflow-y: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
diff --git a/uni_modules/nutui-uni/components/cascader/index.ts b/uni_modules/nutui-uni/components/cascader/index.ts
new file mode 100644
index 0000000..f005850
--- /dev/null
+++ b/uni_modules/nutui-uni/components/cascader/index.ts
@@ -0,0 +1 @@
+export * from './cascader'
diff --git a/uni_modules/nutui-uni/components/cascader/tree.ts b/uni_modules/nutui-uni/components/cascader/tree.ts
new file mode 100644
index 0000000..6abec51
--- /dev/null
+++ b/uni_modules/nutui-uni/components/cascader/tree.ts
@@ -0,0 +1,73 @@
+import { eachTree, formatTree } from './helper'
+import type { CascaderConfig, CascaderOption, CascaderValue } from './types'
+
+class Tree {
+ nodes: CascaderOption[]
+ readonly config: CascaderConfig
+
+ constructor(nodes: CascaderOption[], config?: CascaderConfig) {
+ this.config = {
+ value: 'value',
+ text: 'text',
+ children: 'children',
+ ...(config || {}),
+ }
+ this.nodes = formatTree(nodes, null, this.config)
+ }
+
+ updateChildren(nodes: CascaderOption[], parent: CascaderOption | null): void {
+ if (!parent)
+ this.nodes = formatTree(nodes, null, this.config)
+
+ else
+ parent.children = formatTree(nodes, parent, this.config)
+ }
+
+ // for test
+ getNodeByValue(value: CascaderOption['value']): CascaderOption | void {
+ let foundNode
+ eachTree(this.nodes, (node: CascaderOption) => {
+ if (node.value === value) {
+ foundNode = node
+ return true
+ }
+ })
+
+ return foundNode
+ }
+
+ getPathNodesByValue(value: CascaderValue): CascaderOption[] {
+ if (!value.length)
+ return []
+
+ const pathNodes = []
+ let currentNodes: CascaderOption[] | void = this.nodes
+
+ while (currentNodes && currentNodes.length) {
+ const foundNode: CascaderOption | void = currentNodes.find(node => node.value === value[node.level as number])
+
+ if (!foundNode)
+ break
+
+ pathNodes.push(foundNode)
+ currentNodes = foundNode.children
+ }
+
+ return pathNodes
+ }
+
+ isLeaf(node: CascaderOption, lazy: boolean): boolean {
+ const { leaf, children } = node
+ const hasChildren = Array.isArray(children) && Boolean(children.length)
+
+ return leaf == null ? !hasChildren && !lazy : leaf
+ }
+
+ hasChildren(node: CascaderOption, lazy: boolean): boolean {
+ if (lazy)
+ return Array.isArray(node.children) && Boolean(node.children.length)
+ return !this.isLeaf(node, lazy)
+ }
+}
+
+export default Tree
diff --git a/uni_modules/nutui-uni/components/cascader/types.ts b/uni_modules/nutui-uni/components/cascader/types.ts
new file mode 100644
index 0000000..2843c11
--- /dev/null
+++ b/uni_modules/nutui-uni/components/cascader/types.ts
@@ -0,0 +1,37 @@
+export interface CascaderPane {
+ nodes: CascaderOption[]
+ selectedNode: CascaderOption | null
+}
+
+export interface CascaderConfig {
+ value?: string
+ text?: string
+ children?: string
+}
+
+export interface CascaderTabs {
+ title: string
+ paneKey: string
+ disabled: boolean
+}
+
+export interface CascaderOption {
+ text?: string
+ value?: number | string
+ disabled?: boolean
+ children?: CascaderOption[]
+ leaf?: boolean
+ level?: number
+ loading?: boolean
+
+ [key: PropertyKey]: any
+}
+
+export type CascaderValue = CascaderOption['value'][]
+
+export interface ConvertConfig {
+ topId?: string | number | null
+ idKey?: string
+ pidKey?: string
+ sortKey?: string
+}
diff --git a/uni_modules/nutui-uni/components/cascaderitem/cascaderitem.ts b/uni_modules/nutui-uni/components/cascaderitem/cascaderitem.ts
new file mode 100644
index 0000000..a96140f
--- /dev/null
+++ b/uni_modules/nutui-uni/components/cascaderitem/cascaderitem.ts
@@ -0,0 +1,72 @@
+import type { ExtractPropTypes } from 'vue'
+import { CHANGE_EVENT, UPDATE_MODEL_EVENT } from '../_constants'
+import { commonProps, makeArrayProp, makeNumericProp, makeStringProp, truthProp } from '../_utils'
+import type { CascaderOption, CascaderValue } from '../cascader/types'
+
+export const cascaderitemProps = {
+ ...commonProps,
+ /**
+ * @description 选中值,双向绑定
+ */
+ modelValue: Array,
+ /**
+ * @description 显示选择层
+ */
+ visible: Boolean,
+ /**
+ * @description 级联数据
+ */
+ options: makeArrayProp([]),
+ /**
+ * @description 是否开启动态加载
+ */
+ lazy: Boolean,
+ /**
+ * @description 动态加载回调,开启动态加载时生效
+ */
+ lazyLoad: Function,
+ /**
+ * @description 自定义 `options` 结构中 `value` 的字段
+ */
+ valueKey: makeStringProp('value'),
+ /**
+ * @description 自定义 `options` 结构中 `text` 的字段
+ */
+ textKey: makeStringProp('text'),
+ /**
+ * @description 自定义 `options` 结构中 `children` 的字段
+ */
+ childrenKey: makeStringProp('children'),
+ /**
+ * @description 当 `options` 为可转换为树形结构的扁平结构时,配置转换规则
+ */
+ convertConfig: Object,
+ /**
+ * @description 选中底部展示样式 可选值: 'line', 'smile'
+ */
+ titleType: makeStringProp<'line' | 'card' | 'smile'>('line'),
+ /**
+ * @description 标签栏字体尺寸大小 可选值: 'large', 'normal', 'small'
+ */
+ titleSize: makeStringProp<'large' | 'normal' | 'small'>('normal'),
+ /**
+ * @description 标签间隙
+ */
+ titleGutter: makeNumericProp(0),
+ /**
+ * @description 是否省略过长的标题文字
+ */
+ titleEllipsis: truthProp,
+}
+
+export type CascaderItemProps = ExtractPropTypes
+
+/* eslint-disable unused-imports/no-unused-vars */
+export const cascaderitemEmits = {
+ [UPDATE_MODEL_EVENT]: (value: CascaderValue) => true,
+ [CHANGE_EVENT]: (value: CascaderValue, nodes: CascaderOption[]) => true,
+ pathChange: (value: CascaderOption[]) => true,
+}
+/* eslint-enable unused-imports/no-unused-vars */
+
+export type CascaderItemEmits = typeof cascaderitemEmits
diff --git a/uni_modules/nutui-uni/components/cascaderitem/cascaderitem.vue b/uni_modules/nutui-uni/components/cascaderitem/cascaderitem.vue
new file mode 100644
index 0000000..13dc9c2
--- /dev/null
+++ b/uni_modules/nutui-uni/components/cascaderitem/cascaderitem.vue
@@ -0,0 +1,339 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ node.text }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/cascaderitem/index.scss b/uni_modules/nutui-uni/components/cascaderitem/index.scss
new file mode 100644
index 0000000..347eb9a
--- /dev/null
+++ b/uni_modules/nutui-uni/components/cascaderitem/index.scss
@@ -0,0 +1,3 @@
+@import "../cascader/index";
+@import "../tabs/index";
+@import "../tabpane/index";
diff --git a/uni_modules/nutui-uni/components/cascaderitem/index.ts b/uni_modules/nutui-uni/components/cascaderitem/index.ts
new file mode 100644
index 0000000..7da781b
--- /dev/null
+++ b/uni_modules/nutui-uni/components/cascaderitem/index.ts
@@ -0,0 +1 @@
+export * from './cascaderitem'
diff --git a/uni_modules/nutui-uni/components/category/category.ts b/uni_modules/nutui-uni/components/category/category.ts
new file mode 100644
index 0000000..4956974
--- /dev/null
+++ b/uni_modules/nutui-uni/components/category/category.ts
@@ -0,0 +1,29 @@
+import type { ExtractPropTypes } from 'vue'
+import { CHANGE_EVENT } from '../_constants'
+import { commonProps, isNumber, makeArrayProp, makeStringProp } from '../_utils'
+
+export interface CategoryType {
+ catName?: string
+ [key: string]: any
+}
+
+export const categoryProps = {
+ ...commonProps,
+ /**
+ * @description 分类模式:`classify`,`text`,`custom`
+ */
+ type: makeStringProp<'classify' | 'text' | 'custom'>('classify'),
+
+ /**
+ * @description 左侧导航栏数据列表
+ */
+ category: makeArrayProp([]),
+}
+
+export type CategoryProps = ExtractPropTypes
+
+export const categoryEmits = {
+ [CHANGE_EVENT]: (index: number) => isNumber(index),
+}
+
+export type CategoryEmits = typeof categoryEmits
diff --git a/uni_modules/nutui-uni/components/category/category.vue b/uni_modules/nutui-uni/components/category/category.vue
new file mode 100644
index 0000000..5bb0435
--- /dev/null
+++ b/uni_modules/nutui-uni/components/category/category.vue
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+ {{ item.catName }}
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/category/index.scss b/uni_modules/nutui-uni/components/category/index.scss
new file mode 100644
index 0000000..4e37094
--- /dev/null
+++ b/uni_modules/nutui-uni/components/category/index.scss
@@ -0,0 +1,64 @@
+.nut-theme-dark {
+ .nut-category {
+ &__cateList {
+ background: $dark-background2;
+ }
+
+ &__cateListLeft {
+ background: $dark-background4;
+ }
+
+ &__cateListItem {
+ color: $dark-color-gray;
+ }
+
+ &__cateListItemChecked {
+ color: $dark-color;
+ background: $dark-background2;
+
+ &::before {
+ background: $category-list-item-checked-img-bg-color;
+ }
+ }
+ }
+}
+
+.nut-category {
+ &__cateList {
+ display: flex;
+ background: $category-bg-color;
+ }
+
+ &__cateListLeft {
+ background: $category-list-left-bg-color;
+ }
+
+ &__cateListItemChecked,
+ &__cateListItem {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 100px;
+ height: 50px;
+ font-size: 13px;
+ font-weight: normal;
+ color: $category-list-item-color;
+ transition: all 0.3s;
+ }
+
+ &__cateListItemChecked {
+ position: relative;
+ font-weight: 500;
+ background: $category-list-item-checked-color;
+ transition: all 0.3s;
+
+ &::before {
+ position: absolute;
+ left: 0;
+ width: 5px;
+ height: 18px;
+ content: "";
+ background: $category-list-item-checked-img-bg-color;
+ }
+ }
+}
diff --git a/uni_modules/nutui-uni/components/category/index.ts b/uni_modules/nutui-uni/components/category/index.ts
new file mode 100644
index 0000000..1d13c06
--- /dev/null
+++ b/uni_modules/nutui-uni/components/category/index.ts
@@ -0,0 +1 @@
+export * from './category'
diff --git a/uni_modules/nutui-uni/components/categorypane/categorypane.ts b/uni_modules/nutui-uni/components/categorypane/categorypane.ts
new file mode 100644
index 0000000..b694e6c
--- /dev/null
+++ b/uni_modules/nutui-uni/components/categorypane/categorypane.ts
@@ -0,0 +1,37 @@
+import type { ExtractPropTypes } from 'vue'
+import { commonProps, isString, makeArrayProp, makeStringProp } from '../_utils'
+
+export interface ChildType {
+ catName?: string
+ catType?: number
+ [key: string]: any
+}
+export interface CustomType {
+ catName?: string
+ [key: string]: any
+}
+export const categorypaneProps = {
+ ...commonProps,
+ /**
+ * @description 分类模式:`classify`,`text`,`custom`
+ */
+ type: makeStringProp<'classify' | 'text' | 'custom'>('classify'),
+
+ /**
+ * @description 右侧展示当前分类数据
+ */
+ categoryChild: makeArrayProp([]),
+
+ /**
+ * @description 自定义分类数据
+ */
+ customCategory: makeArrayProp([]),
+}
+
+export type CategoryPaneProps = ExtractPropTypes
+
+export const categorypaneEmits = {
+ onChange: (sku: string | object) => isString(sku) || sku === undefined || sku instanceof Object,
+}
+
+export type CategoryPaneEmits = typeof categorypaneEmits
diff --git a/uni_modules/nutui-uni/components/categorypane/categorypane.vue b/uni_modules/nutui-uni/components/categorypane/categorypane.vue
new file mode 100644
index 0000000..b2ba056
--- /dev/null
+++ b/uni_modules/nutui-uni/components/categorypane/categorypane.vue
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+ {{ item?.catName }}
+
+
+
+
+
+
+ {{ sku?.catName }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ item?.catName }}
+
+
+
+
+
+ {{ sku?.catName }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ sku?.catName }}
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/categorypane/index.scss b/uni_modules/nutui-uni/components/categorypane/index.scss
new file mode 100644
index 0000000..9d891ef
--- /dev/null
+++ b/uni_modules/nutui-uni/components/categorypane/index.scss
@@ -0,0 +1,79 @@
+.nut-theme-dark {
+ .nut-category-pane {
+ &__childTitle {
+ color: $white;
+ }
+
+ &__cateListRight {
+ background: $dark-background2;
+ }
+ }
+}
+
+.nut-category-pane {
+ &__cateListRight {
+ padding-left: 15px;
+ background: $category-bg-color;
+ }
+
+ &__childTitle {
+ margin-top: 15px;
+ margin-bottom: 15px;
+ font-size: 13px;
+ font-weight: 500;
+ color: $category-pane-title-color;
+ }
+
+ &__childItemList {
+ display: flex;
+ flex-wrap: wrap;
+ }
+
+ &__childItem {
+ margin-right: 10px;
+ }
+
+ &__childImg {
+ width: 75px;
+ height: 75px;
+ border-radius: 5px;
+ }
+
+ &__skuName {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 75px;
+ height: 40px;
+ margin-top: 15px;
+ margin-right: 10px;
+ margin-left: 15px;
+ font-size: 12px;
+ font-weight: normal;
+ color: $category-pane-gray-color;
+ border: 1px solid $category-pane-border-color;
+ border-radius: 5px;
+
+ &:nth-child(3n) {
+ margin-right: 0;
+ }
+
+ &:nth-child(n + 4) {
+ margin-top: 15px;
+ }
+ }
+
+ &__skuImg {
+ margin-top: 10px;
+ margin-bottom: 10px;
+ font-size: 12px;
+ font-weight: normal;
+ color: $category-pane-gray-color;
+ text-align: center;
+ }
+
+ &__selfItemList {
+ display: flex;
+ flex-wrap: wrap;
+ }
+}
diff --git a/uni_modules/nutui-uni/components/categorypane/index.ts b/uni_modules/nutui-uni/components/categorypane/index.ts
new file mode 100644
index 0000000..697c405
--- /dev/null
+++ b/uni_modules/nutui-uni/components/categorypane/index.ts
@@ -0,0 +1 @@
+export * from './categorypane'
diff --git a/uni_modules/nutui-uni/components/cell/cell.ts b/uni_modules/nutui-uni/components/cell/cell.ts
new file mode 100644
index 0000000..7f7d960
--- /dev/null
+++ b/uni_modules/nutui-uni/components/cell/cell.ts
@@ -0,0 +1,63 @@
+import type { ExtractPropTypes } from 'vue'
+import { CLICK_EVENT } from '../_constants'
+import { commonProps, makeNumericProp, makeStringProp } from '../_utils'
+
+export const cellProps = {
+ ...commonProps,
+ /**
+ * @description 标题名称
+ */
+ title: String,
+ /**
+ * @description 左侧副标题
+ */
+ subTitle: String,
+ /**
+ * @description 右侧描述
+ */
+ desc: String,
+ /**
+ * @description 右侧描述文本对齐方式 [text-align](https://www.w3school.com.cn/cssref/pr_text_text-align.asp)
+ */
+ descTextAlign: makeStringProp<'right' | 'left' | 'center' | 'justify' | 'inherit'>('right'),
+ /**
+ * @description 是否展示右侧箭头并开启点击反馈
+ */
+ isLink: Boolean,
+ /**
+ * @description 点击后跳转的目标路由对象,
+ */
+ to: String,
+ /**
+ * @description 圆角半径
+ */
+ roundRadius: makeNumericProp(undefined),
+ /**
+ * @description 是否使内容垂直居中
+ */
+ center: Boolean,
+ /**
+ * @description 单元格大小,可选值为 `large`
+ */
+ size: makeStringProp(''),
+ /**
+ * @description 是否启用点击效果
+ */
+ clickable: Boolean,
+ /**
+ * @description 左侧图标
+ */
+ icon: String,
+ /**
+ * @description 标题宽度
+ */
+ titleWidth: makeNumericProp(undefined),
+}
+
+export type CellProps = ExtractPropTypes
+
+export const cellEmits = {
+ [CLICK_EVENT]: (event: Event) => event instanceof Object,
+}
+
+export type CellEmits = typeof cellEmits
diff --git a/uni_modules/nutui-uni/components/cell/cell.vue b/uni_modules/nutui-uni/components/cell/cell.vue
new file mode 100644
index 0000000..3aef6ec
--- /dev/null
+++ b/uni_modules/nutui-uni/components/cell/cell.vue
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ props.title }}
+
+
+
+ {{ props.subTitle }}
+
+
+
+
+
+
+
+ {{ props.desc }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/cell/index.scss b/uni_modules/nutui-uni/components/cell/index.scss
new file mode 100644
index 0000000..b832d43
--- /dev/null
+++ b/uni_modules/nutui-uni/components/cell/index.scss
@@ -0,0 +1,110 @@
+.nut-theme-dark {
+ .nut-cell {
+ color: $dark-color;
+ background: $dark-background2;
+ box-shadow: none;
+ }
+}
+
+.nut-cell {
+ position: relative;
+ box-sizing: border-box;
+ display: flex;
+ width: 100%;
+ padding: $cell-padding;
+ margin: 10px 0;
+ font-size: $cell-title-font;
+ line-height: $cell-line-height;
+ color: $cell-color;
+ background: $cell-background;
+ border-radius: $cell-border-radius;
+ box-shadow: $cell-box-shadow;
+
+ &--center {
+ align-items: center;
+ }
+
+ &--large {
+ padding: $cell-large-padding;
+ font-size: $cell-large-title-font;
+
+ .nut-cell__title-desc {
+ font-size: $cell-large-title-desc-font;
+ }
+ }
+
+ &:last-child {
+ &::after {
+ border: 0 !important;
+ }
+ }
+
+ &::after {
+ position: absolute;
+ right: $cell-after-right;
+ bottom: 0;
+ left: 16px;
+ box-sizing: border-box;
+ pointer-events: none;
+ content: "";
+ transform: scaleY(0.5);
+ }
+
+ &:active::before {
+ opacity: 0.1;
+ }
+
+ &--clickable {
+ cursor: pointer;
+
+ &::before {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ width: 100%;
+ height: 100%;
+ content: "";
+ background-color: $black;
+ border: inherit;
+ border-color: $black;
+ border-radius: inherit;
+ opacity: 0;
+ transform: translate(-50%, -50%);
+ }
+ }
+
+ &__icon {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ margin: $cell-default-icon-margin;
+ }
+
+ &__title {
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+ min-width: 80px;
+
+ &-desc {
+ font-size: $cell-title-desc-font;
+ }
+ }
+
+ &__value {
+ display: inline-block;
+ flex: 1;
+ font-size: $cell-desc-font;
+ color: $cell-desc-color;
+ text-align: right;
+
+ &--alone {
+ color: $cell-color;
+ }
+ }
+
+ &__link {
+ align-self: center;
+ color: #979797;
+ }
+}
diff --git a/uni_modules/nutui-uni/components/cell/index.ts b/uni_modules/nutui-uni/components/cell/index.ts
new file mode 100644
index 0000000..dfef79e
--- /dev/null
+++ b/uni_modules/nutui-uni/components/cell/index.ts
@@ -0,0 +1 @@
+export * from './cell'
diff --git a/uni_modules/nutui-uni/components/cellgroup/cellgroup.ts b/uni_modules/nutui-uni/components/cellgroup/cellgroup.ts
new file mode 100644
index 0000000..2f8ff9e
--- /dev/null
+++ b/uni_modules/nutui-uni/components/cellgroup/cellgroup.ts
@@ -0,0 +1,16 @@
+import type { ExtractPropTypes } from 'vue'
+import { commonProps } from '../_utils'
+
+export const cellgroupProps = {
+ ...commonProps,
+ /**
+ * @description 标题名称
+ */
+ title: String,
+ /**
+ * @description 右侧描述
+ */
+ desc: String,
+}
+
+export type CellGroupProps = ExtractPropTypes
diff --git a/uni_modules/nutui-uni/components/cellgroup/cellgroup.vue b/uni_modules/nutui-uni/components/cellgroup/cellgroup.vue
new file mode 100644
index 0000000..33a40db
--- /dev/null
+++ b/uni_modules/nutui-uni/components/cellgroup/cellgroup.vue
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+ {{ props.title }}
+
+
+
+
+
+
+
+ {{ props.desc }}
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/cellgroup/index.scss b/uni_modules/nutui-uni/components/cellgroup/index.scss
new file mode 100644
index 0000000..cd5cf10
--- /dev/null
+++ b/uni_modules/nutui-uni/components/cellgroup/index.scss
@@ -0,0 +1,54 @@
+.nut-theme-dark {
+ .nut-cell-group {
+ &__wrap {
+ color: $dark-color;
+ background: $dark-background3;
+ box-shadow: none;
+ }
+ }
+}
+
+.nut-cell-group {
+ display: block;
+
+ &__title {
+ display: inherit;
+ padding: $cell-group-title-padding;
+ margin-top: 30px;
+ margin-bottom: 10px;
+ font-size: $cell-group-title-font-size;
+ line-height: $cell-group-title-line-height;
+ color: $cell-group-title-color;
+ }
+
+ &__desc {
+ display: inherit;
+ padding: $cell-group-desc-padding;
+ margin-top: 10px;
+ margin-bottom: 10px;
+ font-size: $cell-group-desc-font-size;
+ line-height: $cell-group-desc-line-height;
+ color: $cell-group-desc-color;
+ }
+
+ &__wrap {
+ display: inherit;
+ margin: 10px 0;
+ overflow: hidden;
+ background-color: $cell-group-background-color;
+ border-radius: $cell-border-radius;
+ box-shadow: $cell-box-shadow;
+
+ :deep(.nut-cell) {
+ margin: 0;
+ border-radius: 0;
+ box-shadow: none;
+ }
+ }
+
+ :deep(.nut-cell) {
+ &::after {
+ border-bottom: $cell-after-border-bottom;
+ }
+ }
+}
diff --git a/uni_modules/nutui-uni/components/cellgroup/index.ts b/uni_modules/nutui-uni/components/cellgroup/index.ts
new file mode 100644
index 0000000..fd053ad
--- /dev/null
+++ b/uni_modules/nutui-uni/components/cellgroup/index.ts
@@ -0,0 +1 @@
+export * from './cellgroup'
diff --git a/uni_modules/nutui-uni/components/checkbox/checkbox.ts b/uni_modules/nutui-uni/components/checkbox/checkbox.ts
new file mode 100644
index 0000000..bc0d48b
--- /dev/null
+++ b/uni_modules/nutui-uni/components/checkbox/checkbox.ts
@@ -0,0 +1,65 @@
+import type { ExtractPropTypes } from 'vue'
+import { CHANGE_EVENT, UPDATE_MODEL_EVENT } from '../_constants'
+import { commonProps, makeNumericProp, makeStringProp, nullableBooleanProp } from '../_utils'
+
+export const checkboxProps = {
+ ...commonProps,
+ /**
+ * @description 是否处于选中状态
+ */
+ modelValue: {
+ type: [Boolean, Number, String],
+ default: false,
+ },
+ /**
+ * @description 是否禁用选择
+ */
+ disabled: nullableBooleanProp,
+ /**
+ * @description 文本所在的位置,可选值:`left`,`right`
+ */
+ textPosition: makeStringProp<'left' | 'right'>('right'),
+ /**
+ * @description 图标大小,如 20px 2em 2rem
+ */
+ iconSize: makeNumericProp(''),
+ /**
+ * @description 复选框标识
+ */
+ label: [Boolean, Number, String],
+ /**
+ * @description 当前是否支持半选状态,一般用在全选操作中
+ */
+ indeterminate: Boolean,
+ /**
+ * @description 形状,可选值:`button`、`round`
+ */
+ shape: makeStringProp<'button' | 'round'>('round'),
+ /**
+ * @description 选中状态的值
+ */
+ checkedValue: {
+ type: [Boolean, Number, String],
+ default: true,
+ },
+ /**
+ * @description 未选中状态的值
+ */
+ uncheckedValue: {
+ type: [Boolean, Number, String],
+ default: false,
+ },
+}
+
+export type CheckboxProps = ExtractPropTypes
+
+/* eslint-disable unused-imports/no-unused-vars */
+export const checkboxEmits = {
+ [UPDATE_MODEL_EVENT]: (value: any) => true,
+ [CHANGE_EVENT]: (checked: boolean, value: any) => true,
+}
+/* eslint-enable unused-imports/no-unused-vars */
+
+export type CheckboxEmits = typeof checkboxEmits
+
+export const CHECKBOX_KEY = Symbol('nut-checkbox')
diff --git a/uni_modules/nutui-uni/components/checkbox/checkbox.vue b/uni_modules/nutui-uni/components/checkbox/checkbox.vue
new file mode 100644
index 0000000..2320c99
--- /dev/null
+++ b/uni_modules/nutui-uni/components/checkbox/checkbox.vue
@@ -0,0 +1,208 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/checkbox/index.scss b/uni_modules/nutui-uni/components/checkbox/index.scss
new file mode 100644
index 0000000..8ca34e3
--- /dev/null
+++ b/uni_modules/nutui-uni/components/checkbox/index.scss
@@ -0,0 +1,108 @@
+.nut-theme-dark {
+ .nut-checkbox {
+ &__label {
+ color: $dark-color;
+
+ &--disabled {
+ color: $checkbox-label-disable-color;
+ }
+ }
+
+ &__button {
+ color: $dark-color;
+ background: $dark-background;
+
+ &--disabled {
+ color: $checkbox-label-disable-color;
+ border: 1px solid $checkbox-label-disable-color;
+ }
+ }
+ }
+}
+
+.nut-checkbox {
+ display: $checkbox-display;
+ align-items: center;
+ margin-right: $checkbox-margin-right;
+ vertical-align: bottom;
+
+ &--reverse {
+ flex-direction: row-reverse;
+
+ .nut-checkbox__label {
+ margin-right: $checkbox-label-margin-left;
+ margin-left: 0;
+ }
+ }
+
+ &__button {
+ box-sizing: border-box;
+ display: inline-flex;
+ align-items: center;
+ padding: $checkbox-button-padding;
+ overflow: hidden;
+ font-size: $checkbox-button-font-size;
+ color: $checkbox-label-color;
+ background: $checkbox-button-background;
+ border: 1px solid $checkbox-button-border-color;
+ border-radius: $checkbox-button-border-radius;
+
+ &--active {
+ position: relative;
+ color: $checkbox-button-font-color-active;
+ background: transparent;
+ border: 1px solid $checkbox-button-border-color-active;
+
+ &::after {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ content: "";
+ background-color: $checkbox-button-background-active;
+ opacity: 0.05;
+ }
+ }
+
+ &--disabled {
+ color: $checkbox-label-disable-color;
+ border: none;
+ }
+ }
+
+ &__label {
+ flex: 1;
+ margin-left: $checkbox-label-margin-left;
+ font-size: $checkbox-label-font-size;
+ color: $checkbox-label-color;
+
+ &--disabled {
+ color: $checkbox-label-disable-color;
+ }
+ }
+
+ &__icon {
+ font-size: $checkbox-icon-font-size;
+ color: $primary-color;
+ transition-duration: 0.3s;
+ transition-property: color, border-color, background-color;
+ }
+
+ &__icon--unchecked {
+ font-size: $checkbox-icon-font-size;
+ color: $checkbox-icon-disable-color;
+ }
+
+ &__icon--indeterminate {
+ font-size: $checkbox-icon-font-size;
+ color: $primary-color;
+ }
+
+ &__icon--disabled,
+ // TODO 2.x移除
+ &__icon--disable {
+ font-size: $checkbox-icon-font-size;
+ color: $checkbox-icon-disable-color2;
+ }
+}
diff --git a/uni_modules/nutui-uni/components/checkbox/index.ts b/uni_modules/nutui-uni/components/checkbox/index.ts
new file mode 100644
index 0000000..31d7689
--- /dev/null
+++ b/uni_modules/nutui-uni/components/checkbox/index.ts
@@ -0,0 +1 @@
+export * from './checkbox'
diff --git a/uni_modules/nutui-uni/components/checkboxgroup/checkboxgroup.ts b/uni_modules/nutui-uni/components/checkboxgroup/checkboxgroup.ts
new file mode 100644
index 0000000..22a2e38
--- /dev/null
+++ b/uni_modules/nutui-uni/components/checkboxgroup/checkboxgroup.ts
@@ -0,0 +1,30 @@
+import type { ExtractPropTypes } from 'vue'
+import { CHANGE_EVENT, UPDATE_MODEL_EVENT } from '../_constants'
+import { commonProps, makeArrayProp, makeNumberProp, nullableBooleanProp } from '../_utils'
+
+export const checkboxgroupProps = {
+ ...commonProps,
+ /**
+ * @description 当前选中项的标识符,和 `label` 相对应
+ */
+ modelValue: makeArrayProp([]),
+ /**
+ * @description 是否禁用选择,将用于其下的全部复选框
+ */
+ disabled: nullableBooleanProp,
+ /**
+ * @description 限制选择的数量,不能和全选/取消/反选一起使用, 0表示没有限制
+ */
+ max: makeNumberProp(0),
+}
+
+export type CheckboxGroupProps = ExtractPropTypes
+
+/* eslint-disable unused-imports/no-unused-vars */
+export const checkboxgroupEmits = {
+ [UPDATE_MODEL_EVENT]: (value: any[]) => true,
+ [CHANGE_EVENT]: (value: any[]) => true,
+}
+/* eslint-enable unused-imports/no-unused-vars */
+
+export type CheckboxGroupEmits = typeof checkboxgroupEmits
diff --git a/uni_modules/nutui-uni/components/checkboxgroup/checkboxgroup.vue b/uni_modules/nutui-uni/components/checkboxgroup/checkboxgroup.vue
new file mode 100644
index 0000000..ac9520a
--- /dev/null
+++ b/uni_modules/nutui-uni/components/checkboxgroup/checkboxgroup.vue
@@ -0,0 +1,118 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/checkboxgroup/index.scss b/uni_modules/nutui-uni/components/checkboxgroup/index.scss
new file mode 100644
index 0000000..e69de29
diff --git a/uni_modules/nutui-uni/components/checkboxgroup/index.ts b/uni_modules/nutui-uni/components/checkboxgroup/index.ts
new file mode 100644
index 0000000..dd6e4fc
--- /dev/null
+++ b/uni_modules/nutui-uni/components/checkboxgroup/index.ts
@@ -0,0 +1,2 @@
+export * from './checkboxgroup'
+export * from './types'
diff --git a/uni_modules/nutui-uni/components/checkboxgroup/types.ts b/uni_modules/nutui-uni/components/checkboxgroup/types.ts
new file mode 100644
index 0000000..5ba0a69
--- /dev/null
+++ b/uni_modules/nutui-uni/components/checkboxgroup/types.ts
@@ -0,0 +1,16 @@
+export interface CheckboxGroupInst {
+ /**
+ * @description 全选/取消 传 true,表示全选,传 false,表示取消全选
+ */
+ toggleAll: (checked: boolean) => void
+ /**
+ * @description 反选
+ */
+ toggleReverse: () => void
+}
+
+// TODO 2.x移除
+/**
+ * @deprecated
+ */
+export type CheckBoxInst = CheckboxGroupInst
diff --git a/uni_modules/nutui-uni/components/circleprogress/circleprogress.ts b/uni_modules/nutui-uni/components/circleprogress/circleprogress.ts
new file mode 100644
index 0000000..348742f
--- /dev/null
+++ b/uni_modules/nutui-uni/components/circleprogress/circleprogress.ts
@@ -0,0 +1,36 @@
+import type { ExtractPropTypes } from 'vue'
+import { commonProps, makeNumericProp, makeStringProp, truthProp } from '../_utils'
+
+export const circleprogressProps = {
+ ...commonProps,
+ /**
+ * @description 进度百分比
+ */
+ progress: makeNumericProp(0),
+ /**
+ * @description 圆弧的宽度
+ */
+ strokeWidth: makeNumericProp(5),
+ /**
+ * @description 半径
+ */
+ radius: makeNumericProp(50),
+ /**
+ * @description 圆环进度条端点形状,可选值为 `square`、`round`、`butt`
+ */
+ strokeLinecap: makeStringProp<'butt' | 'round' | 'square'>('round'),
+ /**
+ * @description 圆环进度条颜色
+ */
+ customColor: { type: [String, Object], default: '#FF673E' },
+ /**
+ * @description 圆环轨道颜色
+ */
+ pathColor: makeStringProp('#d9d9d9'),
+ /**
+ * @description 是否顺时针展示
+ */
+ clockwise: truthProp,
+}
+
+export type CircleProgressProps = ExtractPropTypes
diff --git a/uni_modules/nutui-uni/components/circleprogress/circleprogress.vue b/uni_modules/nutui-uni/components/circleprogress/circleprogress.vue
new file mode 100644
index 0000000..2789bc9
--- /dev/null
+++ b/uni_modules/nutui-uni/components/circleprogress/circleprogress.vue
@@ -0,0 +1,113 @@
+
+
+
+
+
+
+
+
+
+ {{ progress }}%
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/circleprogress/index.scss b/uni_modules/nutui-uni/components/circleprogress/index.scss
new file mode 100644
index 0000000..a8dc775
--- /dev/null
+++ b/uni_modules/nutui-uni/components/circleprogress/index.scss
@@ -0,0 +1,33 @@
+.nut-theme-dark {
+ .nut-circle-progress{
+ .nut-circle-progress__text {
+ color: $dark-color;
+ }
+ }
+
+}
+
+.nut-circle-progress {
+ position: relative;
+
+ &__hover {
+ stroke: $circleprogress-primary-color;
+ transition: stroke-dasharray 0.6s ease 0s, stroke 0.6s ease 0s;
+ }
+
+ &__path {
+ stroke: $circleprogress-path-color;
+ }
+
+ &__text {
+ position: absolute;
+ top: 50%;
+ left: 0;
+ box-sizing: border-box;
+ width: 100%;
+ font-size: $circleprogress-text-size;
+ color: $circleprogress-text-color;
+ text-align: center;
+ transform: translateY(-50%);
+ }
+}
diff --git a/uni_modules/nutui-uni/components/circleprogress/index.ts b/uni_modules/nutui-uni/components/circleprogress/index.ts
new file mode 100644
index 0000000..cda4e24
--- /dev/null
+++ b/uni_modules/nutui-uni/components/circleprogress/index.ts
@@ -0,0 +1 @@
+export * from './circleprogress'
diff --git a/uni_modules/nutui-uni/components/codeinput/codeinput.ts b/uni_modules/nutui-uni/components/codeinput/codeinput.ts
new file mode 100644
index 0000000..a16e918
--- /dev/null
+++ b/uni_modules/nutui-uni/components/codeinput/codeinput.ts
@@ -0,0 +1,79 @@
+import type { ExtractPropTypes } from 'vue'
+import { CHANGE_EVENT, INPUT_EVENT, UPDATE_MODEL_EVENT } from '../_constants'
+import { commonProps, isNumber, isString, makeNumericProp, makeStringProp, truthProp } from '../_utils'
+
+export const codeinputProps = {
+ ...commonProps,
+ /**
+ * @description 键盘弹起时,是否自动上推页面
+ */
+ adjustPosition: truthProp,
+ /**
+ * @description 最大输入长度
+ */
+ maxlength: makeNumericProp(4),
+ /**
+ * @description 是否用圆点填充
+ */
+ dot: Boolean,
+ /**
+ * @description 显示模式,可选值:`box`-盒子模式,`line`-底部横线模式
+ */
+ mode: makeStringProp<'box' | 'line'>('box'),
+ /**
+ * @description 是否细边框
+ */
+ hairline: Boolean,
+ /**
+ * @description 字符间的距离
+ */
+ space: makeNumericProp(10),
+ /**
+ * @description 预置值
+ */
+ modelValue: makeNumericProp(''),
+ /**
+ * @description 是否自动获取焦点
+ */
+ focus: Boolean,
+ /**
+ * @description 字体是否加粗
+ */
+ bold: Boolean,
+ /**
+ * @description 字体颜色
+ */
+ customColor: makeStringProp('#606266'),
+ /**
+ * @description 字体大小
+ */
+ fontSize: makeNumericProp(18),
+ /**
+ * @description 输入框的大小,宽等于高
+ */
+ size: makeNumericProp(35),
+ /**
+ * @description 是否隐藏原生键盘,如果想用自定义键盘的话,需设置此参数为true
+ */
+ disabledKeyboard: Boolean,
+ /**
+ * @description 边框和线条颜色
+ */
+ borderColor: makeStringProp('#c9cacc'),
+ /**
+ * @description 是否禁止输入"."符号
+ */
+ disabledDot: truthProp,
+}
+
+export type CodeInputProps = ExtractPropTypes
+
+export const codeinputEmits = {
+ [CHANGE_EVENT]: (val: string) => isString(val),
+ [INPUT_EVENT]: (val: string) => isString(val),
+ finish: (val: string) => isString(val),
+ [UPDATE_MODEL_EVENT]: (val: number | string) => isString(val) || isNumber(val),
+
+}
+
+export type CodeInputEmits = typeof codeinputEmits
diff --git a/uni_modules/nutui-uni/components/codeinput/codeinput.vue b/uni_modules/nutui-uni/components/codeinput/codeinput.vue
new file mode 100644
index 0000000..f465e94
--- /dev/null
+++ b/uni_modules/nutui-uni/components/codeinput/codeinput.vue
@@ -0,0 +1,159 @@
+
+
+
+
+
+
+
+
+
+ {{ codeArray[index] }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/codeinput/index.scss b/uni_modules/nutui-uni/components/codeinput/index.scss
new file mode 100644
index 0000000..bbff092
--- /dev/null
+++ b/uni_modules/nutui-uni/components/codeinput/index.scss
@@ -0,0 +1,76 @@
+.nut-code-input {
+ position: relative;
+ display: flex;
+ overflow: hidden;
+
+ &__item {
+ position: relative;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ &__text {
+ font-size: 15px;
+ color: $code-input-content-color;
+ }
+
+ &__dot {
+ width: 7px;
+ height: 7px;
+ background-color: $title-color2;
+ border-radius: 100px;
+ }
+
+ &__line {
+ position: absolute;
+ bottom: 0;
+ width: 40px;
+ height: 4px;
+ background-color: $code-input-content-color;
+ border-radius: 100px;
+ }
+
+ /* #ifndef APP-PLUS */
+ &__cursor {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ width: $code-input-cursor-width;
+ height: $code-input-cursor-height;
+ transform: translate(-50%, -50%);
+ animation: $code-input-cursor-animation-duration nut-cursor-flicker infinite;
+ }
+
+ /* #endif */
+
+ }
+
+ &__input {
+ // 之所以需要input输入框,是因为有它才能唤起键盘
+ // 这里将它设置为两倍的屏幕宽度,再将左边的一半移出屏幕,为了不让用户看到输入的内容
+ position: absolute;
+ top: 0;
+ left: -325px;
+ width: 700px;
+ text-align: left;
+ background-color: transparent;
+ }
+}
+
+/* #ifndef APP-PLUS */
+// stylelint-disable-next-line keyframes-name-pattern
+@keyframes nut-cursor-flicker {
+ 0% {
+ opacity: 0;
+ }
+
+ 50% {
+ opacity: 1;
+ }
+
+ 100% {
+ opacity: 0;
+ }
+}
+
+/* #endif */
\ No newline at end of file
diff --git a/uni_modules/nutui-uni/components/codeinput/index.ts b/uni_modules/nutui-uni/components/codeinput/index.ts
new file mode 100644
index 0000000..2849b97
--- /dev/null
+++ b/uni_modules/nutui-uni/components/codeinput/index.ts
@@ -0,0 +1 @@
+export type * from './codeinput'
diff --git a/uni_modules/nutui-uni/components/col/col.ts b/uni_modules/nutui-uni/components/col/col.ts
new file mode 100644
index 0000000..29bcf1d
--- /dev/null
+++ b/uni_modules/nutui-uni/components/col/col.ts
@@ -0,0 +1,16 @@
+import type { ExtractPropTypes } from 'vue'
+import { commonProps, makeNumericProp } from '../_utils'
+
+export const colProps = {
+ ...commonProps,
+ /**
+ * @description 列元素宽度(共分为 24 份,例如设置一行3个,那么 `span` 值为 8)
+ */
+ span: makeNumericProp(24),
+ /**
+ * @description 列元素偏移距离
+ */
+ offset: makeNumericProp(0),
+}
+
+export type ColProps = ExtractPropTypes
diff --git a/uni_modules/nutui-uni/components/col/col.vue b/uni_modules/nutui-uni/components/col/col.vue
new file mode 100644
index 0000000..e532ace
--- /dev/null
+++ b/uni_modules/nutui-uni/components/col/col.vue
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/col/index.scss b/uni_modules/nutui-uni/components/col/index.scss
new file mode 100644
index 0000000..f9a6715
--- /dev/null
+++ b/uni_modules/nutui-uni/components/col/index.scss
@@ -0,0 +1,25 @@
+.nut-col {
+ box-sizing: border-box;
+ float: left;
+ word-break: break-all;
+
+ &-gutter {
+ &:last-child {
+ padding-right: 0 !important;
+ }
+
+ &:first-child {
+ padding-left: 0 !important;
+ }
+ }
+}
+
+@for $i from 1 through 24 {
+ .nut-col-offset-#{$i} {
+ margin-left: calc((100 / 24) * #{$i} * 1%);
+ }
+
+ .nut-col-#{$i} {
+ width: calc((100 / 24) * #{$i} * 1%);
+ }
+}
diff --git a/uni_modules/nutui-uni/components/col/index.ts b/uni_modules/nutui-uni/components/col/index.ts
new file mode 100644
index 0000000..3b475c5
--- /dev/null
+++ b/uni_modules/nutui-uni/components/col/index.ts
@@ -0,0 +1 @@
+export * from './col'
diff --git a/uni_modules/nutui-uni/components/collapse/collapse.ts b/uni_modules/nutui-uni/components/collapse/collapse.ts
new file mode 100644
index 0000000..439b931
--- /dev/null
+++ b/uni_modules/nutui-uni/components/collapse/collapse.ts
@@ -0,0 +1,24 @@
+import type { ExtractPropTypes, PropType } from 'vue'
+import { CHANGE_EVENT, UPDATE_MODEL_EVENT } from '../_constants'
+import { commonProps, isBoolean, isNumber, isString } from '../_utils'
+
+export const collapseProps = {
+ ...commonProps,
+ /**
+ * @description 当前展开面板的 `name`
+ */
+ modelValue: { type: [String, Number, Array] as PropType },
+ /**
+ * @description 是否开启手风琴模式
+ */
+ accordion: Boolean,
+}
+
+export type CollapseProps = ExtractPropTypes
+
+export const collapseEmits = {
+ [CHANGE_EVENT]: (val: string | number | (string | number)[], name: string | number, status: boolean) => isString(val) || isNumber(val) || (val instanceof Object && isNumber(name)) || (isString(name) && isBoolean(status)),
+ [UPDATE_MODEL_EVENT]: (val: string | number | (string | number)[]) => isString(val) || isNumber(val) || (val instanceof Object),
+}
+
+export type CollapseEmits = typeof collapseEmits
diff --git a/uni_modules/nutui-uni/components/collapse/collapse.vue b/uni_modules/nutui-uni/components/collapse/collapse.vue
new file mode 100644
index 0000000..ff9db70
--- /dev/null
+++ b/uni_modules/nutui-uni/components/collapse/collapse.vue
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/collapse/index.scss b/uni_modules/nutui-uni/components/collapse/index.scss
new file mode 100644
index 0000000..e69de29
diff --git a/uni_modules/nutui-uni/components/collapse/index.ts b/uni_modules/nutui-uni/components/collapse/index.ts
new file mode 100644
index 0000000..406b4d9
--- /dev/null
+++ b/uni_modules/nutui-uni/components/collapse/index.ts
@@ -0,0 +1 @@
+export type * from './collapse'
diff --git a/uni_modules/nutui-uni/components/collapseitem/collapseitem.ts b/uni_modules/nutui-uni/components/collapseitem/collapseitem.ts
new file mode 100644
index 0000000..263f266
--- /dev/null
+++ b/uni_modules/nutui-uni/components/collapseitem/collapseitem.ts
@@ -0,0 +1,49 @@
+import type { ExtractPropTypes, PropType } from 'vue'
+import { commonProps, makeNumericProp, makeRequiredProp, makeStringProp, truthProp } from '../_utils'
+
+export const collapseitemProps = {
+ ...commonProps,
+ /**
+ * @description 折叠面板的引用对象
+ */
+ collapseRef: Object,
+ /**
+ * @description 标题栏左侧内容,支持插槽传入(`props` 传入的优先级更高)
+ */
+ title: makeStringProp(''),
+ /**
+ * @description 唯一标识符,必填
+ */
+ name: {
+ ...makeRequiredProp([String, Number] as PropType),
+ default: -1,
+ },
+ /**
+ * @description 标题栏右侧内容,支持插槽传入(`props` 传入的优先级更高)
+ */
+ value: makeStringProp(''),
+ /**
+ * @description 标题栏描述信息
+ */
+ label: makeStringProp(''),
+ /**
+ * @description 标题栏是否禁用
+ */
+ disabled: Boolean,
+ /**
+ * @description 是否显示边框
+ * @type boolean
+ * @default true
+ */
+ border: truthProp,
+ /**
+ * @description 标题栏左侧图标组件,等同于 `nutui-icon` 组件
+ */
+ icon: makeStringProp('down-arrow'),
+ /**
+ * @description 点击折叠和展开的旋转角度,在自定义图标模式下生效
+ */
+ rotate: makeNumericProp(180),
+}
+
+export type CollapseItemProps = ExtractPropTypes
diff --git a/uni_modules/nutui-uni/components/collapseitem/collapseitem.vue b/uni_modules/nutui-uni/components/collapseitem/collapseitem.vue
new file mode 100644
index 0000000..e8d9eb8
--- /dev/null
+++ b/uni_modules/nutui-uni/components/collapseitem/collapseitem.vue
@@ -0,0 +1,180 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/collapseitem/index.scss b/uni_modules/nutui-uni/components/collapseitem/index.scss
new file mode 100644
index 0000000..fb7a262
--- /dev/null
+++ b/uni_modules/nutui-uni/components/collapseitem/index.scss
@@ -0,0 +1,181 @@
+.nut-theme-dark {
+ .nut-collapse-item {
+ .nut-collapse-item__title {
+ color: $dark-color;
+ background: $dark-background;
+ box-shadow: none;
+ }
+
+ .nut-collapse-item__title--disabled {
+ color: $dark-color-gray;
+
+ .collapse-icon {
+ color: $dark-color-gray;
+ }
+ }
+
+ // stylelint-disable selector-class-pattern
+
+ .nut-collapse__item-wrapper {
+ .collapse-content,
+ .nut-collapse__item-wrapper__content,
+ .nut-collapse__item-extraWrapper__extraRender {
+ color: $dark-color;
+ background: $dark-background2;
+ }
+ }
+
+ .nut-collapse__item-extraWrapper {
+ .nut-collapse__item-extraWrapper__extraRender,
+ .nut-collapse__item-wrapper__content {
+ background: $dark-background2;
+ }
+ }
+
+ // stylelint-enable selector-class-pattern
+ }
+}
+
+.nut-collapse-item__border {
+ .nut-collapse-item__title {
+ &::after {
+ position: absolute;
+ right: 16px;
+ bottom: 0;
+ left: 16px;
+ box-sizing: border-box;
+ pointer-events: none;
+ content: "";
+ border-bottom: 1px solid #ebedf0;
+ transform: scaleY(0.5);
+ }
+ }
+}
+
+.nut-collapse-item {
+ position: relative;
+
+ .nut-collapse-item__title {
+ position: relative;
+ box-sizing: border-box;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ width: 100%;
+ padding: $collapse-item-padding;
+ overflow: hidden;
+ font-size: $collapse-item-font-size;
+ line-height: $collapse-item-line-height;
+ color: $collapse-item-color;
+ background-color: #fff;
+
+ .nut-collapse-item__title-main {
+ flex: 1;
+ }
+
+ .nut-collapse-item__title-main-value {
+ display: block;
+
+ .nut-collapse-item__title-main-icon {
+ top: 2px;
+ }
+ }
+
+ .nut-collapse-item__title-icon {
+ // display: block;
+ // position: absolute;
+ // top: 50%;
+ // right: 16px;
+ display: flex;
+ align-items: center;
+ color: $collapse-item-icon-color;
+ transition: transform 0.3s;
+
+ &--expanded {
+ transform: rotate(-180deg);
+ }
+ }
+
+ .nut-collapse-item__title-sub {
+ position: absolute;
+ top: 50%;
+ right: 65px;
+ margin-top: -12px;
+ color: $collapse-item-sub-title-color;
+ }
+
+ .nut-collapse-item__title-label {
+ display: block;
+ font-size: 12px;
+ color: #969799;
+ }
+ }
+
+ // stylelint-disable selector-class-pattern
+
+ .nut-collapse__item-wrapper,
+ .nut-collapse__item-extraWrapper {
+ position: relative;
+ display: block;
+ height: 0;
+ overflow: hidden;
+ transition: height 0.3s ease-in-out;
+
+ .nut-collapse__item-wrapper__content,
+ .nut-collapse__item-extraWrapper__extraRender {
+ display: block;
+ padding: $collapse-wrapper-content-padding;
+ font-size: $collapse-wrapper-content-font-size;
+ line-height: $collapse-wrapper-content-line-height;
+ color: $collapse-wrapper-content-color;
+ background-color: $collapse-wrapper-content-background-color;
+ }
+
+ .nut-collapse__item-wrapper__content--empty {
+ padding: $collapse-wrapper-empty-content-padding;
+ }
+ }
+
+ .nut-collapse__item-extraWrapper {
+ height: auto;
+
+ .nut-collapse__item-extraWrapper__extraRender {
+ overflow: hidden;
+ word-break: break-all;
+ word-wrap: break-word;
+ }
+ }
+
+ // stylelint-enable selector-class-pattern
+
+ .open-style {
+ height: auto;
+ will-change: height;
+ }
+
+ .close-style {
+ will-change: auto;
+ }
+
+ .nut-collapse-item__title--disabled {
+ color: $collapse-item-disabled-color;
+ pointer-events: none;
+ cursor: not-allowed;
+
+ .collapse-icon {
+ color: $collapse-item-disabled-color;
+ }
+ }
+
+ .nut-collapse-item__title-mtitle {
+ display: inline-block;
+ }
+}
+
+.collapse-border-none {
+ .nut-collapse-item__title {
+ &::after {
+ display: none;
+ }
+ }
+}
diff --git a/uni_modules/nutui-uni/components/collapseitem/index.ts b/uni_modules/nutui-uni/components/collapseitem/index.ts
new file mode 100644
index 0000000..ec3990b
--- /dev/null
+++ b/uni_modules/nutui-uni/components/collapseitem/index.ts
@@ -0,0 +1 @@
+export type * from './collapseitem'
diff --git a/uni_modules/nutui-uni/components/comment/comment.ts b/uni_modules/nutui-uni/components/comment/comment.ts
new file mode 100644
index 0000000..ea0a209
--- /dev/null
+++ b/uni_modules/nutui-uni/components/comment/comment.ts
@@ -0,0 +1,60 @@
+import type { ExtractPropTypes } from 'vue'
+import { CLICK_EVENT } from '../_constants'
+import { commonProps, isString, makeArrayProp, makeObjectProp, makeStringProp } from '../_utils'
+import type { FollowType, ImagesType, InfoType, VideosType } from './type'
+
+export const commentProps = {
+ ...commonProps,
+ /**
+ * @description 头部样式展示类型,可选: `default`,`complex`
+ */
+ headerType: makeStringProp<'default' | 'complex'>('default'),
+ /**
+ * @description 评论图片展示行数,可选: `one`,`multi`
+ */
+ imagesRows: makeStringProp<'one' | 'multi'>('one'),
+ /**
+ * @description 设置评论内容省略行数
+ */
+ ellipsis: {
+ type: [String, Number, Boolean],
+ default: false,
+ },
+ /**
+ * @description 视频信息
+ */
+ videos: makeArrayProp([]),
+ /**
+ * @description 图片信息
+ */
+ images: makeArrayProp([]),
+ /**
+ * @description 评论详情
+ */
+ info: makeObjectProp({} as InfoType),
+ /**
+ * @description
+ */
+ labels: {
+ type: Function,
+ default: () => '',
+ },
+ /**
+ * @description 追评内容
+ */
+ follow: makeObjectProp({} as FollowType),
+ /**
+ * @description 配置底部按钮
+ */
+ operation: makeArrayProp<'replay' | 'like' | 'more'>(['replay', 'like', 'more']),
+}
+
+export type CommentProps = ExtractPropTypes
+
+export const commentEmits = {
+ [CLICK_EVENT]: (val: object) => val instanceof Object,
+ clickOperate: (val: string) => isString(val),
+ clickImages: (val: any) => val instanceof Object,
+}
+
+export type CommentEmits = typeof commentEmits
diff --git a/uni_modules/nutui-uni/components/comment/comment.vue b/uni_modules/nutui-uni/components/comment/comment.vue
new file mode 100644
index 0000000..bff9f96
--- /dev/null
+++ b/uni_modules/nutui-uni/components/comment/comment.vue
@@ -0,0 +1,122 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ info.content }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/comment/components/CmtBottom.vue b/uni_modules/nutui-uni/components/comment/components/CmtBottom.vue
new file mode 100644
index 0000000..55a321c
--- /dev/null
+++ b/uni_modules/nutui-uni/components/comment/components/CmtBottom.vue
@@ -0,0 +1,188 @@
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/comment/components/CmtHeader.vue b/uni_modules/nutui-uni/components/comment/components/CmtHeader.vue
new file mode 100644
index 0000000..63dba23
--- /dev/null
+++ b/uni_modules/nutui-uni/components/comment/components/CmtHeader.vue
@@ -0,0 +1,242 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ info.size }}
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/comment/components/CmtImages.vue b/uni_modules/nutui-uni/components/comment/components/CmtImages.vue
new file mode 100644
index 0000000..e1a3a4d
--- /dev/null
+++ b/uni_modules/nutui-uni/components/comment/components/CmtImages.vue
@@ -0,0 +1,228 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/comment/index.scss b/uni_modules/nutui-uni/components/comment/index.scss
new file mode 100644
index 0000000..8298321
--- /dev/null
+++ b/uni_modules/nutui-uni/components/comment/index.scss
@@ -0,0 +1,83 @@
+@import '../rate/index';
+
+.nut-theme-dark {
+ .nut-comment {
+ &__follow {
+ &-title {
+ color: $dark-color;
+ }
+ }
+
+
+ .nut-comment-shop {
+ border-top: 1px solid $dark-color;
+ }
+ }
+}
+
+.nut-comment {
+ width: 100%;
+ font-size: 12px;
+
+
+
+ &__main {
+ display: -webkit-box;
+ overflow: hidden;
+ word-break: break-all;
+ white-space: pre-wrap;
+ -webkit-box-orient: vertical;
+ }
+
+
+
+
+
+ &__follow {
+ &-title {
+ position: relative;
+ padding-left: 8px;
+ font-size: 14px;
+ font-weight: bold;
+ color: $black;
+
+ svg {
+ position: absolute;
+ top: 13%;
+ left: 0;
+ color: $primary-color;
+ opacity: 0.4;
+ transform: rotate(90deg);
+ }
+ }
+
+ &-com {
+ margin: 8px 0 8px 8px;
+
+ @include moreline-ellipsis(6);
+ }
+
+ &-img {
+ display: flex;
+ align-items: center;
+ margin: 0 0 8px 8px;
+ }
+ }
+
+
+
+
+
+ .nut-comment-shop {
+ width: 100%;
+ padding-top: 10px;
+ margin-top: 20px;
+ border-top: 1px solid rgb(0 0 0 / 10%);
+
+ @include moreline-ellipsis(6);
+
+ text {
+ color: $comment-shop-color;
+ }
+ }
+}
diff --git a/uni_modules/nutui-uni/components/comment/index.ts b/uni_modules/nutui-uni/components/comment/index.ts
new file mode 100644
index 0000000..4bfdb13
--- /dev/null
+++ b/uni_modules/nutui-uni/components/comment/index.ts
@@ -0,0 +1,2 @@
+export type * from './comment'
+export type * from './type'
diff --git a/uni_modules/nutui-uni/components/comment/type.ts b/uni_modules/nutui-uni/components/comment/type.ts
new file mode 100644
index 0000000..5cd346a
--- /dev/null
+++ b/uni_modules/nutui-uni/components/comment/type.ts
@@ -0,0 +1,60 @@
+export interface VideosType {
+ id: number | string
+ mainUrl: string
+ videoUrl: string
+}
+export interface ImagesType {
+ smallImgUrl: string
+ bigImgUrl: string
+ imgUrl: string
+}
+
+export interface InfoType {
+ /**
+ * @description 评论详情
+ */
+ content: string
+ /**
+ * @description 评论人的姓名
+ */
+ nickName: string
+ /**
+ * @description 评论星星数
+ */
+ score: string | number
+ /**
+ * @description 评论人头像
+ */
+ avatar: string
+ /**
+ * @description 评论时间
+ */
+ time: string
+ /**
+ * @description 评论人购买的商品规格
+ */
+ size: string
+ /**
+ * @description 此评论的回复数
+ */
+ replay: number
+ /**
+ * @description 此评论的点赞数
+ */
+ like: number
+}
+
+export interface FollowType {
+ /**
+ * @description 购买多少天后进行追评
+ */
+ days: number
+ /**
+ * @description 追评内容
+ */
+ content: string
+ /**
+ * @description 追评图片
+ */
+ images: []
+}
diff --git a/uni_modules/nutui-uni/components/composables.ts b/uni_modules/nutui-uni/components/composables.ts
new file mode 100644
index 0000000..3626ef5
--- /dev/null
+++ b/uni_modules/nutui-uni/components/composables.ts
@@ -0,0 +1,2 @@
+export { useNotify } from './notify/use-notify'
+export { useToast } from './toast/use-toast'
diff --git a/uni_modules/nutui-uni/components/configprovider/configprovider.ts b/uni_modules/nutui-uni/components/configprovider/configprovider.ts
new file mode 100644
index 0000000..87f114a
--- /dev/null
+++ b/uni_modules/nutui-uni/components/configprovider/configprovider.ts
@@ -0,0 +1,19 @@
+import type { ExtractPropTypes } from 'vue'
+import { makeStringProp } from '../_utils'
+
+export const configProviderProps = {
+ /**
+ * @description 主题风格,设置为 `dark` 来开启深色模式,全局生效
+ */
+ theme: makeStringProp(''),
+ /**
+ * @description 自定义主题变量
+ */
+ themeVars: { type: Object, default: {} },
+ /**
+ * @description 设置所有弹窗类组件的 z-index,该属性对全局生效
+ */
+ zIndex: Number,
+}
+
+export type ConfigProviderProps = ExtractPropTypes
diff --git a/uni_modules/nutui-uni/components/configprovider/configprovider.vue b/uni_modules/nutui-uni/components/configprovider/configprovider.vue
new file mode 100644
index 0000000..3210415
--- /dev/null
+++ b/uni_modules/nutui-uni/components/configprovider/configprovider.vue
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/configprovider/index.scss b/uni_modules/nutui-uni/components/configprovider/index.scss
new file mode 100644
index 0000000..e69de29
diff --git a/uni_modules/nutui-uni/components/configprovider/index.ts b/uni_modules/nutui-uni/components/configprovider/index.ts
new file mode 100644
index 0000000..079cbf3
--- /dev/null
+++ b/uni_modules/nutui-uni/components/configprovider/index.ts
@@ -0,0 +1 @@
+export type * from './configprovider'
diff --git a/uni_modules/nutui-uni/components/countdown/countdown.ts b/uni_modules/nutui-uni/components/countdown/countdown.ts
new file mode 100644
index 0000000..68257e6
--- /dev/null
+++ b/uni_modules/nutui-uni/components/countdown/countdown.ts
@@ -0,0 +1,90 @@
+import type { ExtractPropTypes } from 'vue'
+import { INPUT_EVENT, UPDATE_MODEL_EVENT } from '../_constants'
+import { commonProps, isNumber, isString, makeNumericProp, makeObjectProp, makeStringProp, truthProp } from '../_utils'
+
+export const countdownProps = {
+ ...commonProps,
+ /**
+ * @description 当前时间,自定义展示内容时生效
+ */
+ modelValue: makeObjectProp({}),
+ /**
+ * @description 开始时间
+ */
+ startTime: {
+ type: [Number, String],
+ validator(v: Date) {
+ const dateStr = new Date(v).toString().toLowerCase()
+ return dateStr !== 'invalid date'
+ },
+ },
+ /**
+ * @description 结束时间
+ */
+ endTime: {
+ type: [Number, String],
+ validator(v: Date) {
+ const dateStr = new Date(v).toString().toLowerCase()
+ return dateStr !== 'invalid date'
+ },
+ },
+ /**
+ * @description 是否开启毫秒级渲染
+ */
+ millisecond: Boolean,
+ /**
+ * @description 时间格式
+ */
+ format: makeStringProp('HH:mm:ss'),
+ /**
+ * @description 是否自动开始倒计时
+ */
+ autoStart: truthProp,
+ /**
+ * @description 倒计时显示时间,单位是毫秒。`auto-start` 为 `false` 时生效
+ */
+ time: makeNumericProp(0),
+ /**
+ * @description 是否暂停
+ */
+ paused: Boolean,
+}
+
+export const countdownEmits = {
+ [INPUT_EVENT]: (val: string | {
+ d: number
+ h: number
+ m: number
+ s: number
+ ms: number
+ }) => val instanceof Object || isString(val),
+ [UPDATE_MODEL_EVENT]: (val: string | {
+ d: number
+ h: number
+ m: number
+ s: number
+ ms: number
+ }) => val instanceof Object || isString(val),
+ onEnd: () => true,
+ onRestart: (val: number) => isNumber(val) || isString(val) || val === undefined,
+ onPaused: (val: number) => isNumber(val) || isString(val) || val === undefined,
+}
+
+export type CountdownEmits = typeof countdownEmits
+
+export interface CountdownInst {
+ /**
+ * @description 开始倒计时
+ */
+ start: () => void
+ /**
+ * @description 暂停倒计时
+ */
+ pause: () => void
+ /**
+ * @description 重设倒计时,若 `auto-start` 为 `true`,重设后会自动开始倒计时
+ */
+ reset: () => void
+}
+
+export type CountDownPropsProps = ExtractPropTypes
diff --git a/uni_modules/nutui-uni/components/countdown/countdown.vue b/uni_modules/nutui-uni/components/countdown/countdown.vue
new file mode 100644
index 0000000..d878767
--- /dev/null
+++ b/uni_modules/nutui-uni/components/countdown/countdown.vue
@@ -0,0 +1,239 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/countdown/index.scss b/uni_modules/nutui-uni/components/countdown/index.scss
new file mode 100644
index 0000000..f4440dc
--- /dev/null
+++ b/uni_modules/nutui-uni/components/countdown/index.scss
@@ -0,0 +1,5 @@
+.nut-countdown {
+ display: $countdown-display;
+ font-size: $countdown-font-size;
+ color: $countdown-color;
+}
diff --git a/uni_modules/nutui-uni/components/countdown/index.ts b/uni_modules/nutui-uni/components/countdown/index.ts
new file mode 100644
index 0000000..fc8d8d5
--- /dev/null
+++ b/uni_modules/nutui-uni/components/countdown/index.ts
@@ -0,0 +1 @@
+export type { CountdownEmits, CountdownInst, CountDownPropsProps } from './countdown'
diff --git a/uni_modules/nutui-uni/components/countup/countup.ts b/uni_modules/nutui-uni/components/countup/countup.ts
new file mode 100644
index 0000000..807e354
--- /dev/null
+++ b/uni_modules/nutui-uni/components/countup/countup.ts
@@ -0,0 +1,110 @@
+import type { ExtractPropTypes } from 'vue'
+import { commonProps, isBoolean, makeNumberProp, makeStringProp, truthProp } from '../_utils'
+
+export const countupProps = {
+ ...commonProps,
+ /**
+ * @description 初始数字
+ */
+ initNum: makeNumberProp(0),
+ /**
+ * @description 结束数字
+ */
+ endNum: makeNumberProp(0),
+ /**
+ * @description 间隔数字,目前仅支持基础用法
+ */
+ speed: makeNumberProp(1),
+ /**
+ * @description 保留小数点后几位
+ */
+ toFixed: makeNumberProp(0),
+ /**
+ * @description 触发数字滚动的标识
+ */
+ startFlag: truthProp,
+ /**
+ * @description 滚动一次运行时间
+ */
+ during: makeNumberProp(1000),
+ /**
+ * @description 数字宽度,常用于自定义无缝滚动
+ */
+ numWidth: makeNumberProp(20),
+ /**
+ * @description 数字高度,常用于自定义无缝滚动(抽奖功能必传)
+ */
+ numHeight: makeNumberProp(20),
+ scrolling: Boolean,
+ /**
+ * @description 要变化的数字(用于自定义图片,`initNum`、`endNum` 在此无效)
+ */
+ customChangeNum: makeNumberProp(1),
+ /**
+ * @description 自定义图片(建议使用雪碧图实现,使用抽奖功能必须使用雪碧图)
+ */
+ customBgImg: makeStringProp(''),
+ /**
+ * @description 图片中数字之间可能会存在间距
+ */
+ customSpacNum: makeNumberProp(0),
+ /**
+ * @description 抽奖功能传 machine,可选值为 `machine` `' '`
+ */
+ type: makeStringProp(''),
+ /**
+ * @description 奖品个数,一共多少个奖品,必传
+ */
+ machinePrizeNum: makeNumberProp(0),
+ /**
+ * @description 抽奖位,即滚动几个,必传
+ */
+ machineNum: makeNumberProp(3),
+ /**
+ * @description 中奖图标,图标在雪碧图中的位置
+ */
+ machinePrizeLevel: makeNumberProp(0),
+ /**
+ * @description 滚动圈数
+ */
+ machineTurnMore: makeNumberProp(0),
+}
+
+export type CountUpProps = ExtractPropTypes
+
+export const countupEmits = {
+ scrollEnd: (val?: boolean) => isBoolean(val) || val === undefined,
+}
+
+export type CountUpEmits = typeof countupEmits
+
+export interface IData {
+ valFlag: boolean
+ current: number
+ sortFlag: string
+ initDigit1: number
+ initDigit2: number
+ to0_10: number[]
+ to10_0: Array
+ timer: null | any
+ totalCount: number // 正整数
+ pointNum: number // 小数位
+ numberVal: number // 数字
+ num_total_len: number // 数字长度
+ relNum: number // 去除小数点
+ customNumber: number
+ prizeLevelTrun: number
+ prizeY: Array
+ prizeYPrev: Array
+ // machineTransition: 'none',
+ finshMachine: number
+ notPrize: Array
+ typeMachine: string
+}
+
+export interface CountUpInst {
+ /**
+ * @description 抽奖
+ */
+ machineLuck: () => void
+}
diff --git a/uni_modules/nutui-uni/components/countup/countup.vue b/uni_modules/nutui-uni/components/countup/countup.vue
new file mode 100644
index 0000000..49ee0c9
--- /dev/null
+++ b/uni_modules/nutui-uni/components/countup/countup.vue
@@ -0,0 +1,575 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ .
+
+
+
+
+
+
+
+
+ {{ item }}
+
+
+
+ .
+
+
+
+ {{ data.current }}
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/countup/index.scss b/uni_modules/nutui-uni/components/countup/index.scss
new file mode 100644
index 0000000..2e32240
--- /dev/null
+++ b/uni_modules/nutui-uni/components/countup/index.scss
@@ -0,0 +1,64 @@
+.nut-theme-dark {
+ .nut-countup {
+ color: $dark-color;
+ background: $dark-background;
+ box-shadow: none;
+ }
+}
+
+.nut-countup {
+ display: block;
+ padding: 5px 20px;
+ font-weight: bold;
+ color: #000;
+
+ .nut-countup__number {
+ position: relative;
+ display: inline-block;
+ width: 100%;
+ padding: 0;
+ overflow: hidden;
+ font-weight: bold;
+ text-align: center;
+
+ .nut-countup__number-item {
+ position: absolute;
+ list-style: none;
+ transition: none;
+
+ .nut-countup__number-item__span {
+ display: block;
+ }
+ }
+ }
+
+ .nut-countup-pointstyl {
+ position: absolute;
+ display: block;
+ }
+
+ .nut-countup__machine {
+ display: block;
+ overflow: hidden;
+
+ .nut-countup__machine-item {
+ float: left;
+ background-repeat: repeat-y;
+ background-attachment: scroll;
+ background-position: center 0;
+ }
+ }
+
+ .nut-countup__numberimg {
+ position: relative;
+ display: inline-block;
+
+ .nut-countup__numberimg__item {
+ position: absolute;
+ display: inline-block;
+ background-repeat: no-repeat;
+ background-position: 0 0;
+ transition: none;
+ }
+ }
+}
diff --git a/uni_modules/nutui-uni/components/countup/index.ts b/uni_modules/nutui-uni/components/countup/index.ts
new file mode 100644
index 0000000..88eb86d
--- /dev/null
+++ b/uni_modules/nutui-uni/components/countup/index.ts
@@ -0,0 +1 @@
+export type * from './countup'
diff --git a/uni_modules/nutui-uni/components/datepicker/datepicker.ts b/uni_modules/nutui-uni/components/datepicker/datepicker.ts
new file mode 100644
index 0000000..8e61966
--- /dev/null
+++ b/uni_modules/nutui-uni/components/datepicker/datepicker.ts
@@ -0,0 +1,97 @@
+import type { ExtractPropTypes, PropType } from 'vue'
+import { CANCEL_EVENT, CHANGE_EVENT, CONFIRM_EVENT, UPDATE_MODEL_EVENT } from '../_constants'
+import { makeNumberProp, makeNumericProp, makeStringProp, truthProp } from '../_utils'
+import type {
+ DateLike,
+ DatePickerBaseEvent,
+ DatePickerChangeEvent,
+ DatePickerFilter,
+ DatePickerFormatter,
+ DatePickerType,
+} from './type'
+
+export const datepickerProps = {
+ /**
+ * @description 初始值
+ */
+ modelValue: {
+ type: [Number, String, Object] as PropType,
+ },
+ /**
+ * @description 时间类型,可选值 `date`(年月日) `time`(时分秒) `year-month`(年月) `month-day`(月日) `datehour`(年月日时) `hour-minute`
+ */
+ type: makeStringProp('date'),
+ /**
+ * @description 是否显示顶部导航
+ */
+ showToolbar: truthProp,
+ /**
+ * @description 设置标题
+ */
+ title: makeStringProp(''),
+ /**
+ * @description 确定按钮文案
+ */
+ okText: makeStringProp(''),
+ /**
+ * @description 取消按钮文案
+ */
+ cancelText: makeStringProp(''),
+ /**
+ * @description 每列是否展示中文
+ */
+ isShowChinese: Boolean,
+ /**
+ * @description 分钟步进值
+ */
+ minuteStep: makeNumberProp(1),
+ /**
+ * @description 开始日期
+ */
+ minDate: {
+ type: [Number, String, Object] as PropType,
+ default: () => new Date(new Date().getFullYear() - 10, 0, 1),
+ },
+ /**
+ * @description 结束日期
+ */
+ maxDate: {
+ type: [Number, String, Object] as PropType,
+ default: () => new Date(new Date().getFullYear() + 10, 11, 31),
+ },
+ /**
+ * @description 选项格式化函数
+ */
+ formatter: Function as PropType,
+ /**
+ * @description 选项过滤函数
+ */
+ filter: Function as PropType,
+ /**
+ * @description 是否开启3D效果
+ */
+ threeDimensional: Boolean,
+ /**
+ * @description 惯性滚动时长
+ */
+ swipeDuration: makeNumericProp(1000),
+ /**
+ * @description 可见的选项个数
+ */
+ visibleOptionNum: makeNumericProp(7),
+ /**
+ * @description 选项高度
+ */
+ optionHeight: makeNumericProp(36),
+}
+
+export type DatePickerProps = ExtractPropTypes
+
+export const datepickerEmits = {
+ [UPDATE_MODEL_EVENT]: (val: Date) => val instanceof Object,
+ [CHANGE_EVENT]: (evt: DatePickerChangeEvent) => evt instanceof Object,
+ [CONFIRM_EVENT]: (evt: DatePickerBaseEvent) => evt instanceof Object,
+ [CANCEL_EVENT]: (evt: DatePickerBaseEvent) => evt instanceof Object,
+}
+
+export type DatePickerEmits = typeof datepickerEmits
diff --git a/uni_modules/nutui-uni/components/datepicker/datepicker.vue b/uni_modules/nutui-uni/components/datepicker/datepicker.vue
new file mode 100644
index 0000000..9a53fef
--- /dev/null
+++ b/uni_modules/nutui-uni/components/datepicker/datepicker.vue
@@ -0,0 +1,405 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/datepicker/index.scss b/uni_modules/nutui-uni/components/datepicker/index.scss
new file mode 100644
index 0000000..1b0460e
--- /dev/null
+++ b/uni_modules/nutui-uni/components/datepicker/index.scss
@@ -0,0 +1 @@
+@import "../picker/index";
diff --git a/uni_modules/nutui-uni/components/datepicker/index.ts b/uni_modules/nutui-uni/components/datepicker/index.ts
new file mode 100644
index 0000000..d82db2a
--- /dev/null
+++ b/uni_modules/nutui-uni/components/datepicker/index.ts
@@ -0,0 +1,2 @@
+export * from './datepicker'
+export * from './type'
diff --git a/uni_modules/nutui-uni/components/datepicker/type.ts b/uni_modules/nutui-uni/components/datepicker/type.ts
new file mode 100644
index 0000000..72cb38f
--- /dev/null
+++ b/uni_modules/nutui-uni/components/datepicker/type.ts
@@ -0,0 +1,27 @@
+import type { PickerBaseEvent, PickerChangeEvent } from '../picker'
+import type { PickerOption } from '../pickercolumn'
+
+export type DateLike = number | string | Date
+
+export const datepickerType = ['date', 'time', 'year-month', 'month-day', 'datehour', 'hour-minute', 'datetime'] as const
+export type DatePickerType = (typeof datepickerType)[number]
+
+export const datepickerColumnType = ['year', 'month', 'day', 'hour', 'minute', 'seconds'] as const
+export type DatePickerColumnType = (typeof datepickerColumnType)[number]
+
+export interface DatePickerBaseEvent extends PickerBaseEvent {
+ date: Date
+}
+
+export interface DatePickerChangeEvent extends DatePickerBaseEvent, PickerChangeEvent {
+
+}
+
+export type DatePickerFormatter = (type: DatePickerColumnType, option: PickerOption) => PickerOption
+
+export type DatePickerFilter = (type: DatePickerColumnType, options: PickerOption[]) => PickerOption[]
+
+export interface DatePickerRangeItem {
+ type: DatePickerColumnType
+ range: [number, number]
+}
diff --git a/uni_modules/nutui-uni/components/dialog/dialog.ts b/uni_modules/nutui-uni/components/dialog/dialog.ts
new file mode 100644
index 0000000..b6cb345
--- /dev/null
+++ b/uni_modules/nutui-uni/components/dialog/dialog.ts
@@ -0,0 +1,90 @@
+import type { CSSProperties, ExtractPropTypes, PropType } from 'vue'
+import { CANCEL_EVENT, CLOSED_EVENT, OPENED_EVENT, UPDATE_VISIBLE_EVENT } from '../_constants'
+import type { Interceptor } from '../_utils'
+import { commonProps, isBoolean, makeStringProp, truthProp } from '../_utils'
+import { popupProps } from '../popup/popup'
+import type { FooterDirection, TextAlign } from './type'
+
+export const dialogProps = {
+ ...popupProps,
+ ...commonProps,
+ /**
+ * @description 点击蒙层是否关闭对话框
+ */
+ closeOnClickOverlay: truthProp,
+ /**
+ * @description 标题
+ */
+ title: makeStringProp(''),
+ /**
+ * @description 内容,支持 HTML
+ */
+ content: makeStringProp(''),
+ /**
+ * @description 是否隐藏底部按钮栏
+ */
+ noFooter: Boolean,
+ /**
+ * @description 是否隐藏确定按钮
+ */
+ noOkBtn: Boolean,
+ /**
+ * @description 是否隐藏取消按钮
+ */
+ noCancelBtn: Boolean,
+ /**
+ * @description 取消按钮文案
+ */
+ cancelText: makeStringProp(''),
+ /**
+ * @description 确定按钮文案
+ */
+ okText: makeStringProp(''),
+ /**
+ * @description 确认按钮是否默认关闭弹窗
+ */
+ okAutoClose: truthProp,
+ /**
+ * @description 取消按钮是否默认关闭弹窗
+ */
+ cancelAutoClose: truthProp,
+ /**
+ * @description 文字对齐方向,可选值同 css 的 text-align
+ */
+ textAlign: makeStringProp('center'),
+ /**
+ * @description 是否在页面回退时自动关闭
+ */
+ closeOnPopstate: Boolean,
+ /**
+ * @description 使用横纵方向,可选值`horizontal`、`vertical`
+ */
+ footerDirection: makeStringProp('horizontal'),
+ /**
+ * @description 自定义类名
+ */
+ customClass: makeStringProp(''),
+ /**
+ * @description 自定义 popup 弹框样式
+ */
+ popStyle: {
+ type: Object as PropType,
+ },
+ /**
+ * @description 是否在页面回退时自动关闭
+ */
+ beforeClose: Function as PropType,
+}
+
+export type DialogProps = ExtractPropTypes
+
+export const dialogEmits = {
+ update: (val: boolean) => isBoolean(val),
+ [UPDATE_VISIBLE_EVENT]: (val: boolean) => isBoolean(val),
+ ok: () => true,
+ [CANCEL_EVENT]: () => true,
+ [OPENED_EVENT]: () => true,
+ [CLOSED_EVENT]: () => true,
+}
+
+export type DialogEmits = typeof dialogEmits
diff --git a/uni_modules/nutui-uni/components/dialog/dialog.vue b/uni_modules/nutui-uni/components/dialog/dialog.vue
new file mode 100644
index 0000000..9471f03
--- /dev/null
+++ b/uni_modules/nutui-uni/components/dialog/dialog.vue
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/dialog/index.scss b/uni_modules/nutui-uni/components/dialog/index.scss
new file mode 100644
index 0000000..88a3a82
--- /dev/null
+++ b/uni_modules/nutui-uni/components/dialog/index.scss
@@ -0,0 +1,79 @@
+@import '../button/index';
+@import '../popup/index';
+
+.nut-theme-dark {
+ .nut-dialog {
+ &__header {
+ color: $dark-color3;
+ }
+ }
+}
+
+.nut-dialog {
+ box-sizing: border-box;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ width: $dialog-width;
+ min-height: 156px;
+ padding: 28px 24px 16px;
+
+ &__header {
+ display: block;
+ height: 20px;
+ font-size: 16px;
+ font-weight: $dialog-header-font-weight;
+ color: $dialog-header-color;
+ text-align: center;
+
+ @include oneline-ellipsis;
+ }
+
+ &__content {
+ flex: 1;
+ width: 100%;
+ max-height: 268px;
+ margin: 20px 0;
+ overflow: auto;
+ font-size: 12px;
+ line-height: 16px;
+ color: $text-color;
+ word-break: break-all;
+ word-wrap: break-word;
+ white-space: pre-wrap;
+ }
+
+ &__footer {
+ display: flex;
+ align-items: center;
+ justify-content: $dialog-footer-justify-content;
+ width: 100%;
+
+ &.vertical {
+ flex-direction: column;
+
+ .nut-button {
+ min-width: 100%;
+ margin: 0;
+
+ &.nut-dialog__footer-cancel {
+ border: 0;
+ }
+
+ &.nut-dialog__footer-ok {
+ margin-top: 10px;
+ }
+ }
+ }
+
+ .nut-button {
+ min-width: 100px;
+ overflow: hidden;
+ }
+
+
+ &-ok {
+ max-width: 128px;
+ }
+ }
+}
diff --git a/uni_modules/nutui-uni/components/dialog/index.ts b/uni_modules/nutui-uni/components/dialog/index.ts
new file mode 100644
index 0000000..3415a40
--- /dev/null
+++ b/uni_modules/nutui-uni/components/dialog/index.ts
@@ -0,0 +1,3 @@
+export type * from './dialog'
+export type * from './type'
+export * from './use-dialog'
diff --git a/uni_modules/nutui-uni/components/dialog/type.ts b/uni_modules/nutui-uni/components/dialog/type.ts
new file mode 100644
index 0000000..892f2f4
--- /dev/null
+++ b/uni_modules/nutui-uni/components/dialog/type.ts
@@ -0,0 +1,71 @@
+import type { NutAnimationName } from '../transition'
+
+export const textAlign = ['left', 'center', 'right', 'top'] as const
+export type TextAlign = (typeof textAlign)[number]
+export const footerDirection = ['horizontal', 'vertical'] as const
+export type FooterDirection = (typeof footerDirection)[number]
+export interface DialogOptions {
+ /**
+ * @description 标题
+ */
+ title?: string
+ /**
+ * @description 内容,支持 HTML
+ */
+ content?: string
+ /**
+ * @description 是否隐藏底部按钮栏
+ */
+ noFooter?: boolean
+ /**
+ * @description 是否隐藏确定按钮
+ */
+ noOkBtn?: boolean
+ /**
+ * @description 是否隐藏取消按钮
+ */
+ noCancelBtn?: boolean
+ /**
+ * @description 取消按钮文案
+ */
+ cancelText?: string
+ /**
+ * @description 确定按钮文案
+ */
+ okText?: string
+ /**
+ * @description 文字对齐方向,可选值同 css 的 text-align
+ */
+ textAlign?: TextAlign
+ /**
+ * @description 使用横纵方向 可选值 horizontal、vertical
+ */
+ footerDirection?: FooterDirection
+ /**
+ * @description 弹出动画类型
+ */
+ transition?: NutAnimationName
+ /**
+ * @description 点击蒙层是否关闭对话框
+ */
+ closeOnClickOverlay?: boolean
+ /**
+ * @description 确认按钮是否默认关闭弹窗
+ */
+ okAutoClose?: boolean
+}
+
+export interface DialogInst {
+ /**
+ * @description 弹出对话框
+ */
+ showDialog: (options: DialogOptions) => void
+ /**
+ * @description 点击确定
+ */
+ onOk: () => void
+ /**
+ * @description 点击取消
+ */
+ onCancel: () => void
+}
diff --git a/uni_modules/nutui-uni/components/dialog/use-dialog.ts b/uni_modules/nutui-uni/components/dialog/use-dialog.ts
new file mode 100644
index 0000000..26ec4a2
--- /dev/null
+++ b/uni_modules/nutui-uni/components/dialog/use-dialog.ts
@@ -0,0 +1,123 @@
+import type { CSSProperties, SetupContext } from 'vue'
+import { computed, onMounted, ref, watch } from 'vue'
+import { CANCEL_EVENT, CLOSED_EVENT, OPENED_EVENT, PREFIX, UPDATE_VISIBLE_EVENT } from '../_constants'
+import { funInterceptor, getMainClass } from '../_utils'
+import type { DialogEmits, DialogProps } from './dialog'
+import type { DialogOptions } from './type'
+
+const componentName = `${PREFIX}-dialog`
+
+export function useDialog(props: DialogProps, emit: SetupContext['emit']) {
+ const showPopup = ref(props.visible)
+ const dialogStatus = ref({
+ title: props.title,
+ content: props.content,
+ cancelText: props.cancelText,
+ okText: props.okText,
+ textAlign: props.textAlign,
+ footerDirection: props.footerDirection,
+ noFooter: props.noFooter,
+ noOkBtn: props.noOkBtn,
+ noCancelBtn: props.noCancelBtn,
+ transition: props.transition,
+ closeOnClickOverlay: props.closeOnClickOverlay,
+ okAutoClose: props.okAutoClose,
+ })
+
+ watch(() => props.title, title => dialogStatus.value.title = title)
+
+ const showDialog = (options: DialogOptions) => {
+ dialogStatus.value = {
+ title: options.title || props.title,
+ content: options.content || props.content,
+ cancelText: options.cancelText || props.cancelText,
+ okText: options.okText || props.okText,
+ okAutoClose: options.okAutoClose || props.okAutoClose,
+ textAlign: options.textAlign || props.textAlign,
+ footerDirection: options.footerDirection || props.footerDirection,
+ noFooter: options.noFooter || props.noFooter,
+ noOkBtn: options.noOkBtn || props.noOkBtn,
+ transition: options.transition || props.transition,
+ noCancelBtn: options.noCancelBtn || props.noCancelBtn,
+ closeOnClickOverlay: options.closeOnClickOverlay || props.closeOnClickOverlay,
+ }
+ showPopup.value = true
+ }
+
+ onMounted(() => {
+ if (props.closeOnPopstate) {
+ // #ifdef H5
+ window.addEventListener('popstate', () => {
+ closed('page')
+ })
+ // #endif
+ }
+ })
+
+ watch(
+ () => props.visible,
+ (value) => {
+ showPopup.value = value
+
+ if (value)
+ emit(OPENED_EVENT)
+ },
+ )
+
+ const classes = computed(() => {
+ return getMainClass(props, componentName)
+ })
+
+ function update(val: boolean) {
+ emit('update', val)
+ emit(UPDATE_VISIBLE_EVENT, val)
+ }
+
+ function closed(action?: string) {
+ funInterceptor(props.beforeClose, {
+ args: [action],
+ done: () => {
+ showPopup.value = false
+ update(false)
+ emit(CLOSED_EVENT)
+ },
+ })
+ }
+
+ function onCancel() {
+ emit(CANCEL_EVENT)
+ if (props.cancelAutoClose) {
+ showPopup.value = false
+ closed(CANCEL_EVENT)
+ }
+ }
+
+ function onOk() {
+ emit('ok')
+ if (props.okAutoClose)
+ closed('ok')
+ }
+
+ function onClickOverlay() {
+ if (props.closeOnClickOverlay)
+ closed('')
+ }
+
+ const contentStyle = computed(() => {
+ return {
+ textAlign: dialogStatus.value.textAlign,
+ } as CSSProperties
+ })
+
+ return {
+ contentStyle,
+ showPopup,
+ onClickOverlay,
+ onCancel,
+ onOk,
+ closed,
+ classes,
+ showDialog,
+ dialogStatus,
+ }
+}
diff --git a/uni_modules/nutui-uni/components/divider/divider.ts b/uni_modules/nutui-uni/components/divider/divider.ts
new file mode 100644
index 0000000..481d87f
--- /dev/null
+++ b/uni_modules/nutui-uni/components/divider/divider.ts
@@ -0,0 +1,24 @@
+import type { ExtractPropTypes } from 'vue'
+import { commonProps, makeStringProp, truthProp } from '../_utils'
+
+export const dividerProps = {
+ ...commonProps,
+ /**
+ * @description 内容位置,可选值为 `left`、`right`、`center`
+ */
+ contentPosition: makeStringProp<'left' | 'right' | 'center'>('center'),
+ /**
+ * @description 是否使用虚线
+ */
+ dashed: Boolean,
+ /**
+ * @description 是否使用 `0.5px` 线
+ */
+ hairline: truthProp,
+ /**
+ * @description 水平还是垂直类型,可选值 `vertical`和`horizontal`
+ */
+ direction: makeStringProp<'vertical' | 'horizontal'>('horizontal'),
+}
+
+export type DividerProps = ExtractPropTypes
diff --git a/uni_modules/nutui-uni/components/divider/divider.vue b/uni_modules/nutui-uni/components/divider/divider.vue
new file mode 100644
index 0000000..bdb3cd8
--- /dev/null
+++ b/uni_modules/nutui-uni/components/divider/divider.vue
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/divider/index.scss b/uni_modules/nutui-uni/components/divider/index.scss
new file mode 100644
index 0000000..314b2f4
--- /dev/null
+++ b/uni_modules/nutui-uni/components/divider/index.scss
@@ -0,0 +1,63 @@
+.nut-divider {
+ display: flex;
+ align-items: center;
+ margin: $divider-margin;
+ font-size: $divider-text-font-size;
+ color: $divider-text-color;
+
+ &::before,
+ &::after {
+ flex: 1;
+ height: $divider-line-height;
+ content: "";
+ border: $divider-line-height solid currentColor;
+ border-width: $divider-line-height 0 0;
+ }
+
+ &.nut-divider-center,
+ &.nut-divider-left,
+ &.nut-divider-right {
+ &::before {
+ margin-right: $divider-before-margin-right;
+ }
+
+ &::after {
+ margin-left: $divider-after-margin-left;
+ }
+ }
+
+ &.nut-divider-left {
+ &::before {
+ max-width: 10%;
+ }
+ }
+
+ &.nut-divider-right {
+ &::after {
+ max-width: 10%;
+ }
+ }
+
+ &.nut-divider-dashed {
+ &::before,
+ &::after {
+ border-style: dashed;
+ }
+ }
+
+ &.nut-divider-hairline {
+ &::before,
+ &::after {
+ transform: scaleY(0.5);
+ }
+ }
+
+ &.nut-divider-vertical {
+ position: relative;
+ top: $divider-vertical-top;
+ display: inline-block;
+ height: $divider-vertical-height;
+ margin: $divider-vertical-margin;
+ border-left: 1px solid $divider-vertical-border-left;
+ }
+}
diff --git a/uni_modules/nutui-uni/components/divider/index.ts b/uni_modules/nutui-uni/components/divider/index.ts
new file mode 100644
index 0000000..53d7278
--- /dev/null
+++ b/uni_modules/nutui-uni/components/divider/index.ts
@@ -0,0 +1 @@
+export * from './divider'
diff --git a/uni_modules/nutui-uni/components/dollmachine/dollmachine.ts b/uni_modules/nutui-uni/components/dollmachine/dollmachine.ts
new file mode 100644
index 0000000..4f5589d
--- /dev/null
+++ b/uni_modules/nutui-uni/components/dollmachine/dollmachine.ts
@@ -0,0 +1,45 @@
+import type { ExtractPropTypes } from 'vue'
+import { CLICK_EVENT } from '../_constants'
+import { commonProps, makeArrayProp, makeNumberProp } from '../_utils'
+
+export const dollmachineProps = {
+ ...commonProps,
+ /**
+ * @description 初始化爪子的图片链接
+ */
+ defaultClaw: {
+ type: String,
+ default:
+ 'https://img14.360buyimg.com/imagetools/jfs/t1/146467/34/22553/4178/61b088afE198f676e/21952e7018d1d141.png',
+ },
+ /**
+ * @description 爪子抓到奖品的图片链接
+ */
+ activeClaw: {
+ type: String,
+ default:
+ 'https://img13.360buyimg.com/imagetools/jfs/t1/218082/28/7092/15914/61b088afEf9c253f7/8392e2b14bd8f43a.png',
+ },
+ /**
+ * @description 速度
+ */
+ speed: makeNumberProp(20),
+ /**
+ * @description 奖品列表
+ */
+ prizeList: makeArrayProp([]),
+ /**
+ * @description 中奖奖品在列表的索引位置
+ */
+ prizeIndex: makeNumberProp(-1),
+}
+
+export type DollMachineProps = ExtractPropTypes
+
+export const dollmachineEmits = {
+ [CLICK_EVENT]: () => true,
+ startTurns: () => true,
+ endTurns: () => true,
+}
+
+export type DollMachineEmits = typeof dollmachineEmits
diff --git a/uni_modules/nutui-uni/components/dollmachine/dollmachine.vue b/uni_modules/nutui-uni/components/dollmachine/dollmachine.vue
new file mode 100644
index 0000000..24e7edd
--- /dev/null
+++ b/uni_modules/nutui-uni/components/dollmachine/dollmachine.vue
@@ -0,0 +1,255 @@
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/dollmachine/index.scss b/uni_modules/nutui-uni/components/dollmachine/index.scss
new file mode 100644
index 0000000..d3a32b2
--- /dev/null
+++ b/uni_modules/nutui-uni/components/dollmachine/index.scss
@@ -0,0 +1,166 @@
+.nut-doll-machine {
+ .machine-box {
+ position: relative;
+ width: 100%;
+ height: 690px;
+ background: url("https://img12.360buyimg.com/imagetools/jfs/t1/145351/6/24350/800170/61c95470E416c27bb/a3f62a18af70684e.png")
+ no-repeat center;
+ background-size: cover;
+ }
+
+ .machine-tools {
+ position: absolute;
+ top: 0;
+
+ // left: 50%;
+ // transform: translateX(-50%);
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ transition: all linear 0.3s;
+ }
+
+ .machine-rope {
+ top: 50px;
+ width: 10px;
+ height: 20px;
+ background: linear-gradient(to bottom right, #ff9800, #ffeb3b);
+ transition: all linear 2s;
+ }
+
+ .machine-claw {
+ width: 80px;
+ height: 70px;
+
+ // background: url("https://img14.360buyimg.com/imagetools/jfs/t1/146467/34/22553/4178/61b088afE198f676e/21952e7018d1d141.png")
+ // no-repeat center;
+ // background-size: 100% 100%;
+ text-align: center;
+
+ .gift-prize {
+ width: 60px;
+ height: 60px;
+ margin-top: 30px;
+ }
+ }
+
+ .machine-gift-box {
+ position: absolute;
+ bottom: 0;
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+
+ // height: 100%;
+ .box-glass {
+ position: relative;
+ width: 100%;
+ height: 200px;
+ background-color: #f1d90556;
+
+ .gift-img {
+ position: absolute;
+ width: 50px;
+ height: 50px;
+ }
+ }
+ }
+
+ .machine-operate {
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+ width: 90%;
+ padding: 5px 20px;
+ margin: 0 auto;
+
+ // position: absolute;
+ // bottom: 0;
+ // left: 50%;
+ // transform: translateX(-50%);
+ .machine-direction {
+ position: relative;
+ width: 50px;
+ height: 50px;
+ background: url("https://img14.360buyimg.com/imagetools/jfs/t1/3283/2/18965/1403/62c28eb5E0cfb824b/9b90cde1898d18af.png")
+ no-repeat center;
+ background-size: 100% 100%;
+
+ .direction-block {
+ position: absolute;
+ top: 50%;
+ display: block;
+ width: 15px;
+ height: 15px;
+
+ // background-color: #ff9800;
+ &:nth-child(1) {
+ left: 0;
+ transform: translateY(-50%);
+ }
+
+ &:nth-child(2) {
+ right: 0;
+ transform: translateY(-50%);
+ }
+
+ // &:nth-child(1),
+ // &:nth-child(4) {
+ // display: block;
+ // }
+ // &:nth-child(1) {
+ // top: 0;
+ // left: 50%;
+ // transform: translateX(-50%);
+ // }
+ // &:nth-child(2) {
+ // top: 50%;
+ // left: 0;
+ // transform: translateY(-50%);
+ // }
+ // &:nth-child(3) {
+ // top: 50%;
+ // right: 0;
+ // transform: translateY(-50%);
+ // }
+ // &:nth-child(4) {
+ // bottom: 0;
+ // left: 50%;
+ // transform: translateX(-50%);
+ // }
+ }
+ }
+
+ .machine-btn {
+ width: 50px;
+ height: 60px;
+ }
+
+ .machine-start {
+ background: url("https://img13.360buyimg.com/imagetools/jfs/t1/205479/17/4245/32041/61309346E02bd3b6b/b41be60bedbb1e69.png")
+ no-repeat center;
+ background-size: contain;
+ }
+
+ .machine-disabled {
+ background: url("https://img10.360buyimg.com/imagetools/jfs/t1/193040/14/21217/16320/61309346E6569e270/36e45126a5f1fc9c.png")
+ no-repeat center;
+ background-size: contain;
+ }
+
+ .machine-reset-btn {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: #ff9800;
+ }
+ }
+}
+
+// stylelint-disable selector-class-pattern
+
+.disabledClick {
+ pointer-events: none !important;
+ cursor: not-allowed !important;
+}
diff --git a/uni_modules/nutui-uni/components/dollmachine/index.ts b/uni_modules/nutui-uni/components/dollmachine/index.ts
new file mode 100644
index 0000000..809fa4c
--- /dev/null
+++ b/uni_modules/nutui-uni/components/dollmachine/index.ts
@@ -0,0 +1 @@
+export type * from './dollmachine'
diff --git a/uni_modules/nutui-uni/components/drag/drag.ts b/uni_modules/nutui-uni/components/drag/drag.ts
new file mode 100644
index 0000000..c982d72
--- /dev/null
+++ b/uni_modules/nutui-uni/components/drag/drag.ts
@@ -0,0 +1,32 @@
+import type { ExtractPropTypes } from 'vue'
+import { commonProps, makeStringProp } from '../_utils'
+
+export const dragProps = {
+ ...commonProps,
+ /**
+ * @description 是否开启自动吸边(根据 screenWidth 进行吸边)
+ */
+ attract: Boolean,
+
+ /**
+ * @description 拖拽元素的拖拽方向限制,'x'/'y'/'all'三选一
+ */
+ direction: makeStringProp<'x' | 'y' | 'all'>('all'),
+
+ /**
+ * @description 拖拽元素的拖拽边界
+ */
+ boundary: {
+ type: Object,
+ default: () => {
+ return {
+ top: 0,
+ left: 0,
+ right: 0,
+ bottom: 0,
+ }
+ },
+ },
+}
+
+export type DragProps = ExtractPropTypes
diff --git a/uni_modules/nutui-uni/components/drag/drag.vue b/uni_modules/nutui-uni/components/drag/drag.vue
new file mode 100644
index 0000000..40c5624
--- /dev/null
+++ b/uni_modules/nutui-uni/components/drag/drag.vue
@@ -0,0 +1,148 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/drag/index.scss b/uni_modules/nutui-uni/components/drag/index.scss
new file mode 100644
index 0000000..82a72e8
--- /dev/null
+++ b/uni_modules/nutui-uni/components/drag/index.scss
@@ -0,0 +1,5 @@
+.nut-uni-drag {
+ display: inline-block;
+ width: fit-content;
+ height: fit-content;
+}
diff --git a/uni_modules/nutui-uni/components/drag/index.ts b/uni_modules/nutui-uni/components/drag/index.ts
new file mode 100644
index 0000000..91e38a7
--- /dev/null
+++ b/uni_modules/nutui-uni/components/drag/index.ts
@@ -0,0 +1 @@
+export type * from './drag'
diff --git a/uni_modules/nutui-uni/components/ecard/ecard.ts b/uni_modules/nutui-uni/components/ecard/ecard.ts
new file mode 100644
index 0000000..abc694c
--- /dev/null
+++ b/uni_modules/nutui-uni/components/ecard/ecard.ts
@@ -0,0 +1,78 @@
+import type { ExtractPropTypes } from 'vue'
+import { UPDATE_MODEL_EVENT } from '../_constants'
+import {
+ commonProps,
+ isNumber,
+ isString,
+ makeArrayProp,
+ makeNumberProp,
+ makeNumericProp,
+ makeStringProp,
+ truthProp,
+} from '../_utils'
+import type { EcardChangeEvent, EcardDataItem, EcardDataValue } from './type'
+
+export const ecardProps = {
+ ...commonProps,
+ /**
+ * @description 购买电子卡所需价钱
+ */
+ modelValue: makeNumericProp(0),
+ /**
+ * @description 电子卡面值列表
+ */
+ list: makeArrayProp([]),
+ /**
+ * @description 选择面值文案
+ */
+ chooseText: makeStringProp(''),
+ /**
+ * @description 是否显示其他面值
+ */
+ showOther: truthProp,
+ /**
+ * @description 其他面值文案
+ */
+ otherValueText: makeStringProp(''),
+ /**
+ * @description 其他面值默认提示语
+ */
+ placeholder: makeStringProp(''),
+ /**
+ * @description 符号标示
+ */
+ suffix: makeStringProp('¥'),
+ /**
+ * @description 其它面值最小值
+ */
+ cardAmountMin: makeNumericProp(1),
+ /**
+ * @description 其他面值最大值
+ */
+ cardAmountMax: makeNumericProp(9999),
+ /**
+ * @description 是否显示步进
+ */
+ showStep: truthProp,
+ /**
+ * @description 购买数量最小值
+ */
+ cardBuyMin: makeNumberProp(1),
+ /**
+ * @description 购买数量最大值
+ */
+ cardBuyMax: makeNumberProp(9999),
+}
+
+export type ECardProps = ExtractPropTypes
+
+export const ecardEmits = {
+ [UPDATE_MODEL_EVENT]: (val: EcardDataValue) => isNumber(val) || isString(val),
+ update: (val: EcardDataValue) => isNumber(val) || isString(val),
+ change: (evt: EcardChangeEvent) => evt instanceof Object,
+ inputChange: (val: string) => isString(val),
+ changeStep: (val1: number, val2: EcardDataValue) => isNumber(val1) && (isNumber(val2) || isString(val2)),
+ inputClick: () => true,
+}
+
+export type ECardEmits = typeof ecardEmits
diff --git a/uni_modules/nutui-uni/components/ecard/ecard.vue b/uni_modules/nutui-uni/components/ecard/ecard.vue
new file mode 100644
index 0000000..310fc1c
--- /dev/null
+++ b/uni_modules/nutui-uni/components/ecard/ecard.vue
@@ -0,0 +1,205 @@
+
+
+
+
+
+
+
+ {{ props.chooseText || translate('chooseText') }}
+
+
+
+
+ {{ item.price }}
+
+
+
+ {{ props.otherValueText || translate('otherValueText') }}
+
+
+
+ {{ props.suffix }}
+
+
+
+
+ {{ props.suffix }}{{ props.modelValue }}
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/ecard/index.scss b/uni_modules/nutui-uni/components/ecard/index.scss
new file mode 100644
index 0000000..0004895
--- /dev/null
+++ b/uni_modules/nutui-uni/components/ecard/index.scss
@@ -0,0 +1,117 @@
+@import "../inputnumber/index";
+
+.nut-theme-dark {
+ .nut-ecard {
+ color: $dark-color3;
+
+ .nut-ecard__list__item {
+ background: $dark-background5;
+ border-color: $dark-background5;
+
+ &.active {
+ color: $dark-color2;
+ background: $dark-background6;
+ border-color: $dark-color2;
+ }
+ }
+
+ .nut-ecard__list__input {
+ color: $dark-color3;
+ background: $dark-background7;
+
+ &.active {
+ background: $dark-background7;
+
+ .nut-ecard-input {
+ background: $dark-background7;
+ }
+ }
+
+ .nut-ecard__list__input--con > .nut-ecard-input {
+ color: $dark-color3;
+ background-color: transparent;
+ }
+ }
+ }
+}
+
+.nut-ecard {
+ width: 100%;
+
+ &__title {
+ font-size: 15px;
+ font-weight: normal;
+ line-height: 1;
+ }
+
+ &__list {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: space-between;
+ margin-top: 15px;
+
+ &__item {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 48%;
+ height: 46px;
+ margin-bottom: 12px;
+ background: $ecard-bg-color;
+ border: 1px solid $ecard-bg-color;
+ border-radius: 4px;
+
+ &.active {
+ background: $white;
+ border-color: $primary-color;
+ }
+ }
+
+ &__input {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ width: 100%;
+ height: 46px;
+ padding: 0 15px 0 20px;
+ font-size: 14px;
+ background: $ecard-bg-color;
+ border: 1px solid $ecard-bg-color;
+ border-radius: 4px;
+
+ &--con {
+ display: flex;
+ flex: 1;
+ justify-content: flex-end;
+
+ .nut-ecard-input {
+ margin-right: 10px;
+ text-align: right;
+ text-decoration: none;
+ caret-color: $primary-color;
+ background: transparent;
+ border: none;
+ }
+ }
+
+ &.active {
+ background: $white;
+ border-color: $primary-color;
+
+ .nut-ecard-input {
+ background: $white;
+ }
+ }
+ }
+
+ &__step {
+ display: flex;
+ justify-content: space-between;
+ width: 100%;
+ margin-top: 17px;
+ font-size: 20px;
+ font-weight: normal;
+ color: $primary-color;
+ }
+ }
+}
diff --git a/uni_modules/nutui-uni/components/ecard/index.ts b/uni_modules/nutui-uni/components/ecard/index.ts
new file mode 100644
index 0000000..425531d
--- /dev/null
+++ b/uni_modules/nutui-uni/components/ecard/index.ts
@@ -0,0 +1,2 @@
+export * from './ecard'
+export * from './type'
diff --git a/uni_modules/nutui-uni/components/ecard/type.ts b/uni_modules/nutui-uni/components/ecard/type.ts
new file mode 100644
index 0000000..959db68
--- /dev/null
+++ b/uni_modules/nutui-uni/components/ecard/type.ts
@@ -0,0 +1,33 @@
+export type EcardDataValue = number | string
+
+export interface EcardDataItem {
+ price: EcardDataValue
+}
+
+export interface EcardChangeEvent {
+ price: EcardDataValue
+}
+
+export interface EcardUpdateOptions {
+ /**
+ * 选中项(从0开始的索引,-1表示选中输入框,null表示不选中)
+ */
+ index?: number | null
+ /**
+ * 其他面值(当index为-1或null时有效)
+ */
+ input?: string
+ /**
+ * 数量
+ */
+ count?: number
+}
+
+export interface EcardInst {
+ /**
+ * 更新面值
+ *
+ * @param options 配置项
+ */
+ update: (options: EcardUpdateOptions) => void
+}
diff --git a/uni_modules/nutui-uni/components/elevator/elevator.ts b/uni_modules/nutui-uni/components/elevator/elevator.ts
new file mode 100644
index 0000000..b4cc9bd
--- /dev/null
+++ b/uni_modules/nutui-uni/components/elevator/elevator.ts
@@ -0,0 +1,46 @@
+import type { ExtractPropTypes } from 'vue'
+import { commonProps, isNumber, isString, makeArrayProp, makeNumberProp, makeNumericProp, makeStringProp } from '../_utils'
+import type { ElevatorData } from './type'
+
+export const elevatorProps = {
+ ...commonProps,
+ /**
+ * @description 电梯区域的高度
+ */
+ height: makeNumericProp('200px'),
+
+ /**
+ * @description 索引 key 值
+ */
+ acceptKey: makeStringProp('title'),
+
+ /**
+ * @description 索引列表
+ */
+ indexList: makeArrayProp([]),
+
+ /**
+ * @description 索引是否吸顶
+ */
+ isSticky: Boolean,
+
+ /**
+ * @description 右侧锚点的上下间距
+ */
+ spaceHeight: makeNumberProp(23),
+
+ /**
+ * @description 左侧索引的高度
+ */
+ titleHeight: makeNumberProp(35),
+}
+
+export type ElevatorProps = ExtractPropTypes
+
+export const elevatorEmits = {
+ clickItem: (key: string, item: any) => isString(key) && (item instanceof Object),
+ clickIndex: (key: string) => isString(key),
+ change: (val: number) => isNumber(val),
+}
+
+export type ElevatorEmits = typeof elevatorEmits
diff --git a/uni_modules/nutui-uni/components/elevator/elevator.vue b/uni_modules/nutui-uni/components/elevator/elevator.vue
new file mode 100644
index 0000000..fb2d905
--- /dev/null
+++ b/uni_modules/nutui-uni/components/elevator/elevator.vue
@@ -0,0 +1,280 @@
+
+
+
+
+
+
+
+
+
+
+ {{ item[acceptKey] }}
+
+
+
+
+
+
+
+
+
+
+ {{ indexList[currentIndex][acceptKey] }}
+
+
+
+ {{ indexList[codeIndex][acceptKey] }}
+
+
+
+
+ {{ item[acceptKey] }}
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/elevator/index.scss b/uni_modules/nutui-uni/components/elevator/index.scss
new file mode 100644
index 0000000..8f34cae
--- /dev/null
+++ b/uni_modules/nutui-uni/components/elevator/index.scss
@@ -0,0 +1,134 @@
+.nut-theme-dark {
+ .nut-elevator {
+ background-color: $dark-background2;
+
+ &__list {
+ &__item {
+ color: $dark-color;
+
+ &__code {
+ color: $dark-color;
+
+ &::after {
+ background-color: $dark-background7;
+ }
+ }
+ }
+
+ &__fixed {
+ background-color: $dark-background2;
+ }
+ }
+
+ &__bars {
+ background-color: $dark-background;
+ }
+ }
+}
+
+.nut-elevator {
+ position: relative;
+ display: block;
+ width: 100%;
+
+ &__list {
+ position: relative;
+ display: block;
+ overflow: auto;
+
+ &__item {
+ display: block;
+ font-size: $elevator-list-item-font-size;
+ color: $elevator-list-item-font-color;
+
+ &__code {
+ position: relative;
+ box-sizing: border-box;
+ display: flex;
+ height: $elevator-list-item-code-height;
+ padding: $elevator-list-item-code-padding;
+ font-size: $elevator-list-item-code-font-size;
+ font-weight: $elevator-list-item-code-font-weight;
+ line-height: $elevator-list-item-code-line-height;
+ color: $elevator-list-item-code-font-color;
+
+ &::after {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ width: $elevator-list-item-code-after-width;
+ height: $elevator-list-item-code-after-height;
+ content: "";
+ background-color: $elevator-list-item-code-after-bg-color;
+ }
+ }
+
+ &__name {
+ display: flex;
+ align-items: center;
+ height: $elevator-list-item-name-height;
+ padding: $elevator-list-item-name-padding;
+ line-height: $elevator-list-item-name-line-height;
+
+ &--highcolor {
+ color: $elevator-list-item-highcolor;
+ }
+ }
+ }
+
+ &__fixed {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+ box-sizing: border-box;
+ width: 100%;
+ height: $elevator-list-item-code-height;
+ padding: $elevator-list-item-code-padding;
+ font-size: $elevator-list-item-code-font-size;
+ font-weight: $elevator-list-item-code-font-weight;
+ line-height: $elevator-list-item-code-line-height;
+ color: $elevator-list-fixed-color;
+ background-color: $elevator-list-fixed-bg-color;
+ box-shadow: $elevator-list-fixed-box-shadow;
+ }
+ }
+
+ &__code--current {
+ position: $elevator-list-item-code-current-position;
+ top: $elevator-list-item-code-current-top;
+ right: $elevator-list-item-code-current-right;
+ width: $elevator-list-item-code-current-width;
+ height: $elevator-list-item-code-current-height;
+ line-height: $elevator-list-item-code-current-line-height;
+ text-align: $elevator-list-item-code-current-text-align;
+ background: $elevator-list-item-code-current-bg-color;
+ border-radius: $elevator-list-item-code-current-border-radius;
+ box-shadow: $elevator-list-item-code-current-box-shadow;
+ transform: $elevator-list-item-code-current-transform;
+ }
+
+ &__bars {
+ position: $elevator-list-item-bars-position;
+ top: $elevator-list-item-bars-top;
+ right: $elevator-list-item-bars-right;
+ z-index: $elevator-list-item-bars-z-index;
+ padding: $elevator-list-item-bars-padding;
+ text-align: $elevator-list-item-bars-text-align;
+ background-color: $elevator-list-item-bars-background-color;
+ border-radius: $elevator-list-item-bars-border-radius;
+ transform: $elevator-list-item-bars-transform;
+
+ &__inner {
+ &__item {
+ display: block;
+ padding: $elevator-list-item-bars-inner-item-padding;
+ font-size: $elevator-list-item-bars-inner-item-font-size;
+
+ &.active {
+ color: $elevator-list-item-bars-inner-item-active-color;
+ }
+ }
+ }
+ }
+}
diff --git a/uni_modules/nutui-uni/components/elevator/index.ts b/uni_modules/nutui-uni/components/elevator/index.ts
new file mode 100644
index 0000000..11bab50
--- /dev/null
+++ b/uni_modules/nutui-uni/components/elevator/index.ts
@@ -0,0 +1,2 @@
+export * from './elevator'
+export * from './type'
diff --git a/uni_modules/nutui-uni/components/elevator/type.ts b/uni_modules/nutui-uni/components/elevator/type.ts
new file mode 100644
index 0000000..aa228ca
--- /dev/null
+++ b/uni_modules/nutui-uni/components/elevator/type.ts
@@ -0,0 +1,9 @@
+export interface ElevatorData {
+ name?: string
+ id?: number | string
+ [key: string]: any
+}
+
+export interface ElevatorInst {
+ scrollTo: (val: number) => void
+}
diff --git a/uni_modules/nutui-uni/components/ellipsis/ellipsis.ts b/uni_modules/nutui-uni/components/ellipsis/ellipsis.ts
new file mode 100644
index 0000000..186c079
--- /dev/null
+++ b/uni_modules/nutui-uni/components/ellipsis/ellipsis.ts
@@ -0,0 +1,54 @@
+import type { ExtractPropTypes } from 'vue'
+import { CLICK_EVENT } from '../_constants'
+import { commonProps, makeNumericProp, makeStringProp } from '../_utils'
+
+export interface EllipsisedValue {
+ leading?: string
+ tailing?: string
+}
+export const ellipsisProps = {
+ ...commonProps,
+ /**
+ * @description 文本内容
+ */
+ content: makeStringProp(''),
+
+ /**
+ * @description 省略位置,可选值 `start` \| `end` \| `middle`
+ */
+ direction: makeStringProp<'start' | 'end' | 'middle'>('end'),
+
+ /**
+ * @description 展示几行
+ */
+ rows: makeNumericProp(1),
+
+ /**
+ * @description 展开操作的文案
+ */
+ expandText: makeStringProp(''),
+
+ /**
+ * @description 收起操作的文案
+ */
+ collapseText: makeStringProp(''),
+
+ /**
+ * @description 省略的符号
+ */
+ symbol: makeStringProp('...'),
+
+ /**
+ * @description 容器的行高
+ */
+ lineHeight: makeNumericProp('20'),
+}
+
+export type EllipsisProps = ExtractPropTypes
+
+export const ellipsisEmits = {
+ change: (val: 'expand' | 'collapse') => val,
+ [CLICK_EVENT]: () => true,
+}
+
+export type EllipsisEmits = typeof ellipsisEmits
diff --git a/uni_modules/nutui-uni/components/ellipsis/ellipsis.vue b/uni_modules/nutui-uni/components/ellipsis/ellipsis.vue
new file mode 100644
index 0000000..a63c9eb
--- /dev/null
+++ b/uni_modules/nutui-uni/components/ellipsis/ellipsis.vue
@@ -0,0 +1,271 @@
+
+
+
+
+
+
+
+
+ {{ content }}
+
+
+
+ {{ ellipsis.leading }}{{ ellipsis.leading && symbol
+ }}
+
+ {{ expandText }}
+ {{ ellipsis.tailing && symbol }}{{ ellipsis.tailing }}
+
+
+ {{ content }}
+
+ {{ collapseText }}
+
+
+
+
+
+ {{ contantCopy }}
+
+
+
+
+ {{
+ symbolText
+ }}
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/ellipsis/index.scss b/uni_modules/nutui-uni/components/ellipsis/index.scss
new file mode 100644
index 0000000..a23cb46
--- /dev/null
+++ b/uni_modules/nutui-uni/components/ellipsis/index.scss
@@ -0,0 +1,18 @@
+.nut-ellipsis {
+ display: flex;
+
+ .nut-ellipsis__text {
+ display: inline;
+ color: $ellipsis-expand-collapse-color;
+ cursor: hand;
+ }
+
+ .nut-ellipsis__wordbreak {
+ word-break: break-all;
+ }
+}
+
+.nut-ellipsis__copy {
+ position: absolute;
+ top: -999999px;
+}
diff --git a/uni_modules/nutui-uni/components/ellipsis/index.ts b/uni_modules/nutui-uni/components/ellipsis/index.ts
new file mode 100644
index 0000000..6fae4a9
--- /dev/null
+++ b/uni_modules/nutui-uni/components/ellipsis/index.ts
@@ -0,0 +1 @@
+export type * from './ellipsis'
diff --git a/uni_modules/nutui-uni/components/empty/empty.ts b/uni_modules/nutui-uni/components/empty/empty.ts
new file mode 100644
index 0000000..467c58c
--- /dev/null
+++ b/uni_modules/nutui-uni/components/empty/empty.ts
@@ -0,0 +1,21 @@
+import type { ExtractPropTypes } from 'vue'
+import { commonProps, makeNumericProp, makeStringProp } from '../_utils'
+
+export const emptyProps = {
+ ...commonProps,
+ /**
+ * @description 图片类型,可选值为 `empty`、`error`、`network`,支持传入图片 `URL`
+ */
+ image: makeStringProp<'empty' | 'error' | 'network' | (string & {})>('empty'),
+
+ /**
+ * @description 图片大小,单位为 `px`
+ */
+ imageSize: makeNumericProp(''),
+
+ /**
+ * @description 图片下方的描述文字
+ */
+ description: makeStringProp(''),
+}
+export type EmptyProps = ExtractPropTypes
diff --git a/uni_modules/nutui-uni/components/empty/empty.vue b/uni_modules/nutui-uni/components/empty/empty.vue
new file mode 100644
index 0000000..e540184
--- /dev/null
+++ b/uni_modules/nutui-uni/components/empty/empty.vue
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ description || translate('noData') }}
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/empty/index.scss b/uni_modules/nutui-uni/components/empty/index.scss
new file mode 100644
index 0000000..9f9404e
--- /dev/null
+++ b/uni_modules/nutui-uni/components/empty/index.scss
@@ -0,0 +1,38 @@
+.nut-theme-dark {
+ .nut-empty {
+ background: $dark-background;
+ }
+}
+
+.nut-empty {
+ box-sizing: border-box;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ padding: $empty-padding;
+
+ &__box {
+ width: $empty-image-size;
+ height: $empty-image-size;
+
+ .img {
+ width: 100%;
+ height: 100%;
+ }
+
+ // 兼容小程序标签和img-slot
+ image {
+ width: 100%;
+ height: 100%;
+ }
+ }
+
+ &__description {
+ padding: $empty-description-padding;
+ margin-top: $empty-description-margin-top;
+ font-size: $empty-description-font-size;
+ line-height: $empty-description-line-height;
+ color: $empty-description-color;
+ }
+}
diff --git a/uni_modules/nutui-uni/components/empty/index.ts b/uni_modules/nutui-uni/components/empty/index.ts
new file mode 100644
index 0000000..d08b741
--- /dev/null
+++ b/uni_modules/nutui-uni/components/empty/index.ts
@@ -0,0 +1 @@
+export type * from './empty'
diff --git a/uni_modules/nutui-uni/components/fixednav/fixednav.ts b/uni_modules/nutui-uni/components/fixednav/fixednav.ts
new file mode 100644
index 0000000..6293576
--- /dev/null
+++ b/uni_modules/nutui-uni/components/fixednav/fixednav.ts
@@ -0,0 +1,63 @@
+import type { ExtractPropTypes } from 'vue'
+import { SELECTED_EVENT, UPDATE_VISIBLE_EVENT } from '../_constants'
+import { commonProps, isBoolean, makeArrayProp, makeStringProp, truthProp } from '../_utils'
+
+export const fixednavProps = {
+ ...commonProps,
+ /**
+ * @description 是否打开
+ */
+ visible: Boolean,
+
+ /**
+ * @description 悬浮列表内容数据
+ */
+ navList: makeArrayProp([]),
+
+ /**
+ * @description 选中按钮文案颜色
+ */
+ activeColor: makeStringProp(''),
+
+ /**
+ * @description 收起列表按钮文案
+ */
+ activeText: makeStringProp(''),
+
+ /**
+ * @description 展开列表按钮文案
+ */
+ unActiveText: makeStringProp(''),
+
+ /**
+ * @description 导航方向,可选值 'left'、'right'
+ */
+ type: makeStringProp<'left' | 'right'>('right'),
+
+ /**
+ * @description 展开时是否显示遮罩
+ */
+ overlay: truthProp,
+
+ /**
+ * @description fixed 垂直位置
+ */
+ position: {
+ default: () => {
+ return {
+ top: 'auto',
+ bottom: 'auto',
+ }
+ },
+ type: Object,
+ },
+}
+
+export type FixednavProps = ExtractPropTypes
+
+export const fixednavEmits = {
+ [UPDATE_VISIBLE_EVENT]: (val: boolean) => isBoolean(val),
+ [SELECTED_EVENT]: (val: { item: any, event: Event }) => val instanceof Object,
+}
+
+export type FixednavEmits = typeof fixednavEmits
diff --git a/uni_modules/nutui-uni/components/fixednav/fixednav.vue b/uni_modules/nutui-uni/components/fixednav/fixednav.vue
new file mode 100644
index 0000000..5be3d4e
--- /dev/null
+++ b/uni_modules/nutui-uni/components/fixednav/fixednav.vue
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.text }}
+
+
+ {{ item.num }}
+
+
+
+
+
+
+
+
+ {{ visible ? activeText || translate('activeText') : unActiveText
+ || translate('unActiveText') }}
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/fixednav/index.scss b/uni_modules/nutui-uni/components/fixednav/index.scss
new file mode 100644
index 0000000..5b15963
--- /dev/null
+++ b/uni_modules/nutui-uni/components/fixednav/index.scss
@@ -0,0 +1,158 @@
+@import '../overlay/index';
+
+.nut-theme-dark {
+ .nut-fixed-nav {
+ &__list {
+ background: $dark-background7;
+ }
+ }
+}
+
+.nut-fixed-nav {
+ position: fixed;
+ right: 0;
+ z-index: $fixednav-index;
+ display: inline-block;
+ height: 50px;
+
+ &.active {
+ .nut-icon {
+ transform: rotate(180deg);
+ }
+
+ .nut-fixed-nav__list {
+ transform: translateX(0%) !important;
+ }
+
+ &.left {
+ .nut-icon {
+ transform: rotate(0deg) !important;
+ }
+ }
+ }
+
+ &__btn {
+ position: absolute;
+ right: 0;
+ z-index: calc($fixednav-index + 1);
+ box-sizing: border-box;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 80px;
+ height: 100%;
+ padding-left: 12px;
+ background: $fixednav-btn-bg;
+ border-radius: 45px 0 0 45px;
+ box-shadow: 0 2px 4px 0 rgb(0 0 0 / 20%);
+
+ > .text {
+ flex-shrink: 0;
+ width: 24px;
+ font-size: 10px;
+ line-height: 13px;
+ color: $fixednav-bg-color;
+ }
+
+ .nut-icon {
+ margin-right: 5px;
+ transition: all 0.3s;
+ transform: rotate(0deg);
+ }
+ }
+
+ &__list {
+ position: absolute;
+ right: 0;
+ z-index: $fixednav-index;
+ box-sizing: border-box;
+ display: flex;
+ flex-shrink: 0;
+ justify-content: space-between;
+ height: 100%;
+ padding: 0;
+ margin: 0;
+ background: $fixednav-bg-color;
+ border-radius: 25px 0 0 25px;
+ box-shadow: 2px 2px 8px 0 rgb(0 0 0 / 20%);
+ transition: all 0.5s;
+ transform: translateX(100%);
+ padding: {
+ right: 80px;
+ left: 20px;
+ }
+
+ &-item {
+ position: relative;
+ box-sizing: border-box;
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+ flex-shrink: 0;
+ align-items: center;
+ justify-content: center;
+ min-width: 50px;
+ height: 100%;
+ padding: 0;
+ margin: 0;
+
+ &.active {
+ > .span {
+ color: $fixednav-item-active-color;
+ }
+ }
+
+ > image {
+ width: 20px;
+ height: 20px;
+ margin-bottom: 2px;
+ }
+
+ > .span {
+ font-size: 10px;
+ color: $fixednav-font-color;
+ }
+
+ > .b {
+ position: absolute;
+ top: 1px;
+ right: 0;
+ min-width: 12px;
+ height: 14px;
+ padding: 0 3px;
+ font-size: 10px;
+ line-height: 14px;
+ color: white;
+ text-align: center;
+ background: $primary-color;
+ border-radius: 7px;
+ }
+ }
+ }
+
+ &.left {
+ right: auto;
+ left: 0;
+
+ .nut-fixed-nav__btn {
+ right: auto;
+ left: 0;
+ flex-direction: row-reverse;
+ border-radius: 0 45px 45px 0;
+
+ .nut-icon {
+ transform: rotate(180deg);
+ }
+ }
+
+ .nut-fixed-nav__list {
+ right: auto;
+ border-radius: 0 25px 25px 0;
+ transform: translateX(-100%);
+ padding: {
+ right: 20px;
+ left: 80px;
+ }
+ }
+ }
+}
diff --git a/uni_modules/nutui-uni/components/fixednav/index.ts b/uni_modules/nutui-uni/components/fixednav/index.ts
new file mode 100644
index 0000000..0991849
--- /dev/null
+++ b/uni_modules/nutui-uni/components/fixednav/index.ts
@@ -0,0 +1 @@
+export * from './fixednav'
diff --git a/uni_modules/nutui-uni/components/form/form.ts b/uni_modules/nutui-uni/components/form/form.ts
new file mode 100644
index 0000000..3e508ad
--- /dev/null
+++ b/uni_modules/nutui-uni/components/form/form.ts
@@ -0,0 +1,54 @@
+import { computed } from 'vue'
+import type { ExtractPropTypes, Ref } from 'vue'
+import { useInject } from '../_hooks'
+import { commonProps, makeObjectProp, makeStringProp } from '../_utils'
+import type { ErrorMessage, FormLabelPosition, FormRules, FormStarPosition } from './types'
+
+export const FORM_KEY = Symbol('Form')
+
+export const formProps = {
+ ...commonProps,
+ /**
+ * @description 表单数据对象(使用表单校验时,_必填_)
+ */
+ modelValue: makeObjectProp({}),
+
+ /**
+ * @description 统一配置每个 `FormItem` 的 `rules`
+ */
+ rules: makeObjectProp({}),
+ /**
+ * @description 禁用表单下的所有数据录入组件
+ */
+ disabled: Boolean,
+ /**
+ * @description 表单项 label 的位置
+ */
+ labelPosition: makeStringProp('left'),
+ /**
+ * @description 必填表单项 label 的红色星标位置
+ */
+ starPosition: makeStringProp('left'),
+}
+
+export type FormProps = ExtractPropTypes
+
+export const formEmits = {
+ validate: (msg: ErrorMessage) => msg instanceof Object,
+}
+
+export type FormEmits = typeof formEmits
+
+export function useFormDisabled(disabled: Ref) {
+ const { parent } = useInject<{ props: { disabled: boolean } }>(FORM_KEY)
+
+ return computed(() => {
+ if (disabled.value != null)
+ return disabled.value
+
+ if (parent?.props.disabled != null)
+ return parent.props.disabled
+
+ return false
+ })
+}
diff --git a/uni_modules/nutui-uni/components/form/form.vue b/uni_modules/nutui-uni/components/form/form.vue
new file mode 100644
index 0000000..b89e74d
--- /dev/null
+++ b/uni_modules/nutui-uni/components/form/form.vue
@@ -0,0 +1,207 @@
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/form/index.scss b/uni_modules/nutui-uni/components/form/index.scss
new file mode 100644
index 0000000..2ec5402
--- /dev/null
+++ b/uni_modules/nutui-uni/components/form/index.scss
@@ -0,0 +1 @@
+@import '../cellgroup/index';
diff --git a/uni_modules/nutui-uni/components/form/index.ts b/uni_modules/nutui-uni/components/form/index.ts
new file mode 100644
index 0000000..1f37188
--- /dev/null
+++ b/uni_modules/nutui-uni/components/form/index.ts
@@ -0,0 +1,2 @@
+export type * from './form'
+export * from './types'
diff --git a/uni_modules/nutui-uni/components/form/types.ts b/uni_modules/nutui-uni/components/form/types.ts
new file mode 100644
index 0000000..ad54ac1
--- /dev/null
+++ b/uni_modules/nutui-uni/components/form/types.ts
@@ -0,0 +1,33 @@
+import type { FormItemLabelPosition, FormItemRule, FormItemStarPosition } from '../formitem/types'
+
+export interface FormRules {
+ [key: string]: FormItemRule[]
+}
+
+export interface FormRule {
+ prop: string
+ rules: FormItemRule[]
+}
+
+export interface ErrorMessage {
+ prop: string
+ message: string
+}
+
+export interface FormInst {
+ /**
+ * @description 清空校验结果
+ */
+ reset: () => void
+ /**
+ * @description 提交表单进行校验的方法
+ */
+ submit: () => void
+ /**
+ * @description 用户主动触发校验,用于用户自定义场景时触发,例如 `blur`、`change` 事件 | 同 `FormItem prop` 值,不传值会校验全部 `Rule`
+ */
+ validate: (customProp?: any) => Promise<{ valid: boolean, errors: ErrorMessage[] }>
+}
+
+export type FormLabelPosition = FormItemLabelPosition
+export type FormStarPosition = FormItemStarPosition
diff --git a/uni_modules/nutui-uni/components/formitem/formitem.ts b/uni_modules/nutui-uni/components/formitem/formitem.ts
new file mode 100644
index 0000000..f6f89d8
--- /dev/null
+++ b/uni_modules/nutui-uni/components/formitem/formitem.ts
@@ -0,0 +1,66 @@
+import type { ExtractPropTypes } from 'vue'
+import { commonProps, makeArrayProp, makeNumericProp, makeStringProp, nullableBooleanProp, truthProp } from '../_utils'
+import type { FormItemLabelPosition, FormItemRule, FormItemStarPosition } from './types'
+
+export const formitemProps = {
+ ...commonProps,
+ /**
+ * @description 是否显示必填字段的标签旁边的红色星号
+ */
+ required: nullableBooleanProp,
+
+ /**
+ * @description 表单域 `v-model` 字段,在使用表单校验功能的情况下,该属性是必填的
+ */
+ prop: makeStringProp(''),
+ /**
+ * @description
+ */
+ label: makeStringProp(''),
+ /**
+ * @description 定义校验规则
+ */
+ rules: makeArrayProp([]),
+
+ /**
+ * @description 表单项 `label` 宽度,默认单位为 `px`
+ */
+ labelWidth: makeNumericProp(''),
+
+ /**
+ * @description 表单项 `label` 对齐方式,可选值为 `center`、`right`
+ */
+ labelAlign: makeStringProp<'left' | 'center' | 'right'>('left'),
+
+ /**
+ * @description 右侧插槽对齐方式,可选值为 `center`、`right`
+ */
+ bodyAlign: makeStringProp<'left' | 'center' | 'right'>('left'),
+
+ /**
+ * @description 错误提示文案对齐方式,可选值为 `center`、`right`
+ */
+ errorMessageAlign: makeStringProp<'left' | 'center' | 'right'>('left'),
+
+ /**
+ * @description 是否在校验不通过时标红输入框
+ */
+ showErrorLine: truthProp,
+
+ /**
+ * @description 是否在校验不通过时在输入框下方展示错误提示
+ * @type {boolean}
+ * @default true
+ */
+ showErrorMessage: truthProp,
+ /**
+ * @description 表单项 label 的位置,优先级高于 form 中的 `label-position`
+ */
+ labelPosition: makeStringProp(undefined),
+ /**
+ * @description 必填表单项 label 的红色星标位置,优先级高于 form 中的 `star-position`
+ */
+ starPosition: makeStringProp(undefined),
+}
+
+export type FormItemProps = ExtractPropTypes
diff --git a/uni_modules/nutui-uni/components/formitem/formitem.vue b/uni_modules/nutui-uni/components/formitem/formitem.vue
new file mode 100644
index 0000000..02be554
--- /dev/null
+++ b/uni_modules/nutui-uni/components/formitem/formitem.vue
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+ {{ formErrorTip[prop] }}
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/formitem/index.scss b/uni_modules/nutui-uni/components/formitem/index.scss
new file mode 100644
index 0000000..48938a4
--- /dev/null
+++ b/uni_modules/nutui-uni/components/formitem/index.scss
@@ -0,0 +1,129 @@
+@import "../cell/index";
+
+.nut-theme-dark {
+ .nut-form-item {
+ &__body {
+ &__slots {
+ :deep(.nut-input) {
+ color: $dark-color;
+ background: transparent;
+ }
+ }
+ }
+ }
+}
+
+.nut-form-item {
+ display: flex;
+
+ &::before {
+ position: absolute;
+ right: 16px;
+ bottom: 0;
+ left: 16px;
+ box-sizing: border-box;
+ pointer-events: none;
+ content: "";
+ transform: scaleX(0);
+ }
+
+ &.error {
+ &.line {
+ &::before {
+ border-bottom: 1px solid $form-item-error-line-color;
+ transition: transform 200ms cubic-bezier(0, 0, 0.2, 1) 0ms;
+ transform: scaleX(1);
+ }
+ }
+ }
+
+ &__label {
+ display: inline-block !important;
+ flex: none !important;
+ width: $form-item-label-width;
+ margin-right: $form-item-label-margin-right;
+ font-size: $form-item-label-font-size;
+ font-weight: normal;
+ text-align: $form-item-label-text-align;
+ word-wrap: break-word;
+
+ &:deep(.nut-cell__title) {
+ min-width: auto;
+ }
+
+ &.required {
+ &::before {
+ margin-right: $form-item-required-margin-right;
+ color: $form-item-required-color;
+ content: '*';
+ }
+
+ &.nut-form-item__star-right {
+ &::before {
+ content: none;
+ }
+
+ &::after {
+ margin-left: $form-item-required-margin-right;
+ color: $form-item-required-color;
+ content: '*';
+ }
+ }
+ }
+ }
+
+ &__body {
+ display: flex !important;
+ flex: 1;
+ flex-direction: column;
+
+ &__slots {
+ text-align: $form-item-body-slots-text-align;
+
+ :deep(.nut-input) {
+ width: 100%;
+ font-size: $form-item-body-font-size;
+ color: $black;
+ text-align: $form-item-body-input-text-align;
+ text-decoration: none;
+ background: transparent;
+ border: 0;
+ outline: 0 none;
+ }
+
+ :deep(.nut-range-container) {
+ min-height: 24px;
+ }
+
+ :deep(.nut-textarea) {
+ padding: 0 !important;
+
+ .nut-textarea__textarea {
+ text-align: $form-item-body-input-text-align;
+ }
+ }
+ }
+
+ &__tips {
+ font-size: $form-item-tip-font-size;
+ color: $form-item-error-message-color;
+ text-align: $form-item-tip-text-align;
+ }
+ }
+
+ &__right {
+ --nut-form-item-label-text-align: right;
+ }
+
+ &__top {
+ flex-direction: column;
+
+ .nut-form-item__label {
+ box-sizing: border-box;
+ display: block;
+ width: 100%;
+ padding-right: 24px;
+ padding-bottom: 5px;
+ }
+ }
+}
diff --git a/uni_modules/nutui-uni/components/formitem/index.ts b/uni_modules/nutui-uni/components/formitem/index.ts
new file mode 100644
index 0000000..7dc9f45
--- /dev/null
+++ b/uni_modules/nutui-uni/components/formitem/index.ts
@@ -0,0 +1,2 @@
+export type * from './formitem'
+export * from './types'
diff --git a/uni_modules/nutui-uni/components/formitem/types.ts b/uni_modules/nutui-uni/components/formitem/types.ts
new file mode 100644
index 0000000..ac64013
--- /dev/null
+++ b/uni_modules/nutui-uni/components/formitem/types.ts
@@ -0,0 +1,16 @@
+export class FormItemRuleWithoutValidator {
+ regex?: RegExp
+ required?: boolean
+ message!: string;
+ [key: string]: any;
+}
+
+export interface FormItemRule extends FormItemRuleWithoutValidator {
+ validator?: (
+ value: any,
+ ruleCfg: FormItemRuleWithoutValidator
+ ) => boolean | Promise | Promise | Promise | Promise
+}
+
+export type FormItemLabelPosition = 'left' | 'right' | 'top'
+export type FormItemStarPosition = 'left' | 'right'
diff --git a/uni_modules/nutui-uni/components/giftbox/giftbox.ts b/uni_modules/nutui-uni/components/giftbox/giftbox.ts
new file mode 100644
index 0000000..ba21e89
--- /dev/null
+++ b/uni_modules/nutui-uni/components/giftbox/giftbox.ts
@@ -0,0 +1,13 @@
+export const giftboxEmits = {
+ startTurns: () => true,
+ endTurns: () => true,
+}
+
+export type GiftBoxEmits = typeof giftboxEmits
+
+export interface GiftBoxInst {
+ /**
+ * @description 礼盒初始化
+ */
+ init: () => void
+}
diff --git a/uni_modules/nutui-uni/components/giftbox/giftbox.vue b/uni_modules/nutui-uni/components/giftbox/giftbox.vue
new file mode 100644
index 0000000..34fafde
--- /dev/null
+++ b/uni_modules/nutui-uni/components/giftbox/giftbox.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/giftbox/index.scss b/uni_modules/nutui-uni/components/giftbox/index.scss
new file mode 100644
index 0000000..35feadf
--- /dev/null
+++ b/uni_modules/nutui-uni/components/giftbox/index.scss
@@ -0,0 +1,67 @@
+.giftbox-wraper {
+ display: block;
+ padding: 5px;
+ background: url("https://img10.360buyimg.com/imagetools/jfs/t1/80308/16/17542/310729/613b20a9Ef0a4b640/85977b5e747213ca.png") no-repeat;
+ background-size: 100% 100%;
+}
+
+.gift-box {
+ position: relative;
+ display: block;
+ width: 300px;
+ height: 200px;
+ margin: 110px auto 0;
+
+// stylelint-disable selector-class-pattern
+ .gBox {
+ position: absolute;
+ }
+
+ .gift-box-1 {
+ top: 20%;
+ left: 50%;
+ z-index: 120;
+ width: 63%;
+ height: 35%;
+ margin: -11% 0 0 -32%;
+ background: url('https://img11.360buyimg.com/imagetools/jfs/t1/79939/3/16076/28752/613b1610Edbfa9502/16bdec9244e231b0.png') no-repeat;
+ background-position: center center;
+ background-size: 100% 100%;
+ transition:all linear 0.6s;
+ }
+
+ .gift-box-1-open {
+ margin: -26% 0 0 -27%;
+ transform: rotateZ(22deg);
+ }
+
+ .gift-box-2 {
+ top: 55%;
+ left: 50%;
+ z-index: 10;
+ width: 60%;
+ height: 60%;
+ background: url('https://img14.360buyimg.com/imagetools/jfs/t1/67459/8/17031/35435/613b1611E14f88d6d/276574386be58ddd.png') no-repeat;
+ background-position: center center;
+ background-size: 100% 100%;
+ transform: translate(-50%, -50%);
+ }
+
+ .gift-box-3 {
+ top: 0;
+ left: 50%;
+ z-index: 5;
+ width: 100%;
+ height: 100%;
+ background: url('https://img12.360buyimg.com/imagetools/jfs/t1/206640/13/170/107814/613b1611E104d998f/0f570d559327b701.png') no-repeat;
+ background-position: center center;
+ background-size: 100% 100%;
+ opacity: 0;
+ transition: all .3s linear 0.4s;
+ transform: translate(-50%, -50%);
+ }
+
+ .gift-box-3-open {
+ opacity: 1;
+ }
+}
diff --git a/uni_modules/nutui-uni/components/giftbox/index.ts b/uni_modules/nutui-uni/components/giftbox/index.ts
new file mode 100644
index 0000000..40d70ba
--- /dev/null
+++ b/uni_modules/nutui-uni/components/giftbox/index.ts
@@ -0,0 +1 @@
+export type * from './giftbox'
diff --git a/uni_modules/nutui-uni/components/grid/grid.ts b/uni_modules/nutui-uni/components/grid/grid.ts
new file mode 100644
index 0000000..20cd035
--- /dev/null
+++ b/uni_modules/nutui-uni/components/grid/grid.ts
@@ -0,0 +1,49 @@
+import type { ExtractPropTypes } from 'vue'
+import { commonProps, makeNumericProp, makeStringProp, truthProp } from '../_utils'
+
+export const GRID_KEY = Symbol('grid')
+
+export const gridProps = {
+ ...commonProps,
+ /**
+ * @description 列数
+ */
+ columnNum: makeNumericProp(4),
+
+ /**
+ * @description 是否显示边框
+ */
+ border: truthProp,
+
+ /**
+ * @description 格子之间的间距,默认单位为 `px`
+ */
+ gutter: makeNumericProp(0),
+
+ /**
+ * @description 是否将格子内容居中显示
+ */
+ center: truthProp,
+
+ /**
+ * @description 是否将格子固定为正方形
+ */
+ square: Boolean,
+
+ /**
+ * @description 内容翻转
+ */
+ reverse: Boolean,
+
+ /**
+ * @description 格子内容排列的方向,可选值为 `horizontal`
+ */
+ direction: makeStringProp<'horizontal' | 'vertical'>('vertical'),
+
+ /**
+ * @description 是否开启格子点击反馈
+ */
+ clickable: Boolean,
+}
+
+export type GridProps = ExtractPropTypes
diff --git a/uni_modules/nutui-uni/components/grid/grid.vue b/uni_modules/nutui-uni/components/grid/grid.vue
new file mode 100644
index 0000000..e4d5513
--- /dev/null
+++ b/uni_modules/nutui-uni/components/grid/grid.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/grid/index.scss b/uni_modules/nutui-uni/components/grid/index.scss
new file mode 100644
index 0000000..7ea370e
--- /dev/null
+++ b/uni_modules/nutui-uni/components/grid/index.scss
@@ -0,0 +1,20 @@
+.nut-theme-dark {
+ .nut-grid {
+ display: flex;
+ flex-wrap: wrap;
+ border: 0 solid $dark-background;
+ }
+}
+
+
+
+.nut-grid {
+ display: flex;
+ flex-wrap: wrap;
+ border: 0 solid $grid-border-color;
+
+ &--border {
+ border-top-width: 1px;
+ border-left-width: 1px;
+ }
+}
diff --git a/uni_modules/nutui-uni/components/grid/index.ts b/uni_modules/nutui-uni/components/grid/index.ts
new file mode 100644
index 0000000..55d044a
--- /dev/null
+++ b/uni_modules/nutui-uni/components/grid/index.ts
@@ -0,0 +1 @@
+export * from './grid'
diff --git a/uni_modules/nutui-uni/components/griditem/griditem.ts b/uni_modules/nutui-uni/components/griditem/griditem.ts
new file mode 100644
index 0000000..abf7207
--- /dev/null
+++ b/uni_modules/nutui-uni/components/griditem/griditem.ts
@@ -0,0 +1,32 @@
+import type { ExtractPropTypes } from 'vue'
+import { CLICK_EVENT } from '../_constants'
+import { commonProps } from '../_utils'
+
+export const gridItemProps = {
+ ...commonProps,
+ /**
+ * @description 文字
+ */
+ text: String,
+ /**
+ * @description 点击后跳转的目标路由对象,同 vue-router 的 to 属性
+ */
+ to: [String, Object],
+ /**
+ * @description 点击后跳转的链接地址
+ */
+ url: String,
+ /**
+ * @description 是否在跳转时替换当前页面历史
+ */
+ replace: Boolean,
+ background: String
+}
+
+export type GridItemProps = ExtractPropTypes
+
+export const gridItemEmits = {
+ [CLICK_EVENT]: (evt: MouseEvent) => evt instanceof Object,
+}
+
+export type GridItemEmits = typeof gridItemEmits
diff --git a/uni_modules/nutui-uni/components/griditem/griditem.vue b/uni_modules/nutui-uni/components/griditem/griditem.vue
new file mode 100644
index 0000000..4c8d070
--- /dev/null
+++ b/uni_modules/nutui-uni/components/griditem/griditem.vue
@@ -0,0 +1,107 @@
+
+
+
+
+
+
+
+
+
+
+ {{ text }}
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/griditem/index.scss b/uni_modules/nutui-uni/components/griditem/index.scss
new file mode 100644
index 0000000..a7b46c7
--- /dev/null
+++ b/uni_modules/nutui-uni/components/griditem/index.scss
@@ -0,0 +1,107 @@
+.nut-theme-dark {
+ .nut-grid-item {
+ &__content {
+ color: $dark-color;
+ background: $dark-background;
+ border: 0 solid $dark-background2;
+ }
+
+ &__text {
+ color: $dark-color;
+ }
+ }
+}
+
+.nut-grid-item {
+ position: relative;
+ box-sizing: border-box;
+
+ $block: &;
+
+ &__text {
+ margin: $grid-item-text-margin 0 0 0;
+ font-size: $grid-item-text-font-size;
+ line-height: 1.5;
+ color: $grid-item-text-color;
+ word-break: break-all;
+ }
+
+ &__content {
+ box-sizing: border-box;
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ padding: $grid-item-content-padding;
+ background: $grid-item-content-bg-color;
+ border: 0 solid $grid-border-color;
+
+ &--border {
+ border-right-width: 1px;
+ border-bottom-width: 1px;
+ }
+
+ &--surround {
+ border-top-width: 1px;
+ border-left-width: 1px;
+ }
+
+ &--center {
+ align-items: center;
+ justify-content: center;
+ }
+
+ &--square {
+ position: absolute;
+ top: 0;
+ right: 0;
+ left: 0;
+ }
+
+ &--reverse {
+ flex-direction: column-reverse;
+
+ #{$block}__text {
+ margin: 0 0 $grid-item-text-margin;
+ }
+ }
+
+ &--horizontal {
+ flex-direction: row;
+
+ #{$block}__text {
+ margin: 0 0 0 $grid-item-text-margin;
+ }
+ }
+
+ &--horizontal#{&}--reverse {
+ flex-direction: row-reverse;
+
+ #{$block}__text {
+ margin: 0 $grid-item-text-margin 0 0;
+ }
+ }
+
+ &--clickable {
+ cursor: pointer;
+
+ &::before {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ width: 100%;
+ height: 100%;
+ content: "";
+ background-color: $black;
+ border: inherit;
+ border-color: $black;
+ border-radius: inherit;
+ opacity: 0;
+ transform: translate(-50%, -50%);
+ }
+
+ &:active::before {
+ opacity: 0.1;
+ }
+ }
+ }
+}
diff --git a/uni_modules/nutui-uni/components/griditem/index.ts b/uni_modules/nutui-uni/components/griditem/index.ts
new file mode 100644
index 0000000..d139b49
--- /dev/null
+++ b/uni_modules/nutui-uni/components/griditem/index.ts
@@ -0,0 +1 @@
+export * from './griditem'
diff --git a/uni_modules/nutui-uni/components/guessgift/guessgift.ts b/uni_modules/nutui-uni/components/guessgift/guessgift.ts
new file mode 100644
index 0000000..932f5f1
--- /dev/null
+++ b/uni_modules/nutui-uni/components/guessgift/guessgift.ts
@@ -0,0 +1,38 @@
+import type { ExtractPropTypes } from 'vue'
+import { commonProps, makeNumberProp } from '../_utils'
+
+export const guessgiftProps = {
+ ...commonProps,
+ initPrize: {
+ type: Boolean,
+ default: true,
+ },
+ /**
+ * @description 交换次数
+ */
+ turnNumber: makeNumberProp(20),
+ /**
+ * @description 动画频率,位置交换更新
+ */
+ turnsFrequency: makeNumberProp(50),
+ /**
+ * @description 碗抬起的高度
+ */
+ raiseHeight: makeNumberProp(50),
+ /**
+ * @description 中奖奖品在列表的索引位置
+ */
+ prizeIndex: makeNumberProp(-1),
+}
+
+export type GuessGiftProps = ExtractPropTypes
+
+export const guessgiftEmits = {
+ startTurns: () => true,
+ endTurns: () => true,
+}
+
+export type GuessGiftEmits = typeof guessgiftEmits
+export interface ShakeDiceInst {
+ shake: () => true
+}
diff --git a/uni_modules/nutui-uni/components/guessgift/guessgift.vue b/uni_modules/nutui-uni/components/guessgift/guessgift.vue
new file mode 100644
index 0000000..8d0a4be
--- /dev/null
+++ b/uni_modules/nutui-uni/components/guessgift/guessgift.vue
@@ -0,0 +1,244 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{
+ "style": {
+ "navigationBarTitleText": "ShakeDice"
+ }
+}
+
diff --git a/uni_modules/nutui-uni/components/guessgift/index.scss b/uni_modules/nutui-uni/components/guessgift/index.scss
new file mode 100644
index 0000000..9f26255
--- /dev/null
+++ b/uni_modules/nutui-uni/components/guessgift/index.scss
@@ -0,0 +1,48 @@
+.nut-guess-gift {
+ position: relative;
+ display: flex !important;
+ align-items: center;
+ justify-content: center;
+
+ .bowl-item {
+ position: relative;
+ top: 0;
+ left: 0;
+ z-index: 10;
+ width: 100px;
+ height: 100px;
+ background: url("https://img14.360buyimg.com/imagetools/jfs/t1/213395/37/9376/5774/61cc34b8Ec3d2eddd/1ddf6d42663e1285.png");
+ background-repeat: no-repeat;
+ background-size: 100% 100%;
+ transition: all ease-out 0.5s;
+ }
+
+ .gold-bean {
+ position: absolute;
+
+ // left: 50%;
+ // transform: translateX(-50%);
+ bottom: 30px;
+ z-index: 1;
+ width: 30px;
+ height: 30px;
+ background: url("https://img13.360buyimg.com/imagetools/jfs/t1/219815/14/9349/4725/61cc34b8E059ebbd2/55e8002ae82a01ea.png");
+ background-repeat: no-repeat;
+ background-size: 100% 100%;
+ }
+
+ // stylelint-disable selector-class-pattern
+
+ ._opacity0 {
+ opacity: 0;
+ }
+
+ ._opacity1 {
+ opacity: 1;
+ }
+}
+
+.disabledClick {
+ pointer-events: none !important;
+ cursor: not-allowed !important;
+}
diff --git a/uni_modules/nutui-uni/components/guessgift/index.ts b/uni_modules/nutui-uni/components/guessgift/index.ts
new file mode 100644
index 0000000..3bbac81
--- /dev/null
+++ b/uni_modules/nutui-uni/components/guessgift/index.ts
@@ -0,0 +1 @@
+export type * from './guessgift'
diff --git a/uni_modules/nutui-uni/components/hiteggs/hiteggs.ts b/uni_modules/nutui-uni/components/hiteggs/hiteggs.ts
new file mode 100644
index 0000000..69df5aa
--- /dev/null
+++ b/uni_modules/nutui-uni/components/hiteggs/hiteggs.ts
@@ -0,0 +1,57 @@
+import type { ExtractPropTypes } from 'vue'
+import { CLICK_EVENT } from '../_constants'
+import { commonProps, makeNumberProp } from '../_utils'
+
+export const hiteggsProps = {
+ ...commonProps,
+ /**
+ * @description 金蛋个数
+ */
+ num: makeNumberProp(9),
+ /**
+ * @description 完整金蛋图片地址
+ */
+ intactImg: {
+ type: String,
+ default:
+ '//img10.360buyimg.com/imagetools/jfs/t1/217651/2/1901/114207/617770f2E74551438/5342f7b949e7bec3.png',
+ },
+ /**
+ * @description 锤子图片
+ */
+ hammer: {
+ type: String,
+ default:
+ '//img13.360buyimg.com/imagetools/jfs/t1/95159/30/17834/9845/61444874E0f463263/924741cae55efb85.png',
+ },
+ /**
+ * @description
+ */
+ splitImg: {
+ type: String,
+ default:
+ '//img13.360buyimg.com/imagetools/jfs/t1/219949/29/1870/75442/61776f7aE5d1a8e07/a8de5321e4e8071e.png',
+ },
+ /**
+ * @description 金蛋图片宽度
+ */
+ width: {
+ type: String,
+ default: '80px',
+ },
+ /**
+ * @description 金蛋图片高度
+ */
+ height: {
+ type: String,
+ default: '80px',
+ },
+}
+
+export type HitEggsProps = ExtractPropTypes
+
+export const hiteggsEmits = {
+ [CLICK_EVENT]: () => true,
+}
+
+export type HitEggsEmits = typeof hiteggsEmits
diff --git a/uni_modules/nutui-uni/components/hiteggs/hiteggs.vue b/uni_modules/nutui-uni/components/hiteggs/hiteggs.vue
new file mode 100644
index 0000000..03fbd77
--- /dev/null
+++ b/uni_modules/nutui-uni/components/hiteggs/hiteggs.vue
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/hiteggs/index.scss b/uni_modules/nutui-uni/components/hiteggs/index.scss
new file mode 100644
index 0000000..ab8e6c6
--- /dev/null
+++ b/uni_modules/nutui-uni/components/hiteggs/index.scss
@@ -0,0 +1,130 @@
+.nut-hiteggs {
+ box-sizing: border-box;
+ display: flex;
+ flex-shrink: 0;
+ flex-wrap: wrap;
+ justify-content: space-between;
+ width: 100%;
+ padding: 25px;
+ overflow: hidden;
+ background-size: 100% 100%;
+
+ .nut-eggs-item {
+ position: relative;
+ width: 80px;
+ height: 80px;
+ margin-bottom: 20px;
+ transition: all 0.3s ease;
+
+ // stylelint-disable selector-class-pattern
+
+ .intactImg {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ animation: move 2s 0s infinite;
+
+ &.hide {
+ opacity: 0;
+ }
+ }
+
+ .splitImg {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ height: 50px;
+ }
+
+ .hammer {
+ position: absolute;
+ top: -15px;
+ right: -18px;
+ width: 50px;
+ height: 30px;
+ transform: rotate(10deg);
+ }
+ }
+}
+
+// stylelint-disable declaration-block-no-duplicate-properties
+
+@keyframes move {
+ 0%,
+ 65% {
+ transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+
+ 70% {
+ transform: rotate(6deg);
+ transform: rotate(6deg);
+ }
+
+ 75% {
+ transform: rotate(-6deg);
+ transform: rotate(-6deg);
+ }
+
+ 80% {
+ transform: rotate(6deg);
+ transform: rotate(6deg);
+ }
+
+ 85% {
+ transform: rotate(-6deg);
+ transform: rotate(-6deg);
+ }
+
+ 90% {
+ transform: rotate(6deg);
+ transform: rotate(6deg);
+ }
+
+ 95% {
+ transform: rotate(-6deg);
+ transform: rotate(-6deg);
+ }
+
+ 100% {
+ transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+}
+
+// stylelint-disable keyframes-name-pattern
+
+@keyframes shake-rotate {
+ 0% {
+ transform: rotate(10deg);
+ transform: rotate(10deg);
+ }
+
+ 20% {
+ transform: rotate(30deg);
+ transform: rotate(30deg);
+ }
+
+ 40% {
+ transform: rotate(50deg);
+ transform: rotate(50deg);
+ }
+
+ 60% {
+ transform: rotate(50deg);
+ transform: rotate(50deg);
+ }
+
+ 80% {
+ transform: rotate(30deg);
+ transform: rotate(30deg);
+ }
+
+ 100% {
+ transform: rotate(10deg);
+ transform: rotate(10deg);
+ }
+}
diff --git a/uni_modules/nutui-uni/components/hiteggs/index.ts b/uni_modules/nutui-uni/components/hiteggs/index.ts
new file mode 100644
index 0000000..a48325a
--- /dev/null
+++ b/uni_modules/nutui-uni/components/hiteggs/index.ts
@@ -0,0 +1 @@
+export type * from './hiteggs'
diff --git a/uni_modules/nutui-uni/components/icon/icon.ts b/uni_modules/nutui-uni/components/icon/icon.ts
new file mode 100644
index 0000000..54e93b4
--- /dev/null
+++ b/uni_modules/nutui-uni/components/icon/icon.ts
@@ -0,0 +1,44 @@
+import type { ExtractPropTypes } from 'vue'
+import { CLICK_EVENT } from '../_constants'
+import { commonProps, makeNumericProp, makeStringProp } from '../_utils'
+
+export const iconProps = {
+ ...commonProps,
+ popClass: { type: String, default: '' },
+ /**
+ * @description 图标宽度
+ */
+ width: makeNumericProp(''),
+ /**
+ * @description 图标高度
+ */
+ height: makeNumericProp(''),
+ /**
+ * @description 图标名称
+ */
+ name: makeStringProp(''),
+ /**
+ * @description 图标大小
+ */
+ size: makeNumericProp(''),
+ /**
+ * @description 自定义 `icon` 类名前缀,用于使用自定义图标
+ */
+ classPrefix: { type: String, default: 'nut-icon' },
+ /**
+ * @description 自定义 `icon` 字体基础类名
+ */
+ fontClassName: { type: String, default: 'nutui-iconfont' },
+ /**
+ * @description 图标颜色
+ */
+ customColor: { type: String, default: '' },
+}
+
+export type IconProps = ExtractPropTypes
+
+export const iconEmits = {
+ [CLICK_EVENT]: (evt: Event) => evt instanceof Object,
+}
+
+export type IconEmits = typeof iconEmits
diff --git a/uni_modules/nutui-uni/components/icon/icon.vue b/uni_modules/nutui-uni/components/icon/icon.vue
new file mode 100644
index 0000000..1f474e4
--- /dev/null
+++ b/uni_modules/nutui-uni/components/icon/icon.vue
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/icon/index.scss b/uni_modules/nutui-uni/components/icon/index.scss
new file mode 100644
index 0000000..94591f9
--- /dev/null
+++ b/uni_modules/nutui-uni/components/icon/index.scss
@@ -0,0 +1,96 @@
+.nut-icon {
+ position: relative;
+ display: inline-block;
+ width: $icon-width;
+ height: $icon-height;
+ line-height: $icon-line-height;
+ text-align: right;
+
+ --animate-duration: 1s;
+ --animate-delay: 0s;
+
+ &::before {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ }
+
+ &__img {
+ width: $icon-width;
+ height: $icon-height;
+ object-fit: contain;
+ }
+
+ &-loading,
+ &-loading1 {
+ display: inline-block;
+ animation: rotation 1s infinite linear;
+ }
+
+ &-am-infinite {
+ animation-iteration-count: infinite;
+ animation-direction: alternate;
+ }
+
+ &-am-jump {
+ animation-name: nutJumpOne;
+ animation-duration: var(--animate-duration);
+ animation-timing-function: ease;
+ animation-delay: var(--animate-delay);
+
+ &.nut-icon-am-infinite {
+ animation-name: nutJump;
+ }
+ }
+
+ &-am-rotate {
+ animation-name: rotation;
+ animation-duration: var(--animate-duration);
+ animation-timing-function: linear;
+ animation-delay: var(--animate-delay);
+
+ &.nut-icon-am-infinite {
+ animation-direction: normal;
+ }
+ }
+
+ &-am-blink {
+ animation-name: nutBlink;
+ animation-duration: var(--animate-duration);
+ animation-timing-function: linear;
+ animation-delay: var(--animate-delay);
+ }
+
+ &-am-breathe {
+ animation-name: nutBreathe;
+ animation-duration: var(--animate-duration);
+ animation-timing-function: ease-in-out;
+ animation-delay: var(--animate-delay);
+ }
+
+ &-am-flash {
+ animation-name: nutFlash;
+ animation-duration: var(--animate-duration);
+ animation-timing-function: ease-in-out;
+ animation-delay: var(--animate-delay);
+ }
+
+ &-am-bounce {
+ animation-name: nutBounce;
+ animation-duration: var(--animate-duration);
+ animation-timing-function: ease-in-out;
+ animation-delay: var(--animate-delay);
+
+ &.nut-icon-am-infinite {
+ animation-direction: normal;
+ }
+ }
+
+ &-am-shake {
+ animation-name: nutShake;
+ animation-duration: var(--animate-duration);
+ animation-timing-function: ease-in-out;
+ animation-delay: var(--animate-delay);
+ }
+}
diff --git a/uni_modules/nutui-uni/components/icon/index.ts b/uni_modules/nutui-uni/components/icon/index.ts
new file mode 100644
index 0000000..35540fa
--- /dev/null
+++ b/uni_modules/nutui-uni/components/icon/index.ts
@@ -0,0 +1 @@
+export type * from './icon'
diff --git a/uni_modules/nutui-uni/components/imagepreview/imagepreview.ts b/uni_modules/nutui-uni/components/imagepreview/imagepreview.ts
new file mode 100644
index 0000000..0f0bef5
--- /dev/null
+++ b/uni_modules/nutui-uni/components/imagepreview/imagepreview.ts
@@ -0,0 +1,72 @@
+import type { ExtractPropTypes, PropType } from 'vue'
+import { CLOSE_EVENT } from '../_constants'
+import type { Interceptor } from '../_utils'
+import { commonProps, isNumber, makeArrayProp, makeNumberProp, makeNumericProp, makeStringProp, truthProp } from '../_utils'
+import type { ImageInterface } from './types'
+
+export const imagepreviewProps = {
+ ...commonProps,
+ /**
+ * @description 是否展示预览图片
+ */
+ show: Boolean,
+ /**
+ * @description 是否缩放图片
+ */
+ scale: Boolean,
+ /**
+ * @description 预览图片数组
+ */
+ images: makeArrayProp([]),
+ /**
+ * @description 点击图片可以退出预览
+ */
+ contentClose: truthProp,
+ /**
+ * @description 初始页码
+ */
+ initNo: makeNumberProp(0),
+ /**
+ * @description 分页指示器是否展示
+ */
+ paginationVisible: Boolean,
+ /**
+ * @description 分页指示器选中的颜色
+ */
+ paginationColor: makeStringProp('#fff'),
+ /**
+ * @description 自动轮播时长,0 表示不会自动轮播
+ */
+ autoplay: makeNumericProp(3000),
+ /**
+ * @description 是否显示页码
+ */
+ showIndex: truthProp,
+ /**
+ * 是否显示关闭图标
+ * @description 是否显示关闭图标
+ */
+ closeable: Boolean,
+ /**
+ * @description 关闭图标位置,可选值:`top-left`
+ */
+ closeIconPosition: makeStringProp<'top-right' | 'top-left'>('top-right'),
+ /**
+ * @description 关闭前的回调函数,返回 `false` 可阻止关闭,支持返回 `Promise`
+ */
+ beforeClose: Function as PropType,
+ /**
+ * @description 是否循环播放
+ */
+ isLoop: truthProp,
+}
+
+export type ImagePreviewProps = ExtractPropTypes
+
+export const imagepreviewEmits = {
+ [CLOSE_EVENT]: () => true,
+ change: (val: number) => isNumber(val),
+ longPress: (image: ImageInterface) => image instanceof Object,
+}
+
+export type ImagePreviewEmits = typeof imagepreviewEmits
diff --git a/uni_modules/nutui-uni/components/imagepreview/imagepreview.vue b/uni_modules/nutui-uni/components/imagepreview/imagepreview.vue
new file mode 100644
index 0000000..2a43d78
--- /dev/null
+++ b/uni_modules/nutui-uni/components/imagepreview/imagepreview.vue
@@ -0,0 +1,277 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ state.active + 1 }} / {{ images.length }}
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/imagepreview/index.scss b/uni_modules/nutui-uni/components/imagepreview/index.scss
new file mode 100644
index 0000000..a4c4301
--- /dev/null
+++ b/uni_modules/nutui-uni/components/imagepreview/index.scss
@@ -0,0 +1,93 @@
+@import '../popup/index';
+@import '../swiper/index';
+@import '../swiperitem/index';
+
+.nut-image-movable-area{
+ width: 100vw;
+ height: 100vh;
+}
+
+.nut-image-preview {
+ width: 100%;
+ height: 100%;
+
+ &-swiper {
+ width: 100vw;
+ height: 100%;
+ background-color: transparent;
+ }
+
+ &-img {
+ width: 100%;
+ height: 100%;
+ object-fit: contain;
+ }
+
+ &-index {
+ position: fixed;
+ top: 50px;
+ right: 0;
+ left: 0;
+ z-index: 2002;
+ color: #fff;
+ text-align: center;
+ background: transparent;
+
+ .arrow {
+ position: absolute;
+ left: 15px;
+ transform: rotateZ(180deg);
+ }
+ }
+
+ &-close-icon {
+ position: fixed;
+ top: 50px;
+ right: 15px;
+ z-index: 2002;
+
+ &-right {
+ right: 10px;
+ }
+
+ &-left {
+ left: 10px;
+ }
+ }
+
+ .popup-bg {
+ background: rgb(0 0 0 / 90%);
+ }
+
+ .popup-box {
+ height: 100%;
+ overflow: visible;
+ background-color: transparent;
+ }
+}
+
+.nut-image-preview-custom-pop {
+ display: flex;
+ align-items: center;
+ width: 100%;
+ height: 100%;
+ background: transparent !important;
+}
+
+.nut-image-preview-swiper .nut-swiper-item {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ height: 100%;
+
+ .nut-image-preview-box {
+ width: 100%;
+ }
+
+ .nut-video {
+ // height: auto;
+ video {
+ object-fit: contain;
+ }
+ }
+}
diff --git a/uni_modules/nutui-uni/components/imagepreview/index.ts b/uni_modules/nutui-uni/components/imagepreview/index.ts
new file mode 100644
index 0000000..c04b86b
--- /dev/null
+++ b/uni_modules/nutui-uni/components/imagepreview/index.ts
@@ -0,0 +1 @@
+export type * from './imagepreview'
diff --git a/uni_modules/nutui-uni/components/imagepreview/types.ts b/uni_modules/nutui-uni/components/imagepreview/types.ts
new file mode 100644
index 0000000..f074b20
--- /dev/null
+++ b/uni_modules/nutui-uni/components/imagepreview/types.ts
@@ -0,0 +1,35 @@
+import type { Interceptor } from '../_utils'
+
+export interface ImageInterface {
+ src: string
+}
+
+export interface ImagePreviewOptions {
+ show: boolean
+ images: ImageInterface[]
+ videos: []
+ contentClose: boolean
+ initNo: number
+ paginationVisible: boolean
+ paginationColor: string
+ autoplay: [number, string]
+ isWrapTeleport: boolean
+ showIndex?: boolean
+ closeable?: boolean
+ closeIcon?: string
+ closeIconPosition?: string
+ beforeClose?: Interceptor
+ maxZoom?: number
+ minZoom?: number
+ isLoop?: boolean
+ close?: () => void
+ change?: (index: number) => void
+}
+
+export const baseProps = {
+ show: { type: Boolean, default: false },
+ initNo: { type: Number, default: 0 },
+ showIndex: { type: Boolean, default: true },
+ minZoom: { type: Number, default: 1 / 3 },
+ maxZoom: { type: Number, default: 3 },
+}
diff --git a/uni_modules/nutui-uni/components/index.ts b/uni_modules/nutui-uni/components/index.ts
new file mode 100644
index 0000000..8db7d38
--- /dev/null
+++ b/uni_modules/nutui-uni/components/index.ts
@@ -0,0 +1,110 @@
+export type * from './actionsheet'
+export type * from './address'
+export type * from './addresslist'
+export type * from './animate'
+export type * from './avatar'
+export type * from './avatargroup'
+export type * from './backtop'
+export type * from './badge'
+export type * from './barrage'
+export type * from './button'
+export type * from './calendar'
+export type * from './calendaritem'
+export type * from './card'
+export type * from './cascader'
+export type * from './cascaderitem'
+export type * from './category'
+export type * from './categorypane'
+export type * from './cell'
+export type * from './cellgroup'
+export type * from './checkbox'
+export type * from './checkboxgroup'
+export type * from './circleprogress'
+export type * from './codeinput'
+export type * from './col'
+export type * from './collapse'
+export type * from './collapseitem'
+export type * from './comment'
+export type * from './configprovider'
+export type * from './countdown'
+export type * from './countup'
+export type * from './datepicker'
+export type * from './dialog'
+export type * from './divider'
+export type * from './dollmachine'
+export type * from './drag'
+export type * from './ecard'
+export type * from './elevator'
+export type * from './ellipsis'
+export type * from './empty'
+export type * from './fixednav'
+export type * from './form'
+export type * from './formitem'
+export type * from './giftbox'
+export type * from './grid'
+export type * from './griditem'
+export type * from './hiteggs'
+export type * from './icon'
+export type * from './imagepreview'
+export type * from './indicator'
+export type * from './infiniteloading'
+export type * from './input'
+export type * from './inputnumber'
+export type * from './invoice'
+export type * from './list'
+export type * from './loadingpage'
+export type * from './marquee'
+export type * from './menu'
+export type * from './menuitem'
+export type * from './navbar'
+export type * from './noticebar'
+export type * from './notify'
+export type * from './numberkeyboard'
+export type * from './overlay'
+export type * from './pagination'
+export type * from './picker'
+export type * from './pickercolumn'
+export type * from './popover'
+export type * from './popup'
+export type * from './price'
+export type * from './progress'
+export type * from './radio'
+export type * from './radiogroup'
+export type * from './range'
+export type * from './rate'
+export type * from './row'
+export type * from './safearea'
+export type * from './searchbar'
+export type * from './shakedice'
+export type * from './shortpassword'
+export type * from './sidenavbar'
+export type * from './sidenavbaritem'
+export type * from './signature'
+export type * from './skeleton'
+export type * from './sku'
+export type * from './step'
+export type * from './steps'
+export type * from './sticky'
+export type * from './subsidenavbar'
+export type * from './swipe'
+export type * from './swipegroup'
+export type * from './swiper'
+export type * from './swiperitem'
+export type * from './switch'
+export type * from './tabbar'
+export type * from './tabbaritem'
+export type * from './table'
+export type * from './tabpane'
+export type * from './tabs'
+export type * from './tag'
+export type * from './textarea'
+export type * from './timedetail'
+export type * from './timepannel'
+export type * from './timeselect'
+export type * from './toast'
+export type * from './tour'
+export type * from './transition'
+export type * from './trendarrow'
+export type * from './turntable'
+export type * from './uploader'
+export type * from './watermark'
diff --git a/uni_modules/nutui-uni/components/indicator/index.scss b/uni_modules/nutui-uni/components/indicator/index.scss
new file mode 100644
index 0000000..c26e5fa
--- /dev/null
+++ b/uni_modules/nutui-uni/components/indicator/index.scss
@@ -0,0 +1,56 @@
+.nut-indicator {
+ &--block {
+ display: block;
+ width: 100%;
+ }
+
+ &--align__left {
+ text-align: left;
+ }
+
+ &--align__right {
+ text-align: right;
+ }
+
+ &--align__center {
+ text-align: center;
+ }
+
+ &--dot,
+ &--number {
+ margin: 0 4px;
+
+ &:first-child {
+ margin-left: 0;
+ }
+
+ &:last-child {
+ margin-right: 0;
+ }
+ }
+
+ &--dot {
+ display: inline-block;
+ width: $indicator-dot-size;
+ height: $indicator-dot-size;
+ vertical-align: middle;
+ background-color: $indicator-dot-color;
+ border-radius: 50%;
+ }
+
+ &--number {
+ position: relative;
+ display: inline-block;
+ width: $indicator-size;
+ height: $indicator-size;
+ font-size: $indicator-number-font-size;
+ line-height: $indicator-size;
+ color: $indicator-color;
+ text-align: center;
+ vertical-align: middle;
+ background-color: $indicator-bg-color;
+ border: 1px solid $indicator-color;
+ border-radius: 50%;
+ box-shadow: 0 0 1px 1px $indicator-bg-color;
+ }
+}
diff --git a/uni_modules/nutui-uni/components/indicator/index.ts b/uni_modules/nutui-uni/components/indicator/index.ts
new file mode 100644
index 0000000..dfa84d2
--- /dev/null
+++ b/uni_modules/nutui-uni/components/indicator/index.ts
@@ -0,0 +1 @@
+export * from './indicator'
diff --git a/uni_modules/nutui-uni/components/indicator/indicator.ts b/uni_modules/nutui-uni/components/indicator/indicator.ts
new file mode 100644
index 0000000..c3f722b
--- /dev/null
+++ b/uni_modules/nutui-uni/components/indicator/indicator.ts
@@ -0,0 +1,28 @@
+import type { ExtractPropTypes } from 'vue'
+import { commonProps, makeNumberProp, makeStringProp, truthProp } from '../_utils'
+
+export const indicatorProps = {
+ ...commonProps,
+ /**
+ * @description 步骤长度
+ */
+ size: makeNumberProp(3),
+ /**
+ * @description 当前步骤
+ */
+ current: makeNumberProp(1),
+ /**
+ * @description 是否启用块级布局
+ */
+ block: Boolean,
+ /**
+ * @description 对齐方式,仅在 `block` 为 `true` 时生效, 可选值 `left`, `right`, `center`
+ */
+ align: makeStringProp<'left' | 'center' | 'right'>('left'),
+ /**
+ * @description 单数前面是否补 0
+ */
+ fillZero: truthProp,
+}
+
+export type IndicatorProps = ExtractPropTypes
diff --git a/uni_modules/nutui-uni/components/indicator/indicator.vue b/uni_modules/nutui-uni/components/indicator/indicator.vue
new file mode 100644
index 0000000..48d190a
--- /dev/null
+++ b/uni_modules/nutui-uni/components/indicator/indicator.vue
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+ {{ (fillZero && padZero(item)) || item }}
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/infiniteloading/index.scss b/uni_modules/nutui-uni/components/infiniteloading/index.scss
new file mode 100644
index 0000000..57522b3
--- /dev/null
+++ b/uni_modules/nutui-uni/components/infiniteloading/index.scss
@@ -0,0 +1,52 @@
+.nut-infiniteloading {
+ display: block;
+ width: 100%;
+
+ .nut-infinite-top {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+ overflow: hidden;
+
+ .top-box {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+
+ .top-img {
+ width: 28px;
+ height: 24px;
+ }
+
+ .top-text {
+ font-size: 10px;
+ color: $text-color;
+ }
+ }
+ }
+
+ .nut-infinite-bottom {
+ display: block;
+ width: 100%;
+ padding-top: 16px;
+ font-size: $font-size-small;
+ color: $infiniteloading-bottom-color;
+ text-align: center;
+
+ .bottom-box {
+ .bottom-img {
+ width: 28px;
+ height: 24px;
+ margin-right: 5px;
+ }
+
+ .bottom-text {
+ font-size: 10px;
+ color: $text-color;
+ }
+ }
+ }
+}
diff --git a/uni_modules/nutui-uni/components/infiniteloading/index.ts b/uni_modules/nutui-uni/components/infiniteloading/index.ts
new file mode 100644
index 0000000..a4b4e2d
--- /dev/null
+++ b/uni_modules/nutui-uni/components/infiniteloading/index.ts
@@ -0,0 +1 @@
+export type * from './infiniteloading'
diff --git a/uni_modules/nutui-uni/components/infiniteloading/infiniteloading.ts b/uni_modules/nutui-uni/components/infiniteloading/infiniteloading.ts
new file mode 100644
index 0000000..aadd730
--- /dev/null
+++ b/uni_modules/nutui-uni/components/infiniteloading/infiniteloading.ts
@@ -0,0 +1,63 @@
+import type { ExtractPropTypes } from 'vue'
+import { isFunction, isNumber } from '../_utils'
+
+export const infiniteloadingProps = {
+ hasMore: {
+ type: Boolean,
+ default: true,
+ },
+ threshold: {
+ type: Number,
+ default: 200,
+ },
+ upperThreshold: {
+ type: Number,
+ default: 40,
+ },
+ pullIcon: {
+ type: String,
+ default: 'https://img10.360buyimg.com/imagetools/jfs/t1/169863/6/4565/6306/60125948E7e92774e/40b3a0cf42852bcb.png',
+ },
+ pullTxt: {
+ type: String,
+ default: '',
+ },
+ loadIcon: {
+ type: String,
+ default: 'https://img10.360buyimg.com/imagetools/jfs/t1/169863/6/4565/6306/60125948E7e92774e/40b3a0cf42852bcb.png',
+ },
+ loadTxt: {
+ type: String,
+ default: '',
+ },
+ loadMoreTxt: {
+ type: String,
+ default: '',
+ },
+ useWindow: {
+ type: Boolean,
+ default: true,
+ },
+ containerId: {
+ type: String,
+ default: '',
+ },
+ useCapture: {
+ type: Boolean,
+ default: false,
+ },
+ isOpenRefresh: {
+ type: Boolean,
+ default: false,
+ },
+}
+
+export type InfiniteLoadingProps = ExtractPropTypes
+
+export const infiniteloadingEmits = {
+ scrollChange: (val: number) => isNumber(val),
+ loadMore: (fun: () => void) => isFunction(fun),
+ refresh: (fun: () => void) => isFunction(fun),
+}
+
+export type InfiniteLoadingEmits = typeof infiniteloadingEmits
diff --git a/uni_modules/nutui-uni/components/infiniteloading/infiniteloading.vue b/uni_modules/nutui-uni/components/infiniteloading/infiniteloading.vue
new file mode 100644
index 0000000..873542b
--- /dev/null
+++ b/uni_modules/nutui-uni/components/infiniteloading/infiniteloading.vue
@@ -0,0 +1,192 @@
+
+
+
+
+
+
+
+
+
+
+ {{ pullTxt || translate('pullTxt') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ loadTxt || translate('loading') }}
+
+
+
+
+
+ {{ loadMoreTxt || translate('loadMoreTxt') }}
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/input/index.scss b/uni_modules/nutui-uni/components/input/index.scss
new file mode 100644
index 0000000..d39538b
--- /dev/null
+++ b/uni_modules/nutui-uni/components/input/index.scss
@@ -0,0 +1,125 @@
+.nut-theme-dark {
+ .nut-input {
+ background: $dark-background;
+
+ &__input {
+ color: $dark-color;
+ }
+ }
+}
+
+.nut-input {
+ position: relative;
+ box-sizing: border-box;
+ display: flex;
+ width: 100%;
+ padding: $input-padding;
+ font-size: $input-font-size;
+ line-height: $input-line-height;
+ background: $white;
+
+ &__left,
+ &__right {
+ position: relative;
+ display: flex;
+ align-items: center;
+ }
+
+ &__left {
+ margin-right: 4px;
+ }
+
+ &__right {
+ margin-left: 4px;
+ }
+
+ &__value {
+ position: relative;
+ display: flex;
+ flex: 1;
+ align-items: center;
+ }
+
+ &__input {
+ flex: 1;
+ padding: 0;
+ font-size: inherit;
+ line-height: inherit;
+ text-align: left;
+ text-decoration: none;
+ resize: none;
+ background: transparent;
+ border: 0;
+ outline: 0 none;
+ }
+
+ &__mask {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+ width: 100%;
+ height: 100%;
+ }
+
+ &__word-limit {
+ display: flex;
+ justify-content: flex-end;
+ padding: 0 10px;
+ font-size: $input-limit-font-size;
+ color: $input-limit-color;
+ }
+
+ &__clear {
+ display: flex;
+ align-items: center;
+ }
+
+ &__clear-icon {
+ width: 16px;
+ height: 16px;
+ margin: 0 4px;
+ line-height: 1;
+ color: #c8c9cc;
+ cursor: pointer;
+ }
+
+ &--disabled {
+ color: $input-disabled-color !important;
+
+ input:disabled {
+ color: $input-disabled-color;
+ cursor: not-allowed;
+ background: none;
+ opacity: 1;
+ -webkit-text-fill-color: $input-disabled-color;
+ }
+ }
+
+ &--required {
+ &::before {
+ position: absolute;
+ left: 14px;
+ color: $input-required-color;
+ content: "*";
+ }
+ }
+
+ &--error,
+ &--error::placeholder {
+ color: $input-required-color;
+ -webkit-text-fill-color: $input-required-color;
+ }
+
+ &--border {
+ border-bottom: 1px solid $input-border-bottom;
+ }
+}
+
+.nut-form-item {
+ .nut-input {
+ padding: 0;
+ margin: 0;
+ line-height: var(--nut-cell-line-height);
+ }
+}
diff --git a/uni_modules/nutui-uni/components/input/index.ts b/uni_modules/nutui-uni/components/input/index.ts
new file mode 100644
index 0000000..2a48356
--- /dev/null
+++ b/uni_modules/nutui-uni/components/input/index.ts
@@ -0,0 +1,2 @@
+export * from './input'
+export * from './type'
diff --git a/uni_modules/nutui-uni/components/input/input.ts b/uni_modules/nutui-uni/components/input/input.ts
new file mode 100644
index 0000000..6d4ab4e
--- /dev/null
+++ b/uni_modules/nutui-uni/components/input/input.ts
@@ -0,0 +1,177 @@
+import type {
+ BaseEvent,
+ InputOnBlurEvent,
+ InputOnConfirmEvent,
+ InputOnFocusEvent,
+ InputOnInputEvent,
+} from '@uni-helper/uni-app-types'
+import type { ExtractPropTypes, PropType, StyleValue } from 'vue'
+import { BLUR_EVENT, CLEAR_EVENT, CLICK_EVENT, CONFIRM_EVENT, FOCUS_EVENT, INPUT_EVENT, UPDATE_MODEL_EVENT } from '../_constants'
+import type { ClassType } from '../_utils'
+import {
+ commonProps,
+ isNumber,
+ isString,
+ makeNumberProp,
+ makeNumericProp,
+ makeStringProp,
+ nullableBooleanProp,
+ truthProp,
+} from '../_utils'
+import type { InputAlignType, InputConfirmType, InputFormatTrigger, InputMode, InputType } from './type'
+
+export const inputProps = {
+ ...commonProps,
+ /**
+ * @description 输入框类型,支持原生 `input` 标签的所有 `type` 属性,另外还支持 `number` `digit`
+ */
+ type: makeStringProp('text'),
+ /**
+ * @description 输入值,双向绑定
+ */
+ modelValue: makeNumericProp(''),
+ /**
+ * @description 输入框自定义类名
+ */
+ inputClass: {
+ type: [String, Object, Array] as PropType,
+ default: '',
+ },
+ /**
+ * @description 输入框自定义样式
+ */
+ inputStyle: {
+ type: [String, Object, Array] as PropType,
+ default: '',
+ },
+ /**
+ * @description 输入框为空时占位符
+ */
+ placeholder: makeStringProp(''),
+ /**
+ * @description 指定 placeholder 的样式
+ */
+ placeholderStyle: makeStringProp(''),
+ /**
+ * @description 指定 placeholder 的样式类
+ */
+ placeholderClass: makeStringProp('input-placeholder'),
+ /**
+ * @description 输入框内容对齐方式,可选值 `left`、`center`、`right`
+ */
+ inputAlign: makeStringProp('left'),
+ /**
+ * @description 是否显示必填字段的标签旁边的红色星号
+ */
+ required: Boolean,
+ /**
+ * @description 是否禁用
+ */
+ disabled: nullableBooleanProp,
+ /**
+ * @description 是否只读
+ */
+ readonly: Boolean,
+ /**
+ * @description 是否标红
+ */
+ error: Boolean,
+ /**
+ * @description 限制最长输入字符
+ */
+ maxLength: makeNumericProp(140),
+ /**
+ * @description 展示清除 `Icon`
+ */
+ clearable: Boolean,
+ /**
+ * @description 清除图标的 `font-size` 大小
+ */
+ clearSize: makeNumericProp('14'),
+ /**
+ * @description 是否显示下边框
+ */
+ border: truthProp,
+ /**
+ * @description 格式化函数触发的时机,可选值为 `onChange`、`onBlur`
+ */
+ formatTrigger: makeStringProp('onChange'),
+ /**
+ * @description 输入内容格式化函数
+ */
+ formatter: {
+ type: Function as PropType<(value: string) => string>,
+ default: null,
+ },
+ /**
+ * @description 是否显示限制最长输入字符,需要设置 `max-length` 属性
+ */
+ showWordLimit: Boolean,
+ /**
+ * @description 是否自动获得焦点,`iOS` 系统不支持该属性
+ */
+ autofocus: Boolean,
+ /**
+ * @description 键盘右下角按钮的文字,仅在`type='text'`时生效,可选值 `send`:发送、`search`:搜索、`next`:下一个、`go`:前往、`done`:完成
+ */
+ confirmType: makeStringProp('done'),
+ /**
+ * @description 键盘弹起时,是否自动上推页面
+ */
+ adjustPosition: truthProp,
+ /**
+ * @description 是否强制使用系统键盘和 `Web-view` 创建的 `input` 元素。为 `true` 时,`confirm-type`、`confirm-hold` 可能失效
+ */
+ alwaysSystem: Boolean,
+ /**
+ * @description 是否在失去焦点后,继续展示清除按钮,在设置 `clearable` 时生效
+ */
+ showClearIcon: Boolean,
+ /**
+ * @description 输入框模式
+ */
+ inputMode: makeStringProp('text'),
+ /**
+ * @description 指定光标与键盘的距离,取 input 距离底部的距离和 cursor-spacing 指定的距离的最小值作为光标与键盘的距离
+ */
+ cursorSpacing: makeNumberProp(0),
+ /**
+ * @description 强制 input 处于同层状态,默认 focus 时 input 会切到非同层状态 (仅在 iOS 下生效)
+ */
+ alwaysEmbed: Boolean,
+ /**
+ * @description 点击键盘右下角按钮时是否保持键盘不收起
+ */
+ confirmHold: Boolean,
+ /**
+ * @description 指定focus时的光标位置
+ */
+ cursor: Number,
+ /**
+ * @description 光标起始位置,自动聚集时有效,需与selection-end搭配使用
+ */
+ selectionStart: makeNumberProp(-1),
+ /**
+ * @description 光标结束位置,自动聚集时有效,需与selection-start搭配使用
+ */
+ selectionEnd: makeNumberProp(-1),
+ /**
+ * @description focus时,点击页面的时候不收起键盘
+ */
+ holdKeyboard: Boolean,
+}
+
+export type InputProps = ExtractPropTypes
+
+export const inputEmits = {
+ [CLICK_EVENT]: (evt: BaseEvent) => evt instanceof Object,
+ clickInput: (evt: BaseEvent) => evt instanceof Object,
+ [BLUR_EVENT]: (evt: InputOnBlurEvent) => evt instanceof Object,
+ [FOCUS_EVENT]: (evt: InputOnFocusEvent) => evt instanceof Object,
+ [CLEAR_EVENT]: () => true,
+ [CONFIRM_EVENT]: (evt: InputOnConfirmEvent) => evt instanceof Object,
+ [UPDATE_MODEL_EVENT]: (val1: string | number, val2?: BaseEvent) => (isString(val1) || isNumber(val1)) && ((val2 instanceof Object) || val2 === undefined),
+ [INPUT_EVENT]: (val: string | number, evt: InputOnInputEvent) => (isString(val) || isNumber(val)) && evt instanceof Object,
+}
+
+export type InputEmits = typeof inputEmits
diff --git a/uni_modules/nutui-uni/components/input/input.vue b/uni_modules/nutui-uni/components/input/input.vue
new file mode 100644
index 0000000..da09c63
--- /dev/null
+++ b/uni_modules/nutui-uni/components/input/input.vue
@@ -0,0 +1,273 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ innerValue.length }}
+ /{{ innerMaxLength }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/input/type.ts b/uni_modules/nutui-uni/components/input/type.ts
new file mode 100644
index 0000000..82f34bb
--- /dev/null
+++ b/uni_modules/nutui-uni/components/input/type.ts
@@ -0,0 +1,19 @@
+export const inputAlignType = ['left', 'center', 'right'] as const // text-align
+export type InputAlignType = (typeof inputAlignType)[number]
+
+export const inputFormatTrigger = ['onChange', 'onBlur'] as const // onChange: 在输入时执行格式化 ; onBlur: 在失焦时执行格式化
+export type InputFormatTrigger = (typeof inputFormatTrigger)[number]
+
+export const inputType
+ = ['text', 'number', 'idcard', 'digit', 'tel', 'safe-password', 'nickname', 'button', 'checkbox', 'color', 'date', 'datetime-local', 'email', 'file', 'hidden', 'image', 'month', 'password', 'radio', 'range', 'reset', 'search', 'submit', 'time', 'url', 'week'] as const
+export type InputType = (typeof inputType)[number]
+
+export const inputMode = ['none', 'text', 'decimal', 'numeric', 'tel', 'search', 'email', 'url'] as const
+export type InputMode = (typeof inputMode)[number]
+
+export const inputConfirmType = ['send', 'search', 'next', 'go', 'done'] as const
+export type InputConfirmType = (typeof inputConfirmType)[number]
+
+export interface InputTarget extends HTMLInputElement {
+ composing?: boolean
+}
diff --git a/uni_modules/nutui-uni/components/input/util.ts b/uni_modules/nutui-uni/components/input/util.ts
new file mode 100644
index 0000000..a4248a8
--- /dev/null
+++ b/uni_modules/nutui-uni/components/input/util.ts
@@ -0,0 +1,29 @@
+function trimExtraChar(value: string, char: string, regExp: RegExp) {
+ const index = value.indexOf(char)
+
+ if (index === -1)
+ return value
+
+ if (char === '-' && index !== 0)
+ return value.slice(0, index)
+
+ return value.slice(0, index + 1) + value.slice(index).replace(regExp, '')
+}
+
+export function formatNumber(value: string, allowDot = true, allowMinus = true) {
+ if (allowDot)
+ value = trimExtraChar(value, '.', /\./g)
+
+ else
+ value = value.split('.')[0]
+
+ if (allowMinus)
+ value = trimExtraChar(value, '-', /-/g)
+
+ else
+ value = value.replace(/-/, '')
+
+ const regExp = allowDot ? /[^-0-9.]/g : /[^-0-9]/g
+
+ return value.replace(regExp, '')
+}
diff --git a/uni_modules/nutui-uni/components/inputnumber/index.scss b/uni_modules/nutui-uni/components/inputnumber/index.scss
new file mode 100644
index 0000000..00793a1
--- /dev/null
+++ b/uni_modules/nutui-uni/components/inputnumber/index.scss
@@ -0,0 +1,86 @@
+.nut-theme-dark {
+ .nut-input-number {
+ &__icon {
+ color: $dark-color;
+
+ &--disabled {
+ color: $dark-color-gray;
+ }
+ }
+
+ input,
+ &__text--readonly {
+ color: $dark-color;
+ background-color: $dark-background;
+ border: 1px solid $dark-color-gray;
+ }
+
+ &--disabled {
+ input {
+ color: $dark-color-gray;
+ }
+ }
+ }
+}
+
+.nut-input-number {
+ box-sizing: $inputnumber-border-box;
+ display: $inputnumber-display;
+ align-items: center;
+ height: $inputnumber-height;
+ line-height: $inputnumber-line-height;
+ border: $inputnumber-border;
+ border-radius: $inputnumber-border-radius;
+
+ &--disabled {
+ input {
+ color: $inputnumber-icon-void-color;
+ }
+ }
+
+ &__icon {
+ display: flex;
+ align-items: center;
+ color: $inputnumber-icon-color;
+ cursor: pointer;
+
+ .nut-icon {
+ width: $inputnumber-icon-size;
+ height: $inputnumber-icon-size;
+ font-size: $inputnumber-icon-size;
+ }
+
+ &--disabled {
+ color: $inputnumber-icon-void-color;
+ cursor: not-allowed;
+ }
+ }
+
+ input {
+ border-top: 0 !important;
+ border-bottom: 0 !important;
+ }
+
+ input,
+ &__text--readonly,
+ &__text--input {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: $inputnumber-input-width;
+ height: 100%;
+ margin: $inputnumber-input-margin;
+ font-size: $inputnumber-input-font-size;
+ color: $inputnumber-input-font-color;
+ text-align: center;
+ background-color: $inputnumber-input-background-color;
+ border: $inputnumber-input-border;
+ border-radius: $inputnumber-input-border-radius;
+ outline: none;
+ }
+
+ input::-webkit-outer-spin-button,
+ input::-webkit-inner-spin-button {
+ appearance: none;
+ }
+}
diff --git a/uni_modules/nutui-uni/components/inputnumber/index.ts b/uni_modules/nutui-uni/components/inputnumber/index.ts
new file mode 100644
index 0000000..fe49768
--- /dev/null
+++ b/uni_modules/nutui-uni/components/inputnumber/index.ts
@@ -0,0 +1 @@
+export * from './inputnumber'
diff --git a/uni_modules/nutui-uni/components/inputnumber/inputnumber.ts b/uni_modules/nutui-uni/components/inputnumber/inputnumber.ts
new file mode 100644
index 0000000..5782b21
--- /dev/null
+++ b/uni_modules/nutui-uni/components/inputnumber/inputnumber.ts
@@ -0,0 +1,64 @@
+import type { BaseEvent, InputOnBlurEvent, InputOnFocusEvent } from '@uni-helper/uni-app-types'
+import type { ExtractPropTypes } from 'vue'
+import { BLUR_EVENT, CHANGE_EVENT, FOCUS_EVENT, UPDATE_MODEL_EVENT } from '../_constants'
+import { commonProps, makeNumericProp, nullableBooleanProp } from '../_utils'
+
+export const inputnumberProps = {
+ ...commonProps,
+ /**
+ * @description 初始值
+ */
+ modelValue: makeNumericProp(0),
+ /**
+ * @description 最小值限制
+ */
+ min: makeNumericProp(1),
+ /**
+ * @description 最大值限制
+ */
+ max: makeNumericProp(9999),
+ /**
+ * @description 步长
+ */
+ step: makeNumericProp(1),
+ /**
+ * @description 是否只能输入 step 的倍数
+ */
+ stepStrictly: Boolean,
+ /**
+ * @description 设置保留的小数位
+ */
+ decimalPlaces: makeNumericProp(0),
+ /**
+ * @description 禁用所有功能
+ */
+ disabled: nullableBooleanProp,
+ /**
+ * @description 只读状态禁用输入框操作行为
+ */
+ readonly: Boolean,
+ /**
+ * @description 输入框宽度
+ */
+ inputWidth: makeNumericProp(''),
+ /**
+ * @description 操作加减按钮的尺寸
+ */
+ buttonSize: makeNumericProp(''),
+}
+
+export type InputNumberProps = ExtractPropTypes
+
+/* eslint-disable unused-imports/no-unused-vars */
+export const inputnumberEmits = {
+ [UPDATE_MODEL_EVENT]: (value: number) => true,
+ [CHANGE_EVENT]: (value: number, event?: BaseEvent) => true,
+ [FOCUS_EVENT]: (event: InputOnFocusEvent) => true,
+ [BLUR_EVENT]: (event: InputOnBlurEvent) => true,
+ reduce: (event: BaseEvent) => true,
+ add: (event: BaseEvent) => true,
+ overlimit: (event: BaseEvent, type: 'reduce' | 'add') => true,
+}
+/* eslint-enable unused-imports/no-unused-vars */
+
+export type InputNumberEmits = typeof inputnumberEmits
diff --git a/uni_modules/nutui-uni/components/inputnumber/inputnumber.vue b/uni_modules/nutui-uni/components/inputnumber/inputnumber.vue
new file mode 100644
index 0000000..eb6bafc
--- /dev/null
+++ b/uni_modules/nutui-uni/components/inputnumber/inputnumber.vue
@@ -0,0 +1,323 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ inputValue }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/invoice/index.scss b/uni_modules/nutui-uni/components/invoice/index.scss
new file mode 100644
index 0000000..6f7ee46
--- /dev/null
+++ b/uni_modules/nutui-uni/components/invoice/index.scss
@@ -0,0 +1,42 @@
+@import '../button/index';
+@import '../radiogroup/index';
+@import '../radio/index';
+@import '../form/index';
+@import '../formitem/index';
+
+.nut-theme-dark {
+ .nut-invoice {
+ .nut-invoice__submit {
+ background: $dark-background2;
+ }
+ }
+}
+
+.nut-invoice {
+ position: relative;
+ width: 100%;
+
+ .nut-cell {
+ align-items: baseline;
+ }
+
+ &__submit {
+ position: fixed;
+ bottom: 0;
+ bottom: constant(safe-area-inset-bottom);
+ bottom: env(safe-area-inset-bottom);
+ box-sizing: border-box;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+ padding: $invoice-padding;
+ background: #fff;
+ }
+
+ .nut-radio {
+ display: inline-block;
+ margin-right: 6px;
+ margin-bottom: 0;
+ }
+}
diff --git a/uni_modules/nutui-uni/components/invoice/index.ts b/uni_modules/nutui-uni/components/invoice/index.ts
new file mode 100644
index 0000000..90ff32e
--- /dev/null
+++ b/uni_modules/nutui-uni/components/invoice/index.ts
@@ -0,0 +1 @@
+export type * from './invoice'
diff --git a/uni_modules/nutui-uni/components/invoice/invoice.ts b/uni_modules/nutui-uni/components/invoice/invoice.ts
new file mode 100644
index 0000000..d3c3e9c
--- /dev/null
+++ b/uni_modules/nutui-uni/components/invoice/invoice.ts
@@ -0,0 +1,32 @@
+import type { ExtractPropTypes } from 'vue'
+import { commonProps, isBoolean, makeArrayProp, truthProp } from '../_utils'
+import type { ErrorMessage } from '../form'
+
+export const invoiceProps = {
+ ...commonProps,
+ /**
+ * @description 发票数据
+ */
+ data: makeArrayProp([]),
+ /**
+ * @description 表单数据对象(使用表单校验时,_必填_)
+ */
+ formValue: {
+ type: Object,
+ require: true,
+ default: {},
+ },
+ /**
+ * @description 是否显示提交按钮
+ */
+ submit: truthProp,
+}
+
+export type InvoiceProps = ExtractPropTypes
+
+export const invoiceEmits = {
+ onSubmit: (valid: boolean | object, errors: (boolean | ErrorMessage)[]) => (isBoolean(valid) || valid instanceof Object) && (isBoolean(errors) || errors instanceof Object),
+ scrollBottom: () => true,
+}
+
+export type InvoiceEmits = typeof invoiceEmits
diff --git a/uni_modules/nutui-uni/components/invoice/invoice.vue b/uni_modules/nutui-uni/components/invoice/invoice.vue
new file mode 100644
index 0000000..8ab7332
--- /dev/null
+++ b/uni_modules/nutui-uni/components/invoice/invoice.vue
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ radioItem.label }}
+
+
+
+
+
+
+
+
+
+
+ 提交审批
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/list/index.scss b/uni_modules/nutui-uni/components/list/index.scss
new file mode 100644
index 0000000..182dead
--- /dev/null
+++ b/uni_modules/nutui-uni/components/list/index.scss
@@ -0,0 +1,27 @@
+.nut-list {
+ position: relative;
+ width: 100%;
+ height: 100%;
+ overflow: scroll;
+ -webkit-overflow-scrolling: touch;
+
+ &-phantom {
+ position: absolute;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: -1;
+ }
+
+ &-container {
+ position: absolute;
+ top: 0;
+ right: 0;
+ left: 0;
+ }
+
+ &-item {
+ margin: $list-item-margin;
+ overflow: hidden;
+ }
+}
diff --git a/uni_modules/nutui-uni/components/list/index.ts b/uni_modules/nutui-uni/components/list/index.ts
new file mode 100644
index 0000000..1cc2112
--- /dev/null
+++ b/uni_modules/nutui-uni/components/list/index.ts
@@ -0,0 +1 @@
+export type * from './list'
diff --git a/uni_modules/nutui-uni/components/list/list.ts b/uni_modules/nutui-uni/components/list/list.ts
new file mode 100644
index 0000000..285a485
--- /dev/null
+++ b/uni_modules/nutui-uni/components/list/list.ts
@@ -0,0 +1,31 @@
+import type { ExtractPropTypes } from 'vue'
+import { commonProps, makeArrayProp, makeNumberProp } from '../_utils'
+
+export const clientHeight = uni.getSystemInfoSync().windowHeight || 667
+
+export const listProps = {
+ ...commonProps,
+ /**
+ * @description 列表项的高度/预估高度,支持不固定高度
+ */
+ height: makeNumberProp(50),
+ /**
+ * @description 列表数据
+ */
+ listData: makeArrayProp([]),
+ /**
+ * @description 容器高度(最大值不能超过可视区)
+ */
+ containerHeight: makeNumberProp(clientHeight),
+}
+
+export type ListProps = ExtractPropTypes
+
+export const listEmits = {
+ // scrollUp: (val: number) => true,
+ // scrollDown: (val: number) => true,
+ scrollBottom: () => true,
+ scroll: () => true,
+}
+
+export type ListEmits = typeof listEmits
diff --git a/uni_modules/nutui-uni/components/list/list.vue b/uni_modules/nutui-uni/components/list/list.vue
new file mode 100644
index 0000000..b543ccf
--- /dev/null
+++ b/uni_modules/nutui-uni/components/list/list.vue
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/list/type.ts b/uni_modules/nutui-uni/components/list/type.ts
new file mode 100644
index 0000000..14b1134
--- /dev/null
+++ b/uni_modules/nutui-uni/components/list/type.ts
@@ -0,0 +1,36 @@
+export interface CachedPosition {
+ index: number
+ top: number
+ bottom: number
+ height: number
+ dValue: number
+}
+
+export enum CompareResult {
+ eq = 1,
+ lt,
+ gt,
+}
+
+export function binarySearch(list: T[], value: VT, compareFunc: (current: T, value: VT) => CompareResult) {
+ let start = 0
+ let end = list.length - 1
+ let tempIndex: number | null = null
+
+ while (start <= end) {
+ tempIndex = Math.floor((start + end) / 2)
+ const midValue = list[tempIndex]
+
+ const compareRes: CompareResult = compareFunc(midValue, value)
+ if (compareRes === CompareResult.eq)
+ return tempIndex
+
+ if (compareRes === CompareResult.lt)
+ start = tempIndex + 1
+
+ else if (compareRes === CompareResult.gt)
+ end = tempIndex - 1
+ }
+
+ return tempIndex!
+}
diff --git a/uni_modules/nutui-uni/components/loadingpage/index.scss b/uni_modules/nutui-uni/components/loadingpage/index.scss
new file mode 100644
index 0000000..cc84724
--- /dev/null
+++ b/uni_modules/nutui-uni/components/loadingpage/index.scss
@@ -0,0 +1,37 @@
+.nut-loading-page {
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+
+ &__warpper {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ margin-top: -150px;
+
+ /* #ifndef APP-NVUE */
+
+ font-size: $font-size-4;
+ color: $text-color;
+
+ /* #endif */
+
+
+ &__loading-icon {
+ margin-bottom: $loadingpage-icon-margin-bottom;
+
+ &__img {
+ width: 40px;
+ height: 40px;
+ }
+ }
+
+ &__text {
+ font-size: $font-size-4;
+ color: $text-color;
+ }
+ }
+}
\ No newline at end of file
diff --git a/uni_modules/nutui-uni/components/loadingpage/index.ts b/uni_modules/nutui-uni/components/loadingpage/index.ts
new file mode 100644
index 0000000..a3211a4
--- /dev/null
+++ b/uni_modules/nutui-uni/components/loadingpage/index.ts
@@ -0,0 +1 @@
+export type * from './loadingpage'
diff --git a/uni_modules/nutui-uni/components/loadingpage/loadingpage.ts b/uni_modules/nutui-uni/components/loadingpage/loadingpage.ts
new file mode 100644
index 0000000..1a1b3d6
--- /dev/null
+++ b/uni_modules/nutui-uni/components/loadingpage/loadingpage.ts
@@ -0,0 +1,44 @@
+import type { ExtractPropTypes } from 'vue'
+import { commonProps, makeNumberProp, makeNumericProp, makeStringProp } from '../_utils'
+
+export const loadingpageProps = {
+ ...commonProps,
+ /**
+ * @description 提示内容
+ */
+ loadingText: makeStringProp('正在加载'),
+ /**
+ * @description 文字上方用于替换loading动画的图片
+ */
+ image: makeStringProp(''),
+ /**
+ * @description 是否加载中
+ */
+ loading: Boolean,
+ /**
+ * @description 背景颜色
+ */
+ bgColor: makeStringProp('#ffffff'),
+ /**
+ * @description 字体颜色
+ */
+ customColor: makeStringProp('#C8C8C8'),
+ /**
+ * @description 字体大小
+ */
+ fontSize: makeNumericProp(19),
+ /**
+ * @description 图标大小
+ */
+ iconSize: makeNumericProp(28),
+ /**
+ * @@description 边框和线条颜色
+ */
+ loadingColor: makeStringProp('#C8C8C8'),
+ /**
+ * @description 层级
+ */
+ zIndex: makeNumberProp(9999),
+}
+
+export type LoadingPageProps = ExtractPropTypes
diff --git a/uni_modules/nutui-uni/components/loadingpage/loadingpage.vue b/uni_modules/nutui-uni/components/loadingpage/loadingpage.vue
new file mode 100644
index 0000000..73b9b15
--- /dev/null
+++ b/uni_modules/nutui-uni/components/loadingpage/loadingpage.vue
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ loadingText }}
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/marquee/index.scss b/uni_modules/nutui-uni/components/marquee/index.scss
new file mode 100644
index 0000000..1719216
--- /dev/null
+++ b/uni_modules/nutui-uni/components/marquee/index.scss
@@ -0,0 +1,133 @@
+.nut-marquee {
+ position: relative;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 300px;
+ height: 300px;
+ margin: 0 auto;
+ border-radius: 8px;
+
+ // stylelint-disable selector-class-pattern
+
+
+ .bgContent {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ }
+
+ .marqueeBg {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ background: url("https://img10.360buyimg.com/imagetools/jfs/t1/189406/15/21216/26045/61309346E9aa7922b/5dc34e22d3a7bb0e.png")no-repeat center;
+ background-size: 100% 100%;
+ }
+
+ .start {
+ position: relative;
+ top: -5px;
+ left: -2px;
+ width: 75px;
+ height: 75px;
+ background: url("https://img13.360buyimg.com/imagetools/jfs/t1/205479/17/4245/32041/61309346E02bd3b6b/b41be60bedbb1e69.png") no-repeat center;
+ background-size: 100% 100%;
+ }
+
+ .disabledDraw {
+ background: url("https://img10.360buyimg.com/imagetools/jfs/t1/193040/14/21217/16320/61309346E6569e270/36e45126a5f1fc9c.png") no-repeat center;
+ background-size: 100% 100%;
+ }
+
+ .gift-list {
+ padding: 0;
+ margin: 0;
+
+ .gift-item {
+ position: absolute;
+ width: 75px;
+ height: 75px;
+ list-style: none;
+ background: url("https://img10.360buyimg.com/imagetools/jfs/t1/187454/31/21425/27854/61309346E7c791c2c/a12649fbffb63a34.png") no-repeat center;
+ background-size: 100% 100%;
+
+ .gift-img {
+ width: 35px;
+ height: 35px;
+ margin: 8px auto;
+
+ image {
+ width: 100%;
+ height: 100%;
+ }
+ }
+
+ .desc {
+ display: block;
+ max-width: 70px;
+ margin: 0 auto;
+ overflow: hidden;
+ font-size: 12px;
+ font-weight: 500;
+ color:#fff;
+ text-align: center;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+ }
+
+ // 上面3个奖品
+ .gift-1,.gift-2,.gift-3 {
+ top: 25px;
+ }
+
+ .gift-1 {
+ left: 15px;
+ }
+
+ .gift-2 {
+ left: 110px;
+ }
+
+ .gift-3 {
+ left: 205px;
+ }
+
+ // 中间2个奖品
+ .gift-4,.gift-8 {
+ top: 110px;
+ }
+
+ .gift-4 {
+ left: 205px;
+ }
+
+ .gift-8 {
+ left: 15px;
+ }
+
+ // 下面3个奖品
+ .gift-5,.gift-6,.gift-7 {
+ top: 190px;
+ }
+
+ .gift-5 {
+ left: 205px;
+ }
+
+ .gift-6 {
+ left: 110px;
+ }
+
+ .gift-7 {
+ left: 15px;
+ }
+
+ // 中奖
+ .active {
+ background: url("https://img10.360buyimg.com/imagetools/jfs/t1/189406/15/21216/26045/61309346E9aa7922b/5dc34e22d3a7bb0e.png") no-repeat center;
+ background-size: 100% 100%;
+ }
+ }
+}
diff --git a/uni_modules/nutui-uni/components/marquee/index.ts b/uni_modules/nutui-uni/components/marquee/index.ts
new file mode 100644
index 0000000..6dcb4b6
--- /dev/null
+++ b/uni_modules/nutui-uni/components/marquee/index.ts
@@ -0,0 +1 @@
+export type * from './marquee'
diff --git a/uni_modules/nutui-uni/components/marquee/marquee.ts b/uni_modules/nutui-uni/components/marquee/marquee.ts
new file mode 100644
index 0000000..f8070ba
--- /dev/null
+++ b/uni_modules/nutui-uni/components/marquee/marquee.ts
@@ -0,0 +1,61 @@
+import type { ExtractPropTypes } from 'vue'
+import { commonProps, makeNumericProp } from '../_utils'
+
+export const marqueeProps = {
+ ...commonProps,
+ /**
+ * @description 抽奖样式
+ */
+ styleOpt: {
+ type: Object,
+ default: () => {
+ return {
+ itemStyle: {},
+ startStyle: {},
+ bgStyle: {
+ background: 'rgb(255, 231, 149)',
+ },
+ }
+ },
+ },
+ /**
+ * @description 奖品列表
+ */
+ prizeList: {
+ type: Array,
+ required: true,
+ },
+ /**
+ * @description 是否禁用开始抽奖点击
+ */
+ disabled: Boolean,
+ /**
+ * @description 中奖奖品的index
+ */
+ prizeIndex: makeNumericProp(-1),
+ /**
+ * @description 初始转动速度
+ */
+ speed: makeNumericProp(150),
+ /**
+ * @description 预抽奖,转动多少次进入抽奖环节
+ */
+ circle: makeNumericProp(30),
+}
+
+export type MarqueeProps = ExtractPropTypes
+
+export const marqueeEmits = {
+ click: () => true,
+ /**
+ * @description 开始跑动的回调函数,此时将接口中的中奖索引,赋值到 prize-index
+ */
+ startTurns: () => true,
+ /**
+ * @description 停止跑动后的回调函数
+ */
+ endTurns: () => true,
+
+}
+
+export type MarqueeEmits = typeof marqueeEmits
diff --git a/uni_modules/nutui-uni/components/marquee/marquee.vue b/uni_modules/nutui-uni/components/marquee/marquee.vue
new file mode 100644
index 0000000..473dccd
--- /dev/null
+++ b/uni_modules/nutui-uni/components/marquee/marquee.vue
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/menu/index.scss b/uni_modules/nutui-uni/components/menu/index.scss
new file mode 100644
index 0000000..506f088
--- /dev/null
+++ b/uni_modules/nutui-uni/components/menu/index.scss
@@ -0,0 +1,74 @@
+.nut-theme-dark {
+ .nut-menu {
+ .nut-menu__bar {
+ background-color: $dark-background;
+
+ .nut-menu__item {
+ color: $dark-color;
+ }
+ }
+ }
+}
+
+.nut-menu {
+ &.scroll-fixed {
+ position: fixed;
+ top: $menu-scroll-fixed-top;
+ z-index: $menu-scroll-fixed-z-index;
+ width: 100%;
+ }
+
+ .nut-menu__bar {
+ position: relative;
+ display: flex;
+ line-height: $menu-bar-line-height;
+ background-color: $white;
+ box-shadow: $menu-bar-box-shadow;
+
+ &.opened {
+ z-index: $menu-bar-opened-z-index;
+ }
+
+ .nut-menu__item {
+ flex: 1;
+ min-width: 0;
+ font-size: $menu-item-font-size;
+ color: $menu-item-text-color;
+ text-align: center;
+
+
+ &.active {
+ color: $menu-item-active-text-color;
+ }
+
+ &.disabled {
+ color: $menu-item-disabled-color;
+ }
+
+ .nut-menu__title-icon {
+ display: flex;
+ transition: all 0.2s linear;
+ }
+
+ .nut-menu__title {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ max-width: 100%;
+
+ .nut-menu__title-text {
+ display: block;
+ padding-right: $menu-title-text-padding-right;
+ padding-left: $menu-title-text-padding-left;
+
+ @include text-ellipsis;
+
+ }
+
+ &.active .nut-menu__title-icon {
+ transform: rotate(180deg);
+ }
+ }
+ }
+ }
+}
diff --git a/uni_modules/nutui-uni/components/menu/index.ts b/uni_modules/nutui-uni/components/menu/index.ts
new file mode 100644
index 0000000..45467d0
--- /dev/null
+++ b/uni_modules/nutui-uni/components/menu/index.ts
@@ -0,0 +1 @@
+export * from './menu'
diff --git a/uni_modules/nutui-uni/components/menu/menu.ts b/uni_modules/nutui-uni/components/menu/menu.ts
new file mode 100644
index 0000000..2bb9ae6
--- /dev/null
+++ b/uni_modules/nutui-uni/components/menu/menu.ts
@@ -0,0 +1,65 @@
+import type { ExtractPropTypes } from 'vue'
+import { commonProps, makeNumberProp, makeStringProp, truthProp } from '../_utils'
+
+export const MENU_KEY = Symbol('nut-menu')
+
+export const menuProps = {
+ ...commonProps,
+ /**
+ * @description 选项的选中态图标颜色
+ */
+ activeColor: makeStringProp(''),
+ /**
+ * @description 是否显示遮罩
+ */
+ overlay: truthProp,
+ /**
+ * @description 是否锁定滚动
+ */
+ lockScroll: truthProp,
+ /**
+ * @description 动画时长
+ */
+ duration: {
+ type: [Number, String],
+ default: 300,
+ },
+ /**
+ * @description 标题图标
+ */
+ titleIcon: String,
+ /**
+ * @description 是否在点击遮罩层后关闭菜单
+ */
+ closeOnClickOverlay: truthProp,
+ /**
+ * @description 展开方向
+ */
+ direction: makeStringProp<'down' | 'up'>('down'),
+ /**
+ * @description 滚动后是否固定,可设置固定位置(需要配合 `scrollTop` 使用)
+ */
+ scrollFixed: {
+ type: [Boolean, String, Number],
+ default: false,
+ },
+ /**
+ * @description 页面的滚动距离,通过 `onPageScroll` 获取
+ */
+ scrollTop: makeNumberProp(0),
+ /**
+ * @description 标题样式类名
+ */
+ titleClass: [String],
+ /**
+ * @description 收起的图标
+ */
+ upIcon: makeStringProp('rect-up'),
+ /**
+ * @description 展开时的图标
+ */
+ downIcon: makeStringProp('rect-down'),
+ offset: Number,
+}
+
+export type MenuProps = ExtractPropTypes
diff --git a/uni_modules/nutui-uni/components/menu/menu.vue b/uni_modules/nutui-uni/components/menu/menu.vue
new file mode 100644
index 0000000..3b825f1
--- /dev/null
+++ b/uni_modules/nutui-uni/components/menu/menu.vue
@@ -0,0 +1,128 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/menuitem/index.scss b/uni_modules/nutui-uni/components/menuitem/index.scss
new file mode 100644
index 0000000..3567f6c
--- /dev/null
+++ b/uni_modules/nutui-uni/components/menuitem/index.scss
@@ -0,0 +1,59 @@
+@import '../popup/index';
+
+.nut-theme-dark {
+ .nut-menu-item__content {
+ .nut-menu-item__option {
+ color: $dark-color;
+ }
+ }
+}
+
+.nut-menu-item {
+ position: fixed;
+ right: 0;
+ left: 0;
+ z-index: $menu-bar-opened-z-index;
+ height: 100vh;
+ overflow: hidden;
+
+ .active {
+ font-weight: $menu-active-item-font-weight;
+ color: $menu-item-active-text-color !important;
+ }
+}
+
+.nut-menu-item__content {
+ display: flex;
+ flex-wrap: wrap;
+ max-height: $menu-item-content-max-height;
+ padding: $menu-item-content-padding;
+
+ &.nut-menu-item__overflow {
+ overflow-y: auto;
+ }
+
+ .nut-menu-item__option {
+ display: flex;
+ align-items: center;
+ padding-top: $menu-item-option-padding-top;
+ padding-bottom: $menu-item-option-padding-bottom;
+ padding-left: 12px;
+ padding-right: 12px;
+ font-size: $font-size-2;
+ color: $title-color;
+
+ .nut-menu-item__span {
+ display: flex;
+ align-items: center;
+ margin-right: $menu-item-option-i-margin-right;
+ }
+ }
+}
+
+.nut-menu-item-placeholder-element {
+ position: fixed;
+ right: 0;
+ left: 0;
+ z-index: $menu-bar-opened-z-index;
+ background-color: transparent;
+}
diff --git a/uni_modules/nutui-uni/components/menuitem/index.ts b/uni_modules/nutui-uni/components/menuitem/index.ts
new file mode 100644
index 0000000..4165290
--- /dev/null
+++ b/uni_modules/nutui-uni/components/menuitem/index.ts
@@ -0,0 +1 @@
+export * from './menuitem'
diff --git a/uni_modules/nutui-uni/components/menuitem/menuitem.ts b/uni_modules/nutui-uni/components/menuitem/menuitem.ts
new file mode 100644
index 0000000..0a97c5c
--- /dev/null
+++ b/uni_modules/nutui-uni/components/menuitem/menuitem.ts
@@ -0,0 +1,74 @@
+import type { ExtractPropTypes } from 'vue'
+import { CHANGE_EVENT, CLOSE_EVENT, OPEN_EVENT, UPDATE_MODEL_EVENT } from '../_constants'
+import { commonProps, makeArrayProp, makeNumberProp, makeStringProp } from '../_utils'
+
+export interface MenuItemOption {
+ text: string
+ value: number | string
+}
+
+export const menuitemProps = {
+ ...commonProps,
+ /**
+ * @@description 菜单项标题
+ */
+ title: String,
+ /**
+ * @description 选项数组
+ */
+ options: makeArrayProp([]),
+ /**
+ * @description 是否禁用菜单
+ */
+ disabled: Boolean,
+ modelValue: [String, Number],
+ /**
+ * @description 可以设置一行展示多少列 `options`
+ */
+ cols: makeNumberProp(1),
+ /**
+ * @description 选项选中时自定义标题样式类
+ */
+ activeTitleClass: String,
+ /**
+ * @description 选项非选中时自定义标题样式类
+ */
+ inactiveTitleClass: String,
+ /**
+ * @description 选项选中时选中图标
+ */
+ optionIcon: makeStringProp('Check'),
+}
+
+export type MenuItemProps = ExtractPropTypes
+
+/* eslint-disable unused-imports/no-unused-vars */
+export const menuitemEmits = {
+ [UPDATE_MODEL_EVENT]: (value: number | string) => true,
+ [CHANGE_EVENT]: (value: number | string) => true,
+ [OPEN_EVENT]: () => true,
+ [CLOSE_EVENT]: () => true,
+ itemClick: (item: MenuItemOption) => true,
+}
+/* eslint-enable unused-imports/no-unused-vars */
+
+export type MenuitemEmits = typeof menuitemEmits
+
+export interface MenuItemInst {
+ /**
+ * @description 变更选择项
+ */
+ change: (value?: number | string) => any
+ /**
+ * @description 切换菜单展示状态,传 `true` 为显示,`false` 为隐藏,不传参为取反
+ */
+ toggle: (show?: boolean) => boolean
+ /**
+ * @description 打开菜单栏
+ */
+ open: () => void
+ /**
+ * @description 关闭菜单栏
+ */
+ close: () => void
+}
diff --git a/uni_modules/nutui-uni/components/menuitem/menuitem.vue b/uni_modules/nutui-uni/components/menuitem/menuitem.vue
new file mode 100644
index 0000000..321ad26
--- /dev/null
+++ b/uni_modules/nutui-uni/components/menuitem/menuitem.vue
@@ -0,0 +1,196 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/uni_modules/nutui-uni/components/navbar/index.scss b/uni_modules/nutui-uni/components/navbar/index.scss
new file mode 100644
index 0000000..d20dbc7
--- /dev/null
+++ b/uni_modules/nutui-uni/components/navbar/index.scss
@@ -0,0 +1,119 @@
+.nut-theme-dark {
+ .nut-navbar {
+ color: $dark-color;
+ background: $dark-background;
+ box-shadow: $dark-background2;
+
+ .title {
+ color: $dark-color;
+ }
+ }
+}
+
+.nut-navbar {
+ position: relative;
+ box-sizing: border-box;
+ display: flex;
+ align-items: center;
+ height: $navbar-height;
+ padding: $navbar-padding;
+ overflow: hidden;
+ font-size: $navbar-title-base-font;
+ line-height: $navbar-height;
+ color: $navbar-color;
+ background: $navbar-background;
+ box-shadow: $navbar-box-shadow;
+
+ $block: &;
+
+ {$block}--border {
+ border-bottom: 1px solid #eee;
+ }
+
+ {$block}--fixed {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ }
+
+ {$block}--placeholder {
+ display: block;
+ width: 100%;
+ }
+
+ {$block}--safe-area-inset-top {
+ height: calc($navbar-height + var(--status-bar-height));
+ height: calc($navbar-height + constant(safe-area-inset-top));
+ height: calc($navbar-height + env(safe-area-inset-top));
+ padding-top: var(--status-bar-height);
+ padding-top: constant(safe-area-inset-top);
+ padding-top: env(safe-area-inset-top);
+ }
+
+ &__title {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ min-width: 60%;
+ height: 100%;
+ margin: 0 auto;
+ text-align: center;
+
+ .text {
+ display: -webkit-box;
+ min-width: $navbar-title-width;
+ overflow: hidden;
+ font-size: $navbar-title-font;
+ font-weight: $navbar-title-font-weight;
+ color: $navbar-title-font-color;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 1;
+ }
+
+ .icon {
+ margin: $navbar-title-icon-margin;
+ }
+
+ :deep(.nut-icon) {
+ display: inline !important;
+ }
+
+ :deep(.nut-tabs__titles) {
+ background: transparent !important;
+ }
+
+ :deep(.nut-tab-pane) {
+ display: none !important;
+ }
+
+ ::-webkit-scrollbar {
+ display: none;
+ }
+ }
+
+ &__left,
+ &__right {
+ position: absolute;
+ display: flex;
+ align-items: center;
+ padding: 0 16px;
+ font-size: $cell-desc-font;
+ color: $cell-desc-color;
+ cursor: pointer;
+ }
+
+ &__left {
+ left: 0;
+
+ :deep(.nut-icon) {
+ &.nut-icon-left {
+ text-align: left !important;
+ }
+ }
+ }
+
+ &__right {
+ right: 0;
+ }
+}
diff --git a/uni_modules/nutui-uni/components/navbar/index.ts b/uni_modules/nutui-uni/components/navbar/index.ts
new file mode 100644
index 0000000..06c22c6
--- /dev/null
+++ b/uni_modules/nutui-uni/components/navbar/index.ts
@@ -0,0 +1 @@
+export * from './navbar'
diff --git a/uni_modules/nutui-uni/components/navbar/navbar.ts b/uni_modules/nutui-uni/components/navbar/navbar.ts
new file mode 100644
index 0000000..3d1c0a5
--- /dev/null
+++ b/uni_modules/nutui-uni/components/navbar/navbar.ts
@@ -0,0 +1,81 @@
+import type { ExtractPropTypes } from 'vue'
+import { commonProps, makeNumericProp, makeStringProp, truthProp } from '../_utils'
+
+export const navbarProps = {
+ ...commonProps,
+ /**
+ * @description 图标与字体颜色
+ */
+ customColor: makeStringProp('#979797'),
+ /**
+ * @description 图标与字体大小
+ */
+ size: [Number, String],
+ /**
+ * @description 是否展示左侧箭头
+ */
+ leftShow: Boolean, // 左侧 是否显示返回icon
+ /**
+ * @description 中间文字标题
+ */
+ title: makeStringProp(''),
+ /**
+ * @description 中间标题icon
+ */
+ titleIcon: Boolean,
+ /**
+ * @description 左侧文字
+ */
+ leftText: makeStringProp(''),
+ /**
+ * @description 右侧按钮文字
+ */
+ desc: makeStringProp(''),
+ /**
+ * @description 是否固定到顶部
+ */
+ fixed: Boolean,
+ /**
+ * @description 是否开启顶部安全区适配
+ */
+ safeAreaInsetTop: Boolean,
+ /**
+ * @description 是否显示下边框
+ */
+ border: Boolean,
+ /**
+ * @description 固定在顶部时,是否在标签位置生成一个等高的占位元素
+ */
+ placeholder: truthProp,
+ /**
+ * @description 导航栏 `z-index`
+ */
+ zIndex: makeNumericProp(10),
+}
+
+export type NavBarProps = ExtractPropTypes
+
+export const navbarEmits = {
+ clickBack: () => true,
+ clickTitle: () => true,
+ clickIcon: () => true,
+ clickRight: () => true,
+ /**
+ * @deprecated This function will be deprecated in future releases. Please migrate to `clickBack`
+ */
+ onClickBack: () => true,
+ /**
+ * @deprecated This function will be deprecated in future releases. Please migrate to `clickTitle`
+ */
+ onClickTitle: () => true,
+ /**
+ * @deprecated This function will be deprecated in future releases. Please migrate to `clickIcon`
+ */
+ onClickIcon: () => true,
+ /**
+ * @deprecated This function will be deprecated in future releases. Please migrate to `clickRight`
+ */
+ onClickRight: () => true,
+}
+
+export type NavBarEmits = typeof navbarEmits
diff --git a/uni_modules/nutui-uni/components/navbar/navbar.vue b/uni_modules/nutui-uni/components/navbar/navbar.vue
new file mode 100644
index 0000000..cdf192f
--- /dev/null
+++ b/uni_modules/nutui-uni/components/navbar/navbar.vue
@@ -0,0 +1,172 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ leftText }}
+
+
+
+
+
+ {{ title }}
+
+
+
+
+
+
+
+
+ {{ desc }}
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/noticebar/index.scss b/uni_modules/nutui-uni/components/noticebar/index.scss
new file mode 100644
index 0000000..7fdeae7
--- /dev/null
+++ b/uni_modules/nutui-uni/components/noticebar/index.scss
@@ -0,0 +1,156 @@
+/* stylelint-disable keyframes-name-pattern */
+.nut-theme-dark {
+ .nut-noticebar__page {
+ color: $dark-color;
+ background: $dark-background2;
+ }
+
+ .nut-noticebar__vertical {
+ color: $dark-color;
+ }
+}
+
+.nut-noticebar__page {
+ position: relative;
+ display: flex;
+ align-items: center;
+ height: $noticebar-across-height;
+ padding: $noticebar-box-padding;
+ font-size: $noticebar-font-size;
+ color: $noticebar-color;
+ background: $noticebar-background;
+
+ &--wrapable {
+ height: auto;
+ padding: $noticebar-wrapable-padding;
+
+ .nut-noticebar__page-wrap {
+ height: auto !important;
+
+ .nut-noticebar__page-wrap-content {
+ position: relative;
+ word-wrap: break-word;
+ white-space: normal;
+ }
+ }
+ }
+
+ .nut-noticebar__page--withicon {
+ position: relative;
+ padding-right: 40px;
+ }
+
+ .nut-noticebar__page-lefticon {
+ display: flex;
+ align-items: center;
+ margin: $noticebar-lefticon-margin;
+ background-size: 100% 100%;
+ }
+
+ .nut-noticebar__page-righticon {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin: $noticebar-righticon-margin;
+ }
+
+ .nut-noticebar__page-wrap {
+ position: relative;
+ display: flex;
+ flex: 1;
+ height: $noticebar-across-line-height;
+ overflow: hidden;
+ line-height: $noticebar-across-line-height;
+ }
+
+ .nut-noticebar__page-wrap-content {
+ position: absolute;
+ white-space: nowrap;
+
+ &.nut-ellipsis {
+ display: inline-block;
+ max-width: 100%;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+ }
+
+ // 只跑一次
+ .play {
+ animation: nut-notice-bar-play linear both running;
+ }
+
+ .play-infinite {
+ animation: nut-notice-bar-play-infinite linear infinite both running;
+ }
+
+ .play-vertical {
+ animation: nut-notice-bar-play-vertical linear infinite both running;
+ }
+}
+
+@keyframes nut-notice-bar-play {
+ to {
+ transform: translate3d(-100%, 0, 0);
+ }
+}
+
+@keyframes nut-notice-bar-play-infinite {
+ to {
+ transform: translateX(-100%);
+ }
+}
+
+// 垂直方向的滚动
+@keyframes nut-notice-bar-play-vertical {
+ to {
+ transform: translateY($noticebar-across-height);
+ }
+}
+
+// 纵向
+.nut-noticebar__vertical {
+ position: relative;
+ display: flex;
+ justify-content: space-between;
+ height: $noticebar-across-height;
+ padding: $noticebar-box-padding;
+ overflow: hidden;
+ font-size: $noticebar-font-size;
+ color: $noticebar-color;
+ background: $noticebar-background;
+
+ .nut-noticebar__vertical-list {
+ display: block;
+ flex: 1;
+ width: 100%;
+ padding: 0;
+ margin: 0;
+ overflow: hidden;
+
+ .nut-noticebar__vertical-item {
+ width: 100%;
+
+ // display: flex;
+ // align-items: center;
+
+
+ height: $noticebar-across-height;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+ }
+
+ .nut-noticebar-custom-item {
+ position: absolute;
+ top: 999999px;
+ }
+
+ .go {
+ display: flex;
+ align-self: center;
+ margin: $noticebar-righticon-margin;
+ }
+}
diff --git a/uni_modules/nutui-uni/components/noticebar/index.ts b/uni_modules/nutui-uni/components/noticebar/index.ts
new file mode 100644
index 0000000..ef6e2e0
--- /dev/null
+++ b/uni_modules/nutui-uni/components/noticebar/index.ts
@@ -0,0 +1 @@
+export type * from './noticebar'
diff --git a/uni_modules/nutui-uni/components/noticebar/noticebar.ts b/uni_modules/nutui-uni/components/noticebar/noticebar.ts
new file mode 100644
index 0000000..dcd96b1
--- /dev/null
+++ b/uni_modules/nutui-uni/components/noticebar/noticebar.ts
@@ -0,0 +1,95 @@
+import type { ExtractPropTypes } from 'vue'
+import { CLICK_EVENT, CLOSE_EVENT } from '../_constants'
+import { commonProps, isString, makeArrayProp, makeNumberProp, makeNumericProp, makeStringProp, truthProp } from '../_utils'
+
+export interface stateProps {
+ wrapWidth: number
+ firstRound: boolean
+ duration: number
+ offsetWidth: number
+ showNoticebar: boolean
+ animationClass: string
+ animate: boolean
+ scrollList: any[]
+ distance: number
+ timer: null
+ keepAlive: boolean
+ isCanScroll: null | boolean
+ showNotica: boolean
+ id: number
+}
+
+export const noticebarProps = {
+ ...commonProps,
+ /**
+ * @description 滚动的方向,可选 `across`、`vertical`
+ */
+ direction: makeStringProp<'across' | 'vertical'>('across'),
+ /**
+ * @description 纵向滚动数据列表, `vertical`方向
+ */
+ list: makeArrayProp([]),
+ /**
+ * @description 停留时间(毫秒),`vertical`方向
+ */
+ standTime: makeNumberProp(1000),
+ /**
+ * @description 稍复杂的动画,耗能会高,`vertical`方向
+ */
+ complexAm: Boolean,
+ /**
+ * @description 每一个滚动列的高度(px),注意:在使用 slot 插槽定义滚动单元时,按照实际高度修改此值
+ */
+ height: makeNumberProp(40),
+ /**
+ * @description 提示的信息
+ */
+ text: makeStringProp(''),
+ /**
+ * @description 是否启用关闭模式
+ */
+ closeMode: Boolean,
+ /**
+ * @description 是否展示左侧图标, 滚动方向为 `across` 生效
+ */
+ leftIcon: truthProp,
+ /**
+ * @description 导航栏的文字颜色
+ */
+ customColor: makeStringProp(''),
+ /**
+ * @description 导航栏的背景颜色
+ */
+ background: makeStringProp(''),
+ /**
+ * @description 延时多少秒
+ */
+ delay: makeNumericProp(1),
+ /**
+ * @description 是否可以滚动
+ */
+ scrollable: truthProp,
+ /**
+ * @description 滚动速率 (px/s)
+ */
+ speed: makeNumberProp(50),
+ /**
+ * @description 是否开启文本换行,`scrollable` 会设置为 `false`
+ */
+ wrapable: Boolean,
+ /**
+ * @description `vertical`方向时`list`属性如果传入数组对象,显示文本的字段名
+ */
+ fieldName: String,
+}
+
+export type NoticeBarProps = ExtractPropTypes
+
+export const noticebarEmits = {
+ [CLICK_EVENT]: (value: Event | string) => value instanceof Object || isString(value),
+ [CLOSE_EVENT]: (evt: Event | string) => evt instanceof Object || isString(evt),
+ acrossEnd: (evt: Event) => evt instanceof Object,
+
+}
+
+export type NoticeBarEmits = typeof noticebarEmits
diff --git a/uni_modules/nutui-uni/components/noticebar/noticebar.vue b/uni_modules/nutui-uni/components/noticebar/noticebar.vue
new file mode 100644
index 0000000..6277997
--- /dev/null
+++ b/uni_modules/nutui-uni/components/noticebar/noticebar.vue
@@ -0,0 +1,323 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ text }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ props.fieldName && isObject(item) ? item[props.fieldName] : item }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/notify/index.scss b/uni_modules/nutui-uni/components/notify/index.scss
new file mode 100644
index 0000000..21f449b
--- /dev/null
+++ b/uni_modules/nutui-uni/components/notify/index.scss
@@ -0,0 +1,35 @@
+@import "../popup/index";
+
+.nut-notify {
+ box-sizing: border-box;
+ display: block;
+ width: 100%;
+ min-height: $notify-height;
+ padding: $notify-padding;
+ font-size: $notify-font-size;
+ line-height: $notify-line-height;
+ color: $notify-text-color;
+ text-align: center;
+ word-wrap: break-word;
+ white-space: pre-wrap;
+
+ &--base {
+ background: $notify-base-background-color;
+ }
+
+ &--primary {
+ background: $notify-primary-background-color;
+ }
+
+ &--success {
+ background: $notify-success-background-color;
+ }
+
+ &--danger {
+ background: $notify-danger-background-color;
+ }
+
+ &--warning {
+ background: $notify-warning-background-color;
+ }
+}
diff --git a/uni_modules/nutui-uni/components/notify/index.ts b/uni_modules/nutui-uni/components/notify/index.ts
new file mode 100644
index 0000000..cf4e00c
--- /dev/null
+++ b/uni_modules/nutui-uni/components/notify/index.ts
@@ -0,0 +1,2 @@
+export * from './notify'
+export * from './types'
diff --git a/uni_modules/nutui-uni/components/notify/notify.ts b/uni_modules/nutui-uni/components/notify/notify.ts
new file mode 100644
index 0000000..2b9961f
--- /dev/null
+++ b/uni_modules/nutui-uni/components/notify/notify.ts
@@ -0,0 +1,100 @@
+import type { ExtractPropTypes } from 'vue'
+import { CLICK_EVENT, CLOSE_EVENT, CLOSED_EVENT, UPDATE_VISIBLE_EVENT } from '../_constants'
+import { commonProps, isBoolean, makeNumberProp, makeNumericProp, makeStringProp } from '../_utils'
+import type { NotifyOptions, NotifyPosition, NotifyType } from './types'
+
+export const notifyDefaultOptionsKey = '__NOTIFY_OPTIONS__'
+
+export const notifyDefaultOptions: Required> = {
+ visible: false,
+ type: 'danger',
+ msg: '',
+ position: 'top',
+ duration: 3000,
+ zIndex: 9999,
+} as const
+
+export const notifyProps = {
+ ...commonProps,
+ /**
+ * @description 显示与否
+ */
+ visible: {
+ type: Boolean,
+ default: notifyDefaultOptions.visible,
+ },
+ /**
+ * @description 配置注入的key
+ */
+ selector: String,
+ /**
+ * @description 提示的信息类型,可选值为`base` `primary` `success` `danger` `warning`
+ */
+ type: makeStringProp(notifyDefaultOptions.type),
+ /**
+ * @description 展示文案,支持通过`\n`换行
+ */
+ msg: makeStringProp(notifyDefaultOptions.msg),
+ /**
+ * @description 自定义位置,可选值为 `top` `bottom`
+ */
+ position: makeStringProp(notifyDefaultOptions.position),
+ /**
+ * @description 展示时长(ms),值为 0 时,notify 不会消失
+ */
+ duration: makeNumberProp(notifyDefaultOptions.duration),
+ /**
+ * @description 自定义类名
+ */
+ className: makeStringProp(''),
+ /**
+ * @description 组件z-index
+ */
+ zIndex: makeNumberProp(notifyDefaultOptions.zIndex),
+ /**
+ * @description 字体颜色
+ */
+ customColor: makeStringProp(''),
+ /**
+ * @description 背景颜色
+ */
+ background: makeStringProp(''),
+ /**
+ * @description 是否留出顶部安全距离(默认为状态栏高度)
+ */
+ safeAreaInsetTop: Boolean,
+ /**
+ * @description 是否留出底部安全距离(启用后通过 `safeHeight` 指定距离)
+ */
+ safeAreaInsetBottom: Boolean,
+ /**
+ * @description 自定义安全距离
+ */
+ safeHeight: makeNumericProp(''),
+ /**
+ * @description 点击时的回调函数
+ */
+ onClick: Function,
+ /**
+ * @description 关闭时的回调函数
+ */
+ onClose: Function,
+ /**
+ * @description 关闭动画完成时回调函数
+ */
+ onClosed: Function,
+}
+
+export type NotifyProps = ExtractPropTypes
+
+export const notifyEmits = {
+ [UPDATE_VISIBLE_EVENT]: (value: boolean) => isBoolean(value),
+ [CLICK_EVENT]: () => true,
+ [CLOSE_EVENT]: () => true,
+ [CLOSED_EVENT]: () => true,
+}
+
+export type NotifyEmits = typeof notifyEmits
diff --git a/uni_modules/nutui-uni/components/notify/notify.vue b/uni_modules/nutui-uni/components/notify/notify.vue
new file mode 100644
index 0000000..4b945df
--- /dev/null
+++ b/uni_modules/nutui-uni/components/notify/notify.vue
@@ -0,0 +1,240 @@
+
+
+
+
+
+
+
+
+
+
+ {{ notifyOptions.msg }}
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/notify/types.ts b/uni_modules/nutui-uni/components/notify/types.ts
new file mode 100644
index 0000000..02851cb
--- /dev/null
+++ b/uni_modules/nutui-uni/components/notify/types.ts
@@ -0,0 +1,113 @@
+export const notifyPosition = ['top', 'bottom'] as const
+export type NotifyPosition = (typeof notifyPosition)[number]
+
+export const notifyType = ['base', 'primary', 'success', 'danger', 'warning', 'custom'] as const
+export type NotifyType = (typeof notifyType)[number]
+
+export interface NotifyOptions {
+ /**
+ * @description 显示与否
+ */
+ visible?: boolean
+ /**
+ * @description 提示的信息类型,可选值为`base` `primary` `success` `danger` `warning`
+ */
+ type?: NotifyType
+ /**
+ * @description 展示文案,支持通过`\n`换行
+ */
+ msg?: string
+ /**
+ * @description 自定义位置,可选值为 `top` `bottom`
+ */
+ position?: NotifyPosition
+ /**
+ * @description 展示时长(ms),值为 0 时,notify 不会消失
+ */
+ duration?: number
+ /**
+ * @description 自定义类名
+ */
+ className?: string
+ /**
+ * @description 组件z-index
+ */
+ zIndex?: number
+ /**
+ * @description 字体颜色
+ */
+ customColor?: string
+ /**
+ * @description 背景颜色
+ */
+ background?: string
+ /**
+ * @description 是否留出顶部安全距离(默认为状态栏高度)
+ */
+ safeAreaInsetTop?: boolean
+ /**
+ * @description 是否留出底部安全距离(启用后通过 `safeHeight` 指定距离)
+ */
+ safeAreaInsetBottom?: boolean
+ /**
+ * @description 自定义安全距离
+ */
+ safeHeight?: number | string
+ /**
+ * @description 点击时的回调函数
+ */
+ // eslint-disable-next-line ts/no-unsafe-function-type
+ onClick?: Function
+ /**
+ * @description 关闭时的回调函数
+ */
+ // eslint-disable-next-line ts/no-unsafe-function-type
+ onClose?: Function
+ /**
+ * @description 关闭动画完成时回调函数
+ */
+ // eslint-disable-next-line ts/no-unsafe-function-type
+ onClosed?: Function
+}
+
+export interface NotifyInst {
+ /**
+ * @deprecated 使用`show`、`primary`、`success`、`danger`、`warning`代替
+ * @description 显示通知
+ */
+ showNotify: (options: NotifyOptions) => void
+ /**
+ * @deprecated 使用`hide`代替
+ * @description 隐藏通知
+ */
+ hideNotify: () => void
+
+ /**
+ * @description 显示通知
+ */
+ show: (type: NotifyType, msg: string, options?: NotifyOptions) => void
+ /**
+ * @description 主要通知
+ */
+ primary: (msg: string, options?: NotifyOptions) => void
+ /**
+ * @description 成功通知
+ */
+ success: (msg: string, options?: NotifyOptions) => void
+ /**
+ * @description 危险通知
+ */
+ danger: (msg: string, options?: NotifyOptions) => void
+ /**
+ * @description 警告通知
+ */
+ warning: (msg: string, options?: NotifyOptions) => void
+ /**
+ * @description 自定义通知
+ */
+ custom: (msg: string, options?: NotifyOptions) => void
+ /**
+ * @description 隐藏通知
+ */
+ hide: () => void
+}
diff --git a/uni_modules/nutui-uni/components/notify/use-notify.ts b/uni_modules/nutui-uni/components/notify/use-notify.ts
new file mode 100644
index 0000000..5e69d6a
--- /dev/null
+++ b/uni_modules/nutui-uni/components/notify/use-notify.ts
@@ -0,0 +1,62 @@
+import { provide, ref } from 'vue'
+import { cloneDeep } from '../_utils'
+import { notifyDefaultOptions, notifyDefaultOptionsKey } from './notify'
+import type { NotifyInst, NotifyOptions, NotifyType } from './types'
+
+export function useNotify(selector = ''): NotifyInst {
+ const notifyOptionsKey = `${notifyDefaultOptionsKey}${selector || ''}`
+ const notifyOptions = ref(cloneDeep(notifyDefaultOptions))
+
+ provide(notifyOptionsKey, notifyOptions)
+
+ function show(type: NotifyType, msg: string, options?: NotifyOptions) {
+ notifyOptions.value = Object.assign({
+ visible: true,
+ type,
+ msg,
+ }, options)
+ }
+
+ function legacyShow(options: NotifyOptions) {
+ show(notifyDefaultOptions.type, options.msg || notifyDefaultOptions.msg, options)
+ }
+
+ function showPrimary(msg: string, options?: NotifyOptions) {
+ show('primary', msg, options)
+ }
+
+ function showSuccess(msg: string, options?: NotifyOptions) {
+ show('success', msg, options)
+ }
+
+ function showDanger(msg: string, options?: NotifyOptions) {
+ show('danger', msg, options)
+ }
+
+ function showWarning(msg: string, options?: NotifyOptions) {
+ show('warning', msg, options)
+ }
+
+ function showCustom(msg: string, options?: NotifyOptions) {
+ show('custom', msg, options)
+ }
+
+ function hide() {
+ notifyOptions.value = Object.assign(cloneDeep(notifyOptions.value), {
+ visible: false,
+ })
+ }
+
+ return {
+ showNotify: legacyShow,
+ hideNotify: hide,
+
+ show,
+ primary: showPrimary,
+ success: showSuccess,
+ danger: showDanger,
+ warning: showWarning,
+ custom: showCustom,
+ hide,
+ }
+}
diff --git a/uni_modules/nutui-uni/components/numberkeyboard/index.scss b/uni_modules/nutui-uni/components/numberkeyboard/index.scss
new file mode 100644
index 0000000..e8b6ffb
--- /dev/null
+++ b/uni_modules/nutui-uni/components/numberkeyboard/index.scss
@@ -0,0 +1,121 @@
+@import "../popup/index";
+
+.nut-theme-dark {
+ .nut-number-keyboard {
+ background-color: $dark-background4;
+
+ .nut-key__wrapper {
+ .nut-key {
+ color: $dark-color;
+ background-color: $dark-background5;
+ }
+ }
+ }
+}
+
+.nut-number-keyboard {
+ width: $numberkeyboard-width;
+ padding: $numberkeyboard-padding;
+ user-select: none;
+ background-color: $numberkeyboard-background-color;
+
+ .nut-number-keyboard__header {
+ position: relative;
+ box-sizing: content-box;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ height: $numberkeyboard-header-height;
+ padding: $numberkeyboard-header-padding;
+ font-size: $numberkeyboard-header-font-size;
+ color: $numberkeyboard-header-color;
+
+ .nut-number-keyboard__title {
+ display: inline-block;
+ }
+
+ .nut-number-keyboard__close {
+ position: absolute;
+ right: 0;
+ display: block;
+ padding: $numberkeyboard-header-close-padding;
+ font-size: $numberkeyboard-header-close-font-size;
+ color: $numberkeyboard-header-close-color;
+ cursor: pointer;
+ background-color: $numberkeyboard-header-close-background-color;
+ border: none;
+ }
+ }
+
+ .nut-number-keyboard__body {
+ display: flex;
+ padding: 6px 0 0 6px;
+
+ .nut-number-keyboard__keys {
+ display: flex;
+ flex: 3;
+ flex-wrap: wrap;
+ }
+
+ .nut-number-keyboard__sidebar {
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+
+ .nut-key__wrapper {
+ .nut-key {
+ width: 100%;
+ height: 100%;
+ }
+
+ .nut-key--finish {
+ font-size: $numberkeyboard-key-finish-font-size;
+ color: $numberkeyboard-key-finish-font-size-color;
+ background-color: $numberkeyboard-key-finish-background-color;
+ }
+
+ .activefinsh {
+ background-color: $numberkeyboard-key-activefinsh-background-color;
+ }
+ }
+ }
+ }
+}
+
+.nut-key__wrapper {
+ position: relative;
+ box-sizing: border-box;
+ flex: 1;
+ flex-basis: 33%;
+ padding: 0 6px 6px 0;
+
+ &.nut-key__wrapper--wider {
+ flex-basis: 66%;
+ }
+
+ .nut-key {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ height: $numberkeyboard-key-height;
+ font-size: $numberkeyboard-key-font-size;
+ line-height: $numberkeyboard-key-line-height;
+ color: $numberkeyboard-key-font-size-color;
+ cursor: pointer;
+ background-color: $numberkeyboard-key-background-color;
+ border-radius: $numberkeyboard-key-border-radius;
+ }
+
+ .nut-key--active {
+ background-color: $numberkeyboard-key-active-background-color;
+ }
+
+ image {
+ width: 30px;
+ height: 24px;
+ }
+}
+
+.nut-number-keyboard-overlay {
+ background-color: rgb(0 0 0 / 0%) !important;
+}
diff --git a/uni_modules/nutui-uni/components/numberkeyboard/index.ts b/uni_modules/nutui-uni/components/numberkeyboard/index.ts
new file mode 100644
index 0000000..3c7e24c
--- /dev/null
+++ b/uni_modules/nutui-uni/components/numberkeyboard/index.ts
@@ -0,0 +1 @@
+export * from './numberkeyboard'
diff --git a/uni_modules/nutui-uni/components/numberkeyboard/numberkeyboard.ts b/uni_modules/nutui-uni/components/numberkeyboard/numberkeyboard.ts
new file mode 100644
index 0000000..b9ba9ab
--- /dev/null
+++ b/uni_modules/nutui-uni/components/numberkeyboard/numberkeyboard.ts
@@ -0,0 +1,63 @@
+import type { ExtractPropTypes } from 'vue'
+import { CLOSE_EVENT, CONFIRM_EVENT, INPUT_EVENT, UPDATE_MODEL_EVENT, UPDATE_VISIBLE_EVENT } from '../_constants'
+import { commonProps, isBoolean, isNumber, isString, makeArrayProp, makeNumericProp, makeStringProp } from '../_utils'
+
+export const numberkeyboardProps = {
+ ...commonProps,
+ /**
+ * @description 是否显示键盘
+ */
+ visible: Boolean,
+ /**
+ * @description 当前输入值
+ */
+ modelValue: makeStringProp(''),
+ /**
+ * @description 键盘标题
+ */
+ title: makeStringProp(''),
+ /**
+ * @description 键盘模式
+ * - `default`:默认样式
+ * - `rightColumn`:带右侧栏
+ */
+ type: makeStringProp<'default' | 'rightColumn'>('default'),
+ /**
+ * @description 随机数
+ */
+ randomKeys: Boolean,
+ /**
+ * @description 自定义键盘额外的键
+ * - 数组形式最多支持添加2个,超出默认取前2项
+ */
+ customKey: makeArrayProp([]),
+ /**
+ * @description 是否显示遮罩
+ */
+ overlay: Boolean,
+ /**
+ * @description 输入值最大长度,结合 v-model 使用
+ */
+ maxlength: makeNumericProp(6),
+ /**
+ * @description 自定义完成按钮文字,如"支付","下一步","提交"等
+ */
+ confirmText: makeStringProp(''),
+ /**
+ * @description 自定义弹框类名
+ */
+ popClass: makeStringProp(''),
+}
+
+export type NumberKeyBoardProps = ExtractPropTypes
+
+export const numberkeyboardEmits = {
+ [INPUT_EVENT]: (val: string | number) => isString(val) || isNumber(val),
+ delete: () => true,
+ [CLOSE_EVENT]: () => true,
+ [UPDATE_VISIBLE_EVENT]: (visible: boolean) => isBoolean(visible),
+ [UPDATE_MODEL_EVENT]: (val: string | number) => isString(val) || isNumber(val),
+ [CONFIRM_EVENT]: () => true,
+}
+
+export type NumberKeyBoardEmits = typeof numberkeyboardEmits
diff --git a/uni_modules/nutui-uni/components/numberkeyboard/numberkeyboard.vue b/uni_modules/nutui-uni/components/numberkeyboard/numberkeyboard.vue
new file mode 100644
index 0000000..2d48e3f
--- /dev/null
+++ b/uni_modules/nutui-uni/components/numberkeyboard/numberkeyboard.vue
@@ -0,0 +1,220 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
onTouchstart(item, event)"
+ @touchmove="(event: TouchEvent) => onTouchMove(event)"
+ @touchend="onTouchEnd"
+ >
+
+ {{ item.id }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/nutui-uni/nutui-uni.vue b/uni_modules/nutui-uni/components/nutui-uni/nutui-uni.vue
new file mode 100644
index 0000000..e69de29
diff --git a/uni_modules/nutui-uni/components/overlay/index.scss b/uni_modules/nutui-uni/components/overlay/index.scss
new file mode 100644
index 0000000..c0ed9be
--- /dev/null
+++ b/uni_modules/nutui-uni/components/overlay/index.scss
@@ -0,0 +1,12 @@
+.nut-overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: $overlay-bg-color;
+}
+
+.nut-overflow-hidden {
+ overflow: hidden !important;
+}
diff --git a/uni_modules/nutui-uni/components/overlay/index.ts b/uni_modules/nutui-uni/components/overlay/index.ts
new file mode 100644
index 0000000..390ee70
--- /dev/null
+++ b/uni_modules/nutui-uni/components/overlay/index.ts
@@ -0,0 +1 @@
+export * from './overlay'
diff --git a/uni_modules/nutui-uni/components/overlay/overlay.ts b/uni_modules/nutui-uni/components/overlay/overlay.ts
new file mode 100644
index 0000000..ed9df32
--- /dev/null
+++ b/uni_modules/nutui-uni/components/overlay/overlay.ts
@@ -0,0 +1,48 @@
+import type { CSSProperties, ExtractPropTypes, PropType } from 'vue'
+import { CLICK_EVENT, UPDATE_VISIBLE_EVENT } from '../_constants'
+import { commonProps, isBoolean, makeNumericProp, makeStringProp, truthProp } from '../_utils'
+
+export const overlayProps = {
+ ...commonProps,
+ /**
+ * @description 控制遮罩的显示/隐藏
+ */
+ visible: Boolean,
+ /**
+ * @description 自定义遮罩层级
+ */
+ zIndex: Number,
+ /**
+ * @description 显示/隐藏的动画时长,单位毫秒
+ */
+ duration: makeNumericProp(300),
+ /**
+ * @description 自定义遮罩类名
+ */
+ overlayClass: makeStringProp(''),
+ /**
+ * @description 自定义遮罩样式
+ */
+ overlayStyle: Object as PropType,
+ /**
+ * @description 遮罩显示时的背景是否锁定
+ */
+ lockScroll: Boolean,
+ /**
+ * @description 点击遮罩时是否关闭
+ */
+ closeOnClickOverlay: truthProp,
+ /**
+ * @description 是否保留遮罩关闭后的内容
+ */
+ destroyOnClose: Boolean,
+}
+
+export type OverlayProps = ExtractPropTypes
+
+export const overlayEmits = {
+ [UPDATE_VISIBLE_EVENT]: (visible: boolean) => isBoolean(visible),
+ [CLICK_EVENT]: (evt: any) => evt instanceof Object,
+}
+
+export type OverlayEmits = typeof overlayEmits
diff --git a/uni_modules/nutui-uni/components/overlay/overlay.vue b/uni_modules/nutui-uni/components/overlay/overlay.vue
new file mode 100644
index 0000000..d181cdf
--- /dev/null
+++ b/uni_modules/nutui-uni/components/overlay/overlay.vue
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/pagination/index.scss b/uni_modules/nutui-uni/components/pagination/index.scss
new file mode 100644
index 0000000..a45c7dc
--- /dev/null
+++ b/uni_modules/nutui-uni/components/pagination/index.scss
@@ -0,0 +1,81 @@
+.nut-theme-dark {
+ .nut-pagination {
+ &-prev,
+ &-item,
+ &-next {
+ background: $dark-background;
+ border-color: $dark-color-gray;
+ }
+
+ &-simple {
+ background: $dark-background;
+ }
+
+ .simple-border {
+ border-color: $dark-color-gray;
+ }
+
+ .disabled {
+ background: $dark-background;
+ }
+ }
+}
+
+.nut-pagination {
+ display: flex;
+ font-size: $pagination-font-size;
+ color: $pagination-color;
+
+ &-contain {
+ display: flex;
+ }
+
+ &-simple {
+ width: 124px;
+ height: 39px;
+ line-height: 39px;
+ text-align: center;
+ }
+
+ &-prev,
+ &-item,
+ &-next {
+ box-sizing: border-box;
+ display: flex;
+ flex-shrink: 0;
+ align-items: center;
+ justify-content: center;
+ min-width: 39px;
+ height: 39px;
+ cursor: pointer;
+ background: $white;
+ border: $pagination-item-border-width solid $pagination-item-border-color;
+ border-radius: $pagination-item-border-radius;
+ }
+
+ &-prev,
+ &-item {
+ border-right: none;
+ }
+
+ &-prev,
+ &-next {
+ padding: $pagination-prev-next-padding;
+ }
+
+ .simple-border {
+ border-right: $pagination-item-border-width solid $pagination-item-border-color;
+ }
+
+ .active {
+ color: $white;
+ background: $pagination-active-background-color;
+ border: none;
+ }
+
+ .disabled {
+ color: $pagination-disable-color;
+ cursor: not-allowed;
+ background-color: $pagination-disable-background-color;
+ }
+}
diff --git a/uni_modules/nutui-uni/components/pagination/index.ts b/uni_modules/nutui-uni/components/pagination/index.ts
new file mode 100644
index 0000000..48e614c
--- /dev/null
+++ b/uni_modules/nutui-uni/components/pagination/index.ts
@@ -0,0 +1 @@
+export * from './pagination'
diff --git a/uni_modules/nutui-uni/components/pagination/pagination.ts b/uni_modules/nutui-uni/components/pagination/pagination.ts
new file mode 100644
index 0000000..7f7c0ee
--- /dev/null
+++ b/uni_modules/nutui-uni/components/pagination/pagination.ts
@@ -0,0 +1,52 @@
+import type { ExtractPropTypes } from 'vue'
+import { CHANGE_EVENT, UPDATE_MODEL_EVENT } from '../_constants'
+import { commonProps, isNumber, makeNumberProp, makeNumericProp, makeStringProp } from '../_utils'
+
+export const paginationProps = {
+ ...commonProps,
+ /**
+ * @description 当前页码
+ */
+ modelValue: makeNumberProp(1),
+ /**
+ * @description 显示模式,可选值为 `simple`
+ */
+ mode: makeStringProp<'simple' | 'multi'>('multi'),
+ /**
+ * @description 上一页按钮文字
+ */
+ prevText: makeStringProp(''),
+ /**
+ * @description 下一页按钮文字
+ */
+ nextText: makeStringProp(''),
+ /**
+ * @description 总页数
+ */
+ pageCount: makeNumericProp(''),
+ /**
+ * @description 总记录数
+ */
+ totalItems: makeNumericProp('0'),
+ /**
+ * @description 每页记录数
+ */
+ itemsPerPage: makeNumericProp('10'),
+ /**
+ * @description 显示的页码个数
+ */
+ showPageSize: makeNumericProp('5'),
+ /**
+ * @description 是否显示省略号
+ */
+ forceEllipses: Boolean,
+}
+
+export type PaginationProps = ExtractPropTypes
+
+export const paginationEmits = {
+ [UPDATE_MODEL_EVENT]: (val: number) => isNumber(val),
+ [CHANGE_EVENT]: (val: number) => isNumber(val),
+}
+
+export type PaginationEmits = typeof paginationEmits
diff --git a/uni_modules/nutui-uni/components/pagination/pagination.vue b/uni_modules/nutui-uni/components/pagination/pagination.vue
new file mode 100644
index 0000000..c747ac8
--- /dev/null
+++ b/uni_modules/nutui-uni/components/pagination/pagination.vue
@@ -0,0 +1,136 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/picker/index.scss b/uni_modules/nutui-uni/components/picker/index.scss
new file mode 100644
index 0000000..d5ea6d4
--- /dev/null
+++ b/uni_modules/nutui-uni/components/picker/index.scss
@@ -0,0 +1,112 @@
+@import "../pickercolumn/index";
+
+.nut-theme-dark {
+ .nut-picker {
+ position: relative;
+ background: $dark-background;
+ border-radius: 5px;
+
+ /* #ifndef H5 */
+ &__mask {
+ background: none !important;
+ }
+
+ /* #endif */
+
+ &__bar {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ height: 46px;
+ }
+
+ &__title {
+ color: $dark-color;
+ }
+
+ &-content {
+ color: $dark-color;
+ }
+
+ &-item {
+ color: $dark-color;
+ }
+ }
+}
+
+.nut-picker {
+ position: relative;
+ background: #fff;
+ border-radius: 5px;
+
+ &__bar {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ height: 46px;
+ }
+
+ &__left {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ min-width: 50px;
+ height: 100%;
+ padding: $picker-bar-button-padding;
+ font-size: $picker-bar-cancel-font-size;
+ color: $picker-cancel-color;
+ cursor: pointer;
+ }
+
+ &__right {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ min-width: 50px;
+ height: 100%;
+ padding: $picker-bar-button-padding;
+ font-size: $picker-bar-ok-font-size;
+ color: $picker-ok-color;
+ cursor: pointer;
+ }
+
+ &__column {
+ position: relative;
+ display: flex;
+
+ &::before {
+ position: absolute;
+ top: 50%;
+ width: 100%;
+ height: var(--line-height);
+ content: "";
+ border: $picker-item-active-line-border;
+ border-right: 0;
+ border-left: 0;
+ transform: scale(0.9);
+ transform: translateY(-50%);
+ }
+ }
+
+ &__columnitem {
+ flex-grow: 1;
+ width: 0;
+ height: 100%;
+ cursor: grab;
+ user-select: none;
+ }
+
+ &__title {
+ flex: 1;
+ font-size: $picker-bar-title-font-size;
+ font-weight: $picker-bar-title-font-weight;
+ color: $picker-bar-title-color;
+ text-align: center;
+
+ @include oneline-ellipsis;
+ }
+
+ &__wrapper {
+ display: block;
+ }
+}
diff --git a/uni_modules/nutui-uni/components/picker/index.ts b/uni_modules/nutui-uni/components/picker/index.ts
new file mode 100644
index 0000000..23170ed
--- /dev/null
+++ b/uni_modules/nutui-uni/components/picker/index.ts
@@ -0,0 +1,2 @@
+export * from './picker'
+export * from './type'
diff --git a/uni_modules/nutui-uni/components/picker/picker.ts b/uni_modules/nutui-uni/components/picker/picker.ts
new file mode 100644
index 0000000..8605534
--- /dev/null
+++ b/uni_modules/nutui-uni/components/picker/picker.ts
@@ -0,0 +1,64 @@
+import type { ExtractPropTypes } from 'vue'
+import { CANCEL_EVENT, CHANGE_EVENT, CONFIRM_EVENT, UPDATE_MODEL_EVENT } from '../_constants'
+import { commonProps, makeArrayProp, makeNumericProp, makeObjectProp, makeStringProp, truthProp } from '../_utils'
+import type { PickerFieldNames, PickerOption } from '../pickercolumn'
+import type { PickerBaseEvent, PickerChangeEvent } from './type'
+
+export const pickerProps = {
+ ...commonProps,
+ /**
+ * @description 默认选中项
+ */
+ modelValue: makeArrayProp([]),
+ /**
+ * @description 对象数组,配置每一列显示的数据
+ */
+ columns: makeArrayProp([]),
+ /**
+ * @description 是否显示顶部导航
+ */
+ showToolbar: truthProp,
+ /**
+ * @description 设置标题
+ */
+ title: makeStringProp(''),
+ /**
+ * @description 确定按钮文案
+ */
+ okText: makeStringProp(''),
+ /**
+ * @description 取消按钮文案
+ */
+ cancelText: makeStringProp(''),
+ /**
+ * @description 是否开启3D效果
+ */
+ threeDimensional: Boolean,
+ /**
+ * @description 惯性滚动时长
+ */
+ swipeDuration: makeNumericProp(1000),
+ /**
+ * @description 可见的选项个数
+ */
+ visibleOptionNum: makeNumericProp(7),
+ /**
+ * @description 选项高度
+ */
+ optionHeight: makeNumericProp(36),
+ /**
+ * @description 自定义 columns 中的字段
+ */
+ fieldNames: makeObjectProp({}),
+}
+
+export type PickerProps = ExtractPropTypes
+
+export const pickerEmits = {
+ [UPDATE_MODEL_EVENT]: (val: (string | number)[]) => val instanceof Object,
+ [CHANGE_EVENT]: (evt: PickerChangeEvent) => evt instanceof Object,
+ [CONFIRM_EVENT]: (evt: PickerBaseEvent) => evt instanceof Object,
+ [CANCEL_EVENT]: (evt: PickerBaseEvent) => evt instanceof Object,
+}
+
+export type PickerEmits = typeof pickerEmits
diff --git a/uni_modules/nutui-uni/components/picker/picker.vue b/uni_modules/nutui-uni/components/picker/picker.vue
new file mode 100644
index 0000000..c698cfe
--- /dev/null
+++ b/uni_modules/nutui-uni/components/picker/picker.vue
@@ -0,0 +1,233 @@
+
+
+
+
+
+
+
+
+ {{ props.cancelText || translate('cancel') }}
+
+
+ {{ props.title }}
+
+
+ {{ props.okText || translate('confirm') }}
+
+
+
+
+
+
+
+
+
+ {{ item[columnFieldNames.text] }}
+
+
+
+
+
+
+
+
+ { changeHandler(columnIndex, option) }"
+ />
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/picker/type.ts b/uni_modules/nutui-uni/components/picker/type.ts
new file mode 100644
index 0000000..e3052df
--- /dev/null
+++ b/uni_modules/nutui-uni/components/picker/type.ts
@@ -0,0 +1,13 @@
+import type { PickerOption } from '../pickercolumn'
+
+export interface PickerBaseEvent {
+ selectedValue: (string | number)[]
+ selectedOptions: PickerOption[]
+}
+
+export interface PickerChangeEvent extends PickerBaseEvent {
+ columnIndex: number
+}
+
+export const pickerColumnsType = ['single', 'multiple', 'cascade'] as const
+export type PickerColumnsType = (typeof pickerColumnsType)[number]
diff --git a/uni_modules/nutui-uni/components/picker/use-picker.ts b/uni_modules/nutui-uni/components/picker/use-picker.ts
new file mode 100644
index 0000000..038a6c1
--- /dev/null
+++ b/uni_modules/nutui-uni/components/picker/use-picker.ts
@@ -0,0 +1,244 @@
+import type { SetupContext } from 'vue'
+import { computed, nextTick, reactive, ref, toRefs, watch } from 'vue'
+import { CANCEL_EVENT, CHANGE_EVENT, CONFIRM_EVENT, PREFIX, UPDATE_MODEL_EVENT } from '../_constants'
+import { cloneDeep, getMainClass, isEqualValue } from '../_utils'
+import type { PickerOption } from '../pickercolumn'
+import type { PickerEmits, PickerProps } from './picker'
+import type { PickerColumnsType } from './type'
+
+const DEFAULT_FILED_NAMES = {
+ text: 'text',
+ value: 'value',
+ children: 'children',
+ className: '',
+}
+
+export const componentName = `${PREFIX}-picker`
+
+export function usePicker(props: PickerProps, emit: SetupContext['emit']) {
+ const classes = computed(() => {
+ return getMainClass(props, componentName)
+ })
+
+ const state: {
+ formattedColumns: (PickerOption | PickerOption[])[]
+ } = reactive({
+ formattedColumns: props.columns,
+ })
+
+ const columnFieldNames = computed(() => {
+ return {
+ ...DEFAULT_FILED_NAMES,
+ ...props.fieldNames,
+ }
+ })
+
+ // 选中项
+ const defaultValues = ref<(number | string)[]>([])
+
+ // 当前类型
+ const columnsType = computed(() => {
+ const firstColumn: PickerOption | PickerOption[] = state.formattedColumns[0]
+ const fields = columnFieldNames.value
+
+ if (firstColumn) {
+ if (Array.isArray(firstColumn))
+ return 'multiple'
+
+ if (fields.children in firstColumn)
+ return 'cascade'
+ }
+
+ return 'single'
+ })
+
+ // 级联数据格式化
+ const formatCascade = (columns: PickerOption[], defaultValues: (number | string)[]) => {
+ const formatted: PickerOption[][] = []
+ const fields = columnFieldNames.value
+
+ let cursor: PickerOption = {
+ text: '',
+ value: '',
+ [fields.children]: columns,
+ }
+
+ let columnIndex = 0
+
+ while (cursor && cursor[fields.children]) {
+ const options: PickerOption[] = cursor[fields.children]
+ const value = defaultValues[columnIndex]
+
+ let index = options.findIndex(columnItem => columnItem[fields.value] === value)
+ if (index === -1)
+ index = 0
+
+ cursor = cursor[fields.children][index]
+
+ columnIndex += 1
+
+ formatted.push(options)
+ }
+
+ return formatted
+ }
+
+ // 将传入的 columns 格式化
+ const columnsList = computed<(PickerOption | PickerOption[])[]>(() => {
+ switch (columnsType.value) {
+ case 'single':
+ return [state.formattedColumns]
+ case 'multiple':
+ return state.formattedColumns
+ case 'cascade':
+ return formatCascade(
+ state.formattedColumns,
+ defaultValues.value ? defaultValues.value : [],
+ )
+ }
+
+ return []
+ })
+
+ const defaultIndexes = computed(() => {
+ const fields = columnFieldNames.value
+
+ return (columnsList.value as PickerOption[][]).map((column: PickerOption[], index: number) => {
+ const targetIndex = column.findIndex(item => item[fields.value] === defaultValues.value[index])
+ return targetIndex === -1 ? 0 : targetIndex
+ })
+ })
+
+ const delayDefaultIndexes = ref(columnsList.value.map(() => 0))
+
+ watch(defaultIndexes, async (value) => {
+ await nextTick()
+
+ delayDefaultIndexes.value = value
+ }, { immediate: true })
+
+ const columnRefs = ref([])
+
+ const columnRef = (el: any) => {
+ if (el && columnRefs.value.length < columnsList.value.length)
+ columnRefs.value.push(el)
+ }
+
+ const selectedOptions = computed(() => {
+ const fields = columnFieldNames.value
+
+ return (columnsList.value as PickerOption[][]).map((column: PickerOption[], index: number) => {
+ return column.find(item => item[fields.value] === defaultValues.value[index]) || column[0]
+ })
+ })
+
+ const cancel = () => {
+ emit(CANCEL_EVENT, {
+ selectedValue: defaultValues.value,
+ selectedOptions: selectedOptions.value,
+ })
+ }
+
+ const changeHandler = (columnIndex: number, option: PickerOption) => {
+ const fields = columnFieldNames.value
+
+ if (option && Object.keys(option).length) {
+ defaultValues.value = defaultValues.value ? defaultValues.value : []
+
+ if (columnsType.value === 'cascade') {
+ defaultValues.value[columnIndex] = option[fields.value] ? option[fields.value] : ''
+
+ let index = columnIndex
+ let cursor = option
+ while (cursor && cursor[fields.children] && cursor[fields.children][0]) {
+ defaultValues.value[index + 1] = cursor[fields.children][0][fields.value]
+ index += 1
+ cursor = cursor[fields.children][0]
+ }
+
+ // 当前改变列 的 下一列 children 值为空
+ if (cursor && cursor[fields.children] && cursor[fields.children].length === 0)
+ defaultValues.value = defaultValues.value.slice(0, index + 1)
+ }
+ else {
+ defaultValues.value[columnIndex] = Object.prototype.hasOwnProperty.call(option, fields.value)
+ ? option[fields.value]
+ : ''
+ }
+
+ emit(CHANGE_EVENT, {
+ columnIndex,
+ selectedValue: defaultValues.value,
+ selectedOptions: selectedOptions.value,
+ })
+ }
+ }
+
+ const confirm = () => {
+ const fields = columnFieldNames.value
+
+ if (defaultValues.value && !defaultValues.value.length) {
+ columnsList.value.forEach((columns) => {
+ defaultValues.value.push(columns[0][fields.value])
+ })
+ }
+
+ emit(CONFIRM_EVENT, {
+ selectedValue: defaultValues.value,
+ selectedOptions: selectedOptions.value,
+ })
+ }
+
+ const confirmHandler = () => {
+ if (columnRefs.value.length > 0) {
+ columnRefs.value.forEach((column) => {
+ column.stopMomentum()
+ })
+ }
+
+ confirm()
+ }
+
+ watch(
+ () => props.modelValue,
+ (value) => {
+ if (!isEqualValue(value, defaultValues.value))
+ defaultValues.value = cloneDeep(value)
+ },
+ { deep: true, immediate: true },
+ )
+
+ watch(
+ defaultValues,
+ (value) => {
+ if (!isEqualValue(value, props.modelValue))
+ emit(UPDATE_MODEL_EVENT, value)
+ },
+ { deep: true },
+ )
+
+ watch(
+ () => props.columns,
+ (value) => {
+ state.formattedColumns = value
+ },
+ )
+
+ return {
+ classes,
+ ...toRefs(state),
+ columnsType,
+ columnsList,
+ columnFieldNames,
+ cancel,
+ changeHandler,
+ confirmHandler,
+ confirm,
+ defaultValues,
+ defaultIndexes,
+ delayDefaultIndexes,
+ columnRefs,
+ columnRef,
+ selectedOptions,
+ }
+}
diff --git a/uni_modules/nutui-uni/components/pickercolumn/index.scss b/uni_modules/nutui-uni/components/pickercolumn/index.scss
new file mode 100644
index 0000000..b85661e
--- /dev/null
+++ b/uni_modules/nutui-uni/components/pickercolumn/index.scss
@@ -0,0 +1,105 @@
+.nut-theme-dark {
+ .nut-picker {
+ &-roller {
+ color: $dark-color;
+
+ &-item {
+ color: $dark-color;
+ }
+
+ &-item-tile {
+ color: $dark-color;
+ }
+
+ &-item-tarotile {
+ color: $dark-color;
+ }
+ }
+
+ &-roller-mask {
+ z-index: 1;
+ background-image: linear-gradient(180deg, rgb(27 27 27 / 90%), rgb(27 27 27 / 40%)),
+ linear-gradient(0deg, rgb(27 27 27 / 90%), rgb(27 27 27 / 40%));
+ background-repeat: no-repeat;
+ background-position: top, bottom;
+ transform: translateZ(0);
+ }
+ }
+}
+
+.nut-picker {
+ &__list {
+ position: relative;
+ display: block;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+ text-align: center;
+ -webkit-overflow-scrolling: touch;
+ }
+
+ &-roller {
+ position: absolute;
+ top: 50%;
+ z-index: 1;
+ display: block;
+ width: 100%;
+ height: var(--line-height);
+ color: $picker-item-text-color;
+ transform: translateY(-50%);
+ transform-style: preserve-3d;
+
+ &-item {
+ position: absolute;
+ top: 0;
+ display: block;
+ width: 100%;
+ height: $picker-item-height;
+ overflow: hidden;
+ font-size: $picker-item-text-font-size;
+ line-height: $picker-item-height;
+ color: $picker-item-text-color;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ backface-visibility: hidden;
+
+ &-hidden {
+ visibility: hidden;
+ opacity: 0;
+ }
+ }
+
+ &-item-tile {
+ display: block;
+ width: 100%;
+ overflow: hidden;
+ font-size: $picker-item-text-font-size;
+ color: $picker-item-text-color;
+ text-align: center;
+ text-overflow: ellipsis;
+ }
+
+ &-item-tarotile {
+ display: block;
+ width: 100%;
+ overflow: hidden;
+ font-size: $picker-item-text-font-size;
+ color: $picker-item-text-color;
+ text-align: center;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+ }
+
+ &-roller-mask {
+ position: absolute;
+ z-index: 1;
+ display: block;
+ width: 100%;
+ height: 100%;
+ background-image: linear-gradient(180deg, rgb(255 255 255 / 90%), rgb(255 255 255 / 40%)),
+ linear-gradient(0deg, rgb(255 255 255 / 90%), rgb(255 255 255 / 40%));
+ background-repeat: no-repeat;
+ background-position: top, bottom;
+ }
+}
diff --git a/uni_modules/nutui-uni/components/pickercolumn/index.ts b/uni_modules/nutui-uni/components/pickercolumn/index.ts
new file mode 100644
index 0000000..7f459ed
--- /dev/null
+++ b/uni_modules/nutui-uni/components/pickercolumn/index.ts
@@ -0,0 +1,2 @@
+export * from './pickercolumn'
+export * from './type'
diff --git a/uni_modules/nutui-uni/components/pickercolumn/pickercolumn.ts b/uni_modules/nutui-uni/components/pickercolumn/pickercolumn.ts
new file mode 100644
index 0000000..1c8e14a
--- /dev/null
+++ b/uni_modules/nutui-uni/components/pickercolumn/pickercolumn.ts
@@ -0,0 +1,50 @@
+import type { ExtractPropTypes, PropType } from 'vue'
+import { CHANGE_EVENT } from '../_constants'
+import { makeArrayProp, makeNumericProp } from '../_utils'
+import type { PickerFieldNames, PickerOption } from './type'
+
+export const pickercolumnProps = {
+ /**
+ * @description 当前选中项
+ */
+ value: [String, Number],
+ /**
+ * @description 显示的数据
+ */
+ column: makeArrayProp([]),
+ /**
+ * @description 是否开启3D效果
+ */
+ threeDimensional: Boolean,
+ /**
+ * @description 惯性滚动时长
+ */
+ swipeDuration: makeNumericProp(1000),
+ /**
+ * @description 可见的选项个数
+ */
+ visibleOptionNum: makeNumericProp(7),
+ /**
+ * @description 选项高度
+ */
+ optionHeight: makeNumericProp(36),
+ /**
+ * @description 自定义 columns 中的字段
+ */
+ fieldNames: {
+ type: Object as PropType>,
+ default: () => ({}),
+ },
+ /**
+ * @description 特殊环境判断
+ */
+ uni: Boolean,
+}
+
+export type PickerColumnProps = ExtractPropTypes
+
+export const pickercolumnEmits = {
+ [CHANGE_EVENT]: (val: PickerOption) => val instanceof Object || Array.isArray(val) || val === undefined,
+}
+
+export type PickerColumnEmits = typeof pickercolumnEmits
diff --git a/uni_modules/nutui-uni/components/pickercolumn/pickercolumn.vue b/uni_modules/nutui-uni/components/pickercolumn/pickercolumn.vue
new file mode 100644
index 0000000..b843f7b
--- /dev/null
+++ b/uni_modules/nutui-uni/components/pickercolumn/pickercolumn.vue
@@ -0,0 +1,334 @@
+
+
+
+
+
+
+
+
+
+
+ {{ item[props.fieldNames.text] }}
+
+
+
+
+ {{ item[props.fieldNames.text] }}
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/nutui-uni/components/pickercolumn/type.ts b/uni_modules/nutui-uni/components/pickercolumn/type.ts
new file mode 100644
index 0000000..cd602e1
--- /dev/null
+++ b/uni_modules/nutui-uni/components/pickercolumn/type.ts
@@ -0,0 +1,24 @@
+export interface PickerOption {
+ text?: string | number
+ value?: string | number
+ disabled?: string
+ children?: PickerOption[]
+ className?: string | number
+ [key: PropertyKey]: any
+}
+
+export interface PickerTouchParams {
+ startY: number
+ endY: number
+ startTime: number
+ endTime: number
+ lastY: number
+ lastTime: number
+}
+
+export interface PickerFieldNames {
+ text?: string
+ value?: string
+ children?: string
+ className?: string
+}
diff --git a/uni_modules/nutui-uni/components/popover/index.scss b/uni_modules/nutui-uni/components/popover/index.scss
new file mode 100644
index 0000000..dd6db8c
--- /dev/null
+++ b/uni_modules/nutui-uni/components/popover/index.scss
@@ -0,0 +1,253 @@
+@import "../popup/index";
+
+.nut-popover {
+ position: absolute;
+ display: inline-block;
+ word-break: normal;
+
+ .nut-popover-arrow {
+ position: absolute;
+ width: 0;
+ height: 0;
+ border: 8px solid transparent;
+
+ &-top {
+ bottom: 0;
+ margin-bottom: -8px;
+ border-top-color: $popover-white-background-color;
+ border-bottom-width: 0;
+ }
+
+ &-bottom {
+ top: 0;
+ margin-top: -8px;
+ border-top-width: 0;
+ border-bottom-color: $popover-white-background-color;
+
+ &.nut-popover-arrow--bottom {
+ left: 50%;
+ transform: translateX(-50%);
+ }
+
+ &.nut-popover-arrow--bottom-start {
+ left: 16px;
+ transform: translateX(0%);
+ }
+
+ &.nut-popover-arrow--bottom-end {
+ right: 16px;
+ transform: translateX(0%);
+ }
+ }
+
+ &-left {
+ right: 0;
+ margin-right: -8px;
+ border-right-width: 0;
+ border-left-color: $popover-white-background-color;
+
+ &.nut-popover-arrow--left {
+ top: 50%;
+ transform: translateY(-50%);
+ }
+
+ &.nut-popover-arrow--left-start {
+ top: 16px;
+ transform: translateY(0%);
+ }
+
+ &.nut-popover-arrow--left-end {
+ bottom: 16px;
+ transform: translateY(0%);
+ }
+ }
+
+ &-right {
+ left: 0;
+ margin-left: -8px;
+ border-right-color: $popover-white-background-color;
+ border-left-width: 0;
+
+ &.nut-popover-arrow--right {
+ top: 50%;
+ transform: translateY(-50%);
+ }
+
+ &.nut-popover-arrow--right-start {
+ top: 16px;
+ transform: translateY(0%);
+ }
+
+ &.nut-popover-arrow--right-end {
+ bottom: 16px;
+ transform: translateY(0%);
+ }
+ }
+ }
+
+ .nut-popover-content {
+ position: absolute;
+ z-index: 9999;
+ max-height: initial;
+ overflow-y: initial;
+ font-size: 14px;
+ font-weight: normal;
+ color: #333;
+ background: #fff;
+ border-radius: 5px;
+ box-shadow: 0 2px 12px #3232331f;
+ opacity: 1;
+ transition: opacity 0.15s,
+ transform 0.15s;
+
+ &-group {
+ display: block;
+ width: 100%;
+ height: 100%;
+ }
+
+ .nut-popover-menu-item {
+ display: flex;
+ align-items: center;
+ padding: 8px;
+ border-bottom: 1px solid $popover-border-bottom-color;
+
+ &:first-child {
+ margin-top: 15px;
+ }
+
+ &:last-child {
+ margin-bottom: 2px;
+ border-bottom: none;
+ }
+
+ .nut-popover-item-img {
+ margin-right: 3px;
+ vertical-align: top;
+ }
+
+ .nut-popover-menu-item-name {
+ width: 100%;
+ text-align: center;
+ word-break: keep-all;
+ }
+
+ &.nut-popover-menu-disabled {
+ color: $popover-disable-color;
+ cursor: not-allowed;
+ }
+ }
+
+ &--top {
+ .nut-popover-arrow--top {
+ left: 50%;
+ transform: translateX(-50%);
+ }
+ }
+
+ &--top-end {
+ right: 0;
+
+ .nut-popover-arrow--top-end {
+ right: 16px;
+ transform: translateX(0%);
+ }
+ }
+
+ &--top-start {
+ left: 0;
+
+ .nut-popover-arrow--top-start {
+ left: 16px;
+ transform: translateX(0%);
+ }
+ }
+
+ &--bottom-end {
+ right: 0;
+ }
+
+ &--left-end {
+ bottom: 0;
+ }
+
+ &--left-start {
+ top: 0;
+ }
+
+ &--right-end {
+ bottom: 0;
+ }
+
+ &--right-start {
+ top: 0;
+ }
+ }
+}
+
+.nut-popover--dark {
+ .nut-popover-content {
+ color: $popover-white-background-color;
+ background: $popover-dark-background-color;
+
+ &--bottom,
+ &--bottom-start,
+ &--bottom-end {
+ .nut-popover-arrow {
+ border-bottom-color: $popover-dark-background-color;
+ }
+ }
+
+ &--top,
+ &--top-start,
+ &--top-end {
+ .nut-popover-arrow {
+ border-top-color: $popover-dark-background-color;
+ }
+ }
+
+ &--left,
+ &--left-start,
+ &--left-end {
+ .nut-popover-arrow {
+ border-left-color: $popover-dark-background-color;
+ }
+ }
+
+ &--right,
+ &--right-start,
+ &--right-end {
+ .nut-popover-arrow {
+ border-right-color: $popover-dark-background-color;
+ }
+ }
+ }
+}
+
+.nut-popover-enter-from,
+.nut-popover-leave-active {
+ opacity: 0;
+ transform: scale(0.8);
+}
+
+.nut-popover-enter-active {
+ transition-timing-function: ease-out;
+}
+
+.nut-popover-leave-active {
+ transition-timing-function: ease-in;
+}
+
+.nut-popover-content-bg {
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: 300;
+ width: 100%;
+ height: 100%;
+ background: transparent;
+}
+
+.nut-popover-wrapper {
+ display: inline-block;
+}
diff --git a/uni_modules/nutui-uni/components/popover/index.ts b/uni_modules/nutui-uni/components/popover/index.ts
new file mode 100644
index 0000000..2973d7a
--- /dev/null
+++ b/uni_modules/nutui-uni/components/popover/index.ts
@@ -0,0 +1,2 @@
+export type * from './popover'
+export * from './type'
diff --git a/uni_modules/nutui-uni/components/popover/popover.ts b/uni_modules/nutui-uni/components/popover/popover.ts
new file mode 100644
index 0000000..7fa7b54
--- /dev/null
+++ b/uni_modules/nutui-uni/components/popover/popover.ts
@@ -0,0 +1,85 @@
+import type { CSSProperties, ExtractPropTypes, PropType } from 'vue'
+import { CHOOSE_EVENT, CLOSE_EVENT, OPEN_EVENT, UPDATE_VISIBLE_EVENT } from '../_constants'
+import { commonProps, isBoolean, isString, makeArrayProp, makeNumberProp, makeNumericProp, makeStringProp, truthProp } from '../_utils'
+import type { PopoverList, PopoverLocation, PopoverTheme } from './type'
+
+export const popoverProps = {
+ ...commonProps,
+ /**
+ * @description 是否展示气泡弹出层
+ */
+ visible: Boolean,
+ /**
+ * @description 选项列表
+ */
+ list: makeArrayProp([]),
+ /**
+ * @description 主题风格,可选值为 dark
+ */
+ theme: makeStringProp('light'),
+ /**
+ * @description 弹出位置
+ */
+ location: makeStringProp('bottom'),
+ /**
+ * @description 出现位置的偏移量
+ */
+ offset: makeArrayProp([0, 12]),
+ /**
+ * @description 小箭头的偏移量
+ */
+ arrowOffset: makeNumberProp(0),
+ /**
+ * @description 是否显示小箭头
+ */
+ showArrow: truthProp,
+ /**
+ * @description 动画时长,单位毫秒
+ */
+ duration: makeNumericProp(300),
+ /**
+ * @description 是否显示遮罩层
+ */
+ overlay: Boolean,
+ /**
+ * @description 自定义遮罩层类名
+ */
+ overlayClass: makeStringProp(''),
+ /**
+ * @description 自定义遮罩层样式
+ */
+ overlayStyle: { type: Object as PropType },
+ /**
+ * @description 是否在点击遮罩层后关闭菜单
+ */
+ closeOnClickOverlay: truthProp,
+ /**
+ * @description 是否在点击选项后关闭
+ */
+ closeOnClickAction: truthProp,
+ /**
+ * @description 是否在点击外部元素后关闭菜单
+ */
+ closeOnClickOutside: truthProp,
+ /**
+ * @description 自定义背景色
+ */
+ bgColor: makeStringProp(''),
+ /**
+ * @description 自定义目标元素 id, 暂不支持该属性
+ * @deprecated
+ */
+ targetId: makeStringProp(''),
+}
+
+export type PopoverProps = ExtractPropTypes
+
+export const popoverEmits = {
+ update: (val: boolean) => isBoolean(val),
+ [UPDATE_VISIBLE_EVENT]: (val: boolean) => isBoolean(val),
+ [OPEN_EVENT]: () => true,
+ [CLOSE_EVENT]: () => true,
+ [CHOOSE_EVENT]: (item: any, index: number) => (item instanceof Object) || isString(index),
+}
+
+export type PopoverEmits = typeof popoverEmits
diff --git a/uni_modules/nutui-uni/components/popover/popover.vue b/uni_modules/nutui-uni/components/popover/popover.vue
new file mode 100644
index 0000000..4a08f47
--- /dev/null
+++ b/uni_modules/nutui-uni/components/popover/popover.vue
@@ -0,0 +1,295 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+