diff --git a/.changeset/lucky-wasps-nail.md b/.changeset/lucky-wasps-nail.md new file mode 100644 index 00000000000..37174b1f61f --- /dev/null +++ b/.changeset/lucky-wasps-nail.md @@ -0,0 +1,6 @@ +--- +"@primer/react": major +"@primer/styled-react": patch +--- + +Remove support for `sx` from the `TabNav` component diff --git a/packages/react/src/TabNav/TabNav.tsx b/packages/react/src/TabNav/TabNav.tsx index 46d38c3c5d6..876e130160f 100644 --- a/packages/react/src/TabNav/TabNav.tsx +++ b/packages/react/src/TabNav/TabNav.tsx @@ -2,16 +2,14 @@ import {clsx} from 'clsx' import type {To} from 'history' import React, {useRef, useState} from 'react' import {FocusKeys, useFocusZone} from '../hooks/useFocusZone' -import type {SxProp} from '../sx' -import type {ComponentProps} from '../utils/types' +import type {ForwardRefComponent as PolymorphicForwardRefComponent} from '../utils/polymorphic' import styles from './TabNav.module.css' -import {BoxWithFallback} from '../internal/components/BoxWithFallback' /** * @deprecated */ -export type TabNavProps = ComponentProps +export type TabNavProps = React.HTMLProps /** * @deprecated @@ -53,13 +51,13 @@ function TabNav({children, 'aria-label': ariaLabel, ...rest}: TabNavProps) { ) return ( - }> +
}> - +
) } @@ -73,18 +71,17 @@ export type TabNavLinkProps = React.DetailedHTMLProps(function TabNavLink( - {selected, className, as = 'a', ...rest}: TabNavLinkProps, +const TabNavLink = React.forwardRef(function TabNavLink( + {selected, className, as: Component = 'a', ...rest}: TabNavLinkProps, ref, ) { return ( - (function {...rest} /> ) -}) +}) as PolymorphicForwardRefComponent<'a', TabNavLinkProps> TabNavLink.displayName = 'TabNav.Link' diff --git a/packages/styled-react/src/__tests__/primer-react-deprecated.browser.test.tsx b/packages/styled-react/src/__tests__/primer-react-deprecated.browser.test.tsx index c8fbd7fbc54..dd0a9696a04 100644 --- a/packages/styled-react/src/__tests__/primer-react-deprecated.browser.test.tsx +++ b/packages/styled-react/src/__tests__/primer-react-deprecated.browser.test.tsx @@ -1,6 +1,7 @@ import {render, screen} from '@testing-library/react' import {describe, expect, test} from 'vitest' import {Dialog, Octicon, TabNav, Tooltip} from '../deprecated' +import {Button} from '../index' describe('@primer/react/deprecated', () => { test('Dialog supports `sx` prop', () => { @@ -19,8 +20,10 @@ describe('@primer/react/deprecated', () => { }) test('TabNav.Link supports `sx` prop', () => { - render() + render() expect(window.getComputedStyle(screen.getByTestId('component')).backgroundColor).toBe('rgb(255, 0, 0)') + expect(window.getComputedStyle(screen.getByRole('tab')).backgroundColor).toBe('rgb(255, 0, 0)') + expect(screen.getByRole('tab').tagName).toBe('BUTTON') }) test('Tooltip supports `sx` prop', () => { diff --git a/packages/styled-react/src/components/TabNav.tsx b/packages/styled-react/src/components/TabNav.tsx new file mode 100644 index 00000000000..94e39f50eb3 --- /dev/null +++ b/packages/styled-react/src/components/TabNav.tsx @@ -0,0 +1,32 @@ +import {TabNav as PrimerTabNav} from '@primer/react/deprecated' +import type {TabNavProps as PrimerTabNavProps, TabNavLinkProps as PrimerTabNavLinkProps} from '@primer/react/deprecated' +import {sx, type SxProp} from '../sx' +import styled from 'styled-components' +import {type ForwardRefComponent} from '../polymorphic' + +type TabNavProps = PrimerTabNavProps & SxProp +type TabNavLinkProps = PrimerTabNavLinkProps & SxProp + +const StyledTabNav = styled(PrimerTabNav).withConfig({ + shouldForwardProp: prop => (prop as keyof TabNavProps) !== 'sx', +})` + ${sx} +` + +// @ts-ignore forwardedAs is valid here but I don't know how to fix the typescript error +const TabNavImpl = ({as, ...props}: TabNavProps) => + +const StyledTabNavLink: ForwardRefComponent<'a', TabNavLinkProps> = styled(PrimerTabNav.Link).withConfig({ + shouldForwardProp: prop => (prop as keyof TabNavLinkProps) !== 'sx', +})` + ${sx} +` + +// @ts-ignore forwardedAs is valid here but I don't know how to fix the typescript error +const TabNavLink = ({as, ...props}: TabNavLinkProps) => + +const TabNav = Object.assign(TabNavImpl, { + Link: TabNavLink, +}) + +export {TabNav, type TabNavProps, type TabNavLinkProps} diff --git a/packages/styled-react/src/deprecated.tsx b/packages/styled-react/src/deprecated.tsx index bc0a2c05744..fb375d8b666 100644 --- a/packages/styled-react/src/deprecated.tsx +++ b/packages/styled-react/src/deprecated.tsx @@ -1 +1,2 @@ -export {Dialog, Octicon, TabNav, Tooltip, type TooltipProps} from '@primer/react/deprecated' +export {TabNav, type TabNavProps, type TabNavLinkProps} from './components/TabNav' +export {Dialog, Octicon, Tooltip, type TooltipProps} from '@primer/react/deprecated'