Просмотр исходного кода

Merge branch 'main' into release

pointhalo 1 год назад
Родитель
Сommit
56de8fdbad
84 измененных файлов с 906 добавлено и 572 удалено
  1. 1 1
      content/basic/button/index-en-US.md
  2. 1 1
      content/basic/button/index.md
  3. 1 1
      content/basic/space/index-en-US.md
  4. 1 1
      content/basic/space/index.md
  5. 1 1
      content/basic/typography/index-en-US.md
  6. 1 1
      content/basic/typography/index.md
  7. 1 1
      content/feedback/banner/index-en-US.md
  8. 1 1
      content/feedback/banner/index.md
  9. 1 1
      content/feedback/notification/index-en-US.md
  10. 1 1
      content/feedback/notification/index.md
  11. 1 1
      content/feedback/popconfirm/index-en-US.md
  12. 1 1
      content/feedback/popconfirm/index.md
  13. 1 1
      content/feedback/progress/index-en-US.md
  14. 1 1
      content/feedback/progress/index.md
  15. 1 1
      content/feedback/skeleton/index-en-US.md
  16. 1 1
      content/feedback/skeleton/index.md
  17. 1 1
      content/feedback/spin/index-en-US.md
  18. 1 1
      content/feedback/spin/index.md
  19. 1 1
      content/feedback/toast/index-en-US.md
  20. 1 1
      content/feedback/toast/index.md
  21. 1 1
      content/input/autocomplete/index-en-US.md
  22. 1 1
      content/input/autocomplete/index.md
  23. 1 1
      content/input/cascader/index.md
  24. 2 2
      content/order.js
  25. 1 1
      content/other/configprovider/index-en-US.md
  26. 1 1
      content/other/configprovider/index.md
  27. 1 1
      content/other/locale/index-en-US.md
  28. 1 1
      content/other/locale/index.md
  29. 1 1
      content/show/chart/index-en-US.md
  30. 1 1
      content/show/chart/index.md
  31. 46 46
      content/show/table/index-en-US.md
  32. 50 50
      content/show/table/index.md
  33. 22 0
      content/start/changelog/index-en-US.md
  34. 22 0
      content/start/changelog/index.md
  35. 34 0
      cypress/e2e/datePicker.spec.js
  36. 21 12
      cypress/e2e/select.spec.js
  37. 9 1
      cypress/e2e/table.spec.js
  38. 1 1
      lerna.json
  39. 1 1
      package.json
  40. 3 3
      packages/semi-animation-react/package.json
  41. 1 1
      packages/semi-animation-styled/package.json
  42. 1 1
      packages/semi-animation/package.json
  43. 1 1
      packages/semi-eslint-plugin/package.json
  44. 17 10
      packages/semi-foundation/cascader/foundation.ts
  45. 43 0
      packages/semi-foundation/cascader/util.ts
  46. 3 0
      packages/semi-foundation/datePicker/foundation.ts
  47. 1 0
      packages/semi-foundation/dropdown/dropdown.scss
  48. 4 0
      packages/semi-foundation/image/previewInnerFoundation.ts
  49. 2 2
      packages/semi-foundation/package.json
  50. 2 0
      packages/semi-foundation/select/foundation.ts
  51. 12 2
      packages/semi-foundation/tooltip/foundation.ts
  52. 2 3
      packages/semi-foundation/tree/treeUtil.ts
  53. 1 1
      packages/semi-icons-lab/package.json
  54. 1 1
      packages/semi-icons/package.json
  55. 1 1
      packages/semi-illustrations/package.json
  56. 2 2
      packages/semi-next/package.json
  57. 1 1
      packages/semi-rspack/package.json
  58. 1 1
      packages/semi-scss-compile/package.json
  59. 1 1
      packages/semi-theme-default/package.json
  60. 1 1
      packages/semi-ui/avatar/TopSlotSvg.tsx
  61. 2 2
      packages/semi-ui/cascader/__test__/cascader.test.js
  62. 25 21
      packages/semi-ui/cascader/index.tsx
  63. 16 1
      packages/semi-ui/datePicker/_story/datePicker.stories.jsx
  64. 32 0
      packages/semi-ui/datePicker/_story/v2/FixedNaN.tsx
  65. 1 0
      packages/semi-ui/datePicker/_story/v2/index.js
  66. 1 1
      packages/semi-ui/datePicker/datePicker.tsx
  67. 8 12
      packages/semi-ui/datePicker/yearAndMonth.tsx
  68. 3 3
      packages/semi-ui/form/hoc/withField.tsx
  69. 3 3
      packages/semi-ui/modal/Modal.tsx
  70. 7 7
      packages/semi-ui/package.json
  71. 6 4
      packages/semi-ui/scripts/compileDist.js
  72. 23 54
      packages/semi-ui/select/_story/select.stories.jsx
  73. 1 0
      packages/semi-ui/select/option.tsx
  74. 1 1
      packages/semi-ui/table/ResizableTable.tsx
  75. 3 2
      packages/semi-ui/table/_story/table.stories.jsx
  76. 106 0
      packages/semi-ui/table/_story/v2/FixedRowSelectionHiddenResizable/index.tsx
  77. 1 0
      packages/semi-ui/table/_story/v2/index.js
  78. 1 1
      packages/semi-ui/timePicker/TimePicker.tsx
  79. 51 16
      packages/semi-ui/tooltip/_story/tooltip.stories.jsx
  80. 1 1
      packages/semi-webpack/package.json
  81. 262 262
      sitemap.xml
  82. 4 3
      src/components/IconList/index.jsx
  83. 6 0
      src/components/layout.js
  84. 4 4
      yarn.lock

+ 1 - 1
content/input/button/index-en-US.md → content/basic/button/index-en-US.md

@@ -1,6 +1,6 @@
 ---
 localeCode: en-US
-order: 20
+order: 17
 category: Input
 title:  Button
 subTitle: Button

+ 1 - 1
content/input/button/index.md → content/basic/button/index.md

@@ -1,6 +1,6 @@
 ---
 localeCode: zh-CN
-order: 20
+order: 17
 category: 输入类
 title:  Button 按钮
 icon: doc-button

+ 1 - 1
content/basic/space/index-en-US.md

@@ -1,6 +1,6 @@
 ---
 localeCode: en-US
-order: 17
+order: 18
 category: basic
 title:  Space
 icon: doc-space

+ 1 - 1
content/basic/space/index.md

@@ -1,6 +1,6 @@
 ---
 localeCode: zh-CN
-order: 17
+order: 18
 category: 基础
 title:  Space 间距
 icon: doc-space

+ 1 - 1
content/basic/typography/index-en-US.md

@@ -1,6 +1,6 @@
 ---
 localeCode: en-US
-order: 18
+order: 19
 category: Basic
 title:  Typography
 subTitle: Typography

+ 1 - 1
content/basic/typography/index.md

@@ -1,6 +1,6 @@
 ---
 localeCode: zh-CN
-order: 18
+order: 19
 category: 基础
 title:  Typography 版式
 icon: doc-typography

+ 1 - 1
content/feedback/banner/index-en-US.md

@@ -1,6 +1,6 @@
 ---
 localeCode: en-US
-order: 67
+order: 68
 category: Feedback
 title:  Banner
 subTitle: Banner

+ 1 - 1
content/feedback/banner/index.md

@@ -1,6 +1,6 @@
 ---
 localeCode: zh-CN
-order: 67
+order: 68
 category: 反馈类
 title:  Banner 通知横幅
 icon: doc-banner

+ 1 - 1
content/feedback/notification/index-en-US.md

@@ -1,6 +1,6 @@
 ---
 localeCode: en-US
-order: 68
+order: 69
 category: Feedback
 title:  Notification
 subTitle: Notification

+ 1 - 1
content/feedback/notification/index.md

@@ -1,6 +1,6 @@
 ---
 localeCode: zh-CN
-order: 68
+order: 69
 category: 反馈类
 title: Notification 通知
 icon: doc-notification

+ 1 - 1
content/feedback/popconfirm/index-en-US.md

@@ -1,6 +1,6 @@
 ---
 localeCode: en-US
-order: 69
+order: 70
 category: Feedback
 title:  Popconfirm
 subTitle: Popconfirm

+ 1 - 1
content/feedback/popconfirm/index.md

@@ -1,6 +1,6 @@
 ---
 localeCode: zh-CN
-order: 69
+order: 70
 category: 反馈类
 title:  Popconfirm 气泡确认框
 icon: doc-popconfirm

+ 1 - 1
content/feedback/progress/index-en-US.md

@@ -1,6 +1,6 @@
 ---
 localeCode: en-US
-order: 70
+order: 71
 category: Feedback
 title: Progress
 subTitle: Progress

+ 1 - 1
content/feedback/progress/index.md

@@ -1,6 +1,6 @@
 ---
 localeCode: zh-CN
-order: 70
+order: 71
 category: 反馈类
 title: Progress 进度条
 icon: doc-progress

+ 1 - 1
content/feedback/skeleton/index-en-US.md

@@ -1,6 +1,6 @@
 ---
 localeCode: en-US
-order: 71
+order: 72
 category: Feedback
 title: Skeleton
 subTitle: Skeleton

+ 1 - 1
content/feedback/skeleton/index.md

@@ -1,6 +1,6 @@
 ---
 localeCode: zh-CN
-order: 71
+order: 72
 category: 反馈类
 title: Skeleton 骨架屏
 icon: doc-skeleton

+ 1 - 1
content/feedback/spin/index-en-US.md

@@ -1,6 +1,6 @@
 ---
 localeCode: en-US
-order: 72
+order: 73
 category: Feedback
 title: Spin
 subTitle: Spin

+ 1 - 1
content/feedback/spin/index.md

@@ -1,6 +1,6 @@
 ---
 localeCode: zh-CN
-order: 72
+order: 73
 category: 反馈类
 title: Spin 加载器
 icon: doc-spin

+ 1 - 1
content/feedback/toast/index-en-US.md

@@ -1,6 +1,6 @@
 ---
 localeCode: en-US
-order: 73
+order: 74
 category: Feedback
 title: Toast
 subTitle: Toast

+ 1 - 1
content/feedback/toast/index.md

@@ -1,6 +1,6 @@
 ---
 localeCode: zh-CN
-order: 73
+order: 74
 category: 反馈类
 title: Toast 提示
 icon: doc-toast

+ 1 - 1
content/input/autocomplete/index-en-US.md

@@ -1,6 +1,6 @@
 ---
 localeCode: en-US
-order: 19
+order: 20
 category: Input
 title: AutoComplete
 icon: doc-autocomplete

+ 1 - 1
content/input/autocomplete/index.md

@@ -1,6 +1,6 @@
 ---
 localeCode: zh-CN
-order: 19
+order: 20
 category: 输入类
 title: AutoComplete 自动完成
 icon: doc-autocomplete

+ 1 - 1
content/input/cascader/index.md

