Storybook

Design System Guide

with Tailwind CSS

Colors

디자인 토큰에 정의된 색상 팔레트

Main Colors

Brandprimary-900
Secondarysecondary-700
Prismgradient

Gray

50

100

200

300

400

500

600

700

800

900

Success

50

100

200

300

400

500

600

700

800

900

Warning

50

100

200

300

400

500

600

700

800

900

Error

50

100

200

300

400

500

600

700

800

900

Info

50

100

200

300

400

500

600

700

800

900

Typography

텍스트 스타일 스케일

Font Family

Pretendard

Pretendard, -apple-system, BlinkMacSystemFont, system-ui, sans-serif

Font Size Scale

4xlThe quick brown fox36px
3xlThe quick brown fox30px
2xlThe quick brown fox24px
xlThe quick brown fox20px
lgThe quick brown fox18px
baseThe quick brown fox16px
smThe quick brown fox14px
xsThe quick brown fox12px

Font Weight

normal400 - Regular
medium500 - Medium
semibold600 - Semibold
bold700 - Bold

Spacing

간격 스케일 (4px 기반)

1
4px
2
8px
3
12px
4
16px
5
20px
6
24px
8
32px
10
40px
12
48px
16
64px

Button

버튼 컴포넌트 변형

Variants

Sizes

States

Shape

사용법
// React/Next.js
<Button variant="primary" size="md">버튼</Button>
// Angular (동일한 클래스)
<button class="inline-flex items-center justify-center font-medium transition-colors
bg-primary-900 hover:bg-primary-800 text-white px-4 py-2 text-base">
버튼
</button>

Form

폼 입력 컴포넌트

Input

Textarea

Select

Password

Number

Date

Checkbox

Radio

Toggle

Sizes

States

사용 가능한 이메일입니다

필수 입력 항목입니다

선택 완료

File Upload

클릭하거나 드래그하여 파일을 업로드하세요

