commit 1fc846fae344cf79f583775b32847771da3767c0 Author: iuu <2167162990@qq.com> Date: Mon Jan 5 12:47:14 2026 +0800 init diff --git a/App.vue b/App.vue new file mode 100644 index 0000000..9b4f7b3 --- /dev/null +++ b/App.vue @@ -0,0 +1,25 @@ + + + diff --git a/api/config.ts b/api/config.ts new file mode 100644 index 0000000..6783fa7 --- /dev/null +++ b/api/config.ts @@ -0,0 +1,37 @@ +import { request } from './request'; + + + +// 获取配置 +export function fetchGetConfig() { + return request({ + url: '/config/get', // id : number + }); +} + + +// 设置配置 +export function fetchSetConfig(data : {}) { + return request({ + url: '/config/set', + data: data, + method: 'POST' + }) +} + +// 设置价格规则 +export function fetchSetPriceRules(data : {}) { + return request({ + url: '/config/setPriceRules', + data: data, + method: 'POST' + }) +} + + +// 获取价格规则 +export function fetchGetPriceRules() { + return request({ + url: '/config/getPriceRules', // id : number + }); +} diff --git a/api/control.ts b/api/control.ts new file mode 100644 index 0000000..87d8d24 --- /dev/null +++ b/api/control.ts @@ -0,0 +1,92 @@ +import { request } from "./request"; +// import { EditGoodsParams } from "../types/contorl"; + + +// 根据串号搜索列表 +export function fetchGoodsListByGoodsNo(goods_no: string) { + return request({ + url: '/store.control/goodsListByGoodsNo', + data: { + goods_no: goods_no, + }, + }); +} + +// 编辑商品 +export function fetchControlEditGoods(form:{}) { + return request({ + url: '/store.control/editGoods', + data: form, + method: 'POST' + }) +} + + +// 工作台商品详情 +export function fetchControlGoodsDetail(id:number) { + return request({ + url: '/store.control/goodsDetail', + data: {id:id} + }) +} + +// // 获取配件详情 +// export function fetchControlPartsGoodsDetail(id:number) { +// return request({ +// url: '/parts.goods/detail', +// data: {id:id} +// }) +// } +// // 获取配件所属机型-机型选项 +// export function fetchControlPartsProducts() { +// return request({ +// url: '/parts.goods/products', +// // data: {id:id} +// }) +// } +// // 获取配件所属分类-分类选项 +// export function fetchControlPartsTypes() { +// return request({ +// url: '/parts.goods/types', +// // data: {id:id} +// }) +// } +// // 获取配件所属分类的子类 +// export function fetchControlPartsDegree(id:number) { +// return request({ +// url: '/parts.goods/filterDegree', +// data: {type_id:id} +// }) +// } + +// // 根据 分类 子类 机型 筛选配件 +// export function fetchControlPartsFilterGoods(params: {type_id: number;product_id?: number;degree_id?: number;}) { +// // 验证必填参数 +// if (params.type_id === undefined || params.type_id === null) { +// return Promise.reject(new Error('type_id 是必填参数')); +// } +// // 构建请求数据,只包含有值的字段 +// const requestData: Record = { +// type_id: params.type_id +// }; +// if (params.product_id !== undefined && params.product_id !== null) { +// requestData.product_id = params.product_id; +// } +// if (params.degree_id !== undefined && params.degree_id !== null) { +// requestData.degree_id = params.degree_id; +// } +// return request({ +// url: '/parts.goods/filterGoods', +// data: requestData +// }); +// } + + +// // 配件工作台-修改配件 +// export function editGoods(params:EditGoodsParams) { +// return request({ +// url: '/parts.goods/editGoods', +// data: params, +// method: 'POST' +// }) +// } \ No newline at end of file diff --git a/api/goods.ts b/api/goods.ts new file mode 100644 index 0000000..db084ab --- /dev/null +++ b/api/goods.ts @@ -0,0 +1,68 @@ +import { request } from './request'; + + + + + +// 编辑商品 +export function fetchGoodsEdit(form:{}) { + return request({ + url: '/goods/edit', + data: form, + method: 'POST' + }) +} + + +// 商品详情 +export function fetchGoodsDetail(id:number) { + return request({ + url: '/goods/detail', + data: {goods_id:id} + }) +} + + + + + +// 新增商品 +export function fetchGoodsAdd(form:{}) { + return request({ + url: '/goods/add', + data: form, + method: 'POST' + }) +} + + + +// 筛选 +export function fetchFilterParmas(is_origin : number = 0) { + return request({ + url: '/goods/filterParams', + data: { + is_origin: is_origin + } + }) +} + + +// 管理端机器列表 +export function fetchSysGoodsList(data : {}) { + return request({ + url: '/goods/list', + data: data, + method: 'POST' + }); +} + + +// 首页机器列表 +export function fetchGoodsList(data : {}) { + return request({ + url: '/goods/lists', + data: data, + method: 'POST' + }); +} \ No newline at end of file diff --git a/api/house_goods.ts b/api/house_goods.ts new file mode 100644 index 0000000..aa23e54 --- /dev/null +++ b/api/house_goods.ts @@ -0,0 +1,171 @@ +import { request } from './request'; +import { houseRequest } from './house_request'; + +// 仓库筛选 +export function houseFetchFilterParmas(is_origin : number = 0) { + return houseRequest({ + url: '/store.goods/filterParams', + data: { + is_origin: is_origin + } + }) +} + +export interface goodsListParams { + page ?: string; + pageSize ?: string; + price_sort ?: string; + degree_ids ?: string[]; // 新增的 ID 数组字段(假设是字符串数组) + product_ids ?: string[]; + search ?: string; + type_id ?: number; + brand_id ?: number; + [property : string] : any; +} + + +// 仓库机器列表 +export function houseFetchGoodsList(filter : goodsListParams) { + return houseRequest({ + url: '/store.goods/lists', + data: filter, + method: 'POST', + }); +} + + +// 仓库商品详情 +export function houseFetchGoodsDetail(id : number) { + return houseRequest({ + url: '/store.goods/detail', + data: { id: id }, + }); +} + +// 获取购物车商品列表 +export function houseFetchCartGoodsIds() { + return houseRequest({ + url: '/store.goods/cartGoodsIds', + }); +} + + +// 检测报告树 +export function fetchGoodsReportTags () { + return houseRequest({ + url:'/store.goods/reportTags', + }) +} + + + + + +// 添加购物车 +export function fetchAddCart(goods_id : number) { + return request({ + url: '/store.goods/addCart', + data: { goods_id: goods_id }, + }); +} + +// 删除购物车 +export function fetchDelCart(goods_id : number) { + return request({ + url: '/store.goods/delCart', + data: { goods_id: goods_id }, + }); +} + +// 获取购物车商品 +export function fetchCartList() { + return request({ + url: '/store.goods/cartList', + }); +} + + + + + + + + + + + + + + + + + + +// export interface PartsListParams { +// /** +// * 子类id +// */ +// degree_id ?: string; +// page ?: string; +// pageSize ?: string; +// /** +// * 配件机型id +// */ +// product_id ?: string; +// /** +// * 配件id +// */ +// type_id ?: string; +// [property : string] : any; +// } +// export function fetcPartsList(filter : PartsListParams) { +// return request({ +// url: '/parts.goods/filtergoodslist', +// data: filter, +// method: 'POST', +// }); +// } + +// export function fetchPartsDetail(id: number) { +// return request({ +// url: '/goods/detail', +// data: { id: id }, +// }); +// } + +// export function addPartsCart(goods_id : number) { +// return request({ +// url: '/parts.cart/addCart', +// data: { goods_id }, +// }); +// } +// export function incPartsCartNum(goods_id : number) { +// return request({ +// url: '/parts.cart/incNum', +// data: { goods_id }, +// }); +// } +// export function decPartsCartNum(goods_id : number) { +// return request({ +// url: '/parts.cart/decNum', +// data: { goods_id }, +// }); +// } +// export function setPartsCartNum(goods_id : number, quantity : number) { +// return request({ +// url: '/parts.cart/setNum', +// data: { goods_id, quantity }, +// }); +// } + +// export function delPartsCart(goods_id : number) { +// return request({ +// url: '/parts.cart/delCart', +// data: { goods_id }, +// }); +// } +// export function fetchPartsCartList() { +// return request({ +// url: '/parts.cart/cartList', +// }); +// } \ No newline at end of file diff --git a/api/house_order.ts b/api/house_order.ts new file mode 100644 index 0000000..07d86e1 --- /dev/null +++ b/api/house_order.ts @@ -0,0 +1,183 @@ +import config from '@/config'; + +import { houseRequest } from "./house_request"; + +// 保存远程收货地址 +export function houseFetchUpdateAddress(form : {}) { + // 设置默认参数 + const defaultParams = { + agent_id: config.wxapp_id, + address: {}, + }; + console.log(defaultParams); + console.log(form); + const requestParams = { + ...defaultParams, + ...form + }; + return houseRequest({ + url: '/store.api/updateAddress', + data: requestParams, + method: 'POST' + }) +} + + +// 仓库商品状态校验 +export function houseFetchCheckGoods(form : {}) { + // 设置默认参数 + const defaultParams = { + agent_id: config.wxapp_id, + goods_id: 0, + }; + console.log(defaultParams); + console.log(form); + const requestParams = { + ...defaultParams, + ...form + }; + return houseRequest({ + url: '/store.api/checkGoods', + data: requestParams, + method: 'POST' + }) +} + + +// 仓库订单预览 +export function houseFetchGoodsPreview(form : {}) { + // 设置默认参数 + const defaultParams = { + agent_id: config.wxapp_id, + goods_id: 0, + }; + console.log(defaultParams); + console.log(form); + const requestParams = { + ...defaultParams, + ...form + }; + return houseRequest({ + url: '/store.api/preview', + data: requestParams, + method: 'POST' + }) +} + + + +// 订单下单 +export function fetchOrderbuyNow(data : {}) { + return houseRequest({ + url: '/order/buyNow', + data: data, + method: 'POST' + }) +} + + + +// // 订单详情 +// export function fetchOrderDetail(id : Number) { +// return request({ +// url: '/order/detail', +// data: { id: id }, +// }) +// } + + + + + + + +// // 订单统计 +// export function fetchOrderTotalCount() { +// return request({ +// url: '/order/totalCount' +// }) +// } + + + + + + + + +// // 获取订单列表 +// interface orderListParams { +// page ?: number; +// pageSize ?: number; +// status ?: 'all' | 'payment' | 'delivery' | 'received' | 'finish'; +// goods_no ?: string; +// [key : string] : any; // 允许其他扩展参数 +// } + +// /** +// * 获取订单列表 +// * @param params 请求参数对象 +// * @returns Promise +// */ +// export function fetchOrderList(params : orderListParams = {}) { +// // 设置默认参数 +// const defaultParams = { +// page: 1, +// pageSize: 10, +// status: 'all', +// goods_no: '', +// }; + +// const requestParams = { +// ...defaultParams, +// ...params +// }; +// return request({ +// url: '/order/getList', +// method: 'GET', // 或 'POST' 根据实际需求 +// data: requestParams +// }); +// } + + + + + + + + +// // 取消订单 +// export function fetchCancelOrder(id : Number) { +// return request({ +// url: '/order/cancel', +// data: { id: id }, +// }) +// } + +// // 标记付款 +// export function fetchPayOrder(id : Number) { +// return request({ +// url: '/order/paid', +// data: { id: id }, +// }) +// } + +// // 标记发货 +// export function fetchDeliveryOrder(form : {}) { +// return request({ +// url: '/order/delivery', +// data: form, +// method: 'POST' +// }) +// } + + + + +// // 确认收货 +// export function fetchReceiptOrder(id : Number) { +// return request({ +// url: '/order/receipt', +// data: { id: id }, +// }) +// } \ No newline at end of file diff --git a/api/house_request.ts b/api/house_request.ts new file mode 100644 index 0000000..acec09d --- /dev/null +++ b/api/house_request.ts @@ -0,0 +1,100 @@ +// 针对仓库的Api接口 + + + +import config from '@/config'; +import { goToLoginPage } from '@/utils/helper'; + +// 定义请求参数接口 +interface Options { + url : string; // 请求路径(不包含基础URL) + method ?: 'GET' | 'POST'; // 请求方法,默认为GET + data ?: any; // POST请求体数据 + params ?: any; // GET请求参数(与data二选一) + dataType ?: string; // 返回数据格式,默认json + responseType ?: string; // 响应数据类型,默认text +} + +// 定义响应数据结构接口 +interface Response { + code : number; + msg ?: string; + data : any; +} + +// /** +// * 获取图片上传的完整URL +// * @returns {string} 完整的图片上传URL,包含基础URL、wxapp_id和token参数 +// */ +// export const getUploadImageUrl = () => { +// return config.api_base_url + '/store.upload/image' + '&wxapp_id=10001&token=' + uni.getStorageSync('token'); +// }; + +/** + * 封装uni.request的通用请求方法 + * @param {Options} options 请求配置项 + * @returns {Promise} 返回Promise对象 + * + * 功能说明: + * 1. 自动拼接基础URL和认证参数 + * 2. 统一处理登录状态(code=-1跳转登录页) + * 3. 统一处理错误提示(code=0显示Toast) + * 4. 成功时返回data字段(code=1) + */ +export const houseRequest = (options : Options) => { + return new Promise((resolve, reject) => { + uni.request({ + // 拼接完整请求URL(基础URL + 路径 + 固定参数) + url: config.house_api_base_url + options.url + '&wxapp_id=10001&token=' + uni.getStorageSync('token'), + + method: options.method || 'GET', // 默认GET方法 + data: options.data || options.params || {}, // 兼容data/params传参 + dataType: options.dataType || 'json', // 默认json格式 + responseType: options.responseType || 'text', // 默认text类型 + + // 请求成功回调 + success(res) { + const ret : Response = res.data; + // console.log(ret); + + // 状态码处理 + switch (ret.code) { + case -1: // 未登录状态 + goToLoginPage(); + break; + case 1: // 成功状态 + // console.log(options.url); + // if (options.url === '/parts.order/preview') { + // console.log('ressss', ret); + // resolve(ret); + // break; + // } + resolve(ret.data); // 返回data字段 + break; + case 0: // 失败状态 + // console.log(options.url); + // if (options.url === '/parts.order/preview') { + // console.log('ressss', ret); + // resolve(ret); + // break; + // } + uni.showToast({ + title: ret.msg || '操作失败', // 显示错误信息 + icon: 'none', // 不显示图标 + }); + break; + } + }, + + // 请求失败回调 + fail(err) { + uni.$emit('z-paging-error-emit'); + reject(err); // 返回错误对象 + uni.showToast({ + title: '网络请求失败', + icon: 'none', + }); + }, + }); + }); +}; \ No newline at end of file diff --git a/api/index.ts b/api/index.ts new file mode 100644 index 0000000..9857e45 --- /dev/null +++ b/api/index.ts @@ -0,0 +1,18 @@ +import { request } from "./request"; + +// export function fetchNavList () { +// return request({ +// url:'/index/nav_list' +// }) +// } + + + + +// 获取店铺配置 +export function fetchConfig () { + return request({ + url:'/store.index/config', + }) +} + diff --git a/api/order.ts b/api/order.ts new file mode 100644 index 0000000..9202b05 --- /dev/null +++ b/api/order.ts @@ -0,0 +1,129 @@ +import { request } from "./request"; + + + +// 订单预览 +export function fetchOrderPreview(form : {}) { + return request({ + url: '/order/preview', + data: form, + method: 'POST' + }) +} + + +// 订单下单 +export function fetchOrderbuyNow(data : {}) { + return request({ + url: '/order/buyNow', + data: data, + method: 'POST' + }) +} + + + +// 订单详情 +export function fetchOrderDetail(id : Number) { + return request({ + url: '/order/detail', + data: { id: id }, + }) +} + + + + + + + +// 订单统计 +export function fetchOrderTotalCount() { + return request({ + url: '/order/totalCount' + }) +} + + + + + + + + +// 获取订单列表 +interface orderListParams { + page ?: number; + pageSize ?: number; + status ?: 'all' | 'payment' | 'delivery' | 'received' | 'finish'; + goods_no ?: string; + [key : string] : any; // 允许其他扩展参数 +} + +/** + * 获取订单列表 + * @param params 请求参数对象 + * @returns Promise + */ +export function fetchOrderList(params : orderListParams = {}) { + // 设置默认参数 + const defaultParams = { + page: 1, + pageSize: 10, + status: 'all', + goods_no: '', + }; + + const requestParams = { + ...defaultParams, + ...params + }; + return request({ + url: '/order/getList', + method: 'GET', // 或 'POST' 根据实际需求 + data: requestParams + }); +} + + + + + + + + +// 取消订单 +export function fetchCancelOrder(id : Number) { + return request({ + url: '/order/cancel', + data: { id: id }, + }) +} + +// 标记付款 +export function fetchPayOrder(id : Number) { + return request({ + url: '/order/paid', + data: { id: id }, + }) +} + +// 标记发货 +export function fetchDeliveryOrder(form : {}) { + return request({ + url: '/order/delivery', + data: form, + method: 'POST' + }) +} + + + + +// 确认收货 +export function fetchReceiptOrder(id : Number) { + return request({ + url: '/order/receipt', + data: { id: id }, + }) +} \ No newline at end of file diff --git a/api/request.ts b/api/request.ts new file mode 100644 index 0000000..3af6ac2 --- /dev/null +++ b/api/request.ts @@ -0,0 +1,145 @@ +// import { ref } from "vue"; +// import config from "../config"; +// import { goToLoginPage } from "../utils/helper"; +// interface Options { +// url : string, +// method ?: 'GET' | 'POST', +// data ?: any, +// params ?: any, +// dataType ?: string, +// responseType ?: string +// } +// interface Response { +// code : number; +// msg ?: string; +// data : any; +// } +// export const getUploadImageUrl = () => { +// return config.api_base_url + '/upload/image' + '&wxapp_id=' + config.wxapp_id + '&token=' + uni.getStorageSync('token'); +// } +// export const request = (options : Options) => { +// return new Promise((resolve, reject) => { +// uni.request({ +// url: config.api_base_url + options.url + '&wxapp_id=' + config.wxapp_id + '&token=' + uni.getStorageSync('token'), +// method: options.method || 'GET', +// data: options.data || options.params || {}, +// dataType: options.dataType || "json", +// responseType: options.responseType || "text", +// success(res) { +// const ret : Response = res.data +// if (ret.code === -1) { +// goToLoginPage() +// } else if (ret.code === 1) { +// resolve(ret.data) +// } else if (ret.code === 0) { +// uni.showToast({ +// title:ret.msg, +// icon:'none' +// }) +// } +// }, +// fail(err) { +// reject(err) +// }, + +// }) +// }) +// } + +import { ref } from 'vue'; +import config from '../config'; +import { goToLoginPage } from '../utils/helper'; + +// 定义请求参数接口 +interface Options { + url : string; // 请求路径(不包含基础URL) + method ?: 'GET' | 'POST'; // 请求方法,默认为GET + data ?: any; // POST请求体数据 + params ?: any; // GET请求参数(与data二选一) + dataType ?: string; // 返回数据格式,默认json + responseType ?: string; // 响应数据类型,默认text +} + +// 定义响应数据结构接口 +interface Response { + code : number; + msg ?: string; + data : any; +} + +/** + * 获取图片上传的完整URL + * @returns {string} 完整的图片上传URL,包含基础URL、wxapp_id和token参数 + */ +export const getUploadImageUrl = () => { + return config.api_base_url + '/upload/image' + '&wxapp_id=' + config.wxapp_id + '&token=' + uni.getStorageSync('token'); +}; + +/** + * 封装uni.request的通用请求方法 + * @param {Options} options 请求配置项 + * @returns {Promise} 返回Promise对象 + * + * 功能说明: + * 1. 自动拼接基础URL和认证参数 + * 2. 统一处理登录状态(code=-1跳转登录页) + * 3. 统一处理错误提示(code=0显示Toast) + * 4. 成功时返回data字段(code=1) + */ +export const request = (options : Options) => { + return new Promise((resolve, reject) => { + uni.request({ + // 拼接完整请求URL(基础URL + 路径 + 固定参数) + url: config.api_base_url + options.url + '&wxapp_id=' + config.wxapp_id + '&token=' + uni.getStorageSync('token'), + + method: options.method || 'GET', // 默认GET方法 + data: options.data || options.params || {}, // 兼容data/params传参 + dataType: options.dataType || 'json', // 默认json格式 + responseType: options.responseType || 'text', // 默认text类型 + + // 请求成功回调 + success(res) { + const ret : Response = res.data; + // console.log(ret); + + // 状态码处理 + switch (ret.code) { + case -1: // 未登录状态 + goToLoginPage(); + break; + case 1: // 成功状态 + // console.log(options.url); + // if (options.url === '/parts.order/preview') { + // console.log('ressss', ret); + // resolve(ret); + // break; + // } + resolve(ret.data); // 返回data字段 + break; + case 0: // 失败状态 + // console.log(options.url); + // if (options.url === '/parts.order/preview') { + // console.log('ressss', ret); + // resolve(ret); + // break; + // } + uni.showToast({ + title: ret.msg || '操作失败', // 显示错误信息 + icon: 'none', // 不显示图标 + }); + break; + } + }, + + // 请求失败回调 + fail(err) { + uni.$emit('z-paging-error-emit'); + reject(err); // 返回错误对象 + uni.showToast({ + title: '网络请求失败', + icon: 'none', + }); + }, + }); + }); +}; \ No newline at end of file diff --git a/api/user.ts b/api/user.ts new file mode 100644 index 0000000..ee73dc0 --- /dev/null +++ b/api/user.ts @@ -0,0 +1,31 @@ +import { request } from "./request"; + +// 用户登录 + +export function login(code : number, user_info : {}) { + return request({ + url: '/user/login', + data: { + code: code, + user_info: user_info + }, + method: 'POST' + }) +} + +// 获取用户信息 +export function fetchUserInfo() { + return request({ + url: '/user/info' + }) +} + +// 绑定手机号 +export function fetchUserPhone(code:string) { + return request({ + url: '/store.user/bindPhone', + data: { + code: code, + }, + }) +} \ No newline at end of file diff --git a/common/constants.ts b/common/constants.ts new file mode 100644 index 0000000..507ea91 --- /dev/null +++ b/common/constants.ts @@ -0,0 +1,4 @@ +// export enum ShoppingCartType { +// PHONE = 1, +// PARTS = 2, +// } diff --git a/components/da-tree/changelog.md b/components/da-tree/changelog.md new file mode 100644 index 0000000..7117197 --- /dev/null +++ b/components/da-tree/changelog.md @@ -0,0 +1,196 @@ +# 1.4.2 + +新增 + +1. 新增`filterValue`属性,支持通过此关键词来搜索并筛选树结构的内容 + +# 1.4.1 + +修复 + +1. 修复单选 onlyRadioLeaf 时末级节点无法选中的 bug + +# 1.4.0 + +版本调整 + +建议更新,但需要注意,异步数据的时候,后台需返回 leaf 字段来判断是否末项数据 + +1. **调整数据项格式,新增 `leaf` 字段,来判断是否为末节点** +2. **调整数据项格式,新增 `sort` 字段,来排序节点位置** +3. **注意:异步加载数据,当为末项的时候,需要服务端数据返回 `leaf` 字段** +4. 新增 `alwaysFirstLoad` ,即异步数据总会在第一次展开节点时,拉取一次后台数据,来比对是否一致 +5. 拆分 `field` 属性,**注意: 1.5.0 版本后将移除 `field` 属性** +6. 新增 `labelField` 同 `field.label`,指定节点对象中某个属性为**标签**字段,默认`label` +7. 新增 `valueField` 同 `field.key`,指定节点对象中某个属性为**值**字段,默认`value` +8. 新增 `childrenField` 同 `field.children`,指定节点对象中某个属性为**子树节点**字段,默认`children` +9. 新增 `disabledField` 同 `field.disabled`,指定节点对象中某个属性为**禁用**字段,默认`disabled` +10. 新增 `appendField` 同 `field.append`,指定节点对象中某个属性为**副标签**字段,默认`append` +11. 新增 `leafField` 同 `field.label`,指定节点对象中某个属性为**末级节点**字段,默认`leaf` +12. 新增 `sortField` 同 `field.label`,指定节点对象中某个属性为**排序**字段,默认`sort` +13. 新增 `isLeafFn` ,用来自定义控制数据项的末项 +14. 更多的项目示例 +15. 支持单选取消选中 +16. 修复节点展开时可能存在的 bug +17. 修复节点选择可能存在的 bug +18. 调整为子节点默认继承父节点禁用属性 +19. `setExpandedKeys` 添加参数一为 `all` 即可支持一键展开/收起全部节点 +20. 其它更多优化 + +# 1.3.4 + +优化 + +1. 优化图标字体命名 + +# 1.3.3 + +优化 + +1. 新增方法调用 + > - 新增`getUncheckedKeys`,返回未选的 key + > - 新增`getUncheckedNodes`,返回未选的节点 + > - 新增`getUnexpandedKeys`,返回未展开的 key + > - 新增`getUnexpandedNodes`,返回未展开的节点 +2. 优化示例项目 + +# 1.3.2 + +修复 + +1. 修复在 APP 真机环境中的报错 + +# 1.3.1 + +修复 + +1. 修复方法`setExpandedKeys`没联动展开上级父子节点 + +# 1.3.0 + +优化 + +1. `field`新增字段 `append` 用于在标签后面显示小提示 +2. 新增支持点击标签也能选中节点 +3. 方法`setExpandedKeys`支持加载动态数据 +4. 修复父节点禁用,则不能展开及图标展开显示 +5. 修复动态加载数据时,末级节点的 `children` 为 `null` 时仍显示展开图标 + +# 1.2.6 + +新增 + +1. 新增支持主题换色 +2. 支持单选的`onlyRadioLeaf`为`true`时可点父节点展开/收起 +3. 优化`expandChecked`调整为不展开无子节点的节点 + +# 1.2.5 + +新增 + +1. 新增 `expandChecked`,控制选择时是否展开当前已选的所有下级节点 + +# 1.2.4 + +修复 + +1. 修复动态数据展开状态异常问题 + +# 1.2.3 + +新增 + +1. 新增 `checkedDisabled`,是否渲染禁用值 +2. 新增 `packDisabledkey`,是否返回已禁用并选中的 key +3. 修复选择父级时,子级已禁用但仍被选中的问题 + +# 1.2.2 + +优化 + +1. 调整动态数据载入处理方式 +2. 修复节点数据因动态数据引起的状态异常 +3. 修复初始节点数据默认选中 + +# 1.2.1 + +修复 + +1. 修复切换`选中状态`被重复选中问题 +2. 修复动态数据引起的重复选择问题 + +# 1.2.0 + +新增 + +1. 新增方法调用 + > - 新增`setCheckedKeys`,方法设置指定 key 的节点选中状态 + > - 新增`setExpandedKeys`,方法设置指定 key 的节点展开状态 +2. 修复小程序重复插槽一直刷报错问题 +3. 优化展开时,会展开子级所以下级节点 + +# 1.1.1 + +新增 + +1. 新增`data`的`disabled`,支持节点禁用状态 +2. 新增`field`的`disabled`,可自定`disabled`字段值 + +# 1.1.0 + +新增 + +1. 新增`loadMode`、`loadApi`,支持展开时加载异步数据 +2. 新增方法调用 + > - 新增`getCheckedKeys`,方法返回已选的 key + > - 新增`getHalfCheckedKeys`,方法返回半选的 key + > - 新增`getExpandedKeys`,方法返回已展开的 key + > - 新增`getCheckedNodes`,方法返回已选的节点 + > - 新增`getHalfCheckedNodes`,方法返回半选的节点 + > - 新增`getExpandedNodes`,方法返回已展开的节点 +3. 对代码进行重构,更易于后期拓展 +4. 此次更新后,页面多个的 DaTee 组件间的数据不再关联 + +# 1.0.6 + +新增 + +1. 新增`checkStrictly`,多选模式下选中时是否父子不关联 + +# 1.0.5 + +修复 + +1. 修复多选时已选数据重复问题 + +# 1.0.4 + +修复 + +1. 修复 `change` 事件回调数据的问题 + +# 1.0.3 + +优化 + +1. 优化文档及示例说明 + +# 1.0.2 + +新增 + +1. 新增 `onlyRadioLeaf` ,单选时只允许选中末级 +2. 优化默认展开及默认选择的展开问题 + +# 1.0.1 + +新增 + +1. 支持展开/收起回调事件`@expand` + +# 1.0.0 + +初始版本 1.0.0,基于 Vue3 进行开发,支持单选、多选,兼容各大平台 + +1. 支持单选 +2. 支持多选 diff --git a/components/da-tree/index.vue b/components/da-tree/index.vue new file mode 100644 index 0000000..604fdcc --- /dev/null +++ b/components/da-tree/index.vue @@ -0,0 +1,1160 @@ + + + + + diff --git a/components/da-tree/props.ts b/components/da-tree/props.ts new file mode 100644 index 0000000..2b80e0d --- /dev/null +++ b/components/da-tree/props.ts @@ -0,0 +1,197 @@ +export default { + /** + * 树的数据 + */ + data: { + type: Array, + default: () => [], + }, + /** + * 主题色 + */ + themeColor: { + type: String, + default: '#007aff', + }, + /** + * 是否开启多选,默认单选 + */ + showCheckbox: { + type: Boolean, + default: false, + }, + /** + * 默认选中的节点,注意单选时为单个key,多选时为key的数组 + */ + defaultCheckedKeys: { + type: [Array, String, Number], + default: null, + }, + /** + * 是否默认展开全部 + */ + defaultExpandAll: { + type: Boolean, + default: false, + }, + /** + * 默认展开的节点 + */ + defaultExpandedKeys: { + type: Array, + default: null, + }, + /** + * 筛选关键词 + */ + filterValue: { + type: String, + default: '', + }, + /** + * 是否自动展开到选中的节点,默认不展开 + */ + expandChecked: { + type: Boolean, + default: false, + }, + + /** + * (旧)字段对应内容,默认为 {label: 'label',key: 'key', children: 'children', disabled: 'disabled', append: 'append'} + * 注意:1.5.0版本后不再兼容 + */ + field: { + type: Object, + default: null, + }, + /** + * 标签字段(新,拆分了) + */ + labelField: { + type: String, + default: 'label', + }, + /** + * 值字段(新,拆分了) + */ + valueField: { + type: String, + default: 'value', + }, + /** + * 下级字段(新,拆分了) + */ + childrenField: { + type: String, + default: 'children', + }, + /** + * 禁用字段(新,拆分了) + */ + disabledField: { + type: String, + default: 'disabled', + }, + /** + * 末级节点字段(新,拆分了) + */ + leafField: { + type: String, + default: 'leaf', + }, + /** + * 副标签字段(新,拆分了) + */ + appendField: { + type: String, + default: 'append', + }, + /** + * 排序字段(新,拆分了) + */ + sortField: { + type: String, + default: 'sort', + }, + /** + * Api数据返回后的结果路径,支持嵌套如`data.list` + */ + resultField: { + type: String, + default: '', + }, + isLeafFn: { + type: Function, + default: null, + }, + /** + * 是否显示单选图标,默认显示 + */ + showRadioIcon: { + type: Boolean, + default: true, + }, + /** + * 单选时只允许选中末级,默认可随意选中 + */ + onlyRadioLeaf: { + type: Boolean, + default: false, + }, + /** + * 多选时,是否执行父子不关联的任意勾选,默认父子关联 + */ + checkStrictly: { + type: Boolean, + default: false, + }, + /** + * 为 true 时,空的 children 数组会显示展开图标 + */ + loadMode: { + type: Boolean, + default: false, + }, + /** + * 异步加载接口 + */ + loadApi: { + type: Function, + default: null, + }, + /** + * 是否总在首次的时候加载一下内容,来比对是否一致 + */ + alwaysFirstLoad: { + type: Boolean, + default: false, + }, + /** + * 是否渲染(操作)禁用值 + */ + checkedDisabled: { + type: Boolean, + default: false, + }, + /** + * 是否返回已禁用的但已选中的key + */ + packDisabledkey: { + type: Boolean, + default: true, + }, + /** + * 选择框的位置,可选 left/right + */ + checkboxPlacement: { + type: String, + default: 'left', + }, + /** + * 子项缩进距离,默认40,单位rpx + */ + indent: { + type: Number, + default: 40, + }, +} diff --git a/components/da-tree/readme.md b/components/da-tree/readme.md new file mode 100644 index 0000000..9b06ead --- /dev/null +++ b/components/da-tree/readme.md @@ -0,0 +1,310 @@ +# da-tree + +一个基于 Vue3 的 tree(树)组件,同时支持主题换色,可能是最适合你的 tree(树)组件 + +组件一直在更新,遇到问题可在下方讨论。 + +`同时更新 Vue2 版本,在此查看 ===>` **[Vue2 版](https://ext.dcloud.net.cn/plugin?id=12692)** + +### 关于使用 + +可在右侧的`使用 HBuilderX 导入插件`或`下载示例项目ZIP`,方便快速上手。 + +可通过下方的示例及文档说明,进一步了解使用组件相关细节参数。 + +插件地址:https://ext.dcloud.net.cn/plugin?id=12384 + +### 组件示例 + +```jsx + +``` + +```js +import { defineComponent, ref } from 'vue' + +/** + * 模拟创建一个接口数据 + */ +function GetApiData(currentNode) { + const { key } = currentNode + + return new Promise((resolve) => { + setTimeout(() => { + // 模拟返回空数据 + if (key.indexOf('-') > -1) { + return resolve(null) + // return resolve([]) + } + + return resolve([ + { + id: `${key}-1`, + name: `行政部X${key}-1`, + }, + { + id: `${key}-2`, + name: `财务部X${key}-2`, + append: '定义了末项数据', + leaf: true, + }, + { + id: `${key}-3`, + name: `资源部X${key}-3`, + }, + { + id: `${key}-4`, + name: `资源部X${key}-3`, + append: '被禁用,无展开图标', + disabled: true, + }, + ]) + }, 2000) + }) +} + +import DaTree from '@/components/da-tree/index.vue' +export default defineComponent({ + components: { DaTree }, + setup() { + const DaTreeRef = ref() + // key的类型必须对应树数据key的类型 + const defaultCheckedKeysValue = ref(['211', '222']) + const defaultCheckedKeysValue2 = ref('222') + const defaultExpandKeysValue3 = ref(['212', '231']) + const roomTreeData = ref([ + { + id: '2', + name: '行政中心', + children: [ + { + id: '21', + name: '行政部', + children: [ + { + id: '211', + name: '行政一部', + children: null, + }, + { + id: '212', + name: '行政二部', + children: [], + disabled: true, + }, + ], + }, + { + id: '22', + name: '财务部', + children: [ + { + id: '221', + name: '财务一部', + children: [], + disabled: true, + }, + { + id: '222', + name: '财务二部', + children: [], + }, + ], + }, + { + id: '23', + name: '人力资源部', + children: [ + { + id: '231', + name: '人力一部', + children: [], + }, + { + id: '232', + name: '人力二部', + append: '更多示例,请下载示例项目查看', + }, + ], + }, + ], + }, + ]) + function doExpandTree(keys, expand) { + DaTreeRef.value?.setExpandedKeys(keys, expand) + + const gek = DaTreeRef.value?.getExpandedKeys() + console.log('当前已展开的KEY ==>', gek) + } + function doCheckedTree(keys, checked) { + DaTreeRef.value?.setCheckedKeys(keys, checked) + + const gek = DaTreeRef.value?.getCheckedKeys() + console.log('当前已选中的KEY ==>', gek) + } + function handleTreeChange(allSelectedKeys, currentItem) { + console.log('handleTreeChange ==>', allSelectedKeys, currentItem) + } + function handleExpandChange(expand, currentItem) { + console.log('handleExpandChange ==>', expand, currentItem) + } + return { + DaTreeRef, + roomTreeData, + defaultCheckedKeysValue, + defaultCheckedKeysValue2, + defaultExpandKeysValue3, + handleTreeChange, + handleExpandChange, + GetApiData, + doExpandTree, + doCheckedTree, + } + }, +}) +``` + +** 更多示例请下载/导入示例项目 ZIP 查看 ** + +### 组件参数 + +| 属性 | 类型 | 默认值 | 必填 | 说明 | +| :------------------ | :------------------------------ | :--------- | :--- | :--------------------------------------------------------------------------- | +| data | `Array` | - | 是 | 树的数据 | +| themeColor | `String` | `#007aff` | 否 | 主题色,十六进制 | +| defaultCheckedKeys | `Array` \| `Number` \| `String` | - | 否 | 默认选中的节点,单选为单个 key,多选为 key 的数组 | +| showCheckbox | `Boolean` | `false` | 否 | 是否开启多选,默认单选 | +| checkStrictly | `Boolean` | `false` | 否 | 多选时,是否执行父子不关联的任意勾选,默认父子关联 | +| showRadioIcon | `Boolean` | `true` | 否 | 是否显示单选图标,默认显示 | +| onlyRadioLeaf | `Boolean` | `true` | 否 | 单选时只允许选中末级,默认可随意选中 | +| defaultExpandAll | `Boolean` | `false` | 否 | 是否默认展开全部 | +| defaultExpandedKeys | `Array` | - | 否 | 默认展开的节点 | +| indent | `Number` | `40` | 否 | 子项缩进距离,单位 rpx | +| checkboxPlacement | `String` | `left` | 否 | 选择框的位置,可选 left/right | +| loadMode | `Boolean` | `false` | 否 | 为 true 时,空的 children 数组会显示展开图标 | +| loadApi | `Function` | - | 否 | 选择框的位置,可选 left/right | +| checkedDisabled | `Boolean` | `false` | 否 | 是否渲染禁用值,默认不渲染 | +| packDisabledkey | `Boolean` | `true` | 否 | 是否返回已禁用的但已选中的 key,默认返回禁用已选值 | +| expandChecked | `Boolean` | `false` | 否 | 是否自动展开到选中的节点,默认不展开 | +| alwaysFirstLoad | `Boolean` | `false` | 否 | 是否总在首次的时候加载一下内容,默认不加载,否则只有展开末级节点才会加载数据 | +| isLeafFn | `Function` | - | 否 | 自定义函数返回来控制数据项的末项 | +| field | `Object` | - | 否 | 字段对应内容,格式参考下方(1.5.0 后移除,请用单独的字段匹配) | +| labelField | `String` | `label` | 否 | 指定节点对象中某个属性为标签字段,默认`label` | +| valueField | `String` | `value` | 否 | 指定节点对象中某个属性为值字段,默认`value` | +| childrenField | `String` | `children` | 否 | 指定节点对象中某个属性为子树节点字段,默认`children` | +| disabledField | `String` | `disabled` | 否 | 指定节点对象中某个属性为禁用字段,默认`disabled` | +| appendField | `String` | `append` | 否 | 指定节点对象中某个属性为副标签字段,默认`append` | +| leafField | `String` | `leaf` | 否 | 指定节点对象中某个属性为末级节点字段,默认`leaf` | +| sortField | `String` | `sort` | 否 | 指定节点对象中某个属性为排序字段,默认`sort` | +| filterValue | `String` | - | 否 | 搜索筛选的关键词,通过输入关键词筛选内容 | + +**field 格式(1.5.0 后移除,请用单独的字段匹配)** + +```js +{ + label: 'label', + key: 'key', + children: 'children', + disabled: 'disabled', + append: 'append' +} +``` + +### 组件事件 + +| 事件名称 | 回调参数 | 说明 | +| :------- | :-------------------------------------- | :-------------- | +| change | `(allCheckedKeys, currentItem) => void` | 选中时回调 | +| expand | `(expandState, currentItem) => void` | 展开/收起时回调 | + +### 组件方法 + +| 方法名称 | 参数 | 说明 | +| :------------------ | :--------------- | :------------------------------------------------------------------------------------------------ | +| setCheckedKeys | `(keys,checked)` | 设置指定 key 的节点选中/取消选中的状态。注: keys 单选时为 key,多选时为 key 的数组 | +| setExpandedKeys | `(keys,expand)` | 设置指定 key 的节点展开/收起的状态,当 keys 为 all 时即代表展开/收起全部。注:keys 为数组或 `all` | +| getCheckedKeys | - | 返回已选的 key | +| getHalfCheckedKeys | - | 返回半选的 key | +| getUncheckedKeys | - | 返回未选的 key | +| getCheckedNodes | - | 返回已选的节点 | +| getUncheckedNodes | - | 返回未选的节点 | +| getHalfCheckedNodes | - | 返回半选的节点 | +| getExpandedKeys | - | 返回已展开的 key | +| getUnexpandedKeys | - | 返回未展开的 key | +| getExpandedNodes | - | 返回已展开的节点 | +| getUnexpandedNodes | - | 返回未展开的节点 | + +### 组件版本 + +v1.4.2 + +### 差异化 + +已通过测试 + +> - H5 页面 +> - 微信小程序 +> - 支付宝、钉钉小程序 +> - 字节跳动、抖音、今日头条小程序 +> - 百度小程序 +> - 飞书小程序 +> - QQ 小程序 +> - 京东小程序 + +未测试 + +> - 快手小程序由于非企业用户暂无演示 +> - 快应用、360 小程序因 Vue3 支持的原因暂无演示 + +### 开发组 + +[@CRLANG](https://crlang.com) diff --git a/components/da-tree/utils.ts b/components/da-tree/utils.ts new file mode 100644 index 0000000..f11bbb3 --- /dev/null +++ b/components/da-tree/utils.ts @@ -0,0 +1,150 @@ +/** 未选 */ +export const unCheckedStatus = 0 +/** 半选 */ +export const halfCheckedStatus = 1 +/** 选中 */ +export const isCheckedStatus = 2 + +/** + * 深拷贝内容 + * @param originData 拷贝对象 + * @author crlang(https://crlang.com) + */ +export function deepClone(originData) { + const type = Object.prototype.toString.call(originData) + let data + if (type === '[object Array]') { + data = [] + for (let i = 0; i < originData.length; i++) { + data.push(deepClone(originData[i])) + } + } else if (type === '[object Object]') { + data = {} + for (const prop in originData) { + // eslint-disable-next-line no-prototype-builtins + if (originData.hasOwnProperty(prop)) { // 非继承属性 + data[prop] = deepClone(originData[prop]) + } + } + } else { + data = originData + } + return data +} + +/** + * 获取所有指定的节点 + * @param type + * @param value + * @author crlang(https://crlang.com) + */ +export function getAllNodes(list, type, value, packDisabledkey = true) { + if (!list || list.length === 0) { + return [] + } + + const res = [] + for (let i = 0; i < list.length; i++) { + const item = list[i] + if (item[type] === value) { + if ((packDisabledkey && item.disabled) || !item.disabled) { + res.push(item) + } + } + } + + return res +} + +/** + * 获取所有指定的key值 + * @param type + * @param value + * @author crlang(https://crlang.com) + */ +export function getAllNodeKeys(list, type, value, packDisabledkey = true) { + if (!list || list.length === 0) { + return null + } + + const res = [] + for (let i = 0; i < list.length; i++) { + const item = list[i] + if (item[type] === value) { + if ((packDisabledkey && item.disabled) || !item.disabled) { + res.push(item.key) + } + } + } + + return res.length ? res : null +} + +/** + * 错误输出 + * + * @param msg + */ +export function logError(msg, ...args) { + console.error(`DaTree: ${msg}`, ...args) +} + +const toString = Object.prototype.toString + +export function is(val, type) { + return toString.call(val) === `[object ${type}]` +} + +/** + * 是否对象(Object) + * @param val + + */ +export function isObject(val) { + return val !== null && is(val, 'Object') +} + +/** + * 是否数字(Number) + * @param val + + */ +export function isNumber(val) { + return is(val, 'Number') +} + +/** + * 是否字符串(String) + * @param val + + */ +export function isString(val) { + return is(val, 'String') +} + +/** + * 是否函数方法(Function) + * @param val + + */ +export function isFunction(val) { + return typeof val === 'function' +} + +/** + * 是否布尔(Boolean) + * @param val + + */ +export function isBoolean(val) { + return is(val, 'Boolean') +} + +/** + * 是否数组(Array) + * @param val + + */ +export function isArray(val) { + return val && Array.isArray(val) +} diff --git a/components/index-custom-navigationbar/index.vue b/components/index-custom-navigationbar/index.vue new file mode 100644 index 0000000..af06030 --- /dev/null +++ b/components/index-custom-navigationbar/index.vue @@ -0,0 +1,139 @@ + + + + + + \ No newline at end of file diff --git a/components/index-custom-navigationbar/index.vue- b/components/index-custom-navigationbar/index.vue- new file mode 100644 index 0000000..f071a36 --- /dev/null +++ b/components/index-custom-navigationbar/index.vue- @@ -0,0 +1,132 @@ + + + + + + \ No newline at end of file diff --git a/components/inlineSelect/inlineSelect.vue b/components/inlineSelect/inlineSelect.vue new file mode 100644 index 0000000..ea3ebdd --- /dev/null +++ b/components/inlineSelect/inlineSelect.vue @@ -0,0 +1,341 @@ + + + + + diff --git a/components/op-drop-down/changelog.md b/components/op-drop-down/changelog.md new file mode 100644 index 0000000..4951b87 --- /dev/null +++ b/components/op-drop-down/changelog.md @@ -0,0 +1,7 @@ +## 1.1.1(2025-03-06) +1.1.1 +## 1.1.0(2025-03-06) +1.1.0 +## 1.0.0(2025-03-05) +1.0.0 +1.0.0 \ No newline at end of file diff --git a/components/op-drop-down/components/op-cascader/op-cascader.vue b/components/op-drop-down/components/op-cascader/op-cascader.vue new file mode 100644 index 0000000..27bf53f --- /dev/null +++ b/components/op-drop-down/components/op-cascader/op-cascader.vue @@ -0,0 +1,244 @@ + + + + \ No newline at end of file diff --git a/components/op-drop-down/components/op-dateTime-picker/op-dateTime-picker.vue b/components/op-drop-down/components/op-dateTime-picker/op-dateTime-picker.vue new file mode 100644 index 0000000..52a9cee --- /dev/null +++ b/components/op-drop-down/components/op-dateTime-picker/op-dateTime-picker.vue @@ -0,0 +1,300 @@ + + + + \ No newline at end of file diff --git a/components/op-drop-down/components/op-drop-down/op-drop-down.vue b/components/op-drop-down/components/op-drop-down/op-drop-down.vue new file mode 100644 index 0000000..fa57765 --- /dev/null +++ b/components/op-drop-down/components/op-drop-down/op-drop-down.vue @@ -0,0 +1,304 @@ + + + + \ No newline at end of file diff --git a/components/op-drop-down/package.json b/components/op-drop-down/package.json new file mode 100644 index 0000000..10e5453 --- /dev/null +++ b/components/op-drop-down/package.json @@ -0,0 +1,88 @@ +{ + "id": "op-drop-down", + "displayName": "op-drop-down", + "version": "1.1.1", + "description": "多功能下拉筛选,支持tree联机筛选、时间范围筛选、数组筛选、自定义筛选菜单", + "keywords": [ + "drop-down", + "datetimerange", + "cascader", + "自定义", + "下拉筛选" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y", + "alipay": "y" + }, + "client": { + "Vue": { + "vue2": "u", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "u", + "app-uvue": "u", + "app-harmony": "u" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "u", + "百度": "u", + "字节跳动": "u", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/components/op-drop-down/readme.md b/components/op-drop-down/readme.md new file mode 100644 index 0000000..bf7d674 --- /dev/null +++ b/components/op-drop-down/readme.md @@ -0,0 +1,167 @@ +# op-drop-down +# 前端UI下拉选择组件, + +### 使用方式 + +```html + + + +``` +```javascript +import OpDropDown from '@/uni_modules/op-drop-down/components/op-drop-down/op-drop-down.vue'; + +export default { + components: { OpDropDown }, + data() { + return { + form: { + type: [], + status: '', + time: '', + dateTimeRange: [], + customKey: '' + }, + paramOptions: [ + { + title: '分类', + key: 'type', + type: 'cascader', + props: { label: 'label', value: 'value', children: 'children', disabled: 'disabled'}, + option: [ + { + label: '标题1', + value: '1', + children: [ + { + label: '标题1-1', + value: '1-1', + children: [ + { label: '标题1-1-1', value: '1-1-1' }, + { label: '标题1-1-2', value: '1-1-2' }, + { label: '标题1-1-3', value: '1-1-3', disabled: true }, + { label: '标题1-1-4', value: '1-1-4', disabled: true }, + { label: '标题1-1-5', value: '1-1-5' }, + { label: '标题1-1-6', value: '1-1-6' } + ] + }, + { + label: '标题1-2', + value: '1-2', + children: [ + { label: '标题1-2-1', value: '1-2-1' }, + { label: '标题1-2-2', value: '1-2-2' } + ] + } + ] + }, + { + label: '标题2', + value: '2', + children: [ + { + label: '标题2-1', + value: '2-1', + children: [ + { label: '标题2-1-1', value: '2-1-1' }, + { label: '标题2-1-2', value: '2-1-2' } + ] + }, + { + label: '标题2-2', + value: '2-2', + children: [ + { label: '标题2-2-1', value: '2-2-1' }, + { label: '标题2-2-2', value: '2-2-2' } + ] + } + ] + }, + { + label: '标题3', + value: '3', + }, + { + label: '标题4', + value: '4', + }, + { + label: '标题5', + value: '5', + } + ] + }, + { + title: '状态', + key: 'status', + type: 'select', + option: [ + { label: '在线', value: 'online'}, + { label: '离线', value: 'offline'}, + ] + }, + { + title: '时间', + key: 'time', + type: 'time', + placeholder: '请选择', + }, + { + title: '日期范围', + key: 'dateTimeRange', + type: 'datetimerange', + startPlaceholder: '请选择', + endPlaceholder: '请选择', + }, + { + title: '自定义', + key: 'customKey', + type: 'custom', + } + ] + } + }, + onLoad() { + + }, + methods: { + onChange(val) { + this.form = val + console.log(val) + }, + reset(val) { + this.form = val + console.log(val) + } + } +} +``` + +###组件的属性说明如下: +| 属性 | 类型 | 默认值 | 必填 | 说明 | +| ---------------- | ------- | ------- | ---- | ------------------------------ | +| defaultValue | Object | {} | 是 | 设置整个下拉的默认键值对 | +| option | Array | [] | 是 | 下拉菜单配置的数据 | +| closeOnClickModal | Boolean | true | 否 | 点击模态窗是否关闭下拉 | + +####option参数说明: +| 属性 | 类型 | 默认值 | 必填 | 说明 | +| ---------------- | ------- | ------- | ---- | ------------------------------ | +| title | String | | 是 | 属性名,显示在页面上 | +| key | String | | 是 | 与defaultValue对应的键 | +| type | String | 可选cascader、select、date、time、yearmonth、year、datetime、daterange、timerange、yearmonthrange、yearrange、datetimerange、custom | 是 | 下拉类型 | +| props | Object | { label: label, value: value, children: children } | 否 | 只针对联级下拉选择项cascader,自定义节点 label、value、options 的字段 | +| placeholder | String | | 否 | 时间选择占位文本 | +| startPlaceholder | String | | 否 | 时间范围选择占位文本 | +| endPlaceholder | String | | 否 | 时间范围选择占位文本 | + +###事件 +| 事件名称 | 回调参数 | 说明 | +| --------- | -------------------- | ------------------------------------------------------------ | +| change | (data) => void | 改变事件,data为当前操作后的数据 | +| reset | (data) => void | 重置其中一个选中数据,data为当前操作后的数据 | \ No newline at end of file diff --git a/config.ts b/config.ts new file mode 100644 index 0000000..562c6b9 --- /dev/null +++ b/config.ts @@ -0,0 +1,35 @@ +export default { + + // 系统名称 + name: "云淘机", + + /** + * 后端api地址 (必填; 斜杠/结尾; 请确保能访问) + * 例如: https://www.你的域名.com/index.php?s=/api/ + */ + api_base_url: "https://phone.19year.cn/index.php?s=/api", + + /** + * 仓库地址 + * 例如: https://www.你的域名.com/index.php?s=/api/ + */ + house_api_base_url: "https://newtel.19year.cn/index.php?s=/api", + + /** + * 是否启用商城设置缓存 + * 将减少用户端重复请求; 正式运营时请设为true, 开启后商城设置同步前端需10分钟缓存 + */ + enabledSettingCache: true, + + + /** + * 分销编号 + */ + wxapp_id: 10001, + + /** + * 代理商ID + */ + agent_no: 10000001 + +} \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..c3ff205 --- /dev/null +++ b/index.html @@ -0,0 +1,20 @@ + + + + + + + + + + +
+ + + diff --git a/main.js b/main.js new file mode 100644 index 0000000..c1caf36 --- /dev/null +++ b/main.js @@ -0,0 +1,22 @@ +import App from './App' + +// #ifndef VUE3 +import Vue from 'vue' +import './uni.promisify.adaptor' +Vue.config.productionTip = false +App.mpType = 'app' +const app = new Vue({ + ...App +}) +app.$mount() +// #endif + +// #ifdef VUE3 +import { createSSRApp } from 'vue' +export function createApp() { + const app = createSSRApp(App) + return { + app + } +} +// #endif \ No newline at end of file diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..bbe199e --- /dev/null +++ b/manifest.json @@ -0,0 +1,79 @@ +{ + "name" : "yuntaoji", + "appid" : "__UNI__91610D7", + "description" : "", + "versionName" : "1.0.0", + "versionCode" : "100", + "transformPx" : false, + /* 5+App特有相关 */ + "app-plus" : { + "usingComponents" : true, + "nvueStyleCompiler" : "uni-app", + "compilerVersion" : 3, + "splashscreen" : { + "alwaysShowBeforeRender" : true, + "waiting" : true, + "autoclose" : true, + "delay" : 0 + }, + /* 模块配置 */ + "modules" : {}, + /* 应用发布信息 */ + "distribute" : { + /* android打包配置 */ + "android" : { + "permissions" : [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + /* ios打包配置 */ + "ios" : {}, + /* SDK配置 */ + "sdkConfigs" : {} + } + }, + /* 快应用特有相关 */ + "quickapp" : {}, + /* 小程序特有相关 */ + "mp-weixin" : { + "appid" : "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 @@ + + + + + \ 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 @@ + + + + + \ 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 @@ + + + + + \ 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 @@ + + + + + \ 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 @@ + + + + + \ 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 @@ + + + + + + + \ 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 @@ + + + + + + + + + + + + \ 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 @@ + + + + + \ 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 @@ + + + + + \ 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 @@ + + + + + \ 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 @@ + + + + + \ 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 @@ + + + + + \ 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 @@ + + + + \ 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 @@ + + + + + + + \ 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 @@ + + + + + + \ 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 @@ + + + + \ 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 @@ + + + + + + + + \ 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 @@ + + + + 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 @@ +