@@ -1666,7 +1666,7 @@ interface TriggerRenderProps {
     disabled: boolean;
     /**
      * 已选中的 node 在 treeData 中的层级位置,如下例子,
-     * 当选中浙江省-杭州市-萧山区时,此处 value 为 '0-0-0'
+     * 当选中浙江省-杭州市-萧山区时,此处 value 为 '0-0-1'
      */
     value?: string | Set<string>;
     /* 当前 Input 框的输入值 */

+ 2 - 2
content/order.js

@@ -15,10 +15,10 @@ const order = [
     'icon',
     'layout',
     'tokens',
+    'button',
     'space',
     'typography',
     'autocomplete',
-    'button',
     'cascader',
     'checkbox',
     'datepicker',
@@ -65,6 +65,7 @@ const order = [
     'tag',
     'timeline',
     'tooltip',
+    'chart',
     'banner',
     'notification',
     'popconfirm',
@@ -74,7 +75,6 @@ const order = [
     'toast',
     'configprovider',
     'locale',
-    'chart',
 ];
 let { exec } = require('child_process');
 let fs = require('fs');

+ 1 - 1
content/other/configprovider/index-en-US.md

@@ -1,6 +1,6 @@
 ---
 localeCode: en-US
-order: 74
+order: 75
 category: Other
 title: ConfigProvider
 icon: doc-configprovider

+ 1 - 1
content/other/configprovider/index.md

@@ -1,6 +1,6 @@
 ---
 localeCode: zh-CN
-order: 74
+order: 75
 category: 其他
 title:  ConfigProvider 全局配置
 icon: doc-configprovider

+ 1 - 1
content/other/locale/index-en-US.md

@@ -1,6 +1,6 @@
 ---
 localeCode: en-US
-order: 75
+order: 76
 category: Other
 title: LocaleProvider
 subTitle: LocaleProvider

+ 1 - 1
content/other/locale/index.md

@@ -1,6 +1,6 @@
 ---
 localeCode: zh-CN
-order: 75
+order: 76
 category: 其他
 title:  LocaleProvider 多语言
 icon: doc-i18n

+ 1 - 1
content/other/chart/index-en-US.md → content/show/chart/index-en-US.md

@@ -1,6 +1,6 @@
 ---
 localeCode: en-US
-order: 76
+order: 67
 category: Other
 title: VChart
 icon: doc-vchart

+ 1 - 1
content/other/chart/index.md → content/show/chart/index.md

@@ -1,6 +1,6 @@
 ---
 localeCode: zh-CN
-order: 76
+order: 67
 category: 其他
 title:  VChart 图表
 icon: doc-vchart

+ 46 - 46
content/show/table/index-en-US.md

@@ -5259,53 +5259,53 @@ render(App);
 
 ## Table
 
-| Properties | Instructions | Type | Default | Version |
-| --- | --- | --- | --- | --- |
-| bordered | Whether to display outer and column borders | boolean | false |
-| className | Outermost style name | string |  |
-| clickGroupedRowToExpand | Group content expands or collapses when the group header row is clicked | boolean |  | **0.29.0** |
-| columns | For a configuration description of the table column, see [Column](#Column) | Column [] | [] |
-| components | Override the elements of Table, such as table, body, row, td, th, etc. | <a target="_blank" href="https://github.com/DouyinFE/semi-design/blob/340c93e4e1612a879be869c43ad7a9a85ab5a302/packages/semi-ui/table/interface.ts#L200">TableComponents</a> |  |
-| dataSource | Data | RecordType[] | [] |
-| defaultExpandAllRows | All rows are expanded by default | boolean | false |
-| defaultExpandAllGroupRows | All grouped rows are expanded by default | boolean | false | **1.30.0** |
-| defaultExpandedRowKeys | Default expansion of row key array | Array <\*> | [] |
-| empty | Content displayed when there is no data | ReactNode | ReactNode | 'No data yet. ' |
-| expandCellFixed | Whether the column of the expansion icon is fixed or not, the same value as the fixed value in Column | boolean\|string | false |
-| expandIcon | Custom expansion icon, hidden when it is `false` | boolean <br/>\|ReactNode <br/>\| (expanded: boolean) => ReactNode |  |
-| expandedRowKeys | Expanded rows, the row expansion function will be controlled when this parameter is introduced. | (string \| number)[] |  |
-| expandedRowRender | Extra unfolding lines | (record: object, index: number, expanded: boolean) => ReactNode |  |
-| expandAllRows | All rows are expanded | boolean | false | **1.30.0** |
-| expandAllGroupRows | All grouped rows are expanded | boolean | false | **1.30.0** |
-| expandRowByClick | Expand row when click row | boolean | false | **1.31.0** |
-| footer | End of form | string<br/>\|ReactNode<br/>\|(pageData: object) => string\|ReactNode |  |
-| groupBy | Grouping basis, generally a method of a key name or a return value of a string or number in the dataSource element | string\|number<br/>\|(record: any) => string\|number |  | **0.29.0** |
-| hideExpandedColumn | Whether to hide the expansion button column and turn off the rendering of the expansion button when it is turned on | boolean | true |
-| indentSize | indent size of TableCell | number | 20 |
-| keepDOM | Whether to not destroy the collapsed DOM when folding a row | boolean | false |
-| loading | Table is loading or not | boolean | false |
-| pagination | Paging component configuration | boolean\|TablePaginationProps | true |
-| prefixCls | Style name prefix | string |  |
-| renderGroupSection | Header rendering method | (groupKey?: string \| number, group?: string[] \| number[]) => ReactNode |  | **0.29.0** |
-| renderPagination | Customize the rendering method of pagination. | (paginationProps?: TablePaginationProps) => ReactNode |  | **1.13.0** |
+| Properties | Instructions                                                                                                              | Type | Default | Version |
+| --- |---------------------------------------------------------------------------------------------------------------------------| --- | --- | --- |
+| bordered | Whether to display outer and column borders                                                                               | boolean | false |
+| className | Outermost style name                                                                                                      | string |  |
+| clickGroupedRowToExpand | Group content expands or collapses when the group header row is clicked                                                   | boolean |  | **0.29.0** |
+| columns | For a configuration description of the table column, see [Column](#Column)                                                | Column [] | [] |
+| components | Override the elements of Table, such as table, body, row, td, th, etc.                                                    | <a target="_blank" href="https://github.com/DouyinFE/semi-design/blob/340c93e4e1612a879be869c43ad7a9a85ab5a302/packages/semi-ui/table/interface.ts#L200">TableComponents</a> |  |
+| dataSource | Data, Each item needs to have a key, or specify rowKey, see the beginning of the document                                                                                                                      | RecordType[] | [] |
+| defaultExpandAllRows | All rows are expanded by default                                                                                          | boolean | false |
+| defaultExpandAllGroupRows | All grouped rows are expanded by default                                                                                  | boolean | false | **1.30.0** |
+| defaultExpandedRowKeys | Default expansion of row key array                                                                                        | Array <\*> | [] |
+| empty | Content displayed when there is no data                                                                                   | ReactNode | ReactNode | 'No data yet. ' |
+| expandCellFixed | Whether the column of the expansion icon is fixed or not, the same value as the fixed value in Column                     | boolean\|string | false |
+| expandIcon | Custom expansion icon, hidden when it is `false`                                                                          | boolean <br/>\|ReactNode <br/>\| (expanded: boolean) => ReactNode |  |
+| expandedRowKeys | Expanded rows, the row expansion function will be controlled when this parameter is introduced.                           | (string \| number)[] |  |
+| expandedRowRender | Extra unfolding lines                                                                                                     | (record: object, index: number, expanded: boolean) => ReactNode |  |
+| expandAllRows | All rows are expanded                                                                                                     | boolean | false | **1.30.0** |
+| expandAllGroupRows | All grouped rows are expanded                                                                                             | boolean | false | **1.30.0** |
+| expandRowByClick | Expand row when click row                                                                                                 | boolean | false | **1.31.0** |
+| footer | End of form                                                                                                               | string<br/>\|ReactNode<br/>\|(pageData: object) => string\|ReactNode |  |
+| groupBy | Grouping basis, generally a method of a key name or a return value of a string or number in the dataSource element        | string\|number<br/>\|(record: any) => string\|number |  | **0.29.0** |
+| hideExpandedColumn | Whether to hide the expansion button column and turn off the rendering of the expansion button when it is turned on       | boolean | true |
+| indentSize | indent size of TableCell                                                                                                  | number | 20 |
+| keepDOM | Whether to not destroy the collapsed DOM when folding a row                                                               | boolean | false |
+| loading | Table is loading or not                                                                                                   | boolean | false |
+| pagination | Paging component configuration                                                                                            | boolean\|TablePaginationProps | true |
+| prefixCls | Style name prefix                                                                                                         | string |  |
+| renderGroupSection | Header rendering method                                                                                                   | (groupKey?: string \| number, group?: string[] \| number[]) => ReactNode |  | **0.29.0** |
+| renderPagination | Customize the rendering method of pagination.                                                                             | (paginationProps?: TablePaginationProps) => ReactNode |  | **1.13.0** |
 | resizable | Whether to turn on the telescopic column function, the column that needs to be telescopic must provide the value of width | boolean\|[Resizable](#Resizable) | false |
-| rowExpandable | Whether the row can be expanded, turning off the rendering of the expandable button when the value is false | (record: RecordType): => boolean | () => true | **0.27.0** |
-| rowKey | The value of the table row key, which can be a string or a function. | string \| (record: RecordType) => string | 'key' |
-| rowSelection | See [rowSelection](#rowSelection) | object | null |
-| scroll | Whether the table is scrollable, configure the width or height of the scroll area, see [scroll](#scroll) | object | - |
-| showHeader | Does it show the header? | boolean | true |
-| size | Table size, will effect the `padding` of the rows | "default"\|"middle"\|"small" | "default" | **1.0.0** |
-| sticky | fixed header | boolean \| { top: number } | false | **2.21.0** |
-| title | Table Title | string<br/>\|ReactNode<br/>\|(pageData: RecordType[]) => string\|ReactNode |  |
-| virtualized | Virtualization settings | Virtualized | false | **0.33.0** |
-| virtualized.itemSize | Row height | number\|(index: number) => number | 56 | **0.33.0** |
-| virtualized.onScroll | Virtualization scroll callback method | ( scrollDirection?: 'forward' \| 'backward', scrollOffset?: number, scrollUpdateWasRequested?: boolean ) => void |  | **0.33.0** |
-| onChange | Trigger when paging, sorting, filtering changes | ({ pagination: TablePaginationProps, <br/>filters: Array<\*>, sorter: object, extra: any }) => void |  |
-| onExpand | Trigger when clicking on the row expansion icon | (expanded: boolean, record: RecordType, DOMEvent: MouseEvent) => void |  | The third parameter DOMEvent requires version **>=0.28.0** |
-| onExpandedRowsChange | Triggers when unfolding row changes | (rows: RecordType[]) => void |  |
-| onGroupedRow | Similar to onRow, but this parameter is used to define the row attribute of the grouping header alone | (record: RecordType, index: number) => object |  | **0.29.0** |
-| onHeaderRow | Set the header row property, and the returned object is merged to the header line | (columns: Column[], index: number) => object |  |
-| onRow | Set the row property, and the returned object is merged to the table row | (record: RecordType, index: number) => object |  |
+| rowExpandable | Whether the row can be expanded, turning off the rendering of the expandable button when the value is false               | (record: RecordType): => boolean | () => true | **0.27.0** |
+| rowKey | The value of the table row key, which can be a string or a function.                                                      | string \| (record: RecordType) => string | 'key' |
+| rowSelection | See [rowSelection](#rowSelection)                                                                                         | object | null |
+| scroll | Whether the table is scrollable, configure the width or height of the scroll area, see [scroll](#scroll)                  | object | - |
+| showHeader | Does it show the header?                                                                                                  | boolean | true |
+| size | Table size, will effect the `padding` of the rows                                                                         | "default"\|"middle"\|"small" | "default" | **1.0.0** |
+| sticky | fixed header                                                                                                              | boolean \| { top: number } | false | **2.21.0** |
+| title | Table Title                                                                                                               | string<br/>\|ReactNode<br/>\|(pageData: RecordType[]) => string\|ReactNode |  |
+| virtualized | Virtualization settings                                                                                                   | Virtualized | false | **0.33.0** |
+| virtualized.itemSize | Row height                                                                                                                | number\|(index: number) => number | 56 | **0.33.0** |
+| virtualized.onScroll | Virtualization scroll callback method                                                                                     | ( scrollDirection?: 'forward' \| 'backward', scrollOffset?: number, scrollUpdateWasRequested?: boolean ) => void |  | **0.33.0** |
+| onChange | Trigger when paging, sorting, filtering changes                                                                           | ({ pagination: TablePaginationProps, <br/>filters: Array<\*>, sorter: object, extra: any }) => void |  |
+| onExpand | Trigger when clicking on the row expansion icon                                                                           | (expanded: boolean, record: RecordType, DOMEvent: MouseEvent) => void |  | The third parameter DOMEvent requires version **>=0.28.0** |
+| onExpandedRowsChange | Triggers when unfolding row changes                                                                                       | (rows: RecordType[]) => void |  |
+| onGroupedRow | Similar to onRow, but this parameter is used to define the row attribute of the grouping header alone                     | (record: RecordType, index: number) => object |  | **0.29.0** |
+| onHeaderRow | Set the header row property, and the returned object is merged to the header line                                         | (columns: Column[], index: number) => object |  |
+| onRow | Set the row property, and the returned object is merged to the table row                                                  | (record: RecordType, index: number) => object |  |
 
 Some of the type definitions used above:
 

+ 50 - 50
content/show/table/index.md

@@ -5265,56 +5265,56 @@ render(App);
 
 ## Table
 
-| 属性 | 说明 | 类型 | 默认值 | 版本 |
-| --- | --- | --- | --- | --- |
-| bordered | 是否展示外边框和列边框 | boolean | false |
-| childrenRecordName | 树形表格 dataSource 中每行元素中表示子级数据的字段,默认为 children | string | 'children' |
-| className | 最外层样式名 | string |  |
-| clickGroupedRowToExpand | 点击分组表头行时分组内容展开或收起 | boolean |  | **0.29.0** |
-| columns | 表格列的配置描述,详见[Column](#Column) | Column[] | [] |
-| components | 覆盖 Table 的组成元素,如 table, body,row,td,th 等 | <a target="_blank" href="https://github.com/DouyinFE/semi-design/blob/340c93e4e1612a879be869c43ad7a9a85ab5a302/packages/semi-ui/table/interface.ts#L200">TableComponents</a> |  |
-| dataSource | 数据 | RecordType[] | [] |
-| defaultExpandAllRows | 默认是否展开所有行,动态加载数据时不生效 | boolean | false |
-| defaultExpandAllGroupRows | 默认是否展开分组行,动态加载数据时不生效 | boolean | false | **1.30.0** |
-| defaultExpandedRowKeys | 默认展开的行 key 数组,,动态加载数据时不生效 | Array<\*> | [] |
+| 属性 | 说明                                                                  | 类型 | 默认值 | 版本 |
+| --- |---------------------------------------------------------------------| --- | --- | --- |
+| bordered | 是否展示外边框和列边框                                                         | boolean | false |
+| childrenRecordName | 树形表格 dataSource 中每行元素中表示子级数据的字段,默认为 children                        | string | 'children' |
+| className | 最外层样式名                                                              | string |  |
+| clickGroupedRowToExpand | 点击分组表头行时分组内容展开或收起                                                   | boolean |  | **0.29.0** |
+| columns | 表格列的配置描述,详见[Column](#Column)                                        | Column[] | [] |
+| components | 覆盖 Table 的组成元素,如 table, body,row,td,th 等                            | <a target="_blank" href="https://github.com/DouyinFE/semi-design/blob/340c93e4e1612a879be869c43ad7a9a85ab5a302/packages/semi-ui/table/interface.ts#L200">TableComponents</a> |  |
+| dataSource | 数据, 每项需要有key,或者指定 rowKey,见文档开头                                      | RecordType[] | [] |
+| defaultExpandAllRows | 默认是否展开所有行,动态加载数据时不生效                                                | boolean | false |
+| defaultExpandAllGroupRows | 默认是否展开分组行,动态加载数据时不生效                                                | boolean | false | **1.30.0** |
+| defaultExpandedRowKeys | 默认展开的行 key 数组,,动态加载数据时不生效                                           | Array<\*> | [] |
 | direction | RTL、LTR 方向,默认值等于 ConfigProvider direction,可在此单独配置 Table 的 direction | 'ltr' \| 'rtl' |  | **2.31.0** |
-| empty | 无数据时展示的内容 | ReactNode | '暂无数据' |
-| expandCellFixed | 展开图标所在列是否固定,与 Column 中的 fixed 取值相同 | boolean\|string | false |
-| expandIcon | 自定义展开按钮,传 `false` 关闭默认的渲染 | boolean \| ReactNode<br/> \| (expanded: boolean) => ReactNode |  |
-| expandedRowKeys | 展开的行,传入此参数时行展开功能将受控 | (string \| number)[] |  |
-| expandedRowRender | 额外的展开行 | (record: object, index: number, expanded: boolean) => ReactNode |  |
-| expandAllRows | 是否展开所有行 | boolean | false | **1.30.0** |
-| expandAllGroupRows | 是否展开分组行 | boolean | false | **1.30.0** |
-| expandRowByClick | 点击行时是否展开可展开行 | boolean | false | **1.31.0** |
-| footer | 表格尾部 | ReactNode<br/>\|(pageData: object) => ReactNode |  |
-| getVirtualizedListRef | 返回虚拟化表格所用 VariableSizeList 的 ref,仅在配置 virtualized 时有效 | (ref: React.RefObject) => void |  | **1.20.0** |
-| groupBy | 分组依据,一般为 dataSource 元素中某个键名或者返回值为字符串、数字的一个方法 | string\|number<br/>\|(record: RecordType) => string\|number |  | **0.29.0** |
-| hideExpandedColumn | 当表格可展开时,展开按钮默认会与第一列文案渲染在同一个单元格内,设为 false 时默认将展开按钮单独作为一列渲染 | boolean | true |
-| indentSize | 树形结构 TableCell 的缩进大小 | number | 20 |
-| keepDOM | 折叠行时是否不销毁被折叠的 DOM | boolean | false |
-| loading | 页面是否加载中 | boolean | false |
-| pagination | 分页组件配置 | boolean\|TablePaginationProps | true |
-| prefixCls | 样式名前缀 | string |  |
-| renderGroupSection | 表头渲染方法 | (groupKey?: string \| number, group?: string[] \| number[]) => ReactNode |  | **0.29.0** |
-| renderPagination | 自定义分页器渲染方法 | (paginationProps?: TablePaginationProps) => ReactNode |  | **1.13.0** |
-| resizable | 是否开启伸缩列功能,需要进行伸缩的列必须要提供 width 的值 | boolean\|[Resizable](#Resizable) | false |
-| rowExpandable | 传入该参数时,Table 作行渲染时会调用该函数,返回值用于判断该行是否可展开,返回值为 false 时关闭可展开按钮的渲染 | (record: object) => boolean |  | **0.27.0** |
-| rowKey | 表格行 key 的取值,可以是字符串或一个函数 | string<br/>\|(record: RecordType) => string | 'key' |
-| rowSelection | 表格行是否可选择,详见 [rowSelection](#rowSelection) | object | - |
-| scroll | 表格是否可滚动,配置滚动区域的宽或高,详见 [scroll](#scroll) | object | - |
-| showHeader | 是否显示表头 | boolean | true |
-| size | 表格尺寸,影响表格行 `padding` | "default"\|"middle"\|"small" | "default" | **1.0.0** |
-| sticky | 固定表头 | boolean \| { top: number } | false | **2.21.0** |
-| title | 表格标题 | ReactNode<br/>\|(pageData: RecordType[]) => ReactNode |  |
-| virtualized | 虚拟化配置 | Virtualized | false | **0.33.0** |
-| virtualized.itemSize | 每行的高度 | number\|(index: number) => number | 56 | **0.33.0** |
-| virtualized.onScroll | 虚拟化滚动回调方法 | ( scrollDirection?: 'forward' \| 'backward', scrollOffset?: number, scrollUpdateWasRequested?: boolean ) => void |  | **0.33.0** |
-| onChange | 分页、排序、筛选变化时触发 | ({ pagination: TablePaginationProps, <br/>filters: Array<\*>, sorter: object, extra: any }) => void |  |
-| onExpand | 点击行展开图标时进行触发 | (expanded: boolean, record: RecordType, DOMEvent: MouseEvent) => void |  | 第三个参数 DOMEvent 需版本 **>=0.28.0** |
-| onExpandedRowsChange | 展开的行变化时触发 | (rows: RecordType[]) => void |  |
-| onGroupedRow | 类似于 onRow,不过这个参数单独用于定义分组表头的行属性 | (record: RecordType, index: number) => object |  | **0.29.0** |
-| onHeaderRow | 设置头部行属性,返回的对象会被合并传给表头行 | (columns: Column[], index: number) => object |  |
-| onRow | 设置行属性,返回的对象会被合并传给表格行 | (record: RecordType, index: number) => object |  |
+| empty | 无数据时展示的内容                                                           | ReactNode | '暂无数据' |
+| expandCellFixed | 展开图标所在列是否固定,与 Column 中的 fixed 取值相同                                  | boolean\|string | false |
+| expandIcon | 自定义展开按钮,传 `false` 关闭默认的渲染                                           | boolean \| ReactNode<br/> \| (expanded: boolean) => ReactNode |  |
+| expandedRowKeys | 展开的行,传入此参数时行展开功能将受控                                                 | (string \| number)[] |  |
+| expandedRowRender | 额外的展开行                                                              | (record: object, index: number, expanded: boolean) => ReactNode |  |
+| expandAllRows | 是否展开所有行                                                             | boolean | false | **1.30.0** |
+| expandAllGroupRows | 是否展开分组行                                                             | boolean | false | **1.30.0** |
+| expandRowByClick | 点击行时是否展开可展开行                                                        | boolean | false | **1.31.0** |
+| footer | 表格尾部                                                                | ReactNode<br/>\|(pageData: object) => ReactNode |  |
+| getVirtualizedListRef | 返回虚拟化表格所用 VariableSizeList 的 ref,仅在配置 virtualized 时有效               | (ref: React.RefObject) => void |  | **1.20.0** |
+| groupBy | 分组依据,一般为 dataSource 元素中某个键名或者返回值为字符串、数字的一个方法                        | string\|number<br/>\|(record: RecordType) => string\|number |  | **0.29.0** |
+| hideExpandedColumn | 当表格可展开时,展开按钮默认会与第一列文案渲染在同一个单元格内,设为 false 时默认将展开按钮单独作为一列渲染           | boolean | true |
+| indentSize | 树形结构 TableCell 的缩进大小                                                | number | 20 |
+| keepDOM | 折叠行时是否不销毁被折叠的 DOM                                                   | boolean | false |
+| loading | 页面是否加载中                                                             | boolean | false |
+| pagination | 分页组件配置                                                              | boolean\|TablePaginationProps | true |
+| prefixCls | 样式名前缀                                                               | string |  |
+| renderGroupSection | 表头渲染方法                                                              | (groupKey?: string \| number, group?: string[] \| number[]) => ReactNode |  | **0.29.0** |
+| renderPagination | 自定义分页器渲染方法                                                          | (paginationProps?: TablePaginationProps) => ReactNode |  | **1.13.0** |
+| resizable | 是否开启伸缩列功能,需要进行伸缩的列必须要提供 width 的值                                    | boolean\|[Resizable](#Resizable) | false |
+| rowExpandable | 传入该参数时,Table 作行渲染时会调用该函数,返回值用于判断该行是否可展开,返回值为 false 时关闭可展开按钮的渲染      | (record: object) => boolean |  | **0.27.0** |
+| rowKey | 表格行 key 的取值,可以是字符串或一个函数                                             | string<br/>\|(record: RecordType) => string | 'key' |
+| rowSelection | 表格行是否可选择,详见 [rowSelection](#rowSelection)                           | object | - |
+| scroll | 表格是否可滚动,配置滚动区域的宽或高,详见 [scroll](#scroll)                             | object | - |
+| showHeader | 是否显示表头                                                              | boolean | true |
+| size | 表格尺寸,影响表格行 `padding`                                                | "default"\|"middle"\|"small" | "default" | **1.0.0** |
+| sticky | 固定表头                                                                | boolean \| { top: number } | false | **2.21.0** |
+| title | 表格标题                                                                | ReactNode<br/>\|(pageData: RecordType[]) => ReactNode |  |
+| virtualized | 虚拟化配置                                                               | Virtualized | false | **0.33.0** |
+| virtualized.itemSize | 每行的高度                                                               | number\|(index: number) => number | 56 | **0.33.0** |
+| virtualized.onScroll | 虚拟化滚动回调方法                                                           | ( scrollDirection?: 'forward' \| 'backward', scrollOffset?: number, scrollUpdateWasRequested?: boolean ) => void |  | **0.33.0** |
+| onChange | 分页、排序、筛选变化时触发                                                       | ({ pagination: TablePaginationProps, <br/>filters: Array<\*>, sorter: object, extra: any }) => void |  |
+| onExpand | 点击行展开图标时进行触发                                                        | (expanded: boolean, record: RecordType, DOMEvent: MouseEvent) => void |  | 第三个参数 DOMEvent 需版本 **>=0.28.0** |
+| onExpandedRowsChange | 展开的行变化时触发                                                           | (rows: RecordType[]) => void |  |
+| onGroupedRow | 类似于 onRow,不过这个参数单独用于定义分组表头的行属性                                      | (record: RecordType, index: number) => object |  | **0.29.0** |
+| onHeaderRow | 设置头部行属性,返回的对象会被合并传给表头行                                              | (columns: Column[], index: number) => object |  |
+| onRow | 设置行属性,返回的对象会被合并传给表格行                                                | (record: RecordType, index: number) => object |  |
 
 一些上面用到的类型定义:
 
@@ -5646,4 +5646,4 @@ function Demo() {
 <!-- ## 相关物料
 ```material
 196,110,104,113,226
-``` -->
+``` -->

+ 22 - 0
content/start/changelog/index-en-US.md

@@ -16,6 +16,24 @@ Version:Major.Minor.Patch (follow the **Semver** specification)
 
 ---
 
+#### 🎉 2.52.0 (2024-02-06)
+- 【Fix】
+  - fix the problem that onBlur is not triggered when clicking outside the Select button after clicking the clear button.  [#1989](https://github.com/DouyinFE/semi-design/issues/1989)
+  - fix preloadGapImage [@nekocode](https://github.com/nekocode)
+  - fix timepicker value props give undefined cause type error.
+  - Fixed the issue where Cascader's options panel displays all options when search content is English commas
+  - Fixed the problem of multi-selection and showClear's Cascader. After clicking the clear button, the options panel did not switch from the search state to the normal state.
+  - Fix the issue of incorrect border width token in Select part
+  - Fixed the problem that after Cascader's key generation rules in keyEntities changed, the value parameter in triggerRender's parameters was inconsistent with the original one (Affected Scope 2.51.0~2.51.3)
+  - Fix the problem of inaccurate positioning when the popupCountainer of the floating layer component or its parent is scaled
+  - fixed rowSelection hidden bug in resizable Table  [#2036](https://github.com/DouyinFE/semi-design/issues/2036)
+  - fix the problem that after clicking the clear button in Datepicker, the year and month values of the panel would not be restored to the initial state.
+  - Fix infinite update bug triggered by passing illegal value NaN in DatePicker prop value  [#1846](https://github.com/DouyinFE/semi-design/issues/1846)
+  - Fix the problem that there is no className of Option in the renderOptionItem input parameter of Select
+  - Fixed the issue where the original overflow: hidden on the body will be deleted when modal is uninstalled without opening it. (version range 2.51.0~2.51.3)
+- 【Chore】
+  - Form withField introduces the type declaration of utility-types from import to import type (which has no impact)
+
 #### 🎉 2.52.0-beta.0 (2024-01-31)
 - 【Fix】
   - fix Table getCurrentPageData type  [@marshcat0](https://github.com/marshcat0)
@@ -30,6 +48,10 @@ Version:Major.Minor.Patch (follow the **Semver** specification)
   - DatePicker support presets start and end function type  [#2038](https://github.com/DouyinFE/semi-design/issues/2038)
 
 
+#### 🎉 2.51.4 (2024-01-31)
+- 【Fix】
+    - Fixed the problem that after Cascader's key generation rules in keyEntities changed, the value parameter in triggerRender's parameters was inconsistent with the original one (Affected Scope 2.51.0~2.51.3) [#2051](https://github.com/DouyinFE/semi-design/pull/2051)
+
 #### 🎉 2.51.3 (2024-01-19)
 - 【Fix】
     - Fixed Table propTypes is removed in prod mode

+ 22 - 0
content/start/changelog/index.md

@@ -13,6 +13,24 @@ Semi 版本号遵循 **Semver** 规范(主版本号-次版本号-修订版本
 -   修订版本号(patch):仅会进行 bugfix,发布时间不限
 -   不同版本间的详细关系,可查阅 [FAQ](/zh-CN/start/faq)
 
+#### 🎉 2.52.0 (2024-02-06)
+- 【Fix】
+  - 修复 Select 点击清除按钮以后,点击外部不触发 onBlur 问题  [#1989](https://github.com/DouyinFE/semi-design/issues/1989)
+  - 修复 preloadGapImage [@nekocode](https://github.com/nekocode)
+  - 修复 timepicker value 传入 undefined 时类型错误的问题
+  - 修复 Cascader 在搜索内容为英文逗号时选项面板显示全部选项问题
+  - 修复多选,showClear 的 Cascader 在点击清除按钮后,选项面板没有从搜索状态切换到普通状态问题
+  - 修复 Select 部分 border width token 不正确的问题
+  - 修复 Cascader 在 keyEntities 中的 key 生成规则变化后,triggerRender 的参数中的value 参数和原来不一致问题(影响范围 2.51.0~2.51.3)
+  - 修复当浮层组件的 popupCountainer 或其父级缩放后,定位不准确的问题
+  - 修复 resizable Table 行选择隐藏时多出来一列  [#2036](https://github.com/DouyinFE/semi-design/issues/2036)
+  - 修复 Datepicker 点击清除按钮后,面板年月值不会还原到初始状态问题
+  - 修复 DatePicker prop value 传入非法值 NaN 触发无限更新问题  [#1846](https://github.com/DouyinFE/semi-design/issues/1846)
+  - 修复 Select 的 renderOptionItem 入参中没有 Option 的 className 的问题
+  - 修复 modal 在不打开直接卸载时候,会将 body 上原有的 overflow: hidden 删除的问题(影响范围 2.51.0~2.51.3)
+- 【Chore】
+  - Form withField 引入 utility-types 的类型声明从import 改为 import type,对使用方无影响
+
 #### 🎉 2.52.0-beta.0 (2024-01-31)
 - 【Fix】
     - 修复 Table getCurrentPageData 的类型  [@marshcat0](https://github.com/marshcat0)
@@ -27,6 +45,10 @@ Semi 版本号遵循 **Semver** 规范(主版本号-次版本号-修订版本
     - DatePicker presets start 和 end 支持函数类型  [#2038](https://github.com/DouyinFE/semi-design/issues/2038)
 
 
+#### 🎉 2.51.4 (2024-01-31)
+- 【Fix】
+    - 修复 Cascader 在 keyEntities 中的 key 生成规则变化后,triggerRender 的参数中的value 参数和原来不一致问题(影响范围 2.51.0~2.51.3)[#2051](https://github.com/DouyinFE/semi-design/pull/2051)
+
 #### 🎉 2.51.3 (2024-01-19)
 - 【Fix】
     - 修复 Table propTypes 被打包工具移除掉导致报错问题

+ 34 - 0
cypress/e2e/datePicker.spec.js

@@ -803,6 +803,28 @@ describe('DatePicker', () => {
         })
     });
 
+    it('month type after click clear button, restore to initial state', () => {
+        cy.visit('http://localhost:6006/iframe.html?id=datepicker--month-picker&viewMode=story');
+
+        const now = new Date();
+        const year = now.getFullYear();
+        const month = now.getMonth() + 1;
+
+        // click MonthPicker with controlledValue
+        cy.get('.semi-datepicker .semi-input').eq(4).click();
+        cy.get('.semi-datepicker .semi-input-clearbtn').click();
+        cy.get('.semi-scrolllist-item-sel').eq(0).contains(`${year}年`);
+        cy.get('.semi-scrolllist-item-sel').eq(1).contains(`${month}月`);
+
+        cy.get('body').click('right');
+        cy.get('.semi-datepicker .semi-input').eq(-1).click();
+        cy.get('.semi-datepicker .semi-input-clearbtn').click();
+        cy.get('.semi-scrolllist-item-sel').eq(0).contains(`${year}年`);
+        cy.get('.semi-scrolllist-item-sel').eq(2).contains(`${year}年`);
+        cy.get('.semi-scrolllist-item-sel').eq(1).contains(`${month}月`);
+        cy.get('.semi-scrolllist-item-sel').eq(3).contains(`${month+1}月`);
+    });
+
     it('test split first inset input + dateTimeRange', () => {
         cy.visit('http://localhost:6006/iframe.html?id=datepicker--fix-need-confirm-controlled&viewMode=story');
         cy.get('.semi-input').eq(0).click();
@@ -817,6 +839,18 @@ describe('DatePicker', () => {
         cy.get('.semi-input').eq(1).should('have.value', '');
     });
 
+    it('test DatePicker props value is NaN', () => {
+        cy.visit('http://localhost:6006/iframe.html?id=datepicker--fixed-na-n&viewMode=story');
+        cy.get('.semi-input').eq(0).should('have.value', '');
+        cy.get('.semi-input').eq(1).should('have.value', '');
+        cy.get('.semi-input').eq(0).click();
+        cy.get('.semi-datepicker-day').contains('15').trigger('click');
+        cy.get('.semi-datepicker-day').contains('15').trigger('click');
+        cy.get('.semi-button').contains('set NaN').click();
+        cy.get('.semi-input').eq(0).should('have.value', '');
+        cy.get('.semi-input').eq(1).should('have.value', '');
+    });
+
     it('presets start and end support function type', () => {
         cy.visit('http://localhost:6006/iframe.html?id=datepicker--presets-function-type&viewMode=story');
         cy.get('.semi-input').eq(0).click();

+ 21 - 12
cypress/e2e/select.spec.js

@@ -89,33 +89,38 @@ describe('Select', () => {
 
         cy.viewport(1000, 1000);
 
-        cy.get('.semi-select-selection').eq(0).click();
+        cy.get('[data-cy=singleDefault]').click();
         cy.get('.semi-select-option').eq(1).click();
         cy.root().click('right');
         cy.get('@consoleLog').should('be.calledWith', 'single autoFocus onBlur');
         cy.get('@consoleLog').should('be.calledWith', 'single default onBlur');
 
-        cy.get('.semi-select-selection').eq(1).click();
+        cy.get('[data-cy=singleFilter]').click();
         cy.get('.semi-select-option').eq(1).click();
         cy.root().click('right');
         cy.get('@consoleLog').should('be.calledWith', 'single filter onBlur');
 
-        cy.get('.semi-select-selection').eq(3).click();
+        cy.get('[data-cy=singleClickToHide]').click();
         cy.get('.semi-select-option').eq(1).click();
         cy.root().click('right');
         cy.get('@consoleLog').should('be.calledWith', 'single clickToHide onBlur');
 
-        cy.get('.semi-select-selection').eq(4).click();
+        cy.get('[data-cy=singleShowClear]').click();
+        cy.get('.semi-select-option').eq(1).click();
+        cy.root().click('right');
+        cy.get('@consoleLog').should('be.calledWith', 'single showClear onBlur');
+
+        cy.get('[data-cy=multipleDefault]').click();
         cy.get('.semi-select-option').eq(1).click();
         cy.root().click('right');
         cy.get('@consoleLog').should('be.calledWith', 'multiple default onBlur');
 
-        cy.get('.semi-select-selection').eq(5).click();
+        cy.get('[data-cy=multipleFilter]').click();
         cy.get('.semi-select-option').eq(1).click();
         cy.root().click('right');
         cy.get('@consoleLog').should('be.calledWith', 'multiple filter onBlur');
 
-        cy.get('.semi-select-selection').eq(6).click();
+        cy.get('[data-cy=multipleClickToHide]').click();
         cy.get('.semi-select-option').eq(1).click();
         cy.root().click('right');
         cy.get('@consoleLog').should('be.calledWith', 'multiple clickToHide onBlur');
@@ -131,29 +136,33 @@ describe('Select', () => {
 
         cy.viewport(1000, 1000);
 
-        cy.get('.semi-select-selection').eq(0).click();
+        cy.get('[data-cy=singleDefault]').click();
         cy.root().click('right');
         cy.get('@consoleLog').should('be.calledWith', 'single autoFocus onBlur');
         cy.get('@consoleLog').should('be.calledWith', 'single default onBlur');
 
-        cy.get('.semi-select-selection').eq(1).click();
+        cy.get('[data-cy=singleFilter]').click();
         cy.root().click('right');
         cy.get('@consoleLog').should('be.calledWith', 'single filter onBlur');
 
-        cy.get('.semi-select-selection').eq(3).click();
+        cy.get('[data-cy=singleClickToHide]').click();
         cy.root().click('right');
         cy.get('@consoleLog').should('be.calledWith', 'single clickToHide onBlur');
 
-        cy.get('.semi-select-selection').eq(4).click();
+        cy.get('[data-cy=singleShowClear]').click();
+        cy.root().click('right');
+        cy.get('@consoleLog').should('be.calledWith', 'single showClear onBlur');
+
+        cy.get('[data-cy=multipleDefault]').click();
         cy.get('.semi-select-option').eq(1).click();
         cy.root().click('right');
         cy.get('@consoleLog').should('be.calledWith', 'multiple default onBlur');
 
-        cy.get('.semi-select-selection').eq(5).click();
+        cy.get('[data-cy=multipleFilter]').click();
         cy.root().click('right');
         cy.get('@consoleLog').should('be.calledWith', 'multiple filter onBlur');
 
-        cy.get('.semi-select-selection').eq(6).click();
+        cy.get('[data-cy=multipleClickToHide]').click();
         cy.root().click('right');
         cy.get('@consoleLog').should('be.calledWith', 'multiple clickToHide onBlur');
 

+ 9 - 1
cypress/e2e/table.spec.js

@@ -247,6 +247,14 @@ describe('table', () => {
         cy.get('.semi-table-thead .semi-checkbox-checked').should('exist')
     });
 
+    it('test hidden rowSelection in resizable Table', () => {
+        cy.visit('http://localhost:6006/iframe.html?id=table--fixed-row-selection-hidden-resizable&viewMode=story');
+        cy.get('.semi-button').eq(0).click();
+        cy.get('.semi-table-column-selection').should('not.exist');
+        cy.get('.semi-button').eq(0).click();
+        cy.get('.semi-table-column-selection').should('exist');
+    });
+
     it('test renderFilterDropdown', () => {
         cy.visit('http://localhost:6006/iframe.html?args=&id=table--feat-render-filter-dropdown&viewMode=story');
 
@@ -279,4 +287,4 @@ describe('table', () => {
         cy.get('.semi-button').contains('直接关闭').click();
         cy.get('.semi-dropdown').should('not.exist');
     });
-});
+});

+ 1 - 1
lerna.json

@@ -1,5 +1,5 @@
 {
     "useWorkspaces": true,
     "npmClient": "yarn",
-    "version": "2.52.0-beta.1"
+    "version": "2.52.0"
 }

+ 1 - 1
package.json

@@ -48,7 +48,7 @@
     "dependencies": {
         "@douyinfe/semi-site-banner": "^0.1.3",
         "@douyinfe/semi-site-doc-style": "0.0.1",
-        "@douyinfe/semi-site-header": "^0.0.28",
+        "@douyinfe/semi-site-header": "^0.0.29",
         "@douyinfe/semi-site-markdown-blocks": "^0.0.9",
         "@mdx-js/mdx": "1.6.22",
         "@mdx-js/react": "^1.6.22",

+ 3 - 3
packages/semi-animation-react/package.json

@@ -1,6 +1,6 @@
 {
     "name": "@douyinfe/semi-animation-react",
-    "version": "2.52.0-beta.1",
+    "version": "2.52.0",
     "description": "motion library for semi-ui-react",
     "keywords": [
         "motion",
@@ -25,8 +25,8 @@
         "prepublishOnly": "npm run build:lib"
     },
     "dependencies": {
-        "@douyinfe/semi-animation": "2.52.0-beta.1",
-        "@douyinfe/semi-animation-styled": "2.52.0-beta.1",
+        "@douyinfe/semi-animation": "2.52.0",
+        "@douyinfe/semi-animation-styled": "2.52.0",
         "classnames": "^2.2.6"
     },
     "devDependencies": {

+ 1 - 1
packages/semi-animation-styled/package.json

@@ -1,6 +1,6 @@
 {
     "name": "@douyinfe/semi-animation-styled",
-    "version": "2.52.0-beta.1",
+    "version": "2.52.0",
     "description": "semi styled animation",
     "keywords": [
         "semi",

+ 1 - 1
packages/semi-animation/package.json

@@ -1,6 +1,6 @@
 {
     "name": "@douyinfe/semi-animation",
-    "version": "2.52.0-beta.1",
+    "version": "2.52.0",
     "description": "animation base library for semi-ui",
     "keywords": [
         "animation",

+ 1 - 1
packages/semi-eslint-plugin/package.json

@@ -1,6 +1,6 @@
 {
     "name": "eslint-plugin-semi-design",
-    "version": "2.52.0-beta.1",
+    "version": "2.52.0",
     "description": "semi ui eslint plugin",
     "keywords": [
         "semi",

+ 17 - 10
packages/semi-foundation/cascader/foundation.ts

@@ -1,7 +1,6 @@
 import { isEqual, get, difference, isUndefined, assign, cloneDeep, isEmpty, isNumber, includes, isFunction, isObject } from 'lodash';
 import BaseFoundation, { DefaultAdapter } from '../base/foundation';
 import {
-    filter,
     findAncestorKeys,
     calcCheckedKeysForUnchecked,
     calcCheckedKeysForChecked,
@@ -11,11 +10,13 @@ import {
 } from '../tree/treeUtil';
 import { Motion } from '../utils/type';
 import {
+    filter,
     convertDataToEntities,
     normalizedArr,
     isValid,
     calcMergeType,
-    getKeysByValuePath
+    getKeysByValuePath,
+    getKeyByPos
 } from './util';
 import { strings } from './constants';
 import isEnterPress from '../utils/isEnterPress';
@@ -56,6 +57,8 @@ export interface BasicEntity {
     parentKey?: string;
     /* key path */
     path: Array<string>;
+    /* pos in treeData */
+    pos: string;
     /* value path */
     valuePath: Array<string>
 }
@@ -908,8 +911,8 @@ export default class CascaderFoundation extends BaseFoundation<CascaderAdapter,
                     if (_notExist) {
                         return false;
                     }
-                    const filteredPath = this.getItemPropPath(key, treeNodeFilterProp).join();
-                    return filter(sugInput, data, filterTreeNode, false, filteredPath);
+                    const filteredPath = this.getItemPropPath(key, treeNodeFilterProp);
+                    return filter(sugInput, data, filterTreeNode, filteredPath);
                 })
                 .filter(
                     item => (filterTreeNode && !filterLeafOnly) ||
@@ -932,6 +935,7 @@ export default class CascaderFoundation extends BaseFoundation<CascaderAdapter,
         const isControlled = this._isControlledComponent();
         const newState: Partial<BasicCascaderInnerData> = {};
         if (multiple) {
+            newState.isSearching = false;
             this._adapter.updateInputValue('');
             this._adapter.notifyOnSearch('');
             newState.checkedKeys = new Set([]);
@@ -1026,17 +1030,20 @@ export default class CascaderFoundation extends BaseFoundation<CascaderAdapter,
         this._adapter.notifyListScroll(e, { panelIndex: ind, activeNode: data });
     }
 
-    handleTagRemove(e: any, tagValuePath: string[]) {
+    handleTagRemoveByKey = (key: string) => {
         const { keyEntities } = this.getStates();
         const { disabled } = this.getProps();
         if (disabled) {
             /* istanbul ignore next */
             return;
         }
-        const removedItem = (Object.values(keyEntities) as BasicEntity[])
-            .filter(item => isEqual(item.valuePath, tagValuePath))[0];
-        !isEmpty(removedItem) &&
-        !removedItem.data.disabled &&
-        this._handleMultipleSelect(removedItem);
+        const removedItem = keyEntities[key] ?? {};
+        !removedItem?.data?.disable && this._handleMultipleSelect(removedItem);
+    }
+
+    handleTagRemoveInTrigger = (pos: string) => {
+        const { treeData } = this.getStates();
+        const key = getKeyByPos(pos, treeData);
+        this.handleTagRemoveByKey(key);
     }
 }

+ 43 - 0
packages/semi-foundation/cascader/util.ts

@@ -21,6 +21,36 @@ export function normalizedArr(val: any) {
     }
 }
 
+/**
+ * @returns whether option includes sugInput.
+ * When filterTreeNode is a function,returns the result of filterTreeNode which called with (sugInput, target, option).
+ */
+export function filter(sugInput: string, option: any, filterTreeNode: any, filteredPath?: string[]) {
+    if (!filterTreeNode) {
+        return true;
+    }
+    let filterFn = filterTreeNode;
+    let target: string;
+    if (typeof filterTreeNode === 'boolean') {
+        filterFn = (targetVal: string, val: string) => {
+            const input = targetVal.toLowerCase();
+            return val
+                .toLowerCase()
+                .includes(input);
+        };
+        // 当 filterTreeNode 是 bool 类型时,由 Cascader 内部判断是否符合筛选条件,使用 join('') 修复搜索英文逗号导致所有数据被匹配问题
+        // When the type of of filterTreeNode is bool, Cascader internally determines whether it meets the filtering conditions.
+        // Use join('') to fix the problem that searching for English commas causes all data to be matched.
+        target = filteredPath.join('');
+    } else {
+        // 当 filterTreeNode 为函数类型时,由用户判断是否符合筛选条件,使用 join(), 和原来保持一致
+        // When the type of of filterTreeNode is function, the user determines whether it meets the filtering conditions, 
+        // uses join() to be consistent with the previous version.
+        target = filteredPath.join();
+    }
+    return filterFn(sugInput, target, option);
+}
+
 /**
  * Traverse all the data by `treeData`.
  */
@@ -31,10 +61,12 @@ function traverseDataNodes(treeNodes: any, callback: any) {
         // Process node if is not root
         if (node) {
             const key = parent ? `${parent.key}${VALUE_SPLIT}${node.value}` : node.value;
+            const pos = parent ? getPosition(parent.pos, ind) : `${ind}`;
             item = {
                 data: { ...node },
                 ind,
                 key,
+                pos,
                 level: parent ? parent.level + 1 : 0,
                 parentKey: parent ? parent.key : null,
                 path: parent ? [...parent.path, key] : [key],
@@ -74,6 +106,17 @@ export function getValuePathByKey(key: string) {
     return key.split(VALUE_SPLIT);
 }
 
+export function getKeyByPos(pos: string, treeData: any) {
+    const posArr = pos.split('-').map(item => Number(item));
+    let resultData = treeData;
+    let valuePath = [];
+    posArr.forEach((item, index) => {
+        resultData = index === 0 ? resultData[item] : resultData?.children?.[item];
+        valuePath.push(resultData?.value);
+    });
+    return getKeyByValuePath(valuePath);
+}
+
 export function convertDataToEntities(dataNodes: any) {
     const keyEntities: any = {};
 

+ 3 - 0
packages/semi-foundation/datePicker/foundation.ts

@@ -18,6 +18,7 @@ import type { Type, DateInputFoundationProps, InsetInputValue } from './inputFou
 import type { MonthsGridFoundationProps } from './monthsGridFoundation';
 import type { WeekStartNumber } from './_utils/getMonthTable';
 import isValidTimeZone from './_utils/isValidTimeZone';
+import warning from '../utils/warning';
 
 export type ValidateStatus = ArrayElement<typeof strings.STATUS>;
 export type InputSize = ArrayElement<typeof strings.SIZE_SET>;
@@ -292,6 +293,8 @@ export default class DatePickerFoundation extends BaseFoundation<DatePickerAdapt
                         parsedV = zonedTimeToUtc(parsedV, prevTimeZone);
                     }
                     result.push(isValidTimeZone(timeZone) ? utcToZonedTime(parsedV, timeZone) : parsedV);
+                } else {
+                    warning(true, `[Semi DatePicker] value cannot be parsed, value: ${String(v)}`);
                 }
             }
         }

+ 1 - 0
packages/semi-foundation/dropdown/dropdown.scss

@@ -7,6 +7,7 @@ $module: #{$prefix}-dropdown;
 .#{$module} {
     @include font-size-regular;
     &-wrapper {
+        overflow-y:auto; // prevent flow out of the radius limit area
         @include shadow-elevated;
         position: relative;
         z-index: $z-dropdown;

+ 4 - 0
packages/semi-foundation/image/previewInnerFoundation.ts

@@ -226,6 +226,10 @@ export default class PreviewInnerFoundation<P = Record<string, any>, S = Record<
         }
 
         const preloadImages = getPreloadImagArr(imgSrc, currentIndex, preLoadGap, infinite);
+        if (preloadImages.length === 0) {
+            return;
+        }
+
         const Img = new Image();
         let index = 0;
         function callback(e: any) {

+ 2 - 2
packages/semi-foundation/package.json

@@ -1,13 +1,13 @@
 {
     "name": "@douyinfe/semi-foundation",
-    "version": "2.52.0-beta.1",
+    "version": "2.52.0",
     "description": "",
     "scripts": {
         "build:lib": "node ./scripts/compileLib.js",
         "prepublishOnly": "npm run build:lib"
     },
     "dependencies": {
-        "@douyinfe/semi-animation": "2.52.0-beta.1",
+        "@douyinfe/semi-animation": "2.52.0",
         "async-validator": "^3.5.0",
         "classnames": "^2.2.6",
         "date-fns": "^2.29.3",

+ 2 - 0
packages/semi-foundation/select/foundation.ts

@@ -1022,6 +1022,8 @@ export default class SelectFoundation extends BaseFoundation<SelectAdapter> {
         if (filter) {
             this.clearInput(e);
         }
+        // after click showClear button, the select need to be focused
+        this.focus();
         this.clearSelected();
         // prevent this click open dropdown
         e.stopPropagation();

+ 12 - 2
packages/semi-foundation/tooltip/foundation.ts

@@ -450,7 +450,10 @@ export default class Tooltip<P = Record<string, any>, S = Record<string, any>> e
         const isTriggerNearTop = middleY - containerRect.top < containerRect.bottom - middleY;
         
         const isWrapperWidthOverflow = wrapperRect.width > innerWidth;
-
+        const scaled = Math.abs(wrapperRect?.width - this._adapter.getContainer()?.clientWidth) > 1;
+        if (scaled) {
+            SPACING = SPACING * wrapperRect.width/this._adapter.getContainer().clientWidth;
+        }
         switch (position) {
             case 'top':
                 // left = middleX;
@@ -570,6 +573,14 @@ export default class Tooltip<P = Record<string, any>, S = Record<string, any>> e
         left = left - containerRect.left;
         top = top - containerRect.top;
 
+        if (scaled) {
+            left /= wrapperRect.width/this._adapter.getContainer().clientWidth;
+        }
+
+        if (scaled) {
+            top /= wrapperRect.height/this._adapter.getContainer().clientHeight;
+        }
+
         /**
          * container为body时,如果position不为relative或absolute,这时trigger计算出的top/left会根据html定位(initial containing block)
          * 此时如果body有margin,则计算出的位置相对于body会有问题 fix issue #1368
@@ -828,7 +839,6 @@ export default class Tooltip<P = Record<string, any>, S = Record<string, any>> e
 
             const halfHeight = triggerRect.height / 2;
             const halfWidth = triggerRect.width / 2;
-
             // 视口, 原空间与反向空间是否都不足判断
             // Viewport, whether the original space and the reverse space are insufficient to judge
             const isViewYOverFlow = this.isOverFlow(clientTop - marginTop, restClientBottom - marginBottom, wrapperRect.height + spacing);

+ 2 - 3
packages/semi-foundation/tree/treeUtil.ts

@@ -422,14 +422,13 @@ export function calcMotionKeys(oldKeySet: Set<string>, newKeySet: Set<string>, k
 /**
  * @returns whether option includes sugInput.
  * When filterTreeNode is a function,returns the result of filterTreeNode which called with (sugInput, target, option).
- * The filteredPath parameter will only be passed in when the Cascader calls the filter function
  */
-export function filter(sugInput: string, option: any, filterTreeNode: any, filterProps: any, filteredPath?: string) {
+export function filter(sugInput: string, option: any, filterTreeNode: any, filterProps: any) {
     if (!filterTreeNode) {
         return true;
     }
     let filterFn = filterTreeNode;
-    let target = filteredPath ?? option;
+    let target = option;
     if (typeof filterTreeNode === 'boolean') {
         filterFn = (targetVal: string, val: any) => {
             const input = targetVal.toLowerCase();

+ 1 - 1
packages/semi-icons-lab/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@douyinfe/semi-icons-lab",
-  "version": "2.52.0-beta.1",
+  "version": "2.52.0",
   "description": "semi icons lab",
   "keywords": [
     "semi",

+ 1 - 1
packages/semi-icons/package.json

@@ -1,6 +1,6 @@
 {
     "name": "@douyinfe/semi-icons",
-    "version": "2.52.0-beta.1",
+    "version": "2.52.0",
     "description": "semi icons",
     "keywords": [
         "semi",

+ 1 - 1
packages/semi-illustrations/package.json

@@ -1,6 +1,6 @@
 {
     "name": "@douyinfe/semi-illustrations",
-    "version": "2.52.0-beta.1",
+    "version": "2.52.0",
     "description": "semi illustrations",
     "keywords": [
         "semi",

+ 2 - 2
packages/semi-next/package.json

@@ -1,6 +1,6 @@
 {
     "name": "@douyinfe/semi-next",
-    "version": "2.52.0-beta.1",
+    "version": "2.52.0",
     "description": "Plugin that support Semi Design in Next.js",
     "author": "伍浩威 <[email protected]>",
     "homepage": "",
@@ -23,7 +23,7 @@
         "typescript": "^4"
     },
     "dependencies": {
-        "@douyinfe/semi-webpack-plugin": "2.52.0-beta.1"
+        "@douyinfe/semi-webpack-plugin": "2.52.0"
     },
     "gitHead": "eb34a4f25f002bb4cbcfa51f3df93bed868c831a"
 }

+ 1 - 1
packages/semi-rspack/package.json

@@ -1,6 +1,6 @@
 {
     "name": "@douyinfe/semi-rspack-plugin",
-    "version": "2.52.0-beta.1",
+    "version": "2.52.0",
     "description": "",
     "homepage": "",
     "license": "MIT",

+ 1 - 1
packages/semi-scss-compile/package.json

@@ -1,6 +1,6 @@
 {
     "name": "@douyinfe/semi-scss-compile",
-    "version": "2.52.0-beta.1",
+    "version": "2.52.0",
     "description": "compile semi scss to css",
     "author": "[email protected]",
     "license": "MIT",

+ 1 - 1
packages/semi-theme-default/package.json

@@ -1,6 +1,6 @@
 {
     "name": "@douyinfe/semi-theme-default",
-    "version": "2.52.0-beta.1",
+    "version": "2.52.0",
     "description": "semi-theme-default",
     "keywords": [
         "semi-theme",

+ 1 - 1
packages/semi-ui/avatar/TopSlotSvg.tsx

@@ -5,7 +5,7 @@ import React from 'react';
 
 
 const TopSlotSvg = ({ gradientStart, gradientEnd }: {gradientStart: string;gradientEnd: string})=> {
-    const id = getUuidShort()
+    const id = getUuidShort();
     return <svg xmlns="http://www.w3.org/2000/svg" width="51" height="52" viewBox="0 0 51 52" fill="none">
         <g filter="url(#filter0_d_6_2)">
             <path

+ 2 - 2
packages/semi-ui/cascader/__test__/cascader.test.js

@@ -1257,7 +1257,7 @@ describe('Cascader', () => {
         const args = firstCall.args[0]; 
         /* check arguments of triggerRender */
         expect(args.value.size).toEqual(1);
-        expect(args.value).toEqual(new Set(['Asia']));
+        expect(args.value).toEqual(new Set('0'));
         cascaderAutoMerge.unmount();
 
         const spyTriggerRender2 = sinon.spy(() => <span>123</span>);
@@ -1272,7 +1272,7 @@ describe('Cascader', () => {
         const args2 = firstCall2.args[0]; 
         /* check arguments of triggerRender */
         expect(args2.value.size).toEqual(4);
-        expect(args2.value).toEqual(new Set(["Asia","Asia_SEMI_CASCADER_SPLIT_China","Asia_SEMI_CASCADER_SPLIT_China_SEMI_CASCADER_SPLIT_Beijing","Asia_SEMI_CASCADER_SPLIT_China_SEMI_CASCADER_SPLIT_Shanghai"]));
+        expect(args2.value).toEqual(new Set(['0','0-0','0-0-1','0-0-0']));
         cascaderNoAutoMerge.unmount();
     });
 

+ 25 - 21
packages/semi-ui/cascader/index.tsx

@@ -17,7 +17,7 @@ import { numbers as popoverNumbers } from '@douyinfe/semi-foundation/popover/con
 import { isSet, isEqual, isString, isEmpty, isFunction, isNumber, noop, flatten, isObject } from 'lodash';
 import '@douyinfe/semi-foundation/cascader/cascader.scss';
 import { IconClear, IconChevronDown } from '@douyinfe/semi-icons';
-import { convertDataToEntities, calcMergeType, getKeyByValuePath } from '@douyinfe/semi-foundation/cascader/util';
+import { convertDataToEntities, calcMergeType, getKeyByValuePath, getKeyByPos } from '@douyinfe/semi-foundation/cascader/util';
 import { calcCheckedKeys, normalizeKeyList, calcDisabledKeys } from '@douyinfe/semi-foundation/tree/treeUtil';
 import ConfigContext, { ContextValue } from '../configProvider/context';
 import BaseComponent, { ValidateStatus } from '../_base/baseComponent';
@@ -514,13 +514,14 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
         this.foundation.handleInputChange(value);
     };
 
-    handleTagRemove = (e: any, tagValuePath: Array<string | number>) => {
-        this.foundation.handleTagRemove(e, tagValuePath);
-    };
+    handleTagRemoveInTrigger = (pos: string) => {
+        this.foundation.handleTagRemoveInTrigger(pos);
+    }
 
-    handleRemoveByKey = (key) => {
-        const { keyEntities } = this.state;
-        this.handleTagRemove(null, keyEntities[key].valuePath);
+    handleTagClose = (tagChildren: React.ReactNode, e: React.MouseEvent<HTMLElement>, tagKey: string | number) => {
+        // When value has not changed, prevent clicking tag closeBtn to close tag
+        e.preventDefault();
+        this.foundation.handleTagRemoveByKey(tagKey);
     }
 
     renderTagItem = (nodeKey: string, idx: number) => {
@@ -542,13 +543,10 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
                         size={size === 'default' ? 'large' : size}
                         key={`tag-${nodeKey}-${idx}`}
                         color="white"
+                        tagKey={nodeKey}
                         className={tagCls}
                         closable
-                        onClose={(tagChildren, e) => {
-                            // When value has not changed, prevent clicking tag closeBtn to close tag
-                            e.preventDefault();
-                            this.handleTagRemove(e, keyEntities[nodeKey].valuePath);
-                        }}
+                        onClose={this.handleTagClose}
                     >
                         {keyEntities[nodeKey].data[displayProp]}
                     </Tag>
@@ -558,6 +556,10 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
         return null;
     };
 
+    onRemoveInTagInput = (v: string) => {
+        this.foundation.handleTagRemoveByKey(v);
+    };
+
     renderTagInput() {
         const { size, disabled, placeholder, maxTagCount, showRestTagsPopover, restTagsPopoverProps } = this.props;
         const { inputValue, checkedKeys, keyEntities, resolvedCheckedKeys } = this.state;
@@ -573,11 +575,11 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
                 showRestTagsPopover={showRestTagsPopover}
                 restTagsPopoverProps={restTagsPopoverProps}
                 maxTagCount={maxTagCount}
-                renderTagItem={(value, index) => this.renderTagItem(value, index)}
+                renderTagItem={this.renderTagItem}
                 inputValue={inputValue}
                 onInputChange={this.handleInputChange}
                 // TODO Modify logic, not modify type
-                onRemove={v => this.handleTagRemove(null, (v as unknown) as (string | number)[])}
+                onRemove={this.onRemoveInTagInput}
                 placeholder={placeholder}
                 expandRestTagsOnClick={false}
             />
@@ -834,16 +836,18 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
 
     renderCustomTrigger = () => {
         const { disabled, triggerRender, multiple } = this.props;
-        const { selectedKeys, inputValue, inputPlaceHolder, resolvedCheckedKeys, checkedKeys } = this.state;
+        const { selectedKeys, inputValue, inputPlaceHolder, resolvedCheckedKeys, checkedKeys, keyEntities } = this.state;
         let realValue;
         if (multiple) {
             if (this.mergeType === strings.NONE_MERGE_TYPE) {
-                realValue = checkedKeys;
+                realValue = new Set();
+                checkedKeys.forEach(key => { realValue.add(keyEntities[key]?.pos); });
             } else {
-                realValue = resolvedCheckedKeys;
+                realValue = new Set();
+                resolvedCheckedKeys.forEach(key => { realValue.add(keyEntities[key]?.pos); });
             }
         } else {
-            realValue = [...selectedKeys][0];
+            realValue = keyEntities[[...selectedKeys][0]]?.pos;
         }
         return (
             <Trigger
@@ -857,7 +861,7 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
                 componentName={'Cascader'}
                 componentProps={{ ...this.props }}
                 onSearch={this.handleInputChange}
-                onRemove={this.handleRemoveByKey}
+                onRemove={this.handleTagRemoveInTrigger}
             />
         );
     };
@@ -886,10 +890,10 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
 
     showClearBtn = () => {
         const { showClear, disabled, multiple } = this.props;
-        const { selectedKeys, isOpen, isHovering, checkedKeys } = this.state;
+        const { selectedKeys, isOpen, isHovering, checkedKeys, inputValue } = this.state;
         const hasValue = selectedKeys.size;
         const multipleWithHaveValue = multiple && checkedKeys.size;
-        return showClear && (hasValue || multipleWithHaveValue) && !disabled && (isOpen || isHovering);
+        return showClear && (inputValue || hasValue || multipleWithHaveValue) && !disabled && (isOpen || isHovering);
     };
 
     renderClearBtn = () => {

+ 16 - 1
packages/semi-ui/datePicker/_story/datePicker.stories.jsx

@@ -71,7 +71,7 @@ export {
     FeatInsetInputShowClear,
     AutoSplitInput,
     FixNeedConfirmControlled,
-    PresetsFunctionType
+    FixedNaN
 } from './v2';
 
 
@@ -486,8 +486,12 @@ export const YearPicker = () => (
 export const MonthPicker = () => {
   const Demo = () => {
     const [controlledValue, setControlledValue] = useState('2019-09');
+    const [controlledRangeValue, setControlledRangeValue] = useState(['2019-09', '2019-10']);
+
 
     const _setControlledValue = value => setControlledValue(value);
+    const _setControlledRangeValue = value => setControlledRangeValue(value);
+
 
     return (
       <>
@@ -522,6 +526,17 @@ export const MonthPicker = () => {
           <span>MonthPicker with controlledValue</span>
           <DatePicker type="month" value={controlledValue} onChange={_setControlledValue} />
         </div>
+        <br />
+        <br />
+        <h3>monthRange</h3>
+        <div>
+          <span>MonthRange Picker</span>
+          <DatePicker type="monthRange"  />
+        </div>
+        <div>
+          <span>MonthRange Picker with controlledValue</span>
+          <DatePicker type="monthRange" value={controlledRangeValue} onChange={_setControlledRangeValue} />
+        </div>
       </>
     );
   };

+ 32 - 0
packages/semi-ui/datePicker/_story/v2/FixedNaN.tsx

@@ -0,0 +1,32 @@
+import React, { useState } from 'react';
+import { Button, DatePicker, Space } from '@douyinfe/semi-ui';
+
+export default function App() {
+    const [value, setValue] = useState<Array<Date | typeof NaN>>([NaN, NaN]);
+
+    const handleChange = v => {
+        console.log('change', v);
+        setValue(v as Date[]);
+    };
+
+    return (
+        <Space vertical align="start">
+            <Space>
+                <Button onClick={() => setValue([NaN, NaN])}>set NaN</Button>{' '}
+                <h4>current props value: {value.toString()}</h4>
+            </Space>
+            <DatePicker
+                presets={[
+                    {
+                        text: 'Empty',
+                        start: null,
+                        end: null,
+                    },
+                ]}
+                type="dateRange"
+                value={value}
+                onChange={handleChange}
+            />
+        </Space>
+    );
+}

+ 1 - 0
packages/semi-ui/datePicker/_story/v2/index.js

@@ -29,3 +29,4 @@ export { default as FeatInsetInputShowClear } from './FeatInsetInputShowClear';
 export { default as AutoSplitInput } from './AutoSplitInput';
 export { default as FixNeedConfirmControlled } from './FixNeedConfirmControlled';
 export { default as PresetsFunctionType } from './PresetsFunctionType';
+export { default as FixedNaN } from './FixedNaN';

+ 1 - 1
packages/semi-ui/datePicker/datePicker.tsx

@@ -406,7 +406,7 @@ export default class DatePicker extends BaseComponent<DatePickerProps, DatePicke
     }
 
     componentDidUpdate(prevProps: DatePickerProps) {
-        if (prevProps.value !== this.props.value) {
+        if (!isEqual(prevProps.value, this.props.value)) {
             this.foundation.initFromProps({
                 ...this.props,
             });

+ 8 - 12
packages/semi-ui/datePicker/yearAndMonth.tsx

@@ -63,12 +63,6 @@ class YearAndMonth extends BaseComponent<YearAndMonthProps, YearAndMonthState> {
 
         let { currentYear, currentMonth } = props;
 
-        const currentLeftYear = currentYear.left || now.getFullYear();
-        const currentLeftMonth = currentMonth.left || now.getMonth() + 1;
-
-        currentYear = { left: currentLeftYear, right: currentLeftYear };
-        currentMonth = { left: currentLeftMonth, right: currentMonth.right || currentLeftMonth + 1 };
-
         this.state = {
             years: getYears(props.startYear, props.endYear).map(year => ({
                 value: year,
@@ -80,8 +74,8 @@ class YearAndMonth extends BaseComponent<YearAndMonthProps, YearAndMonthState> {
                     value: idx + 1,
                     month: idx + 1,
                 })),
-            currentYear,
-            currentMonth,
+            currentYear: { left: currentYear.left || now.getFullYear(), right: currentYear.right || now.getFullYear() },
+            currentMonth: { left: currentMonth.left || now.getMonth() + 1, right: currentMonth.right || now.getMonth() + 2 },
         };
 
         this.yearRef = React.createRef();
@@ -119,12 +113,14 @@ class YearAndMonth extends BaseComponent<YearAndMonthProps, YearAndMonthState> {
     static getDerivedStateFromProps(props: YearAndMonthProps, state: YearAndMonthState) {
         const willUpdateStates: Partial<YearAndMonthState> = {};
 
-        if (!isEqual(props.currentYear, state.currentYear) && props.currentYear.left !== 0) {
-            willUpdateStates.currentYear = props.currentYear;
+        if (!isEqual(props.currentYear, state.currentYear)) {
+            const nowYear = new Date().getFullYear();
+            willUpdateStates.currentYear = { left: props.currentYear.left || nowYear, right: props.currentYear.right || nowYear };
         }
 
-        if (!isEqual(props.currentMonth, state.currentMonth) && props.currentMonth.left !== 0) {
-            willUpdateStates.currentMonth = props.currentMonth;
+        if (!isEqual(props.currentMonth, state.currentMonth)) {
+            const nowMonth = new Date().getMonth();
+            willUpdateStates.currentMonth = { left: props.currentMonth.left || nowMonth + 1, right: props.currentMonth.right || nowMonth + 2 };
         }
 
         return willUpdateStates;

+ 3 - 3
packages/semi-ui/form/hoc/withField.tsx

@@ -12,9 +12,9 @@ import ErrorMessage from '../errorMessage';
 import { isElement } from '../../_base/reactUtils';
 import Label from '../label';
 import { Col } from '../../grid';
-import { CallOpts, WithFieldOption } from '@douyinfe/semi-foundation/form/interface';
-import { CommonFieldProps, CommonexcludeType } from '../interface';
-import { Subtract } from 'utility-types';
+import type { CallOpts, WithFieldOption } from '@douyinfe/semi-foundation/form/interface';
+import type { CommonFieldProps, CommonexcludeType } from '../interface';
+import type { Subtract } from 'utility-types';
 import { noop } from "lodash";
 
 const prefix = cssClasses.PREFIX;

+ 3 - 3
packages/semi-ui/modal/Modal.tsx

@@ -110,7 +110,7 @@ class Modal extends BaseComponent<ModalReactProps, ModalState> {
     foundation: ModalFoundation;
 
     private readonly modalRef: LegacyRef<ModalContent>;
-    private bodyOverflow: string;
+    private bodyOverflow: string|null = null;
     private scrollBarWidth: number;
     private originBodyWidth: string;
     private _haveRendered: boolean;
@@ -123,7 +123,7 @@ class Modal extends BaseComponent<ModalReactProps, ModalState> {
         };
         this.foundation = new ModalFoundation(this.adapter);
         this.modalRef = React.createRef();
-        this.bodyOverflow = '';
+
         this.scrollBarWidth = 0;
         this.originBodyWidth = '100%';
 
@@ -143,7 +143,7 @@ class Modal extends BaseComponent<ModalReactProps, ModalState> {
             },
             enabledBodyScroll: () => {
                 const { getPopupContainer } = this.props;
-                if (!getPopupContainer && this.bodyOverflow !== 'hidden') {
+                if (!getPopupContainer && this.bodyOverflow !== null && this.bodyOverflow !== 'hidden') {
                     document.body.style.overflow = this.bodyOverflow;
                     document.body.style.width = this.originBodyWidth;
                 }

+ 7 - 7
packages/semi-ui/package.json

@@ -1,6 +1,6 @@
 {
     "name": "@douyinfe/semi-ui",
-    "version": "2.52.0-beta.1",
+    "version": "2.52.0",
     "description": "A modern, comprehensive, flexible design system and UI library. Connect DesignOps & DevOps. Quickly build beautiful React apps. Maintained by Douyin-fe team.",
     "main": "lib/cjs/index.js",
     "module": "lib/es/index.js",
@@ -20,12 +20,12 @@
         "@dnd-kit/core": "^6.0.8",
         "@dnd-kit/sortable": "^7.0.2",
         "@dnd-kit/utilities": "^3.2.1",
-        "@douyinfe/semi-animation": "2.52.0-beta.1",
-        "@douyinfe/semi-animation-react": "2.52.0-beta.1",
-        "@douyinfe/semi-foundation": "2.52.0-beta.1",
-        "@douyinfe/semi-icons": "2.52.0-beta.1",
-        "@douyinfe/semi-illustrations": "2.52.0-beta.1",
-        "@douyinfe/semi-theme-default": "2.52.0-beta.1",
+        "@douyinfe/semi-animation": "2.52.0",
+        "@douyinfe/semi-animation-react": "2.52.0",
+        "@douyinfe/semi-foundation": "2.52.0",
+        "@douyinfe/semi-icons": "2.52.0",
+        "@douyinfe/semi-illustrations": "2.52.0",
+        "@douyinfe/semi-theme-default": "2.52.0",
         "async-validator": "^3.5.0",
         "classnames": "^2.2.6",
         "copy-text-to-clipboard": "^2.1.1",

+ 6 - 4
packages/semi-ui/scripts/compileDist.js

@@ -1,10 +1,11 @@
 const webpack = require('webpack');
 const config = require('../webpack.config');
-
+const fs = require("fs/promises");
+const path = require("path");
 function compile() {
     return new Promise((resolve, reject) => {
         console.log('compile jsx start');
-        webpack(config({ minimize: false }), (err, stats) => {
+        webpack(config({ minimize: false }), async (err, stats) => {
             if (err) {
                 console.error(err);
                 reject(err);
@@ -29,7 +30,7 @@ function compile() {
 function compileMin() {
     return new Promise((resolve, reject) => {
         console.log('compile jsx with minimize start');
-        webpack(config({ minimize: true }), (err, stats) => {
+        webpack(config({ minimize: true }), async (err, stats) => {
             if (err) {
                 console.error(err);
                 reject(err);
@@ -43,10 +44,11 @@ function compileMin() {
                     reject(err);
                 });
             }
+            await fs.unlink(path.join(__dirname, "..", 'dist', 'umd', 'semi-ui.min.js.LICENSE.txt'));
             console.log('compile jsx with minimize success');
             resolve();
         });
     });
 }
 
-compile().then(compileMin);
+compile().then(compileMin);

+ 23 - 54
packages/semi-ui/select/_story/select.stories.jsx

@@ -3416,12 +3416,10 @@ export const TestOptionKey = () => {
 }
 
 export const AllCaseOfBlur = () => {
-  return (
-    <div>
-      <h3>单选</h3>
-      <Divider margin='12px' />
-      <h5>默认配置</h5>
-      <Select defaultValue="abc" style={{ width: 120 }} onBlur={()=>{console.log('single default onBlur')}} >
+
+  const BaseSelect = (props) => {
+    return (
+       <Select defaultValue="abc" style={{ width: 120 }} {...props} >
         <Select.Option value="abc">抖音</Select.Option>
         <Select.Option value="ulikecam">轻颜相机</Select.Option>
         <Select.Option value="jianying" disabled>
@@ -3429,67 +3427,38 @@ export const AllCaseOfBlur = () => {
         </Select.Option>
         <Select.Option value="xigua">西瓜视频</Select.Option>
       </Select>
+    )
+  }
+  return (
+    <div>
+      <h3>单选</h3>
+      <Divider margin='12px' />
+      <h5>默认配置</h5>
+      <BaseSelect data-cy="singleDefault" onBlur={()=>{console.log('single default onBlur')}} />
       <br />
       <h5>filter</h5>
-      <Select defaultValue="abc" style={{ width: 120 }} filter onBlur={()=>{console.log('single filter onBlur')}}>
-        <Select.Option value="abc">抖音</Select.Option>
-        <Select.Option value="ulikecam">轻颜相机</Select.Option>
-        <Select.Option value="jianying" disabled>
-            剪映
-        </Select.Option>
-        <Select.Option value="xigua">西瓜视频</Select.Option>
-      </Select>
+      <BaseSelect data-cy="singleFilter" filter onBlur={()=>{console.log('single filter onBlur')}} />
       <br />
       <h5>autoFocus</h5>
-      <Select defaultValue="abc" style={{ width: 120 }} autoFocus onBlur={()=>{console.log('single autoFocus onBlur')}}>
-        <Select.Option value="abc">抖音</Select.Option>
-        <Select.Option value="ulikecam">轻颜相机</Select.Option>
-        <Select.Option value="jianying" disabled>
-            剪映
-        </Select.Option>
-        <Select.Option value="xigua">西瓜视频</Select.Option>
-      </Select>
+      <BaseSelect data-cy="singleAutoFocus" autoFocus onBlur={()=>{console.log('single autoFocus onBlur')}} />
       <br />
       <h5>clickToHide</h5>
-      <Select defaultValue="abc" style={{ width: 120 }} clickToHide onBlur={()=>{console.log('single clickToHide onBlur')}}>
-        <Select.Option value="abc">抖音</Select.Option>
-        <Select.Option value="ulikecam">轻颜相机</Select.Option>
-        <Select.Option value="jianying" disabled>
-            剪映
-        </Select.Option>
-        <Select.Option value="xigua">西瓜视频</Select.Option>
-      </Select>
+      <BaseSelect data-cy="singleClickToHide" clickToHide onBlur={()=>{console.log('single clickToHide onBlur')}} />
       <br />
+      <h5>showClear</h5>
+      <BaseSelect data-cy="singleShowClear" showClear onBlur={()=>{console.log('single showClear onBlur')}} />
+
       <h3>多选</h3>
       <Divider margin='12px' />
       <h5>默认配置</h5>
-      <Select defaultValue="abc" style={{ width: 220 }} multiple onBlur={()=>{console.log('multiple default onBlur')}}>
-        <Select.Option value="abc">抖音</Select.Option>
-        <Select.Option value="ulikecam">轻颜相机</Select.Option>
-        <Select.Option value="jianying" disabled>
-            剪映
-        </Select.Option>
-        <Select.Option value="xigua">西瓜视频</Select.Option>
-      </Select>
+      <BaseSelect data-cy="multipleDefault" multiple onBlur={()=>{console.log('multiple default onBlur')}} />
       <br />
       <h5>filter</h5>
-      <Select defaultValue="abc" style={{ width: 220 }} multiple filter onBlur={()=>{console.log('multiple filter onBlur')}}>
-        <Select.Option value="abc">抖音</Select.Option>
-        <Select.Option value="ulikecam">轻颜相机</Select.Option>
-        <Select.Option value="jianying" disabled>
-            剪映
-        </Select.Option>
-        <Select.Option value="xigua">西瓜视频</Select.Option>
-      </Select>
+      <BaseSelect data-cy="multipleFilter" multiple filter onBlur={()=>{console.log('multiple filter onBlur')}} />
       <h5>clickToHide</h5>
-      <Select defaultValue="abc" style={{ width: 120 }} multiple clickToHide onBlur={()=>{console.log('multiple clickToHide onBlur')}}>
-        <Select.Option value="abc">抖音</Select.Option>
-        <Select.Option value="ulikecam">轻颜相机</Select.Option>
-        <Select.Option value="jianying" disabled>
-            剪映
-        </Select.Option>
-        <Select.Option value="xigua">西瓜视频</Select.Option>
-      </Select>
+      <BaseSelect data-cy="multipleClickToHide" multiple clickToHide onBlur={()=>{console.log('multiple clickToHide onBlur')}} />
+      <h5>showClear</h5>
+      <BaseSelect data-cy="multipleShowClear" multiple showClear onBlur={()=>{console.log('multiple showClear onBlur')}} />
       <br />
       <br />
     </div>

+ 1 - 0
packages/semi-ui/select/option.tsx

@@ -126,6 +126,7 @@ class Option extends PureComponent<OptionProps> {
                 inputValue,
                 onMouseEnter: (e: React.MouseEvent) => onMouseEnter(e),
                 onClick: (e: React.MouseEvent) => this.onClick({ value, label, children, ...rest }, e),
+                className,
                 ...rest
             });
         }

+ 1 - 1
packages/semi-ui/table/ResizableTable.tsx

@@ -52,7 +52,7 @@ const ResizableTable = (props: TableProps = {}, ref: React.MutableRefObject<Tabl
         newColumns.unshift({ key: strings.DEFAULT_KEY_COLUMN_EXPAND, width: numbers.DEFAULT_WIDTH_COLUMN_EXPAND });
     }
 
-    if (props.rowSelection && !find(rawColumns, item => item.key === strings.DEFAULT_KEY_COLUMN_SELECTION)) {
+    if (props.rowSelection && !get(props.rowSelection, 'hidden') && !find(rawColumns, item => item.key === strings.DEFAULT_KEY_COLUMN_SELECTION)) {
         newColumns.unshift({
             width: get(props, 'rowSelection.width', numbers.DEFAULT_WIDTH_COLUMN_SELECTION),
             key: strings.DEFAULT_KEY_COLUMN_SELECTION,

+ 3 - 2
packages/semi-ui/table/_story/table.stories.jsx

@@ -110,7 +110,8 @@ export {
     SortIcon,
     FixedAllDisabledAndSelected,
     FeatRenderFilterDropdown,
-    InputFilter
+    InputFilter,
+    FixedRowSelectionHiddenResizable
 } from './v2';
 export { default as FixSelectAll325 } from './Demos/rowSelection';
 
@@ -640,4 +641,4 @@ export const _RowSelectionRenderCell = () => <RowSelectionRenderCell />;
 
 _RowSelectionRenderCell.story = {
   name: 'RowSelection RenderCell',
-};
+};

+ 106 - 0
packages/semi-ui/table/_story/v2/FixedRowSelectionHiddenResizable/index.tsx

@@ -0,0 +1,106 @@
+import React, { useMemo, useState } from 'react';
+import { Table, Avatar, Button, Space } from '@douyinfe/semi-ui';
+import * as dateFns from 'date-fns';
+import { IconMore } from '@douyinfe/semi-icons';
+
+const DAY = 24 * 60 * 60 * 1000;
+const figmaIconUrl = 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/figma-icon.png';
+
+/**
+ * test with cypress, don't modify this story
+ * @returns 
+ */
+export default function App() {
+    const [hidden, setHidden] = useState(false);
+    const columns = [
+        {
+            title: '标题',
+            dataIndex: 'name',
+            width: 300,
+            resize: false,
+            render: (text, record, index) => {
+                return (
+                    <div>
+                        <Avatar size="small" shape="square" src={figmaIconUrl} style={{ marginRight: 12 }}></Avatar>
+                        {text}
+                    </div>
+                );
+            },
+            filters: [
+                {
+                    text: 'Semi Design 设计稿',
+                    value: 'Semi Design 设计稿',
+                },
+                {
+                    text: 'Semi D2C 设计稿',
+                    value: 'Semi D2C 设计稿',
+                },
+            ],
+            onFilter: (value, record) => record.name.includes(value),
+        },
+        {
+            title: '大小',
+            dataIndex: 'size',
+            width: 200,
+            sorter: (a, b) => (a.size - b.size > 0 ? 1 : -1),
+            render: text => `${text} KB`,
+        },
+        {
+            title: '所有者',
+            width: 200,
+            dataIndex: 'owner',
+            render: (text, record, index) => {
+                return (
+                    <div>
+                        <Avatar size="small" color={record.avatarBg} style={{ marginRight: 4 }}>
+                            {typeof text === 'string' && text.slice(0, 1)}
+                        </Avatar>
+                        {text}
+                    </div>
+                );
+            },
+        },
+        {
+            title: '更新日期',
+            dataIndex: 'updateTime',
+            sorter: (a, b) => (a.updateTime - b.updateTime > 0 ? 1 : -1),
+            render: value => {
+                return dateFns.format(new Date(value), 'yyyy-MM-dd');
+            },
+        },
+        {
+            title: '操作列',
+            dataIndex: 'operate',
+            fixed: 'right',
+            width: 100,
+            resize: false,
+            render: () => {
+                return <IconMore />;
+            },
+        },
+    ];
+
+    const data = useMemo(() => {
+        const _data = [];
+        for (let i = 0; i < 46; i++) {
+            const isSemiDesign = i % 2 === 0;
+            const randomNumber = (i * 1000) % 199;
+            _data.push({
+                key: '' + i,
+                name: isSemiDesign ? `Semi Design 设计稿${i}.fig` : `Semi D2C 设计稿${i}.fig`,
+                owner: isSemiDesign ? '姜鹏志' : '郝宣',
+                size: randomNumber,
+                updateTime: new Date('2024-01-24').valueOf() + randomNumber * DAY,
+                avatarBg: isSemiDesign ? 'grey' : 'red',
+            });
+        }
+        return _data;
+    }, []);
+
+    return (
+        <Space vertical align="start">
+            <Button onClick={() => setHidden(!hidden)}>toggle hidden rowSelection</Button>
+            <Table columns={columns} dataSource={data} resizable bordered rowSelection={{ hidden }} />
+        </Space>
+    );
+}

+ 1 - 0
packages/semi-ui/table/_story/v2/index.js

@@ -28,5 +28,6 @@ export { default as ShowHeader } from './ShowHeader';
 export { default as KeepDOM } from './KeepDOM';
 export { default as SortIcon } from './SortIcon';
 export { default as FixedAllDisabledAndSelected } from './FixedAllDisabledAndSelected';
+export { default as FixedRowSelectionHiddenResizable } from './FixedRowSelectionHiddenResizable';
 export { default as FeatRenderFilterDropdown } from './FeatRenderFilterDropdown';
 export { default as InputFilter } from './InputFilter';

+ 1 - 1
packages/semi-ui/timePicker/TimePicker.tsx

@@ -29,7 +29,7 @@ export interface Panel {
     panelFooter?: React.ReactNode | React.ReactNode[]
 }
 
-export type BaseValueType = string | number | Date;
+export type BaseValueType = string | number | Date | undefined;
 
 export type Type = 'time' | 'timeRange';
 

+ 51 - 16
packages/semi-ui/tooltip/_story/tooltip.stories.jsx

@@ -182,23 +182,58 @@ const ScrollDemo = function ScrollDemo(props = {}) {
   );
 };
 
+export const ScaleContainerTooltip = () => {
+
+    return <div>
+        <div id={"scaleContainer"} style={{border: '1px solid red', width: 400, height: 400, transform:'scale(1.5)',transformOrigin:'left'}}>
+            <Tooltip
+                content={
+                    <article>
+                        <p>hi bytedance</p>
+                        <p>hi bytedance</p>
+                    </article>
+                }
+                trigger={'click'}
+                getPopupContainer={()=>document.querySelector("#scaleContainer")}
+            >
+                <Tag style={{'margin': '90px 90px'}}>Tooltip 跟着缩放</Tag>
+            </Tooltip>
+        </div>
+
+        <div  style={{border: '1px solid red', width: 400, height: 400, scale: '1.5',marginTop:500,transformOrigin:'left'}}>
+            <Tooltip
+                content={
+                    <article>
+                        <p>hi bytedance</p>
+                        <p>hi bytedance</p>
+                    </article>
+                }
+                trigger={'click'}
+            >
+                <Tag style={{'margin': '90px 90px'}}>Tooltip 不跟着缩放</Tag>
+            </Tooltip>
+        </div>
+
+    </div>
+}
+
 export const TooltipOnVisibleChange = () => {
-  const [visible, setVisible] = useState(true);
-  return (
-    <div className="demo">
-      <div>
-        <label>受控</label>
-        <Tooltip
-          content={
-            <article>
-              <p>hi bytedance</p>
-              <p>hi bytedance</p>
-            </article>
-          }
-          position="top"
-          onVisibleChange={setVisible}
-          trigger="click"
-          visible={visible}
+    const [visible, setVisible] = useState(true);
+    return (
+        <div className="demo">
+            <div>
+                <label>受控</label>
+                <Tooltip
+                    content={
+                        <article>
+                            <p>hi bytedance</p>
+                            <p>hi bytedance</p>
+                        </article>
+                    }
+                    position="top"
+                    onVisibleChange={setVisible}
+                    trigger="click"
+                    visible={visible}
         >
           <Tag>demo</Tag>
         </Tooltip>

+ 1 - 1
packages/semi-webpack/package.json

@@ -1,6 +1,6 @@
 {
     "name": "@douyinfe/semi-webpack-plugin",
-    "version": "2.52.0-beta.1",
+    "version": "2.52.0",
     "description": "",
     "author": "伍浩威 <[email protected]>",
     "homepage": "",

+ 262 - 262
sitemap.xml

@@ -2,22 +2,22 @@
 <urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
     <url>
         <loc>https://juejin.cn/post/7267418854124699702</loc>
-        <lastmod>2024-01-31T08:49:44.764Z</lastmod>
+        <lastmod>2024-02-06T11:06:41.765Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://medium.com/front-end-weekly/how-we-test-semi-design-component-libraries-64b854f63b65</loc>
-        <lastmod>2024-01-31T08:49:44.277Z</lastmod>
+        <lastmod>2024-02-06T11:06:41.199Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://mp.weixin.qq.com/s/noHoWRuA25PgqFNcurhIUA</loc>
-        <lastmod>2024-01-31T08:49:46.965Z</lastmod>
+        <lastmod>2024-02-06T11:06:43.091Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://mp.weixin.qq.com/s/O3js-SZDNPEOjGxh-aAkbw</loc>
-        <lastmod>2024-01-31T08:49:46.575Z</lastmod>
+        <lastmod>2024-02-06T11:06:43.268Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
@@ -334,339 +334,339 @@
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/feedback/banner</loc>
-        <lastmod>2023-08-07T07:46:38.201Z</lastmod>
+        <lastmod>2024-02-06T11:06:45.207Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/feedback/notification</loc>
-        <lastmod>2023-08-07T07:46:38.212Z</lastmod>
+        <lastmod>2024-02-06T11:06:45.062Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/feedback/popconfirm</loc>
-        <lastmod>2023-08-07T07:46:38.186Z</lastmod>
+        <lastmod>2024-02-06T11:06:45.354Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/feedback/progress</loc>
-        <lastmod>2023-08-07T07:46:38.240Z</lastmod>
+        <lastmod>2024-02-06T11:06:45.122Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/feedback/skeleton</loc>
-        <lastmod>2023-08-07T07:46:38.196Z</lastmod>
+        <lastmod>2024-02-06T11:06:45.256Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/feedback/spin</loc>
-        <lastmod>2023-08-07T07:46:38.196Z</lastmod>
+        <lastmod>2024-02-06T11:06:45.268Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/feedback/toast</loc>
-        <lastmod>2023-08-07T07:46:38.213Z</lastmod>
+        <lastmod>2024-02-06T11:06:45.283Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/handbook/intro</loc>
-        <lastmod>2023-08-07T07:46:38.208Z</lastmod>
+        <lastmod>2024-02-06T11:06:45.277Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/handbook/tools</loc>
-        <lastmod>2023-08-07T07:46:38.215Z</lastmod>
+        <lastmod>2024-02-06T11:06:45.433Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/input/button</loc>
-        <lastmod>2023-08-07T07:46:38.255Z</lastmod>
+        <lastmod>2024-02-06T11:06:45.439Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/input/cascader</loc>
-        <lastmod>2023-08-07T07:46:38.242Z</lastmod>
+        <lastmod>2024-02-06T11:06:45.592Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/input/checkbox</loc>
-        <lastmod>2023-08-07T07:46:38.242Z</lastmod>
+        <lastmod>2024-02-06T11:06:45.451Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/input/datepicker</loc>
-        <lastmod>2023-08-07T07:46:38.227Z</lastmod>
+        <lastmod>2024-02-06T11:06:45.582Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/input/form</loc>
-        <lastmod>2023-08-07T07:46:38.248Z</lastmod>
+        <lastmod>2024-02-06T11:06:45.583Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/input/input</loc>
-        <lastmod>2023-08-07T07:46:38.255Z</lastmod>
+        <lastmod>2024-02-06T11:06:45.601Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/input/inputnumber</loc>
-        <lastmod>2023-08-07T07:46:38.239Z</lastmod>
+        <lastmod>2024-02-06T11:06:45.581Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/input/radio</loc>
-        <lastmod>2023-08-07T07:46:38.270Z</lastmod>
+        <lastmod>2024-02-06T11:06:45.597Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/input/rating</loc>
-        <lastmod>2023-08-07T07:46:38.249Z</lastmod>
+        <lastmod>2024-02-06T11:06:45.592Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/input/select</loc>
-        <lastmod>2023-08-07T07:46:38.272Z</lastmod>
+        <lastmod>2024-02-06T11:06:45.595Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/input/slider</loc>
-        <lastmod>2023-08-07T07:46:38.254Z</lastmod>
+        <lastmod>2024-02-06T11:06:46.042Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/input/switch</loc>
-        <lastmod>2023-08-07T07:46:38.274Z</lastmod>
+        <lastmod>2024-02-06T11:06:45.887Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/input/taginput</loc>
-        <lastmod>2023-08-07T07:46:38.280Z</lastmod>
+        <lastmod>2024-02-06T11:06:45.746Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/input/timepicker</loc>
-        <lastmod>2023-08-07T07:46:38.275Z</lastmod>
+        <lastmod>2024-02-06T11:06:45.745Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/input/transfer</loc>
-        <lastmod>2023-08-07T07:46:38.292Z</lastmod>
+        <lastmod>2024-02-06T11:06:45.759Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/input/treeselect</loc>
-        <lastmod>2023-08-07T07:46:38.282Z</lastmod>
+        <lastmod>2024-02-06T11:06:45.913Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/input/upload</loc>
-        <lastmod>2023-08-07T07:46:38.289Z</lastmod>
+        <lastmod>2024-02-06T11:06:45.917Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/navigation/anchor</loc>
-        <lastmod>2023-08-07T07:46:38.289Z</lastmod>
+        <lastmod>2024-02-06T11:06:45.919Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/navigation/breadcrumb</loc>
-        <lastmod>2023-08-07T07:46:38.323Z</lastmod>
+        <lastmod>2024-02-06T11:06:45.912Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/navigation/navigation</loc>
-        <lastmod>2023-08-07T07:46:38.310Z</lastmod>
+        <lastmod>2024-02-06T11:06:45.920Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/navigation/pagination</loc>
-        <lastmod>2023-08-07T07:46:38.329Z</lastmod>
+        <lastmod>2024-02-06T11:06:45.925Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/navigation/steps</loc>
-        <lastmod>2023-08-07T07:46:38.323Z</lastmod>
+        <lastmod>2024-02-06T11:06:46.074Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/navigation/tabs</loc>
-        <lastmod>2023-08-07T07:46:38.351Z</lastmod>
+        <lastmod>2024-02-06T11:06:46.071Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/navigation/tree</loc>
-        <lastmod>2023-08-07T07:46:38.334Z</lastmod>
+        <lastmod>2024-02-06T11:06:46.248Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/show/avatar</loc>
-        <lastmod>2023-08-07T07:46:38.332Z</lastmod>
+        <lastmod>2024-02-06T11:06:46.239Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/show/badge</loc>
-        <lastmod>2023-08-07T07:46:38.341Z</lastmod>
+        <lastmod>2024-02-06T11:06:46.391Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/show/calendar</loc>
-        <lastmod>2023-08-07T07:46:38.404Z</lastmod>
+        <lastmod>2024-02-06T11:06:46.389Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/show/card</loc>
-        <lastmod>2023-08-07T07:46:38.367Z</lastmod>
+        <lastmod>2024-02-06T11:06:46.562Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/show/collapse</loc>
-        <lastmod>2023-08-07T07:46:38.389Z</lastmod>
+        <lastmod>2024-02-06T11:06:46.553Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/show/descriptions</loc>
-        <lastmod>2023-08-07T07:46:38.406Z</lastmod>
+        <lastmod>2024-02-06T11:06:46.718Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/show/dropdown</loc>
-        <lastmod>2023-08-07T07:46:38.383Z</lastmod>
+        <lastmod>2024-02-06T11:06:46.721Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/show/list</loc>
-        <lastmod>2023-08-07T07:46:38.391Z</lastmod>
+        <lastmod>2024-02-06T11:06:46.720Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/show/modal</loc>
-        <lastmod>2023-08-07T07:46:38.427Z</lastmod>
+        <lastmod>2024-02-06T11:06:46.729Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/show/popover</loc>
-        <lastmod>2023-08-07T07:46:38.410Z</lastmod>
+        <lastmod>2024-02-06T11:06:46.889Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/show/scrolllist</loc>
-        <lastmod>2023-08-07T07:46:38.394Z</lastmod>
+        <lastmod>2024-02-06T11:06:46.887Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/show/table</loc>
-        <lastmod>2023-08-07T07:46:38.435Z</lastmod>
+        <lastmod>2024-02-06T11:06:46.892Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/show/tag</loc>
-        <lastmod>2023-08-07T07:46:38.395Z</lastmod>
+        <lastmod>2024-02-06T11:06:46.879Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/show/timeline</loc>
-        <lastmod>2023-08-07T07:46:38.413Z</lastmod>
+        <lastmod>2024-02-06T11:06:46.908Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/show/tooltip</loc>
-        <lastmod>2023-08-07T07:46:38.410Z</lastmod>
+        <lastmod>2024-02-06T11:06:46.895Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/visual/colors</loc>
-        <lastmod>2023-08-07T07:46:38.502Z</lastmod>
+        <lastmod>2024-02-06T11:06:47.542Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/visual/dark-mode</loc>
-        <lastmod>2023-08-07T07:46:38.444Z</lastmod>
+        <lastmod>2024-02-06T11:06:47.139Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/visual/data-format</loc>
-        <lastmod>2023-08-07T07:46:38.417Z</lastmod>
+        <lastmod>2024-02-06T11:06:47.267Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/visual/grid</loc>
-        <lastmod>2023-08-07T07:46:38.486Z</lastmod>
+        <lastmod>2024-02-06T11:06:47.266Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/visual/iconography</loc>
-        <lastmod>2023-08-07T07:46:38.469Z</lastmod>
+        <lastmod>2024-02-06T11:06:47.433Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/visual/layout</loc>
-        <lastmod>2023-08-07T07:46:38.461Z</lastmod>
+        <lastmod>2024-02-06T11:06:47.428Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/visual/spacings</loc>
-        <lastmod>2023-08-07T07:46:38.451Z</lastmod>
+        <lastmod>2024-02-06T11:06:47.420Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/visual/typography</loc>
-        <lastmod>2023-08-07T07:46:38.473Z</lastmod>
+        <lastmod>2024-02-06T11:06:47.427Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.125</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/dsm_manual/zh-CN/introduction/case</loc>
@@ -790,732 +790,732 @@
     </url>
     <url>
         <loc>https://semi.design/en-US/basic/divider</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/basic/grid</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/basic/icon</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/basic/layout</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/basic/space</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/basic/tokens</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/basic/typography</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/feedback/banner</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/feedback/notification</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/feedback/popconfirm</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/feedback/progress</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/feedback/skeleton</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/feedback/spin</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/feedback/toast</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/autocomplete</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/button</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>1970-01-01T00:00:00.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/cascader</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/checkbox</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/datepicker</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/form</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/input</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/inputnumber</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/radio</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/rating</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/select</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/slider</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/switch</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/taginput</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/timepicker</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/transfer</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/treeselect</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/upload</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/navigation/anchor</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/navigation/backtop</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/navigation/breadcrumb</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/navigation/navigation</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/navigation/pagination</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/navigation/steps</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/navigation/tabs</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/navigation/tree</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/other/configprovider</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/other/locale</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/avatar</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/badge</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/calendar</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/card</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/carousel</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/collapse</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/collapsible</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/descriptions</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/dropdown</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/empty</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/highlight</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/image</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/list</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/modal</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/overflowlist</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/popover</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/scrolllist</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/sidesheet</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/table</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/tag</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/timeline</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/tooltip</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/accessibility</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/changelog</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/customize-theme</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/dark-mode</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/faq</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/getting-started</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/introduction</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/overview</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/update-to-v2</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/basic/divider</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/basic/grid</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/basic/icon</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/basic/layout</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/basic/space</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/basic/tokens</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/basic/typography</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/feedback/banner</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/feedback/notification</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/feedback/popconfirm</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/feedback/progress</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/feedback/skeleton</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/feedback/spin</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/feedback/toast</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/autocomplete</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/button</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>1970-01-01T00:00:00.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/cascader</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/checkbox</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/datepicker</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/form</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/input</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/inputnumber</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/radio</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/rating</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/select</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/slider</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/switch</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/taginput</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/timepicker</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/transfer</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/treeselect</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/upload</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/navigation/anchor</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/navigation/backtop</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/navigation/breadcrumb</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/navigation/navigation</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/navigation/pagination</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/navigation/steps</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/navigation/tabs</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/navigation/tree</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/other/configprovider</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/other/locale</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/avatar</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/badge</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/calendar</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/card</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/carousel</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/collapse</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/collapsible</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/descriptions</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/dropdown</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/empty</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/highlight</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/image</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/list</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/modal</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/overflowlist</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/popover</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/scrolllist</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/sidesheet</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/table</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/tag</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/timeline</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/tooltip</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/accessibility</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/changelog</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/customize-theme</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/dark-mode</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/faq</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/getting-started</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/introduction</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/overview</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/update-to-v2</loc>
-        <lastmod>2024-01-31T08:14:38.000Z</lastmod>
+        <lastmod>2024-02-06T10:47:17.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
 </urlset>

+ 4 - 3
src/components/IconList/index.jsx

@@ -1,6 +1,6 @@
 import React, { useMemo, useState } from 'react';
 import { useStaticQuery, graphql } from 'gatsby';
-import { Tabs, TabPane, Input } from '@douyinfe/semi-ui';
+import { Tabs, TabPane, Input, Typography } from '@douyinfe/semi-ui';
 import { IconSearch } from '@douyinfe/semi-icons';
 import { groupBy, toPairs, sortBy } from 'lodash-es';
 import { FormattedMessage } from 'react-intl';
@@ -75,11 +75,12 @@ const IconList = props => {
                 <img style={{ marginRight: 8, marginLeft: 24 }} src={`https://badgen.net/badge/%40douyinfe%2Fsemi-icons-lab/${pkgJson.version}?color=cyan`} alt="" />
                 <img src={`https://badgen.net/badge/count/${iconLabData.length}/cyan`} alt="" />
             </div>
-            <Tabs keepDOM tabBarExtraContent={<Input suffix={<IconSearch />} showClear onEnterPress={e => search(e.target.value)} onClear={() => search('')} />}>
+            <Tabs keepDOM>
                 <TabPane tab={_t('icon.list.tab.fill')} itemKey="fill"><IconCategory groups={fillGroups} pkgType='default' /></TabPane>
                 <TabPane tab={_t('icon.list.tab.stroked')} itemKey="stroked"><IconCategory groups={strokedGroups} pkgType='default' /></TabPane>
-                <TabPane tab={_t('icon.list.tab.lab')} itemKey="lab"><IconCategory groups={labGroups} pkgType='lab' /></TabPane>
             </Tabs>
+            <Typography.Title heading={2}>{_t('icon.list.tab.lab')}</Typography.Title>
+            <IconCategory groups={labGroups} pkgType='lab' />
         </div>
     );
 };

+ 6 - 0
src/components/layout.js

@@ -176,6 +176,12 @@ const AppLayout = ({ type, location, children }) => {
         sideNavStyle.marginTop = 92;
     }
 
+    useEffect(() => {
+        setTimeout(()=>{
+            console.clear();
+        }, 1000);
+    }, []);
+
     // TODO import semi common footer
     return (
         <>

+ 4 - 4
yarn.lock

@@ -1639,10 +1639,10 @@
   resolved "https://registry.npmjs.org/@douyinfe/semi-site-doc-style/-/semi-site-doc-style-0.0.1.tgz#c3c803014218ec00441dac32db9a875f6222ed0b"
   integrity sha512-y7Jc1i9q/O2idfaqckSJvghpt4AboQJgZ4iTEK8UMqjQkyWmb5I/NRzVWjOP9S0LEbJNs76OKfZil7DwsOmY/A==
 
-"@douyinfe/semi-site-header@^0.0.28":
-  version "0.0.28"
-  resolved "https://registry.yarnpkg.com/@douyinfe/semi-site-header/-/semi-site-header-0.0.28.tgz#578dfb0c3c4c0b5df9c8064b458b8d4e07114464"
-  integrity sha512-DLohlwMmXAk5AL8vM9qSl5YnZY5lXJlkUB9yUDkSnkSPjMn6gxMkv0hyKbyO+oUt5rLgl+Il1ysOSJ7uLHk/dA==
+"@douyinfe/semi-site-header@^0.0.29":
+  version "0.0.29"
+  resolved "https://registry.npmjs.org/@douyinfe/semi-site-header/-/semi-site-header-0.0.29.tgz#cda393a9b280ff7c81e78ecb207987043fb7622e"
+  integrity sha512-x2j/EH6T8bGRAS8P0l+mznWOY4IcR1LY6RXFRqo/7Q6ktUjra5Cm3yFXm8uaJxkXHgY8H7JWnT9hHPriI0yK6w==
   dependencies:
     "@douyinfe/semi-icons" "^2.0.0"
     "@douyinfe/semi-ui" "^2.0.0"