Browse Source

Merge branch 'main' into fix/slider

pointhalo 1 year ago
parent
commit
85ef8f4e3e
54 changed files with 949 additions and 367 deletions
  1. 1 1
      README-zh_CN.md
  2. 1 1
      README.md
  3. 1 0
      content/input/form/index-en-US.md
  4. 18 16
      content/input/form/index.md
  5. 13 4
      content/input/treeselect/index-en-US.md
  6. 14 3
      content/input/treeselect/index.md
  7. 2 0
      content/show/modal/index.md
  8. 22 0
      content/start/changelog/index-en-US.md
  9. 23 2
      content/start/changelog/index.md
  10. 5 0
      cypress/e2e/table.spec.js
  11. 1 1
      lerna.json
  12. 3 3
      packages/semi-animation-react/package.json
  13. 1 1
      packages/semi-animation-styled/package.json
  14. 1 1
      packages/semi-animation/package.json
  15. 1 1
      packages/semi-eslint-plugin/package.json
  16. 0 1
      packages/semi-foundation/banner/banner.scss
  17. 1 1
      packages/semi-foundation/checkbox/checkbox.scss
  18. 3 1
      packages/semi-foundation/checkbox/variables.scss
  19. 1 0
      packages/semi-foundation/form/foundation.ts
  20. 1 0
      packages/semi-foundation/modal/modalFoundation.ts
  21. 2 2
      packages/semi-foundation/package.json
  22. 31 16
      packages/semi-foundation/select/foundation.ts
  23. 14 2
      packages/semi-foundation/table/rtl.scss
  24. 15 0
      packages/semi-foundation/tagInput/tagInput.scss
  25. 4 1
      packages/semi-foundation/tagInput/variables.scss
  26. 8 6
      packages/semi-foundation/treeSelect/foundation.ts
  27. 1 1
      packages/semi-icons-lab/package.json
  28. 1 1
      packages/semi-icons/package.json
  29. 1 1
      packages/semi-illustrations/package.json
  30. 2 2
      packages/semi-next/package.json
  31. 1 1
      packages/semi-rspack/package.json
  32. 1 1
      packages/semi-scss-compile/package.json
  33. 1 1
      packages/semi-theme-default/package.json
  34. 1 1
      packages/semi-ui/README.md
  35. 11 4
      packages/semi-ui/form/hoc/withField.tsx
  36. 2 1
      packages/semi-ui/modal/Modal.tsx
  37. 7 7
      packages/semi-ui/package.json
  38. 18 1
      packages/semi-ui/select/_story/select.stories.jsx
  39. 4 4
      packages/semi-ui/table/Body/BaseRow.tsx
  40. 19 0
      packages/semi-ui/table/_story/RTL/ColumnAlignWithSorter.tsx
  41. 2 1
      packages/semi-ui/table/_story/RTL/index.jsx
  42. 3 2
      packages/semi-ui/table/_story/table.stories.jsx
  43. 105 0
      packages/semi-ui/table/_story/v2/FixedOnGroupedRowClassName/index.tsx
  44. 82 0
      packages/semi-ui/table/_story/v2/columnAlignWithSorter.tsx
  45. 1 0
      packages/semi-ui/table/_story/v2/index.js
  46. 1 1
      packages/semi-ui/table/interface.ts
  47. 1 0
      packages/semi-ui/tagInput/_story/tagInput.stories.jsx
  48. 5 0
      packages/semi-ui/tagInput/index.tsx
  49. 85 0
      packages/semi-ui/treeSelect/__test__/treeSelect.test.js
  50. 64 2
      packages/semi-ui/treeSelect/_story/treeSelect.stories.jsx
  51. 2 17
      packages/semi-ui/treeSelect/index.tsx
  52. 1 1
      packages/semi-webpack/package.json
  53. 253 253
      sitemap.xml
  54. 87 0
      yarn.lock

+ 1 - 1
README-zh_CN.md

@@ -10,7 +10,7 @@
 <div align="center">
 
 [![LICENSE][license-badge]][license-url] [![NPM][npm-badge]][npm-url] [![FIGMA][figma-badge]][figma-url] ![Design Token][Design Token] 
