Featuring Design System
ComponentsBadge

StatusBadge

Compound 패턴 기반 상태 배지 컴포넌트. status × type 조합으로 6가지 시맨틱 상태를 4가지 시각 강도로 표현.

개요

StatusBadgeCompound Pattern으로 설계된 상태 배지 컴포넌트입니다.

  • 6가지 statusdefault, informative, primary, success, warning, error
  • 4가지 typefilled, tint, outline, subtle로 강조 수준 조절
  • 반응형 size{ mobile: 'sm', desktop: 'lg' } 형태로 breakpoint별 크기 지정
  • Compound sub-componentsStatusBadge.Dot, StatusBadge.Icon, StatusBadge.Text, StatusBadge.Loader로 유연한 조합

Usage

기본 사용법

status × type 조합으로 배지의 의미와 시각적 강도를 결정합니다.

<VStack $css={{ gap: '$spacing-200', alignItems: 'flex-start' }}>
{/* filled */}
<HStack $css={{ gap: '$spacing-150', flexWrap: 'wrap' }}>
  <StatusBadge.Root status="default" variant="filled"><StatusBadge.Text>Default</StatusBadge.Text></StatusBadge.Root>
  <StatusBadge.Root status="informative" variant="filled"><StatusBadge.Text>Informative</StatusBadge.Text></StatusBadge.Root>
  <StatusBadge.Root status="primary" variant="filled"><StatusBadge.Text>Primary</StatusBadge.Text></StatusBadge.Root>
  <StatusBadge.Root status="success" variant="filled"><StatusBadge.Text>Success</StatusBadge.Text></StatusBadge.Root>
  <StatusBadge.Root status="warning" variant="filled"><StatusBadge.Text>Warning</StatusBadge.Text></StatusBadge.Root>
  <StatusBadge.Root status="error" variant="filled"><StatusBadge.Text>Error</StatusBadge.Text></StatusBadge.Root>
</HStack>

{/* tint */}
<HStack $css={{ gap: '$spacing-150', flexWrap: 'wrap' }}>
  <StatusBadge.Root status="default" variant="tint"><StatusBadge.Text>Default</StatusBadge.Text></StatusBadge.Root>
  <StatusBadge.Root status="informative" variant="tint"><StatusBadge.Text>Informative</StatusBadge.Text></StatusBadge.Root>
  <StatusBadge.Root status="primary" variant="tint"><StatusBadge.Text>Primary</StatusBadge.Text></StatusBadge.Root>
  <StatusBadge.Root status="success" variant="tint"><StatusBadge.Text>Success</StatusBadge.Text></StatusBadge.Root>
  <StatusBadge.Root status="warning" variant="tint"><StatusBadge.Text>Warning</StatusBadge.Text></StatusBadge.Root>
  <StatusBadge.Root status="error" variant="tint"><StatusBadge.Text>Error</StatusBadge.Text></StatusBadge.Root>
</HStack>

{/* outline */}
<HStack $css={{ gap: '$spacing-150', flexWrap: 'wrap' }}>
  <StatusBadge.Root status="default" variant="outline"><StatusBadge.Text>Default</StatusBadge.Text></StatusBadge.Root>
  <StatusBadge.Root status="informative" variant="outline"><StatusBadge.Text>Informative</StatusBadge.Text></StatusBadge.Root>
  <StatusBadge.Root status="primary" variant="outline"><StatusBadge.Text>Primary</StatusBadge.Text></StatusBadge.Root>
  <StatusBadge.Root status="success" variant="outline"><StatusBadge.Text>Success</StatusBadge.Text></StatusBadge.Root>
  <StatusBadge.Root status="warning" variant="outline"><StatusBadge.Text>Warning</StatusBadge.Text></StatusBadge.Root>
  <StatusBadge.Root status="error" variant="outline"><StatusBadge.Text>Error</StatusBadge.Text></StatusBadge.Root>
</HStack>

{/* subtle */}
<HStack $css={{ gap: '$spacing-150', flexWrap: 'wrap' }}>
  <StatusBadge.Root status="default" variant="subtle"><StatusBadge.Text>Default</StatusBadge.Text></StatusBadge.Root>
  <StatusBadge.Root status="informative" variant="subtle"><StatusBadge.Text>Informative</StatusBadge.Text></StatusBadge.Root>
  <StatusBadge.Root status="primary" variant="subtle"><StatusBadge.Text>Primary</StatusBadge.Text></StatusBadge.Root>
  <StatusBadge.Root status="success" variant="subtle"><StatusBadge.Text>Success</StatusBadge.Text></StatusBadge.Root>
  <StatusBadge.Root status="warning" variant="subtle"><StatusBadge.Text>Warning</StatusBadge.Text></StatusBadge.Root>
  <StatusBadge.Root status="error" variant="subtle"><StatusBadge.Text>Error</StatusBadge.Text></StatusBadge.Root>
