Explorar el Código

merge release

代强 hace 1 año
padre
commit
52d9910050
Se han modificado 66 ficheros con 940 adiciones y 645 borrados
  1. 6 10
      .vscode/launch.json
  2. 230 223
      content/start/changelog/index-en-US.md
  3. 20 12
      content/start/changelog/index.md
  4. 1 1
      lerna.json
  5. 3 3
      packages/semi-animation-react/package.json
  6. 1 1
      packages/semi-animation-styled/package.json
  7. 1 1
      packages/semi-animation/package.json
  8. 1 1
      packages/semi-eslint-plugin/package.json
  9. 7 14
      packages/semi-foundation/cascader/foundation.ts
  10. 4 3
      packages/semi-foundation/datePicker/inputFoundation.ts
  11. 4 4
      packages/semi-foundation/datePicker/yearAndMonthFoundation.ts
  12. 3 2
      packages/semi-foundation/form/utils.ts
  13. 5 3
      packages/semi-foundation/overflowList/foundation.ts
  14. 3 2
      packages/semi-foundation/package.json
  15. 8 17
      packages/semi-foundation/tree/foundation.ts
  16. 9 21
      packages/semi-foundation/treeSelect/foundation.ts
  17. 3 2
      packages/semi-foundation/utils/getMotionObjFromProps.ts
  18. 1 1
      packages/semi-icons-lab/package.json
  19. 1 1
      packages/semi-icons/package.json
  20. 1 1
      packages/semi-illustrations/package.json
  21. 2 2
      packages/semi-next/package.json
  22. 1 1
      packages/semi-rspack/package.json
  23. 2 1
      packages/semi-scss-compile/package.json
  24. 5 3
      packages/semi-scss-compile/src/utils/writeFile.ts
  25. 1 1
      packages/semi-theme-default/package.json
  26. 39 2
      packages/semi-ui/_base/_story/index.stories.jsx
  27. 47 0
      packages/semi-ui/_utils/index.tsx
  28. 92 0
      packages/semi-ui/_utils/semi-global.ts
  29. 5 2
      packages/semi-ui/autoComplete/index.tsx
  30. 4 2
      packages/semi-ui/avatar/index.tsx
  31. 6 2
      packages/semi-ui/backtop/index.tsx
  32. 4 0
      packages/semi-ui/button/index.tsx
  33. 7 3
      packages/semi-ui/cascader/index.tsx
  34. 5 2
      packages/semi-ui/collapse/index.tsx
  35. 6 3
      packages/semi-ui/collapsible/index.tsx
  36. 15 15
      packages/semi-ui/configProvider/_story/configProvider.stories.jsx
  37. 10 2
      packages/semi-ui/configProvider/index.tsx
  38. 4 3
      packages/semi-ui/datePicker/datePicker.tsx
  39. 5 2
      packages/semi-ui/dropdown/index.tsx
  40. 4 3
      packages/semi-ui/form/arrayField.tsx
  41. 1 1
      packages/semi-ui/grid/index.tsx
  42. 4 3
      packages/semi-ui/modal/Modal.tsx
  43. 4 3
      packages/semi-ui/navigation/index.tsx
  44. 5 3
      packages/semi-ui/notification/notice.tsx
  45. 5 3
      packages/semi-ui/overflowList/index.tsx
  46. 8 7
      packages/semi-ui/package.json
  47. 5 2
      packages/semi-ui/popconfirm/index.tsx
  48. 4 2
      packages/semi-ui/popover/index.tsx
  49. 42 5
      packages/semi-ui/resizeObserver/index.tsx
  50. 5 4
      packages/semi-ui/select/index.tsx
  51. 4 4
      packages/semi-ui/sideSheet/index.tsx
  52. 5 4
      packages/semi-ui/table/_story/ChildrenDataSelected/index.jsx
  53. 2 2
      packages/semi-ui/table/_story/ControlledSortOrder/index.jsx
  54. 2 2
      packages/semi-ui/table/_story/FilterWithNewDataTable/index.jsx
  55. 5 4
      packages/semi-ui/table/_story/VritualizedDataSelected/index.jsx
  56. 4 3
      packages/semi-ui/tabs/index.tsx
  57. 3 1
      packages/semi-ui/timePicker/index.tsx
  58. 4 4
      packages/semi-ui/toast/toast.tsx
  59. 4 4
      packages/semi-ui/tooltip/index.tsx
  60. 10 7
      packages/semi-ui/tree/_story/tree.stories.jsx
  61. 5 5
      packages/semi-ui/treeSelect/_story/treeSelect.stories.jsx
  62. 65 37
      packages/semi-ui/typography/base.tsx
  63. 1 1
      packages/semi-ui/typography/util.tsx
  64. 1 1
      packages/semi-webpack/package.json
  65. 161 161
      sitemap.xml
  66. 5 0
      yarn.lock

+ 6 - 10
.vscode/launch.json