-[![BUILD-JS][build-js-badge]][build-js-url] [![BUILD-CSS][build-css-badge]][build-css-url] [![CODECOV][codecov-badge]][codecov-url] [![Chromatic][chromatic-badge]][chromatic-url] [![Cypress][cypress-badge]][cypress-url]
+[![CODECOV][codecov-badge]][codecov-url] [![Chromatic][chromatic-badge]][chromatic-url] [![Cypress][cypress-badge]][cypress-url]
 [![Twitter Follow](https://img.shields.io/twitter/follow/SemiDesignUI?style=social)](https://twitter.com/SemiDesignUI)
 
 

+ 1 - 1
README.md

@@ -12,7 +12,7 @@
 [![Twitter Follow](https://img.shields.io/twitter/follow/SemiDesignUI?style=social)](https://twitter.com/SemiDesignUI)
 
 [![LICENSE][license-badge]][license-url] [![NPM][npm-badge]][npm-url] [![CONTRIBUTORS][contributors-badge]][contributors-url]  ![Design Token][Design Token] [![FIGMA][figma-badge]][figma-url] 
-[![BUILD-JS][build-js-badge]][build-js-url] [![BUILD-CSS][build-css-badge]][build-css-url] [![CODECOV][codecov-badge]][codecov-url] [![Chromatic][chromatic-badge]][chromatic-url] [![Cypress][cypress-badge]][cypress-url]
+[![CODECOV][codecov-badge]][codecov-url] [![Chromatic][chromatic-badge]][chromatic-url] [![Cypress][cypress-badge]][cypress-url]
 
 
 [npm-badge]: https://img.shields.io/npm/v/@douyinfe/semi-ui.svg

+ 1 - 0
content/input/form/index-en-US.md

@@ -2109,6 +2109,7 @@ The table below describes the features available in the formApi.
 
 | Function      | Description                                                                        | example                                                                                                                       |
 | ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |-------------------------------------------------------------------------------------------------------------------------------|
+| getFormProps  | Get Form Component Props, support after v2.57.0                                                                                                                                                                                                                                                                                                                      | formApi.getFormProps(propNames?: string[])                                                                                                        |
 | getFormState  | Get FormState                                                                                                                                                                                                                                                                                                                      | formApi.getFormState()                                                                                                        |
 | submitForm    | Manually submit form operation                                                                                                                                                                                                                                                                                               | formApi.submitForm()                                                                                                          |
 | reset         | Reset the form manually                                                                                                                                                                                                                                                                                                            | formApi.reset(fields?: Array <string\>)                                                                                      |

+ 18 - 16
content/input/form/index.md

@@ -2107,6 +2107,7 @@ FormState 存储了所有 Form 内部的状态值,包括各表单控件的值
 
 | Function      | 说明                                                                                                                                                                                                                             | example                                                                                                             |
 | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |---------------------------------------------------------------------------------------------------------------------|
+| getFormProps  | 获取 Form 组件上当前所有props的值,例如可用于读取 disabled 等。v 2.57.0 后提供                                                    | formApi.getProps(propNames?: string[])                                                                                              |
 | getFormState  | 获取 FormState                                                                                                                                                                                                                   | formApi.getFormState()                                                                                              |
 | submitForm    | 可手动触发 submit 提交操作                                                                                                                                                                                                       | formApi.submitForm()                                                                                                |
 | reset         | 可手动对 form 进行重置                                                                                                                                                                                                           | formApi.reset(fields?: Array <string\>)                                                                             |
@@ -2135,6 +2136,23 @@ FormState 存储了所有 Form 内部的状态值,包括各表单控件的值
 import React from 'react';
 import { Form, Button } from '@douyinfe/semi-ui';
 
+() => {
+    // 函数式组件通过useRef存储formApi
+    const api = useRef();
+
+    return (
+        <Form getFormApi={formApi => api.current = formApi}>
+            <Form.Input field='a' />
+            <Button onClick={()=>{console.log(api);}}>log</Button>
+        </Form>
+    );
+};
+```
+
+```jsx
+import React from 'react';
+import { Form, Button } from '@douyinfe/semi-ui';
+
 class FormApiDemo extends React.Component {
     constructor() {
         super();
@@ -2168,22 +2186,6 @@ class FormApiDemo extends React.Component {
 }
 ```
 
-```jsx
-import React from 'react';
-import { Form, Button } from '@douyinfe/semi-ui';
-
-() => {
-    // 函数式组件通过useRef存储formApi
-    const api = useRef();
-
-    return (
-        <Form getFormApi={formApi => api.current = formApi}>
-            <Form.Input field='a' />
-            <Button onClick={()=>{console.log(api);}}>log</Button>
-        </Form>
-    );
-};
-```
 
 ## Field Props
 

+ 13 - 4
content/input/treeselect/index-en-US.md

@@ -274,6 +274,8 @@ Use `filterTreeNode` to support search input. By default it searches the `label`
 
 You could also use `showFilteredOnly` if you prefer to display filtered results only.
 
+If you want to get specific information about the search results, you can use the `onSearch` callback function. See the API list for the specific parameters of the function.
+
 ```jsx live=true
 import React from 'react';
 import { TreeSelect, Switch } from '@douyinfe/semi-ui';
@@ -285,10 +287,14 @@ class Demo extends React.Component {
             showFilteredOnly: false,
         };
         this.onChange = this.onChange.bind(this);
+        this.onSearch = this.onSearch.bind(this);
     }
     onChange(showFilteredOnly) {
         this.setState({ showFilteredOnly });
     }
+    onSearch(inputValue, filteredExpandedKeys, filteredNodes) {
+        console.log('onSearch', inputValue, filteredExpandedKeys, filteredNodes);
+    }
     render() {
         const treeData = [
             {
@@ -364,6 +370,7 @@ class Demo extends React.Component {
                     showFilteredOnly={showFilteredOnly}
                     placeholder="Single Searchable TreeSelect"
                     searchPlaceholder="Start searching"
+                    onSearch={this.onSearch}
                 />
                 <br/>
                 <br/>
@@ -377,6 +384,7 @@ class Demo extends React.Component {
                     showFilteredOnly={showFilteredOnly}
                     placeholder="Multiple Searchable TreeSelect"
                     searchPlaceholder="Start searching"
+                    onSearch={this.onSearch}
                 />
                 <br/>
                 <br/>
@@ -391,6 +399,7 @@ class Demo extends React.Component {
                     placeholder="search input autofocus"
                     searchPlaceholder="autofocus"
                     searchAutoFocus
+                    onSearch={this.onSearch}
                 />
             </>
         );
@@ -965,7 +974,7 @@ import { TreeSelect } from '@douyinfe/semi-ui';
             filterTreeNode
             expandedKeys={expandedKeys}
             onExpand={expandedKeys => setExpandedKeys(expandedKeys)}
-            onSearch={(inputValue, filteredExpandedKeys) => {
+            onSearch={(inputValue, filteredExpandedKeys, filteredNodes) => {
                 setExpandedKeys([...filteredExpandedKeys, ...expandedKeys]);
             }}
         />
@@ -1424,7 +1433,7 @@ function Demo() {
 | expandAll | Set whether to expand all nodes by default. If the data (`treeData`) changes, the default expansion will still be affected by this api | boolean | false | 1.30.0 |
 | expandedKeys        | (Controlled)Keys of expanded nodes. Direct child nodes will be displayed.  | string[]                    | -       | 0.32.0 |
 | keyMaps | Customize the key, label, and value fields in the node | object |  - | 2.47.0 |
-| filterTreeNode           | Toggle whether searchable or pass in a function to customize search behavior, data parameter provided since v2.28.0 | boolean\|(inputValue: string, treeNodeString: TreeNodeString, data?: TreeNodeData) => boolean | false       | -       |
+| filterTreeNode           | Toggle whether searchable or pass in a function to customize search behavior, data parameter provided since v2.28.0 | boolean\| <ApiType detail='(inputValue: string, treeNodeString: string, data?: TreeNodeData) => boolean'>Function</ApiType> | false       | -       |
 | getPopupContainer        | Container to render pop-up, you need to set 'position: relative`  This will change the DOM tree position, but not the view's rendering position.                                                    | function():HTMLElement                                            | -           | -       |
 | insetLabel               | Prefix alias,used mainly in Form                                                   | ReactNode                                                         | -           | 0.28.0  |
 | labelEllipsis | Toggle whether to ellipsis label when overflow | boolean | false\|true(virtualized) | 1.8.0 |  
@@ -1471,8 +1480,8 @@ function Demo() {
 | onClear     | Callback triggered when clear button is clicked   | (e: Event) => void |  -  |   2.52.0  |
 | onExpand                 | Callback function when expand or collapse a node                                    | <ApiType detail='(expandedKeys:array, {expanded: bool, node}) => void'>(expandedKeys, object) => void</ApiType>             | -           | -       |
 | onLoad | Callback function when a node is loaded | <ApiType detail='(loadedKeys: Set<string\>, treeNode: TreeNodeData) => void'>(loadedKeys, treeNode) => void</ApiType> | - | 1.32.0|
-| onSearch                 | Callback function when search value changes. `filteredExpandedKeys` represents the key of the node expanded due to search or value/defaultValue, which can be used when expandedKeys is controlled<br/> **filteredExpandedKeys is supported in 2.6.0**      | function(input: string, filteredExpandedKeys: string[])                                        | -           |     |
-| onSelect                 | Callback function when selected, return the key property of data                    | function(selectedKey:string, selected: bool, selectedNode: TreeNodeData)                      | -           | -       |
+| onSearch                 | Callback function when search value changes. <br/>`filteredExpandedKeys` represents the key of the node expanded due to search or value/defaultValue, which can be used when expandedKeys is controlled<br/> **filteredExpandedKeys is supported in 2.6.0**. <br/>`filteredNodes` represents the nodes hit by the search. **filteredNodes is supported in 2.57.0**       | function(input: string, filteredExpandedKeys: string[], filteredNodes: TreeNodeData[])                                        | -           |     |
+| onSelect                 | Callback function when selected, return the key property of data                    | <ApiType detail='(selectedKey:string, selected: bool, selectedNode: TreeNodeData) => void'>(selectedKey, selected, selectedNode)=>void</ApiType>                      | -           | -       |
 | onVisibleChange     | A callback triggered when the pop-up layer is displayed/hidden   | function(isVisible:boolean) |     |   1.4.0  |
 
 ### TreeNodeData

+ 14 - 3
content/input/treeselect/index.md

@@ -265,6 +265,9 @@ import { TreeSelect } from '@douyinfe/semi-ui';
 通过设置 `filterTreeNode` 属性可支持搜索功能。默认对 `label` 值进行搜索,可通过 `treeNodeFilterProp` 更改。
 
 如果只希望展示过滤后的结果,可以设置 `showFilteredOnly` 。
+
+如果想要获取搜索结果的具体信息,可使用 `onSearch` 回调函数,函数具体参数见 API 列表。
+
 ```jsx live=true
 import React from 'react';
 import { TreeSelect, Switch } from '@douyinfe/semi-ui';
@@ -275,10 +278,14 @@ class Demo extends React.Component {
             showFilteredOnly: false,
         };
         this.onChange = this.onChange.bind(this);
+        this.onSearch = this.onSearch.bind(this);
     }
     onChange(showFilteredOnly) {
         this.setState({ showFilteredOnly });
     }
+    onSearch(inputValue, filteredExpandedKeys, filteredNodes) {
+        console.log('onSearch', inputValue, filteredExpandedKeys, filteredNodes);
+    }
     render() {
         const treeData = [
             {
@@ -353,6 +360,7 @@ class Demo extends React.Component {
                     filterTreeNode
                     showFilteredOnly={showFilteredOnly}
                     placeholder="单选可搜索的"
+                    onSearch={this.onSearch}
                 />
                 <br/>
                 <br/>
@@ -366,6 +374,7 @@ class Demo extends React.Component {
                     showFilteredOnly={showFilteredOnly}
                     placeholder="多选可搜索的"
                     searchPlaceholder="请输入关键字开始搜索"
+                    onSearch={this.onSearch}
                 />
                 <br/>
                 <br/>
@@ -380,6 +389,7 @@ class Demo extends React.Component {
                     placeholder="搜索框autofocus"
                     searchPlaceholder="autofocus"
                     searchAutoFocus
+                    onSearch={this.onSearch}
                 />
             </>
         );
@@ -878,7 +888,8 @@ import { TreeSelect } from '@douyinfe/semi-ui';
 ```
 
 ### 开启搜索的展开受控
-传入 `expandedKeys` 时即为展开受控组件,可以配合 `onExpand` 使用。当展开受控时,如果开启 `filterTreeNode` 并进行搜索是不会再自动展开节点的,此时,节点的展开完全由 `expandedKeys` 来控制。你可以利用 `onSearch` 的入参 `filteredExpandedKeys`(version: >= 2.6.0) 来实现展开受控时的搜索展开效果。
+传入 `expandedKeys` 时即为展开受控组件,可以配合 `onExpand` 使用。当展开受控时,如果开启 `filterTreeNode` 并进行搜索是不会再自动展开节点的,此时,节点的展开完全由 `expandedKeys` 来控制。
+你可以利用 `onSearch` 的入参 `filteredExpandedKeys`(version: >= 2.6.0) 来实现展开受控时的搜索展开效果。
 
 ```jsx live=true hideInDSM
 import React, { useState } from 'react';
@@ -932,7 +943,7 @@ import { TreeSelect } from '@douyinfe/semi-ui';
             onExpand={expandedKeys => {
                 setExpandedKeys(expandedKeys);
             }}
-            onSearch={(inputValue, filteredExpandedKeys) => {
+            onSearch={(inputValue, filteredExpandedKeys, filteredNodes) => {
                 setExpandedKeys([...filteredExpandedKeys, ...expandedKeys]);
             }}
         />
@@ -1452,7 +1463,7 @@ function Demo() {
 | onExpand | 展示节点时调用                                                                                                                                    | <ApiType detail='(expandedKeys:array, {expanded: bool, node}) => void'>(expandedKeys, object) => void</ApiType> | - | - |
 | onFocus | 聚焦时的回调                                                                                                                                     | function(event) | - | - |
 | onLoad | 节点加载完毕时触发的回调                                                                                                                               | <ApiType detail='(loadedKeys: Set<string\>, treeNode: TreeNodeData) => void'>(loadedKeys, treeNode) => void</ApiType> |- |  1.32.0|
-| onSearch | 文本框值变化时回调。 入参 filteredExpandedKeys 表示因为搜索或 value / defaultValue 而展开的节点的 key, <br/>可以配合 expandedKeys 受控时使用。filteredExpandedKeys 在 2.6.0 中新增 |  <ApiType detail='function(sugInput: string, filteredExpandedKeys: string[])'>(sugInput, filteredExpandedKeys)=>void</ApiType>  |  |  |
+| onSearch | 文本框值变化时回调。 <br/>入参 `filteredExpandedKeys` 表示因为搜索或 value / defaultValue 而展开的节点的 key, 可以配合 expandedKeys 受控时使用。**filteredExpandedKeys 在 2.6.0 中新增**;<br/>入参 `filteredNodes` 是搜索命中的节点。**filteredNodes 在 2.57.0 中新增**|  <ApiType detail='function(sugInput: string, filteredExpandedKeys: string[], filteredNodes: TreeNodeData[])'>(sugInput, filteredExpandedKeys, filteredNodes)=>void</ApiType>  |  |  |
 | onSelect | 被选中时调用,返回值为当前事件选项的key值                                                                                                                     | <ApiType detail='(selectedKey:string, selected: bool, selectedNode: TreeNodeData) => void'>(selectedKey, selected, selectedNode)=>void</ApiType> | - | - |
 | onVisibleChange     | 弹出层展示/隐藏时触发的回调                                                                                                                             | function(isVisible:boolean) |     |   1.4.0  |
 

+ 2 - 0
content/show/modal/index.md

@@ -640,6 +640,7 @@ function Demo(props = {}) {
 | mask | 是否显示遮罩                                                                                                    | boolean | true |
 | maskClosable | 是否允许通过点击遮罩来关闭对话框                                                                                          | boolean | true |
 | maskStyle | 遮罩的样式                                                                                                     | CSSProperties | 无 |
+| modalContentClass | 可用于设置对话框内容的样式类名 | string | 无 |
 | motion | 动画效果开关                                                                                                    | boolean | true |
 | okButtonProps | 确认按钮的 props                                                                                               | [ButtonProps](/zh-CN/input/button#API参考) | 无 |
 | okText | 确认按钮的文字                                                                                                   | string | 无 |
@@ -680,6 +681,7 @@ function Demo(props = {}) {
 | mask | 是否显示遮罩 | boolean | true |
 | maskClosable | 是否允许通过点击遮罩来关闭对话框 | boolean | true |
 | maskStyle | 遮罩的样式 | CSSProperties | 无 |
+| modalContentClass | 可用于设置对话框内容的样式类名 | string | 无 |
 | okButtonProps | 确认按钮的 props | [ButtonProps](/zh-CN/input/button#API参考) | 无 |
 | okText | 确认按钮的文字 | string | 无 |
 | okType | 确认按钮的类型 | string | primary |

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

@@ -16,6 +16,28 @@ Version:Major.Minor.Patch (follow the **Semver** specification)
 
 ---
 
+
+- #### 🎉 2.57.0 (2024-04-26)
+- 【Fix】
+    - Fixed the issue where the asynchronous verification results will still be written to formState after Field is uninstalled [@sylingd](https://github.com/sylingd) [#2206](https://github.com/DouyinFE/semi-design/pull/2206)
+    - Fixed the problem of TreeSelect controlled value, defaultExpandedKeys is set, and when loading treeData remotely, defaultExpandedKeys does not take effect (affects version 2.49.2-2.56.3) [#2191](https://github.com/DouyinFE/semi-design/pull/2191)
+    - Remove invalid css rules in Banner `.semi-banner-content` [#2204](https://github.com/DouyinFE/semi-design/pull/2204)
+    - Fixed the problem that when the Tooltip is mounted, if the Cursor is already on the trigger's dom, and React reuses the trigger dom as the children of the tooltip, the tooltip will not be displayed [#2199](https://github.com/DouyinFE/semi-design/pull/2199)
+    - Fixed the problem that the selected items are not exposed through triggerRender in TreeSelect when multi-select, custom trigger, and checkRelation is unRelated  [#2188](https://github.com/DouyinFE/semi-design/issues/2188)
+    - Fixed the issue where the autoFocus cursor does not scroll to the end when setting defaultValue in Input and TextArea in the case of long text [#2193](https://github.com/DouyinFE/semi-design/issues/2193)
+- 【Design Token】
+    - Checkbox add `$color-checkbox_cardType-border-default` [#2208](https://github.com/DouyinFE/semi-design/pull/2208)
+
+
+#### 🎉 2.57.0-beta.0 (2024-04-22)
+
+- 【Fix】
+  - Fixed the issue where the text would flash once after selecting Option in the controlled and filter-enabled mode during Select radio selection and then corrected.
+- 【Feat】
+  - Modal support modalContentClass to set content 的 props [#2162](https://github.com/DouyinFE/semi-design/pull/2162) [@18852819321](https://github.com/18852819321)
+  - TreeSelect's onSearch method add `filteredNodes` which represents the list of nodes displayed after the search [@Hokori23](https://github.com/Hokori23)
+  - Form's formApi add getFormProps function
+
 #### 🎉 2.56.3 (2024-04-19)
 - 【Fix】
     - Fixed the issue where the Cancel button has a left margin after Modal footerFill is opened.[#2177](https://github.com/DouyinFE/semi-design/pull/2177)

+ 23 - 2
content/start/changelog/index.md

@@ -13,6 +13,27 @@ Semi 版本号遵循 **Semver** 规范(主版本号-次版本号-修订版本
 -   修订版本号(patch):仅会进行 bugfix,发布时间不限
 -   不同版本间的详细关系,可查阅 [FAQ](/zh-CN/start/faq)
 
+
+- #### 🎉 2.57.0 (2024-04-26)
+- 【Fix】
+    - 修复 Field卸载后,异步校验的结果仍然会写至formState的问题 [@sylingd](https://github.com/sylingd) [#2206](https://github.com/DouyinFE/semi-design/pull/2206)
+    - 修复 TreeSelect 受控 value,设置了 defaultExpandedKeys,远程加载 treeData时,defaultExpandedKeys 未生效问题(影响版本 2.49.2-2.56.3) [#2191](https://github.com/DouyinFE/semi-design/pull/2191)
+    - 修复 TreeSelect 在多选,自定义 trigger,checkRelation 为 unRelated情况下,选中项未通过 triggerRender 透出问题  [#2188](https://github.com/DouyinFE/semi-design/issues/2188)
+    - 修复 Tooltip 在挂载时,如果 Cursor 已经在 trigger 的 dom 上,且 React 复用了 trigger dom 作为 tooltip 的 children,tooltip 不会展示的问题 [#2199](https://github.com/DouyinFE/semi-design/pull/2199)
+    - 修复 Input 和 TextArea 设置 defaultValue 在长文本情况下,autoFocus 光标未滚动到末尾的问题  [#2193](https://github.com/DouyinFE/semi-design/issues/2193)
+    - 移除 Banner `.semi-banner-content` 中无效的css规则 [#2204](https://github.com/DouyinFE/semi-design/pull/2204)
+- 【Design Token】
+    - Checkbox 新增 `$color-checkbox_cardType-border-default` [#2208](https://github.com/DouyinFE/semi-design/pull/2208)
+
+
+#### 🎉 2.57.0-beta.0 (2024-04-22)
+- 【Feat】
+  - Modal 支持 modalContentClass 来设置 content 的 props [#2162](https://github.com/DouyinFE/semi-design/pull/2162) [@18852819321](https://github.com/18852819321)
+  - 给树形选择器TreeSelect的onSearch方法添加了`filteredNodes`入参,用来获取筛选后的节点列表 [@Hokori23](https://github.com/Hokori23) [#2155](https://github.com/DouyinFE/semi-design/pull/2155)
+  - Form 组件 FormApi 增加 getFormProps,可在 formApi中读取组件的 props如 disabled、trigger 等属性 [#2184](https://github.com/DouyinFE/semi-design/pull/2184)
+- 【Fix】
+  - 修复 Select 单选时,受控且filter开启模式下,选择Option后文本会闪烁一次后更正的问题 [#2170](https://github.com/DouyinFE/semi-design/pull/2170)
+
 #### 🎉 2.56.3 (2024-04-19)
 - 【Fix】
     - 修复 Modal footerFill 打开后,取消按钮带有左边距的问题 [#2177](https://github.com/DouyinFE/semi-design/pull/2177)
@@ -67,8 +88,8 @@ Semi 版本号遵循 **Semver** 规范(主版本号-次版本号-修订版本
 
 #### 🎉 2.55.1 (2024-03-25)
 - 【Fix】
-  - Fix: 修复 collapse & collapsible keepDOM 失效的问题 (影响版本 2.54.0-beta.0 ~ 2.55.0)[#2140](https://github.com/DouyinFE/semi-design/pull/2140)
-  - Fix:修正 collapse 的 lazyRender 默认值,由 2.54.0 设置的 true 改为更合适的 false,保持未设置 lazyRender的用例与 2.54前行为的一致性 (影响版本 2.54.0-beta.0 ~ 2.55.0)[#2140](https://github.com/DouyinFE/semi-design/pull/2140)
+  - 修复 collapse & collapsible keepDOM 失效的问题 (影响版本 2.54.0-beta.0 ~ 2.55.0)[#2140](https://github.com/DouyinFE/semi-design/pull/2140)
+  - 修正 collapse 的 lazyRender 默认值,由 2.54.0 设置的 true 改为更合适的 false,保持未设置 lazyRender的用例与 2.54前行为的一致性 (影响版本 2.54.0-beta.0 ~ 2.55.0)[#2140](https://github.com/DouyinFE/semi-design/pull/2140)
 
 #### 🎉 2.55.0 (2024-03-22)
 - 【Fix】

+ 5 - 0
cypress/e2e/table.spec.js

@@ -297,4 +297,9 @@ describe('table', () => {
         cy.visit('http://localhost:6006/iframe.html?args=&id=table--fixed-row-selection-empty&viewMode=story');
         cy.get('.semi-table-thead .semi-checkbox-unChecked').should('exist');
     });
+
+    it('test onGroupedRow return object includes className', () => {
+        cy.visit('http://localhost:6006/iframe.html?id=table--fixed-on-grouped-row-class-name&viewMode=story');
+        cy.get('tbody .semi-table-row-section').eq(0).should('have.class', 'test-group');
+    });
 });

+ 1 - 1
lerna.json

@@ -1,5 +1,5 @@
 {
     "useWorkspaces": true,
     "npmClient": "yarn",
-    "version": "2.56.3"
+    "version": "2.57.0"
 }

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

@@ -1,6 +1,6 @@
 {
     "name": "@douyinfe/semi-animation-react",
-    "version": "2.56.3",
+    "version": "2.57.0",
     "description": "motion library for semi-ui-react",
     "keywords": [
         "motion",
@@ -25,8 +25,8 @@
         "prepublishOnly": "npm run build:lib"
     },
     "dependencies": {
-        "@douyinfe/semi-animation": "2.56.3",
-        "@douyinfe/semi-animation-styled": "2.56.3",
+        "@douyinfe/semi-animation": "2.57.0",
+        "@douyinfe/semi-animation-styled": "2.57.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.56.3",
+    "version": "2.57.0",
     "description": "semi styled animation",
     "keywords": [
         "semi",

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

@@ -1,6 +1,6 @@
 {
     "name": "@douyinfe/semi-animation",
-    "version": "2.56.3",
+    "version": "2.57.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.56.3",
+    "version": "2.57.0",
     "description": "semi ui eslint plugin",
     "keywords": [
         "semi",

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

@@ -20,7 +20,6 @@ $module: #{$prefix}-banner;
         .#{$module}-content {
             display: flex;
             flex: 1;
-            align-items: top;
         }
     }
 

+ 1 - 1
packages/semi-foundation/checkbox/checkbox.scss

@@ -188,7 +188,7 @@ $module: #{$prefix}-checkbox;
         border-radius: $radius-checkbox_cardType;
         padding: $spacing-checkbox_cardType-paddingY $spacing-checkbox_cardType-paddingX;
         background: transparent;
-        border: $width-checkbox_cardType_checked-border solid transparent;
+        border: $width-checkbox_cardType_checked-border solid $color-checkbox_cardType-border-default;
 
 
         .#{$module}-inner {

+ 3 - 1
packages/semi-foundation/checkbox/variables.scss

@@ -38,6 +38,8 @@ $color-checkbox_checked-bg-disabled: var(--semi-color-primary-disabled); // 选
 $color-checkbox_checked-icon-disabled: var(--semi-color-white); // 选框禁用态对勾颜色
 $color-checkbox_primary-outline-focus: var(--semi-color-primary-light-active); // 复选框轮廓-聚焦颜色
 
+$color-checkbox_cardType-border-default: transparent; // 卡片复选框默认边框颜色
+
 $size-checkbox_inner-shadow: $border-thickness-control; // 选框内描边宽度
 $width-checkbox_inner: $width-icon-medium; // 选框对勾 icon 宽度
 $height-checkbox_inner: 20px; // 选框对勾 icon 高度
@@ -66,4 +68,4 @@ $font-checkbox_cardType_addon-fontWeight: $font-weight-bold; // 卡片类型复
 $font-checkbox_cardType_addon-lineHeight: 20px; // 卡片类型复选框的 addon 的文字行高
 $font-checkbox_cardType_extra-size: $font-size-regular; // 卡片类型复选框的 extra 的文字大小
 $font-checkbox_cardType_extra-fontWeight: normal; // 卡片类型复选框的 extra 的 fontWeight
-$font-checkbox_cardType_extra-lineHeight: 20px; // 卡片类型复选框的 extra 的文字行高
+$font-checkbox_cardType_extra-lineHeight: 20px; // 卡片类型复选框的 extra 的文字行高

+ 1 - 0
packages/semi-foundation/form/foundation.ts

@@ -613,6 +613,7 @@ export default class FormFoundation extends BaseFoundation<BaseFormAdapter> {
             getValue: (field?: string) => this.getValue(field, { needClone: true }),
             getValues: () => this.getValue(undefined, { needClone: true }),
             getFormState: () => this.getFormState(true),
+            getFormProps: (props?: Array<string>) => this.getFormProps(props),
             getInitValue: (field: string) => this.getInitValue(field),
             getInitValues: () => this.getInitValues(),
             getTouched: (field?: string) => this.getTouched(field),

+ 1 - 0
packages/semi-foundation/modal/modalFoundation.ts

@@ -22,6 +22,7 @@ export interface ModalProps {
     cancelText?: string;
     centered?: boolean;
     className?: string;
+    modalContentClass?: string;
     closable?: boolean;
     confirmLoading?: boolean;
     cancelLoading?: boolean;

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

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

+ 31 - 16
packages/semi-foundation/select/foundation.ts

@@ -346,7 +346,7 @@ export default class SelectFoundation extends BaseFoundation<SelectAdapter> {
             this.open();
             this._notifyFocus(e);
         } else if (isOpen && clickToHide) {
-            this.close(e);
+            this.close({ event: e });
         } else if (isOpen && !clickToHide) {
             this.focusInput();
         }
@@ -374,7 +374,7 @@ export default class SelectFoundation extends BaseFoundation<SelectAdapter> {
         this.bindKeyBoardEvent();
 
         this._adapter.registerClickOutsideHandler((e: MouseEvent) => {
-            this.close(e);
+            this.close({ event: e });
             this._notifyBlur(e);
             this._adapter.updateFocusState(false);
         });
@@ -389,9 +389,9 @@ export default class SelectFoundation extends BaseFoundation<SelectAdapter> {
         }
     }
 
-    close(e?: any, closeCb?: () => void) {
+    close(closeConfig?: { event?: any; closeCb?: () => void; notToggleInput?: boolean }) {
         // to support A11y, closing the panel trigger does not necessarily lose focus
-
+        const { event, closeCb, notToggleInput } = closeConfig || {};
         this._adapter.closeMenu();
         this._adapter.notifyDropdownVisibleChange(false);
         this._adapter.setIsFocusInContainer(false);
@@ -401,13 +401,14 @@ export default class SelectFoundation extends BaseFoundation<SelectAdapter> {
         this._adapter.unregisterClickOutsideHandler();
 
         const isFilterable = this._isFilterable();
-        if (isFilterable) {
+        // notToggleInput will only be true when in controlled mode - handleSingeleSelect process
+        if (isFilterable && !notToggleInput) {
             this.toggle2SearchInput(false);
         }
 
         this._adapter.once('popoverClose', () => {
             if (isFilterable) {
-                this.clearInput(e);
+                this.clearInput(event);
             }
             if (closeCb) {
                 closeCb();
@@ -443,18 +444,32 @@ export default class SelectFoundation extends BaseFoundation<SelectAdapter> {
         // If it is a controlled component, directly notify
         // Make sure that the operations of updating updateOptions are done after the animation ends
         // otherwise the content will be updated when the popup layer is not collapsed, and it looks like it will flash once when it is closed
+        const isFilterable = this._isFilterable();
+
         if (this._isControlledComponent()) {
-            this.close(event, () => {
-                this._notifyChange(selections);
+            this.close({ 
+                event: event,
+                notToggleInput: true,
+                closeCb: () => {
+                    // trigger props.onChange -> update props.value -> updateSelection
+                    this._notifyChange(selections);
+                    // make sure toggleSearchInput update after updateSelection in controlled mode, otherwise text in inactive DOM will update quicker than selection, looks like flash text
+                    if (isFilterable) {
+                        this.toggle2SearchInput(false);
+                    }
+                }
             });
         } else {
             this._adapter.updateSelection(selections);
             // notify user
             this._notifyChange(selections);
 
-            this.close(event, () => {
-                // Update the selected item in the drop-down box
-                this.updateOptionsActiveStatus(selections);
+            this.close({
+                event: event,
+                closeCb: () => {
+                    // Update the selected item in the drop-down box
+                    this.updateOptionsActiveStatus(selections);
+                },
             });
         }
     }
@@ -730,7 +745,7 @@ export default class SelectFoundation extends BaseFoundation<SelectAdapter> {
                 this._handleEnterKeyDown(event);
                 break;
             case KeyCode.ESC:
-                isOpen && this.close(event);
+                isOpen && this.close({ event: event });
                 filter && !multiple && this._focusTrigger();
                 break;
             case KeyCode.TAB:
@@ -822,7 +837,7 @@ export default class SelectFoundation extends BaseFoundation<SelectAdapter> {
                 }
             } else {
                 // there are no focusable elements inside the container, tab to next element and trigger blur
-                this.close(event);
+                this.close({ event: event });
                 this._notifyBlur(event);
             }
         } else {
@@ -842,7 +857,7 @@ export default class SelectFoundation extends BaseFoundation<SelectAdapter> {
         } else if (activeElement === focusableElements[focusableElements.length - 1]) {
             // focus in the last element in container, focus back to trigger and close panel
             this._focusTrigger(); 
-            this.close(event);
+            this.close({ event });
             handlePrevent(event);
         }
     }
@@ -853,7 +868,7 @@ export default class SelectFoundation extends BaseFoundation<SelectAdapter> {
 
         if (!isFocusInContainer) {
             // focus in trigger, close the panel, shift tab to previe element and trigger blur
-            this.close(event);
+            this.close({ event });
             this._notifyBlur(event);
         } else if (activeElement === focusableElements[0]) {
             // focus in the first element in container, focus back to trigger
@@ -883,7 +898,7 @@ export default class SelectFoundation extends BaseFoundation<SelectAdapter> {
                     this.onSelect(selectedOption, focusIndex, event);
                 }
             } else {
-                this.close(event);
+                this.close({ event });
             }
         }
     }

+ 14 - 2
packages/semi-foundation/table/rtl.scss

@@ -5,6 +5,18 @@ $module: #{$prefix}-table;
         direction: rtl;
         text-align: right;
 
+        &-align-left {
+            .#{$module}-operate-wrapper {
+                justify-content: flex-end;
+            }
+        }
+
+        &-align-right {
+            .#{$module}-operate-wrapper {
+                justify-content: flex-start;
+            }
+        }
+
         &-thead {
             & > .#{$module}-row {
                 & > .#{$module}-row-head {
@@ -98,12 +110,12 @@ $module: #{$prefix}-table;
             }
 
             &-sorter {
-                margin-left: auto;
+                margin-left: 0;
                 margin-right: $spacing-table_column_sorter-marginLeft;
             }
 
             &-filter {
-                margin-left: auto;
+                margin-left: 0;
                 margin-right: $spacing-table_column_filter-marginLeft;
             }
         }

+ 15 - 0
packages/semi-foundation/tagInput/tagInput.scss

@@ -255,6 +255,15 @@ $module: #{$prefix}-tagInput;
         }
     }
 
+    &-inset-label {
+        margin-right: $spacing-tagInput_insetLabel-marginRight;
+        font-weight: $font-tagInput_insetLabel-fontWeight;
+        @include font-size-regular;
+        color: $color-tagInput_prefix-text-default;
+        flex-shrink: 0;
+        white-space: nowrap;
+    }
+
     &-prefix,
     &-suffix {
         @include all-center;
@@ -281,6 +290,12 @@ $module: #{$prefix}-tagInput;
         }
     }
 
+    &-with-prefix {
+        .#{$prefix}-input {
+            padding-left: 0;
+        }
+    }
+
     &-tag-content-wrapper {
         display: flex;
         align-items: center;

+ 4 - 1
packages/semi-foundation/tagInput/variables.scss

@@ -28,7 +28,7 @@ $color-tagInput_danger-border-hover: var(--semi-color-danger-light-hover); // 
 $color-tagInput_danger-bg-focus: var(--semi-color-danger-light-default); // 危险标签输入框背景颜色 - 选中
 $color-tagInput_danger-border-focus: var(--semi-color-danger); // 危险标签输入框描边颜色 - 选中
 $color-tagInput_sortable_item_over-bg: var(--semi-color-primary); // 拖拽经过的元素前竖线背景色
-
+$color-tagInput_prefix-text-default: var(--semi-color-text-2); // 标签输入框 prefix 文字颜色
 $color-tagInput_handler-icon-default: var(--semi-color-text-2); // 可拖拽的标签拖拽按钮颜色
 
 $spacing-tagInput_small-Y: 1px; // 小尺寸标签输入框标签顶部外边距
@@ -37,6 +37,7 @@ $spacing-tagInput_large-Y: 3px; // 大尺寸标签输入框标签顶部外边距
 $spacing-tagInput_wrapper_n_paddingX: $spacing-tight; //标签输入框标签容器水平内边距
 $spacing-tagInput_drag_handler-marginRight: 4px; // 拖拽handler icon的右外边距 
 $spacing-tagInput_tag_icon_paddingLeft: 4px; // tag中有handler icon时tag的左内边距
+$spacing-tagInput_insetLabel-marginRight: $spacing-base-tight; // Form容器中标签输入框内嵌Label的右边距
 
 $height-tagInput-large: $height-control-large; // 大尺寸标签输入框高度
 $height-tagInput-default: $height-control-default; // 默认尺寸标签输入框高度
@@ -54,3 +55,5 @@ $width-tagInput_sortable_item_over: 2px; // 拖拽经过的元素前竖线宽度
 $radius-tagInput: var(--semi-border-radius-small); // 标签输入框圆角
 
 $z-tagInput_drag_item_move: 2000 !default; // 标签输入框中正在拖拽元素的z-index
+
+$font-tagInput_insetLabel-fontWeight: 600; // prefix 文字字重

+ 8 - 6
packages/semi-foundation/treeSelect/foundation.ts

@@ -139,7 +139,7 @@ export interface BasicTreeSelectProps extends Pick<BasicTreeProps,
     getPopupContainer?: () => HTMLElement;
     // triggerRender?: (props: BasicTriggerRenderProps) => any;
     onBlur?: (e: any) => void;
-    onSearch?: (sunInput: string, filteredExpandedKeys: string[]) => void;
+    onSearch?: (sunInput: string, filteredExpandedKeys: string[], filteredNodes: BasicTreeNodeData[]) => void;
     onChange?: BasicOnChange;
     onFocus?: (e: any) => void;
     onVisibleChange?: (isVisible: boolean) => void;
@@ -183,7 +183,7 @@ export interface TreeSelectAdapter<P = Record<string, any>, S = Record<string, a
     rePositionDropdown: () => void;
     updateState: (states: Partial<BasicTreeSelectInnerData>) => void;
     notifySelect: (selectedKey: string, selected: boolean, selectedNode: BasicTreeNodeData) => void;
-    notifySearch: (input: string, filteredExpandedKeys: string[]) => void;
+    notifySearch: (input: string, filteredExpandedKeys: string[], filteredNodes: BasicTreeNodeData[]) => void;
     cacheFlattenNodes: (bool: boolean) => void;
     openMenu: () => void;
     closeMenu: (cb?: () => void) => void;
@@ -613,6 +613,7 @@ export default class TreeSelectFoundation<P = Record<string, any>, S = Record<st
         const { showFilteredOnly, filterTreeNode, treeNodeFilterProp, keyMaps } = this.getProps();
         const realFilterProp = treeNodeFilterProp !== 'label' ? treeNodeFilterProp : get(keyMaps, 'label', 'label');
         const newExpandedKeys: Set<string> = new Set(expandedKeys);
+        let filteredNodes: BasicTreeNodeData[] = [];
         let filteredOptsKeys: string[] = [];
         let expandedOptsKeys = [];
         let newFlattenNodes = [];
@@ -622,19 +623,20 @@ export default class TreeSelectFoundation<P = Record<string, any>, S = Record<st
             expandedOptsKeys.forEach(item => newExpandedKeys.add(item));
             newFlattenNodes = flattenTreeData(treeData, newExpandedKeys, keyMaps);
         } else {
-            filteredOptsKeys = Object.values(keyEntities)
+            const filteredOpts = Object.values(keyEntities)
                 .filter((item: BasicKeyEntity) => {
                     const { data } = item;
                     return filter(sugInput, data, filterTreeNode, realFilterProp);
-                })
-                .map((item: BasicKeyEntity) => item.key);
+                });
+            filteredNodes = filteredOpts.map((item: BasicKeyEntity) => item.data);
+            filteredOptsKeys = filteredOpts.map((item: BasicKeyEntity) => item.key);
             expandedOptsKeys = findAncestorKeys(filteredOptsKeys, keyEntities, false);
             const shownChildKeys = findDescendantKeys(filteredOptsKeys, keyEntities, true);
             filteredShownKeys = new Set([...shownChildKeys, ...expandedOptsKeys]);
             newFlattenNodes = flattenTreeData(treeData, new Set(expandedOptsKeys), keyMaps, showFilteredOnly && filteredShownKeys);
         }
         const newFilteredExpandedKeys = new Set(expandedOptsKeys);
-        this._adapter.notifySearch(sugInput, Array.from(newFilteredExpandedKeys));
+        this._adapter.notifySearch(sugInput, Array.from(newFilteredExpandedKeys), filteredNodes);
         this._adapter.updateState({
             expandedKeys: newExpandedKeys,
             flattenNodes: newFlattenNodes,

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

@@ -1,6 +1,6 @@
 {
   "name": "@douyinfe/semi-icons-lab",
-  "version": "2.56.3",
+  "version": "2.57.0",
   "description": "semi icons lab",
   "keywords": [
     "semi",

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

@@ -1,6 +1,6 @@
 {
     "name": "@douyinfe/semi-icons",
-    "version": "2.56.3",
+    "version": "2.57.0",
     "description": "semi icons",
     "keywords": [
         "semi",

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

@@ -1,6 +1,6 @@
 {
     "name": "@douyinfe/semi-illustrations",
-    "version": "2.56.3",
+    "version": "2.57.0",
     "description": "semi illustrations",
     "keywords": [
         "semi",

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

@@ -1,6 +1,6 @@
 {
     "name": "@douyinfe/semi-next",
-    "version": "2.56.3",
+    "version": "2.57.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.56.3"
+        "@douyinfe/semi-webpack-plugin": "2.57.0"
     },
     "gitHead": "eb34a4f25f002bb4cbcfa51f3df93bed868c831a"
 }

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

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

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

@@ -1,6 +1,6 @@
 {
     "name": "@douyinfe/semi-scss-compile",
-    "version": "2.56.3",
+    "version": "2.57.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.56.3",
+    "version": "2.57.0",
     "description": "semi-theme-default",
     "keywords": [
         "semi-theme",

+ 1 - 1
packages/semi-ui/README.md

@@ -10,7 +10,7 @@
 <div align="center">
 
 [![LICENSE][license-badge]][license-url] [![NPM][npm-badge]][npm-url] [![CONTRIBUTORS][contributors-badge]][contributors-url]  ![Design Token][Design Token] [![FIGMA][figma-badge]][figma-url] 
-[![BUILD-JS][build-js-badge]][build-js-url] [![BUILD-CSS][build-css-badge]][build-css-url] [![CODECOV][codecov-badge]][codecov-url] [![Chromatic][chromatic-badge]][chromatic-url] [![Cypress][cypress-badge]][cypress-url]
+[![CODECOV][codecov-badge]][codecov-url] [![Chromatic][chromatic-badge]][chromatic-url] [![Cypress][cypress-badge]][cypress-url]
 [![Twitter Follow](https://img.shields.io/twitter/follow/SemiDesignUI?style=social)](https://twitter.com/SemiDesignUI)
 
 [npm-badge]: https://img.shields.io/npm/v/@douyinfe/semi-ui.svg

+ 11 - 4
packages/semi-ui/form/hoc/withField.tsx

@@ -147,6 +147,7 @@ function withField<
         const [cursor, setCursor, getCursor] = useStateWithGetter(0);
         const [status, setStatus] = useState(validateStatus); // use props.validateStatus to init
 
+        const isUnmounted = useRef(false);
         const rulesRef = useRef(rules);
         const validateRef = useRef(validate);
         const validatePromise = useRef<Promise<any> | null>(null);
@@ -159,6 +160,9 @@ function withField<
         };
 
         const updateError = (errors: any, callOpts?: CallOpts) => {
+            if (isUnmounted.current) {
+                return;
+            }
             if (errors === getError()) {
                 // When the inspection result is unchanged, no need to update, saving a forceUpdate overhead
                 // When errors is an array, deepEqual is not used, and it is always treated as a need to update
@@ -214,7 +218,7 @@ function withField<
                         (errors, fields) => {}
                     )
                     .then(res => {
-                        if (validatePromise.current !== rootPromise) {
+                        if (isUnmounted.current || validatePromise.current !== rootPromise) {
                             return;
                         }
                         // validation passed
@@ -223,7 +227,7 @@ function withField<
                         resolve({});
                     })
                     .catch(err => {
-                        if (validatePromise.current !== rootPromise) {
+                        if (isUnmounted.current || validatePromise.current !== rootPromise) {
                             return;
                         }
                         let { errors, fields } = err;
@@ -270,7 +274,7 @@ function withField<
                 } else if (isPromise(maybePromisedErrors)) {
                     maybePromisedErrors.then((result: any) => {
                         // If the async validate is outdated (a newer validate occurs), the result should be discarded
-                        if (validatePromise.current !== rootPromise) {
+                        if (isUnmounted.current || validatePromise.current !== rootPromise) {
                             return;
                         }
 
@@ -408,11 +412,14 @@ function withField<
             validateRef.current = validate;
         }, [rules, validate]);
 
-        // exec validate once when trigger inlcude 'mount'
         useIsomorphicEffect(() => {
+            // exec validate once when trigger include 'mount'
             if (validateOnMount) {
                 fieldValidate(value);
             }
+            return () => {
+                isUnmounted.current = true;
+            };
             // eslint-disable-next-line react-hooks/exhaustive-deps
         }, []);
 

+ 2 - 1
packages/semi-ui/modal/Modal.tsx

@@ -342,6 +342,7 @@ class Modal extends BaseComponent<ModalReactProps, ModalState> {
             zIndex,
             getPopupContainer,
             visible,
+            modalContentClass,
             ...restProps
         } = this.props;
         let style = styleFromProps;
@@ -394,7 +395,7 @@ class Modal extends BaseComponent<ModalReactProps, ModalState> {
                                         contentExtraProps={animationEventsNeedBind}
                                         maskExtraProps={maskAnimationEventsNeedBind}
                                         isFullScreen={this.state.isFullScreen}
-                                        contentClassName={animationClassName}
+                                        contentClassName={`${animationClassName} ${modalContentClass}`}
                                         maskClassName={maskAnimationClassName}
                                         className={classList}
                                         getPopupContainer={getPopupContainer}

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

@@ -1,6 +1,6 @@
 {
     "name": "@douyinfe/semi-ui",
-    "version": "2.56.3",
+    "version": "2.57.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.56.3",
-        "@douyinfe/semi-animation-react": "2.56.3",
-        "@douyinfe/semi-foundation": "2.56.3",
-        "@douyinfe/semi-icons": "2.56.3",
-        "@douyinfe/semi-illustrations": "2.56.3",
-        "@douyinfe/semi-theme-default": "2.56.3",
+        "@douyinfe/semi-animation": "2.57.0",
+        "@douyinfe/semi-animation-react": "2.57.0",
+        "@douyinfe/semi-foundation": "2.57.0",
+        "@douyinfe/semi-icons": "2.57.0",
+        "@douyinfe/semi-illustrations": "2.57.0",
+        "@douyinfe/semi-theme-default": "2.57.0",
         "async-validator": "^3.5.0",
         "classnames": "^2.2.6",
         "copy-text-to-clipboard": "^2.1.1",

+ 18 - 1
packages/semi-ui/select/_story/select.stories.jsx

@@ -1,7 +1,7 @@
 import React, { useState, useRef, useEffect } from 'react';
 
 import './select.scss';
-import { Input, Select, Button, Icon, Avatar, Checkbox, Form, withField, Space, Tag, Switch, Divider } from '../../index';
+import { Input, Select, Button, Icon, Avatar, Checkbox, Form, withField, Space, Tag, Switch, Divider, RadioGroup } from '../../index';
 import CustomTrigger from './CustomTrigger';
 import classNames from 'classnames';
 const Option = Select.Option;
@@ -1253,6 +1253,7 @@ RenderSelectedItem.parameters =  {
 };
 
 const ControlledSelect = () => {
+  const [filter, setFilter] = useState(true);
   const [value, setValue] = useState('nick');
   const [value2, setValue2] = useState('jerry');
   const [value3, setValue3] = useState();
@@ -1260,9 +1261,22 @@ const ControlledSelect = () => {
   const [value5, setValue5] = useState();
   return (
     <>
+      <RadioGroup
+        type='button'
+        defaultValue={false}
+        onChange={e => setFilter(e.target.value)}
+        options={[
+          { value: true, label: 'Filter enable' },
+          { value: false, label: 'Filter disable' },
+        ]}
+      >
+      </RadioGroup>
+      <br />
+      <br />
       <span>value + onChange</span>
       <Select
         value={value}
+        filter={filter}
         onChange={setValue}
         style={{
           width: 200,
@@ -1278,6 +1292,7 @@ const ControlledSelect = () => {
       <span>只传value,不传onChange</span>
       <Select
         value={value2}
+        filter={filter}
         style={{
           width: 200,
         }}
@@ -1293,6 +1308,7 @@ const ControlledSelect = () => {
       <Select
         value={value3}
         onChange={setValue3}
+        filter={filter}
         multiple
         style={{
           width: 200,
@@ -1312,6 +1328,7 @@ const ControlledSelect = () => {
       <Select
         value={value4}
         multiple
+        filter={filter}
         style={{
           width: 200,
         }}

+ 4 - 4
packages/semi-ui/table/Body/BaseRow.tsx

@@ -356,9 +356,9 @@ export default class TableRow extends BaseComponent<BaseRowProps, Record<string,
         const baseRowStyle = { ...style, ...customStyle };
 
         const rowCls =
-            typeof replaceClassName === 'string' && replaceClassName.length ?
-                replaceClassName :
-                classnames(
+            typeof replaceClassName === 'string' && replaceClassName.length
+                ? classnames(replaceClassName, customClassName)
+                : classnames(
                     className,
                     `${prefixCls}-row`,
                     {
@@ -405,4 +405,4 @@ export default class TableRow extends BaseComponent<BaseRowProps, Record<string,
     }
 }
 
-export type RenderExpandIcon = (record: Record<string, any>, isNested: boolean) => ReactNode | null;
+export type RenderExpandIcon = (record: Record<string, any>, isNested: boolean) => ReactNode | null;

+ 19 - 0
packages/semi-ui/table/_story/RTL/ColumnAlignWithSorter.tsx

@@ -0,0 +1,19 @@
+import React from 'react';
+import { Space } from '../../../index';
+import ColumnAlignWithSorter from '../v2/columnAlignWithSorter';
+import RTLWrapper from '../../../configProvider/_story/RTLDirection/RTLWrapper';
+
+function App() {
+    return (
+        <Space vertical align='start' style={{ width: 1200 }}>
+            <RTLWrapper defaultDirection='rtl'>
+                <ColumnAlignWithSorter />
+            </RTLWrapper>
+            <RTLWrapper defaultDirection='ltr'>
+                <ColumnAlignWithSorter />
+            </RTLWrapper>
+        </Space>
+    );
+}
+
+export default App;

+ 2 - 1
packages/semi-ui/table/_story/RTL/index.jsx

@@ -1,4 +1,5 @@
 
 export { default as RTLAlignScrollBar } from './AlignScrollBar';
 export { default as ColumnAlign } from './ColumnAlign';
-export { default as Direction } from './Direction';
+export { default as Direction } from './Direction';
+export { default as ColumnAlignWithSorter } from './ColumnAlignWithSorter';

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

@@ -72,7 +72,7 @@ export { default as VirtualizedDynamicData } from './VirtualizedDynamicData';
 export { default as MassiveColumns } from './MassiveColumns';
 export { default as ControlledPagination } from './ControlledPagination';
 export { default as FulldRenderDemo } from './FullRender';
-export { RTLAlignScrollBar, ColumnAlign, Direction  } from './RTL';
+export { RTLAlignScrollBar, ColumnAlign, Direction, ColumnAlignWithSorter  } from './RTL';
 export { default as JSXAsyncData } from './JSXAsyncData';
 export { default as ScrollBar } from './ScrollBar';
 export { default as TableSpan } from './TableSpan';
@@ -114,7 +114,8 @@ export {
     FixedRowSelectionHiddenResizable,
     FixedExpandGroupRow,
     FixedDefaultExpandedGroupedRows,
-    FixedRowSelectionEmpty
+    FixedRowSelectionEmpty,
+    FixedOnGroupedRowClassName
 } from './v2';
 export { default as FixSelectAll325 } from './Demos/rowSelection';
 

+ 105 - 0
packages/semi-ui/table/_story/v2/FixedOnGroupedRowClassName/index.tsx

@@ -0,0 +1,105 @@
+import React from 'react';
+import { Table, Avatar } from '@douyinfe/semi-ui';
+import * as dateFns from 'date-fns';
+
+const DAY = 24 * 60 * 60 * 1000;
+const figmaIconUrl = 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/figma-icon.png';
+
+export default function App() {
+    const getData = () => {
+        const data = [];
+        for (let i = 0; i < 46; i++) {
+            const isSemiDesign = i % 2 === 0;
+            const randomNumber = ((i * 1000) % 19) + 100;
+            data.push({
+                key: '' + i,
+                name: isSemiDesign ? `Semi Design 设计稿${i}.fig` : `Semi D2C 设计稿${i}.fig`,
+                owner: isSemiDesign ? '姜鹏志' : '郝宣',
+                size: randomNumber,
+                updateTime: new Date().valueOf() + randomNumber * DAY,
+                avatarBg: isSemiDesign ? 'grey' : 'red',
+            });
+        }
+        return data;
+    };
+
+    const data = getData();
+    const columns = [
+        {
+            title: '标题',
+            dataIndex: 'name',
+            width: 400,
+            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',
+            sorter: (a, b) => (a.size - b.size > 0 ? 1 : -1),
+            render: text => `${text} KB`,
+        },
+        {
+            title: '所有者',
+            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');
+            },
+        },
+    ];
+    const rowKey = record =>
+        `${record.owner && record.owner.toLowerCase()}-${record.name && record.name.toLowerCase()}`;
+
+    return (
+        <div style={{ padding: '20px 0px' }}>
+            <Table
+                dataSource={data}
+                rowKey={rowKey}
+                groupBy={'size'}
+                columns={columns}
+                renderGroupSection={groupKey => <strong>根据文件大小分组 {groupKey} KB</strong>}
+                onGroupedRow={(group, index) => {
+                    return {
+                        className: 'test-group',
+                        onClick: e => {
+                            console.log(`Grouped row clicked: `, group, index);
+                        },
+                    };
+                }}
+                clickGroupedRowToExpand // if you want to click the entire row to expand
+                scroll={{ y: 480 }}
+            />
+        </div>
+    );
+}

+ 82 - 0
packages/semi-ui/table/_story/v2/columnAlignWithSorter.tsx

@@ -0,0 +1,82 @@
+import React from 'react';
+import { Table } from '@douyinfe/semi-ui';
+
+export default function App() {
+    const columns = [
+        {
+            title: '大小(align left)',
+            dataIndex: 'size',
+            align: 'left',
+            sorter: (a, b) => (a.size - b.size > 0 ? 1 : -1),
+        },
+        {
+            title: '所有者(align right)',
+            dataIndex: 'owner',
+            align: 'right',
+            sorter: (a, b) => (a.size - b.size > 0 ? 1 : -1),
+        },
+        {
+            title: '更新日期(align left)',
+            dataIndex: 'updateTime',
+            align: 'left',
+            filters: [
+                {
+                    text: 'Semi Design 设计稿',
+                    value: 'Semi Design 设计稿',
+                },
+                {
+                    text: 'Semi D2C 设计稿',
+                    value: 'Semi D2C 设计稿',
+                },
+            ],
+            onFilter: (value, record) => record.name.includes(value),
+        },
+        {
+            title: '标题(align right)',
+            dataIndex: 'name',
+            align: 'right',
+            filters: [
+                {
+                    text: 'Semi Design 设计稿',
+                    value: 'Semi Design 设计稿',
+                },
+                {
+                    text: 'Semi D2C 设计稿',
+                    value: 'Semi D2C 设计稿',
+                },
+            ],
+            onFilter: (value, record) => record.name.includes(value),
+        },
+    ];
+    const data = [
+        {
+            key: '1',
+            name: 'Semi Design 设计稿.fig',
+            nameIconSrc: 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/figma-icon.png',
+            size: '2M',
+            owner: '姜鹏志',
+            updateTime: '2020-02-02 05:13',
+            avatarBg: 'grey',
+        },
+        {
+            key: '2',
+            name: 'Semi Design 分享演示文稿',
+            nameIconSrc: 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/docs-icon.png',
+            size: '2M',
+            owner: '郝宣',
+            updateTime: '2020-01-17 05:31',
+            avatarBg: 'red',
+        },
+        {
+            key: '3',
+            name: '设计文档',
+            nameIconSrc: 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/docs-icon.png',
+            size: '34KB',
+            owner: 'Zoey Edwards',
+            updateTime: '2020-01-26 11:01',
+            avatarBg: 'light-blue',
+        },
+    ];
+
+    return <Table columns={columns} dataSource={data} pagination={false} />;
+}

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

@@ -34,3 +34,4 @@ export { default as InputFilter } from './InputFilter';
 export { default as FixedExpandGroupRow } from './FixedExpandGroupRow';
 export { default as FixedDefaultExpandedGroupedRows } from './FixedExpandGroupRow/defaultExpandedGroupedRows';
 export { default as FixedRowSelectionEmpty } from './FixedRowSelectionEmpty';
+export { default as FixedOnGroupedRowClassName } from './FixedOnGroupedRowClassName';

+ 1 - 1
packages/semi-ui/table/interface.ts

@@ -190,7 +190,7 @@ export interface OnRowReturnObject extends Omit<React.DetailedHTMLProps<React.HT
     style?: React.CSSProperties;
     onClick?: (e: React.MouseEvent) => void
 }
-export interface OnGroupedRowReturnObject extends Omit<React.HTMLAttributes<HTMLTableRowElement>, 'className'> {
+export interface OnGroupedRowReturnObject extends React.HTMLAttributes<HTMLTableRowElement> {
     [x: string]: any;
     style?: React.CSSProperties;
     onClick?: (e: React.MouseEvent) => void

+ 1 - 0
packages/semi-ui/tagInput/_story/tagInput.stories.jsx

@@ -457,6 +457,7 @@ export const PrefixSuffix = () => (
     <br />
     <br />
     <TagInput style={style} prefix="Prefix" showClear />
+    <TagInput style={style} insetLabel="insetLabel" showClear />
     <br />
     <br />
     <TagInput style={style} suffix={<IconGift />} />

+ 5 - 0
packages/semi-ui/tagInput/index.tsx

@@ -565,6 +565,9 @@ class TagInput extends BaseComponent<TagInputProps, TagInputState> {
             disabled,
             placeholder,
             validateStatus,
+            prefix,
+            insetLabel,
+            suffix,
             ...rest
         } = this.props;
 
@@ -584,6 +587,8 @@ class TagInput extends BaseComponent<TagInputProps, TagInputState> {
             [`${prefixCls}-warning`]: validateStatus === 'warning',
             [`${prefixCls}-small`]: size === 'small',
             [`${prefixCls}-large`]: size === 'large',
+            [`${prefixCls}-with-prefix`]: !!prefix || !!insetLabel,
+            [`${prefixCls}-with-suffix`]: !!suffix,
         });
 
         const inputCls = cls(`${prefixCls}-wrapper-input`, `${prefixCls}-wrapper-input-${size}`);

+ 85 - 0
packages/semi-ui/treeSelect/__test__/treeSelect.test.js

@@ -179,6 +179,69 @@ const specialTreeData = [
     },
 ];
 
+const treeDataEnNA = {
+    label: 'North America',
+    value: 'North America',
+    key: '1',
+    children: [
+        {
+            label: 'United States',
+            value: 'United States',
+            key: '1-0'
+        },
+        {
+            label: 'Canada',
+            value: 'Canada',
+            key: '1-1'
+        }
+    ]
+}
+
+const treeDataEn = [
+    {
+        label: 'Asia',
+        value: 'Asia',
+        key: '0',
+        children: [
+            {
+                label: 'China',
+                value: 'China',
+                key: '0-0',
+                children: [
+                    {
+                        label: 'Beijing',
+                        value: 'Beijing',
+                        key: '0-0-0',
+                    },
+                    {
+                        label: 'Shanghai',
+                        value: 'Shanghai',
+                        key: '0-0-1',
+                    },
+                    {
+                        label: 'Chengdu',
+                        value: 'Chengdu',
+                        key: '0-0-2',
+                    },
+                ],
+            },
+            {
+                label: 'Japan',
+                value: 'Japan',
+                key: '0-1',
+                children: [
+                    {
+                        label: 'Osaka',
+                        value: 'Osaka',
+                        key: '0-1-0'
+                    }
+                ]
+            },
+        ],
+    },
+    treeDataEnNA
+];
+
 const defaultKeyMaps = {
     value: 'value1',
     key: 'key1',
@@ -1223,4 +1286,26 @@ describe('TreeSelect', () => {
         let selectContentNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-select-selection-content`)
         expect(selectContentNode.instance().textContent).toEqual('上海');
     });
+
+    it('onSearch + filteredNodes', () => {
+        let spyOnSearch = sinon.spy(() => { });
+        console.log('treeDataEn', treeDataEn);
+        let treeSelect = getTreeSelect({
+            filterTreeNode: true,
+            treeData: treeDataEn,
+            onSearch: spyOnSearch
+        });
+        const searchWrapper = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-search-wrapper`);
+        let searchValue = 'o';
+        let event = { target: { value: searchValue } };
+        searchWrapper.find('input').simulate('change', event);
+        const firstCall = spyOnSearch.getCall(0);
+        const args = firstCall.args;
+        expect(args[0]).toEqual(searchValue);
+        expect(args[1]).toEqual(['0-1', '0']);
+        expect(args[2]).toEqual([
+            treeDataEnNA,
+            { "label": "Osaka", "value": "Osaka", "key": "0-1-0" }
+        ]);
+    });
 })

+ 64 - 2
packages/semi-ui/treeSelect/_story/treeSelect.stories.jsx

@@ -1,8 +1,8 @@
 import React, { useState, useMemo, useRef, useCallback, useEffect } from 'react';
 import ReactDOM from 'react-dom';
-import { Icon, Input, Button, Form, Popover, Tag, Typography, CheckboxGroup, TagInput, Switch, Tree } from '../../index';
+import { Icon, Input, Button, Form, Popover, Tag, Typography, CheckboxGroup, TagInput, Switch } from '../../index';
 import TreeSelect from '../index';
-import { flattenDeep } from 'lodash';
+import { flattenDeep, without } from 'lodash';
 import CustomTrigger from './CustomTrigger';
 import { IconCreditCard, IconChevronDown, IconClose } from '@douyinfe/semi-icons';
 import copy from 'fast-copy';
@@ -2728,3 +2728,65 @@ export const WebCompTestOutside = () => {
     <my-web-component></my-web-component>
   );
 };
+
+export const CustomSelectAll = () => {
+  const [value, setValue] = useState([]);
+  const [filteredNodes, setFilteredNodes] = useState([])
+  const treeData = treeDataEn;
+  const onSearch = useCallback((inputValue, filteredExpandedKeys, _filteredNodes) => {
+    setFilteredNodes(_filteredNodes)
+  }, []);
+
+  const handleOnChange = useCallback((value) => {
+    setValue(value);
+  }, [])
+
+  // 是否全选
+  const allSelected = useMemo(() => {
+    if (!filteredNodes.length) {
+      return false;
+    }
+    const optionValues = filteredNodes.map(i => i.value);
+    return !without(optionValues, ...value).length;
+  }, [filteredNodes, value]);
+
+  const handleOnAllSelect = useCallback(() => {
+    const optionValues = filteredNodes.map(i => i.value);
+    handleOnChange(allSelected ? [] : optionValues);
+  }, [allSelected, handleOnChange, filteredNodes]);
+ 
+  const outerBottomSlot = useMemo(() => {
+    if (!filteredNodes.length) {
+      // 未筛选状态下不展示按钮
+      return null;
+    }
+    return (
+        <div style={{ padding: '5px 20px', borderTop: '1px solid var(--semi-color-border)'}}>
+          <Typography.Text link={true} onClick={handleOnAllSelect}>
+            {allSelected ? '取消全选' : '全选'}
+          </Typography.Text>
+        </div> 
+    );
+  }, [allSelected, handleOnAllSelect, filteredNodes]);
+
+  return (
+    <>
+      <span>本用例借助 onSearch 的第三个参数_filteredNodes 自定义搜索全选功能 </span>
+      <br />
+      <TreeSelect
+          multiple
+          style={{ width: 300 }}
+          dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
+          treeData={treeData}
+          filterTreeNode
+          searchPosition='trigger'
+          showFilteredOnly
+          onSearch={onSearch}
+          onChange={handleOnChange}
+          value={value}
+          showClear
+          outerBottomSlot={outerBottomSlot}
+      />
+    </>  
+  );
+};

+ 2 - 17
packages/semi-ui/treeSelect/index.tsx

@@ -446,21 +446,6 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
                     props.multiple,
                     valueEntities
                 );
-            } else if ((!isExpandControlled && needUpdateTreeData) && props.value) {
-                // 当 treeData 已经设置具体的值,并且设置了 props.loadData ,则认为 treeData 的更新是因为 loadData 导致的
-                // 如果是因为 loadData 导致 treeData改变, 此时在这里重新计算 key 会导致为未选中的展开项目被收起
-                // 所以此时不需要重新计算 expandedKeys,因为在点击展开按钮时候已经把被展开的项添加到 expandedKeys 中
-                // When treeData has a specific value and props.loadData is set, it is considered that the update of treeData is caused by loadData
-                // If the treeData is changed because of loadData, recalculating the key here will cause the unselected expanded items to be collapsed
-                // So there is no need to recalculate expandedKeys at this time, because the expanded item has been added to expandedKeys when the expand button is clicked
-                if (!(prevState.treeData && prevState.treeData?.length > 0 && props.loadData)) {
-                    newState.expandedKeys = calcExpandedKeysForValues(
-                        props.value,
-                        keyEntities,
-                        props.multiple,
-                        valueEntities
-                    );
-                }
             }
 
             if (!newState.expandedKeys) {
@@ -682,8 +667,8 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
             notifySelect: ((selectKey, bool, node) => {
                 this.props.onSelect && this.props.onSelect(selectKey, bool, node);
             }),
-            notifySearch: (input, filteredExpandedKeys) => {
-                this.props.onSearch && this.props.onSearch(input, filteredExpandedKeys);
+            notifySearch: (input, filteredExpandedKeys, filteredNodes) => {
+                this.props.onSearch && this.props.onSearch(input, filteredExpandedKeys, filteredNodes);
             },
             cacheFlattenNodes: bool => {
                 this.setState({ cachedFlattenNodes: bool ? cloneDeep(this.state.flattenNodes) : undefined });

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

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

+ 253 - 253
sitemap.xml

@@ -2,335 +2,335 @@
 <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-04-19T07:00:38.526Z</lastmod>
+        <lastmod>2024-04-26T09:30:20.659Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://medium.com/front-end-weekly/how-we-test-semi-design-component-libraries-64b854f63b65</loc>
-        <lastmod>2024-04-19T07:00:38.417Z</lastmod>
+        <lastmod>2024-04-26T09:30:19.686Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://mp.weixin.qq.com/s/noHoWRuA25PgqFNcurhIUA</loc>
-        <lastmod>2024-04-19T07:00:40.383Z</lastmod>
+        <lastmod>2024-04-26T09:30:40.016Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://mp.weixin.qq.com/s/O3js-SZDNPEOjGxh-aAkbw</loc>
-        <lastmod>2024-04-19T07:00:50.841Z</lastmod>
+        <lastmod>2024-04-26T09:30:23.450Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/code/en-US</loc>
-        <lastmod>2024-03-22T10:17:50.116Z</lastmod>
+        <lastmod>2024-04-26T09:30:20.953Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/en-US/about/contact</loc>
-        <lastmod>2024-03-22T10:17:50.129Z</lastmod>
+        <lastmod>2024-04-26T09:30:21.229Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/en-US/about/known-issues</loc>
-        <lastmod>2024-03-22T10:17:50.224Z</lastmod>
+        <lastmod>2024-04-26T09:30:21.265Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/en-US/about/roadmap</loc>
-        <lastmod>2024-03-22T10:17:50.222Z</lastmod>
+        <lastmod>2024-04-26T09:30:21.485Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/en-US/about/schema</loc>
-        <lastmod>2024-03-22T10:17:50.490Z</lastmod>
+        <lastmod>2024-04-26T09:30:21.559Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/en-US/d2c/inspect</loc>
-        <lastmod>2024-03-22T10:17:50.498Z</lastmod>
+        <lastmod>2024-04-26T09:30:22.136Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/en-US/d2c/mark</loc>
-        <lastmod>2024-03-22T10:17:50.680Z</lastmod>
+        <lastmod>2024-04-26T09:30:22.181Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/en-US/d2c/mark-icon</loc>
-        <lastmod>2024-03-22T10:17:50.705Z</lastmod>
+        <lastmod>2024-04-26T09:30:22.494Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/en-US/d2c/mark-library</loc>
-        <lastmod>2024-03-22T10:17:51.558Z</lastmod>
+        <lastmod>2024-04-26T09:30:22.213Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/en-US/d2c/mark-table</loc>
-        <lastmod>2024-03-22T10:17:51.123Z</lastmod>
+        <lastmod>2024-04-26T09:30:22.263Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/en-US/d2c/settings</loc>
-        <lastmod>2024-03-22T10:17:51.314Z</lastmod>
+        <lastmod>2024-04-26T09:30:22.247Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/en-US/d2c/support-list</loc>
-        <lastmod>2024-03-22T10:17:51.372Z</lastmod>
+        <lastmod>2024-04-26T09:30:23.397Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/en-US/d2c/transform-plugin</loc>
-        <lastmod>2024-03-22T10:17:52.110Z</lastmod>
+        <lastmod>2024-04-26T09:30:22.789Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/en-US/d2c/translate-logic</loc>
-        <lastmod>2024-03-22T10:17:52.136Z</lastmod>
+        <lastmod>2024-04-26T09:30:23.377Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/en-US/d2c/translate-page</loc>
-        <lastmod>2024-03-22T10:17:52.387Z</lastmod>
+        <lastmod>2024-04-26T09:30:23.389Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/en-US/start/changelog</loc>
-        <lastmod>2024-03-22T10:17:52.394Z</lastmod>
+        <lastmod>2024-04-26T09:30:23.609Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/en-US/start/faq</loc>
-        <lastmod>2024-03-22T10:17:52.601Z</lastmod>
+        <lastmod>2024-04-26T09:30:23.378Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/en-US/start/introduction</loc>
-        <lastmod>2024-03-22T10:17:52.677Z</lastmod>
+        <lastmod>2024-04-26T09:30:23.625Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/en-US/start/quick-start</loc>
-        <lastmod>2024-03-22T10:17:52.888Z</lastmod>
+        <lastmod>2024-04-26T09:30:24.528Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/en-US/start/terms</loc>
-        <lastmod>2024-03-22T10:17:52.838Z</lastmod>
+        <lastmod>2024-04-26T09:30:23.767Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/en-US/uikit/create</loc>
-        <lastmod>2024-03-22T10:17:52.854Z</lastmod>
+        <lastmod>2024-04-26T09:30:23.582Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/en-US/uikit/figma-usage</loc>
-        <lastmod>2024-03-22T10:17:52.873Z</lastmod>
+        <lastmod>2024-04-26T09:30:23.869Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/en-US/uikit/form-usage</loc>
-        <lastmod>2024-03-22T10:17:53.600Z</lastmod>
+        <lastmod>2024-04-26T09:30:23.846Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/en-US/uikit/migrate</loc>
-        <lastmod>2024-03-22T10:17:53.608Z</lastmod>
+        <lastmod>2024-04-26T09:30:23.893Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/en-US/uikit/rules</loc>
-        <lastmod>2024-03-22T10:17:53.647Z</lastmod>
+        <lastmod>2024-04-26T09:30:23.945Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/en-US/uikit/table-usage</loc>
-        <lastmod>2024-03-22T10:17:53.683Z</lastmod>
+        <lastmod>2024-04-26T09:30:24.257Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/zh-CN</loc>
-        <lastmod>2024-03-22T10:17:54.099Z</lastmod>
+        <lastmod>2024-04-26T09:30:24.064Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/zh-CN/about/contact</loc>
-        <lastmod>2024-03-22T10:17:53.874Z</lastmod>
+        <lastmod>2024-04-26T09:30:24.197Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/zh-CN/about/known-issues</loc>
-        <lastmod>2024-03-22T10:17:53.875Z</lastmod>
+        <lastmod>2024-04-26T09:30:24.250Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/zh-CN/about/roadmap</loc>
-        <lastmod>2024-03-22T10:17:53.884Z</lastmod>
+        <lastmod>2024-04-26T09:30:24.817Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/zh-CN/about/schema</loc>
-        <lastmod>2024-03-22T10:17:54.601Z</lastmod>
+        <lastmod>2024-04-26T09:30:25.184Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/zh-CN/d2c/inspect</loc>
-        <lastmod>2024-03-22T10:17:54.578Z</lastmod>
+        <lastmod>2024-04-26T09:30:24.941Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/zh-CN/d2c/mark</loc>
-        <lastmod>2024-03-22T10:17:54.887Z</lastmod>
+        <lastmod>2024-04-26T09:30:24.977Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/zh-CN/d2c/mark-icon</loc>
-        <lastmod>2024-03-22T10:17:54.888Z</lastmod>
+        <lastmod>2024-04-26T09:30:25.287Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/zh-CN/d2c/mark-library</loc>
-        <lastmod>2024-03-22T10:17:55.017Z</lastmod>
+        <lastmod>2024-04-26T09:30:25.118Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/zh-CN/d2c/mark-table</loc>
-        <lastmod>2024-03-22T10:17:55.065Z</lastmod>
+        <lastmod>2024-04-26T09:30:25.592Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/zh-CN/d2c/settings</loc>
-        <lastmod>2024-03-22T10:17:55.584Z</lastmod>
+        <lastmod>2024-04-26T09:30:25.887Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/zh-CN/d2c/support-list</loc>
-        <lastmod>2024-03-22T10:17:55.619Z</lastmod>
+        <lastmod>2024-04-26T09:30:25.891Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/zh-CN/d2c/transform-plugin</loc>
-        <lastmod>2024-03-22T10:17:55.563Z</lastmod>
+        <lastmod>2024-04-26T09:30:25.723Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/zh-CN/d2c/translate-logic</loc>
-        <lastmod>2024-03-22T10:17:55.638Z</lastmod>
+        <lastmod>2024-04-26T09:30:26.804Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/zh-CN/d2c/translate-page</loc>
-        <lastmod>2024-03-22T10:17:55.782Z</lastmod>
+        <lastmod>2024-04-26T09:30:27.366Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/zh-CN/start/changelog</loc>
-        <lastmod>2024-03-22T10:17:55.738Z</lastmod>
+        <lastmod>2024-04-26T09:30:26.642Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/zh-CN/start/faq</loc>
-        <lastmod>2024-03-22T10:17:55.998Z</lastmod>
+        <lastmod>2024-04-26T09:30:26.558Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/zh-CN/start/introduction</loc>
-        <lastmod>2024-03-22T10:17:56.044Z</lastmod>
+        <lastmod>2024-04-26T09:30:26.515Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/zh-CN/start/quick-start</loc>
-        <lastmod>2024-03-22T10:17:56.228Z</lastmod>
+        <lastmod>2024-04-26T09:30:26.514Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/zh-CN/start/terms</loc>
-        <lastmod>2024-03-22T10:17:56.234Z</lastmod>
+        <lastmod>2024-04-26T09:30:26.462Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/zh-CN/uikit/create</loc>
-        <lastmod>2024-03-22T10:17:56.205Z</lastmod>
+        <lastmod>2024-04-26T09:30:26.614Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/zh-CN/uikit/figma-usage</loc>
-        <lastmod>2024-03-22T10:17:56.235Z</lastmod>
+        <lastmod>2024-04-26T09:30:27.021Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/zh-CN/uikit/form-usage</loc>
-        <lastmod>2024-03-22T10:17:56.190Z</lastmod>
+        <lastmod>2024-04-26T09:30:26.426Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/zh-CN/uikit/migrate</loc>
-        <lastmod>2024-03-22T10:17:56.225Z</lastmod>
+        <lastmod>2024-04-26T09:30:26.737Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/zh-CN/uikit/rules</loc>
-        <lastmod>2024-03-22T10:17:56.248Z</lastmod>
+        <lastmod>2024-04-26T09:30:26.748Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/code/zh-CN/uikit/table-usage</loc>
-        <lastmod>2024-03-22T10:17:56.438Z</lastmod>
+        <lastmod>2024-04-26T09:30:26.899Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.93</scm>
+        <scm>1.0.0.94</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/feedback/banner</loc>
@@ -382,7 +382,7 @@
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/handbook/tools</loc>
-        <lastmod>2024-03-18T12:30:43.500Z</lastmod>
+        <lastmod>2024-04-26T09:30:27.147Z</lastmod>
         <changefreq>weekly</changefreq>
         <scm>1.0.0.133</scm>
     </url>
@@ -790,77 +790,77 @@
     </url>
     <url>
         <loc>https://semi.design/en-US/basic/divider</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/basic/grid</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/basic/icon</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/basic/layout</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/basic/space</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/basic/tokens</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/basic/typography</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/feedback/banner</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/feedback/notification</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/feedback/popconfirm</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/feedback/progress</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/feedback/skeleton</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/feedback/spin</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/feedback/toast</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/autocomplete</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
@@ -870,362 +870,362 @@
     </url>
     <url>
         <loc>https://semi.design/en-US/input/cascader</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/checkbox</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/datepicker</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/form</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/input</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/inputnumber</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/radio</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/rating</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/select</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/slider</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/switch</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/taginput</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/timepicker</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/transfer</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/treeselect</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/upload</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/navigation/anchor</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/navigation/backtop</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/navigation/breadcrumb</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/navigation/navigation</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/navigation/pagination</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/navigation/steps</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/navigation/tabs</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/navigation/tree</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/other/configprovider</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/other/locale</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/avatar</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/badge</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/calendar</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/card</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/carousel</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/collapse</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/collapsible</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/descriptions</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/dropdown</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/empty</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/highlight</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/image</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/list</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/modal</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/overflowlist</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/popover</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/scrolllist</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/sidesheet</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/table</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/tag</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/timeline</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/tooltip</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/accessibility</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/changelog</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/customize-theme</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/dark-mode</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/faq</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/getting-started</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/introduction</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/overview</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/update-to-v2</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/basic/divider</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/basic/grid</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/basic/icon</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/basic/layout</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/basic/space</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/basic/tokens</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/basic/typography</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/feedback/banner</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/feedback/notification</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/feedback/popconfirm</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/feedback/progress</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/feedback/skeleton</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/feedback/spin</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/feedback/toast</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/autocomplete</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
@@ -1235,287 +1235,287 @@
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/cascader</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/checkbox</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/datepicker</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/form</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/input</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/inputnumber</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/radio</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/rating</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/select</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/slider</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/switch</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/taginput</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/timepicker</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/transfer</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/treeselect</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/upload</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/navigation/anchor</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/navigation/backtop</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/navigation/breadcrumb</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/navigation/navigation</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/navigation/pagination</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/navigation/steps</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/navigation/tabs</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/navigation/tree</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/other/configprovider</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/other/locale</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/avatar</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/badge</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/calendar</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/card</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/carousel</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/collapse</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/collapsible</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/descriptions</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/dropdown</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/empty</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/highlight</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/image</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/list</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/modal</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/overflowlist</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/popover</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/scrolllist</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/sidesheet</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/table</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/tag</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/timeline</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/tooltip</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/accessibility</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/changelog</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/customize-theme</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/dark-mode</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/faq</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/getting-started</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/introduction</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/overview</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/update-to-v2</loc>
-        <lastmod>2024-04-19T06:51:06.000Z</lastmod>
+        <lastmod>2024-04-26T09:26:20.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
 </urlset>

+ 87 - 0
yarn.lock

@@ -1519,11 +1519,25 @@
     "@douyinfe/semi-animation-styled" "2.23.2"
     classnames "^2.2.6"
 
+"@douyinfe/[email protected]":
+  version "2.56.3"
+  resolved "https://registry.yarnpkg.com/@douyinfe/semi-animation-react/-/semi-animation-react-2.56.3.tgz#6d161426567b59097e66a0a7d319e14e5f74a8fc"
+  integrity sha512-www06W06X8W+Ou9V2Alfs+6LpKd9Ps3uPrrpIind77YWNDT2KIca36Lrk4l+dCjHc9DTTLnw3BLxXn1/O83Tuw==
+  dependencies:
+    "@douyinfe/semi-animation" "2.56.3"
+    "@douyinfe/semi-animation-styled" "2.56.3"
+    classnames "^2.2.6"
+
 "@douyinfe/[email protected]":
   version "2.23.2"
   resolved "https://registry.npmjs.org/@douyinfe/semi-animation-styled/-/semi-animation-styled-2.23.2.tgz#f18bc074515441c297cc636ed98521e249d093c9"
   integrity sha512-cKaA1yGHPF76Rx7EZDZicj+1oX1su2wnqb/UGFOTquAwqWmkTfgQ+EKxCd/N704WH+RtmGf4xbrJKpBvvcEdSQ==
 
+"@douyinfe/[email protected]":
+  version "2.56.3"
+  resolved "https://registry.yarnpkg.com/@douyinfe/semi-animation-styled/-/semi-animation-styled-2.56.3.tgz#f8853b819404c521c01ca1ad6d725bc778b1ae0f"
+  integrity sha512-KA8lk+m6lJtsli0Nhd1KPo6fv7Bfmi56vUCJLeRwI28Svar2+6vIF0wAUCCszCFhvuPVPzQbl5S1s3erJnWseA==
+
 "@douyinfe/[email protected]":
   version "2.12.0"
   resolved "https://registry.npmjs.org/@douyinfe/semi-animation/-/semi-animation-2.12.0.tgz#51fe52d3911c2591a80a6e9fe96e6809c1511f13"
@@ -1539,6 +1553,13 @@
   dependencies:
     bezier-easing "^2.1.0"
 
+"@douyinfe/[email protected]":
+  version "2.56.3"
+  resolved "https://registry.yarnpkg.com/@douyinfe/semi-animation/-/semi-animation-2.56.3.tgz#e5eb82ae8581eb38554668aca24fd30d40f407c3"
+  integrity sha512-aRNoVpWgav6+zg5x1ITZE7ra8k+o6dbdJ4rmcr9J6BgnyEogx21wwNNgbcSymQKLI5CF1aWsORPbpGVgXt8J/w==
+  dependencies:
+    bezier-easing "^2.1.0"
+
 "@douyinfe/[email protected]":
   version "2.33.1"
   resolved "https://registry.npmjs.org/@douyinfe/semi-foundation/-/semi-foundation-2.33.1.tgz#1dfe6233e35a4ed768cb580b0c9a677d1c34ffba"
@@ -1553,6 +1574,21 @@
     memoize-one "^5.2.1"
     scroll-into-view-if-needed "^2.2.24"
 
+"@douyinfe/[email protected]":
+  version "2.56.3"
+  resolved "https://registry.yarnpkg.com/@douyinfe/semi-foundation/-/semi-foundation-2.56.3.tgz#387bbbe14c9b67b703be92d428a105fd0e7b9952"
+  integrity sha512-aqK7pVbK4BtnbwjSD5GBa/gF8PpJjnwVIsCYOM8INr4lqxi+w6nXCX3n1omlwWPKxC7/AxtL6cMw/FXeVJ9uRQ==
+  dependencies:
+    "@douyinfe/semi-animation" "2.56.3"
+    async-validator "^3.5.0"
+    classnames "^2.2.6"
+    date-fns "^2.29.3"
+    date-fns-tz "^1.3.8"
+    fast-copy "^3.0.1 "
+    lodash "^4.17.21"
+    memoize-one "^5.2.1"
+    scroll-into-view-if-needed "^2.2.24"
+
 "@douyinfe/[email protected]", "@douyinfe/semi-icons@latest":
   version "2.33.1"
   resolved "https://registry.yarnpkg.com/@douyinfe/semi-icons/-/semi-icons-2.33.1.tgz#8e2871d9bc0ab7e12df74e3c71802d53d69b7425"
@@ -1560,11 +1596,23 @@
   dependencies:
     classnames "^2.2.6"
 
+"@douyinfe/[email protected]", "@douyinfe/semi-icons@^2.0.0":
+  version "2.56.3"
+  resolved "https://registry.yarnpkg.com/@douyinfe/semi-icons/-/semi-icons-2.56.3.tgz#2855e64866661bea94cd6ac7cd59beba8c8b6da6"
+  integrity sha512-6AH1q+wDO2xX62k2bzBDqYwao3Eis2h9q2t3CRQPkvwNIferx+MmBU9ZZkvR2Q2RewcQRVIi+dN9qX9TcWNsTA==
+  dependencies:
+    classnames "^2.2.6"
+
 "@douyinfe/[email protected]":
   version "2.33.1"
   resolved "https://registry.npmjs.org/@douyinfe/semi-illustrations/-/semi-illustrations-2.33.1.tgz#530ab851f4dc32a52221c4067c778c800b9b55d7"
   integrity sha512-tTTUN8QwnQiF++sk4VBNzfkG87aYZ4iUeqk2ys8/ymVUmCZQ7y46ys020GO1MfPHRR47OMFPI82FVcH1WQtE3g==
 
+"@douyinfe/[email protected]":
+  version "2.56.3"
+  resolved "https://registry.yarnpkg.com/@douyinfe/semi-illustrations/-/semi-illustrations-2.56.3.tgz#8bd1ef6b6b5a610f0a9111000781ace28f3a0450"
+  integrity sha512-jHf09rWJ/Iktl4H+wpCcHXZ5/l97SfyZYvw9hSWZsmLSsW78mNV0Zu4wyM8c7/zhMbYxLmAeTSNZS1TFGPKkbw==
+
 "@douyinfe/[email protected]":
   version "2.23.2"
   resolved "https://registry.npmjs.org/@douyinfe/semi-scss-compile/-/semi-scss-compile-2.23.2.tgz#30884bb194ee9ae1e81877985e5663c3297c1ced"
@@ -1638,6 +1686,40 @@
   dependencies:
     glob "^7.1.6"
 
+"@douyinfe/[email protected]":
+  version "2.56.3"
+  resolved "https://registry.yarnpkg.com/@douyinfe/semi-theme-default/-/semi-theme-default-2.56.3.tgz#fc2ac74df82528499b0a929e874121ddfdf44a4b"
+  integrity sha512-T9dNTtvn9/nD0QDJupCrMEQlqpu/fv4XtjieyHZ2RTutHfhZPLRjwcqx9vOVmXmu2wb90GbME1BDWqS7gmyhIg==
+  dependencies:
+    glob "^7.1.6"
+
+"@douyinfe/semi-ui@^2.0.0":
+  version "2.56.3"
+  resolved "https://registry.yarnpkg.com/@douyinfe/semi-ui/-/semi-ui-2.56.3.tgz#cff9d967c76e8de41fccfe34243bdb7d2cc9c52e"
+  integrity sha512-veU6Io+pi4enf5QQ52Wp2xbHP7VkNSLKv17IAz5HO9UINkc+ROeMGC/0J/u2xt5oW6FNv1zLoWqaAUYSl1fQjw==
+  dependencies:
+    "@dnd-kit/core" "^6.0.8"
+    "@dnd-kit/sortable" "^7.0.2"
+    "@dnd-kit/utilities" "^3.2.1"
+    "@douyinfe/semi-animation" "2.56.3"
+    "@douyinfe/semi-animation-react" "2.56.3"
+    "@douyinfe/semi-foundation" "2.56.3"
+    "@douyinfe/semi-icons" "2.56.3"
+    "@douyinfe/semi-illustrations" "2.56.3"
+    "@douyinfe/semi-theme-default" "2.56.3"
+    async-validator "^3.5.0"
+    classnames "^2.2.6"
+    copy-text-to-clipboard "^2.1.1"
+    date-fns "^2.29.3"
+    date-fns-tz "^1.3.8"
+    fast-copy "^3.0.1 "
+    lodash "^4.17.21"
+    prop-types "^15.7.2"
+    react-resizable "^3.0.5"
+    react-window "^1.8.2"
+    scroll-into-view-if-needed "^2.2.24"
+    utility-types "^3.10.0"
+
 "@douyinfe/semi-ui@latest":
   version "2.33.1"
   resolved "https://registry.yarnpkg.com/@douyinfe/semi-ui/-/semi-ui-2.33.1.tgz#3234ca96eb3560b8299bc9750fbe59446522d9bb"
@@ -11636,6 +11718,11 @@ eslint-plugin-react@^7.20.6, eslint-plugin-react@^7.24.0:
     semver "^6.3.0"
     string.prototype.matchall "^4.0.8"
 
+eslint-plugin-semi-design@^2.33.0:
+  version "2.56.3"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-semi-design/-/eslint-plugin-semi-design-2.56.3.tgz#9da23941133dc5d36f5b331c423fce77252a158e"
+  integrity sha512-DzInwf/TC0/rjc3eJOkc9/p/FBxY2GcgMC6jpisxua9ryG5gyry7xhs75rVrLodw6zKVarpjALttenKHf1AqVA==
+
 eslint-rule-composer@^0.3.0:
   version "0.3.0"
   resolved "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9"