Skip to content

Commit

Permalink
chore(react-tags-preview): update Tag stories with better a11y (micro…
Browse files Browse the repository at this point in the history
…soft#28909)

* stories

* md

* Update packages/react-components/react-tags-preview/stories/InteractionTag/InteractionTagAppearance.stories.tsx

Co-authored-by: Bernardo Sunderhus <bernardo.sunderhus@gmail.com>

* Update packages/react-components/react-tags-preview/stories/InteractionTag/InteractionTagAppearance.stories.tsx

Co-authored-by: Bernardo Sunderhus <bernardo.sunderhus@gmail.com>

* Update packages/react-components/react-tags-preview/stories/InteractionTag/InteractionTagAppearance.stories.tsx

Co-authored-by: Bernardo Sunderhus <bernardo.sunderhus@gmail.com>

---------

Co-authored-by: Bernardo Sunderhus <bernardo.sunderhus@gmail.com>
  • Loading branch information
YuanboXue-Amber and bsunderhus committed Aug 21, 2023
1 parent 7c278ca commit b7191ef
Show file tree
Hide file tree
Showing 10 changed files with 106 additions and 78 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,19 +19,19 @@ export const Appearance = () => {
<InteractionTagPrimary icon={<CalendarMonth />} hasSecondaryAction>
filled
</InteractionTagPrimary>
<InteractionTagSecondary />
<InteractionTagSecondary aria-label="filled, remove" />
</InteractionTag>
<InteractionTag appearance="outline">
<InteractionTagPrimary icon={<CalendarMonth />} hasSecondaryAction>
outline
</InteractionTagPrimary>
<InteractionTagSecondary />
<InteractionTagSecondary aria-label="outline, remove" />
</InteractionTag>
<InteractionTag appearance="brand">
<InteractionTagPrimary icon={<CalendarMonth />} hasSecondaryAction>
brand
</InteractionTagPrimary>
<InteractionTagSecondary />
<InteractionTagSecondary aria-label="brand, remove" />
</InteractionTag>
</div>
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

- To group multiple tags together, use `TagGroup`. `TagGroup` can handle dismiss of multiple `InteractionTag`.

- `InteractionTagSecondary` should provide information to screen readers about the secondary action using `aria-label` or `aria-labelledby`.

### Don't

- Don't use `InteractionTag` for tags without a primary action. Use `Tag` in such cases.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,50 +1,43 @@
import * as React from 'react';
import { Avatar, makeStyles } from '@fluentui/react-components';
import { CalendarMonthRegular } from '@fluentui/react-icons';

import { InteractionTag, InteractionTagPrimary, InteractionTagSecondary } from '@fluentui/react-tags-preview';
import {
InteractionTag,
InteractionTagPrimary,
InteractionTagSecondary,
TagGroup,
TagGroupProps,
} from '@fluentui/react-tags-preview';

const useContainerStyles = makeStyles({
root: {
display: 'flex',
flexDirection: 'column',
rowGap: '10px',
},
});
const initialTags = [
{ value: '1', children: 'Tag 1' },
{ value: '2', children: 'Tag 2' },
{ value: '3', children: 'Tag 3' },
];

export const Dismiss = () => {
const containerStyles = useContainerStyles();
const [visibleTags, setVisibleTags] = React.useState(initialTags);
const removeItem: TagGroupProps['onDismiss'] = (_e, { dismissedTagValue }) => {
setVisibleTags([...visibleTags].filter(tag => tag.value !== dismissedTagValue));
};

return (
<div className={containerStyles.root}>
<InteractionTag>
<InteractionTagPrimary hasSecondaryAction>Primary text</InteractionTagPrimary>
<InteractionTagSecondary />
</InteractionTag>
<InteractionTag>
<InteractionTagPrimary icon={<CalendarMonthRegular />} hasSecondaryAction>
Primary text
</InteractionTagPrimary>
<InteractionTagSecondary />
</InteractionTag>
<InteractionTag>
<InteractionTagPrimary
media={<Avatar name="Katri Athokas" badge={{ status: 'busy' }} />}
secondaryText="Secondary text"
hasSecondaryAction
>
Primary text
</InteractionTagPrimary>
<InteractionTagSecondary />
</InteractionTag>
</div>
<TagGroup onDismiss={removeItem}>
{visibleTags.map(tag => (
<InteractionTag value={tag.value} key={tag.value}>
<InteractionTagPrimary hasSecondaryAction>{tag.children}</InteractionTagPrimary>
<InteractionTagSecondary aria-label={`${tag.children}, remove`} />
</InteractionTag>
))}
</TagGroup>
);
};

Dismiss.storyName = 'Dismiss';
Dismiss.parameters = {
docs: {
description: {
story: 'An InteractionTag can have a button that dismisses it',
story:
'An InteractionTag can have a secondary action that is usually dismiss. TagGroup can handle dismiss for a collection of tags.',
},
},
};
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,13 @@ export const Shape = () => {
<InteractionTagPrimary icon={<CalendarMonthRegular />} secondaryText="Secondary text" hasSecondaryAction>
Rounded
</InteractionTagPrimary>
<InteractionTagSecondary />
<InteractionTagSecondary aria-label={`Rounded, remove`} />
</InteractionTag>
<InteractionTag shape="circular">
<InteractionTagPrimary icon={<CalendarMonthRegular />} secondaryText="Secondary text" hasSecondaryAction>
Circular
</InteractionTagPrimary>
<InteractionTagSecondary />
<InteractionTagSecondary aria-label={`Circular, remove`} />
</InteractionTag>
</div>
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,20 +20,25 @@ export const Size = () => {
const styles = useContainerStyles();
return (
<div className={styles.outerWrapper}>
{/* medium */}
<div className={styles.innerWrapper}>
<InteractionTag>
<InteractionTagPrimary>Medium</InteractionTagPrimary>
</InteractionTag>

<InteractionTag>
<InteractionTagPrimary media={<Avatar name="Katri Athokas" badge={{ status: 'busy' }} />} hasSecondaryAction>
Medium dismissible
</InteractionTagPrimary>
<InteractionTagSecondary />
<InteractionTagSecondary aria-label={`Medium, dismiss`} />
</InteractionTag>

<InteractionTag shape="circular">
<InteractionTagPrimary icon={<CalendarMonthRegular />}>Medium circular</InteractionTagPrimary>
</InteractionTag>
</div>

{/* small */}
<div className={styles.innerWrapper}>
<InteractionTag size="small">
<InteractionTagPrimary>Small</InteractionTagPrimary>
Expand All @@ -43,12 +48,15 @@ export const Size = () => {
<InteractionTagPrimary media={<Avatar name="Katri Athokas" badge={{ status: 'busy' }} />} hasSecondaryAction>
Small dismissible
</InteractionTagPrimary>
<InteractionTagSecondary />
<InteractionTagSecondary aria-label={`Small, dismiss`} />
</InteractionTag>

<InteractionTag size="small" shape="circular">
<InteractionTagPrimary icon={<CalendarMonthRegular />}>Small circular</InteractionTagPrimary>
</InteractionTag>
</div>

{/* extra-small */}
<div className={styles.innerWrapper}>
<InteractionTag size="extra-small">
<InteractionTagPrimary>Extra Small</InteractionTagPrimary>
Expand All @@ -58,8 +66,9 @@ export const Size = () => {
<InteractionTagPrimary media={<Avatar name="Katri Athokas" badge={{ status: 'busy' }} />} hasSecondaryAction>
Extra Small dismissible
</InteractionTagPrimary>
<InteractionTagSecondary />
<InteractionTagSecondary aria-label={`Extra-small, dismiss`} />
</InteractionTag>

<InteractionTag size="extra-small" shape="circular">
<InteractionTagPrimary icon={<CalendarMonthRegular />}>Extra Small circular</InteractionTagPrimary>
</InteractionTag>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,13 @@ export const Appearance = () => {
const styles = useContainerStyles();
return (
<div className={styles.container}>
<Tag icon={<CalendarMonthRegular />} dismissible>
<Tag icon={<CalendarMonthRegular />} dismissible dismissIcon={{ 'aria-label': 'remove' }}>
filled
</Tag>
<Tag appearance="outline" icon={<CalendarMonthRegular />} dismissible>
<Tag appearance="outline" icon={<CalendarMonthRegular />} dismissible dismissIcon={{ 'aria-label': 'remove' }}>
outline
</Tag>
<Tag appearance="brand" icon={<CalendarMonthRegular />} dismissible>
<Tag appearance="brand" icon={<CalendarMonthRegular />} dismissible dismissIcon={{ 'aria-label': 'remove' }}>
brand
</Tag>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

- To group multiple tags together, use `TagGroup`. `TagGroup` can handle dismiss of multiple `Tag`.

- Dismissible `Tag` should provide information to screen readers about the dismiss action. For example `dismissIcon={{ 'aria-label': 'remove' }}`.

### Don't

- Don't change the interaction on a `Tag` because it should only be dismissible. Instead, use `InteractionTag` if you need a different type of interaction.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,41 +1,35 @@
import * as React from 'react';
import { Avatar, makeStyles } from '@fluentui/react-components';
import { CalendarMonthRegular } from '@fluentui/react-icons';
import { Tag, TagGroup, TagGroupProps } from '@fluentui/react-tags-preview';

import { Tag } from '@fluentui/react-tags-preview';

const useContainerStyles = makeStyles({
root: {
display: 'flex',
flexDirection: 'column',
rowGap: '10px',
},
});
const initialTags = [
{ value: '1', children: 'Tag 1' },
{ value: '2', children: 'Tag 2' },
{ value: '3', children: 'Tag 3' },
];

export const Dismiss = () => {
const containerStyles = useContainerStyles();
const [visibleTags, setVisibleTags] = React.useState(initialTags);
const removeItem: TagGroupProps['onDismiss'] = (_e, { dismissedTagValue }) => {
setVisibleTags([...visibleTags].filter(tag => tag.value !== dismissedTagValue));
};

return (
<div className={containerStyles.root}>
<Tag dismissible>Primary text</Tag>
<Tag dismissible icon={<CalendarMonthRegular />}>
Primary text
</Tag>
<Tag
dismissible
media={<Avatar name="Katri Athokas" badge={{ status: 'busy' }} />}
secondaryText="Secondary text"
>
Primary text
</Tag>
</div>
<TagGroup onDismiss={removeItem}>
{visibleTags.map(tag => (
<Tag dismissible dismissIcon={{ 'aria-label': 'remove' }} value={tag.value} key={tag.value}>
{tag.children}
</Tag>
))}
</TagGroup>
);
};

Dismiss.storyName = 'Dismiss';
Dismiss.parameters = {
docs: {
description: {
story: 'A tag can have a button that dismisses it',
story:
'A tag can have a dismiss icon and become focusable. TagGroup can handle dismiss for a collection of tags.',
},
},
};
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,21 @@ export const Shape = () => {
Circular
</Tag>

<Tag dismissible icon={<CalendarMonthRegular />} secondaryText="Secondary text">
<Tag
dismissible
dismissIcon={{ 'aria-label': 'remove' }}
icon={<CalendarMonthRegular />}
secondaryText="Secondary text"
>
Rounded
</Tag>
<Tag shape="circular" dismissible icon={<CalendarMonthRegular />} secondaryText="Secondary text">
<Tag
shape="circular"
dismissible
dismissIcon={{ 'aria-label': 'remove' }}
icon={<CalendarMonthRegular />}
secondaryText="Secondary text"
>
Circular
</Tag>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,29 +20,46 @@ export const Size = () => {
const styles = useContainerStyles();
return (
<div className={styles.outerWrapper}>
{/* medium */}
<div className={styles.innerWrapper}>
<Tag>Medium</Tag>
<Tag dismissible media={<Avatar name="Katri Athokas" badge={{ status: 'busy' }} />}>
<Tag
dismissible
dismissIcon={{ 'aria-label': 'remove' }}
media={<Avatar name="Katri Athokas" badge={{ status: 'busy' }} />}
>
Medium dismissible
</Tag>
<Tag icon={<CalendarMonthRegular />} shape="circular">
Medium circular
</Tag>
</div>

{/* small */}
<div className={styles.innerWrapper}>
<Tag size="small">Small</Tag>

<Tag dismissible size="small" media={<Avatar name="Katri Athokas" badge={{ status: 'busy' }} />}>
<Tag
dismissible
dismissIcon={{ 'aria-label': 'remove' }}
size="small"
media={<Avatar name="Katri Athokas" badge={{ status: 'busy' }} />}
>
Small dismissible
</Tag>
<Tag size="small" icon={<CalendarMonthRegular />} shape="circular">
Small circular
</Tag>
</div>

{/* extra-small */}
<div className={styles.innerWrapper}>
<Tag size="extra-small">Extra small</Tag>

<Tag dismissible size="extra-small" media={<Avatar name="Katri Athokas" badge={{ status: 'busy' }} />}>
<Tag
dismissible
dismissIcon={{ 'aria-label': 'remove' }}
size="extra-small"
media={<Avatar name="Katri Athokas" badge={{ status: 'busy' }} />}
>
Extra small dismissible
</Tag>
<Tag size="extra-small" icon={<CalendarMonthRegular />} shape="circular">
Expand Down

0 comments on commit b7191ef

Please sign in to comment.