Dropdown
A dropdown menu that displays a list of actions or functions triggered by a button. Supports items, checkboxes, radio groups, submenus, and separators with full keyboard navigation and accessibility features.
Import
import {DropdownMenu,DropdownMenuTrigger,DropdownMenuContent,DropdownMenuItem,DropdownMenuCheckboxItem,DropdownMenuRadioGroup,DropdownMenuRadioItem,DropdownMenuItemIndicator,DropdownMenuLabel,DropdownMenuSeparator,DropdownMenuSub,DropdownMenuSubTrigger,DropdownMenuSubContent} from "@sparrowengg/twigs-react";Usage
const DropdownExample = () => {
const [bookmarksChecked, setBookmarksChecked] = React.useState(true);
const [urlsChecked, setUrlsChecked] = React.useState(false);
const [person, setPerson] = React.useState("pedro");
return (
<DropdownMenu size="sm">
<DropdownMenuTrigger asChild>
<Button variant="solid" size="sm">
<Box css={{ marginLeft: "$2" }}>Menu</Box>
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent sideOffset={5}>
<DropdownMenuItem>New Tab</DropdownMenuItem>
<DropdownMenuItem>New Window</DropdownMenuItem>
<DropdownMenuSub>
<DropdownMenuSubTrigger>More Tools</DropdownMenuSubTrigger>
<DropdownMenuSubContent sideOffset={2} alignOffset={-5}>
<DropdownMenuItem>Save Page As…</DropdownMenuItem>
</DropdownMenuSubContent>
</DropdownMenuSub>
</DropdownMenuContent>
</DropdownMenu>
);
};Examples
Advanced customization
The dropdown component supports a wide range of features you can customize the component based on your own needs.
Props
DropdownMenu
| Prop | Type | Default |
|---|---|---|
defaultOpen? | boolean | - |
open? | boolean | - |
onOpenChange? | (open: boolean) => void | - |
modal? | boolean | true |
dir? | 'ltr' | 'rtl' | - |
size? | 'sm' | 'md' | 'md' |
DropdownMenuTrigger
| Prop | Type | Default |
|---|---|---|
asChild? | boolean | false |
DropdownMenuContent
| Prop | Type | Default |
|---|---|---|
asChild? | boolean | false |
side? | 'top' | 'right' | 'bottom' | 'left' | 'bottom' |
sideOffset? | number | 0 |
align? | 'start' | 'center' | 'end' | 'center' |
alignOffset? | number | 0 |
avoidCollisions? | boolean | true |
collisionBoundary? | Boundary | - |
collisionPadding? | number | Partial<Record<Side, number>> | 0 |
arrowPadding? | number | 0 |
sticky? | 'partial' | 'always' | 'partial' |
hideWhenDetached? | boolean | false |
loop? | boolean | false |
onCloseAutoFocus? | (event: Event) => void | - |
onEscapeKeyDown? | (event: KeyboardEvent) => void | - |
onPointerDownOutside? | (event: PointerDownOutsideEvent) => void | - |
onFocusOutside? | (event: FocusOutsideEvent) => void | - |
onInteractOutside? | (event: PointerDownOutsideEvent | FocusOutsideEvent) => void | - |
forceMount? | boolean | - |
container? | HTMLElement | - |
showArrow? | boolean | false |
DropdownMenuItem
| Prop | Type | Default |
|---|---|---|
disabled? | boolean | false |
onSelect? | (event: Event) => void | - |
textValue? | string | - |
DropdownMenuCheckboxItem
| Prop | Type | Default |
|---|---|---|
checked? | boolean | 'indeterminate' | - |
onCheckedChange? | (checked: boolean) => void | - |
disabled? | boolean | false |
textValue? | string | - |
DropdownMenuRadioGroup
| Prop | Type | Default |
|---|---|---|
value? | string | - |
onValueChange? | (value: string) => void | - |
disabled? | boolean | false |
DropdownMenuRadioItem
| Prop | Type | Default |
|---|---|---|
value? | string | - |
disabled? | boolean | false |
textValue? | string | - |
DropdownMenuSub
| Prop | Type | Default |
|---|---|---|
defaultOpen? | boolean | - |
open? | boolean | - |
onOpenChange? | (open: boolean) => void | - |
DropdownMenuSubTrigger
| Prop | Type | Default |
|---|---|---|
disabled? | boolean | false |
textValue? | string | - |
DropdownMenuSubContent
| Prop | Type | Default |
|---|---|---|
side? | 'top' | 'right' | 'bottom' | 'left' | 'right' |
sideOffset? | number | 0 |
align? | 'start' | 'center' | 'end' | 'start' |
alignOffset? | number | 0 |
avoidCollisions? | boolean | true |
collisionBoundary? | Boundary | - |
collisionPadding? | number | Partial<Record<Side, number>> | 0 |
arrowPadding? | number | 0 |
sticky? | 'partial' | 'always' | 'partial' |
hideWhenDetached? | boolean | false |
loop? | boolean | false |
onCloseAutoFocus? | (event: Event) => void | - |
onEscapeKeyDown? | (event: KeyboardEvent) => void | - |
onPointerDownOutside? | (event: PointerDownOutsideEvent) => void | - |
onFocusOutside? | (event: FocusOutsideEvent) => void | - |
onInteractOutside? | (event: PointerDownOutsideEvent | FocusOutsideEvent) => void | - |
forceMount? | boolean | - |
container? | HTMLElement | - |
Data Attributes
These props are used for the conditional rendering of the components
Applicable - DropdownMenu
| Prop | Type | Default |
|---|---|---|
[data-state]? | 'open' | 'closed' | - |
Applicable - DropdownMenuTrigger
| Prop | Type | Default |
|---|---|---|
[data-state]? | 'open' | 'closed' | - |
[data-disabled]? | boolean | - |
Applicable - DropdownMenuContent/ DropdownMenuSubContent
| Prop | Type | Default |
|---|---|---|
[data-state]? | 'open' | 'closed' | - |
[data-side]? | 'top' | 'right' | 'bottom' | 'left' | - |
[data-align]? | 'start' | 'center' | 'end' | - |
Applicable - DropdownMenuItem/ DropdownMenuCheckboxItem/ DropdownMenuRadioItem/ DropdownMenuSubTrigger
| Prop | Type | Default |
|---|---|---|
[data-disabled]? | boolean | - |
[data-highlighted]? | boolean | - |
[data-state]? | 'checked' | 'unchecked' | 'indeterminate' | - |
Applicable - DropdownMenuSubTrigger
| Prop | Type | Default |
|---|---|---|
[data-state]? | 'open' | 'closed' | - |
Drawer
A sliding panel that overlays the main content, typically used for navigation, forms, or additional content. Supports multiple placements (top, right, bottom, left) with smooth animations and backdrop overlay.
HoverCard
A component that displays additional content when hovering over a trigger element, with smooth animations and positioning control.