Skip to content

Commit 28af9d5

Browse files
jonrohanfrancinelucca
authored andcommitted
feat(TabNav): remove support for sx prop (#6864)
Co-authored-by: Marie Lucca <[email protected]> Co-authored-by: Marie Lucca <[email protected]>
1 parent 0708eb2 commit 28af9d5

File tree

5 files changed

+53
-14
lines changed

5 files changed

+53
-14
lines changed

.changeset/lucky-wasps-nail.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@primer/react": major
3+
"@primer/styled-react": patch
4+
---
5+
6+
Remove support for `sx` from the `TabNav` component

packages/react/src/TabNav/TabNav.tsx

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,14 @@ import {clsx} from 'clsx'
22
import type {To} from 'history'
33
import React, {useRef, useState} from 'react'
44
import {FocusKeys, useFocusZone} from '../hooks/useFocusZone'
5-
import type {SxProp} from '../sx'
6-
import type {ComponentProps} from '../utils/types'
5+
import type {ForwardRefComponent as PolymorphicForwardRefComponent} from '../utils/polymorphic'
76

87
import styles from './TabNav.module.css'
9-
import {BoxWithFallback} from '../internal/components/BoxWithFallback'
108

119
/**
1210
* @deprecated
1311
*/
14-
export type TabNavProps = ComponentProps<typeof BoxWithFallback>
12+
export type TabNavProps = React.HTMLProps<HTMLDivElement>
1513

1614
/**
1715
* @deprecated
@@ -53,13 +51,13 @@ function TabNav({children, 'aria-label': ariaLabel, ...rest}: TabNavProps) {
5351
)
5452

5553
return (
56-
<BoxWithFallback {...rest} ref={navRef as React.RefObject<HTMLDivElement>}>
54+
<div {...rest} ref={navRef as React.RefObject<HTMLDivElement>}>
5755
<nav aria-label={ariaLabel} className={styles.TabNavNav}>
5856
<div role="tablist" className={styles.TabNavTabList}>
5957
{children}
6058
</div>
6159
</nav>
62-
</BoxWithFallback>
60+
</div>
6361
)
6462
}
6563

@@ -73,18 +71,17 @@ export type TabNavLinkProps = React.DetailedHTMLProps<React.HTMLAttributes<HTMLA
7371
className?: string
7472
as?: React.ElementType | 'a' | 'button' | 'div'
7573
disabled?: boolean
76-
} & SxProp
74+
}
7775

7876
/**
7977
* @deprecated
8078
*/
81-
const TabNavLink = React.forwardRef<HTMLAnchorElement, TabNavLinkProps>(function TabNavLink(
82-
{selected, className, as = 'a', ...rest}: TabNavLinkProps,
79+
const TabNavLink = React.forwardRef(function TabNavLink(
80+
{selected, className, as: Component = 'a', ...rest}: TabNavLinkProps,
8381
ref,
8482
) {
8583
return (
86-
<BoxWithFallback
87-
as={as}
84+
<Component
8885
ref={ref}
8986
role="tab"
9087
tabIndex={-1}
@@ -93,7 +90,7 @@ const TabNavLink = React.forwardRef<HTMLAnchorElement, TabNavLinkProps>(function
9390
{...rest}
9491
/>
9592
)
96-
})
93+
}) as PolymorphicForwardRefComponent<'a', TabNavLinkProps>
9794

9895
TabNavLink.displayName = 'TabNav.Link'
9996

packages/styled-react/src/__tests__/primer-react-deprecated.browser.test.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {render, screen} from '@testing-library/react'
22
import {describe, expect, test} from 'vitest'
33
import {Dialog, Octicon, TabNav, Tooltip} from '../deprecated'
4+
import {Button} from '../index'
45

56
describe('@primer/react/deprecated', () => {
67
test('Dialog supports `sx` prop', () => {
@@ -19,8 +20,10 @@ describe('@primer/react/deprecated', () => {
1920
})
2021

2122
test('TabNav.Link supports `sx` prop', () => {
22-
render(<TabNav.Link data-testid="component" sx={{background: 'red'}} />)
23+
render(<TabNav.Link data-testid="component" sx={{background: 'red'}} as={Button} />)
2324
expect(window.getComputedStyle(screen.getByTestId('component')).backgroundColor).toBe('rgb(255, 0, 0)')
25+
expect(window.getComputedStyle(screen.getByRole('tab')).backgroundColor).toBe('rgb(255, 0, 0)')
26+
expect(screen.getByRole('tab').tagName).toBe('BUTTON')
2427
})
2528

2629
test('Tooltip supports `sx` prop', () => {
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import {TabNav as PrimerTabNav} from '@primer/react/deprecated'
2+
import type {TabNavProps as PrimerTabNavProps, TabNavLinkProps as PrimerTabNavLinkProps} from '@primer/react/deprecated'
3+
import {sx, type SxProp} from '../sx'
4+
import styled from 'styled-components'
5+
import {type ForwardRefComponent} from '../polymorphic'
6+
7+
type TabNavProps = PrimerTabNavProps & SxProp
8+
type TabNavLinkProps = PrimerTabNavLinkProps & SxProp
9+
10+
const StyledTabNav = styled(PrimerTabNav).withConfig({
11+
shouldForwardProp: prop => (prop as keyof TabNavProps) !== 'sx',
12+
})<TabNavProps>`
13+
${sx}
14+
`
15+
16+
// @ts-ignore forwardedAs is valid here but I don't know how to fix the typescript error
17+
const TabNavImpl = ({as, ...props}: TabNavProps) => <StyledTabNav forwardedAs={as} {...props} />
18+
19+
const StyledTabNavLink: ForwardRefComponent<'a', TabNavLinkProps> = styled(PrimerTabNav.Link).withConfig({
20+
shouldForwardProp: prop => (prop as keyof TabNavLinkProps) !== 'sx',
21+
})<TabNavLinkProps>`
22+
${sx}
23+
`
24+
25+
// @ts-ignore forwardedAs is valid here but I don't know how to fix the typescript error
26+
const TabNavLink = ({as, ...props}: TabNavLinkProps) => <StyledTabNavLink forwardedAs={as} {...props} />
27+
28+
const TabNav = Object.assign(TabNavImpl, {
29+
Link: TabNavLink,
30+
})
31+
32+
export {TabNav, type TabNavProps, type TabNavLinkProps}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
export {Dialog, Octicon, TabNav, Tooltip, type TooltipProps} from '@primer/react/deprecated'
1+
export {TabNav, type TabNavProps, type TabNavLinkProps} from './components/TabNav'
2+
export {Dialog, Octicon, Tooltip, type TooltipProps} from '@primer/react/deprecated'

0 commit comments

Comments
 (0)