diff --git a/.changeset/cool-apricots-sneeze.md b/.changeset/cool-apricots-sneeze.md new file mode 100644 index 00000000000..a175e0860ed --- /dev/null +++ b/.changeset/cool-apricots-sneeze.md @@ -0,0 +1,5 @@ +--- +'@primer/react': major +--- + +Update CircleBadge component to no longer support sx diff --git a/.changeset/lazy-elephants-shave.md b/.changeset/lazy-elephants-shave.md new file mode 100644 index 00000000000..b3c181a09aa --- /dev/null +++ b/.changeset/lazy-elephants-shave.md @@ -0,0 +1,6 @@ +--- +"@primer/react": patch +"@primer/styled-react": patch +--- + +Remove support for `sx` from `CircleBadge` component diff --git a/packages/react/src/CircleBadge/CircleBadge.docs.json b/packages/react/src/CircleBadge/CircleBadge.docs.json index d7e8a5bf650..898ad236946 100644 --- a/packages/react/src/CircleBadge/CircleBadge.docs.json +++ b/packages/react/src/CircleBadge/CircleBadge.docs.json @@ -32,11 +32,6 @@ "name": "as", "type": "React.ElementType", "defaultValue": "\"div\"" - }, - { - "name": "sx", - "type": "SystemStyleObject", - "deprecated": true } ], "subcomponents": [ diff --git a/packages/react/src/CircleBadge/CircleBadge.module.css b/packages/react/src/CircleBadge/CircleBadge.module.css new file mode 100644 index 00000000000..ec321f42118 --- /dev/null +++ b/packages/react/src/CircleBadge/CircleBadge.module.css @@ -0,0 +1,18 @@ +.CircleBadge { + display: flex; + align-items: center; + justify-content: center; + background-color: var(--bgColor-default); + border-radius: 50%; + box-shadow: var(--shadow-resting-medium); + + &:where([data-inline]) { + display: inline-flex; + } +} + +.CircleBadgeIcon { + height: auto; + max-height: 55%; + max-width: 60%; +} diff --git a/packages/react/src/CircleBadge/CircleBadge.stories.tsx b/packages/react/src/CircleBadge/CircleBadge.stories.tsx index 5b7eebc760a..5ca54543e80 100644 --- a/packages/react/src/CircleBadge/CircleBadge.stories.tsx +++ b/packages/react/src/CircleBadge/CircleBadge.stories.tsx @@ -14,18 +14,17 @@ export const Default = () => ( ) -export const Playground: StoryFn = ({'CircleBadge.Icon aria-label': iconAriaLabel, args}) => ( +export const Playground: StoryFn = args => ( - + ) Playground.args = { variant: 'medium', - size: null, + size: undefined, inline: false, as: 'div', - 'CircleBadge.Icon aria-label': undefined, } Playground.argTypes = { @@ -45,7 +44,4 @@ Playground.argTypes = { type: 'boolean', }, }, - 'CircleBadge.Icon aria-label': { - type: 'string', - }, } diff --git a/packages/react/src/CircleBadge/CircleBadge.tsx b/packages/react/src/CircleBadge/CircleBadge.tsx index 7f18237cd5b..0d106c78d50 100644 --- a/packages/react/src/CircleBadge/CircleBadge.tsx +++ b/packages/react/src/CircleBadge/CircleBadge.tsx @@ -1,24 +1,26 @@ -import styled from 'styled-components' -import {get} from '../constants' import Octicon from '../Octicon' -import type {SxProp} from '../sx' -import sx from '../sx' import isNumeric from '../utils/isNumeric' import type {ComponentProps} from '../utils/types' +import styles from './CircleBadge.module.css' +import type {OcticonProps} from '../Octicon' +import {clsx} from 'clsx' + const variantSizes = { small: 56, medium: 96, large: 128, } -type StyledCircleBadgeProps = { +export type CircleBadgeProps = { inline?: boolean variant?: keyof typeof variantSizes size?: number -} & SxProp + as?: As + className?: string +} & React.ComponentPropsWithRef -const sizeStyles = ({size, variant = 'medium'}: StyledCircleBadgeProps) => { +const sizeStyles = ({size, variant = 'medium'}: CircleBadgeProps) => { const calc = isNumeric(size) ? size : variantSizes[variant] return { width: calc, @@ -26,25 +28,18 @@ const sizeStyles = ({size, variant = 'medium'}: StyledCircleBadgeProps) => { } } -const CircleBadge = styled.div` - display: ${({inline = false}) => (inline ? 'inline-flex' : 'flex')}; - align-items: center; - justify-content: center; - background-color: ${get('colors.canvas.default')}; - border-radius: 50%; - box-shadow: ${get('shadows.shadow.medium')}; - ${sizeStyles}; - ${sx}; -` -const CircleBadgeIcon = styled(Octicon)` - height: auto; - max-width: 60%; - max-height: 55%; -` +const CircleBadge = ({as: Component = 'div', ...props}: CircleBadgeProps) => ( + +) -CircleBadgeIcon.displayName = 'CircleBadge.Icon' +const CircleBadgeIcon = (props: OcticonProps) => -export type CircleBadgeProps = ComponentProps +CircleBadgeIcon.displayName = 'CircleBadge.Icon' export type CircleBadgeIconProps = ComponentProps diff --git a/packages/react/src/CircleBadge/__snapshots__/CircleBadge.test.tsx.snap b/packages/react/src/CircleBadge/__snapshots__/CircleBadge.test.tsx.snap index 259c6d89fce..a8175b56391 100644 --- a/packages/react/src/CircleBadge/__snapshots__/CircleBadge.test.tsx.snap +++ b/packages/react/src/CircleBadge/__snapshots__/CircleBadge.test.tsx.snap @@ -2,19 +2,25 @@ exports[`CircleBadge > respects the inline prop 1`] = `
`; exports[`CircleBadge > respects the variant prop 1`] = `
`; exports[`CircleBadge > uses the size prop to override the variant prop 1`] = `
`; diff --git a/packages/styled-react/src/components/CircleBadge.tsx b/packages/styled-react/src/components/CircleBadge.tsx new file mode 100644 index 00000000000..6a58096462d --- /dev/null +++ b/packages/styled-react/src/components/CircleBadge.tsx @@ -0,0 +1,21 @@ +import { + CircleBadge as PrimerCircleBadge, + type CircleBadgeProps as PrimerCircleBadgeProps, + sx, + type SxProp, +} from '@primer/react' +import styled from 'styled-components' +import {type ForwardRefComponent} from '../polymorphic' + +type CircleBadgeProps = PrimerCircleBadgeProps & SxProp + +const CircleBadge: ForwardRefComponent> = styled( + PrimerCircleBadge, +).withConfig({ + shouldForwardProp: prop => (prop as keyof CircleBadgeProps) !== 'sx', +})>` + ${sx} +` + +export {CircleBadge} +export type {CircleBadgeProps} diff --git a/packages/styled-react/src/index.tsx b/packages/styled-react/src/index.tsx index 2dbcfe783eb..464967cc1d1 100644 --- a/packages/styled-react/src/index.tsx +++ b/packages/styled-react/src/index.tsx @@ -6,7 +6,6 @@ export {Breadcrumbs} from '@primer/react' export {Box, type BoxProps} from './components/Box' export {Button} from '@primer/react' export {CheckboxGroup} from '@primer/react' -export {CircleBadge} from '@primer/react' export {Details} from '@primer/react' export {FormControl} from '@primer/react' export {Heading} from '@primer/react' @@ -32,6 +31,7 @@ export {useColorSchemeVar} from '@primer/react' export {useTheme} from '@primer/react' export {Checkbox, type CheckboxProps} from './components/Checkbox' +export {CircleBadge} from './components/CircleBadge' export {CounterLabel, type CounterLabelProps} from './components/CounterLabel' export {Dialog, type DialogProps} from './components/Dialog' export {Flash} from './components/Flash'