</HStack>
</VStack>

Dot + Text

StatusBadge.Dot은 context에서 statustype을 읽어 색상을 자동으로 결정합니다.

<HStack $css={{ gap: '$spacing-150', flexWrap: 'wrap' }}>
<StatusBadge.Root status="default" variant="tint">
  <StatusBadge.Dot />
  <StatusBadge.Text>Default</StatusBadge.Text>
</StatusBadge.Root>
<StatusBadge.Root status="success" variant="tint">
  <StatusBadge.Dot />
  <StatusBadge.Text>Success</StatusBadge.Text>
</StatusBadge.Root>
<StatusBadge.Root status="warning" variant="tint">
  <StatusBadge.Dot />
  <StatusBadge.Text>Warning</StatusBadge.Text>
</StatusBadge.Root>
<StatusBadge.Root status="error" variant="tint">
  <StatusBadge.Dot />
  <StatusBadge.Text>Error</StatusBadge.Text>
</StatusBadge.Root>
<StatusBadge.Root status="primary" variant="tint">
  <StatusBadge.Dot />
  <StatusBadge.Text>Primary</StatusBadge.Text>
</StatusBadge.Root>
<StatusBadge.Root status="informative" variant="tint">
  <StatusBadge.Dot />
  <StatusBadge.Text>Informative</StatusBadge.Text>
</StatusBadge.Root>
</HStack>

Icon + Text

StatusBadge.Icon은 context의 size에 따라 아이콘 크기를 자동 조절합니다.

<HStack $css={{ gap: '$spacing-150', flexWrap: 'wrap' }}>
<StatusBadge.Root status="success" variant="tint">
  <StatusBadge.Icon><IconCheckOutline /></StatusBadge.Icon>
  <StatusBadge.Text>완료</StatusBadge.Text>
</StatusBadge.Root>
<StatusBadge.Root status="warning" variant="tint">
  <StatusBadge.Icon><IconWarningOutline /></StatusBadge.Icon>
  <StatusBadge.Text>경고</StatusBadge.Text>
</StatusBadge.Root>
<StatusBadge.Root status="error" variant="tint">
  <StatusBadge.Icon><IconInformationOutline /></StatusBadge.Icon>
  <StatusBadge.Text>오류</StatusBadge.Text>
</StatusBadge.Root>
<StatusBadge.Root status="primary" variant="filled">
  <StatusBadge.Icon><IconSettingsOutline /></StatusBadge.Icon>
  <StatusBadge.Text>처리 중</StatusBadge.Text>
</StatusBadge.Root>
</HStack>

Loader + Text

비동기 처리 중 상태를 나타낼 때 사용합니다.

<HStack $css={{ gap: '$spacing-150', flexWrap: 'wrap' }}>
<StatusBadge.Root status="primary" variant="filled">
  <StatusBadge.Loader />
  <StatusBadge.Text>로딩 중</StatusBadge.Text>
</StatusBadge.Root>
<StatusBadge.Root status="default" variant="tint">
  <StatusBadge.Loader />
  <StatusBadge.Text>처리 중</StatusBadge.Text>
</StatusBadge.Root>
</HStack>

크기 설정

sm부터 xl까지 네 단계를 제공합니다.

<HStack $css={{ gap: '$spacing-200', alignItems: 'center', flexWrap: 'wrap' }}>
<StatusBadge.Root status="primary" variant="filled" size="sm">
  <StatusBadge.Dot /><StatusBadge.Text>sm (16px)</StatusBadge.Text>
</StatusBadge.Root>
<StatusBadge.Root status="primary" variant="filled" size="md">
  <StatusBadge.Dot /><StatusBadge.Text>md (20px)</StatusBadge.Text>
</StatusBadge.Root>
<StatusBadge.Root status="primary" variant="filled" size="lg">
  <StatusBadge.Dot /><StatusBadge.Text>lg (24px)</StatusBadge.Text>
</StatusBadge.Root>
<StatusBadge.Root status="primary" variant="filled" size="xl">
  <StatusBadge.Dot /><StatusBadge.Text>xl (30px)</StatusBadge.Text>
</StatusBadge.Root>
</HStack>

반응형 크기

size에 breakpoint 객체를 전달하면 화면 너비에 따라 크기가 변합니다.

<StatusBadge.Root status="success" variant="tint" size={{ mobile: 'sm', desktop: 'lg' }}>
<StatusBadge.Dot />
<StatusBadge.Text>반응형 — 리사이즈해보세요</StatusBadge.Text>
</StatusBadge.Root>

Icon Only 모드

