Skip to content

Commit 039d87e

Browse files
Breadcrumb design team fixes (#28883)
* Breadcrumb fixes after design review * Disabled link * generated api * changed files
1 parent 60df647 commit 039d87e

14 files changed

+36
-205
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"type": "patch",
3+
"comment": "fix: breadcrumb spacing",
4+
"packageName": "@fluentui/react-breadcrumb-preview",
5+
"email": "[email protected]",
6+
"dependentChangeType": "patch"
7+
}

packages/react-components/react-breadcrumb-preview/etc/react-breadcrumb-preview.api.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,9 @@ export type BreadcrumbItemSlots = {
7575
};
7676

7777
// @public
78-
export type BreadcrumbItemState = ComponentState<BreadcrumbItemSlots> & Required<Pick<BreadcrumbItemProps, 'size' | 'current'>>;
78+
export type BreadcrumbItemState = ComponentState<BreadcrumbItemSlots> & Required<Pick<BreadcrumbItemProps, 'size' | 'current'>> & {
79+
isInteractive?: boolean;
80+
};
7981

8082
// @public
8183
export const BreadcrumbLink: ForwardRefComponent<BreadcrumbLinkProps>;

packages/react-components/react-breadcrumb-preview/src/components/BreadcrumbButton/useBreadcrumbButtonStyles.styles.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,21 +27,23 @@ const defaultButtonStyles = {
2727
};
2828
const useStyles = makeStyles({
2929
root: {
30-
...shorthands.padding(tokens.spacingHorizontalNone),
3130
minWidth: 'unset',
3231
textWrap: 'nowrap',
3332
},
3433
small: {
3534
height: '24px',
3635
...typographyStyles.caption1,
36+
...shorthands.padding(tokens.spacingHorizontalSNudge),
3737
},
3838
medium: {
3939
height: '32px',
4040
...typographyStyles.body1,
41+
...shorthands.padding(tokens.spacingHorizontalSNudge),
4142
},
4243
large: {
4344
height: '40px',
4445
...typographyStyles.body2,
46+
...shorthands.padding(tokens.spacingHorizontalS),
4547
},
4648
current: {
4749
':hover': {

packages/react-components/react-breadcrumb-preview/src/components/BreadcrumbItem/BreadcrumbItem.types.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,7 @@ export type BreadcrumbItemProps = ComponentProps<BreadcrumbItemSlots> &
2727
* State used in rendering BreadcrumbItem
2828
*/
2929
export type BreadcrumbItemState = ComponentState<BreadcrumbItemSlots> &
30-
Required<Pick<BreadcrumbItemProps, 'size' | 'current'>>;
30+
Required<Pick<BreadcrumbItemProps, 'size' | 'current'>> & {
31+
// TODO add description
32+
isInteractive?: boolean;
33+
};

packages/react-components/react-breadcrumb-preview/src/components/BreadcrumbItem/useBreadcrumbItem.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ export const useBreadcrumbItem_unstable = (
1919
const { size } = useBreadcrumbContext_unstable();
2020
const { current = false, icon } = props;
2121

22+
const isInteractive = typeof props.children === 'object';
23+
2224
const iconSlot = slot.optional(icon, { elementType: 'span' });
2325
return {
2426
components: { root: 'li', icon: 'span' },
@@ -32,5 +34,6 @@ export const useBreadcrumbItem_unstable = (
3234
size,
3335
current,
3436
icon: iconSlot,
37+
isInteractive,
3538
};
3639
};

packages/react-components/react-breadcrumb-preview/src/components/BreadcrumbItem/useBreadcrumbItemStyles.styles.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ const useStyles = makeStyles({
4747
currentLarge: {
4848
...typographyStyles.subtitle2,
4949
},
50+
noSpacing: {
51+
...shorthands.padding(0),
52+
},
5053
});
5154

5255
const useIconStyles = makeStyles({
@@ -82,11 +85,15 @@ export const useBreadcrumbItemStyles_unstable = (state: BreadcrumbItemState): Br
8285
medium: styles.currentMedium,
8386
large: styles.currentLarge,
8487
};
88+
const noSpacingStyle =
89+
state.isInteractive || (!state.isInteractive && state.size === 'small') ? styles.noSpacing : '';
90+
8591
state.root.className = mergeClasses(
8692
breadcrumbItemClassNames.root,
8793
styles.root,
8894
styles[size],
8995
state.current && currentSizeMap[size],
96+
noSpacingStyle,
9097
state.root.className,
9198
);
9299

packages/react-components/react-breadcrumb-preview/src/components/BreadcrumbLink/useBreadcrumbLinkStyles.styles.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,17 @@ const useStyles = makeStyles({
3232
small: {
3333
height: '24px',
3434
...typographyStyles.caption1,
35+
...shorthands.padding(tokens.spacingHorizontalSNudge),
3536
},
3637
medium: {
3738
height: '32px',
3839
...typographyStyles.body1,
40+
...shorthands.padding(tokens.spacingHorizontalSNudge),
3941
},
4042
large: {
4143
height: '40px',
4244
...typographyStyles.body2,
45+
...shorthands.padding(tokens.spacingHorizontalS),
4346
},
4447
overflow: {
4548
...shorthands.padding(tokens.spacingHorizontalSNudge),

packages/react-components/react-breadcrumb-preview/stories/Breadcrumb/BreadcrumbDefault.stories.tsx

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import {
55
BreadcrumbDivider,
66
BreadcrumbProps,
77
BreadcrumbButton,
8-
BreadcrumbLink,
98
} from '@fluentui/react-breadcrumb-preview';
109
import { RadioGroup, Radio, Label } from '@fluentui/react-components';
1110
type Item = {
@@ -53,18 +52,6 @@ function renderButton(item: Item) {
5352
);
5453
}
5554

56-
function renderLink(item: Item) {
57-
const isLastItem = items.length - 1 === item.key;
58-
return (
59-
<React.Fragment key={`item-${item.key}`}>
60-
<BreadcrumbItem current={isLastItem}>
61-
<BreadcrumbLink>{item.value}</BreadcrumbLink>
62-
</BreadcrumbItem>
63-
{!isLastItem && <BreadcrumbDivider />}
64-
</React.Fragment>
65-
);
66-
}
67-
6855
export const Default = () => {
6956
const [size, setSize] = React.useState('medium' as BreadcrumbProps['size']);
7057
const [breadcrumbType, setBreadcrumbType] = React.useState('item');
@@ -91,16 +78,14 @@ export const Default = () => {
9178
value={breadcrumbType}
9279
onChange={(_, data) => setBreadcrumbType(data.value)}
9380
>
94-
<Radio value="item" label="Item" />
81+
<Radio value="item" label="Non-interactive item" />
9582
<Radio value="button" label="Button" />
96-
<Radio value="link" label="Link" />
9783
</RadioGroup>
9884
</div>
9985
</div>
10086
<Breadcrumb aria-label="Small Breadcrumb" size={size}>
10187
{breadcrumbType === 'item' && items.map(item => renderItem(item))}
10288
{breadcrumbType === 'button' && items.map(item => renderButton(item))}
103-
{breadcrumbType === 'link' && items.map(item => renderLink(item))}
10489
</Breadcrumb>
10590
</>
10691
);

packages/react-components/react-breadcrumb-preview/stories/Breadcrumb/BreadcrumbSize.stories.tsx

Lines changed: 5 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import {
55
BreadcrumbDivider,
66
BreadcrumbProps,
77
BreadcrumbButton,
8-
BreadcrumbLink,
98
} from '@fluentui/react-breadcrumb-preview';
109
import { RadioGroup, Radio, Label } from '@fluentui/react-components';
1110

@@ -54,24 +53,12 @@ function renderButton(item: Item) {
5453
);
5554
}
5655

57-
function renderLink(item: Item) {
58-
const isLastItem = items.length - 1 === item.key;
59-
return (
60-
<React.Fragment key={`link-item-${item.key}`}>
61-
<BreadcrumbItem current={isLastItem}>
62-
<BreadcrumbLink>{item.value}</BreadcrumbLink>
63-
</BreadcrumbItem>
64-
{!isLastItem && <BreadcrumbDivider />}
65-
</React.Fragment>
66-
);
67-
}
68-
6956
export const BreadcrumbSize = () => {
7057
const [dividerType, setDividerType] = React.useState('chevron' as BreadcrumbProps['dividerType']);
7158
return (
7259
<>
7360
Only small breadcrumbs can have `slash` divider.
74-
<h2>Small</h2>
61+
<h3>Small</h3>
7562
<Label>Divider type</Label>
7663
<RadioGroup
7764
aria-labelledby="radio-group-divider"
@@ -81,33 +68,22 @@ export const BreadcrumbSize = () => {
8168
<Radio value="slash" label="Slash" />
8269
<Radio value="chevron" label="Chevron" />
8370
</RadioGroup>
71+
<h4>Non-interactive item</h4>
8472
<Breadcrumb aria-label="Small breadcrumb example with slashes" size="small" dividerType={dividerType}>
8573
{items.map(item => renderItem(item, 'small'))}
8674
</Breadcrumb>
75+
<h4>Breadcrumb with buttons</h4>
8776
<Breadcrumb aria-label="Small breadcrumb example with buttons" size="small">
8877
{items.map(item => renderButton(item))}
8978
</Breadcrumb>
90-
<Breadcrumb aria-label="Small breadcrumb example with links" size="small">
91-
{items.map(item => renderLink(item))}
92-
</Breadcrumb>
93-
<h2>Medium</h2>
94-
<Breadcrumb aria-label="Default breadcrumb">{items.map(item => renderItem(item, 'medium'))}</Breadcrumb>
79+
<h3>Medium</h3>
9580
<Breadcrumb aria-label="Medium breadcrumb example with buttons" size="medium">
9681
{items.map(item => renderButton(item))}
9782
</Breadcrumb>
98-
<Breadcrumb aria-label="Medium breadcrumb example with links" size="medium">
99-
{items.map(item => renderLink(item))}
100-
</Breadcrumb>
101-
<h2>Large</h2>
102-
<Breadcrumb aria-label="Large breadcrumb" size="large">
103-
{items.map(item => renderItem(item, 'large'))}
104-
</Breadcrumb>
83+
<h3>Large</h3>
10584
<Breadcrumb aria-label="Large breadcrumb example with buttons" size="large">
10685
{items.map(item => renderButton(item))}
10786
</Breadcrumb>
108-
<Breadcrumb aria-label="Large breadcrumb example with links" size="large">
109-
{items.map(item => renderLink(item))}
110-
</Breadcrumb>
11187
</>
11288
);
11389
};

packages/react-components/react-breadcrumb-preview/stories/Breadcrumb/index.stories.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import bestPracticesMd from './BreadcrumbBestPractices.md';
66
export { Default } from './BreadcrumbDefault.stories';
77
export { BreadcrumbSize } from './BreadcrumbSize.stories';
88
export { BreadcrumbWithOverflow } from './BreadcrumbWithOverflow.stories';
9-
export { BreadcrumbLinkWithOverflow } from './BreadcrumbLinkWithOverflow.stories';
109
export { BreadcrumbItemWithOverflow } from './BreadcrumbItemWithOverflow.stories';
1110
export { BreadcrumbFocusMode } from './BreadcrumbFocusMode.stories';
1211

0 commit comments

Comments
 (0)