image/*

최대 5 MB

클릭하거나 드래그하여 파일을 업로드하세요

.pdf, .doc, .docx

최대 10 MB

사용법
// Input
<Input label="이메일" placeholder="example@email.com" />
// Select
<Select label="과일" options={[{ value: "apple", label: "사과" }]} value={v} onChange={setV} />
// Password / Number / Date
<PasswordInput label="비밀번호" />
<NumberInput label="수량" value={n} onChange={setN} min={0} />
<DateInput label="예약 날짜" />
// Checkbox
<Checkbox label="동의합니다" checked={c} onChange={(e) => setC(e.target.checked)} />
// Radio
<RadioGroup name="opt" value={v} onChange={setV} options={[{ value: "a", label: "A" }]} />
// Toggle
<Toggle label="알림" checked={t} onChange={(e) => setT(e.target.checked)} />
// FileUpload
<FileUpload
label="이미지"
accept="image/*"
multiple
maxSize={5 * 1024 * 1024}
onChange={(files) => console.log(files)}
/>

Card

카드 컴포넌트

Variants

Elevated

그림자가 있는 기본 카드

Outlined

테두리만 있는 카드

Filled

배경색이 있는 카드

사용법
// React/Next.js
<Card variant="elevated" padding="md">내용</Card>
// Angular (동일한 클래스)
<div class="bg-white border border-gray-200 shadow-sm p-6">내용</div>

Badge

뱃지/태그 컴포넌트

Variants

DefaultPrimarySecondarySuccessWarningErrorInfo

Sizes

SmallMediumLarge
사용법
// React/Next.js
<Badge variant="success">완료</Badge>
// Angular (동일한 클래스)
<span class="inline-flex items-center font-medium bg-success-500 text-white px-2.5 py-0.5 text-sm">
완료
</span>

Tabs

탭 네비게이션 컴포넌트

Underline (기본)

계정 정보를 관리할 수 있습니다.

Button

전체 항목을 표시합니다.

Underline Large (전체 너비)

상품의 기본 정보를 확인할 수 있습니다.

Button Large (전체 너비)

일간 통계를 표시합니다.

사용법
// Underline (기본)
<Tabs defaultValue="tab1">
...
</Tabs>
// Button
<Tabs defaultValue="tab1" variant="button">
...
</Tabs>
// Large (전체 너비, 중앙 정렬)
<Tabs defaultValue="tab1" size="lg">
...
</Tabs>
// Button + Large
<Tabs defaultValue="tab1" variant="button" size="lg">
...
</Tabs>

Accordion

아코디언 컴포넌트

Single (하나만 열림)

상품을 선택한 후 장바구니에 담고, 결제 페이지에서 배송지와 결제 정보를 입력하시면 됩니다.

Multiple (여러 개 열림)

여러 항목을 동시에 열 수 있습니다.

multiple 속성을 사용하면 됩니다.
사용법
<Accordion defaultValue={["item1"]} multiple>
<AccordionItem value="item1">
<AccordionTrigger value="item1">제목</AccordionTrigger>
<AccordionContent value="item1">내용</AccordionContent>
</AccordionItem>
</Accordion>

Table

테이블 컴포넌트

Basic

상품명카테고리가격상태
클래식 라운드 선글라스선글라스129,000원판매중
블루라이트 차단 안경안경89,000원판매중

Filterable

상품명카테고리가격
클래식 라운드 선글라스선글라스129,000
블루라이트 차단 안경안경89,000
빈티지 메탈 프레임안경테159,000
스포츠 고글고글199,000

Sortable

클래식 라운드 선글라스선글라스129,000
블루라이트 차단 안경안경89,000
빈티지 메탈 프레임안경테159,000
스포츠 고글고글199,000

Selectable Rows

선택된 항목: 0
상품명카테고리가격
클래식 라운드 선글라스선글라스129,000
블루라이트 차단 안경안경89,000
빈티지 메탈 프레임안경테159,000
스포츠 고글고글199,000

Clickable Rows (가로 스크롤)

컬럼이 많을 경우 가로 스크롤로 확인

주문번호고객명연락처주소주문일배송방법금액상태
ORD-2024-001홍길동010-1234-5678서울시 강남구 테헤란로 1232024-01-15일반배송258,000원배송중
ORD-2024-002김철수010-9876-5432부산시 해운대구 센텀로 4562024-01-14빠른배송129,000원완료
ORD-2024-003이영희010-5555-1234대전시 유성구 대학로 7892024-01-13당일배송89,000원준비중

hideOnMobile (컬럼 숨김)

모바일에서 덜 중요한 컬럼 숨기기

주문번호고객명금액상태
ORD-2024-001홍길동258,000원배송중
ORD-2024-002김철수129,000원완료
사용법
// 반응형 (모바일에서 컬럼 숨기기)
<TableHead hideOnMobile>연락처</TableHead>
<TableCell hideOnMobile>010-1234-5678</TableCell>
// 정렬
<TableSortHead
sortDirection={sortKey === "name" ? sortDirection : null}
onSort={() => handleSort("name")}
>
이름
</TableSortHead>
// 체크박스 선택
<TableRow selected={selectedRows.includes(id)}>
<TableCell>
<TableCheckbox
checked={selectedRows.includes(id)}
indeterminate={isIndeterminate}
onChange={() => toggle(id)}
/>
</TableCell>
</TableRow>
// colSpan (빈 결과)
<TableCell colSpan={3}>결과 없음</TableCell>

Pagination

페이지네이션 컴포넌트

Interactive

현재 페이지: 1

Few Pages

Many Pages

사용법
<Pagination
currentPage={currentPage}
totalPages={20}
onPageChange={setCurrentPage}
siblingCount={1} // 현재 페이지 좌우로 표시할 페이지 수
/>

Tooltip

툴팁 컴포넌트

Positions

다양한 콘텐츠

사용법
// React/Next.js
<Tooltip content="툴팁 내용" position="top">
<Button>호버하세요</Button>
</Tooltip>
// 복잡한 콘텐츠
<Tooltip
content={
<div>
<p className="font-semibold">제목</p>
<p className="text-xs">설명</p>
</div>
}
>
<span>호버하세요</span>
</Tooltip>

Loading

로딩 상태 컴포넌트 (스피너, 스켈레톤)

Spinner

Sizes

xs
sm
md
lg
xl

Variants

primary
secondary
gray
white

With Label

로딩 중...

Overlay

콘텐츠 영역

SpinnerOverlay가 이 영역 위에 표시됩니다

불러오는 중...

Button Loading

Skeleton

Basic

Variants

rectangular
circular
text

Animation

pulse
wave
none

Presets

SkeletonText
SkeletonList
SkeletonCard

SkeletonTable

사용법
// 스피너
<Spinner size="md" variant="primary" />
<Spinner size="lg" label="로딩 중..." />
// 스피너 오버레이
<div className="relative">
<Content />
<SpinnerOverlay isVisible={isLoading} label="불러오는 중..." />
</div>
// 버튼 로딩
<Button disabled>
<Spinner size="sm" variant="white" />
저장 중...
</Button>
// 스켈레톤
<Skeleton width={200} height={20} />
<Skeleton variant="circular" width={40} height={40} />
<SkeletonCard hasImage />
<SkeletonTable rows={5} columns={4} />

Shadows

그림자 스타일

sm
default
md
lg
xl
2xl