Dropdown
Dropdown attaches contextual action menus to a compact trigger.
@duskmoon-dev/components/dropdown Usage
When to use
- Use it when users need to move between sections, pages, steps, or contextual actions.
- Expose current and disabled state so navigation remains clear to keyboard and screen-reader users.
Implementation notes
Features
Covers the route, section, step, or action-list patterns that help users move through an interface.
Shows selected, active, open, or current props where the component exposes them.
Dropdown is most often configured through `menu`, `overlay`, `dropdownRender`, `trigger`.
Renders menu items from menu prop
Feature Demos
Feature demos are authored for the component page, then supplemented with behavior scenarios from the component test coverage.
Basic usage
Import the component stylesheet and Dropdown from its package subpath, then render it with the core props.
import "@duskmoon-dev/components/styles.css";
import { Dropdown } from "@duskmoon-dev/components/dropdown";
export function Example() {
return (<Dropdown
defaultOpen
trigger={["click"]}
menu={{
items: [
{ key: "edit", label: "Edit" },
{ key: "divider", type: "divider" },
{ key: "delete", label: "Delete", danger: true }
]
}}
>
Actions
</Dropdown>);
} Renders menu items from menu prop
test-backedDropdown scenario from the component test coverage: renders menu items from menu prop.
import "@duskmoon-dev/components/styles.css";
import { Dropdown } from "@duskmoon-dev/components/dropdown";
export function DropdownRendersMenuItemsFromDemo() {
return (<Dropdown
defaultOpen
trigger={["click"]}
menu={{
items: [
{ key: "edit", label: "Edit" },
{ key: "divider", type: "divider" },
{ key: "delete", label: "Delete", danger: true }
]
}}
>
Actions
</Dropdown>);
} Toggles open state on click trigger
test-backedDropdown scenario from the component test coverage: toggles open state on click trigger.
import "@duskmoon-dev/components/styles.css";
import { Dropdown } from "@duskmoon-dev/components/dropdown";
export function DropdownTogglesOpenStateOnDemo() {
return (<Dropdown
defaultOpen
trigger={["click"]}
menu={{
items: [
{ key: "edit", label: "Edit" },
{ key: "divider", type: "divider" },
{ key: "delete", label: "Delete", danger: true }
]
}}
>
Actions
</Dropdown>);
} Calls menu onClick and closes uncontrolled popup
test-backedDropdown scenario from the component test coverage: calls menu onclick and closes uncontrolled popup.
import "@duskmoon-dev/components/styles.css";
import { Dropdown } from "@duskmoon-dev/components/dropdown";
export function DropdownCallsMenuOnClickAndDemo() {
return (<Dropdown
defaultOpen
trigger={["click"]}
menu={{
items: [
{ key: "edit", label: "Edit" },
{ key: "divider", type: "divider" },
{ key: "delete", label: "Delete", danger: true }
]
}}
>
Actions
</Dropdown>);
} Exposes Dropdown.Button
test-backedDropdown scenario from the component test coverage: exposes dropdown.button.
import "@duskmoon-dev/components/styles.css";
import { Dropdown } from "@duskmoon-dev/components/dropdown";
export function DropdownExposesDropdownButtonDemo() {
return (<Dropdown
defaultOpen
trigger={["click"]}
menu={{
items: [
{ key: "edit", label: "Edit" },
{ key: "divider", type: "divider" },
{ key: "delete", label: "Delete", danger: true }
]
}}
>
Actions
</Dropdown>);
} Theme aware
Docs previews inherit the DuskMoon data-theme value. Use the header switch to compare light and dark rendering.
<div data-theme="sunshine">
<Dropdown
defaultOpen
trigger={["click"]}
menu={{
items: [
{ key: "edit", label: "Edit" },
{ key: "divider", type: "divider" },
{ key: "delete", label: "Delete", danger: true }
]
}}
>
Actions
</Dropdown>
</div>
<div data-theme="moonlight">
<Dropdown
defaultOpen
trigger={["click"]}
menu={{
items: [
{ key: "edit", label: "Edit" },
{ key: "divider", type: "divider" },
{ key: "delete", label: "Delete", danger: true }
]
}}
>
Actions
</Dropdown>
</div> API
The API reference below lists every parsed exported type or interface for Dropdown. Start with `menu`, `overlay`, `dropdownRender`, `trigger` for common usage.
packages/components/src/components/dropdown/Dropdown.types.ts
Scenarios: packages/components/src/components/dropdown/Dropdown.test.tsx | Prop | Type | Required | Description |
|---|---|---|---|
menu | DropdownMenu | No | menu configures Dropdown. |
overlay | ReactNode | No | overlay configures Dropdown. |
dropdownRender | (menus: ReactNode) => ReactNode | No | dropdownRender configures Dropdown. |
trigger | DropdownTrigger[] | No | trigger configures Dropdown. |
placement | DropdownPlacement | No | placement configures Dropdown. |
open | boolean | No | open configures Dropdown. |
defaultOpen | boolean | No | defaultOpen configures Dropdown. |
arrow | boolean | No | arrow configures Dropdown. |
disabled | boolean | No | disabled configures Dropdown. |
destroyPopupOnHide | boolean | No | destroyPopupOnHide configures Dropdown. |
onOpenChange | (open: boolean) => void | No | onOpenChange configures Dropdown. |
children | ReactNode | Yes | children configures Dropdown. |
| Prop | Type | Required | Description |
|---|---|---|---|
key | string | number | Yes | key configures Dropdown. |
label | ReactNode | No | label configures Dropdown. |
icon | ReactNode | No | icon configures Dropdown. |
disabled | boolean | No | disabled configures Dropdown. |
danger | boolean | No | danger configures Dropdown. |
type | "item" | "divider" | No | type configures Dropdown. |
className | string | No | className configures Dropdown. |
| Prop | Type | Required | Description |
|---|---|---|---|
key | string | Yes | key configures Dropdown. |
item | DropdownMenuItem | Yes | item configures Dropdown. |
domEvent | MouseEvent<HTMLButtonElement> | Yes | domEvent configures Dropdown. |
| Prop | Type | Required | Description |
|---|---|---|---|
items | DropdownMenuItem[] | No | items configures Dropdown. |
onClick | (info: DropdownMenuInfo) => void | No | onClick configures Dropdown. |
| "top" | "bottom" | "left" | "right" | "topLeft" | "topRight" | "bottomLeft" | "bottomRight" "click" | "hover" | "contextMenu" Omit< DropdownProps, "children" | "onClick" | keyof ButtonProps > & Omit<ButtonProps, "children" | "onClick"> & { buttonsRender?: (buttons: ReactNode[]) => ReactNode[] ForwardRefExoticComponent< DropdownProps & RefAttributes<HTMLSpanElement> > & { Button: ForwardRefExoticComponent< DropdownButtonProps & RefAttributes<HTMLSpanElement> >