diff --git a/.changeset/fast-pugs-camp.md b/.changeset/fast-pugs-camp.md new file mode 100644 index 00000000000..31a8ce872ff --- /dev/null +++ b/.changeset/fast-pugs-camp.md @@ -0,0 +1,5 @@ +--- +'@primer/react': patch +--- + +Breadcrumbs: On narrow viewports, only show the current page breadcrumb and the overflow menu when `overflow="menu"` is set. diff --git a/.playwright/snapshots/components/Breadcrumbs.test.ts-snapshots/Breadcrumbs-OverflowMenu-narrow-linux.png b/.playwright/snapshots/components/Breadcrumbs.test.ts-snapshots/Breadcrumbs-OverflowMenu-narrow-linux.png new file mode 100644 index 00000000000..8e7c3ae7e18 Binary files /dev/null and b/.playwright/snapshots/components/Breadcrumbs.test.ts-snapshots/Breadcrumbs-OverflowMenu-narrow-linux.png differ diff --git a/.playwright/snapshots/components/Breadcrumbs.test.ts-snapshots/Breadcrumbs-OverflowMenu-wide-linux.png b/.playwright/snapshots/components/Breadcrumbs.test.ts-snapshots/Breadcrumbs-OverflowMenu-wide-linux.png new file mode 100644 index 00000000000..2d363b03fd6 Binary files /dev/null and b/.playwright/snapshots/components/Breadcrumbs.test.ts-snapshots/Breadcrumbs-OverflowMenu-wide-linux.png differ diff --git a/.playwright/snapshots/components/Breadcrumbs.test.ts-snapshots/Breadcrumbs-OverflowMenuWithRoot-narrow-linux.png b/.playwright/snapshots/components/Breadcrumbs.test.ts-snapshots/Breadcrumbs-OverflowMenuWithRoot-narrow-linux.png new file mode 100644 index 00000000000..2c0343f7a5a Binary files /dev/null and b/.playwright/snapshots/components/Breadcrumbs.test.ts-snapshots/Breadcrumbs-OverflowMenuWithRoot-narrow-linux.png differ diff --git a/e2e/components/Breadcrumbs.test.ts b/e2e/components/Breadcrumbs.test.ts index 682dcfbdca7..d43b91c85c9 100644 --- a/e2e/components/Breadcrumbs.test.ts +++ b/e2e/components/Breadcrumbs.test.ts @@ -1,6 +1,7 @@ import {test, expect} from '@playwright/test' import {visit} from '../test-helpers/storybook' import {themes} from '../test-helpers/themes' +import {viewports} from '../test-helpers/viewports' const stories = [ { @@ -37,4 +38,44 @@ test.describe('Breadcrumbs', () => { } }) } + + test.describe('Overflow Menu', () => { + test('narrow viewport @vrt', async ({page}) => { + await visit(page, { + id: 'components-breadcrumbs-features--overflow-menu', + globals: { + colorScheme: 'light', + }, + }) + + await page.setViewportSize({width: viewports['primer.breakpoint.xs'] - 1, height: 768}) + await expect(page).toHaveScreenshot('Breadcrumbs.OverflowMenu.narrow.png') + }) + + test('wide viewport @vrt', async ({page}) => { + await visit(page, { + id: 'components-breadcrumbs-features--overflow-menu', + globals: { + colorScheme: 'light', + }, + }) + + await page.setViewportSize({width: viewports['primer.breakpoint.md'], height: 768}) + await expect(page).toHaveScreenshot('Breadcrumbs.OverflowMenu.wide.png') + }) + }) + + test.describe('Overflow Menu With Root', () => { + test('narrow viewport @vrt', async ({page}) => { + await visit(page, { + id: 'components-breadcrumbs-features--overflow-menu-with-root', + globals: { + colorScheme: 'light', + }, + }) + + await page.setViewportSize({width: viewports['primer.breakpoint.xs'] - 1, height: 768}) + await expect(page).toHaveScreenshot('Breadcrumbs.OverflowMenuWithRoot.narrow.png') + }) + }) }) diff --git a/packages/react/src/Breadcrumbs/Breadcrumbs.tsx b/packages/react/src/Breadcrumbs/Breadcrumbs.tsx index 0c773807d04..46f4847ff30 100644 --- a/packages/react/src/Breadcrumbs/Breadcrumbs.tsx +++ b/packages/react/src/Breadcrumbs/Breadcrumbs.tsx @@ -189,7 +189,9 @@ function Breadcrumbs({className, children, style, overflow = 'wrap', variant = ' (availableWidth: number) => { let eHideRoot = effectiveHideRoot const MENU_BUTTON_WIDTH = menuButtonWidth - const MIN_VISIBLE_ITEMS = !eHideRoot ? 3 : 4 + const NARROW_BREAKPOINT = 544 + const isNarrow = availableWidth < NARROW_BREAKPOINT + const MIN_VISIBLE_ITEMS = isNarrow && eHideRoot ? 1 : !eHideRoot ? 3 : 4 const calculateVisibleItemsWidth = (w: number[]) => { const widths = w.reduce((sum, width) => sum + width + 16, 0)