Skip to content

Commit

Permalink
Added VR tests, did some clean up
Browse files Browse the repository at this point in the history
  • Loading branch information
ValentinaKozlova committed Feb 12, 2025
1 parent b9e14fd commit b5b5bb9
Show file tree
Hide file tree
Showing 10 changed files with 125 additions and 178 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,40 @@ export const SizeExtraSmallWithMedia = () => (
</InteractionTag>
);

// selected
export const Selected = () => (
<InteractionTag selected>
<InteractionTagPrimary icon={<CalendarMonth />} hasSecondaryAction>
Primary Text
</InteractionTagPrimary>
<InteractionTagSecondary />
</InteractionTag>
);
export const SelectedHighContrast = getStoryVariant(Selected, HIGH_CONTRAST);
export const SelectedDarkMode = getStoryVariant(Selected, DARK_MODE);

export const OutlineSelected = () => (
<InteractionTag appearance="outline" selected>
<InteractionTagPrimary icon={<CalendarMonth />} hasSecondaryAction>
Primary Text
</InteractionTagPrimary>
<InteractionTagSecondary />
</InteractionTag>
);
export const OutlineSelectedHighContrast = getStoryVariant(OutlineSelected, HIGH_CONTRAST);
export const OutlineSelectedDarkMode = getStoryVariant(OutlineSelected, DARK_MODE);

export const BrandSelected = () => (
<InteractionTag appearance="brand" selected>
<InteractionTagPrimary icon={<CalendarMonth />} hasSecondaryAction>
Primary Text
</InteractionTagPrimary>
<InteractionTagSecondary />
</InteractionTag>
);
export const BrandSelectedHighContrast = getStoryVariant(BrandSelected, HIGH_CONTRAST);
export const BrandSelectedDarkMode = getStoryVariant(BrandSelected, DARK_MODE);

