Dropdown
Floating list anchored to a trigger element. Renders any React content
(form, panel, etc.) or, via the options shortcut, a
List with clickable items.
When to use
| ✅ Use when… | 🚫 Avoid when… |
|---|---|
|
Using content
Accepts any React component (here, a List with multiple selection).
<Dropdown
full
content={
<List
multiple
color="primary"
content={[
{ title: 'Item 1', icon: <Icon icon={clock} /> },
{ title: 'Item 2', icon: <Icon icon={emojiStar} /> },
{ title: 'Item 3', icon: <Icon icon={pen} /> },
]}
/>
}
>
<Button color="primary" text="Dropdown with List" />
</Dropdown>Using options
Shortcut to render a List automatically.
<Dropdown
full
options={[
{ title: 'Item 1', icon: <Icon icon={clock} /> },
{ title: 'Item 2', icon: <Icon icon={emojiStar} /> },
{ title: 'Item 3', icon: <Icon icon={pen} /> },
]}
>
<Button color="primary" text="Dropdown" />
</Dropdown>The options list is exclusive — one item stays selected and clicking it
again keeps it (an idempotent pick). Build a List yourself in content if
you need toggle semantics.
Open animation
The menu animates open by default with the scale motion preset (a subtle
fade + scale-in, ADR-027) — it runs on open via @starting-style and is zeroed
automatically under prefers-reduced-motion. Pass any other
motion preset to change it, or motion="none" to
disable it entirely:
<Dropdown options={items} motion="slide-down">…</Dropdown> {/* different preset */}
<Dropdown options={items} motion="none">…</Dropdown> {/* no animation */}Open on hover
With hoverable, the dropdown appears when the mouse hovers over the children.
<Dropdown
full
hoverable
content={
<List
showCheckIcon
content={[
{ title: 'Item 1', icon: <Icon icon={clock} /> },
{ title: 'Item 2', icon: <Icon icon={emojiStar} /> },
{ title: 'Item 3', icon: <Icon icon={pen} /> },
]}
/>
}
>
<Button color="primary" text="Hover me :)" />
</Dropdown>Trigger as render-prop
The children can be a function that receives { isOpen, open, toggle } for
advanced controls (e.g. toggling an icon based on the state).
<Dropdown
full
options={[
{ title: 'Item 1', icon: <Icon icon={clock} /> },
{ title: 'Item 2', icon: <Icon icon={emojiStar} /> },
]}
>
{({ isOpen, toggle }) => (
<Button
onClick={toggle}
color="primary"
size="small"
text="Dropdown"
iconPosition="right"
icon={isOpen ? <Icon icon={chevronDown} /> : <Icon icon={chevronRight} />}
/>
)}
</Dropdown>Properties
Prop | Type | Default | Description |
|---|---|---|---|
children * | ReactNode | RenderProps | — | Trigger element. Can be a React node (it receives an automatic `onClick`
that toggles) or a render prop that receives `{ isOpen, open, toggle }`. |
content | ReactNode | ((args: ContentRenderProps) => ReactNode) | — | Dropdown content. Can be a React node or a function that receives
`{ close }` to close programmatically — useful for embedded forms. |
distance | number | — | Distance in pixels between the trigger and the dropdown. Reserved. |
full | boolean | — | Makes the dropdown match the trigger's width. Ignored when `width` is
provided. |
hideArrow | boolean | — | Hides the indicator arrow. Reserved for future use. |
hoverable | boolean | false | Opens the dropdown on trigger hover instead of on click. |
motion | "fade" | "scale" | "slide-up" | "slide-down" | "slide-left" | "slide-right" | "collapse" | "sheet" | "sheet-top" | "drawer-left" | "drawer-right" | "none" | scale | Open animation of the menu panel. Runs on open via
`@starting-style`; `prefers-reduced-motion` zeroes it centrally. Set
`motion="none"` to disable the animation. |
options | ListContentType[] | — | Shortcut for rendering a `List` as the content. |
Besides the props above, every component accepts the layout props (spacing, color, flex/grid, sizing, border) — not repeated here.