diff --git a/packages/core/src/components/Menu/subcomponents/MenuItem/MenuItem.stories.tsx b/packages/core/src/components/Menu/subcomponents/MenuItem/MenuItem.stories.tsx index 0fd23e777..05d425805 100644 --- a/packages/core/src/components/Menu/subcomponents/MenuItem/MenuItem.stories.tsx +++ b/packages/core/src/components/Menu/subcomponents/MenuItem/MenuItem.stories.tsx @@ -92,6 +92,22 @@ export const Selectable: Story = { })(), }; +export const ActiveForNavigation: Story = { + name: 'Active for navigation', + render: () => + (() => { + const [active, setActive] = React.useState(false); + const onOptionClick = () => setActive(!active); + return ( + + ); + })(), +}; + export const CustomContent: Story = { render: () => (() => { diff --git a/packages/core/src/components/Menu/subcomponents/MenuItem/MenuItem.tsx b/packages/core/src/components/Menu/subcomponents/MenuItem/MenuItem.tsx index 16372c6a3..87eda8792 100644 --- a/packages/core/src/components/Menu/subcomponents/MenuItem/MenuItem.tsx +++ b/packages/core/src/components/Menu/subcomponents/MenuItem/MenuItem.tsx @@ -109,6 +109,13 @@ export const MenuItem: React.FC = ({ : selectionScheme === 'multiple' ? 'menuitemcheckbox' : 'menuitem'; + const hasExtraLeftSpaceEval = + (hasExtraLeftSpace || + Boolean(icon) || + isSelectable || + Boolean(selectionScheme)) && + !Boolean(children); + return ( = ({ as={isLink ? 'a' : isSelectable ? 'label' : 'button'} disabled={!isLink && !isSelectable && isDisabled} download={download} - hasExtraLeftSpace={ - (hasExtraLeftSpace || Boolean(icon) || isSelectable) && - !Boolean(children) - } + hasExtraLeftSpace={hasExtraLeftSpaceEval} href={isDisabled ? null : href} id={id} name={isSelectable ? null : name} diff --git a/packages/core/src/components/Menu/subcomponents/MenuItem/styled/StyledMenuItemInner.ts b/packages/core/src/components/Menu/subcomponents/MenuItem/styled/StyledMenuItemInner.ts index a521fdfb5..2ed66beae 100644 --- a/packages/core/src/components/Menu/subcomponents/MenuItem/styled/StyledMenuItemInner.ts +++ b/packages/core/src/components/Menu/subcomponents/MenuItem/styled/StyledMenuItemInner.ts @@ -1,5 +1,6 @@ import styled, { css } from 'styled-components'; import { + ActiveState, BasicState, ButtonAttrProps, ExpandedState, @@ -28,6 +29,7 @@ export interface StyledMenuItemInnerProps /** State of the menu item */ state?: | BasicState + | ActiveState | MouseState | FeaturedState | SelectedState @@ -37,6 +39,7 @@ export interface StyledMenuItemInnerProps export const StyledMenuItemInner = styled.button` ${({ hasExtraLeftSpace, state = 'enabled', theme, unlimitedHeight }) => { + const stateForTokens = state === 'active' ? 'activated' : state; const aliasTokens = theme.alias; const tokens = aliasTokens.menus.item; const horPadding = menuItemSizeConfig(theme).horPadding; @@ -60,8 +63,8 @@ export const StyledMenuItemInner = styled.button` ${aliasTokens.mutation.transitionDuration.action}; height: ${unlimitedHeight ? 'auto' : tokens.size.minHeight}; padding: ${unlimitedHeight ? horPadding : `0 ${horPadding}`}; - background-color: ${tokens.color.background[state]}; - color: ${tokens.color.text[state]}; + background-color: ${tokens.color.background[stateForTokens]}; + color: ${tokens.color.text[stateForTokens]}; cursor: pointer; text-decoration: none; @@ -109,7 +112,7 @@ export const StyledMenuItemInner = styled.button` ${(state === 'expanded' || state === 'hovered' || state === 'pressed') && css` &&& { - ${menuItemBackdropMixin({ tokens, state })}; + ${menuItemBackdropMixin({ tokens, state: stateForTokens })}; } `} diff --git a/packages/core/src/declarations/commonProps.ts b/packages/core/src/declarations/commonProps.ts index 0fe11f332..60e671c3d 100644 --- a/packages/core/src/declarations/commonProps.ts +++ b/packages/core/src/declarations/commonProps.ts @@ -128,6 +128,8 @@ export type ExpandedState = 'expanded'; export type FeaturedState = 'featured'; +export type ActiveState = 'active'; + export type ReadonlyState = 'readonly'; export type UIState = 'created' | 'deleted';