@@ -1,7 +1,6 @@
 {
-    // 使用 IntelliSense 了解相关属性。
-    // 悬停以查看现有属性的描述。
-    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
+    // Hover to view descriptions of existing attributes.
+    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
     "version": "0.2.0",
     "configurations": [
         {
@@ -10,18 +9,15 @@
             "request": "launch",
             "runtimeArgs": [
                 "--inspect-brk",
-                "${workspaceRoot}/node_modules/.bin/jest",
-                "${workspaceRoot}/packages/semi-ui/select/", // 需要调试哪个组件,替换文件夹路径即可
+                "${workspaceRoot}/node_modules/jest/bin/jest",
+                "packages/semi-ui/select/", // Replace with the folder path of the component you want to debug
                 "--runInBand",
-                // "--coverage",
                 "--silent" // ignore warning such as componentWillReceiveProps will be abondon...
             ],
             "env": {
                 "NODE_ENV": "test",
-                // "type": "story" // 调试snapshot快照的时候用这个
-                "type": "unit"     // 调试unitTest的时候用这个
+                "type": "unit"
             },
-            "runtimeExecutable": "/Users/bytedance/.nvm/versions/node/v16.17.1/bin/node",
             "console": "integratedTerminal",
             "internalConsoleOptions": "neverOpen",
             "port": 9229
@@ -33,7 +29,7 @@
             "request": "launch",
             "runtimeArgs": [
                 "--inspect-brk",
-                "${workspaceRoot}/node_modules/.bin/jest",
+                "${workspaceRoot}/node_modules/jest/bin/jest",
                 "--runInBand",
                 "--silent" // ignore warning such as componentWillReceiveProps will be abondon...
             ],

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 230 - 223
content/start/changelog/index-en-US.md


+ 20 - 12
content/start/changelog/index.md

@@ -27,19 +27,27 @@ Semi 版本号遵循 **Semver** 规范(主版本号-次版本号-修订版本
 - 【Chore】
   - 去除 ResizeObserver polyfill
 
+#### 🎉 2.53.0-beta.0 (2024-02-08)
+- 【Perf】
+    - 提升 Typography 开启 Ellipsis 下 性能,减少 render 和计算次数 [#1970](https://github.com/DouyinFE/semi-design/pull/1970)
+    - 去除多余的 clone 操作;对于必要的克隆操作,使用 fast-copy 的 copy 调用替换 lodash 的 cloneDeep 调用。涉及组件:DatePicker,Table,OverflowList,Form,Tree,TreeSelect, Cascader [#2002](https://github.com/DouyinFE/semi-design/pull/2002)
+- 【Feat】
+    - 支持全局设置部分组件的默认 Props [#2029](https://github.com/DouyinFE/semi-design/pull/2029)
+
+
 #### 🎉 2.52.0 (2024-02-06)
 - 【Fix】
   - 修复 Select 点击清除按钮以后,点击外部不触发 onBlur 问题  [#1989](https://github.com/DouyinFE/semi-design/issues/1989)
   - 修复 Image 在特殊情况下会向 undefined 地址请求的问题 [#2063](https://github.com/DouyinFE/semi-design/issues/2063) [@nekocode](https://github.com/nekocode)
   -  修复 timepicker value 传入 undefined 时类型错误的问题 [#2066](https://github.com/DouyinFE/semi-design/issues/2066)
-  - 修复 Cascader 在搜索内容为英文逗号时选项面板显示全部选项问题
-  - 修复多选,showClear 的 Cascader 在点击清除按钮后,选项面板没有从搜索状态切换到普通状态问题
-  - 修复 Select 部分 border width token 不正确的问题
-  - 修复当浮层组件的 popupCountainer 或其父级缩放后,定位不准确的问题
+  - 修复 Cascader 在搜索内容为英文逗号时选项面板显示全部选项问题 [#2030](https://github.com/DouyinFE/semi-design/pull/2030)
+  - 修复多选,showClear 的 Cascader 在点击清除按钮后,选项面板没有从搜索状态切换到普通状态问题 [#2030](https://github.com/DouyinFE/semi-design/pull/2030)
+  - 修复 Select 部分 border width token 不正确的问题 [#2065](https://github.com/DouyinFE/semi-design/pull/2065)
+  - 修复当浮层组件的 popupCountainer 或其父级缩放后,定位不准确的问题 [#2034](https://github.com/DouyinFE/semi-design/pull/2034)
   - 修复 resizable Table 行选择隐藏时多出来一列  [#2036](https://github.com/DouyinFE/semi-design/issues/2036)
-  - 修复 Datepicker 点击清除按钮后,面板年月值不会还原到初始状态问题
+  - 修复 Datepicker 点击清除按钮后,面板年月值不会还原到初始状态问题 [#2048](https://github.com/DouyinFE/semi-design/pull/2048)
   - 修复 DatePicker prop value 传入非法值 NaN 触发无限更新问题  [#1846](https://github.com/DouyinFE/semi-design/issues/1846)
-  - 修复 Select 的 renderOptionItem 入参中没有 Option 的 className 的问题
+  - 修复 Select 的 renderOptionItem 入参中没有 Option 的 className 的问题 [#2037](https://github.com/DouyinFE/semi-design/pull/2037)
   - 修复 modal 在不打开直接卸载时候,会将 body 上原有的 overflow: hidden 删除的问题(影响范围 2.51.0~2.51.3)
 - 【Chore】
   - Form withField 引入 utility-types 的类型声明从import 改为 import type,对使用方无影响
@@ -47,11 +55,11 @@ Semi 版本号遵循 **Semver** 规范(主版本号-次版本号-修订版本
 #### 🎉 2.52.0-beta.0 (2024-01-31)
 - 【Fix】
     - 修复 Table getCurrentPageData 的类型  [@marshcat0](https://github.com/marshcat0)
-    - 修复 Dropdown 点击子菜单事件 onClick 函数执行时机过早的问题,可能导致用户在 onClick 函数内无法 Focus Dropdown 外部元素并触发外部元素的 Blur,影响范围,2.43.0-beta.0 ~ 2.50.0-beta.0
+    - 修复 Dropdown 点击子菜单事件 onClick 函数执行时机过早的问题,可能导致用户在 onClick 函数内无法 Focus Dropdown 外部元素并触发外部元素的 Blur,影响范围,2.43.0-beta.0 ~ 2.50.0-beta.0 [#2003](https://github.com/DouyinFE/semi-design/pull/2003)
 - 【Feat】
-    - Avatar 新增 `border` `bottomSlot` `topSlot` 用于控制边框,添加顶部和底部额外内容,新增 `contentMotion` 和 border `motion` 用于开启额外动效
-    - Modal 配置项新增 `footerFill` API,用于控制 Modal 默认底部按钮是否撑满排列
-    - Slider 新增 `handleDot`,用于控制滑块内部是否展示圆点
+    - Avatar 新增 `border` `bottomSlot` `topSlot` 用于控制边框,添加顶部和底部额外内容,新增 `contentMotion` 和 border `motion` 用于开启额外动效 [#2022](https://github.com/DouyinFE/semi-design/pull/2022)
+    - Modal 配置项新增 `footerFill` API,用于控制 Modal 默认底部按钮是否撑满排列 [#2022](https://github.com/DouyinFE/semi-design/pull/2022)
+    - Slider 新增 `handleDot`,用于控制滑块内部是否展示圆点 [#2022](https://github.com/DouyinFE/semi-design/pull/2022)
     - Table 支持使用 renderFilterDropdown 自定义筛选器 dropdown 内容  [#2015](https://github.com/DouyinFE/semi-design/issues/2015)
     - Table 组件 rowSelection 新增 renderCell 渲染选择框  [@changlin2569](https://github.com/changlin2569)
     - TreeSelect 组件支持 onClear API  [#1331 ](https://github.com/DouyinFE/semi-design/issues/1331) [@changlin2569](https://github.com/changlin2569)
@@ -64,7 +72,7 @@ Semi 版本号遵循 **Semver** 规范(主版本号-次版本号-修订版本
 
 #### 🎉 2.51.3 (2024-01-19)
 - 【Fix】
-    - 修复 Table propTypes 被打包工具移除掉导致报错问题
+    - 修复 Table propTypes 被打包工具移除掉导致报错问题 [#2031](https://github.com/DouyinFE/semi-design/pull/2031)
 
 #### 🎉 2.51.2 (2024-01-19)
 - 【Fix】
@@ -81,7 +89,7 @@ Semi 版本号遵循 **Semver** 规范(主版本号-次版本号-修订版本
     - 修复有 maxLength的 TextArea 在中文输入时,点击外部触发 blur,回显内容不符合 maxLength 设置问题  [#2005](https://github.com/DouyinFE/semi-design/issues/2005)
     - 修复 Cascader 中 autoMergeValue 为 false, value 为 [] 时的 typeError [#2017](https://github.com/DouyinFE/semi-design/pull/2017)
 - 【Style】
-    - ImagePreview 预览层的默认 zIndex 从 1000 调整为 1070
+    - ImagePreview 预览层的默认 zIndex 从 1000 调整为 1070 [#2021](https://github.com/DouyinFE/semi-design/pull/2021)
 
 #### 🎉 2.51.0-beta.0 (2024-01-09)
 - 【Feat】

+ 1 - 1
lerna.json

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

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

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

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

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

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

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

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

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

+ 7 - 14
packages/semi-foundation/cascader/foundation.ts

@@ -1,4 +1,4 @@
-import { isEqual, get, difference, isUndefined, assign, cloneDeep, isEmpty, isNumber, includes, isFunction, isObject } from 'lodash';
+import { isEqual, get, difference, isUndefined, assign, isEmpty, isNumber, includes, isFunction, isObject } from 'lodash';
 import BaseFoundation, { DefaultAdapter } from '../base/foundation';
 import {
     findAncestorKeys,
@@ -317,14 +317,6 @@ export default class CascaderFoundation extends BaseFoundation<CascaderAdapter,
         return isDisabled;
     }
 
-    getCopyFromState(items: string | string[]) {
-        const res: Partial<BasicCascaderInnerData> = {};
-        normalizedArr(items).forEach(key => {
-            res[key] = cloneDeep(this.getState(key));
-        });
-        return res;
-    }
-
     // prop: is array, return all data
     getItemPropPath(selectedKey: string, prop: string | any[], keyEntities?: BasicEntities) {
         const searchMap = keyEntities || this.getState('keyEntities');
@@ -681,8 +673,8 @@ export default class CascaderFoundation extends BaseFoundation<CascaderAdapter,
 
     handleNodeLoad(item: BasicEntity | BasicData) {
         const { data, key } = item;
-        const prevLoadingKeys = cloneDeep(this._adapter.getLoadingKeyRefValue());
-        const prevLoadedKeys = cloneDeep(this._adapter.getLoadedKeyRefValue());
+        const prevLoadingKeys = new Set(this._adapter.getLoadingKeyRefValue());
+        const prevLoadedKeys = new Set(this._adapter.getLoadedKeyRefValue());
         const newLoadedKeys = prevLoadedKeys.add(key);
         const newLoadingKeys = new Set([...prevLoadingKeys]);
         newLoadingKeys.delete(key);
@@ -702,7 +694,7 @@ export default class CascaderFoundation extends BaseFoundation<CascaderAdapter,
         this._adapter.updateStates({ loading: false });
         if (!data.isLeaf && !data.children && this.getProp('loadData')) {
             const loadedKeys = this._adapter.getLoadedKeyRefValue();
-            const loadingKeys = cloneDeep(this._adapter.getLoadingKeyRefValue());
+            const loadingKeys = new Set(this._adapter.getLoadingKeyRefValue());
             if (loadedKeys.has(key) || loadingKeys.has(key)) {
                 return;
             }
@@ -844,7 +836,7 @@ export default class CascaderFoundation extends BaseFoundation<CascaderAdapter,
 
     calcNonDisabledCheckedKeys(eventKey: string, targetStatus: boolean) {
         const { keyEntities, disabledKeys } = this.getStates();
-        const { checkedKeys } = this.getCopyFromState(['checkedKeys']);
+        const checkedKeys = new Set(this.getState('checkedKeys'));
         const descendantKeys = normalizeKeyList(findDescendantKeys([eventKey], keyEntities, false), keyEntities, true);
         const hasDisabled = descendantKeys.some(key => disabledKeys.has(key));
         if (!hasDisabled) {
@@ -893,7 +885,8 @@ export default class CascaderFoundation extends BaseFoundation<CascaderAdapter,
      */
     calcCheckedKeys(key: string, curCheckedStatus: boolean) {
         const { keyEntities } = this.getStates();
-        const { checkedKeys, halfCheckedKeys } = this.getCopyFromState(['checkedKeys', 'halfCheckedKeys']);
+        const checkedKeys = new Set(this.getState('checkedKeys')) as Set<string>;
+        const halfCheckedKeys = new Set(this.getState('halfCheckedKeys')) as Set<string>;
         return curCheckedStatus ?
             calcCheckedKeysForChecked(key, keyEntities, checkedKeys, halfCheckedKeys) :
             calcCheckedKeysForUnchecked(key, keyEntities, checkedKeys, halfCheckedKeys);

+ 4 - 3
packages/semi-foundation/datePicker/inputFoundation.ts

@@ -1,4 +1,4 @@
-import { cloneDeep, isObject, set, get } from 'lodash';
+import { isObject, set, get } from 'lodash';
 import { format as formatFn } from 'date-fns';
 
 import BaseFoundation, { DefaultAdapter } from '../base/foundation';
@@ -11,6 +11,7 @@ import { strings } from './constants';
 import getDefaultPickerDate from './_utils/getDefaultPickerDate';
 import { compatibleParse } from './_utils/parser';
 import { isValidDate } from './_utils';
+import copy from 'fast-copy';
 
 const KEY_CODE_ENTER = 'Enter';
 const KEY_CODE_TAB = 'Tab';
@@ -191,7 +192,7 @@ export default class InputFoundation extends BaseFoundation<DateInputAdapter> {
         const { value, valuePath, insetInputValue } = options;
         const { format, type, rangeSeparator } = this._adapter.getProps();
         const insetFormatToken = getInsetInputFormatToken({ type, format });
-        const newInsetInputValue = set(cloneDeep(insetInputValue), valuePath, value);
+        const newInsetInputValue = set(copy(insetInputValue), valuePath, value);
         const insetInputStr = this.concatInsetInputValue({ insetInputValue: newInsetInputValue });
         const parsedInsetInputValueFromInputStr = getInsetInputValueFromInsetInputStr({ inputValue: insetInputStr, type, rangeSeparator });
         const filledTimeInsetInputValue = this._autoFillTimeToInsetInputValue({ insetInputValue: parsedInsetInputValueFromInputStr, valuePath, format: insetFormatToken });
@@ -202,7 +203,7 @@ export default class InputFoundation extends BaseFoundation<DateInputAdapter> {
     _autoFillTimeToInsetInputValue(options: { insetInputValue: InsetInputValue; format: string; valuePath: string}) {
         const { valuePath, insetInputValue, format } = options;
         const { type, defaultPickerValue, dateFnsLocale } = this._adapter.getProps();
-        const insetInputValueWithTime = cloneDeep(insetInputValue);
+        const insetInputValueWithTime = copy(insetInputValue);
         const { nowDate, nextDate } = getDefaultPickerDate({ defaultPickerValue, format, dateFnsLocale });
 
         if (type.includes('Time')) {

+ 4 - 4
packages/semi-foundation/datePicker/yearAndMonthFoundation.ts

@@ -4,7 +4,7 @@ import { PresetPosition } from './foundation';
 import { ArrayElement } from '../utils/type';
 import { strings } from './constants';
 import { PanelType } from './monthsGridFoundation';
-import { cloneDeep } from 'lodash';
+import copy from 'fast-copy';
 
 type Type = ArrayElement<typeof strings.TYPE_SET>;
 
@@ -76,7 +76,7 @@ export default class YearAndMonthFoundation extends BaseFoundation<YearAndMonthA
         const left = strings.PANEL_TYPE_LEFT;
         const right = strings.PANEL_TYPE_RIGHT;
 
-        const year = cloneDeep(currentYear);
+        const year = copy(currentYear);
         year[panelType] = item.value;
 
         // make sure the right panel time is always less than the left panel time
@@ -102,7 +102,7 @@ export default class YearAndMonthFoundation extends BaseFoundation<YearAndMonthA
         const left = strings.PANEL_TYPE_LEFT;
         const right = strings.PANEL_TYPE_RIGHT;
 
-        const month = cloneDeep(currentMonth);
+        const month = copy(currentMonth);
         month[panelType] = item.month;
 
         // make sure the right panel time is always less than the left panel time
@@ -132,7 +132,7 @@ export default class YearAndMonthFoundation extends BaseFoundation<YearAndMonthA
                 validMonth = months.slice(0, currentIndex).find(({ month }) => !disabledDate(setMonth(currentDate, month - 1)));
             }
             if (validMonth) {
-                const month = cloneDeep(currentMonth);
+                const month = copy(currentMonth);
                 month[panelType] = validMonth.month;
 
                 // change year and month same time

+ 3 - 2
packages/semi-foundation/form/utils.ts

@@ -1,7 +1,8 @@
 import AsyncValidator from 'async-validator';
-import { cloneDeep, toPath, isUndefined } from 'lodash';
+import { toPath, isUndefined } from 'lodash';
 import { FieldValidateTriggerType, BasicTriggerType, ComponentProps, WithFieldOption } from './interface';
 import { strings } from './constants';
+import copy from 'fast-copy';
 
 /**
  * 
@@ -172,7 +173,7 @@ export function mergeProps(props: any) {
     delete rest.checked;
 
     if (typeof initValue !== 'undefined') {
-        initValue = cloneDeep(initValue);
+        initValue = copy(initValue);
     }
 
     const required = isRequired(rules);

+ 5 - 3
packages/semi-foundation/overflowList/foundation.ts

@@ -1,6 +1,8 @@
 import BaseFoundation, { DefaultAdapter } from '../base/foundation';
 import { strings } from './constants';
-import { noop, get, cloneDeep } from 'lodash';
+import { noop, get } from 'lodash';
+import copy from 'fast-copy';
+
 const Boundary = strings.BOUNDARY_MAP;
 const OverflowDirection = strings.OVERFLOW_DIR;
 
@@ -42,7 +44,7 @@ class OverflowListFoundation extends BaseFoundation<OverflowListAdapter> {
     }
 
     handleIntersect(entries: Array<IntersectionObserverEntry>): void {
-        const visibleState = cloneDeep(this.getState('visibleState'));
+        const visibleState = copy(this.getState('visibleState'));
 
         const res = {};
         entries.forEach(entry => {
@@ -75,7 +77,7 @@ class OverflowListFoundation extends BaseFoundation<OverflowListAdapter> {
 
     getReversedItems = ()=>{
         const { items } = this.getProps();
-        return cloneDeep(items).reverse();
+        return copy(items).reverse();
     }
     handleCollapseOverflow() {
         const { minVisibleItems, collapseFrom } = this.getProps();

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

@@ -1,17 +1,18 @@
 {
     "name": "@douyinfe/semi-foundation",
-    "version": "2.52.3",
+    "version": "2.53.0-beta.0",
     "description": "",
     "scripts": {
         "build:lib": "node ./scripts/compileLib.js",
         "prepublishOnly": "npm run build:lib"
     },
     "dependencies": {
-        "@douyinfe/semi-animation": "2.52.3",
+        "@douyinfe/semi-animation": "2.53.0-beta.0",
         "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"

+ 8 - 17
packages/semi-foundation/tree/foundation.ts

@@ -3,7 +3,7 @@
  * https://github.com/react-component/tree
  */
 
-import { isUndefined, difference, pick, cloneDeep, get } from 'lodash';
+import { isUndefined, difference, pick, get } from 'lodash';
 import BaseFoundation, { DefaultAdapter } from '../base/foundation';
 import {
     flattenTreeData,
@@ -359,14 +359,6 @@ export default class TreeFoundation extends BaseFoundation<TreeAdapter, BasicTre
         return Boolean(inputValue) && showFilteredOnly;
     }
 
-    getCopyFromState(items: string[] | string) {
-        const res: Partial<BasicTreeInnerData> = {};
-        normalizedArr(items).forEach(key => {
-            res[key] = cloneDeep(this.getState(key));
-        });
-        return res;
-    }
-
     getTreeNodeProps(key: string) {
         const {
             expandedKeys = new Set([]),
@@ -528,7 +520,7 @@ export default class TreeFoundation extends BaseFoundation<TreeAdapter, BasicTre
     }
 
     handleSingleSelect(e: any, treeNode: BasicTreeNodeProps) {
-        let { selectedKeys } = this.getCopyFromState('selectedKeys');
+        let selectedKeys = [...this.getState('selectedKeys')];
         const { selected, eventKey, data } = treeNode;
         const targetSelected = !selected;
 
@@ -549,7 +541,8 @@ export default class TreeFoundation extends BaseFoundation<TreeAdapter, BasicTre
 
     calcCheckedKeys(eventKey: string, targetStatus: boolean) {
         const { keyEntities } = this.getStates();
-        const { checkedKeys, halfCheckedKeys } = this.getCopyFromState(['checkedKeys', 'halfCheckedKeys']);
+        const checkedKeys = new Set(this.getState('checkedKeys')) as Set<string>;
+        const halfCheckedKeys = new Set(this.getState('halfCheckedKeys')) as Set<string>;
         return targetStatus ?
             calcCheckedKeysForChecked(eventKey, keyEntities, checkedKeys, halfCheckedKeys) :
             calcCheckedKeysForUnchecked(eventKey, keyEntities, checkedKeys, halfCheckedKeys);
@@ -582,7 +575,7 @@ export default class TreeFoundation extends BaseFoundation<TreeAdapter, BasicTre
     */
     calcNonDisabledCheckedKeys(eventKey: string, targetStatus: boolean) {
         const { keyEntities, disabledKeys } = this.getStates();
-        const { checkedKeys } = this.getCopyFromState(['checkedKeys']);
+        const checkedKeys = new Set(this.getState('checkedKeys'));
         const descendantKeys = normalizeKeyList(findDescendantKeys([eventKey], keyEntities, false), keyEntities, true);
         const hasDisabled = descendantKeys.some((key: string) => disabledKeys.has(key));
         // If none of the descendant nodes are disabled, follow the normal logic
@@ -639,7 +632,7 @@ export default class TreeFoundation extends BaseFoundation<TreeAdapter, BasicTre
         const isSearching = Boolean(inputValue);
         const showFilteredOnly = this._showFilteredOnly();
         const expandedStateKey = isSearching ? 'filteredExpandedKeys' : 'expandedKeys';
-        const expandedKeys = this.getCopyFromState(expandedStateKey)[expandedStateKey];
+        const expandedKeys = new Set(this.getState(expandedStateKey)) as Set<string>;
 
         let motionType = 'show';
         const { eventKey, expanded, data } = treeNode;
@@ -697,10 +690,8 @@ export default class TreeFoundation extends BaseFoundation<TreeAdapter, BasicTre
 
         // Process the loaded data
         loadData(data).then(() => {
-            const {
-                loadedKeys: prevLoadedKeys,
-                loadingKeys: prevLoadingKeys
-            } = this.getCopyFromState(['loadedKeys', 'loadingKeys']);
+            const prevLoadedKeys = new Set(this.getState('loadedKeys')) as Set<string>;
+            const prevLoadingKeys = new Set(this.getState('loadingKeys')) as Set<string>;
             const newLoadedKeys = prevLoadedKeys.add(key);
             const newLoadingKeys = new Set([...prevLoadingKeys]);
             newLoadingKeys.delete(key);

+ 9 - 21
packages/semi-foundation/treeSelect/foundation.ts

@@ -1,4 +1,4 @@
-import { isNumber, isFunction, get, isUndefined, isString, cloneDeep, isEmpty, difference } from 'lodash';
+import { isNumber, isFunction, get, isUndefined, isString, isEmpty, difference } from 'lodash';
 import { strings } from '../treeSelect/constants';
 import BaseFoundation, { DefaultAdapter } from '../base/foundation';
 import {
@@ -306,14 +306,6 @@ export default class TreeSelectFoundation<P = Record<string, any>, S = Record<st
         }
     }
 
-    getCopyFromState(items: string | string[]) {
-        const res = {};
-        normalizedArr(items).forEach(key => {
-            res[key] = cloneDeep(this.getState(key));
-        });
-        return res as BasicTreeInnerData;
-    }
-
     getTreeNodeProps(key: string) {
         const {
             expandedKeys = new Set([]),
@@ -375,10 +367,8 @@ export default class TreeSelectFoundation<P = Record<string, any>, S = Record<st
             return {};
         }
         loadData(data).then(() => {
-            const {
-                loadedKeys: prevLoadedKeys,
-                loadingKeys: prevLoadingKeys
-            } = this.getCopyFromState(['loadedKeys', 'loadingKeys']);
+            const prevLoadedKeys = new Set(this.getState('loadedKeys')) as Set<string>;
+            const prevLoadingKeys = new Set(this.getState('loadingKeys')) as Set<string>;
             const newLoadedKeys: Set<string> = prevLoadedKeys.add(key);
             const newLoadingKeys: Set<string> = new Set([...prevLoadingKeys]);
             newLoadingKeys.delete(key);
@@ -665,7 +655,7 @@ export default class TreeSelectFoundation<P = Record<string, any>, S = Record<st
     }
 
     handleSingleSelect(e: any, treeNode: BasicTreeNodeProps) {
-        let { selectedKeys } = this.getCopyFromState('selectedKeys');
+        let selectedKeys = [...this.getState('selectedKeys')];
         const { clickToHide } = this.getProps();
         const { selected, eventKey, data } = treeNode;
         this._adapter.notifySelect(eventKey, true, data);
@@ -685,10 +675,8 @@ export default class TreeSelectFoundation<P = Record<string, any>, S = Record<st
 
     calcCheckedKeys(eventKey: BasicTreeNodeProps['eventKey'], targetStatus: boolean) {
         const { keyEntities } = this.getStates();
-        const {
-            checkedKeys,
-            halfCheckedKeys
-        } = this.getCopyFromState(['checkedKeys', 'halfCheckedKeys']);
+        const checkedKeys = new Set(this.getState('checkedKeys')) as Set<string>;
+        const halfCheckedKeys = new Set(this.getState('halfCheckedKeys')) as Set<string>;
         if (targetStatus) {
             return calcCheckedKeysForChecked(eventKey, keyEntities, checkedKeys, halfCheckedKeys);
         } else {
@@ -738,7 +726,7 @@ export default class TreeSelectFoundation<P = Record<string, any>, S = Record<st
 
     calcNonDisabledCheckedKeys(eventKey: string, targetStatus: boolean) {
         const { keyEntities, disabledKeys } = this.getStates();
-        const { checkedKeys } = this.getCopyFromState(['checkedKeys']);
+        const checkedKeys = new Set(this.getState('checkedKeys'));
         const descendantKeys = normalizeKeyList(findDescendantKeys([eventKey], keyEntities, false), keyEntities, true);
         const hasDisabled = descendantKeys.some(key => disabledKeys.has(key));
         if (!hasDisabled) {
@@ -769,7 +757,7 @@ export default class TreeSelectFoundation<P = Record<string, any>, S = Record<st
         const { treeData, filteredShownKeys, keyEntities, keyMaps } = this.getStates();
         const showFilteredOnly = this._showFilteredOnly();
         // clone otherwise will be modified unexpectedly
-        const { filteredExpandedKeys } = this.getCopyFromState('filteredExpandedKeys');
+        const filteredExpandedKeys = new Set(this.getState('filteredExpandedKeys')) as Set<string>;
         let motionType = 'show';
         const { eventKey, expanded, data } = treeNode;
 
@@ -821,7 +809,7 @@ export default class TreeSelectFoundation<P = Record<string, any>, S = Record<st
 
         const { treeData } = this.getStates();
         // clone otherwise will be modified unexpectedly
-        const { expandedKeys } = this.getCopyFromState('expandedKeys');
+        const expandedKeys = new Set(this.getState('expandedKeys')) as Set<string>;
         let motionType = 'show';
         const { eventKey, expanded, data } = treeNode;
         if (!expanded) {

+ 3 - 2
packages/semi-foundation/utils/getMotionObjFromProps.ts

@@ -1,6 +1,7 @@
 import { MotionObject } from "./type";
-import { cloneDeep, isObject } from 'lodash';
+import { isObject } from 'lodash';
 import warning from './warning';
+import copy from "fast-copy";
 
 export interface MergeMotionProps {
     [x: string]: any;
@@ -37,7 +38,7 @@ export default function getMotionObjFromProps(props: MergeMotionProps) {
     let motion: MotionObject = {};
 
     if (isObject(motionProp)) {
-        motion = cloneDeep(motionProp);
+        motion = copy(motionProp);
         for (const key of Object.keys(motionProp)) {
             const handler = motionProp[key];
             if (typeof handler === 'function') {

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

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

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

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

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

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

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

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

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

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

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

@@ -1,6 +1,6 @@
 {
     "name": "@douyinfe/semi-scss-compile",
-    "version": "2.52.3",
+    "version": "2.53.0-beta.0",
     "description": "compile semi scss to css",
     "author": "[email protected]",
     "license": "MIT",
@@ -23,6 +23,7 @@
     },
     "dependencies": {
         "arg": "^5.0.1",
+        "fast-copy": "^3.0.1 ",
         "fs-extra": "^8.1.0",
         "lodash": "^4.17.21",
         "sass": "^1.54.9"

+ 5 - 3
packages/semi-scss-compile/src/utils/writeFile.ts

@@ -2,9 +2,11 @@ import fs from 'fs-extra';
 import path from 'path';
 import os from 'os';
 import generateScssMap from './generateSCSSMap';
-import { cloneDeep, omit } from 'lodash';
+import { omit } from 'lodash';
+import copy from 'fast-copy';
 
-const lodash = { cloneDeep, omit };
+
+const lodash = { omit };
 
 const writeComponentScss = (scssMap: { [p: string]: { [p: string]: string } }, tempDir: string) => {
     for (const componentName of Object.keys(scssMap)) {
@@ -28,7 +30,7 @@ const writeThemeScss = (scssMap: (ReturnType<typeof generateScssMap>)['theme'],
 };
 
 const preProcessScssMap = (scssMapOrigin: ReturnType<typeof generateScssMap>) => {
-    const scssMap = lodash.cloneDeep(scssMapOrigin);
+    const scssMap = copy(scssMapOrigin);
 
     //----- generate entry -----
     let compilerEntryContent = '';

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

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

+ 39 - 2
packages/semi-ui/_base/_story/index.stories.jsx

@@ -1,7 +1,8 @@
 import React, { useMemo } from 'react';
-import { Button, Typography, Card, Tooltip, Tag, Avatar, Rating, Nav, Layout } from '../../index';
+import {Button, Typography, Card, Tooltip, Tag, Avatar, Rating, Nav, Layout, ConfigProvider, Select} from '../../index';
 import { IconHelpCircle, IconUser, IconStar, IconSetting } from '@douyinfe/semi-icons';
 import './index.scss';
+import semiGlobal from "../../_utils/semi-global";
 
 export default {
   title: 'Base',
@@ -113,4 +114,40 @@ export const TestAlwaysDarkLight = () => {
   }
 
   return <Demo />;
-};
+};
+
+
+
+semiGlobal.config.overrideDefaultProps = {
+    Button: {
+        type: 'warning',
+    },
+    Select: {
+        zIndex: 2000,
+        getPopupContainer: () => document.querySelector('#popupContainer')
+    },
+    Tooltip: {
+        zIndex: 2001,
+        getPopupContainer: () => document.querySelector('#popupContainer'),
+        trigger:"click"
+    },
+};
+
+export const DefaultPropsDemo = () => {
+    return (
+        <div>
+            <ConfigProvider>
+                <div style={{ position: 'relative'}} id='popupContainer'></div>
+                <Tooltip content="zindex 2001">
+                    <Button>test</Button>
+                </Tooltip>
+                <Select
+                    optionList={[
+                        { value: 1, label: 1 },
+                        { value: 2, label: 2 },
+                    ]}
+                ></Select>
+            </ConfigProvider>
+        </div>
+    );
+};

+ 47 - 0
packages/semi-ui/_utils/index.tsx

@@ -3,6 +3,7 @@ import { cloneDeepWith, set, get } from 'lodash';
 import warning from '@douyinfe/semi-foundation/utils/warning';
 import { findAll } from '@douyinfe/semi-foundation/utils/getHighlight';
 import { isHTMLElement } from '@douyinfe/semi-foundation/utils/dom';
+import semiGlobal from "./semi-global";
 /**
  * stop propagation
  *
@@ -197,6 +198,23 @@ export function getFocusableElements(node: HTMLElement) {
     return focusableElements;
 }
 
+
+
+export async function runAfterTicks(func: (...args: any) => any, numberOfTicks: number) {
+    if (numberOfTicks===0) {
+        await func();
+        return;
+    } else {
+        await new Promise<void>(resolve=>{
+            setTimeout(async ()=>{
+                await runAfterTicks(func, numberOfTicks-1);
+                resolve();
+            }, 0);
+        });
+        return;
+    }
+}
+
 export function getScrollbarWidth() {
     if (globalThis && Object.prototype.toString.call(globalThis) === '[object Window]') {
         return window.innerWidth - document.documentElement.clientWidth;
@@ -204,4 +222,33 @@ export function getScrollbarWidth() {
     return 0;
 }
 
+export function getDefaultPropsFromGlobalConfig(componentName: string, semiDefaultProps: any = {}) {
+    const getFromGlobalConfig = ()=> semiGlobal?.config?.overrideDefaultProps?.[componentName] || {};
+    return new Proxy({
+        ...semiDefaultProps,
+    }, {
+        get(target, key, receiver) {
+            const defaultPropsFromGlobal = getFromGlobalConfig();
+            if (key in defaultPropsFromGlobal) {
+                return defaultPropsFromGlobal[key];
+            }
+            return Reflect.get(target, key, receiver);
+        },
+        set(target, key, value, receiver) {
+            return Reflect.set(target, key, value, receiver);
+        },
+        ownKeys() {
+            const defaultPropsFromGlobal = getFromGlobalConfig();
+            return Array.from(new Set([...Reflect.ownKeys(semiDefaultProps), ...Object.keys(defaultPropsFromGlobal)]));
+        },
+        getOwnPropertyDescriptor(target, key) {
+            const defaultPropsFromGlobal = getFromGlobalConfig();
+            if (key in defaultPropsFromGlobal) {
+                return Reflect.getOwnPropertyDescriptor(defaultPropsFromGlobal, key);
+            } else {
+                return Reflect.getOwnPropertyDescriptor(target, key);
+            }
+        }
+    });
+}
 

+ 92 - 0
packages/semi-ui/_utils/semi-global.ts

@@ -0,0 +1,92 @@
+import type { AutoCompleteProps } from "../autoComplete";
+import type { AvatarProps } from "../avatar";
+import type { CascaderProps } from "../cascader";
+import type { CollapseReactProps } from "../collapse";
+import type { CollapsibleProps } from "../collapsible";
+import type { DatePickerProps } from "../datePicker";
+import type { DropdownProps } from "../dropdown";
+import type { ModalReactProps } from "../modal";
+import type { NavProps } from "../navigation";
+import type { NoticeReactProps } from "../notification";
+import type { OverflowListProps } from "../overflowList";
+import type { PopconfirmProps } from "../popconfirm";
+import type { PopoverProps } from "../popover";
+import type { SelectProps } from "../select";
+import type { SideSheetReactProps } from "../sideSheet";
+import type { TabsProps } from "../tabs";
+import type { TimePickerProps } from "../timePicker";
+import type { ToastReactProps } from "../toast";
+import type { TooltipProps } from "../tooltip";
+
+class SemiGlobal {
+
+    config: {
+        overrideDefaultProps?: {
+            // "Anchor"?: Partial<AnchorProps>;
+            "AutoComplete"?: Partial<AutoCompleteProps<any>>;
+            "Avatar"?: Partial<AvatarProps>;
+            // BackTop?: Partial<BackTopProps>;
+            // Badge?: Partial<BadgeProps>;
+            // Banner?: Partial<BannerProps>;
+            // Breadcrumb?: Partial<BreadcrumbProps>;
+            // Button?: Partial<ButtonProps>;
+            // Calendar?: Partial<CalendarProps>;
+            // Card?: Partial<CardProps>;
+            // Carousel?: Partial<CarouselProps>;
+            Cascader?: Partial<CascaderProps>;
+            // Checkbox?: Partial<CheckboxProps>;
+            Collapse?: Partial<CollapseReactProps>;
+            Collapsible?: Partial<CollapsibleProps>;
+            DatePicker?: Partial<DatePickerProps>;
+            // Descriptions?: Partial<DescriptionsProps>;
+            // Divider?: Partial<DividerProps>;
+            Dropdown?: Partial<DropdownProps>;
+            // Empty?: Partial<EmptyProps>;
+            // Form?: Partial<BaseFormProps>;
+            // Row?: Partial<RowProps>;
+            // Col?: Partial<ColProps>;
+            // Highlight?: Partial<HighlightProps>;
+            // Icon?: Partial<IconProps>;
+            // Image?: Partial<ImageProps>;
+            // Input?: Partial<InputProps>;
+            // InputNumber?: Partial<InputNumberProps>;
+            // Layout?: Partial<BasicLayoutProps>;
+            // List?: Partial<ListProps<any>>;
+            Modal?: Partial<ModalReactProps>;
+            Navigation?: Partial<NavProps>;
+            Notification?: Partial<NoticeReactProps>;
+            OverflowList?: Partial<OverflowListProps>;
+            // Pagination?: Partial<PaginationProps>;
+            Popconfirm?: Partial<PopconfirmProps>;
+            Popover?: Partial<PopoverProps>;
+            // Progress?: Partial<ProgressProps>;
+            // Radio?: Partial<RadioProps>;
+            // Rating?: Partial<RatingProps>;
+            // ScrollList?: Partial<ScrollListProps>;
+            Select?: Partial<SelectProps>;
+            SideSheet?: Partial<SideSheetReactProps>;
+            // Skeleton?: Partial<SkeletonProps>;
+            // Slider?: Partial<SliderProps>;
+            // Space?: Partial<SpaceProps>;
+            // Spin?: Partial<SpinProps>;
+            // Steps?: Partial<StepsProps>;
+            // Switch?: Partial<SwitchProps>;
+            // Table?: Partial<TableProps>;
+            Tabs?: Partial<TabsProps>;
+            // Tag?: Partial<TagProps>;
+            // TagInput?: Partial<TagInputProps>;
+            // Timeline?: Partial<TimelineProps>;
+            TimePicker?: Partial<TimePickerProps>;
+            Toast?: Partial<ToastReactProps>;
+            Tooltip?: Partial<TooltipProps>
+            // Transfer?: Partial<TransferProps>;
+            // Tree?: Partial<TreeProps>;
+            // TreeSelect?: Partial<TreeSelectProps>;
+            // Typography?: Partial<BaseTypographyProps>;
+            // Upload?: Partial<UploadProps>
+        }
+    }
+    = {}
+}
+
+export default new SemiGlobal();

+ 5 - 2
packages/semi-ui/autoComplete/index.tsx

@@ -18,6 +18,7 @@ import Option from './option';
 import warning from '@douyinfe/semi-foundation/utils/warning';
 import '@douyinfe/semi-foundation/autoComplete/autoComplete.scss';
 import ReactDOM from 'react-dom';
+import { getDefaultPropsFromGlobalConfig } from "../_utils";
 
 const prefixCls = cssClasses.PREFIX;
 const sizeSet = strings.SIZE;
@@ -166,7 +167,9 @@ class AutoComplete<T extends AutoCompleteItems> extends BaseComponent<AutoComple
 
     static Option = Option;
 
-    static defaultProps = {
+    static __SemiComponentName__ = "AutoComplete";
+    
+    static defaultProps = getDefaultPropsFromGlobalConfig(AutoComplete.__SemiComponentName__, {
         stopPropagation: true,
         motion: true,
         zIndex: popoverNumbers.DEFAULT_Z_INDEX,
@@ -192,7 +195,7 @@ class AutoComplete<T extends AutoCompleteItems> extends BaseComponent<AutoComple
         onKeyDown: noop,
         // onPressEnter: () => undefined,
         // defaultOpen: false,
-    };
+    });
 
     triggerRef: React.RefObject<HTMLDivElement> | null;
     optionsRef: React.RefObject<HTMLDivElement> | null;

+ 4 - 2
packages/semi-ui/avatar/index.tsx

@@ -8,6 +8,7 @@ import { noop } from '@douyinfe/semi-foundation/utils/function';
 import BaseComponent from '../_base/baseComponent';
 import { AvatarProps } from './interface';
 import { handlePrevent } from '@douyinfe/semi-foundation/utils/a11y';
+import { getDefaultPropsFromGlobalConfig } from "../_utils";
 import TopSlotSvg from "./TopSlotSvg";
 
 
@@ -26,7 +27,8 @@ export interface AvatarState {
 }
 
 export default class Avatar extends BaseComponent<AvatarProps, AvatarState> {
-    static defaultProps = {
+    static __SemiComponentName__ = "Avatar";
+    static defaultProps = getDefaultPropsFromGlobalConfig(Avatar.__SemiComponentName__, {
         size: 'medium',
         color: 'grey',
         shape: 'circle',
@@ -34,7 +36,7 @@ export default class Avatar extends BaseComponent<AvatarProps, AvatarState> {
         onClick: noop,
         onMouseEnter: noop,
         onMouseLeave: noop,
-    };
+    })
 
     static elementType: string;
     static propTypes = {

+ 6 - 2
packages/semi-ui/backtop/index.tsx

@@ -8,6 +8,7 @@ import BackTopFoundation, { BackTopAdapter } from '@douyinfe/semi-foundation/bac
 import '@douyinfe/semi-foundation/backtop/backtop.scss';
 import IconButton from '../iconButton';
 import { IconChevronUp } from '@douyinfe/semi-icons';
+import { getDefaultPropsFromGlobalConfig } from "../_utils";
 
 const prefixCls = cssClasses.PREFIX;
 
@@ -29,11 +30,14 @@ export interface BackTopState {
 
 
 export default class BackTop extends BaseComponent<BackTopProps, BackTopState> {
-    static defaultProps = {
+
+    static __SemiComponentName__ = "BackTop";
+
+    static defaultProps = getDefaultPropsFromGlobalConfig(BackTop.__SemiComponentName__, {
         visibilityHeight: 400,
         target: getDefaultTarget,
         duration: 450,
-    };
+    })
 
     static propTypes = {
         target: PropTypes.func,

+ 4 - 0
packages/semi-ui/button/index.tsx

@@ -2,6 +2,7 @@ import React from 'react';
 
 import BaseButton, { ButtonProps as BaseButtonProps } from './Button';
 import IconButton, { IconButtonProps } from '../iconButton';
+import { getDefaultPropsFromGlobalConfig } from "../_utils";
 
 export type { ButtonProps as BaseButtonProps, HtmlType, Size, Theme, Type } from './Button';
 
@@ -13,6 +14,7 @@ export type { SplitButtonGroupProps } from './splitButtonGroup';
 
 export interface ButtonProps extends IconButtonProps {} // TODO check
 class Button extends React.PureComponent<ButtonProps> {
+    static __SemiComponentName__ = "Button";
     static propTypes = {
         ...BaseButton.propTypes,
         ...IconButton.propTypes,
@@ -21,6 +23,8 @@ class Button extends React.PureComponent<ButtonProps> {
     constructor(props: ButtonProps = {}) {
         super(props);
     }
+
+    static defaultProps = getDefaultPropsFromGlobalConfig(Button.__SemiComponentName__)
     render() {
         const props = { ...this.props };
         const hasIcon = Boolean(props.icon); 

+ 7 - 3
packages/semi-ui/cascader/index.tsx

@@ -27,7 +27,7 @@ import Item, { CascaderData, Entities, Entity, Data, FilterRenderProps } from '.
 import Trigger from '../trigger';
 import Tag from '../tag';
 import TagInput from '../tagInput';
-import { isSemiIcon } from '../_utils';
+import { getDefaultPropsFromGlobalConfig, isSemiIcon } from '../_utils';
 import { Position } from '../tooltip/index';
 
 export type { CascaderType, ShowNextType } from '@douyinfe/semi-foundation/cascader/foundation';
@@ -100,6 +100,10 @@ const prefixcls = cssClasses.PREFIX;
 const resetkey = 0;
 
 class Cascader extends BaseComponent<CascaderProps, CascaderState> {
+
+    static __SemiComponentName__ = "Cascader";
+
+
     static contextType = ConfigContext;
     static propTypes = {
         'aria-labelledby': PropTypes.string,
@@ -181,7 +185,7 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
         position: PropTypes.string
     };
 
-    static defaultProps = {
+    static defaultProps = getDefaultPropsFromGlobalConfig(Cascader.__SemiComponentName__, {
         borderless: false,
         leafOnly: false,
         arrowIcon: <IconChevronDown />,
@@ -211,7 +215,7 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
         onListScroll: noop,
         enableLeafClick: false,
         'aria-label': 'Cascader',
-    };
+    })
 
     options: any;
     isEmpty: boolean;

+ 5 - 2
packages/semi-ui/collapse/index.tsx

@@ -14,6 +14,7 @@ import '@douyinfe/semi-foundation/collapse/collapse.scss';
 import { noop } from '@douyinfe/semi-foundation/utils/function';
 import { isEqual } from 'lodash';
 import CollapseContext from './collapse-context';
+import { getDefaultPropsFromGlobalConfig } from "../_utils";
 
 export type { CollapsePanelProps } from './item';
 
@@ -46,12 +47,14 @@ class Collapse extends BaseComponent<CollapseReactProps, CollapseState> {
         expandIconPosition: PropTypes.oneOf(strings.iconPosition)
     };
 
-    static defaultProps = {
+    static __SemiComponentName__ = "Collapse";
+
+    static defaultProps = getDefaultPropsFromGlobalConfig(Collapse.__SemiComponentName__, {
         defaultActiveKey: '',
         clickHeaderToExpand: true,
         onChange: noop,
         expandIconPosition: 'right'
-    };
+    })
 
     constructor(props: CollapseReactProps) {
         super(props);

+ 6 - 3
packages/semi-ui/collapsible/index.tsx

@@ -11,8 +11,9 @@ import cls from "classnames";
 import { cssClasses } from "@douyinfe/semi-foundation/collapsible/constants";
 import { isEqual } from "lodash";
 import "@douyinfe/semi-foundation/collapsible/collapsible.scss";
+import { getDefaultPropsFromGlobalConfig } from "../_utils";
 
-interface CollapsibleProps extends CollapsibleFoundationProps {
+export interface CollapsibleProps extends CollapsibleFoundationProps {
     motion?: boolean;
     children?: React.ReactNode;
     isOpen?: boolean;
@@ -34,14 +35,16 @@ interface CollapsibleState extends CollapsibleFoundationState {
 }
 
 class Collapsible extends BaseComponent<CollapsibleProps, CollapsibleState> {
-    static defaultProps = {
+    static __SemiComponentName__ = "Collapsible";
+
+    static defaultProps = getDefaultPropsFromGlobalConfig(Collapsible.__SemiComponentName__, {
         isOpen: false,
         duration: 250,
         motion: true,
         keepDOM: false,
         collapseHeight: 0,
         fade: false
-    };
+    }) 
     public foundation: CollapsibleFoundation;
     private domRef = React.createRef<HTMLDivElement>();
     private resizeObserver: ResizeObserver | null;

+ 15 - 15
packages/semi-ui/configProvider/_story/configProvider.stories.jsx

@@ -4,27 +4,27 @@ import GetContainer from './GetPopupContainer';
 import RTLWrapper from './RTLDirection/RTLWrapper';
 import RTLTable from './RTLDirection/RTLTable';
 import RTLForm from './RTLDirection/RTLForm';
+import ConfigContext from '../context';
+import { Button, ConfigProvider, Select, Tooltip, } from '../../index';
+import semiGlobal from "../../_utils/semi-global";
 
 export default {
-  title: 'ConfigProvider',
-  parameters: {
-    chromatic: { disableSnapshot: true },
-  },
-}
+    title: 'ConfigProvider',
+    parameters: {
+        chromatic: { disableSnapshot: true },
+    },
+};
 
-export {
-  ChangeTimeZone,
-  GetContainer,
-}
+export { ChangeTimeZone, GetContainer };
 
 export const RTLTableDemo = () => (
-  <RTLWrapper>
-    <RTLTable />
-  </RTLWrapper>
+    <RTLWrapper>
+        <RTLTable />
+    </RTLWrapper>
 );
 
 export const RTLFormDemo = () => (
-  <RTLWrapper>
-    <RTLForm />
-  </RTLWrapper>
+    <RTLWrapper>
+        <RTLForm />
+    </RTLWrapper>
 );

+ 10 - 2
packages/semi-ui/configProvider/index.tsx

@@ -7,6 +7,12 @@ import Context, { ContextValue } from './context';
 export interface ConfigProviderProps extends ContextValue {}
 
 export default class ConfigProvider extends React.Component<ConfigProviderProps> {
+
+    constructor(props: ConfigProviderProps) {
+        super(props);
+    }
+
+
     static propTypes = {
         locale: PropTypes.object,
         timeZone: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
@@ -19,7 +25,9 @@ export default class ConfigProvider extends React.Component<ConfigProviderProps>
         direction: 'ltr',
     };
 
-    renderChilren() {
+
+
+    renderChildren() {
         const { direction, children } = this.props;
         if (direction === 'rtl') {
             return (
@@ -40,7 +48,7 @@ export default class ConfigProvider extends React.Component<ConfigProviderProps>
                     ...rest,
                 }}
             >
-                {this.renderChilren()}
+                {this.renderChildren()}
             </Context.Provider>
         );
     }

+ 4 - 3
packages/semi-ui/datePicker/datePicker.tsx

@@ -29,6 +29,7 @@ import { Locale } from '../locale/interface';
 import { TimePickerProps } from '../timePicker/TimePicker';
 import { ScrollItemProps } from '../scrollList/scrollItem';
 import { InsetInputValue, InsetInputChangeProps } from '@douyinfe/semi-foundation/datePicker/inputFoundation';
+import { getDefaultPropsFromGlobalConfig } from "../_utils";
 
 export interface DatePickerProps extends DatePickerFoundationProps {
     'aria-describedby'?: React.AriaAttributes['aria-describedby'];
@@ -154,8 +155,8 @@ export default class DatePicker extends BaseComponent<DatePickerProps, DatePicke
         yearAndMonthOpts: PropTypes.object,
         onClickOutSide: PropTypes.func,
     };
-
-    static defaultProps = {
+    static __SemiComponentName__ = "DatePicker";
+    static defaultProps = getDefaultPropsFromGlobalConfig(DatePicker.__SemiComponentName__, {
         onChangeWithDateFirst: true,
         borderless: false,
         autoAdjustOverflow: true,
@@ -193,7 +194,7 @@ export default class DatePicker extends BaseComponent<DatePickerProps, DatePicke
         rangeSeparator: strings.DEFAULT_SEPARATOR_RANGE,
         insetInput: false,
         onClickOutSide: noop,
-    };
+    });
 
     triggerElRef: React.MutableRefObject<HTMLElement>;
     panelRef: React.RefObject<HTMLDivElement>;

+ 5 - 2
packages/semi-ui/dropdown/index.tsx

@@ -16,6 +16,7 @@ import DropdownTitle, { DropdownTitleProps } from './dropdownTitle';
 import DropdownContext, { DropdownContextType } from './context';
 import '@douyinfe/semi-foundation/dropdown/dropdown.scss';
 import { noop, get } from 'lodash';
+import { getDefaultPropsFromGlobalConfig } from "../_utils";
 
 const positionSet = strings.POSITION_SET;
 const triggerSet = strings.TRIGGER_SET;
@@ -99,7 +100,9 @@ class Dropdown extends BaseComponent<DropdownProps, DropdownState> {
         zIndex: PropTypes.number,
     };
 
-    static defaultProps = {
+    static __SemiComponentName__ = "Dropdown";
+
+    static defaultProps = getDefaultPropsFromGlobalConfig(Dropdown.__SemiComponentName__, {
         onVisibleChange: noop,
         prefixCls: cssClasses.PREFIX,
         zIndex: tooltipNumbers.DEFAULT_Z_INDEX,
@@ -110,7 +113,7 @@ class Dropdown extends BaseComponent<DropdownProps, DropdownState> {
         showTick: false,
         closeOnEsc: true,
         onEscKeyDown: noop,
-    };
+    });
 
     tooltipRef: React.RefObject<Tooltip>
 

+ 4 - 3
packages/semi-ui/form/arrayField.tsx

@@ -1,9 +1,10 @@
 import React, { Component } from 'react';
 import { getUuidv4 } from '@douyinfe/semi-foundation/utils/uuid';
-import { cloneDeep, isUndefined } from 'lodash';
+import { isUndefined } from 'lodash';
 import { FormUpdaterContext, ArrayFieldContext } from './context';
 import warning from '@douyinfe/semi-foundation/utils/warning';
 import type { ArrayFieldStaff, FormUpdaterContextType } from '@douyinfe/semi-foundation/form/interface';
+import copy from 'fast-copy';
 
 export interface ArrayFieldProps {
     initValue?: any[];
@@ -97,8 +98,8 @@ class ArrayFieldComponent extends Component<ArrayFieldProps, ArrayFieldState> {
         this.shouldUseInitValue = !context.getArrayField(field);
 
         // Separate the arrays that reset and the usual add and remove modify, otherwise they will affect each other
-        const initValueCopyForFormState = cloneDeep(initValue);
-        const initValueCopyForReset = cloneDeep(initValue);
+        const initValueCopyForFormState = copy(initValue);
+        const initValueCopyForReset = copy(initValue);
         context.registerArrayField(field, initValueCopyForReset);
         // register ArrayField will update state.updateKey to render, So there is no need to execute forceUpdate here
         context.updateStateValue(field, initValueCopyForFormState, { notNotify: true, notUpdate: true });

+ 1 - 1
packages/semi-ui/grid/index.tsx

@@ -4,4 +4,4 @@ import Col from './col';
 export { Row, Col };
 
 export type { ColSize, ColProps } from './col';
-export type { Breakpoint, Gutter, RowProps } from './row';
+export type { Breakpoint, Gutter, RowProps } from './row';

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

@@ -15,7 +15,7 @@ import { Locale } from '../locale/interface';
 import useModal from './useModal';
 import { ButtonProps } from '../button/Button';
 import CSSAnimation from "../_cssAnimation";
-import { getScrollbarWidth } from '../_utils';
+import { getDefaultPropsFromGlobalConfig, getScrollbarWidth } from '../_utils';
 
 export const destroyFns: any[] = [];
 export type ConfirmType = 'leftTop' | 'leftBottom' | 'rightTop' | 'rightBottom';
@@ -85,8 +85,9 @@ class Modal extends BaseComponent<ModalReactProps, ModalState> {
         footerFill: PropTypes.bool,
     };
 
+    static __SemiComponentName__ = "Modal";
 
-    static defaultProps = {
+    static defaultProps = getDefaultPropsFromGlobalConfig(Modal.__SemiComponentName__, {
         zIndex: 1000,
         motion: true,
         mask: true,
@@ -105,7 +106,7 @@ class Modal extends BaseComponent<ModalReactProps, ModalState> {
         keepDOM: false,
         lazyRender: true,
         fullScreen: false,
-    };
+    });
     static useModal = useModal;
     foundation: ModalFoundation;
 

+ 4 - 3
packages/semi-ui/navigation/index.tsx

@@ -14,6 +14,7 @@ import Header, { NavHeaderProps } from './Header';
 import NavContext from './nav-context';
 import LocaleConsumer from '../locale/localeConsumer';
 import '@douyinfe/semi-foundation/navigation/navigation.scss';
+import { getDefaultPropsFromGlobalConfig } from "../_utils";
 
 export type { CollapseButtonProps } from './CollapseButton';
 export type { NavFooterProps } from './Footer';
@@ -154,8 +155,8 @@ class Nav extends BaseComponent<NavProps, NavState> {
         limitIndent: PropTypes.bool,
         getPopupContainer: PropTypes.func,
     };
-
-    static defaultProps = {
+    static __SemiComponentName__ = "Navigation";
+    static defaultProps = getDefaultPropsFromGlobalConfig(Nav.__SemiComponentName__, {
         subNavCloseDelay: numbers.DEFAULT_SUBNAV_CLOSE_DELAY,
         subNavOpenDelay: numbers.DEFAULT_SUBNAV_OPEN_DELAY,
         tooltipHideDelay: numbers.DEFAULT_TOOLTIP_HIDE_DELAY,
@@ -173,7 +174,7 @@ class Nav extends BaseComponent<NavProps, NavState> {
         // defaultOpenKeys: [],
         // defaultSelectedKeys: [],
         // items: [],
-    };
+    });
 
     itemsChanged: boolean;
     constructor(props: NavProps) {

+ 5 - 3
packages/semi-ui/notification/notice.tsx

@@ -10,7 +10,7 @@ import NotificationFoundation, {
 } from '@douyinfe/semi-foundation/notification/notificationFoundation';
 import Button from '../iconButton';
 import BaseComponent from '../_base/baseComponent';
-import { isSemiIcon } from '../_utils';
+import { getDefaultPropsFromGlobalConfig, isSemiIcon } from '../_utils';
 import { noop } from 'lodash';
 import { IconAlertCircle, IconAlertTriangle, IconClose, IconInfoCircle, IconTickCircle } from '@douyinfe/semi-icons';
 import { getUuidShort } from '@douyinfe/semi-foundation/utils/uuid';
@@ -48,7 +48,9 @@ class Notice extends BaseComponent<NoticeReactProps, NoticeState> {
         direction: PropTypes.oneOf(directions),
     };
 
-    static defaultProps = {
+    static __SemiComponentName__ = "Notification";
+
+    static defaultProps = getDefaultPropsFromGlobalConfig(Notice.__SemiComponentName__, {
         duration,
         id: '',
         close: noop,
@@ -59,7 +61,7 @@ class Notice extends BaseComponent<NoticeReactProps, NoticeState> {
         title: '',
         showClose: true,
         theme: 'normal',
-    };
+    });
 
     get adapter(): NoticeAdapter {
         return {

+ 5 - 3
packages/semi-ui/overflowList/index.tsx

@@ -10,7 +10,7 @@ import IntersectionObserver from './intersectionObserver';
 import OverflowListFoundation, { OverflowListAdapter } from '@douyinfe/semi-foundation/overflowList/foundation';
 
 import '@douyinfe/semi-foundation/overflowList/overflowList.scss';
-import { cloneDeep } from '../_utils';
+import { cloneDeep, getDefaultPropsFromGlobalConfig } from '../_utils';
 
 const prefixCls = cssClasses.PREFIX;
 const Boundary = strings.BOUNDARY_MAP;
@@ -54,7 +54,9 @@ export interface OverflowListState {
 
 // reference to https://github.com/palantir/blueprint/blob/1aa71605/packages/core/src/components/overflow-list/overflowList.tsx#L34
 class OverflowList extends BaseComponent<OverflowListProps, OverflowListState> {
-    static defaultProps = {
+    static __SemiComponentName__ = "OverflowList";
+
+    static defaultProps = getDefaultPropsFromGlobalConfig(OverflowList.__SemiComponentName__, {
         collapseFrom: 'end',
         minVisibleItems: 0,
         overflowRenderer: (): ReactElement => null,
@@ -62,7 +64,7 @@ class OverflowList extends BaseComponent<OverflowListProps, OverflowListState> {
         threshold: 0.75,
         visibleItemRenderer: (): ReactElement => null,
         onOverflow: () => null,
-    };
+    })
     static propTypes = {
         // if render in scroll mode, key is required in items
         className: PropTypes.string,

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

@@ -1,6 +1,6 @@
 {
     "name": "@douyinfe/semi-ui",
-    "version": "2.52.3",
+    "version": "2.53.0-beta.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,17 +20,18 @@
         "@dnd-kit/core": "^6.0.8",
         "@dnd-kit/sortable": "^7.0.2",
         "@dnd-kit/utilities": "^3.2.1",
-        "@douyinfe/semi-animation": "2.52.3",
-        "@douyinfe/semi-animation-react": "2.52.3",
-        "@douyinfe/semi-foundation": "2.52.3",
-        "@douyinfe/semi-icons": "2.52.3",
-        "@douyinfe/semi-illustrations": "2.52.3",
-        "@douyinfe/semi-theme-default": "2.52.3",
+        "@douyinfe/semi-animation": "2.53.0-beta.0",
+        "@douyinfe/semi-animation-react": "2.53.0-beta.0",
+        "@douyinfe/semi-foundation": "2.53.0-beta.0",
+        "@douyinfe/semi-icons": "2.53.0-beta.0",
+        "@douyinfe/semi-illustrations": "2.53.0-beta.0",
+        "@douyinfe/semi-theme-default": "2.53.0-beta.0",
         "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",

+ 5 - 2
packages/semi-ui/popconfirm/index.tsx

@@ -14,6 +14,7 @@ import ConfigContext, { ContextValue } from '../configProvider/context';
 import LocaleConsumer from '../locale/localeConsumer';
 import { Locale as LocaleObject } from '../locale/interface';
 import '@douyinfe/semi-foundation/popconfirm/popconfirm.scss';
+import { getDefaultPropsFromGlobalConfig } from "../_utils";
 
 export interface PopconfirmProps extends PopoverProps {
     cancelText?: string;
@@ -80,7 +81,9 @@ export default class Popconfirm extends BaseComponent<PopconfirmProps, Popconfir
         position: PropTypes.string,
     };
 
-    static defaultProps = {
+    static __SemiComponentName__ = "Popconfirm";
+
+    static defaultProps = getDefaultPropsFromGlobalConfig(Popconfirm.__SemiComponentName__, {
         stopPropagation: true,
         trigger: 'click',
         // position: 'bottomLeft',
@@ -95,7 +98,7 @@ export default class Popconfirm extends BaseComponent<PopconfirmProps, Popconfir
         onCancel: noop,
         onConfirm: noop,
         onClickOutSide: noop,
-    };
+    });
 
     footerRef: React.RefObject<HTMLDivElement | null>;
     popoverRef: React.RefObject<Popover | null>;

+ 4 - 2
packages/semi-ui/popover/index.tsx

@@ -11,6 +11,7 @@ import { isFunction, noop } from 'lodash';
 
 import type { ArrowProps } from './Arrow';
 import isNullOrUndefined from '@douyinfe/semi-foundation/utils/isNullOrUndefined';
+import { getDefaultPropsFromGlobalConfig } from "../_utils";
 export type { ArrowProps };
 declare interface ArrowStyle {
     borderColor?: string;
@@ -90,8 +91,9 @@ class Popover extends React.PureComponent<PopoverProps, PopoverState> {
         guardFocus: PropTypes.bool,
         disableArrowKeyDown: PropTypes.bool,
     };
+    static __SemiComponentName__ = "Popover";
 
-    static defaultProps = {
+    static defaultProps = getDefaultPropsFromGlobalConfig(Popover.__SemiComponentName__, {
         arrowBounding: numbers.ARROW_BOUNDING,
         showArrow: false,
         autoAdjustOverflow: true,
@@ -108,7 +110,7 @@ class Popover extends React.PureComponent<PopoverProps, PopoverState> {
         returnFocusOnClose: true,
         guardFocus: true,
         disableFocusListener: true
-    };
+    })
 
     context: ContextValue;
     tooltipRef: React.RefObject<Tooltip | null>;

+ 42 - 5
packages/semi-ui/resizeObserver/index.tsx

@@ -11,30 +11,44 @@ export interface ResizeEntry {
 
 export interface ReactResizeObserverProps extends BaseProps {
     onResize?: (entries: ResizeEntry[]) => void;
-    observeParent?: boolean
+    observeParent?: boolean;
+    observerProperty?: ObserverProperty;
+    delayTick?: number
 }
 
+
+export enum ObserverProperty {
+    Width='width',
+    Height = "height",
+    All = "all"
+}
 export default class ReactResizeObserver extends BaseComponent<ReactResizeObserverProps> {
     static propTypes = {
         onResize: PropTypes.func,
         observeParent: PropTypes.bool,
+        observerProperty: PropTypes.string,
+        delayTick: PropTypes.number
     };
 
     static defaultProps = {
         onResize: () => {}, // eslint-disable-line
         observeParent: false,
+        observerProperty: "all",
+        delayTick: 0
     };
     observer: ResizeObserver;
     childNode: any;
     element: Element;
     _parentNode: HTMLElement;
 
+    formerPropertyValue: Map<Element, number> = new Map()
+
+
     constructor(props: ReactResizeObserverProps) {
         super(props);
         if (globalThis['ResizeObserver']) {
-            this.observer = new ResizeObserver(props.onResize);
+            this.observer = new ResizeObserver(this.handleResizeEventTriggered);
         }
-        
     }
 
     componentDidMount() {
@@ -65,10 +79,33 @@ export default class ReactResizeObserver extends BaseComponent<ReactResizeObserv
         }
     };
 
-    observeElement(force = false) {
+
+    handleResizeEventTriggered = (entries: ResizeEntry[])=>{
+        if (this.props.observerProperty === ObserverProperty.All) {
+            this.props.onResize(entries);
+        } else {
+            const finalEntries: ResizeEntry[] = [];
+            for (const entry of entries) {
+                if (this.formerPropertyValue.has(entry.target)) {
+                    if (entry.contentRect[this.props.observerProperty]!==this.formerPropertyValue.get(entry.target)) {
+                        this.formerPropertyValue.set(entry.target, entry.contentRect[this.props.observerProperty]);
+                        finalEntries.push(entry);
+                    }
+                } else {
+                    this.formerPropertyValue.set(entry.target, entry.contentRect[this.props.observerProperty]);
+                    finalEntries.push(entry);
+                }
+            }
+            if (finalEntries.length>0) {
+                this.props.onResize(finalEntries);
+            }
+        }
+    }
+
+    observeElement = (force = false)=>{
         const element = this.getElement();
         if (!this.observer) {
-            this.observer = new ResizeObserver(this.props.onResize);
+            this.observer = new ResizeObserver(this.handleResizeEventTriggered);
         }
         if (!(element && element instanceof Element)) {
             // stop everything if not defined

+ 5 - 4
packages/semi-ui/select/index.tsx

@@ -26,8 +26,7 @@ import OptionGroup from './optionGroup';
 import Spin from '../spin';
 import Trigger from '../trigger';
 import { IconChevronDown, IconClear } from '@douyinfe/semi-icons';
-import { isSemiIcon, getFocusableElements, getActiveElement } from '../_utils';
-import warning from '@douyinfe/semi-foundation/utils/warning';
+import { isSemiIcon, getFocusableElements, getActiveElement, getDefaultPropsFromGlobalConfig } from '../_utils';
 import { getUuidShort } from '@douyinfe/semi-foundation/utils/uuid';
 
 import '@douyinfe/semi-foundation/select/select.scss';
@@ -313,7 +312,9 @@ class Select extends BaseComponent<SelectProps, SelectState> {
         // tagClosable: PropTypes.bool,
     };
 
-    static defaultProps: Partial<SelectProps> = {
+    static __SemiComponentName__ = "Select";
+    
+    static defaultProps: Partial<SelectProps> = getDefaultPropsFromGlobalConfig(Select.__SemiComponentName__, {
         stopPropagation: true,
         motion: true,
         borderless: false,
@@ -356,7 +357,7 @@ class Select extends BaseComponent<SelectProps, SelectState> {
         // renderSelectedItem: (optionNode) => optionNode.label,
         // The default creator rendering is related to i18, so it is not declared here
         // renderCreateItem: (input) => input
-    };
+    })
 
     inputRef: React.RefObject<HTMLInputElement>;
     triggerRef: React.RefObject<HTMLDivElement>;

+ 4 - 4
packages/semi-ui/sideSheet/index.tsx

@@ -14,7 +14,7 @@ import SideSheetFoundation, {
 } from '@douyinfe/semi-foundation/sideSheet/sideSheetFoundation';
 import '@douyinfe/semi-foundation/sideSheet/sideSheet.scss';
 import CSSAnimation from "../_cssAnimation";
-import { getScrollbarWidth } from '../_utils';
+import { getDefaultPropsFromGlobalConfig, getScrollbarWidth } from '../_utils';
 
 const prefixCls = cssClasses.PREFIX;
 const defaultWidthList = strings.WIDTH;
@@ -66,8 +66,8 @@ export default class SideSheet extends BaseComponent<SideSheetReactProps, SideSh
         keepDOM: PropTypes.bool,
         'aria-label': PropTypes.string,
     };
-
-    static defaultProps: SideSheetReactProps = {
+    static __SemiComponentName__ = "SideSheet";
+    static defaultProps: SideSheetReactProps = getDefaultPropsFromGlobalConfig(SideSheet.__SemiComponentName__, {
         visible: false,
         motion: true,
         mask: true,
@@ -81,7 +81,7 @@ export default class SideSheet extends BaseComponent<SideSheetReactProps, SideSh
         closeOnEsc: false,
         afterVisibleChange: noop,
         keepDOM: false
-    };
+    });
     private _active: boolean;
 
     constructor(props: SideSheetReactProps) {

+ 5 - 4
packages/semi-ui/table/_story/ChildrenDataSelected/index.jsx

@@ -3,6 +3,7 @@ import React, { useMemo, useState, useCallback, useEffect } from 'react';
 import * as _ from 'lodash';
 import { IconEdit } from '@douyinfe/semi-icons';
 import testJson from '../data/big2.json';
+import copy from 'fast-copy';
 
 const getKey = (record, rowKey) => (typeof rowKey === 'function' ? rowKey(rowKey) : _.get(record, rowKey));
 
@@ -43,7 +44,7 @@ function ChildrenDataSelectedDemo(props = {}) {
     const [data, setData] = useState([]);
 
     const getTableData = () => {
-        const tableData = _.cloneDeep(testJson.data);
+        const tableData = copy(testJson.data);
         const allKeys = [];
         for (let i = 0, len = tableData.length; i < len; ++i) {
             const key = `${i}`;
@@ -90,7 +91,7 @@ function ChildrenDataSelectedDemo(props = {}) {
     }, [getRecordKey, selectedRowKeys]);
 
     const onChangeOne = useCallback((recordKey, text, e) => {
-        const tableData = _.cloneDeep(data);
+        const tableData = copy(data);
         // const tableData = data;
         const findRecord = _.get(tableData, recordKey);
         const findCheckBox = _.find(findRecord[authPoint], item => item.code === text);
@@ -102,11 +103,11 @@ function ChildrenDataSelectedDemo(props = {}) {
             indeterminate: someSelected,
         };
         setData(tableData);
-        // setData(_.cloneDeep(tableData));
+        // setData(copy(tableData));
     }, [data]);
 
     const onChangeAll = useCallback((recordKey, e) => {
-        const tableData = _.cloneDeep(data);
+        const tableData = copy(data);
         const findRecord = _.get(tableData, recordKey);
         findRecord.checkAll = {
             checked: findRecord[authPoint] && findRecord[authPoint].length && e.target.checked,

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

@@ -1,6 +1,6 @@
 import React from 'react';
 import { Table } from '@douyinfe/semi-ui';
-import { cloneDeep } from 'lodash';
+import copy from 'fast-copy';
 
 const ControlledSortOrder = () => {
     const [sortColumns, setSortColumns] = React.useState([]);
@@ -59,7 +59,7 @@ const ControlledSortOrder = () => {
             columns={sortColumns}
             dataSource={sortData}
             onChange={({ sorter }) => {
-                const cT = cloneDeep(sortColumns);
+                const cT = copy(sortColumns);
                 let sortOrder;
                 const sortTrend = sorter.sortOrder;
                 if (!sortTrend) {

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

@@ -1,6 +1,6 @@
 import React from 'react';
 import { Table, Button } from '@douyinfe/semi-ui';
-import { cloneDeep } from 'lodash';
+import copy from 'fast-copy';
 
 export default class FilterWithNewDataTable extends React.Component {
     constructor(p) {
@@ -83,7 +83,7 @@ export default class FilterWithNewDataTable extends React.Component {
         return (
             <div>
                 <Button onClick={() => {
-                    let _new = cloneDeep(this.state);
+                    let _new = copy(this.state);
                     _new.sortData = [];
                     _new.sortData.push({
                         key: '5',

+ 5 - 4
packages/semi-ui/table/_story/VritualizedDataSelected/index.jsx

@@ -3,6 +3,7 @@ import React, { useMemo, useState, useCallback, useEffect, useRef } from 'react'
 import * as _ from 'lodash';
 import { IconEdit } from '@douyinfe/semi-icons';
 import testJson from '../data/big2.json';
+import copy from 'fast-copy';
 
 const getKey = (record, rowKey) => (typeof rowKey === 'function' ? rowKey(rowKey) : _.get(record, rowKey));
 
@@ -52,7 +53,7 @@ function ChildrenDataSelectedDemo(props = {}) {
     const [data, setData] = useState([]);
 
     const getTableData = () => {
-        const tableData = _.cloneDeep(testJson.data);
+        const tableData = copy(testJson.data);
         const allKeys = [];
         for (let i = 0, len = tableData.length; i < len; ++i) {
             const key = `${i}`;
@@ -145,7 +146,7 @@ function ChildrenDataSelectedDemo(props = {}) {
     };
 
     const onChangeOne = (recordKey, text, e) => {
-        const tableData = _.cloneDeep(data);
+        const tableData = copy(data);
         // const tableData = data;
         const findRecord = _.get(tableData, recordKey);
         const findCheckBox = _.find(findRecord[authPoint], item => {
@@ -159,11 +160,11 @@ function ChildrenDataSelectedDemo(props = {}) {
             indeterminate: someSelected,
         };
         setData(tableData);
-        // setData(_.cloneDeep(tableData));
+        // setData(copy(tableData));
     };
 
     const onChangeAll = (recordKey, e) => {
-        const tableData = _.cloneDeep(data);
+        const tableData = copy(data);
         const findRecord = _.get(tableData, recordKey);
         findRecord.checkAll = {
             checked: findRecord[authPoint] && findRecord[authPoint].length && e.target.checked,

+ 4 - 3
packages/semi-ui/tabs/index.tsx

@@ -13,6 +13,7 @@ import TabPane from './TabPane';
 import TabItem from './TabItem';
 import TabsContext from './tabs-context';
 import { PlainTab, TabBarProps, TabsProps } from './interface';
+import { getDefaultPropsFromGlobalConfig } from "../_utils";
 
 const panePickKeys = ['className', 'style', 'disabled', 'itemKey', 'tab', 'icon'];
 
@@ -52,8 +53,8 @@ class Tabs extends BaseComponent<TabsProps, TabsState> {
         onTabClose: PropTypes.func,
         preventScroll: PropTypes.bool,
     };
-
-    static defaultProps: TabsProps = {
+    static __SemiComponentName__ = "Tabs";
+    static defaultProps: TabsProps = getDefaultPropsFromGlobalConfig(Tabs.__SemiComponentName__, {
         children: [],
         collapsible: false,
         keepDOM: true,
@@ -65,7 +66,7 @@ class Tabs extends BaseComponent<TabsProps, TabsState> {
         tabPosition: 'top',
         type: 'line',
         onTabClose: () => undefined
-    };
+    });
 
     contentRef: RefObject<HTMLDivElement>;
     contentHeight: string;

+ 3 - 1
packages/semi-ui/timePicker/index.tsx

@@ -6,6 +6,7 @@ import { get } from 'lodash';
 import { Locale } from '../locale/interface';
 import type { ValidateStatus } from '../_base/baseComponent';
 import type { ScrollItemProps } from '../scrollList/scrollItem';
+import { getDefaultPropsFromGlobalConfig } from "../_utils";
 
 export type { TimeInputProps } from './TimeInput';
 export type { TimePickerProps } from './TimePicker';
@@ -18,7 +19,8 @@ export type LocalePickerProps = BasePickerProps;
 
 export default class LocaleTimePicker extends React.PureComponent<LocalePickerProps> {
     static propTypes = BaseTimePicker.propTypes;
-    static defaultProps = BaseTimePicker.defaultProps;
+    static __SemiComponentName__ = "TimePicker";
+    static defaultProps = getDefaultPropsFromGlobalConfig(LocaleTimePicker.__SemiComponentName__, BaseTimePicker.defaultProps);
 
     render() {
         const { type } = this.props;

+ 4 - 4
packages/semi-ui/toast/toast.tsx

@@ -8,7 +8,7 @@ import BaseComponent from '../_base/baseComponent';
 import Button from '../iconButton/index';
 import { IconClose, IconAlertTriangle, IconInfoCircle, IconTickCircle, IconAlertCircle } from '@douyinfe/semi-icons';
 import { noop } from 'lodash';
-import { isSemiIcon } from '../_utils';
+import { getDefaultPropsFromGlobalConfig, isSemiIcon } from '../_utils';
 
 const prefixCls = cssClasses.PREFIX;
 
@@ -46,8 +46,8 @@ class Toast extends BaseComponent<ToastReactProps, ToastState> {
         icon: PropTypes.node,
         direction: PropTypes.oneOf(strings.directions),
     };
-
-    static defaultProps = {
+    static __SemiComponentName__ = "Toast";
+    static defaultProps = getDefaultPropsFromGlobalConfig(Toast.__SemiComponentName__, {
         onClose: noop,
         content: '',
         close: noop,
@@ -57,7 +57,7 @@ class Toast extends BaseComponent<ToastReactProps, ToastState> {
         stack: false,
         stackExpanded: false,
         theme: 'normal'
-    };
+    })
 
     constructor(props: ToastReactProps) {
         super(props);

+ 4 - 4
packages/semi-ui/tooltip/index.tsx

@@ -20,7 +20,7 @@ import '@douyinfe/semi-foundation/tooltip/tooltip.scss';
 
 import BaseComponent, { BaseProps } from '../_base/baseComponent';
 import { isHTMLElement } from '../_base/reactUtils';
-import { getActiveElement, getFocusableElements, stopPropagation } from '../_utils';
+import { getActiveElement, getDefaultPropsFromGlobalConfig, getFocusableElements, stopPropagation } from '../_utils';
 import Portal from '../_portal/index';
 import ConfigContext, { ContextValue } from '../configProvider/context';
 import TriangleArrow from './TriangleArrow';
@@ -150,8 +150,8 @@ export default class Tooltip extends BaseComponent<TooltipProps, TooltipState> {
         preventScroll: PropTypes.bool,
         keepDOM: PropTypes.bool,
     };
-
-    static defaultProps = {
+    static __SemiComponentName__ = "Tooltip";
+    static defaultProps = getDefaultPropsFromGlobalConfig(Tooltip.__SemiComponentName__, {
         arrowBounding: numbers.ARROW_BOUNDING,
         autoAdjustOverflow: true,
         arrowPointAtCenter: true,
@@ -177,7 +177,7 @@ export default class Tooltip extends BaseComponent<TooltipProps, TooltipState> {
         disableFocusListener: false,
         disableArrowKeyDown: false,
         keepDOM: false
-    };
+    });
 
     eventManager: Event;
     triggerEl: React.RefObject<unknown>;

+ 10 - 7
packages/semi-ui/tree/_story/tree.stories.jsx

@@ -1,11 +1,13 @@
 import React, { useRef, useState, useCallback, useMemo, useEffect } from 'react';
-import { cloneDeep, difference, isEqual } from 'lodash';
+import { difference, isEqual } from 'lodash';
 import { IconEdit, IconMapPin, IconMore } from '@douyinfe/semi-icons';
 import Tree from '../index';
 import AutoSizer from '../autoSizer';
 import { Button, ButtonGroup, Input, Popover, Toast, Space, Select, Switch, Typography } from '../../index';
 import BigTree from './BigData';
 import testData from './data';
+import copy from 'fast-copy';
+
 const TreeNode = Tree.TreeNode;
 const { Title } = Typography;
 
@@ -643,7 +645,7 @@ class TagSideSheet2 extends React.Component {
   }
 
   transLabel(list) {
-    // list = cloneDeep(list);
+    // list = copy(list);
     list.forEach(item => {
       item.label = this.renderLabel(item);
       // item.key += Math.random().toString().slice(0, 5);
@@ -653,7 +655,7 @@ class TagSideSheet2 extends React.Component {
 
   render() {
     const { tagList = [] } = this.state;
-    const transformedTags = this.transLabel(cloneDeep(tagList));
+    const transformedTags = this.transLabel(copy(tagList));
     console.log('transformedTags', transformedTags, treeDataTest);
     return <Tree treeData={transformedTags} />;
   }
@@ -1421,7 +1423,7 @@ const LoadingTreeDemo = () => {
     });
   }
 
-  return <Tree loadData={onLoadData} treeData={cloneDeep(treeData)} />;
+  return <Tree loadData={onLoadData} treeData={copy(treeData)} />;
 };
 
 export const Loading = () => (
@@ -1462,7 +1464,7 @@ const LoadingWithSearch = () => {
     });
   }
 
-  return <Tree loadData={onLoadData} treeData={cloneDeep(treeData)} filterTreeNode />;
+  return <Tree loadData={onLoadData} treeData={copy(treeData)} filterTreeNode />;
 };
 
 export const _LoadingWithSearch = () => (
@@ -1813,7 +1815,7 @@ const ActionTree = () => {
   const remove = key => {
     let ind = data[0].children.findIndex(item => item.key === key);
     if (ind >= 0) {
-      let items = cloneDeep(data);
+      let items = copy(data);
       items[0].children.splice(ind, 1);
       setData(items);
     }
@@ -1821,7 +1823,7 @@ const ActionTree = () => {
 
   return (
     <Tree
-      treeData={cloneDeep(data)}
+      treeData={copy(data)}
       renderLabel={(label, data) => (
         <div>
           {label}
@@ -2925,6 +2927,7 @@ export const KeyMaps = () => {
 
   const normalExpanded = useCallback((expandedKeys, { expanded, node }) => {
     console.log('onExpanded', expandedKeys, expanded, cloneDeep(node));
+
   }, []);
 
   const normalSearch = useCallback((input, filteredExpandedKeys) => {

+ 5 - 5
packages/semi-ui/treeSelect/_story/treeSelect.stories.jsx

@@ -1,11 +1,11 @@
 import React, { useState, useMemo, useRef, useCallback, useEffect } from 'react';
 import { Icon, Input, Button, Form, Popover, Tag, Typography, CheckboxGroup, TagInput, Switch, Tree } from '../../index';
 import TreeSelect from '../index';
-import { flattenDeep, cloneDeep } from 'lodash';
+import { flattenDeep } from 'lodash';
 import CustomTrigger from './CustomTrigger';
 import { IconCreditCard, IconChevronDown, IconClose } from '@douyinfe/semi-icons';
-import { setFocusToPreviousMenuItem } from '@douyinfe/semi-foundation/utils/a11y';
-import { node } from 'prop-types';
+import copy from 'fast-copy';
+
 const TreeNode = TreeSelect.TreeNode;
 const { Title } = Typography;
 
@@ -2566,7 +2566,7 @@ export const KeyMaps = () => {
   }, []);
 
   const normalExpand = useCallback((expandedKeys, {expanded, node}) => {
-    console.log('onExpanded', expandedKeys, expanded, cloneDeep(node));
+    console.log('onExpanded', expandedKeys, expanded, copy(node));
   }, []);
 
   const keyMaps = useMemo(() => {
@@ -2647,7 +2647,7 @@ export const KeyMaps = () => {
           multiple
           expandedKeys={expandKeys}
           onExpand={(expandedKeys, {expanded, node}) => {
-            console.log('onExpanded', expandedKeys, expanded, cloneDeep(node));
+            console.log('onExpanded', expandedKeys, expanded, copy(node));
             setExpandedKeys(expandedKeys);
           }}
         />

+ 65 - 37
packages/semi-ui/typography/base.tsx

@@ -1,5 +1,4 @@
 import React, { Component, CSSProperties } from 'react';
-import ReactDOM from 'react-dom';
 import cls from 'classnames';
 import PropTypes from 'prop-types';
 import { cssClasses, strings } from '@douyinfe/semi-foundation/typography/constants';
@@ -13,12 +12,12 @@ import getRenderText from './util';
 import warning from '@douyinfe/semi-foundation/utils/warning';
 import isEnterPress from '@douyinfe/semi-foundation/utils/isEnterPress';
 import LocaleConsumer from '../locale/localeConsumer';
-import { Locale } from '../locale/interface';
-import { Ellipsis, EllipsisPos, ShowTooltip, TypographyBaseSize, TypographyBaseType } from './interface';
+import type { Locale } from '../locale/interface';
+import type { Ellipsis, EllipsisPos, ShowTooltip, TypographyBaseSize, TypographyBaseType } from './interface';
 import { CopyableConfig, LinkType } from './title';
 import { BaseProps } from '../_base/baseComponent';
-import { isSemiIcon } from '../_utils';
-import ResizeObserver from '../resizeObserver';
+import { isSemiIcon, runAfterTicks } from '../_utils';
+import ResizeObserver, { ObserverProperty, ResizeEntry } from '../resizeObserver';
 
 export interface BaseTypographyProps extends BaseProps {
     copyable?: CopyableConfig | boolean;
@@ -172,6 +171,7 @@ export default class Base extends Component<BaseTypographyProps, BaseTypographyS
     rafId: ReturnType<typeof requestAnimationFrame>;
     expandStr: string;
     collapseStr: string;
+    observerTakingEffect: boolean = false
 
     constructor(props: BaseTypographyProps) {
         super(props);
@@ -194,7 +194,8 @@ export default class Base extends Component<BaseTypographyProps, BaseTypographyS
 
     componentDidMount() {
         if (this.props.ellipsis) {
-            this.onResize();
+            // runAfterTicks: make sure start observer on the next tick
+            this.onResize().then(()=>runAfterTicks(()=>this.observerTakingEffect = true, 1));
         }
     }
 
@@ -229,11 +230,16 @@ export default class Base extends Component<BaseTypographyProps, BaseTypographyS
         }
     }
 
-    onResize = () => {
+    onResize = async (entries?: ResizeEntry[]) => {
         if (this.rafId) {
             window.cancelAnimationFrame(this.rafId);
         }
-        this.rafId = window.requestAnimationFrame(this.getEllipsisState.bind(this));
+        return new Promise<void>(resolve => {
+            this.rafId = window.requestAnimationFrame(async ()=>{
+                await this.getEllipsisState();
+                resolve();
+            });
+        });
     };
 
     // if it needs to use js overflowed:
@@ -299,25 +305,51 @@ export default class Base extends Component<BaseTypographyProps, BaseTypographyS
         return defaultOpts;
     };
 
-    getEllipsisState() {
+    onHover = ()=>{
+        const canUseCSSEllipsis = this.canUseCSSEllipsis();
+        if (canUseCSSEllipsis) {
+            const { rows, suffix, pos } = this.getEllipsisOpt();
+            const updateOverflow = this.shouldTruncated(rows);
+            // isOverflowed needs to be updated to show tooltip when using css ellipsis
+            this.setState({
+                isOverflowed: updateOverflow,
+                isTruncated: false
+            });
+
+            return undefined;
+        }
+    }
+
+    getEllipsisState = async ()=> {
         const { rows, suffix, pos } = this.getEllipsisOpt();
         const { children } = this.props;
         // wait until element mounted
         if (!this.wrapperRef || !this.wrapperRef.current) {
-            this.onResize();
-            return false;
+            await this.onResize();
+            return;
         }
         const { expanded } = this.state;
         const canUseCSSEllipsis = this.canUseCSSEllipsis();
-        
+        if (canUseCSSEllipsis) {
+            // const updateOverflow = this.shouldTruncated(rows);
+            // // isOverflowed needs to be updated to show tooltip when using css ellipsis
+            // this.setState({
+            //     isOverflowed: updateOverflow,
+            //     isTruncated: false
+            // });
+
+            return ;
+        }
 
         // If children is null, css/js truncated flag isTruncate is false
         if (isNull(children)) {
-            this.setState({
-                isTruncated: false,
-                isOverflowed: false
-            });
-            return undefined;
+            return new Promise<void>(resolve=>{
+                this.setState({
+                    isTruncated: false,
+                    isOverflowed: false
+                }, resolve);
+            }); 
+
         }
 
         // Currently only text truncation is supported, if there is non-text, 
@@ -328,19 +360,9 @@ export default class Base extends Component<BaseTypographyProps, BaseTypographyS
         );
 
         if (!rows || rows < 0 || expanded) {
-            return undefined;
+            return;
         }
 
-        if (canUseCSSEllipsis) {
-            const updateOverflow = this.shouldTruncated(rows);
-            // isOverflowed needs to be updated to show tooltip when using css ellipsis
-            this.setState({
-                isOverflowed: updateOverflow,
-                isTruncated: false
-            });
-
-            return undefined;
-        }
 
         const extraNode = { expand: this.expandRef.current, copy: this.copyRef && this.copyRef.current };
 
@@ -354,12 +376,14 @@ export default class Base extends Component<BaseTypographyProps, BaseTypographyS
             suffix,
             pos
         );
-        this.setState({
-            isOverflowed: false,
-            ellipsisContent: content,
-            isTruncated: children !== content,
+        return new Promise<void>(resolve=>{
+            this.setState({
+                isOverflowed: false,
+                ellipsisContent: content,
+                isTruncated: children !== content,
+            }, resolve);
         });
-        return undefined;
+
     }
 
     /**
@@ -501,14 +525,14 @@ export default class Base extends Component<BaseTypographyProps, BaseTypographyS
         const { isTruncated, expanded, ellipsisContent } = this.state;
         if (expanded || !isTruncated) {
             return (
-                <>
+                <span onMouseEnter={this.onHover}>
                     {children}
                     {suffix && suffix.length ? suffix : null}
-                </>
+                </span>
             );
         }
         return (
-            <span>
+            <span onMouseEnter={this.onHover}>
                 {ellipsisContent}
                 {/* {ELLIPSIS_STR} */}
                 {suffix}
@@ -687,7 +711,11 @@ export default class Base extends Component<BaseTypographyProps, BaseTypographyS
         );
         if (this.props.ellipsis) {
             return (
-                <ResizeObserver onResize={this.onResize} observeParent>
+                <ResizeObserver onResize={(...args)=>{
+                    if (this.observerTakingEffect) {
+                        this.onResize(...args);
+                    }
+                }} observeParent observerProperty={ObserverProperty.Width}>
                     {content}
                 </ResizeObserver>
             );

+ 1 - 1
packages/semi-ui/typography/util.tsx

@@ -163,4 +163,4 @@ const getRenderText = (
     return resText;
 };
 
-export default getRenderText;
+export default getRenderText;

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

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

+ 161 - 161
sitemap.xml

@@ -2,22 +2,22 @@
 <urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
     <url>
         <loc>https://juejin.cn/post/7267418854124699702</loc>
-        <lastmod>2024-02-22T07:48:05.225Z</lastmod>
+        <lastmod>2024-02-08T06:35:16.233Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://medium.com/front-end-weekly/how-we-test-semi-design-component-libraries-64b854f63b65</loc>
-        <lastmod>2024-02-22T07:48:05.018Z</lastmod>
+        <lastmod>2024-02-08T06:35:14.469Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://mp.weixin.qq.com/s/noHoWRuA25PgqFNcurhIUA</loc>
-        <lastmod>2024-02-22T07:48:07.367Z</lastmod>
+        <lastmod>2024-02-08T06:35:17.034Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://mp.weixin.qq.com/s/O3js-SZDNPEOjGxh-aAkbw</loc>
-        <lastmod>2024-02-22T07:48:07.430Z</lastmod>
+        <lastmod>2024-02-08T06:35:17.145Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
@@ -376,7 +376,7 @@
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/handbook/intro</loc>
-        <lastmod>2024-02-19T03:46:30.259Z</lastmod>
+        <lastmod>2024-02-06T11:06:45.277Z</lastmod>
         <changefreq>weekly</changefreq>
         <scm>1.0.0.131</scm>
     </url>
@@ -448,7 +448,7 @@
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/input/slider</loc>
-        <lastmod>2024-02-22T07:48:08.970Z</lastmod>
+        <lastmod>2024-02-06T11:06:46.042Z</lastmod>
         <changefreq>weekly</changefreq>
         <scm>1.0.0.131</scm>
     </url>
@@ -502,7 +502,7 @@
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/navigation/navigation</loc>
-        <lastmod>2024-02-22T07:48:09.890Z</lastmod>
+        <lastmod>2024-02-06T11:06:45.920Z</lastmod>
         <changefreq>weekly</changefreq>
         <scm>1.0.0.131</scm>
     </url>
@@ -562,13 +562,13 @@
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/show/descriptions</loc>
-        <lastmod>2024-02-22T07:48:10.522Z</lastmod>
+        <lastmod>2024-02-06T11:06:46.718Z</lastmod>
         <changefreq>weekly</changefreq>
         <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/show/dropdown</loc>
-        <lastmod>2024-02-19T03:46:32.130Z</lastmod>
+        <lastmod>2024-02-06T11:06:46.721Z</lastmod>
         <changefreq>weekly</changefreq>
         <scm>1.0.0.131</scm>
     </url>
@@ -580,7 +580,7 @@
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/show/modal</loc>
-        <lastmod>2024-02-22T07:48:10.324Z</lastmod>
+        <lastmod>2024-02-06T11:06:46.729Z</lastmod>
         <changefreq>weekly</changefreq>
         <scm>1.0.0.131</scm>
     </url>
@@ -592,9 +592,9 @@
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/show/scrolllist</loc>
-        <lastmod>2024-02-06T11:06:46.887Z</lastmod>
+        <lastmod>2024-02-08T06:35:22.140Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.131</scm>
+        <scm>1.0.0.130</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/show/table</loc>
@@ -604,7 +604,7 @@
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/show/tag</loc>
-        <lastmod>2024-02-19T03:46:32.802Z</lastmod>
+        <lastmod>2024-02-06T11:06:46.879Z</lastmod>
         <changefreq>weekly</changefreq>
         <scm>1.0.0.131</scm>
     </url>
@@ -646,13 +646,13 @@
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/visual/iconography</loc>
-        <lastmod>2024-02-22T07:48:10.610Z</lastmod>
+        <lastmod>2024-02-06T11:06:47.433Z</lastmod>
         <changefreq>weekly</changefreq>
         <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/visual/layout</loc>
-        <lastmod>2024-02-22T07:48:10.596Z</lastmod>
+        <lastmod>2024-02-06T11:06:47.428Z</lastmod>
         <changefreq>weekly</changefreq>
         <scm>1.0.0.131</scm>
     </url>
@@ -784,83 +784,83 @@
     </url>
     <url>
         <loc>https://semi.design/dsm/landing</loc>
-        <lastmod>2024-02-22T07:48:12.299Z</lastmod>
+        <lastmod>2024-01-19T10:05:31.040Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.166</scm>
+        <scm>1.0.0.165</scm>
     </url>
     <url>
         <loc>https://semi.design/en-US/basic/divider</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/basic/grid</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/basic/icon</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/basic/layout</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/basic/space</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/basic/tokens</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/basic/typography</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/feedback/banner</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/feedback/notification</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/feedback/popconfirm</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/feedback/progress</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/feedback/skeleton</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/feedback/spin</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/feedback/toast</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/autocomplete</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
@@ -870,362 +870,362 @@
     </url>
     <url>
         <loc>https://semi.design/en-US/input/cascader</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/checkbox</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/datepicker</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/form</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/input</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/inputnumber</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/radio</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/rating</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/select</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/slider</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/switch</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/taginput</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/timepicker</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/transfer</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/treeselect</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/upload</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/navigation/anchor</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/navigation/backtop</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/navigation/breadcrumb</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/navigation/navigation</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/navigation/pagination</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/navigation/steps</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/navigation/tabs</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/navigation/tree</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/other/configprovider</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/other/locale</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/avatar</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/badge</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/calendar</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/card</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/carousel</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/collapse</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/collapsible</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/descriptions</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/dropdown</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/empty</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/highlight</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/image</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/list</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/modal</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/overflowlist</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/popover</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/scrolllist</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/sidesheet</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/table</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/tag</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/timeline</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/tooltip</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/accessibility</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/changelog</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/customize-theme</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/dark-mode</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/faq</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/getting-started</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/introduction</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/overview</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/update-to-v2</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/basic/divider</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/basic/grid</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/basic/icon</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/basic/layout</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/basic/space</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/basic/tokens</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/basic/typography</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/feedback/banner</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/feedback/notification</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/feedback/popconfirm</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/feedback/progress</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/feedback/skeleton</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/feedback/spin</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/feedback/toast</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/autocomplete</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
@@ -1235,287 +1235,287 @@
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/cascader</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/checkbox</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/datepicker</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/form</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/input</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/inputnumber</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/radio</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/rating</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/select</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/slider</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/switch</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/taginput</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/timepicker</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/transfer</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/treeselect</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/upload</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/navigation/anchor</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/navigation/backtop</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/navigation/breadcrumb</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/navigation/navigation</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/navigation/pagination</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/navigation/steps</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/navigation/tabs</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/navigation/tree</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/other/configprovider</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/other/locale</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/avatar</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/badge</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/calendar</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/card</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/carousel</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/collapse</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/collapsible</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/descriptions</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/dropdown</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/empty</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/highlight</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/image</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/list</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/modal</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/overflowlist</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/popover</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/scrolllist</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/sidesheet</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/table</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/tag</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/timeline</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/tooltip</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/accessibility</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/changelog</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/customize-theme</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/dark-mode</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/faq</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/getting-started</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/introduction</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/overview</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/update-to-v2</loc>
-        <lastmod>2024-02-22T07:43:31.000Z</lastmod>
+        <lastmod>2024-02-08T04:35:26.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
 </urlset>

+ 5 - 0
yarn.lock

@@ -12154,6 +12154,11 @@ fast-copy@^2.1.0:
   resolved "https://registry.npmjs.org/fast-copy/-/fast-copy-2.1.7.tgz#affc9475cb4b555fb488572b2a44231d0c9fa39e"
   integrity sha512-ozrGwyuCTAy7YgFCua8rmqmytECYk/JYAMXcswOcm0qvGoE3tPb7ivBeIHTOK2DiapBhDZgacIhzhQIKU5TCfA==
 
+"fast-copy@^3.0.1 ":
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/fast-copy/-/fast-copy-3.0.1.tgz#9e89ef498b8c04c1cd76b33b8e14271658a732aa"
+  integrity sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==
+
 fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
   version "3.1.3"
   resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio