diff --git a/.changeset/gentle-sloths-march.md b/.changeset/gentle-sloths-march.md new file mode 100644 index 00000000000..0bdeae4377f --- /dev/null +++ b/.changeset/gentle-sloths-march.md @@ -0,0 +1,5 @@ +--- +"@primer/react": minor +--- + +Removing the CSS modules feature flag from the SubNav component. diff --git a/packages/react/src/SubNav/SubNav.dev.stories.tsx b/packages/react/src/SubNav/SubNav.dev.stories.tsx index 2900ba30619..f50bf680e53 100644 --- a/packages/react/src/SubNav/SubNav.dev.stories.tsx +++ b/packages/react/src/SubNav/SubNav.dev.stories.tsx @@ -2,7 +2,6 @@ import React from 'react' import type {Meta} from '@storybook/react' import SubNav from './SubNav' import type {ComponentProps} from '../utils/types' -import {FeatureFlags} from '../FeatureFlags' import styles from './SubNav.dev.module.css' @@ -15,26 +14,19 @@ export default { } as Meta> export const WithCss = () => ( - - - - - Home - - - Documentation - - - Support - - - - + + + + Home + + + Documentation + + + Support + + + ) export const WithSx = () => ( @@ -58,33 +50,26 @@ export const WithSx = () => ( ) export const WithSxAndCSS = () => ( - - - - - Home - - - Documentation - - - Support - - - - + + + Home + + + Documentation + + + Support + + + ) diff --git a/packages/react/src/SubNav/SubNav.tsx b/packages/react/src/SubNav/SubNav.tsx index fc898276d18..1f9bbd688e4 100644 --- a/packages/react/src/SubNav/SubNav.tsx +++ b/packages/react/src/SubNav/SubNav.tsx @@ -1,17 +1,12 @@ import {clsx} from 'clsx' import type {To} from 'history' import React from 'react' -import styled from 'styled-components' -import {get} from '../constants' -import type {SxProp} from '../sx' -import sx from '../sx' import type {ComponentProps} from '../utils/types' -import {toggleStyledComponent} from '../internal/utils/toggleStyledComponent' -import {useFeatureFlag} from '../FeatureFlags' import styles from './SubNav.module.css' - -const CSS_MODULES_FEATURE_FLAG = 'primer_react_css_modules_ga' +import {defaultSxProp} from '../utils/defaultSxProp' +import type {SxProp} from '../sx' +import Box from '../Box' type StyledSubNavProps = React.ComponentProps<'nav'> & { actions?: React.ReactNode @@ -20,150 +15,90 @@ type StyledSubNavProps = React.ComponentProps<'nav'> & { label?: string } & SxProp type StyledSubNavLinksProps = React.ComponentProps<'div'> & SxProp -type StyledSubNavLinkProps = React.ComponentProps<'a'> & SxProp & {to?: To; selected?: boolean} - -// SubNav - -const StyledSubNav = toggleStyledComponent( - CSS_MODULES_FEATURE_FLAG, - 'nav', - styled.nav` - display: flex; - justify-content: space-between; - - .SubNav-body { - display: flex; - margin-bottom: -1px; - - > * { - margin-left: ${get('space.2')}; - } - - > *:first-child { - margin-left: 0; - } - } - - .SubNav-actions { - align-self: center; - } - - ${sx}; - `, -) +type StyledSubNavLinkProps = React.ComponentProps<'a'> & {to?: To; selected?: boolean} & SxProp const SubNav = React.forwardRef(function SubNav( - {actions, className, children, label, ...rest}, + {actions, className, children, label, sx: sxProp = defaultSxProp, ...rest}, forwardRef, ) { - const enabled = useFeatureFlag(CSS_MODULES_FEATURE_FLAG) + if (sxProp !== defaultSxProp) { + return ( + +
{children}
+ {actions &&
{actions}
} +
+ ) + } return ( - -
{children}
- {actions &&
{actions}
} -
+ ) }) SubNav.displayName = 'SubNav' // SubNav.Links -const StyledSubNavLinks = toggleStyledComponent( - CSS_MODULES_FEATURE_FLAG, - 'div', - styled.div` - display: flex; - ${sx}; - `, +const SubNavLinks = React.forwardRef( + ({children, className, sx: sxProp = defaultSxProp, ...rest}, forwardRef) => { + if (sxProp !== defaultSxProp) { + return ( + + {children} + + ) + } + return ( +
+ {children} +
+ ) + }, ) - -const SubNavLinks = React.forwardRef(function SubNavLink( - {children, className, ...rest}, - forwardRef, -) { - const enabled = useFeatureFlag(CSS_MODULES_FEATURE_FLAG) - return ( - - {children} - - ) -}) SubNavLinks.displayName = 'SubNav.Links' // SubNav.Link -const StyledSubNavLink = toggleStyledComponent( - CSS_MODULES_FEATURE_FLAG, - 'a', - styled.a.attrs(props => ({ - className: clsx('SubNav-item', props.selected && 'selected', props.className), - }))` - padding-left: ${get('space.3')}; - padding-right: ${get('space.3')}; - font-weight: ${get('fontWeights.semibold')}; - font-size: ${get('fontSizes.1')}; - line-height: 20px; //custom value for SubNav - min-height: 34px; //custom value for SubNav - color: ${get('colors.fg.default')}; - text-align: center; - text-decoration: none; - border-top: 1px solid ${get('colors.border.default')}; - border-bottom: 1px solid ${get('colors.border.default')}; - border-right: 1px solid ${get('colors.border.default')}; - display: flex; - align-items: center; - - &:first-of-type { - border-top-left-radius: ${get('radii.2')}; - border-bottom-left-radius: ${get('radii.2')}; - border-left: 1px solid ${get('colors.border.default')}; - } - - &:last-of-type { - border-top-right-radius: ${get('radii.2')}; - border-bottom-right-radius: ${get('radii.2')}; - } - - &:hover, - &:focus { - text-decoration: none; - background-color: ${get('colors.canvas.subtle')}; - transition: background-color 0.2s ease; +const SubNavLink = React.forwardRef( + ({children, className, sx: sxProp = defaultSxProp, ...rest}, forwardRef) => { + if (sxProp !== defaultSxProp) { + return ( + + {children} + + ) } - &.selected { - color: ${get('colors.fg.onEmphasis')}; - background-color: ${get('colors.accent.emphasis')}; - border-color: ${get('colors.accent.emphasis')}; - } - - ${sx}; - `, + return ( + + {children} + + ) + }, ) -const SubNavLink = React.forwardRef(function SubNavLink( - {children, className, ...rest}, - forwardRef, -) { - const enabled = useFeatureFlag(CSS_MODULES_FEATURE_FLAG) - return ( - - {children} - - ) -}) - SubNavLink.displayName = 'SubNav.Link' export type SubNavProps = ComponentProps diff --git a/packages/react/src/__tests__/SubNav.test.tsx b/packages/react/src/__tests__/SubNav.test.tsx index 3518f7f17c9..8a2a7c657fc 100644 --- a/packages/react/src/__tests__/SubNav.test.tsx +++ b/packages/react/src/__tests__/SubNav.test.tsx @@ -3,31 +3,16 @@ import {SubNav} from '..' import {render, rendersClass, behavesAsComponent, checkExports} from '../utils/testing' import {render as HTMLRender} from '@testing-library/react' import axe from 'axe-core' -import {FeatureFlags} from '../FeatureFlags' describe('SubNav', () => { - behavesAsComponent({Component: SubNav}) + behavesAsComponent({Component: SubNav, options: {skipAs: true}}) checkExports('SubNav', { default: SubNav, }) it('should support `className` on the outermost element', () => { - const Element = () => - const FeatureFlagElement = () => { - return ( - - - - ) - } - expect(HTMLRender().container.firstChild).toHaveClass('test-class-name') - expect(HTMLRender().container.firstChild).toHaveClass('test-class-name') + expect(HTMLRender().container.firstChild).toHaveClass('test-class-name') }) it('should have no axe violations', async () => { diff --git a/packages/react/src/__tests__/SubNavLink.test.tsx b/packages/react/src/__tests__/SubNavLink.test.tsx index 0aa9577dd6a..6f96dd263fd 100644 --- a/packages/react/src/__tests__/SubNavLink.test.tsx +++ b/packages/react/src/__tests__/SubNavLink.test.tsx @@ -5,7 +5,7 @@ import {render as HTMLRender} from '@testing-library/react' import axe from 'axe-core' describe('SubNav.Link', () => { - behavesAsComponent({Component: SubNav.Link}) + behavesAsComponent({Component: SubNav.Link, options: {skipAs: true}}) it('renders an by default', () => { expect(render().type).toEqual('a') diff --git a/packages/react/src/__tests__/__snapshots__/SubNavLink.test.tsx.snap b/packages/react/src/__tests__/__snapshots__/SubNavLink.test.tsx.snap index f26fef0bee6..9fb04d02b0f 100644 --- a/packages/react/src/__tests__/__snapshots__/SubNavLink.test.tsx.snap +++ b/packages/react/src/__tests__/__snapshots__/SubNavLink.test.tsx.snap @@ -1,59 +1,9 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`SubNav.Link respects the "selected" prop 1`] = ` -.c0 { - padding-left: 16px; - padding-right: 16px; - font-weight: 500; - font-size: 14px; - line-height: 20px; - min-height: 34px; - color: var(--fgColor-default,var(--color-fg-default,#1F2328)); - text-align: center; - -webkit-text-decoration: none; - text-decoration: none; - border-top: 1px solid var(--borderColor-default,var(--color-border-default,#d0d7de)); - border-bottom: 1px solid var(--borderColor-default,var(--color-border-default,#d0d7de)); - border-right: 1px solid var(--borderColor-default,var(--color-border-default,#d0d7de)); - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; -} - -.c0:first-of-type { - border-top-left-radius: 6px; - border-bottom-left-radius: 6px; - border-left: 1px solid var(--borderColor-default,var(--color-border-default,#d0d7de)); -} - -.c0:last-of-type { - border-top-right-radius: 6px; - border-bottom-right-radius: 6px; -} - -.c0:hover, -.c0:focus { - -webkit-text-decoration: none; - text-decoration: none; - background-color: var(--bgColor-muted,var(--color-canvas-subtle,#f6f8fa)); - -webkit-transition: background-color 0.2s ease; - transition: background-color 0.2s ease; -} - -.c0.selected { - color: var(--fgColor-onEmphasis,var(--color-fg-on-emphasis,#ffffff)); - background-color: var(--bgColor-accent-emphasis,var(--color-accent-emphasis,#0969da)); - border-color: var(--bgColor-accent-emphasis,var(--color-accent-emphasis,#0969da)); -} -