Components · Menus, lists and dividers

Menu

A menu is the list surface that opens from a button or action (Dropdown menu) or from a Select field (Exposed dropdown menu). The two differ only in the element that opens the surface, so they share one component.

Tokens, sizes, measurements, states and requirements. Values come from the live token package and from Figma: Base Item and Menu Item Divider.

Design Tokens

Resolved from the live token package.

StatePartTokenValue

Sizes

Breakpoint · sizeRow heightMax height (14 rows)Check iconText
Desktop · Large48px672px24pxbody-md 17/24, 0.32px
Desktop · Small40px560px20pxbody-sm 14/20, 0.36px
Mobile · Large40px560px20pxbody-md 16/22, 0.32px
Mobile · Small32px448px20pxbody-sm 14/20, 0.36px

sm (640 to 768px) looks like mobile. The scrollbar is 12px wide.


Measurements

Dimensions

Padding of one row at each size. The shaded areas are the 16px padding to the left and right; the row height comes from the size, not from padding. The numbers are read from the component.

A row at true size (1:1).
AttributeLargeSmall
Row height, Desktop48px40px
Row height, Mobile40px32px
Padding left and right16px
Padding top and bottom0 (the row has a minimum height)
Gap, label to icon8px
Divider1px, inside the row height
Divider inset, middle-inset16px on each side
Focus ring2px, inside the row

Spacing

The same padding and distances as spacing tokens.

PartValue
Row padding, left and rightspace-16
Gap, label to iconspace-8
Divider insetspace-16

Elevation

PartToken
Menu surfaceelevation-b-80

The shadow is listed with the other tokens under Design Tokens.


States

Enabled, hover, focus, selected and disabled for both selection types. Hover and focus are forced on this page; in your code they come from :hover and keyboard focus (:focus-visible).

Breakpoint
Size
StateSelectMulti Select

Figma defines Enabled, Hover, Selected and Disabled · selected (Select, all sizes), and Multi Select for Large on desktop only. Derived here, not in Figma: the Focus ring (2px border-focus inside the row, as in the other form components), the plain Disabled row, Disabled in Multi Select, and Multi Select for Small and mobile (same 20px icon as the Select variant on those sizes).


Typography

PartTypeSize / line heightLetter spacingWeight
Label, Largebody-md16/22 mobile, 17/24 from 769px0.32pxRegular
Label, Smallbody-sm14/200.36pxRegular

Breuer Condensed with ss02, ss03 and ss06.


Structure

Elements

ElementClassNotes
Menumenu, menu--sm, --multi, --full, --noneThe white surface with the shadow.
Listmenu__itemsA ul with role="listbox". Scrolls after 14 rows.
Rowmenu__itemAn li with role="option" and aria-selected.
Labelmenu__item-labelFills the row.
Check iconmenu__item-iconDraws circle or check_circle with a pseudo-element. Empty in the markup.

Types

TypeClassUse
SelectmenuOne choice, marked with a check.
Multi Selectmenu menu--multiSeveral choices: a circle on every row, a check on the chosen ones.
Smallmenu--smCompact surfaces.
Full-width dividermenu--fullThe line runs edge to edge.
No dividermenu--noneNo line between rows.

Width

The menu is width: 100% of the container the opener gives it.


Behavior

InputResult
HoverRow fill changes. In Multi Select an unselected row previews the check.
Click, Enter, SpaceChooses the row. Select replaces the choice; Multi Select toggles it.
TabRows are focusable. A 2px ring shows inside the row on keyboard focus.
Arrow keysUp and Down move between rows and skip a disabled row.
Disabled rowaria-disabled="true": text-disabled text and icon, no hover fill, not focusable, click and Enter ignored.
EscapeThe opener closes the menu and returns focus to itself.
ScrollingAfter 14 rows the list scrolls.

Open and close behavior belongs to the opener (button or Select field). This page shows the surface only.


Accessibility Requirements

TopicRequirement
Rolesrole="listbox" on the list, role="option" and aria-selected on each row, aria-multiselectable="true" for Multi Select. Name the list with aria-label.
FocusRows are focusable. A 2px ring on keyboard focus (border-focus) (WCAG 2.4.7, 1.4.11).
KeyboardArrow keys, Enter and Space work. Escape closes through the opener.
StateThe check icon is not the only signal: aria-selected carries the state for assistive technology (WCAG 1.4.1).
DisabledA disabled row is aria-disabled and not focusable. Disabled tokens are exempt from contrast requirements.