diff --git a/packages/frontend/src/components/shared/Badge/Badge.theme.ts b/packages/frontend/src/components/shared/Badge/Badge.theme.ts new file mode 100644 index 00000000..9019a0da --- /dev/null +++ b/packages/frontend/src/components/shared/Badge/Badge.theme.ts @@ -0,0 +1,43 @@ +import { VariantProps, tv } from 'tailwind-variants'; + +export const badgeTheme = tv({ + slots: { + wrapper: ['rounded-full', 'grid', 'place-content-center'], + }, + variants: { + variant: { + primary: { + wrapper: ['bg-controls-primary', 'text-elements-on-primary'], + }, + secondary: { + wrapper: ['bg-controls-secondary', 'text-elements-on-secondary'], + }, + tertiary: { + wrapper: [ + 'bg-controls-tertiary', + 'border', + 'border-border-interactive/10', + 'text-elements-high-em', + 'shadow-button', + ], + }, + inset: { + wrapper: ['bg-controls-inset', 'text-elements-high-em'], + }, + }, + size: { + sm: { + wrapper: ['h-5', 'w-5', 'text-xs'], + }, + xs: { + wrapper: ['h-4', 'w-4', 'text-2xs', 'font-medium'], + }, + }, + }, + defaultVariants: { + variant: 'primary', + size: 'sm', + }, +}); + +export type BadgeTheme = VariantProps; diff --git a/packages/frontend/src/components/shared/Badge/Badge.tsx b/packages/frontend/src/components/shared/Badge/Badge.tsx new file mode 100644 index 00000000..50bae236 --- /dev/null +++ b/packages/frontend/src/components/shared/Badge/Badge.tsx @@ -0,0 +1,33 @@ +import React from 'react'; +import { ComponentPropsWithoutRef } from 'react'; +import { BadgeTheme, badgeTheme } from './Badge.theme'; + +export interface BadgeProps + extends ComponentPropsWithoutRef<'div'>, + BadgeTheme {} + +/** + * A badge is a small status descriptor for UI elements. + * It can be used to indicate a status, a count, or a category. + * It is typically used in lists, tables, or navigation elements. + * + * @example + * ```tsx + * 1 { + const { wrapper } = badgeTheme(); + + return ( +
+ {children} +
+ ); +}; diff --git a/packages/frontend/src/components/shared/Badge/index.ts b/packages/frontend/src/components/shared/Badge/index.ts new file mode 100644 index 00000000..9c8edca2 --- /dev/null +++ b/packages/frontend/src/components/shared/Badge/index.ts @@ -0,0 +1 @@ +export * from './Badge'; diff --git a/packages/frontend/src/pages/components/index.tsx b/packages/frontend/src/pages/components/index.tsx index 28b62579..74086848 100644 --- a/packages/frontend/src/pages/components/index.tsx +++ b/packages/frontend/src/pages/components/index.tsx @@ -1,3 +1,4 @@ +import { Badge, BadgeProps } from 'components/shared/Badge'; import { Button, ButtonOrLinkProps } from 'components/shared/Button'; import { Calendar } from 'components/shared/Calendar'; import { Checkbox } from 'components/shared/Checkbox'; @@ -79,6 +80,29 @@ const Page = () => {
+
+

Badge

+
+ {['primary', 'secondary', 'tertiary', 'inset'].map( + (variant, index) => ( +
+ {['sm', 'xs'].map((size) => ( + + 1 + + ))} +
+ ), + )} +
+
+ +
+

Checkbox

diff --git a/packages/frontend/tailwind.config.js b/packages/frontend/tailwind.config.js index 00ce21f9..4bcb0b01 100644 --- a/packages/frontend/tailwind.config.js +++ b/packages/frontend/tailwind.config.js @@ -12,6 +12,10 @@ export default withMT({ sans: ['Inter', 'sans-serif'], }, extend: { + fontSize: { + '2xs': '0.625rem', + '3xs': '0.5rem', + }, colors: { emerald: { 100: '#d1fae5',