From 90317806aa68986cbabc418a5eba76b3027be865 Mon Sep 17 00:00:00 2001 From: songchenglin3 <353833373@qq.com> Date: Wed, 26 Feb 2025 09:51:03 +0800 Subject: [PATCH 01/26] =?UTF-8?q?feat:=20datepickerview=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/config.json | 36 ++-- src/packages/datepicker/demos/h5/demo1.tsx | 20 +- .../__test__/datepickerview.spec.tsx | 9 + .../datepickerview/datepickerview.scss | 2 + .../datepickerview/datepickerview.taro.tsx | 28 +++ .../datepickerview/datepickerview.tsx | 180 ++++++++++++++++++ src/packages/datepickerview/demo.taro.tsx | 31 +++ src/packages/datepickerview/demo.tsx | 25 +++ .../datepickerview/demos/h5/demo1.tsx | 63 ++++++ .../datepickerview/demos/taro/demo1.tsx | 13 ++ src/packages/datepickerview/doc.md | 36 ++++ src/packages/datepickerview/index.taro.ts | 4 + src/packages/datepickerview/index.ts | 4 + src/packages/datepickerview/types.ts | 27 +++ 14 files changed, 450 insertions(+), 28 deletions(-) create mode 100644 src/packages/datepickerview/__test__/datepickerview.spec.tsx create mode 100644 src/packages/datepickerview/datepickerview.scss create mode 100644 src/packages/datepickerview/datepickerview.taro.tsx create mode 100644 src/packages/datepickerview/datepickerview.tsx create mode 100644 src/packages/datepickerview/demo.taro.tsx create mode 100644 src/packages/datepickerview/demo.tsx create mode 100644 src/packages/datepickerview/demos/h5/demo1.tsx create mode 100644 src/packages/datepickerview/demos/taro/demo1.tsx create mode 100644 src/packages/datepickerview/doc.md create mode 100644 src/packages/datepickerview/index.taro.ts create mode 100644 src/packages/datepickerview/index.ts create mode 100644 src/packages/datepickerview/types.ts diff --git a/src/config.json b/src/config.json index 70976e92f3..4185876156 100644 --- a/src/config.json +++ b/src/config.json @@ -170,7 +170,6 @@ "name": "布局组件", "enName": "layout", "packages": [ - { "version": "3.0.0", "name": "Divider", @@ -224,17 +223,17 @@ "dd": true }, { - "version": "3.0.0", - "name": "Col", - "type": "component", - "cName": "列", - "desc": "布局组件中的列", - "sort": 3, - "show": false, - "exportEmpty": true, - "author": "yushuang24", - "dd": true - }, + "version": "3.0.0", + "name": "Col", + "type": "component", + "cName": "列", + "desc": "布局组件中的列", + "sort": 3, + "show": false, + "exportEmpty": true, + "author": "yushuang24", + "dd": true + }, { "version": "3.0.0", "name": "Row", @@ -642,6 +641,19 @@ "name": "数据录入", "enName": "dataentry", "packages": [ + { + "version": "3.0.0", + "name": "DatePickerView", + "type": "component", + "cName": "选择器视图", + "desc": "DatePickerView 是 DatePicker 的内容区域", + "sort": 16, + "show": true, + "taro": true, + "v15": false, + "dd": false, + "author": "songsong" + }, { "version": "2.0.0", "name": "Menu", diff --git a/src/packages/datepicker/demos/h5/demo1.tsx b/src/packages/datepicker/demos/h5/demo1.tsx index ff87453056..9580f4fb02 100644 --- a/src/packages/datepicker/demos/h5/demo1.tsx +++ b/src/packages/datepicker/demos/h5/demo1.tsx @@ -47,22 +47,10 @@ const Demo1 = () => { return ( <> - setShow1(true)} - /> - setShow1(false)} - onConfirm={handleConfirm(setDesc1)} - /> + + + + { + const { container } = render() + expect(container).toMatchSnapshot() +}) diff --git a/src/packages/datepickerview/datepickerview.scss b/src/packages/datepickerview/datepickerview.scss new file mode 100644 index 0000000000..972cefa123 --- /dev/null +++ b/src/packages/datepickerview/datepickerview.scss @@ -0,0 +1,2 @@ +.nut-datepickerview { +} diff --git a/src/packages/datepickerview/datepickerview.taro.tsx b/src/packages/datepickerview/datepickerview.taro.tsx new file mode 100644 index 0000000000..d6f56c529c --- /dev/null +++ b/src/packages/datepickerview/datepickerview.taro.tsx @@ -0,0 +1,28 @@ +import React, { FunctionComponent } from 'react' +import classNames from 'classnames' +import { View } from '@tarojs/components' +import { ComponentDefaults } from '@/utils/typings' +import { DatePickerViewProps } from './types' + +// import { useConfig } from '@/packages/configprovider/configprovider.taro' +// import { useRtl } from '@/packages/configprovider/index.taro' + +const defaultProps = { + ...ComponentDefaults, +} as DatePickerViewProps +export const DatePickerView: FunctionComponent< + Partial & React.HTMLAttributes +> = (props) => { + // const { locale } = useConfig() + // const rtl = useRtl() + const { className, style } = { ...defaultProps, ...props } + const classPrefix = 'nut-datepickerview' + const cls = classNames(classPrefix, className) + return ( + + DatePickerView + + ) +} + +DatePickerView.displayName = 'NutDatePickerView' diff --git a/src/packages/datepickerview/datepickerview.tsx b/src/packages/datepickerview/datepickerview.tsx new file mode 100644 index 0000000000..177e10a281 --- /dev/null +++ b/src/packages/datepickerview/datepickerview.tsx @@ -0,0 +1,180 @@ +import React, { useState, useEffect, FunctionComponent } from 'react' +import classNames from 'classnames' +import { PickerOptionItem, PickerValue } from '@/packages/pickerview/index' +import { useConfig } from '@/packages/configprovider' +import { usePropsValue } from '@/hooks/use-props-value' +import { ComponentDefaults } from '@/utils/typings' +import { isDate } from '@/utils/is-date' +import { + formatValue, + generateDatePickerRanges, + generatePickerColumnWithCallback, + getDatePartValue, + handlePickerValueChange, +} from '@/packages/datepicker/utils' +import { DatePickerViewProps } from './types' + +const currentYear = new Date().getFullYear() + +const defaultProps = { + ...ComponentDefaults, + type: 'date', + showChinese: false, + threeDimensional: true, + minuteStep: 1, + startDate: new Date(currentYear - 10, 0, 1), + endDate: new Date(currentYear + 10, 11, 31), +} as DatePickerViewProps + +export const DatePickerView: FunctionComponent< + Partial & React.HTMLAttributes +> = (props) => { + const { + startDate, + endDate, + type, + showChinese, + minuteStep, + defaultValue, + formatter, + filter, + onChange, + threeDimensional, + className, + style, + } = { + ...defaultProps, + ...props, + } + + const classPrefix = 'nut-datepickerview' + const cls = classNames(classPrefix, className) + + const { locale } = useConfig() + const lang = locale.datepicker + + const zhCNType: { [key: string]: string } = { + day: lang.day, + year: lang.year, + month: lang.month, + hour: lang.hour, + minute: lang.min, + seconds: lang.seconds, + } + + const [pickerValue, setPickerValue] = useState([]) + const [pickerOptions, setPickerOptions] = useState([]) + + const [selectedDate, setSelectedDate] = usePropsValue({ + value: props.value && formatValue(props.value, startDate, endDate), + defaultValue: + props.defaultValue && formatValue(props.defaultValue, startDate, endDate), + finalValue: 0, + }) + + const [innerDate, setInnerDate] = useState(selectedDate) + + const handleDateComparison = ( + newDate: Date | null, + selectedOptions: PickerOption[], + index: number + ) => { + const isEqual = new Date(innerDate)?.getTime() === newDate?.getTime() + if (newDate && isDate(newDate)) { + if (!isEqual) { + setInnerDate(formatValue(newDate, startDate, endDate)) + } + onChange?.( + selectedOptions, + [ + String(newDate.getFullYear()), + String(newDate.getMonth() + 1), + String(newDate.getDate()), + ], + index + ) + } + } + + const handleChange = ( + selectedOptions: PickerOption[], + selectedValue: (string | number)[], + index: number + ) => { + handlePickerValueChange( + selectedOptions, + selectedValue, + index, + type, + defaultValue || startDate || endDate, + handleDateComparison + ) + } + + const generatePickerColumns = (): PickerOption[][] => { + const dateRanges = generateDatePickerRanges( + type, + innerDate, + startDate, + endDate + ) + + const columns = dateRanges.map((rangeConfig, columnIndex) => { + const { type: columnType, range } = rangeConfig + const selectedValue = getDatePartValue(columnType, innerDate) + + const pickerColumn = generatePickerColumnWithCallback( + range[0], + range[1], + selectedValue, + columnType, + minuteStep, + (selectedIndex, options) => { + pickerValue[columnIndex] = options[selectedIndex]?.value + setPickerValue([...pickerValue]) + }, + showChinese, + zhCNType, + formatter + ) + + if (filter?.(columnType, pickerColumn)) { + return filter(columnType, pickerColumn) + } + + return pickerColumn + }) + + return columns || [] + } + + // useEffect(() => { + // setInnerDate(selectedDate) + // }, [selectedDate]) + + useEffect(() => { + console.log('ssss', innerDate) + setPickerOptions(generatePickerColumns()) + }, [innerDate, startDate, endDate]) + console.log('pickerValue', pickerValue, pickerOptions) + return ( + <> +
+ {pickerOptions.length && ( + handleChange(options, value, index)} + threeDimensional={threeDimensional} + /> + )} +
+ + ) +} + +DatePickerView.displayName = 'NutDatePickerView' diff --git a/src/packages/datepickerview/demo.taro.tsx b/src/packages/datepickerview/demo.taro.tsx new file mode 100644 index 0000000000..e03d997bfb --- /dev/null +++ b/src/packages/datepickerview/demo.taro.tsx @@ -0,0 +1,31 @@ +import React from 'react' +import Taro from '@tarojs/taro' +import { ScrollView, View } from '@tarojs/components' +import { useTranslate } from '@/sites/assets/locale/taro' +import Header from '@/sites/components/header' +import Demo1 from './demos/taro/demo1' + +const DatePickerViewDemo = () => { + const [translated] = useTranslate({ + 'zh-CN': { + title: '基础用法', + }, + 'en-US': { + title: 'Basic Usage', + }, + 'zh-TW': { + title: '基礎用法', + }, + }) + return ( + <> +
+ + {translated.title} + + + + ) +} + +export default DatePickerViewDemo diff --git a/src/packages/datepickerview/demo.tsx b/src/packages/datepickerview/demo.tsx new file mode 100644 index 0000000000..bde58f472d --- /dev/null +++ b/src/packages/datepickerview/demo.tsx @@ -0,0 +1,25 @@ +import React from 'react' +import { useTranslate } from '@/sites/assets/locale' +import Demo1 from './demos/h5/demo1' + +const DatePickerViewDemo = () => { + const [translated] = useTranslate({ + 'zh-CN': { + title: '基础用法', + }, + 'en-US': { + title: 'Basic Usage', + }, + 'zh-TW': { + title: '基礎用法', + }, + }) + return ( +
+

{translated.title}

+ +
+ ) +} + +export default DatePickerViewDemo diff --git a/src/packages/datepickerview/demos/h5/demo1.tsx b/src/packages/datepickerview/demos/h5/demo1.tsx new file mode 100644 index 0000000000..cc936b8c5c --- /dev/null +++ b/src/packages/datepickerview/demos/h5/demo1.tsx @@ -0,0 +1,63 @@ +import React, { useState } from 'react' +import { DatePickerView, Cell, type PickerOption } from '@nutui/nutui-react' +import isEqual from 'react-fast-compare' + +const useDatePicker = (initialDate: Date) => { + const defaultDateObj = { + year: initialDate.getFullYear(), + month: initialDate.getMonth() + 1, + day: initialDate.getDate(), + } + + const defaultDesc = `${defaultDateObj.year}年${defaultDateObj.month}月${defaultDateObj.day}日` + const defaultValue = Object.values(defaultDateObj).join('-') + + return { defaultDesc, defaultValue } +} + +const Demo1 = () => { + const defaultDate = new Date() + const { defaultDesc: defaultDesc1, defaultValue: defaultValue1 } = + useDatePicker(defaultDate) + const { defaultDesc: defaultDesc2, defaultValue: defaultValue2 } = + useDatePicker(defaultDate) + + const [desc1, setDesc1] = useState(defaultDesc1) + + const [value, setValue] = useState(defaultValue2) + const [desc2, setDesc2] = useState(defaultDesc2) + + const handleChange = + (setDesc: (desc: string) => void, setValue?: (value: string) => void) => + (options: PickerOption[], values: (string | number)[]) => { + if (setValue) { + if (isEqual(values, ['2026', '02', '21'])) { + setValue('2026/03/22') + setDesc('2026年03月22日') + } else { + setValue(values.join('/')) + setDesc(options.map((option) => option.text).join('')) + } + } else { + setDesc(options.map((option) => option.text).join('')) + } + } + + return ( + <> + + + + + + {/* */} + + + ) +} + +export default Demo1 diff --git a/src/packages/datepickerview/demos/taro/demo1.tsx b/src/packages/datepickerview/demos/taro/demo1.tsx new file mode 100644 index 0000000000..208ba8615a --- /dev/null +++ b/src/packages/datepickerview/demos/taro/demo1.tsx @@ -0,0 +1,13 @@ +import React from 'react' +import { Cell, DatePickerView } from '@nutui/nutui-react-taro' +// import { Dongdong } from '@nutui/icons-react-taro' + +const Demo1 = () => { + return ( + + + + ) +} + +export default Demo1 diff --git a/src/packages/datepickerview/doc.md b/src/packages/datepickerview/doc.md new file mode 100644 index 0000000000..3ed0771ca6 --- /dev/null +++ b/src/packages/datepickerview/doc.md @@ -0,0 +1,36 @@ +# DatePickerView 选择器视图 + +DatePickerView 是 DatePicker 的内容区域 + +## 引入 + +```tsx +import { name } from '@nutui/nutui-react' +``` + +## 示例代码 + +### 基础用法 + +:::demo + + + +::: + +## DatePickerView + +### Props + +| 属性 | 说明 | 类型 | 默认值 | +| --- | --- | --- | --- | +| name | 图标名 | String | - | + +## 主题定制 + +### 样式变量 + +组件提供了下列 CSS 变量,可用于自定义样式,使用方法请参考 [ConfigProvider 组件](#/zh-CN/component/configprovider)。 +| 名称 | 说明 | 默认值 | +| --- | --- | --- | +| --nutui-datepickerview-height | badge 的高度 | `14px` | diff --git a/src/packages/datepickerview/index.taro.ts b/src/packages/datepickerview/index.taro.ts new file mode 100644 index 0000000000..0a801ae90f --- /dev/null +++ b/src/packages/datepickerview/index.taro.ts @@ -0,0 +1,4 @@ +import { DatePickerView } from './datepickerview.taro' + +export type { DatePickerViewProps } from './types' +export default DatePickerView diff --git a/src/packages/datepickerview/index.ts b/src/packages/datepickerview/index.ts new file mode 100644 index 0000000000..a200f20d23 --- /dev/null +++ b/src/packages/datepickerview/index.ts @@ -0,0 +1,4 @@ +import { DatePickerView } from './datepickerview' + +export type { DatePickerViewProps } from './types' +export default DatePickerView diff --git a/src/packages/datepickerview/types.ts b/src/packages/datepickerview/types.ts new file mode 100644 index 0000000000..423b6cb367 --- /dev/null +++ b/src/packages/datepickerview/types.ts @@ -0,0 +1,27 @@ +import { BasicComponent } from '@/utils/typings' +import { PickerOption } from '@/packages/picker/types' + +export interface DatePickerViewProps extends BasicComponent { + value?: Date + defaultValue?: Date + type: + | 'date' + | 'time' + | 'year-month' + | 'month-day' + | 'datehour' + | 'datetime' + | 'hour-minutes' + showChinese: boolean + minuteStep: number + startDate: Date + endDate: Date + threeDimensional: boolean + formatter: (type: string, option: PickerOption) => PickerOption + filter: (type: string, option: PickerOption[]) => PickerOption[] + onChange?: ( + selectedOptions: PickerOption[], + selectedValue: (string | number)[], + columnIndex: number + ) => void +} From 7f8309d7c15d07cec97e46b5a152d3b52c6986d2 Mon Sep 17 00:00:00 2001 From: songchenglin3 <353833373@qq.com> Date: Wed, 26 Feb 2025 11:10:35 +0800 Subject: [PATCH 02/26] =?UTF-8?q?fix:=20=E5=90=88=E5=B9=B6picker?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/packages/datepicker/datepicker.taro.tsx | 5 +++-- src/packages/datepicker/demos/h5/demo1.tsx | 20 ++++++++++++++++---- src/packages/datepicker/utils.ts | 8 ++++++-- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/packages/datepicker/datepicker.taro.tsx b/src/packages/datepicker/datepicker.taro.tsx index 2330fbad98..4cf3c985eb 100644 --- a/src/packages/datepicker/datepicker.taro.tsx +++ b/src/packages/datepicker/datepicker.taro.tsx @@ -5,7 +5,7 @@ import React, { useImperativeHandle, } from 'react' import { View } from '@tarojs/components' -import Picker from '@/packages/picker/index' +import Picker from '@/packages/picker/index.taro' import { useConfig } from '@/packages/configprovider/index.taro' import { usePropsValue } from '@/hooks/use-props-value' import { ComponentDefaults } from '@/utils/typings' @@ -17,7 +17,8 @@ import { getDatePartValue, handlePickerValueChange, } from './utils' -import { DatePickerActions, DatePickerProps, DatePickerRef } from './types' +import { DatePickerProps } from './types.taro' +import { DatePickerActions, DatePickerRef } from './types' import { PickerOptions, PickerValue } from '@/packages/pickerview/types' const currentYear = new Date().getFullYear() diff --git a/src/packages/datepicker/demos/h5/demo1.tsx b/src/packages/datepicker/demos/h5/demo1.tsx index da6fa8b4e5..186e9306b0 100644 --- a/src/packages/datepicker/demos/h5/demo1.tsx +++ b/src/packages/datepicker/demos/h5/demo1.tsx @@ -52,10 +52,22 @@ const Demo1 = () => { return ( <> - - - - + setShow1(true)} + /> + setShow1(false)} + onConfirm={handleConfirm(setDesc1)} + /> PickerOption + formatter?: (type: string, option: PickerOption) => PickerOption ): PickerOption => { if (formatter) { return formatter(type, { From fd9d3ec8f2b2291fbb1fc67540b35108fb2bc490 Mon Sep 17 00:00:00 2001 From: songchenglin3 <353833373@qq.com> Date: Wed, 26 Feb 2025 11:31:44 +0800 Subject: [PATCH 03/26] fix: ts fixed --- .../datepickerview/datepickerview.tsx | 12 ++++++------ src/packages/datepickerview/types.ts | 13 +++++++++---- src/packages/picker/types.ts | 19 ++++++------------- 3 files changed, 21 insertions(+), 23 deletions(-) diff --git a/src/packages/datepickerview/datepickerview.tsx b/src/packages/datepickerview/datepickerview.tsx index 177e10a281..0beabcbc00 100644 --- a/src/packages/datepickerview/datepickerview.tsx +++ b/src/packages/datepickerview/datepickerview.tsx @@ -1,6 +1,6 @@ import React, { useState, useEffect, FunctionComponent } from 'react' import classNames from 'classnames' -import { PickerOptionItem, PickerValue } from '@/packages/pickerview/index' +import { PickerOptions, PickerValue } from '@/packages/pickerview/index' import { useConfig } from '@/packages/configprovider' import { usePropsValue } from '@/hooks/use-props-value' import { ComponentDefaults } from '@/utils/typings' @@ -63,7 +63,7 @@ export const DatePickerView: FunctionComponent< } const [pickerValue, setPickerValue] = useState([]) - const [pickerOptions, setPickerOptions] = useState([]) + const [pickerOptions, setPickerOptions] = useState([]) const [selectedDate, setSelectedDate] = usePropsValue({ value: props.value && formatValue(props.value, startDate, endDate), @@ -76,7 +76,7 @@ export const DatePickerView: FunctionComponent< const handleDateComparison = ( newDate: Date | null, - selectedOptions: PickerOption[], + selectedOptions: PickerOptions, index: number ) => { const isEqual = new Date(innerDate)?.getTime() === newDate?.getTime() @@ -97,7 +97,7 @@ export const DatePickerView: FunctionComponent< } const handleChange = ( - selectedOptions: PickerOption[], + selectedOptions: PickerOptions, selectedValue: (string | number)[], index: number ) => { @@ -111,7 +111,7 @@ export const DatePickerView: FunctionComponent< ) } - const generatePickerColumns = (): PickerOption[][] => { + const generatePickerColumns = (): PickerOptions[] => { const dateRanges = generateDatePickerRanges( type, innerDate, @@ -165,7 +165,7 @@ export const DatePickerView: FunctionComponent< value={pickerValue} options={pickerOptions} // onChange={( - // options: PickerOption[], + // options: PickerOptions, // value: (string | number)[], // index: number // ) => handleChange(options, value, index)} diff --git a/src/packages/datepickerview/types.ts b/src/packages/datepickerview/types.ts index 423b6cb367..aa12f3da49 100644 --- a/src/packages/datepickerview/types.ts +++ b/src/packages/datepickerview/types.ts @@ -1,5 +1,9 @@ import { BasicComponent } from '@/utils/typings' -import { PickerOption } from '@/packages/picker/types' +import { + PickerOptions, + PickerValue, + PickerOption, +} from '@/packages/pickerview/types' export interface DatePickerViewProps extends BasicComponent { value?: Date @@ -18,10 +22,11 @@ export interface DatePickerViewProps extends BasicComponent { endDate: Date threeDimensional: boolean formatter: (type: string, option: PickerOption) => PickerOption - filter: (type: string, option: PickerOption[]) => PickerOption[] + filter: (type: string, options: PickerOptions) => PickerOptions + onChange?: ( - selectedOptions: PickerOption[], - selectedValue: (string | number)[], + selectedOptions: PickerOptions, + selectedValue: PickerValue[], columnIndex: number ) => void } diff --git a/src/packages/picker/types.ts b/src/packages/picker/types.ts index 5d41357ef7..adc36c5edb 100644 --- a/src/packages/picker/types.ts +++ b/src/packages/picker/types.ts @@ -1,6 +1,7 @@ import { RefObject } from 'react' import { PopupProps } from '@/packages/popup/types' import { BasicComponent } from '@/utils/typings' +import { PickerOption, PickerOptions } from '@/packages/pickerview/types' export type PickerRef = PickerActions export type PickerActions = { @@ -9,18 +10,10 @@ export type PickerActions = { } export type ColumnsType = 'single' | 'multiple' | 'cascade' -export interface PickerOption { - text: string | number - value: string | number - disabled?: boolean - children?: PickerOption[] - className?: string | number -} - export interface PickerProps extends Omit { visible?: boolean | undefined title?: string - options: (PickerOption | PickerOption[])[] + options: (PickerOption | PickerOptions)[] value?: (number | string)[] defaultValue?: (number | string)[] threeDimensional?: boolean @@ -30,21 +23,21 @@ export interface PickerProps extends Omit { Omit > onConfirm?: ( - selectedOptions: PickerOption[], + selectedOptions: PickerOptions, selectedValue: (string | number)[] ) => void onCancel?: () => void onClose?: ( - selectedOptions: PickerOption[], + selectedOptions: PickerOptions, selectedValue: (string | number)[] ) => void afterClose?: ( - selectedOptions: PickerOption[], + selectedOptions: PickerOptions, selectedValue: (string | number)[], pickerRef: RefObject ) => void onChange?: ( - selectedOptions: PickerOption[], + selectedOptions: PickerOptions, selectedValue: (string | number)[], columnIndex: number ) => void From c1bea9344f9ef877565fd8720a7b833c815dbe78 Mon Sep 17 00:00:00 2001 From: songchenglin3 <353833373@qq.com> Date: Wed, 26 Feb 2025 11:52:25 +0800 Subject: [PATCH 04/26] fix: ts lint --- src/packages/datepicker/demos/h5/demo1.tsx | 4 ++-- src/packages/datepicker/demos/taro/demo1.tsx | 9 +++++++-- src/packages/datepicker/doc.en-US.md | 2 +- src/packages/datepicker/doc.md | 2 +- src/packages/datepicker/doc.taro.md | 2 +- src/packages/datepicker/doc.zh-TW.md | 2 +- src/packages/datepicker/types.ts | 4 ++-- .../datepickerview/datepickerview.tsx | 17 +++++++++-------- .../datepickerview/demos/h5/demo1.tsx | 19 ++++++++++++------- 9 files changed, 36 insertions(+), 25 deletions(-) diff --git a/src/packages/datepicker/demos/h5/demo1.tsx b/src/packages/datepicker/demos/h5/demo1.tsx index 186e9306b0..82b73fcd4e 100644 --- a/src/packages/datepicker/demos/h5/demo1.tsx +++ b/src/packages/datepicker/demos/h5/demo1.tsx @@ -2,8 +2,8 @@ import React, { useState } from 'react' import { DatePicker, Cell, - type PickerOption, PickerValue, + PickerOptions, } from '@nutui/nutui-react' import isEqual from 'react-fast-compare' @@ -36,7 +36,7 @@ const Demo1 = () => { const handleConfirm = (setDesc: (desc: string) => void, setValue?: (value: string) => void) => - (options: PickerOption[], values: PickerValue[]) => { + (options: PickerOptions, values: PickerValue[]) => { if (setValue) { if (isEqual(values, ['2026', '02', '21'])) { setValue('2026/03/22') diff --git a/src/packages/datepicker/demos/taro/demo1.tsx b/src/packages/datepicker/demos/taro/demo1.tsx index 82c6c07338..a5690b6864 100644 --- a/src/packages/datepicker/demos/taro/demo1.tsx +++ b/src/packages/datepicker/demos/taro/demo1.tsx @@ -1,5 +1,10 @@ import React, { useState } from 'react' -import { DatePicker, Cell, type PickerOption } from '@nutui/nutui-react-taro' +import { + DatePicker, + Cell, + PickerOptions, + PickerValue, +} from '@nutui/nutui-react-taro' import isEqual from 'react-fast-compare' const useDatePicker = (initialDate: Date) => { @@ -31,7 +36,7 @@ const Demo1 = () => { const handleConfirm = (setDesc: (desc: string) => void, setValue?: (value: string) => void) => - (options: PickerOption[], values: (string | number)[]) => { + (options: PickerOptions, values: PickerValue[]) => { if (setValue) { if (isEqual(values, ['2026', '02', '21'])) { setValue('2026/03/22') diff --git a/src/packages/datepicker/doc.en-US.md b/src/packages/datepicker/doc.en-US.md index 03fa3aff30..3bc1ff0192 100644 --- a/src/packages/datepicker/doc.en-US.md +++ b/src/packages/datepicker/doc.en-US.md @@ -89,7 +89,7 @@ import { DatePicker } from '@nutui/nutui' | endDate | End date | `Date` | `Ten years later on December 31` | | pickerProps | picker props | `object` | `-` | | formatter | Option text formatter | `(type: string, option: PickerOption) => PickerOption` | `-` | -| filter | Option filter | `(type: string, option: PickerOption) => PickerOption[]` | `-` | +| filter | Option filter | `(type: string, option: PickerOption) => PickerOptions` | `-` | | threeDimensional | Turn on 3D effects | `boolean` | `true` | | onConfirm | Emitted when click confirm button. | `(options, value) => void` | `-` | | onCancel | Emitted when click cancel button. | `() => void` | `-` | diff --git a/src/packages/datepicker/doc.md b/src/packages/datepicker/doc.md index c7b3d741cd..c022ff68c7 100644 --- a/src/packages/datepicker/doc.md +++ b/src/packages/datepicker/doc.md @@ -99,7 +99,7 @@ DatetimePicker 通过 type 属性来定义需要选择的时间类型。将 type | endDate | 结束日期 | `Date` | `十年后` | | pickerProps | 透传picker属性 | `object` | `-` | | formatter | 选项格式化函数 | `(type: string, option: PickerOption) => PickerOption` | `-` | -| filter | 选项过滤函数 | `(type: string, option: PickerOption) => PickerOption[]` | `-` | +| filter | 选项过滤函数 | `(type: string, option: PickerOption) => PickerOptions` | `-` | | threeDimensional | 是否开启3D效果 | `boolean` | `true` | | onConfirm | 点击确定按钮时触发 | `(options, value) => void` | `-` | | onCancel | 点击取消按钮时触发 | `() => void` | `-` | diff --git a/src/packages/datepicker/doc.taro.md b/src/packages/datepicker/doc.taro.md index 766a1230b4..5957b3b220 100644 --- a/src/packages/datepicker/doc.taro.md +++ b/src/packages/datepicker/doc.taro.md @@ -99,7 +99,7 @@ DatetimePicker 通过 type 属性来定义需要选择的时间类型。将 type | endDate | 结束日期 | `Date` | `十年后` | | formatter | 选项格式化函数 | `(type: string, option: PickerOption) => PickerOption` | `-` | | pickerProps | 透传picker属性 | `object` | `-` | -| filter | 选项过滤函数 | `(type: string, option: PickerOption) => PickerOption[]` | `-` | +| filter | 选项过滤函数 | `(type: string, option: PickerOption) => PickerOptions` | `-` | | threeDimensional | 是否开启3D效果 | `boolean` | `true` | | onConfirm | 点击确定按钮时触发 | `(options, value) => void` | `-` | | onCancel | 点击取消按钮时触发 | `() => void` | `-` | diff --git a/src/packages/datepicker/doc.zh-TW.md b/src/packages/datepicker/doc.zh-TW.md index c364f20277..5d21efc10d 100644 --- a/src/packages/datepicker/doc.zh-TW.md +++ b/src/packages/datepicker/doc.zh-TW.md @@ -99,7 +99,7 @@ DatetimePicker 通過 type 屬性來定義需要選擇的時間類型。將 type | endDate | 結束日期 | `Date` | `十年後` | | formatter | 選項格式化函數 | `(type: string, option: PickerOption) => PickerOption` | `-` | | pickerProps | 透传 picker 屬性 | `object` | `-` | -| filter | 選項過濾函數 | `(type: string, option: PickerOption) => PickerOption[]` | `-` | +| filter | 選項過濾函數 | `(type: string, option: PickerOption) => PickerOptions` | `-` | | threeDimensional | 是否開啟3D效果 | `boolean` | `true` | | onConfirm | 點擊確定按鈕時觸發 | `(options, value) => void` | `-` | | onCancel | 點擊取消按鈕時觸發 | `() => void` | `-` | diff --git a/src/packages/datepicker/types.ts b/src/packages/datepicker/types.ts index 62b68cfe51..6d2a44ac12 100644 --- a/src/packages/datepicker/types.ts +++ b/src/packages/datepicker/types.ts @@ -44,11 +44,11 @@ export interface DatePickerProps extends BasicComponent { onClose: () => void onCancel: () => void onConfirm: ( - selectedOptions: PickerOption[], + selectedOptions: PickerOptions, selectedValue: PickerValue[] ) => void onChange?: ( - selectedOptions: PickerOption[], + selectedOptions: PickerOptions, selectedValue: PickerValue[], columnIndex: number ) => void diff --git a/src/packages/datepickerview/datepickerview.tsx b/src/packages/datepickerview/datepickerview.tsx index 0beabcbc00..4a3be2b474 100644 --- a/src/packages/datepickerview/datepickerview.tsx +++ b/src/packages/datepickerview/datepickerview.tsx @@ -1,6 +1,9 @@ import React, { useState, useEffect, FunctionComponent } from 'react' import classNames from 'classnames' -import { PickerOptions, PickerValue } from '@/packages/pickerview/index' +import PickerView, { + PickerOptions, + PickerValue, +} from '@/packages/pickerview/index' import { useConfig } from '@/packages/configprovider' import { usePropsValue } from '@/hooks/use-props-value' import { ComponentDefaults } from '@/utils/typings' @@ -98,7 +101,7 @@ export const DatePickerView: FunctionComponent< const handleChange = ( selectedOptions: PickerOptions, - selectedValue: (string | number)[], + selectedValue: PickerValue[], index: number ) => { handlePickerValueChange( @@ -161,14 +164,12 @@ export const DatePickerView: FunctionComponent< <>
{pickerOptions.length && ( - handleChange(options, value, index)} + onChange={({ value, index, selectedOptions }) => { + handleChange(selectedOptions, value, index) + }} threeDimensional={threeDimensional} /> )} diff --git a/src/packages/datepickerview/demos/h5/demo1.tsx b/src/packages/datepickerview/demos/h5/demo1.tsx index cc936b8c5c..87e2a24cab 100644 --- a/src/packages/datepickerview/demos/h5/demo1.tsx +++ b/src/packages/datepickerview/demos/h5/demo1.tsx @@ -1,5 +1,10 @@ import React, { useState } from 'react' -import { DatePickerView, Cell, type PickerOption } from '@nutui/nutui-react' +import { + DatePickerView, + Cell, + PickerValue, + PickerOptions, +} from '@nutui/nutui-react' import isEqual from 'react-fast-compare' const useDatePicker = (initialDate: Date) => { @@ -29,17 +34,17 @@ const Demo1 = () => { const handleChange = (setDesc: (desc: string) => void, setValue?: (value: string) => void) => - (options: PickerOption[], values: (string | number)[]) => { + (options: PickerOptions, values: PickerValue[]) => { if (setValue) { if (isEqual(values, ['2026', '02', '21'])) { setValue('2026/03/22') setDesc('2026年03月22日') } else { setValue(values.join('/')) - setDesc(options.map((option) => option.text).join('')) + setDesc(options.map((option) => option.label).join('')) } } else { - setDesc(options.map((option) => option.text).join('')) + setDesc(options.map((option) => option.label).join('')) } } @@ -50,11 +55,11 @@ const Demo1 = () => { - {/* */} + onChange={handleChange(setDesc2, setValue)} + /> ) From 6c1111529c413c50f3abf6b1757b7bb74f2361c2 Mon Sep 17 00:00:00 2001 From: songchenglin3 <353833373@qq.com> Date: Wed, 26 Feb 2025 20:20:37 +0800 Subject: [PATCH 05/26] =?UTF-8?q?fix:=20=E5=88=9D=E7=89=88=E5=AE=8C?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datepickerview/datepickerview.scss | 2 + .../datepickerview/datepickerview.taro.tsx | 172 +++++++++++++++++- .../datepickerview/datepickerview.tsx | 78 ++++---- src/packages/datepickerview/demo.tsx | 64 ++++++- .../datepickerview/demos/h5/demo1.tsx | 43 +++-- .../datepickerview/demos/h5/demo2.tsx | 34 ++++ .../datepickerview/demos/h5/demo3.tsx | 44 +++++ .../datepickerview/demos/h5/demo4.tsx | 42 +++++ .../datepickerview/demos/h5/demo5.tsx | 38 ++++ .../datepickerview/demos/h5/demo6.tsx | 73 ++++++++ .../datepickerview/demos/h5/demo7.tsx | 39 ++++ .../datepickerview/demos/h5/demo8.tsx | 75 ++++++++ .../datepickerview/demos/taro/demo1.tsx | 78 +++++++- src/packages/datepickerview/types.ts | 3 +- 14 files changed, 707 insertions(+), 78 deletions(-) create mode 100644 src/packages/datepickerview/demos/h5/demo2.tsx create mode 100644 src/packages/datepickerview/demos/h5/demo3.tsx create mode 100644 src/packages/datepickerview/demos/h5/demo4.tsx create mode 100644 src/packages/datepickerview/demos/h5/demo5.tsx create mode 100644 src/packages/datepickerview/demos/h5/demo6.tsx create mode 100644 src/packages/datepickerview/demos/h5/demo7.tsx create mode 100644 src/packages/datepickerview/demos/h5/demo8.tsx diff --git a/src/packages/datepickerview/datepickerview.scss b/src/packages/datepickerview/datepickerview.scss index 972cefa123..cc903b87ef 100644 --- a/src/packages/datepickerview/datepickerview.scss +++ b/src/packages/datepickerview/datepickerview.scss @@ -1,2 +1,4 @@ .nut-datepickerview { + display: flex; + width: 100%; } diff --git a/src/packages/datepickerview/datepickerview.taro.tsx b/src/packages/datepickerview/datepickerview.taro.tsx index d6f56c529c..047296305d 100644 --- a/src/packages/datepickerview/datepickerview.taro.tsx +++ b/src/packages/datepickerview/datepickerview.taro.tsx @@ -1,26 +1,184 @@ -import React, { FunctionComponent } from 'react' +import React, { useState, useEffect, FunctionComponent } from 'react' import classNames from 'classnames' import { View } from '@tarojs/components' +import isEqual from 'react-fast-compare' +import { padZero } from '@/utils/pad-zero' +import PickerView, { + PickerOptions, + PickerValue, +} from '@/packages/pickerview/index.taro' +import { useConfig } from '@/packages/configprovider' +import { usePropsValue } from '@/hooks/use-props-value' import { ComponentDefaults } from '@/utils/typings' +import { isDate } from '@/utils/is-date' +import { + formatValue, + generateDatePickerRanges, + generatePickerColumnWithCallback, + getDatePartValue, + handlePickerValueChange, +} from '@/packages/datepicker/utils' import { DatePickerViewProps } from './types' -// import { useConfig } from '@/packages/configprovider/configprovider.taro' -// import { useRtl } from '@/packages/configprovider/index.taro' +const currentYear = new Date().getFullYear() const defaultProps = { ...ComponentDefaults, + type: 'date', + showChinese: false, + threeDimensional: true, + minuteStep: 1, + startDate: new Date(currentYear - 10, 0, 1), + endDate: new Date(currentYear + 10, 11, 31), } as DatePickerViewProps + export const DatePickerView: FunctionComponent< Partial & React.HTMLAttributes > = (props) => { - // const { locale } = useConfig() - // const rtl = useRtl() - const { className, style } = { ...defaultProps, ...props } + const { + startDate, + endDate, + type, + showChinese, + minuteStep, + defaultValue, + formatter, + filter, + onChange, + threeDimensional, + className, + style, + } = { + ...defaultProps, + ...props, + } + const classPrefix = 'nut-datepickerview' const cls = classNames(classPrefix, className) + + const { locale } = useConfig() + const lang = locale.datepicker + + const zhCNType: { [key: string]: string } = { + day: lang.day, + year: lang.year, + month: lang.month, + hour: lang.hour, + minute: lang.min, + seconds: lang.seconds, + } + + const [pickerValue, setPickerValue] = useState([]) + const [pickerOptions, setPickerOptions] = useState([]) + + const [selectedDate, setSelectedDate] = usePropsValue({ + value: props.value && formatValue(props.value, startDate, endDate), + defaultValue: defaultValue && formatValue(defaultValue, startDate, endDate), + finalValue: 0, + }) + + const handleDateComparison = ( + newDate: Date | null, + selectedOptions: PickerOptions, + index: number + ) => { + const isEqual = new Date(selectedDate)?.getTime() === newDate?.getTime() + if (newDate && isDate(newDate)) { + if (!isEqual) { + setSelectedDate(formatValue(newDate, startDate, endDate)) + onChange?.( + selectedOptions, + [ + String(newDate.getFullYear()), + padZero(newDate.getMonth() + 1), + padZero(newDate.getDate()), + ], + index + ) + } + } + } + + const handleChange = ( + selectedOptions: PickerOptions, + selectedValue: PickerValue[], + index: number + ) => { + handlePickerValueChange( + selectedOptions, + selectedValue, + index, + type, + defaultValue || startDate || endDate, + handleDateComparison + ) + } + + const generatePickerColumns = (): PickerOptions[] => { + const dateRanges = generateDatePickerRanges( + type, + selectedDate, + startDate, + endDate + ) + + const columns = dateRanges.map((rangeConfig, columnIndex) => { + const { type: columnType, range } = rangeConfig + const selectedValue = getDatePartValue(columnType, selectedDate) + + const pickerColumn = generatePickerColumnWithCallback( + range[0], + range[1], + selectedValue, + columnType, + minuteStep, + (selectedIndex, options) => { + pickerValue[columnIndex] = options[selectedIndex]?.value + setPickerValue([...pickerValue]) + }, + showChinese, + zhCNType, + formatter + ) + + if (filter?.(columnType, pickerColumn)) { + return filter(columnType, pickerColumn) + } + + return pickerColumn + }) + + return columns || [] + } + + useEffect(() => { + console.log(new Date(selectedDate).toLocaleDateString()) + if ( + !isEqual( + new Date(selectedDate)?.getTime(), + new Date(selectedDate)?.getTime() + ) + ) { + setSelectedDate(selectedDate) + } + }, [selectedDate]) + + useEffect(() => { + setPickerOptions(generatePickerColumns()) + }, [selectedDate, startDate, endDate]) + return ( - DatePickerView + {pickerOptions.length && ( + { + handleChange(selectedOptions, value, index) + }} + threeDimensional={threeDimensional} + /> + )} ) } diff --git a/src/packages/datepickerview/datepickerview.tsx b/src/packages/datepickerview/datepickerview.tsx index 4a3be2b474..c36db43827 100644 --- a/src/packages/datepickerview/datepickerview.tsx +++ b/src/packages/datepickerview/datepickerview.tsx @@ -1,5 +1,7 @@ import React, { useState, useEffect, FunctionComponent } from 'react' import classNames from 'classnames' +import isEqual from 'react-fast-compare' +import { padZero } from '@/utils/pad-zero' import PickerView, { PickerOptions, PickerValue, @@ -70,32 +72,29 @@ export const DatePickerView: FunctionComponent< const [selectedDate, setSelectedDate] = usePropsValue({ value: props.value && formatValue(props.value, startDate, endDate), - defaultValue: - props.defaultValue && formatValue(props.defaultValue, startDate, endDate), + defaultValue: defaultValue && formatValue(defaultValue, startDate, endDate), finalValue: 0, }) - const [innerDate, setInnerDate] = useState(selectedDate) - const handleDateComparison = ( newDate: Date | null, selectedOptions: PickerOptions, index: number ) => { - const isEqual = new Date(innerDate)?.getTime() === newDate?.getTime() + const isEqual = new Date(selectedDate)?.getTime() === newDate?.getTime() if (newDate && isDate(newDate)) { if (!isEqual) { - setInnerDate(formatValue(newDate, startDate, endDate)) + setSelectedDate(formatValue(newDate, startDate, endDate)) + onChange?.( + selectedOptions, + [ + String(newDate.getFullYear()), + padZero(newDate.getMonth() + 1), + padZero(newDate.getDate()), + ], + index + ) } - onChange?.( - selectedOptions, - [ - String(newDate.getFullYear()), - String(newDate.getMonth() + 1), - String(newDate.getDate()), - ], - index - ) } } @@ -117,14 +116,14 @@ export const DatePickerView: FunctionComponent< const generatePickerColumns = (): PickerOptions[] => { const dateRanges = generateDatePickerRanges( type, - innerDate, + selectedDate, startDate, endDate ) const columns = dateRanges.map((rangeConfig, columnIndex) => { const { type: columnType, range } = rangeConfig - const selectedValue = getDatePartValue(columnType, innerDate) + const selectedValue = getDatePartValue(columnType, selectedDate) const pickerColumn = generatePickerColumnWithCallback( range[0], @@ -151,30 +150,35 @@ export const DatePickerView: FunctionComponent< return columns || [] } - // useEffect(() => { - // setInnerDate(selectedDate) - // }, [selectedDate]) + useEffect(() => { + console.log(new Date(selectedDate).toLocaleDateString()) + if ( + !isEqual( + new Date(selectedDate)?.getTime(), + new Date(selectedDate)?.getTime() + ) + ) { + setSelectedDate(selectedDate) + } + }, [selectedDate]) useEffect(() => { - console.log('ssss', innerDate) setPickerOptions(generatePickerColumns()) - }, [innerDate, startDate, endDate]) - console.log('pickerValue', pickerValue, pickerOptions) + }, [selectedDate, startDate, endDate]) + return ( - <> -
- {pickerOptions.length && ( - { - handleChange(selectedOptions, value, index) - }} - threeDimensional={threeDimensional} - /> - )} -
- +
+ {pickerOptions.length && ( + { + handleChange(selectedOptions, value, index) + }} + threeDimensional={threeDimensional} + /> + )} +
) } diff --git a/src/packages/datepickerview/demo.tsx b/src/packages/datepickerview/demo.tsx index bde58f472d..6b02bca451 100644 --- a/src/packages/datepickerview/demo.tsx +++ b/src/packages/datepickerview/demo.tsx @@ -1,25 +1,69 @@ import React from 'react' import { useTranslate } from '@/sites/assets/locale' import Demo1 from './demos/h5/demo1' +import Demo2 from './demos/h5/demo2' +import Demo3 from './demos/h5/demo3' +import Demo4 from './demos/h5/demo4' +import Demo5 from './demos/h5/demo5' +import Demo6 from './demos/h5/demo6' +import Demo7 from './demos/h5/demo7' +import Demo8 from './demos/h5/demo8' const DatePickerViewDemo = () => { const [translated] = useTranslate({ 'zh-CN': { - title: '基础用法', - }, - 'en-US': { - title: 'Basic Usage', + basic: '选择日期', + mmdd: '选择月日', + showAll: '选择年月日时分', + time: '选择时分秒', + hourMinutes: '选择时分', + format: '格式化选项', + stepMins: '分钟数递增步长设置', + filter: '过滤选项', }, 'zh-TW': { - title: '基礎用法', + basic: '選擇日期', + mmdd: '選擇月日', + showAll: '選擇年月日時分', + time: '選擇時分秒', + hourMinutes: '選擇時分', + format: '格式化选项', + stepMins: '分鐘數遞增步長設置', + filter: '過濾選項', + }, + 'en-US': { + basic: 'Choose Date', + mmdd: 'Choose Month-Day', + showAll: 'Choose DateTime', + time: 'Choose Time', + hourMinutes: 'Selective time', + format: 'Option Formatter', + stepMins: 'Option Steps', + filter: 'Option Filter', }, }) + return ( -
-

{translated.title}

- -
+ <> +
+

{translated.basic}

+ +

{translated.mmdd}

+ +

{translated.showAll}

+ +

{translated.time}

+ +

{translated.hourMinutes}

+ +

{translated.format}

+ +

{translated.stepMins}

+ +

{translated.filter}

+ +
+ ) } - export default DatePickerViewDemo diff --git a/src/packages/datepickerview/demos/h5/demo1.tsx b/src/packages/datepickerview/demos/h5/demo1.tsx index 87e2a24cab..fe44912754 100644 --- a/src/packages/datepickerview/demos/h5/demo1.tsx +++ b/src/packages/datepickerview/demos/h5/demo1.tsx @@ -4,6 +4,7 @@ import { Cell, PickerValue, PickerOptions, + CellGroup, } from '@nutui/nutui-react' import isEqual from 'react-fast-compare' @@ -34,33 +35,43 @@ const Demo1 = () => { const handleChange = (setDesc: (desc: string) => void, setValue?: (value: string) => void) => - (options: PickerOptions, values: PickerValue[]) => { + (selectedOptions: PickerOptions, value: PickerValue[]) => { + console.log('demo-onChange-value', value) if (setValue) { - if (isEqual(values, ['2026', '02', '21'])) { + if (isEqual(value, ['2026', '02', '26'])) { setValue('2026/03/22') setDesc('2026年03月22日') } else { - setValue(values.join('/')) - setDesc(options.map((option) => option.label).join('')) + setValue(value.join('/')) + setDesc(selectedOptions.map((option) => option.label).join('')) } } else { - setDesc(options.map((option) => option.label).join('')) + setDesc(selectedOptions.map((option) => option.label).join('')) } } return ( <> - - - - - - - + + + + + + + + + + + + ) } diff --git a/src/packages/datepickerview/demos/h5/demo2.tsx b/src/packages/datepickerview/demos/h5/demo2.tsx new file mode 100644 index 0000000000..25cb712127 --- /dev/null +++ b/src/packages/datepickerview/demos/h5/demo2.tsx @@ -0,0 +1,34 @@ +import React, { useState } from 'react' +import { + DatePickerView, + Cell, + PickerOptions, + CellGroup, +} from '@nutui/nutui-react' + +const Demo2 = () => { + const defaultValue = new Date() + const [desc, setDesc] = useState( + `${defaultValue.getMonth() + 1}-${defaultValue.getDate()}` + ) + + const onChange = (options: PickerOptions) => { + setDesc(options.map((option) => option.label).join('-')) + } + return ( + + + + onChange(selectedOptions)} + /> + + + ) +} +export default Demo2 diff --git a/src/packages/datepickerview/demos/h5/demo3.tsx b/src/packages/datepickerview/demos/h5/demo3.tsx new file mode 100644 index 0000000000..bf0cce9a2e --- /dev/null +++ b/src/packages/datepickerview/demos/h5/demo3.tsx @@ -0,0 +1,44 @@ +import React, { useState } from 'react' +import { + DatePicker, + Cell, + PickerOptions, + PickerValue, +} from '@nutui/nutui-react' + +const Demo3 = () => { + const defaultValue = new Date() + const defaultDescription = `${defaultValue.getFullYear()}-${ + defaultValue.getMonth() + 1 + }-${defaultValue.getDate()}` + + const startDate = new Date(2020, 0, 1) + const endDate = new Date(2025, 10, 1) + const [show, setShow] = useState(false) + const [desc, setDesc] = useState(`${defaultDescription} 11:08`) + const confirm = (values: PickerValue[], options: PickerOptions) => { + const date = values.slice(0, 3).join('-') + const time = values.slice(3).join(':') + setDesc(`${date} ${time}`) + } + return ( + <> + setShow(true)} + /> + setShow(false)} + onConfirm={(options, values) => confirm(values, options)} + /> + + ) +} +export default Demo3 diff --git a/src/packages/datepickerview/demos/h5/demo4.tsx b/src/packages/datepickerview/demos/h5/demo4.tsx new file mode 100644 index 0000000000..7e01fa6996 --- /dev/null +++ b/src/packages/datepickerview/demos/h5/demo4.tsx @@ -0,0 +1,42 @@ +import React, { useState } from 'react' +import { + DatePicker, + Cell, + PickerValue, + PickerOptions, +} from '@nutui/nutui-react' + +const Demo4 = () => { + const defaultValue = new Date() + const defaultDescription = `${defaultValue.getFullYear()}-${ + defaultValue.getMonth() + 1 + }-${defaultValue.getDate()}` + const startDate = new Date(2020, 0, 1) + const endDate = new Date(2025, 10, 1) + const [show, setShow] = useState(false) + const [desc, setDesc] = useState('10:10:00') + const confirm = (values: PickerValue[], options: PickerOptions) => { + setDesc(options.map((option) => option.label).join(':')) + } + + return ( + <> + setShow(true)} + /> + setShow(false)} + onConfirm={(options, values) => confirm(values, options)} + /> + + ) +} +export default Demo4 diff --git a/src/packages/datepickerview/demos/h5/demo5.tsx b/src/packages/datepickerview/demos/h5/demo5.tsx new file mode 100644 index 0000000000..e396a55a9f --- /dev/null +++ b/src/packages/datepickerview/demos/h5/demo5.tsx @@ -0,0 +1,38 @@ +import React, { useState } from 'react' +import { + DatePicker, + Cell, + PickerOptions, + PickerValue, +} from '@nutui/nutui-react' + +const Demo5 = () => { + const defaultValue = new Date() + const defaultDescription = `${defaultValue.getFullYear()}-${ + defaultValue.getMonth() + 1 + }-${defaultValue.getDate()}` + const startDate = new Date(2020, 0, 1) + const endDate = new Date(2025, 10, 1) + const [show, setShow] = useState(false) + const [desc, setDesc] = useState('10:10') + const confirm8 = (options: PickerOptions, values: PickerValue[]) => { + setDesc(options.map((option) => option.label).join(':')) + } + + return ( + <> + setShow(true)} /> + setShow(false)} + onConfirm={(options, values) => confirm8(options, values)} + /> + + ) +} +export default Demo5 diff --git a/src/packages/datepickerview/demos/h5/demo6.tsx b/src/packages/datepickerview/demos/h5/demo6.tsx new file mode 100644 index 0000000000..21350012de --- /dev/null +++ b/src/packages/datepickerview/demos/h5/demo6.tsx @@ -0,0 +1,73 @@ +import React, { useState } from 'react' +import { + DatePicker, + Cell, + PickerValue, + PickerOption, + PickerOptions, +} from '@nutui/nutui-react' + +const Demo6 = () => { + const defaultValue = new Date() + const defaultDescription = `${defaultValue.getFullYear()}-${ + defaultValue.getMonth() + 1 + }-${defaultValue.getDate()}` + const [show, setShow] = useState(false) + const [desc, setDesc] = useState(`${defaultDescription} 10:10`) + + const confirm = (values: PickerValue[], options: PickerOptions) => { + const date = options + .slice(1, 3) + .map((op) => op.label) + .join('') + const time = options + .slice(3) + .map((op) => op.value) + .join(':') + setDesc(`${options[0].label}年${date} ${time}`) + } + const formatter = (type: string, option: PickerOption) => { + switch (type) { + case 'year': + option.label += '' + break + case 'month': + option.label += '月' + break + case 'day': + option.label += '日' + break + case 'hour': + option.label += '时' + break + case 'minute': + option.label += '分' + break + default: + option.label += '' + } + return option + } + + return ( + <> + setShow(true)} + /> + setShow(false)} + onConfirm={(options, values) => confirm(values, options)} + /> + + ) +} +export default Demo6 diff --git a/src/packages/datepickerview/demos/h5/demo7.tsx b/src/packages/datepickerview/demos/h5/demo7.tsx new file mode 100644 index 0000000000..ba3b8f9366 --- /dev/null +++ b/src/packages/datepickerview/demos/h5/demo7.tsx @@ -0,0 +1,39 @@ +import React, { useState } from 'react' +import { + DatePicker, + Cell, + PickerValue, + PickerOptions, +} from '@nutui/nutui-react' + +const Demo7 = () => { + const defaultValue = new Date() + const defaultDescription = `${defaultValue.getFullYear()}-${ + defaultValue.getMonth() + 1 + }-${defaultValue.getDate()}` + const startDate = new Date(2020, 0, 1) + const endDate = new Date(2025, 10, 1) + const [show, setShow] = useState(false) + const [desc, setDesc] = useState('10:10:00') + + const confirm6 = (values: PickerValue[], options: PickerOptions) => { + setDesc(options.map((option) => option.label).join(':')) + } + return ( + <> + setShow(true)} /> + setShow(false)} + onConfirm={(options, values) => confirm6(values, options)} + /> + + ) +} +export default Demo7 diff --git a/src/packages/datepickerview/demos/h5/demo8.tsx b/src/packages/datepickerview/demos/h5/demo8.tsx new file mode 100644 index 0000000000..d4e8d8f9ab --- /dev/null +++ b/src/packages/datepickerview/demos/h5/demo8.tsx @@ -0,0 +1,75 @@ +import React, { useState } from 'react' +import { + DatePicker, + Cell, + PickerValue, + PickerOption, + PickerOptions, +} from '@nutui/nutui-react' + +const Demo8 = () => { + const startDate = new Date(2020, 0, 1) + const endDate = new Date(2025, 10, 1) + const defaultValue = new Date() + const defaultDescription = `${defaultValue.getFullYear()}-${ + defaultValue.getMonth() + 1 + }-${defaultValue.getDate()} 06:00` + const [show, setShow] = useState(false) + const [desc, setDesc] = useState( + `${defaultValue.getFullYear()}年${ + defaultValue.getMonth() + 1 + }月${defaultValue.getDate()}日 06时` + ) + + const confirm = (values: PickerValue[], options: PickerOptions) => { + setDesc(options.map((option) => option.label).join(' ')) + } + const filter = (type: string, options: PickerOptions) => { + if (type === 'hour') { + return options.filter((option) => Number(option.value) % 6 === 0) + } + return options + } + const formatter1 = (type: string, option: PickerOption) => { + switch (type) { + case 'year': + option.label += `年` + break + case 'month': + option.label += `月` + break + case 'day': + option.label += `日` + break + case 'hour': + option.label += `时` + break + default: + option.label += '' + } + return option + } + return ( + <> + setShow(true)} + /> + setShow(false)} + onConfirm={(options, values) => confirm(values, options)} + /> + + ) +} +export default Demo8 diff --git a/src/packages/datepickerview/demos/taro/demo1.tsx b/src/packages/datepickerview/demos/taro/demo1.tsx index 208ba8615a..dc102cec87 100644 --- a/src/packages/datepickerview/demos/taro/demo1.tsx +++ b/src/packages/datepickerview/demos/taro/demo1.tsx @@ -1,12 +1,78 @@ -import React from 'react' -import { Cell, DatePickerView } from '@nutui/nutui-react-taro' -// import { Dongdong } from '@nutui/icons-react-taro' +import React, { useState } from 'react' +import { + DatePickerView, + Cell, + PickerValue, + PickerOptions, + CellGroup, +} from '@nutui/nutui-react-taro' +import isEqual from 'react-fast-compare' + +const useDatePicker = (initialDate: Date) => { + const defaultDateObj = { + year: initialDate.getFullYear(), + month: initialDate.getMonth() + 1, + day: initialDate.getDate(), + } + + const defaultDesc = `${defaultDateObj.year}年${defaultDateObj.month}月${defaultDateObj.day}日` + const defaultValue = Object.values(defaultDateObj).join('-') + + return { defaultDesc, defaultValue } +} const Demo1 = () => { + const defaultDate = new Date() + const { defaultDesc: defaultDesc1, defaultValue: defaultValue1 } = + useDatePicker(defaultDate) + const { defaultDesc: defaultDesc2, defaultValue: defaultValue2 } = + useDatePicker(defaultDate) + + const [desc1, setDesc1] = useState(defaultDesc1) + + const [value, setValue] = useState(defaultValue2) + const [desc2, setDesc2] = useState(defaultDesc2) + + const handleChange = + (setDesc: (desc: string) => void, setValue?: (value: string) => void) => + (selectedOptions: PickerOptions, value: PickerValue[]) => { + console.log('demo-onChange-value', value) + if (setValue) { + if (isEqual(value, ['2026', '02', '26'])) { + setValue('2026/03/22') + setDesc('2026年03月22日') + } else { + setValue(value.join('/')) + setDesc(selectedOptions.map((option) => option.label).join('')) + } + } else { + setDesc(selectedOptions.map((option) => option.label).join('')) + } + } + return ( - - - + <> + + + + + + + + + + + + + ) } diff --git a/src/packages/datepickerview/types.ts b/src/packages/datepickerview/types.ts index aa12f3da49..3f6a8414e0 100644 --- a/src/packages/datepickerview/types.ts +++ b/src/packages/datepickerview/types.ts @@ -23,8 +23,7 @@ export interface DatePickerViewProps extends BasicComponent { threeDimensional: boolean formatter: (type: string, option: PickerOption) => PickerOption filter: (type: string, options: PickerOptions) => PickerOptions - - onChange?: ( + onChange: ( selectedOptions: PickerOptions, selectedValue: PickerValue[], columnIndex: number From 6befb47b8fd4e38dd538ddc1e9cf6b301b44e86e Mon Sep 17 00:00:00 2001 From: songchenglin3 <353833373@qq.com> Date: Thu, 27 Feb 2025 15:34:44 +0800 Subject: [PATCH 06/26] =?UTF-8?q?fix:=20demo=E4=B8=B0=E5=AF=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/packages/datepickerview/demo.taro.tsx | 19 +++-- src/packages/datepickerview/demo.tsx | 17 ----- .../datepickerview/demos/h5/demo3.tsx | 44 ----------- .../datepickerview/demos/h5/demo4.tsx | 42 ----------- .../datepickerview/demos/h5/demo5.tsx | 38 ---------- .../datepickerview/demos/h5/demo6.tsx | 73 ------------------ .../datepickerview/demos/h5/demo7.tsx | 39 ---------- .../datepickerview/demos/h5/demo8.tsx | 75 ------------------- .../datepickerview/demos/taro/demo2.tsx | 34 +++++++++ 9 files changed, 47 insertions(+), 334 deletions(-) delete mode 100644 src/packages/datepickerview/demos/h5/demo3.tsx delete mode 100644 src/packages/datepickerview/demos/h5/demo4.tsx delete mode 100644 src/packages/datepickerview/demos/h5/demo5.tsx delete mode 100644 src/packages/datepickerview/demos/h5/demo6.tsx delete mode 100644 src/packages/datepickerview/demos/h5/demo7.tsx delete mode 100644 src/packages/datepickerview/demos/h5/demo8.tsx create mode 100644 src/packages/datepickerview/demos/taro/demo2.tsx diff --git a/src/packages/datepickerview/demo.taro.tsx b/src/packages/datepickerview/demo.taro.tsx index e03d997bfb..3e4da160ee 100644 --- a/src/packages/datepickerview/demo.taro.tsx +++ b/src/packages/datepickerview/demo.taro.tsx @@ -4,25 +4,32 @@ import { ScrollView, View } from '@tarojs/components' import { useTranslate } from '@/sites/assets/locale/taro' import Header from '@/sites/components/header' import Demo1 from './demos/taro/demo1' +import Demo2 from './demos/taro/demo2' const DatePickerViewDemo = () => { const [translated] = useTranslate({ 'zh-CN': { - title: '基础用法', - }, - 'en-US': { - title: 'Basic Usage', + basic: '选择日期', + mmdd: '选择月日', }, + 'zh-TW': { - title: '基礎用法', + basic: '選擇日期', + mmdd: '選擇月日', + }, + 'en-US': { + basic: 'Choose Date', + mmdd: 'Choose Month-Day', }, }) return ( <>
- {translated.title} + {translated.basic} +

{translated.mmdd}

+
) diff --git a/src/packages/datepickerview/demo.tsx b/src/packages/datepickerview/demo.tsx index 6b02bca451..97f0699a2c 100644 --- a/src/packages/datepickerview/demo.tsx +++ b/src/packages/datepickerview/demo.tsx @@ -2,12 +2,6 @@ import React from 'react' import { useTranslate } from '@/sites/assets/locale' import Demo1 from './demos/h5/demo1' import Demo2 from './demos/h5/demo2' -import Demo3 from './demos/h5/demo3' -import Demo4 from './demos/h5/demo4' -import Demo5 from './demos/h5/demo5' -import Demo6 from './demos/h5/demo6' -import Demo7 from './demos/h5/demo7' -import Demo8 from './demos/h5/demo8' const DatePickerViewDemo = () => { const [translated] = useTranslate({ @@ -51,17 +45,6 @@ const DatePickerViewDemo = () => {

{translated.mmdd}

{translated.showAll}

- -

{translated.time}

- -

{translated.hourMinutes}

- -

{translated.format}

- -

{translated.stepMins}

- -

{translated.filter}

-
) diff --git a/src/packages/datepickerview/demos/h5/demo3.tsx b/src/packages/datepickerview/demos/h5/demo3.tsx deleted file mode 100644 index bf0cce9a2e..0000000000 --- a/src/packages/datepickerview/demos/h5/demo3.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import React, { useState } from 'react' -import { - DatePicker, - Cell, - PickerOptions, - PickerValue, -} from '@nutui/nutui-react' - -const Demo3 = () => { - const defaultValue = new Date() - const defaultDescription = `${defaultValue.getFullYear()}-${ - defaultValue.getMonth() + 1 - }-${defaultValue.getDate()}` - - const startDate = new Date(2020, 0, 1) - const endDate = new Date(2025, 10, 1) - const [show, setShow] = useState(false) - const [desc, setDesc] = useState(`${defaultDescription} 11:08`) - const confirm = (values: PickerValue[], options: PickerOptions) => { - const date = values.slice(0, 3).join('-') - const time = values.slice(3).join(':') - setDesc(`${date} ${time}`) - } - return ( - <> - setShow(true)} - /> - setShow(false)} - onConfirm={(options, values) => confirm(values, options)} - /> - - ) -} -export default Demo3 diff --git a/src/packages/datepickerview/demos/h5/demo4.tsx b/src/packages/datepickerview/demos/h5/demo4.tsx deleted file mode 100644 index 7e01fa6996..0000000000 --- a/src/packages/datepickerview/demos/h5/demo4.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import React, { useState } from 'react' -import { - DatePicker, - Cell, - PickerValue, - PickerOptions, -} from '@nutui/nutui-react' - -const Demo4 = () => { - const defaultValue = new Date() - const defaultDescription = `${defaultValue.getFullYear()}-${ - defaultValue.getMonth() + 1 - }-${defaultValue.getDate()}` - const startDate = new Date(2020, 0, 1) - const endDate = new Date(2025, 10, 1) - const [show, setShow] = useState(false) - const [desc, setDesc] = useState('10:10:00') - const confirm = (values: PickerValue[], options: PickerOptions) => { - setDesc(options.map((option) => option.label).join(':')) - } - - return ( - <> - setShow(true)} - /> - setShow(false)} - onConfirm={(options, values) => confirm(values, options)} - /> - - ) -} -export default Demo4 diff --git a/src/packages/datepickerview/demos/h5/demo5.tsx b/src/packages/datepickerview/demos/h5/demo5.tsx deleted file mode 100644 index e396a55a9f..0000000000 --- a/src/packages/datepickerview/demos/h5/demo5.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import React, { useState } from 'react' -import { - DatePicker, - Cell, - PickerOptions, - PickerValue, -} from '@nutui/nutui-react' - -const Demo5 = () => { - const defaultValue = new Date() - const defaultDescription = `${defaultValue.getFullYear()}-${ - defaultValue.getMonth() + 1 - }-${defaultValue.getDate()}` - const startDate = new Date(2020, 0, 1) - const endDate = new Date(2025, 10, 1) - const [show, setShow] = useState(false) - const [desc, setDesc] = useState('10:10') - const confirm8 = (options: PickerOptions, values: PickerValue[]) => { - setDesc(options.map((option) => option.label).join(':')) - } - - return ( - <> - setShow(true)} /> - setShow(false)} - onConfirm={(options, values) => confirm8(options, values)} - /> - - ) -} -export default Demo5 diff --git a/src/packages/datepickerview/demos/h5/demo6.tsx b/src/packages/datepickerview/demos/h5/demo6.tsx deleted file mode 100644 index 21350012de..0000000000 --- a/src/packages/datepickerview/demos/h5/demo6.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import React, { useState } from 'react' -import { - DatePicker, - Cell, - PickerValue, - PickerOption, - PickerOptions, -} from '@nutui/nutui-react' - -const Demo6 = () => { - const defaultValue = new Date() - const defaultDescription = `${defaultValue.getFullYear()}-${ - defaultValue.getMonth() + 1 - }-${defaultValue.getDate()}` - const [show, setShow] = useState(false) - const [desc, setDesc] = useState(`${defaultDescription} 10:10`) - - const confirm = (values: PickerValue[], options: PickerOptions) => { - const date = options - .slice(1, 3) - .map((op) => op.label) - .join('') - const time = options - .slice(3) - .map((op) => op.value) - .join(':') - setDesc(`${options[0].label}年${date} ${time}`) - } - const formatter = (type: string, option: PickerOption) => { - switch (type) { - case 'year': - option.label += '' - break - case 'month': - option.label += '月' - break - case 'day': - option.label += '日' - break - case 'hour': - option.label += '时' - break - case 'minute': - option.label += '分' - break - default: - option.label += '' - } - return option - } - - return ( - <> - setShow(true)} - /> - setShow(false)} - onConfirm={(options, values) => confirm(values, options)} - /> - - ) -} -export default Demo6 diff --git a/src/packages/datepickerview/demos/h5/demo7.tsx b/src/packages/datepickerview/demos/h5/demo7.tsx deleted file mode 100644 index ba3b8f9366..0000000000 --- a/src/packages/datepickerview/demos/h5/demo7.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import React, { useState } from 'react' -import { - DatePicker, - Cell, - PickerValue, - PickerOptions, -} from '@nutui/nutui-react' - -const Demo7 = () => { - const defaultValue = new Date() - const defaultDescription = `${defaultValue.getFullYear()}-${ - defaultValue.getMonth() + 1 - }-${defaultValue.getDate()}` - const startDate = new Date(2020, 0, 1) - const endDate = new Date(2025, 10, 1) - const [show, setShow] = useState(false) - const [desc, setDesc] = useState('10:10:00') - - const confirm6 = (values: PickerValue[], options: PickerOptions) => { - setDesc(options.map((option) => option.label).join(':')) - } - return ( - <> - setShow(true)} /> - setShow(false)} - onConfirm={(options, values) => confirm6(values, options)} - /> - - ) -} -export default Demo7 diff --git a/src/packages/datepickerview/demos/h5/demo8.tsx b/src/packages/datepickerview/demos/h5/demo8.tsx deleted file mode 100644 index d4e8d8f9ab..0000000000 --- a/src/packages/datepickerview/demos/h5/demo8.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import React, { useState } from 'react' -import { - DatePicker, - Cell, - PickerValue, - PickerOption, - PickerOptions, -} from '@nutui/nutui-react' - -const Demo8 = () => { - const startDate = new Date(2020, 0, 1) - const endDate = new Date(2025, 10, 1) - const defaultValue = new Date() - const defaultDescription = `${defaultValue.getFullYear()}-${ - defaultValue.getMonth() + 1 - }-${defaultValue.getDate()} 06:00` - const [show, setShow] = useState(false) - const [desc, setDesc] = useState( - `${defaultValue.getFullYear()}年${ - defaultValue.getMonth() + 1 - }月${defaultValue.getDate()}日 06时` - ) - - const confirm = (values: PickerValue[], options: PickerOptions) => { - setDesc(options.map((option) => option.label).join(' ')) - } - const filter = (type: string, options: PickerOptions) => { - if (type === 'hour') { - return options.filter((option) => Number(option.value) % 6 === 0) - } - return options - } - const formatter1 = (type: string, option: PickerOption) => { - switch (type) { - case 'year': - option.label += `年` - break - case 'month': - option.label += `月` - break - case 'day': - option.label += `日` - break - case 'hour': - option.label += `时` - break - default: - option.label += '' - } - return option - } - return ( - <> - setShow(true)} - /> - setShow(false)} - onConfirm={(options, values) => confirm(values, options)} - /> - - ) -} -export default Demo8 diff --git a/src/packages/datepickerview/demos/taro/demo2.tsx b/src/packages/datepickerview/demos/taro/demo2.tsx new file mode 100644 index 0000000000..3ff341c5de --- /dev/null +++ b/src/packages/datepickerview/demos/taro/demo2.tsx @@ -0,0 +1,34 @@ +import React, { useState } from 'react' +import { + DatePickerView, + Cell, + PickerOptions, + CellGroup, +} from '@nutui/nutui-react-taro' + +const Demo2 = () => { + const defaultValue = new Date() + const [desc, setDesc] = useState( + `${defaultValue.getMonth() + 1}-${defaultValue.getDate()}` + ) + + const onChange = (options: PickerOptions) => { + setDesc(options.map((option) => option.label).join('-')) + } + return ( + + + + onChange(selectedOptions)} + /> + + + ) +} +export default Demo2 From 3c3e8651249201542b34e5b45513e807e28c89ce Mon Sep 17 00:00:00 2001 From: songchenglin3 <353833373@qq.com> Date: Thu, 27 Feb 2025 15:54:57 +0800 Subject: [PATCH 07/26] feat: test --- .../datepickerview.spec.tsx.snap | 431 ++++++++++++++++++ .../__test__/datepickerview.spec.tsx | 150 +++++- 2 files changed, 578 insertions(+), 3 deletions(-) create mode 100644 src/packages/datepickerview/__test__/__snapshots__/datepickerview.spec.tsx.snap diff --git a/src/packages/datepickerview/__test__/__snapshots__/datepickerview.spec.tsx.snap b/src/packages/datepickerview/__test__/__snapshots__/datepickerview.spec.tsx.snap new file mode 100644 index 0000000000..4f973c2b0b --- /dev/null +++ b/src/packages/datepickerview/__test__/__snapshots__/datepickerview.spec.tsx.snap @@ -0,0 +1,431 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`should match snapshot 1`] = ` +
+
+
+
+
+
+ 2015 +
+
+ 2016 +
+
+ 2017 +
+
+ 2018 +
+
+ 2019 +
+
+ 2020 +
+
+ 2021 +
+
+ 2022 +
+
+ 2023 +
+
+ 2024 +
+
+ 2025 +
+
+ 2026 +
+
+ 2027 +
+
+ 2028 +
+
+ 2029 +
+
+ 2030 +
+
+ 2031 +
+
+ 2032 +
+
+ 2033 +
+
+ 2034 +
+
+ 2035 +
+
+
+
+
+
+ 01 +
+
+ 02 +
+
+ 03 +
+
+ 04 +
+
+ 05 +
+
+ 06 +
+
+ 07 +
+
+ 08 +
+
+ 09 +
+
+ 10 +
+
+ 11 +
+
+ 12 +
+
+
+
+
+
+ 01 +
+
+ 02 +
+
+ 03 +
+
+ 04 +
+
+ 05 +
+
+ 06 +
+
+ 07 +
+
+ 08 +
+
+ 09 +
+
+ 10 +
+
+ 11 +
+
+ 12 +
+
+ 13 +
+
+ 14 +
+
+ 15 +
+
+ 16 +
+
+ 17 +
+
+ 18 +
+
+ 19 +
+
+ 20 +
+
+ 21 +
+
+ 22 +
+
+ 23 +
+
+ 24 +
+
+ 25 +
+
+ 26 +
+
+ 27 +
+
+ 28 +
+
+ 29 +
+
+ 30 +
+
+ 31 +
+
+
+
+
+
+
+
+`; diff --git a/src/packages/datepickerview/__test__/datepickerview.spec.tsx b/src/packages/datepickerview/__test__/datepickerview.spec.tsx index cd30db2062..1900e67242 100644 --- a/src/packages/datepickerview/__test__/datepickerview.spec.tsx +++ b/src/packages/datepickerview/__test__/datepickerview.spec.tsx @@ -3,7 +3,151 @@ import { render } from '@testing-library/react' import '@testing-library/jest-dom' import { DatePickerView } from '../datepickerview' -test('should match snapshot', () => { - const { container } = render() - expect(container).toMatchSnapshot() +const currentYear = new Date().getFullYear() +test('Show Chinese', async () => { + const { container } = render( + + ) + + expect( + container.querySelectorAll('.nut-pickerview-roller-item')[0] + ).toHaveTextContent('年') +}) + +test('Min date & Max date', async () => { + const { container, rerender } = render( + + ) + + const columns = container.querySelectorAll('.nut-pickerview-list') + const lists = columns[0].querySelectorAll('.nut-pickerview-roller-item-tiled') + expect(lists.length).toBe(3) + rerender( + + ) + rerender( + + ) + rerender( + + ) + rerender( + + ) + const formatter = (type: string, option: any) => { + switch (type) { + case 'year': + option.label += '' + break + case 'month': + option.label += 'M' + break + case 'day': + option.label += 'D' + break + case 'hour': + option.label += 'H' + break + case 'minute': + option.label += 'M' + break + default: + option.label += '' + } + return option + } + rerender( + + ) +}) + +test('Increment step setting', async () => { + const { container } = render( + + ) + + const columns = container.querySelectorAll('.nut-pickerview-list') + const lists = columns[1].querySelectorAll('.nut-pickerview-roller-item') + expect(lists.length).toBe(12) +}) + +test('Filter Time', async () => { + const filter = vi.fn((type, options) => { + if (type === 'hour') { + return options.filter((option: any) => Number(option.value) % 6 === 0) + } + return options + }) + + const { container } = render( + + ) + + const columns = container.querySelectorAll('.nut-pickerview-list') + const lists = columns[3].querySelectorAll('.nut-pickerview-roller-item') + expect(lists.length).toBe(4) }) From 29a6b47c3bb32d44d3c6d4fd0097171ddbe34064 Mon Sep 17 00:00:00 2001 From: songchenglin3 <353833373@qq.com> Date: Thu, 27 Feb 2025 16:24:40 +0800 Subject: [PATCH 08/26] fix: update doc --- src/config.json | 2 +- src/packages/datepickerview/doc.en-US.md | 43 ++++++++++++++++++++++ src/packages/datepickerview/doc.md | 41 +++++++++++++-------- src/packages/datepickerview/doc.taro.md | 47 ++++++++++++++++++++++++ src/packages/datepickerview/doc.zh-TW.md | 47 ++++++++++++++++++++++++ 5 files changed, 164 insertions(+), 16 deletions(-) create mode 100644 src/packages/datepickerview/doc.en-US.md create mode 100644 src/packages/datepickerview/doc.taro.md create mode 100644 src/packages/datepickerview/doc.zh-TW.md diff --git a/src/config.json b/src/config.json index cad2ede234..e4841b664d 100644 --- a/src/config.json +++ b/src/config.json @@ -645,7 +645,7 @@ "version": "3.0.0", "name": "DatePickerView", "type": "component", - "cName": "选择器视图", + "cName": "日期选择器视图", "desc": "DatePickerView 是 DatePicker 的内容区域", "sort": 16, "show": true, diff --git a/src/packages/datepickerview/doc.en-US.md b/src/packages/datepickerview/doc.en-US.md new file mode 100644 index 0000000000..03ab86f457 --- /dev/null +++ b/src/packages/datepickerview/doc.en-US.md @@ -0,0 +1,43 @@ +# DatePicker + +Used to select time, support date and time dimensions. + +## Import + +```tsx +import { DatePickerView } from '@nutui/nutui' +``` + +### Choose Date + +:::demo + + + +::: + +### Choose Month-Day + +:::demo + + + +::: + +## DatePicker + +### Props + +| Property | Description | Type | Default | +| --- | --- | --- | --- | +| defaultValue | Default date | `Date` | `null` | +| value | controlled date | `Date` | `null` | +| type | Can be set to date time year-month month-day datehour hour-minutes | `string` | `date` | +| minuteStep | Option minute step | `number` | `1` | +| showChinese | Show Chinese | `boolean` | `false` | +| startDate | Start date | `Date` | `Ten years ago on January 1` | +| endDate | End date | `Date` | `Ten years later on December 31` | +| formatter | Option text formatter | `(type: string, option: PickerOption) => PickerOption` | `-` | +| filter | Option filter | `(type: string, options: PickerOptions) => PickerOptions` | `-` | +| threeDimensional | Turn on 3D effects | `boolean` | `true` | +| onChange | Emitted when current option changed. | `(options, value, index) => void` | `-` | diff --git a/src/packages/datepickerview/doc.md b/src/packages/datepickerview/doc.md index 3ed0771ca6..fa1e52b734 100644 --- a/src/packages/datepickerview/doc.md +++ b/src/packages/datepickerview/doc.md @@ -1,16 +1,16 @@ -# DatePickerView 选择器视图 +# DatePickerView 日期选择器视图 -DatePickerView 是 DatePicker 的内容区域 +时间选择器,支持日期、年月、时分等维度。 ## 引入 ```tsx -import { name } from '@nutui/nutui-react' +import { DatePickerView } from '@nutui/nutui' ``` ## 示例代码 -### 基础用法 +### 选择日期 :::demo @@ -18,19 +18,30 @@ import { name } from '@nutui/nutui-react' ::: -## DatePickerView +### 选择月日 -### Props +通过 type 属性来定义需要选择的时间类型。将 type 设置为 year-month 即可选择年份和月份,设置为 month-day 即可选择月份和日期。 -| 属性 | 说明 | 类型 | 默认值 | -| --- | --- | --- | --- | -| name | 图标名 | String | - | +:::demo + + -## 主题定制 +::: + +## DatePicker -### 样式变量 +### Props -组件提供了下列 CSS 变量,可用于自定义样式,使用方法请参考 [ConfigProvider 组件](#/zh-CN/component/configprovider)。 -| 名称 | 说明 | 默认值 | -| --- | --- | --- | -| --nutui-datepickerview-height | badge 的高度 | `14px` | +| 属性 | 说明 | 类型 | 默认值 | +| --- | --- | --- | --- | +| defaultValue | 初始值 | `Date` | `null` | +| value | 受控 | `Date` | `null` | +| type | 类时间类型,可选值 date time year-month month-day datehour datetime hour-minutes | `string` | `date` | +| minuteStep | 分钟步进值 | `number` | `1` | +| showChinese | 每列是否展示中文 | `boolean` | `false` | +| startDate | 开始日期 | `Date` | `十年前` | +| endDate | 结束日期 | `Date` | `十年后` | +| formatter | 选项格式化函数 | `(type: string, option: PickerOption) => PickerOption` | `-` | +| filter | 选项过滤函数 | `(type: string, options: PickerOptions) => PickerOptions` | `-` | +| threeDimensional | 是否开启3D效果 | `boolean` | `true` | +| onChange | 选项改变时触发 | `(options, value, index) => void` | `-` | diff --git a/src/packages/datepickerview/doc.taro.md b/src/packages/datepickerview/doc.taro.md new file mode 100644 index 0000000000..e68ed5b298 --- /dev/null +++ b/src/packages/datepickerview/doc.taro.md @@ -0,0 +1,47 @@ +# DatePickerView 日期选择器视图 + +时间选择器,支持日期、年月、时分等维度。 + +## 引入 + +```tsx +import { DatePickerView } from '@nutui/nutui-taro' +``` + +## 示例代码 + +### 选择日期 + +:::demo + + + +::: + +### 选择月日 + +通过 type 属性来定义需要选择的时间类型。将 type 设置为 year-month 即可选择年份和月份,设置为 month-day 即可选择月份和日期。 + +:::demo + + + +::: + +## DatePicker + +### Props + +| 属性 | 说明 | 类型 | 默认值 | +| --- | --- | --- | --- | +| defaultValue | 初始值 | `Date` | `null` | +| value | 受控 | `Date` | `null` | +| type | 类时间类型,可选值 date time year-month month-day datehour datetime hour-minutes | `string` | `date` | +| minuteStep | 分钟步进值 | `number` | `1` | +| showChinese | 每列是否展示中文 | `boolean` | `false` | +| startDate | 开始日期 | `Date` | `十年前` | +| endDate | 结束日期 | `Date` | `十年后` | +| formatter | 选项格式化函数 | `(type: string, option: PickerOption) => PickerOption` | `-` | +| filter | 选项过滤函数 | `(type: string, options: PickerOptions) => PickerOptions` | `-` | +| threeDimensional | 是否开启3D效果 | `boolean` | `true` | +| onChange | 选项改变时触发 | `(options, value, index) => void` | `-` | diff --git a/src/packages/datepickerview/doc.zh-TW.md b/src/packages/datepickerview/doc.zh-TW.md new file mode 100644 index 0000000000..e24427b108 --- /dev/null +++ b/src/packages/datepickerview/doc.zh-TW.md @@ -0,0 +1,47 @@ +# DatePickerView 日期选择器視圖 + +時間選擇器,支持日期、年月、時分等維度。 + +## 引入 + +```tsx +import { DatePickerView } from '@nutui/nutui' +``` + +## 示例代碼 + +### 選擇日期 + +:::demo + + + +::: + +### 選擇月日 + +通過 type 屬性來定義需要選擇的時間類型。將 type 設置為 year-month 即可選擇年份和月份,設置為 month-day 即可選擇月份和日期。 + +:::demo + + + +::: + +## DatePicker + +### Props + +| 屬性 | 說明 | 類型 | 默認值 | +| --- | --- | --- | --- | +| defaultValue | 初始值 | `Date` | `null` | +| value | 受控 | `Date` | `null` | +| type | 類時間類型,可選值 date time year-month month-day datehour datetime hour-minutes | `string` | `date` | +| minuteStep | 分鐘步進值 | `number` | `1` | +| showChinese | 每列是否展示中文 | `boolean` | `false` | +| startDate | 開始日期 | `Date` | `十年前` | +| endDate | 結束日期 | `Date` | `十年後` | +| formatter | 選項格式化函數 | `(type: string, option: PickerOption) => PickerOption` | `-` | +| filter | 選項過濾函數 | `(type: string, options: PickerOptions) => PickerOptions` | `-` | +| threeDimensional | 是否開啟3D效果 | `boolean` | `true` | +| onChange | 選項改變時觸發 | `(options, value, index) => void` | `-` | From 381f1134217168c707aa61b547dade0472a19faa Mon Sep 17 00:00:00 2001 From: songchenglin3 <353833373@qq.com> Date: Thu, 27 Feb 2025 16:36:02 +0800 Subject: [PATCH 09/26] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E6=AF=94?= =?UTF-8?q?=E8=BE=83=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/packages/datepicker/datepicker.taro.tsx | 11 +++++++---- src/packages/datepicker/datepicker.tsx | 13 ++++++++----- src/packages/datepickerview/datepickerview.taro.tsx | 4 +--- src/packages/datepickerview/datepickerview.tsx | 4 +--- 4 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/packages/datepicker/datepicker.taro.tsx b/src/packages/datepicker/datepicker.taro.tsx index 4cf3c985eb..b2930962b0 100644 --- a/src/packages/datepicker/datepicker.taro.tsx +++ b/src/packages/datepicker/datepicker.taro.tsx @@ -4,6 +4,8 @@ import React, { ForwardRefRenderFunction, useImperativeHandle, } from 'react' +import isEqual from 'react-fast-compare' +import classNames from 'classnames' import { View } from '@tarojs/components' import Picker from '@/packages/picker/index.taro' import { useConfig } from '@/packages/configprovider/index.taro' @@ -77,6 +79,9 @@ const InternalPicker: ForwardRefRenderFunction< seconds: lang.seconds, } + const classPrefix = 'nut-datepicker' + const cls = classNames(classPrefix, className) + const [pickerValue, setPickerValue] = useState([]) const [pickerOptions, setPickerOptions] = useState([]) @@ -111,9 +116,8 @@ const InternalPicker: ForwardRefRenderFunction< selectedOptions: PickerOptions, index: number ) => { - const isEqual = new Date(innerDate)?.getTime() === newDate?.getTime() if (newDate && isDate(newDate)) { - if (!isEqual) { + if (!isEqual(new Date(selectedDate)?.getTime(), newDate?.getTime())) { setInnerDate(formatValue(newDate, startDate, endDate)) } onChange?.( @@ -130,8 +134,7 @@ const InternalPicker: ForwardRefRenderFunction< const handleConfirmDateComparison = (newDate: Date | null) => { if (newDate && isDate(newDate)) { - const isEqual = new Date(selectedDate)?.getTime() === newDate?.getTime() - if (!isEqual) { + if (!isEqual(new Date(selectedDate)?.getTime(), newDate?.getTime())) { setSelectedDate(formatValue(newDate, startDate, endDate)) } } diff --git a/src/packages/datepicker/datepicker.tsx b/src/packages/datepicker/datepicker.tsx index 3881dc8122..5aaf58fcee 100644 --- a/src/packages/datepicker/datepicker.tsx +++ b/src/packages/datepicker/datepicker.tsx @@ -4,6 +4,8 @@ import React, { ForwardRefRenderFunction, useImperativeHandle, } from 'react' +import isEqual from 'react-fast-compare' +import classNames from 'classnames' import Picker from '@/packages/picker' import { useConfig } from '@/packages/configprovider' import { usePropsValue } from '@/hooks/use-props-value' @@ -75,6 +77,9 @@ const InternalPicker: ForwardRefRenderFunction< seconds: lang.seconds, } + const classPrefix = 'nut-datepicker' + const cls = classNames(classPrefix, className) + const [pickerValue, setPickerValue] = useState([]) const [pickerOptions, setPickerOptions] = useState([]) @@ -109,9 +114,8 @@ const InternalPicker: ForwardRefRenderFunction< selectedOptions: PickerOptions, index: number ) => { - const isEqual = new Date(innerDate)?.getTime() === newDate?.getTime() if (newDate && isDate(newDate)) { - if (!isEqual) { + if (!isEqual(new Date(selectedDate)?.getTime(), newDate?.getTime())) { setInnerDate(formatValue(newDate, startDate, endDate)) } onChange?.( @@ -128,8 +132,7 @@ const InternalPicker: ForwardRefRenderFunction< const handleConfirmDateComparison = (newDate: Date | null) => { if (newDate && isDate(newDate)) { - const isEqual = new Date(selectedDate)?.getTime() === newDate?.getTime() - if (!isEqual) { + if (!isEqual(new Date(selectedDate)?.getTime(), newDate?.getTime())) { setSelectedDate(formatValue(newDate, startDate, endDate)) } } @@ -221,7 +224,7 @@ const InternalPicker: ForwardRefRenderFunction< return ( <> {typeof children === 'function' && children(selectedDate)} -
+
{pickerOptions.length && ( { - const isEqual = new Date(selectedDate)?.getTime() === newDate?.getTime() if (newDate && isDate(newDate)) { - if (!isEqual) { + if (!isEqual(new Date(selectedDate)?.getTime(), newDate?.getTime())) { setSelectedDate(formatValue(newDate, startDate, endDate)) onChange?.( selectedOptions, @@ -152,7 +151,6 @@ export const DatePickerView: FunctionComponent< } useEffect(() => { - console.log(new Date(selectedDate).toLocaleDateString()) if ( !isEqual( new Date(selectedDate)?.getTime(), diff --git a/src/packages/datepickerview/datepickerview.tsx b/src/packages/datepickerview/datepickerview.tsx index c36db43827..1f7ce7960d 100644 --- a/src/packages/datepickerview/datepickerview.tsx +++ b/src/packages/datepickerview/datepickerview.tsx @@ -81,9 +81,8 @@ export const DatePickerView: FunctionComponent< selectedOptions: PickerOptions, index: number ) => { - const isEqual = new Date(selectedDate)?.getTime() === newDate?.getTime() if (newDate && isDate(newDate)) { - if (!isEqual) { + if (!isEqual(new Date(selectedDate)?.getTime(), newDate?.getTime())) { setSelectedDate(formatValue(newDate, startDate, endDate)) onChange?.( selectedOptions, @@ -151,7 +150,6 @@ export const DatePickerView: FunctionComponent< } useEffect(() => { - console.log(new Date(selectedDate).toLocaleDateString()) if ( !isEqual( new Date(selectedDate)?.getTime(), From 9df16f9b98b30cb9af8cbe5ddb4dd8a111654549 Mon Sep 17 00:00:00 2001 From: songsong <353833373@qq.com> Date: Thu, 27 Feb 2025 18:31:27 +0800 Subject: [PATCH 10/26] chore: upgrade the jdharmonycpp version (#3028) --- packages/nutui-taro-demo/package.json | 2 +- pnpm-lock.yaml | 244 ++++++++++++++++++-------- 2 files changed, 176 insertions(+), 70 deletions(-) diff --git a/packages/nutui-taro-demo/package.json b/packages/nutui-taro-demo/package.json index 50a82a8f65..fec610a766 100644 --- a/packages/nutui-taro-demo/package.json +++ b/packages/nutui-taro-demo/package.json @@ -60,7 +60,7 @@ "@dongdesign/inject-jd-platform-styles": "1.0.4", "@jdtaro/plugin-platform-jdhybrid": "0.2.1", "@jdtaro/taro-platform-jdharmony": "2.0.70", - "@jdtaro/plugin-platform-jdharmony-cpp": "0.1.22", + "@jdtaro/plugin-platform-jdharmony-cpp": "0.1.27", "@nutui/replace-icons": "^1.0.0", "@nutui/touch-emulator": "^1.0.0", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.11", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4b0dcedc55..ad2c9c709b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -107,22 +107,22 @@ importers: version: 1.10.4(@swc/helpers@0.5.15) '@tarojs/components': specifier: 4.0.8-beta.1 - version: 4.0.8-beta.1(@tarojs/helper@4.0.8-beta.1(@swc/helpers@0.5.15))(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(postcss@8.4.49)(react@18.3.1)(rollup@4.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))) + version: 4.0.8-beta.1(@tarojs/helper@4.0.9(@swc/helpers@0.5.15))(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(postcss@8.4.49)(react@18.3.1)(rollup@4.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))) '@tarojs/plugin-platform-alipay': specifier: 4.0.8-beta.1 - version: 4.0.8-beta.1(@tarojs/service@4.0.8-beta.1(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1) + version: 4.0.8-beta.1(@tarojs/service@4.0.9(@swc/helpers@0.5.15))(@tarojs/shared@4.0.9) '@tarojs/plugin-platform-jd': specifier: 4.0.8-beta.1 - version: 4.0.8-beta.1(@tarojs/service@4.0.8-beta.1(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1) + version: 4.0.8-beta.1(@tarojs/service@4.0.9(@swc/helpers@0.5.15))(@tarojs/shared@4.0.9) '@tarojs/plugin-platform-weapp': specifier: 4.0.8-beta.1 - version: 4.0.8-beta.1(@tarojs/service@4.0.8-beta.1(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1) + version: 4.0.8-beta.1(@tarojs/service@4.0.9(@swc/helpers@0.5.15))(@tarojs/shared@4.0.9) '@tarojs/react': specifier: 4.0.8-beta.1 version: 4.0.8-beta.1(react@18.3.1) '@tarojs/taro': specifier: 4.0.8-beta.1 - version: 4.0.8-beta.1(@tarojs/components@4.0.8-beta.1(@tarojs/helper@4.0.8-beta.1(@swc/helpers@0.5.15))(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(postcss@8.4.49)(react@18.3.1)(rollup@4.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(@tarojs/helper@4.0.8-beta.1(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1)(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(postcss@8.4.49)(rollup@4.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))) + version: 4.0.8-beta.1(@tarojs/components@4.0.8-beta.1(@tarojs/helper@4.0.9(@swc/helpers@0.5.15))(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(postcss@8.4.49)(react@18.3.1)(rollup@4.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(@tarojs/helper@4.0.9(@swc/helpers@0.5.15))(@tarojs/shared@4.0.9)(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(postcss@8.4.49)(rollup@4.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))) '@testing-library/jest-dom': specifier: ^6.4.2 version: 6.6.3 @@ -548,25 +548,25 @@ importers: version: 4.0.8-beta.1(@tarojs/helper@4.0.8-beta.1(@swc/helpers@0.5.15))(@tarojs/runtime@4.0.8-beta.1)(@tarojs/shared@4.0.8-beta.1) '@tarojs/plugin-platform-alipay': specifier: 4.0.8-beta.1 - version: 4.0.8-beta.1(@tarojs/service@4.0.8-beta.1(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1) + version: 4.0.8-beta.1(@tarojs/service@4.0.9(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1) '@tarojs/plugin-platform-h5': specifier: 4.0.8-beta.1 version: 4.0.8-beta.1(31635786561422ef85b36f9130e58fd5) '@tarojs/plugin-platform-jd': specifier: 4.0.8-beta.1 - version: 4.0.8-beta.1(@tarojs/service@4.0.8-beta.1(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1) + version: 4.0.8-beta.1(@tarojs/service@4.0.9(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1) '@tarojs/plugin-platform-qq': specifier: 4.0.8-beta.1 - version: 4.0.8-beta.1(@tarojs/plugin-platform-weapp@4.0.8-beta.1(@tarojs/service@4.0.8-beta.1(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1))(@tarojs/shared@4.0.8-beta.1) + version: 4.0.8-beta.1(@tarojs/plugin-platform-weapp@4.0.8-beta.1(@tarojs/service@4.0.9(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1))(@tarojs/shared@4.0.8-beta.1) '@tarojs/plugin-platform-swan': specifier: 4.0.8-beta.1 - version: 4.0.8-beta.1(@tarojs/service@4.0.8-beta.1(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1) + version: 4.0.8-beta.1(@tarojs/service@4.0.9(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1) '@tarojs/plugin-platform-tt': specifier: 4.0.8-beta.1 - version: 4.0.8-beta.1(@tarojs/service@4.0.8-beta.1(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1) + version: 4.0.8-beta.1(@tarojs/service@4.0.9(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1) '@tarojs/plugin-platform-weapp': specifier: 4.0.8-beta.1 - version: 4.0.8-beta.1(@tarojs/service@4.0.8-beta.1(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1) + version: 4.0.8-beta.1(@tarojs/service@4.0.9(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1) '@tarojs/react': specifier: 4.0.8-beta.1 version: 4.0.8-beta.1(react@18.3.1) @@ -2937,25 +2937,25 @@ packages: '@tarojs/shared': 4.0.8-beta.1 '@tarojs/binding-darwin-arm64@4.0.8-beta.1': - resolution: {integrity: sha512-+uZyAnNzJS7SZDiq2dfz6CpsLfJQbvu2IkSfpvzBbUVkCx1aVBcJyd3KOfj/2XyKtmy7KL6/ErE5dCAlyZHZYQ==, tarball: https://registry.npmjs.org/@tarojs/binding-darwin-arm64/-/binding-darwin-arm64-4.0.8-beta.1.tgz} + resolution: {integrity: sha512-+uZyAnNzJS7SZDiq2dfz6CpsLfJQbvu2IkSfpvzBbUVkCx1aVBcJyd3KOfj/2XyKtmy7KL6/ErE5dCAlyZHZYQ==} engines: {node: '>= 18'} cpu: [arm64] os: [darwin] '@tarojs/binding-darwin-x64@4.0.8-beta.1': - resolution: {integrity: sha512-8PfLles6fInzsX2CFA7ER9W3IxJaCDrzg2QT0Bf9ojK1mhAkM3arPxF1cLcFUh1qy4CcE10ffuFRuLADly9ftQ==, tarball: https://registry.npmjs.org/@tarojs/binding-darwin-x64/-/binding-darwin-x64-4.0.8-beta.1.tgz} + resolution: {integrity: sha512-8PfLles6fInzsX2CFA7ER9W3IxJaCDrzg2QT0Bf9ojK1mhAkM3arPxF1cLcFUh1qy4CcE10ffuFRuLADly9ftQ==} engines: {node: '>= 18'} cpu: [x64] os: [darwin] '@tarojs/binding-linux-x64-gnu@4.0.8-beta.1': - resolution: {integrity: sha512-GOb/Y0Oio+ZWuKV/m/H8B+w/B1TfEMm7XkGUYCaMCh6k1Shib6rNTJU/pFciNnGJmzAH1vkD8/9MIK5SAB/dDQ==, tarball: https://registry.npmjs.org/@tarojs/binding-linux-x64-gnu/-/binding-linux-x64-gnu-4.0.8-beta.1.tgz} + resolution: {integrity: sha512-GOb/Y0Oio+ZWuKV/m/H8B+w/B1TfEMm7XkGUYCaMCh6k1Shib6rNTJU/pFciNnGJmzAH1vkD8/9MIK5SAB/dDQ==} engines: {node: '>= 18'} cpu: [x64] os: [linux] '@tarojs/binding-win32-x64-msvc@4.0.8-beta.1': - resolution: {integrity: sha512-+a7zei9n7lWA2HbHvNgqQ/fwhFapnuGwffeALVpNKNLDtXKXUInmuHdyhBDqMeBov4ilzL26XjZt7phar0lYuQ==, tarball: https://registry.npmjs.org/@tarojs/binding-win32-x64-msvc/-/binding-win32-x64-msvc-4.0.8-beta.1.tgz} + resolution: {integrity: sha512-+a7zei9n7lWA2HbHvNgqQ/fwhFapnuGwffeALVpNKNLDtXKXUInmuHdyhBDqMeBov4ilzL26XjZt7phar0lYuQ==} engines: {node: '>= 18'} cpu: [x64] os: [win32] @@ -3004,67 +3004,71 @@ packages: resolution: {integrity: sha512-47RBazAoiRjhyr44ND5ZKnfTQ/+G4xPEyG+4CrMnFydV7M+AtgWr2SfTbew4h/ChJEC7AZDNr9bWbQAwlQqUTg==} engines: {node: '>= 18'} + '@tarojs/helper@4.0.9': + resolution: {integrity: sha512-+fCnoRUNMqoGI1+OALQH4whQPiVfcX7vzCvm5w/bA0LFRPMux0rdjWa91agEpfoJHDr7bYdhkYbLFbdGWabVxQ==} + engines: {node: '>= 18'} + '@tarojs/parse-css-to-stylesheet-android-arm-eabi@0.0.69': - resolution: {integrity: sha512-xfn55ehFWjbIzDTu+0QwMkCf8icC7jwAiDm2S7Cv5Og83gSzMUCb76KzEAwgTSTe0wiLrDai2HAhBftpE4V1Qw==, tarball: https://registry.npmjs.org/@tarojs/parse-css-to-stylesheet-android-arm-eabi/-/parse-css-to-stylesheet-android-arm-eabi-0.0.69.tgz} + resolution: {integrity: sha512-xfn55ehFWjbIzDTu+0QwMkCf8icC7jwAiDm2S7Cv5Og83gSzMUCb76KzEAwgTSTe0wiLrDai2HAhBftpE4V1Qw==} engines: {node: '>= 10'} cpu: [arm] os: [android] '@tarojs/parse-css-to-stylesheet-android-arm64@0.0.69': - resolution: {integrity: sha512-ojVo41qGp+/NUaGGXuuT2/bc0K4H1vzvindeYpUj6LkGL0gQSitdXnviYEnUFqfrMvn7bx1wKTy3uLtADqxgPQ==, tarball: https://registry.npmjs.org/@tarojs/parse-css-to-stylesheet-android-arm64/-/parse-css-to-stylesheet-android-arm64-0.0.69.tgz} + resolution: {integrity: sha512-ojVo41qGp+/NUaGGXuuT2/bc0K4H1vzvindeYpUj6LkGL0gQSitdXnviYEnUFqfrMvn7bx1wKTy3uLtADqxgPQ==} engines: {node: '>= 10'} cpu: [arm64] os: [android] '@tarojs/parse-css-to-stylesheet-darwin-arm64@0.0.69': - resolution: {integrity: sha512-xtk3WmfYKvlTxGgxjz6DSqcKmRxXRPG+1bINvvOmcQYbOZtl9cw6X4fC/B204SEv06uC8MYaUZ0z0AbjGzZFrA==, tarball: https://registry.npmjs.org/@tarojs/parse-css-to-stylesheet-darwin-arm64/-/parse-css-to-stylesheet-darwin-arm64-0.0.69.tgz} + resolution: {integrity: sha512-xtk3WmfYKvlTxGgxjz6DSqcKmRxXRPG+1bINvvOmcQYbOZtl9cw6X4fC/B204SEv06uC8MYaUZ0z0AbjGzZFrA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] '@tarojs/parse-css-to-stylesheet-darwin-universal@0.0.69': - resolution: {integrity: sha512-AkXvr4bVy1a8d0xOXxhc05352ubTU2G6h4t1RFuzYJLzMBbQWAI60iHcSaCWhkuV9HUl+3UXv0NoW0NkXq19cw==, tarball: https://registry.npmjs.org/@tarojs/parse-css-to-stylesheet-darwin-universal/-/parse-css-to-stylesheet-darwin-universal-0.0.69.tgz} + resolution: {integrity: sha512-AkXvr4bVy1a8d0xOXxhc05352ubTU2G6h4t1RFuzYJLzMBbQWAI60iHcSaCWhkuV9HUl+3UXv0NoW0NkXq19cw==} engines: {node: '>= 10'} os: [darwin] '@tarojs/parse-css-to-stylesheet-darwin-x64@0.0.69': - resolution: {integrity: sha512-3CTu0tXFZ7aLONaIdrZibKqYUD5IyivF6wfE9CYNEbkkxZoJU29dJ2o9kfVpcxFwKq/4BuH1TKWGYCiCOSyo4g==, tarball: https://registry.npmjs.org/@tarojs/parse-css-to-stylesheet-darwin-x64/-/parse-css-to-stylesheet-darwin-x64-0.0.69.tgz} + resolution: {integrity: sha512-3CTu0tXFZ7aLONaIdrZibKqYUD5IyivF6wfE9CYNEbkkxZoJU29dJ2o9kfVpcxFwKq/4BuH1TKWGYCiCOSyo4g==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] '@tarojs/parse-css-to-stylesheet-linux-arm-gnueabihf@0.0.69': - resolution: {integrity: sha512-LFx3R8X/JXrBeNnlJOgvOxPTaWF7kUl6NMbOUWQbIfx/opqducTVAqrRF9ev1pYlbkRoQpabls8Z21LXDuYaaw==, tarball: https://registry.npmjs.org/@tarojs/parse-css-to-stylesheet-linux-arm-gnueabihf/-/parse-css-to-stylesheet-linux-arm-gnueabihf-0.0.69.tgz} + resolution: {integrity: sha512-LFx3R8X/JXrBeNnlJOgvOxPTaWF7kUl6NMbOUWQbIfx/opqducTVAqrRF9ev1pYlbkRoQpabls8Z21LXDuYaaw==} engines: {node: '>= 10'} cpu: [arm] os: [linux] '@tarojs/parse-css-to-stylesheet-linux-arm64-gnu@0.0.69': - resolution: {integrity: sha512-nKlCyYz8NUVI7P8qS3j3tq49ZesGKgoXt3WH5iNPT1PEflxuSgA9T6UcPtUy0X/RolOF6p5Gd/UyhxcY2dUg+A==, tarball: https://registry.npmjs.org/@tarojs/parse-css-to-stylesheet-linux-arm64-gnu/-/parse-css-to-stylesheet-linux-arm64-gnu-0.0.69.tgz} + resolution: {integrity: sha512-nKlCyYz8NUVI7P8qS3j3tq49ZesGKgoXt3WH5iNPT1PEflxuSgA9T6UcPtUy0X/RolOF6p5Gd/UyhxcY2dUg+A==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] '@tarojs/parse-css-to-stylesheet-linux-arm64-musl@0.0.69': - resolution: {integrity: sha512-bYODGCEx1Ni4EMNuZU95IUPqVZAXsY9gIc5CPSfKQ2j167Vbeo/gskQk/uNVjmnYJ69PplgJ9npylINgLIPIrA==, tarball: https://registry.npmjs.org/@tarojs/parse-css-to-stylesheet-linux-arm64-musl/-/parse-css-to-stylesheet-linux-arm64-musl-0.0.69.tgz} + resolution: {integrity: sha512-bYODGCEx1Ni4EMNuZU95IUPqVZAXsY9gIc5CPSfKQ2j167Vbeo/gskQk/uNVjmnYJ69PplgJ9npylINgLIPIrA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] '@tarojs/parse-css-to-stylesheet-linux-x64-gnu@0.0.69': - resolution: {integrity: sha512-89f03s+txGJ1c8Zc6Ib4qTAP4YhfFbVFq29XExqbC7eGvpQl5DeOtwonO5DBwMc7lA+LG4b1Q4CMXE3qodn2eA==, tarball: https://registry.npmjs.org/@tarojs/parse-css-to-stylesheet-linux-x64-gnu/-/parse-css-to-stylesheet-linux-x64-gnu-0.0.69.tgz} + resolution: {integrity: sha512-89f03s+txGJ1c8Zc6Ib4qTAP4YhfFbVFq29XExqbC7eGvpQl5DeOtwonO5DBwMc7lA+LG4b1Q4CMXE3qodn2eA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] '@tarojs/parse-css-to-stylesheet-linux-x64-musl@0.0.69': - resolution: {integrity: sha512-vyewIf1KysXYNIJdkzc9JSPguTG9zD65Belk3H186mLR18KtsvrqNqlWnP8kKfduF4ixh6qt0F2PkKbeI9PZvg==, tarball: https://registry.npmjs.org/@tarojs/parse-css-to-stylesheet-linux-x64-musl/-/parse-css-to-stylesheet-linux-x64-musl-0.0.69.tgz} + resolution: {integrity: sha512-vyewIf1KysXYNIJdkzc9JSPguTG9zD65Belk3H186mLR18KtsvrqNqlWnP8kKfduF4ixh6qt0F2PkKbeI9PZvg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] '@tarojs/parse-css-to-stylesheet-win32-x64-msvc@0.0.69': - resolution: {integrity: sha512-CHKlVjAiSAZTFNV8GkfXV88Jy9yyFSvKBAO3++l2KSQUBUWmPX775FbH+god2BOLf5SfAXRPd0HVAEK9qNeHXQ==, tarball: https://registry.npmjs.org/@tarojs/parse-css-to-stylesheet-win32-x64-msvc/-/parse-css-to-stylesheet-win32-x64-msvc-0.0.69.tgz} + resolution: {integrity: sha512-CHKlVjAiSAZTFNV8GkfXV88Jy9yyFSvKBAO3++l2KSQUBUWmPX775FbH+god2BOLf5SfAXRPd0HVAEK9qNeHXQ==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -3074,60 +3078,60 @@ packages: engines: {node: '>= 10'} '@tarojs/plugin-doctor-darwin-arm64@0.0.13': - resolution: {integrity: sha512-BRqMB6jOflPIVdQEJ5vJ7j1OcEcgg65IPPY9YVNx5MnYE/SoZj6/yWvmDNc507ZEkWd4H1sJ4Jfk7eKUxm44PQ==, tarball: https://registry.npmjs.org/@tarojs/plugin-doctor-darwin-arm64/-/plugin-doctor-darwin-arm64-0.0.13.tgz} + resolution: {integrity: sha512-BRqMB6jOflPIVdQEJ5vJ7j1OcEcgg65IPPY9YVNx5MnYE/SoZj6/yWvmDNc507ZEkWd4H1sJ4Jfk7eKUxm44PQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] '@tarojs/plugin-doctor-darwin-universal@0.0.13': - resolution: {integrity: sha512-qIv94zgybce+Wq6/Bgy+Np+3BM2SYipuuKTg4LU3ALfJ+YxJetYDcbat9GPxulZqyvxKshYaYtusfwzCu+QWEw==, tarball: https://registry.npmjs.org/@tarojs/plugin-doctor-darwin-universal/-/plugin-doctor-darwin-universal-0.0.13.tgz} + resolution: {integrity: sha512-qIv94zgybce+Wq6/Bgy+Np+3BM2SYipuuKTg4LU3ALfJ+YxJetYDcbat9GPxulZqyvxKshYaYtusfwzCu+QWEw==} engines: {node: '>= 10'} os: [darwin] '@tarojs/plugin-doctor-darwin-x64@0.0.13': - resolution: {integrity: sha512-zjx3OGlcyOTr+VoRcFmQQcsXscwNucpynlhEYS3ZlofVe9qI0LeTMb/jbMriT/W0c1b4nlVaM8sv+HKz4NKUeA==, tarball: https://registry.npmjs.org/@tarojs/plugin-doctor-darwin-x64/-/plugin-doctor-darwin-x64-0.0.13.tgz} + resolution: {integrity: sha512-zjx3OGlcyOTr+VoRcFmQQcsXscwNucpynlhEYS3ZlofVe9qI0LeTMb/jbMriT/W0c1b4nlVaM8sv+HKz4NKUeA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] '@tarojs/plugin-doctor-linux-arm-gnueabihf@0.0.13': - resolution: {integrity: sha512-WkViXfZNrB7HRoDySNhm6JG1IaIBmYGWZDwz0BuhkDQPZLfCCy6v01rSo5wfHGdyLnDg6CkENBS1IrdIU9zK+A==, tarball: https://registry.npmjs.org/@tarojs/plugin-doctor-linux-arm-gnueabihf/-/plugin-doctor-linux-arm-gnueabihf-0.0.13.tgz} + resolution: {integrity: sha512-WkViXfZNrB7HRoDySNhm6JG1IaIBmYGWZDwz0BuhkDQPZLfCCy6v01rSo5wfHGdyLnDg6CkENBS1IrdIU9zK+A==} engines: {node: '>= 10'} cpu: [arm] os: [linux] '@tarojs/plugin-doctor-linux-arm64-gnu@0.0.13': - resolution: {integrity: sha512-C6ZjqhyOqBcI4y+BFXYjBHBZY6441fO5YIoMv3Sc+nAV+LR1vvyGJ95JcC+Vma+sEjxRMP0IO9lvcLRIcrbrsA==, tarball: https://registry.npmjs.org/@tarojs/plugin-doctor-linux-arm64-gnu/-/plugin-doctor-linux-arm64-gnu-0.0.13.tgz} + resolution: {integrity: sha512-C6ZjqhyOqBcI4y+BFXYjBHBZY6441fO5YIoMv3Sc+nAV+LR1vvyGJ95JcC+Vma+sEjxRMP0IO9lvcLRIcrbrsA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] '@tarojs/plugin-doctor-linux-arm64-musl@0.0.13': - resolution: {integrity: sha512-V1HnFITOLgHVyQ+OCa1oPFKOtGFRtP91vlbUGfOwMA4GeOVw9g28W/hfTyucTCkfZWlrssLehgW6L2AGAMXh2w==, tarball: https://registry.npmjs.org/@tarojs/plugin-doctor-linux-arm64-musl/-/plugin-doctor-linux-arm64-musl-0.0.13.tgz} + resolution: {integrity: sha512-V1HnFITOLgHVyQ+OCa1oPFKOtGFRtP91vlbUGfOwMA4GeOVw9g28W/hfTyucTCkfZWlrssLehgW6L2AGAMXh2w==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] '@tarojs/plugin-doctor-linux-x64-gnu@0.0.13': - resolution: {integrity: sha512-oetfzBW60uenPBBF4/NE6Mf0Iwkw1YGqIIBiN++aVQynbWrmMzWBsW8kleZ5vN1npxI9aud9EfRU1uM37DrG2A==, tarball: https://registry.npmjs.org/@tarojs/plugin-doctor-linux-x64-gnu/-/plugin-doctor-linux-x64-gnu-0.0.13.tgz} + resolution: {integrity: sha512-oetfzBW60uenPBBF4/NE6Mf0Iwkw1YGqIIBiN++aVQynbWrmMzWBsW8kleZ5vN1npxI9aud9EfRU1uM37DrG2A==} engines: {node: '>= 10'} cpu: [x64] os: [linux] '@tarojs/plugin-doctor-linux-x64-musl@0.0.13': - resolution: {integrity: sha512-OdIF/kFwwM0kQPDnpkanhvfWRaAI6EtDmpM9rQA/Lu2QcJq86w5d7X/WSN0U2xF1nialAUrfl79NyIaEzp4Fcw==, tarball: https://registry.npmjs.org/@tarojs/plugin-doctor-linux-x64-musl/-/plugin-doctor-linux-x64-musl-0.0.13.tgz} + resolution: {integrity: sha512-OdIF/kFwwM0kQPDnpkanhvfWRaAI6EtDmpM9rQA/Lu2QcJq86w5d7X/WSN0U2xF1nialAUrfl79NyIaEzp4Fcw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] '@tarojs/plugin-doctor-win32-ia32-msvc@0.0.13': - resolution: {integrity: sha512-nIbG2SliRhRwACLa1kNMskcfjsihp+3tZQMAxl+LoYUq6JRaWgP3vH2nHkDyZHTCheBTDtAaupqXWrYF3w+U6g==, tarball: https://registry.npmjs.org/@tarojs/plugin-doctor-win32-ia32-msvc/-/plugin-doctor-win32-ia32-msvc-0.0.13.tgz} + resolution: {integrity: sha512-nIbG2SliRhRwACLa1kNMskcfjsihp+3tZQMAxl+LoYUq6JRaWgP3vH2nHkDyZHTCheBTDtAaupqXWrYF3w+U6g==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] '@tarojs/plugin-doctor-win32-x64-msvc@0.0.13': - resolution: {integrity: sha512-G1mjsGzyeb4TPw7RoqOl4xPPhf5Lfp4BH9hjfBYbGM0RL5UFHmhfzvn2Icrriyk68v2GoQeHroZ2p6qAtbXdBw==, tarball: https://registry.npmjs.org/@tarojs/plugin-doctor-win32-x64-msvc/-/plugin-doctor-win32-x64-msvc-0.0.13.tgz} + resolution: {integrity: sha512-G1mjsGzyeb4TPw7RoqOl4xPPhf5Lfp4BH9hjfBYbGM0RL5UFHmhfzvn2Icrriyk68v2GoQeHroZ2p6qAtbXdBw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -3243,6 +3247,10 @@ packages: resolution: {integrity: sha512-x7xi9l2yq9WwupetxbbPP1DFzIptBxaznvrJ2TFHIgw+w3UZa3LuGcQah5ii1TSEkUXKqjkkx4IvaHNDc1atSQ==} engines: {node: '>= 18'} + '@tarojs/runner-utils@4.0.9': + resolution: {integrity: sha512-MRY7mGrMFdPtVL6iajO2a/2Oc7RVN1wGHzoR2ywDiyr5zWX6BSKo35HZuaCsmNg71wbVVBR5Ax4SiLe5dsQrjg==} + engines: {node: '>= 18'} + '@tarojs/runtime@4.0.8-beta.1': resolution: {integrity: sha512-+CX93bBHvedJwv/uUA+mSFXc4AVhujjIMP0fhPN91FUl+AYL4nxZzzJakNOEtPZGljN2XYRSZFnWKHF+glJsqA==} engines: {node: '>= 18'} @@ -3251,10 +3259,18 @@ packages: resolution: {integrity: sha512-DbIObz72QzJhxJM96RhaTPzml2Z0D26TKj3jBpRC8Q3jshvnwGQmhLlrFdVSB+gzGZKWsKxpgZxAZzMG1ILDRw==} engines: {node: '>= 18'} + '@tarojs/service@4.0.9': + resolution: {integrity: sha512-Nwb6/pdVttM1GLOJ4OKxcBeNwcYoPQNvSxvkGSyc5iH10BItT5fRv+/pkBABbHCWs/eMMGLHIzI3HzNUVYq9SA==} + engines: {node: '>= 18'} + '@tarojs/shared@4.0.8-beta.1': resolution: {integrity: sha512-DJAgcPxNI4678uNbyLABqKygsickAJ9aG9v9ctNYvtvlCBscRJlMoa0FASNn1Fm4mVgPKH/8KfSJr0frqIEVLw==} engines: {node: '>= 18'} + '@tarojs/shared@4.0.9': + resolution: {integrity: sha512-IJzlMysQte/X/46ETIN2wF/AuUbGBgPFrt5ALU6hQTyQuYHspAajYlzvgNPhvviVvkPpze+DF27ZpSa87Mk0vg==} + engines: {node: '>= 18'} + '@tarojs/taro-h5@4.0.8-beta.1': resolution: {integrity: sha512-D5ZFDGFDpDikpk7XQ1cIMwqkeVPXQAhNq3AoD5MGnmkhkl5kGA50lOdH9gPjGim+7FbETRtJ06J4yFM5NiyQ5Q==} peerDependencies: @@ -9638,7 +9654,7 @@ packages: react: '>=18' react-reconciler@0.29.0: - resolution: {integrity: sha512-wa0fGj7Zht1EYMRhKWwoo1H9GApxYLBuhoAuXN0TlltESAjDssB+Apf0T/DngVqaMyPypDmabL37vw/2aRM98Q==} + resolution: {integrity: sha512-wa0fGj7Zht1EYMRhKWwoo1H9GApxYLBuhoAuXN0TlltESAjDssB+Apf0T/DngVqaMyPypDmabL37vw/2aRM98Q==, tarball: https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.29.0.tgz} engines: {node: '>=0.10.0'} peerDependencies: react: ^18.2.0 @@ -14349,6 +14365,11 @@ snapshots: '@tarojs/runtime': 4.0.8-beta.1 '@tarojs/shared': 4.0.8-beta.1 + '@tarojs/api@4.0.8-beta.1(@tarojs/runtime@4.0.8-beta.1)(@tarojs/shared@4.0.9)': + dependencies: + '@tarojs/runtime': 4.0.8-beta.1 + '@tarojs/shared': 4.0.9 + '@tarojs/binding-darwin-arm64@4.0.8-beta.1': optional: true @@ -14393,12 +14414,12 @@ snapshots: - debug - supports-color - '@tarojs/components-advanced@4.0.8-beta.1(4f25aadf1f41180dc456fc4146f9c8c1)': + '@tarojs/components-advanced@4.0.8-beta.1(4db457bb1462e2d585a3bf6b20d34e61)': dependencies: - '@tarojs/components': 4.0.8-beta.1(@tarojs/helper@4.0.8-beta.1(@swc/helpers@0.5.15))(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(postcss@8.4.49)(react@18.3.1)(rollup@4.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))) + '@tarojs/components': 4.0.8-beta.1(@tarojs/helper@4.0.9(@swc/helpers@0.5.15))(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(postcss@8.4.49)(react@18.3.1)(rollup@4.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))) '@tarojs/runtime': 4.0.8-beta.1 '@tarojs/shared': 4.0.8-beta.1 - '@tarojs/taro': 4.0.8-beta.1(@tarojs/components@4.0.8-beta.1(@tarojs/helper@4.0.8-beta.1(@swc/helpers@0.5.15))(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(postcss@8.4.49)(react@18.3.1)(rollup@4.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(@tarojs/helper@4.0.8-beta.1(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1)(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(postcss@8.4.49)(rollup@4.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))) + '@tarojs/taro': 4.0.8-beta.1(@tarojs/components@4.0.8-beta.1(@tarojs/helper@4.0.9(@swc/helpers@0.5.15))(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(postcss@8.4.49)(react@18.3.1)(rollup@4.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(@tarojs/helper@4.0.9(@swc/helpers@0.5.15))(@tarojs/shared@4.0.9)(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(postcss@8.4.49)(rollup@4.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))) classnames: 2.5.1 csstype: 3.1.3 memoize-one: 6.0.0 @@ -14459,13 +14480,13 @@ snapshots: - webpack-chain - webpack-dev-server - '@tarojs/components@4.0.8-beta.1(@tarojs/helper@4.0.8-beta.1(@swc/helpers@0.5.15))(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(postcss@8.4.49)(react@18.3.1)(rollup@4.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15)))': + '@tarojs/components@4.0.8-beta.1(@tarojs/helper@4.0.8-beta.1(@swc/helpers@0.5.15))(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))))(postcss@8.4.49)(react@18.3.1)(rollup@3.29.5)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15)))': dependencies: '@stencil/core': 2.22.3 - '@tarojs/components-advanced': 4.0.8-beta.1(4f25aadf1f41180dc456fc4146f9c8c1) + '@tarojs/components-advanced': 4.0.8-beta.1(a401d440388d8a660a222e0f935754ff) '@tarojs/runtime': 4.0.8-beta.1 '@tarojs/shared': 4.0.8-beta.1 - '@tarojs/taro': 4.0.8-beta.1(@tarojs/components@4.0.8-beta.1(@tarojs/helper@4.0.8-beta.1(@swc/helpers@0.5.15))(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(postcss@8.4.49)(react@18.3.1)(rollup@4.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(@tarojs/helper@4.0.8-beta.1(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1)(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(postcss@8.4.49)(rollup@4.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))) + '@tarojs/taro': 4.0.8-beta.1(@tarojs/components@4.0.8-beta.1(@tarojs/helper@4.0.8-beta.1(@swc/helpers@0.5.15))(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))))(postcss@8.4.49)(react@18.3.1)(rollup@3.29.5)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))))(@tarojs/helper@4.0.8-beta.1(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1)(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))))(postcss@8.4.49)(rollup@3.29.5)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))) classnames: 2.5.1 hammerjs: 2.0.8 hls.js: 1.5.18 @@ -14484,13 +14505,13 @@ snapshots: - webpack-chain - webpack-dev-server - '@tarojs/components@4.0.8-beta.1(@tarojs/helper@4.0.8-beta.1(@swc/helpers@0.5.15))(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))))(postcss@8.4.49)(react@18.3.1)(rollup@3.29.5)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15)))': + '@tarojs/components@4.0.8-beta.1(@tarojs/helper@4.0.9(@swc/helpers@0.5.15))(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(postcss@8.4.49)(react@18.3.1)(rollup@4.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15)))': dependencies: '@stencil/core': 2.22.3 - '@tarojs/components-advanced': 4.0.8-beta.1(a401d440388d8a660a222e0f935754ff) + '@tarojs/components-advanced': 4.0.8-beta.1(4db457bb1462e2d585a3bf6b20d34e61) '@tarojs/runtime': 4.0.8-beta.1 '@tarojs/shared': 4.0.8-beta.1 - '@tarojs/taro': 4.0.8-beta.1(@tarojs/components@4.0.8-beta.1(@tarojs/helper@4.0.8-beta.1(@swc/helpers@0.5.15))(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))))(postcss@8.4.49)(react@18.3.1)(rollup@3.29.5)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))))(@tarojs/helper@4.0.8-beta.1(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1)(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))))(postcss@8.4.49)(rollup@3.29.5)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))) + '@tarojs/taro': 4.0.8-beta.1(@tarojs/components@4.0.8-beta.1(@tarojs/helper@4.0.9(@swc/helpers@0.5.15))(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(postcss@8.4.49)(react@18.3.1)(rollup@4.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(@tarojs/helper@4.0.9(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1)(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(postcss@8.4.49)(rollup@4.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))) classnames: 2.5.1 hammerjs: 2.0.8 hls.js: 1.5.18 @@ -14536,6 +14557,33 @@ snapshots: - '@swc/helpers' - supports-color + '@tarojs/helper@4.0.9(@swc/helpers@0.5.15)': + dependencies: + '@babel/core': 7.26.0 + '@babel/generator': 7.26.3 + '@babel/parser': 7.26.3 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 + '@swc/core': 1.3.96(@swc/helpers@0.5.15) + '@swc/register': 0.1.10(@swc/core@1.3.96(@swc/helpers@0.5.15)) + ansi-escapes: 4.3.2 + chalk: 4.1.2 + chokidar: 3.6.0 + cross-spawn: 7.0.6 + debug: 4.4.0(supports-color@8.1.1) + dotenv: 16.4.7 + dotenv-expand: 11.0.7 + esbuild: 0.21.5 + find-yarn-workspace-root: 2.0.0 + fs-extra: 11.2.0 + lodash: 4.17.21 + require-from-string: 2.0.2 + resolve: 1.22.10 + supports-hyperlinks: 3.1.0 + transitivePeerDependencies: + - '@swc/helpers' + - supports-color + '@tarojs/parse-css-to-stylesheet-android-arm-eabi@0.0.69': optional: true @@ -14653,11 +14701,16 @@ snapshots: '@tarojs/runtime': 4.0.8-beta.1 '@tarojs/shared': 4.0.8-beta.1 - '@tarojs/plugin-platform-alipay@4.0.8-beta.1(@tarojs/service@4.0.8-beta.1(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1)': + '@tarojs/plugin-platform-alipay@4.0.8-beta.1(@tarojs/service@4.0.9(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1)': dependencies: - '@tarojs/service': 4.0.8-beta.1(@swc/helpers@0.5.15) + '@tarojs/service': 4.0.9(@swc/helpers@0.5.15) '@tarojs/shared': 4.0.8-beta.1 + '@tarojs/plugin-platform-alipay@4.0.8-beta.1(@tarojs/service@4.0.9(@swc/helpers@0.5.15))(@tarojs/shared@4.0.9)': + dependencies: + '@tarojs/service': 4.0.9(@swc/helpers@0.5.15) + '@tarojs/shared': 4.0.9 + '@tarojs/plugin-platform-h5@4.0.8-beta.1(31635786561422ef85b36f9130e58fd5)': dependencies: '@babel/core': 7.26.0 @@ -14715,32 +14768,42 @@ snapshots: - webpack-cli - webpack-dev-server - '@tarojs/plugin-platform-jd@4.0.8-beta.1(@tarojs/service@4.0.8-beta.1(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1)': + '@tarojs/plugin-platform-jd@4.0.8-beta.1(@tarojs/service@4.0.9(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1)': dependencies: - '@tarojs/service': 4.0.8-beta.1(@swc/helpers@0.5.15) + '@tarojs/service': 4.0.9(@swc/helpers@0.5.15) '@tarojs/shared': 4.0.8-beta.1 - '@tarojs/plugin-platform-qq@4.0.8-beta.1(@tarojs/plugin-platform-weapp@4.0.8-beta.1(@tarojs/service@4.0.8-beta.1(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1))(@tarojs/shared@4.0.8-beta.1)': + '@tarojs/plugin-platform-jd@4.0.8-beta.1(@tarojs/service@4.0.9(@swc/helpers@0.5.15))(@tarojs/shared@4.0.9)': + dependencies: + '@tarojs/service': 4.0.9(@swc/helpers@0.5.15) + '@tarojs/shared': 4.0.9 + + '@tarojs/plugin-platform-qq@4.0.8-beta.1(@tarojs/plugin-platform-weapp@4.0.8-beta.1(@tarojs/service@4.0.9(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1))(@tarojs/shared@4.0.8-beta.1)': dependencies: - '@tarojs/plugin-platform-weapp': 4.0.8-beta.1(@tarojs/service@4.0.8-beta.1(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1) + '@tarojs/plugin-platform-weapp': 4.0.8-beta.1(@tarojs/service@4.0.9(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1) '@tarojs/shared': 4.0.8-beta.1 - '@tarojs/plugin-platform-swan@4.0.8-beta.1(@tarojs/service@4.0.8-beta.1(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1)': + '@tarojs/plugin-platform-swan@4.0.8-beta.1(@tarojs/service@4.0.9(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1)': dependencies: - '@tarojs/service': 4.0.8-beta.1(@swc/helpers@0.5.15) + '@tarojs/service': 4.0.9(@swc/helpers@0.5.15) '@tarojs/shared': 4.0.8-beta.1 - '@tarojs/plugin-platform-tt@4.0.8-beta.1(@tarojs/service@4.0.8-beta.1(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1)': + '@tarojs/plugin-platform-tt@4.0.8-beta.1(@tarojs/service@4.0.9(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1)': dependencies: - '@tarojs/service': 4.0.8-beta.1(@swc/helpers@0.5.15) + '@tarojs/service': 4.0.9(@swc/helpers@0.5.15) '@tarojs/shared': 4.0.8-beta.1 webpack-sources: 3.2.3 - '@tarojs/plugin-platform-weapp@4.0.8-beta.1(@tarojs/service@4.0.8-beta.1(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1)': + '@tarojs/plugin-platform-weapp@4.0.8-beta.1(@tarojs/service@4.0.9(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1)': dependencies: - '@tarojs/service': 4.0.8-beta.1(@swc/helpers@0.5.15) + '@tarojs/service': 4.0.9(@swc/helpers@0.5.15) '@tarojs/shared': 4.0.8-beta.1 + '@tarojs/plugin-platform-weapp@4.0.8-beta.1(@tarojs/service@4.0.9(@swc/helpers@0.5.15))(@tarojs/shared@4.0.9)': + dependencies: + '@tarojs/service': 4.0.9(@swc/helpers@0.5.15) + '@tarojs/shared': 4.0.9 + '@tarojs/react@4.0.8-beta.1(react@18.3.1)': dependencies: '@tarojs/runtime': 4.0.8-beta.1 @@ -14769,6 +14832,15 @@ snapshots: - '@swc/helpers' - supports-color + '@tarojs/runner-utils@4.0.9(@swc/helpers@0.5.15)': + dependencies: + '@tarojs/helper': 4.0.9(@swc/helpers@0.5.15) + rollup: 3.29.5 + scss-bundle: 3.1.2 + transitivePeerDependencies: + - '@swc/helpers' + - supports-color + '@tarojs/runtime@4.0.8-beta.1': dependencies: '@tarojs/shared': 4.0.8-beta.1 @@ -14789,8 +14861,25 @@ snapshots: - '@swc/helpers' - supports-color + '@tarojs/service@4.0.9(@swc/helpers@0.5.15)': + dependencies: + '@tarojs/helper': 4.0.9(@swc/helpers@0.5.15) + '@tarojs/runner-utils': 4.0.9(@swc/helpers@0.5.15) + '@tarojs/shared': 4.0.9 + joi: 17.13.3 + lodash: 4.17.21 + ora: 5.4.1 + resolve: 1.22.10 + tapable: 2.2.1 + webpack-merge: 5.10.0 + transitivePeerDependencies: + - '@swc/helpers' + - supports-color + '@tarojs/shared@4.0.8-beta.1': {} + '@tarojs/shared@4.0.9': {} + '@tarojs/taro-h5@4.0.8-beta.1(72d2ffd84649411181d9d11efc235ebe)': dependencies: '@tarojs/api': 4.0.8-beta.1(@tarojs/runtime@4.0.8-beta.1)(@tarojs/shared@4.0.8-beta.1) @@ -14820,15 +14909,32 @@ snapshots: - '@swc/helpers' - supports-color - '@tarojs/taro@4.0.8-beta.1(@tarojs/components@4.0.8-beta.1(@tarojs/helper@4.0.8-beta.1(@swc/helpers@0.5.15))(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(postcss@8.4.49)(react@18.3.1)(rollup@4.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(@tarojs/helper@4.0.8-beta.1(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1)(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(postcss@8.4.49)(rollup@4.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15)))': + '@tarojs/taro@4.0.8-beta.1(@tarojs/components@4.0.8-beta.1(@tarojs/helper@4.0.8-beta.1(@swc/helpers@0.5.15))(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))))(postcss@8.4.49)(react@18.3.1)(rollup@3.29.5)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))))(@tarojs/helper@4.0.8-beta.1(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1)(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))))(postcss@8.4.49)(rollup@3.29.5)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15)))': dependencies: '@tarojs/api': 4.0.8-beta.1(@tarojs/runtime@4.0.8-beta.1)(@tarojs/shared@4.0.8-beta.1) - '@tarojs/components': 4.0.8-beta.1(@tarojs/helper@4.0.8-beta.1(@swc/helpers@0.5.15))(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(postcss@8.4.49)(react@18.3.1)(rollup@4.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))) + '@tarojs/components': 4.0.8-beta.1(@tarojs/helper@4.0.8-beta.1(@swc/helpers@0.5.15))(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))))(postcss@8.4.49)(react@18.3.1)(rollup@3.29.5)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))) '@tarojs/helper': 4.0.8-beta.1(@swc/helpers@0.5.15) '@tarojs/runtime': 4.0.8-beta.1 '@tarojs/shared': 4.0.8-beta.1 '@types/postcss-url': 10.0.4 postcss: 8.4.49 + optionalDependencies: + '@types/react': 18.3.18 + html-webpack-plugin: 5.6.3(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))) + rollup: 3.29.5 + webpack: 5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15)) + webpack-chain: 6.5.1 + webpack-dev-server: 4.15.2(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))) + + '@tarojs/taro@4.0.8-beta.1(@tarojs/components@4.0.8-beta.1(@tarojs/helper@4.0.9(@swc/helpers@0.5.15))(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(postcss@8.4.49)(react@18.3.1)(rollup@4.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(@tarojs/helper@4.0.9(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1)(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(postcss@8.4.49)(rollup@4.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15)))': + dependencies: + '@tarojs/api': 4.0.8-beta.1(@tarojs/runtime@4.0.8-beta.1)(@tarojs/shared@4.0.8-beta.1) + '@tarojs/components': 4.0.8-beta.1(@tarojs/helper@4.0.9(@swc/helpers@0.5.15))(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(postcss@8.4.49)(react@18.3.1)(rollup@4.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))) + '@tarojs/helper': 4.0.9(@swc/helpers@0.5.15) + '@tarojs/runtime': 4.0.8-beta.1 + '@tarojs/shared': 4.0.8-beta.1 + '@types/postcss-url': 10.0.4 + postcss: 8.4.49 optionalDependencies: '@types/react': 18.3.18 html-webpack-plugin: 5.6.3(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))) @@ -14837,22 +14943,22 @@ snapshots: webpack-chain: 6.5.1 webpack-dev-server: 4.15.2(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))) - '@tarojs/taro@4.0.8-beta.1(@tarojs/components@4.0.8-beta.1(@tarojs/helper@4.0.8-beta.1(@swc/helpers@0.5.15))(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))))(postcss@8.4.49)(react@18.3.1)(rollup@3.29.5)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))))(@tarojs/helper@4.0.8-beta.1(@swc/helpers@0.5.15))(@tarojs/shared@4.0.8-beta.1)(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))))(postcss@8.4.49)(rollup@3.29.5)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15)))': + '@tarojs/taro@4.0.8-beta.1(@tarojs/components@4.0.8-beta.1(@tarojs/helper@4.0.9(@swc/helpers@0.5.15))(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(postcss@8.4.49)(react@18.3.1)(rollup@4.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(@tarojs/helper@4.0.9(@swc/helpers@0.5.15))(@tarojs/shared@4.0.9)(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(postcss@8.4.49)(rollup@4.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15)))': dependencies: - '@tarojs/api': 4.0.8-beta.1(@tarojs/runtime@4.0.8-beta.1)(@tarojs/shared@4.0.8-beta.1) - '@tarojs/components': 4.0.8-beta.1(@tarojs/helper@4.0.8-beta.1(@swc/helpers@0.5.15))(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))))(postcss@8.4.49)(react@18.3.1)(rollup@3.29.5)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))) - '@tarojs/helper': 4.0.8-beta.1(@swc/helpers@0.5.15) + '@tarojs/api': 4.0.8-beta.1(@tarojs/runtime@4.0.8-beta.1)(@tarojs/shared@4.0.9) + '@tarojs/components': 4.0.8-beta.1(@tarojs/helper@4.0.9(@swc/helpers@0.5.15))(@types/react@18.3.18)(html-webpack-plugin@5.6.3(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(postcss@8.4.49)(react@18.3.1)(rollup@4.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))))(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))) + '@tarojs/helper': 4.0.9(@swc/helpers@0.5.15) '@tarojs/runtime': 4.0.8-beta.1 - '@tarojs/shared': 4.0.8-beta.1 + '@tarojs/shared': 4.0.9 '@types/postcss-url': 10.0.4 postcss: 8.4.49 optionalDependencies: '@types/react': 18.3.18 - html-webpack-plugin: 5.6.3(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))) - rollup: 3.29.5 - webpack: 5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15)) + html-webpack-plugin: 5.6.3(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))) + rollup: 4.30.0 + webpack: 5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15)) webpack-chain: 6.5.1 - webpack-dev-server: 4.15.2(webpack@5.91.0(@swc/core@1.3.96(@swc/helpers@0.5.15))) + webpack-dev-server: 4.15.2(webpack@5.91.0(@swc/core@1.10.4(@swc/helpers@0.5.15))) '@tarojs/vite-runner@4.0.8-beta.1(@swc/helpers@0.5.15)(@tarojs/runtime@4.0.8-beta.1)(@types/babel__core@7.20.5)(jiti@2.4.2)(postcss@8.4.49)(rollup@3.29.5)(terser@5.37.0)(tsx@4.19.2)(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.5)(less@3.13.1)(lightningcss@1.28.2)(sass@1.77.6)(stylus@0.64.0)(terser@5.37.0))': dependencies: From 321b549b275748d89b17bc3f5249f9549e6cf45e Mon Sep 17 00:00:00 2001 From: "Alex.hxy" <1872591453@qq.com> Date: Thu, 27 Feb 2025 20:21:47 +0800 Subject: [PATCH 11/26] =?UTF-8?q?docs:=20=E4=BF=AE=E5=A4=8D=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E9=94=99=E8=AF=AF=20(#3024)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/packages/indicator/doc.taro.md | 4 ++-- src/packages/pickerview/doc.taro.md | 12 ++++++------ src/packages/popover/doc.taro.md | 2 +- src/packages/segmented/doc.taro.md | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/packages/indicator/doc.taro.md b/src/packages/indicator/doc.taro.md index 7b0331f69b..c8ea0bbb19 100644 --- a/src/packages/indicator/doc.taro.md +++ b/src/packages/indicator/doc.taro.md @@ -22,7 +22,7 @@ import { Indicator } from '@nutui/nutui-react-taro' :::demo - + ::: @@ -30,7 +30,7 @@ import { Indicator } from '@nutui/nutui-react-taro' :::demo - + ::: diff --git a/src/packages/pickerview/doc.taro.md b/src/packages/pickerview/doc.taro.md index cc0bcb4e1d..de7507dc6f 100644 --- a/src/packages/pickerview/doc.taro.md +++ b/src/packages/pickerview/doc.taro.md @@ -14,7 +14,7 @@ import { PickerView } from '@nutui/nutui-react-taro' :::demo - + ::: @@ -22,7 +22,7 @@ import { PickerView } from '@nutui/nutui-react-taro' :::demo - + ::: @@ -30,7 +30,7 @@ import { PickerView } from '@nutui/nutui-react-taro' :::demo - + ::: @@ -38,7 +38,7 @@ import { PickerView } from '@nutui/nutui-react-taro' :::demo - + ::: @@ -46,7 +46,7 @@ import { PickerView } from '@nutui/nutui-react-taro' :::demo - + ::: @@ -54,7 +54,7 @@ import { PickerView } from '@nutui/nutui-react-taro' :::demo - + ::: diff --git a/src/packages/popover/doc.taro.md b/src/packages/popover/doc.taro.md index 0eca49b5e2..a0a588c3d0 100644 --- a/src/packages/popover/doc.taro.md +++ b/src/packages/popover/doc.taro.md @@ -84,7 +84,7 @@ bottom-end # 底部右侧位置 :::demo - + ::: diff --git a/src/packages/segmented/doc.taro.md b/src/packages/segmented/doc.taro.md index 1339cb5266..baa117d2db 100644 --- a/src/packages/segmented/doc.taro.md +++ b/src/packages/segmented/doc.taro.md @@ -14,7 +14,7 @@ import { Segmented } from '@nutui/nutui-react-taro' :::demo - + ::: @@ -22,7 +22,7 @@ import { Segmented } from '@nutui/nutui-react-taro' :::demo - + ::: @@ -30,7 +30,7 @@ import { Segmented } from '@nutui/nutui-react-taro' :::demo - + ::: From 6fb6898309e6d1959f381d1e7bd81542e21ad86b Mon Sep 17 00:00:00 2001 From: "Alex.hxy" <1872591453@qq.com> Date: Thu, 27 Feb 2025 20:26:15 +0800 Subject: [PATCH 12/26] docs: correct docs mistakes (#3018) * docs: correct docs mistakes * chore: correct some docs content * chore: correct some docs content * chore: update docs --- src/packages/space/doc.md | 2 +- src/packages/space/doc.taro.md | 2 +- src/packages/tour/doc.en-US.md | 4 ++-- src/packages/tour/doc.md | 4 ++-- src/packages/tour/doc.taro.md | 4 ++-- src/packages/tour/doc.zh-TW.md | 4 ++-- src/packages/uploader/doc.en-US.md | 4 ++-- src/packages/uploader/doc.md | 4 ++-- src/packages/uploader/doc.taro.md | 6 +++--- src/packages/uploader/doc.zh-TW.md | 4 ++-- 10 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/packages/space/doc.md b/src/packages/space/doc.md index beca0938cf..a6cc915ff1 100644 --- a/src/packages/space/doc.md +++ b/src/packages/space/doc.md @@ -75,7 +75,7 @@ import { Space } from '@nutui/nutui-react' ### 样式变量 -组件提供了下列 CSS 变量,可用于自定义样式,使用方法请参考 [ConfigProvider 组件](/components/config-provider)。 +组件提供了下列 CSS 变量,可用于自定义样式,使用方法请参考 [ConfigProvider 组件](#/zh-CN/component/configprovider)。 | 名称 | 默认值 | 描述 | | --- | --- | --- | diff --git a/src/packages/space/doc.taro.md b/src/packages/space/doc.taro.md index 19ae033c38..3ec527ca1a 100644 --- a/src/packages/space/doc.taro.md +++ b/src/packages/space/doc.taro.md @@ -75,7 +75,7 @@ import { Space } from '@nutui/nutui-react-taro' ### 样式变量 -组件提供了下列 CSS 变量,可用于自定义样式,使用方法请参考 [ConfigProvider 组件](/components/config-provider)。 +组件提供了下列 CSS 变量,可用于自定义样式,使用方法请参考 [ConfigProvider 组件](#/zh-CN/component/configprovider)。 | 名称 | 默认值 | 描述 | | --- | --- | --- | diff --git a/src/packages/tour/doc.en-US.md b/src/packages/tour/doc.en-US.md index a27b5989c1..0df6effc1a 100644 --- a/src/packages/tour/doc.en-US.md +++ b/src/packages/tour/doc.en-US.md @@ -62,14 +62,14 @@ import { Tour } from '@nutui/nutui-react' | type | Tour type | `step` \| `tile` | `step` | | list | Boot Step Content | `TourList[]` | `-` | | offset | The offset of the hollow mask relative to the target element | `number[]` | `[8, 10]` | -| location | Location of popover[location](https://nutui.jd.com/h5/react/2x/#/zh-CN/component/popover) | `string` | `bottom` | +| location | Location of popover[location](#/zh-CN/component/popover) | `string` | `bottom` | | next | Next step text | `ReactNode` | `''` | | prev | Next step text | `ReactNode` | `''` | | complete | Complete text | `ReactNode` | `''` | | mask | Whether to display cutout mask | `boolean` | `true` | | maskWidth | Width of hollow mask | `number` \| `string` | `''` | | maskHeight | Hollow mask height | `number` \| `string` | `''` | -| closeOnOverlayClick | Whether to close when clicking overlay,[closeOnClickOverlay](https://nutui.jd.com/h5/react/2x/#/zh-CN/component/popover) | `boolean` | `true` | +| closeOnOverlayClick | Whether to close when clicking overlay,[closeOnClickOverlay](#/en-US/component/popover) | `boolean` | `true` | | showPrev | Whether to show prev button | `boolean` | `true` | | title | Whether to show title bar | `ReactNode` | `''` | | onClose | Emit when popover close | `(e: MouseEvent) => void` | `-` | diff --git a/src/packages/tour/doc.md b/src/packages/tour/doc.md index 3d5b6619d4..5401bb4f9b 100644 --- a/src/packages/tour/doc.md +++ b/src/packages/tour/doc.md @@ -62,14 +62,14 @@ import { Tour } from '@nutui/nutui-react' | type | 引导类型 | `step` \| `tile` | `step` | | list | 引导步骤内容 | `TourList[]` | `-` | | offset | 镂空遮罩相对于目标元素的偏移量 | `number[]` | `[8, 10]` | -| location | 弹出层位置,同 Popopver 的[location 属性](https://nutui.jd.com/h5/react/2x/#/zh-CN/component/popover) | `string` | `bottom` | +| location | 弹出层位置,同 Popopver 的[location 属性](#/zh-CN/component/popover) | `string` | `bottom` | | next | 下一步按钮文案 | `ReactNode` | `''` | | prev | 上一步按钮文案 | `ReactNode` | `''` | | complete | 完成按钮文案 | `ReactNode` | `''` | | mask | 是否显示镂空遮罩 | `boolean` | `true` | | maskWidth | 镂空遮罩层宽度 | `number` \| `string` | `''` | | maskHeight | 镂空遮罩层高度 | `number` \| `string` | `''` | -| closeOnOverlayClick | 是否在点击镂空遮罩层后关闭,同 Popopver 的[closeOnClickOverlay 属性](https://nutui.jd.com/h5/react/2x/#/zh-CN/component/popover) | `boolean` | `true` | +| closeOnOverlayClick | 是否在点击镂空遮罩层后关闭,同 Popopver 的[closeOnClickOverlay 属性](#/zh-CN/component/popover) | `boolean` | `true` | | showPrev | 是否展示上一步按钮 | `boolean` | `true` | | title | 是否展示标题栏 | `ReactNode` | `''` | | onClose | 气泡层关闭时触发 | `(e: MouseEvent) => void` | `-` | diff --git a/src/packages/tour/doc.taro.md b/src/packages/tour/doc.taro.md index 1816d892d4..644272c194 100644 --- a/src/packages/tour/doc.taro.md +++ b/src/packages/tour/doc.taro.md @@ -62,14 +62,14 @@ import { Tour } from '@nutui/nutui-react-taro' | type | 引导类型 | `step` \| `tile` | `step` | | list | 引导步骤内容 | `TourList[]` | `-` | | offset | 镂空遮罩相对于目标元素的偏移量 | `number[]` | `[8, 10]` | -| location | 弹出层位置,同 Popopver 的[location 属性](https://nutui.jd.com/h5/react/2x/#/zh-CN/component/popover) | `string` | `bottom` | +| location | 弹出层位置,同 Popopver 的[location 属性](#/zh-CN/component/popover) | `string` | `bottom` | | next | 下一步按钮文案 | `ReactNode` | `''` | | prev | 上一步按钮文案 | `ReactNode` | `''` | | complete | 完成按钮文案 | `ReactNode` | `''` | | mask | 是否显示镂空遮罩 | `boolean` | `true` | | maskWidth | 镂空遮罩层宽度 | `number` \| `string` | `''` | | maskHeight | 镂空遮罩层高度 | `number` \| `string` | `''` | -| closeOnOverlayClick | 是否在点击镂空遮罩层后关闭,同 Popopver 的[closeOnClickOverlay 属性](https://nutui.jd.com/h5/react/2x/#/zh-CN/component/popover) | `boolean` | `true` | +| closeOnOverlayClick | 是否在点击镂空遮罩层后关闭,同 Popopver 的[closeOnClickOverlay 属性](#/zh-CN/component/popover) | `boolean` | `true` | | showPrev | 是否展示上一步按钮 | `boolean` | `true` | | title | 是否展示标题栏 | `ReactNode` | `''` | | onClose | 气泡层关闭时触发 | `(e: MouseEvent) => void` | `-` | diff --git a/src/packages/tour/doc.zh-TW.md b/src/packages/tour/doc.zh-TW.md index 29dfb69c9b..0abce70349 100644 --- a/src/packages/tour/doc.zh-TW.md +++ b/src/packages/tour/doc.zh-TW.md @@ -62,14 +62,14 @@ import { Tour } from '@nutui/nutui-react' | type | 引導類型 | `step` \| `tile` | `step` | | list | 引導步驟內容 | `TourList[]` | `-` | | offset | 鏤空遮罩相對於目標元素的偏移量 | `number[]` | `[8, 10]` | -| location | 彈出層位置,同 Popopver 的[location 屬性](https://nutui.jd.com/h5/react/2x/#/zh-CN/component/popover) | `string` | `bottom` | +| location | 彈出層位置,同 Popopver 的[location 屬性](#/zh-CN/component/popover) | `string` | `bottom` | | next | 下一步按鈕文案 | `ReactNode` | `''` | | prev | 上一步按鈕文案 | `ReactNode` | `''` | | complete | 完成按鈕文案 | `ReactNode` | `''` | | mask | 是否顯示鏤空遮罩 | `boolean` | `true` | | maskWidth | 鏤空遮罩層寬度 | `number` \| `string` | `''` | | maskHeight | 鏤空遮罩層高度 | `number` \| `string` | `''` | -| closeOnOverlayClick | 是否在點擊鏤空遮罩層後關閉,同 Popopver 的[closeOnClickOverlay 屬性](https://nutui.jd.com/h5/react/2x/#/zh-CN/component/popover) | `boolean` | `true` | +| closeOnOverlayClick | 是否在點擊鏤空遮罩層後關閉,同 Popopver 的[closeOnClickOverlay 屬性](#/zh-CN/component/popover) | `boolean` | `true` | | showPrev | 是否展示上一步按鈕 | `boolean` | `true` | | title | 是否展示標題欄 | `ReactNode` | `''` | | onClose | 氣泡層關閉時觸發 | `(e: MouseEvent) => void` | `-` | diff --git a/src/packages/uploader/doc.en-US.md b/src/packages/uploader/doc.en-US.md index ddd803979b..655224e74b 100644 --- a/src/packages/uploader/doc.en-US.md +++ b/src/packages/uploader/doc.en-US.md @@ -107,8 +107,8 @@ import { Uploader } from '@nutui/nutui-react' | maxCount | File upload count limit | `number` \| `string` | `1` | | fit | Picture fill mode | `contain` \| `cover` \| `fill` \| `none` \| `scale-down` | `cover` | | clearInput | If or not you want to clear the `input` content, set it to `true` to support selecting the same file to upload over and over again | `boolean` | `true` | -| accept | Allowed file types to be uploaded, [Details] (" B8%E7%9A%84%E6%96%87%E4%BB%B6%E7%B1%BB%E5%9E%8B") | `string` | `*` | -| uploadIcon | uploadRegion Icon Name | `React.ReactNode` | `-` | +| accept | Allowed file types to be uploaded, [Details] (https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/Input/file#%E9%99%90%E5%88%B6%E5%85%81%E8%AE%B8%E7%9A%84%E6%96%87%E4%BB%B6%E7%B1%BB%E5%9E%8B) | `string` | `*` | +| uploadIcon | uploadRegion Icon Name | `React.ReactNode` | `-` | | deleteIcon | Delete the icon name of the region | `React.ReactNode` | `-` | | uploadLabel | Text below the image in the upload area | `React. | multiple | Whether to support file multi-selection |`boolean`|`false`| diff --git a/src/packages/uploader/doc.md b/src/packages/uploader/doc.md index 3586fe115d..bb4f58551e 100644 --- a/src/packages/uploader/doc.md +++ b/src/packages/uploader/doc.md @@ -111,8 +111,8 @@ import { Uploader } from '@nutui/nutui-react' | maxCount | 文件上传数量限制 | `number` \| `string` | `1` | | fit | 图片填充模式 | `contain` \| `cover` \| `fill` \| `none` \| `scale-down` | `cover` | | clearInput | 是否需要清空`input`内容,设为`true`支持重复选择上传同一个文件 | `boolean` | `true` | -| accept | 允许上传的文件类型,[详细说明]("https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/Input/file#%E9%99%90%E5%88%B6%E5%85%81%E8%AE%B8%E7%9A%84%E6%96%87%E4%BB%B6%E7%B1%BB%E5%9E%8B") | `string` | `*` | -| uploadIcon | 上传区域图标名称 | `React.ReactNode` | `-` | +| accept | 允许上传的文件类型,[详细说明](https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/Input/file#%E9%99%90%E5%88%B6%E5%85%81%E8%AE%B8%E7%9A%84%E6%96%87%E4%BB%B6%E7%B1%BB%E5%9E%8B) | `string` | `*` | +| uploadIcon | 上传区域图标名称 | `React.ReactNode` | `-` | | deleteIcon | 删除区域的图标名称 | `React.ReactNode` | `-` | | uploadLabel | 上传区域图片下方文字 | `React.ReactNode` | `-` | | multiple | 是否支持文件多选 | `boolean` | `false` | diff --git a/src/packages/uploader/doc.taro.md b/src/packages/uploader/doc.taro.md index 8350d415ce..1f3c3d6f3e 100644 --- a/src/packages/uploader/doc.taro.md +++ b/src/packages/uploader/doc.taro.md @@ -102,7 +102,7 @@ import { Uploader } from '@nutui/nutui-react-taro' | maxCount | 文件上传数量限制 | `number` \| `string` | `1` | | fit | 图片填充模式 | `contain` \| `cover` \| `fill` \| `none` \| `scale-down` | `cover` | | clearInput | 是否需要清空`input`内容,设为`true`支持重复选择上传同一个文件 | `boolean` | `true` | -| uploadIcon | 上传区域图标名称 | `React.ReactNode` | `-` | +| uploadIcon | 上传区域图标名称 | `React.ReactNode` | `-` | | deleteIcon | 删除区域的图标名称 | `React.ReactNode` | `-` | | uploadLabel | 上传区域图片下方文字 | `React.ReactNode` | `-` | | multiple | 是否支持文件多选 | `boolean` | `false` | @@ -117,8 +117,8 @@ import { Uploader } from '@nutui/nutui-react-taro' | onUploadQueueChange | 图片上传队列变化时触发 | `(tasks: FileItem[]) => void` | `-` | | sourceType | [选择文件的来源]("https://developers.weixin.qq.com/miniprogram/dev/api/media/video/wx.chooseMedia.html") | `Array` | `['album','camera']` | | camera`仅支持WEAPP` | 仅在 `source-type` 为 `camera` 时生效,使用前置或后置摄像头 | `String` | `back` | -| sizeType | [是否压缩所选文件]("https://developers.weixin.qq.com/miniprogram/dev/api/media/video/wx.chooseMedia.html") | `Array` | `['original','compressed']` | -| mediaType`仅支持WEAPP` | [选择文件类型]("https://developers.weixin.qq.com/miniprogram/dev/api/media/video/wx.chooseMedia.html") | `Array` | `['image', 'video', 'mix']` | +| sizeType | [是否压缩所选文件](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/wx.chooseMedia.html) | `Array` | `['original','compressed']` | +| mediaType`仅支持WEAPP` | [选择文件类型](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/wx.chooseMedia.html) | `Array` | `['image', 'video', 'mix']` | | maxDuration`仅支持WEAPP` | 拍摄视频最长拍摄时间,单位秒。时间范围为 3s 至 60s 之间。不限制相册。 | `number` | `10` | ### FileItem diff --git a/src/packages/uploader/doc.zh-TW.md b/src/packages/uploader/doc.zh-TW.md index bb3f29c96e..dc65814d54 100644 --- a/src/packages/uploader/doc.zh-TW.md +++ b/src/packages/uploader/doc.zh-TW.md @@ -111,8 +111,8 @@ import { Uploader } from '@nutui/nutui-react' | maxCount | 文件上傳數量限製 | `number` \| `string` | `1` | | fit | 圖片填充模式 | `contain` \| `cover` \| `fill` \| `none` \| `scale-down` | `cover` | | clearInput | 是否需要清空`input`內容,設為`true`支持重復選擇上傳同一個文件 | `boolean` | `true` | -| accept | 允許上傳的文件類型,[詳細說明]("https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/Input/file#%E9%99%90%E5%88%B6%E5%85%81%E8%AE%B8%E7%9A%84%E6%96%87%E4%BB%B6%E7%B1%BB%E5%9E%8B") | `string` | `*` | -| uploadIcon | 上傳區域圖標名稱 | `React.ReactNode` | `-` | +| accept | 允許上傳的文件類型,[詳細說明](https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/Input/file#%E9%99%90%E5%88%B6%E5%85%81%E8%AE%B8%E7%9A%84%E6%96%87%E4%BB%B6%E7%B1%BB%E5%9E%8B) | `string` | `*` | +| uploadIcon | 上傳區域圖標名稱 | `React.ReactNode` | `-` | | deleteIcon | 刪除區域的圖標名稱 | `React.ReactNode` | `-` | | uploadLabel | 上傳區域圖片下方文字 | `React.ReactNode` | `-` | | multiple | 是否支持文件多選 | `boolean` | `false` | From d4dfbc49767f9a8fa7a9443cc024d66d63ef4327 Mon Sep 17 00:00:00 2001 From: oasis <12181600+oasis-cloud@users.noreply.github.com> Date: Thu, 27 Feb 2025 20:42:48 +0800 Subject: [PATCH 13/26] =?UTF-8?q?chore:=20=E6=98=8E=E4=BA=AE=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E5=92=8C=E6=9A=97=E9=BB=91=E6=A8=A1=E5=BC=8F=E4=B8=BB?= =?UTF-8?q?=E9=A2=98=E5=88=86=E5=88=AB=E6=89=93=E5=8C=85=20(#3020)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/build-taro.mjs | 61 ++++++++++----------- scripts/build.mjs | 69 ++++++++++++------------ scripts/replace-css-var.js | 2 +- src/packages/configprovider/doc.en-US.md | 2 +- src/packages/configprovider/doc.md | 2 +- src/packages/configprovider/doc.taro.md | 2 +- src/packages/configprovider/doc.zh-TW.md | 2 +- src/styles/theme-dark.scss | 1 + src/styles/theme-default.scss | 1 + 9 files changed, 68 insertions(+), 74 deletions(-) diff --git a/scripts/build-taro.mjs b/scripts/build-taro.mjs index ebee0ca63b..0168f28335 100644 --- a/scripts/build-taro.mjs +++ b/scripts/build-taro.mjs @@ -232,22 +232,13 @@ async function buildUMD() { async function buildAllCSS() { // 拷贝styles - async function copyStyles() { - await copy( - resolve(__dirname, '../src/styles'), - resolve(__dirname, `../${dist}/styles`), - ) - + async function generateAllStyles() { + const projectID = process.env.VITE_APP_PROJECT_ID const content = [ - `@import './styles/theme-default.scss';`, - `@import './styles/variables.scss';`, + `@import './styles/variables${projectID ? `-${projectID}` : ''}.scss';`, `@import './styles/mixins/index.scss';`, `@import './styles/animation/index.scss';`, ] - const projectID = process.env.VITE_APP_PROJECT_ID - if (projectID) { - content[1] = `@import '../variables-${projectID}.scss';` - } const scssFiles = await glob([`${dist}/es/packages/**/*.scss`]) scssFiles.forEach((file) => { content.push( @@ -257,7 +248,7 @@ async function buildAllCSS() { dest(`${dist}/style.scss`, content.join('\n')) } - await copyStyles() + await generateAllStyles() await vite.build({ logLevel: 'error', resolve: { @@ -277,6 +268,25 @@ async function buildAllCSS() { } async function buildThemeCSS() { + const files = await glob([`${dist}/styles/theme-*.scss`], { + ignore: [`${dist}/types/src/**/*.taro.d.ts`], + }) + const projectID = process.env.VITE_APP_PROJECT_ID + const inputFiles = {} + files.forEach(filePath => { + const themeName = basename(filePath, 'scss').replace('theme-', '') + if (!projectID) { + inputFiles[themeName] = `./${filePath}` + } else { + if (themeName === projectID) { + inputFiles['default'] = `./${filePath}` + } + if (themeName === `${projectID}-dark`) { + inputFiles['dark'] = `./${filePath}` + } + } + }) + await vite.build({ logLevel: 'error', resolve: { @@ -285,16 +295,14 @@ async function buildThemeCSS() { build: { emptyOutDir: false, rollupOptions: { + input: inputFiles, output: [ { dir: `${dist}/styles/themes`, - assetFileNames: 'default.css', + assetFileNames: '[name].css', }, ], }, - lib: { - entry: `./${dist}/styles/themes/default.scss`, - }, }, }) } @@ -305,21 +313,6 @@ async function copyStyles() { resolve(__dirname, '../src/styles'), resolve(__dirname, `../${dist}/styles`), ) - - let content = [ - `@import '../theme-default.scss';`, - `@import '../theme-dark.scss';`, - `@import '../jd-font';`, - ] - const projectID = process.env.VITE_APP_PROJECT_ID - if (projectID) { - content = [ - `@import '../theme-${projectID}.scss';`, - `@import '../jd-font';`, - ] - } - - dest(`${dist}/styles/themes/default.scss`, content.join('\n')) } // 构建样式 @@ -443,6 +436,8 @@ async function copyReleaseFiles() { const npmPublishDir = dist.replace('dist', '') await copy(join(__dirname, '../README.md'), join(`${npmPublishDir}/README.md`)) await copy(join(__dirname, '../CHANGELOG.md'), join(`${npmPublishDir}/CHANGELOG.md`)) + await copy(join(__dirname, '../src/packages/lottie/animation'), join(`${npmPublishDir}/dist/es/packages/lottie/animation`)) + await copy(join(__dirname, '../src/packages/lottie/animation'), join(`${npmPublishDir}/dist/cjs/packages/lottie/animation`)) await writeFile(join(__dirname, `../${npmPublishDir}/package.json`), generateReleasePackageJson()) } @@ -484,8 +479,6 @@ console.time('Build Declaration') await buildDeclaration() console.timeEnd('Build Declaration') -// await exportProps() - await deleteAsync([ `${dist}/es/packages/nutui.react.js`, `${dist}/es/packages/nutui.react.d.ts`, diff --git a/scripts/build.mjs b/scripts/build.mjs index d081671d87..9e31e2aa2f 100644 --- a/scripts/build.mjs +++ b/scripts/build.mjs @@ -177,25 +177,16 @@ async function buildUMD(p) { }, }) } - +// 针对不同包构建全量的 style async function buildAllCSS() { // 拷贝styles - async function copyStyles() { - await copy( - resolve(__dirname, '../src/styles'), - resolve(__dirname, `../${dist}/styles`), - ) - + async function generateAllStyles() { + const projectID = process.env.VITE_APP_PROJECT_ID const content = [ - `@import './styles/theme-default.scss';`, - `@import './styles/variables.scss';`, + `@import './styles/variables${projectID ? `-${projectID}` : ''}.scss';`, `@import './styles/mixins/index.scss';`, `@import './styles/animation/index.scss';`, ] - const projectID = process.env.VITE_APP_PROJECT_ID - if (projectID) { - content[1] = `@import '../variables-${projectID}.scss';` - } const scssFiles = await glob([`${dist}/es/packages/**/*.scss`]) scssFiles.forEach((file) => { content.push( @@ -205,7 +196,7 @@ async function buildAllCSS() { dest(`${dist}/style.scss`, content.join('\n')) } - await copyStyles() + await generateAllStyles() await vite.build({ logLevel: 'error', resolve: { @@ -225,6 +216,30 @@ async function buildAllCSS() { } async function buildThemeCSS() { + const files = await glob([`${dist}/styles/theme-*.scss`], { + ignore: [`${dist}/types/src/**/*.taro.d.ts`], + }) + const projectID = process.env.VITE_APP_PROJECT_ID + const inputFiles = {} + // nuitui 官方包包含全部主题文件,包括: + // default.css 默认明亮主题 + // dark.css 默认暗黑主题 + // jmapp.css、jrkf.css 主题 + // 例如:jmapp 包只包含 jmapp 的主题文件,且是默认主题文件。 + files.forEach(filePath => { + const themeName = basename(filePath, 'scss').replace('theme-', '') + if (!projectID) { + inputFiles[themeName] = `./${filePath}` + } else { + if (themeName === projectID) { + inputFiles['default'] = `./${filePath}` + } + if (themeName === `${projectID}-dark`) { + inputFiles['dark'] = `./${filePath}` + } + } + }) + await vite.build({ logLevel: 'error', resolve: { @@ -233,41 +248,23 @@ async function buildThemeCSS() { build: { emptyOutDir: false, rollupOptions: { + input: inputFiles, output: [ { dir: `${dist}/styles/themes`, - assetFileNames: 'default.css', + assetFileNames: '[name].css', }, ], }, - lib: { - entry: `./${dist}/styles/themes/default.scss`, - }, }, }) } -// 拷贝styles async function copyStyles() { await copy( resolve(__dirname, '../src/styles'), resolve(__dirname, `../${dist}/styles`), ) - - let content = [ - `@import '../theme-default.scss';`, - `@import '../theme-dark.scss';`, - `@import '../jd-font';`, - ] - const projectID = process.env.VITE_APP_PROJECT_ID - if (projectID) { - content = [ - `@import '../theme-${projectID}.scss';`, - `@import '../jd-font';`, - ] - } - - dest(`${dist}/styles/themes/default.scss`, content.join('\n')) } // 构建样式 @@ -384,6 +381,8 @@ async function copyReleaseFiles() { const npmPublishDir = dist.replace('dist', '') await copy(join(__dirname, '../README.md'), join(`${npmPublishDir}/README.md`)) await copy(join(__dirname, '../CHANGELOG.md'), join(`${npmPublishDir}/CHANGELOG.md`)) + await copy(join(__dirname, '../src/packages/lottie/animation'), join(`${npmPublishDir}/dist/es/packages/lottie/animation`)) + await copy(join(__dirname, '../src/packages/lottie/animation'), join(`${npmPublishDir}/dist/cjs/packages/lottie/animation`)) await writeFile(join(__dirname, `../${npmPublishDir}/package.json`), generateReleasePackageJson()) } @@ -438,4 +437,4 @@ console.timeEnd('Build JSDoc') console.time('Copy package.json readme.md') await copyReleaseFiles() -console.timeEnd('Copy package.json readme.md') \ No newline at end of file +console.timeEnd('Copy package.json readme.md') diff --git a/scripts/replace-css-var.js b/scripts/replace-css-var.js index fafe4b94d0..c558d7cac1 100644 --- a/scripts/replace-css-var.js +++ b/scripts/replace-css-var.js @@ -22,7 +22,7 @@ const variables = fs.readFileSync( const theme = fs.readFileSync( path.join(__dirname, '../src/styles/theme-default.scss'), -).toString() +).toString().replace('@import "./jd-font";', '').replace(`@import './jd-font';`, '') const exclude = ['icon'] components.forEach((component) => { diff --git a/src/packages/configprovider/doc.en-US.md b/src/packages/configprovider/doc.en-US.md index 059e7dc5e8..91afea13a5 100644 --- a/src/packages/configprovider/doc.en-US.md +++ b/src/packages/configprovider/doc.en-US.md @@ -29,7 +29,7 @@ You can override these CSS variables directly in your code, and the styling of t } ``` -> @nutui/nutui-react comes with two theme files default:@nutui/nutui-react/dist/styles/theme-default.scss; dark:@nutui/nutui-react/dist/styles/theme-dark.scss; If you want to use the dark theme, you can import the dark theme file in your project. +> @nutui/nutui-react comes with two theme files default:@nutui/nutui-react/dist/styles/themes/default.css; dark:@nutui/nutui-react/dist/styles/themes/dark.css; If you want to use the dark theme, you can import the dark theme file in your project. #### Overrides via ConfigProvider diff --git a/src/packages/configprovider/doc.md b/src/packages/configprovider/doc.md index 4d2ba9d91e..ac92f3a18d 100644 --- a/src/packages/configprovider/doc.md +++ b/src/packages/configprovider/doc.md @@ -29,7 +29,7 @@ NutUI-React 可以通过 [CSS 变量](https://developer.mozilla.org/zh-CN/docs/W } ``` -> @nutui/nutui-react 中带了两个主题文件 默认主题:@nutui/nutui-react/dist/styles/theme-default.scss; 暗黑主题:@nutui/nutui-react/dist/styles/theme-dark.scss; 如果想使用暗黑主题,可以在项目中导入暗黑主题文件。 +> @nutui/nutui-react 中带了两个主题文件 默认主题:@nutui/nutui-react/dist/styles/themes/default.css; 暗黑主题:@nutui/nutui-react/dist/styles/themes/dark.css; 如果想使用暗黑主题,可以在项目中导入暗黑主题文件。 #### 通过 ConfigProvider 覆盖 diff --git a/src/packages/configprovider/doc.taro.md b/src/packages/configprovider/doc.taro.md index fa8ad1d5bf..a3c9c01f49 100644 --- a/src/packages/configprovider/doc.taro.md +++ b/src/packages/configprovider/doc.taro.md @@ -29,7 +29,7 @@ NutUI-React 可以通过 [CSS 变量](https://developer.mozilla.org/zh-CN/docs/W } ``` -> @nutui/nutui-react 中带了两个主题文件 默认主题:@nutui/nutui-react/dist/styles/theme-default.scss; 暗黑主题:@nutui/nutui-react/dist/styles/theme-dark.scss; 如果想使用暗黑主题,可以在项目中导入暗黑主题文件。 +> @nutui/nutui-react 中带了两个主题文件 默认主题:@nutui/nutui-react/dist/styles/themes/default.css; 暗黑主题:@nutui/nutui-react/dist/styles/themes/dark.css; 如果想使用暗黑主题,可以在项目中导入暗黑主题文件。 #### 通过 ConfigProvider 覆盖 diff --git a/src/packages/configprovider/doc.zh-TW.md b/src/packages/configprovider/doc.zh-TW.md index db2158c672..63de7efd33 100644 --- a/src/packages/configprovider/doc.zh-TW.md +++ b/src/packages/configprovider/doc.zh-TW.md @@ -29,7 +29,7 @@ NutUI-React 可以通過 \[CSS 變數\]( @nutui/nutui-react 中帶了兩個主題檔 默認主題:@nutui/nutui-react/dist/styles/theme-default.scss; 暗黑主題:@nutui/nutui-react/dist/styles/theme-dark.scss; 如果想使用暗黑主題,可以在專案中導入暗黑主題檔。 +> @nutui/nutui-react 中帶了兩個主題檔 默認主題:@nutui/nutui-react/dist/styles/themes/default.css; 暗黑主題:@nutui/nutui-react/dist/styles/themes/dark.css; 如果想使用暗黑主題,可以在專案中導入暗黑主題檔。 #### 通過 ConfigProvider 覆蓋 diff --git a/src/styles/theme-dark.scss b/src/styles/theme-dark.scss index b040567411..fc2d1e52dc 100644 --- a/src/styles/theme-dark.scss +++ b/src/styles/theme-dark.scss @@ -1,3 +1,4 @@ +@import './jd-font'; :root, page { // 品牌颜色 diff --git a/src/styles/theme-default.scss b/src/styles/theme-default.scss index 30a7e73b3f..d1e9ee607d 100644 --- a/src/styles/theme-default.scss +++ b/src/styles/theme-default.scss @@ -1,3 +1,4 @@ +@import './jd-font'; :root, page { // 品牌颜色 From df82d6bf332a873070e276608cd56f418c4c4068 Mon Sep 17 00:00:00 2001 From: songsong <353833373@qq.com> Date: Fri, 28 Feb 2025 16:29:23 +0800 Subject: [PATCH 14/26] refactor: datepicker (#3023) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 初始化pickerview * feat: add pickerView * feat: add tiled demo * refactor: 重构h5 * fix: 适配demo * feat: 增加级联功能 * fix: 级联优化 * feat: pickerview增加级联效果 * fix: 更新taro版本 * fix: 移除冗余代码+解决form中滚动未结束死循环问题 * fix: 移除console * fix: 更新pickerview * fix: update test * fix: update error * fix: update error * fix: update demo * fix: update test * feat: 添加异步demo * fix: update doc * fix: 同步pickerview变更 * fix: 解决小程序控制条样式问题+demo7取消不还原问题 * fix: datepicker类型同步更新 * fix: update test * fix: 修改标签 * feat: add test * fix: update doc and test * fix: adjust the dependency package location * fix: adjust the dependency package path * fix: adjust the dependency package path * fix: adjust the dependency package path * fix: update doc props type * fix: adjust note * fix: adjust the dependency package path * fix: optimize details * fix: update test * fix: path not compilable * fix: key error * fix: update datepicker test * fix: hidden entry * fix: modify config * fix: remove repeat config * fix: datepicker优化 * fix: datepicker优化 * fix: 取消后还原初始值 * fix: 受控的使用 * fix: 支持指令式调用 * refactor: datepicker taro * chore: 移除注释 * chore: 更新单测引入方式+picker提取pickerProps * fix: ts类型修正 * fix: 修改组件引入路径 * fix: ts类型和单测修正 * fix: 弹窗动效还原 * fix: remove console * fix: 弹窗动效还原 * fix: 修改pickerprops路径 * fix: 修改类型 * fix: demo修正同步 * fix: pickerprops导出路径修改 * fix: popover demo修改 * fix: taro导出文件修改+demo ts类型修改 --- src/packages/calendar/demos/h5/demo6.tsx | 19 +- src/packages/calendar/demos/taro/demo6.tsx | 12 +- .../datepicker/__test__/datepicker.spec.tsx | 2 +- src/packages/datepicker/datepicker.taro.tsx | 475 ++++++------------ src/packages/datepicker/datepicker.tsx | 469 ++++++----------- src/packages/datepicker/demos/h5/demo1.tsx | 71 ++- src/packages/datepicker/demos/h5/demo2.tsx | 6 +- src/packages/datepicker/demos/h5/demo8.tsx | 14 +- src/packages/datepicker/demos/taro/demo1.tsx | 69 ++- src/packages/datepicker/demos/taro/demo2.tsx | 6 +- src/packages/datepicker/demos/taro/demo8.tsx | 10 +- src/packages/datepicker/doc.en-US.md | 2 +- src/packages/datepicker/doc.md | 2 +- src/packages/datepicker/doc.taro.md | 2 +- src/packages/datepicker/doc.zh-TW.md | 2 +- src/packages/datepicker/index.taro.ts | 4 +- src/packages/datepicker/index.ts | 4 +- src/packages/datepicker/types.taro.ts | 18 + src/packages/datepicker/types.ts | 56 +++ src/packages/datepicker/utils.ts | 336 +++++++++++++ src/packages/form/demos/h5/demo7.tsx | 34 ++ src/packages/form/demos/taro/demo7.tsx | 34 ++ src/packages/picker/__tests__/picker.spec.tsx | 3 +- src/packages/picker/index.taro.ts | 2 +- src/packages/picker/index.ts | 2 +- src/packages/picker/picker.taro.tsx | 37 +- src/packages/picker/picker.tsx | 34 +- src/packages/picker/types.taro.ts | 8 + src/packages/picker/types.ts | 36 ++ 29 files changed, 971 insertions(+), 798 deletions(-) create mode 100644 src/packages/datepicker/types.taro.ts create mode 100644 src/packages/datepicker/types.ts create mode 100644 src/packages/datepicker/utils.ts create mode 100644 src/packages/picker/types.taro.ts diff --git a/src/packages/calendar/demos/h5/demo6.tsx b/src/packages/calendar/demos/h5/demo6.tsx index 37ae07619b..2e0d5486dd 100644 --- a/src/packages/calendar/demos/h5/demo6.tsx +++ b/src/packages/calendar/demos/h5/demo6.tsx @@ -1,5 +1,12 @@ import React, { useRef, useState } from 'react' -import { Cell, Calendar, DatePicker, CalendarDay } from '@nutui/nutui-react' +import { + Cell, + Calendar, + DatePicker, + CalendarDay, + PickerValue, + PickerOptions, +} from '@nutui/nutui-react' const padZero = (num: number | string, targetLength = 2) => { let str = `${num}` @@ -32,14 +39,18 @@ const Demo6 = () => { const dateArr = [...[chooseData[0][3], chooseData[1][3]]] setDate([...dateArr]) } - const confirm = (values: (string | number)[], options: any[]) => { + const confirm = (values: PickerValue[], options: PickerOptions) => { if (desc.current === 1) { setDesc1( - options.map((option) => padZero(parseInt(option.text))).join(':') + options + .map((option) => padZero(parseInt(option.label as string))) + .join(':') ) } else { setDesc2( - options.map((option) => padZero(parseInt(option.text))).join(':') + options + .map((option) => padZero(parseInt(option.label as string))) + .join(':') ) } } diff --git a/src/packages/calendar/demos/taro/demo6.tsx b/src/packages/calendar/demos/taro/demo6.tsx index 93e78b6fff..1e9172218d 100644 --- a/src/packages/calendar/demos/taro/demo6.tsx +++ b/src/packages/calendar/demos/taro/demo6.tsx @@ -4,6 +4,8 @@ import { Calendar, DatePicker, CalendarDay, + PickerValue, + PickerOptions, } from '@nutui/nutui-react-taro' import { View } from '@tarojs/components' @@ -33,14 +35,18 @@ const Demo6 = () => { const dateArr = [...[chooseData[0][3], chooseData[1][3]]] setDate([...dateArr]) } - const confirm = (values: (string | number)[], options: any[]) => { + const confirm = (values: PickerValue[], options: PickerOptions) => { if (desc.current === 1) { setDesc1( - options.map((option) => padZero(parseInt(option.text))).join(':') + options + .map((option) => padZero(parseInt(option.label as string))) + .join(':') ) } else { setDesc2( - options.map((option) => padZero(parseInt(option.text))).join(':') + options + .map((option) => padZero(parseInt(option.label as string))) + .join(':') ) } } diff --git a/src/packages/datepicker/__test__/datepicker.spec.tsx b/src/packages/datepicker/__test__/datepicker.spec.tsx index 26a75e4ae9..08dee3ba9c 100644 --- a/src/packages/datepicker/__test__/datepicker.spec.tsx +++ b/src/packages/datepicker/__test__/datepicker.spec.tsx @@ -1,7 +1,7 @@ import React from 'react' import { render, waitFor, fireEvent } from '@testing-library/react' import '@testing-library/jest-dom' -import { DatePicker } from '../datepicker' +import DatePicker from '../datepicker' const currentYear = new Date().getFullYear() test('Show Chinese', async () => { diff --git a/src/packages/datepicker/datepicker.taro.tsx b/src/packages/datepicker/datepicker.taro.tsx index 3a6719d316..4cf3c985eb 100644 --- a/src/packages/datepicker/datepicker.taro.tsx +++ b/src/packages/datepicker/datepicker.taro.tsx @@ -1,64 +1,28 @@ -import React, { FunctionComponent, useState, useEffect } from 'react' +import React, { + useState, + useEffect, + ForwardRefRenderFunction, + useImperativeHandle, +} from 'react' import { View } from '@tarojs/components' -import Picker, { PickerProps } from '@/packages/picker/index.taro' +import Picker from '@/packages/picker/index.taro' import { useConfig } from '@/packages/configprovider/index.taro' import { usePropsValue } from '@/hooks/use-props-value' -import { BasicComponent, ComponentDefaults } from '@/utils/typings' +import { ComponentDefaults } from '@/utils/typings' import { isDate } from '@/utils/is-date' -import { padZero } from '@/utils/pad-zero' import { - PickerOption, - PickerOptions, - PickerValue, -} from '@/packages/pickerview/types' - -export interface DatePickerProps extends BasicComponent { - value?: Date - defaultValue?: Date - visible: boolean - title: string - type: - | 'date' - | 'time' - | 'year-month' - | 'month-day' - | 'datehour' - | 'datetime' - | 'hour-minutes' - showChinese: boolean - minuteStep: number - startDate: Date - endDate: Date - threeDimensional: boolean - pickerProps: Partial< - Omit< - PickerProps, - | 'defaultValue' - | 'threeDimensional' - | 'title' - | 'value' - | 'onConfirm' - | 'onClose' - | 'onCancel' - | 'onChange' - > - > - formatter: (type: string, option: PickerOption) => PickerOption - filter: (type: string, options: PickerOptions) => PickerOptions - onClose: () => void - onCancel: () => void - onConfirm: ( - selectedOptions: PickerOptions, - selectedValue: PickerValue[] - ) => void - onChange?: ( - selectedOptions: PickerOptions, - selectedValue: PickerValue[], - columnIndex: number - ) => void -} + formatValue, + generateDatePickerRanges, + generatePickerColumnWithCallback, + getDatePartValue, + handlePickerValueChange, +} from './utils' +import { DatePickerProps } from './types.taro' +import { DatePickerActions, DatePickerRef } from './types' +import { PickerOptions, PickerValue } from '@/packages/pickerview/types' const currentYear = new Date().getFullYear() + const defaultProps = { ...ComponentDefaults, visible: false, @@ -71,10 +35,10 @@ const defaultProps = { endDate: new Date(currentYear + 10, 11, 31), } as DatePickerProps -export const DatePicker: FunctionComponent< - Partial & - Omit, 'onChange' | 'defaultValue'> -> = (props) => { +const InternalPicker: ForwardRefRenderFunction< + DatePickerRef, + Partial +> = (props, ref) => { const { startDate, endDate, @@ -94,13 +58,16 @@ export const DatePicker: FunctionComponent< threeDimensional, className, style, + children, ...rest } = { ...defaultProps, ...props, } + const { locale } = useConfig() const lang = locale.datepicker + const zhCNType: { [key: string]: string } = { day: lang.day, year: lang.year, @@ -109,127 +76,45 @@ export const DatePicker: FunctionComponent< minute: lang.min, seconds: lang.seconds, } + const [pickerValue, setPickerValue] = useState([]) const [pickerOptions, setPickerOptions] = useState([]) - const formatValue = (value: Date | null) => { - if (!value || (value && !isDate(value))) { - value = startDate - } - return Math.min( - Math.max(value.getTime(), startDate.getTime()), - endDate.getTime() - ) - } + const [selectedDate, setSelectedDate] = usePropsValue({ - value: props.value && formatValue(props.value), - defaultValue: props.defaultValue && formatValue(props.defaultValue), + value: props.value && formatValue(props.value, startDate, endDate), + defaultValue: + props.defaultValue && formatValue(props.defaultValue, startDate, endDate), finalValue: 0, }) - function getMonthEndDay(year: number, month: number): number { - return new Date(year, month, 0).getDate() - } + const [innerDate, setInnerDate] = useState(selectedDate) - const getBoundary = (type: string, value: Date) => { - const boundary = type === 'min' ? startDate : endDate - const year = boundary.getFullYear() - let month = 1 - let date = 1 - let hour = 0 - let minute = 0 + const [innerVisible, setInnerVisible] = usePropsValue({ + value: props.visible, + defaultValue: false, + finalValue: false, + }) - if (type === 'max') { - month = 12 - date = getMonthEndDay(value.getFullYear(), value.getMonth() + 1) - hour = 23 - minute = 59 - } - const seconds = minute - if (value.getFullYear() === year) { - month = boundary.getMonth() + 1 - if (value.getMonth() + 1 === month) { - date = boundary.getDate() - if (value.getDate() === date) { - hour = boundary.getHours() - if (value.getHours() === hour) { - minute = boundary.getMinutes() - } - } - } - } - return { - [`${type}Year`]: year, - [`${type}Month`]: month, - [`${type}Date`]: date, - [`${type}Hour`]: hour, - [`${type}Minute`]: minute, - [`${type}Seconds`]: seconds, - } + const actions: DatePickerActions = { + open: () => { + setInnerVisible(true) + }, + close: () => { + setInnerVisible(false) + }, } - const ranges = () => { - const selected = new Date(selectedDate) - if (!selected) return [] - const { maxYear, maxDate, maxMonth, maxHour, maxMinute, maxSeconds } = - getBoundary('max', selected) - const { minYear, minDate, minMonth, minHour, minMinute, minSeconds } = - getBoundary('min', selected) - const result = [ - { - type: 'year', - range: [minYear, maxYear], - }, - { - type: 'month', - range: [minMonth, maxMonth], - }, - { - type: 'day', - range: [minDate, maxDate], - }, - { - type: 'hour', - range: [minHour, maxHour], - }, - { - type: 'minute', - range: [minMinute, maxMinute], - }, - { - type: 'seconds', - range: [minSeconds, maxSeconds], - }, - ] - switch (type.toLocaleLowerCase()) { - case 'date': - return result.slice(0, 3) - case 'datetime': - return result.slice(0, 5) - case 'time': - return result.slice(3, 6) - case 'year-month': - return result.slice(0, 2) - case 'hour-minutes': - return result.slice(3, 5) - case 'month-day': - return result.slice(1, 3) - case 'datehour': - return result.slice(0, 4) - default: - return result - } - } + useImperativeHandle(ref, () => actions) - const compareDateChange = ( - currentDate: number, + const handleDateComparison = ( newDate: Date | null, selectedOptions: PickerOptions, index: number ) => { - const isEqual = new Date(currentDate)?.getTime() === newDate?.getTime() + const isEqual = new Date(innerDate)?.getTime() === newDate?.getTime() if (newDate && isDate(newDate)) { if (!isEqual) { - setSelectedDate(formatValue(newDate as Date)) + setInnerDate(formatValue(newDate, startDate, endDate)) } onChange?.( selectedOptions, @@ -242,193 +127,125 @@ export const DatePicker: FunctionComponent< ) } } - const handlePickerChange = ( - selectedOptions: PickerOptions, - selectedValue: PickerValue[], - index: number - ) => { - const rangeType = type.toLocaleLowerCase() - if ( - ['date', 'datetime', 'datehour', 'month-day', 'year-month'].includes( - rangeType - ) - ) { - const formatDate: PickerValue[] = [] - selectedValue.forEach((item) => { - formatDate.push(item) - }) - if (rangeType === 'month-day' && formatDate.length < 3) { - formatDate.unshift( - new Date(defaultValue || startDate || endDate).getFullYear() - ) - } - - if (rangeType === 'year-month' && formatDate.length < 3) { - formatDate.push( - new Date(defaultValue || startDate || endDate).getDate() - ) - } - const year = Number(formatDate[0]) - const month = Number(formatDate[1]) - 1 - const day = Math.min( - Number(formatDate[2]), - getMonthEndDay(Number(formatDate[0]), Number(formatDate[1])) - ) - let date: Date | null = null - if ( - rangeType === 'date' || - rangeType === 'month-day' || - rangeType === 'year-month' - ) { - date = new Date(year, month, day) - } else if (rangeType === 'datetime') { - date = new Date( - year, - month, - day, - Number(formatDate[3]), - Number(formatDate[4]) - ) - } else if (rangeType === 'datehour') { - date = new Date(year, month, day, Number(formatDate[3])) + const handleConfirmDateComparison = (newDate: Date | null) => { + if (newDate && isDate(newDate)) { + const isEqual = new Date(selectedDate)?.getTime() === newDate?.getTime() + if (!isEqual) { + setSelectedDate(formatValue(newDate, startDate, endDate)) } + } + } - compareDateChange(selectedDate, date, selectedOptions, index) - } else { - // 'hour-minutes' 'time' - const [hour, minute, seconds] = selectedValue - const currentDate = new Date(selectedDate) - const year = currentDate.getFullYear() - const month = currentDate.getMonth() - const day = currentDate.getDate() + const handleCancel = () => { + setInnerDate(selectedDate) + onCancel?.() + } - const date = new Date( - year, - month, - day, - Number(hour), - Number(minute), - rangeType === 'time' ? Number(seconds) : 0 - ) - compareDateChange(selectedDate, date, selectedOptions, index) - } + const handleClose = () => { + setInnerVisible(false) + onClose?.() } - const formatOption = (type: string, value: string | number) => { - if (formatter) { - return formatter(type, { - label: padZero(value, 2), - value: padZero(value, 2), - }) - } - const padMin = padZero(value, 2) - const fatter = showChinese ? zhCNType[type] : '' - return { label: padMin + fatter, value: padMin } + const handleConfirm = (options: PickerOptions, value: PickerValue[]) => { + handlePickerValueChange( + options, + value, + 0, + type, + defaultValue || startDate || endDate, + handleConfirmDateComparison + ) + onConfirm?.(options, value) } - const generateColumn = ( - min: number, - max: number, - val: number | string, - type: string, - columnIndex: number + const handleChange = ( + selectedOptions: PickerOptions, + selectedValue: PickerValue[], + index: number ) => { - let cmin = min - const arr: Array = [] - let index = 0 - while (cmin <= max) { - arr.push(formatOption(type, cmin)) + innerVisible && + handlePickerValueChange( + selectedOptions, + selectedValue, + index, + type, + defaultValue || startDate || endDate, + handleDateComparison + ) + } - if (type === 'minute') { - cmin += minuteStep - } else { - cmin++ - } + const generatePickerColumns = (): PickerOptions[] => { + const dateRanges = generateDatePickerRanges( + type, + innerDate, + startDate, + endDate + ) - if (cmin <= Number(val)) { - index++ - } - } + const columns = dateRanges.map((rangeConfig, columnIndex) => { + const { type: columnType, range } = rangeConfig + const selectedValue = getDatePartValue(columnType, innerDate) + + const pickerColumn = generatePickerColumnWithCallback( + range[0], + range[1], + selectedValue, + columnType, + minuteStep, + (selectedIndex, options) => { + pickerValue[columnIndex] = options[selectedIndex]?.value + setPickerValue([...pickerValue]) + }, + showChinese, + zhCNType, + formatter + ) - pickerValue[columnIndex] = arr[index]?.value - setPickerValue([...pickerValue]) + if (filter?.(columnType, pickerColumn)) { + return filter(columnType, pickerColumn) + } - if (filter?.(type, arr)) { - return filter?.(type, arr) - } - return arr - } + return pickerColumn + }) - const getDateIndex = (type: string) => { - const date = new Date(selectedDate) - if (!selectedDate) return 0 - if (type === 'year') { - return date.getFullYear() - } - if (type === 'month') { - return date.getMonth() + 1 - } - if (type === 'day') { - return date.getDate() - } - if (type === 'hour') { - return date.getHours() - } - if (type === 'minute') { - return date.getMinutes() - } - if (type === 'seconds') { - return date.getSeconds() - } - return 0 + return columns || [] } - const columns = () => { - const val = ranges().map((res, columnIndex) => { - return generateColumn( - res.range[0], - res.range[1], - getDateIndex(res.type), - res.type, - columnIndex - ) - }) - return val || [] - } + useEffect(() => { + setInnerDate(selectedDate) + }, [selectedDate]) useEffect(() => { - setPickerOptions(columns()) - }, [selectedDate, startDate, endDate]) + setPickerOptions(generatePickerColumns()) + }, [innerDate, startDate, endDate]) return ( - - {pickerOptions.length > 0 && ( - onConfirm && onConfirm(selectedOptions, selectedValue)} - onChange={({ value, index, selectedOptions }) => { - handlePickerChange(selectedOptions, value, index) - }} - threeDimensional={threeDimensional} - /> - )} - + <> + {typeof children === 'function' && children(selectedDate)} + + {pickerOptions.length && ( + { + handleChange(selectedOptions, value, index) + }} + threeDimensional={threeDimensional} + /> + )} + + ) } -DatePicker.displayName = 'NutDatePicker' +const DatePicker = React.forwardRef>( + InternalPicker +) +export default DatePicker diff --git a/src/packages/datepicker/datepicker.tsx b/src/packages/datepicker/datepicker.tsx index 91f53c4780..3881dc8122 100644 --- a/src/packages/datepicker/datepicker.tsx +++ b/src/packages/datepicker/datepicker.tsx @@ -1,63 +1,26 @@ -import React, { FunctionComponent, useState, useEffect } from 'react' -import Picker, { PickerProps } from '@/packages/picker/index' +import React, { + useState, + useEffect, + ForwardRefRenderFunction, + useImperativeHandle, +} from 'react' +import Picker from '@/packages/picker' import { useConfig } from '@/packages/configprovider' import { usePropsValue } from '@/hooks/use-props-value' -import { BasicComponent, ComponentDefaults } from '@/utils/typings' +import { ComponentDefaults } from '@/utils/typings' import { isDate } from '@/utils/is-date' -import { padZero } from '@/utils/pad-zero' import { - PickerOption, - PickerOptions, - PickerValue, -} from '@/packages/pickerview/types' - -export interface DatePickerProps extends BasicComponent { - value?: Date - defaultValue?: Date - visible: boolean - title: string - type: - | 'date' - | 'time' - | 'year-month' - | 'month-day' - | 'datehour' - | 'datetime' - | 'hour-minutes' - showChinese: boolean - minuteStep: number - startDate: Date - endDate: Date - threeDimensional: boolean - pickerProps: Partial< - Omit< - PickerProps, - | 'defaultValue' - | 'threeDimensional' - | 'title' - | 'value' - | 'onConfirm' - | 'onClose' - | 'onCancel' - | 'onChange' - > - > - formatter: (type: string, option: PickerOption) => PickerOption - filter: (type: string, options: PickerOptions) => PickerOptions - onClose: () => void - onCancel: () => void - onConfirm: ( - selectedOptions: PickerOptions, - selectedValue: PickerValue[] - ) => void - onChange?: ( - selectedOptions: PickerOptions, - selectedValue: PickerValue[], - columnIndex: number - ) => void -} + formatValue, + generateDatePickerRanges, + generatePickerColumnWithCallback, + getDatePartValue, + handlePickerValueChange, +} from './utils' +import { DatePickerActions, DatePickerProps, DatePickerRef } from './types' +import { PickerOptions, PickerValue } from '@/packages/pickerview/types' const currentYear = new Date().getFullYear() + const defaultProps = { ...ComponentDefaults, visible: false, @@ -70,10 +33,10 @@ const defaultProps = { endDate: new Date(currentYear + 10, 11, 31), } as DatePickerProps -export const DatePicker: FunctionComponent< - Partial & - Omit, 'onChange' | 'defaultValue'> -> = (props) => { +const InternalPicker: ForwardRefRenderFunction< + DatePickerRef, + Partial +> = (props, ref) => { const { startDate, endDate, @@ -93,13 +56,16 @@ export const DatePicker: FunctionComponent< threeDimensional, className, style, + children, ...rest } = { ...defaultProps, ...props, } + const { locale } = useConfig() const lang = locale.datepicker + const zhCNType: { [key: string]: string } = { day: lang.day, year: lang.year, @@ -108,127 +74,45 @@ export const DatePicker: FunctionComponent< minute: lang.min, seconds: lang.seconds, } + const [pickerValue, setPickerValue] = useState([]) const [pickerOptions, setPickerOptions] = useState([]) - const formatValue = (value: Date | null) => { - if (!value || (value && !isDate(value))) { - value = startDate - } - return Math.min( - Math.max(value.getTime(), startDate.getTime()), - endDate.getTime() - ) - } + const [selectedDate, setSelectedDate] = usePropsValue({ - value: props.value && formatValue(props.value), - defaultValue: props.defaultValue && formatValue(props.defaultValue), + value: props.value && formatValue(props.value, startDate, endDate), + defaultValue: + props.defaultValue && formatValue(props.defaultValue, startDate, endDate), finalValue: 0, }) - function getMonthEndDay(year: number, month: number): number { - return new Date(year, month, 0).getDate() - } + const [innerDate, setInnerDate] = useState(selectedDate) - const getBoundary = (type: string, value: Date) => { - const boundary = type === 'min' ? startDate : endDate - const year = boundary.getFullYear() - let month = 1 - let date = 1 - let hour = 0 - let minute = 0 + const [innerVisible, setInnerVisible] = usePropsValue({ + value: props.visible, + defaultValue: false, + finalValue: false, + }) - if (type === 'max') { - month = 12 - date = getMonthEndDay(value.getFullYear(), value.getMonth() + 1) - hour = 23 - minute = 59 - } - const seconds = minute - if (value.getFullYear() === year) { - month = boundary.getMonth() + 1 - if (value.getMonth() + 1 === month) { - date = boundary.getDate() - if (value.getDate() === date) { - hour = boundary.getHours() - if (value.getHours() === hour) { - minute = boundary.getMinutes() - } - } - } - } - return { - [`${type}Year`]: year, - [`${type}Month`]: month, - [`${type}Date`]: date, - [`${type}Hour`]: hour, - [`${type}Minute`]: minute, - [`${type}Seconds`]: seconds, - } + const actions: DatePickerActions = { + open: () => { + setInnerVisible(true) + }, + close: () => { + setInnerVisible(false) + }, } - const ranges = () => { - const selected = new Date(selectedDate) - if (!selected) return [] - const { maxYear, maxDate, maxMonth, maxHour, maxMinute, maxSeconds } = - getBoundary('max', selected) - const { minYear, minDate, minMonth, minHour, minMinute, minSeconds } = - getBoundary('min', selected) - const result = [ - { - type: 'year', - range: [minYear, maxYear], - }, - { - type: 'month', - range: [minMonth, maxMonth], - }, - { - type: 'day', - range: [minDate, maxDate], - }, - { - type: 'hour', - range: [minHour, maxHour], - }, - { - type: 'minute', - range: [minMinute, maxMinute], - }, - { - type: 'seconds', - range: [minSeconds, maxSeconds], - }, - ] - switch (type.toLocaleLowerCase()) { - case 'date': - return result.slice(0, 3) - case 'datetime': - return result.slice(0, 5) - case 'time': - return result.slice(3, 6) - case 'year-month': - return result.slice(0, 2) - case 'hour-minutes': - return result.slice(3, 5) - case 'month-day': - return result.slice(1, 3) - case 'datehour': - return result.slice(0, 4) - default: - return result - } - } + useImperativeHandle(ref, () => actions) - const compareDateChange = ( - currentDate: number, + const handleDateComparison = ( newDate: Date | null, selectedOptions: PickerOptions, index: number ) => { - const isEqual = new Date(currentDate)?.getTime() === newDate?.getTime() + const isEqual = new Date(innerDate)?.getTime() === newDate?.getTime() if (newDate && isDate(newDate)) { if (!isEqual) { - setSelectedDate(formatValue(newDate as Date)) + setInnerDate(formatValue(newDate, startDate, endDate)) } onChange?.( selectedOptions, @@ -241,188 +125,125 @@ export const DatePicker: FunctionComponent< ) } } - const handlePickerChange = ( - selectedOptions: PickerOptions, - selectedValue: PickerValue[], - index: number - ) => { - const rangeType = type.toLocaleLowerCase() - if ( - ['date', 'datetime', 'datehour', 'month-day', 'year-month'].includes( - rangeType - ) - ) { - const formatDate: PickerValue[] = [] - selectedValue.forEach((item) => { - formatDate.push(item) - }) - if (rangeType === 'month-day' && formatDate.length < 3) { - formatDate.unshift( - new Date(defaultValue || startDate || endDate).getFullYear() - ) - } - - if (rangeType === 'year-month' && formatDate.length < 3) { - formatDate.push( - new Date(defaultValue || startDate || endDate).getDate() - ) - } - const year = Number(formatDate[0]) - const month = Number(formatDate[1]) - 1 - const day = Math.min( - Number(formatDate[2]), - getMonthEndDay(Number(formatDate[0]), Number(formatDate[1])) - ) - let date: Date | null = null - if ( - rangeType === 'date' || - rangeType === 'month-day' || - rangeType === 'year-month' - ) { - date = new Date(year, month, day) - } else if (rangeType === 'datetime') { - date = new Date( - year, - month, - day, - Number(formatDate[3]), - Number(formatDate[4]) - ) - } else if (rangeType === 'datehour') { - date = new Date(year, month, day, Number(formatDate[3])) + const handleConfirmDateComparison = (newDate: Date | null) => { + if (newDate && isDate(newDate)) { + const isEqual = new Date(selectedDate)?.getTime() === newDate?.getTime() + if (!isEqual) { + setSelectedDate(formatValue(newDate, startDate, endDate)) } + } + } - compareDateChange(selectedDate, date, selectedOptions, index) - } else { - // 'hour-minutes' 'time' - const [hour, minute, seconds] = selectedValue - const currentDate = new Date(selectedDate) - const year = currentDate.getFullYear() - const month = currentDate.getMonth() - const day = currentDate.getDate() + const handleCancel = () => { + setInnerDate(selectedDate) + onCancel?.() + } - const date = new Date( - year, - month, - day, - Number(hour), - Number(minute), - rangeType === 'time' ? Number(seconds) : 0 - ) - compareDateChange(selectedDate, date, selectedOptions, index) - } + const handleClose = () => { + setInnerVisible(false) + onClose?.() } - const formatOption = (type: string, value: string | number) => { - if (formatter) { - return formatter(type, { - label: padZero(value, 2), - value: padZero(value, 2), - }) - } - const padMin = padZero(value, 2) - const fatter = showChinese ? zhCNType[type] : '' - return { label: padMin + fatter, value: padMin } + const handleConfirm = (options: PickerOptions, value: PickerValue[]) => { + handlePickerValueChange( + options, + value, + 0, + type, + defaultValue || startDate || endDate, + handleConfirmDateComparison + ) + onConfirm?.(options, value) } - const generateColumn = ( - min: number, - max: number, - val: number | string, - type: string, - columnIndex: number + const handleChange = ( + selectedOptions: PickerOptions, + selectedValue: PickerValue[], + index: number ) => { - let cmin = min - const arr: Array = [] - let index = 0 - while (cmin <= max) { - arr.push(formatOption(type, cmin)) + innerVisible && + handlePickerValueChange( + selectedOptions, + selectedValue, + index, + type, + defaultValue || startDate || endDate, + handleDateComparison + ) + } - if (type === 'minute') { - cmin += minuteStep - } else { - cmin++ - } + const generatePickerColumns = (): PickerOptions[] => { + const dateRanges = generateDatePickerRanges( + type, + innerDate, + startDate, + endDate + ) - if (cmin <= Number(val)) { - index++ - } - } + const columns = dateRanges.map((rangeConfig, columnIndex) => { + const { type: columnType, range } = rangeConfig + const selectedValue = getDatePartValue(columnType, innerDate) + + const pickerColumn = generatePickerColumnWithCallback( + range[0], + range[1], + selectedValue, + columnType, + minuteStep, + (selectedIndex, options) => { + pickerValue[columnIndex] = options[selectedIndex]?.value + setPickerValue([...pickerValue]) + }, + showChinese, + zhCNType, + formatter + ) - pickerValue[columnIndex] = arr[index]?.value - setPickerValue([...pickerValue]) + if (filter?.(columnType, pickerColumn)) { + return filter(columnType, pickerColumn) + } - if (filter?.(type, arr)) { - return filter?.(type, arr) - } - return arr - } + return pickerColumn + }) - const getDateIndex = (type: string) => { - const date = new Date(selectedDate) - if (!selectedDate) return 0 - if (type === 'year') { - return date.getFullYear() - } - if (type === 'month') { - return date.getMonth() + 1 - } - if (type === 'day') { - return date.getDate() - } - if (type === 'hour') { - return date.getHours() - } - if (type === 'minute') { - return date.getMinutes() - } - if (type === 'seconds') { - return date.getSeconds() - } - return 0 + return columns || [] } - const columns = () => { - const val = ranges().map((res, columnIndex) => { - return generateColumn( - res.range[0], - res.range[1], - getDateIndex(res.type), - res.type, - columnIndex - ) - }) - return val || [] - } + useEffect(() => { + setInnerDate(selectedDate) + }, [selectedDate]) useEffect(() => { - setPickerOptions(columns()) - }, [selectedDate, startDate, endDate]) + setPickerOptions(generatePickerColumns()) + }, [innerDate, startDate, endDate]) return ( -
- {pickerOptions.length > 0 && ( - onConfirm && onConfirm(selectedOptions, selectedValue)} - onChange={({ value, index, selectedOptions }) => { - handlePickerChange(selectedOptions, value, index) - }} - threeDimensional={threeDimensional} - /> - )} -
+ <> + {typeof children === 'function' && children(selectedDate)} +
+ {pickerOptions.length && ( + { + handleChange(selectedOptions, value, index) + }} + threeDimensional={threeDimensional} + /> + )} +
+ ) } -DatePicker.displayName = 'NutDatePicker' +const DatePicker = React.forwardRef>( + InternalPicker +) +export default DatePicker diff --git a/src/packages/datepicker/demos/h5/demo1.tsx b/src/packages/datepicker/demos/h5/demo1.tsx index 769885abf8..82b73fcd4e 100644 --- a/src/packages/datepicker/demos/h5/demo1.tsx +++ b/src/packages/datepicker/demos/h5/demo1.tsx @@ -5,27 +5,51 @@ import { PickerValue, PickerOptions, } from '@nutui/nutui-react' +import isEqual from 'react-fast-compare' + +const useDatePicker = (initialDate: Date) => { + const defaultDateObj = { + year: initialDate.getFullYear(), + month: initialDate.getMonth() + 1, + day: initialDate.getDate(), + } + + const defaultDesc = `${defaultDateObj.year}年${defaultDateObj.month}月${defaultDateObj.day}日` + const defaultValue = Object.values(defaultDateObj).join('-') + + return { defaultDesc, defaultValue } +} const Demo1 = () => { - const defaultValue = new Date() - const defaultDescription = `${defaultValue.getFullYear()}-${ - defaultValue.getMonth() + 1 - }-${defaultValue.getDate()}` - const [show, setShow1] = useState(false) - const [desc1, setDesc1] = useState(defaultDescription) + const defaultDate = new Date() + const { defaultDesc: defaultDesc1, defaultValue: defaultValue1 } = + useDatePicker(defaultDate) + const { defaultDesc: defaultDesc2, defaultValue: defaultValue2 } = + useDatePicker(defaultDate) + + const [show1, setShow1] = useState(false) + const [desc1, setDesc1] = useState(defaultDesc1) - const [value, setValue] = useState('2023/01/01') + const [value, setValue] = useState(defaultValue2) const [show2, setShow2] = useState(false) - const [desc2, setDesc2] = useState('') - const confirm1 = (values: PickerValue[], options: PickerOptions) => { - setDesc1(options.map((option) => option.label).join(' ')) - } - const change = (options: PickerOptions, values: PickerValue[]) => { - const v = values.join('/') + const [desc2, setDesc2] = useState(defaultDesc2) + + const handleConfirm = + (setDesc: (desc: string) => void, setValue?: (value: string) => void) => + (options: PickerOptions, values: PickerValue[]) => { + if (setValue) { + if (isEqual(values, ['2026', '02', '21'])) { + setValue('2026/03/22') + setDesc('2026年03月22日') + } else { + setValue(values.join('/')) + setDesc(options.map((option) => option.label).join('')) + } + } else { + setDesc(options.map((option) => option.label).join('')) + } + } - setValue(v) - setDesc2(options.map((option) => option.label).join(' ')) - } return ( <> { /> setShow1(false)} - onConfirm={(options, values) => { - setShow1(false) - confirm1(values, options) - console.log('onconfirm', values, options) - }} + onClose={() => setShow1(false)} + onConfirm={handleConfirm(setDesc1)} /> { showChinese onClose={() => setShow2(false)} threeDimensional={false} - onChange={(options, values) => change(options, values)} + onConfirm={handleConfirm(setDesc2, setValue)} /> ) } + export default Demo1 diff --git a/src/packages/datepicker/demos/h5/demo2.tsx b/src/packages/datepicker/demos/h5/demo2.tsx index d1d4975610..cea8badaf4 100644 --- a/src/packages/datepicker/demos/h5/demo2.tsx +++ b/src/packages/datepicker/demos/h5/demo2.tsx @@ -26,9 +26,9 @@ const Demo2 = () => { /> setShow(false)} diff --git a/src/packages/datepicker/demos/h5/demo8.tsx b/src/packages/datepicker/demos/h5/demo8.tsx index 79886c8d19..f821923cec 100644 --- a/src/packages/datepicker/demos/h5/demo8.tsx +++ b/src/packages/datepicker/demos/h5/demo8.tsx @@ -13,9 +13,13 @@ const Demo8 = () => { const defaultValue = new Date() const defaultDescription = `${defaultValue.getFullYear()}-${ defaultValue.getMonth() + 1 - }-${defaultValue.getDate()}` + }-${defaultValue.getDate()} 06:00` const [show, setShow] = useState(false) - const [desc, setDesc] = useState(`${defaultDescription} 00`) + const [desc, setDesc] = useState( + `${defaultValue.getFullYear()}年${ + defaultValue.getMonth() + 1 + }月${defaultValue.getDate()}日 06时` + ) const confirm = (values: PickerValue[], options: PickerOptions) => { setDesc(options.map((option) => option.label).join(' ')) @@ -26,7 +30,7 @@ const Demo8 = () => { } return options } - const formatter1 = (type: string, option: PickerOption) => { + const formatter = (type: string, option: PickerOption) => { switch (type) { case 'year': option.label += `年` @@ -48,7 +52,7 @@ const Demo8 = () => { return ( <> setShow(true)} /> @@ -59,7 +63,7 @@ const Demo8 = () => { endDate={endDate} visible={show} defaultValue={new Date(`${defaultDescription}`)} - formatter={formatter1} + formatter={formatter} minuteStep={5} filter={filter} onClose={() => setShow(false)} diff --git a/src/packages/datepicker/demos/taro/demo1.tsx b/src/packages/datepicker/demos/taro/demo1.tsx index 1a9c273446..a5690b6864 100644 --- a/src/packages/datepicker/demos/taro/demo1.tsx +++ b/src/packages/datepicker/demos/taro/demo1.tsx @@ -2,30 +2,54 @@ import React, { useState } from 'react' import { DatePicker, Cell, - PickerValue, PickerOptions, + PickerValue, } from '@nutui/nutui-react-taro' +import isEqual from 'react-fast-compare' + +const useDatePicker = (initialDate: Date) => { + const defaultDateObj = { + year: initialDate.getFullYear(), + month: initialDate.getMonth() + 1, + day: initialDate.getDate(), + } + + const defaultDesc = `${defaultDateObj.year}年${defaultDateObj.month}月${defaultDateObj.day}日` + const defaultValue = Object.values(defaultDateObj).join('-') + + return { defaultDesc, defaultValue } +} const Demo1 = () => { - const defaultValue = new Date() - const defaultDescription = `${defaultValue.getFullYear()}-${ - defaultValue.getMonth() + 1 - }-${defaultValue.getDate()}` + const defaultDate = new Date() + const { defaultDesc: defaultDesc1, defaultValue: defaultValue1 } = + useDatePicker(defaultDate) + const { defaultDesc: defaultDesc2, defaultValue: defaultValue2 } = + useDatePicker(defaultDate) + const [show1, setShow1] = useState(false) - const [desc1, setDesc1] = useState(defaultDescription) + const [desc1, setDesc1] = useState(defaultDesc1) - const [value, setValue] = useState('2023/01/01') + const [value, setValue] = useState(defaultValue2) const [show2, setShow2] = useState(false) - const [desc2, setDesc2] = useState('') - const confirm = (values: PickerValue[], options: PickerOptions) => { - setDesc1(options.map((option) => option.label).join(' ')) - } - const change = (options: PickerOptions, values: PickerValue[]) => { - const v = values.join('/') + const [desc2, setDesc2] = useState(defaultDesc2) + + const handleConfirm = + (setDesc: (desc: string) => void, setValue?: (value: string) => void) => + (options: PickerOptions, values: PickerValue[]) => { + if (setValue) { + if (isEqual(values, ['2026', '02', '21'])) { + setValue('2026/03/22') + setDesc('2026年03月22日') + } else { + setValue(values.join('/')) + setDesc(options.map((option) => option.label).join('')) + } + } else { + setDesc(options.map((option) => option.label).join('')) + } + } - setValue(v) - setDesc2(options.map((option) => option.label).join(' ')) - } return ( <> { pickerProps={{ popupProps: { zIndex: 1220 }, }} - defaultValue={new Date(`${defaultDescription}`)} + defaultValue={new Date(defaultValue1)} showChinese - onCancel={() => setShow1(false)} - onConfirm={(options, values) => { - setShow1(false) - confirm(values, options) - console.log('onconfirm') - }} + onClose={() => setShow1(false)} + onConfirm={handleConfirm(setDesc1)} /> { showChinese onClose={() => setShow2(false)} threeDimensional={false} - onChange={(options, values) => change(options, values)} + onConfirm={handleConfirm(setDesc2, setValue)} /> ) } + export default Demo1 diff --git a/src/packages/datepicker/demos/taro/demo2.tsx b/src/packages/datepicker/demos/taro/demo2.tsx index 9e57427a40..0a6e49eaf8 100644 --- a/src/packages/datepicker/demos/taro/demo2.tsx +++ b/src/packages/datepicker/demos/taro/demo2.tsx @@ -24,9 +24,9 @@ const Demo2 = () => { /> setShow(false)} diff --git a/src/packages/datepicker/demos/taro/demo8.tsx b/src/packages/datepicker/demos/taro/demo8.tsx index 42441084f5..2031efe015 100644 --- a/src/packages/datepicker/demos/taro/demo8.tsx +++ b/src/packages/datepicker/demos/taro/demo8.tsx @@ -13,9 +13,13 @@ const Demo8 = () => { const defaultValue = new Date() const defaultDescription = `${defaultValue.getFullYear()}-${ defaultValue.getMonth() + 1 - }-${defaultValue.getDate()}` + }-${defaultValue.getDate()} 06:00` const [show, setShow] = useState(false) - const [desc, setDesc] = useState(`${defaultDescription} 00`) + const [desc, setDesc] = useState( + `${defaultValue.getFullYear()}年${ + defaultValue.getMonth() + 1 + }月${defaultValue.getDate()}日 06时` + ) const confirm = (values: PickerValue[], options: PickerOptions) => { setDesc(options.map((option) => option.label).join(' ')) @@ -48,7 +52,7 @@ const Demo8 = () => { return ( <> setShow(true)} /> diff --git a/src/packages/datepicker/doc.en-US.md b/src/packages/datepicker/doc.en-US.md index 03fa3aff30..f330ddff9d 100644 --- a/src/packages/datepicker/doc.en-US.md +++ b/src/packages/datepicker/doc.en-US.md @@ -89,7 +89,7 @@ import { DatePicker } from '@nutui/nutui' | endDate | End date | `Date` | `Ten years later on December 31` | | pickerProps | picker props | `object` | `-` | | formatter | Option text formatter | `(type: string, option: PickerOption) => PickerOption` | `-` | -| filter | Option filter | `(type: string, option: PickerOption) => PickerOption[]` | `-` | +| filter | Option filter | `(type: string, options: PickerOptions) => PickerOptions` | `-` | | threeDimensional | Turn on 3D effects | `boolean` | `true` | | onConfirm | Emitted when click confirm button. | `(options, value) => void` | `-` | | onCancel | Emitted when click cancel button. | `() => void` | `-` | diff --git a/src/packages/datepicker/doc.md b/src/packages/datepicker/doc.md index c7b3d741cd..fff8fc49e5 100644 --- a/src/packages/datepicker/doc.md +++ b/src/packages/datepicker/doc.md @@ -99,7 +99,7 @@ DatetimePicker 通过 type 属性来定义需要选择的时间类型。将 type | endDate | 结束日期 | `Date` | `十年后` | | pickerProps | 透传picker属性 | `object` | `-` | | formatter | 选项格式化函数 | `(type: string, option: PickerOption) => PickerOption` | `-` | -| filter | 选项过滤函数 | `(type: string, option: PickerOption) => PickerOption[]` | `-` | +| filter | 选项过滤函数 | `(type: string, options: PickerOptions) => PickerOptions` | `-` | | threeDimensional | 是否开启3D效果 | `boolean` | `true` | | onConfirm | 点击确定按钮时触发 | `(options, value) => void` | `-` | | onCancel | 点击取消按钮时触发 | `() => void` | `-` | diff --git a/src/packages/datepicker/doc.taro.md b/src/packages/datepicker/doc.taro.md index 766a1230b4..8328b12d9c 100644 --- a/src/packages/datepicker/doc.taro.md +++ b/src/packages/datepicker/doc.taro.md @@ -99,7 +99,7 @@ DatetimePicker 通过 type 属性来定义需要选择的时间类型。将 type | endDate | 结束日期 | `Date` | `十年后` | | formatter | 选项格式化函数 | `(type: string, option: PickerOption) => PickerOption` | `-` | | pickerProps | 透传picker属性 | `object` | `-` | -| filter | 选项过滤函数 | `(type: string, option: PickerOption) => PickerOption[]` | `-` | +| filter | 选项过滤函数 | `(type: string, options: PickerOptions) => PickerOptions` | `-` | | threeDimensional | 是否开启3D效果 | `boolean` | `true` | | onConfirm | 点击确定按钮时触发 | `(options, value) => void` | `-` | | onCancel | 点击取消按钮时触发 | `() => void` | `-` | diff --git a/src/packages/datepicker/doc.zh-TW.md b/src/packages/datepicker/doc.zh-TW.md index c364f20277..21850c8ebe 100644 --- a/src/packages/datepicker/doc.zh-TW.md +++ b/src/packages/datepicker/doc.zh-TW.md @@ -99,7 +99,7 @@ DatetimePicker 通過 type 屬性來定義需要選擇的時間類型。將 type | endDate | 結束日期 | `Date` | `十年後` | | formatter | 選項格式化函數 | `(type: string, option: PickerOption) => PickerOption` | `-` | | pickerProps | 透传 picker 屬性 | `object` | `-` | -| filter | 選項過濾函數 | `(type: string, option: PickerOption) => PickerOption[]` | `-` | +| filter | 選項過濾函數 | `(type: string, options: PickerOptions) => PickerOptions` | `-` | | threeDimensional | 是否開啟3D效果 | `boolean` | `true` | | onConfirm | 點擊確定按鈕時觸發 | `(options, value) => void` | `-` | | onCancel | 點擊取消按鈕時觸發 | `() => void` | `-` | diff --git a/src/packages/datepicker/index.taro.ts b/src/packages/datepicker/index.taro.ts index d990ce8459..d50f1c96e8 100644 --- a/src/packages/datepicker/index.taro.ts +++ b/src/packages/datepicker/index.taro.ts @@ -1,4 +1,4 @@ -import { DatePicker } from './datepicker.taro' +import DatePicker from './datepicker.taro' -export type { DatePickerProps } from './datepicker.taro' +export type { DatePickerProps } from './types.taro' export default DatePicker diff --git a/src/packages/datepicker/index.ts b/src/packages/datepicker/index.ts index 0c83b853f5..976678232c 100644 --- a/src/packages/datepicker/index.ts +++ b/src/packages/datepicker/index.ts @@ -1,4 +1,4 @@ -import { DatePicker } from './datepicker' +import DatePicker from './datepicker' -export type { DatePickerProps } from './datepicker' +export type { DatePickerProps } from './types' export default DatePicker diff --git a/src/packages/datepicker/types.taro.ts b/src/packages/datepicker/types.taro.ts new file mode 100644 index 0000000000..d4bfaa00d5 --- /dev/null +++ b/src/packages/datepicker/types.taro.ts @@ -0,0 +1,18 @@ +import { PickerProps } from '@/packages/picker/types.taro' +import { DatePickerProps as DatePickerWebProps } from './types' + +export type DatePickerProps = Omit & { + pickerProps: Partial< + Omit< + PickerProps, + | 'defaultValue' + | 'threeDimensional' + | 'title' + | 'value' + | 'onConfirm' + | 'onClose' + | 'onCancel' + | 'onChange' + > + > +} diff --git a/src/packages/datepicker/types.ts b/src/packages/datepicker/types.ts new file mode 100644 index 0000000000..6d2a44ac12 --- /dev/null +++ b/src/packages/datepicker/types.ts @@ -0,0 +1,56 @@ +import { BasicComponent } from '@/utils/typings' +import { PickerProps } from '@/packages/picker/types' +import { PickerOptions, PickerValue, PickerOption } from '@/packages/pickerview' + +export type DatePickerRef = DatePickerActions +export type DatePickerActions = { + open: () => void + close: () => void +} + +export interface DatePickerProps extends BasicComponent { + value?: Date + defaultValue?: Date + visible: boolean + title: string + type: + | 'date' + | 'time' + | 'year-month' + | 'month-day' + | 'datehour' + | 'datetime' + | 'hour-minutes' + showChinese: boolean + minuteStep: number + startDate: Date + endDate: Date + threeDimensional: boolean + pickerProps: Partial< + Omit< + PickerProps, + | 'defaultValue' + | 'threeDimensional' + | 'title' + | 'value' + | 'onConfirm' + | 'onClose' + | 'onCancel' + | 'onChange' + > + > + formatter: (type: string, option: PickerOption) => PickerOption + filter: (type: string, options: PickerOptions) => PickerOptions + onClose: () => void + onCancel: () => void + onConfirm: ( + selectedOptions: PickerOptions, + selectedValue: PickerValue[] + ) => void + onChange?: ( + selectedOptions: PickerOptions, + selectedValue: PickerValue[], + columnIndex: number + ) => void + children?: any +} diff --git a/src/packages/datepicker/utils.ts b/src/packages/datepicker/utils.ts new file mode 100644 index 0000000000..99648a8df2 --- /dev/null +++ b/src/packages/datepicker/utils.ts @@ -0,0 +1,336 @@ +import { padZero } from '@/utils/pad-zero' +import { isDate } from '@/utils/is-date' +import { + PickerOption, + PickerOptions, + PickerValue, +} from '@/packages/pickerview/types' + +/** + * 获取指定年份和月份的最后一天 + * @param year - 年份 + * @param month - 月份(1 到 12) + * @returns 返回该月份的最后一天 + */ +export function getLastDayOfMonth(year: number, month: number): number { + return new Date(year, month, 0).getDate() +} + +/** + * 根据类型和日期值,计算并返回日期边界值(年、月、日、时、分、秒) + * @param type 边界类型:'min' 表示最小值,'max' 表示最大值 + * @param value 传入的日期值 + * @param startDate 传入的开始时间 + * @param endDate 传入的结束时间 + * @returns 返回包含边界值的对象 + */ +export const calculateDateBoundary = ( + type: 'min' | 'max', + value: Date, + startDate: Date, + endDate: Date +) => { + const boundary = type === 'min' ? startDate : endDate + const year = boundary.getFullYear() + const isMax = type === 'max' + let month = isMax ? 12 : 1 + let date = isMax + ? getLastDayOfMonth(value.getFullYear(), value.getMonth() + 1) + : 1 + let hour = isMax ? 23 : 0 + let minute = isMax ? 59 : 0 + + if (value.getFullYear() === year) { + month = boundary.getMonth() + 1 + + if (value.getMonth() + 1 === month) { + date = boundary.getDate() + + if (value.getDate() === date) { + hour = boundary.getHours() + + if (value.getHours() === hour) { + minute = boundary.getMinutes() + } + } + } + } + + // 返回边界值的对象 + return { + [`${type}Year`]: year, + [`${type}Month`]: month, + [`${type}Date`]: date, + [`${type}Hour`]: hour, + [`${type}Minute`]: minute, + [`${type}Seconds`]: minute, // 返回秒数(与分钟相同) + } +} + +/** + * 根据选中的日期和类型,生成日期选择器的范围配置 + * @returns {Array} 返回日期选择器的范围配置数组 + */ +export const generateDatePickerRanges = ( + type: string, + selectedDate: number, + startDate: Date, + endDate: Date +) => { + const selected = new Date(selectedDate) + if (!selected) return [] + + // 获取最大和最小边界值 + const { maxYear, maxDate, maxMonth, maxHour, maxMinute, maxSeconds } = + calculateDateBoundary('max', selected, startDate, endDate) + const { minYear, minDate, minMonth, minHour, minMinute, minSeconds } = + calculateDateBoundary('min', selected, startDate, endDate) + + const fullRanges = [ + { type: 'year', range: [minYear, maxYear] }, + { type: 'month', range: [minMonth, maxMonth] }, + { type: 'day', range: [minDate, maxDate] }, + { type: 'hour', range: [minHour, maxHour] }, + { type: 'minute', range: [minMinute, maxMinute] }, + { type: 'seconds', range: [minSeconds, maxSeconds] }, + ] + + // 根据类型返回对应的范围配置 + switch (type.toLocaleLowerCase()) { + case 'date': + return fullRanges.slice(0, 3) + case 'datetime': + return fullRanges.slice(0, 5) + case 'time': + return fullRanges.slice(3, 6) + case 'year-month': + return fullRanges.slice(0, 2) + case 'hour-minutes': + return fullRanges.slice(3, 5) + case 'month-day': + return fullRanges.slice(1, 3) + case 'datehour': + return fullRanges.slice(0, 4) + default: + return fullRanges + } +} + +/** + * 根据类型获取日期对象中对应的值 + * @param type 需要获取的日期部分(如 'year', 'month', 'day' 等) + * @param selectedDate 选中的日期时间戳 + * @returns 返回日期对象中对应部分的值,如果类型无效或日期无效,返回 0 + */ +export const getDatePartValue = ( + type: string, + selectedDate: number +): number => { + const date = new Date(selectedDate) + + if (!selectedDate) return 0 + + switch (type) { + case 'year': + return date.getFullYear() + case 'month': + return date.getMonth() + 1 + case 'day': + return date.getDate() + case 'hour': + return date.getHours() + case 'minute': + return date.getMinutes() + case 'seconds': + return date.getSeconds() + default: + return 0 + } +} + +/** + * 生成 Picker 的列数据,并触发回调函数返回选中索引 + * @param min 最小值 + * @param max 最大值 + * @param currentValue 当前选中的值 + * @param type 列的类型(如 'year', 'month', 'minute' 等) + * @param minuteStep 分钟步长(仅当类型为 'minute' 时生效) + * @param callback 回调函数,用于返回选中索引 + * @returns 返回生成的 Picker 列数据 + */ +export const generatePickerColumnWithCallback = ( + min: number, + max: number, + currentValue: number | string, + type: string, + minuteStep: number, + callback: (selectedIndex: number, options: PickerOptions) => void, + showChinese: boolean, + zhCNType: { [key: string]: string }, + formatter?: (type: string, option: PickerOption) => PickerOption +): PickerOptions => { + let currentMin = min + const options: PickerOptions = [] + let selectedIndex = 0 + + // 遍历从最小值到最大值的范围 + while (currentMin <= max) { + // 将当前值格式化为 PickerOption 并添加到数组中 + options.push( + formatPickerOption(type, currentMin, showChinese, zhCNType, formatter) + ) + + // 根据类型决定步长:如果是分钟,使用 minuteStep,否则步长为 1 + if (type === 'minute') { + currentMin += minuteStep + } else { + currentMin++ + } + + // 如果当前值小于等于选中的值,更新选中索引 + if (currentMin <= Number(currentValue)) { + selectedIndex++ + } + } + + callback(selectedIndex, options) + + return options +} + +/** + * 格式化 Picker 选项 + * @param type 选项类型(如 'year', 'month', 'minute' 等) + * @param value 选项的值 + * @param showChinese 是否显示中文文本 + * @param zhCNType 中文文本映射对象 + * @param formatter 自定义格式化函数 + * @returns 返回格式化后的 Picker 选项 + */ +export const formatPickerOption = ( + type: string, + value: string | number, + showChinese: boolean, + zhCNType: { [key: string]: string }, + formatter?: (type: string, option: PickerOption) => PickerOption +): PickerOption => { + if (formatter) { + return formatter(type, { + label: padZero(value, 2), + value: padZero(value, 2), + }) + } + + const paddedValue = padZero(value, 2) + + const chineseText = showChinese ? zhCNType[type] : '' + + return { + label: paddedValue + chineseText, + value: paddedValue, + } +} + +/** + * 格式化日期值,确保其在 startDate 和 endDate 之间 + */ +export const formatValue = ( + value: Date | null, + startDate: Date, + endDate: Date +) => { + if (!value || (value && !isDate(value))) { + value = startDate + } + return Math.min( + Math.max(value.getTime(), startDate.getTime()), + endDate.getTime() + ) +} + +/** + * 处理 Picker 值变化的逻辑 + * @param selectedOptions 选中的选项数组 + * @param selectedValue 选中的值数组 + * @param index 当前列的索引 + */ +export const handlePickerValueChange = ( + selectedOptions: PickerOptions, + selectedValue: PickerValue[], + index: number, + type: string, + defaultDate: Date, + handleDateComparison: ( + newDate: Date | null, + selectedOptions: PickerOptions, + index: number + ) => void +) => { + const rangeType = type.toLocaleLowerCase() + + if ( + ['date', 'datetime', 'datehour', 'month-day', 'year-month'].includes( + rangeType + ) + ) { + const formattedDate: PickerValue[] = [] + + selectedValue.forEach((item) => { + formattedDate.push(item) + }) + + if (rangeType === 'month-day' && formattedDate.length < 3) { + formattedDate.unshift(new Date(defaultDate).getFullYear()) + } + + if (rangeType === 'year-month' && formattedDate.length < 3) { + formattedDate.push(new Date(defaultDate).getDate()) + } + + const year = Number(formattedDate[0]) + const month = Number(formattedDate[1]) - 1 + const day = Math.min( + Number(formattedDate[2]), + getLastDayOfMonth(year, month + 1) + ) + + let date: Date | null = null + + if ( + rangeType === 'date' || + rangeType === 'month-day' || + rangeType === 'year-month' + ) { + date = new Date(year, month, day) + } else if (rangeType === 'datetime') { + date = new Date( + year, + month, + day, + Number(formattedDate[3]), + Number(formattedDate[4]) + ) + } else if (rangeType === 'datehour') { + date = new Date(year, month, day, Number(formattedDate[3])) + } + + handleDateComparison(date, selectedOptions, index) + } else { + const [hour, minute, seconds] = selectedValue + const currentDate = new Date(defaultDate) + const year = currentDate.getFullYear() + const month = currentDate.getMonth() + const day = currentDate.getDate() + + const date = new Date( + year, + month, + day, + Number(hour), + Number(minute), + rangeType === 'time' ? Number(seconds) : 0 + ) + + handleDateComparison(date, selectedOptions, index) + } +} diff --git a/src/packages/form/demos/h5/demo7.tsx b/src/packages/form/demos/h5/demo7.tsx index 8ba20b1cd3..d0e12c6a7d 100644 --- a/src/packages/form/demos/h5/demo7.tsx +++ b/src/packages/form/demos/h5/demo7.tsx @@ -12,6 +12,7 @@ import { Rate, Range, Toast, + DatePicker, } from '@nutui/nutui-react' import { ArrowRight } from '@nutui/icons-react' @@ -117,6 +118,39 @@ const Demo7 = () => { }}
+ { + return new Date(args[1].join('/')) + }} + onClick={(event, ref: any) => { + ref.open() + }} + initialValue={new Date()} + > + + {(value: any) => { + return ( + } + align="center" + /> + ) + }} + + { }} + { + return new Date(args[1].join('/')) + }} + onClick={(event, ref: any) => { + ref.open() + }} + initialValue={new Date()} + > + + {(value: any) => { + return ( + } + align="center" + /> + ) + }} + + { return new Promise((resolve) => { @@ -13,7 +14,7 @@ interface PickerOption { label: string | number value: string | number disabled?: boolean - children?: PickerOption[] + children?: PickerOptions className?: string | number } diff --git a/src/packages/picker/index.taro.ts b/src/packages/picker/index.taro.ts index ff0b062781..6f6691f2b3 100644 --- a/src/packages/picker/index.taro.ts +++ b/src/packages/picker/index.taro.ts @@ -1,4 +1,4 @@ import Picker from './picker.taro' -export type { PickerProps } from './picker.taro' +export type { PickerProps } from './types.taro' export default Picker diff --git a/src/packages/picker/index.ts b/src/packages/picker/index.ts index 212b25cb51..1314b31597 100644 --- a/src/packages/picker/index.ts +++ b/src/packages/picker/index.ts @@ -1,4 +1,4 @@ import Picker from './picker' -export type { PickerProps } from './picker' +export type { PickerProps } from './types' export default Picker diff --git a/src/packages/picker/picker.taro.tsx b/src/packages/picker/picker.taro.tsx index cba096362d..4f5651654f 100644 --- a/src/packages/picker/picker.taro.tsx +++ b/src/packages/picker/picker.taro.tsx @@ -11,44 +11,17 @@ import isEqual from 'react-fast-compare' import { PickerOptions, PickerValue, - PickerOption, PickerOnChangeCallbackParameter, } from '@/packages/pickerview/types' import PickerView from '@/packages/pickerview/index.taro' -import Popup, { PopupProps } from '@/packages/popup/index.taro' +import Popup from '@/packages/popup/index.taro' import SafeArea from '@/packages/safearea/index.taro' import useRefs from '@/hooks/use-refs' import { useConfig } from '@/packages/configprovider/index.taro' import { usePropsValue } from '@/hooks/use-props-value' -import { BasicComponent, ComponentDefaults } from '@/utils/typings' +import { ComponentDefaults } from '@/utils/typings' import { PickerActions, PickerRef } from './types' - -export interface PickerProps extends Omit { - visible?: boolean | undefined - title?: string - options: PickerOptions[] - value?: PickerValue[] - defaultValue?: PickerValue[] - threeDimensional?: boolean - duration: number | string - closeOnOverlayClick: boolean - renderLabel?: (item: PickerOption) => React.ReactNode - - popupProps: Partial< - Omit - > - onConfirm?: ( - selectedOptions: PickerOptions, - selectedValue: PickerValue[] - ) => void - onCancel?: () => void - onClose?: ( - selectedOptions: PickerOptions, - selectedValue: PickerValue[] - ) => void - onChange?: (args0: PickerOnChangeCallbackParameter) => void - children?: any -} +import { PickerProps } from './types.taro' const defaultProps = { ...ComponentDefaults, @@ -167,7 +140,7 @@ const InternalPicker: ForwardRefRenderFunction< { + onClick={(e: { stopPropagation: () => void }) => { e.stopPropagation() onCancelEvent() }} @@ -177,7 +150,7 @@ const InternalPicker: ForwardRefRenderFunction< {title || ''} { + onClick={(e: { stopPropagation: () => void }) => { e.stopPropagation() onConfirmEvent() }} diff --git a/src/packages/picker/picker.tsx b/src/packages/picker/picker.tsx index a2a965bfc6..6477f9d83c 100644 --- a/src/packages/picker/picker.tsx +++ b/src/packages/picker/picker.tsx @@ -10,44 +10,16 @@ import isEqual from 'react-fast-compare' import { PickerOptions, PickerValue, - PickerOption, PickerOnChangeCallbackParameter, } from '@/packages/pickerview/types' import PickerView from '@/packages/pickerview/index' -import Popup, { PopupProps } from '@/packages/popup/index' +import Popup from '@/packages/popup/index' import SafeArea from '@/packages/safearea/index' import useRefs from '@/hooks/use-refs' import { useConfig } from '@/packages/configprovider' import { usePropsValue } from '@/hooks/use-props-value' -import { BasicComponent, ComponentDefaults } from '@/utils/typings' -import { PickerActions, PickerRef } from './types' - -export interface PickerProps extends Omit { - visible?: boolean | undefined - title?: string - options: PickerOptions[] - value?: PickerValue[] - defaultValue?: PickerValue[] - threeDimensional?: boolean - duration: number | string - closeOnOverlayClick: boolean - renderLabel?: (item: PickerOption) => React.ReactNode - - popupProps: Partial< - Omit - > - onConfirm?: ( - selectedOptions: PickerOptions, - selectedValue: PickerValue[] - ) => void - onCancel?: () => void - onClose?: ( - selectedOptions: PickerOptions, - selectedValue: PickerValue[] - ) => void - onChange?: (args0: PickerOnChangeCallbackParameter) => void - children?: any -} +import { ComponentDefaults } from '@/utils/typings' +import { PickerActions, PickerProps, PickerRef } from './types' const defaultProps = { ...ComponentDefaults, diff --git a/src/packages/picker/types.taro.ts b/src/packages/picker/types.taro.ts new file mode 100644 index 0000000000..e2b2ea9777 --- /dev/null +++ b/src/packages/picker/types.taro.ts @@ -0,0 +1,8 @@ +import { PopupProps } from '@/packages/popup/types.taro' +import { PickerProps as PickerWebProps } from './types' + +export type PickerProps = Omit & { + popupProps: Partial< + Omit + > +} diff --git a/src/packages/picker/types.ts b/src/packages/picker/types.ts index ae6fabdd59..147341b1c5 100644 --- a/src/packages/picker/types.ts +++ b/src/packages/picker/types.ts @@ -1,6 +1,42 @@ +import { PopupProps } from '@/packages/popup/types' +import { BasicComponent } from '@/utils/typings' +import { + PickerOnChangeCallbackParameter, + PickerOption, + PickerOptions, + PickerValue, +} from '@/packages/pickerview/types' + export type PickerRef = PickerActions export type PickerActions = { open: () => void close: () => void } export type ColumnsType = 'single' | 'multiple' | 'cascade' + +export interface PickerProps extends Omit { + visible?: boolean | undefined + title?: string + options: PickerOptions[] + value?: PickerValue[] + defaultValue?: PickerValue[] + threeDimensional?: boolean + duration: number | string + closeOnOverlayClick: boolean + renderLabel?: (item: PickerOption) => React.ReactNode + + popupProps: Partial< + Omit + > + onConfirm?: ( + selectedOptions: PickerOptions, + selectedValue: PickerValue[] + ) => void + onCancel?: () => void + onClose?: ( + selectedOptions: PickerOptions, + selectedValue: PickerValue[] + ) => void + onChange?: (args0: PickerOnChangeCallbackParameter) => void + children?: any +} From 5c0f71c0cbcc2ee13eadc8e8c3052a47361831ef Mon Sep 17 00:00:00 2001 From: "Alex.hxy" <1872591453@qq.com> Date: Fri, 28 Feb 2025 16:45:15 +0800 Subject: [PATCH 15/26] fix: correct some docs content (#3030) * fix: update dpcs content * fix: update dpcs content * fix: update dpcs content --- src/packages/card/doc.en-US.md | 2 +- src/packages/card/doc.md | 2 +- src/packages/card/doc.taro.md | 2 +- src/packages/card/doc.zh-TW.md | 2 +- src/packages/collapse/doc.en-US.md | 2 +- src/packages/collapse/doc.md | 2 +- src/packages/collapse/doc.taro.md | 2 +- src/packages/collapse/doc.zh-TW.md | 2 +- src/packages/sticky/doc.taro.md | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/packages/card/doc.en-US.md b/src/packages/card/doc.en-US.md index 48d0797ac3..1873c10066 100644 --- a/src/packages/card/doc.en-US.md +++ b/src/packages/card/doc.en-US.md @@ -5,7 +5,7 @@ Used to display product pictures, prices and other information. ## Import ```tsx -import { Card, Price, Tag } from '@nutui/nutui-react' +import { Card } from '@nutui/nutui-react' ``` ## Demo diff --git a/src/packages/card/doc.md b/src/packages/card/doc.md index 4945e7ab21..bfe16e4830 100644 --- a/src/packages/card/doc.md +++ b/src/packages/card/doc.md @@ -5,7 +5,7 @@ ## 引入 ```tsx -import { Card, Price, Tag } from '@nutui/nutui-react' +import { Card } from '@nutui/nutui-react' ``` ## 示例代码 diff --git a/src/packages/card/doc.taro.md b/src/packages/card/doc.taro.md index dfd0b80c7c..b8939972b6 100644 --- a/src/packages/card/doc.taro.md +++ b/src/packages/card/doc.taro.md @@ -5,7 +5,7 @@ ## 引入 ```tsx -import { Card, Price, Tag } from '@nutui/nutui-react-taro' +import { Card } from '@nutui/nutui-react-taro' ``` ## 示例代码 diff --git a/src/packages/card/doc.zh-TW.md b/src/packages/card/doc.zh-TW.md index 064e5048f2..4d7e470820 100644 --- a/src/packages/card/doc.zh-TW.md +++ b/src/packages/card/doc.zh-TW.md @@ -5,7 +5,7 @@ ## 引入 ```tsx -import { Card, Price, Tag } from '@nutui/nutui-react' +import { Card } from '@nutui/nutui-react' ``` ## 示例代碼 diff --git a/src/packages/collapse/doc.en-US.md b/src/packages/collapse/doc.en-US.md index 5f99d9a566..cce867ac30 100644 --- a/src/packages/collapse/doc.en-US.md +++ b/src/packages/collapse/doc.en-US.md @@ -5,7 +5,7 @@ Place the content in multiple folded panels, and click the panel title to expand ## Import ```tsx -import { Collapse } from 'nutui-react' +import { Collapse } from '@nutui/nutui-react' ``` ## Code demonstration diff --git a/src/packages/collapse/doc.md b/src/packages/collapse/doc.md index 0cbe106fe4..71894472f9 100644 --- a/src/packages/collapse/doc.md +++ b/src/packages/collapse/doc.md @@ -5,7 +5,7 @@ ## 引入 ```tsx -import { Collapse } from 'nutui-react' +import { Collapse } from '@nutui/nutui-react' ``` ## 示例代码 diff --git a/src/packages/collapse/doc.taro.md b/src/packages/collapse/doc.taro.md index 148a732b4e..1e4f807f36 100644 --- a/src/packages/collapse/doc.taro.md +++ b/src/packages/collapse/doc.taro.md @@ -5,7 +5,7 @@ ## 引入 ```tsx -import { Collapse } from 'nutui-react-taro' +import { Collapse } from '@nutui/nutui-react-taro' ``` ## 示例代码 diff --git a/src/packages/collapse/doc.zh-TW.md b/src/packages/collapse/doc.zh-TW.md index 4ef4dee47f..13be92a927 100644 --- a/src/packages/collapse/doc.zh-TW.md +++ b/src/packages/collapse/doc.zh-TW.md @@ -5,7 +5,7 @@ ## 引入 ```tsx -import { Collapse } from 'nutui-react' +import { Collapse } from '@nutui/nutui-react' ``` ## 示例代碼 diff --git a/src/packages/sticky/doc.taro.md b/src/packages/sticky/doc.taro.md index 63a2e5c844..cc8dbdaf52 100644 --- a/src/packages/sticky/doc.taro.md +++ b/src/packages/sticky/doc.taro.md @@ -2,7 +2,7 @@ 效果同 css 中的 position: sticky,对低端浏览器可使用其做兼容 -> 支持吸顶、吸底、容器内吸顶效果,也可以使用官方sticky组件 https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/extended/component-plus/sticky.html +> 支持吸顶、吸底、容器内吸顶效果,也可以使用官方[sticky组件](https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/extended/component-plus/sticky.html) ## 引入 From 3080c9cc3d6f5ec89e69c4db3ddefbde3fb7dc2a Mon Sep 17 00:00:00 2001 From: xiaoyatong <84436086+xiaoyatong@users.noreply.github.com> Date: Fri, 28 Feb 2025 16:47:13 +0800 Subject: [PATCH 16/26] docs: update configprovider docs (#3031) --- src/packages/configprovider/demo.taro.tsx | 24 +++++++++++++---------- src/packages/configprovider/doc.taro.md | 2 +- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/packages/configprovider/demo.taro.tsx b/src/packages/configprovider/demo.taro.tsx index af0200bed0..c395dd7ff6 100644 --- a/src/packages/configprovider/demo.taro.tsx +++ b/src/packages/configprovider/demo.taro.tsx @@ -8,26 +8,30 @@ import Demo3 from './demos/taro/demo3' import Demo4 from './demos/taro/demo4' import Demo5 from './demos/taro/demo5' import { useTranslate } from '@/sites/assets/locale/taro' +import { harmony } from '@/utils/platform-taro' const ConfigProviderDemo = () => { const [translated] = useTranslate({ 'zh-CN': { - title1: 'Textarea 默认', - title2: 'Textarea 英文', + title1: 'Textarea 默认-禁用', + title2: 'Textarea 英文-禁用', defaultTheme: '默认主题', - customTheme: '定制主题', + customTheme: `定制主题${harmony() ? '【暂不支持】' : ''}`, + RTL: harmony() ? 'RTL【暂不支持】' : 'RTL', }, 'zh-TW': { - title1: '默認用法', - title2: 'Textarea 英文', + title1: 'Textarea 默認用法-禁用', + title2: 'Textarea 英文-禁用', defaultTheme: '默認主題', - customTheme: '定制主題', + customTheme: `定制主題${harmony() ? '【暂不支持】' : ''}`, + RTL: harmony() ? 'RTL【暂不支持】' : 'RTL', }, 'en-US': { - title1: 'Textarea default', - title2: 'Textarea en-US', + title1: 'Textarea default + disabled', + title2: 'Textarea en-US + disabled', customTheme: 'Custom Theme', - defaultTheme: 'Default Theme', + defaultTheme: `Default Theme ${harmony() ? '[Pendding]' : ''}`, + RTL: harmony() ? 'RTL[Pendding]' : 'RTL', }, }) return ( @@ -42,7 +46,7 @@ const ConfigProviderDemo = () => { {translated.title2} - RTL + {translated.RTL} diff --git a/src/packages/configprovider/doc.taro.md b/src/packages/configprovider/doc.taro.md index a3c9c01f49..e4b243fb5a 100644 --- a/src/packages/configprovider/doc.taro.md +++ b/src/packages/configprovider/doc.taro.md @@ -29,7 +29,7 @@ NutUI-React 可以通过 [CSS 变量](https://developer.mozilla.org/zh-CN/docs/W } ``` -> @nutui/nutui-react 中带了两个主题文件 默认主题:@nutui/nutui-react/dist/styles/themes/default.css; 暗黑主题:@nutui/nutui-react/dist/styles/themes/dark.css; 如果想使用暗黑主题,可以在项目中导入暗黑主题文件。 +> @nutui/nutui-react-taro 中带了两个主题文件 默认主题:@nutui/nutui-react-taro/dist/styles/themes/default.css; 暗黑主题:@nutui/nutui-react-taro/dist/styles/themes/dark.css; 如果想使用暗黑主题,可以在项目中导入暗黑主题文件。 #### 通过 ConfigProvider 覆盖 From 7e1f79b6f30a4e06cb968cb6a38a0422f1e300d8 Mon Sep 17 00:00:00 2001 From: xiaoyatong <84436086+xiaoyatong@users.noreply.github.com> Date: Fri, 28 Feb 2025 20:06:44 +0800 Subject: [PATCH 17/26] =?UTF-8?q?fix:=20popup=20=E9=B8=BF=E8=92=99?= =?UTF-8?q?=E9=80=82=E9=85=8D=E5=BC=B9=E5=87=BA=E6=97=B6=E9=80=80=E5=87=BA?= =?UTF-8?q?app=E7=9A=84=E9=97=AE=E9=A2=98=20(#3033)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/packages/popup/popup.taro.tsx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/packages/popup/popup.taro.tsx b/src/packages/popup/popup.taro.tsx index 760ba8daa1..0afe15ec73 100644 --- a/src/packages/popup/popup.taro.tsx +++ b/src/packages/popup/popup.taro.tsx @@ -208,7 +208,7 @@ export const Popup: FunctionComponent< const renderNode = () => { return ( <> - {overlay && ( + {overlay ? ( + > + {renderPop()} + + ) : ( + renderPop() )} - {renderPop()} ) } From 9f7341f4476a34d889a59cdb760482aae2a0de1a Mon Sep 17 00:00:00 2001 From: oasis <12181600+oasis-cloud@users.noreply.github.com> Date: Fri, 28 Feb 2025 21:33:55 +0800 Subject: [PATCH 18/26] fix: harmony review (#3002) * fix: checkbox review * fix: input review * fix: searchbar review * fix: loading review * fix: indicator review * fix: radio review * fix: numberkeyboard review * fix: button review * fix: linheight * feat: add new css var * feat: update docs * fix: indicator * fix: checkbox * fix: checkbox * test: update * test: update * feat: update demos * fix: checkbox * fix: indicator * fix: indicator * fix: navbar * fix: css var * chore: update size * chore: update size * docs: update docs * docs: update docs --- package.json | 2 +- pnpm-lock.yaml | 137 ++++++++++-------- src/packages/button/button.scss | 1 + src/packages/button/demos/taro/demo4.tsx | 47 +++--- src/packages/button/demos/taro/demo5.tsx | 52 +++---- .../__snapshots__/checkbox.spec.tsx.snap | 26 ++-- .../checkbox/__test__/checkbox.spec.tsx | 27 ++++ src/packages/checkbox/checkbox.scss | 58 ++++---- src/packages/checkbox/checkbox.taro.tsx | 23 +-- src/packages/checkbox/checkbox.tsx | 16 +- src/packages/checkbox/demos/h5/demo15.tsx | 2 +- src/packages/checkbox/demos/taro/demo1.tsx | 81 +++++++++-- src/packages/checkbox/demos/taro/demo15.tsx | 14 +- src/packages/checkbox/demos/taro/demo6.tsx | 2 + src/packages/checkboxgroup/checkboxgroup.scss | 17 ++- .../checkboxgroup/checkboxgroup.taro.tsx | 14 +- src/packages/icon/doc.en-US.md | 6 +- src/packages/icon/doc.md | 6 +- src/packages/icon/doc.taro.md | 6 +- src/packages/icon/doc.zh-TW.md | 6 +- src/packages/indicator/demos/taro/demo1.tsx | 2 +- src/packages/indicator/demos/taro/demo2.tsx | 56 ++----- src/packages/indicator/demos/taro/demo4.tsx | 62 +++----- src/packages/indicator/indicator.scss | 36 +++-- src/packages/indicator/indicator.taro.tsx | 10 +- src/packages/input/doc.en-US.md | 1 + src/packages/input/doc.md | 1 + src/packages/input/doc.taro.md | 1 + src/packages/input/doc.zh-TW.md | 1 + src/packages/input/input.scss | 2 +- src/packages/loading/demos/taro/demo4.tsx | 2 +- src/packages/loading/demos/taro/demo7.tsx | 2 +- src/packages/loading/demos/taro/demo8.tsx | 7 +- src/packages/loading/loading.scss | 10 +- src/packages/navbar/demos/taro/demo1.tsx | 6 +- src/packages/navbar/demos/taro/demo2.tsx | 6 +- .../numberkeyboard/numberkeyboard.taro.tsx | 1 + src/packages/radio/demos/h5/demo7.tsx | 2 +- src/packages/radio/demos/taro/demo7.tsx | 2 +- src/packages/radio/radio.scss | 6 +- src/packages/radiogroup/radiogroup.scss | 12 +- src/packages/searchbar/demos/taro/demo3.tsx | 2 +- src/packages/searchbar/demos/taro/demo5.tsx | 4 +- src/packages/searchbar/searchbar.taro.tsx | 3 - src/packages/searchbar/searchbar.tsx | 1 - src/styles/variables-jmapp.scss | 1 + src/styles/variables-jrkf.scss | 1 + src/styles/variables.scss | 6 +- 48 files changed, 443 insertions(+), 346 deletions(-) diff --git a/package.json b/package.json index 278e2eac89..859ff07447 100644 --- a/package.json +++ b/package.json @@ -221,7 +221,7 @@ "vinyl-fs": "^4.0.0", "vite": "^5.1.3", "vite-plugin-dts": "4.2.1", - "vitest": "^3.0.0", + "vitest": "^3.0.7", "vitest-canvas-mock": "^0.3.3", "yargs": "^17.7.2" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ad2c9c709b..ba0df60c7e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -173,10 +173,10 @@ importers: version: 4.3.4(vite@5.4.11(@types/node@20.17.12)(less@3.13.1)(lightningcss@1.28.2)(sass@1.77.6)(stylus@0.64.0)(terser@5.37.0)) '@vitest/coverage-v8': specifier: ^2.0.4 - version: 2.1.8(vitest@3.0.5) + version: 2.1.8(vitest@3.0.7) '@vitest/ui': specifier: ^2.0.4 - version: 2.1.8(vitest@3.0.5) + version: 2.1.8(vitest@3.0.7) autoprefixer: specifier: ^10.4.17 version: 10.4.20(postcss@8.4.49) @@ -370,11 +370,11 @@ importers: specifier: 4.2.1 version: 4.2.1(@types/node@20.17.12)(rollup@4.30.0)(typescript@5.7.2)(vite@5.4.11(@types/node@20.17.12)(less@3.13.1)(lightningcss@1.28.2)(sass@1.77.6)(stylus@0.64.0)(terser@5.37.0)) vitest: - specifier: ^3.0.0 - version: 3.0.5(@types/debug@4.1.12)(@types/node@20.17.12)(@vitest/ui@2.1.8)(happy-dom@14.12.3)(jsdom@24.1.3)(less@3.13.1)(lightningcss@1.28.2)(sass@1.77.6)(stylus@0.64.0)(terser@5.37.0) + specifier: ^3.0.7 + version: 3.0.7(@types/debug@4.1.12)(@types/node@20.17.12)(@vitest/ui@2.1.8)(happy-dom@14.12.3)(jsdom@24.1.3)(less@3.13.1)(lightningcss@1.28.2)(sass@1.77.6)(stylus@0.64.0)(terser@5.37.0) vitest-canvas-mock: specifier: ^0.3.3 - version: 0.3.3(vitest@3.0.5) + version: 0.3.3(vitest@3.0.7) yargs: specifier: ^17.7.2 version: 17.7.2 @@ -3876,8 +3876,8 @@ packages: '@vitest/expect@2.1.8': resolution: {integrity: sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==} - '@vitest/expect@3.0.5': - resolution: {integrity: sha512-nNIOqupgZ4v5jWuQx2DSlHLEs7Q4Oh/7AYwNyE+k0UQzG7tSmjPXShUikn1mpNGzYEN2jJbTvLejwShMitovBA==, tarball: https://registry.npmjs.org/@vitest/expect/-/expect-3.0.5.tgz} + '@vitest/expect@3.0.7': + resolution: {integrity: sha512-QP25f+YJhzPfHrHfYHtvRn+uvkCFCqFtW9CktfBxmB+25QqWsx7VB2As6f4GmwllHLDhXNHvqedwhvMmSnNmjw==, tarball: https://registry.npmjs.org/@vitest/expect/-/expect-3.0.7.tgz} '@vitest/mocker@2.1.8': resolution: {integrity: sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==} @@ -3890,8 +3890,8 @@ packages: vite: optional: true - '@vitest/mocker@3.0.5': - resolution: {integrity: sha512-CLPNBFBIE7x6aEGbIjaQAX03ZZlBMaWwAjBdMkIf/cAn6xzLTiM3zYqO/WAbieEjsAZir6tO71mzeHZoodThvw==, tarball: https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.5.tgz} + '@vitest/mocker@3.0.7': + resolution: {integrity: sha512-qui+3BLz9Eonx4EAuR/i+QlCX6AUZ35taDQgwGkK/Tw6/WgwodSrjN1X2xf69IA/643ZX5zNKIn2svvtZDrs4w==, tarball: https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.7.tgz} peerDependencies: msw: ^2.4.9 vite: ^5.0.0 || ^6.0.0 @@ -3904,8 +3904,8 @@ packages: '@vitest/pretty-format@2.1.8': resolution: {integrity: sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==} - '@vitest/pretty-format@3.0.5': - resolution: {integrity: sha512-CjUtdmpOcm4RVtB+up8r2vVDLR16Mgm/bYdkGFe3Yj/scRfCpbSi2W/BDSDcFK7ohw8UXvjMbOp9H4fByd/cOA==, tarball: https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.5.tgz} + '@vitest/pretty-format@3.0.7': + resolution: {integrity: sha512-CiRY0BViD/V8uwuEzz9Yapyao+M9M008/9oMOSQydwbwb+CMokEq3XVaF3XK/VWaOK0Jm9z7ENhybg70Gtxsmg==, tarball: https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.7.tgz} '@vitest/runner@1.6.0': resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} @@ -3913,8 +3913,8 @@ packages: '@vitest/runner@2.1.8': resolution: {integrity: sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==} - '@vitest/runner@3.0.5': - resolution: {integrity: sha512-BAiZFityFexZQi2yN4OX3OkJC6scwRo8EhRB0Z5HIGGgd2q+Nq29LgHU/+ovCtd0fOfXj5ZI6pwdlUmC5bpi8A==, tarball: https://registry.npmjs.org/@vitest/runner/-/runner-3.0.5.tgz} + '@vitest/runner@3.0.7': + resolution: {integrity: sha512-WeEl38Z0S2ZcuRTeyYqaZtm4e26tq6ZFqh5y8YD9YxfWuu0OFiGFUbnxNynwLjNRHPsXyee2M9tV7YxOTPZl2g==, tarball: https://registry.npmjs.org/@vitest/runner/-/runner-3.0.7.tgz} '@vitest/snapshot@1.6.0': resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} @@ -3922,8 +3922,8 @@ packages: '@vitest/snapshot@2.1.8': resolution: {integrity: sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==} - '@vitest/snapshot@3.0.5': - resolution: {integrity: sha512-GJPZYcd7v8QNUJ7vRvLDmRwl+a1fGg4T/54lZXe+UOGy47F9yUfE18hRCtXL5aHN/AONu29NGzIXSVFh9K0feA==, tarball: https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.5.tgz} + '@vitest/snapshot@3.0.7': + resolution: {integrity: sha512-eqTUryJWQN0Rtf5yqCGTQWsCFOQe4eNz5Twsu21xYEcnFJtMU5XvmG0vgebhdLlrHQTSq5p8vWHJIeJQV8ovsA==, tarball: https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.7.tgz} '@vitest/spy@1.6.0': resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} @@ -3931,8 +3931,8 @@ packages: '@vitest/spy@2.1.8': resolution: {integrity: sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==} - '@vitest/spy@3.0.5': - resolution: {integrity: sha512-5fOzHj0WbUNqPK6blI/8VzZdkBlQLnT25knX0r4dbZI9qoZDf3qAdjoMmDcLG5A83W6oUUFJgUd0EYBc2P5xqg==, tarball: https://registry.npmjs.org/@vitest/spy/-/spy-3.0.5.tgz} + '@vitest/spy@3.0.7': + resolution: {integrity: sha512-4T4WcsibB0B6hrKdAZTM37ekuyFZt2cGbEGd2+L0P8ov15J1/HUsUaqkXEQPNAWr4BtPPe1gI+FYfMHhEKfR8w==, tarball: https://registry.npmjs.org/@vitest/spy/-/spy-3.0.7.tgz} '@vitest/ui@2.1.8': resolution: {integrity: sha512-5zPJ1fs0ixSVSs5+5V2XJjXLmNzjugHRyV11RqxYVR+oMcogZ9qTuSfKW+OcTV0JeFNznI83BNylzH6SSNJ1+w==} @@ -3945,8 +3945,8 @@ packages: '@vitest/utils@2.1.8': resolution: {integrity: sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==} - '@vitest/utils@3.0.5': - resolution: {integrity: sha512-N9AX0NUoUtVwKwy21JtwzaqR5L5R5A99GAbrHfCCXK1lp593i/3AZAXhSP43wRQuxYsflrdzEfXZFo1reR1Nkg==, tarball: https://registry.npmjs.org/@vitest/utils/-/utils-3.0.5.tgz} + '@vitest/utils@3.0.7': + resolution: {integrity: sha512-xePVpCRfooFX3rANQjwoditoXgWb1MaFbzmGuPP59MK6i13mrnDw/yEIyJudLeW6/38mCNcwCiJIGmpDPibAIg==, tarball: https://registry.npmjs.org/@vitest/utils/-/utils-3.0.7.tgz} '@volar/language-core@2.4.11': resolution: {integrity: sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==} @@ -4713,6 +4713,10 @@ packages: resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} engines: {node: '>=12'} + chai@5.2.0: + resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==, tarball: https://registry.npmjs.org/chai/-/chai-5.2.0.tgz} + engines: {node: '>=12'} + chalk@3.0.0: resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} engines: {node: '>=8'} @@ -8088,6 +8092,9 @@ packages: loupe@3.1.2: resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} + loupe@3.1.3: + resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==, tarball: https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz} + lower-case@1.1.4: resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} @@ -11296,8 +11303,8 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - vite-node@3.0.5: - resolution: {integrity: sha512-02JEJl7SbtwSDJdYS537nU6l+ktdvcREfLksk/NDAqtdKWGqHl+joXzEubHROmS3E6pip+Xgu2tFezMu75jH7A==, tarball: https://registry.npmjs.org/vite-node/-/vite-node-3.0.5.tgz} + vite-node@3.0.7: + resolution: {integrity: sha512-2fX0QwX4GkkkpULXdT1Pf4q0tC1i1lFOyseKoonavXUNlQ77KpW2XqBGGNIm/J4Ows4KxgGJzDguYVPKwG/n5A==, tarball: https://registry.npmjs.org/vite-node/-/vite-node-3.0.7.tgz} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true @@ -11403,16 +11410,16 @@ packages: jsdom: optional: true - vitest@3.0.5: - resolution: {integrity: sha512-4dof+HvqONw9bvsYxtkfUp2uHsTN9bV2CZIi1pWgoFpL1Lld8LA1ka9q/ONSsoScAKG7NVGf2stJTI7XRkXb2Q==, tarball: https://registry.npmjs.org/vitest/-/vitest-3.0.5.tgz} + vitest@3.0.7: + resolution: {integrity: sha512-IP7gPK3LS3Fvn44x30X1dM9vtawm0aesAa2yBIZ9vQf+qB69NXC5776+Qmcr7ohUXIQuLhk7xQR0aSUIDPqavg==, tarball: https://registry.npmjs.org/vitest/-/vitest-3.0.7.tgz} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.0.5 - '@vitest/ui': 3.0.5 + '@vitest/browser': 3.0.7 + '@vitest/ui': 3.0.7 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -15776,7 +15783,7 @@ snapshots: - supports-color optional: true - '@vitest/coverage-v8@2.1.8(vitest@3.0.5)': + '@vitest/coverage-v8@2.1.8(vitest@3.0.7)': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 @@ -15790,7 +15797,7 @@ snapshots: std-env: 3.8.0 test-exclude: 7.0.1 tinyrainbow: 1.2.0 - vitest: 3.0.5(@types/debug@4.1.12)(@types/node@20.17.12)(@vitest/ui@2.1.8)(happy-dom@14.12.3)(jsdom@24.1.3)(less@3.13.1)(lightningcss@1.28.2)(sass@1.77.6)(stylus@0.64.0)(terser@5.37.0) + vitest: 3.0.7(@types/debug@4.1.12)(@types/node@20.17.12)(@vitest/ui@2.1.8)(happy-dom@14.12.3)(jsdom@24.1.3)(less@3.13.1)(lightningcss@1.28.2)(sass@1.77.6)(stylus@0.64.0)(terser@5.37.0) transitivePeerDependencies: - supports-color @@ -15807,11 +15814,11 @@ snapshots: chai: 5.1.2 tinyrainbow: 1.2.0 - '@vitest/expect@3.0.5': + '@vitest/expect@3.0.7': dependencies: - '@vitest/spy': 3.0.5 - '@vitest/utils': 3.0.5 - chai: 5.1.2 + '@vitest/spy': 3.0.7 + '@vitest/utils': 3.0.7 + chai: 5.2.0 tinyrainbow: 2.0.0 '@vitest/mocker@2.1.8(vite@5.4.11(@types/node@22.10.5)(less@3.13.1)(lightningcss@1.28.2)(sass@1.77.6)(stylus@0.64.0)(terser@5.37.0))': @@ -15822,9 +15829,9 @@ snapshots: optionalDependencies: vite: 5.4.11(@types/node@22.10.5)(less@3.13.1)(lightningcss@1.28.2)(sass@1.77.6)(stylus@0.64.0)(terser@5.37.0) - '@vitest/mocker@3.0.5(vite@5.4.11(@types/node@20.17.12)(less@3.13.1)(lightningcss@1.28.2)(sass@1.77.6)(stylus@0.64.0)(terser@5.37.0))': + '@vitest/mocker@3.0.7(vite@5.4.11(@types/node@20.17.12)(less@3.13.1)(lightningcss@1.28.2)(sass@1.77.6)(stylus@0.64.0)(terser@5.37.0))': dependencies: - '@vitest/spy': 3.0.5 + '@vitest/spy': 3.0.7 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: @@ -15834,7 +15841,7 @@ snapshots: dependencies: tinyrainbow: 1.2.0 - '@vitest/pretty-format@3.0.5': + '@vitest/pretty-format@3.0.7': dependencies: tinyrainbow: 2.0.0 @@ -15849,9 +15856,9 @@ snapshots: '@vitest/utils': 2.1.8 pathe: 1.1.2 - '@vitest/runner@3.0.5': + '@vitest/runner@3.0.7': dependencies: - '@vitest/utils': 3.0.5 + '@vitest/utils': 3.0.7 pathe: 2.0.3 '@vitest/snapshot@1.6.0': @@ -15866,9 +15873,9 @@ snapshots: magic-string: 0.30.17 pathe: 1.1.2 - '@vitest/snapshot@3.0.5': + '@vitest/snapshot@3.0.7': dependencies: - '@vitest/pretty-format': 3.0.5 + '@vitest/pretty-format': 3.0.7 magic-string: 0.30.17 pathe: 2.0.3 @@ -15880,7 +15887,7 @@ snapshots: dependencies: tinyspy: 3.0.2 - '@vitest/spy@3.0.5': + '@vitest/spy@3.0.7': dependencies: tinyspy: 3.0.2 @@ -15896,7 +15903,7 @@ snapshots: vitest: 2.1.8(@types/node@22.10.5)(@vitest/ui@2.1.8)(happy-dom@17.1.0)(jsdom@24.1.3)(less@3.13.1)(lightningcss@1.28.2)(sass@1.77.6)(stylus@0.64.0)(terser@5.37.0) optional: true - '@vitest/ui@2.1.8(vitest@3.0.5)': + '@vitest/ui@2.1.8(vitest@3.0.7)': dependencies: '@vitest/utils': 2.1.8 fflate: 0.8.2 @@ -15905,7 +15912,7 @@ snapshots: sirv: 3.0.0 tinyglobby: 0.2.10 tinyrainbow: 1.2.0 - vitest: 3.0.5(@types/debug@4.1.12)(@types/node@20.17.12)(@vitest/ui@2.1.8)(happy-dom@14.12.3)(jsdom@24.1.3)(less@3.13.1)(lightningcss@1.28.2)(sass@1.77.6)(stylus@0.64.0)(terser@5.37.0) + vitest: 3.0.7(@types/debug@4.1.12)(@types/node@20.17.12)(@vitest/ui@2.1.8)(happy-dom@14.12.3)(jsdom@24.1.3)(less@3.13.1)(lightningcss@1.28.2)(sass@1.77.6)(stylus@0.64.0)(terser@5.37.0) '@vitest/utils@1.6.0': dependencies: @@ -15920,10 +15927,10 @@ snapshots: loupe: 3.1.2 tinyrainbow: 1.2.0 - '@vitest/utils@3.0.5': + '@vitest/utils@3.0.7': dependencies: - '@vitest/pretty-format': 3.0.5 - loupe: 3.1.2 + '@vitest/pretty-format': 3.0.7 + loupe: 3.1.3 tinyrainbow: 2.0.0 '@volar/language-core@2.4.11': @@ -16840,6 +16847,14 @@ snapshots: loupe: 3.1.2 pathval: 2.0.0 + chai@5.2.0: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.3 + pathval: 2.0.0 + chalk@3.0.0: dependencies: ansi-styles: 4.3.0 @@ -21050,6 +21065,8 @@ snapshots: loupe@3.1.2: {} + loupe@3.1.3: {} + lower-case@1.1.4: {} lower-case@2.0.2: @@ -24823,7 +24840,7 @@ snapshots: - supports-color - terser - vite-node@3.0.5(@types/node@20.17.12)(less@3.13.1)(lightningcss@1.28.2)(sass@1.77.6)(stylus@0.64.0)(terser@5.37.0): + vite-node@3.0.7(@types/node@20.17.12)(less@3.13.1)(lightningcss@1.28.2)(sass@1.77.6)(stylus@0.64.0)(terser@5.37.0): dependencies: cac: 6.7.14 debug: 4.4.0(supports-color@8.1.1) @@ -24910,10 +24927,10 @@ snapshots: stylus: 0.64.0 terser: 5.37.0 - vitest-canvas-mock@0.3.3(vitest@3.0.5): + vitest-canvas-mock@0.3.3(vitest@3.0.7): dependencies: jest-canvas-mock: 2.5.2 - vitest: 3.0.5(@types/debug@4.1.12)(@types/node@20.17.12)(@vitest/ui@2.1.8)(happy-dom@14.12.3)(jsdom@24.1.3)(less@3.13.1)(lightningcss@1.28.2)(sass@1.77.6)(stylus@0.64.0)(terser@5.37.0) + vitest: 3.0.7(@types/debug@4.1.12)(@types/node@20.17.12)(@vitest/ui@2.1.8)(happy-dom@14.12.3)(jsdom@24.1.3)(less@3.13.1)(lightningcss@1.28.2)(sass@1.77.6)(stylus@0.64.0)(terser@5.37.0) vitest@1.6.0(@types/node@18.19.70)(@vitest/ui@2.1.8)(happy-dom@17.1.0)(jsdom@24.1.3)(less@3.13.1)(lightningcss@1.28.2)(sass@1.77.6)(stylus@0.64.0)(terser@5.37.0): dependencies: @@ -24939,7 +24956,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 18.19.70 - '@vitest/ui': 2.1.8(vitest@3.0.5) + '@vitest/ui': 2.1.8(vitest@3.0.7) happy-dom: 17.1.0 jsdom: 24.1.3 transitivePeerDependencies: @@ -24976,7 +24993,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.10.5 - '@vitest/ui': 2.1.8(vitest@3.0.5) + '@vitest/ui': 2.1.8(vitest@3.0.7) happy-dom: 17.1.0 jsdom: 24.1.3 transitivePeerDependencies: @@ -25027,16 +25044,16 @@ snapshots: - supports-color - terser - vitest@3.0.5(@types/debug@4.1.12)(@types/node@20.17.12)(@vitest/ui@2.1.8)(happy-dom@14.12.3)(jsdom@24.1.3)(less@3.13.1)(lightningcss@1.28.2)(sass@1.77.6)(stylus@0.64.0)(terser@5.37.0): + vitest@3.0.7(@types/debug@4.1.12)(@types/node@20.17.12)(@vitest/ui@2.1.8)(happy-dom@14.12.3)(jsdom@24.1.3)(less@3.13.1)(lightningcss@1.28.2)(sass@1.77.6)(stylus@0.64.0)(terser@5.37.0): dependencies: - '@vitest/expect': 3.0.5 - '@vitest/mocker': 3.0.5(vite@5.4.11(@types/node@20.17.12)(less@3.13.1)(lightningcss@1.28.2)(sass@1.77.6)(stylus@0.64.0)(terser@5.37.0)) - '@vitest/pretty-format': 3.0.5 - '@vitest/runner': 3.0.5 - '@vitest/snapshot': 3.0.5 - '@vitest/spy': 3.0.5 - '@vitest/utils': 3.0.5 - chai: 5.1.2 + '@vitest/expect': 3.0.7 + '@vitest/mocker': 3.0.7(vite@5.4.11(@types/node@20.17.12)(less@3.13.1)(lightningcss@1.28.2)(sass@1.77.6)(stylus@0.64.0)(terser@5.37.0)) + '@vitest/pretty-format': 3.0.7 + '@vitest/runner': 3.0.7 + '@vitest/snapshot': 3.0.7 + '@vitest/spy': 3.0.7 + '@vitest/utils': 3.0.7 + chai: 5.2.0 debug: 4.4.0(supports-color@8.1.1) expect-type: 1.1.0 magic-string: 0.30.17 @@ -25047,12 +25064,12 @@ snapshots: tinypool: 1.0.2 tinyrainbow: 2.0.0 vite: 5.4.11(@types/node@20.17.12)(less@3.13.1)(lightningcss@1.28.2)(sass@1.77.6)(stylus@0.64.0)(terser@5.37.0) - vite-node: 3.0.5(@types/node@20.17.12)(less@3.13.1)(lightningcss@1.28.2)(sass@1.77.6)(stylus@0.64.0)(terser@5.37.0) + vite-node: 3.0.7(@types/node@20.17.12)(less@3.13.1)(lightningcss@1.28.2)(sass@1.77.6)(stylus@0.64.0)(terser@5.37.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 '@types/node': 20.17.12 - '@vitest/ui': 2.1.8(vitest@3.0.5) + '@vitest/ui': 2.1.8(vitest@3.0.7) happy-dom: 14.12.3 jsdom: 24.1.3 transitivePeerDependencies: diff --git a/src/packages/button/button.scss b/src/packages/button/button.scss index 75b660a967..9d88be721e 100644 --- a/src/packages/button/button.scss +++ b/src/packages/button/button.scss @@ -253,6 +253,7 @@ } &-disabled, + &-disabled.nut-button-icononly, &-solid-disabled { color: $button-primary-color; background: $button-primary-disabled; diff --git a/src/packages/button/demos/taro/demo4.tsx b/src/packages/button/demos/taro/demo4.tsx index b5b01ab2fd..3b6899277b 100644 --- a/src/packages/button/demos/taro/demo4.tsx +++ b/src/packages/button/demos/taro/demo4.tsx @@ -1,4 +1,5 @@ import React from 'react' +import { Text } from '@tarojs/components' import { Button, Cell } from '@nutui/nutui-react-taro' import { Plus, Star } from '@nutui/icons-react-taro' import { harmony } from '@/utils/platform-taro' @@ -13,8 +14,8 @@ const Demo4 = () => { diff --git a/src/packages/loading/loading.scss b/src/packages/loading/loading.scss index 356d340396..92415b4f76 100644 --- a/src/packages/loading/loading.scss +++ b/src/packages/loading/loading.scss @@ -4,7 +4,7 @@ align-items: center; justify-content: center; - &.nut-loading-vertical { + &-vertical { flex-direction: column; } @@ -21,6 +21,7 @@ font-size: $loading-icon-size; } } + .nut-loading-lottie-box { width: 56px; height: 56px; @@ -29,10 +30,15 @@ } .nut-loading-text { - padding-top: $spacing-base; color: $loading-color; font-size: $loading-font-size; } + + &-vertical { + .nut-loading-text { + padding-top: $spacing-base; + } + } } @keyframes nut-loading-rotation { diff --git a/src/packages/navbar/demos/taro/demo1.tsx b/src/packages/navbar/demos/taro/demo1.tsx index 2494f5967f..5baad42e1a 100644 --- a/src/packages/navbar/demos/taro/demo1.tsx +++ b/src/packages/navbar/demos/taro/demo1.tsx @@ -13,15 +13,17 @@ const Demo1 = () => { alignItems: 'center', }, title: { + display: 'flex', + alignItems: 'center', + flex: 1, fontSize: pxTransform(18), fontWeight: 'bold', - lineHeight: pxTransform(26), }, description: { fontSize: pxTransform(12), fontWeight: 400, color: 'rgba(0,0,0, 0.5)', - lineHeight: pxTransform(16), + height: pxTransform(16), }, } return ( diff --git a/src/packages/navbar/demos/taro/demo2.tsx b/src/packages/navbar/demos/taro/demo2.tsx index 43dbc34304..26c56d10c6 100644 --- a/src/packages/navbar/demos/taro/demo2.tsx +++ b/src/packages/navbar/demos/taro/demo2.tsx @@ -13,15 +13,17 @@ const Demo2 = () => { alignItems: 'center', }, title: { + display: 'flex', + alignItems: 'center', + flex: 1, fontSize: pxTransform(18), fontWeight: 'bold', - lineHeight: pxTransform(26), }, description: { fontSize: pxTransform(12), fontWeight: 400, color: 'rgba(0,0,0, 0.5)', - lineHeight: pxTransform(16), + height: pxTransform(16), }, } return ( diff --git a/src/packages/numberkeyboard/numberkeyboard.taro.tsx b/src/packages/numberkeyboard/numberkeyboard.taro.tsx index 47f125f763..207805dca5 100644 --- a/src/packages/numberkeyboard/numberkeyboard.taro.tsx +++ b/src/packages/numberkeyboard/numberkeyboard.taro.tsx @@ -161,6 +161,7 @@ export const NumberKeyboard: FunctionComponent< onOverlayClick={onClose} onCloseIconClick={onClose} zIndex={9999} + style={{ minHeight: 0 }} overlayStyle={{ backgroundColor: 'rgba(0, 0, 0, 0)' }} > diff --git a/src/packages/radio/demos/h5/demo7.tsx b/src/packages/radio/demos/h5/demo7.tsx index a8c58125d7..51a8880bd6 100644 --- a/src/packages/radio/demos/h5/demo7.tsx +++ b/src/packages/radio/demos/h5/demo7.tsx @@ -6,7 +6,7 @@ const Demo7 = () => { 自定义尺寸 diff --git a/src/packages/radio/demos/taro/demo7.tsx b/src/packages/radio/demos/taro/demo7.tsx index 64a9bbbf85..d75a80ce67 100644 --- a/src/packages/radio/demos/taro/demo7.tsx +++ b/src/packages/radio/demos/taro/demo7.tsx @@ -6,7 +6,7 @@ const Demo7 = () => { 自定义尺寸 diff --git a/src/packages/radio/radio.scss b/src/packages/radio/radio.scss index 4471e64faa..c14481526c 100644 --- a/src/packages/radio/radio.scss +++ b/src/packages/radio/radio.scss @@ -5,11 +5,6 @@ align-items: center; flex-shrink: 0; - &:last-child { - margin-bottom: 0 !important; - margin-right: 0 !important; - } - &.nut-radio-reverse { flex-direction: row-reverse; @@ -56,6 +51,7 @@ &-button { display: inline-flex; align-items: center; + min-height: 30px; padding: $radio-button-padding; font-size: $radio-button-font-size; background: $radio-button-background; diff --git a/src/packages/radiogroup/radiogroup.scss b/src/packages/radiogroup/radiogroup.scss index 118c930340..661a6e775e 100644 --- a/src/packages/radiogroup/radiogroup.scss +++ b/src/packages/radiogroup/radiogroup.scss @@ -9,6 +9,10 @@ &-button { background-color: $radio-button-background; } + + &:last-child { + margin: 0; + } } &-vertical { @@ -30,9 +34,9 @@ } &-horizontal { - .nut-radio { - display: inline-flex; + display: flex; + .nut-radio { &-button { border: 1px solid $white; } @@ -41,6 +45,10 @@ border: $radio-button-active-border; background-color: $color-primary-light-pressed; } + + &:last-child { + margin: 0 $radiogroup-radio-margin $radiogroup-radio-margin-bottom 0; + } } } diff --git a/src/packages/searchbar/demos/taro/demo3.tsx b/src/packages/searchbar/demos/taro/demo3.tsx index 1cbe893f18..d1aa20bcb2 100644 --- a/src/packages/searchbar/demos/taro/demo3.tsx +++ b/src/packages/searchbar/demos/taro/demo3.tsx @@ -1,5 +1,5 @@ import React, { useState } from 'react' -import { SearchBar, ConfigProvider, Toast } from '@nutui/nutui-react-taro' +import { ConfigProvider, SearchBar, Toast } from '@nutui/nutui-react-taro' const Demo3 = () => { const [show, SetShow] = useState(false) diff --git a/src/packages/searchbar/demos/taro/demo5.tsx b/src/packages/searchbar/demos/taro/demo5.tsx index 2f1c4f906d..a3e10a597f 100644 --- a/src/packages/searchbar/demos/taro/demo5.tsx +++ b/src/packages/searchbar/demos/taro/demo5.tsx @@ -2,9 +2,9 @@ import React from 'react' import { SearchBar } from '@nutui/nutui-react-taro' import { ArrowLeft, - Photograph, - More, Close, + More, + Photograph, Star, } from '@nutui/icons-react-taro' diff --git a/src/packages/searchbar/searchbar.taro.tsx b/src/packages/searchbar/searchbar.taro.tsx index 76d9ec5c93..f6bacfe201 100644 --- a/src/packages/searchbar/searchbar.taro.tsx +++ b/src/packages/searchbar/searchbar.taro.tsx @@ -115,13 +115,10 @@ export const SearchBar: FunctionComponent< clearable ? `${classPrefix}-input-clear` : '' }`} ref={searchRef} - style={style} value={value || ''} placeholder={placeholder || locale.placeholder} disabled={disabled || readOnly} maxlength={maxLength} - // @ts-ignore - // onKeyDown={onKeypress} onInput={onInput} onFocus={focus} onBlur={blur} diff --git a/src/packages/searchbar/searchbar.tsx b/src/packages/searchbar/searchbar.tsx index 9901b7b5f9..5d30ffd976 100644 --- a/src/packages/searchbar/searchbar.tsx +++ b/src/packages/searchbar/searchbar.tsx @@ -114,7 +114,6 @@ export const SearchBar: FunctionComponent< clearable ? `${classPrefix}-input-clear` : '' }`} ref={searchRef} - style={style} value={value || ''} placeholder={placeholder || locale.placeholder} disabled={disabled} diff --git a/src/styles/variables-jmapp.scss b/src/styles/variables-jmapp.scss index 0c4e74f5f2..14d331642c 100644 --- a/src/styles/variables-jmapp.scss +++ b/src/styles/variables-jmapp.scss @@ -595,6 +595,7 @@ $input-disabled-color: var( $color-text-disabled ) !default; $input-font-size: var(--nutui-input-font-size, $font-size-base) !default; +$input-lineheight: var(--nutui-input-lineheight, $font-size-l) !default; $input-border-radius: var(--nutui-input-border-radius, $radius-xs) !default; $input-color: var(--nutui-input-color, $color-text) !default; $input-background-color: var(--nutui-input-background-color, $white) !default; diff --git a/src/styles/variables-jrkf.scss b/src/styles/variables-jrkf.scss index ea64b13cb0..18da6bff41 100644 --- a/src/styles/variables-jrkf.scss +++ b/src/styles/variables-jrkf.scss @@ -615,6 +615,7 @@ $input-disabled-color: var( $color-text-disabled ) !default; $input-font-size: var(--nutui-input-font-size, $font-size-base) !default; +$input-lineheight: var(--nutui-input-lineheight, $font-size-l) !default; $input-border-radius: var(--nutui-input-border-radius, $radius-xs) !default; $input-color: var(--nutui-input-color, $color-text) !default; $input-background-color: var(--nutui-input-background-color, $white) !default; diff --git a/src/styles/variables.scss b/src/styles/variables.scss index 51a884d520..48ca550924 100644 --- a/src/styles/variables.scss +++ b/src/styles/variables.scss @@ -592,6 +592,7 @@ $input-border-bottom-width: var( // $color-text-disabled // ) !default; $input-font-size: var(--nutui-input-font-size, $font-size-base) !default; +$input-lineheight: var(--nutui-input-lineheight, $font-size-l) !default; $input-border-radius: var(--nutui-input-border-radius, $radius-s) !default; // $input-color: var(--nutui-input-color, $color-title) !default; $input-background-color: var( @@ -1854,10 +1855,7 @@ $indicator-border-radius: var( --nutui-indicator-border-radius, $radius-xxs ) !default; -$indicator-dot-margin: var( - --nutui-indicator-dot-margin, - $spacing-xxxs -) !default; +$indicator-dot-margin: var(--nutui-indicator-dot-margin, $spacing-xxs) !default; // menu(✅) $menu-scroll-fixed-top: var(--nutui-menu-scroll-fixed-top, 0) !default; From 90700a9c4779f626ac04e3a5b2f4519b1930eb10 Mon Sep 17 00:00:00 2001 From: xiaoyatong <84436086+xiaoyatong@users.noreply.github.com> Date: Fri, 28 Feb 2025 21:34:50 +0800 Subject: [PATCH 19/26] =?UTF-8?q?fix:=20dialog=20=E5=9C=A8=E9=B8=BF?= =?UTF-8?q?=E8=92=99=E4=B8=8B=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D=20(#3032?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/packages/dialog/dialog.scss | 7 +- src/packages/dialog/dialog.taro.tsx | 165 +++++++++++++++++----------- src/packages/dialog/dialog.tsx | 1 + 3 files changed, 101 insertions(+), 72 deletions(-) diff --git a/src/packages/dialog/dialog.scss b/src/packages/dialog/dialog.scss index 0aed9a8a87..5dcbc5194a 100644 --- a/src/packages/dialog/dialog.scss +++ b/src/packages/dialog/dialog.scss @@ -8,7 +8,9 @@ align-items: center; width: $dialog-width; min-width: $dialog-min-width; + /* #ifndef harmony*/ max-height: 67%; + /* #endif */ min-height: $dialog-min-height; padding: $dialog-padding; box-sizing: border-box; @@ -112,15 +114,10 @@ min-width: 100%; } - .nut-dialog-footer-ok { - order: 1; - } - .nut-dialog-footer-cancel { margin: 0; color: $color-text; font-size: $font-size-base; - order: 2; display: flex; justify-content: center; margin-top: $dialog-vertical-footer-ok-margin-top; diff --git a/src/packages/dialog/dialog.taro.tsx b/src/packages/dialog/dialog.taro.tsx index 9f14971362..328399ed47 100644 --- a/src/packages/dialog/dialog.taro.tsx +++ b/src/packages/dialog/dialog.taro.tsx @@ -122,43 +122,68 @@ export const BaseDialog: FunctionComponent> & { const btnClass = hideCancelButton || hideConfirmButton ? `${classPrefix}-footer-block` : '' + const renderCancelOfVertical = () => { + return ( + !hideCancelButton && ( + handleCancel(e)} + > + {cancelText || locale.cancel} + + ) + ) + } + + const renderCancel = () => { + return ( + !hideCancelButton && ( + + ) + ) + } + + const renderConfirm = () => { + return ( + !hideConfirmButton && ( + + ) + ) + } + return ( footer || ( <> - {!hideCancelButton && - (footerDirection === 'vertical' ? ( - handleCancel(e)} - > - {cancelText || locale.cancel} - - ) : ( - - ))} - - {!hideConfirmButton && ( - + {footerDirection === 'vertical' ? ( + <> + {renderConfirm()} + {renderCancelOfVertical()} + + ) : ( + <> + {renderCancel()} + {renderConfirm()} + )} ) @@ -193,46 +218,52 @@ export const BaseDialog: FunctionComponent> & { } } + const renderContent = () => { + return ( + + + {content || children} + + + ) + } + return ( - <> - {overlay && ( - - )} - - - - {content || children} - - - + {renderContent()} + + ) : ( + renderContent() + )} ) } diff --git a/src/packages/dialog/dialog.tsx b/src/packages/dialog/dialog.tsx index c049d16c61..e1bb241f5d 100644 --- a/src/packages/dialog/dialog.tsx +++ b/src/packages/dialog/dialog.tsx @@ -93,6 +93,7 @@ const BaseDialog: ForwardRefRenderFunction< {!hideCancelButton && (footerDirection === 'vertical' ? (
handleCancel(e)} > From 6697e45c0f03fb81bcaadaf4e05f6b117e05d960 Mon Sep 17 00:00:00 2001 From: oasis Date: Fri, 28 Feb 2025 21:49:24 +0800 Subject: [PATCH 20/26] chore(release): v3.0.0 --- CHANGELOG.md | 1439 ++------------------------ package.json | 2 +- scripts/build-taro.mjs | 6 +- scripts/build.mjs | 6 +- scripts/relative-path.mjs | 44 +- src/packages/configprovider/types.ts | 1 + 6 files changed, 123 insertions(+), 1375 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a28a4d6a43..3d4d6a48d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,1343 +1,102 @@ -# v2.6.23 - -`2024-10-18` - -- :sparkles: feat(calendar): support renderBottomButton props (#2645) -- :sparkles: feat(calendar): support deleteIcon props (#2644) -- :bug: fix(overlay): tour position offset in tour.taro (#2631) -- :bug: fix: import error (#2648) -- :bug: fix(dialog): remove defaultprops (#2639) - -# v2.6.22 - -`2024-10-12` - -- :sparkles: feat(popup): lockscroll 增加可选值 strict, 用于支持 iOS12 (#2629) -- :bug: fix(dialog): revert defaultprops -- :bug: fix(range): usememo (#2638) -- :bug: fix(backtop & menu): lint, code simplification, deprecated pageYOffset removed (#2633) -- :bug: fix: taro async warning in taro-h5 env (#2636) -- :bug: fix(range): refactor & lint fixed (#2637) -- :bug: fix(radio): lint fixed (#2635) -- :bug: fix(navbar): safearea displays abnormal when safeAreaInsetTop has been set true (#2632) -- :bug: fix: usecallback to fix render too many times, button,animatingnumbers,avatar,audio; and fix avatargroup when length > maxsize (#2628) -- 🏡 chore(demo): display bound dispatchSetState in demo8 of table demos (#2626) -- 📖 docs: swiper 可通过 css 的 touch-action 设置用户操作行为 (#2630) -- 📖 docs: 文档构建出现未闭合标签的错误提示 - -# v2.6.21 - -`2024-09-27` - -- 🏡 chore: update dependency linguist-languages to be included within package (#2607) -- :sparkles: feat(Uploader): add support for deleteIcon prop customization (#2618) -- :bug: fix: 修改jd小程序高版本弹幕不滚动问题 (#2612) - -# v2.6.20 - -`2024-09-20` - -- :bug: fix: i18n (#2597) -- :bug: fix: 类型构建错误 (#2605) -- 🏡 chore: replace local prettier plugin with npm package (#2603) - -# v2.6.19 - -`2024-09-13` - -- 🏡 chore(deps): update dependency vite-plugin-dts to v4 (#2533) -- :bug: fix(cascader): 受控状态下 value 变化时同步组件选中状态 (#2591) -- :bug: fix: 移除不必要的 fragment 元素 (#2587) -- :bug: fix(datepicker): show zero on page (#2582) -- :bug: fix: findDomNode from transition (#2525) -- :bug: fix(props): add mergeProps utility to resolve all defaultProps warnings (#2581) -- 🪵 refactor: resolve sass nested rules warning (#2579) - -# v2.6.18 - -`2024-09-06` - -- 🏡 chore: remove deprecated (#2573) -- 🏡 chore(deps): update dependency marked to v14 (#2532) -- :sparkles: feat: demos for popup & dialog (#2574) -- :sparkles: feat: beforeupload (#2567) -- :bug: fix: remove icons defaultprops (#2571) -- :bug: fix(input): type props didnot work when equals number|digit (#2563) -- :bug: fix: dialog -- :bug: fix(sticky): should rerender when zIndex changes (#2572) -- :bug: fix(sticky): rerender sticky when threshold change (#2564) -- :bug: fix(deps): update dependency jscodeshift to v17 (#2534) - -# v2.6.17 - -`2024-08-30` - -- 🏡 chore(form): form demo (#2528) -- 📖 docs(readme): fix pnpm run dev weapp jd dir (#2514) -- :sparkles: feat(cell): add clickable prop to support click style feedback (#2527) -- :sparkles: feat(image-preview): 增加索引字段,用于预览内容排序 (#2519) -- :bug: fix(tabs.taro.tsx): 解决在不需要滚动的时候,切换tab产生tab位置错乱的问题 (#2554) -- :bug: fix(uploader): beforeUpload should trigger every time before uploading (#2553) -- :bug: fix(PullToRefresh): 修复PullToRefresh组件disabled属性在taro中无效的问题 (#2538) -- :bug: fix(uploader): ios 下无法回显的问题修复 (#2550) -- :bug: fix(uploader): sizeType prop didnot work when weapp || jd (#2526) - -# v2.6.16 - -`2024-08-03` - -- 📖 docs(card): correct doc (#2504) @Alex-huxiyang -- :sparkles: feat(menu): menu-item 组件增加标题icon自定义方式 (#2488) @zhangming -- :sparkles: feat(form): Form.Item 增加 align 属性 (#2492) @zhangming -- :bug: fix(inputNumber): correct onChange, onOverlimit event triggering timing when async & sync (#2509) @Alex-huxiyang -- :bug: fix(uploader): xhrBeforeUpload判断错误 (#2507) @Alex-huxiyang -- :bug: fix(swiper): correct onChange ts type (#2493) @Alex-huxiyang -- 🪵 refactor(numberkeyboard): optimize code & correct defaultProps (#2508) @Alex-huxiyang -- 🏡 chore(cell): unify ts type & docs (#2496) @Alex-huxiyang -- 🏡 chore(deps): update vitest monorepo to v2 (major) (#2439) @renovate[bot] -- 🏡 chore(deps): update dependency glob to v11 (#2438) @renovate[bot] -- 🏡 chore(deps): update dependency inquirer to v10 (#2420) @renovate[bot] -- 🏡 chore(deps): update dependency marked to v13 (#2358) @renovate[bot] - -# v2.6.15 - -`2024-07-26` - -- 🏡 chore: run md-table-format when git commit changes (#2484) @Alex-huxiyang -- :sparkles: feat(menu): allow custom classnames for Menu and dynamic titles (#2480) @Alex-huxiyang -- :sparkles: feat(watermark): support multi-line text (#2477) @xiaoyatong -- :bug: fix: move defaultprops (#2482) @xiaoyatong -- :bug: fix: snapshot update (#2481) @Alex-huxiyang -- :bug: fix(uploader): image 居中展示 (#2475) @xiaoyatong -- :bug: fix(infiniteLoading): rest 导致事件无法触发 (#2474) @oasis-cloud -- :bug: fix: sticky 构建时类型错误 @oasis-cloud -- :bug: fix(uploader): images should display when they've been successfully uploaded (#2448) @Alex-huxiyang -- :bug: fix: 修复日历进行快捷选择日期时 点击确认获取的是上一次的日期 (#2436) @yangqianlu -- 🪵 refactor: table (#2473) @zanyuki-jd -- 🪵 refactor: sticky (#2468) @oasis-cloud - -# v2.6.14 - -`2024-07-19` - -- :sparkles: feat(menuitem): 新增css类名,增强自定义样式能力 (#2443) @Alex-huxiyang -- :sparkles: feat(empty): add css variable nutui-empty-background-color (#2451) @Alex-huxiyang -- :sparkles: feat(infiniteLoading): 继承 scrollView 的 props 类型 (#2441) @oasis-cloud -- :bug: fix(cascader): 初始化设置value未成功选中 (#2435) @Alex-huxiyang -- :bug: fix(swiper): display abnormal when dir = 'rtl' (#2454) @Alex-huxiyang -- :bug: fix(form): 兼容校验时机 (#2437) @Alex-huxiyang -- :bug: fix(form): 在FromInstance增加validateFields方法的定义 (#2450) @jinjl - -# v2.6.13 - -`2024-07-12` - -- :sparkles: feat: tabs滚动条兼容火狐浏览器 (#2431) @JoanneXu6677 -- :sparkles: feat(drag): add the ability to support onDrag, onDragStart, onDragEnd callbacks (#2418) @Alex-huxiyang -- :bug: fix(formItem): validateTrigger无法正确触发校验 (#2433) @Alex-huxiyang -- :bug: fix: 日历组件滚动到顶部时 出现空白问题 (#2409) @522109452 -- :bug: fix(imagepreview): 无法在预期情景正确关闭图片的异常 (#2421) @Alex-huxiyang - -# v2.6.12 - -`2024-07-05` - -- :sparkles: feat: add pagination whether to show pages in imagepreview (#2411) @xiaoyatong -- :bug: fix(uploader): pre-upload pmage preview bug (#2416) @Alex-huxiyang -- :bug: fix(taro-form-demo): 点击演示demo表单内的重置会触发提交表单事件bug修复 (#2415) @Skedush -- :bug: fix(form): validator 中的 value 类型更新为 any (#2406) @oasis-cloud -- :bug: fix(uploader): 京东小程序中可上传时可选择图片和视频 (#2410) @xueshufive -- :bug: fix(avatarcropper): 报错 (#2364) @Alex-huxiyang -- :bug: fix(form): setFields未触发校验 (#2400) @Alex-huxiyang - -# v2.6.11 - -`2024-06-28` - -- :sparkles: feat(table): table新增自定义行 (#2390) @zanyuki-jd -- :bug: fix(fixednav): 可拖拽元素样式缺失 (#2391) @oasis-cloud - -# v2.6.10 - -`2024-06-21` - -- 🏡 chore: 文档未来规范 (#2373) @Alex-huxiyang -- 🤖 ci: 统一使用 pnpm @oasis-cloud -- :sparkles: feat(tabpane): 增添修改tabpane背景色的主题变量 (#2366) @Alex-huxiyang -- :bug: fix(tabs): 修复tabs异步设置titles滚动失效(#2351) (#2369) @ShuchenEason -- :bug: fix: umd 中替换环境变量 (#2368) @oasis-cloud - -# v2.6.9 - -`2024-06-14` - -- :sparkles: feat(form): footer 容器增加 className (#2345) @oasis-cloud -- :bug: fix: 解决Drag组件拖拽后会在原地留一个遮挡元素问题+解决weapp/taro-h5多个demo拖拽位置不正确问题 (#2330) @irisSong -- :bug: fix(searchbar): 修复 clear 时未触发 change 的问题 (#2262) @eiinu - -# v2.6.8 - -`2024-05-31` - -- :sparkles: feat(button): 新增 button 原始类型属性 (#2195) @Jiankian -- :sparkles: feat(card): add card hide price and shop usage (#2292) @wick -- :bug: fix(cascader): onPathChange is not a function (#2308) @oasis-cloud -- :bug: fix: safearea for ac (#2293) @xiaoyatong -- :bug: fix(InputNumber): 扩大点击区域 (#2302) @xiaoyatong -- :bug: fix(picker): 函数调用之前检查 locale 是否已经定义 (#2259) @Alex-huxiyang -- 🏡 chore(demo): 更新组件引用方式 (#2304) @oasis-cloud -- 🏡 chore: fix typos (#2300) @Snoppy - -# v2.6.7 - -`2024-05-28` - -- :sparkles: feat: 签名组件增加当没有签名或已清空的情况下的参数暴露 (#2288) @xiaoyatong -- :bug: fix: ActionSheet 增加安全区处理 (#2286) @xiaoyatong -- :bug: fix(actionsheet): 去掉无意义的 padding,popup 已不再暴露 (#2285) @xiaoyatong - -# v2.6.6 - -`2024-05-24` - -- 🏡 chore(tag): css样式变量修复 (#2279) @Alex-huxiyang -- 🏡 chore(deps): update dependency eslint-plugin-markdown to v5 (#2218) @renovate[bot] -- 📖 docs(uploader): update (#2265) @eiinu -- :bug: fix(input): placeholder 无法设置空字符串 (#2282) @oasis-cloud -- :bug: fix(imagepreview): 阻止冒泡,防止点击图片关闭 (#2281) @Alex-huxiyang -- :bug: fix(FormItem): 修复initialValue属性初始化未被正确加入到Formstore中导致的问题 (#2247) @Alex-huxiyang - -# v2.6.5 - -`2024-05-17` - -\*🏡 chore(image): 官网taro的demo显示与h5不一致 (#2244) @Alex-huxiyang - -- :bug: fix(circleprogress): update demo (#2260) @Eiinu -- :bug: fix: 移除 defaultProps(2) (#2254) @Eiinu -- :bug: fix: 关于checkbox&tabs的doc与demo修改 (#2253) @Alex-huxiyang -- :bug: fix(table): 修复部分由于场景下width未生效导致的一些问题 (#2241) @Alex-huxiyang -- :bug: fix(menu): 选项文字很多时右侧箭头展示异常 (#2252) @Alex-huxiyang -- :bug: fix(input): 修复特殊场景下自动清除失效问题 (#2240) @Eiinu - -# v2.6.4 - -`2024-05-10` - -- 🏡 chore: 修改默认的微信基础库版本 (#2235) @eiinu -- 🏡 chore(image): demo代码风格优化 (#2220) @Alex-huxiyang -- 📖 docs(uploader): 文件上传编码使用提示 (#2224) @Alex-huxiyang -- :bug: fix(imagePreview): 阻止关闭预览事件对父结构的非必要影响 (#2227) @Alex-huxiyang -- :bug: fix(picker): 修复连续多次打开 picker 时显示值错误 (#2222) @eiinu -- :bug: fix(virtualList): 修复部分场景onScroll不触发 (#2221) @Alex-huxiyang -- :bug: fix: 移除 defaultProps (#2230) @eiinu - -# v2.6.3 - -`2024-04-30` - -- :bug: fix(tabs): 修复特殊场景下 value 设置未生效问题 (#2211) @eiinu - :art: style(Tabs.Tabpane): 给Tabs.Tabpane新增内边距样式变量,使得使用者可以自由控制该内边距。 (#2210) @jianhuagao -- 🏡 chore(icon): update demo (#2214) @eiinu - -# v2.6.2 - -`2024-04-26` - -- :bug: fix(datepicker): 修复受控方式下选项联动更新问题 (#2201) @eiinu -- :bug: fix(signature): 调整清空时机并更新demo (#2190) @Alex-huxiyang -- :bug: fix(ellipsis): 部分场景下的ref报错 (#2200) @Alex-huxiyang -- :bug: fix(inputnumber): 修复设置`InputNumber`组件className不生效的问题 (#2188) @Kurisu - :art: style: jmapp style 语义化 (#2052) @zhehu1 - :art: style(CellGroup): 给`CellGroup`组件新增外边距样式变量,使得使用者可以自由控制该外边距。 (#2189) @Kurisu - :art: style(badge): jdesign badge 样式 (#2164) @zhehu1 -- 📖 docs(tag):修复demo描述错误 (#2204) @jianhuagao - -# v2.6.1 - -`2024-04-19` - -- :bug: fix(image): standardize demos (#2177) @Alex-huxiyang -- :bug: fix(cellgroup): 去掉 cellgroup 未单独使用的 style 属性 (#2176) @kurisu994 -- :bug: fix(site): png url error & key duplicate (#2178) @Alex-huxiyang -- :bug: fix(swiper): 异步加载 indicator 不显示 (#2167) @Alex-huxiyang - -# v2.6.0 - -`2024-04-12` - -- 🪵 refactor(swiper): H5 下实现重构,增加 focus 模式 (#1962) @oasis-cloud -- :sparkles: feat: input 的 onFocus 增加 height 键盘高度参数 (#2154) @alex.zeng -- :bug: fix(drag): demo拆解与规范 (#2163) @eiinu -- :bug: fix(form): 可定义 fontsize (#2162) @oasis-cloud -- 🏡 chore(picker): demo拆解与规范 (#2157) @Alex-huxiyang -- 🏡 chore(radio): demo拆解与规范 (#2158) @LuckyLucy -- 🏡 chore(menu): demo拆解与规范 (#2153) @Alex-huxiyang -- 🏡 chore(loading): demo拆解与规范 (#2155) @Alex-huxiyang -- 🏡 chore(notify): demo拆解与规范 (#2151) @Alex-huxiyang - -# v2.5.2 - -`2024-04-03` - -- 🏡 chore(form): demo拆解与规范 (#2148) @oasis-cloud -- 🏡 chore(countdown): demo拆解与规范 (#2147) @Alex-huxiyang -- 🏡 chore(cascader): demo拆解与规范 (#2144) @Alex-huxiyang -- 🏡 chore(checkbox): demo拆解与规范 (#2146) @Alex-huxiyang -- :bug: fix(calendarcard): 直接抛出ondayclick (#2150) @oasis-cloud -- :bug: fix(radio): 样式变量修复(issue) (#2149) @Alex-huxiyang - -# v2.5.1 - -`2024-03-29` - -\*🏡 chore(deps): update dependency @types/testing-library\_\_jest-dom to v6 (#2127) @renovate[bot] - -- 📖 docs(readme): change npm to pnpm in the document (#2131) @JedediahXu -- :sparkles: feat(popover): rtl (#2121) @xiaoyatong -- :sparkles: feat(ellipsis): rtl (#2128) @irisSong -- :sparkles: feat(Form): rtl (#2120) @xiaoyatong -- :sparkles: feat(progress): Taro新增lazy属性 (#2108) @Alex-huxiyang -- :bug: fix(datepicker): 修复 datepicker 类型为hour-minutes/time时选中值无法回显的问题 (#2141) @yeyu98 -- :bug: fix(Toast): demo拆解与规范 (#2073) @OrdinarySF -- :bug: fix(calendar): demo拆解与规范 (#2137) @mikasayw -- :bug: fix(DatePicker): demo拆解与规范 (#2133) @yeyu98 -- :bug: fix(uploader): demo拆解与规范 (#2140) @irisSong -- :bug: fix(tabs): 修复 tab 过多时滚动定位不准确的问题 (#2135) @eiinu -- :bug: fix(range): demo拆解与规范 (#2139) @ShuchenEason -- :bug: fix(imagepreview): demo拆解与规范 (#2134) @Alex-huxiyang -- :bug: fix(textarea): demo拆解与规范 (#2132) @Amylee9712 -- :bug: fix(tour): demo拆解与规范 (#2130) @Alex-huxiyang -- :bug: fix(actionsheet): demo拆解与规范 (#2124) @ZissyW -- :bug: fix(icon): update taro demo (#2129) @eiinu -- :bug: fix(popup): demo拆解与规范 (#2122) @ZissyW -- :bug: fix(numberkeyboard): demo拆解与规范 (#2123) @ZissyW - -# v2.5.0 - -`2024-03-22` - -- :sparkles: feat(Popover): 新增单条数据的demo展示 (#2117) @xiaoyatong -- :sparkles: feat(progress): 支持taro的lazy属性 & demo拆解与规范 (#2086) @Alex-huxiyang -- :bug: fix(dialog): 关闭按钮默认在底部,24px白色图标 (#2118) @irisSong -- :bug: fix(noticebar): fix docs (#2119) @xiaoyatong -- :bug: fix(virtuallist): demo拆解与规范 (#2116) @eiinu -- :bug: fix: 修复address组件onChange参数透传问题 (#2110) @DreamSeeker321 -- :bug: fix(Icon): 小程序下展示异常问题修复 (#2114) @xiaoyatong -- :bug: fix(swiper): demo拆解与规范 (#2115) @Alex-huxiyang -- :bug: fix(audio): demo拆解与规范 (#2111) @Alex-huxiyang -- :bug: fix(animatingnumbers): demo拆解与规范 (#2109) @Alex-huxiyang -- :bug: fix(video): demo拆解与规范 (#2104) @eiinu -- :bug: fix(avatarcropper): demo拆解与规范 (#2103) @eiinu -- :bug: fix(steps): demo拆解与规范 (#2105) @eiinu -- :bug: fix: 修复 demo 目录报错 (#2107) @eiinu -- :bug: fix(swipe): 修改demo文案 (#2106) @xiaoyatong -- :bug: fix(shortpassword): demo拆解与规范 (#2102) @Alex-huxiyang -- :bug: fix(circleprogress): demo拆解与规范 (#2091) @Alex-huxiyang -- :bug: fix: vitest (#2101) @xiaoyatong -- :bug: fix(table): demo拆解与规范 (#2074) @Alex-huxiyang -- :bug: fix(timeselect): demo拆解与规范 (#2087) @Alex-huxiyang -- :bug: fix(tabs): demo拆解与规范 (#2066) @yeyu98 -- :bug: fix(signature): demo拆解与规范 (#2099) @Alex-huxiyang -- :bug: fix(tag): taro 下自定义icon无法展示 (#2088) @eiinu -- :bug: fix(animate): demo拆解与规范 (#2085) @eiinu -- :bug: fix(collapse): demo拆解与规范 (#2094) @eiinu -- :bug: fix(barrage): 简化demo (#2100) @xiaoyatong -- :bug: fix(barrage): demo拆解与规范 (#2098) @joyfully-W -- :bug: fix: taro-demo full class (#2095) @eiinu -- :bug: fix(Ellipsis): 修复小程序环境下给Ellipsis设置字号后工作不正常的问题 (#2078) @FPG-Alan -- :bug: fix: test (#2096) @xiaoyatong -- :bug: fix: 代码块修改为等宽字体 (#2092) @eiinu -- 🚦 Revert "feat(progress): 支持taro的lazy属性 & demo拆解与规范 (#2086)" @oasis-cloud -- 🏡 chore(calendarcard): demo 拆解与规范 (#2026) @eiinu -- 🏡 chore: 优化组件类型导出 (#2036) @eiinu -- 🏡 chore(deps): update dependency happy-dom to v14 (#2097) @renovate[bot] -- 🏡 chore: update changelog @oasis-cloud -- 📖 docs(overlay): fix typo @eiinu - -# v2.4.2 - -`2024-03-20` - -- 🔨 chore(row): 优化 className (#2054) @eiinu -- :sparkles: feat(backtop): rtl (#2051) @xiaoyatong -- :sparkles: feat(NoticeBar): 增加right 属性,支持更多可自定义内容 @xiaoyatong -- :bug: fix(address): demo拆解与规范 (#2068) @Alex-huxiyang -- :bug: fix(avatar): demo规范与调整 (#2071) @Alex-huxiyang -- :bug: fix(badge): demo拆解与规范 (#2060) @sd -- :bug: fix(calendarcard): 修复受控模式 (#2063) @eiinu -- :bug: fix(Card): demo拆解与规范 (#2072) @joyfully-W -- :bug: fix(dialog): demo拆解与规范 (#2069) @irisSong -- :bug: fix(fixedNav): demo拆解与规范 (#2048) @Alex-huxiyang -- :bug: fix(icon): 处理 rtl 部分 (#2050) @xiaoyatong -- :bug: fix(indicator): demo拆解与规范 (#2090) @eiinu -- :bug: fix(infiniteLoading): demo拆解与规范+增加joy logo的demo (#2081) @irisSong -- :bug: fix(input): demo拆解与规范 (#2035) @yeyu1998 -- :bug: fix(navbar): demo拆解与规范 (#2055) @Alex-huxiyang -- :bug: fix(pagination): demo拆解与规范 (#2079) @Alex-huxiyang -- :bug: fix(price): demo拆解与规范 (#2082) @Alex-huxiyang -- :bug: fix(pulltorefresh): demo中下拉图标修改为joy logo (#2084) @irisSong -- :bug: fix(rate): demo拆解与规范 (#2045) @sandra -- :bug: fix(SearchBar): demo拆解与规范 (#2064) @joyfully-W -- :bug: fix(sideNavBar): demo拆解与规范 (#2058) @Alex-huxiyang -- :bug: fix(skeleton): demo拆解与规范 (#2047) @sd -- :bug: fix(sticky): demo拆解与规范 (#2024) @Alex-huxiyang -- :bug: fix(swiper): rtl (#2061) @xiaoyatong -- :bug: fix(tabbar): demo拆解与规范&脚本增强 (#2059) @Alex-huxiyang -- :bug: fix(trendarrow): demo拆解与规范 (#2075) @ber -- :bug: fix(watermark): demo拆解与规范 (#2083) @eiinu -- :bug: fix: update copy-docs-h5-or-taro.js (#2080) @eiinu -- test: migrate jest to vitest (#2057) @eiinu - -# v2.4.1 - -`2024-03-15` - -- :sparkles: feat(badge): 新增 fill 属性 (#2042) @eiinu -- :sparkles: feat(button): 增加xlarge,按钮内图标大小追随按钮当前字号 (#2037) @xiaoyatong -- :sparkles: feat(ci): add issue-close.yml (#2031) @eiinu -- :sparkles: feat(infiniteloading): add type props (#2027) @irisSong -- :sparkles: feat(pulltorefresh): 增加 type 属性,支持深色背景设置 (#2044) @xiaoyatong -- :sparkles: feat(tabs): rtl (#2004) @irisSong -- :bug: fix(backtop): demo拆解与规范 (#2025) @Alex-huxiyang -- :bug: fix(badge): 修复value传入0时显示不正确的问题 (#2006) @boiboif -- :bug: fix(build): 移除构建产物中重复的类型文件 (#2038) @eiinu -- :bug: fix(calendarcard): 选择范围时支持仅选择单个日期 (#2009) @eiinu -- :bug: fix(configProvidder): demo拆解与自动替换脚本&configProvider规范统一 (#2005) @Alex-huxiyang -- :bug: fix(divider): demo拆解与规范 (#2013) @Alex-huxiyang -- :bug: fix(elevator): demo拆解与规范 (#2030) @Alex-huxiyang -- :bug: fix(ellipsis): 修复设置行数超过内容高度时只显示一行内容的问题 (#2028) @boiboif -- :bug: fix(Empty): 调整默认图片为jd图片 (#2032) @xiaoyatong -- :bug: fix(grid): demo拆解与规范 (#2014) @Alex-huxiyang -- :bug: fix(icon): demo拆解与规范 (#2010) @Alex-huxiyang -- :bug: fix(Image): demo拆解与规范 (#2011) @Alex-huxiyang -- :bug: fix(layout): demo拆解与规范 & 修复脚本在不同操作系统的正则匹配出错 (#2016) @Alex-huxiyang -- :bug: fix(overlay): demo拆解与规范 (#2012) @Alex-huxiyang -- :bug: fix(popover): 调整demo (#2043) @xiaoyatong -- :bug: fix(range): touchmove 回调中 rect 获取失败时终止 (#2029) @eiinu -- :bug: fix(space): demo拆解与规范 (#2021) @Alex-huxiyang -- :bug: fix(switch):switch组件demo代码重构 (#2033) @jiangjin3323 -- :bug: fix: docs (#2023) @xiaoyatong -- :bug: fix: fix swipe slide element get rect width error (#2017) @awefeng -- :bug: fix: 构建站点主题变量未成功引入 (#2002) @oasis - style(button): jmapp style (#2019) @zhehu1 - -# v2.4.0 - -`2024-03-08` - -- :sparkles: feat(inputnumber): update UI (#1989) @oasis-cloud -- :sparkles: feat(checkbox): list model (#1957) @oasis-cloud -- :sparkles: feat(dialog): added custom content area demo (#1995) @irisSong -- :sparkles: feat(dialog): support bottom close button (#1978) @irisSong -- :sparkles: feat(dialog): support confirm button loading effect (#1983) @bbf -- :sparkles: feat(empty): 图片变更 (#1988) @xiaoyatong -- :sparkles: feat(noticebar): supports the center layout (#1972) @irisSong -- :sparkles: feat(popover): 增加 light 和 dark 模式的区分 (#1977) @xiaoyatong -- :sparkles: feat(swipe): 增加自定义高度的demo (#1996) @xiaoyatong -- :sparkles: feat(rtl): badge (#1986) @eiinu -- :sparkles: feat(rtl): collapse (#1981) @eiinu -- :sparkles: feat(rtl): noticebar (#1984) @eiinu -- :sparkles: feat(rtl): table (#1982) @eiinu -- :sparkles: feat(animatingNumbers): support rtl (#1985) @irisSong -- :bug: fix(badge): the text set by value unwrap (#1992) @irisSong -- :bug: fix(cell): unify the demos of Cell (#1998) @Alex-huxiyang -- :bug: fix(toast): add deprecated prop msg (#1999) @eiinu -- :bug: fix(toast): 变更 taro下的属性 msg 为 content,增加 taro 下 demo (#1994) @xiaoyatong -- :bug: fix(virtuallist): 修复 vitrual list 组件 Taro 下获取窗口高度不正确的问题 (#1993) @CDog34 -- :bug: fix: dts 插件升级导致构建产物路径错误 (#1979) @oasis-cloud -- :bug: fix: tabs 小程序滚动操作问题 (#1969) @feiyang1020 -- 🔨 chore(deps): bump typescript v5 (#1975) @eiinu -- 🔨 chore(deps): update commitlint monorepo to v19 (#1976) @renovate[bot] -- 🔨 chore: 构建 demo 要定义 **PROJECTID** (#1974) @oasis-cloud -- 📖 docs(tabs): fix typo (#1997) @eiinu - -# v2.3.12 - -`2024-03-01` - -- :sparkles: feat(inputnumber): taro 环境下增加 number类型的键盘 (#1965) @LING_ZI_QING -- :sparkles: feat(rtl): support progress & range (#1961) @eiinu -- :bug: fix(elevator): 修复增加页码的逻辑 (#1960) @oasis-cloud -- :bug: fix(elevator): 解决部分安卓手机右侧导航高亮偏差问题 (#1966) @irisSong -- :bug: fix(form): after setting validateTrigger, `trigger` should be excluded (#1963) @oasis-cloud -- :bug: fix(form): 组件更新时,标签结构变化,会导致失去焦点 (#1973) @oasis-cloud -- :bug: fix(inputnumber): provide finalValue (#1959) @oasis-cloud -- 📖 docs: 修复文档 (#1964) @xiaoyatong -- 🛠 refactor(docs): 文档支持通过标签使用已有的 demo 代码 (#1950) @Alex-huxiyang -- 🛠 refactor: adjust build target to ES6, reduce size of configprovider (#1949) @oasis-cloud -- 🔨 chore(ci): update workflows (#1970) @eiinu -- 🔨 chore(dev): development mode, remove duplicate CSS stylesheets (#1958) @oasis-cloud -- 🔨 chore: remove CSS logic conflicting with MDX (#1971) @oasis-cloud - -# v2.3.11 - -`2024-02-23` - -- :sparkles: feat(inputnumber): support allow empty (#1943) @oasis -- :bug: fix(actionsheet): 关闭弹窗后内容显示在页面,优化 popup 相关属性传递 (#1954) @LING_ZI_QING -- :bug: fix(rtl): css 样式变量部分 (#1944) @xiaoyatong -- :bug: fix(form): validateFields support promise (#1955) @oasis - -# v2.3.10 - -`2024-02-06` - -- :sparkles: feat(form): support renderProps (#1937) @oasis-cloud -- :sparkles: feat(shortpassword): support ref for form (#1930) @oasis-cloud -- :sparkles: feat: 生成用于 rtl 校对的 css 文件 (#1927) @oasis-cloud -- :bug: fix(barrage): 解决新增弹幕重叠问题+不同宽度弹幕滚动速度不一致问题+重构taro版本 (#1942) @irisSong -- :bug: fix(popover): can not be closed (#1931) @oasis-cloud -- :bug: fix(sticky): 适配 taro (#1928) @xiaoyatong -- :bug: fix(tabs): 修订左对齐样式 (#1929) @xiaoyatong -- 📖 docs(tabs): 文档可读性优化 (#1935) @Alex-huxiyang - -# v2.3.9 - -`2024-02-02` - -- :sparkles: feat: generate stylesheets containing RTL-related styles (#1889) @oasis-cloud -- :bug: fix(infiniteloading): infiniteloading 点击后再滑动,操作出现异常 (#1919) @JQ -- :bug: fix(input): controlled mode, content clearing does not work (#1912) @oasis-cloud -- :bug: fix(popup): support destroyOnClose (#1914) @oasis-cloud -- :bug: fix(rtl): 修复文本 margin (#1926) @xiaoyatong -- :bug: fix(textarea): 修复maxlength=-1时无法输入字符的情况 (#1910) @xiaoyatong -- :bug: fix(input): 受控模式下在 H5 无法清空内容 (#1925) @oasis-cloud -- :bug: fix(rtl): 左右方向箭头的处理 (#1922) @xiaoyatong -- 📖 docs(backtop): 文档可读性优化 (#1909) @Alex-huxiyang -- 📖 docs(image): correct the error attribute (#1916) @oasis-cloud -- 📖 docs(layout): 文档可读性优化 (#1904) @Alex-huxiyang -- 📖 docs(navbar): 文档可读性优化 (#1915) @Alex-huxiyang -- 📖 docs(sidenavbar): 文档可读性优化 (#1920) @Alex-huxiyang -- 📖 docs(sticky): 文档可读性优化 (#1906) @Alex-huxiyang -- 📖 docs(tabbar): 文档可读性优化 (#1921) @Alex-huxiyang - -# v2.3.8 - -`2024-01-26` - -- 🔨 chore: 修复dev环境下demo分包体超过2M问题 (#1905) @xiaoyatong -- 📖 docs(configprovider): 文档可读性优化 (#1882) @Alex-huxiyang -- 📖 docs(grid): 文档可读性优化 (#1903) @Alex-huxiyang -- 📖 docs(swiper): customize pagination controls (#1892) @oasis-cloud -- :sparkles: feat(navbar): title区域自适应宽度 (#1891) @irisSong -- :sparkles: feat(rate): 新增 touchable 属性支持滑动选择 (#1880) @eiinu -- :sparkles: feat(video): support passing through attributes for Taro Video (#1890) @xiaoyatong -- :sparkles: feat: radiogroup add shape props (#1898) @oasis-cloud -- :bug: fix(ellipsis): 修复小程序文本省略问题 (#1888) @eiinu -- :bug: fix(ellipsis): 在 taro 小程序下尽量展示的平滑舒适 (#1902) @xiaoyatong -- :bug: fix(image): 文档可读性优化 (#1887) @Alex-huxiyang -- :bug: fix(overlay): 文档可读性优化 (#1894) @Alex-huxiyang -- :bug: fix(rate): 修复 rate 高度问题 (#1883) @eiinu -- :bug: fix(steps): 小程序的真机情况下出现的换行的情况 (#1899) @xiaoyatong -- :bug: fix(swiper): 轮播跳帧 (#1886) @oasis-cloud -- :bug: fix(tabs): 解决组件嵌套tabs,横向滚动位置计算偏差问题 (#1884) @irisSong -- :bug: fix: doc、demo调整&优化 @huxiyang3 -- :bug: fix: taro.createSelectorQuery not function (#1907) @oasis-cloud - -# v2.3.7 - -`2024-01-19` - -- :sparkles: feat(checkbox): 增加至少选择项数量的设置功能 (#1859) @oasis -- :sparkles: feat(dialog): 增加关闭按钮 (#1872) @irisSong -- :sparkles: feat(imagepreview): 新增 closeIcon & closeIconPosition (#1873) @eiinu -- :sparkles: feat(numberkeyboard): add title right actions (#1881) @xiaoyatong -- :sparkles: feat: support debugging RTL in the H5 development environment (#1865) @oasis -- :bug: fix(space): 主/交叉轴的 demo 与国际化改进 (#1867) @Alex-huxiyang -- :bug: fix(animatingnumbers): 修复单元测试问题 (#1878) @eiinu -- :bug: fix(button): demo和doc一致化、文档代码优化、属性补充 (#1875) @Alex-huxiyang -- :bug: fix(cell): doc、demo一致化改进 (#1877) @Alex-huxiyang -- :bug: fix(popover): 置于滚动容器中,popover 需要跟随滚动,修复选中项的样式 (#1869) @oasis -- :bug: fix(table): fixed sticky css (#1866) @xiaoyatong -- :bug: fix(tabs): 纵向图标未对齐问题 (#1868) @irisSong -- :bug: fix(Textarea): 文档demo中props拼写错误修改 (#1874) @irisSong -- :bug: fix(uploader): fix the styles when custom progress (#1863) @xiaoyatong -- :bug: fix: 增加 CSS 变量配置颜色的例子,完善 color 属性的使用场景描述 (#1857) @oasis -- 📖 docs(avatar): add list display mode (#1862) @oasis -- 📖 docs(icon): 更新文档 (#1879) @eiinu -- 📖 docs(shortpassword): 增加onComplete的demo及文档 (#1860) @xiaoyatong -- 🛠 refactor(circleprogress): optimize animation duration (#1861) @oasis - -# v2.3.6 - -`2024-01-12` - -- :sparkles: feat(space): update demos and docs of justify and align (#1856) @Alex-huxiyang -- :sparkles: feat(tag): image text (#1851) @oasis -- :sparkles: feat: doc文档优化 (#1850) @Alex-huxiyang -- :bug: fix(swiper): fix props of saving image at taro, fix parameter of onChange, update taro version to 3.6.22 (#1847) @xiaoyatong -- :bug: fix: fix some components display bad with the white screen at taro when is development (#1852) @xiaoyatong -- 🔨 chore(deps): update icons to v1.0.2 (#1853) @oasis - -# v2.3.5 - -`2024-01-05` - -- :sparkles: feat(avatarcropper): 新增属性shape,可设置裁剪样式为圆形 (#1842) @Marvin Gui -- :sparkles: feat(dialog): 新增 CSS 变量 (#1844) @LING_ZI_QING -- :sparkles: feat(range): marks type optimization (#1833) @oasis-cloud -- :sparkles: feat(tabs): 新增 CSS 变量 (#1835) @LING_ZI_QING -- :bug: fix(avatarcropper): fix cannot display when it is development at taro (#1840) @xiaoyatong -- :bug: fix(empty): fix import at taro (#1839) @xiaoyatong -- :bug: fix(picker): 优化 options 的 text 属性的判空逻辑 (#1837) @oasis-cloud -- :bug: fix(picker): 修复 safari 下 mask 样式问题 (#1843) @eiinu -- :bug: fix(pulltorefresh): 修复安卓小程序下拉卡顿问题 (#1830) @NickH -- :bug: fix(tabs): docs and jmapp css variables (#1838) @xiaoyatong -- 🔨 chore(deps): update @nutui/icons to v1.0.1 (#1836) @oasis-cloud - -# v2.3.4 - -`2023-12-29` - -- 📖 docs(nabvar): showtoas 改为 showToast (#1826) @MingHui -- :bug: fix(datepicker): 未设置 value/defaultValue 时渲染 0 (#1819) @RyanCW -- :bug: fix(infiniteLoading): ssr (#1828) @xiaoyatong -- :bug: fix(infiniteLoading): 修改类名及demo (#1818) @xiaoyatong -- :bug: fix(popover): icon cannot be displayed at taro (#1820) @xiaoyatong -- :bug: fix(popver): bottom positon (#1823) @xiaoyatong -- :bug: fix(tabbar): fix icon color (#1816) @xiaoyatong -- :bug: fix(virtualList): 等高模式下的抖动处理, 不定高模式快速滑动白屏 (#1825) @oasis-cloud -- :bug: fix(watermark): fix demos (#1817) @xiaoyatong -- 🛠 refactor(infiniteloading): onRefresh、onLoadMore 改为 Promise 类型,去掉显示调用 done 方法 (#1827) @oasis-cloud - -# v2.3.3 - -`2023-12-22` - -- :sparkles: feat(form): validateFields 挂到实例上 (#1813) @oasis-cloud -- :sparkles: feat(table): 增加table锁定头部、左侧列、右侧列 (#1775) @zhehu1 -- :bug: fix(Button): incorrect color for danger (#1809) @vczyh -- :bug: fix(cascader): 增加 ref 上的 open 和 close 方法,支持 form 中使用 (#1799) @oasis-cloud -- :bug: fix(datepicker): 受控模式不生效 (#1797) @oasis-cloud -- :bug: fix(infiniteloading): scrollview 的 scrolltop 不应该根据高度设置 (#1804) @oasis-cloud -- :bug: fix(pulltorefresh): icon 部分拆到demo中 (#1812) @xiaoyatong -- :bug: fix(tabbaritem): 将 clone 子元素的方法,改为 context 的方式,隐藏内部使用的 props,精简对外暴露的 props 类型 (#1811) @oasis-cloud -- :bug: fix(tabs): 导航滚动到可视范围需要显示指定 name,调整为内置 uuid 替代 name (#1800) @oasis-cloud -- 🔨 chore: use svg64 in taro (#1805) @xiaoyatong - -# v2.3.2 - -`2023-12-15` - -- 📖 docs(cascader): 动态加载文档代码与 demo 保持一致,回显已选数据 (#1787) @LING_ZI_QING -- :sparkles: feat(fixednav): add the list icon for ReactNode (#1786) @sunsunmonkey -- :bug: fix(cascader): second column data cannot be displayed (#1796) @xiaoyatong -- :bug: fix: popup minheight for iPhone14 pro max (#1795) @xiaoyatong -- :bug: fix: toast duration too long (#1794) @xiaoyatong -- 🛠 refactor(swiper): implementing sliding logic through useTouch (#1793) @oasis-cloud -- 🛠 refactor: 类型文件统一为 types,增加 fixednavitem 类型 (#1789) @oasis-cloud - -# v2.3.1 - -`2023-12-13` - -- :bug: fix(searchbar): 小程序环境不支持 _ 选择器,将 _ 展开为 div、span、svg (#1777) @oasis-cloud -- :bug: fix: jmapp variables (#1776) @xiaoyatong -- :bug: fix: icon 使用方式错误 (#1778) @xiaoyatong -- :bug: fix: 使用 popup 的组件,采用 scrollview 实现 (#1782) @oasis-cloud - -# v2.3.0 - -`2023-12-08` - -- 🔨 chore(config): demo 的配置文件中增加 css 主题 (#1765) @oasis-cloud -- 🔨 chore(deps): update dependency @nutui/icons-\* to 0.0.5 (#1767) @oasis-cloud -- 📖 docs(avatar): 修改demo值,改为可支持变量 (#1752) @xiaoyatong -- 📖 docs(checkbox): checkedIcon 改为 activeIcon (#1724) @oasis-cloud -- 📖 docs(countdown): 修复文档中的文案多语言化 (#1723) @xiaoyatong -- 📖 docs(form): 文档增加 useForm 的示例 (#1708) @oasis-cloud -- 📖 docs(overlay): 文档优化 (#1706) @xiaoyatong -- 📖 docs(picker): fix docs (#1740) @xiaoyatong -- 📖 docs(popup): 禁止滚动穿透示例 (#1769) @oasis-cloud -- 📖 docs(pulltorefresh): 增加 scrollTop 相关 demo (#1755) @oasis-cloud -- 📖 docs(table): 修改文档 (#1731) @xiaoyatong -- 📖 docs(tour): fix tour demo (#1759) @xiaoyatong -- 📖 docs: address and collapse doc icons (#1692) @xiaoyatong -- 📖 docs: fix docs (#1678) @xiaoyatong -- :sparkles: feat(calendarcard): 限制范围时禁止面板切换 (#1688) @eiinu -- :sparkles: feat(checkbox): add button mode (#1738) @xiaoyatong -- :sparkles: feat(empty): adds title,size,and actions (#1697) @xiaoyatong -- :sparkles: feat(example): add with-rsbuild example (#1661) @Kurisu -- :sparkles: feat(form): 增加上下结构的展示的demo (#1729) @xiaoyatong -- :sparkles: feat(infiniteloading): 优化布局,添加css变量,增加demo (#1760) @xiaoyatong -- :sparkles: feat(navbar): 增加标题左对齐方式,优化左侧icon的布局,调整className类 名和css 变量 (#1750) @xiaoyatong -- :sparkles: feat(pagination): add lite mode and css variable (#1743) @xiaoyatong -- :sparkles: feat(popover): 新增属性 action,简化css 变量 (#1747) @xiaoyatong -- :sparkles: feat(popup): 增加description属性,调整从底部弹出时的样式,默认为 round 模式 (#1749) @xiaoyatong -- :sparkles: feat(searchbar): 增加属性 backable 可返回,简化css变量 (#1736) @xiaoyatong -- :sparkles: feat(tabs): 新增模式 divider 及 demo (#1761) @xiaoyatong -- :sparkles: feat(tabs): 新增简约,卡片,按钮/胶囊模式,简化CSS变量,变更className类 名 (#1727) @xiaoyatong -- :sparkles: feat: add dashed and rightIcon, and changed fill default value as outline (#1695) @xiaoyatong -- :sparkles: feat: theme updated to v12 (#1573) @xiaoyatong -- :sparkles: feat: update icons (#1693) @xiaoyatong -- :sparkles: feat: 收敛 icons (#1687) @xiaoyatong -- :bug: fix(calendar): 日历设置结束时间超过开始时间后白屏 (#1745) @oasis-cloud -- :bug: fix(datepicker): 起始时间与结束时间更新后,时间选项数组更新 (#1694) @学友 -- :bug: fix(dialog): 调整dialog button大小 (#1720) @xiaoyatong -- :bug: fix(form): 设置 errorMessageAlign="right" 错误文案无法右对齐 (#1709) @oasis-cloud -- :bug: fix(form): 重置功能无法清空报错信息 (#1711) @oasis-cloud -- :bug: fix(image): 修复开启 lazy 后 loading 失效问题 (#1768) @eiinu -- :bug: fix(indicator): 修订样式名称和样式变量 (#1712) @xiaoyatong -- :bug: fix(swiper): demo 中分页器样式显示错误 (#1703) @xiaoyatong -- :bug: fix: address close icon cannot be customed (#1685) @xiaoyatong -- :bug: fix: change drag demo radius value of button (#1701) @xiaoyatong -- :bug: fix: picker 和 address 在 form 中使用,未阻止冒泡,导致取消和确认无法关闭 (#1710) @oasis-cloud -- :bug: fix: 对使用icon的demo 进行了size 设置的废弃,使用了默认size (#1728) @xiaoyatong -- :bug: fix: 调整demo中button大小,调整stoke的默认颜色 (#1717) @xiaoyatong -- 🛠 refactor(cell): 修订类名 (#1722) @xiaoyatong -- 🛠 refactor(numberkeyboard): 修订类名和样式变量 (#1719) @xiaoyatong -- 🛠 refactor(swipe): 修订className类名 (#1715) @xiaoyatong -- 🛠 refactor(switch): 修改样式名称及样式变量,添加相应demo (#1714) @xiaoyatong -- 🛠 refactor(table): props 中的 data 校验逻辑异常 (#1675) @oasis-cloud -- 🛠 refactor(timeselect): 优化结构,简化css变量 (#1732) @xiaoyatong -- 🛠 refactor: css 变量命名规范(主题色部分,不含灰阶) (#1679) @xiaoyatong -- 🛠 refactor: rename card classname (#1700) @xiaoyatong - style(button): class 名 nut-button\_\_warp 更改为 nut-button-wrap (#1705) @xiaoyatong - style(calendar): 优化css变量 (#1753) @xiaoyatong - style(cascader): 去掉无意义样式,修订文档样式变量 (#1757) @xiaoyatong - style(circleprogress): docs 优化,修订 css 变量 (#1699) @xiaoyatong - style(collapse): add border-bottom as an item (#1698) @xiaoyatong - style(fixednav): 废弃 bem 规范, 修订 css 变量 (#1702) @xiaoyatong - style(input): 增加css 变量,优化demo和文档 (#1730) @xiaoyatong - style(inputnumber): 简化css变量,修订className类名 (#1737) @xiaoyatong - style(loading): 修订css变量名,补充css变量文档 (#1721) @xiaoyatong - style(menu): 优化css变量命名,修改className 类名 (#1746) @xiaoyatong - style(noticebar): 修订类名和css变量 (#1751) @xiaoyatong - style(notify): 优化样式布局 (#1762) @xiaoyatong - style(picker): 修改css变量 (#1735) @xiaoyatong - style(radio): 优化css变量和样式 (#1756) @xiaoyatong - style(range): 修订样式变量 (#1718) @xiaoyatong - style(rate): 修订 css 变量 (#1707) @xiaoyatong - style(sidnavbar): 修订css 变量 (#1734) @xiaoyatong - style(steps): 优化steps样式结构,改进css变量名 (#1741) @xiaoyatong - style(tabbar): add css variable (#1742) @xiaoyatong - style(tag): 修订样式变量 (#1733) @xiaoyatong - style(toast): 调整样式,补充demo的多语言化 (#1754) @xiaoyatong - style(trendarrow): 修订className类名 (#1716) @xiaoyatong - style(uploader): 修订样式css变量 (#1758) @xiaoyatong - style: animatenumbers number css (#1681) @xiaoyatong - style: 修订className (#1770) @xiaoyatong - -# v2.2.0 - -`2023-11-24` - -- :sparkles: feat(badge): 优化结构 (#1663) @xiaoyatong -- :sparkles: feat(dialog): 标题前增加结构 (#1666) @xiaoyatong -- :sparkles: feat(grid): 增加 demo (#1660) @xiaoyatong -- :sparkles: feat(image): 增加 demo (#1658) @xiaoyatong -- :sparkles: feat(theme): 修订 fontSize (#1674) @xiaoyatong -- :bug: fix(elevator): 索引定位不准 (#1667) @oasis-cloud -- :bug: fix(swiper): swiper-item 宽高异常问题 (#1657) @eiinu -- :bug: fix(uploader): Update uploader.tsx (#1656) @Kurisu -- :bug: fix(uploader): uploader when item type is undefined (#1650) @xiaoyatong -- 🛠 refactor: css 变量命名规范(主题色部分,不含灰阶) (#1679) @xiaoyatong -- 🛠 refactor: elevator css and variables (#1668) @xiaoyatong -- 🛠 refactor: 防抖方法归一 (#1664) @xiaoyatong -- 🌈 style: delete dark in demos (#1670) @xiaoyatong -- 🌈 style: divider css 修改, 修改部分css变量 (#1669) @xiaoyatong -- 🌈 style: 清理样式变量 (#1673) @xiaoyatong -- 📖 docs(address): 修复非受控模式演示代码不显示 (#1659) @haitao -- 📖 docs: fix docs (#1678) @xiaoyatong -- 📖 docs: 修改文档 (#1662) @xiaoyatong -- 🔨 chore: add jmapp (#1665) @xiaoyatong - -# v2.1.0 - -`2023-11-17` - -- :sparkles: feat(Button): size 增加可选值 mini (#1617) @eiinu -- :sparkles: feat(calendarcard): 增加自定义 className (#1636) @eiinu -- :sparkles: feat(infiniteLoading): 通过scrolltolower触发加载事件 (#1633) @oasis-cloud -- :sparkles: feat(safearea): 新增安全区组件 (#1642) @oasis-cloud -- :sparkles: feat(toast): 通过 config 方法设置内容区的className (#1632) @oasis-cloud -- :sparkles: feat: uploader taro h5 支持 video (#1605) @xiaoyatong -- :bug: fix(infiniteloading): onloadmore 无法获取最新的 state (#1644) @oasis-cloud -- :bug: fix: change text in locales (#1634) @xiaoyatong -- :bug: fix: picker and datepicker theme config at taro and indicator css at taro (#1615) @xiaoyatong -- :bug: fix: 日历close样式,可自定义样式;修改弹幕样式;更名CircleClose为Failure、Issue 为 Tips (#1648) @xiaoyatong -- :bug: fix: 🐛 修复swipe存在点击事件时,触发onTouchStart,获取到rightRect为null导致的报错问题 (#1608) @Levidcd -- 🚀 perf: radio reverse and demos (#1631) @xiaoyatong -- 🛠 refactor(classname): 调整 classname 的顺序 (#1637) @oasis-cloud -- 📖 docs(cell): 增加卡片类型的 demo (#1639) @oasis-cloud -- 📖 docs(sideNavBar): handleClose 改为 onClose (#1635) @haitao - -# v2.0.24 - -`2023-11-10` - -- 🚀 perf(deps): 升级 icons 依赖,icons 包体积缩减 (#1604) @oasis-cloud -- 🚀 perf(CalendarCard): taro demo 性能优化 (#1593) @eiinu -- :sparkles: feat(Toast): 新增 wordBreak 属性 (#1606) @eiinu -- :sparkles: feat: picker and datepicker add onCancel (#1603) @xiaoyatong -- :sparkles: feat: 类似微信头像裁剪组件 (#1564) @Marvin Gui -- :bug: fix(CalendarCard): 初始化渲染逻辑优化 (#1596) @eiinu -- :bug: fix(circleprogress): 计算出现 NaN 导致组件展示为 100% 的情况 (#1602) @oasis-cloud -- :bug: fix(elevator): 替换文档展示pagation到showKeys (#1598) @HaiTao -- :bug: fix(tag): 修复加载样式问题 #1588 (#1592) @eiinu -- :bug: fix: picker & DatePicker onConfirm failed (#1601) @xiaoyatong -- :bug: fix: swiper indicator zindex at taro (#1586) @xiaoyatong -- :bug: fix: taro event detail is undefined (#1591) @xiaoyatong -- :bug: fix: virtuallist key at taro (#1584) @xiaoyatong -- :bug: fix: 标签上的属性默认为 true,导致渲染 lockscroll 相关的 class (#1599) @oasis-cloud -- 📖 docs(form): 由于文案包含姓名等文字,导致小程序审核不通过 (#1609) @oasis-cloud -- 📖 docs: V1 升 V2 差异点更新 (#1607) @JQ - -# v2.0.23 - -`2023-11-03` - -- :sparkles: feat(image): ssr 适配 (#1579) @eiinu -- :sparkles: feat: 新增组件 calendar (#1565) @eiinu -- :bug: fix: calendar scrolltop bad (#1583) @xiaoyatong -- :bug: fix: noticebar 垂直滚动初始化时,无法及时展示元素信息 (#1576) @xiaoyatong -- :bug: fix: popup zindex at taro and picker adds popupProps (#1581) @xiaoyatong -- :bug: fix: popup zindex failed to set (#1578) @xiaoyatong -- :bug: fix: searchbar lose focus when input nothing but input the delete (#1577) @xiaoyatong -- :bug: fix: taro 编译 H5 出现滚动穿透 (#1537) @oasis-cloud - -# v2.0.22 - -`2023-10-27` - -- :sparkles: feat(NoticeBar): leftIcon 可自定义,并且支持设置 null 后不展示 icon (#1562) @oasis-cloud -- :bug: fix(Dialog): 点击蒙层无法关闭 (#1552) @oasis-cloud -- :bug: fix(Input): onChange 执行多次 (#1551) @oasis-cloud -- :bug: fix(Swipe): 禁止父元素滚动的 demo (#1560) @oasis-cloud -- :bug: fix: image height in taro (#1567) @xiaoyatong -- 🛠 refactor(Tabs): 滚动到可视区域代码优化,同时放开 tab title 的宽度限制 (#1563) @oasis-cloud - -# v2.0.21 - -`2023-10-18` - -- :sparkles: feat(Uploader): onFileItemClick 增加索引参数 (#1544) @oasis-cloud -- :sparkles: feat: add demo about infiniteloading (#1533) @xiaoyatong -- :bug: fix(menu): getBoundingClientRect 兼容 H5 (#1548) @oasis-cloud -- :bug: fix: form input blur (#1542) @oasis-cloud -- :bug: fix: imagepreview h5 (#1538) @xiaoyatong -- :bug: fix: jdapp picker's item-height doesn't match jdapp's default setting (#1545) @xiaoyatong -- :bug: fix: taro image and imagepreivew on h5 (#1532) @xiaoyatong -- :bug: fix: zindex of popover because popup changed its zindex (#1543) @xiaoyatong -- 📖 docs(tabbar): Correct module names of tabbar component (#1539) @HUMORCE - -# v2.0.20 - -`2023-10-13` - -- :sparkles: feat: add demo about infiniteloading (#1533) @xiaoyatong -- :bug: fix(form): 自定义校验 promise 返回错误不能被正确收集 (#1523) @samber -- :bug: fix(popup): popup zIndex 无效 (#1521) @Clay Zhang -- :bug: fix: demo format (#1530) @xiaoyatong -- :bug: fix: taro image and imagepreivew on h5 (#1532) @xiaoyatong -- :bug: fix: taro image default width and height (#1531) @xiaoyatong - -# v2.0.19 - -`2023-09-27` - -- :sparkles: feat(menu): overlay onclick 事件中调用 hideMenuItem 实现关闭 (#1505) @oasis-cloud -- :sparkles: feat(menu): onClose 事件增加触发来源参数 (#1502) @oasis-cloud -- :sparkles: feat(swiper): swiperItem 支持设置 className (#1504) @oasis-cloud -- :bug: fix(uploader): 受控模式调整,props 类型调整,回调参数修正 (#1500) @oasis-cloud -- :bug: fix: imagepreview with control (#1480) @xiaoyatong -- :bug: fix: indicator 超长换行 (#1486) @oasis-cloud -- :bug: fix: menu 在 lockscroll 的时候不需要加滚动事件 (#1509) @oasis-cloud -- :bug: fix: ios和android下点击button时出现半透明灰色遮罩 (#1495) @Kurisu - -# v2.0.18 - -`2023-09-20` - -- :sparkles: feat(menu): 增加受控和非受控的模式 (#1433) @oasis-cloud -- :sparkles: feat: menu 展开关闭事件增加参数 (#1447) @oasis-cloud -- :bug: fix(Badge): Badge位置值兼容两种类型,添加css变量min-width (#1410) @beginnerZhang -- :bug: fix(Notify): type NotifyType incorrectly spelling warning as waring (#1441) @Katz -- :bug: fix: calendar 在 iOS 中不展示开始和结束 (#1471) @oasis-cloud -- :bug: fix: swiperItem 的子元素在 H5 中设置 onClick 无效 (#1472) @oasis-cloud -- :bug: fix: uploader 列表类型内置上传按钮 (#1477) @oasis-cloud -- :bug: fix: uploader 缩略图圆角样式未生效 (#1476) @oasis-cloud -- :bug: fix: useFrom 类型优化 (#1473) @oasis-cloud -- :bug: fix: zIndex 层级统一调整 (#1460) @oasis-cloud -- :bug: fix: 组件依赖样式处理 (#1474) @xiaoyatong -- 📖 docs: form 组件文档格式化 (#1436) @oasis-cloud - -# v2.0.17 - -`2023-09-13` - -- :sparkles: feat: form 增加 validateTrigger 和 getFieldsValue (#1411) @oasis-cloud -- :bug: fix: add popupProps (#1426) @oasis-cloud -- :bug: fix: form label position left (#1412) @oasis-cloud -- :bug: fix: lint errors (#1406) @xiaoyatong -- :bug: fix: review package update (#1423) @xiaoyatong -- :bug: fix: swipe component fails to slide in Alipay (#1399) @oasis-cloud -- :bug: fix: table expose rowIndex (#1400) @oasis-cloud -- :bug: fix: toast组件 duration 设置无效 (#1424) @oasis-cloud -- 🔨 chore: glob & prettier update (#1427) @xiaoyatong -- 🔨 chore: swc 版本恢复 (#1425) @oasis-cloud - -# v2.0.16 - -`2023-09-06` - -- :sparkles: feat: form 支持分割线 (#1389) @oasis-cloud -- :bug: fix(pulltorefresh): 修复 H5 卡顿 & 小程序滑动距离问题 @eiinu -- :bug: fix: csstransition using findDOMNode which is deprecated (#1370) @oasis-cloud -- :bug: fix: dialog 的函数调用增加对 classname 和 style 的支持 (#1391) @oasis-cloud -- :bug: fix: swipe 阻止页面滚动 (#1380) @oasis-cloud -- :bug: fix: useForm 在类组件下报错,可以采用 ref 的方式使用 FormInstance (#1383) @oasis-cloud -- :bug: fix: 多个 Swipe 的滑动选项完全相等 (#1334) @Clay Zhang -- 📖 docs: toast组件完善了样式变量 (#1379) @ivan-My - -# v2.0.15 - -`2023-08-30` - -- :sparkles: feat: support next.js (#1326) @oasis-cloud -- :bug: fix: dialog content 失效 (#1323) @oasis-cloud -- :bug: fix: space 复制按钮重复 (#1322) @oasis-cloud -- 🔨 chore(tabs): 更新文档与 demo (#1339) @eiinu - -# v2.0.14 - -`2023-08-18` - -- :bug: fix: skeleton row 设置为 1 时, 宽度只能固定为70% (#1306) @ivan-My -- :bug: fix: loading 构建产物增加类型注释 (#1320) @oasis-cloud -- :bug: fix: space 构建产物增加类型注释 (#1321) @oasis-cloud -- 📖 docs: dialog 指令式用法注意事项 (#1318) @oasis-cloud - -# v2.0.13 - -`2023-08-16` - -- :sparkles: feat: dialog 支持函数调用 (#1315) @oasis-cloud -- :sparkles: feat: toast 支持函数调用 (#1307) @oasis-cloud -- :sparkles: feat: 提取 Taro 的 Demo 到 workspace (#1302) @oasis-cloud -- :bug: fix: icons 版本更新 (#1310) @oasis-cloud -- :bug: fix: 非 undefined 的 falsely 值无法传递给子组件 (#1312) @qnnp -- 📖 docs: 删除了skeleton文档中无用的props(width,height) (#1303) @ivan-My - -# v2.0.12 - -`2023-08-11` - -- :bug: fix(Avatar): 解决在小程序环境下,使用Avatar.Group无法正常展示头像问题 (#1296) @Tralafalgar Wang -- :bug: fix: overlay 的 zIndex 属性改为 css 变量 (#1294) @oasis-cloud -- :bug: fix: 修复 form 设置 labelPosition=top 的样式 (#1300) @oasis-cloud - -# v2.0.11 - -`2023-08-09` - -- :sparkles: feat: 新增 tour 引导组件 (#1279) @junjun666 -- :bug: fix: h5下多选上传时 uid 重复的问题 (#1269) @Liuqh233 -- :bug: fix: input 组件点击清除图标无法清空内容 (#1292) @oasis-cloud -- :bug: fix: numberkeyboard 设置标题后,完成按钮应该触发 onConfirm 事件 (#1285) @oasis-cloud -- :bug: fix: uploader h5/taro 增加校验 (#1297) @junjun666 -- :bug: fix: uploader taro-h5 上传状态样式错乱 (#1293) @junjun666 -- 📖 docs: divider 组件的 styles 属性示例改为 style (#1290) @oasis-cloud -- 📖 docs: numberkeyboard 的 type 属性类型更新 (#1284) @oasis-cloud -- 📖 docs: step 组件的 description 属性示例改为节点的实现方式 (#1289) @oasis-cloud -- 📖 docs: 调整 image tao 文档中引入包名 (#1295) @oasis-cloud - -# v2.0.10 - -`2023-08-04` - -- :sparkles: feat: loading 组件 (#1204) @mike8625 -- :sparkles: feat: 日历支持footer的children定义,增加日历+datepicker的demo (#1277) @xiaoyatong -- :bug: fix: elevator 计算索引出现 -1,导致组件运行报错 (#1276) @oasis-cloud -- :bug: fix: loading 组件导出 props 类型 (#1278) @oasis-cloud - -# v2.0.9 - -`2023-08-02` - -- :sparkles: feat(notify): 支持函数调用的展开和关闭 (#1271) @oasis-cloud -- :bug: fix: space 版本号修改为 2.0 (#1265) @oasis-cloud -- 🔨 chore(config): 优化 taro demo 环境配置文件 (#1266) @oasis-cloud -- 📖 docs: cascader 文档更新 (#1270) @vapao -- 📖 docs: tag 文档和 demo 同步 (#1275) @oasis-cloud -- 📖 docs: 升级文档更新 (#1274) @oasis-cloud - -# v2.0.8 - -`2023-07-28` - -- :sparkles: feat: 增加了space组件 (#1259) @ivan-My -- 🛠 refactor: tabs 去除 console (#1261) @vapao -- 🔨 chore(script): 简化开发环境启动逻辑 (#1264) @eiinu - -# v2.0.7 - -`2023-07-26` - -- :sparkles: feat: formitem label 支持 reactnode (#1254) @oasis-cloud -- :sparkles: feat: uploader 添加上传的响应数据 (#1251) @逍遥 -- 🔨 chore: 优化 any 类型 (#1222) @junjun666 -- 📖 docs(SearchBar): 补充 onClear 属性说明 (#1256) @Tralafalgar Wang - -# v2.0.6 - -`2023-07-21` - -- :bug: fix(Address): 修复Address组件通过点击CloseIcon和Overlay关闭后,无法再次打开的问题 (#1233) @Tralafalgar Wang -- :bug: fix(button): 渐变色导致边框出现重叠 (#1250) @oasis-cloud - -# v2.0.5 - -`2023-07-19` - -- :bug: fix(sticky): 组件卸载移除 tap 事件改为移除 scroll 事件 (#1235) @oasis-cloud -- :bug: fix: height is null (#1239) @Liuqh233 -- :bug: fix: 修复popover滑动定位错位的问题 (#1232) @junjun666 -- :sparkles: perf: configProvider 组件性能优化 (#1230) @大喵 -- 🔨 chore: site 内部移除 taro components @oasis-cloud - -# v2.0.4 - -`2023-07-14` - -- :sparkles: feat: configprovider 组件支持传入 className 和 style 属性 (#1219) @大喵 -- :bug: fix(button): fill=none & type=default 样式修复 (#1215) @eiinu -- :bug: fix(form): formItem 的 props 改为 Partial (#1221) @oasis-cloud -- :bug: fix: cascader onChange 触发2次问题修复 (#1224) @xiaoyatong -- :bug: fix: countdown手动控制demo展示样式优化 (#1229) @irisSong -- :bug: fix: signature组件提取样式变量+修复taro h5 demo签字时滚动问题 (#1220) @irisSong -- :bug: fix: tabs组件在抖音小程序展示异常 (#1211) @oasis-cloud -- :bug: fix: 修复signature小程序下demo签字时页面跟随滚动问题 (#1225) @irisSong -- :bug: fix: 文档格式化 @hanyuxinting - -# v2.0.3 - -`2023-07-12` - -- :sparkles: feat: image 支持 taro (#1190) @oasis-cloud -- :sparkles: feat: menu 增加打开和关闭的回调方法 (#1206) @oasis-cloud -- :sparkles: feat: 类型文件中导出组件的 props, 简化组件 props 引入方式 (#1205) @oasis-cloud -- :bug: fix: infiniteloading taro doc (#1207) @junjun666 -- :bug: fix: 组件2.0走查问题修复 (#1172) @junjun666 -- 🔨 chore: pnpm workspace (#1199) @junjun666 -- 🔨 chore: 兼容ssr之修复引入组件库启动报错 (#1212) @junjun666 -- 📖 docs(form): nativeType 改为 formType (#1209) @oasis-cloud - -# v2.0.2 - -`2023-07-07` - -- :sparkles: feat: 日历增加不可选状态、增加style、className 的透传 (#1193) @xiaoyatong -- :bug: fix: animatingNumber组件暗黑模式适配+demo优化 (#1184) @irisSong -- :bug: fix: circleprogress color 属性的类型优化 (#1191) @junjun666 -- 🔨 chore(backtop): 优化 demo 和文档 (#1186) @eiinu -- 🔨 chore(deps): add @nutui/touch-emulator (#1196) @eiinu -- 🔨 chore(progress): update demo (#1192) @eiinu -- 🔨 chore: overlay 动效优化 (#1183) @junjun666 - -# v2.0.1 - -`2023-07-05` - -- :sparkles: feat: tag 新增 info 类型 (#1180) @xiaoyatong -- :bug: fix(searchbar): 修复 Taro-H5 下 onSearch 无法触发的问题 (#1178) @eiinu -- :bug: fix: button 组件在 taro h5 中不设置 opentype (#1167) @oasis-cloud -- :bug: fix: datepicker 修改列数据后,更新下一级数据 (#1179) @xiaoyatong -- :bug: fix: demo 中 input 布局换行 (#1170) @oasis-cloud -- :bug: fix: demo 中 tabs 采用独立状态 (#1169) @oasis-cloud -- :bug: fix: eslint 错误修复 (#1175) @oasis-cloud -- :bug: fix: form 在处理组件受控和非受控的时候存在冲突 (#1166) @oasis-cloud -- :bug: fix: 关闭主题定制入口 (#1171) @oasis-cloud -- :bug: fix: 调整 demo 中 image 组件的间距 (#1168) @oasis-cloud -- 📖 docs: swiper 文档中的 autoplay 描述修复 (#1165) @oasis-cloud -- 📖 docs: update doc link (#1176) @eiinu - -# v2.0.0-beta.3 - -`2023-06-30` - -- 🔨 chore: 增加组件名称调整的内容 (#1161) @oasis-cloud -- 📖 docs: 统一升级文档中的修改的描述术语 (#1159) @xiaoyatong -- :bug: fix: 修改migrate文档 (#1164) @junjun666 -- :bug: fix: 单元测试问题修复 (#1158) @eiinu -- 🛠 refactor: 调整 MenuItem CellGroup SwiperItem 使用方式为 Menu.Item Cell.Group… (#1160) @oasis-cloud - -# v2.0.0-beta.2 - -`2023-06-28` - -- :sparkles: feat: 日历组件新增选择周 type='week' 模式 (#1152) @xiaoyatong -- :bug: fix: dialog spelling mistake (#1148) @Katz -- :bug: fix: fit&wxwork (#1146) @junjun666 -- :bug: fix: 优化 TrendArrow 组件 props (#1150) @irisSong -- :bug: fix: 修改navbar组件demo样式 (#1145) @irisSong -- 🛠 refactor: 属性定义走查修复 (#1149) @xiaoyatong -- 🔨 chore(virtuallist): 调整 itemRender (#1151) @eiinu - -# v2.0.0-beta.1 - -`2023-06-21` - -- :bug: fix(collapse): 测试问题修复 (#1132) @eiinu -- :bug: fix: address taro 白屏 (#1140) @xiaoyatong -- :bug: fix: popup title (#1143) @xiaoyatong -- :bug: fix: remove bem (#1138) @oasis-cloud -- :bug: fix: 修复toast组件屏幕锁定不能滚动的问题 (#1134) @junjun666 -- :bug: fix: 单元测试问题修复 (#1137) @eiinu -- 🛠 refactor: address (#1104) @xiaoyatong -- 🛠 refactor: calendar (#1087) @xiaoyatong -- 🔨 chore(ci): delete sync-gitcode.yml @eiinu -- 🔨 chore: popover review (#1127) @junjun666 -- 🔨 chore: 更新 taro 版本到 3.6.8 @oasis-cloud -- 🔨 chore: 移除 @bem-react/classname (#1142) @oasis-cloud - -# v2.0.0-alpha.18 - -`2023-06-16` - -- 🔨 chore(tabbar): 调整 Badge 相关 Props (#1126) @eiinu -- 📖 docs: update migrate-from-v1.md (#1131) @eiinu -- :sparkles: feat: 修改升级文档 (#1125) @oasis-cloud -- :bug: fix: button 组件在 taro h5 中的类型优化 (#1133) @oasis-cloud -- :bug: fix: uploader 英文文档修改 (#1124) @oasis-cloud -- :bug: fix: 修复inputnumber在taro H5样式失效的问题 (#1130) @junjun666 -- :bug: fix: 完善migrate-from-v1文档 (#1129) @irisSong - -# v2.0.0-alpha.17 - -`2023-06-14` - -- :bug: fix: searchbar shape=round 效果差的问题 (#1109) @xiaoyatong -- :bug: fix: swipe 类型和文档优化 (#1122) @oasis-cloud -- 🛠 refactor: form (#1118) @oasis-cloud -- 📖 docs: 修改布局文档相关 @hanyuxinting -- 📖 docs: 文档走查及问题修复 (#1123) @xiaoyatong -- 📖 docs: 文档走查及问题修复-基础&布局组件(#1117) @eiinu -- 📖 docs: 文档走查及问题修复-导航组件 (#1119) @xiaoyatong - -# v2.0.0-alpha.16 - -`2023-06-09` - -- :bug: fix(toast): 修复连续调用 show 方法时无法销毁的问题 (#1102) @eiinu -- :bug: fix: dialog 需要增加 overlay 的样式,否则按需加载样式出现异常 (#1103) @oasis-cloud -- :bug: fix: menu 组件被使用 transform 的组件嵌套后,遮罩层发生偏移 (#1093) @oasis-cloud -- :bug: fix: noticebar 修复小程序多行展示问题 (#1107) @xiaoyatong -- :bug: fix: pikcer 在关闭动画未结束时修改 visible,导致状态更新异常 (#1097) @oasis-cloud -- 🛠 refactor: datepicker (#1091) @xiaoyatong -- 🔨 chore: 修复 Taro Demo 的字号 (#1105) @oasis-cloud -- 🔨 chore(script): 生成 Props 功能增强 (#1096) @eiinu -- 📖 docs: 文档修订 (#1106) @xiaoyatong - -# v2.0.0-alpha.15 - -`2023-06-07` - -- :sparkles: feat(ci): add codecov (#1092) @eiinu -- :sparkles: feat(ci): add lint action (#1098) @eiinu -- :sparkles: feat: imagepreview 组件在小程序中支持长按图片保存 (#1090) @oasis-cloud -- :bug: fix: 单元测试问题修复 (#1095) @eiinu -- 🛠 refactor: card (#1069) @拧巴的猫 -- 🛠 refactor: infiniteloading (#1085) @junjun666 -- 🛠 refactor: signature (#1080) @拧巴的猫 -- 🛠 refactor: tag (#1089) @xiaoyatong -- 🛠 refactor: TimeSelect (#1088) @eiinu - -# v2.0.0-alpha.14 - -`2023-06-02` - -- 🛠 refactor: barrage (#1072) @junjun666 -- 🛠 refactor: popover (#1060) @junjun666 -- 🛠 refactor: sidenavbar (#1057) @oasis-cloud -- :bug: fix(backtop): 修改 demo (#1083) @eiinu -- :bug: fix: ellipsis 在 taro 构建的 H5 中偶现无法暂时省略号的情况 (#1076) @oasis-cloud -- :bug: fix: input 组件忽略 maxlength 和 password 属性 (#1079) @oasis-cloud -- :bug: fix: menu 的 closeOnClickOverlay 改为 closeOnOverlayClick (#1084) @oasis-cloud -- :bug: fix: picker 组件渲染的时候触发 onConfirm (#1082) @oasis-cloud -- 📖 docs(textarea): 更新文档说明 (#1086) @eiinu -- 📖 docs: checkbox demo 增加头部 (#1075) @oasis-cloud -- 📖 docs: 文档中 css 变量表格的文案优化 (#1077) @oasis-cloud - -# v2.0.0-alpha.13 - -`2023-05-31` - -- 🛠 refactor: animatingNumbers (#1048) @拧巴的猫 -- 🛠 refactor: trendArrow (#1066) @拧巴的猫 -- 🛠 refactor: video (#1034) @junjun666 -- 🛠 refactor: watermark (#1071) @eiinu -- :sparkles: feat: 构建类型文件中的注释,方便在编辑器中查看属性的说明 (#1068) @oasis-cloud -- :bug: fix: popup 在 taro 中的动效优化 (#1065) @oasis-cloud -- :bug: fix: 修改 uploader 和 video 的 taro 文档 (#1070) @junjun666 -- 📖 docs: correct spelling errors (#1058) @konka - -# v2.0.0-alpha.12 - -`2023-05-26` - -- 🛠 refactor: actionSheet (#1053) @xiaoyatong -- 🛠 refactor: countdown (#1040) @拧巴的猫 -- 🛠 refactor: searchBar (#1047) @xiaoyatong -- 🛠 refactor: shortPassword (#1046) @eiinu -- 🛠 refactor: toast (#1026) @justExplore -- 🛠 refactor: virtualList (#1056) @eiinu -- :sparkles: feat: ellipsis add width attribute (#1038) @Zhu Da Shuai -- :sparkles: feat: 导出主题中的 CSS 变量类型 (#1050) @oasis-cloud -- 📖 docs: import touch-emulator (#1045) @oasis-cloud - -# v2.0.0-alpha.11 - -`2023-05-24` - -- 🛠 refactor: collapse (#1027) @eiinu -- 🛠 refactor: Skeleton (#1036) @eiinu -- :sparkles: feat: 添加土耳其语 (#1028) @manin -- :bug: fix(fixednav): 修改 onSelect 参数顺序 (#1035) @eiinu -- :bug: fix: 修复taro下拉刷新组件偶发未触发canRelease状态时松手,组件不会自动回弹的问题 (#1029) @Z-Bokle -- 🔨 chore: 增加同步升级文档到 docs 仓库的脚本 (#1044) @oasis-cloud -- 🔨 chore: 完善组件导出的类型 (#1039) @oasis-cloud -- 🔨 chore: 构建每个组件的 css 文件 (#1037) @oasis-cloud -- 📖 docs: 文档 props 标题统一修复 (#1041) @oasis-cloud - -# v2.0.0-alpha.10 - -`2023-05-19` - -- :sparkles: feat(progress): 添加 lazy、delay 属性 (#1023) @eiinu -- :bug: fix: swiper loop 模式位置计算错误 (#1018) @oasis-cloud -- 🛠 refactor: imagepreview (#1019) @xiaoyatong -- 🛠 refactor: noticebar (#1024) @xiaoyatong -- 🛠 refactor: steps (#1021) @oasis-cloud -- 📖 docs: icon 文档修订 (#1022) @oasis-cloud - -# v2.0.0-alpha.9 - -`2023-05-17` - -- :sparkles: feat: add create-properties.js (#1001) @eiinu -- :sparkles: feat: cascader支持受控 (#1000) @xiaoyatong -- :sparkles: feat: elevator 支持右侧索引是否展示 (#1006) @拧巴的猫 -- :bug: fix(image): lazy 优化观察对象数量 (#1015) @eiinu -- :bug: fix: tabs children 变更后需要展示新的 title (#999) @oasis-cloud -- :bug: fix: 格式化,删掉某些无用代码 (#1014) @xiaoyatong -- 🛠 refactor: notify (#983) @拧巴的猫 -- 🛠 refactor: NumberKeyboard (#1012) @eiinu -- 🛠 refactor: price (#989) @拧巴的猫 -- 🛠 refactor: pulltorefresh (#1011) @oasis-cloud -- 🛠 refactor: radio (#1009) @oasis-cloud -- 🛠 refactor: Range (#991) @eiinu -- 🛠 refactor: swiper 重构;indcator 的索引计算改为从 0 开始 (#1008) @oasis-cloud -- 🔨 chore: autoplay -> autoPlay (#1007) @eiinu -- 📖 docs(tabbar): update description (#1004) @eiinu - -# v2.0.0-alpha.8 - -`2023-05-12` - -- :sparkles:feat: cascader支持受控 (#1000) @xiaoyatong -- :bug: fix: tabs children 变更后需要展示新的 title (#999) @oasis-cloud -- 🛠 refactor: Range (#991) @eiinu - -# v2.0.0-alpha.7 - -`2023-05-12` - -- :bug: fix: tabs children 变化需要更新选中状态 @oasis-cloud - -# v2.0.0-alpha.6 - -`2023-05-12` - -- 🛠 refactor: cascader (#993) @xiaoyatong -- 🛠 refactor: picker (#975) @xiaoyatong -- 🛠 refactor: table (#982) @xiaoyatong -- 🛠 refactor: TextArea (#979) @eiinu -- :bug: fix: image src 初始状态未空,导致出发加载失败事件 (#988) @oasis-cloud -- 📖 docs(progress): demo 代码更新 (#986) @eiinu -- 📖 docs(progress): update demo (#987) @eiinu -- 📖 docs: tabs 文档中的 titleNode 修改为 title (#995) @oasis-cloud -- 🔨 chore: taro es 构建移入 vite 配置文件 (#990) @oasis-cloud - -# v2.0.0-alpha.5 - -`2023-05-10` - -- 🛠 refactor: checkbox (#974) @oasis-cloud -- 🛠 refactor: circleprogress-v2.0 (#949) @junjun666 -- 🛠 refactor: ellipsis-v2.0 (#963) @junjun666 -- 🛠 refactor: empty-v2.0 (#977) @junjun666 -- 🛠 refactor: swipe (#958) @justExplore -- 🛠 refactor:avatar-v2.0 (#970) @junjun666 -- 📖 docs: 增加 icon 的复制功能 (#973) @oasis-cloud -- :sparkles: feat: cellgroup组件增加单元格之间是否展示分割线props (#961) @拧巴的猫 -- :bug: fix: tabbar 通过 Tabbar.Item 方式使用未加载 item 的样式 (#972) @oasis-cloud -- :bug: fix: 修复elevator小程序快速滑动后闪动问题 (#984) @拧巴的猫 - -# v2.0.0-alpha.4 - -`2023-05-05` - -- 🛠 refactor: circleprogress-v2.0 (#949) @junjun666 -- 🛠 refactor: input (#962) @oasis-cloud -- 🛠 refactor: Tabbar (#935) @eiinu -- :bug: fix: badge 组件的默认样式中,去掉 margin-right (#967) @xiaoyatong -- 🎨 style: fix endLine display error (#964) @HaiTao - -# v2.0.0-alpha.3 - -`2023-04-28` - -- :bug: fix: overlay 属性 onClick 暴露、lockscroll 相关demo 修订 (#959) @xiaoyatong -- :bug: fix: 修改taro增加主题编译 (#950) @junjun666 -- 🛠 refactor: dialog (#945) @xiaoyatong -- 🛠 refactor: switch (#941) @拧巴的猫 -- 🛠 refactor: tabs (#939) @oasis-cloud -- 🔨 chore: website 2.0 (#955) @oasis-cloud -- 📖 docs: button 文档表格优化 (#956) @oasis-cloud - -# v2.0.0-alpha.2 - -`2023-04-26` - -- 🛠 refactor: navbar (#890) @拧巴的猫 -- 🛠 refactor: animate (#940) @junjun666 -- 🛠 refactor: badge (#936) @xiaoyatong -- 🛠 refactor: drag (#937) @拧巴的猫 -- 🛠 refactor: elevator (#927) @拧巴的猫 -- 🛠 refactor: menu (#923) @oasis-cloud -- 🛠 refactor: progress (#943) @eiinu -- 🔨 chore: sync pnpm-lock @oasis-cloud -- :bug: fix: 修改taro增加主题编译 (#950) @junjun666 - -# v2.0.0-alpha.1 - -`2023-04-21` - -- 🔨 chore: markdown 中 props、css variables 类型和默认值增加代码标识 @oasis-cloud -- 🛠 refactor: Audio (#930) @eiinu -- 🛠 refactor: layout (#934) @oasis-cloud -- 🛠 refactor: popup 2.0 (#929) @xiaoyatong -- 🛠 refactor: uploader (#902) @junjun666 - -# v2.0.0-alpha.0 - -`2023-04-20` - -- 🛠 refactor: backtop (#912) @eiinu -- 🛠 refactor: button (#904) @oasis-cloud -- 🛠 refactor: cell (#876) @拧巴的猫 -- 🛠 refactor: divider (#891) @junjun666 -- 🛠 refactor: fixednav (#865) @eiinu -- 🛠 refactor: grid (#882) @eiinu -- 🛠 refactor: image (#892) @oasis-cloud -- 🛠 refactor: indicator (#893) @xiaoyatong -- 🛠 refactor: inputnumber (#888) @junjun666 -- 🛠 refactor: overlay (#886) @junjun666 -- 🛠 refactor: pagination (#861) @eiinu -- 🛠 refactor: Rate (#894) @eiinu -- 🛠 refactor: sticky (#906) @oasis-cloud +# v3.0.0 + +`2025-02-28` + +### 1. **Fix (修复问题)** + +- `fix(swiper): 设置横向轮播后,手势无法触发页面的滚动 (#3004)` +- `fix(form): replace with Taro Form and add the rest property for passt… (#3016)` +- `fix: check harmony adaptions (#3005)` +- `fix: badge harmony (#3001)` +- `fix: jdharmonycpp version and dd attribute are updated (#2997)` +- `fix: throw error should not block the export of component (#2996)` +- `fix: remove demo conditional restrictions & update the creation process (#2991)` +- `fix: receiving a 404 error when publishing npm in CI (#2994)` +- `fix: adjust pr-label strategy (#2984)` +- `fix: github actions permission (#2981)` +- `fix: resolve 'Resource not accessible by integration' (#2980)` +- `fix: add PR review labels automation (#2972)` +- `fix: calender footer button css (#2971)` +- `fix: corepack manager use pnpm failed (#2965)` +- `fix: update variables` +- `fix: update the v15 style (#2843)` +- `fix: modifykey` +- `fix(elevator): harmony适配 (#2836)` +- `fix: popover dark and maxwidth` +- `fix: aimate不再设置inline-block` +- `fix(countup): 分隔符文字颜色支持css变量修改 (#2871)` +- `fix: jd white screen (#2824)` +- `fix: space harmony (#2817)` +- `fix(empty): correct css and docs (#2819)` +- `fix: change scss import path (#2812)` +- `fix(timeselect): harmony适配 (#2806)` +- `fix(Ellipsis): Correction of text (#2778)` +- `fix(progress): fix style & support icon demo (#2729)` +- `fix(pagination): color of icon (#2769)` +- `fix(toast): svg color (#2775)` +- `fix: loading (#2733)` +- `fix: radio type (#2735)` +- `fix(searchbar): 多端适配 (#2657)` +- `fix: vite5 relative warnings and deprecated usage (#2704)` +- `fix(inputnumber): icon 适配 && 修改icon宽度和设定的--nut-icon-width一致 (#2707)` +- `fix(cell): update Icon (#2716)` +- `fix: 恢复icon,简化demo (#2725)` + +### 2. **Refactor (代码重构)** + +- `refactor: datepicker (#3023)` +- `refactor: picker (#2990)` +- `refactor: popup 优化代码 (#2944)` +- `refactor: new components are generated automatically (#2940)` +- `refactor: remove special handling for rntaro's environment configuration and component (#2934)` +- `refactor: site running faster when it's development (#2926)` +- `refactor: replace lodash.isEqual with react-fast-compare (#2925)` +- `refactor: add global scss (#2798)` +- `refactor: use compatible systemInfo util API (#2975)` +- `refactor: fixed overlay zIndex is not effective, and extract types of compnoents (#2954)` +- `refactor: popup 优化代码 (#2944)` +- `refactor: tabs 适配鸿蒙 (#2820)` +- `refactor: modify import mode (#2782)` +- `refactor: modify ts (#2781)` +- `refactor: add global scss (#2798)` +- `refactor: fix icon svg (#2742)` +- `refactor: backtop using hoverbutton and v15 adaption (#2866)` + +### 3. **Feat (新增功能)** + +- `feat: pickerview 组件 (#2986)` +- `feat: icons 的替换方案优化,支持无法可用 icon 映射的情况 (#2922)` +- `feat: sidebar 组件 (#2868)` +- `feat: lottie 组件 (#2867)` +- `feat(price): v15 (#2885)` +- `feat(indicator): v15 (#2746)` +- `feat(input): v15 (#2889)` +- `feat(textarea): v15 (#2887)` +- `feat(navbar): v15 (#2881)` +- `feat(infinite): v15 (#2841)` +- `feat(backtop): v15 (#2866)` +- `feat(badge): v15 (#2826)` +- `feat(numberkeyboard): v15 (#2799)` +- `feat(inputNumber): v15 (#2823)` +- `feat(tabs): v15 (#2820)` +- `feat(checkbox): v15 (#2730)` +- `feat(button): v15 (#2737)` +- `feat(calendarcard): v15 (#2732)` +- `feat(radio): v15 (#2721)` +- `feat(input): v15 (#2711)` +- `feat(pagination): v15 (#2712)` +- `feat(trendarrow): v15 (#2540)` +- `feat(Toast): v15 (#2299)` + +### 4. **Perf (性能优化)** + +- `perf: input (#2978)` +- `perf: 优化渲染节点 (#2967)` +- `perf: 优化 animate (#2968)` + +# v2.x + +去 [GitHub](https://github.com/jdf2e/nutui-react/blob/2.x-stable/CHANGELOG.md) 查看 `1.x` 的 Change Log。 # v1.x diff --git a/package.json b/package.json index 859ff07447..26d7f71d2a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@nutui/nutui-react-taro", - "version": "3.0.0-beta.15", + "version": "3.0.0", "style": "dist/style.css", "main": "dist/nutui.react.umd.js", "module": "dist/es/packages/nutui.react.build.js", diff --git a/scripts/build-taro.mjs b/scripts/build-taro.mjs index 0168f28335..c0e84ce542 100644 --- a/scripts/build-taro.mjs +++ b/scripts/build-taro.mjs @@ -12,7 +12,7 @@ import { access, mkdir, readFile, writeFile } from 'fs/promises' import { basename, dirname, extname, join, relative, resolve } from 'path' import j from 'jscodeshift' import { readFileSync } from 'fs' -import { relativeFilePath } from './relative-path.mjs' +import { relativePath } from './relative-path.mjs' import { codeShift } from './build-comments-to-dts.mjs' import { generate } from './build-theme-typings.mjs' @@ -59,7 +59,7 @@ const transform = (file, api, replace) => { return } const dir = join(__dirname, alias.replace('@/', '../src/')) - path.node.source.value = relativeFilePath(file.path, dir)?.replace( + path.node.source.value = relativePath(dir, file.path)?.replace( '.taro', '', ) @@ -242,7 +242,7 @@ async function buildAllCSS() { const scssFiles = await glob([`${dist}/es/packages/**/*.scss`]) scssFiles.forEach((file) => { content.push( - `@import '${relativeFilePath(`/${dist}/style.scss`, '/' + file)}';`, + `@import '${relativePath('/' + file, `/${dist}/style.scss`)}';`, ) }) dest(`${dist}/style.scss`, content.join('\n')) diff --git a/scripts/build.mjs b/scripts/build.mjs index 9e31e2aa2f..5b7c6928cb 100644 --- a/scripts/build.mjs +++ b/scripts/build.mjs @@ -12,7 +12,7 @@ import { access, mkdir, readFile, writeFile } from 'fs/promises' import { basename, dirname, extname, join, relative, resolve } from 'path' import j from 'jscodeshift' import { readFileSync } from 'fs' -import { relativeFilePath } from './relative-path.mjs' +import { relativePath } from './relative-path.mjs' import { codeShift } from './build-comments-to-dts.mjs' import { generate } from './build-theme-typings.mjs' @@ -120,7 +120,7 @@ async function buildDeclaration() { : '' if (!importAlias) return const dir = join(__dirname, importAlias.replace('@/', '../src/')) - path.node.source.value = relativeFilePath(file.path, dir) + path.node.source.value = relativePath(dir, file.path) }) .toSource() } @@ -190,7 +190,7 @@ async function buildAllCSS() { const scssFiles = await glob([`${dist}/es/packages/**/*.scss`]) scssFiles.forEach((file) => { content.push( - `@import '${relativeFilePath(`/${dist}/style.scss`, '/' + file)}';`, + `@import '${relativePath('/' + file, `/${dist}/style.scss`)}';`, ) }) dest(`${dist}/style.scss`, content.join('\n')) diff --git a/scripts/relative-path.mjs b/scripts/relative-path.mjs index 7a90a20c33..9d35833c89 100644 --- a/scripts/relative-path.mjs +++ b/scripts/relative-path.mjs @@ -1,33 +1,21 @@ -import * as path from 'path' +import { resolve } from 'path' -export function relativeFilePath(from, to) { - if ( - (from[0] === path.sep && to[0] !== path.sep) || - (from[0] !== path.sep && to[0] === path.sep) - ) { - return '' - } - - if (from[from.length - 1] === path.sep || to[to.length - 1] === path.sep) { - return '' - } +export function relativePath(target, source) { + const resolveSource = resolve(source) + const resolveTarget = resolve(target) - const fromPath = from.split(path.sep) - const toPath = to.split(path.sep) - - let i = 0 - while (i < fromPath.length - 1) { - if (toPath[i] === undefined || fromPath[i] !== toPath[i]) { - break - } - ++i + let str = resolveTarget.substr(0, resolve(resolveTarget).lastIndexOf('/')) + while (resolveSource.indexOf(str) == -1) { + str = str.substr(0, str.lastIndexOf('/')) } - const val = toPath.slice(i).join(path.sep) - - if (i === fromPath.length - 1) { - return '.' + path.sep + val + const remain = resolveSource.replace(str+'/', '') + const matchedSlash = remain.match(/\//g) + let res = '' + if (!matchedSlash) { + res = resolveTarget.replace(str+'/', './') + } else { + res = resolveTarget.replace(str+'/', '../'.repeat(matchedSlash.length)) } - - return `..${path.sep}`.repeat(fromPath.length - 1 - i) + val -} + return res +} \ No newline at end of file diff --git a/src/packages/configprovider/types.ts b/src/packages/configprovider/types.ts index 5ba2151ea5..7bb03ddf50 100644 --- a/src/packages/configprovider/types.ts +++ b/src/packages/configprovider/types.ts @@ -199,6 +199,7 @@ export type NutCSSVariables = | 'nutuiInputBorderBottomWidth' | 'nutuiInputDisabledColor' | 'nutuiInputFontSize' + | 'nutuiInputLineheight' | 'nutuiInputBorderRadius' | 'nutuiInputColor' | 'nutuiInputBackgroundColor' From 827ab5c2b247169d7303b08706e2f124b01b2a1b Mon Sep 17 00:00:00 2001 From: xiaoyatong <84436086+xiaoyatong@users.noreply.github.com> Date: Tue, 4 Mar 2025 09:41:24 +0800 Subject: [PATCH 21/26] =?UTF-8?q?fix:=20textarea=20=E9=B8=BF=E8=92=99?= =?UTF-8?q?=E9=80=82=E9=85=8D=20(#3037)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/packages/textarea/demo.taro.tsx | 2 +- src/packages/textarea/demos/h5/demo1.tsx | 4 ++-- src/packages/textarea/demos/h5/demo2.tsx | 4 ++-- src/packages/textarea/demos/h5/demo3.tsx | 4 ++-- src/packages/textarea/demos/h5/demo4.tsx | 4 ++-- src/packages/textarea/demos/h5/demo5.tsx | 4 ++-- src/packages/textarea/demos/h5/demo6.tsx | 10 +++------- src/packages/textarea/demos/h5/demo7.tsx | 18 ++++++++---------- src/packages/textarea/demos/h5/demo8.tsx | 4 ++-- src/packages/textarea/demos/h5/demo9.tsx | 4 ++-- src/packages/textarea/demos/taro/demo1.tsx | 4 ++-- src/packages/textarea/demos/taro/demo2.tsx | 4 ++-- src/packages/textarea/demos/taro/demo3.tsx | 4 ++-- src/packages/textarea/demos/taro/demo4.tsx | 4 ++-- src/packages/textarea/demos/taro/demo5.tsx | 4 ++-- src/packages/textarea/demos/taro/demo6.tsx | 10 +++------- src/packages/textarea/demos/taro/demo7.tsx | 18 ++++++++---------- src/packages/textarea/demos/taro/demo8.tsx | 4 ++-- src/packages/textarea/demos/taro/demo9.tsx | 4 ++-- src/packages/textarea/textarea.taro.tsx | 5 ++--- 20 files changed, 53 insertions(+), 66 deletions(-) diff --git a/src/packages/textarea/demo.taro.tsx b/src/packages/textarea/demo.taro.tsx index 5d4a9027a5..32f0e0c096 100644 --- a/src/packages/textarea/demo.taro.tsx +++ b/src/packages/textarea/demo.taro.tsx @@ -94,7 +94,7 @@ const TextAreaDemo = () => { {translated.textAlign} -

{translated.error}

+ {translated.error} diff --git a/src/packages/textarea/demos/h5/demo1.tsx b/src/packages/textarea/demos/h5/demo1.tsx index 3e32704ca2..81789ed6a9 100644 --- a/src/packages/textarea/demos/h5/demo1.tsx +++ b/src/packages/textarea/demos/h5/demo1.tsx @@ -1,7 +1,7 @@ import React from 'react' import { Space, TextArea } from '@nutui/nutui-react' -const Demo1 = () => { +const Demo = () => { return (