Skip to main content
HomeComponentsMenu
warning
This is a beta release of the Quantum web libraries
Please be careful when using them in production, as they may contain bugs, unstable breaking changes, and incomplete features.

Menu

The Menu is an UI component that displays a list of items vertically. It's commonly used to group related options or actions together. You can use it within various components like Dropdown, Drawer, and Split Button to organize content or actions in a straightforward and accessible way.

By default, a Menu will handle automatically the active menu item based on user interaction thanks to the enableAutoActive prop set by default to true.

There are two ways to use this component:

info

All menu items and submenu items must have an id attribute for the features to work properly.

Using children

You can pass elements like MenuItem, SubmenuItem, and their associated components as children to construct a MenuItemList. This provides enhanced control over the layout and content, allowing for more tailored and flexible menu designs.

Single level menu

Menu ItemMenu ItemMenu Item
<QtmMenuItemList>
<QtmMenuItem id="menu1">
<QtmMenuItemLabel>
<QtmIcon icon="account_circle"></QtmIcon>
<QtmTypography>Menu Item</QtmTypography>
</QtmMenuItemLabel>
</QtmMenuItem>
<QtmMenuItem id="menu2">
<QtmMenuItemLabel>
<QtmIcon icon="account_circle"></QtmIcon>
<QtmTypography>Menu Item</QtmTypography>
</QtmMenuItemLabel>
</QtmMenuItem>
<QtmMenuItem id="menu3">
<QtmMenuItemLabel>
<QtmIcon icon="account_circle"></QtmIcon>
<QtmTypography>Menu Item</QtmTypography>
</QtmMenuItemLabel>
</QtmMenuItem>
</QtmMenuItemList>

Multi-level menu

For menu item with submenu items, a collapsed icon should also be displayed on the right side of menu item label. To select a suitable icon, please refer to the Icon documentation.

Menu ItemMenu ItemMenu ItemSubmenu ItemSubmenu ItemSubmenu Item
<QtmMenuItemList>
<QtmMenuItem id="menu1">
<QtmMenuItemLabel>
<QtmIcon icon="account_circle"></QtmIcon>
<QtmTypography>Menu Item</QtmTypography>
</QtmMenuItemLabel>
</QtmMenuItem>
<QtmMenuItem id="menu2">
<QtmMenuItemLabel>
<QtmIcon icon="account_circle"></QtmIcon>
<QtmTypography>Menu Item</QtmTypography>
</QtmMenuItemLabel>
</QtmMenuItem>
<QtmMenuItem id="menu3">
<QtmMenuItemLabel>
<QtmIcon icon="account_circle"></QtmIcon>
<QtmTypography>Menu Item</QtmTypography>
<QtmIcon icon="keyboard_arrow_up"></QtmIcon>
</QtmMenuItemLabel>
<QtmSubmenuItemList>
<QtmSubmenuItem id="submenu1">Submenu Item</QtmSubmenuItem>
<QtmSubmenuItem id="submenu2">Submenu Item</QtmSubmenuItem>
<QtmSubmenuItem id="submenu3">Submenu Item</QtmSubmenuItem>
</QtmSubmenuItemList>
</QtmMenuItem>
</QtmMenuItemList>

Using items prop

You can also use the items prop to generate the menu item list dynamically. This prop has the following format:

type MenuItemType = {
label: string,
id: string,
icon?: string | IconProps,
children?: [
{
label: string,
id: string,
}
],
};

Single level menu

const items=[
{ label: 'Menu item', id: 'menu1', icon: 'account_circle' },
{ label: 'Menu item', id: 'menu2', icon: 'account_circle' },
{ label: 'Menu item', id: 'menu3', icon: 'account_circle' },
]
<QtmMenuItemList items={items}></QtmMenuItemList>

Multi-level menu

For menu items that contain submenu items, a collapsed icon will be automatically displayed on the right side of the menu label. When a menu item with a submenu is clicked, the icon will dynamically expand or collapse.

const items=[
{label: "Menu item", id: "menu1", icon: "account_circle"},
{label: "Menu item", id: "menu2", icon: "account_circle"},
{
label: "Menu item", id: "menu3", icon: "account_circle",
children: [
{ label: 'Submenu item', id: 'submenu1' },
{ label: 'Submenu item', id: 'submenu2' },
{ label: 'Submenu item', id: 'submenu3' },
],
},
]
<QtmMenuItemList items={items}></QtmMenuItemList>

Multi-level menu with custom icon

To select an appropriate icon, please consult the Icon component documentation.

You can include an icon in the items property by adding either the icon name or an icon object with the following interface:

