Skip to content

Commit

Permalink
Update: Badge ready for production use (#501)
Browse files Browse the repository at this point in the history
  • Loading branch information
DHedgecock authored Oct 9, 2022
1 parent fa2b87a commit fe72af4
Show file tree
Hide file tree
Showing 8 changed files with 75 additions and 32 deletions.
5 changes: 5 additions & 0 deletions src/api-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@
* creating documentation.
*/

export {
type BadgePropsDefaults,
type BadgePropsOverrides,
} from './components/Badge/Badge'
export { type BadgeStyles } from './components/Badge/Badge.styles'
export {
type ButtonPropsDefaults,
type ButtonPropsOverrides,
Expand Down
8 changes: 7 additions & 1 deletion src/components/Badge/Badge.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,17 @@ import { Badge } from './Badge'
describe('<Badge />', () => {
elementTests(Badge)

it('When color is passed, then badge-color className is rendered', () => {
it('When color is passed, then badge color className is rendered', () => {
render(<Badge color='primary'>Badge</Badge>)

expect(screen.getByText('Badge')).toHaveClass('C9Y-Badge-primaryColor')
})

it('When size is passed, then badge size className is rendered', () => {
render(<Badge size='large'>Badge</Badge>)

expect(screen.getByText('Badge')).toHaveClass('C9Y-Badge-largeSize')
})
})

// Snapshots
Expand Down
10 changes: 7 additions & 3 deletions src/components/Badge/Badge.stories.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,12 @@ Badges provide status information.
<Badge>Badge</Badge>
</Story>

## Empty badges
## Sizes

The `:empty` selector is used to hide empty badges by default:
Pass a `size` to set a badge size:

<Badge />
<div className='flex flex-row items-center gap-4'>
<Badge size='small'>Badge</Badge>
<Badge>Badge</Badge>
<Badge size='large'>Badge</Badge>
</div>
23 changes: 15 additions & 8 deletions src/components/Badge/Badge.styles.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,14 @@ import { Theme } from '../../theme/theme'
// --------------------------------------------------------

export const badgeStyles = (theme: Theme): BadgeStyles => ({
// BASE
'.C9Y-Badge-base': {
display: 'inline-flex',
alignItems: 'center',
whiteSpace: 'nowrap',

// Empty badges collapse automatically
'&:empty': {
display: 'none',
},
},

// VARIANTS
'.C9Y-Badge-filled': {
padding: '4px 8px',
color: theme.colors.inverse,
Expand All @@ -26,11 +23,21 @@ export const badgeStyles = (theme: Theme): BadgeStyles => ({
lineHeight: 1,
// 💡 Use em with font-size and padding to auto-scale with text
},

// SIZES
'.C9Y-Badge-smallSize': {
fontSize: theme.fontSize.sm,
padding: '2px 6px',
},
'.C9Y-Badge-largeSize': {
fontSize: theme.fontSize.body,
padding: '6px 12px',
},
})

export interface BadgeStyles {
'.C9Y-Badge-base': {
'&:empty': CSSProperties
} & CSSProperties
'.C9Y-Badge-base': CSSProperties
'.C9Y-Badge-filled': CSSProperties
'.C9Y-Badge-smallSize': CSSProperties
'.C9Y-Badge-largeSize': CSSProperties
}
49 changes: 32 additions & 17 deletions src/components/Badge/Badge.ts
Original file line number Diff line number Diff line change
@@ -1,36 +1,47 @@
import React from 'react'
import React, { forwardRef } from 'react'
import { element } from '../../utils/element-creator'
import { MergeTypes, Resolve } from '../../utils/types'
import { DistributiveOmit, MergeTypes } from '../../utils/types'
import { UtilityProps } from '../../utils/utility-classes'
import { useThemeProps } from '../Provider/Provider'

// Module augmentation interface for overriding component props' types
/** Module augmentation interface for overriding component props' types */
export interface BadgePropsOverrides {}

export interface BadgePropsDefaults {
/** Variant color */
color?: 'primary'
/** Display variant */
size?: 'small' | 'large'
/** Display style */
variant?: 'filled'
}

export type BadgeProps = Resolve<MergeTypes<BadgePropsDefaults, BadgePropsOverrides>> &
Omit<UtilityProps, 'color'> &
React.ComponentPropsWithoutRef<'div'>
export type BadgePropsBase<Elem extends React.ElementType = 'div'> = Omit<
UtilityProps,
'color'
> &
MergeTypes<BadgePropsDefaults, BadgePropsOverrides> & { as?: Elem }

// ✨ Nice display type for IntelliSense
export type BadgeProps<Elem extends React.ElementType = 'div'> = BadgePropsBase<Elem> &
DistributiveOmit<React.ComponentPropsWithRef<Elem>, keyof BadgePropsBase<Elem>>

/**
* Badge provides a label for describing elements.
* @example
* ```tsx
* <Badge color="success">
* Delightful
* </Badge>
* ```
* @see [📝 Badge docs](https://componentry.design/docs/components/badge)
*/
export interface Badge {
(props: BadgeProps): React.ReactElement | null
<Elem extends React.ElementType = 'div'>(props: BadgeProps<Elem>): React.ReactElement
displayName?: string
}

/**
* [Badge component 📝](https://componentry.design/components/badge)
* @experimental
*/
export const Badge: Badge = (props) => {
export const Badge = forwardRef<HTMLDivElement, BadgeProps>((props, ref) => {
const {
color,
size,
variant = 'filled',
...rest
} = {
Expand All @@ -39,11 +50,15 @@ export const Badge: Badge = (props) => {
}

return element({
ref,
componentCx: [
`C9Y-Badge-base C9Y-Badge-${variant}`,
{ [`C9Y-Badge-${color}Color`]: color },
{
[`C9Y-Badge-${color}Color`]: color,
[`C9Y-Badge-${size}Size`]: size,
},
],
...rest,
})
}
}) as Badge
Badge.displayName = 'Badge'
3 changes: 2 additions & 1 deletion src/plugin-babel/__fixtures__/transforms-components/code.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Block, Flex, Grid, Paper, Text } from 'componentry'
import { Badge, Block, Flex, Grid, Paper, Text } from 'componentry'

export default function Test() {
// Test that:
Expand All @@ -10,6 +10,7 @@ export default function Test() {
<Text>Precompiled for</Text>
</Flex>
<Block>SPEED</Block>
<Badge>Delightful</Badge>
</Grid>
</Paper>
)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Block, Flex, Grid, Paper, Text } from 'componentry'
import { Badge, Block, Flex, Grid, Paper, Text } from 'componentry'
import { jsx as _jsx } from 'react/jsx-runtime'
import { jsxs as _jsxs } from 'react/jsx-runtime'
export default function Test() {
Expand All @@ -19,6 +19,10 @@ export default function Test() {
/*#__PURE__*/ _jsx('div', {
children: 'SPEED',
}),
/*#__PURE__*/ _jsx('div', {
className: 'C9Y-Badge-base C9Y-Badge-filled',
children: 'Delightful',
}),
],
}),
})
Expand Down
3 changes: 2 additions & 1 deletion src/plugin-babel/plugin.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { NodePath, PluginObj, PluginPass, types as t } from '@babel/core'

import { Badge } from '../components/Badge/Badge'
import { Block } from '../components/Block/Block'
import { Flex } from '../components/Flex/Flex'
import { Grid } from '../components/Grid/Grid'
Expand All @@ -11,7 +12,7 @@ import { loadConfig } from '../config/load-config'
import { parseAttributes } from './parse-attributes'
import { prepareAttributes } from './prepare-attributes'

const components = { Block, Flex, Grid, Paper, Text } as unknown as {
const components = { Badge, Block, Flex, Grid, Paper, Text } as unknown as {
[component: string]: EvaluatedForwardRef
}

Expand Down

0 comments on commit fe72af4

Please sign in to comment.