File
Choose a format for your export. Notes are included.
Presents a compact list of actions. Menu roles and arrow-key navigation are built in.
Choose a format for your export. Notes are included.
Three ways in. They share one source, so the pixels match whichever you pick.
npm install @noorddev/vlak-react
// once, next to your app's root
import "@noorddev/vlak-react/css";
import { DropdownMenu } from "@noorddev/vlak-react";Precompiled React and one stylesheet. No compiler to configure. Per-component imports work too: @noorddev/vlak-react/components/dropdown-menu.
npx @noorddev/vlak-cli add dropdown-menu
The StyleX leaf lands in components/vlak/ with its dependencies, for your own compiler to own. See StyleX.
npx shadcn add https://vlak.dev/r/dropdown-menu.json
The same registry item, installed by shadcn's CLI.
<link rel="stylesheet" href="node_modules/@noorddev/vlak/css/vlak.css" />
No React. Link vlak.css and use the markup and classes below.
import { DropdownMenu } from "@noorddev/vlak-react";
<DropdownMenu
label="Actions"
side="top"
items={[
{ label: "Rename", onSelect: rename },
{ label: "Duplicate", onSelect: duplicate },
{ separator: true },
{ label: "Delete", onSelect: remove },
{ label: "Archive", disabled: true },
]}
/>Action menu with menu semantics and keyboard navigation.
| Prop | Type | Default | Description |
|---|---|---|---|
labelrequired | ReactNode | ||
itemsrequired | DropdownMenuItem[] | ||
side | "auto" | "top" | "bottom" | "auto" | Preferred opening side. The menu still flips when needed to remain visible. |
Also accepts HTMLAttributes<HTMLDivElement>.
| Keys | Does |
|---|---|
| Arrow down, Enter, Space | Opens the menu on the first item |
| Arrow up | Opens the menu on the last item |
| Arrow down, Arrow up | Moves between items and wraps |
| Arrow right, Arrow left | Opens a child menu or returns to its parent; directions reverse in RTL |
| Home, End | First or last item |
| Type letters | Moves to the next item starting with them |
| Enter, Space | Selects the item and closes |
| Escape | Closes and returns focus to the trigger |
| Tab | Closes and moves on |
<div class="rs-menu" role="menu"><button class="rs-menu-item" role="menuitem">Rename</button><button class="rs-menu-item" role="menuitem">Duplicate</button><hr class="rs-menu-sep" /><button class="rs-menu-item" role="menuitem">Delete</button></div>