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 기반)
14px
28px
312px
416px
520px
624px
832px
1040px
1248px
1664px
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<FileUploadlabel="이미지"accept="image/*"multiplemaxSize={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 (하나만 열림)
상품을 선택한 후 장바구니에 담고, 결제 페이지에서 배송지와 결제 정보를 입력하시면 됩니다.
일반 배송은 3-5일, 빠른 배송은 1-2일 내에 도착합니다.
수령 후 7일 이내에 고객센터로 연락 주시면 반품/교환이 가능합니다.
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 | 서울시 강남구 테헤란로 123 | 2024-01-15 | 일반배송 | 258,000원 | 배송중 |
| ORD-2024-002 | 김철수 | 010-9876-5432 | 부산시 해운대구 센텀로 456 | 2024-01-14 | 빠른배송 | 129,000원 | 완료 |
| ORD-2024-003 | 이영희 | 010-5555-1234 | 대전시 유성구 대학로 789 | 2024-01-13 | 당일배송 | 89,000원 | 준비중 |
hideOnMobile (컬럼 숨김)
모바일에서 덜 중요한 컬럼 숨기기
| 주문번호 | 고객명 | 금액 | 상태 |
|---|---|---|---|
| ORD-2024-001 | 홍길동 | 258,000원 | 배송중 |
| ORD-2024-002 | 김철수 | 129,000원 | 완료 |
사용법
// 반응형 (모바일에서 컬럼 숨기기)<TableHead hideOnMobile>연락처</TableHead><TableCell hideOnMobile>010-1234-5678</TableCell>// 정렬<TableSortHeadsortDirection={sortKey === "name" ? sortDirection : null}onSort={() => handleSort("name")}>이름</TableSortHead>// 체크박스 선택<TableRow selected={selectedRows.includes(id)}><TableCell><TableCheckboxchecked={selectedRows.includes(id)}indeterminate={isIndeterminate}onChange={() => toggle(id)}/></TableCell></TableRow>// colSpan (빈 결과)<TableCell colSpan={3}>결과 없음</TableCell>
Pagination
페이지네이션 컴포넌트
Interactive
현재 페이지: 1
Few Pages
Many Pages
사용법
<PaginationcurrentPage={currentPage}totalPages={20}onPageChange={setCurrentPage}siblingCount={1} // 현재 페이지 좌우로 표시할 페이지 수/>
Tooltip
툴팁 컴포넌트
Positions
다양한 콘텐츠
사용법
// React/Next.js<Tooltip content="툴팁 내용" position="top"><Button>호버하세요</Button></Tooltip>// 복잡한 콘텐츠<Tooltipcontent={<div><p className="font-semibold">제목</p><p className="text-xs">설명</p></div>}><span>호버하세요</span></Tooltip>
Modal
모달, 팝업, 토스트 컴포넌트
Alert
Confirm
Toast
Image Popup
사용법
// Alert<AlertisOpen={showAlert}onClose={() => setShowAlert(false)}title="알림"message="작업이 완료되었습니다."/>// Confirm<ConfirmisOpen={showConfirm}onClose={() => setShowConfirm(false)}onConfirm={() => handleConfirm()}title="확인"message="진행하시겠습니까?"variant="danger" // optional/>// Toast<ToastisOpen={showToast}onClose={() => setShowToast(false)}message="저장되었습니다."variant="success"duration={3000}position="top-right"/>// ImagePopup<ImagePopupisOpen={showImagePopup}onClose={() => setShowImagePopup(false)}src="/image.jpg"alt="이미지 설명"/>
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