const useBoxSizingContainerStyles = makeStyles({
container: {
boxSizing: 'border-box',
Expand Down
25 changes: 25 additions & 0 deletions apps/vr-tests-react-components/src/stories/Tag/Tag.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -81,3 +81,28 @@ export const SizeExtraSmallWithMedia = () => (
Primary Text
</Tag>
);

// selected
export const Selected = () => (
<Tag selected dismissible icon={<CalendarMonth />}>
Primary Text
</Tag>
);
export const SelectedHighContrast = getStoryVariant(Selected, HIGH_CONTRAST);
export const SelectedDarkMode = getStoryVariant(Selected, DARK_MODE);

export const OutlineSelected = () => (
<Tag appearance="outline" selected dismissible icon={<CalendarMonth />}>
Primary Text
</Tag>
);
export const OutlineSelectedHighContrast = getStoryVariant(OutlineSelected, HIGH_CONTRAST);
export const OutlineSelectedDarkMode = getStoryVariant(OutlineSelected, DARK_MODE);

export const BrandSelected = () => (
<Tag appearance="brand" selected dismissible icon={<CalendarMonth />}>
Primary Text
</Tag>
);
export const BrandSelectedHighContrast = getStoryVariant(BrandSelected, HIGH_CONTRAST);
export const BrandSelectedDarkMode = getStoryVariant(BrandSelected, DARK_MODE);
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ export type InteractionTagPrimaryContextValues = TagAvatarContextValues;
// @public
export type InteractionTagPrimaryProps = ComponentProps<Partial<InteractionTagPrimarySlots>> & {
hasSecondaryAction?: boolean;
selected?: boolean;
};

// @public (undocumented)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,6 @@ export type InteractionTagPrimaryProps = ComponentProps<Partial<InteractionTagPr
* @default false
*/
hasSecondaryAction?: boolean;

/**
* An InteractionTag can be selected.
*
* @default false
*/
selected?: boolean;
};

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,15 +35,15 @@ export const useInteractionTagPrimary_unstable = (
shape,
size,
} = useInteractionTagContext_unstable();
const { hasSecondaryAction = false, selected = contextSelected ?? false } = props;
const { hasSecondaryAction = false } = props;

return {
appearance,
avatarShape: avatarShapeMap[shape],
avatarSize: avatarSizeMap[size],
disabled,
hasSecondaryAction,
selected,
selected: contextSelected ?? false,
shape,
size,

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -346,7 +346,7 @@ export const useTagStyles_unstable = (state: TagState): TagState => {
const primaryTextStyles = usePrimaryTextStyles();
const secondaryTextBaseClassName = useSecondaryTextBaseClassName();

const { shape, size, appearance = 'filled', selected } = state;
const { shape, size, appearance, selected } = state;

state.root.className = mergeClasses(
tagClassNames.root,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,173 +1,39 @@
import * as React from 'react';
import {
InteractionTag,
InteractionTagProps,
InteractionTagPrimary,
Avatar,
makeStyles,
InteractionTagSecondary,
TagGroup,
Button,
TagGroupProps,
Tooltip,
Popover,
PopoverSurface,
PopoverTrigger,
Link,
} from '@fluentui/react-components';
import { InteractionTag, InteractionTagPrimary, InteractionTagSecondary, makeStyles } from '@fluentui/react-components';
import { CalendarMonthRegular, CalendarMonthFilled, bundleIcon } from '@fluentui/react-icons';

const useStyles = makeStyles({
const CalendarMonth = bundleIcon(CalendarMonthFilled, CalendarMonthRegular);

const useContainerStyles = makeStyles({
container: {
columnGap: '10px',
display: 'flex',
flexDirection: 'column',
rowGap: '10px',
},
resetButton: {
width: 'fit-content',
},
popover: {
width: '360px',
maxWidth: '100%',
height: 'fit-content',
},
});

const CalendarMonth = bundleIcon(CalendarMonthFilled, CalendarMonthRegular);

const initialTags = [
{ value: '1', children: 'Tag 1' },
{ value: '2', children: 'Tag 2' },
{ value: '3', children: 'Tag 3' },
];

/**
* focus management for the reset button
*/
const useResetExample = (visibleTagsLength: number) => {
const resetButtonRef = React.useRef<HTMLButtonElement>(null);
const firstTagRef = React.useRef<HTMLButtonElement>(null);

const prevVisibleTagsLengthRef = React.useRef<number>(visibleTagsLength);
React.useEffect(() => {
if (visibleTagsLength === 0) {
resetButtonRef.current?.focus();
} else if (prevVisibleTagsLengthRef.current === 0) {
firstTagRef.current?.focus();
}
export const Selected = () => {
const styles = useContainerStyles();

prevVisibleTagsLengthRef.current = visibleTagsLength;
}, [visibleTagsLength]);

return { firstTagRef, resetButtonRef };
};
export const InteractionTagSelected = (props: Partial<InteractionTagProps>) => {
const [visibleTags, setVisibleTags] = React.useState(initialTags);
const removeItem: TagGroupProps['onDismiss'] = (_e, { value }) => {
setVisibleTags([...visibleTags].filter(tag => tag.value !== value));
};
const resetItems = () => setVisibleTags(initialTags);
const { firstTagRef, resetButtonRef } = useResetExample(visibleTags.length);

const styles = useStyles();
return (
<>
<h3>Selected</h3>
<div className={styles.container}>
<InteractionTag selected>
<InteractionTagPrimary icon={<CalendarMonth />} hasSecondaryAction>
filled
<InteractionTagPrimary secondaryText="appearance=filled" icon={<CalendarMonth />} hasSecondaryAction>
Selected
</InteractionTagPrimary>
<InteractionTagSecondary aria-label="remove" />
</InteractionTag>
<InteractionTag selected appearance="outline">
<InteractionTagPrimary icon={<CalendarMonth />} hasSecondaryAction>
outline
<InteractionTagPrimary secondaryText="appearance=outline" icon={<CalendarMonth />} hasSecondaryAction>
Selected
</InteractionTagPrimary>
<InteractionTagSecondary aria-label="remove" />
</InteractionTag>
<InteractionTag selected appearance="brand">
<InteractionTagPrimary icon={<CalendarMonth />} hasSecondaryAction>
brand
<InteractionTagPrimary secondaryText="appearance=brand" icon={<CalendarMonth />} hasSecondaryAction>
Selected
</InteractionTagPrimary>
<InteractionTagSecondary aria-label="remove" />
</InteractionTag>
<h3>Media</h3>
<InteractionTag selected>
<InteractionTagPrimary media={<Avatar name="Katri Athokas" badge={{ status: 'busy' }} />}>
Primary text
</InteractionTagPrimary>
</InteractionTag>
<h3>Secondary text</h3>
<InteractionTag selected>
<InteractionTagPrimary secondaryText="Secondary text">Primary text</InteractionTagPrimary>
</InteractionTag>
<h3>Dismiss</h3>
<div className={styles.container}>
{visibleTags.length !== 0 && (
<TagGroup onDismiss={removeItem} aria-label="Dismiss example">
{visibleTags.map((tag, index) => (
<InteractionTag selected appearance="outline" value={tag.value} key={tag.value}>
<InteractionTagPrimary hasSecondaryAction ref={index === 0 ? firstTagRef : null}>
{tag.children}
</InteractionTagPrimary>
<InteractionTagSecondary aria-label="remove" />
</InteractionTag>
))}
</TagGroup>
)}

<Button
onClick={resetItems}
ref={resetButtonRef}
disabled={visibleTags.length !== 0}
className={styles.resetButton}
size="small"
>
Reset the example
</Button>
</div>

<h3>Disabled</h3>
<InteractionTag selected disabled>
<InteractionTagPrimary secondaryText="appearance=filled" icon={<CalendarMonthRegular />} hasSecondaryAction>
Disabled
</InteractionTagPrimary>
<InteractionTagSecondary aria-label="remove" />
</InteractionTag>
<InteractionTag selected disabled appearance="outline">
<InteractionTagPrimary secondaryText="appearance=outline" icon={<CalendarMonthRegular />} hasSecondaryAction>
Disabled
</InteractionTagPrimary>
<InteractionTagSecondary aria-label="remove" />
</InteractionTag>
<InteractionTag selected disabled appearance="brand">
<InteractionTagPrimary secondaryText="appearance=brand" icon={<CalendarMonthRegular />} hasSecondaryAction>
Disabled
</InteractionTagPrimary>
<InteractionTagSecondary aria-label="remove" />
</InteractionTag>
<h3>Primary Action</h3>
<InteractionTag selected>
<Popover trapFocus>
<PopoverTrigger>
<InteractionTagPrimary hasSecondaryAction>Golden retriever</InteractionTagPrimary>
</PopoverTrigger>
<PopoverSurface className={styles.popover}>
<Link href="https://en.wikipedia.org/wiki/Golden_Retriever">Find out more on wiki</Link>
<ul>
<li>Size: Medium to large-sized dog breed. </li>
<li>
Coat: Luxurious double coat with a dense, water-repellent outer layer and a soft, dense undercoat.
</li>
<li>Color: Typically a luscious golden or cream color, with variations in shade.</li>
<li>Build: Sturdy and well-proportioned body with a friendly and intelligent expression.</li>
</ul>
</PopoverSurface>
</Popover>
<Tooltip content="dismiss" relationship="label">
<InteractionTagSecondary />
</Tooltip>
</InteractionTag>
</>
</div>
);
};
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ export { Size } from './InteractionTagSize.stories';
export { Appearance } from './InteractionTagAppearance.stories';
export { Disabled } from './InteractionTagDisabled.stories';
export { HasPrimaryAction } from './InteractionTagHasPrimaryAction.stories';
export { InteractionTagSelected } from './InteractionTagSelected.stories';
export { Selected } from './InteractionTagSelected.stories';

export default {
title: 'Components/Tag/InteractionTag',
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,48 @@
import * as React from 'react';
import { Tag, TagProps } from '@fluentui/react-components';
import { Tag, makeStyles } from '@fluentui/react-components';
import { CalendarMonthRegular } from '@fluentui/react-icons';

export const TagSelected = (props: Partial<TagProps>) => (
<>
<Tag {...props}>Primary text</Tag>
<Tag appearance="outline">Test</Tag>
<Tag appearance="brand">Test</Tag>
<h3>Selected</h3>
<Tag selected>Test</Tag>
<Tag appearance="outline" selected>
Test
</Tag>
<Tag appearance="brand" selected>
Test
</Tag>
</>
);
const useContainerStyles = makeStyles({
container: {
columnGap: '10px',
display: 'flex',
},
});

export const Selected = () => {
const styles = useContainerStyles();

return (
<div className={styles.container}>
<Tag
selected
secondaryText="appearance=filled"
icon={<CalendarMonthRegular />}
dismissible
dismissIcon={{ 'aria-label': 'remove' }}
>
Selected
</Tag>
<Tag
selected
secondaryText="appearance=outline"
appearance="outline"
icon={<CalendarMonthRegular />}
dismissible
dismissIcon={{ 'aria-label': 'remove' }}
>
Selected
</Tag>
<Tag
selected
secondaryText="appearance=brand"
appearance="brand"
icon={<CalendarMonthRegular />}
dismissible
dismissIcon={{ 'aria-label': 'remove' }}
>
Selected
</Tag>
</div>
);
};
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export { Shape } from './TagShape.stories';
export { Size } from './TagSize.stories';
export { Appearance } from './TagAppearance.stories';
export { Disabled } from './TagDisabled.stories';
export { TagSelected } from './TagSelected.stories';
export { Selected } from './TagSelected.stories';

export default {
title: 'Components/Tag/Tag',
Expand Down

0 comments on commit b5b5bb9

Please sign in to comment.