DS Archive

Anthropic

EditLogin

Philosophy

Principles

  • Clarity over decoration
  • Trust through restraint
  • Academic rigor with warmth
  • Safety-first visual language

Tone Keywords

  • scholarly
  • trustworthy
  • warm
  • precise
  • minimal

Do

  • Use whitespace generously
  • Prefer serif for headings
  • Keep color palette restrained
  • Communicate hierarchy through typography

Don't

  • Use gradients or glowing effects
  • Add decorative illustrations
  • Use more than 3 accent colors
  • Animate without purpose

Tradeoffs

  • Visual excitement vs. trustworthiness — always choose trust
  • Density vs. readability — lean toward readability

Exception Policy

Exceptions allowed for marketing campaigns with explicit design review approval.

Methodology

guidelines
  • Content drives layout, not the reverse
  • Every UI element must have a clear purpose
  • Progressive disclosure: show essentials first, details on demand
  • Design for scanning, not reading
description
Anthropic follows a content-first, progressive disclosure approach. Design starts with information architecture before visual treatment.
testLocation
Co-located: ComponentName.test.tsx next to ComponentName.tsx
exportPattern
Named exports only. No barrel files (index.ts re-exports). Direct imports from component file.
fileStructure
atoms
src/components/atoms/ — Button, Input, Badge, Tooltip
molecules
src/components/molecules/ — SearchField, FormField, Card
organisms
src/components/organisms/ — NavigationBar, SidebarMenu, DataTable
templates
src/components/templates/ — DocumentationLayout

Token Architecture

tiers
  • primitive
  • semantic
  • component
description
Three-tier token architecture: Primitive → Semantic → Component. Primitives are raw values. Semantic tokens map to use-cases. Component tokens are scoped to specific UI elements.
mappingRules
  • {"to":"semantic","from":"primitive","rule":"One-to-many: a primitive value can feed multiple semantic tokens"}
  • {"to":"component","from":"semantic","rule":"One-to-one: a component token references exactly one semantic token"}
namingConvention
kebab-case with tier prefix: --color-primitive-cream, --color-bg-primary, --button-bg-default

Colors

Warm, restrained palette centered on cream, terracotta, and neutral slates. Dark mode inverts semantic mappings while preserving tone.

Dark Mode Policy

