DocsBlog
  • 0.25.3

  • light

    dark

    system

    Switch mode
  • Cerberus

    Acheron

    Elysium

Get Started
Components
Styling
Theming

Concepts

OverviewCompositionTesting

Layout

Aspect RatioBleedBoxCenterContainerDividerFlexFloatGridLink OverlayScrollableStackWrap

Components

AccordionAdmonitionAvatarButtonCarouselCheckboxClipboardCollapsibleComboboxConfirm ModalCTAModalDate PickerDialogFieldFieldsetFile UploaderIcon ButtonInputLoading StatesMenuNotificationsNumber InputPin InputProgressPrompt ModalRadioRatingSelectSplit ButtonSwitchTableTabsTagTextTextareaToggleTooltip

Utilities

Client OnlyDownload TriggerEnvironmentFeature FlagsFocus TrapForFormat ByteFormat NumberFormat Relative TimeFrameHighlightJSON Tree ViewLocaleLocal StoragePortalPresenceShowsplitPropsTheme

Menu

A menu component for displaying a list of options.

  • npm
  • source
  • recipe
  • Ark
import {
Menu,
MenuTrigger,
MenuContent,
MenuItem,
MenuItemGroup,
MenuGroupLabel,
MenuSeparator,
} from '@cerberus/react'

Usage

Item 1
Item 2
Copy
nav.tsx
import {
Menu,
MenuTrigger,
MenuContent,
MenuItem,
Button,
} from '@cerberus/react'
import { Strawberry } from '@cerberus/icons'
function BasicMenu() {
return (
<Menu>
<MenuTrigger>
<Button>Trigger</Button>
</MenuTrigger>
<MenuContent>
<MenuItem value="item_1">
<Strawberry />
Item 1
</MenuItem>
<MenuItem value="item_2">
<Strawberry />
Item 2
</MenuItem>
</MenuContent>
</Menu>
)
}

NextJS Usage

To create a nav menu with NextJS, you should use the Link component from next/link combined with the asChild prop.

Item 1Item 2
Sign out
Copy
nav.tsx
import {
Menu,
MenuTrigger,
MenuContent,
MenuItem,
Button,
Logout,
} from '@cerberus/react'
import Link from '@next/link'
function BasicMenu() {
return (
<Menu>
<MenuTrigger>
<Button>Nav Menu</Button>
</MenuTrigger>
<MenuContent>
<MenuItem value="item_1" asChild>
<Link href="/">Item 1</Link>
</MenuItem>
<MenuItem value="item_2" asChild>
<Link href="/">Item 2</Link>
</MenuItem>
<MenuSeparator />
<MenuItem value="item_3" asChild>
<Link
className={css({
alignItems: 'center',
colorPalette: 'danger',
color: 'danger.text.initial',
display: 'inline-flex',
justifyContent: 'space-between',
w: 'full',
})}
href="/"
>
Sign out
<Logout />
</Link>
</MenuItem>
</MenuContent>
</Menu>
)
}

Grouped Menu

You can group menu items by using the MenuItemGroup component.

Group Label

Item 1
Item 2
Copy
nav.tsx
import {
Menu,
MenuTrigger,
MenuContent,
MenuItem,
MenuItemGroup,
MenuGroupLabel,
MenuSeparator,
Button,
} from '@cerberus/react'
export function GroupedMenu() {
return (
<Menu>
<MenuTrigger>
<Button>Grouped Menu</Button>
</MenuTrigger>
<MenuContent>
<MenuItemGroup>
<MenuGroupLabel>Group Label</MenuGroupLabel>
<MenuSeparator />
<MenuItem value="item_1">Item 1</MenuItem>
<MenuItem value="item_2">Item 2</MenuItem>
</MenuItemGroup>
</MenuContent>
</Menu>
)
}

Positions

The Menu component accepts a positioning prop to determine where the menu will be positioned relative to the trigger. See available positions.

Item 1
Item 2
Item 1
Item 2
Item 1
Item 2
Item 1
Item 2
Copy
nav.tsx
import {
Menu,
MenuTrigger,
MenuContent,
MenuItem,
Button,
} from '@cerberus/react'
function BottomNav() {
return (
<Menu
positioning={{
placement: 'bottom',
}}
>
<MenuTrigger>
<Button>Bottom</Button>
</MenuTrigger>
<MenuContent>
<MenuItem value="item_1">Item 1</MenuItem>
<MenuItem value="item_2">Item 2</MenuItem>
</MenuContent>
</Menu>
)
}

Primitives

You can utilize the primitive components or the css prop to customize the menu.

ComponentDescription
MenuRootThe context provider for the menu parts
MenuTriggerThe trigger that opens the menu content
MenuTriggerItemThe item that triggers a nested menu content
MenuIndicatorThe indicator for the selected menu item
MenuPositionerThe positioning container for the menu content
MenuContentThe content of the menu
MenuItemA single item of the menu
MenuItemGroupA container for a group of menu items
MenuItemGroupLabelThe label for a group of menu items
MenuSeparatorA separator between menu items
Hades am I
Hades is also where I live
Copy
Menu
import {
Menu,
MenuTrigger,
MenuContent,
MenuItem,
Button,
} from '@cerberus/react'
function CustomMenu() {
return (
<Menu>
<MenuTrigger>
<Button
css={{
color: 'black',
}}
palette="danger"
>
Hades R00lz
</Button>
</MenuTrigger>
<MenuContent
css={{
bgColor: 'black',
color: 'danger.text.initial',
}}
>
<MenuItem
css={{
colorPalette: 'warning',
_hover: {
color: 'black',
},
}}
value="item_1"
>
Hades am I
</MenuItem>
<MenuItem
css={{
colorPalette: 'warning',
_hover: {
color: 'black',
},
}}
value="item_2"
>
Hades is also where I live
</MenuItem>
</MenuContent>
</Menu>
)
}

API

Menu

export interface MenuProps {
positioning?: {
placement: 'left' | 'right' | 'top' | 'bottom'
}
}
NameDefaultDescription
positioningnullUsed to position the menu content.

MenuTrigger

export interface MenuTriggerProps {
children: React.ReactNode
}
NameDefaultDescription
childrennullThe trigger element.

MenuItem

export interface MenuItemProps {
children: React.ReactNode
value: string
asChild?: boolean
}
NameDefaultDescription
childrennullThe content of the menu item.
valuenullThe value of the menu item used for selection.
asChildfalseUsed to render the children as a child component.

On this page

  • Edit this page on Github
Cerberus Design System | Docs