Toolbar
Accessible Toolbar component that follows the WAI-ARIA Toolbar Pattern. It's a container for grouping a set of controls.
#Installation
npm install reakit
Learn more in Get started.
#Usage
import {
useToolbarState,
Toolbar,
ToolbarItem,
ToolbarSeparator,
} from "reakit/Toolbar";
import { Button } from "reakit/Button";
function Example() {
const toolbar = useToolbarState({ loop: true });
return (
<Toolbar {...toolbar} aria-label="My toolbar">
<ToolbarItem {...toolbar} as={Button}>
Item 1
</ToolbarItem>
<ToolbarItem {...toolbar} as={Button}>
Item 2
</ToolbarItem>
<ToolbarSeparator {...toolbar} />
<ToolbarItem {...toolbar} as={Button}>
Item 3
</ToolbarItem>
</Toolbar>
);
}
#Toolbar with Menu
You can render Menu within a Toolbar using the same techinique to make a Submenu.
import React from "react";
import { useToolbarState, Toolbar, ToolbarItem } from "reakit/Toolbar";
import { useMenuState, MenuButton, Menu, MenuItem } from "reakit/Menu";
import { Button } from "reakit/Button";
const MoreItems = React.forwardRef((props, ref) => {
const menu = useMenuState({ placement: "bottom-end" });
return (
<>
<MenuButton {...menu} {...props} ref={ref} aria-label="More items" />
<Menu {...menu} aria-label="More items">
<MenuItem {...menu}>Item 3</MenuItem>
<MenuItem {...menu}>Item 4</MenuItem>
<MenuItem {...menu}>Item 5</MenuItem>
</Menu>
</>
);
});
function Example() {
const toolbar = useToolbarState();
return (
<Toolbar {...toolbar} aria-label="My toolbar">
<ToolbarItem {...toolbar} as={Button}>
Item 1
</ToolbarItem>
<ToolbarItem {...toolbar} as={Button}>
Item 2
</ToolbarItem>
<ToolbarItem {...toolbar} as={MoreItems} />
</Toolbar>
);
}
#Accessibility
Toolbarhas roletoolbar.Toolbarextends the accessibility features of Composite.ToolbarItemextends the accessibility features of CompositeItem.
Learn more in Accessibility.
#Composition
Toolbaruses Composite.ToolbarItemuses CompositeItem.ToolbarSeparatoruses Separator.
Learn more in Composition.
#Props
#useToolbarState
-
baseIdstringID that will serve as a base for all the items IDs.
-
unstable_virtualbooleanIf enabled, the composite element will act as an aria-activedescendant container instead of roving tabindex. DOM focus will remain on the composite while its items receive virtual focus.
-
rtlbooleanDetermines how
nextandpreviousfunctions will behave. Ifrtlis set totrue, they will be inverted. This only affects the composite widget behavior. You still need to setdir="rtl"on HTML/CSS. -
orientation"horizontal" | "vertical" | undefinedDefines the orientation of the composite widget. If the composite has a single row or column (one-dimensional), the
orientationvalue determines which arrow keys can be used to move focus:undefined: all arrow keys work.horizontal: only left and right arrow keys work.vertical: only up and down arrow keys work.
It doesn't have any effect on two-dimensional composites.
-
currentIdstring | null | undefinedThe current focused item
id.undefinedwill automatically focus the first enabled composite item.nullwill focus the base composite element and users will be able to navigate out of it using arrow keys.- If
currentIdis initially set tonull, the base composite element itself will have focus and users will be able to navigate to it using arrow keys.
-
loopboolean | "horizontal" | "vertical"On one-dimensional composites:
trueloops from the last item to the first item and vice-versa.horizontalloops only iforientationishorizontalor not set.verticalloops only iforientationisverticalor not set.- If
currentIdis initially set tonull, the composite element will be focused in between the last and first items.
On two-dimensional composites:
trueloops from the last row/column item to the first item in the same row/column and vice-versa. If it's the last item in the last row, it moves to the first item in the first row and vice-versa.horizontalloops only from the last row item to the first item in the same row.verticalloops only from the last column item to the first item in the column row.- If
currentIdis initially set tonull, vertical loop will have no effect as moving down from the last row or up from the first row will focus the composite element. - If
wrapmatches the value ofloop, it'll wrap between the last item in the last row or column and the first item in the first row or column and vice-versa.
-
wrapboolean | "horizontal" | "vertical"Has effect only on two-dimensional composites. If enabled, moving to the next item from the last one in a row or column will focus the first item in the next row or column and vice-versa.
truewraps between rows and columns.horizontalwraps only between rows.verticalwraps only between columns.- If
loopmatches the value ofwrap, it'll wrap between the last item in the last row or column and the first item in the first row or column and vice-versa.
-
shiftbooleanHas effect only on two-dimensional composites. If enabled, moving up or down when there's no next item or the next item is disabled will shift to the item right before it.
#Toolbar
-
disabledboolean | undefinedSame as the HTML attribute.
-
focusableboolean | undefinedWhen an element is
disabled, it may still befocusable. It works similarly toreadOnlyon form elements. In this case, onlyaria-disabledwill be set.
12 state props
These props are returned by the state hook. You can spread them into this component (
{...state}) or pass them separately. You can also provide these props from your own state logic.
-
baseIdstringID that will serve as a base for all the items IDs.
-
unstable_virtualbooleanIf enabled, the composite element will act as an aria-activedescendant container instead of roving tabindex. DOM focus will remain on the composite while its items receive virtual focus.
-
orientation"horizontal" | "vertical" | undefinedDefines the orientation of the composite widget. If the composite has a single row or column (one-dimensional), the
orientationvalue determines which arrow keys can be used to move focus:undefined: all arrow keys work.horizontal: only left and right arrow keys work.vertical: only up and down arrow keys work.
It doesn't have any effect on two-dimensional composites.
-
currentIdstring | null | undefinedThe current focused item
id.undefinedwill automatically focus the first enabled composite item.nullwill focus the base composite element and users will be able to navigate out of it using arrow keys.- If
currentIdis initially set tonull, the base composite element itself will have focus and users will be able to navigate to it using arrow keys.
-
wrapboolean | "horizontal" | "vertical"Has effect only on two-dimensional composites. If enabled, moving to the next item from the last one in a row or column will focus the first item in the next row or column and vice-versa.
truewraps between rows and columns.horizontalwraps only between rows.verticalwraps only between columns.- If
loopmatches the value ofwrap, it'll wrap between the last item in the last row or column and the first item in the first row or column and vice-versa.
-
unstable_movesnumberStores the number of moves that have been performed by calling
move,next,previous,up,down,firstorlast. -
groupsGroup[]Lists all the composite groups with their
idand DOMref. This state is automatically updated whenregisterGroupandunregisterGroupare called. -
itemsItem[]Lists all the composite items with their
id, DOMref,disabledstate andgroupIdif any. This state is automatically updated whenregisterItemandunregisterItemare called. -
setCurrentId(value: SetStateAction<string | null | undefine...Sets
currentId. This is different fromcomposite.moveas this only updates thecurrentIdstate without moving focus. When the composite widget gets focused by the user, the item referred by thecurrentIdstate will get focus. -
first() => voidMoves focus to the first item.
-
last() => voidMoves focus to the last item.
-
move(id: string | null) => voidMoves focus to a given item ID.
#ToolbarItem
-
disabledboolean | undefinedSame as the HTML attribute.
-
focusableboolean | undefinedWhen an element is
disabled, it may still befocusable. It works similarly toreadOnlyon form elements. In this case, onlyaria-disabledwill be set. -
idstring | undefinedSame as the HTML attribute.
15 state props
These props are returned by the state hook. You can spread them into this component (
{...state}) or pass them separately. You can also provide these props from your own state logic.
-
baseIdstringID that will serve as a base for all the items IDs.
-
unstable_virtualbooleanIf enabled, the composite element will act as an aria-activedescendant container instead of roving tabindex. DOM focus will remain on the composite while its items receive virtual focus.
-
orientation"horizontal" | "vertical" | undefinedDefines the orientation of the composite widget. If the composite has a single row or column (one-dimensional), the
orientationvalue determines which arrow keys can be used to move focus:undefined: all arrow keys work.horizontal: only left and right arrow keys work.vertical: only up and down arrow keys work.
It doesn't have any effect on two-dimensional composites.
-
unstable_movesnumberStores the number of moves that have been performed by calling
move,next,previous,up,down,firstorlast. -
currentIdstring | null | undefinedThe current focused item
id.undefinedwill automatically focus the first enabled composite item.nullwill focus the base composite element and users will be able to navigate out of it using arrow keys.- If
currentIdis initially set tonull, the base composite element itself will have focus and users will be able to navigate to it using arrow keys.
-
itemsItem[]Lists all the composite items with their
id, DOMref,disabledstate andgroupIdif any. This state is automatically updated whenregisterItemandunregisterItemare called. -
setCurrentId(value: SetStateAction<string | null | undefine...Sets
currentId. This is different fromcomposite.moveas this only updates thecurrentIdstate without moving focus. When the composite widget gets focused by the user, the item referred by thecurrentIdstate will get focus. -
first() => voidMoves focus to the first item.
-
last() => voidMoves focus to the last item.
-
registerItem(item: Item) => voidRegisters a composite item.
-
unregisterItem(id: string) => voidUnregisters a composite item.
-
next(unstable_allTheWay?: boolean | undefined) => voidMoves focus to the next item.
-
previous(unstable_allTheWay?: boolean | undefined) => voidMoves focus to the previous item.
-
up(unstable_allTheWay?: boolean | undefined) => voidMoves focus to the item above.
-
down(unstable_allTheWay?: boolean | undefined) => voidMoves focus to the item below.
#ToolbarSeparator
1 state props
These props are returned by the state hook. You can spread them into this component (
{...state}) or pass them separately. You can also provide these props from your own state logic.
-
orientation"horizontal" | "vertical" | undefinedSeparator's orientation.