원본 Gist
shadcn/ui 디자인 브리프: 핵심 UI/UX 미학
shadcn/ui의 핵심 UI/UX 미학에 대한 상세한 디자인 브리프입니다.
1. 기하학 & 레이아웃 (Geometry & Layout)
구현 지침:
- 12-컬럼 그리드 시스템과 컬럼 사이에 16px의 거터(gutters)를 사용합니다.
- 컨테이너의 최대 너비를
SM (640px),MD (768px),LG (1024px),XL (1280px),2XL (1536px)로 설정합니다. - 모바일에서는 컨테이너에 24px 패딩을 유지하고, 데스크톱에서는 32px로 늘립니다.
- 컴포넌트 프레임의 크기를 일관되게 유지합니다: 버튼 (높이: 40px), 폼 입력 (높이: 44px).
- 최적의 가독성을 위해 콘텐츠 컨테이너 너비를 65-70자(약 600px)로 유지합니다.
- 대시보드 레이아웃에서 2:1의 콘텐츠 대 사이드바 비율을 사용하여 비대칭을 구현합니다.
2. 타이포그래피 (Typography)
구현 지침:
- 기본 폰트 패밀리로 Inter를 설치하고 다음 두께를 사용합니다: 400 (regular), 500 (medium), 600 (semibold), 700 (bold).
- 이 스케일에 따라 폰트 크기를 설정합니다: 본문 (14px/0.875rem), h6 (16px/1rem), h5 (18px/1.125rem), h4 (20px/1.25rem), h3 (24px/1.5rem), h2 (30px/1.875rem), h1 (36px/2.25rem).
- 다음과 같은 줄 간격을 적용합니다: 제목 (1.2), 본문 텍스트 (1.5), 작은 텍스트 (1.4).
- 폰트 두께를 전략적으로 사용합니다: 제목 (600/700), 본문 (400), UI 라벨 (500).
- 문자 간격(letter spacing)을 설정합니다: 제목은 -0.025em, 본문 텍스트는 normal.
- 페이지당 3단계 이하의 제목으로 적절한 계층 구조를 구현합니다.
3. 색상 팔레트 (Color Palette)
구현 지침:
- 기본 팔레트: 중립 색상으로 Slate-50 (#f8fafc)부터 Slate-950 (#020617)까지, 그리고 선택한 강조 색상을 사용합니다.
- 구체적인 의미론적 색상을 사용합니다:
- Primary: #0ea5e9 (sky-500)
- Success: #22c55e (green-500)
- Warning: #f59e0b (amber-500)
- Destructive: #ef4444 (red-500)
- Muted: slate-200 (라이트 모드), slate-800 (다크 모드)
- 각 색상에 대해 50(가장 밝음)부터 950(가장 어두움)까지 10단계의 그라데이션을 적용합니다.
- 모든 텍스트가 WCAG AA 표준을 충족하는지 확인합니다: 일반 텍스트는 4.5:1, 큰 텍스트는 3:1.
- 테마 변경이 용이하도록 루트 스코프에서 CSS 변수를 설정합니다.
4. 배경 (Backgrounds)
구현 지침:
- 기본 배경: 라이트 모드는 white (#ffffff), 다크 모드는 slate-950 (#020617).
- 보조 표면: 라이트 모드는 slate-50 (#f8fafc), 다크 모드는 slate-900 (#0f172a).
- 그림자 스케일로 미묘한 깊이를 추가합니다:
xs,sm,md,lg. - 카드 배경은 1px 테두리로 구현합니다: 라이트 모드 (흰색 배경, slate-200 테두리), 다크 모드 (slate-800 배경, slate-700 테두리).
- 다이얼로그 및 드롭다운과 같은 오버레이 요소에는 8px의 배경 블러와 40%의 불투명도를 사용합니다.
5. 모서리 반경 (Corner Radius)
구현 지침:
- 다음의 모서리 반경 스케일을 구현합니다:
none: 0px,sm: 2px,DEFAULT: 4px,md: 6px,lg: 8px,xl: 12px,full: 9999px. - 반경을 일관되게 적용합니다:
- 버튼, 입력 필드:
radius-md (6px) - 카드, 다이얼로그:
radius-lg (8px) - 알약(Pills), 태그:
radius-full - 알림 배너:
radius-DEFAULT (4px) - 중첩 요소 (버튼 그룹): 내부 요소에
radius-sm (2px)
- 버튼, 입력 필드:
- 시각적 조화를 유지하기 위해 한 화면에서 3가지 이상의 다른 반경 값을 혼합하지 않습니다.
6. 간격 시스템 (Spacing System)
구현 지침:
- 기본 간격 단위: 4px (0.25rem).
- 제공된 간격 스케일(0~16)을 적용합니다.
- 다음 요소에 일관된 간격을 사용합니다:
- 버튼 패딩:
px-4 py-2(가로 16px, 세로 8px) - 폼 필드 간격:
mb-4(하단 마진 16px) - 섹션 간격:
my-8(수직 마진 32px) - 컨테이너 패딩:
p-6(모든 면 24px) - 컴포넌트 그룹:
gap-2(항목 간 8px 간격)
- 버튼 패딩:
- 모바일 기기(너비 640px 미만)에서는 간격을 25% 축소합니다.
7. 상호작용 요소 (Interactive Elements)
구현 지침:
- 버튼 상태:
- 기본: 단색 채움과 대조되는 텍스트
- 호버: 10% 더 어두운 채움,
cursor: pointer - 활성/눌림: 15% 더 어두운 채움,
translate-y: 1px - 포커스: 50% 불투명도의 기본 색상으로 2px 외곽선, 2px 오프셋
- 비활성: 40% 불투명도,
cursor: not-allowed
- 애니메이션 타이밍:
- 빠른 상호작용 (버튼, 토글): 150ms
- 확장/축소: 200-250ms
- 진입/진출 전환: 300ms
- 진입 시
ease-out, 상태 변경 시ease-in-out을 사용한 CSS 전환을 사용합니다. - 모든 상호작용 요소에 호버 전환을 구현하고, 상호작용에 적합한
transform-origin을 사용합니다. - 최소 2개의 시각적 속성(예: 색상 + 크기)을 변경하여 모든 사용자 상호작용에 대한 가시적인 피드백을 제공합니다.
8. 디자인 철학 & 구현
구현 지침:
- 외부 종속성이 없는 컴포넌트 격리를 우선시합니다.
- 복합 패턴(예:
Dialog.Root,Dialog.Trigger)을 사용하여 컴포넌트를 구조화합니다. - 컴포넌트 props는 최소화하되 유연하게 유지합니다 (
contentprops보다children선호). cva (class-variance-authority)를 사용하여 변형(variants)을 구현합니다.- 하드코딩된 값 대신 테마를 위해 CSS 사용자 정의 속성을 사용합니다.
- 디자인 토큰 구성을 위해
tokens.json파일을 유지합니다. - 640px, 768px, 1024px, 1280px의 중단점을 가진 모바일 우선 접근 방식을 사용하여 반응형 디자인을 구현합니다.