# Featuring Design System
## Overview
Featuring Design System은 [피처링](https://featuring.co)의 모든 프로덕트에서 일관된 사용자 경험을 제공하기 위한 React 디자인 시스템입니다.
1,000개 이상의 디자인 토큰, 30개 이상의 React 컴포넌트, 350개 이상의 아이콘을 제공하며, Zero-runtime CSS와 타입 안전성을 기반으로 설계되었습니다.
## Packages
| 패키지 | 설명 | 버전 |
| ------------------------------------------------------ | ---------------------------------------- | -------------- |
| [`@featuring-corp/design-tokens`](/docs/design-tokens) | 색상, 간격, 타이포그래피, 반지름, 그림자 토큰 | CSS 변수 + JS 객체 |
| [`@featuring-corp/components`](/docs/components) | Layout primitives + UI 컴포넌트 + CSS Preset | React 18+ |
| [`@featuring-corp/icons`](/docs/icons) | 333개 시스템 아이콘 + 26개 서비스 아이콘 | SVG React 컴포넌트 |
## Quick Start
### 1. 설치
| Code | Value |
|---|---|
primary-10
|
\#ecefff |
primary-20
|
\#dce2ff |
primary-30
|
\#c0c8ff |
primary-40
|
\#9aa3ff |
primary-50
|
\#7273ff |
primary-60
|
\#5e51ff |
primary-70
|
\#5032f9 |
primary-80
|
\#3821b2 |
primary-90
|
\#31238c |
primary-100
|
\#1f1551 |
| Code | Value |
|---|---|
primary-10
|
\#edf5ff |
primary-20
|
\#d0e2ff |
primary-30
|
\#a6c8ff |
primary-40
|
\#4c9aff |
primary-50
|
\#2684ff |
primary-60
|
\#0065ff |
primary-70
|
\#0052cc |
primary-80
|
\#0747a6 |
primary-90
|
\#001d6c |
primary-100
|
\#001141 |
| Code | Value |
|---|---|
secondary-10
|
\#fafafa |
secondary-20
|
\#f6f6f6 |
secondary-30
|
\#ebebeb |
secondary-40
|
\#e0e0e0 |
secondary-50
|
\#d2d2d2 |
secondary-60
|
\#bbbbbb |
secondary-70
|
\#959595 |
secondary-80
|
\#707070 |
secondary-90
|
\#424242 |
secondary-100
|
\#242424 |
| Code | Value |
|---|---|
white
|
\#ffffff |
black
|
\#000000 |
gray-5
|
\#fafafa |
gray-10
|
\#f6f6f6 |
gray-15
|
\#f0f0f0 |
gray-20
|
\#ebebeb |
gray-30
|
\#e0e0e0 |
gray-40
|
\#d2d2d2 |
gray-50
|
\#bbbbbb |
gray-60
|
\#959595 |
gray-70
|
\#707070 |
gray-80
|
\#424242 |
gray-90
|
\#242424 |
| Code | Value |
|---|---|
red-10
|
\#fcedea |
red-20
|
\#f6c8bf |
red-30
|
\#f2ae9f |
red-40
|
\#ec8974 |
red-50
|
\#e97259 |
red-60
|
\#e34f2f |
red-70
|
\#cf482b |
red-80
|
\#a13821 |
red-90
|
\#7d2b1A |
red-100
|
\#5f2114 |
orange-10
|
\#fcf2e6 |
orange-20
|
\#f5d5b0 |
orange-30
|
\#f0c18a |
orange-40
|
\#eaa554 |
orange-50
|
\#e59333 |
orange-60
|
\#df7800 |
orange-70
|
\#cb6d00 |
orange-80
|
\#9e5500 |
orange-90
|
\#7b4200 |
orange-100
|
\#5e3200 |
yellow-10
|
\#fffbe6 |
yellow-20
|
\#fff1b3 |
yellow-30
|
\#ffea8e |
yellow-40
|
\#ffe15a |
yellow-50
|
\#ffdb3a |
yellow-60
|
\#ffd209 |
yellow-70
|
\#e8bf08 |
yellow-80
|
\#b59506 |
yellow-90
|
\#8c7405 |
yellow-100
|
\#6b5804 |
lightGreen-10
|
\#f5faf0 |
lightGreen-20
|
\#dfefd0 |
lightGreen-30
|
\#d0e8b9 |
lightGreen-40
|
\#bbdd98 |
lightGreen-50
|
\#add685 |
lightGreen-60
|
\#99cc66 |
lightGreen-70
|
\#8bba5d |
lightGreen-80
|
\#6d9148 |
lightGreen-90
|
\#547038 |
lightGreen-100
|
\#40562b |
green-10
|
\#ebf6f1 |
green-20
|
\#c2e4d4 |
green-30
|
\#a5d7bf |
green-40
|
\#7cc5a2 |
green-50
|
\#62ba90 |
green-60
|
\#3ba974 |
green-70
|
\#369a6a |
green-80
|
\#2a7852 |
green-90
|
\#205d40 |
green-100
|
\#194731 |
cyan-10
|
\#f2fcfb |
cyan-20
|
\#d8f6f3 |
cyan-30
|
\#c5f1ee |
cyan-40
|
\#aaebe6 |
cyan-50
|
\#99e7e1 |
cyan-60
|
\#80e1d9 |
cyan-70
|
\#74cdc5 |
cyan-80
|
\#5ba09a |
cyan-90
|
\#467c77 |
cyan-100
|
\#365f5b |
teal-10
|
\#eff8f7 |
teal-20
|
\#cce9e6 |
teal-30
|
\#b4deda |
teal-40
|
\#91cfc9 |
teal-50
|
\#7cc5bf |
teal-60
|
\#5bb7af |
teal-70
|
\#53a79f |
teal-80
|
\#41827c |
teal-90
|
\#326560 |
teal-100
|
\#264d4a |
lightBlue-10
|
\#f1f9fe |
lightBlue-20
|
\#d3ebfc |
lightBlue-30
|
\#bee1fa |
lightBlue-40
|
\#a1d3f8 |
lightBlue-50
|
\#8ecbf6 |
lightBlue-60
|
\#72bef4 |
lightBlue-70
|
\#68adde |
lightBlue-80
|
\#5187ad |
lightBlue-90
|
\#3f6986 |
lightBlue-100
|
\#305066 |
blue-10
|
\#eef4ff |
blue-20
|
\#d8e6fe |
blue-30
|
\#aacbff |
blue-40
|
\#78b0fd |
blue-50
|
\#4d93f7 |
blue-60
|
\#246ee1 |
blue-70
|
\#0b54ab |
blue-80
|
\#014186 |
blue-90
|
\#032d60 |
blue-100
|
\#001639 |
indigo-10
|
\#f1f1ff |
indigo-20
|
\#d5d4fd |
indigo-30
|
\#c0bffd |
indigo-40
|
\#a4a2fc |
indigo-50
|
\#9290fb |
indigo-60
|
\#7774fa |
indigo-70
|
\#6c6ae4 |
indigo-80
|
\#5452b2 |
indigo-90
|
\#41408a |
indigo-100
|
\#323169 |
purple-10
|
\#f2eeff |
purple-20
|
\#d5cbff |
purple-30
|
\#c1b1ff |
purple-40
|
\#a58eff |
purple-50
|
\#9378ff |
purple-60
|
\#7856ff |
purple-70
|
\#6d4ee8 |
purple-80
|
\#553db5 |
purple-90
|
\#422f8c |
purple-100
|
\#32246b |
magenta-10
|
\#faf2fc |
magenta-20
|
\#efd8f4 |
magenta-30
|
\#e7c5ef |
magenta-40
|
\#dbaae8 |
magenta-50
|
\#d599e3 |
magenta-60
|
\#ca80dc |
magenta-70
|
\#b874c8 |
magenta-80
|
\#8f5b9c |
magenta-90
|
\#6f4679 |
magenta-100
|
\#55365c |
burgundy-10
|
\#f7eef1 |
burgundy-20
|
\#e7ccd2 |
burgundy-30
|
\#dcb3bc |
burgundy-40
|
\#cb909e |
burgundy-50
|
\#c17a8b |
burgundy-60
|
\#b2596e |
burgundy-70
|
\#a25164 |
burgundy-80
|
\#7e3f4e |
burgundy-90
|
\#62313d |
burgundy-100
|
\#4b252e |
| Code | Value |
|---|---|
background-1
|
var(--global-colors-white)
|
background-2
|
var(--global-colors-gray-5)
|
background-3
|
var(--global-colors-gray-10)
|
background-4
|
var(--global-colors-gray-20)
|
background-5
|
var(--global-colors-gray-90)
|
| Code | Value |
|---|---|
border-default
|
var(--global-colors-gray-15)
|
border-1
|
var(--global-colors-gray-30)
|
border-2
|
var(--global-colors-gray-40)
|
border-3
|
var(--global-colors-gray-50)
|
border-4
|
var(--global-colors-gray-60)
|
| Code | Value |
|---|---|
text-1
|
var(--global-colors-gray-90)
|
text-2
|
var(--global-colors-gray-80)
|
text-3
|
var(--global-colors-gray-70)
|
text-4
|
var(--global-colors-gray-60)
|
text-5
|
var(--global-colors-gray-50)
|
text-6
|
var(--global-colors-white)
|
| Code | Value |
|---|---|
support-error-1
|
var(--global-colors-red-10)
|
support-error-2
|
var(--global-colors-red-20)
|
support-error-3
|
var(--global-colors-red-50)
|
support-error-4
|
var(--global-colors-red-100)
|
| Code | Value |
|---|---|
support-warning-1
|
var(--global-colors-orange-10)
|
support-warning-2
|
var(--global-colors-orange-20)
|
support-warning-3
|
var(--global-colors-orange-50)
|
support-warning-4
|
var(--global-colors-orange-100)
|
| Code | Value |
|---|---|
support-success-1
|
var(--global-colors-green-10)
|
support-success-2
|
var(--global-colors-green-20)
|
support-success-3
|
var(--global-colors-green-50)
|
support-success-4
|
var(--global-colors-green-100)
|
| Code | Value |
|---|---|
support-info-1
|
var(--global-colors-primary-10)
|
support-info-2
|
var(--global-colors-primary-20)
|
support-info-3
|
var(--global-colors-primary-60)
|
support-info-4
|
var(--global-colors-primary-100)
|
| Code | Value |
|---|---|
focus
|
rgb(from var(--global-colors-primary-50) r g b / 20%)
|
| Code | Value |
|---|---|
icon-primary
|
var(--global-colors-gray-90)
|
icon-secondary
|
var(--global-colors-gray-70)
|
icon-tertiary
|
var(--global-colors-gray-50)
|
icon-interactive
|
var(--global-colors-primary-60)
|
icon-on-color-default
|
var(--global-colors-white)
|
icon-on-color-disabled
|
var(--global-colors-gray-60)
|
| Code | Value |
|---|---|
toggle-primary-1
|
var(--global-colors-primary-60)
|
toggle-primary-2
|
var(--global-colors-primary-70)
|
toggle-primary-3
|
var(--global-colors-primary-100)
|
toggle-disabled-bg
|
var(--global-colors-gray-20)
|
toggle-disabled-border
|
var(--global-colors-gray-40)
|
toggle-disabled-text
|
var(--global-colors-gray-60)
|
toggle-off-bg
|
var(--global-colors-gray-50)
|
toggle-off-hover
|
var(--global-colors-gray-60)
|
| Code | Value | Preview |
|---|---|---|
2
|
0px 0px 2px 0px rgb(from var(--global-colors-black) r g b / 12%), 0px 1px 2px 0px rgb(from var(--global-colors-black) r g b / 14%)
|
|
4
|
0px 0px 2px 0px rgb(from var(--global-colors-black) r g b / 12%), 0px 2px 4px 0px rgb(from var(--global-colors-black) r g b / 14%)
|
|
8
|
0px 0px 2px 0px rgb(from var(--global-colors-black) r g b / 12%), 0px 4px 8px 0px rgb(from var(--global-colors-black) r g b / 14%)
|
|
16
|
0px 0px 2px 0px rgb(from var(--global-colors-black) r g b / 12%), 0px 8px 16px 0px rgb(from var(--global-colors-black) r g b / 14%)
|
|
28
|
0px 0px 8px 0px rgb(from var(--global-colors-black) r g b / 20%), 0px 14px 28px 0px rgb(from var(--global-colors-black) r g b / 24%)
|
|
64
|
0px 0px 8px 0px rgb(from var(--global-colors-black) r g b / 20%), 0px 32px 64px 0px rgb(from var(--global-colors-black) r g b / 24%)
|
| Code | Value | Preview |
|---|---|---|
100
|
0.6875rem
|
다람쥐 헌 쳇바퀴에 타고파 Lorem ipsum dolor sit amet |
200
|
0.75rem
|
다람쥐 헌 쳇바퀴에 타고파 Lorem ipsum dolor sit amet |
300
|
0.875rem
|
다람쥐 헌 쳇바퀴에 타고파 Lorem ipsum dolor sit amet |
400
|
1rem
|
다람쥐 헌 쳇바퀴에 타고파 Lorem ipsum dolor sit amet |
450
|
1.125rem
|
다람쥐 헌 쳇바퀴에 타고파 Lorem ipsum dolor sit amet |
500
|
1.25rem
|
다람쥐 헌 쳇바퀴에 타고파 Lorem ipsum dolor sit amet |
600
|
1.5rem
|
다람쥐 헌 쳇바퀴에 타고파 Lorem ipsum dolor sit amet |
700
|
2rem
|
다람쥐 헌 쳇바퀴에 타고파 Lorem ipsum dolor sit amet |
800
|
2.5rem
|
다람쥐 헌 쳇바퀴에 타고파 Lorem ipsum dolor sit amet |
| Code | Value | Preview |
|---|---|---|
thin
|
100
|
다람쥐 헌 쳇바퀴에 타고파
|
extraLight
|
200
|
다람쥐 헌 쳇바퀴에 타고파
|
light
|
300
|
다람쥐 헌 쳇바퀴에 타고파
|
regular
|
400
|
다람쥐 헌 쳇바퀴에 타고파
|
medium
|
500
|
다람쥐 헌 쳇바퀴에 타고파
|
semiBold
|
600
|
다람쥐 헌 쳇바퀴에 타고파
|
bold
|
700
|
다람쥐 헌 쳇바퀴에 타고파
|
extraBold
|
800
|
다람쥐 헌 쳇바퀴에 타고파
|
black
|
900
|
다람쥐 헌 쳇바퀴에 타고파
|
| Code | Value | Preview |
|---|---|---|
100
|
1rem
|
다람쥐 헌 쳇바퀴에 타고파 Lorem ipsum dolor sit amet
|
200
|
1.125rem
|
다람쥐 헌 쳇바퀴에 타고파 Lorem ipsum dolor sit amet
|
300
|
1.375rem
|
다람쥐 헌 쳇바퀴에 타고파 Lorem ipsum dolor sit amet
|
400
|
1.5rem
|
다람쥐 헌 쳇바퀴에 타고파 Lorem ipsum dolor sit amet
|
450
|
1.625rem
|
다람쥐 헌 쳇바퀴에 타고파 Lorem ipsum dolor sit amet
|
500
|
1.75rem
|
다람쥐 헌 쳇바퀴에 타고파 Lorem ipsum dolor sit amet
|
600
|
2.125rem
|
다람쥐 헌 쳇바퀴에 타고파 Lorem ipsum dolor sit amet
|
700
|
2.5rem
|
다람쥐 헌 쳇바퀴에 타고파 Lorem ipsum dolor sit amet
|
800
|
3.25rem
|
다람쥐 헌 쳇바퀴에 타고파 Lorem ipsum dolor sit amet
|
| Code | Value | Preview |
|---|---|---|
50
|
2px
|
|
100
|
4px
|
|
200
|
8px
|
|
300
|
12px
|
|
400
|
16px
|
|
full
|
999px
|
| Code | Value | Preview |
|---|---|---|
0
|
0
|
|
25
|
0.0625rem
|
|
50
|
0.125rem
|
|
100
|
0.25rem
|
|
150
|
0.375rem
|
|
200
|
0.5rem
|
|
250
|
0.625rem
|
|
300
|
0.75rem
|
|
400
|
1rem
|
|
500
|
1.25rem
|
|
600
|
1.5rem
|
|
800
|
2rem
|
|
1000
|
2.5rem
|
|
1200
|
3rem
|
|
1600
|
4rem
|
|
2000
|
5rem
|
다람쥐 헌 쳇바퀴에 타고파
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
다람쥐 헌 쳇바퀴에 타고파
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
다람쥐 헌 쳇바퀴에 타고파
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
다람쥐 헌 쳇바퀴에 타고파
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
다람쥐 헌 쳇바퀴에 타고파
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
다람쥐 헌 쳇바퀴에 타고파
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
다람쥐 헌 쳇바퀴에 타고파
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
다람쥐 헌 쳇바퀴에 타고파
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
다람쥐 헌 쳇바퀴에 타고파
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
다람쥐 헌 쳇바퀴에 타고파
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
다람쥐 헌 쳇바퀴에 타고파
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
다람쥐 헌 쳇바퀴에 타고파
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
다람쥐 헌 쳇바퀴에 타고파
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
md,
},
}}
/>
### Checkbox.Input
체크박스 인풋 + 시각적 인디케이터 (SVG 아이콘). 네이티브 `` props를 그대로 전달할 수 있습니다. `ref`는 `` 요소에 포워딩됩니다.
sm,md,lg
),
default: md,
},
indeterminate: {
description: 'Indeterminate (mixed) 상태. 부모 체크박스 패턴에서 사용',
type: boolean,
default: false,
},
disabled: {
description: '비활성 상태',
type: boolean,
default: false,
},
checked: {
description: '체크 상태 (controlled)',
type: boolean,
default: undefined,
},
defaultChecked: {
description: '초기 체크 상태 (uncontrolled)',
type: boolean,
default: undefined,
},
onChange: {
description: '변경 핸들러',
type: {`ChangeEventHandler`} ,
default: undefined,
},
}}
/>
### Checkbox.Label
레이블 콘텐츠. 텍스트, 아이콘 등 ReactNode를 받습니다.
sm,md,lgmd,
},
}}
/>
## 스타일
### Size Variants
| Size | Indicator 크기 | SVG 크기 |
| ---- | ------------ | ------ |
| `sm` | 14px | 16px |
| `md` | 16px | 18px |
| `lg` | 20px | 22px |
### Color States
| State | Color Token | 비고 |
| --------------- | --------------------------- | ----------- |
| unchecked | `toggle.primary.3` (border) | |
| unchecked:hover | `toggle.hover.bg` (fill) | |
| checked | `toggle.primary.1` (fill) | |
| checked:hover | `toggle.primary.2` (fill) | |
| indeterminate | `toggle.primary.1` (fill) | checked와 동일 |
| disabled | `toggle.disabled.bg/border` | |
| disabled text | `toggle.disabled.text` | |
| focus-visible | `focus` (outline stroke) | |
### CheckboxState
`className`, `style` 콜백에 전달되는 상태 객체입니다. Root, Input, Label 모두 동일합니다.
boolean,
},
}}
/>
### CheckboxSize
sm,md,lg
),
},
}}
/>
# Field
import { TypeTable } from 'fumadocs-ui/components/type-table';
## 개요
`Field`는 **폼 컨트롤(TextInput, Select 등)에 레이블·보조 텍스트·검증 메시지를 연결**하는 컨테이너입니다.
* **자동 ID 연결** — `Field.Root`가 고유 `fieldId`, `descriptionId`, `validationId`를 생성하고 자식에 context로 전파
* **접근성 자동화** — `Field.Label`의 `htmlFor`, `Field.Description`·`Field.Message`의 `id`가 자동 설정
* **상태 전파** — `status`, `disabled`, `readOnly`가 context를 통해 하위 컴포넌트(TextInput 등)로 전달
* **4가지 `status`** — `none` (기본), `success`, `warning`, `error`
* **`$css` prop** — 모든 서브컴포넌트에서 rainbow-sprinkles 토큰 기반 스타일링
* **`render` prop** — base-ui 기반 다형성 렌더링
### 접근성
* **WCAG 1.3.1** — `Field.Label`이 `htmlFor`로 입력 요소와 연결
* **WCAG 3.3.1** — `Field.Message`가 `role="alert"` 또는 `aria-live`로 오류 안내
* **WCAG 3.3.2** — `Field.Description`의 `id`가 입력 요소의 `aria-describedby`에 자동 연결
* **WCAG 1.4.3** — `disabled`/`readOnly` 상태는 시각적 색상과 aria 속성 모두 변경
## Usage
### 기본 사용법
none,success,warning,error),
default: none,
},
disabled: {
description: '비활성 상태. context를 통해 하위 컴포넌트로 전파',
type: boolean,
default: false,
},
readOnly: {
description: '읽기 전용 상태. context를 통해 하위 컴포넌트로 전파',
type: boolean,
default: false,
},
children: {
description: '필드 콘텐츠 (Label, 폼 컨트롤, Description, Message)',
type: ReactNode,
default: undefined,
},
}}
/>
### Field.Label
레이블 요소. `htmlFor`가 `Field.Root`의 `fieldId`에 자동 연결됩니다.
false,
},
children: {
description: '레이블 콘텐츠',
type: ReactNode,
default: '-',
},
}}
/>
### Field.Description
보조 설명 텍스트. `id`가 자동 설정되어 폼 컨트롤의 `aria-describedby`에 연결됩니다.
boolean,
},
}}
/>
# Link
import { TypeTable } from 'fumadocs-ui/components/type-table';
## 개요
`Link`는 **텍스트 기반 하이퍼링크** 컴포넌트입니다.
* **2가지 `size`** — `sm` (body-1), `md` (body-2)
* **3가지 `underline`** — `always` (기본), `hover`, `none`
* **visited 상태** — 기본 활성, `visited={false}`로 opt-out 가능
* **외부 링크 안전 처리** — `target="_blank"` 시 자동 `rel="noopener noreferrer"` + 스크린리더 안내
* **`render` prop** — Next.js Link 등 라우터 라이브러리 연동
* **`$css` prop** — rainbow-sprinkles를 통해 디자인 토큰 기반 스타일링
### 접근성
* **WCAG 1.4.1** — `underline="always"` 기본값으로 색상 외 시각적 구분 제공
* **WCAG 2.4.7** — `focus-visible` 시 2px solid 아웃라인
* **외부 링크** — `target="_blank"` 시 `(새 탭에서 열림)` 스크린리더 텍스트 자동 삽입
* **disabled** — `aria-disabled` + `data-disabled` + 클릭 차단, focus-visible 아웃라인도 제거
## Usage
### 기본 사용법
sm,md
),
default: sm,
},
underline: {
description: '밑줄 동작. 인라인 링크에는 always 권장 (WCAG 1.4.1)',
type: (
always,hover,none
always,
},
visited: {
description: 'Visited 상태 스타일 활성화. 대시보드 등에서 false로 비활성화',
type: boolean,
default: true,
},
disabled: {
description: '비활성 상태. aria-disabled 설정 및 클릭 차단',
type: boolean,
default: false,
},
}}
/>
### Link.Text
`Typo` 컴포넌트를 래핑하며, `Link.Root`의 `size`에 따라 타이포그래피 variant가 자동 결정됩니다.
sm → $body-1, md → $body-2,
},
}}
/>
### Link.Icon
아이콘 래퍼. `size`에 따라 SVG 크기가 자동 조절됩니다 (sm: 14px, md: 16px).
boolean,
},
}}
/>
### Data Attributes
base-ui 철학에 따라 상태는 `data-*` 속성으로 DOM에 반영됩니다. 소비자 CSS에서 직접 타겟할 수 있습니다.
| 속성 | 조건 | 용도 |
| --------------- | --------------------- | --------------- |
| `data-disabled` | `disabled={true}` | 비활성 스타일 커스텀 |
| `data-visited` | `visited={true}` (기본) | visited 스타일 커스텀 |
```css
/* 소비자 CSS 예시 */
.my-link[data-disabled] { opacity: 0.5; }
.my-link[data-visited]:visited { color: gray; }
```
### LinkSize
sm,md
),
},
}}
/>
### LinkUnderline
always,hover,none
),
},
}}
/>
# Loader
import { TypeTable } from 'fumadocs-ui/components/type-table';
## 개요
`Loader`는 비동기 작업의 **로딩 상태**를 표시하는 스피너 컴포넌트입니다.
* **7가지 `size`** — `xxs`, `xs`, `sm`, `md`, `lg`, `xl`, `xxl`
* **2가지 `color`** — `primary`, `white`
* **`$css` prop** — rainbow-sprinkles를 통해 디자인 토큰 기반 스타일링
`Button`의 `loading` 상태, `StatusBadge.Loader` 등 내부 컴포넌트에서도 사용됩니다.
## Usage
### 기본 사용법
xxs,xs,sm,md,lg,xl,
xxl
),
default: md,
},
color: {
description: '로더 색상',
type: (
primary,white
primary,
},
}}
/>
## 스타일
### Size Variants
| Size | Width/Height | Border Width |
| ----- | ------------ | ------------ |
| `xxs` | 8px | 1.2px |
| `xs` | 16px | 2.5px |
| `sm` | 24px | 3.8px |
| `md` | 40px | 6.45px |
| `lg` | 56px | 9px |
| `xl` | 72px | 11.5px |
| `xxl` | 88px | 14.1px |
### Color Variants
| Color | border-color | border-right-color |
| --------- | ------------------------------ | ------------------ |
| `primary` | `border-default` | `primary[60]` |
| `white` | `border-default (40% opacity)` | `white` |
### Animation
* **Keyframes**: `spinner` — `rotate(1turn)`
* **Duration**: `1s`
* **Timing**: `linear`
* **Iteration**: `infinite`
### LoaderSize
xxs,xs,sm,md,lg,xl,
xxl
),
},
}}
/>
### LoaderColor
primary,white
),
},
}}
/>
# Radio
import { TypeTable } from 'fumadocs-ui/components/type-table';
## 개요
`Radio`는 **여러 옵션 중 하나를 선택**하는 폼 컨트롤입니다.
* **Compound composition** — `Group`, `Root`, `Input`, `Label`을 자유롭게 배치
* **3가지 `size`** — `sm` (14px), `md` (16px, 기본), `lg` (20px)
* **Group 값 관리** — `value`/`onValueChange`로 단일 선택 제어
* **`$css` prop** — 모든 서브컴포넌트에서 rainbow-sprinkles 토큰 기반 스타일링
* **`render` prop** — base-ui 기반 다형성 렌더링
* **네이티브 ``** 기반 — form 제출 호환
### 접근성
* **WCAG 1.3.1** — `role="radiogroup"` + `