Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Make border around Avatar's badge transparent, not a solid color #27292

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
Copy link
Collaborator

@fabricteam fabricteam Mar 22, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🕵 fluentuiv9 Open the Visual Regressions report to inspect the 163 screenshots

✅ There was 0 screenshots added, 0 screenshots removed, 1740 screenshots unchanged, 0 screenshots with different dimensions and 163 screenshots with visible difference.

unknown 163 screenshots
Image Name Diff(in Pixels) Image Type
Avatar Converged.basic - Dark Mode.normal.chromium.png 3 Changed
Avatar Converged.basic - High Contrast.normal.chromium.png 9 Changed
Avatar Converged.basic - RTL.normal.chromium.png 34 Changed
Avatar Converged.basic.normal.chromium.png 6 Changed
Avatar Converged.customSize+name+badge.normal.chromium.png 83 Changed
Avatar Converged.size+icon+badge+square.normal.chromium.png 47 Changed
Avatar Converged.size+image+badge.normal.chromium.png 70 Changed
Avatar Converged.size+inactive+badge.normal.chromium.png 43 Changed
Persona Converged.basic - Dark Mode.normal.chromium.png 1 Changed
Persona Converged.basic - High Contrast.normal.chromium.png 5 Changed
Persona Converged.basic - RTL.normal.chromium.png 2 Changed
Persona Converged.basic.normal.chromium.png 3 Changed
Persona Converged.textWrap.normal.chromium.png 3 Changed
Table flex - subtle selection.rest.chromium.png 9 Changed
Table flex - subtle selection.rest.hover unselected row.chromium.png 9 Changed
Table layout flex - cell actions.always visible - Dark Mode.chromium.png 6 Changed
Table layout flex - cell actions.always visible - Dark Mode.hover row.chromium.png 7 Changed
Table layout flex - cell actions.always visible - High Contrast.chromium.png 19 Changed
Table layout flex - cell actions.always visible - High Contrast.hover row.chromium.png 33 Changed
Table layout flex - cell actions.always visible - RTL.chromium.png 9 Changed
Table layout flex - cell actions.always visible - RTL.hover row.chromium.png 8 Changed
Table layout flex - cell actions.always visible.chromium.png 9 Changed
Table layout flex - cell actions.always visible.hover row.chromium.png 9 Changed
Table layout flex - cell actions.default - Dark Mode.chromium.png 6 Changed
Table layout flex - cell actions.default - Dark Mode.hover row.chromium.png 7 Changed
Table layout flex - cell actions.default - High Contrast.chromium.png 19 Changed
Table layout flex - cell actions.default - High Contrast.hover row.chromium.png 33 Changed
Table layout flex - cell actions.default - RTL.chromium.png 9 Changed
Table layout flex - cell actions.default - RTL.hover row.chromium.png 8 Changed
Table layout flex - cell actions.default.chromium.png 9 Changed
Table layout flex - cell actions.default.hover row.chromium.png 9 Changed
Table layout flex - cell actions.in header cell.chromium.png 9 Changed
Table layout flex - cell actions.in header cell.hover row.chromium.png 9 Changed
Table layout flex - headers.sortable - Dark Mode.chromium.png 6 Changed
Table layout flex - headers.sortable - Dark Mode.hover header.chromium.png 6 Changed
Table layout flex - headers.sortable - Dark Mode.press header.chromium.png 6 Changed
Table layout flex - headers.sortable - High Contrast.chromium.png 19 Changed
Table layout flex - headers.sortable - High Contrast.hover header.chromium.png 19 Changed
Table layout flex - headers.sortable - High Contrast.press header.chromium.png 19 Changed
Table layout flex - headers.sortable.chromium.png 9 Changed
Table layout flex - headers.sortable.hover header.chromium.png 9 Changed
Table layout flex - headers.sortable.press header.chromium.png 9 Changed
Table layout flex - truncate.default (disabled).chromium.png 9 Changed
Table layout flex - truncate.false.chromium.png 9 Changed
Table layout flex - truncate.true.chromium.png 9 Changed
Table layout flex.multiselect (checked) - brand - Dark Mode.chromium.png 8 Changed
Table layout flex.multiselect (checked) - brand - High Contrast.chromium.png 111 Changed
Table layout flex.multiselect (checked) - brand - RTL.chromium.png 7 Changed
Table layout flex.multiselect (checked) - brand.chromium.png 11 Changed
Table layout flex.multiselect (checked) - neutral - Dark Mode.chromium.png 5 Changed
Table layout flex.multiselect (checked) - neutral - High Contrast.chromium.png 76 Changed
Table layout flex.multiselect (checked) - neutral - RTL.chromium.png 8 Changed
Table layout flex.multiselect (checked) - neutral.chromium.png 13 Changed
Table layout flex.multiselect (mixed) - brand - Dark Mode.chromium.png 7 Changed
Table layout flex.multiselect (mixed) - brand - High Contrast.chromium.png 65 Changed
Table layout flex.multiselect (mixed) - brand - RTL.chromium.png 8 Changed
Table layout flex.multiselect (mixed) - brand.chromium.png 10 Changed
Table layout flex.multiselect (mixed) - neutral - Dark Mode.chromium.png 6 Changed
Table layout flex.multiselect (mixed) - neutral - High Contrast.chromium.png 48 Changed
Table layout flex.multiselect (mixed) - neutral - RTL.chromium.png 9 Changed
Table layout flex.multiselect (mixed) - neutral.chromium.png 11 Changed
Table layout flex.multiselect - Dark Mode.chromium.png 6 Changed
Table layout flex.multiselect - High Contrast.chromium.png 19 Changed
Table layout flex.multiselect - RTL.chromium.png 9 Changed
Table layout flex.multiselect.chromium.png 9 Changed
Table layout flex.primary cell.chromium.png 9 Changed
Table layout flex.single select (checked) - Dark Mode.chromium.png 6 Changed
Table layout flex.single select (checked) - High Contrast.chromium.png 19 Changed
Table layout flex.single select (checked) - RTL.chromium.png 9 Changed
Table layout flex.single select (checked) - brand - Dark Mode.chromium.png 7 Changed
Table layout flex.single select (checked) - brand - High Contrast.chromium.png 42 Changed
Table layout flex.single select (checked) - brand - RTL.chromium.png 9 Changed
Table layout flex.single select (checked) - brand.chromium.png 10 Changed
Table layout flex.single select (checked) - neutral - Dark Mode.chromium.png 6 Changed
Table layout flex.single select (checked) - neutral - High Contrast.chromium.png 33 Changed
Table layout flex.single select (checked) - neutral - RTL.chromium.png 9 Changed
Table layout flex.single select (checked) - neutral.chromium.png 10 Changed
Table layout flex.single select (checked).chromium.png 9 Changed
Table layout flex.single select - Dark Mode.chromium.png 6 Changed
Table layout flex.single select - High Contrast.chromium.png 19 Changed
Table layout flex.single select - RTL.chromium.png 9 Changed
Table layout flex.single select.chromium.png 9 Changed
Table layout flex.size - extra small.chromium.png 7 Changed
Table layout flex.size - medium - Dark Mode.chromium.png 6 Changed
Table layout flex.size - medium - High Contrast.chromium.png 19 Changed
Table layout flex.size - medium - RTL.chromium.png 9 Changed
Table layout flex.size - medium.chromium.png 9 Changed
Table layout flex.size - small.chromium.png 7 Changed
Table layout table - cell actions.always visible - Dark Mode.chromium.png 6 Changed
Table layout table - cell actions.always visible - Dark Mode.hover row.chromium.png 7 Changed
Table layout table - cell actions.always visible - High Contrast.chromium.png 19 Changed
Table layout table - cell actions.always visible - High Contrast.hover row.chromium.png 33 Changed
Table layout table - cell actions.always visible - RTL.chromium.png 9 Changed
Table layout table - cell actions.always visible - RTL.hover row.chromium.png 8 Changed
Table layout table - cell actions.always visible.chromium.png 9 Changed
Table layout table - cell actions.always visible.hover row.chromium.png 9 Changed
Table layout table - cell actions.default - Dark Mode.chromium.png 6 Changed
Table layout table - cell actions.default - Dark Mode.hover row.chromium.png 7 Changed
Table layout table - cell actions.default - High Contrast.chromium.png 19 Changed
Table layout table - cell actions.default - High Contrast.hover row.chromium.png 33 Changed
Table layout table - cell actions.default - RTL.chromium.png 9 Changed
Table layout table - cell actions.default - RTL.hover row.chromium.png 8 Changed
Table layout table - cell actions.default.chromium.png 9 Changed
Table layout table - cell actions.default.hover row.chromium.png 9 Changed
Table layout table - cell actions.in header cell.chromium.png 9 Changed
Table layout table - cell actions.in header cell.hover row.chromium.png 9 Changed
Table layout table - headers.sortable - Dark Mode.chromium.png 6 Changed
Table layout table - headers.sortable - Dark Mode.hover header.chromium.png 6 Changed
Table layout table - headers.sortable - Dark Mode.press header.chromium.png 6 Changed
Table layout table - headers.sortable - High Contrast.chromium.png 19 Changed
Table layout table - headers.sortable - High Contrast.hover header.chromium.png 19 Changed
Table layout table - headers.sortable - High Contrast.press header.chromium.png 19 Changed
Table layout table - headers.sortable.chromium.png 9 Changed
Table layout table - headers.sortable.hover header.chromium.png 9 Changed
Table layout table - headers.sortable.press header.chromium.png 9 Changed
Table layout table - truncate.default (disabled).chromium.png 9 Changed
Table layout table - truncate.false.chromium.png 9 Changed
Table layout table - truncate.true.chromium.png 9 Changed
Table layout table.multiselect (checked) - brand - Dark Mode.chromium.png 8 Changed
Table layout table.multiselect (checked) - brand - High Contrast.chromium.png 111 Changed
Table layout table.multiselect (checked) - brand - RTL.chromium.png 7 Changed
Table layout table.multiselect (checked) - brand.chromium.png 11 Changed
Table layout table.multiselect (checked) - neutral - Dark Mode.chromium.png 5 Changed
Table layout table.multiselect (checked) - neutral - High Contrast.chromium.png 76 Changed
Table layout table.multiselect (checked) - neutral - RTL.chromium.png 8 Changed
Table layout table.multiselect (checked) - neutral.chromium.png 13 Changed
Table layout table.multiselect (mixed) - brand - Dark Mode.chromium.png 7 Changed
Table layout table.multiselect (mixed) - brand - High Contrast.chromium.png 65 Changed
Table layout table.multiselect (mixed) - brand - RTL.chromium.png 8 Changed
Table layout table.multiselect (mixed) - brand.chromium.png 10 Changed
Table layout table.multiselect (mixed) - neutral - Dark Mode.chromium.png 6 Changed
Table layout table.multiselect (mixed) - neutral - High Contrast.chromium.png 48 Changed
Table layout table.multiselect (mixed) - neutral - RTL.chromium.png 9 Changed
Table layout table.multiselect (mixed) - neutral.chromium.png 11 Changed
Table layout table.multiselect - Dark Mode.chromium.png 6 Changed
Table layout table.multiselect - High Contrast.chromium.png 19 Changed
Table layout table.multiselect - RTL.chromium.png 9 Changed
Table layout table.multiselect.chromium.png 9 Changed
Table layout table.primary cell.chromium.png 9 Changed
Table layout table.single select (checked) - Dark Mode.chromium.png 6 Changed
Table layout table.single select (checked) - High Contrast.chromium.png 19 Changed
Table layout table.single select (checked) - RTL.chromium.png 9 Changed
Table layout table.single select (checked) - brand - Dark Mode.chromium.png 7 Changed
Table layout table.single select (checked) - brand - High Contrast.chromium.png 42 Changed
Table layout table.single select (checked) - brand - RTL.chromium.png 9 Changed
Table layout table.single select (checked) - brand.chromium.png 10 Changed
Table layout table.single select (checked) - neutral - Dark Mode.chromium.png 6 Changed
Table layout table.single select (checked) - neutral - High Contrast.chromium.png 33 Changed
Table layout table.single select (checked) - neutral - RTL.chromium.png 9 Changed
Table layout table.single select (checked) - neutral.chromium.png 10 Changed
Table layout table.single select (checked).chromium.png 9 Changed
Table layout table.single select - Dark Mode.chromium.png 6 Changed
Table layout table.single select - High Contrast.chromium.png 19 Changed
Table layout table.single select - RTL.chromium.png 9 Changed
Table layout table.single select.chromium.png 9 Changed
Table layout table.size - extra small.chromium.png 7 Changed
Table layout table.size - medium - Dark Mode.chromium.png 6 Changed
Table layout table.size - medium - High Contrast.chromium.png 19 Changed
Table layout table.size - medium - RTL.chromium.png 9 Changed
Table layout table.size - medium.chromium.png 9 Changed
Table layout table.size - small.chromium.png 7 Changed
Table table - subtle selection.rest.chromium.png 9 Changed
Table table - subtle selection.rest.hover unselected row.chromium.png 9 Changed