+logo +

+

nutui-uniapp

+

京东风格的轻量级 uni-app 组件库,支持移动端 H5 和 小程序开发

+

+ + GitHub Repo stars + + + npm + + + npm + + + downloads + + +netlify + +

+ +

+ NutUI +   + NutUI>
+   
+</p>
+
+## 介绍
+
+nutui-uniapp 组件库,基于Taro版[`NutUi`](https://nutui.jd.com/#/) 4.x版本修改而来,适配了uni-app, 使用 Vue 技术栈开发小程序应用,开箱即用,拥有丰富的业务组件。
+
+## 特性
+
+- 🚀 80+ 高质量组件,覆盖移动端主流场景
+- 💪 支持一套代码同时开发多端
+- 📖 基于京东 APP 10.0 视觉规范
+- 🍭 支持按需引用
+- 💪 支持 TypeScript
+- 💪 支持动态定制主题
+- 🍭 支持暗黑模式
+- 🌍 支持国际化
+
+## 快速上手
+
+请参考[快速上手](https://nutui-uniapp.pages.dev/guide/quick-start.html)。
+
+## 链接
+
+- [意见反馈](https://github.com/nutui-uniapp/nutui-uniapp/issues)
+- [更新日志](https://github.com/nutui-uniapp/nutui-uniapp/releases)
+- [常见问题](https://nutui-uniapp.pages.dev/guide/faq.html)
+- [Discussions 讨论区](https://github.com/nutui-uniapp/nutui-uniapp/discussions)
+
+## 贡献指南
+
+修改代码请阅读我们的 [贡献指南](https://github.com/nutui-uniapp/nutui-uniapp/blob/main/CONTRIBUTING.md)。
+
+使用过程中发现任何问题都可以提 [Issue](https://github.com/nutui-uniapp/nutui-uniapp/issues) 给我们,当然,我们也非常欢迎你给我们发 [PR](https://github.com/nutui-uniapp/nutui-uniapp/pulls)。
+
+## 贡献者们
+
+感谢以下所有给 nutui-uniapp 贡献过代码的 [开发者](https://github.com/nutui-uniapp/nutui-uniapp/graphs/contributors)。
+
+<a href= + contributors + + +## 感谢 + +- [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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + diff --git a/uni_modules/nutui-uni/components/popover/type.ts b/uni_modules/nutui-uni/components/popover/type.ts new file mode 100644 index 0000000..a758880 --- /dev/null +++ b/uni_modules/nutui-uni/components/popover/type.ts @@ -0,0 +1,20 @@ +export type PopoverTheme = 'light' | 'dark' + +export interface PopoverRootPosition { + width: number + height: number + left: number + top: number + right: number +} +export const popoverLocation + = ['bottom', 'top', 'left', 'right', 'top-start', 'top-end', 'bottom-start', 'bottom-end', 'left-start', 'left-end', 'right-start', 'right-end'] as const +export type PopoverLocation = (typeof popoverLocation)[number] + +export interface PopoverList { + name: string + icon?: string + disabled?: boolean + className?: any + [key: PropertyKey]: any +} diff --git a/uni_modules/nutui-uni/components/popup/index.scss b/uni_modules/nutui-uni/components/popup/index.scss new file mode 100644 index 0000000..60de8d2 --- /dev/null +++ b/uni_modules/nutui-uni/components/popup/index.scss @@ -0,0 +1,147 @@ +@import "../overlay/index"; + +.nut-theme-dark { + .nut-popup { + background: $dark-background2; + + &__close-icon { + color: $dark-color; + } + } +} + +.nut-popup-slide { + &-center-enter-active, + &-center-leave-active { + transition-timing-function: ease; + transition-property: opacity; + } + + &-center-enter-from, + &-center-leave-to { + opacity: 0; + } + + &-top-enter-from, + &-top-leave-active { + transform: translate(0, -100%); + } + + &-right-enter-from, + &-right-leave-active { + transform: translate(100%, 0); + } + + &-bottom-enter-from, + &-bottom-leave-active { + transform: translate(0, 100%); + } + + &-left-enter-from, + &-left-leave-active { + transform: translate(-100%, 0); + } +} + +.nut-popup--center { + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + + &.round { + border-radius: $popup-border-radius; + } +} + +.nut-popup--bottom { + bottom: 0; + left: 0; + width: 100%; + + &.round { + border-radius: $popup-border-radius $popup-border-radius 0 0; + } + + &--safebottom { + padding-bottom: constant(safe-area-inset-bottom); + padding-bottom: env(safe-area-inset-bottom); + } +} + +.nut-popup--right { + top: 0; + right: 0; + + &.round { + border-radius: $popup-border-radius 0 0 $popup-border-radius; + } +} + +.nut-popup--left { + top: 0; + left: 0; + + &.round { + border-radius: 0 $popup-border-radius $popup-border-radius 0; + } +} + +.nut-popup--top { + top: 0; + left: 0; + width: 100%; + + &.round { + border-radius: 0 0 $popup-border-radius $popup-border-radius; + } + + &--safetop { + padding-top: var(--status-bar-height); + padding-top: constant(safe-area-inset-top); + padding-top: env(safe-area-inset-top); + } +} + +.nut-popup { + position: fixed; + max-height: 100%; + overflow-y: auto; + background-color: $white; + -webkit-overflow-scrolling: touch; + + &__close-icon { + position: absolute !important; + z-index: 1; + width: 30px; + height: 30px; + font-size: 18px; + line-height: 30px; + color: #969799; + text-align: center; + cursor: pointer; + + &:active { + opacity: 0.7; + } + + &--top-left { + top: $popup-close-icon-margin; + left: $popup-close-icon-margin; + } + + &--top-right { + top: $popup-close-icon-margin; + right: $popup-close-icon-margin; + } + + &--bottom-left { + bottom: $popup-close-icon-margin; + left: $popup-close-icon-margin; + } + + &--bottom-right { + right: $popup-close-icon-margin; + bottom: $popup-close-icon-margin; + } + } +} diff --git a/uni_modules/nutui-uni/components/popup/index.ts b/uni_modules/nutui-uni/components/popup/index.ts new file mode 100644 index 0000000..7fdca2d --- /dev/null +++ b/uni_modules/nutui-uni/components/popup/index.ts @@ -0,0 +1,2 @@ +export * from './popup' +export * from './use-popup' diff --git a/uni_modules/nutui-uni/components/popup/popup.ts b/uni_modules/nutui-uni/components/popup/popup.ts new file mode 100644 index 0000000..14f1429 --- /dev/null +++ b/uni_modules/nutui-uni/components/popup/popup.ts @@ -0,0 +1,79 @@ +import type { ExtractPropTypes, PropType } from 'vue' +import { CLOSE_EVENT, CLOSED_EVENT, OPEN_EVENT, OPENED_EVENT, UPDATE_VISIBLE_EVENT } from '../_constants' +import type { Position } from '../_constants/types' +import { commonProps, makeStringProp, truthProp } from '../_utils' +import { overlayProps } from '../overlay/overlay' +import type { NutAnimationName } from '../transition/types' + +export const popupProps = { + ...overlayProps, + ...commonProps, + /** + * @description 弹出位置(top,bottom,left,right,center) + */ + position: makeStringProp('center'), + /** + * @description 动画名 + */ + transition: { + type: String as PropType, + default: '', + }, + /** + * @description 自定义弹框类名 + */ + popClass: makeStringProp(''), + /** + * @description 是否显示圆角 + */ + round: Boolean, + /** + * @description 是否显示关闭按钮 + */ + closeable: Boolean, + /** + * @description 关闭按钮图标 + */ + closeIcon: makeStringProp('close'), + /** + * @description 关闭按钮位置(top-left,top-right,bottom-left,bottom-right) + */ + closeIconPosition: makeStringProp<'top-right' | 'bottom-right' | 'bottom-left' | 'top-left'>('top-right'), + /** + * @description 是否保留弹层关闭后的内容 + */ + destroyOnClose: truthProp, + /** + * @description 是否显示遮罩层 + */ + overlay: truthProp, + /** + * @description 是否开启 iPhone 系列全面屏底部安全区适配,仅当 `position` 为 `bottom` 时有效 + */ + safeAreaInsetBottom: Boolean, + /** + * @description 是否开启 iPhone 顶部安全区适配 + */ + safeAreaInsetTop: truthProp, +} + +export type PopupProps = ExtractPropTypes + +/* eslint-disable unused-imports/no-unused-vars */ +export const popupEmits = { + [UPDATE_VISIBLE_EVENT]: (value: boolean) => true, + 'click-pop': (event: any) => true, + 'click-close-icon': () => true, + 'click-overlay': () => true, + [OPEN_EVENT]: () => true, + [OPENED_EVENT]: () => true, + [CLOSE_EVENT]: () => true, + [CLOSED_EVENT]: () => true, + /** + * @deprecated + */ + 'opend': () => true, +} +/* eslint-enable unused-imports/no-unused-vars */ + +export type PopupEmits = typeof popupEmits diff --git a/uni_modules/nutui-uni/components/popup/popup.vue b/uni_modules/nutui-uni/components/popup/popup.vue new file mode 100644 index 0000000..fac6af0 --- /dev/null +++ b/uni_modules/nutui-uni/components/popup/popup.vue @@ -0,0 +1,87 @@ + + + + + + + diff --git a/uni_modules/nutui-uni/components/popup/use-popup.ts b/uni_modules/nutui-uni/components/popup/use-popup.ts new file mode 100644 index 0000000..0e8176c --- /dev/null +++ b/uni_modules/nutui-uni/components/popup/use-popup.ts @@ -0,0 +1,132 @@ +import type { SetupContext } from 'vue' +import { computed, onMounted, reactive, toRefs, watch } from 'vue' +import { + animationName, + CLOSE_EVENT, + CLOSED_EVENT, + OPEN_EVENT, + OPENED_EVENT, + PREFIX, + UPDATE_VISIBLE_EVENT, +} from '../_constants' +import { useGlobalZIndex } from '../_hooks' +import { getMainClass, getMainStyle } from '../_utils' +import type { NutAnimationName } from '../transition' +import type { PopupEmits, PopupProps } from './popup' + +const componentName = `${PREFIX}-popup` + +export function usePopup(props: PopupProps, emit: SetupContext['emit']) { + const state = reactive({ + innerVisible: false, + innerIndex: props.zIndex, + showSlot: true, + }) + + const classes = computed(() => { + return getMainClass(props, componentName, { + round: props.round, + [`nut-popup--${props.position}`]: true, + [`nut-popup--${props.position}--safebottom`]: props.position === 'bottom' && props.safeAreaInsetBottom, + [`nut-popup--${props.position}--safetop`]: props.position === 'top' && props.safeAreaInsetTop, + [props.popClass]: true, + }) + }) + + const popStyle = computed(() => { + return getMainStyle(props, { + zIndex: state.innerIndex, + transitionDuration: `${props.duration}ms`, + }) + }) + + const transitionName = computed(() => { + return props.transition ? props.transition : `${animationName[props.position]}` + }) + + const open = () => { + if (state.innerVisible) + return + + state.innerIndex = props.zIndex !== undefined ? props.zIndex : useGlobalZIndex() + + state.innerVisible = true + emit(UPDATE_VISIBLE_EVENT, true) + + state.showSlot = true + + emit(OPEN_EVENT) + } + + const close = () => { + if (!state.innerVisible) + return + + state.innerVisible = false + emit(UPDATE_VISIBLE_EVENT, false) + + emit(CLOSE_EVENT) + } + + const onClick = (e: any) => { + emit('click-pop', e) + } + + const onClickCloseIcon = (e: any) => { + e.stopPropagation() + + emit('click-close-icon') + + close() + } + + const onClickOverlay = () => { + emit('click-overlay') + + if (props.closeOnClickOverlay) + close() + } + + const onOpened = () => { + emit(OPENED_EVENT) + emit('opend') + } + + const onClosed = () => { + emit(CLOSED_EVENT) + + state.showSlot = !props.destroyOnClose + } + + const applyVisible = (visible: boolean) => { + if (visible && !state.innerVisible) { + open() + } + + if (!visible && state.innerVisible) { + state.innerVisible = false + + emit(CLOSE_EVENT) + } + } + + watch(() => props.visible, (value) => { + applyVisible(value) + }) + + onMounted(() => { + applyVisible(props.visible) + }) + + return { + ...toRefs(state), + popStyle, + transitionName, + classes, + onClick, + onClickCloseIcon, + onClickOverlay, + onOpened, + onClosed, + } +} diff --git a/uni_modules/nutui-uni/components/price/index.scss b/uni_modules/nutui-uni/components/price/index.scss new file mode 100644 index 0000000..730e53b --- /dev/null +++ b/uni_modules/nutui-uni/components/price/index.scss @@ -0,0 +1,66 @@ +.nut-price { + display: inline; + font-size: 0; + color: $primary-color; + + &--strike { + [class*='nut-price'] { + text-decoration: line-through; + } + } + + &--symbol { + display: inline-block; + font-size: $font-size-3; + } + + &--large { + display: inline-block; + font-size: $price-big-size; + } + + &--point { + display: inline-block; + font-size: $price-big-size; + } + + &--decimal-large { + display: inline-block; + font-size: $price-decimal-big-size; + } + + &--symbol-large { + display: inline-block; + font-size: $price-symbol-big-size; + } + + &--normal { + display: inline-block; + font-size: $price-medium-size; + } + + &--decimal-normal { + display: inline-block; + font-size: $price-decimal-medium-size; + } + + &--symbol-normal { + display: inline-block; + font-size: $price-symbol-medium-size; + } + + &--small { + display: inline-block; + font-size: $price-small-size; + } + + &--decimal-small { + display: inline-block; + font-size: $price-decimal-small-size; + } + + &--symbol-small { + display: inline-block; + font-size: $price-symbol-small-size; + } +} diff --git a/uni_modules/nutui-uni/components/price/index.ts b/uni_modules/nutui-uni/components/price/index.ts new file mode 100644 index 0000000..378f229 --- /dev/null +++ b/uni_modules/nutui-uni/components/price/index.ts @@ -0,0 +1 @@ +export * from './price' diff --git a/uni_modules/nutui-uni/components/price/price.ts b/uni_modules/nutui-uni/components/price/price.ts new file mode 100644 index 0000000..b14e7a1 --- /dev/null +++ b/uni_modules/nutui-uni/components/price/price.ts @@ -0,0 +1,40 @@ +import type { ExtractPropTypes } from 'vue' +import { commonProps, makeNumberProp, makeNumericProp, makeStringProp, truthProp } from '../_utils' + +export const priceProps = { + ...commonProps, + /** + * @description 价格数量 + */ + price: makeNumericProp(0), + /** + * @description 是否需要加上 symbol 符号 + */ + needSymbol: truthProp, + /** + * @description 符号类型 + */ + symbol: makeStringProp('¥'), + /** + * @description 小数位位数 + */ + decimalDigits: makeNumberProp(2), + /** + * @description 是否按照千分号形式显示 + */ + thousands: Boolean, + /** + * @description 符号显示在价格前或者后,`before`、`after` + */ + position: makeStringProp<'before' | 'after'>('before'), + /** + * @description 价格尺寸,`small`、`normal`、`large` + */ + size: makeStringProp<'small' | 'normal' | 'large'>('normal'), + /** + * @description 是否展示划线价 + */ + strikeThrough: Boolean, +} + +export type PriceProps = ExtractPropTypes diff --git a/uni_modules/nutui-uni/components/price/price.vue b/uni_modules/nutui-uni/components/price/price.vue new file mode 100644 index 0000000..f1be37c --- /dev/null +++ b/uni_modules/nutui-uni/components/price/price.vue @@ -0,0 +1,106 @@ + + + + + + + diff --git a/uni_modules/nutui-uni/components/progress/index.scss b/uni_modules/nutui-uni/components/progress/index.scss new file mode 100644 index 0000000..3384b63 --- /dev/null +++ b/uni_modules/nutui-uni/components/progress/index.scss @@ -0,0 +1,127 @@ +.nut-progress { + position: relative; + display: flex; + align-items: center; + width: 100%; + + .nut-progress-outer { + flex: 1; + height: 10px; + background-color: $progress-outer-background-color; + border-radius: $progress-outer-border-radius; + + .nut-progress-inner { + width: 30%; + height: 100%; + background: $progress-inner-background-color; + border-radius: $progress-outer-border-radius; + transition: all 0.4s; + } + + .nut-progress-text { + display: flex; + flex-direction: column; + justify-content: center; + color: #fff; + } + + .nut-progress-slot { + display: flex; + align-items: center; + justify-content: center; + } + + .nut-active { + &::before { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + content: ""; + border-radius: $progress-outer-border-radius; + animation: progressActive 2s ease-in-out infinite; + } + } + + @keyframes progressActive { + 0% { + width: 0; + background: rgb(255 255 255 / 10%); + } + + 20% { + width: 0; + background: rgb(255 255 255 / 50%); + } + + 100% { + width: 100%; + background: rgb(255 255 255 / 0%); + } + } + + &.nut-progress-small { + height: $progress-small-height; + + .nut-progress-text { + top: 50%; + padding: $progress-small-text-padding; + font-size: $progress-small-text-font-size; + line-height: $progress-small-text-line-height; + } + } + + &.nut-progress-base { + height: $progress-base-height; + + .nut-progress-text { + top: 50%; + padding: $progress-base-text-padding; + font-size: $progress-base-text-font-size; + line-height: $progress-base-text-line-height; + } + } + + &.nut-progress-large { + height: $progress-large-height; + + .nut-progress-text { + top: 50%; + padding: $progress-large-text-padding; + font-size: $progress-large-text-font-size; + line-height: $progress-large-text-line-height; + } + } + } + + .nut-progress-outer-part { + width: 90%; + } + + .nut-progress-text { + display: flex; + align-items: center; + min-width: 35px; + padding: 0 5px; + font-size: 13px; + line-height: 1; + } + + .nut-progress-insidetext { + position: absolute; + top: 50%; + min-width: 0; + padding: $progress-insidetext-padding; + background: $progress-insidetext-background; + border-radius: $progress-insidetext-border-radius; + transition: all 0.4s; + } + + .nut-icon-success, + .nut-icon-fail { + display: inline-block; + width: 10px; + height: 10px; + } +} diff --git a/uni_modules/nutui-uni/components/progress/index.ts b/uni_modules/nutui-uni/components/progress/index.ts new file mode 100644 index 0000000..d9e366b --- /dev/null +++ b/uni_modules/nutui-uni/components/progress/index.ts @@ -0,0 +1 @@ +export * from './progress' diff --git a/uni_modules/nutui-uni/components/progress/progress.ts b/uni_modules/nutui-uni/components/progress/progress.ts new file mode 100644 index 0000000..ca951b7 --- /dev/null +++ b/uni_modules/nutui-uni/components/progress/progress.ts @@ -0,0 +1,53 @@ +import type { ExtractPropTypes } from 'vue' +import { commonProps, makeNumericProp, makeStringProp, truthProp } from '../_utils' + +export const progressProps = { + ...commonProps, + /** + * @description 百分比 + */ + percentage: { + type: [Number, String], + default: 0, + required: true, + }, + /** + * 是否需要展示百分号 + * + * @description 是否需要展示百分号 + */ + isShowPercentage: truthProp, + /** + * @description 进度条背景色 + */ + strokeColor: makeStringProp(''), + /** + * @description 进度条宽度 + */ + strokeWidth: makeNumericProp(''), + /** + * @description 进度条及文字尺寸,可选值 `small` `base` `large` + */ + size: makeStringProp<'small' | 'base' | 'large'>('base'), + /** + * @description 是否显示进度条文字内容 + */ + showText: truthProp, + /** + * @description 进度条文字显示位置(false:外显,true:内显) + */ + textInside: Boolean, + /** + * @description 进度条文字颜色设置 + */ + textColor: makeStringProp(''), + /** + * @description 进度条文字背景颜色设置 + */ + textBackground: makeStringProp(''), + /** + * @description 进度条当前状态,可选值`active(展示动画效果)` `icon(展示icon标签)` + */ + status: makeStringProp<'text' | 'active' | 'icon'>('text'), +} +export type ProgressProps = ExtractPropTypes diff --git a/uni_modules/nutui-uni/components/progress/progress.vue b/uni_modules/nutui-uni/components/progress/progress.vue new file mode 100644 index 0000000..52dc1e9 --- /dev/null +++ b/uni_modules/nutui-uni/components/progress/progress.vue @@ -0,0 +1,102 @@ + + + + + + + diff --git a/uni_modules/nutui-uni/components/radio/index.scss b/uni_modules/nutui-uni/components/radio/index.scss new file mode 100644 index 0000000..9d6f989 --- /dev/null +++ b/uni_modules/nutui-uni/components/radio/index.scss @@ -0,0 +1,122 @@ +@import "../radiogroup/index"; + +.nut-theme-dark { + .nut-radio { + &__label { + color: $dark-color; + + &--disabled { + color: $radio-label-disable-color; + } + } + + &__button { + color: $dark-color; + background: $dark-background; + + &--disabled { + color: $radio-label-disable-color; + border: 1px solid $radio-label-disable-color; + } + } + } +} + +.nut-radio { + display: flex; + flex-shrink: 0; + align-items: center; + + &:last-child { + margin-right: 0 !important; + margin-bottom: 0 !important; + } + + &--reverse { + .nut-radio__label { + margin-right: $radio-label-margin-left; + margin-left: 0; + } + } + + &__button { + box-sizing: border-box; + display: inline-flex; + align-items: center; + padding: $radio-button-padding; + font-size: $radio-button-font-size; + color: $radio-label-font-color; + background: #f6f7f9; + border: 1px solid #f6f7f9; + border-radius: $radio-button-border-radius; + + &--active { + position: relative; + color: $radio-label-font-active-color; + background: transparent; + border: 1px solid $radio-label-button-border-color; + + &::after { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + content: ""; + background-color: $radio-label-button-background; + border-radius: $radio-button-border-radius; + opacity: 0.05; + } + } + + &--disabled { + color: $radio-label-disable-color; + border: none; + } + + &--large { + height: $button-large-height; + font-size: $button-large-font-size; + line-height: $button-large-line-height; + } + + &--small { + height: $button-small-height; + padding: $button-small-padding; + font-size: $button-small-font-size; + line-height: $button-small-line-height; + } + + &--mini { + height: $button-mini-height; + padding: $button-mini-padding; + font-size: $button-mini-font-size; + line-height: $button-mini-line-height; + } + } + + &__label { + flex: 1; + margin-left: $radio-label-margin-left; + font-size: $radio-label-font-size; + color: $radio-label-font-color; + + &--disabled { + color: $radio-label-disable-color; + } + } + + &__icon { + color: $radio-label-font-active-color; + transition-duration: 0.3s; + transition-property: color, border-color, background-color; + } + + &__icon--unchecked { + color: $radio-icon-disable-color; + } + + &__icon--disable { + color: $radio-icon-disable-color2; + } +} diff --git a/uni_modules/nutui-uni/components/radio/index.ts b/uni_modules/nutui-uni/components/radio/index.ts new file mode 100644 index 0000000..91aa953 --- /dev/null +++ b/uni_modules/nutui-uni/components/radio/index.ts @@ -0,0 +1 @@ +export * from './radio' diff --git a/uni_modules/nutui-uni/components/radio/radio.ts b/uni_modules/nutui-uni/components/radio/radio.ts new file mode 100644 index 0000000..48966f8 --- /dev/null +++ b/uni_modules/nutui-uni/components/radio/radio.ts @@ -0,0 +1,32 @@ +import type { ExtractPropTypes } from 'vue' +import { commonProps, makeNumericProp, makeStringProp, nullableBooleanProp } from '../_utils' + +export const radioProps = { + ...commonProps, + /** + * @description 是否禁用选择 + */ + disabled: nullableBooleanProp, + /** + * @description 图标尺寸 + */ + iconSize: makeNumericProp(''), + /** + * @description 单选框标识 + */ + label: { + type: [String, Number, Boolean], + default: '', + }, + /** + * @description 形状,可选值为 button、round + */ + shape: makeStringProp<'round' | 'button'>('round'), + /** + * @description 尺寸,可选值为 `large` `small` `mini` `normal`,仅在 shape 为 `button` 时生效 + */ + size: makeStringProp<'large' | 'normal' | 'small' | 'mini'>('normal'), +} + +export type RadioProps = ExtractPropTypes +export const RADIO_KEY = Symbol('nut-radio') diff --git a/uni_modules/nutui-uni/components/radio/radio.vue b/uni_modules/nutui-uni/components/radio/radio.vue new file mode 100644 index 0000000..93c14a4 --- /dev/null +++ b/uni_modules/nutui-uni/components/radio/radio.vue @@ -0,0 +1,119 @@ + + + + + + + diff --git a/uni_modules/nutui-uni/components/radiogroup/index.scss b/uni_modules/nutui-uni/components/radiogroup/index.scss new file mode 100644 index 0000000..51b1da6 --- /dev/null +++ b/uni_modules/nutui-uni/components/radiogroup/index.scss @@ -0,0 +1,21 @@ +.nut-radio-group { + display: inline-block; + + .nut-radio { + margin-bottom: 5px; + } + + &--horizontal { + .nut-radio { + display: inline-flex !important; + margin-right: 10px !important; + + &--round { + .nut-radio__label { + margin: 0 6px !important; + } + } + + } + } +} diff --git a/uni_modules/nutui-uni/components/radiogroup/index.ts b/uni_modules/nutui-uni/components/radiogroup/index.ts new file mode 100644 index 0000000..43b6f00 --- /dev/null +++ b/uni_modules/nutui-uni/components/radiogroup/index.ts @@ -0,0 +1 @@ +export * from './radiogroup' diff --git a/uni_modules/nutui-uni/components/radiogroup/radiogroup.ts b/uni_modules/nutui-uni/components/radiogroup/radiogroup.ts new file mode 100644 index 0000000..e7dc666 --- /dev/null +++ b/uni_modules/nutui-uni/components/radiogroup/radiogroup.ts @@ -0,0 +1,31 @@ +import type { ExtractPropTypes } from 'vue' +import { CHANGE_EVENT, UPDATE_MODEL_EVENT } from '../_constants' +import { commonProps, isBoolean, isNumber, isString, makeStringProp } from '../_utils' + +export const radiogroupProps = { + ...commonProps, + /** + * @description 当前选中项的标识符,与 `label` 值一致时呈选中状态 + */ + modelValue: { + type: [Number, String, Boolean], + default: '', + }, + /** + * @description 使用横纵方向,可选值 `horizontal`、`vertical` + */ + direction: makeStringProp<'vertical' | 'horizontal'>('vertical'), + /** + * @description 文本所在的位置,可选值:`left`,`right` + */ + textPosition: makeStringProp<'left' | 'right'>('right'), +} + +export type RadioGroupProps = ExtractPropTypes + +export const radiogroupEmits = { + [CHANGE_EVENT]: (val: string | number | boolean) => isString(val) || isNumber(val) || isBoolean(val), + [UPDATE_MODEL_EVENT]: (val: string | boolean | number) => isString(val) || isNumber(val) || isBoolean(val), +} + +export type RadioGroupEmits = typeof radiogroupEmits diff --git a/uni_modules/nutui-uni/components/radiogroup/radiogroup.vue b/uni_modules/nutui-uni/components/radiogroup/radiogroup.vue new file mode 100644 index 0000000..c6237dc --- /dev/null +++ b/uni_modules/nutui-uni/components/radiogroup/radiogroup.vue @@ -0,0 +1,52 @@ + + + + + + + diff --git a/uni_modules/nutui-uni/components/range/index.scss b/uni_modules/nutui-uni/components/range/index.scss new file mode 100644 index 0000000..3731946 --- /dev/null +++ b/uni_modules/nutui-uni/components/range/index.scss @@ -0,0 +1,237 @@ +.nut-theme-dark { + .nut-range-container { + background: $dark-background; + + .nut-range-min, + .nut-range-max { + color: $dark-color-gray; + } + + .nut-range { + &-mark-text { + color: $dark-color-gray; + } + + &-button { + .number { + color: $dark-color; + } + } + } + } +} + +.nut-range-container { + position: relative; + display: flex; + align-items: center; + width: 100%; + + .nut-range-min, + .nut-range-max { + font-size: $font-size-1; + color: $range-tip-font-color; + user-select: none; + } + + &-vertical { + flex-direction: column; + height: 100%; + padding: 0 15px; + + .nut-range { + width: 4px; + height: auto; + + &-button { + &-wrapper, + &-wrapper-right { + position: absolute; + top: initial; + right: initial; + bottom: 0; + left: 50%; + transform: translate3d(-50%, 50%, 0); + } + + &-wrapper-left { + top: 0; + right: initial; + left: 50%; + transform: translate3d(-50%, -50%, 0); + } + } + + .number { + transform: translate3d(100%, 0, 0); + } + + &-vertical { + margin: 10px 0; + } + + &-mark { + position: absolute; + top: initial; + right: 50%; + width: 36px; + height: 100%; + padding: 0; + overflow: visible; + font-size: 12px; + } + + &-mark-text { + position: absolute; + display: inline-block; + width: 20px; + line-height: 16px; + color: #999; + text-align: center; + word-break: keep-all; + user-select: none; + transform: translateY(-50%); + + &-active { + .nut-range-tick { + background: $range-bar-bg-color; + } + } + } + + &-tick { + position: absolute; + top: 0; + left: 30px; + width: 11px; + height: 11px; + margin-left: -0; + background-color: $range-bg-color-tick; + border-radius: 50%; + } + } + } +} + +.nut-range { + position: relative; + display: block; + flex: 1; + height: 4px; + cursor: pointer; + border-radius: 2px; + + &::before { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + content: ""; + background-color: $range-bg-color; + opacity: 0.5; + } + + &-bar { + position: relative; + display: block; + width: 100%; + height: 100%; + background: $range-bar-bg-color; + border-radius: inherit; + transition: all 0.2s; + } + + &-button { + display: block; + width: $range-bar-btn-width; + height: $range-bar-btn-height; + background-color: $range-bar-btn-bg-color; + border: $range-bar-btn-border; + border-radius: 50%; + outline: none; + box-shadow: 0 1px 2px 0 rgb(0 0 0 / 15%); + + &-wrapper, + &-wrapper-right { + position: absolute; + top: 50%; + right: 0; + cursor: grab; + outline: none; + transform: translate3d(50%, -50%, 0); + } + + &-wrapper-left { + position: absolute; + top: 50%; + left: 0; + cursor: grab; + outline: none; + transform: translate3d(-50%, -50%, 0); + } + + .number { + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; + font-size: $font-size-1; + color: $range-tip-font-color; + user-select: none; + transform: translate3d(0, -100%, 0); + } + } + + &-disabled { + cursor: not-allowed; + opacity: 0.54; + + .nut-range-button-wrapper, + .nut-range-button-wrapper-left, + .nut-range-button-wrapper-right { + cursor: not-allowed; + } + } + + &-show-number { + margin: 0 15px; + } + + &-mark { + position: absolute; + top: 50%; + width: 100%; + padding-top: 14px; + overflow: visible; + font-size: 12px; + } + + &-mark-text { + position: absolute; + display: inline-block; + line-height: 16px; + color: #999; + text-align: center; + word-break: keep-all; + user-select: none; + transform: translateX(-50%); + + &-active { + .nut-range-tick { + background: $range-bar-bg-color; + } + } + } + + &-tick { + position: absolute; + top: -20px; + left: 0; + width: 11px; + height: 11px; + background-color: $range-bg-color-tick; + border-radius: 50%; + } +} diff --git a/uni_modules/nutui-uni/components/range/index.ts b/uni_modules/nutui-uni/components/range/index.ts new file mode 100644 index 0000000..4a355b8 --- /dev/null +++ b/uni_modules/nutui-uni/components/range/index.ts @@ -0,0 +1,2 @@ +export * from './range' +export * from './types' diff --git a/uni_modules/nutui-uni/components/range/range.ts b/uni_modules/nutui-uni/components/range/range.ts new file mode 100644 index 0000000..93409bd --- /dev/null +++ b/uni_modules/nutui-uni/components/range/range.ts @@ -0,0 +1,74 @@ +import type { ExtractPropTypes, PropType } from 'vue' +import { CHANGE_EVENT, UPDATE_MODEL_EVENT } from '../_constants' +import { commonProps, isNumber, makeNumericProp, makeObjectProp, nullableBooleanProp } from '../_utils' +import type { RangeValue } from './types' + +export const rangeProps = { + ...commonProps, + /** + * @description 当前进度百分比 + */ + modelValue: { + type: [Number, Array] as PropType, + default: 0, + }, + /** + * @description 是否开启双滑块模式 + */ + range: Boolean, + /** + * @description 最大值 + */ + max: makeNumericProp(100), + /** + * @description 最小值 + */ + min: makeNumericProp(0), + /** + * @description 步长 + */ + step: makeNumericProp(1), + /** + * @description 是否禁用滑块 + */ + disabled: nullableBooleanProp, + /** + * @description 是否竖向展示 + */ + vertical: Boolean, + /** + * @description 是否隐藏范围值 + */ + hiddenRange: Boolean, + /** + * @description 是否隐藏标签 + */ + hiddenTag: Boolean, + /** + * @description 进度条激活态颜色 + */ + activeColor: String, + /** + * @description 进度条非激活态颜色 + */ + inactiveColor: String, + /** + * @description 按钮颜色 + */ + buttonColor: String, + /** + * @description 刻度标示 + */ + marks: makeObjectProp({}), +} + +export type RangeProps = ExtractPropTypes + +export const rangeEmits = { + [UPDATE_MODEL_EVENT]: (val: RangeValue) => isNumber(val) || val instanceof Object, + dragStart: () => true, + [CHANGE_EVENT]: (val: RangeValue) => isNumber(val) || val instanceof Object, + dragEnd: () => true, +} + +export type RangeEmits = typeof rangeEmits diff --git a/uni_modules/nutui-uni/components/range/range.vue b/uni_modules/nutui-uni/components/range/range.vue new file mode 100644 index 0000000..f45c1fe --- /dev/null +++ b/uni_modules/nutui-uni/components/range/range.vue @@ -0,0 +1,458 @@ + + + + + + + diff --git a/uni_modules/nutui-uni/components/range/types.ts b/uni_modules/nutui-uni/components/range/types.ts new file mode 100644 index 0000000..8d75800 --- /dev/null +++ b/uni_modules/nutui-uni/components/range/types.ts @@ -0,0 +1,2 @@ +export type RangeArrayValue = [number, number] +export type RangeValue = number | RangeArrayValue diff --git a/uni_modules/nutui-uni/components/rate/index.scss b/uni_modules/nutui-uni/components/rate/index.scss new file mode 100644 index 0000000..e4ff829 --- /dev/null +++ b/uni_modules/nutui-uni/components/rate/index.scss @@ -0,0 +1,37 @@ +.nut-rate { + display: inline-flex; + + &-item { + position: relative; + display: flex; + flex-shrink: 0; + margin-right: 14px; + + &:last-child { + margin-right: 0; + } + + &__icon { + flex-shrink: 0; + color: $rate-icon-color; + cursor: pointer; + + &--disabled { + color: $rate-icon-void-color; + } + + &--full { + display: flex; + } + + &--half { + position: absolute; + top: 0; + left: 0; + display: flex; + width: 50%; + overflow: hidden; + } + } + } +} diff --git a/uni_modules/nutui-uni/components/rate/index.ts b/uni_modules/nutui-uni/components/rate/index.ts new file mode 100644 index 0000000..5d297e5 --- /dev/null +++ b/uni_modules/nutui-uni/components/rate/index.ts @@ -0,0 +1 @@ +export * from './rate' diff --git a/uni_modules/nutui-uni/components/rate/rate.ts b/uni_modules/nutui-uni/components/rate/rate.ts new file mode 100644 index 0000000..32ce8c7 --- /dev/null +++ b/uni_modules/nutui-uni/components/rate/rate.ts @@ -0,0 +1,56 @@ +import type { ExtractPropTypes } from 'vue' +import { CHANGE_EVENT, UPDATE_MODEL_EVENT } from '../_constants' +import { commonProps, isNumber, makeNumericProp, makeStringProp, nullableBooleanProp } from '../_utils' + +export const rateProps = { + ...commonProps, + /** + * @description 当前 `star` 数,可使用 `v-model` 双向绑定数据 + */ + modelValue: makeNumericProp(0), + /** + * @description `star` 总数 + */ + count: makeNumericProp(5), + /** + * @description 图标选中颜色 + */ + activeColor: String, + /** + * @description 图标未选中颜色 + */ + voidColor: String, + /** + * @description 是否半星 + */ + allowHalf: Boolean, + /** + * @description 是否只读 + */ + readonly: Boolean, + /** + * @description 是否禁用 + */ + disabled: nullableBooleanProp, + /** + * @description 间距 + */ + spacing: [String, Number], + /** + * @description `Icon` 尺寸大小,如 `20px` `2em` `2rem` + */ + size: [String, Number], + /** + * @description 自定义 `Icon` + */ + customIcon: makeStringProp('star-fill-n'), +} + +export type RateProps = ExtractPropTypes + +export const rateEmits = { + [UPDATE_MODEL_EVENT]: (val: number) => isNumber(val), + [CHANGE_EVENT]: (val: number) => isNumber(val), +} + +export type RateEmits = typeof rateEmits diff --git a/uni_modules/nutui-uni/components/rate/rate.vue b/uni_modules/nutui-uni/components/rate/rate.vue new file mode 100644 index 0000000..b6c3cbc --- /dev/null +++ b/uni_modules/nutui-uni/components/rate/rate.vue @@ -0,0 +1,92 @@ + + + + + + + diff --git a/uni_modules/nutui-uni/components/row/index.scss b/uni_modules/nutui-uni/components/row/index.scss new file mode 100644 index 0000000..ff4b0fc --- /dev/null +++ b/uni_modules/nutui-uni/components/row/index.scss @@ -0,0 +1,68 @@ +.nut-row { + width: 100%; + + &::after { + display: block; + height: 0; + clear: both; + visibility: hidden; + content: ""; + } + + &-flex { + display: flex; + + &::after { + display: none; + } + + .nut-col { + float: none; + } + } + + &-justify-center { + justify-content: center; + } + + &-justify-end { + justify-content: flex-end; + } + + &-justify-space-between { + align-items: center; + justify-content: space-between; + } + + &-justify-space-around { + justify-content: space-around; + } + + &-justify-space-evenly { + justify-content: space-evenly; + } + + &-align-flex-start { + align-items: flex-start; + } + + &-align-center { + align-items: center; + } + + &-align-flex-end { + align-items: flex-end; + } + + &-flex-wrap { + flex-wrap: wrap; + } + + &-flex-nowrap { + flex-wrap: nowrap; + } + + &-flex-reverse { + flex-wrap: wrap-reverse; + } +} diff --git a/uni_modules/nutui-uni/components/row/index.ts b/uni_modules/nutui-uni/components/row/index.ts new file mode 100644 index 0000000..e42ecb1 --- /dev/null +++ b/uni_modules/nutui-uni/components/row/index.ts @@ -0,0 +1 @@ +export * from './row' diff --git a/uni_modules/nutui-uni/components/row/row.ts b/uni_modules/nutui-uni/components/row/row.ts new file mode 100644 index 0000000..3a34476 --- /dev/null +++ b/uni_modules/nutui-uni/components/row/row.ts @@ -0,0 +1,28 @@ +import type { ExtractPropTypes } from 'vue' +import { commonProps, makeNumericProp, makeStringProp } from '../_utils' + +export const rowProps = { + ...commonProps, + /** + * @description 布局方式,可选值为 `flex` + */ + type: makeStringProp<'flex' | ''>(''), + /** + * @description 列元素之间的间距(单位为 `px`) + */ + gutter: makeNumericProp(''), + /** + * @description `Flex` 主轴对齐方式,可选值为 `start` `end` `center` `space-around` `space-between` `space-evenly` + */ + justify: makeStringProp<'start' | 'end' | 'center' | 'space-around' | 'space-between' | 'space-evenly'>('start'), + /** + * @description `Flex` 交叉轴对齐方式,可选值为 `flex-start` `center` `flex-end` + */ + align: makeStringProp<'flex-start' | 'center' | 'flex-end'>('flex-start'), + /** + * @description `Flex` 是否换行,可选值为 `nowrap` `wrap` `reverse` + */ + flexWrap: makeStringProp<'nowrap' | 'wrap' | 'reverse'>('nowrap'), +} + +export type RowProps = ExtractPropTypes diff --git a/uni_modules/nutui-uni/components/row/row.vue b/uni_modules/nutui-uni/components/row/row.vue new file mode 100644 index 0000000..71abc4d --- /dev/null +++ b/uni_modules/nutui-uni/components/row/row.vue @@ -0,0 +1,44 @@ + + + + + + + diff --git a/uni_modules/nutui-uni/components/safearea/index.scss b/uni_modules/nutui-uni/components/safearea/index.scss new file mode 100644 index 0000000..8bd1fb3 --- /dev/null +++ b/uni_modules/nutui-uni/components/safearea/index.scss @@ -0,0 +1,15 @@ +.nut-safe-area { + display: block; + width: 100%; + + &-position-top { + padding-top: calc(var(--status-bar-height) * var(--nutui-safe-area-multiple, 1)); + padding-top: calc(constant(safe-area-inset-top) * var(--nutui-safe-area-multiple, 1)); + padding-top: calc(env(safe-area-inset-top) * var(--nutui-safe-area-multiple, 1)); + } + + &-position-bottom { + padding-bottom: calc(constant(safe-area-inset-bottom) * var(--nutui-safe-area-multiple, 1)); + padding-bottom: calc(env(safe-area-inset-bottom) * var(--nutui-safe-area-multiple, 1)); + } +} diff --git a/uni_modules/nutui-uni/components/safearea/index.ts b/uni_modules/nutui-uni/components/safearea/index.ts new file mode 100644 index 0000000..6ab0f5a --- /dev/null +++ b/uni_modules/nutui-uni/components/safearea/index.ts @@ -0,0 +1 @@ +export * from './safearea' diff --git a/uni_modules/nutui-uni/components/safearea/safearea.ts b/uni_modules/nutui-uni/components/safearea/safearea.ts new file mode 100644 index 0000000..141f94a --- /dev/null +++ b/uni_modules/nutui-uni/components/safearea/safearea.ts @@ -0,0 +1,12 @@ +import type { ExtractPropTypes, PropType } from 'vue' +import { commonProps } from '../_utils' + +export const safeareaProps = { + ...commonProps, + /** + * @description 安全区的位置 + */ + position: String as PropType<'top' | 'bottom'>, +} + +export type SafeAreaProps = ExtractPropTypes diff --git a/uni_modules/nutui-uni/components/safearea/safearea.vue b/uni_modules/nutui-uni/components/safearea/safearea.vue new file mode 100644 index 0000000..0d87c39 --- /dev/null +++ b/uni_modules/nutui-uni/components/safearea/safearea.vue @@ -0,0 +1,35 @@ + + + + + + + diff --git a/uni_modules/nutui-uni/components/searchbar/index.scss b/uni_modules/nutui-uni/components/searchbar/index.scss new file mode 100644 index 0000000..bfe8877 --- /dev/null +++ b/uni_modules/nutui-uni/components/searchbar/index.scss @@ -0,0 +1,139 @@ +.nut-theme-dark { + .nut-searchbar { + background: $dark-background; + + &__search-input { + background: $dark-background4; + } + + &__right-search-icon, + &__left-search-icon { + color: $dark-color; + } + } +} + +.nut-searchbar { + box-sizing: border-box; + display: flex; + align-items: center; + width: $searchbar-width; + padding: $searchbar-padding; + color: $searchbar-input-bar-color; + background: $searchbar-background; + + &.safe-area-inset-bottom { + position: relative; + margin-bottom: constant(safe-area-inset-bottom); + margin-bottom: env(safe-area-inset-bottom); + + &::after { + position: absolute; + bottom: 0; + left: 0; + width: 100%; + height: constant(safe-area-inset-bottom); + height: env(safe-area-inset-bottom); + content: ""; + background: $searchbar-background; + } + } + + &::placeholder { + color: $searchbar-input-bar-placeholder-color; + } + + &__search-input { + box-sizing: border-box; + display: flex; + flex: 1; + align-items: center; + height: $searchbar-input-height; + padding: $searchbar-input-padding; + background: $searchbar-input-background; + border-radius: $searchbar-input-border-radius; + box-shadow: $searchbar-input-box-shadow; + + &.square { + border-radius: 0; + } + + .nut-searchbar__input-inner { + position: relative; + display: flex; + flex: 1; + align-items: center; + overflow: hidden; + + .nut-searchbar__input-form { + flex: 1; + overflow: hidden; + } + } + + .nut-searchbar__input-inner-icon { + position: relative; + display: flex; + align-items: center; + padding: 0 7px; + } + + .nut-searchbar__input-clear { + position: relative; + z-index: 10; + padding: 0 5px; + } + + .nut-searchbar__input-inner-icon-absolute { + .nut-searchbar__input-clear { + position: absolute; + left: -20px; + } + } + + .nut-searchbar__iptleft-search-icon { + width: 14px; + height: 14px; + margin-right: 6px; + } + + .nut-searchbar__iptright-search-icon { + margin-left: 5px; + } + + .nut-searchbar__input-bar { + flex: 1; + height: $searchbar-input-height; + padding: 0; + margin: 0; + font-size: 14px; + line-height: $searchbar-input-height; + background-color: transparent; + border-color: transparent; + outline: none; + } + + .nut-searchbar__input-inner-absolute { + .nut-searchbar__input-bar { + box-sizing: border-box; + padding-right: 20px; + } + } + } + + &__left-search-icon { + margin-right: 8px; + } + + &__search-icon { + display: flex; + align-items: center; + justify-content: center; + } + + &__right-search-icon { + margin-left: 16px; + font-size: 14px; + color: $searchbar-right-out-color; + } +} diff --git a/uni_modules/nutui-uni/components/searchbar/index.ts b/uni_modules/nutui-uni/components/searchbar/index.ts new file mode 100644 index 0000000..b934d65 --- /dev/null +++ b/uni_modules/nutui-uni/components/searchbar/index.ts @@ -0,0 +1,2 @@ +export * from './searchbar' +export * from './type' diff --git a/uni_modules/nutui-uni/components/searchbar/searchbar.ts b/uni_modules/nutui-uni/components/searchbar/searchbar.ts new file mode 100644 index 0000000..589626d --- /dev/null +++ b/uni_modules/nutui-uni/components/searchbar/searchbar.ts @@ -0,0 +1,104 @@ +import type { InputOnBlurEvent, InputOnFocusEvent, InputOnInputEvent } from '@uni-helper/uni-app-types' +import type { CSSProperties, ExtractPropTypes } from 'vue' +import { BLUR_EVENT, CHANGE_EVENT, CLEAR_EVENT, FOCUS_EVENT, SEARCH_EVENT, UPDATE_MODEL_EVENT } from '../_constants' +import { + commonProps, + isString, + makeNumberProp, + makeNumericProp, + makeObjectProp, + makeStringProp, + nullableBooleanProp, + numericProp, + truthProp, +} from '../_utils' +import type { InputAlignType, InputConfirmType, InputType } from '../input' +import type { SearchbarShape } from './type' + +export const searchbarProps = { + ...commonProps, + /** + * @description 当前输入的值 + */ + modelValue: makeNumericProp(''), + /** + * @description 输入框类型 + */ + inputType: makeStringProp('text'), + /** + * @description 搜索框形状,可选值为 `square` `round` + */ + shape: makeStringProp('round'), + /** + * @description 最大输入长度 + */ + maxLength: numericProp, + /** + * @description 输入框默认占位符 + */ + placeholder: String, + /** + * @description 是否展示清除按钮 + */ + clearable: truthProp, + /** + * @description 自定义清除按钮图标 + */ + clearIcon: makeStringProp('circle-close'), + /** + * @description 输入框外部背景 + */ + background: String, + /** + * @description 输入框内部背景 + */ + inputBackground: String, + /** + * @description 聚焦时搜索框样式 + */ + focusStyle: makeObjectProp({}), + /** + * @description 是否自动聚焦 + */ + autofocus: Boolean, + /** + * @description 是否禁用输入框 + */ + disabled: nullableBooleanProp, + /** + * @description 输入框只读 + */ + readonly: Boolean, + /** + * @description 对齐方式,可选 `left` `center` `right` + */ + inputAlign: makeStringProp('left'), + /** + * @description 键盘右下角按钮的文字,仅在`type='text'`时生效,可选值 `send`:发送、`search`:搜索、`next`:下一个、`go`:前往、`done`:完成 + */ + confirmType: makeStringProp('done'), + /** + * @description 是否开启 iphone 系列全面屏底部安全区适配 + */ + safeAreaInsetBottom: Boolean, + /** + * @description 指定的距离的最小值作为光标与键盘的距离 + */ + cursorSpacing: makeNumberProp(0), +} + +export type SearchbarProps = ExtractPropTypes + +export const searchbarEmits = { + [UPDATE_MODEL_EVENT]: (val: string, event: InputOnInputEvent) => (isString(val) || val === undefined) && event instanceof Object, + [CHANGE_EVENT]: (val: string, event: InputOnInputEvent) => (isString(val) || val === undefined) && event instanceof Object, + [BLUR_EVENT]: (val: string, event: InputOnBlurEvent) => (isString(val) || val === undefined) && event instanceof Object, + [FOCUS_EVENT]: (val: string, event: InputOnFocusEvent) => (isString(val) || val === undefined) && event instanceof Object, + [CLEAR_EVENT]: (val: string) => (isString(val) || val === undefined), + [SEARCH_EVENT]: (val: string) => (isString(val) || val === undefined), + clickInput: (val: string, event: Event) => (isString(val) || val === undefined) && event instanceof Object, + clickLeftIcon: (val: string, event: Event) => (isString(val) || val === undefined) && event instanceof Object, + clickRightIcon: (val: string, event: Event) => (isString(val) || val === undefined) && event instanceof Object, +} + +export type SearchbarEmits = typeof searchbarEmits diff --git a/uni_modules/nutui-uni/components/searchbar/searchbar.vue b/uni_modules/nutui-uni/components/searchbar/searchbar.vue new file mode 100644 index 0000000..e0f9b3c --- /dev/null +++ b/uni_modules/nutui-uni/components/searchbar/searchbar.vue @@ -0,0 +1,217 @@ + + + + + + + diff --git a/uni_modules/nutui-uni/components/searchbar/type.ts b/uni_modules/nutui-uni/components/searchbar/type.ts new file mode 100644 index 0000000..977c046 --- /dev/null +++ b/uni_modules/nutui-uni/components/searchbar/type.ts @@ -0,0 +1,2 @@ +export const searchbarShape = ['square', 'round'] +export type SearchbarShape = (typeof searchbarShape)[number] diff --git a/uni_modules/nutui-uni/components/shakedice/index.scss b/uni_modules/nutui-uni/components/shakedice/index.scss new file mode 100644 index 0000000..92ba81e --- /dev/null +++ b/uni_modules/nutui-uni/components/shakedice/index.scss @@ -0,0 +1,106 @@ +.nut-shakedice { + position: relative; + width: 100px; + height: 100px; + transition: all 1s; + transform-style: preserve-3d; + + .page { + position: absolute; + top: 0; + left: 0; + box-sizing: border-box; + display: flex; + width: 100px; + height: 100px; + font-size: 100px; + color: #fff; + text-align: center; + background: rgb(253 250 250); + border: 1px solid #000; + border-radius: 20px; + + > text { + display: block; + width: 25px; + height: 25px; + background: black; + border-radius: 50%; + } + } + + .page1 { + align-items: center; + justify-content: center; + transform: translateZ(50px); + } + + .page2 { + align-items: center; + justify-content: space-around; + transform: rotateX(-90deg) translateZ(50px); + } + + .page3 { + position: relative; + transform: rotateY(90deg) translateZ(50px); + + > text { + position: absolute; + + &:first-child { + top: 10px; + right: 10px; + } + + &:nth-child(2) { + top: 37%; + left: 37%; + } + + &:nth-child(3) { + bottom: 10px; + left: 10px; + } + } + } + + .page4 { + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + padding: 15px; + transform: rotateY(-90deg) translateZ(50px); + } + + .page5 { + flex-wrap: wrap; + align-items: center; + justify-content: center; + transform: rotateX(90deg) translateZ(50px); + + > text { + margin: 0 10px; + + &:nth-child(3) { + position: absolute; + top: 37%; + left: 37%; + margin: 0; + } + } + } + + .page6 { + flex-wrap: wrap; + align-items: center; + justify-content: center; + transform: translateZ(-50px); + } +} + +@keyframes rotate { + to { + transform: rotateX(360deg) rotateY(360deg); + } +} diff --git a/uni_modules/nutui-uni/components/shakedice/index.ts b/uni_modules/nutui-uni/components/shakedice/index.ts new file mode 100644 index 0000000..40a20fa --- /dev/null +++ b/uni_modules/nutui-uni/components/shakedice/index.ts @@ -0,0 +1 @@ +export type * from './shakedice' diff --git a/uni_modules/nutui-uni/components/shakedice/shakedice.ts b/uni_modules/nutui-uni/components/shakedice/shakedice.ts new file mode 100644 index 0000000..9178712 --- /dev/null +++ b/uni_modules/nutui-uni/components/shakedice/shakedice.ts @@ -0,0 +1,29 @@ +import type { ExtractPropTypes } from 'vue' +import { commonProps, makeNumberProp } from '../_utils' + +export const shakediceProps = { + ...commonProps, + /** + * @description 旋转时间,秒 + */ + time: makeNumberProp(1), + /** + * @description 旋转速度,ms + */ + speed: makeNumberProp(3000), + /** + * @description 中奖的 id(1 为 1 点,依次类推) + */ + id: makeNumberProp(4), +} + +export type ShakeDiceProps = ExtractPropTypes + +export const shakediceEmits = { + end: () => true, +} + +export type ShakeDiceEmits = typeof shakediceEmits +export interface ShakeDiceInst { + shake: () => true +} diff --git a/uni_modules/nutui-uni/components/shakedice/shakedice.vue b/uni_modules/nutui-uni/components/shakedice/shakedice.vue new file mode 100644 index 0000000..f2cdfa1 --- /dev/null +++ b/uni_modules/nutui-uni/components/shakedice/shakedice.vue @@ -0,0 +1,101 @@ + + + + + + + + + +{ + "style": { + "navigationBarTitleText": "ShakeDice" + } +} + diff --git a/uni_modules/nutui-uni/components/shortpassword/index.scss b/uni_modules/nutui-uni/components/shortpassword/index.scss new file mode 100644 index 0000000..45d5d52 --- /dev/null +++ b/uni_modules/nutui-uni/components/shortpassword/index.scss @@ -0,0 +1,106 @@ +@import "../popup/index"; + +.nut-theme-dark { + .nut-short-password { + &-title { + color: $dark-color; + } + + &__list { + background: $dark-background3; + border: none; + } + + &__item { + position: relative; + + &::after { + position: absolute; + top: -50%; + right: -50%; + bottom: -50%; + left: -50%; + box-sizing: border-box; + pointer-events: none; + content: ""; + outline: 1px solid #3a3a3c; + transform: scale(0.5); + } + } + + &__item-icon { + background: $dark-color; + } + } +} + +.nut-short-password { + $block: &; + + &-title { + font-size: $font-size-3; + line-height: 1; + color: $title-color; + } + + &-subtitle { + display: block; + margin-top: 12px; + font-size: $font-size-1; + line-height: 1; + color: $text-color; + } + + &-wrapper { + position: relative; + padding: 12px 0 10px; + text-align: center; + } + + &__list { + z-index: 10; + display: flex; + width: 100%; + height: 41px; + margin: 0 auto; + background: $shortpassword-background-color; + border: 1px solid $shortpassword-border-color; + border-radius: 4px; + } + + &__item { + display: flex; + flex: 1; + align-items: center; + justify-content: center; + } + + &__item-icon { + display: inline-block; + width: 6px; + height: 6px; + background: #000; + border-radius: 50%; + } + + &__message { + display: flex; + justify-content: space-between; + width: 247px; + margin-top: 9px; + + #{$block}--error { + font-size: $font-size-0; + line-height: 1; + color: $shortpassword-error; + } + + #{$block}--forget { + display: flex; + align-items: center; + font-size: $font-size-1; + line-height: 1; + color: $shortpassword-forget; + } + } +} diff --git a/uni_modules/nutui-uni/components/shortpassword/index.ts b/uni_modules/nutui-uni/components/shortpassword/index.ts new file mode 100644 index 0000000..f537bde --- /dev/null +++ b/uni_modules/nutui-uni/components/shortpassword/index.ts @@ -0,0 +1 @@ +export * from './shortpassword' diff --git a/uni_modules/nutui-uni/components/shortpassword/shortpassword.ts b/uni_modules/nutui-uni/components/shortpassword/shortpassword.ts new file mode 100644 index 0000000..4e4bcba --- /dev/null +++ b/uni_modules/nutui-uni/components/shortpassword/shortpassword.ts @@ -0,0 +1,52 @@ +import type { ExtractPropTypes } from 'vue' +import { CLOSE_EVENT, FOCUS_EVENT, UPDATE_MODEL_EVENT, UPDATE_VISIBLE_EVENT } from '../_constants' +import { commonProps, isBoolean, isNumber, isString, makeNumericProp, truthProp } from '../_utils' + +export const shortpasswordProps = { + ...commonProps, + /** + * @description 标题 + */ + title: String, + /** + * @description 密码框描述 + */ + desc: String, + /** + * @description 提示语 + */ + tips: String, + /** + * @description 是否展示短密码框 + */ + visible: Boolean, + /** + * @description 密码初始值 + */ + modelValue: String, + /** + * @description 错误信息提示 + */ + errorMsg: String, + /** + * @description 是否点击遮罩关闭 + */ + closeOnClickOverlay: truthProp, + /** + * @description 密码长度,取值为4~6 + */ + length: makeNumericProp(6), +} + +export type ShortPasswordProps = ExtractPropTypes + +export const shortpasswordEmits = { + [UPDATE_MODEL_EVENT]: (val: string | number, event: Event) => (isString(val) || isNumber(val)) && event instanceof Event, + [UPDATE_VISIBLE_EVENT]: (val: boolean) => isBoolean(val), + complete: (val: string) => isString(val), + tips: () => true, + [CLOSE_EVENT]: () => true, + [FOCUS_EVENT]: () => true, +} + +export type ShortPasswordEmits = typeof shortpasswordEmits diff --git a/uni_modules/nutui-uni/components/shortpassword/shortpassword.vue b/uni_modules/nutui-uni/components/shortpassword/shortpassword.vue new file mode 100644 index 0000000..e0983d2 --- /dev/null +++ b/uni_modules/nutui-uni/components/shortpassword/shortpassword.vue @@ -0,0 +1,123 @@ + + + + + + + diff --git a/uni_modules/nutui-uni/components/sidenavbar/index.scss b/uni_modules/nutui-uni/components/sidenavbar/index.scss new file mode 100644 index 0000000..4950a80 --- /dev/null +++ b/uni_modules/nutui-uni/components/sidenavbar/index.scss @@ -0,0 +1,16 @@ +.nut-side-navbar { + display: block; + height: 100%; + overflow: auto; + + &__content { + position: relative; + display: block; + background-color: $sidenavbar-content-bg-color; + + &__list { + display: block; + width: 100%; + } + } +} diff --git a/uni_modules/nutui-uni/components/sidenavbar/index.ts b/uni_modules/nutui-uni/components/sidenavbar/index.ts new file mode 100644 index 0000000..06b4e20 --- /dev/null +++ b/uni_modules/nutui-uni/components/sidenavbar/index.ts @@ -0,0 +1 @@ +export * from './sidenavbar' diff --git a/uni_modules/nutui-uni/components/sidenavbar/sidenavbar.ts b/uni_modules/nutui-uni/components/sidenavbar/sidenavbar.ts new file mode 100644 index 0000000..2c769a4 --- /dev/null +++ b/uni_modules/nutui-uni/components/sidenavbar/sidenavbar.ts @@ -0,0 +1,14 @@ +import type { ExtractPropTypes } from 'vue' +import { commonProps, makeNumericProp } from '../_utils' + +export const SIDEN_NAVBAR_KEY = Symbol('sidennavbar') + +export const sidenavbarProps = { + ...commonProps, + /** + * @description 导航缩进宽度 + */ + offset: makeNumericProp(15), +} + +export type SidenavbarProps = ExtractPropTypes diff --git a/uni_modules/nutui-uni/components/sidenavbar/sidenavbar.vue b/uni_modules/nutui-uni/components/sidenavbar/sidenavbar.vue new file mode 100644 index 0000000..055e3e9 --- /dev/null +++ b/uni_modules/nutui-uni/components/sidenavbar/sidenavbar.vue @@ -0,0 +1,43 @@ + + + + + + + diff --git a/uni_modules/nutui-uni/components/sidenavbaritem/index.scss b/uni_modules/nutui-uni/components/sidenavbaritem/index.scss new file mode 100644 index 0000000..42e95dd --- /dev/null +++ b/uni_modules/nutui-uni/components/sidenavbaritem/index.scss @@ -0,0 +1,23 @@ +.nut-theme-dark { + .nut-side-navbar-item { + background-color: $dark-background2; + + &__title { + color: $dark-color; + background-color: $dark-background2; + } + } +} + +.nut-side-navbar-item { + display: block; + height: $sidenavbar-item-height; + font-size: $sidenavbar-item-font-size; + line-height: $sidenavbar-item-line-height; + background-color: $sidenavbar-item-title-bg-color; + + &__title { + color: $sidenavbar-item-title-color; + background-color: $sidenavbar-item-title-bg-color; + } +} diff --git a/uni_modules/nutui-uni/components/sidenavbaritem/index.ts b/uni_modules/nutui-uni/components/sidenavbaritem/index.ts new file mode 100644 index 0000000..7244898 --- /dev/null +++ b/uni_modules/nutui-uni/components/sidenavbaritem/index.ts @@ -0,0 +1 @@ +export * from './sidenavbaritem' diff --git a/uni_modules/nutui-uni/components/sidenavbaritem/sidenavbaritem.ts b/uni_modules/nutui-uni/components/sidenavbaritem/sidenavbaritem.ts new file mode 100644 index 0000000..ea87d75 --- /dev/null +++ b/uni_modules/nutui-uni/components/sidenavbaritem/sidenavbaritem.ts @@ -0,0 +1,23 @@ +import type { ExtractPropTypes } from 'vue' +import { CLICK_EVENT } from '../_constants' +import { commonProps } from '../_utils' + +export const sidenavbaritemProps = { + ...commonProps, + /** + * @description 导航标题 + */ + title: String, + /** + * @description 导航唯一标识 + */ + ikey: String, +} + +export type SideNavbaritemProps = ExtractPropTypes + +export const sidenavbaritemEmits = { + [CLICK_EVENT]: () => true, +} + +export type SideNavbaritemEmits = typeof sidenavbaritemEmits diff --git a/uni_modules/nutui-uni/components/sidenavbaritem/sidenavbaritem.vue b/uni_modules/nutui-uni/components/sidenavbaritem/sidenavbaritem.vue new file mode 100644 index 0000000..1b6f0f4 --- /dev/null +++ b/uni_modules/nutui-uni/components/sidenavbaritem/sidenavbaritem.vue @@ -0,0 +1,58 @@ + + + + + + + diff --git a/uni_modules/nutui-uni/components/signature/index.scss b/uni_modules/nutui-uni/components/signature/index.scss new file mode 100644 index 0000000..bad90fd --- /dev/null +++ b/uni_modules/nutui-uni/components/signature/index.scss @@ -0,0 +1,26 @@ +@import '../button/index'; +/* stylelint-disable selector-class-pattern */ + +.nut-signature { + .nut-signature-inner { + display: flex; + align-items: center; + justify-content: center; + height: 8rem; + margin-bottom: 1rem; + border: 1px solid #dadada; + } + + .spcanvas_WEAPP { + width: 100%; + height: 100%; + + .spcanvas { + width: 100%; + } + } + + .nut-signature-btn { + margin-right: 15px; + } +} diff --git a/uni_modules/nutui-uni/components/signature/index.ts b/uni_modules/nutui-uni/components/signature/index.ts new file mode 100644 index 0000000..1e3b7eb --- /dev/null +++ b/uni_modules/nutui-uni/components/signature/index.ts @@ -0,0 +1 @@ +export type * from './signature' diff --git a/uni_modules/nutui-uni/components/signature/signature.ts b/uni_modules/nutui-uni/components/signature/signature.ts new file mode 100644 index 0000000..dfec060 --- /dev/null +++ b/uni_modules/nutui-uni/components/signature/signature.ts @@ -0,0 +1,35 @@ +import type { ExtractPropTypes } from 'vue' +import { CLEAR_EVENT, CONFIRM_EVENT } from '../_constants' +import { commonProps, isString, makeNumberProp, makeStringProp } from '../_utils' + +export const signatureProps = { + ...commonProps, + /** + * @description 线条的宽度 + */ + lineWidth: makeNumberProp(2), + /** + * @description 绘图笔触颜色 + */ + strokeStyle: makeStringProp('#000'), + /** + * @description 图片格式 + */ + type: makeStringProp('png'), + /** + * @description 不支持Canvas情况下的展示文案 + */ + unSupportTpl: String, +} + +export type SignatureProps = ExtractPropTypes + +export const signatureEmits = { + start: () => true, + end: () => true, + signing: (event: Event) => event instanceof Object, + [CONFIRM_EVENT]: (canvas: any, filePath?: string) => canvas instanceof Object && isString(filePath), + [CLEAR_EVENT]: () => true, +} + +export type SignatureEmits = typeof signatureEmits diff --git a/uni_modules/nutui-uni/components/signature/signature.vue b/uni_modules/nutui-uni/components/signature/signature.vue new file mode 100644 index 0000000..77c2a26 --- /dev/null +++ b/uni_modules/nutui-uni/components/signature/signature.vue @@ -0,0 +1,63 @@ + + + + + + + diff --git a/uni_modules/nutui-uni/components/signature/use-signature.ts b/uni_modules/nutui-uni/components/signature/use-signature.ts new file mode 100644 index 0000000..7ba3099 --- /dev/null +++ b/uni_modules/nutui-uni/components/signature/use-signature.ts @@ -0,0 +1,139 @@ +import type { ComponentInternalInstance, SetupContext } from 'vue' +import { computed, getCurrentInstance, onMounted, reactive, ref } from 'vue' +import { CLEAR_EVENT, CONFIRM_EVENT, PREFIX } from '../_constants' +import { useSelectorQuery } from '../_hooks' +import { getMainClass } from '../_utils' +import type { SignatureEmits, SignatureProps } from './signature' + +export const componentName = `${PREFIX}-signature` + +export function useSignature(props: SignatureProps, emit: SetupContext['emit']) { + const instance = getCurrentInstance() as ComponentInternalInstance + const { query } = useSelectorQuery(instance.proxy as any) + let points = reactive([]) // 路径点集合 + + const classes = computed(() => { + return getMainClass(props, componentName) + }) + const spcanvas: any = ref(null) + const canvasSetId: any = `spcanvas${new Date().getTime()}` + const state = reactive({ + canvasHeight: 0, + canvasWidth: 0, + ctx: null as unknown as UniNamespace.CanvasContext, + }) + + function startEventHandler(event: any) { + event.preventDefault() + + const startX = event.changedTouches[0].x + const startY = event.changedTouches[0].y + const startPoint = { X: startX, Y: startY } + points.push(startPoint) + // 每次触摸开始,开启新的路径 + emit('start') + state.ctx.beginPath() + state.ctx.lineWidth = props.lineWidth + state.ctx.strokeStyle = props.strokeStyle + } + const isDraw = ref(false) + + function moveEventHandler(event: any) { + event.preventDefault() + + isDraw.value = true + + const moveX = event.changedTouches[0].x + const moveY = event.changedTouches[0].y + const movePoint = { X: moveX, Y: moveY } + points.push(movePoint) // 存点 + const len = points.length + if (len >= 2) + draw() + + emit('signing', event) + } + + // 绘制路径 + function draw() { + const point1 = points[0] + const point2 = points[1] + points.shift() + state.ctx.moveTo(point1.X, point1.Y) + state.ctx.lineTo(point2.X, point2.Y) + state.ctx.stroke() + state.ctx.draw(true) + } + + function endEventHandler(event: any) { + event.preventDefault() + points = [] + emit('end') + } + function leaveEventHandler(event: any) { + event.preventDefault() + } + function clear() { + state.ctx.clearRect(0, 0, state.canvasWidth, state.canvasHeight) + state.ctx.closePath() + state.ctx.draw(true) + emit(CLEAR_EVENT) + isDraw.value = false + } + + function confirm() { + onSave() + } + + function onSave() { + return new Promise((resolve, reject) => { + uni.canvasToTempFilePath({ + canvasId: canvasSetId, + width: state.canvasWidth, + height: state.canvasHeight, + fileType: props.type, + success(result) { + const _canvas = !isDraw.value ? '请绘制签名' : state.ctx + const _filePath = !isDraw.value ? '' : result.tempFilePath + emit(CONFIRM_EVENT, _canvas, _filePath) + + resolve(_filePath) + }, + fail(result) { + reject(result) + emit(CONFIRM_EVENT, result) + }, + }, instance) + }) + } + + onMounted(() => { + query.select(`#${canvasSetId}`) + .fields({ size: true }, (res: any) => { + canvasSetting(res.width, res.height) + }) + .exec() + }) + + function canvasSetting(width: number, height: number) { + const dpr = uni.getSystemInfoSync().pixelRatio + state.ctx = uni.createCanvasContext(canvasSetId, instance.proxy) + state.canvasWidth = width * dpr + state.canvasHeight = height * dpr + } + + return { + classes, + spcanvas, + state, + canvasSetId, + componentName, + startEventHandler, + moveEventHandler, + endEventHandler, + leaveEventHandler, + clear, + confirm, + onSave, + } +} diff --git a/uni_modules/nutui-uni/components/skeleton/index.scss b/uni_modules/nutui-uni/components/skeleton/index.scss new file mode 100644 index 0000000..1b6793f --- /dev/null +++ b/uni_modules/nutui-uni/components/skeleton/index.scss @@ -0,0 +1,70 @@ +@import '../avatar/index'; +/* stylelint-disable selector-class-pattern */ + +.nut-skeleton { + position: relative; + display: inline-block; + overflow: hidden; + vertical-align: middle; + + .nut-skeleton-content { + display: flex; + + .avatarClass { + margin-right: 20px; + background-color: $skeleton-content-avatar-background-color; + } + + .nut-skeleton-content__line { + display: flex; + flex-direction: column; + + .nut-skeleton-blockTitle, + .nut-skeleton-blockLine { + width: 100%; + margin-bottom: 10px; + background-color: $skeleton-content-line-background-color; + } + + .nut-skeleton-blockTitle { + width: 30%; + } + + .blockLine ~ .blockLine:last-of-type { + width: 70%; + } + + .nut-skeleton-blockTitle:last-of-type, + .nut-skeleton-blockLine:last-of-type { + margin-bottom: 0; + } + + .nut-skeleton-blockTitle--round, + .nut-skeleton-blockLine--round { + border-radius: 10px; + } + } + } + + .nut-skeleton-animation { + position: absolute; + top: 0; + left: 0; + z-index: 1; + width: 100%; + height: 100%; + background: $skeleton-animation-background-color; + background-repeat: no-repeat; + animation: backpos 2s ease-in-out 0s infinite; + } + + @keyframes backpos { + 0% { + background-position-x: -500px; + } + + 100% { + background-position-x: calc(500px + 100%); + } + } +} diff --git a/uni_modules/nutui-uni/components/skeleton/index.ts b/uni_modules/nutui-uni/components/skeleton/index.ts new file mode 100644 index 0000000..3f3c737 --- /dev/null +++ b/uni_modules/nutui-uni/components/skeleton/index.ts @@ -0,0 +1 @@ +export type * from './skeleton' diff --git a/uni_modules/nutui-uni/components/skeleton/skeleton.ts b/uni_modules/nutui-uni/components/skeleton/skeleton.ts new file mode 100644 index 0000000..0995e48 --- /dev/null +++ b/uni_modules/nutui-uni/components/skeleton/skeleton.ts @@ -0,0 +1,49 @@ +import type { ExtractPropTypes } from 'vue' +import { commonProps, makeStringProp, truthProp } from '../_utils' +import type { AvatarShape } from '../avatar/type' + +export const skeletonProps = { + ...commonProps, + /** + * @description 是否显示骨架屏 + */ + loading: truthProp, + /** + * @description 每行宽度 + */ + width: makeStringProp('100px'), + /** + * @description 每行高度 + */ + height: makeStringProp('15px'), + /** + * @description 是否开启骨架屏动画 + */ + animated: Boolean, + /** + * @description 是否显示头像 + */ + avatar: Boolean, + /** + * @description 头像形状 + */ + avatarShape: makeStringProp('round'), + /** + * @description 头像大小 + */ + avatarSize: makeStringProp('50px'), + /** + * @description 标题/段落是否采用圆角风格 + */ + round: Boolean, + /** + * @description 设置段落行数 + */ + row: makeStringProp('1'), + /** + * @description 是否显示段落标题 + */ + title: truthProp, +} + +export type SkeletonProps = ExtractPropTypes diff --git a/uni_modules/nutui-uni/components/skeleton/skeleton.vue b/uni_modules/nutui-uni/components/skeleton/skeleton.vue new file mode 100644 index 0000000..143e4c7 --- /dev/null +++ b/uni_modules/nutui-uni/components/skeleton/skeleton.vue @@ -0,0 +1,85 @@ + + + + + + + diff --git a/uni_modules/nutui-uni/components/sku/index.scss b/uni_modules/nutui-uni/components/sku/index.scss new file mode 100644 index 0000000..581168c --- /dev/null +++ b/uni_modules/nutui-uni/components/sku/index.scss @@ -0,0 +1,33 @@ +@import '../price/index'; +@import '../inputnumber/index'; +@import '../popup/index'; + +.nut-theme-dark { + .nut-sku { + background: $dark-background; + } +} + +.nut-sku { + display: flex; + flex-direction: column; + height: 100%; + padding: 0; + background: $white; + + &-content { + flex: 1; + margin-top: 24px; + overflow: hidden auto; + + &-wrapper { + box-sizing: border-box; + width: 100%; + padding: 0 18px; + } + + &::-webkit-scrollbar { + display: none; + } + } +} diff --git a/uni_modules/nutui-uni/components/sku/index.ts b/uni_modules/nutui-uni/components/sku/index.ts new file mode 100644 index 0000000..a64be36 --- /dev/null +++ b/uni_modules/nutui-uni/components/sku/index.ts @@ -0,0 +1 @@ +export type * from './sku' diff --git a/uni_modules/nutui-uni/components/sku/sku.ts b/uni_modules/nutui-uni/components/sku/sku.ts new file mode 100644 index 0000000..cc4fb03 --- /dev/null +++ b/uni_modules/nutui-uni/components/sku/sku.ts @@ -0,0 +1,79 @@ +import type { ExtractPropTypes } from 'vue' +import { CLOSE_EVENT, UPDATE_VISIBLE_EVENT } from '../_constants' +import { commonProps, isBoolean, isNumber, isString, makeArrayProp, makeNumericProp } from '../_utils' + +export const skuProps = { + ...commonProps, + /** + * @description 是否显示商品规格弹框 + */ + visible: Boolean, + /** + * @description 商品 sku 数据 + */ + sku: makeArrayProp([]), + /** + * @description 商品信息 + */ + goods: Object, + /** + * @description 设置 inputNumber 最大值 + */ + stepperMax: makeNumericProp(99999), + /** + * @description 设置 inputNumber 最小值 + */ + stepperMin: makeNumericProp(1), + /** + * 底部按钮设置。[`confirm`, `buy`, `cart`] 分别对应确定、立即购买、加入购物车 + * @description 底部按钮设置 + */ + btnOptions: makeArrayProp(['confirm']), + /** + * @description 按钮上部添加文案,默认为空,有值时显示 + */ + btnExtraText: String, + /** + * @description 数量选择组件左侧文案 + */ + stepperTitle: String, + /** + * @description InputNumber 与标题之间的文案 + */ + stepperExtraText: { + type: [Function, Boolean], + default: false, + }, + /** + * @description 立即购买按钮文案 + */ + buyText: String, + /** + * @description 加入购物车按钮文案 + */ + addCartText: String, + /** + * @description 确定按钮文案 + */ + confirmText: String, +} + +export type SkuProps = ExtractPropTypes + +export const skuEmits = { + [UPDATE_VISIBLE_EVENT]: (val: boolean) => isBoolean(val), + selectSku: (val: any) => val instanceof Object, + changeStepper: (val: number) => isNumber(val), + clickBtnOperate: (val: { + type: string + value: string | number + }) => val instanceof Object, + clickCloseIcon: () => true, + clickOverlay: () => true, + [CLOSE_EVENT]: () => true, + reduce: (val: number | object) => isNumber(val) || isString(val) || val instanceof Object, + add: (val: number | object) => isNumber(val) || isString(val) || val instanceof Object, + overLimit: (val: any) => val instanceof Object, +} + +export type SkuEmits = typeof skuEmits diff --git a/uni_modules/nutui-uni/components/sku/sku.vue b/uni_modules/nutui-uni/components/sku/sku.vue new file mode 100644 index 0000000..1177c83 --- /dev/null +++ b/uni_modules/nutui-uni/components/sku/sku.vue @@ -0,0 +1,188 @@ + + + + + + + diff --git a/uni_modules/nutui-uni/components/skuheader/index.scss b/uni_modules/nutui-uni/components/skuheader/index.scss new file mode 100644 index 0000000..d1c471c --- /dev/null +++ b/uni_modules/nutui-uni/components/skuheader/index.scss @@ -0,0 +1,37 @@ +.nut-theme-dark { + .nut-sku { + &-operate { + &-btn { + background: $dark-background2; + } + } + } +} + +.nut-sku-header { + display: flex; + flex-shrink: 0; + height: 100px; + padding: 0 18px; + margin-top: 18px; + + .nut-sku-header-img { + flex-shrink: 0; + width: $sku-product-img-width; + height: $sku-product-img-height; + margin-right: 12px; + border-radius: $sku-product-img-border-radius; + } + + &-right { + display: flex; + flex: 1; + flex-direction: column; + justify-content: flex-end; + + &-extra { + font-size: 12px; + color: $text-color; + } + } + } \ No newline at end of file diff --git a/uni_modules/nutui-uni/components/skuheader/skuheader.vue b/uni_modules/nutui-uni/components/skuheader/skuheader.vue new file mode 100644 index 0000000..dcc3793 --- /dev/null +++ b/uni_modules/nutui-uni/components/skuheader/skuheader.vue @@ -0,0 +1,63 @@ + + + + + + + diff --git a/uni_modules/nutui-uni/components/skuoperate/index.scss b/uni_modules/nutui-uni/components/skuoperate/index.scss new file mode 100644 index 0000000..f31a1c9 --- /dev/null +++ b/uni_modules/nutui-uni/components/skuoperate/index.scss @@ -0,0 +1,46 @@ +.nut-sku-operate { + width: 100%; + + &-desc { + display: block; + width: 100%; + padding: 10px 0; + font-size: 12px; + color: #de6a1c; + text-align: center; + background: #fbf9da; + } + + &-btn { + box-sizing: border-box; + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; + height: $sku-operate-btn-height; + padding: 0 18px; + text-align: center; + background: $white; + border-top: $sku-operate-btn-border-top; + + &-item { + width: 100%; + height: $sku-operate-btn-item-height; + margin-right: 18px; + font-size: $sku-operate-btn-item-font-size; + font-weight: $sku-operate-btn-item-font-weight; + line-height: $sku-operate-btn-item-line-height; + color: $white; + background: $sku-opetate-bg-default; + border-radius: 21px; + + &:last-child { + margin-right: 0; + } + } + + &-buy { + background: $sku-opetate-bg-buy; + } + } + } \ No newline at end of file diff --git a/uni_modules/nutui-uni/components/skuoperate/skuoperate.vue b/uni_modules/nutui-uni/components/skuoperate/skuoperate.vue new file mode 100644 index 0000000..a13b137 --- /dev/null +++ b/uni_modules/nutui-uni/components/skuoperate/skuoperate.vue @@ -0,0 +1,93 @@ + + + + + + + diff --git a/uni_modules/nutui-uni/components/skuselect/skuselect.vue b/uni_modules/nutui-uni/components/skuselect/skuselect.vue new file mode 100644 index 0000000..82a96f7 --- /dev/null +++ b/uni_modules/nutui-uni/components/skuselect/skuselect.vue @@ -0,0 +1,164 @@ + + + + + + + diff --git a/uni_modules/nutui-uni/components/skustepper/skustepper.vue b/uni_modules/nutui-uni/components/skustepper/skustepper.vue new file mode 100644 index 0000000..95a37cc --- /dev/null +++ b/uni_modules/nutui-uni/components/skustepper/skustepper.vue @@ -0,0 +1,175 @@ + + + + + + + diff --git a/uni_modules/nutui-uni/components/step/index.scss b/uni_modules/nutui-uni/components/step/index.scss new file mode 100644 index 0000000..adecab1 --- /dev/null +++ b/uni_modules/nutui-uni/components/step/index.scss @@ -0,0 +1,271 @@ +.nut-step { + flex: 1; + font-size: 0; + text-align: center; + + &-head { + position: relative; + display: flex; + justify-content: center; + margin-bottom: 12px; + } + + &-line { + position: absolute; + top: 11px; + right: -50%; + left: 50%; + display: inline-block; + height: 1px; + background: $steps-base-line-color; + } + + &-icon { + position: relative; + z-index: 1; + display: flex; + align-items: center; + justify-content: center; + width: $steps-base-icon-width; + height: $steps-base-icon-height; + font-size: $steps-base-icon-font-size; + line-height: $steps-base-icon-line-height; + + &-inner { + display: flex; + align-items: center; + justify-content: center; + } + + .nut-icon { + width: $steps-base-icon-font-size; + height: $steps-base-icon-font-size; + } + + &.is-icon { + border-style: solid; + border-width: 1px; + border-radius: 50%; + } + } + + &-main { + display: inline-block; + padding-right: 10%; + padding-left: 10%; + text-align: center; + } + + &-title { + display: block; + margin-bottom: $steps-base-title-margin-bottom; + font-size: $steps-base-title-font-size; + color: $steps-base-title-color; + } + + &-content { + display: block; + font-size: $steps-base-content-font-size; + color: $steps-base-content-color; + } + + &:last-child { + .nut-step-line { + display: none; + } + } + + &.nut-step-finish { + .nut-step-head { + color: $steps-finish-head-color; + border-color: $steps-finish-head-border-color; + } + + .nut-step-icon.is-icon { + background-color: $steps-finish-icon-text-color; + } + + .nut-step-line { + background: $steps-finish-line-background; + } + + .nut-step-title { + color: $steps-finish-title-color; + } + } + + &.nut-step-process { + .nut-step-head { + color: $steps-process-head-color; + border-color: $steps-process-head-border-color; + } + + .nut-step-icon.is-icon { + background-color: $steps-process-icon-text-color; + } + + .nut-step-title { + color: $steps-process-title-color; + } + } + + &.nut-step-wait { + .nut-step-head { + color: $steps-wait-head-color; + border-color: $steps-wait-head-border-color; + } + + .nut-step-icon.is-icon { + color: $steps-wait-icon-text-color; + background-color: $steps-wait-icon-bg-color; + + .nut-icon { + color: $steps-wait-icon-color; + } + } + + .nut-step-content { + color: $steps-wait-content-color; + } + } +} + +.nut-steps-horizontal { + &.nut-steps-dot { + .nut-step-head { + margin-top: 7px; + margin-bottom: 0; + } + + .nut-step-line { + top: 50%; + bottom: -50%; + } + + .nut-step-icon { + box-sizing: content-box; + width: 8px; + height: 8px; + background: $primary-color; + border-radius: 50%; + } + + .nut-step-wait { + .nut-step-icon { + background-color: $steps-wait-icon-bg-color; + } + + .nut-step-content { + color: $steps-wait-content-color; + } + } + + .nut-step-finish { + .nut-step-icon { + background-color: $primary-color; + } + } + + .nut-step-process { + .nut-step-icon { + position: relative; + background-color: $primary-color; + + &::before { + position: absolute; + top: 50%; + left: 50%; + display: inline-block; + width: 14px; + height: 14px; + margin-top: -7px; + margin-left: -7px; + content: ""; + background-color: $primary-color-end; + border-radius: 50%; + opacity: 0.23; + } + } + } + } +} + +.nut-steps-vertical { + .nut-step { + display: flex; + height: 33.34%; + } + + .nut-step-line { + position: absolute; + display: inline-block; + width: 1px; + height: 100%; + background: #909ca4; + } + + .nut-step-main { + display: inline-block; + padding-left: 6%; + text-align: left; + } + + &.nut-steps-dot { + .nut-step-head { + margin-top: 7px; + margin-bottom: 0; + } + + .nut-step-line { + top: 7px; + right: -50%; + left: 50%; + } + + .nut-step-icon { + box-sizing: content-box; + width: 8px; + height: 8px; + background: $primary-color; + border-radius: 50%; + } + + .nut-step-wait { + .nut-step-icon { + background-color: $steps-wait-icon-bg-color; + } + + .nut-step-content { + color: $steps-wait-content-color; + } + } + + .nut-step-finish { + .nut-step-icon { + background-color: $primary-color; + } + } + + .nut-step-process { + .nut-step-icon { + position: relative; + background-color: $primary-color; + + &::before { + position: absolute; + top: 50%; + left: 50%; + display: inline-block; + width: 14px; + height: 14px; + margin-top: -7px; + margin-left: -7px; + content: ""; + background-color: $primary-color-end; + border-radius: 50%; + opacity: 0.23; + } + } + } + } +} diff --git a/uni_modules/nutui-uni/components/step/index.ts b/uni_modules/nutui-uni/components/step/index.ts new file mode 100644 index 0000000..a8a444f --- /dev/null +++ b/uni_modules/nutui-uni/components/step/index.ts @@ -0,0 +1 @@ +export type * from './step' diff --git a/uni_modules/nutui-uni/components/step/step.ts b/uni_modules/nutui-uni/components/step/step.ts new file mode 100644 index 0000000..7b84a73 --- /dev/null +++ b/uni_modules/nutui-uni/components/step/step.ts @@ -0,0 +1,22 @@ +import type { ExtractPropTypes } from 'vue' +import { commonProps, isNumber } from '../_utils' + +export const stepProps = { + ...commonProps, + /** + * @description 流程步骤的标题 + */ + title: String, + /** + * @description 流程步骤的描述性文字(支持 html 结构) + */ + content: String, +} + +export type StepProps = ExtractPropTypes + +export const stepEmits = { + clickStep: (val: number) => isNumber(val), +} + +export type StepEmits = typeof stepEmits diff --git a/uni_modules/nutui-uni/components/step/step.vue b/uni_modules/nutui-uni/components/step/step.vue new file mode 100644 index 0000000..38ee2f6 --- /dev/null +++ b/uni_modules/nutui-uni/components/step/step.vue @@ -0,0 +1,88 @@ + + + + +