Knit UI
GitHub

Playground

Loading playground…

true
false
false
false
Playground
<Menu
  position="bottom-start"
  closeOnItemClick
  withArrow={false}
  disabled={false}
  trigger="click"
  shadow="md"
/>

Examples

Controlled

Fully controlled open state driven by React.useState — demonstrates the Trigger pattern.

Loading example…

ControlledSourceStorybook

With Labels And Divider

Labels and a divider group related items into named sections.

Loading example…

With Labels And DividerSourceStorybook

With Sections

Left and right sections hold icons or badges on either side of the label.

Loading example…

With SectionsSourceStorybook

Disabled Items

Disabled items are visually muted and do not respond to press events.

Loading example…

Disabled ItemsSourceStorybook

Disabled Menu

The whole menu can be disabled — the dropdown never renders.

Loading example…

Disabled MenuSourceStorybook

With Arrow

The arrow variant draws a pointer from the dropdown toward the target.

Loading example…

With ArrowSourceStorybook

Styles

Per-slot styles targets individual parts — here the label, item, and itemLabel.

Loading example…

StylesSourceStorybook

Shadows

All five shadow levels side by side to compare dropdown elevation. Each menu is always open and rendered in its own contained relative wrapper (withinPortal={false}) so the dropdowns sit inline and don't overlap.

Loading example…

ShadowsSourceStorybook

Hover Trigger

Hover trigger opens the menu on pointer enter and closes on pointer leave.

Loading example…

Hover TriggerSourceStorybook

Props

PropTypeDefaultDescription
arrowOffsetnumber | undefined5Arrow distance from the start/end edge when `arrowPosition="side"`.
arrowPositionArrowPosition | undefined'side'Arrow alignment: centered, or pinned toward an aligned placement.
arrowRadiusnumber | undefined0Corner radius of the arrow's outward corner in px.
arrowSizenumber | undefined7Arrow square edge length in px.
childrenReactNode`Menu.Target` + `Menu.Dropdown`.
closeDelaynumber | undefined100Close delay in ms for hover triggers.
closeOnClickOutsideboolean | undefinedtrueClose on outside press (web).
closeOnEscapeboolean | undefinedtrueClose on `Escape` (web).
closeOnItemClickboolean | undefinedtrueClose the menu when an item is pressed.
defaultOpenedboolean | undefinedfalseUncontrolled initial opened state.
disabled systemboolean | undefinedfalseSkip rendering the dropdown entirely.
keepMountedboolean | undefinedfalseKeep the dropdown mounted while closed.
menuItemTabIndex0 | -1 | undefined-1`tabIndex` set on every item; `0` enables Tab navigation.
offsetnumber | undefined8Gap between target and dropdown in px.
onChange((opened: boolean) => void) | undefinedCalled when the opened state changes.
onClose(() => void) | undefinedCalled when the menu closes.
onOpen(() => void) | undefinedCalled when the menu opens.
openDelaynumber | undefined0Open delay in ms for hover triggers.
openedboolean | undefinedControlled opened state.
positionPlacement | undefined
top · top-start · top-end · bottom · bottom-start · bottom-end · left · left-start · left-end · right · right-start · right-end
'bottom-start'Dropdown placement relative to the target.
radius systemRadiusTokens | undefinedDropdown border radius.
shadow system"xs" | "sm" | "md" | "lg" | "xl" | "xxs" | "xxl" | undefined
xs · sm · md · lg · xl
'md'Dropdown shadow scale.
styles systemSlotStyles<MenuStyles> | undefinedPer-slot style sugar — props spread onto the matching styled part.
theme systemThemeName | null | undefinedAccent theme applied to the menu subtree (trigger + dropdown).
triggerMenuTrigger | undefined
click · hover · click-hover
'click'Event that opens the menu.
widthPopoverWidth | undefined'max-content'Dropdown width; `'target'` matches the target.
withArrowboolean | undefinedfalseRender an arrow pointing at the target.
withinPortalboolean | undefinedtrueRender the dropdown in a portal.
zIndexnumber | undefined300Dropdown `z-index`.

Style slots

Every part of Menu can be styled through the styles prop. Explicit props on the component always win over slot styles.

SlotUsage
dividerstyles={{ divider: { … } }}
dropdownstyles={{ dropdown: { … } }}
itemstyles={{ item: { … } }}
itemLabelstyles={{ itemLabel: { … } }}
itemSectionstyles={{ itemSection: { … } }}
labelstyles={{ label: { … } }}