"type": "patch",
"comment": "fix: Make border around badge transparent, not a solid color",
"packageName": "@fluentui/react-avatar",
"email": "behowell@microsoft.com",
"dependentChangeType": "patch"
}
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ export const useAvatar_unstable = (props: AvatarProps, ref: React.Ref<HTMLElemen

const badge: AvatarState['badge'] = resolveShorthand(props.badge, {
defaultProps: {
size: getBadgeSize(size),
size: getBadgeSize(size).name,
id: baseId + '__badge',
},
});
Expand Down Expand Up @@ -152,19 +152,19 @@ export const useAvatar_unstable = (props: AvatarProps, ref: React.Ref<HTMLElemen
};
};

const getBadgeSize = (size: AvatarState['size']) => {
export const getBadgeSize = (size: AvatarState['size']) => {
if (size >= 96) {
return 'extra-large';
return { name: 'extra-large', value: 28 } as const;
} else if (size >= 64) {
return 'large';
return { name: 'large', value: 20 } as const;
} else if (size >= 56) {
return 'medium';
return { name: 'medium', value: 16 } as const;
} else if (size >= 40) {
return 'small';
return { name: 'small', value: 12 } as const;
} else if (size >= 28) {
return 'extra-small';
return { name: 'extra-small', value: 10 } as const;
} else {
return 'tiny';
return { name: 'tiny', value: 6 } as const;
}
};

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { makeResetStyles, makeStyles, mergeClasses, shorthands } from '@griffel/react';
import { tokens } from '@fluentui/react-theme';
import type { AvatarSlots, AvatarState } from './Avatar.types';
import type { SlotClassNames } from '@fluentui/react-utilities';
import { makeResetStyles, makeStyles, mergeClasses, shorthands } from '@griffel/react';
import type { AvatarSize, AvatarSlots, AvatarState } from './Avatar.types';
import { getBadgeSize } from './useAvatar';

export const avatarClassNames: SlotClassNames<AvatarSlots> = {
root: 'fui-Avatar',
Expand All @@ -23,6 +24,24 @@ const animations = {
nullEasing: tokens.curveLinear,
};

const badgeBorderClip = (size: AvatarSize) => {
const radius = getBadgeSize(size).value / 2;
const width = size >= 64 ? /*tokens.strokeWidthThick =*/ 2 : /*tokens.strokeWidthThin =*/ 1;

// This path will clip out ONLY the outline around the badge.
// It is a large square with a donut punched out that surrounds the badge.
return (
'path("' +
// A box that has a {size} margin around the avatar. The margin is to avoid clipping the ring and/or shadow.
`M -${size},-${size} H ${2 * size} V ${2 * size} H -${size} V -${size} ` +
// A circle that is the size of the badge.
`M ${size},${size - radius} a ${radius} ${radius} 0 1 0 0,0.1 ` +
// A circle that is bigger than the badge by the width of the line.
`m ${width},0 a ${radius + width} ${radius + width} 0 1 0 0,0.1 ` +
'Z")'
);
};

const useRootClassName = makeResetStyles({
display: 'inline-block',
flexShrink: 0,
Expand Down Expand Up @@ -174,15 +193,25 @@ const useStyles = makeStyles({
},
},

'badgeBorderClip-16': { clipPath: badgeBorderClip(16) },
'badgeBorderClip-20': { clipPath: badgeBorderClip(20) },
'badgeBorderClip-24': { clipPath: badgeBorderClip(24) },
'badgeBorderClip-28': { clipPath: badgeBorderClip(28) },
'badgeBorderClip-32': { clipPath: badgeBorderClip(32) },
'badgeBorderClip-36': { clipPath: badgeBorderClip(36) },
'badgeBorderClip-40': { clipPath: badgeBorderClip(40) },
'badgeBorderClip-48': { clipPath: badgeBorderClip(48) },
'badgeBorderClip-56': { clipPath: badgeBorderClip(56) },
'badgeBorderClip-64': { clipPath: badgeBorderClip(64) },
'badgeBorderClip-72': { clipPath: badgeBorderClip(72) },
'badgeBorderClip-96': { clipPath: badgeBorderClip(96) },
'badgeBorderClip-120': { clipPath: badgeBorderClip(120) },
'badgeBorderClip-128': { clipPath: badgeBorderClip(128) },

badge: {
position: 'absolute',
bottom: 0,
right: 0,
boxShadow: `0 0 0 ${tokens.strokeWidthThin} ${tokens.colorNeutralBackground1}`,
},

badgeLarge: {
boxShadow: `0 0 0 ${tokens.strokeWidthThick} ${tokens.colorNeutralBackground1}`,
},

icon12: { fontSize: '12px' },
Expand Down Expand Up @@ -446,15 +475,14 @@ export const useAvatarStyles_unstable = (state: AvatarState): AvatarState => {
}
}

if (state.badge) {
rootClasses.push(styles[`badgeBorderClip-${size}`]);
}

state.root.className = mergeClasses(avatarClassNames.root, ...rootClasses, state.root.className);

if (state.badge) {
state.badge.className = mergeClasses(
avatarClassNames.badge,
styles.badge,
size >= 64 && styles.badgeLarge,
state.badge.className,
);
state.badge.className = mergeClasses(avatarClassNames.badge, styles.badge, state.badge.className);
}

if (state.image) {
Expand Down