Strategy
semantic-inversion
Toggle
System preference with manual override (class-based: .dark on <html>)
Brand Color
Terracotta (#d97757) stays constant across modes. Background and text invert.
Implementation
CSS custom properties swap values. No separate stylesheet.

background

bg-primary

Light: #faf9f5

Dark: #131314

기본 배경 색상

bg-secondary

Light: #e8e6dc

Dark: #2a2a2b

보조 배경 색상

text

text-primary

Light: #3d3929

Dark: #faf9f5

기본 본문 텍스트

text-secondary

Light: #6b6459

Dark: #b0aea5

보조 텍스트

text-muted

Light: #b0aea5

Dark: #6b6459

약한 강조 텍스트

accent

accent-primary

Light: #d97757

Dark: #d97757

주요 액션 강조

accent-hover

Light: #c4684a

Dark: #e8967e

호버 상태 강조

accent-blue

Light: #6a9bcc

Dark: #6a9bcc

정보성 강조

accent-green

Light: #788c5d

Dark: #788c5d

성공 상태 강조

border

border-default

Light: #e8e6dc

Dark: #2a2a2b

기본 테두리 색상

border-hover

Light: #b0aea5

Dark: #6b6459

호버 시 테두리 색상

surface

surface-card

Light: #ffffff

Dark: #1a1a1b

카드 표면 색상

surface-overlay

Light: #ffffff

Dark: #232324

오버레이 표면 색상

Typography

Serif display + sans-serif UI + serif body stack. Hierarchy expressed through weight and size, not color.

Font Families (English)

Libre Baskerville

Locale: en

Fallbacks: Georgia, Times New Roman, serif

Weights: 400, 700

Usage: Display headings, Section titles, Blockquotes

DM Sans

Locale: en

Fallbacks: Helvetica Neue, Arial, sans-serif

Weights: 400, 500, 700

Usage: UI labels, Navigation, Buttons, Form fields

Source Serif 4

Locale: en

Fallbacks: Georgia, serif

Weights: 400, 600

Usage: Body text, Long-form content, Documentation

Font Families (Korean)

Noto Serif KR

Locale: ko

Fallbacks: Batang, serif

Weights: 400, 700

Usage: Korean headings, Korean body text, Korean blockquotes

Pretendard

Locale: ko

Fallbacks: Apple SD Gothic Neo, Malgun Gothic, sans-serif

Weights: 400, 500, 600, 700

Usage: Korean UI labels, Korean navigation, Korean form fields

Korean Font Pairing

ui
Pretendard — pairs with DM Sans for UI labels and navigation
body
Noto Serif KR — pairs with Source Serif 4 for long-form
display
Noto Serif KR — pairs with Libre Baskerville for headings

Platform Fonts

PlatformDisplayBodyUI
iosNew York, Noto Serif KR, Georgia, serifNew York, Noto Serif KR, Georgia, serifSF Pro, Apple SD Gothic Neo, system-ui, sans-serif
webLibre Baskerville, Noto Serif KR, Georgia, serifSource Serif 4, Noto Serif KR, Georgia, serifDM Sans, Pretendard, system-ui, sans-serif
androidNoto Serif, Noto Serif KR, serifNoto Serif, Noto Serif KR, serifRoboto, Noto Sans KR, system-ui, sans-serif

Type Scales

NameSizeLine HeightWeightLetter Spacing
Display XL48px1.1700-0.02em
Display L36px1.2700-0.01em
Heading 130px1.3700-
Heading 224px1.4700-
Heading 320px1.4600-
Body L18px1.6400-
Body M16px1.5400-
Caption13px1.4400-

Spacing

grid
gutter
24px
margin
16px (mobile), 24px (tablet), 32px (desktop)
columns
12
baseUnit
4px
maxWidth
1280px
border
styles
{"dashed":"dashed","default":"solid"}
widths
{"thin":"1px","thick":"3px","medium":"2px"}
defaultColor
var(--border-default)
shapes
card
{"border":"1px solid var(--border-default)","shadow":"var(--shadow-low)","borderRadius":"8px"}
badge
{"paddingX":"8px","paddingY":"2px","borderRadius":"9999px"}
input
{"border":"1px solid var(--border-default)","height":"40px","borderRadius":"8px"}
modal
{"border":"none","shadow":"var(--shadow-high)","borderRadius":"12px"}
button
{"paddingX":"16px","minHeight":"36px","borderRadius":"8px"}
sizing
scale
  • 24
  • 32
  • 40
  • 48
  • 56
  • 64
  • 80
  • 96
  • 120
  • 160
  • 240
  • 320
  • 480
iconSizes
{"lg":"24px","md":"20px","sm":"16px","xl":"32px"}
touchTarget
{"ios":"44px (Apple HIG)","web":"32px minimum, 40px recommended","android":"48dp (Material Design)"}
description
4px base unit. Spacing scale: 4, 8, 12, 16, 24, 32, 48, 64, 96. Content areas use generous padding (32-48px). Compact UI uses 8-16px.
densityModes
compact
{"gap":"8px","usage":"Data tables, toolbars","verticalPadding":"4px","horizontalPadding":"8px"}
default
{"gap":"16px","usage":"Forms, cards, general UI","verticalPadding":"8px","horizontalPadding":"16px"}
comfortable
{"gap":"24px","usage":"Marketing, landing pages","verticalPadding":"12px","horizontalPadding":"24px"}

Shadow & Depth

zIndex
base
0
modal
400
toast
500
sticky
200
overlay
300
tooltip
600
dropdown
100
description
Minimal shadow usage. Shadows are soft and warm-toned, never blue-gray. Elevation levels: none (default), low (cards), medium (dropdowns), high (modals).

Atoms

Button

클릭 액션을 수행하는 기본 버튼 컴포넌트

atom

Usage: 주요/보조 액션 트리거

Input

텍스트 입력 계열 컴포넌트

atom

Usage: 폼 데이터 입력

Badge

상태/카테고리를 표시하는 라벨

atom

Usage: 짧은 상태 정보 표시

Tooltip

보조 설명을 표시하는 떠있는 힌트

atom

Usage: 보조 설명 제공

CopyButton

텍스트 복사 동작을 수행하는 버튼

atom

Usage: 코드/식별자 복사

Tab

콘텐츠 영역을 전환하는 탭 내비게이션

atom

Usage: 관련 콘텐츠 간 전환 (Preview/Code, Settings 탭 등)

Toggle

온/오프 상태를 전환하는 스위치 컴포넌트

atom

Usage: 설정 켜기/끄기, 기능 활성화/비활성화

ThemeToggle

라이트/다크 모드를 전환하는 테마 토글 버튼

atom

Usage: 헤더에 배치하여 사용자가 테마를 수동 전환

Molecules

SearchField

입력창과 액션 버튼을 조합한 검색 필드

molecule

Usage: 검색 조건 입력 및 실행

FormField

라벨, 입력, 검증 메시지를 묶은 필드

molecule

Usage: 폼 입력 단위 구성

Card

콘텐츠 그룹을 담는 카드

molecule

Usage: 정보 묶음 표현

Organisms

NavigationBar

상단 전역 내비게이션

organism

Usage: 전역 이동 및 검색 접근

SidebarMenu

문서/페이지 탐색 사이드바

organism

Usage: 섹션/페이지 이동

DataTable

행/열 데이터 표시 테이블

organism

Usage: 정형 데이터 조회

Composition

description
Layout patterns: sidebar + main (documentation), centered narrow (marketing), full-bleed hero + contained body (landing pages). Max content width: 1280px.
contentAreas
main
{"padding":"32px","maxWidth":"1280px"}
footer
{"padding":"48px 32px","borderTop":"1px solid var(--border-default)"}
header
{"height":"64px","zIndex":200,"position":"sticky top-0"}
sidebar
{"width":"280px","position":"fixed left-0","breakpoint":"hidden below lg"}
boxArrangement
flex
Use for single-axis layouts (nav items, button groups, form rows)
grid
Use for two-dimensional layouts (card grids, data tables, dashboards)
stack
Use for vertical stacking with consistent gaps (section lists, form fields)
layoutPatterns
  • {"css":"grid grid-cols-[280px_1fr] min-h-screen","name":"sidebar-main","usage":"Documentation, design system viewer, settings","structure":{"main":"fluid","footer":false,"header":true,"sidebar":true}}
  • {"css":"flex min-h-screen items-center justify-center","name":"centered-card","usage":"Login, auth callback, error pages","maxWidth":"480px","structure":{"main":"centered","footer":false,"header":false,"sidebar":false}}
  • {"css":"mx-auto max-w-3xl px-6","name":"centered-narrow","usage":"Marketing, blog posts, legal pages","maxWidth":"720px","structure":{"main":"centered","footer":true,"header":true,"sidebar":false}}
  • {"css":"w-full + mx-auto max-w-7xl px-6","name":"full-bleed-hero","usage":"Landing pages, product announcements","structure":{"main":"full-width-hero + contained-body","footer":true,"header":true,"sidebar":false}}
  • {"css":"grid grid-cols-[240px_1fr] min-h-screen","name":"dashboard","usage":"Admin panels, analytics, monitoring","structure":{"main":"grid","footer":false,"header":true,"sidebar":true}}
maxContentWidth
1280px

Responsive

statusBar
ios
Light content on dark backgrounds, dark content on light backgrounds. Safe area insets respected.
android
Transparent status bar with edge-to-edge rendering. System bars adapt to theme.
breakpoints
lg
1024px
md
768px
sm
640px
xl
1280px
description
Mobile-first with 3 breakpoints: sm (640px), md (768px), lg (1024px). Sidebar collapses to hamburger below lg. Typography scales down 1 step on mobile.
gridColumns
lg
12
md
8
sm
4
xl
12
typeScaleAdjust
mobile
All sizes -2px. Display XL 48→40, Display L 36→30, H1 30→26
tablet
All sizes -1px from desktop
desktop
Base scale as defined in type scales
platformNavigation
ios
Tab bar (bottom) + navigation controller (push/pop)
web
Top navbar + left sidebar (desktop), hamburger + drawer (mobile)
android
Bottom navigation bar + navigation drawer (swipe from left)
componentAdaptations
  • {"behavior":"Collapsible drawer below lg. Full sidebar at lg+.","component":"SidebarMenu"}
  • {"behavior":"Hamburger menu below md. Inline links at md+.","component":"NavigationBar"}
  • {"behavior":"Horizontal scroll below md. Full width at md+.","component":"DataTable"}
  • {"behavior":"1-col at sm, 2-col at md, 3-col at lg.","component":"Card grid"}

States

states
  • default
  • hover
  • active
  • focus
  • disabled
  • error
  • success
  • loading
description
State communication through subtle visual changes. Hover: border color shift. Active: background tint. Disabled: 40% opacity. Error: terracotta border + message. Success: muted green accent.
emptyStates
action
Primary CTA button to resolve the empty state (e.g., 'Create first item').
message
Clear explanation of why content is empty + what user can do next.
illustration
Minimal line illustration (not decorative). Optional, never required.
stateStyles
  • {"state":"default","visual":"Base appearance. No special treatment."}
  • {"state":"hover","visual":"Border shifts to --border-hover. Subtle background tint on interactive elements."}
  • {"state":"active","visual":"Background darkens 5%. Transform scale(0.98) for buttons."}
  • {"state":"focus","visual":"2px ring in --accent-primary with 2px offset. Visible on keyboard focus only (:focus-visible)."}
  • {"state":"disabled","visual":"opacity: 0.4. cursor: not-allowed. No hover/active effects."}
  • {"state":"error","visual":"Border color --accent-primary (terracotta). Error message text below input."}
  • {"state":"success","visual":"Border color --accent-green. Check icon. Brief green tint fade."}
  • {"state":"loading","visual":"Skeleton shimmer or spinner. Disabled interaction during load."}
errorPatterns
toast
Bottom-right toast notification. Auto-dismiss after 5s. Manual dismiss available.
inline
Red border + error message directly below the input field.
fullPage
Centered error illustration + error code + description + retry button.
loadingPatterns
spinner
16px circle spinner for inline, 32px for section-level, 48px for page-level.
progress
Thin progress bar at top of viewport for page transitions.
skeleton
Gray rectangular placeholders matching content shape. Shimmer animation left-to-right.
connectivityStates
online
No indicator. Default state.
offline
Yellow banner at top: 'You are offline. Changes will sync when reconnected.'
reconnecting
Pulsing dot indicator in header. Auto-retry with exponential backoff.

Naming

examples
token
--color-bg-primary
cssClass
text-slate-600
fileName
sidebar-nav.tsx
component
SidebarNav
fileNaming
kebab-case for all files: sidebar-nav.tsx, use-debounce.ts, auth-callback/page.tsx
description
BEM-inspired with Tailwind utility classes. Components use PascalCase. CSS custom properties use kebab-case with semantic prefixes.
tailwindRules
  • Prefer semantic Tailwind classes (text-slate-900) over arbitrary values ([color:#3d3929])
  • Group related utilities: layout → spacing → typography → color → effects
  • Use @apply sparingly — only for repeated patterns in global CSS
  • Responsive: mobile-first (sm: md: lg:). Never use max-width media queries.
  • Dark mode: dark: prefix. Always define both light and dark variants.
cssVariableRules
  • Define in :root for light, .dark for dark mode
  • Prefix by category: --color-*, --space-*, --shadow-*, --radius-*
  • Reference via Tailwind theme extension, not inline var()
responsiveUtilities
  • Use container queries (@container) for component-level responsive behavior
  • Use media queries (@media) for page-level layout changes
  • Prefer min-width breakpoints (mobile-first). Never max-width.

Accessibility

target
WCAG 2.1 AA
contrast
ui
3:1
text
4.5:1
largeText
3:1
description
WCAG 2.1 AA target. All interactive elements have visible focus rings. Color is never the sole indicator. Minimum contrast ratio 4.5:1 for text, 3:1 for large text.
requirements
  • Keyboard navigation for all interactions
  • Screen reader labels on icons (aria-label or sr-only text)
  • Reduced motion support (prefers-reduced-motion: reduce)
  • Sufficient color contrast (4.5:1 text, 3:1 large text, 3:1 UI components)
  • Focus indicators visible on all interactive elements
  • Form inputs with associated labels (htmlFor/id pairing)
  • Error messages linked to inputs via aria-describedby
  • Skip-to-content link as first focusable element

Motion

defaults
easing
cubic-bezier(0.25, 0.1, 0.25, 1)
duration
300ms
enterFrom
{"y":8,"opacity":0}
description
Purposeful, restrained animation. Entry transitions only (no exit). Duration: 200-300ms. Easing: cubic-bezier(0.25, 0.1, 0.25, 1). Respect prefers-reduced-motion.
reducedMotion
When prefers-reduced-motion is set, disable all transform animations. Opacity transitions remain but execute instantly (duration: 0ms).