iconOnly prop을 사용하면 padding이 제거되고 width = height가 되어 원형 아이콘 배지로 변환됩니다. status × type 색상이 유지됩니다.

<HStack $css={{ gap: '$spacing-200', alignItems: 'center', flexWrap: 'wrap' }}>
<StatusBadge.Root status="success" variant="filled" size="md" iconOnly>
  <StatusBadge.Dot />
</StatusBadge.Root>
<StatusBadge.Root status="error" variant="tint" size="md" iconOnly>
  <StatusBadge.Icon><IconInformationOutline /></StatusBadge.Icon>
</StatusBadge.Root>
<StatusBadge.Root status="primary" variant="outline" size="lg" iconOnly>
  <StatusBadge.Dot />
</StatusBadge.Root>
<StatusBadge.Root status="warning" variant="filled" size="xl" iconOnly>
  <StatusBadge.Loader />
</StatusBadge.Root>
</HStack>

드롭다운 트리거로 활용

render prop으로 <button>으로 변환하여 인터랙티브 트리거로 사용할 수 있습니다.

<StatusBadge.Root
status="success"
variant="tint"
render={<button />}
onClick={() => alert('상태 변경')}
>
<StatusBadge.Dot />
<StatusBadge.Text>활성</StatusBadge.Text>
<StatusBadge.Icon><IconCaretDownFilled /></StatusBadge.Icon>
</StatusBadge.Root>

$css로 토큰 기반 커스텀

<HStack $css={{ gap: '$spacing-200', flexWrap: 'wrap' }}>
{/* 최소 너비 지정 */}
<StatusBadge.Root status="primary" variant="tint" $css={{ minWidth: '80px', justifyContent: 'center' }}>
  <StatusBadge.Text>중앙 정렬</StatusBadge.Text>
</StatusBadge.Root>

{/* 커스텀 border radius */}
<StatusBadge.Root status="success" variant="filled" $css={{ borderRadius: '$radius-100' }}>
  <StatusBadge.Text>각진 배지</StatusBadge.Text>
</StatusBadge.Root>
</HStack>

Compound Components

공통 Props$css, render, className, style는 모든 서브컴포넌트에서 지원됩니다. useRenderComponent 가이드 →

StatusBadge.Root

루트 배지 컴포넌트. useRenderComponent를 내부적으로 사용합니다. 기본 태그는 <div>입니다.

Prop

Type

StatusBadge.Dot

상태 표시 점. StatusBadge.Root context에서 statussize를 읽어 색상과 크기를 자동 결정합니다. color, size, type을 직접 지정하면 context 값을 오버라이드합니다.

Prop

Type

StatusBadge.Icon

아이콘을 감싸는 컴포넌트. context의 size에 따라 아이콘 크기를 자동 조절합니다.

Prop

Type

StatusBadge.Text

텍스트를 감싸는 컴포넌트. 내부적으로 Typo를 사용하며, size에 맞는 typography variant와 status × type에 맞는 텍스트 색상을 자동 적용합니다.

Prop

Type

StatusBadge.Loader

로딩 인디케이터. 내부적으로 Loader를 사용합니다.

Prop

Type

스타일

Size Variants

SizeHeightPadding XGapIcon SizeTypography
sm16pxspacing-100 (4px)spacing-50 (2px)12px$body-1
md20pxspacing-150 (6px)spacing-100 (4px)12px$body-1
lg24pxspacing-200 (8px)spacing-150 (6px)14px$body-2
xl30pxspacing-250 (10px)spacing-200 (8px)16px$body-3

Status × Type 색상 토큰

StatusTypeBackgroundBorderText
defaultfilledgray-40gray-40white
defaulttintgray-10border-1text-3
defaultoutlinewhiteborder-1text-3
defaultsubtletext-3
errorfilledsupport-error-3support-error-3white
errortintsupport-error-1support-error-2support-error-4
erroroutlinewhitesupport-error-2support-error-4
warningfilledsupport-warning-3support-warning-3white
warningtintsupport-warning-1support-warning-2support-warning-4
successfilledsupport-success-3support-success-3white
successtintsupport-success-1support-success-2support-success-4
primaryfilledsupport-info-3support-info-3white
primarytintsupport-info-1support-info-2support-info-4
informativefilledgray-90gray-90white
informativetintbackground-2border-2text-2

Dot 자동 매핑

StatusBadge.Dot은 badge typefilled이면 항상 white를, 그 외에는 status별 색상을 사용합니다.

StatusDot Color (non-filled)
defaultgray
informativeblack
primarypurple
successgreen
warningorange
errorred

Badge size와 Dot size 자동 매핑:

Badge SizeDot Size
smxs (6px)
mdxs (6px)
lgsm (8px)
xlmd (10px)