interface IconProps = {
icon: string,
classes?: string,
lib?: IconLibType,
size?: IconSizeType,
variant?: IconVariantType,
};
const items=[
{label: "Menu item", id: "menu1", icon: {icon: 'applied_settings', lib:"business"}},
{label: "Menu item", id: "menu2", icon: {icon: 'applied_settings', lib:"business"}},
{
label: "Menu item", id: "menu3",
icon: { icon: 'applied_settings', lib:"business"}
children: [
{ label: 'Submenu item', id: 'submenu1' },
{ label: 'Submenu item', id: 'submenu2' },
{ label: 'Submenu item', id: 'submenu3' },
],
},
]
<QtmMenuItemList items={items}></QtmMenuItemList>

Sizes

The menu item lists come in three size: small, medium (default) and large.

Small
Medium
Large
const items=[{label: "Menu item", id: "menu1", icon: "account_circle"},...]
<QtmMenuItemList size="small" items={items}></QtmMenuItemList>
<QtmMenuItemList size="medium" items={items}></QtmMenuItemList>
<QtmMenuItemList size="large" items={items}></QtmMenuItemList>

Managing items

All the props listed below can be applied directly to the MenuItemList component, either using the children or using the items prop method.

enableAutoActive

Setting the enableAutoActive prop to true (default value) will automatically activate the active state of both menu items and submenu items when they are clicked or when the activeId prop value has changed.

On the other hand, setting it to false will require manual management of the active state.

warning

When enableAutoActive is set to false, handling the active state is not compatible with the items prop usage.

info

For a SubmenuItem to be active, its MenuItem parent must also have the active prop.

Menu ItemMenu ItemMenu ItemSubmenu ItemSubmenu ItemSubmenu Item
<QtmMenuItemList enableAutoActive={false}>
<QtmMenuItem id="menu1">
<QtmMenuItemLabel>
<QtmIcon icon="account_circle"></QtmIcon>
<QtmTypography>Menu Item</QtmTypography>
</QtmMenuItemLabel>
</QtmMenuItem>
<QtmMenuItem id="menu2">
<QtmMenuItemLabel>
<QtmIcon icon="account_circle"></QtmIcon>
<QtmTypography>Menu Item</QtmTypography>
</QtmMenuItemLabel>
</QtmMenuItem>
<QtmMenuItem id="menu3" active>
<QtmMenuItemLabel>
<QtmIcon icon="account_circle"></QtmIcon>
<QtmTypography>Menu Item</QtmTypography>
<QtmIcon icon="keyboard_arrow_up"></QtmIcon>
</QtmMenuItemLabel>
<QtmSubmenuItemList>
<QtmSubmenuItem id="submenu1">Submenu Item</QtmSubmenuItem>
<QtmSubmenuItem id="submenu2" active>Submenu Item</QtmSubmenuItem>
<QtmSubmenuItem id="submenu3">Submenu Item</QtmSubmenuItem>
</QtmSubmenuItemList>
</QtmMenuItem>
</QtmMenuItemList>

activeId

Set the activeId value to the active menu or submenu item id by default.

const items=[{label: "Menu item", id: "menu1", icon: "account_circle"},...]
<QtmMenuItemList items={items} activeId="menu2"></QtmMenuItemList>

disabledIds

Set the disabledIds value to a list of ids of disabled menu items or disabled submenu items.

<QtmMenuItemList
items={itemsProp}
disabledIds={['menu1', 'submenu2']}
></QtmMenuItemList>

collapsedIds

Set the collapsedIds value to a list of menu items that don't show their own nested submenu items by default.

const items=[{label: "Menu item", id: "menu1", icon: "account_circle"},...]
<QtmMenuItemList items={items} collapsedIds={['menu3']}></QtmMenuItemList>

Scrolling

scrollable

If there are more menu items than can be displayed at once, you can make the menu item list scrollable by adding the scrollable attribute to this component. By default, the scrollable menu item list displays the first five menu items and half of the sixth one.

const items=[{label: "Menu item", id: "menu1", icon: "account_circle"},...]
<QtmMenuItemList items={items} scrollable></QtmMenuItemList>

nbVisibleItems

If you want to change the number of visible items when the menu item list is scrollable, you can change value of the nbVisibleItems prop.

const items=[{label: "Menu item", id: "menu1", icon: "account_circle"},...]
<QtmMenuItemList items={items} scrollable nbVisibleItems={2}></QtmMenuItemList>

Customization

Add your own classes with the classes prop. This way you will be able to override or extend the styles applied to the component (you can use available utility classes by importing @qtm/css/dist/utilities.css).

const items=[{label: "Menu item", id: "menu1", icon: "account_circle"},...]
<QtmMenuItemList items={items} classes="bg-primary-100"></QtmMenuItemList>

API

Loading API documentation...
Loading API documentation...
Loading API documentation...
Loading API documentation...
Loading API documentation...

Spotted a bug, have a question, or want to suggest a new feature?

Submit an issue on GitLab