Status Menu
A Status component communicates the status of a process or connectivity to an application or service.
const ProcessStatusMenu = () => {const [process, setProcess] = React.useState(ProcessObject.Success);const menu = useStatusMenuState();const onClick = (status) => {setProcess(ProcessObject[status]);menu.hide();};return (<><StatusMenuBadge {...menu} i18nButtonLabel="Change account" variant={process.variant}>{process.children}</StatusMenuBadge><StatusMenu {...menu} aria-label="Preferences"><StatusMenuItemRadio{...menu}name="process"value="success"checked={process.children === ProcessObject.Success.children}onClick={() => onClick('Success')}variant="default"><StatusMenuItemChild variant="ProcessSuccess">{ProcessObject.Success.children}</StatusMenuItemChild></StatusMenuItemRadio><StatusMenuItemRadio{...menu}name="process"value="neutral"checked={process.children === ProcessObject.Neutral.children}onClick={() => onClick('Neutral')}variant="default"><StatusMenuItemChild variant="ProcessNeutral">{ProcessObject.Neutral.children}</StatusMenuItemChild></StatusMenuItemRadio><StatusMenuItemRadio{...menu}name="process"value="warning"checked={process.children === ProcessObject.Warning.children}onClick={() => onClick('Warning')}variant="default"><StatusMenuItemChild variant="ProcessWarning">{ProcessObject.Warning.children}</StatusMenuItemChild></StatusMenuItemRadio><StatusMenuItemRadio{...menu}name="process"value="error"checked={process.children === ProcessObject.Error.children}onClick={() => onClick('Error')}variant="default"><StatusMenuItemChild variant="ProcessError">{ProcessObject.Error.children}</StatusMenuItemChild></StatusMenuItemRadio><StatusMenuItemRadio{...menu}name="process"value="InProgress"checked={process.children === ProcessObject.InProgress.children}onClick={() => onClick('InProgress')}variant="default"><StatusMenuItemChild variant="ProcessInProgress">{ProcessObject.InProgress.children}</StatusMenuItemChild></StatusMenuItemRadio><StatusMenuItemRadio{...menu}name="process"value="disabled"checked={process.children === ProcessObject.Disabled.children}onClick={() => onClick('Disabled')}variant="default"><StatusMenuItemChild variant="ProcessDisabled">{ProcessObject.Disabled.children}</StatusMenuItemChild></StatusMenuItemRadio><StatusMenuItemRadio{...menu}name="process"value="draft"checked={process.children === ProcessObject.Draft.children}onClick={() => onClick('Draft')}variant="default"><StatusMenuItemChild variant="ProcessDraft">{ProcessObject.Draft.children}</StatusMenuItemChild></StatusMenuItemRadio></StatusMenu></>);};render(<ProcessStatusMenu />)
Use a Status Menu to both display and change the status of a connection or process. It closely follows the Status Pattern and comes with preconfigured options for displaying the status of both processes and connections, using the correct icons for each.
Status Menu implements a Menu and supports all the same keyboard navigation that the Menu component does.
Use the process-related variants of Status Menu to display and interact with the status of a particular process.
const ProcessStatusMenu = () => {const [process, setProcess] = React.useState(ProcessObject.Success);const menu = useStatusMenuState();const onClick = (status) => {setProcess(ProcessObject[status]);menu.hide();};return (<><StatusMenuBadge {...menu} i18nButtonLabel="Change account" variant={process.variant}>{process.children}</StatusMenuBadge><StatusMenu {...menu} aria-label="Preferences"><StatusMenuItemRadio{...menu}name="process"value="success"checked={process.children === ProcessObject.Success.children}onClick={() => onClick('Success')}variant="default"><StatusMenuItemChild variant="ProcessSuccess">{ProcessObject.Success.children}</StatusMenuItemChild></StatusMenuItemRadio><StatusMenuItemRadio{...menu}name="process"value="neutral"checked={process.children === ProcessObject.Neutral.children}onClick={() => onClick('Neutral')}variant="default"><StatusMenuItemChild variant="ProcessNeutral">{ProcessObject.Neutral.children}</StatusMenuItemChild></StatusMenuItemRadio><StatusMenuItemRadio{...menu}name="process"value="warning"checked={process.children === ProcessObject.Warning.children}onClick={() => onClick('Warning')}variant="default"><StatusMenuItemChild variant="ProcessWarning">{ProcessObject.Warning.children}</StatusMenuItemChild></StatusMenuItemRadio><StatusMenuItemRadio{...menu}name="process"value="error"checked={process.children === ProcessObject.Error.children}onClick={() => onClick('Error')}variant="default"><StatusMenuItemChild variant="ProcessError">{ProcessObject.Error.children}</StatusMenuItemChild></StatusMenuItemRadio><StatusMenuItemRadio{...menu}name="process"value="InProgress"checked={process.children === ProcessObject.InProgress.children}onClick={() => onClick('InProgress')}variant="default"><StatusMenuItemChild variant="ProcessInProgress">{ProcessObject.InProgress.children}</StatusMenuItemChild></StatusMenuItemRadio><StatusMenuItemRadio{...menu}name="process"value="disabled"checked={process.children === ProcessObject.Disabled.children}onClick={() => onClick('Disabled')}variant="default"><StatusMenuItemChild variant="ProcessDisabled">{ProcessObject.Disabled.children}</StatusMenuItemChild></StatusMenuItemRadio><StatusMenuItemRadio{...menu}name="process"value="draft"checked={process.children === ProcessObject.Draft.children}onClick={() => onClick('Draft')}variant="default"><StatusMenuItemChild variant="ProcessDraft">{ProcessObject.Draft.children}</StatusMenuItemChild></StatusMenuItemRadio></StatusMenu></>);};render(<ProcessStatusMenu />)
Use the connectivity-related variants of Status Menu to display and interact with the status of a particular connection.
const ConnectivityStatusMenu = () => {const [availability, setConnectivity] = React.useState(ConnectivityObject.Available);const menu = useStatusMenuState();const onClick = (status) => {setConnectivity(ConnectivityObject[status]);menu.hide();};return (<><StatusMenuBadge {...menu} i18nButtonLabel="Change account" variant={availability.variant}>{availability.children}</StatusMenuBadge><StatusMenu {...menu} aria-label="Preferences"><StatusMenuItemRadioname="availability"checked={availability.children === 'Available'}value="available"{...menu}onClick={() => onClick('Available')}variant="default"><StatusMenuItemChild variant="ConnectivityAvailable">Available</StatusMenuItemChild></StatusMenuItemRadio><StatusMenuItemRadioname="availability"checked={availability.children === 'Busy'}value="busy"{...menu}onClick={() => onClick('Busy')}variant="default"><StatusMenuItemChild variant="ConnectivityBusy">Busy</StatusMenuItemChild></StatusMenuItemRadio><StatusMenuItemRadioname="availability"checked={availability.children === 'Unavailable'}value="unavailable"{...menu}onClick={() => onClick('Unavailable')}variant="default"><StatusMenuItemChild variant="ConnectivityUnavailable">Unavailable</StatusMenuItemChild></StatusMenuItemRadio><StatusMenuItemRadioname="availability"checked={availability.children === 'Neutral'}value="neutral"{...menu}onClick={() => onClick('Neutral')}variant="default"><StatusMenuItemChild variant="ConnectivityNeutral">Neutral</StatusMenuItemChild></StatusMenuItemRadio><StatusMenuItemRadioname="availability"checked={availability.children === 'Offline'}value="offline"{...menu}onClick={() => onClick('Offline')}variant="default"><StatusMenuItemChild variant="ConnectivityOffline">Offline</StatusMenuItemChild></StatusMenuItemRadio></Menu></>);};render(<ConnectivityStatusMenu />)
Status Menu consists of StatusMenu
, StatusMenuBadge
, StatusMenuItem
, StatusMenuItemRadio
, StatusMenuItemCheckbox
, and useStatusMenuState
. These are all namesakes of their Menu equivalents and follow the same API. It also comes with one additional component called StatusMenuItemChild
.
StatusMenuItemChild
is where the status pattern is implemented. It takes a variant
prop that is set to a value that directly relates to one of the connectivity or process status types. It pairs the correct icon with its color implementation for the status. Check out the full list of variant options in the props table.
yarn add @twilio-paste/Status - or - yarn add @twilio-paste/core
import {
StatusMenu,
StatusMenuBadge,
StatusMenuItem,
StatusMenuItemChild,
useStatusMenuState,
StatusMenuItemRadio,
StatusMenuItemCheckbox,
} from '@twilio-paste/core/status';
const ProcessStatusMenu = () => {
const [process, setProcess] = React.useState(ProcessObject.Success);
const menu = useStatusMenuState();
const onClick = (status) => {
setProcess(ProcessObject[status]);
menu.hide();
};
return (
<>
<StatusMenuBadge {...menu} i18nButtonLabel="Change account" variant={process.variant}>
{process.children}
</StatusMenuBadge>
<StatusMenu {...menu} aria-label="Preferences">
<StatusMenuItem {...menu} onClick={() => onClick('Success')} variant="default">
<StatusMenuItemChild variant="ProcessSuccess">Complete</StatusMenuItemChild>
</StatusMenuItem>
<StatusMenuItem {...menu} onClick={() => onClick('Neutral')} variant="default">
<StatusMenuItemChild variant="ProcessNeutral">In review</StatusMenuItemChild>
</StatusMenuItem>
<StatusMenuItem {...menu} onClick={() => onClick('Warning')} variant="default">
<StatusMenuItemChild variant="ProcessWarning">Needs attention</StatusMenuItemChild>
</StatusMenuItem>
<StatusMenuItem {...menu} onClick={() => onClick('Error')} variant="default">
<StatusMenuItemChild variant="ProcessError">Rejected</StatusMenuItemChild>
</StatusMenuItem>
<StatusMenuItem {...menu} onClick={() => onClick('InProgress')} variant="default">
<StatusMenuItemChild variant="ProcessInProgress">In-progress</StatusMenuItemChild>
</StatusMenuItem>
<StatusMenuItem {...menu} onClick={() => onClick('Disabled')} variant="default">
<StatusMenuItemChild variant="ProcessDisabled">Paused</StatusMenuItemChild>
</StatusMenuItem>
<StatusMenuItem {...menu} onClick={() => onClick('Draft')} variant="default">
<StatusMenuItemChild variant="ProcessDraft">Draft</StatusMenuItemChild>
</StatusMenuItem>
</Menu>
</>
);
};
Pass these as part of an object to the useStatusMenuState
hook.
Prop | Type | Description | Default |
---|---|---|---|
baseId | string | ID that will serve as a base for all the items IDs. | |
rtl | boolean | ||
orientation | horizontal, vertical, undefined | ||
currentId | string, null, undefined | The current focused item id . | |
loop | boolean, horizontal, vertical | ||
wrap | boolean, horizontal, vertical | ||
visible | boolean | Whether it's visible or not. | |
animated | number, boolean | ||
placement | auto-start, auto, auto-end, top-start, top, top-end, right-start, right, right-end, bottom-end, bottom, bottom-start, left-end, left, left-start | ||
gutter | number, undefined | Offset between the reference and the popover on the main axis. Should not be combined with unstable_offset . |
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.
Prop | Type | Description | Default |
---|---|---|---|
baseId | string | ID that will serve as a base for all the items IDs. | |
baseId | string | ID that will serve as a base for all the items IDs. | |
visible | boolean | Whether it's visible or not. | |
animated | number | boolean | ||
modal | boolean | Toggles Dialog's modal state. | |
animating | boolean | Whether it's animating or not. | |
stopAnimation | () => void | Stops animation. It's called automatically if there's a CSS transition. | |
hide | () => void | Changes the visible state to false | |
placement | "auto-start" | "auto" | "auto-end" | "top-start... | Actual placement . | |
orientation | "horizontal" | "vertical" | undefined | Defines the orientation of the composite widget. | |
currentId | string | null | undefined | The current focused item id . | |
wrap | boolean | "horizontal" | "vertical" | 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. | |
groups | Group[] | Lists all the composite groups with their id and DOM ref . | |
items | Item[] | Lists all the composite items with their id , DOM ref , disabled state and groupId if any. | |
setCurrentId | (value: SetStateAction<string | null | undefine... | Sets currentId . | |
first | () => void | Moves focus to the first item. | |
last | () => void | Moves focus to the last item. | |
move | (id: string | null) => void | Moves focus to a given item ID. | |
next | (unstable_allTheWay?: boolean | undefined) => void | Moves focus to the next item. | |
previous | (unstable_allTheWay?: boolean | undefined) => void | Moves focus to the previous item. |
Prop | Type | Description | Default |
---|---|---|---|
hideOnClickOutside | boolean, undefined | When enabled, user can hide the dialog by clicking outside it. | |
disabled | boolean, undefined | Same as the HTML attribute. | |
element? | string | Overrides the default element name to apply unique styles with the Customization Provider | 'MENU' |
Prop | Type | Description | Default |
---|---|---|---|
as? | string | The HTML tag to replace the default <button> tag. | 'button' |
disabled? | boolean | Prevent actions from firing on this Button | false |
fullWidth | boolean | Sets the Button width to 100% of the parent container. | false |
href? | string | A URL to route to. Must use as="a" for this prop to work. | null |
loading? | boolean | Prevent actions and show a loading spinner | false |
size? | ButtonSizes | 'default', 'small', 'icon', 'icon_small', 'reset', 'rounded_small' | 'default' |
type? | ButtonTypes | 'button', 'submit', 'reset'. If the Button is inside a <form> : use 'submit'. Otherwise use 'button' (default). | 'button' |
variant | StatusBadgeVariants | ProcessError , ProcessWarning , ProcessSuccess , ProcessNeutral , ProcessInProgress , ProcessDisabled , ProcessDraft , AvailabilityAvailable , AvailabilityBusy , AvailabilityUnavailable , AvailabilityNeutral , AvailabilityOffline | null |
i18nExternalLinkLabel? | string | Title for showExternal icon | '(link takes you to an external page)' |
pressed? | boolean | Sets the aria-pressed attribute. Must be used with 'secondary' or 'secondary_icon' variants. | |
onClick? | (event: React.MouseEvent<HTMLElement>) | null | |
onMouseDown? | (event: React.MouseEvent<HTMLElement>) | null | |
onMouseUp? | (event: React.MouseEvent<HTMLElement>) | null | |
onMouseEnter? | (event: React.MouseEvent<HTMLElement>) | null | |
onMouseLeave? | (event: React.MouseEvent<HTMLElement>) | null | |
onFocus? | (event: React.FocusEvent<HTMLElement>) | null | |
onBlur? | (event: React.FocusEvent<HTMLElement>) | null | |
element? | string | Overrides the default element name to apply unique styles with the Customization Provider | 'STATUS_MENU_BADGE' |
Prop | Type | Description | Default |
---|---|---|---|
variant | MenuItemVariants | Swaps the menu item variant. Options are default and destructive . | default |
disabled | boolean, undefined | Same as the HTML attribute. | |
id | string, undefined | Same as the HTML attribute. | |
onClick | () => void | Same as the HTML attribute. | |
href | string, undefined | Same as the HTML attribute. | |
element? | string | Overrides the default element name to apply unique styles with the Customization Provider | 'MENU_ITEM' |
Prop | Type | Description | Default |
---|---|---|---|
variant | MenuItemVariants | Swaps the menu item variant. Options are default and destructive . | default |
disabled | boolean, undefined | Same as the HTML attribute. | |
id | string, undefined | Same as the HTML attribute. | |
onClick | () => void | Same as the HTML attribute. | |
href | string, undefined | Same as the HTML attribute. | |
element? | string | Overrides the default element name to apply unique styles with the Customization Provider | 'MENU_ITEM' |
value? | string | ||
checked? | boolean | ||
name? | string |
Prop | Type | Description | Default |
---|---|---|---|
variant | MenuItemVariants | Swaps the menu item variant. Options are default and destructive . | default |
disabled | boolean, undefined | Same as the HTML attribute. | |
id | string, undefined | Same as the HTML attribute. | |
onClick | () => void | Same as the HTML attribute. | |
href | string, undefined | Same as the HTML attribute. | |
element? | string | Overrides the default element name to apply unique styles with the Customization Provider | 'MENU_ITEM' |
value? | string | ||
checked? | boolean | ||
name? | string |
Prop | Type | Description | Default |
---|---|---|---|
variant | StatusBadgeVariants | Swaps the menu item variant. Options are ProcessError , ProcessWarning , ProcessSuccess , ProcessNeutral , ProcessInProgress , ProcessDisabled , ProcessDraft , ConnectivityAvailable , ConnectivityBusy , ConnectivityUnavailable , ConnectivityOffline , ConnectivityNeutral . | |
element? | string | Overrides the default element name to apply unique styles with the Customization Provider | 'MENU_ITEM_STATUS' |
Changelog
733709127
#3395 Thanks @SiTaggart! - Modified the compile target of our JavaScript bundles fromnode
tobrowser
to minimize the risk of clashing with RequireJS. This is marked as a major out of an abundance of caution. You shouldn't need to do anything but we wanted you to be aware of the change on the off chance it has unintended consequences
- Updated dependencies [
733709127
]:- @twilio-paste/uid-library@2.0.0
- @twilio-paste/color-contrast-utils@5.0.0
- @twilio-paste/anchor@12.0.0
- @twilio-paste/badge@8.0.0
- @twilio-paste/button@14.0.0
- @twilio-paste/menu@14.0.0
- @twilio-paste/screen-reader-only@13.0.0
- @twilio-paste/separator@8.0.0
- @twilio-paste/spinner@14.0.0
- @twilio-paste/media-object@10.0.0
- @twilio-paste/stack@8.0.0
- @twilio-paste/box@10.0.0
- @twilio-paste/menu-primitive@2.0.0
- @twilio-paste/text@10.0.0
- @twilio-paste/customization@8.0.0
- @twilio-paste/design-tokens@10.0.0
- @twilio-paste/icons@12.0.0
- @twilio-paste/animation-library@2.0.0
- @twilio-paste/reakit-library@2.0.0
- @twilio-paste/styling-library@3.0.0
- @twilio-paste/style-props@9.0.0
- @twilio-paste/theme@11.0.0
- @twilio-paste/types@6.0.0
4d1f7c65e
#3360 Thanks @SiTaggart! - Improved types where Paste extends the base HTML element that a component is based on, so that the existing blocked styling properties are not exposed as valid properties for the component via Typescript. This leads to less confusion around what is supported by a Paste component.Existing blocked component properties include:
className
style
color
950568e63
#3304 Thanks @serifluous! - Updates navigation component descriptions
76b28cb9d
#3255 Thanks @SiTaggart! - [Status] paired iconography should be decorative and paired with visible, descriptive text
5958ffb5b
#3230 Thanks @SiTaggart! - [Status] Introduces a new Status badge for communicating the status of processes and connections. Provides compositions of the Status Pattern for ease of use.