diff --git a/components/dropdown/__tests__/__snapshots__/demo-extend.test.ts.snap b/components/dropdown/__tests__/__snapshots__/demo-extend.test.ts.snap index 899a1f6238d4..05c50b5eedb8 100644 --- a/components/dropdown/__tests__/__snapshots__/demo-extend.test.ts.snap +++ b/components/dropdown/__tests__/__snapshots__/demo-extend.test.ts.snap @@ -3893,6 +3893,219 @@ Array [ exports[`renders components/dropdown/demo/event.tsx extend context correctly 2`] = `[]`; +exports[`renders components/dropdown/demo/extra.tsx extend context correctly 1`] = ` +Array [ + +
+
+ Hover me +
+
+ + + +
+
+
, +
+ + , +] +`; + +exports[`renders components/dropdown/demo/extra.tsx extend context correctly 2`] = `[]`; + exports[`renders components/dropdown/demo/icon-debug.tsx extend context correctly 1`] = `
`; +exports[`renders components/dropdown/demo/extra.tsx correctly 1`] = ` + +
+
+ Hover me +
+
+ + + +
+
+
+`; + exports[`renders components/dropdown/demo/icon-debug.tsx correctly 1`] = `
{ ); expect(container3.querySelector('button')).not.toHaveAttribute('disabled'); }); + + it('menu item with extra prop', () => { + const text = '⌘P'; + const { container } = render( + + + , + ); + + expect(container.querySelector('.ant-dropdown-menu-item-extra')?.textContent).toBe(text); + }); }); diff --git a/components/dropdown/demo/extra.md b/components/dropdown/demo/extra.md new file mode 100644 index 000000000000..c01f7e43a965 --- /dev/null +++ b/components/dropdown/demo/extra.md @@ -0,0 +1,7 @@ +## zh-CN + +带有快捷方式的下拉菜单。 + +## en-US + +The dropdown menu with shortcut. diff --git a/components/dropdown/demo/extra.tsx b/components/dropdown/demo/extra.tsx new file mode 100644 index 000000000000..a10cdb81abd2 --- /dev/null +++ b/components/dropdown/demo/extra.tsx @@ -0,0 +1,44 @@ +import React from 'react'; +import { DownOutlined, SettingOutlined } from '@ant-design/icons'; +import type { MenuProps } from 'antd'; +import { Dropdown, Space } from 'antd'; + +const items: MenuProps['items'] = [ + { + key: '1', + label: 'My Account', + disabled: true, + }, + { + type: 'divider', + }, + { + key: '2', + label: 'Profile', + extra: '⌘P', + }, + { + key: '3', + label: 'Billing', + extra: '⌘B', + }, + { + key: '4', + label: 'Settings', + icon: , + extra: '⌘S', + }, +]; + +const App: React.FC = () => ( + + e.preventDefault()}> + + Hover me + + + + +); + +export default App; diff --git a/components/dropdown/index.en-US.md b/components/dropdown/index.en-US.md index b3aca1010182..ec8cf0467c97 100644 --- a/components/dropdown/index.en-US.md +++ b/components/dropdown/index.en-US.md @@ -17,6 +17,7 @@ When there are more than a few options to choose from, you can wrap them in a `D Basic +Extra node Placement Arrow Other elements diff --git a/components/dropdown/index.zh-CN.md b/components/dropdown/index.zh-CN.md index a131bfcd77d5..d198bb038083 100644 --- a/components/dropdown/index.zh-CN.md +++ b/components/dropdown/index.zh-CN.md @@ -21,6 +21,7 @@ demo: 基本 +额外节点 弹出位置 箭头 其他元素 diff --git a/components/dropdown/style/index.ts b/components/dropdown/style/index.ts index e807a147c3ef..79f2ac9a2544 100644 --- a/components/dropdown/style/index.ts +++ b/components/dropdown/style/index.ts @@ -236,6 +236,8 @@ const genBaseStyle: GenerateStyle = (token) => { }, [`${menuCls}-title-content`]: { + display: 'flex', + alignItems: 'center', flex: 'auto', '> a': { @@ -252,6 +254,13 @@ const genBaseStyle: GenerateStyle = (token) => { content: '""', }, }, + + [`${menuCls}-item-extra`]: { + paddingInlineStart: token.padding, + marginInlineStart: 'auto', + fontSize: token.fontSizeSM, + color: token.colorTextDescription, + }, }, // =========================== Item =========================== diff --git a/components/mentions/__tests__/__snapshots__/demo-extend.test.ts.snap b/components/mentions/__tests__/__snapshots__/demo-extend.test.ts.snap index 74801e561002..5d196204ed13 100644 --- a/components/mentions/__tests__/__snapshots__/demo-extend.test.ts.snap +++ b/components/mentions/__tests__/__snapshots__/demo-extend.test.ts.snap @@ -516,11 +516,6 @@ exports[`renders components/mentions/demo/render-panel.tsx extend context correc exports[`renders components/mentions/demo/render-panel.tsx extend context correctly 2`] = ` [ - "Warning: Received \`%s\` for a non-boolean attribute \`%s\`. - -If you want to write it to the DOM, pass a string instead: %s="%s" or %s={value.toString()}. - -If you used to conditionally omit it with %s={condition && value}, pass %s={condition ? value : undefined} instead.%s", "Warning: \`open\` of Mentions is only used for debug usage. Do not use in you production.", ] `; diff --git a/components/menu/MenuItem.tsx b/components/menu/MenuItem.tsx index 5511b8855f07..cfd3cb3d309e 100644 --- a/components/menu/MenuItem.tsx +++ b/components/menu/MenuItem.tsx @@ -45,12 +45,14 @@ const MenuItem: GenericComponent = (props) => { inlineCollapsed: isInlineCollapsed, } = React.useContext(MenuContext); const renderItemChildren = (inlineCollapsed: boolean) => { + const label = (children as React.ReactNode[])?.[0]; + const wrapNode = {children}; // inline-collapsed.md demo 依赖 span 来隐藏文字,有 icon 属性,则内部包裹一个 span // ref: https://github.com/ant-design/ant-design/pull/23456 if (!icon || (React.isValidElement(children) && children.type === 'span')) { - if (children && inlineCollapsed && firstLevel && typeof children === 'string') { - return
{children.charAt(0)}
; + if (children && inlineCollapsed && firstLevel && typeof label === 'string') { + return
{label.charAt(0)}
; } } return wrapNode; diff --git a/components/menu/__tests__/index.test.tsx b/components/menu/__tests__/index.test.tsx index 67e212e00c88..ff005b215925 100644 --- a/components/menu/__tests__/index.test.tsx +++ b/components/menu/__tests__/index.test.tsx @@ -1160,4 +1160,11 @@ describe('Menu', () => { ); expect(container.querySelector('.ant-menu-submenu-arrow')).toBeFalsy(); }); + + it('menu item with extra prop', () => { + const text = '⌘P'; + const { container } = render(); + + expect(container.querySelector('.ant-menu-item-extra')?.textContent).toBe(text); + }); }); diff --git a/components/menu/index.en-US.md b/components/menu/index.en-US.md index 3b431931d719..d66905dc2971 100644 --- a/components/menu/index.en-US.md +++ b/components/menu/index.en-US.md @@ -77,6 +77,7 @@ Common props ref:[Common props](/docs/react/common-props) | -------- | ------------------------------------ | --------- | ------------- | ------- | | danger | Display the danger style | boolean | false | | | disabled | Whether menu item is disabled | boolean | false | | +| extra | The extra of the menu item | ReactNode | - | 5.21.0 | | icon | The icon of the menu item | ReactNode | - | | | key | Unique ID of the menu item | string | - | | | label | Menu label | ReactNode | - | | diff --git a/components/menu/index.zh-CN.md b/components/menu/index.zh-CN.md index b567123e5ab6..c2618d226861 100644 --- a/components/menu/index.zh-CN.md +++ b/components/menu/index.zh-CN.md @@ -74,14 +74,15 @@ coverDark: https://mdn.alipayobjects.com/huamei_7uahnr/afts/img/A*Vn4XSqJFAxcAAA #### MenuItemType -| 参数 | 说明 | 类型 | 默认值 | 版本 | -| -------- | ------------------------ | --------- | ------ | ---- | -| danger | 展示错误状态样式 | boolean | false | | -| disabled | 是否禁用 | boolean | false | | -| icon | 菜单图标 | ReactNode | - | | -| key | item 的唯一标志 | string | - | | -| label | 菜单项标题 | ReactNode | - | | -| title | 设置收缩时展示的悬浮标题 | string | - | | +| 参数 | 说明 | 类型 | 默认值 | 版本 | +| -------- | ------------------------ | --------- | ------ | ------ | +| danger | 展示错误状态样式 | boolean | false | | +| disabled | 是否禁用 | boolean | false | | +| extra | 额外节点 | ReactNode | - | 5.21.0 | +| icon | 菜单图标 | ReactNode | - | | +| key | item 的唯一标志 | string | - | | +| label | 菜单项标题 | ReactNode | - | | +| title | 设置收缩时展示的悬浮标题 | string | - | | #### SubMenuType diff --git a/components/menu/style/index.ts b/components/menu/style/index.ts index 69b26a2a962f..81c64c512ffe 100644 --- a/components/menu/style/index.ts +++ b/components/menu/style/index.ts @@ -635,13 +635,26 @@ const getBaseStyle: GenerateStyle = (token) => { }, [`${componentCls}-title-content`]: { + display: 'inline-flex', + alignItems: 'center', transition: `color ${motionDurationSlow}`, + '> a:first-child': { + flexGrow: 1, + }, + // https://github.com/ant-design/ant-design/issues/41143 [`> ${antCls}-typography-ellipsis-single-line`]: { display: 'inline', verticalAlign: 'unset', }, + + [`${componentCls}-item-extra`]: { + marginInlineStart: 'auto', + paddingInlineStart: token.padding, + fontSize: token.fontSizeSM, + color: token.colorTextDescription, + }, }, [`${componentCls}-item a`]: { diff --git a/package.json b/package.json index c90203a12945..4f5f18320459 100644 --- a/package.json +++ b/package.json @@ -134,8 +134,8 @@ "rc-image": "~7.9.0", "rc-input": "~1.6.3", "rc-input-number": "~9.2.0", - "rc-mentions": "~2.15.0", - "rc-menu": "~9.14.1", + "rc-mentions": "~2.16.0", + "rc-menu": "~9.15.1", "rc-motion": "^2.9.2", "rc-notification": "~5.6.0", "rc-pagination": "~4.2.0", @@ -149,7 +149,7 @@ "rc-steps": "~6.0.1", "rc-switch": "~4.1.0", "rc-table": "~7.47.3", - "rc-tabs": "~15.1.1", + "rc-tabs": "~15.2.0", "rc-textarea": "~1.8.1", "rc-tooltip": "~6.2.0", "rc-tree": "~5.9.0",