Skip to content

Commit ca57590

Browse files
committed
Small fixes to menu button
1 parent bfc5260 commit ca57590

File tree

3 files changed

+55
-26
lines changed

3 files changed

+55
-26
lines changed

packages/react/src/Breadcrumbs/Breadcrumbs.features.stories.tsx

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,13 @@ export const OverflowMenu = () => (
3838

3939
export const OverflowMenuShowRoot = () => (
4040
<Breadcrumbs overflow="menu" hideRoot={false}>
41-
<Breadcrumbs.Item href="#">Home</Breadcrumbs.Item>
42-
<Breadcrumbs.Item href="#">Products</Breadcrumbs.Item>
43-
<Breadcrumbs.Item href="#">Category</Breadcrumbs.Item>
44-
<Breadcrumbs.Item href="#">Subcategory</Breadcrumbs.Item>
45-
<Breadcrumbs.Item href="#">Item</Breadcrumbs.Item>
46-
<Breadcrumbs.Item href="#">Details</Breadcrumbs.Item>
41+
<Breadcrumbs.Item href="#">github</Breadcrumbs.Item>
42+
<Breadcrumbs.Item href="#">Teams</Breadcrumbs.Item>
43+
<Breadcrumbs.Item href="#">Engineering</Breadcrumbs.Item>
44+
<Breadcrumbs.Item href="#">core-productivity</Breadcrumbs.Item>
45+
<Breadcrumbs.Item href="#">collaboration-workflows-flex</Breadcrumbs.Item>
4746
<Breadcrumbs.Item href="#" selected>
48-
Current Page
47+
global-navigation-reviewers
4948
</Breadcrumbs.Item>
5049
</Breadcrumbs>
5150
)

packages/react/src/Breadcrumbs/Breadcrumbs.module.css

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,17 @@
1313
[data-overflow='menu'] .BreadcrumbsList {
1414
white-space: nowrap;
1515
overflow: hidden;
16+
display: flex;
17+
flex-direction: row;
18+
}
19+
20+
[data-overflow='menu'] .BreadcrumbsItem {
21+
display: inline-grid;
22+
grid-auto-flow: column;
23+
align-items: center;
1624
}
1725

18-
.ItemWrapper {
26+
.BreadcrumbsItem {
1927
display: inline-block;
2028
font-size: var(--text-body-size-medium);
2129
white-space: nowrap;
@@ -25,7 +33,7 @@
2533
display: inline-block;
2634
height: 0.8em;
2735
/* stylelint-disable-next-line primer/spacing */
28-
margin: 0 0.5em;
36+
margin: 0.25em 0.5em 0 0.5em;
2937
font-size: var(--text-body-size-medium);
3038
content: '';
3139
/* stylelint-disable-next-line primer/borders, primer/colors */
@@ -66,9 +74,6 @@
6674
}
6775

6876
.MenuButton {
69-
display: inline-flex;
70-
align-items: flex-end;
71-
justify-content: center;
72-
height: 0.75rem;
7377
color: var(--fgColor-link);
78+
padding-top: 4px;
7479
}

packages/react/src/Breadcrumbs/Breadcrumbs.tsx

Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,9 @@ const getValidChildren = (children: React.ReactNode) => {
8181

8282
function Breadcrumbs({className, children, sx: sxProp, overflow = 'wrap', hideRoot = true}: BreadcrumbsProps) {
8383
const containerRef = useRef<HTMLElement>(null)
84+
const menuButtonRef = useRef<HTMLButtonElement>(null)
8485
const [effectiveHideRoot, setEffectiveHideRoot] = useState<boolean>(hideRoot)
85-
let effectiveOverflow = 'wrap'
86+
//let effectiveOverflow = 'wrap'
8687
const childArray = useMemo(() => getValidChildren(children), [children])
8788

8889
const rootItem = childArray[0]
@@ -93,9 +94,13 @@ function Breadcrumbs({className, children, sx: sxProp, overflow = 'wrap', hideRo
9394
const [menuItems, setMenuItems] = useState<React.ReactElement[]>([])
9495
const [rootItemWidth, setRootItemWidth] = useState<number>(0)
9596

96-
if (typeof window !== 'undefined') {
97-
effectiveOverflow = overflow
98-
}
97+
// Menu button width with fallback
98+
const MENU_BUTTON_FALLBACK_WIDTH = 32 // Design system small IconButton
99+
const [menuButtonWidth, setMenuButtonWidth] = useState(MENU_BUTTON_FALLBACK_WIDTH)
100+
101+
// if (typeof window !== 'undefined') {
102+
// effectiveOverflow = overflow
103+
// }
99104
const MIN_VISIBLE_ITEMS = !effectiveHideRoot ? 3 : 4
100105

101106
useEffect(() => {
@@ -108,9 +113,19 @@ function Breadcrumbs({className, children, sx: sxProp, overflow = 'wrap', hideRo
108113
}
109114
}, [childArray.length])
110115

116+
// Measure actual menu button width when it exists
117+
useEffect(() => {
118+
if (menuButtonRef.current) {
119+
const measuredWidth = menuButtonRef.current.offsetWidth
120+
if (measuredWidth > 0) {
121+
setMenuButtonWidth(measuredWidth)
122+
}
123+
}
124+
}, [menuItems.length]) // Re-measure when menu button appears/disappears
125+
111126
const calculateOverflow = useCallback(
112127
(availableWidth: number) => {
113-
const MENU_BUTTON_WIDTH = 50 // Approximate width of "..." button
128+
const MENU_BUTTON_WIDTH = menuButtonWidth // Use measured width with fallback
114129

115130
const calculateVisibleItemsWidth = (w: number[]) => {
116131
const widths = w.reduce((sum, width) => sum + width + 16, 0)
@@ -165,7 +180,16 @@ function Breadcrumbs({className, children, sx: sxProp, overflow = 'wrap', hideRo
165180
effectiveHideRoot: eHideRoot,
166181
}
167182
},
168-
[MIN_VISIBLE_ITEMS, childArray, childArrayWidths, effectiveHideRoot, hideRoot, overflow, rootItemWidth],
183+
[
184+
MIN_VISIBLE_ITEMS,
185+
childArray,
186+
childArrayWidths,
187+
effectiveHideRoot,
188+
hideRoot,
189+
overflow,
190+
rootItemWidth,
191+
menuButtonWidth,
192+
],
169193
)
170194

171195
const handleResize = useCallback(
@@ -197,9 +221,9 @@ function Breadcrumbs({className, children, sx: sxProp, overflow = 'wrap', hideRo
197221

198222
// Determine final children to render
199223
const finalChildren = React.useMemo(() => {
200-
if (effectiveOverflow === 'wrap' || menuItems.length === 0) {
224+
if (overflow === 'wrap' || menuItems.length === 0) {
201225
return visibleItems.map((child, index) => (
202-
<li className={classes.ItemWrapper} key={`visible + ${index}`}>
226+
<li className={classes.BreadcrumbsItem} key={`visible + ${index}`}>
203227
{child}
204228
</li>
205229
))
@@ -210,22 +234,23 @@ function Breadcrumbs({className, children, sx: sxProp, overflow = 'wrap', hideRo
210234
effectiveMenuItems = [...menuItems.slice(1)]
211235
}
212236
const menuElement = (
213-
<li className={classes.ItemWrapper} key="breadcrumbs-menu">
237+
<li className={classes.BreadcrumbsItem} key="breadcrumbs-menu">
214238
<BreadcrumbsMenuItem
239+
ref={menuButtonRef}
215240
items={effectiveMenuItems}
216241
aria-label={`${effectiveMenuItems.length} more breadcrumb items`}
217242
/>
218243
</li>
219244
)
220245

221246
const visibleElements = visibleItems.map((child, index) => (
222-
<li className={classes.ItemWrapper} key={`visible + ${index}`}>
247+
<li className={classes.BreadcrumbsItem} key={`visible + ${index}`}>
223248
{child}
224249
</li>
225250
))
226251

227252
const rootElement = (
228-
<li className={classes.ItemWrapper} key={`rootElement`}>
253+
<li className={classes.BreadcrumbsItem} key={`rootElement`}>
229254
{rootItem}
230255
</li>
231256
)
@@ -238,7 +263,7 @@ function Breadcrumbs({className, children, sx: sxProp, overflow = 'wrap', hideRo
238263
// Show: [root breadcrumb, overflow menu, leaf breadcrumb]
239264
return [rootElement, menuElement, ...visibleElements]
240265
}
241-
}, [effectiveOverflow, menuItems, visibleItems, rootItem, effectiveHideRoot])
266+
}, [overflow, menuItems, effectiveHideRoot, visibleItems, rootItem])
242267

243268
return (
244269
<BoxWithFallback
@@ -247,7 +272,7 @@ function Breadcrumbs({className, children, sx: sxProp, overflow = 'wrap', hideRo
247272
aria-label="Breadcrumbs"
248273
sx={sxProp}
249274
ref={containerRef}
250-
data-overflow={effectiveOverflow}
275+
data-overflow={overflow}
251276
>
252277
<BreadcrumbsList>{finalChildren}</BreadcrumbsList>
253278
</BoxWithFallback>

0 commit comments

Comments
 (0)