Things 3
노란 Today 별 + 원형 완료 컨트롤 + 블루 Magic Plus의 정갈한 할 일 앱
Brand DNA
브랜드 DNA
- 브랜드명: Things 3 (Cultured Code)
- 한 줄 정체성: macOS·iOS 전용 프리미엄 할 일 앱 — 2017 Apple Design Award
- 공식 디자인 철학: "Beautifully simple" — Apple HIG 충실, 정갈한 타이포·여백
- 시그니처 요소 1개: 노란 Today 별(★), 얇은 원형 완료 컨트롤, Things Blue(#3A82F7)의 Magic Plus가 만드는 “오늘 중심” 흐름. Inbox/Today/Upcoming/Anytime/Someday 시간 분류와 SF Pro의 정갈한 리듬이 이를 받칩니다.
Tone & Mood
톤 & 무드
- 핵심 키워드 3개: 정갈, 아름다움, 애플답게
- 무드 설명: 기본 Light appearance는 깨끗한 종이 같은 흰 작업면과 옅은 회색 사이드바를 사용하고, 공식 Dark appearance는 같은 위계를 차콜 표면으로 옮깁니다. 색은 Things Blue, Today Yellow, Deadline Red에만 절제해 쓰며 넓은 여백과 부드러운 원형 컨트롤이 핵심입니다.
- 비주얼 스타일: 모던 미니멀
- 밀도(Density): Comfortable
- 모서리 성향: Round (4~10px)
- 평면성: Subtle
Color System
컬러 시스템 (CSS 변수)
:root {
/* Primary - Things Blue */
--color-primary-50: #E0EDFE;
--color-primary-100: #BDD7FD;
--color-primary-200: #90BAFB;
--color-primary-300: #639CFA;
--color-primary-400: #4D8FF9;
--color-primary-500: #3A82F7; /* Things Blue */
--color-primary-600: #2A6FE0;
--color-primary-700: #1F55B0;
--color-primary-800: #143A78;
--color-primary-900: #082146;
/* Star (today/evening) yellow */
--color-star: #FFCC02;
/* Project deadline pink */
--color-deadline: #FF3B30;
/* Neutral (Apple system gray) */
--color-neutral-0: #FFFFFF;
--color-neutral-50: #F5F5F5;
--color-neutral-100: #F2F2F7;
--color-neutral-200: #E5E5EA;
--color-neutral-300: #D1D1D6;
--color-neutral-500: #AEAEB2;
--color-neutral-700: #8E8E93;
--color-neutral-800: #48484A;
--color-neutral-900: #1D1D1F;
--color-neutral-1000: #000000;
/* Semantic */
--color-success-bg: #D1F0DC;
--color-success-fg: #34C759;
--color-warning-bg: #FFF1C5;
--color-warning-fg: #FF9500;
--color-error-bg: #FFDAD7;
--color-error-fg: #FF3B30;
--color-info-bg: #E0EDFE;
--color-info-fg: #3A82F7;
/* Surface */
--bg-base: #F5F5F5;
--bg-subtle: #F2F2F7;
--bg-elevated: #FFFFFF;
--bg-sidebar: #F0F0F0;
--bg-overlay: rgba(29,29,31,0.40);
/* Text */
--text-primary: #1D1D1F;
--text-secondary: #48484A;
--text-tertiary: #8E8E93;
--text-on-primary: #FFFFFF;
--text-link: #3A82F7;
--text-disabled: #C7C7CC;
/* Border */
--border-default: #E5E5EA;
--border-subtle: #F2F2F7;
--border-strong: #C7C7CC;
--border-focus: #3A82F7;
}
[data-theme="dark"] {
--bg-base: #1C1C1E;
--bg-subtle: #2C2C2E;
--bg-elevated: #2C2C2E;
--bg-sidebar: #1C1C1E;
--text-primary: #FFFFFF;
--text-secondary: #EBEBF5;
--border-default: #3A3A3C;
}
Typography
타이포그래피
- 폰트 페어링:
- 영문: SF Pro Text/Display (Apple 시스템)
- 한글: Apple SD Gothic Neo / Pretendard
- 위계:
- Display: 34px / 700 / 1.2 (Today 헤더)
- H1: 28px / 700 / 1.25
- H2: 22px / 700 / 1.3
- H3: 17px / 700 / 1.35
- Body Large: 17px / 400 / 1.45 (Apple HIG body)
- Body: 15px / 400 / 1.4
- Body Small: 13px / 500 / 1.4
- Caption: 12px / 500 / 1.3
Spacing
스페이싱
- Base unit: 4px
- 토큰: ``
css --space-xs: 4px; --space-sm: 8px; --space-md: 12px; --space-lg: 18px; --space-xl: 24px; --space-2xl: 36px; --space-3xl: 56px;``
Border Radius
Border Radius
--radius-none: 0;
--radius-sm: 4px;
--radius-md: 6px; /* 버튼·입력 */
--radius-lg: 10px;
--radius-xl: 14px;
--radius-full: 9999px;
Shadow / Elevation
Shadow / Elevation
--shadow-none: none;
--shadow-sm: 0 1px 2px rgba(0,0,0,0.04);
--shadow-md: 0 4px 12px rgba(0,0,0,0.06);
--shadow-lg: 0 12px 28px rgba(0,0,0,0.10);
Iconography
Iconography
- 스타일: SF Symbols (Apple 시스템)
- Stroke 굵기: 1.5~2px (SF Symbol Regular)
- 모서리 처리: Round
- 추천 라이브러리: SF Symbols
Component Guide
컴포넌트 가이드
Button
.btn { font: 600 15px/1 -apple-system, 'SF Pro Text', sans-serif; border-radius: 6px; padding: 8px 16px; border: 0; cursor: pointer; }
.btn-primary { background: var(--color-primary-500); color: var(--text-on-primary); }
.btn-primary:hover { background: var(--color-primary-600); }
.btn-secondary { background: var(--bg-elevated); color: var(--color-primary-500); border: 1px solid var(--border-default); }
.btn-add { background: transparent; color: var(--color-primary-500); padding: 8px 0; font: 500 15px/1 inherit; display: inline-flex; align-items: center; gap: 6px; }
.btn-add::before { content: '+'; font: 400 18px/1 inherit; }
Input
.input { background: var(--bg-elevated); border: 1px solid var(--border-default); border-radius: 6px; padding: 9px 12px; font: 400 15px/1.4 inherit; color: var(--text-primary); }
.input:focus { border-color: var(--color-primary-500); outline: 2px solid rgba(58,130,247,0.20); }
.todo-input { background: transparent; border: 0; font: 400 17px/1.4 inherit; color: var(--text-primary); outline: 0; padding: 0; }
Card (To-Do row)
.todo { display: grid; grid-template-columns: 22px 1fr; gap: 12px; padding: 9px 0; align-items: flex-start; }
.todo .check { width: 18px; height: 18px; border: 1.5px solid var(--border-strong); border-radius: var(--radius-full); cursor: pointer; margin-top: 2px; display: grid; place-items: center; transition: all var(--duration-fast) var(--ease-out); }
.todo .check:hover { border-color: var(--color-primary-500); }
.todo.done .check { background: var(--color-primary-500); color: #fff; border-color: var(--color-primary-500); font: 800 12px/1 inherit; }
.todo.done .check::before { content: '✓'; }
.todo.done .title { color: var(--text-tertiary); text-decoration: line-through; }
.todo .title { font: 400 17px/1.4 inherit; color: var(--text-primary); }
.todo .meta { font: 500 13px/1.4 inherit; color: var(--text-tertiary); margin-top: 3px; display: flex; gap: 12px; align-items: center; }
.todo .meta .project { color: var(--color-primary-500); display: inline-flex; align-items: center; gap: 4px; }
.todo .meta .when { display: inline-flex; align-items: center; gap: 4px; }
.todo .meta .deadline { color: var(--color-deadline); }
.project-card { background: var(--bg-elevated); border-radius: 10px; padding: 14px 18px; box-shadow: var(--shadow-sm); }
.project-card .head { display: flex; align-items: center; gap: 10px; margin-bottom: 8px; }
.project-card .progress { width: 22px; height: 22px; border-radius: 9999px; background: conic-gradient(var(--color-primary-500) 60%, var(--bg-subtle) 0); }
.project-card .title { font: 700 17px/1.3 inherit; }
Badge / Tag
.tag { background: var(--bg-subtle); color: var(--text-secondary); border-radius: 9999px; padding: 2px 10px; font: 600 12px/1.4 inherit; }
.area-badge { background: var(--bg-subtle); color: var(--text-primary); border-radius: 6px; padding: 3px 10px; font: 600 13px/1.4 inherit; }
.star-yellow { color: var(--color-star); font: 700 14px/1 inherit; }
.heading { font: 700 17px/1.4 inherit; color: var(--text-primary); padding: 14px 0 6px; border-bottom: 1px solid var(--border-default); margin-bottom: 6px; }
Navigation (Sidebar — 5단계 시간 분류)
.sidebar { background: var(--bg-sidebar); width: 240px; padding: 14px 0; }
.sidebar .item { display: flex; align-items: center; gap: 14px; padding: 7px 18px; font: 500 15px/1 inherit; color: var(--text-secondary); cursor: pointer; border-radius: 6px; margin: 1px 8px; }
.sidebar .item:hover { background: var(--border-default); }
.sidebar .item.active { background: var(--color-primary-500); color: #fff; font-weight: 600; }
.sidebar .item.active .count { color: rgba(255,255,255,0.85); }
.sidebar .item .ico { width: 22px; text-align: center; font-size: 16px; }
.sidebar .item .count { margin-left: auto; font: 500 13px/1 inherit; color: var(--text-tertiary); }
.sidebar h2 { padding: 12px 18px 4px; font: 600 12px/1.4 inherit; color: var(--text-tertiary); text-transform: uppercase; letter-spacing: 0.04em; margin: 0; }
Motion
Motion
--duration-fast: 120ms;
--duration-base: 240ms;
--duration-slow: 400ms;
--ease-out: cubic-bezier(0.16, 1, 0.3, 1); /* Apple spring */
Anti-patterns
Anti-patterns
1. 5단계 시간 분류(Inbox/Today/Upcoming/Anytime/Someday) 축소 금지 — 시간 축 분류가 정체성 2. 완료 컨트롤을 각진 체크박스로 변경 금지 — Things의 얇은 원형 completion circle과 진행 애니메이션이 핵심 3. 본문 폰트 17px 미만으로 줄이기 금지 — Apple HIG 본문 톤 4. 색을 여러 가지 추가 금지 — Blue·Star Yellow·Deadline Red 3색만 5. 모든 표면을 떠 있는 카드로 만들기 금지 — 종이처럼 이어지는 목록, 넓은 여백, 최소한의 경계가 우선