Repository: ant-design/ant-design-mobile
Pull request #5933 (2023-01-12 06:36:41)

chore: feature merge master


Patch:
diff --git a/.github/workflows/pr-check-ci.yml b/.github/workflows/pr-check-ci.yml
index 2dc133c0d..4b7f498d8 100644
--- a/.github/workflows/pr-check-ci.yml
+++ b/.github/workflows/pr-check-ci.yml
@@ -17,7 +17,7 @@ jobs:
       pull-requests: write # for actions-cool/check-pr-ci to update PRs
     runs-on: ubuntu-latest
     steps:
-      - uses: actions-cool/check-pr-ci@v1
+      - uses: actions-cool/check-pr-ci@v1.4.0
         with:
           filter-label: 'BranchAutoMerge'
           filter-creator-authority: 'write'
diff --git a/README.md b/README.md
index 091e2ee9b..7574ef118 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,7 @@
     Essential UI blocks for building mobile web apps. 
   </p>
 
-[![npm (tag)](https://img.shields.io/npm/v/antd-mobile)](https://www.npmjs.com/package/antd-mobile) [![GitHub Release Date](https://img.shields.io/github/release-date/ant-design/ant-design-mobile)](https://github.com/ant-design/ant-design-mobile/releases) [![npm](https://img.shields.io/npm/dw/antd-mobile)](https://www.npmjs.com/package/antd-mobile) [![npm](https://img.shields.io/npm/dw/antd-mobile-v5-count?label=downloads%285.x%29)](https://www.npmjs.com/package/antd-mobile) [![jsdelivr](https://img.shields.io/jsdelivr/npm/hm/antd-mobile)](https://www.jsdelivr.com/package/npm/antd-mobile) [![gzip size](https://img.badgesize.io/https:/unpkg.com/antd-mobile/umd/antd-mobile.js?label=gzip%20size&compression=gzip)](https://unpkg.com/browse/antd-mobile@5/umd/antd-mobile.js) [![Commit Activity](https://img.shields.io/github/commit-activity/m/ant-design/ant-design-mobile/master)](https://github.com/ant-design/ant-design-mobile/graphs/contributors) [![Issues help wanted](https://img.shields.io/github/issues-raw/ant-design/ant-design-mobile/help%20wanted?label=help%20wanted)](https://github.com/ant-design/ant-design-mobile/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) ![GitHub Workflow Status (branch)](https://img.shields.io/github/workflow/status/ant-design/ant-design-mobile/Check/v5) [![codecov](https://img.shields.io/codecov/c/gh/ant-design/ant-design-mobile?token=2kJyJBg1nK)](https://codecov.io/gh/ant-design/ant-design-mobile) [![GitHub](https://img.shields.io/github/license/ant-design/ant-design-mobile)](https://github.com/ant-design/ant-design-mobile)
+[![npm (tag)](https://img.shields.io/npm/v/antd-mobile)](https://www.npmjs.com/package/antd-mobile) [![GitHub Release Date](https://img.shields.io/github/release-date/ant-design/ant-design-mobile)](https://github.com/ant-design/ant-design-mobile/releases) [![npm](https://img.shields.io/npm/dw/antd-mobile)](https://www.npmjs.com/package/antd-mobile) [![npm](https://img.shields.io/npm/dw/antd-mobile-v5-count?label=downloads%285.x%29)](https://www.npmjs.com/package/antd-mobile) [![jsdelivr](https://img.shields.io/jsdelivr/npm/hm/antd-mobile)](https://www.jsdelivr.com/package/npm/antd-mobile) [![gzip size](https://img.badgesize.io/https:/unpkg.com/antd-mobile/umd/antd-mobile.js?label=gzip%20size&compression=gzip)](https://unpkg.com/browse/antd-mobile@5/umd/antd-mobile.js) [![Commit Activity](https://img.shields.io/github/commit-activity/m/ant-design/ant-design-mobile/master)](https://github.com/ant-design/ant-design-mobile/graphs/contributors) [![Issues help wanted](https://img.shields.io/github/issues-raw/ant-design/ant-design-mobile/help%20wanted?label=help%20wanted)](https://github.com/ant-design/ant-design-mobile/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) ![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/ant-design/ant-design-mobile/check.yml?branch=master) [![codecov](https://img.shields.io/codecov/c/gh/ant-design/ant-design-mobile?token=2kJyJBg1nK)](https://codecov.io/gh/ant-design/ant-design-mobile) [![GitHub](https://img.shields.io/github/license/ant-design/ant-design-mobile)](https://github.com/ant-design/ant-design-mobile)
 
   <h4>
     <a href="https://mobile.ant.design">English Doc</a>
diff --git a/docs/guide/css-variables.en.md b/docs/guide/css-variables.en.md
index ecdb8a9bb..191cd9d0c 100644
--- a/docs/guide/css-variables.en.md
+++ b/docs/guide/css-variables.en.md
@@ -78,6 +78,7 @@ This patch CSS will automatically determine the current browser environment and
 Currently, only the following components support CSS variable degradation. We are still improving the CSS variable degradation capabilities of other components. Please pay attention to the subsequent releases:
 
 - Button
+- Cascader
 - CenterPopup
 - ErrorBlock
 - Image
diff --git a/docs/guide/css-variables.zh.md b/docs/guide/css-variables.zh.md
index b99df3fa1..c56c55436 100644
--- a/docs/guide/css-variables.zh.md
+++ b/docs/guide/css-variables.zh.md
@@ -78,6 +78,7 @@ import 'antd-mobile/bundle/css-vars-patch.css'
 目前，只有以下组件支持了 CSS 变量降级，其他组件的 CSS 变量降级能力我们还在持续完善中，请关注后续的发布：
 
 - Button
+- Cascader
 - CenterPopup
 - ErrorBlock
 - Image
diff --git a/docs/guide/i18n.en.md b/docs/guide/i18n.en.md
index 323006931..97a148f18 100644
--- a/docs/guide/i18n.en.md
+++ b/docs/guide/i18n.en.md
@@ -15,7 +15,20 @@ return (
 )
 ```
 
-The following languages are currently supported: | Language | Filename | |-----------------------|----------| | Chinese (Simplified) | zh-CN | | Chinese (Traditional) | zh-HK | | Chinese (Traditional) | zh-TW | | English | en-US | | Persian | fa-IR | | Spanish | es-ES | | Korean | ko-KR | | Japanese | ja-JP | | Kazakh | kk-KZ | | Indonesian | id-ID |
+The following languages are currently supported:
+
+| Language              | Filename |
+| --------------------- | -------- |
+| Chinese (Simplified)  | zh-CN    |
+| Chinese (Traditional) | zh-HK    |
+| Chinese (Traditional) | zh-TW    |
+| English               | en-US    |
+| Persian               | fa-IR    |
+| Spanish               | es-ES    |
+| Korean                | ko-KR    |
+| Japanese              | ja-JP    |
+| Kazakh                | kk-KZ    |
+| Indonesian            | id-ID    |
 
 See more usage at [ConfigProvider](../components/config-provider).
 
diff --git a/docs/guide/i18n.zh.md b/docs/guide/i18n.zh.md
index 86f47ee56..fa0b22dab 100644
--- a/docs/guide/i18n.zh.md
+++ b/docs/guide/i18n.zh.md
@@ -15,7 +15,20 @@ return (
 )
 ```
 
-目前支持以下语言： | 语言 | 文件名 | |----------------------|--------| | 简体中文 | zh-CN | | 繁体中文（中国香港） | zh-HK | | 繁体中文（中国台湾） | zh-TW | | 英语（美式） | en-US | | 波斯语 | fa-IR | | 西班牙语 | es-ES | | 韩语 | ko-KR | | 日语 | ja-JP | | 哈萨克语 | kk-KZ | | 印度尼西亚语 | id-ID |
+目前支持以下语言：
+
+| 语言                 | 文件名 |
+| -------------------- | ------ |
+| 简体中文             | zh-CN  |
+| 繁体中文（中国香港） | zh-HK  |
+| 繁体中文（中国台湾） | zh-TW  |
+| 英语（美式）         | en-US  |
+| 波斯语               | fa-IR  |
+| 西班牙语             | es-ES  |
+| 韩语                 | ko-KR  |
+| 日语                 | ja-JP  |
+| 哈萨克语             | kk-KZ  |
+| 印度尼西亚语         | id-ID  |
 
 具体的使用方法请参考 [ConfigProvider](../components/config-provider) 文档。
 
diff --git a/package.json b/package.json
index 9bb5d9112..2362ecbf1 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "antd-mobile",
-  "version": "5.26.0",
+  "version": "5.27.0",
   "scripts": {
     "start": "dumi dev",
     "build": "gulp",
diff --git a/src/components/calendar/calendar.en.md b/src/components/calendar/calendar.en.md
index a4f153c24..b5d4c4974 100644
--- a/src/components/calendar/calendar.en.md
+++ b/src/components/calendar/calendar.en.md
@@ -16,16 +16,18 @@ When the user needs to enter a date, he can select it in the pop-up date panel.
 
 <code src="./demos/demo4.tsx"></code>
 
+<code src="./demos/demo5.tsx"></code>
+
 ## Calendar
 
 ### Props
 
-| Name | Description | Type | Default |
-| --- | --- | --- | --- | --- | --- |
+| Name | Description | Type | Default | Version |
+| --- | --- | --- | --- | --- |
 | allowClear | Whether to allow clearing after another click. | `boolean` | `true` |
 | defaultValue | The default selected date or date range. | Same as `value` prop. | - |
 | max | Maximum value of a selectable range. | `Date` | - |
-| min | Minimum value of a selectable range. | `Date` | - |  | - |
+| min | Minimum value of a selectable range. | `Date` | - | - |
 | maxPage | Maximum visible page of date. | `Page` |
 | minPage | Minimum visible page of date. | `Page` | - |
 | nextMonthButton | Contents of the Next Month button on the navigation pane | `React.ReactNode` | `>` |
@@ -39,6 +41,7 @@ When the user needs to enter a date, he can select it in the pop-up date panel.
 | shouldDisableDate | Set whether the date is disable selection. The min and max Settings are ignored | `(date: Date) => boolean` | - |
 | value | The selected date or date range. | `Date \| null` when selection mode is "single". `[Date, Date] \| null` when selection mode is "range" | - |
 | weekStartsOn | Week starts on which day. | `'Monday' \| 'Sunday'` | `'Sunday'` |
+| renderDate | Custom date rendering. | `(date: Date) => ReactNode` | - | 5.28.0 |
 
 ### CSS Variables
 
diff --git a/src/components/calendar/calendar.tsx b/src/components/calendar/calendar.tsx
index f9f361b11..f4bfb48c6 100644
--- a/src/components/calendar/calendar.tsx
+++ b/src/components/calendar/calendar.tsx
@@ -39,6 +39,7 @@ export type CalendarProps = {
   onPageChange?: (year: number, month: number) => void
   weekStartsOn?: 'Monday' | 'Sunday'
   renderLabel?: (date: Date) => React.ReactNode
+  renderDate?: (date: Date) => React.ReactNode
   allowClear?: boolean
   max?: Date
   min?: Date
@@ -296,7 +297,9 @@ export const Calendar = forwardRef<CalendarRef, CalendarProps>((p, ref) => {
             }
           }}
         >
-          <div className={`${classPrefix}-cell-top`}>{d.date()}</div>
+          <div className={`${classPrefix}-cell-top`}>
+            {props.renderDate ? props.renderDate(d.toDate()) : d.date()}
+          </div>
           <div className={`${classPrefix}-cell-bottom`}>
             {props.renderLabel?.(d.toDate())}
           </div>
diff --git a/src/components/calendar/calendar.zh.md b/src/components/calendar/calendar.zh.md
index 774ac645d..ed01567c4 100644
--- a/src/components/calendar/calendar.zh.md
+++ b/src/components/calendar/calendar.zh.md
@@ -8,14 +8,22 @@
 
 ## 示例
 
-<code src="./demos/demo1.tsx"></code> <code src="./demos/demo2.tsx"></code> <code src="./demos/demo3.tsx"></code> <code src="./demos/demo4.tsx"></code>
+<code src="./demos/demo1.tsx"></code>
+
+<code src="./demos/demo2.tsx"></code>
+
+<code src="./demos/demo3.tsx"></code>
+
+<code src="./demos/demo4.tsx"></code>
+
+<code src="./demos/demo5.tsx"></code>
 
 ## Calendar
 
 ### 属性
 
-| 属性 | 说明 | 类型 | 默认值 |
-| --- | --- | --- | --- |
+| 属性 | 说明 | 类型 | 默认值 | 版本 |
+| --- | --- | --- | --- | --- |
 | allowClear | 是否允许再次点击后清除 | `boolean` | `true` |
 | defaultValue | 默认选择的日期 | 同 `value` 属性 | - |
 | max | 可选择范围的最大值 | `Date` | - |
@@ -33,6 +41,7 @@
 | shouldDisableDate | 判断日期是否可选，使用后会忽略 min 和 max 设置 | `(date: Date) => boolean` | - |
 | value | 选择的日期 | 单选模式下为 `Date \| null`，多选模式下为 `[Date, Date] \| null` | - |
 | weekStartsOn | 每周以周几作为第一天 | `'Monday' \| 'Sunday'` | `'Sunday'` |
+| renderDate | 自定义日期渲染 | `(date: Date) => ReactNode` | - | 5.28.0 |
 
 ### CSS 变量
 
diff --git a/src/components/calendar/demos/demo5.less b/src/components/calendar/demos/demo5.less
new file mode 100644
index 000000000..3286137d7
--- /dev/null
+++ b/src/components/calendar/demos/demo5.less
@@ -0,0 +1,13 @@
+.custom-cell {
+  width: 38px;
+  height: 38px;
+  border-radius: 50%;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+
+  &-selected {
+    background: var(--adm-color-primary);
+    color: #fff;
+  }
+}
diff --git a/src/components/calendar/demos/demo5.tsx b/src/components/calendar/demos/demo5.tsx
new file mode 100644
index 000000000..7f614be14
--- /dev/null
+++ b/src/components/calendar/demos/demo5.tsx
@@ -0,0 +1,30 @@
+import dayjs from 'dayjs'
+import React from 'react'
+import { Calendar } from 'antd-mobile'
+import { DemoBlock } from 'demos'
+import classNames from 'classnames'
+import './demo5.less'
+
+export default () => {
+  return (
+    <>
+      <DemoBlock title='自定义日期渲染'>
+        <Calendar
+          renderDate={date => {
+            const dates = [16, 17, 18, 19]
+            const d = dayjs(date).date()
+            return (
+              <div
+                className={classNames('custom-cell', {
+                  ['custom-cell-selected']: dates.includes(d),
+                })}
+              >
+                {d}
+              </div>
+            )
+          }}
+        />
+      </DemoBlock>
+    </>
+  )
+}
diff --git a/src/components/cascader/cascader.patch.less b/src/components/cascader/cascader.patch.less
new file mode 100644
index 000000000..b71de3ee6
--- /dev/null
+++ b/src/components/cascader/cascader.patch.less
@@ -0,0 +1,7 @@
+@class-prefix-cascader: ~'adm-cascader';
+
+.@{class-prefix-cascader} {
+  .@{class-prefix-cascader}-view-content {
+    height: 310px;
+  }
+}
diff --git a/src/components/footer/footer.tsx b/src/components/footer/footer.tsx
index 1aa6f8765..90e337244 100644
--- a/src/components/footer/footer.tsx
+++ b/src/components/footer/footer.tsx
@@ -2,7 +2,7 @@ import React, { FC, ReactNode } from 'react'
 import classNames from 'classnames'
 import { NativeProps, withNativeProps } from '../../utils/native-props'
 import { mergeProps } from '../../utils/with-default-props'
-import { Divider } from '../divider/divider'
+import Divider from '../divider'
 
 const classPrefix = `adm-footer`
 
diff --git a/src/components/input/index.en.md b/src/components/input/index.en.md
index 7894fe562..5f75d954a 100644
--- a/src/components/input/index.en.md
+++ b/src/components/input/index.en.md
@@ -34,7 +34,7 @@ The `Input` component is layout-independent. It only includes the most basic inp
 | readOnly | Whether it is readonly or not | `boolean` | `false` |
 | value | The input value | `string` | - |
 
-In addition, the following native attributes are supported: `maxLength` `minLength` `max` `min` `autoComplete` `autoFocus` `enterKeyHint` `pattern` `inputMode` `type` `onFocus` `onBlur` `autoCapitalize` `autoCorrect` `onKeyDown` `onKeyUp` `onCompositionStart` `onCompositionEnd` `onClick`
+In addition, the following native attributes are supported: `maxLength` `minLength` `max` `min` `autoComplete` `autoFocus` `enterKeyHint` `pattern` `inputMode` `type` `onFocus` `onBlur` `autoCapitalize` `autoCorrect` `onKeyDown` `onKeyUp` `onCompositionStart` `onCompositionEnd` `onClick` `step`
 
 ### CSS Variables
 
diff --git a/src/components/input/index.zh.md b/src/components/input/index.zh.md
index d56064bcc..72d69b76d 100644
--- a/src/components/input/index.zh.md
+++ b/src/components/input/index.zh.md
@@ -34,7 +34,7 @@
 | readOnly | 是否只读 | `boolean` | `false` |
 | value | 输入值 | `string` | - |
 
-此外还支持以下原生属性：`maxLength` `minLength` `autoComplete` `autoFocus` `enterKeyHint` `pattern` `inputMode` `type` `onFocus` `onBlur` `autoCapitalize` `autoCorrect` `onKeyDown` `onKeyUp` `onCompositionStart` `onCompositionEnd` `onClick`
+此外还支持以下原生属性：`maxLength` `minLength` `autoComplete` `autoFocus` `enterKeyHint` `pattern` `inputMode` `type` `onFocus` `onBlur` `autoCapitalize` `autoCorrect` `onKeyDown` `onKeyUp` `onCompositionStart` `onCompositionEnd` `onClick` `step`
 
 ### CSS 变量
 
diff --git a/src/components/input/input.tsx b/src/components/input/input.tsx
index 9816cf161..2f1a3f0be 100644
--- a/src/components/input/input.tsx
+++ b/src/components/input/input.tsx
@@ -190,6 +190,7 @@ export const Input = forwardRef<InputRef, InputProps>((p, ref) => {
           props.onCompositionEnd?.(e)
         }}
         onClick={props.onClick}
+        step={props.step}
         role={props.role}
         aria-valuenow={props['aria-valuenow']}
         aria-valuemax={props['aria-valuemax']}
diff --git a/src/components/search-bar/demos/demo1.tsx b/src/components/search-bar/demos/demo1.tsx
index d2ff4c3a5..e10ca2951 100644
--- a/src/components/search-bar/demos/demo1.tsx
+++ b/src/components/search-bar/demos/demo1.tsx
@@ -30,16 +30,13 @@ export default () => {
               Toast.show(`你搜索了：${val}`)
             }}
             onFocus={() => {
-              Toast.show('获得焦点')
+              console.log('获得焦点')
             }}
             onBlur={() => {
-              Toast.show('失去焦点')
-            }}
-            onClear={() => {
-              Toast.show('清空内容')
+              console.log('失去焦点')
             }}
             onCancel={() => {
-              Toast.show('取消搜索')
+              console.log('取消搜索')
             }}
           />
           <Space>
diff --git a/src/components/selector/index.en.md b/src/components/selector/index.en.md
index e66fcd6f5..a2d27b57c 100644
--- a/src/components/selector/index.en.md
+++ b/src/components/selector/index.en.md
@@ -18,7 +18,7 @@ Provides multiple options for the user to choose from, typically used in filters
 
 | Name | Description | Type | Default |
 | --- | --- | --- | --- |
-| columns | Number of the displayed columns | `number` | - |
+| columns | Number of the displayed columns (Note that `grid` layout not support in IOS 9) | `number` | - |
 | defaultValue | Selected value by default | `SelectorValue[]` | `[]` |
 | disabled | Whether to disable selecting | `boolean` | `false` |
 | multiple | Whether to allow multiple selections | `boolean` | `false` |
diff --git a/src/components/selector/index.zh.md b/src/components/selector/index.zh.md
index 44b9c649b..bc1fb1e72 100644
--- a/src/components/selector/index.zh.md
+++ b/src/components/selector/index.zh.md
@@ -18,7 +18,7 @@
 
 | 属性 | 说明 | 类型 | 默认值 |
 | --- | --- | --- | --- |
-| columns | 列数 | `number` | - |
+| columns | 列数（注意 `grid` 布局在 IOS 9 下不支持） | `number` | - |
 | defaultValue | 默认项 | `SelectorValue[]` | `[]` |
 | disabled | 是否全局禁止选中 | `boolean` | `false` |
 | multiple | 是否允许多选 | `boolean` | `false` |
diff --git a/src/components/swiper/index.en.md b/src/components/swiper/index.en.md
index 4d9287e34..df5a8605a 100644
--- a/src/components/swiper/index.en.md
+++ b/src/components/swiper/index.en.md
@@ -40,8 +40,8 @@ When you use a vertical Swiper, be sure to set its height through the `--height`
 
 ### Props
 
-| Name | Description | Type | Default | Version |
-| --- | --- | --- | --- | --- |
+| Name | Description | Type | Default |
+| --- | --- | --- | --- |
 | allowTouchMove | Whether to allow gesture sliding | `boolean` | `true` |
 | autoplay | Whether to switch automatically | `boolean` | `false` |
 | autoplayInterval | Automatic switching interval, the unit is `ms` | `number` | `3000` |
@@ -55,11 +55,6 @@ When you use a vertical Swiper, be sure to set its height through the `--height`
 | slideSize | The slide width in percentage | `number` | `100` |
 | stuckAtBoundary | Whether to stuck at boundary in order to prevent white spaces. Only available when `loop` is `false` and `slideWidth` < 100. | `boolean` | `true` |
 | trackOffset | The track offset in percentage | `number` | `0` |
-| stopPropagation | Stop the propagation of some events. | `PropagationEvent[]` | `[]` | 5.28.0 |
-
-```ts
-type PropagationEvent = 'mouseup' | 'mousemove' | 'mousedown'
-```
 
 ### CSS Variables
 
diff --git a/src/components/swiper/index.zh.md b/src/components/swiper/index.zh.md
index 20d7d97ef..eb6d55160 100644
--- a/src/components/swiper/index.zh.md
+++ b/src/components/swiper/index.zh.md
@@ -38,8 +38,8 @@
 
 ### 属性
 
-| 属性 | 说明 | 类型 | 默认值 | 版本 |
-| --- | --- | --- | --- | --- |
+| 属性 | 说明 | 类型 | 默认值 |
+| --- | --- | --- | --- |
 | allowTouchMove | 是否允许手势滑动 | `boolean` | `true` |
 | autoplay | 是否自动切换 | `boolean` | `false` |
 | autoplayInterval | 自动切换的间隔，单位为 `ms` | `number` | `3000` |
@@ -53,11 +53,6 @@
 | slideSize | 滑块的宽度百分比 | `number` | `100` |
 | stuckAtBoundary | 是否在边界两边卡住，避免出现空白，仅在非 `loop` 模式且 `slideSize` < 100 时生效 | `boolean` | `true` |
 | trackOffset | 滑块轨道整体的偏移量百分比 | `number` | `0` |
-| stopPropagation | 阻止某些事件的冒泡 | `PropagationEvent[]` | `[]` | 5.28.0 |
-
-```ts
-type PropagationEvent = 'mouseup' | 'mousemove' | 'mousedown'
-```
 
 ### CSS 变量
 
diff --git a/src/components/swiper/swiper.tsx b/src/components/swiper/swiper.tsx
index dd7e10763..4464d521d 100644
--- a/src/components/swiper/swiper.tsx
+++ b/src/components/swiper/swiper.tsx
@@ -21,22 +21,9 @@ import { staged } from 'staged-components'
 import { useRefState } from '../../utils/use-ref-state'
 import { bound } from '../../utils/bound'
 import { useIsomorphicLayoutEffect, useUpdateEffect } from 'ahooks'
-import { mergeFuncProps } from '../../utils/with-func-props'
 
 const classPrefix = `adm-swiper`
 
-const eventToPropRecord = {
-  'mousedown': 'onMouseDown',
-  'mousemove': 'onMouseMove',
-  'mouseup': 'onMouseUp',
-} as const
-
-type ValuesToUnion<T, K extends keyof T = keyof T> = K extends keyof T
-  ? T[K]
-  : never
-
-type PropagationEvent = keyof typeof eventToPropRecord
-
 export type SwiperRef = {
   swipeTo: (index: number) => void
   swipeNext: () => void
@@ -57,7 +44,6 @@ export type SwiperProps = {
   trackOffset?: number
   stuckAtBoundary?: boolean
   rubberband?: boolean
-  stopPropagation?: PropagationEvent[]
   children?: ReactElement | ReactElement[]
 } & NativeProps<'--height' | '--width' | '--border-radius' | '--track-padding'>
 
@@ -72,7 +58,6 @@ const defaultProps = {
   trackOffset: 0,
   stuckAtBoundary: true,
   rubberband: true,
-  stopPropagation: [] as PropagationEvent[],
 }
 
 let currentUid: undefined | {}
@@ -331,19 +316,6 @@ export const Swiper = forwardRef<SwiperRef, SwiperProps>(
         '--track-offset': `${props.trackOffset}%`,
       }
 
-      const dragProps = { ...(props.allowTouchMove ? bind() : {}) }
-      const stopPropagationProps: Partial<
-        Record<ValuesToUnion<typeof eventToPropRecord>, any>
-      > = {}
-      for (const key of props.stopPropagation) {
-        const prop = eventToPropRecord[key]
-        stopPropagationProps[prop] = function (e: Event) {
-          e.stopPropagation()
-        }
-      }
-
-      const mergedProps = mergeFuncProps(dragProps, stopPropagationProps)
-
       return withNativeProps(
         props,
         <div
@@ -364,7 +336,7 @@ export const Swiper = forwardRef<SwiperRef, SwiperProps>(
               }
               forceCancelDrag()
             }}
-            {...mergedProps}
+            {...(props.allowTouchMove ? bind() : {})}
           >
             {renderTrackInner()}
           </div>
diff --git a/src/global/css-vars-patch.less b/src/global/css-vars-patch.less
index 46aed918c..f3ca619a8 100644
--- a/src/global/css-vars-patch.less
+++ b/src/global/css-vars-patch.less
@@ -1,5 +1,6 @@
 @supports not (color: var(--adm-color-text)) {
   @import '../components/button/button.patch.less';
+  @import '../components/cascader/cascader.patch.less';
   @import '../components/center-popup/center-popup.patch.less';
   @import '../components/error-block/error-block.patch.less';
   @import '../components/image/image.patch.less';
diff --git a/src/utils/with-func-props.ts b/src/utils/with-func-props.ts
deleted file mode 100644
index 720a0abc3..000000000
--- a/src/utils/with-func-props.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-type Merge<T, P> = {
-  [K in keyof T & keyof P]: P[K] | T[K]
-}
-
-export function mergeFuncProps<
-  T extends Record<string, any>,
-  P extends Record<string, any>
->(p1: T, p2: P): Merge<T, P> {
-  const p1Keys = Object.keys(p1)
-  const p2Keys = Object.keys(p2)
-  const keys = new Set([...p1Keys, ...p2Keys])
-  const res: any = {}
-
-  keys.forEach(key => {
-    const p1Value = p1[key]
-    const p2Value = p2[key]
-
-    if (typeof p1Value === 'function' && typeof p2Value === 'function') {
-      res[key] = function (...args: any[]) {
-        p1Value(...args)
-        p2Value(...args)
-      }
-    } else {
-      res[key] = p1Value || p2Value
-    }
-  })
-
-  return res
-}


Test patch:
diff --git a/src/components/calendar/tests/calendar.test.tsx b/src/components/calendar/tests/calendar.test.tsx
index ac572c53f..231c3640d 100644
--- a/src/components/calendar/tests/calendar.test.tsx
+++ b/src/components/calendar/tests/calendar.test.tsx
@@ -159,4 +159,15 @@ describe('Calendar', () => {
     )
     expect(container).toMatchSnapshot()
   })
+
+  test('custom date render', () => {
+    render(
+      <Calendar
+        renderDate={date => {
+          return <div className='custom-cell'>{dayjs(date).date()}</div>
+        }}
+      />
+    )
+    expect(document.getElementsByClassName('custom-cell').length).toBe(42)
+  })
 })
diff --git a/src/components/input/tests/input.test.tsx b/src/components/input/tests/input.test.tsx
index 48484f88d..c6373bee4 100644
--- a/src/components/input/tests/input.test.tsx
+++ b/src/components/input/tests/input.test.tsx
@@ -142,6 +142,12 @@ describe('Input', () => {
     })
   })
 
