From e482f998a194b8edf7b5f640ade1f7cd546c6722 Mon Sep 17 00:00:00 2001 From: Wahyu Kurniawan Date: Tue, 20 Feb 2024 18:50:31 +0700 Subject: [PATCH] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20feat:=20create=20badge=20c?= =?UTF-8?q?omopnent?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/shared/Badge/Badge.theme.ts | 43 +++++++++++++++++++ .../src/components/shared/Badge/Badge.tsx | 33 ++++++++++++++ .../src/components/shared/Badge/index.ts | 1 + 3 files changed, 77 insertions(+) create mode 100644 packages/frontend/src/components/shared/Badge/Badge.theme.ts create mode 100644 packages/frontend/src/components/shared/Badge/Badge.tsx create mode 100644 packages/frontend/src/components/shared/Badge/index.ts 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';