diff --git a/packages/grafana-ui/src/components/Menu/Menu.story.tsx b/packages/grafana-ui/src/components/Menu/Menu.story.tsx index 2c72671a348..e162baaf18b 100644 --- a/packages/grafana-ui/src/components/Menu/Menu.story.tsx +++ b/packages/grafana-ui/src/components/Menu/Menu.story.tsx @@ -98,11 +98,11 @@ export function Examples() { - + - + , @@ -118,8 +118,17 @@ export function Examples() { ]} />, ]} + shortcut="p s" + /> + , + , + , + ]} /> - diff --git a/packages/grafana-ui/src/components/Menu/MenuItem.tsx b/packages/grafana-ui/src/components/Menu/MenuItem.tsx index 47c9940a6b8..c511d402b2a 100644 --- a/packages/grafana-ui/src/components/Menu/MenuItem.tsx +++ b/packages/grafana-ui/src/components/Menu/MenuItem.tsx @@ -44,6 +44,8 @@ export interface MenuItemProps { childItems?: Array>; /** Custom style for SubMenu */ customSubMenuContainerStyles?: CSSProperties; + /** Shortcut key combination */ + shortcut?: string; } /** @internal */ @@ -65,6 +67,7 @@ export const MenuItem = React.memo( role = 'menuitem', tabIndex = -1, customSubMenuContainerStyles, + shortcut, } = props; const styles = useStyles2(getStyles); const [isActive, setIsActive] = useState(active); @@ -132,6 +135,8 @@ export const MenuItem = React.memo( localRef?.current?.focus(); }; + const hasShortcut = Boolean(shortcut && shortcut.length > 0); + return ( {icon && } {label} - - {hasSubMenu && ( - - )} +
+ {hasShortcut && ( +
+ + {shortcut} +
+ )} + {hasSubMenu && ( + + )} +
+
); }) @@ -238,5 +251,24 @@ const getStyles = (theme: GrafanaTheme2) => { margin-left: -4px; color: ${theme.colors.text.secondary}; `, + rightWrapper: css` + display: flex; + align-items: center; + margin-left: auto; + `, + shortcutIcon: css` + margin-right: ${theme.spacing(1)}; + `, + withShortcut: css` + min-width: ${theme.spacing(10.5)}; + `, + shortcut: css` + display: flex; + align-items: center; + gap: ${theme.spacing(1)}; + margin-left: ${theme.spacing(2)}; + color: ${theme.colors.text.secondary}; + opacity: 0.7; + `, }; }; diff --git a/packages/grafana-ui/src/components/Menu/SubMenu.tsx b/packages/grafana-ui/src/components/Menu/SubMenu.tsx index 7ab86d04bf3..5de7e13a1f6 100644 --- a/packages/grafana-ui/src/components/Menu/SubMenu.tsx +++ b/packages/grafana-ui/src/components/Menu/SubMenu.tsx @@ -74,7 +74,7 @@ const getStyles = (theme: GrafanaTheme2) => { `, icon: css` opacity: 0.7; - margin-left: ${theme.spacing(2)}; + margin-left: ${theme.spacing(1)}; color: ${theme.colors.text.secondary}; `, itemsWrapper: css`