Pārlūkot izejas kodu

Merge branch 'main' into release

linyan 1 gadu atpakaļ
vecāks
revīzija
07ac467c68

+ 5 - 1
content/start/changelog/index-en-US.md

@@ -15,7 +15,11 @@ Version:Major.Minor.Patch (follow the **Semver** specification)
 -   **Patch version**: Only include bug fix, the release time is not limited
 
 ---
-
+#### 🎉 2.54.1 (2024-03-11)
+- 【Fix】
+    - fixed Navigation component selectedKeys bug in react 17
+    - fixed Navigation component openKeys does not work after selectedKeys is updated
+  
 #### 🎉 2.54.0 (2024-03-08)
 - 【Fix】
     - Fix the problem that the width occupied by the expand button is not taken into account in js truncation calculation, The scope of impact is 2.54.0-beta.0.

+ 5 - 1
content/start/changelog/index.md

@@ -13,7 +13,11 @@ Semi 版本号遵循 **Semver** 规范(主版本号-次版本号-修订版本
 -   修订版本号(patch):仅会进行 bugfix,发布时间不限
 -   不同版本间的详细关系,可查阅 [FAQ](/zh-CN/start/faq)
 
-
+#### 🎉 2.54.1 (2024-03-11)
+- 【Fix】
+    - 修复 Navigation 组件在 react 17 下 selectedKeys 未生效问题
+    - 修复 Navigation 组件 openKeys 在 selectedKeys 更新后未生效问题
+  
 #### 🎉 2.54.0 (2024-03-08)
 - 【Fix】
   - 修复 js 截断计算中没有将展开按钮占据的宽度计算在内问题 (影响范围 v2.54.0-beta.0)

+ 17 - 0
cypress/e2e/navigation.spec.js

@@ -12,4 +12,21 @@ describe('navigation', () => {
         cy.get('span').contains('人员管理').should('exist');
     });
 
+    it('selected keys change', () => {
+        cy.visit('http://localhost:6006/iframe.html?id=navigation--fixed-selected-keys&viewMode=story');
+        cy.get('.semi-navigation-item-text').contains('Config').click();
+        cy.get('.semi-navigation-item-selected').should('contain.text', 'Ability management');
+        cy.get('.semi-navigation-sub-title.semi-navigation-sub-title-selected').should('contain.text', "Ability");
+        cy.get('.semi-navigation-item-text').contains('Distribution').click();
+        cy.get('.semi-navigation-item-selected').should('contain.text', 'Config management');
+        cy.get('.semi-navigation-sub-title.semi-navigation-sub-title-selected').should('exist');
+    });
+
+    it('selected keys change + also use state openKeys', () => {
+        cy.visit('http://localhost:6006/iframe.html?id=navigation--fixed-open-keys&viewMode=story');
+        cy.get('.semi-navigation-item-text').contains('任务平台').click();
+        cy.get('.semi-navigation-item-text').contains('任务管理').click();
+        cy.get('.semi-navigation-list > li.semi-navigation-item-sub').eq(1).should('have.attr', 'aria-expanded', 'true');
+        cy.get('.semi-navigation-list > li.semi-navigation-item-sub').eq(2).should('have.attr', 'aria-expanded', 'true');
+    });
 });

+ 1 - 1
lerna.json

@@ -1,5 +1,5 @@
 {
     "useWorkspaces": true,
     "npmClient": "yarn",
-    "version": "2.54.0"
+    "version": "2.54.1"
 }

+ 5 - 3
package.json

@@ -55,6 +55,8 @@
         "@storybook/react-webpack5": "^7.0.7",
         "@svgr/core": "^5.5.0",
         "@types/react-window": "^1.8.5",
+        "@visactor/react-vchart": "^1.7.2",
+        "@visactor/vchart-semi-theme": "^1.7.2",
         "aos": "^2.3.4",
         "camelcase": "^6.2.0",
         "chroma-js": "^2.1.2",
@@ -93,6 +95,7 @@
         "react-intl": "^3.12.1",
         "react-lazyload": "^3.2.0",
         "react-resizable": "^3.0.5",
+        "react-router-dom": "^6.22.2",
         "react-scroll-parallax": "^2.4.0",
         "react-sortable-hoc": "^2.0.0",
         "react-virtualized": "^9.22.3",
@@ -103,9 +106,7 @@
         "unist-util-remove": "^1.0.3",
         "unist-util-visit": "^2.0.3",
         "wait-on": "^6.0.1",
