|
1 | | -import styled from 'styled-components' |
2 | | -import {get} from '../constants' |
3 | 1 | import Octicon from '../Octicon' |
4 | | -import type {SxProp} from '../sx' |
5 | | -import sx from '../sx' |
6 | 2 | import isNumeric from '../utils/isNumeric' |
7 | 3 | import type {ComponentProps} from '../utils/types' |
8 | 4 |
|
| 5 | +import styles from './CircleBadge.module.css' |
| 6 | +import type {OcticonProps} from '../Octicon' |
| 7 | +import {clsx} from 'clsx' |
| 8 | + |
9 | 9 | const variantSizes = { |
10 | 10 | small: 56, |
11 | 11 | medium: 96, |
12 | 12 | large: 128, |
13 | 13 | } |
14 | 14 |
|
15 | | -type StyledCircleBadgeProps = { |
| 15 | +export type CircleBadgeProps<As extends React.ElementType> = { |
16 | 16 | inline?: boolean |
17 | 17 | variant?: keyof typeof variantSizes |
18 | 18 | size?: number |
19 | | -} & SxProp |
| 19 | + as?: As |
| 20 | + className?: string |
| 21 | +} & React.ComponentPropsWithRef<React.ElementType extends As ? 'a' : As> |
20 | 22 |
|
21 | | -const sizeStyles = ({size, variant = 'medium'}: StyledCircleBadgeProps) => { |
| 23 | +const sizeStyles = ({size, variant = 'medium'}: CircleBadgeProps<React.ElementType>) => { |
22 | 24 | const calc = isNumeric(size) ? size : variantSizes[variant] |
23 | 25 | return { |
24 | 26 | width: calc, |
25 | 27 | height: calc, |
26 | 28 | } |
27 | 29 | } |
28 | 30 |
|
29 | | -const CircleBadge = styled.div<StyledCircleBadgeProps>` |
30 | | - display: ${({inline = false}) => (inline ? 'inline-flex' : 'flex')}; |
31 | | - align-items: center; |
32 | | - justify-content: center; |
33 | | - background-color: ${get('colors.canvas.default')}; |
34 | | - border-radius: 50%; |
35 | | - box-shadow: ${get('shadows.shadow.medium')}; |
36 | | - ${sizeStyles}; |
37 | | - ${sx}; |
38 | | -` |
39 | | -const CircleBadgeIcon = styled(Octicon)` |
40 | | - height: auto; |
41 | | - max-width: 60%; |
42 | | - max-height: 55%; |
43 | | -` |
| 31 | +const CircleBadge = <As extends React.ElementType>({as: Component = 'div', ...props}: CircleBadgeProps<As>) => ( |
| 32 | + <Component |
| 33 | + {...props} |
| 34 | + className={clsx(styles.CircleBadge, props.className)} |
| 35 | + data-inline={props.inline ? '' : undefined} |
| 36 | + style={sizeStyles(props)} |
| 37 | + /> |
| 38 | +) |
44 | 39 |
|
45 | | -CircleBadgeIcon.displayName = 'CircleBadge.Icon' |
| 40 | +const CircleBadgeIcon = (props: OcticonProps) => <Octicon className={styles.CircleBadgeIcon} {...props} /> |
46 | 41 |
|
47 | | -export type CircleBadgeProps = ComponentProps<typeof CircleBadge> |
| 42 | +CircleBadgeIcon.displayName = 'CircleBadge.Icon' |
48 | 43 |
|
49 | 44 | export type CircleBadgeIconProps = ComponentProps<typeof CircleBadgeIcon> |
50 | 45 |
|
|
0 commit comments