+  test('should work with `type="number"` and step', async () => {
+    const { container } = render(<Input type='number' step='0.01' min={0} />)
+    const input = container.querySelector('input') as HTMLInputElement
+    expect(input.step).toBe('0.01')
+  })
+
   test('should works with `onEnterPress`', async () => {
     const onEnterPress = jest.fn()
     render(<Input defaultValue={'testValue'} onEnterPress={onEnterPress} />)
diff --git a/src/components/swiper/tests/swiper.test.tsx b/src/components/swiper/tests/swiper.test.tsx
index 844b3c486..76759aa08 100644
--- a/src/components/swiper/tests/swiper.test.tsx
+++ b/src/components/swiper/tests/swiper.test.tsx
@@ -291,37 +291,4 @@ describe('Swiper', () => {
 
     jest.useRealTimers()
   })
-
-  test('stop propagation should be work', () => {
-    const onMouseDown = jest.fn()
-    const onMouseMove = jest.fn()
-    const onMouseUp = jest.fn()
-    render(
-      <div
-        onMouseDown={onMouseDown}
-        onMouseMove={onMouseMove}
-        onMouseUp={onMouseUp}
-      >
-        <Swiper stopPropagation={['mousedown', 'mousemove', 'mouseup']}>
-          {items}
-        </Swiper>
-      </div>
-    )
-
-    const el = $$(`.${classPrefix}-track`)[0]
-    mockDrag(el, [
-      { clientX: 300, clientY: 0 },
-      {
-        clientX: 200,
-        clientY: 25,
-      },
-      {
-        clientX: 100,
-        clientY: 30,
-      },
-    ])
-    expect(onMouseDown).not.toBeCalled()
-    expect(onMouseMove).not.toBeCalled()
-    expect(onMouseUp).not.toBeCalled()
-  })
 })