-        "wcag-color": "^1.1.1",
-        "@visactor/react-vchart": "^1.7.2",
-        "@visactor/vchart-semi-theme": "^1.7.2"
+        "wcag-color": "^1.1.1"
     },
     "devDependencies": {
         "@actions/core": "^1.6.0",
@@ -145,6 +146,7 @@
         "@types/react": "^18.0.5",
         "@types/react-dom": "^18.0.1",
         "@types/react-resizable": "^3.0.4",
+        "@types/react-router-dom": "^5.3.3",
         "@types/svgo": "^2.3.1",
         "@types/webpack": "^4.41.30",
         "@typescript-eslint/eslint-plugin": "^4.29.1",

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

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

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

@@ -1,6 +1,6 @@
 {
     "name": "@douyinfe/semi-animation-styled",
-    "version": "2.54.0",
+    "version": "2.54.1",
     "description": "semi styled animation",
     "keywords": [
         "semi",

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

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

+ 9 - 6
packages/semi-foundation/navigation/foundation.ts

@@ -39,7 +39,7 @@ export interface NavigationAdapter<P = Record<string, any>, S = Record<string, a
     setItemKeysMap(map: { [key: string]: (string | number)[] }): void;
     addSelectedKeys(...keys: (string | number)[]): void;
     removeSelectedKeys(...keys: (string | number)[]): void;
-    updateSelectedKeys(keys: (string | number)[]): void;
+    updateSelectedKeys(keys: (string | number)[], includeParentKeys?: boolean): void;
     updateOpenKeys(keys: (string | number)[]): void;
     addOpenKeys(...keys: (string | number)[]): void;
     removeOpenKeys(...keys: (string | number)[]): void;
@@ -114,7 +114,7 @@ export default class NavigationFoundation<P = Record<string, any>, S = Record<st
      * @param {*} lifecycle
      * @returns
      */
-    init(lifecycle: string) {
+    init(lifecycle?: string) {
         const { defaultSelectedKeys, selectedKeys } = this.getProps();
         let willSelectedKeys = selectedKeys || defaultSelectedKeys || [];
         const { itemKeysMap, willOpenKeys, formattedItems } = this.getCalcState();
@@ -129,7 +129,8 @@ export default class NavigationFoundation<P = Record<string, any>, S = Record<st
                 items: formattedItems,
             };
         } else {
-            this._adapter.updateSelectedKeys(willSelectedKeys);
+            // already include parentSelectKeys, set second parameter to false
+            this._adapter.updateSelectedKeys(willSelectedKeys, false);
             this._adapter.setItemKeysMap(itemKeysMap);
             this._adapter.updateOpenKeys(willOpenKeys);
             this._adapter.updateItems(formattedItems);
@@ -167,6 +168,7 @@ export default class NavigationFoundation<P = Record<string, any>, S = Record<st
      */
     getWillOpenKeys(itemKeysMap: ItemKey2ParentKeysMap) {
         const { defaultOpenKeys, openKeys, defaultSelectedKeys, selectedKeys, mode } = this.getProps();
+        const { openKeys: stateOpenKeys = [] } = this.getStates();
 
         let willOpenKeys = openKeys || defaultOpenKeys || [];
         if (
@@ -174,12 +176,13 @@ export default class NavigationFoundation<P = Record<string, any>, S = Record<st
             Array.isArray(openKeys)) && mode === strings.MODE_VERTICAL && (Array.isArray(defaultSelectedKeys) || Array.isArray(selectedKeys))
         ) {
             const currentSelectedKeys = Array.isArray(selectedKeys) ? selectedKeys : defaultSelectedKeys;
-            willOpenKeys = this.getShouldOpenKeys(itemKeysMap, currentSelectedKeys);
+            willOpenKeys = stateOpenKeys.concat(this.getShouldOpenKeys(itemKeysMap, currentSelectedKeys));
+            willOpenKeys = Array.from(new Set(willOpenKeys));
         }
         return [...willOpenKeys];
     }
 
-    getShouldOpenKeys(itemKeysMap: ItemKey2ParentKeysMap = {}, selectedKeys: string | number[]= []) {
+    getShouldOpenKeys(itemKeysMap: ItemKey2ParentKeysMap = {}, selectedKeys: (string | number)[] = []) {
         const willOpenKeySet = new Set();
 
         if (Array.isArray(selectedKeys) && selectedKeys.length) {
@@ -199,7 +202,7 @@ export default class NavigationFoundation<P = Record<string, any>, S = Record<st
 
     destroy() {}
 
-    selectLevelZeroParentKeys(itemKeysMap: ItemKey2ParentKeysMap, ...itemKeys: (string | number)[]) {
+    selectLevelZeroParentKeys(itemKeysMap: ItemKey2ParentKeysMap, itemKeys: (string | number)[]) {
         const _itemKeysMap = isNullOrUndefined(itemKeysMap) ? this.getState('itemKeysMap') : itemKeysMap;
         // console.log(itemKeysMap);
 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@@ -1,6 +1,6 @@
 {
     "name": "@douyinfe/semi-theme-default",
-    "version": "2.54.0",
+    "version": "2.54.1",
     "description": "semi-theme-default",
     "keywords": [
         "semi-theme",

+ 17 - 22
packages/semi-ui/_sortable/index.tsx

@@ -34,10 +34,6 @@ import type { SortableTransition } from '@dnd-kit/sortable/dist/hooks/types';
 import { isNull } from 'lodash';
 
 const defaultPrefix = 'semi-sortable';
-const defaultConstraint = {
-    delay: 150,
-    tolerance: 5,
-};
 
 interface OnSortEndProps {
     oldIndex: number;
@@ -91,13 +87,16 @@ function DefaultContainer(props) {
     return <div style={{ overflow: 'auto' }} {...props}></div>;
 }
 
+const defaultKeyBoardOptions = {
+    coordinateGetter: sortableKeyboardCoordinates,
+};
+
 export function Sortable({
     items,
     onSortEnd,
     adjustScale,
     renderItem,
     transition,
-    activationConstraint = defaultConstraint,
     collisionDetection = closestCenter,
     strategy = rectSortingStrategy,
     useDragOverlay = true,
@@ -108,15 +107,9 @@ export function Sortable({
 
     const [activeId, setActiveId] = useState<UniqueIdentifier | null>(null);
     const sensors = useSensors(
-        useSensor(MouseSensor, {
-            activationConstraint, 
-        }),
-        useSensor(TouchSensor, {
-            activationConstraint,
-        }),
-        useSensor(KeyboardSensor, {
-            coordinateGetter: sortableKeyboardCoordinates,
-        })
+        useSensor(MouseSensor),
+        useSensor(TouchSensor),
+        useSensor(KeyboardSensor, defaultKeyBoardOptions)
     );
     const getIndex = useCallback((id: UniqueIdentifier) => items.indexOf(id), [items]);
     const activeIndex = useMemo(() => activeId ? getIndex(activeId) : -1, [getIndex, activeId]);
@@ -235,14 +228,16 @@ export function SortableItem({
         }
     );
 
-    const wrapperStyle = (!isNull(animation)) ? {
-        transform: cssDndKit.Transform.toString({
-            ...transform,
-            scaleX: 1,
-            scaleY: 1,
-        }),
-        transition: transition,
-    } : undefined;
+    const wrapperStyle = useMemo(() => {
+        return (!isNull(animation)) ? {
+            transform: cssDndKit.Transform.toString({
+                ...transform,
+                scaleX: 1,
+                scaleY: 1,
+            }),
+            transition: transition,
+        } : undefined;
+    }, [animation, transform, transition]);
 
     return <div 
         ref={setNodeRef}

+ 81 - 0
packages/semi-ui/navigation/_story/FixedOpenKeys/index.tsx

@@ -0,0 +1,81 @@
+import React, { useState, useMemo, useCallback } from 'react';
+import { IconUser, IconStar, IconUserGroup, IconEdit, IconSetting } from '@douyinfe/semi-icons';
+import { Nav, Button } from '../../../index';
+
+/**
+ * test with cypress
+ */
+export default function Demo() {
+    const [selectedKeys, setSelectedKeys] = useState(['入驻审核']);
+    const navItems = useMemo(
+        () => [
+            { itemKey: 'user', text: '用户管理', icon: <IconUser /> },
+            { itemKey: 'union', text: '公会中心', icon: <IconStar /> },
+            {
+                itemKey: 'union-management',
+                text: '公会管理',
+                icon: <IconUserGroup />,
+                items: ['公告设置', '公会查询', '信息录入'],
+            },
+            {
+                itemKey: 'approve-management',
+                text: '审批管理',
+                icon: <IconEdit />,
+                items: [
+                    '入驻审核',
+                    {
+                        itemKey: 'operation-management',
+                        text: '运营管理',
+                        items: ['人员管理', '人员变更'],
+                    },
+                ],
+            },
+            {
+                text: '任务平台',
+                icon: <IconSetting />,
+                itemKey: 'job',
+                items: ['任务管理', '用户任务查询'],
+            },
+        ],
+        []
+    );
+    const navItemKeys = useMemo(
+        () =>
+            navItems.reduce((prev, item) => {
+                const que = [item];
+                while (que.length) {
+                    const cur = que.pop();
+                    if (cur) {
+                        if (typeof cur === 'object') {
+                            if (Array.isArray(cur.items) && cur.items.length) {
+                                que.push(...cur.items);
+                            } else if (cur.itemKey) {
+                                prev.push(cur.itemKey);
+                            }
+                        } else {
+                            prev.push(cur);
+                        }
+                    }
+                }
+                return prev;
+            }, []),
+        [navItems]
+    );
+
+    const randomSelect = useCallback(() => {
+        const randomIndex = Math.floor(Math.random() * navItemKeys.length);
+        setSelectedKeys([navItemKeys[randomIndex]]);
+    }, [navItemKeys]);
+
+    const handleSelect = (...args) => {
+        console.log(...args);
+        setSelectedKeys(args[0].selectedKeys);
+    };
+
+    return (
+        <div style={{ height: '100vh', display: 'inline-block' }}>
+            <Button onClick={randomSelect}>随机选中</Button>
+            <Nav onSelect={handleSelect} selectedKeys={selectedKeys} items={navItems} />
+        </div>
+    );
+}

+ 145 - 0
packages/semi-ui/navigation/_story/FixedSelectedKeys/index.tsx

@@ -0,0 +1,145 @@
+import React from 'react';
+import { Layout, Nav } from '@douyinfe/semi-ui';
+import { BrowserRouter, useLocation, useNavigate, Routes, Route, Navigate } from 'react-router-dom';
+import { IconSemiLogo } from '@douyinfe/semi-icons';
+
+const { Header, Sider, Content } = Layout;
+
+const RouterConfig = {
+    config: {
+        itemKey: '/config',
+        text: 'Config',
+        items: [
+            {
+                itemKey: '/config/ability',
+                text: 'Ability',
+                items: [
+                    {
+                        itemKey: '/config/ability/management',
+                        text: 'Ability management',
+                    },
+                ],
+            },
+            {
+                itemKey: '/config/task',
+                text: 'Task',
+                items: [
+                    {
+                        itemKey: '/config/task/management',
+                        text: 'Word management',
+                    },
+                ],
+            },
+        ],
+    },
+    distribution: {
+        itemKey: '/distribution',
+        text: 'Distribution',
+        items: [
+            {
+                itemKey: '/distribution/queue',
+                text: 'Queue',
+                items: [
+                    {
+                        itemKey: '/distribution/queue/management',
+                        text: 'Config management',
+                    },
+                ],
+            },
+        ],
+    },
+};
+
+const AppHeader = () => {
+    const location = useLocation();
+    const navigate = useNavigate();
+
+    const selectedKeys = React.useMemo(
+        () => [
+            location.pathname
+                .split('/')
+                .slice(0, 2)
+                .join('/'),
+        ],
+        [location.pathname]
+    );
+    const HeaderItems = React.useMemo(
+        () =>
+            Object.values(RouterConfig).map(option => (
+                <Nav.Item
+                    key={option.itemKey}
+                    itemKey={option.itemKey}
+                    text={option.text}
+                    onClick={() => {
+                        if (option.itemKey) {
+                            navigate(option.itemKey);
+                        }
+                    }}
+                />
+            )),
+        [navigate]
+    );
+
+    return (
+        <Header>
+            <div>
+                <Nav mode="horizontal" selectedKeys={selectedKeys} style={{ height: '52px' }}>
+                    <Nav.Header>
+                        <IconSemiLogo style={{ fontSize: 36 }} />
+                        <span>Semi Design</span>
+                    </Nav.Header>
+                    {HeaderItems}
+                </Nav>
+            </div>
+        </Header>
+    );
+};
+
+const AppSider = () => {
+    const location = useLocation();
+
+    const selectedFirstLevelKey = React.useMemo(() => location.pathname.split('/')[1], [location.pathname]);
+    const siderItems = React.useMemo(() => {
+        const selectedKeyConfig = RouterConfig[selectedFirstLevelKey];
+        return selectedKeyConfig?.items ?? [];
+    }, [selectedFirstLevelKey]);
+
+    const selectedKey = React.useMemo(() => [location.pathname], [location.pathname]);
+
+    return (
+        <Sider>
+            <Nav selectedKeys={selectedKey} items={siderItems} />
+        </Sider>
+    );
+};
+
+const AppContent = () => {
+    return (
+        <Routes>
+            <Route path="/config/ability/management" element={<div>ability</div>} />
+            <Route path="/config/task/management" element={<div>word</div>} />
+            <Route path="/config" element={<Navigate to="/config/ability/management" replace />} />
+            <Route path="/distribution/queue/management" element={<div>config management</div>} />
+            <Route path="/distribution" element={<Navigate to="/distribution/queue/management" replace />} />
+            <Route index element={<Navigate to="/config/ability/management" replace />} />
+        </Routes>
+    );
+};
+
+export default function App() {
+    return (
+        <BrowserRouter>
+            <div style={{ width: '100%', height: '100%', display: 'flex' }}>
+                <Layout>
+                    <AppHeader />
+                    <Layout>
+                        <AppSider />
+                        <Content>
+                            <AppContent />
+                        </Content>
+                    </Layout>
+                </Layout>
+            </div>
+        </BrowserRouter>
+    );
+}

+ 8 - 1
packages/semi-ui/navigation/_story/navigation.stories.jsx

@@ -13,6 +13,8 @@ import DisabledNav from './DisabledNav';
 import Button from '../../button';
 import GetPopupNav from './Popup';
 import CustomArrowIcon from './CustomIcon';
+import FixedSelectedKeys from './FixedSelectedKeys';
+import FixedOpenKeys from './FixedOpenKeys';
 
 import {
   IconMail,
@@ -37,6 +39,11 @@ export default {
   title: 'Navigation'
 }
 
+export {
+  FixedSelectedKeys,
+  FixedOpenKeys
+}
+
 export const Default = () => {
   return (
     <div style={{ height: '100vh', display: 'inline-block' }}>
@@ -339,4 +346,4 @@ PopupDemo.story = {
 export const CustomArrowIconDemo = () => <CustomArrowIcon></CustomArrowIcon>
 CustomArrowIconDemo.story = {
   name: 'CustomArrowIcon'
-}
+}

+ 15 - 9
packages/semi-ui/navigation/index.tsx

@@ -177,6 +177,7 @@ class Nav extends BaseComponent<NavProps, NavState> {
     });
 
     itemsChanged: boolean;
+    foundation: NavigationFoundation;
     constructor(props: NavProps) {
         super(props);
         this.foundation = new NavigationFoundation(this.adapter);
@@ -215,25 +216,20 @@ class Nav extends BaseComponent<NavProps, NavState> {
         // override BaseComponent
     }
 
-    componentDidUpdate(prevProps: NavProps, prevState: NavState) {
+    componentDidUpdate(prevProps: NavProps) {
         if (prevProps.items !== this.props.items || prevProps.children !== this.props.children) {
             this.foundation.init();
         } else {
             this.foundation.handleItemsChange(false);
-            const { selectedKeys } = this.state;
-
             if (this.props.selectedKeys && !isEqual(prevProps.selectedKeys, this.props.selectedKeys)) {
                 this.adapter.updateSelectedKeys(this.props.selectedKeys);
+                const willOpenKeys = this.foundation.getWillOpenKeys(this.state.itemKeysMap);
+                this.adapter.updateOpenKeys(willOpenKeys);
             }
 
             if (this.props.openKeys && !isEqual(prevProps.openKeys, this.props.openKeys)) {
                 this.adapter.updateOpenKeys(this.props.openKeys);
             }
-
-            if (!isEqual(selectedKeys, prevState.selectedKeys)) {
-                const parentSelectKeys = this.foundation.selectLevelZeroParentKeys(null, ...selectedKeys);
-                this.adapter.addSelectedKeys(...parentSelectKeys);
-            }
         }
     }
 
@@ -248,7 +244,17 @@ class Nav extends BaseComponent<NavProps, NavState> {
             setItemKeysMap: itemKeysMap => this.setState({ itemKeysMap: { ...itemKeysMap } }),
             addSelectedKeys: createAddKeysFn(this, 'selectedKeys'),
             removeSelectedKeys: createRemoveKeysFn(this, 'selectedKeys'),
-            updateSelectedKeys: selectedKeys => this.setState({ selectedKeys: [...selectedKeys] }),
+            /**
+             * when `includeParentKeys` is `true`, select a nested nav item will select parent nav sub
+             */
+            updateSelectedKeys: (selectedKeys: (string | number)[], includeParentKeys = true) => {
+                let willUpdateSelectedKeys = selectedKeys;
+                if (includeParentKeys) {
+                    const parentSelectKeys = this.foundation.selectLevelZeroParentKeys(null, selectedKeys);
+                    willUpdateSelectedKeys = Array.from(new Set(selectedKeys.concat(parentSelectKeys)));
+                }
+                this.setState({ selectedKeys: willUpdateSelectedKeys });
+            },
             updateOpenKeys: openKeys => this.setState({ openKeys: [...openKeys] }),
             addOpenKeys: createAddKeysFn(this, 'openKeys'),
             removeOpenKeys: createRemoveKeysFn(this, 'openKeys'),

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

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

+ 8 - 1
packages/semi-ui/tabs/__test__/tabs.test.js

@@ -11,7 +11,7 @@ let ACTIVE = `.${BASE_CLASS_PREFIX}-tabs-tab-active`;
 
 function getTabs(tabProps, tabPaneProps = defaultTabPane) {
     let tabPane = tabPaneProps.map(pane => {
-        return <TabPane {...pane}></TabPane>
+        return <TabPane {...pane} key={pane.itemKey}></TabPane>
     });
     return <Tabs {...tabProps}>
         {tabPane}
@@ -205,4 +205,11 @@ describe('Tabs', () => {
         expect(demo.find(`.${BASE_CLASS_PREFIX}-tabs-tab`).length).toEqual(2)
         expect(demo.find(`.${BASE_CLASS_PREFIX}-tabs-tab`).at(0).hasClass(`${BASE_CLASS_PREFIX}-tabs-tab-active`)).toEqual(true);
     });
+
+    it('tabbar renders correctly on the first render', () => {
+        let props = {};
+        const tabs = render(getTabs(props));
+        expect(tabs.text()).toContain('titleA');
+        expect(tabs.text()).toContain('titleB');
+    });
 })

+ 17 - 25
packages/semi-ui/tabs/index.tsx

@@ -77,7 +77,7 @@ class Tabs extends BaseComponent<TabsProps, TabsState> {
         this.foundation = new TabsFoundation(this.adapter);
         this.state = {
             activeKey: this.foundation.getDefaultActiveKey(),
-            panes: [],
+            panes: this.getPanes(),
             prevActiveKey: null,
             forceDisableMotion: false
         };
@@ -89,38 +89,16 @@ class Tabs extends BaseComponent<TabsProps, TabsState> {
         return {
             ...super.adapter,
             collectPane: (): void => {
-                const { tabList, children } = this.props;
-                if (Array.isArray(tabList) && tabList.length) {
-                    this.setState({ panes: tabList });
-                    return;
-                }
-                const panes = React.Children.map(children, (child: any) => {
-                    if (child) {
-                        const { tab, icon, disabled, itemKey, closable } = child.props;
-                        return { tab, icon, disabled, itemKey, closable };
-                    }
-                    return undefined;
-                });
+                const panes = this.getPanes();
                 this.setState({ panes });
             },
             collectActiveKey: (): void => {
-                let panes = [];
                 const { tabList, children, activeKey: propsActiveKey } = this.props;
                 if (typeof propsActiveKey !== 'undefined') {
                     return;
                 }
                 const { activeKey } = this.state;
-                if (Array.isArray(tabList) && tabList.length) {
-                    panes = tabList;
-                } else {
-                    panes = React.Children.map(children, (child: any) => {
-                        if (child) {
-                            const { tab, icon, disabled, itemKey, closable } = child.props;
-                            return { tab, icon, disabled, itemKey, closable };
-                        }
-                        return undefined;
-                    });
-                }
+                const panes = this.getPanes();
                 if (panes.findIndex(p => p.itemKey === activeKey) === -1) {
                     if (panes.length > 0) {
                         this.setState({ activeKey: panes[0].itemKey });
@@ -207,6 +185,20 @@ class Tabs extends BaseComponent<TabsProps, TabsState> {
         this.contentRef = { current: ref };
     };
 
+    getPanes = (): PlainTab[] => {
+        const { tabList, children } = this.props;
+        if (Array.isArray(tabList) && tabList.length) {
+            return tabList;
+        }
+        return React.Children.map(children, (child: any) => {
+            if (child) {
+                const { tab, icon, disabled, itemKey, closable } = child.props;
+                return { tab, icon, disabled, itemKey, closable };
+            }
+            return undefined;
+        });
+    };
+
     onTabClick = (activeKey: string, event: MouseEvent<HTMLDivElement>): void => {
         this.foundation.handleTabClick(activeKey, event);
     };

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

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

+ 158 - 158
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-03-08T07:47:04.469Z</lastmod>
+        <lastmod>2024-03-11T08:48:09.221Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://medium.com/front-end-weekly/how-we-test-semi-design-component-libraries-64b854f63b65</loc>
-        <lastmod>2024-03-08T07:47:04.240Z</lastmod>
+        <lastmod>2024-03-11T08:48:08.995Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://mp.weixin.qq.com/s/noHoWRuA25PgqFNcurhIUA</loc>
-        <lastmod>2024-03-08T07:47:07.275Z</lastmod>
+        <lastmod>2024-03-11T08:48:11.683Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://mp.weixin.qq.com/s/O3js-SZDNPEOjGxh-aAkbw</loc>
-        <lastmod>2024-03-08T07:47:07.030Z</lastmod>
+        <lastmod>2024-03-11T08:48:11.532Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
@@ -346,9 +346,9 @@
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/feedback/popconfirm</loc>
-        <lastmod>2024-02-06T11:06:45.354Z</lastmod>
+        <lastmod>2024-03-11T08:48:14.658Z</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/feedback/progress</loc>
@@ -424,9 +424,9 @@
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/input/inputnumber</loc>
-        <lastmod>2024-02-06T11:06:45.581Z</lastmod>
+        <lastmod>2024-03-11T08:48:15.246Z</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/input/radio</loc>
@@ -460,9 +460,9 @@
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/input/taginput</loc>
-        <lastmod>2024-03-08T07:47:11.995Z</lastmod>
+        <lastmod>2024-03-11T08:48:15.203Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.130</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/input/timepicker</loc>
@@ -490,9 +490,9 @@
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/navigation/anchor</loc>
-        <lastmod>2024-03-08T07:47:12.175Z</lastmod>
+        <lastmod>2024-03-11T08:48:15.975Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.130</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/navigation/breadcrumb</loc>
@@ -532,9 +532,9 @@
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/show/avatar</loc>
-        <lastmod>2024-03-08T07:47:12.671Z</lastmod>
+        <lastmod>2024-03-11T08:48:15.975Z</lastmod>
         <changefreq>weekly</changefreq>
-        <scm>1.0.0.130</scm>
+        <scm>1.0.0.131</scm>
     </url>
     <url>
         <loc>https://semi.design/design/zh-CN/show/badge</loc>
@@ -790,77 +790,77 @@
     </url>
     <url>
         <loc>https://semi.design/en-US/basic/divider</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/basic/grid</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/basic/icon</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/basic/layout</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/basic/space</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/basic/tokens</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/basic/typography</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/feedback/banner</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/feedback/notification</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/feedback/popconfirm</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/feedback/progress</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/feedback/skeleton</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/feedback/spin</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/feedback/toast</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/autocomplete</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
@@ -870,362 +870,362 @@
     </url>
     <url>
         <loc>https://semi.design/en-US/input/cascader</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/checkbox</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/datepicker</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/form</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/input</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/inputnumber</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/radio</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/rating</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/select</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/slider</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/switch</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/taginput</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/timepicker</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/transfer</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/treeselect</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/input/upload</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/navigation/anchor</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/navigation/backtop</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/navigation/breadcrumb</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/navigation/navigation</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/navigation/pagination</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/navigation/steps</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/navigation/tabs</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/navigation/tree</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/other/configprovider</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/other/locale</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/avatar</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/badge</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/calendar</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/card</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/carousel</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/collapse</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/collapsible</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/descriptions</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/dropdown</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/empty</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/highlight</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/image</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/list</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/modal</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/overflowlist</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/popover</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/scrolllist</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/sidesheet</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/table</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/tag</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/timeline</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/show/tooltip</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/accessibility</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/changelog</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/customize-theme</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/dark-mode</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/faq</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/getting-started</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/introduction</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/overview</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/en-US/start/update-to-v2</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/basic/divider</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/basic/grid</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/basic/icon</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/basic/layout</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/basic/space</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/basic/tokens</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/basic/typography</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/feedback/banner</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/feedback/notification</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/feedback/popconfirm</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/feedback/progress</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/feedback/skeleton</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/feedback/spin</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/feedback/toast</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/autocomplete</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
@@ -1235,287 +1235,287 @@
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/cascader</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/checkbox</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/datepicker</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/form</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/input</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/inputnumber</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/radio</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/rating</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/select</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/slider</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/switch</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/taginput</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/timepicker</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/transfer</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/treeselect</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/input/upload</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/navigation/anchor</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/navigation/backtop</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/navigation/breadcrumb</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/navigation/navigation</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/navigation/pagination</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/navigation/steps</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/navigation/tabs</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/navigation/tree</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/other/configprovider</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/other/locale</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/avatar</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/badge</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/calendar</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/card</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/carousel</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/collapse</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/collapsible</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/descriptions</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/dropdown</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/empty</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/highlight</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/image</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/list</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/modal</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/overflowlist</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/popover</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/scrolllist</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/sidesheet</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/table</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/tag</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/timeline</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/show/tooltip</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/accessibility</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/changelog</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/customize-theme</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/dark-mode</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/faq</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/getting-started</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/introduction</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/overview</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
     <url>
         <loc>https://semi.design/zh-CN/start/update-to-v2</loc>
-        <lastmod>2024-03-08T07:43:40.000Z</lastmod>
+        <lastmod>2024-03-11T08:44:53.000Z</lastmod>
         <changefreq>weekly</changefreq>
     </url>
 </urlset>

+ 42 - 87
yarn.lock

@@ -1519,25 +1519,11 @@
     "@douyinfe/semi-animation-styled" "2.23.2"
     classnames "^2.2.6"
 
-"@douyinfe/[email protected]":
-  version "2.53.2"
-  resolved "https://registry.yarnpkg.com/@douyinfe/semi-animation-react/-/semi-animation-react-2.53.2.tgz#aa57dab657715264e76dba512eb640afb6a05188"
-  integrity sha512-lRJkdoK/FAA5hfmb+ePUP4QCJWgA5wwSNgvNHBplgl1Mhzc2vIGcrpWNPIDb6Zfx/jD/vnjggIjipQfKasvqsQ==
-  dependencies:
-    "@douyinfe/semi-animation" "2.53.2"
-    "@douyinfe/semi-animation-styled" "2.53.2"
-    classnames "^2.2.6"
-
 "@douyinfe/[email protected]":
   version "2.23.2"
   resolved "https://registry.npmjs.org/@douyinfe/semi-animation-styled/-/semi-animation-styled-2.23.2.tgz#f18bc074515441c297cc636ed98521e249d093c9"
   integrity sha512-cKaA1yGHPF76Rx7EZDZicj+1oX1su2wnqb/UGFOTquAwqWmkTfgQ+EKxCd/N704WH+RtmGf4xbrJKpBvvcEdSQ==
 
-"@douyinfe/[email protected]":
-  version "2.53.2"
-  resolved "https://registry.yarnpkg.com/@douyinfe/semi-animation-styled/-/semi-animation-styled-2.53.2.tgz#23a5346bb1c42865a77405d32f4a9ce04d2cfc37"
-  integrity sha512-hszJo3oRzngK9mvin6iHMzn5nPC6/x4XIIi4deojlhFCWGM54PW9OEmf/Cf0ztGM3z1hEIyaHOX70gb1m45A+Q==
-
 "@douyinfe/[email protected]":
   version "2.12.0"
   resolved "https://registry.npmjs.org/@douyinfe/semi-animation/-/semi-animation-2.12.0.tgz#51fe52d3911c2591a80a6e9fe96e6809c1511f13"
@@ -1553,13 +1539,6 @@
   dependencies:
     bezier-easing "^2.1.0"
 
-"@douyinfe/[email protected]":
-  version "2.53.2"
-  resolved "https://registry.yarnpkg.com/@douyinfe/semi-animation/-/semi-animation-2.53.2.tgz#830dd840685a710fd3b3659179f10d86c1abceaf"
-  integrity sha512-T965+DlxXGh60sAnDW2G6zZH2J7Hr7vLNivlUvGLD/f8UAWPAr7xpgWWmgNHeUoUIJO/Rh2L1TGV8XeQDU48RQ==
-  dependencies:
-    bezier-easing "^2.1.0"
-
 "@douyinfe/[email protected]":
   version "2.33.1"
   resolved "https://registry.npmjs.org/@douyinfe/semi-foundation/-/semi-foundation-2.33.1.tgz#1dfe6233e35a4ed768cb580b0c9a677d1c34ffba"
@@ -1574,21 +1553,6 @@
     memoize-one "^5.2.1"
     scroll-into-view-if-needed "^2.2.24"
 
-"@douyinfe/[email protected]":
-  version "2.53.2"
-  resolved "https://registry.yarnpkg.com/@douyinfe/semi-foundation/-/semi-foundation-2.53.2.tgz#88b87e470982ef1c8daf98e06be2ddb3b922b1dc"
-  integrity sha512-8/zMDbr9UvKzGE7IhBHVY4u6tfjwzcoQlG1fawjD51qCDshntEZtgU/P6SfHYejZwezBsVSIRCThP7hnZTpJkw==
-  dependencies:
-    "@douyinfe/semi-animation" "2.53.2"
-    async-validator "^3.5.0"
-    classnames "^2.2.6"
-    date-fns "^2.29.3"
-    date-fns-tz "^1.3.8"
-    fast-copy "^3.0.1 "
-    lodash "^4.17.21"
-    memoize-one "^5.2.1"
-    scroll-into-view-if-needed "^2.2.24"
-
 "@douyinfe/[email protected]", "@douyinfe/semi-icons@latest":
   version "2.33.1"
   resolved "https://registry.yarnpkg.com/@douyinfe/semi-icons/-/semi-icons-2.33.1.tgz#8e2871d9bc0ab7e12df74e3c71802d53d69b7425"
@@ -1596,23 +1560,11 @@
   dependencies:
     classnames "^2.2.6"
 
-"@douyinfe/[email protected]", "@douyinfe/semi-icons@^2.0.0":
-  version "2.53.2"
-  resolved "https://registry.yarnpkg.com/@douyinfe/semi-icons/-/semi-icons-2.53.2.tgz#d723ca0ee37bf876e833108201da7d5791c25c21"
-  integrity sha512-ZIxNBrZn3tAd347f3FbcvQSJpr5oX7b/BoUTGK16Mkguqp6Kd9gzWTURixRxIfBaCkZ5ftvS+m9x1jSx6RnkkA==
-  dependencies:
-    classnames "^2.2.6"
-
 "@douyinfe/[email protected]":
   version "2.33.1"
   resolved "https://registry.npmjs.org/@douyinfe/semi-illustrations/-/semi-illustrations-2.33.1.tgz#530ab851f4dc32a52221c4067c778c800b9b55d7"
   integrity sha512-tTTUN8QwnQiF++sk4VBNzfkG87aYZ4iUeqk2ys8/ymVUmCZQ7y46ys020GO1MfPHRR47OMFPI82FVcH1WQtE3g==
 
-"@douyinfe/[email protected]":
-  version "2.53.2"
-  resolved "https://registry.yarnpkg.com/@douyinfe/semi-illustrations/-/semi-illustrations-2.53.2.tgz#a1420e51443c179b0843cb41efca3e09cf77378e"
-  integrity sha512-vYgt4eQcnYCPWgJQg7QUIrz2teKoZ3Iwg/rLcpgL6NT4YKY7TDNeUN1ROwO1FpGqaBv2Mcfcr5BNo1siOJDIdg==
-
 "@douyinfe/[email protected]":
   version "2.23.2"
   resolved "https://registry.npmjs.org/@douyinfe/semi-scss-compile/-/semi-scss-compile-2.23.2.tgz#30884bb194ee9ae1e81877985e5663c3297c1ced"
@@ -1686,40 +1638,6 @@
   dependencies:
     glob "^7.1.6"
 
-"@douyinfe/[email protected]":
-  version "2.53.2"
-  resolved "https://registry.yarnpkg.com/@douyinfe/semi-theme-default/-/semi-theme-default-2.53.2.tgz#a3885b60f30c3c990985bbbb1b2493bae28c1c79"
-  integrity sha512-2RhUGg3T6wmNicRpfDo/SNHuq3jqNKk/FjSMtquM2S/q/L1DPa6ONrjPfED0vsD/uMHCfrJmH38tjT2OnxmKEA==
-  dependencies:
-    glob "^7.1.6"
-
-"@douyinfe/semi-ui@^2.0.0":
-  version "2.53.2"
-  resolved "https://registry.yarnpkg.com/@douyinfe/semi-ui/-/semi-ui-2.53.2.tgz#ce5814cd8d0f9132b864243e1453767247ded565"
-  integrity sha512-JS+H869MeF+lKXxzNcmWmx26em+8jPq1eUyevojt0Q36juAA0F4cDQpQ3Juv0cplkFHB92ScieadFUkwyZub4g==
-  dependencies:
-    "@dnd-kit/core" "^6.0.8"
-    "@dnd-kit/sortable" "^7.0.2"
-    "@dnd-kit/utilities" "^3.2.1"
-    "@douyinfe/semi-animation" "2.53.2"
-    "@douyinfe/semi-animation-react" "2.53.2"
-    "@douyinfe/semi-foundation" "2.53.2"
-    "@douyinfe/semi-icons" "2.53.2"
-    "@douyinfe/semi-illustrations" "2.53.2"
-    "@douyinfe/semi-theme-default" "2.53.2"
-    async-validator "^3.5.0"
-    classnames "^2.2.6"
-    copy-text-to-clipboard "^2.1.1"
-    date-fns "^2.29.3"
-    date-fns-tz "^1.3.8"
-    fast-copy "^3.0.1 "
-    lodash "^4.17.21"
-    prop-types "^15.7.2"
-    react-resizable "^3.0.5"
-    react-window "^1.8.2"
-    scroll-into-view-if-needed "^2.2.24"
-    utility-types "^3.10.0"
-
 "@douyinfe/semi-ui@latest":
   version "2.33.1"
   resolved "https://registry.yarnpkg.com/@douyinfe/semi-ui/-/semi-ui-2.33.1.tgz#3234ca96eb3560b8299bc9750fbe59446522d9bb"
@@ -3682,6 +3600,11 @@
     prop-types "^15.6.1"
     react-lifecycles-compat "^3.0.4"
 
+"@remix-run/[email protected]":
+  version "1.15.2"
+  resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.15.2.tgz#35726510d332ba5349c6398d13259d5da184553d"
+  integrity sha512-+Rnav+CaoTE5QJc4Jcwh5toUpnVLKYbpU6Ys0zqbakqbaLQHeglLVHPfxOiQqdNmUy5C2lXz5dwC6tQNX2JW2Q==
+
 "@resvg/[email protected]":
   version "2.4.1"
   resolved "https://registry.yarnpkg.com/@resvg/resvg-js-android-arm-eabi/-/resvg-js-android-arm-eabi-2.4.1.tgz#49dc9722f95096f8aff70186deae8e148d60dce5"
@@ -5309,6 +5232,11 @@
   dependencies:
     "@types/unist" "*"
 
+"@types/history@^4.7.11":
+  version "4.7.11"
+  resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.11.tgz#56588b17ae8f50c53983a524fc3cc47437969d64"
+  integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==
+
 "@types/hoist-non-react-statics@^3.3.1":
   version "3.3.1"
   resolved "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f"
@@ -5566,6 +5494,23 @@
   dependencies:
     "@types/react" "*"
 
+"@types/react-router-dom@^5.3.3":
+  version "5.3.3"
+  resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.3.3.tgz#e9d6b4a66fcdbd651a5f106c2656a30088cc1e83"
+  integrity sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==
+  dependencies:
+    "@types/history" "^4.7.11"
+    "@types/react" "*"
+    "@types/react-router" "*"
+
+"@types/react-router@*":
+  version "5.1.20"
+  resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.20.tgz#88eccaa122a82405ef3efbcaaa5dcdd9f021387c"
+  integrity sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==
+  dependencies:
+    "@types/history" "^4.7.11"
+    "@types/react" "*"
+
 "@types/react-transition-group@^4.4.0":
   version "4.4.5"
   resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz#aae20dcf773c5aa275d5b9f7cdbca638abc5e416"
@@ -11666,11 +11611,6 @@ eslint-plugin-react@^7.20.6, eslint-plugin-react@^7.24.0:
     semver "^6.3.0"
     string.prototype.matchall "^4.0.8"
 
-eslint-plugin-semi-design@^2.33.0:
-  version "2.53.2"
-  resolved "https://registry.yarnpkg.com/eslint-plugin-semi-design/-/eslint-plugin-semi-design-2.53.2.tgz#23c8b0e093517d9b21e0619f8fecea024334ab20"
-  integrity sha512-Zm9DcBZoUSoXzI16L10xafSUN/m5pl1OtLvpM8sCgmi9ji3aZJtiBGR5t5I/JRa+CB++2ryxDIXzoPjO5TP0oQ==
-
 eslint-rule-composer@^0.3.0:
   version "0.3.0"
   resolved "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9"
@@ -21834,6 +21774,21 @@ react-resize-detector@^7.1.2:
   dependencies:
     lodash "^4.17.21"
 
+react-router-dom@^6.22.2:
+  version "6.22.2"
+  resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.22.2.tgz#8233968a8a576f3006e5549c80f3527d2598fc9c"
+  integrity sha512-WgqxD2qySEIBPZ3w0sHH+PUAiamDeszls9tzqMPBDA1YYVucTBXLU7+gtRfcSnhe92A3glPnvSxK2dhNoAVOIQ==
+  dependencies:
+    "@remix-run/router" "1.15.2"
+    react-router "6.22.2"
+
[email protected]:
+  version "6.22.2"
+  resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.22.2.tgz#27e77e4c635a5697693b922d131d773451c98a5b"
+  integrity sha512-YD3Dzprzpcq+tBMHBS822tCjnWD3iIZbTeSXMY9LPSG541EfoBGyZ3bS25KEnaZjLcmQpw2AVLkFyfgXY8uvcw==
+  dependencies:
+    "@remix-run/router" "1.15.2"
+
 react-scroll-parallax@^2.4.0:
   version "2.4.3"
   resolved "https://registry.npmjs.org/react-scroll-parallax/-/react-scroll-parallax-2.4.3.tgz#db0ae1da5700a4588237b7e8048e25c6aa5b6f18"