123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- import type { CSSProperties, ReactNode } from 'react'
- import React from 'react'
- import { type VariantProps, cva } from 'class-variance-authority'
- import classNames from '@/utils/classnames'
- import './index.css'
- enum BadgeState {
- Warning = 'warning',
- Accent = 'accent',
- Default = '',
- }
- const BadgeVariants = cva(
- 'badge',
- {
- variants: {
- size: {
- s: 'badge-s',
- m: 'badge-m',
- l: 'badge-l',
- },
- },
- defaultVariants: {
- size: 'm',
- },
- },
- )
- type BadgeProps = {
- size?: 's' | 'm' | 'l'
- iconOnly?: boolean
- uppercase?: boolean
- state?: BadgeState
- styleCss?: CSSProperties
- children?: ReactNode
- } & React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof BadgeVariants>
- function getBadgeState(state: BadgeState) {
- switch (state) {
- case BadgeState.Warning:
- return 'badge-warning'
- case BadgeState.Accent:
- return 'badge-accent'
- default:
- return ''
- }
- }
- const Badge: React.FC<BadgeProps> = ({
- className,
- size,
- state = BadgeState.Default,
- iconOnly = false,
- uppercase = false,
- styleCss,
- children,
- ...props
- }) => {
- return (
- <div
- className={classNames(
- BadgeVariants({ size, className }),
- getBadgeState(state),
- size === 's'
- ? (iconOnly ? 'p-[3px]' : 'px-[5px] py-[3px]')
- : size === 'l'
- ? (iconOnly ? 'p-1.5' : 'px-2 py-1')
- : (iconOnly ? 'p-1' : 'px-[5px] py-[2px]'),
- uppercase ? 'system-2xs-medium-uppercase' : 'system-2xs-medium',
- )}
- style={styleCss}
- {...props}
- >
- {children}
- </div>
- )
- }
- Badge.displayName = 'Badge'
- export default Badge
- export { Badge, BadgeState, BadgeVariants }
|