ComponentsUpdated Sep 9, 2026
Menu
A dropdown of actions with full keyboard navigation. The trigger is styled as a Button; Content wraps portal, positioner, and popup.
Import
Source: packages/ui/src/components/menu
tsx
import { Menu } from '@highlight/ui'Basic
Items, a separator, and a destructive action last.
tsx
import { Menu } from '@highlight/ui'
export default function MenuBasic() {
return (
<Menu>
<Menu.Trigger>Actions</Menu.Trigger>
<Menu.Content>
<Menu.Item>Rename…</Menu.Item>
<Menu.Item>Duplicate</Menu.Item>
<Menu.Item disabled>Move to team (soon)</Menu.Item>
<Menu.Separator />
<Menu.Item variant="danger">Delete</Menu.Item>
</Menu.Content>
</Menu>
)
}tsx
import { useState } from 'react'
import { Check, Circle } from 'lucide-react'
import { Menu } from '@highlight/ui'
export default function MenuSelection() {
const [showTimestamps, setShowTimestamps] = useState(true)
const [showSpeakers, setShowSpeakers] = useState(false)
const [density, setDensity] = useState('comfortable')
return (
<Menu>
<Menu.Trigger variant="secondary">View</Menu.Trigger>
<Menu.Content>
<Menu.Group>
<Menu.GroupLabel>Show</Menu.GroupLabel>
<Menu.CheckboxItem checked={showTimestamps} onCheckedChange={setShowTimestamps}>
<Menu.CheckboxItemIndicator>
<Check className="size-4" />
</Menu.CheckboxItemIndicator>
Timestamps
</Menu.CheckboxItem>
<Menu.CheckboxItem checked={showSpeakers} onCheckedChange={setShowSpeakers}>
<Menu.CheckboxItemIndicator>
<Check className="size-4" />
</Menu.CheckboxItemIndicator>
Speaker names
</Menu.CheckboxItem>
</Menu.Group>
<Menu.Separator />
<Menu.Group>
<Menu.GroupLabel>Density</Menu.GroupLabel>
<Menu.RadioGroup value={density} onValueChange={setDensity}>
<Menu.RadioItem value="comfortable">
<Menu.RadioItemIndicator>
<Circle className="size-2 fill-current" />
</Menu.RadioItemIndicator>
Comfortable
</Menu.RadioItem>
<Menu.RadioItem value="compact">
<Menu.RadioItemIndicator>
<Circle className="size-2 fill-current" />
</Menu.RadioItemIndicator>
Compact
</Menu.RadioItem>
</Menu.RadioGroup>
</Menu.Group>
</Menu.Content>
</Menu>
)
}tsx
import { Menu } from '@highlight/ui'
export default function MenuItemVariants() {
return (
<Menu>
<Menu.Trigger variant="secondary">Item variants</Menu.Trigger>
<Menu.Content>
<Menu.Item>Default</Menu.Item>
<Menu.Item variant="primary">Primary</Menu.Item>
<Menu.Item variant="bold">Bold</Menu.Item>
<Menu.Item variant="success">Success</Menu.Item>
<Menu.Item variant="danger">Danger</Menu.Item>
</Menu.Content>
</Menu>
)
}Parts
Compound sub-components. Every part accepts className and forwards the rest of its props to Base UI.
Menu.Trigger- Button-styled; variant, size, shape.
Menu.Content- side, sideOffset, align, alignOffset, finalFocus.
Menu.Item / LinkItem- variant: 'default' | 'primary' | 'bold' | 'success' | 'danger'.
Menu.CheckboxItem / CheckboxItemIndicator- checked, onCheckedChange.
Menu.RadioGroup / RadioItem / RadioItemIndicator- value, onValueChange.
Menu.Group / GroupLabel / Separator- Structure.
Menu.SubmenuRoot / SubmenuTrigger- Nest a Content inside SubmenuRoot.