diff --git a/packages/@react-spectrum/statuslight/docs/StatusLight.mdx b/packages/@react-spectrum/statuslight/docs/StatusLight.mdx new file mode 100644 index 00000000000..f663e532b07 --- /dev/null +++ b/packages/@react-spectrum/statuslight/docs/StatusLight.mdx @@ -0,0 +1,139 @@ +import {Layout} from '@react-spectrum/docs'; +export default Layout; + +import docs from 'docs:@react-spectrum/statuslight'; +import {HeaderInfo, PropTable} from '@react-spectrum/docs'; +import packageData from '../package.json'; + +```jsx import +import {StatusLight} from '@react-spectrum/statuslight'; +import {Switch} from '@react-spectrum/switch'; +import {VisuallyHidden} from '@react-aria/visually-hidden'; +import User from '@spectrum-icons/workflow/User'; +``` + +# StatusLight + +

{docs.exports.StatusLight.description}

+ + + +## Example + +```tsx example +Default +``` + +## Content + +A visible label is always required and can be provided by passing children. +To indicate status use [semantic](#semantic-colors) or [label](#label-colors) variant color. + +```tsx example +Semantic color +Label color +``` + +### Accessibility + +If textual child is not provided (e.g. an icon only), +an alternative text label must be provided to identify the control for accessibility. This should be added using +the `aria-label` prop. + +```tsx example + + + +``` + +The visual cue provided by the status light is insufficient to comply with [WCAG 2.1 Success Criterion 1.4.1 on the Use of Color](https://www.w3.org/TR/WCAG21/#use-of-color), +which requires that "color is not used as the only visual means of conveying information, indicating an action, +prompting a response, or distinguishing a visual element." +If StatusLight communicates a state, such as "Approved" or "Failed", that state must be included as part of the label. + +#### Using role="status" + +In cases where the status changes at runtime, +it may be appropriate to add `role="status"` so that the status change will be announced politely by assistive technology. +When using `role="status"`, be sure to provide appropriate context for the status change in the label for the StatusLight. +A status change that announces "Approved" without meaningful context would not be helpful. +Also, use caution when adding `role="status"` in cases where multiple status lights can update at once. +For example, with a large list of files that change status when deployed, +a single announcement when all files have deployed would be preferable to the verbosity of each file status announcing individually. + +```tsx example +function Example() { + let [isApproved, setIsApproved] = React.useState(false); + + return ( +
+ + Pull Request + {isApproved ? "Approved" : "Needs Approval"} + + setIsApproved(!isApproved)}>Toggle Status +
+ ); +} +``` + +### Internationalization + +To internationalize a StatusLight, a localized string should be set as the child content of the StatusLight. +For languages that are read right to left (e.g. Hebrew and Arabic), the StatusLight is placed on the right side of the text. + +## Props + + + +## Visual Options + +### Variant + +#### Semantic colors +[View guidelines](https://spectrum.adobe.com/page/status-light/#Semantic-variants) + +When status lights have a semantic meaning, they should use semantic colors. +Use the appropriate color to indicate status as follows. + +```tsx example +Gray: Archived, Deleted, Paused, Draft, Not Started, Ended +Green: Approved, Complete, Success, New, Purchased, Licensed +Orange: Needs Approval, Pending, Scheduled, Syncing, Indexing, Processing +Red: Error, Alert, Rejected, Failed +Blue: Active, In Use, Live, Published +``` + +#### Label colors +[View guidelines](https://spectrum.adobe.com/page/status-light/#Non-semantic-variants) + +When status lights are used to color code categories and labels commonly found in data visualization, +they use label colors. The ideal usage for these is when there are 8 or fewer categories or labels being color coded. +Use them in the following order to ensure the greatest possible color differences for multiple forms of color blindness: + +```tsx example +Indigo +Celery +Magenta +Yellow +Fuchsia +Seafoam +Chartreuse +Purple +``` + +### Disabled +[View guidelines](https://spectrum.adobe.com/page/status-light/#Disabled) + +Use the `isDisabled` prop to match the state of a containing element. +Note that the `isDisabled` prop alters the visual style of the StatusLight, +but does not convey any state information to assistive technology. + +```tsx example +Yellow +``` diff --git a/packages/@react-spectrum/statuslight/src/StatusLight.tsx b/packages/@react-spectrum/statuslight/src/StatusLight.tsx index c2ccfd859c2..930266cf042 100644 --- a/packages/@react-spectrum/statuslight/src/StatusLight.tsx +++ b/packages/@react-spectrum/statuslight/src/StatusLight.tsx @@ -50,5 +50,10 @@ function StatusLight(props: SpectrumStatusLightProps, ref: DOMRef