Package Exports
- @rmwc/menu
- @rmwc/menu/README.md
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (@rmwc/menu) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
Menus
Menus display a list of choices on a transient sheet of material.
- Module @rmwc/menu
- Import styles:
- Using CSS Loader
- import '@rmwc/menu/dist/styles';
- Or include stylesheets
- '@material/menu/dist/mdc.menu.css'
- '@material/menu-surface/dist/mdc.menu-surface.css'
- '@material/ripple/dist/mdc.ripple.css'
- '@material/list/dist/mdc.list.css'
- '@rmwc/icon/icon.css'
- Using CSS Loader
- MDC Docs: https://material.io/develop/web/components/menus/
Basic Usage
You can compose a menu with the given components, and manually manage the open state. Menu
expects MenuItems as children while MenuSurface
is a generic container which can have anything as a child.
function Example() {
const [open, setOpen] = React.useState(false);
return (
<MenuSurfaceAnchor>
<Menu
open={open}
onSelect={evt => console.log(evt.detail.index)}
onClose={evt => setOpen(false)}
>
<MenuItem>Cookies</MenuItem>
<MenuItem>Pizza</MenuItem>
{/** MenuItem is just a ListItem, so you can intermingle other List components */}
<ListDivider />
<MenuItem>Icecream</MenuItem>
</Menu>
<Button raised onClick={evt => setOpen(!open)}>
Menu
</Button>
</MenuSurfaceAnchor>
);
}
function Example() {
const [open, setOpen] = React.useState(false);
return (
<MenuSurfaceAnchor>
<MenuSurface open={open} onClose={evt => setOpen(false)}>
<div style={{ padding: '1rem', width: '8rem' }}>
Make the content whatever you want.
</div>
</MenuSurface>
<Button raised onClick={evt => setOpen(!open)}>
Menu Surface
</Button>
</MenuSurfaceAnchor>
);
}
function Example() {
const [open, setOpen] = React.useState(false);
return (
<MenuSurfaceAnchor>
<MenuSurface open={open} onClose={evt => setOpen(false)}>
<div style={{ padding: '1rem', width: '8rem' }}>Menu</div>
</MenuSurface>
{/** The handle can be any component you want */}
<IconButton icon="menu" onClick={evt => setOpen(!open)} />
</MenuSurfaceAnchor>
);
}
Simplified usage
RMWC provides a convenience SimpleMenu
component that takes a handle as a prop, and manages the open state for you.
<SimpleMenu handle={<Button>Simple Menu</Button>}>
<MenuItem>Cookies</MenuItem>
<MenuItem>Pizza</MenuItem>
<MenuItem>Icecream</MenuItem>
</SimpleMenu>
<SimpleMenuSurface handle={<Button>Simple Menu Surface</Button>}>
<div style={{ padding: '1rem', width: '8rem' }}>
Make the content whatever you want.
</div>
</SimpleMenuSurface>
Anchoring
By default, Menus will attempt to automatically position themselves, but this behavior can be overriden by setting the anchorCorner
prop.
function Example() {
const [anchorCorner, setAnchorCorner] = React.useState(
'topLeft'
);
return (
<>
<MenuSurfaceAnchor>
<MenuSurface anchorCorner={anchorCorner} open={true}>
<div style={{ padding: '1rem', width: '8rem' }}>
anchorCorner: {anchorCorner}
</div>
</MenuSurface>
<Button raised label="Anchored Menu" />
</MenuSurfaceAnchor>
<Select
value={anchorCorner}
label="anchorCorner"
onChange={evt => setAnchorCorner(evt.currentTarget.value)}
options={[
'topLeft',
'topRight',
'bottomLeft',
'bottomRight',
'topStart',
'topEnd',
'bottomStart',
'bottomEnd'
]}
/>
</>
);
}
Menu
A menu component for displaying lists items.
Props
Name | Type | Description |
---|---|---|
apiRef |
undefined | (api: MenuApi) => void |
Internal api reference for cross component communication. |
focusOnOpen |
undefined | false | true |
Whether or not to focus the first list item on open. Defaults to true. |
foundationRef |
React.Ref<MDCMenuFoundation> |
Advanced: A reference to the MDCFoundation. |
onSelect |
undefined | (evt: MenuOnSelectEventT) => void |
Callback that fires when a Menu item is selected. evt.detail = { index: number; item: HTMLElement; } |
MenuItem
This is just the ListItem component exported from the Menu module for convenience. You can use ListItem
or SimpleListItem
components from the List section as long as you add role="menuitem"
and tabIndex="0"
to the components for accessibility.
Props
Name | Type | Description |
---|---|---|
activated |
undefined | false | true |
A modifier for an active state. |
disabled |
undefined | false | true |
A modifier for a disabled state. |
ripple |
RipplePropT |
Adds a ripple effect to the component |
selected |
undefined | false | true |
A modifier for a selected state. |
MenuSurface
Props
Name | Type | Description |
---|---|---|
anchorCorner |
AnchorT |
Manually position the menu to one of the corners. |
apiRef |
undefined | (api: MenuSurfaceApi) => void |
An internal api for cross component communication. |
children |
React.ReactNode |
Children to render. |
fixed |
undefined | false | true |
Make the menu position fixed. |
foundationRef |
React.Ref<MDCMenuSurfaceFoundation> |
Advanced: A reference to the MDCFoundation. |
hoistToBody |
undefined | false | true |
Moves the menu to the body. Useful for situations where the content might be cutoff by an overflow: hidden container. |
onClose |
undefined | (evt: MenuSurfaceOnCloseEventT) => void |
Callback for when the menu is closed. |
onOpen |
undefined | (evt: MenuSurfaceOnOpenEventT) => void |
Callback for when the menu is opened. |
open |
undefined | false | true |
Opens the menu. |
MenuSurfaceAnchor
MenuSurfaceAnchor
SimpleMenu
A Simplified menu component that allows you to pass a handle element and will automatically control the open state and add a MenuSurfaceAnchor
Props
Name | Type | Description |
---|---|---|
apiRef |
undefined | (api: MenuApi) => void |
Internal api reference for cross component communication. |
children |
React.ReactNode |
Children to render |
focusOnOpen |
undefined | false | true |
Whether or not to focus the first list item on open. Defaults to true. |
foundationRef |
React.Ref<MDCMenuFoundation> |
Advanced: A reference to the MDCFoundation. |
handle |
ReactElement<any> |
An element that will open the menu when clicked |
onSelect |
undefined | (evt: MenuOnSelectEventT) => void |
Callback that fires when a Menu item is selected. evt.detail = { index: number; item: HTMLElement; } |
rootProps |
Object |
By default, props spread to the Menu component. These will spread to the MenuSurfaceAnchor which is useful for things like overall positioning of the anchor. |
SimpleMenuSurface
The same as SimpleMenu, but a generic surface.
Props
Name | Type | Description |
---|---|---|
anchorCorner |
AnchorT |
Manually position the menu to one of the corners. |
apiRef |
undefined | (api: MenuSurfaceApi) => void |
An internal api for cross component communication. |
children |
React.ReactNode |
Children to render |
fixed |
undefined | false | true |
Make the menu position fixed. |
foundationRef |
React.Ref<MDCMenuSurfaceFoundation> |
Advanced: A reference to the MDCFoundation. |
handle |
ReactElement<any> |
An element that will open the menu when clicked |
hoistToBody |
undefined | false | true |
Moves the menu to the body. Useful for situations where the content might be cutoff by an overflow: hidden container. |
onClose |
undefined | (evt: MenuSurfaceOnCloseEventT) => void |
Callback for when the menu is closed. |
onOpen |
undefined | (evt: MenuSurfaceOnOpenEventT) => void |
Callback for when the menu is opened. |
open |
undefined | false | true |
Opens the menu. |
rootProps |
Object |
By default, props spread to the Menu component. These will spread to the MenuSurfaceAnchor which is useful for things like overall positioning of the anchor. |