Skip to content

Commit 365d53d

Browse files
authored
chore(Breadcrumbs): Remove the CSS modules feature flag from the Breadcrumbs component (#5874)
1 parent 7373295 commit 365d53d

4 files changed

Lines changed: 24 additions & 138 deletions

File tree

.changeset/long-numbers-vanish.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@primer/react': minor
3+
---
4+
5+
Remove the CSS modules feature flag from the Breadcrumbs component

packages/react/src/Breadcrumbs/Breadcrumbs.tsx

Lines changed: 15 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,13 @@
11
import {clsx} from 'clsx'
22
import type {To} from 'history'
33
import React from 'react'
4-
import styled from 'styled-components'
5-
import Box from '../Box'
6-
import {get} from '../constants'
74
import type {SxProp} from '../sx'
8-
import sx from '../sx'
95
import type {ComponentProps} from '../utils/types'
106
import classes from './Breadcrumbs.module.css'
11-
import {toggleStyledComponent} from '../internal/utils/toggleStyledComponent'
12-
import {useFeatureFlag} from '../FeatureFlags'
137
import type {ForwardRefComponent as PolymorphicForwardRefComponent} from '../utils/polymorphic'
8+
import {toggleSxComponent} from '../internal/utils/toggleSxComponent'
149

1510
const SELECTED_CLASS = 'selected'
16-
const CSS_MODULES_FLAG = 'primer_react_css_modules_ga'
17-
18-
const Wrapper = toggleStyledComponent(
19-
CSS_MODULES_FLAG,
20-
'li',
21-
styled.li`
22-
display: inline-block;
23-
white-space: nowrap;
24-
list-style: none;
25-
&::after {
26-
font-size: ${get('fontSizes.1')};
27-
content: '';
28-
display: inline-block;
29-
height: 0.8em;
30-
margin: 0 0.5em;
31-
border-right: 0.1em solid;
32-
border-color: ${get('colors.fg.muted')};
33-
transform: rotate(15deg) translateY(0.0625em);
34-
}
35-
&:first-child {
36-
margin-left: 0;
37-
}
38-
&:last-child {
39-
&::after {
40-
content: none;
41-
}
42-
}
43-
`,
44-
)
45-
46-
const BreadcrumbsBase = toggleStyledComponent(
47-
CSS_MODULES_FLAG,
48-
'nav',
49-
styled.nav<SxProp>`
50-
display: flex;
51-
justify-content: space-between;
52-
${sx};
53-
`,
54-
)
5511

5612
export type BreadcrumbsProps = React.PropsWithChildren<
5713
{
@@ -60,31 +16,16 @@ export type BreadcrumbsProps = React.PropsWithChildren<
6016
>
6117

6218
const BreadcrumbsList = ({children}: React.PropsWithChildren) => {
63-
const enabled = useFeatureFlag(CSS_MODULES_FLAG)
64-
if (enabled) {
65-
return <ol className={classes.BreadcrumbsList}>{children}</ol>
66-
}
67-
68-
return (
69-
<Box as="ol" my={0} pl={0}>
70-
{children}
71-
</Box>
72-
)
19+
return <ol className={classes.BreadcrumbsList}>{children}</ol>
7320
}
7421

75-
function Breadcrumbs({className, children, sx: sxProp}: React.PropsWithChildren<BreadcrumbsProps>) {
76-
const enabled = useFeatureFlag(CSS_MODULES_FLAG)
77-
const wrappedChildren = React.Children.map(children, child => (
78-
<Wrapper className={clsx({[classes.ItemWrapper]: enabled})}>{child}</Wrapper>
79-
))
22+
const BreadcrumbsBaseComponent = toggleSxComponent('nav') as React.ComponentType<BreadcrumbsProps>
23+
function Breadcrumbs({className, children, sx: sxProp}: BreadcrumbsProps) {
24+
const wrappedChildren = React.Children.map(children, child => <li className={classes.ItemWrapper}>{child}</li>)
8025
return (
81-
<BreadcrumbsBase
82-
className={clsx(className, {[classes.BreadcrumbsBase]: enabled})}
83-
aria-label="Breadcrumbs"
84-
sx={sxProp}
85-
>
26+
<BreadcrumbsBaseComponent className={clsx(className, classes.BreadcrumbsBase)} aria-label="Breadcrumbs" sx={sxProp}>
8627
<BreadcrumbsList>{wrappedChildren}</BreadcrumbsList>
87-
</BreadcrumbsBase>
28+
</BreadcrumbsBaseComponent>
8829
)
8930
}
9031

@@ -93,41 +34,18 @@ type StyledBreadcrumbsItemProps = {
9334
selected?: boolean
9435
className?: string
9536
} & SxProp &
96-
React.ComponentPropsWithoutRef<'a'>
97-
98-
const StyledBreadcrumbsItem = toggleStyledComponent(
99-
CSS_MODULES_FLAG,
100-
'a',
101-
styled.a`
102-
color: ${get('colors.accent.fg')};
103-
display: inline-block;
104-
font-size: ${get('fontSizes.1')};
105-
text-decoration: none;
106-
&:hover,
107-
&:focus {
108-
text-decoration: underline;
109-
}
110-
&.selected {
111-
color: ${get('colors.fg.default')};
112-
pointer-events: none;
113-
}
114-
&.selected:focus {
115-
text-decoration: none;
116-
}
117-
${sx};
118-
`,
119-
)
37+
React.HTMLAttributes<HTMLAnchorElement> &
38+
React.ComponentPropsWithRef<'a'>
12039

40+
const BreadcrumbsItemBaseComponent = toggleSxComponent('a') as React.ComponentType<StyledBreadcrumbsItemProps>
12141
const BreadcrumbsItem = React.forwardRef(({selected, className, ...rest}, ref) => {
122-
const enabled = useFeatureFlag(CSS_MODULES_FLAG)
12342
return (
124-
<StyledBreadcrumbsItem
125-
className={clsx(className, {
43+
<BreadcrumbsItemBaseComponent
44+
className={clsx(className, classes.Item, {
12645
[SELECTED_CLASS]: selected,
127-
[classes.Item]: enabled,
128-
[classes.ItemSelected]: enabled && selected,
46+
[classes.ItemSelected]: selected,
12947
})}
130-
aria-current={selected ? 'page' : null}
48+
aria-current={selected ? 'page' : undefined}
13149
ref={ref}
13250
{...rest}
13351
/>
@@ -149,7 +67,7 @@ export const Breadcrumb = Object.assign(Breadcrumbs, {Item: BreadcrumbsItem})
14967
/**
15068
* @deprecated Use the `BreadcrumbsProps` type instead
15169
*/
152-
export type BreadcrumbProps = ComponentProps<typeof BreadcrumbsBase>
70+
export type BreadcrumbProps = BreadcrumbsProps
15371

15472
/**
15573
* @deprecated Use the `BreadcrumbsItemProps` type instead

packages/react/src/Breadcrumbs/__tests__/Breadcrumbs.test.tsx

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import Breadcrumbs, {Breadcrumb} from '..'
33
import {render, behavesAsComponent, checkExports} from '../../utils/testing'
44
import {render as HTMLRender} from '@testing-library/react'
55
import axe from 'axe-core'
6-
import {FeatureFlags} from '../../FeatureFlags'
76

87
describe('Breadcrumbs', () => {
98
behavesAsComponent({Component: Breadcrumbs, options: {skipAs: true}})
@@ -14,21 +13,9 @@ describe('Breadcrumbs', () => {
1413
})
1514

1615
it('should support `className` on the outermost element', () => {
17-
const Element = () => <Breadcrumbs className={'test-class-name'} />
18-
const FeatureFlagElement = () => {
19-
return (
20-
<FeatureFlags
21-
flags={{
22-
primer_react_css_modules_staff: true,
23-
primer_react_css_modules_ga: true,
24-
}}
25-
>
26-
<Element />
27-
</FeatureFlags>
28-
)
29-
}
30-
expect(HTMLRender(<Element />).container.firstChild).toHaveClass('test-class-name')
31-
expect(HTMLRender(<FeatureFlagElement />).container.firstChild).toHaveClass('test-class-name')
16+
expect(HTMLRender(<Breadcrumbs className={'test-class-name'} />).container.firstChild).toHaveClass(
17+
'test-class-name',
18+
)
3219
})
3320

3421
it('should have no axe violations', async () => {
Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,8 @@
11
// Jest Snapshot v1, https://goo.gl/fbAQLP
22

33
exports[`Breadcrumbs.Item respects the "selected" prop 1`] = `
4-
.c0 {
5-
color: var(--fgColor-accent,var(--color-accent-fg,#0969da));
6-
display: inline-block;
7-
font-size: 14px;
8-
-webkit-text-decoration: none;
9-
text-decoration: none;
10-
}
11-
12-
.c0:hover,
13-
.c0:focus {
14-
-webkit-text-decoration: underline;
15-
text-decoration: underline;
16-
}
17-
18-
.c0.selected {
19-
color: var(--fgColor-default,var(--color-fg-default,#1F2328));
20-
pointer-events: none;
21-
}
22-
23-
.c0.selected:focus {
24-
-webkit-text-decoration: none;
25-
text-decoration: none;
26-
}
27-
284
<a
295
aria-current="page"
30-
className="c0 selected"
6+
className="Item selected ItemSelected"
317
/>
328
`;

0 commit comments

Comments
 (0)