어두운 캔버스 위,
데이터의 신호.
운동의 치트키 케이스 스터디의 디자인 시스템이에요. 디자인 시스템은 의사결정의 압축이에요 — 이 문서의 목적은 "이 고민을 다시 하지 않게" 만드는 것이고, 모든 페이지는 반복되는 질문에 대한 답으로 썼어요. 모든 수치는 style.css :root와 피그마 변수에서 실측했고, 사이트가 항상 원본이에요. HEX 코드 대신 토큰명으로 소통하는 것이 첫 번째 약속이에요.
디자인 원칙
| 원칙 | 의미 | 실천 |
|---|---|---|
| 신호는 하나씩 | 그린=러닝·액션, 퍼플=헬스·프리미엄 | 화면당 신호색은 한 위계만. 헤드라인 그린 키워드 1개 |
| 반복 대신 변주 | 동일 요소의 나열은 위계를 죽인다 | 같은 크기 3연속 금지 · 대/중/소 · 계단 오프셋 32/64/128 |
| 여백은 콘텐츠 | 빈 구간이 밀도를 만든다 | 섹션 배경 bg ↔ surface-1 교대(3연속 금지) |
| 근거 있는 수치 | 모든 숫자엔 출처가 있다 | 각주 병기("자체 설문 기반 추정값이에요") |
시스템 지도
Foundations(토큰) → Components(요소) → Patterns(조합) → Guidelines(운용) 순으로 추상에서 구체로 내려가요. 컴포넌트 문서는 코드잇 디자인 시스템의 구성(구성 요소 → 상태 → 스펙 → 사용 규칙)을 벤치마킹했어요. 여기에 치트키 DS(대비 사전검증·비교표), Material 3(스테이트 레이어·토큰 3계층), Primer(컴포넌트 상태 표기), Polaris(컴포넌트별 카피 규칙)의 문서 장치를 더했어요.
컴포넌트 상태
Primer 방식이에요. 모든 컴포넌트가 같은 완성도일 수 없으니, 상태를 명시해요. 표시 없는 컴포넌트를 쓰다 깨지는 것보다, 실험 중이라고 적혀 있는 편이 나아요.
| 컴포넌트 | 사이트 | Figma | 상태 |
|---|---|---|---|
| Button | Stable | Stable | 4개 상태·3개 변형 확정 |
| Chip | Stable | Stable | — |
| Checkbox · Radio | Stable | Stable | — |
| Text Field | Beta | Beta | 에러 상태 실사용 검증 전 |
| Navigation Bar | Stable | Stable | 4탭 고정 |
| FAB | Beta | Beta | Quick Menu · Go to Top 두 변형 |
| Overflow | Beta | Stable | 컨텍스트 메뉴 트리거 |
Stable 안심하고 사용 · Beta 사용 가능하나 변경될 수 있음 · Deprecated 새로 쓰지 않기(대체안 명시)
Logo · Voice
브랜드는 두 가지로 말해요 — 워드마크와 말투.
워드마크
- 서체: Paperlogy 900 — 디스플레이 전용, 본문에는 사용하지 않아요
- 기본색 #fff (White) — 배경 명도에 관계없이 교체하지 않아요
- 네온 그린 배경 위에서만
#0A0A0A로 반전 허용 - SVG 소스:
assets/img/cover-logo-text.svg
컬러 사용 원칙
#B6FF3D#B026FF#E5E5E5 · #7A7A7A · #4A4A4AVoice & Tone
| 원칙 | O (이렇게) | X (이렇게 말고) |
|---|---|---|
| "-요"체 | 지금 출발하면 내일 도착해요 | 지금 출발하시면 내일 도착합니다 |
| 무인칭 | 38%가 더 오래 사용했어요 | 저희 데이터에 따르면 사용 시간이 늘었습니다 |
| 수치 근거 | 쿠션이 7mm 더 두꺼워요 | 쿠션이 더 좋아요 |
| 단정 금지 | 초보자에게 잘 맞아요 | 초보자용이에요 |
Color
컬러는 2계층이에요. Primitive(순수 색값)를 정의하고, Semantic(역할 토큰)이 이를 참조해요. 작업 시엔 반드시 시맨틱 토큰명으로 소통해요. 스펙·핸드오프 문서에도 원시 HEX 대신 토큰명을 적어요 — 값이 바뀌어도 문서가 낡지 않아요.
Primitive — Gray Scale
| 값 | 계열 | |
|---|---|---|
| gray-990 | #0A0A0A | 최심도 배경 |
| gray-960 | #111111 | 표면 1 |
| gray-940 | #161616 | 표면 2 |
| gray-920 | #1A1A1A | 보더 최약 |
| gray-900 | #1D1D1D | 표면 3 |
| gray-850 | #262626 | 보더 기본 |
| gray-780 | #383838 | 보더 강조 |
| gray-650 | #4A4A4A | 텍스트 최약 |
| gray-450 | #7A7A7A | 텍스트 보조 |
| gray-100 | #E5E5E5 | 텍스트 기본 |
Primitive — Neon
| 값 | ||
|---|---|---|
| green-300 | #C8FF5F | 호버 전용 |
| green-400 | #B6FF3D | 기준색 (--neon-green) |
| green-700 (dim) | #6B8F24 | 눌림·딤 |
| purple-400 | #B026FF | 기준색 |
| purple-700 (dim) | #6D1AA0 | 보더·약화 |
Primitive — Chart / Data Viz
도넛 차트·바 차트 시리즈 색이에요. 브랜드 네온 컬러와 동시에 쓸 수 있도록 채도를 맞췄어요.
| 값 | 용도 | |
|---|---|---|
| --chart-blue | #4A9EFF | 가격·스펙 계열 (도넛 2구간) |
| --chart-orange | #FFB347 | 지인 추천 계열 (도넛 4구간) |
Semantic Tokens
| 토큰 | 참조 | 용도 · 규칙 |
|---|---|---|
| --bg | gray-990 | 페이지 배경. 다른 곳에 쓰지 않기 |
| --surface-1 / 2 / 3 | gray-960 / 940 / 900 | 교차 섹션 · 카드/디바이스 · 호버 상승면 |
| --border-lo / border / -hi | gray-920 / 850 / 780 | 구분선은 lo부터 — hi는 아이콘·강조 테두리만 |
| --text / -mid / -lo | gray-100 / 450 / 650 | 본문 → 보조 설명 → 각주·번호. 3단계 외 값 금지 |
| --neon-green | green-400 | 러닝 · 액션 · 키워드. 대면적 사용 시 텍스트는 --bg |
| --neon-green-hover | green-300 #C8FF5F | 호버 전용 — 직접 쓰지 않고 상태 레이어에서만 |
| --neon-green-dim | green-700 #6B8F24 | Pressed · 보더 약화 |
| --neon-purple | purple-400 | 헬스 · 프리미엄. 그린과 같은 위계에 동시 사용 금지 |
| --neon-purple-dim | purple-700 #6D1AA0 | 퍼플 보더·약화 상태 |
| --text-hi | #B6FF3D (= --neon-green) | 강조 텍스트 — 헤드라인 키워드·수치 하이라이트 |
| --text-bright | #F5F7FA | 최고 밝기 텍스트 — 순백 대신 헐레이션 없는 흰색 |
Status Color
상태 전달에만 사용하는 색이에요. 브랜드 색(그린·퍼플)과 동시에 한 화면에 쓰지 않아요.
| 상태 | 색 | 용도 | 규칙 |
|---|---|---|---|
| Error | #FF1744 | 에러 메시지 · 삭제 · 경고 | 배경은 15% 투명도만 — 대면적 사용 금지 |
| Success | --neon-green | 완료 · 달성 · 저장 확인 | 러닝 도메인과 같은 색 — 맥락으로 구분 |
| Warning | #FFD600 | 주의 · Beta 태그 · 미완성 | 어두운 배경 전용 — 밝은 배경에서 대비 부족 |
대비 검증 (실측)
역할 조합을 사전 검증해둬요 — 아래 조합 외의 색 조합은 만들지 않는 게 규칙이에요.
| 조합 | 대비 | 판정 | 규칙 |
|---|---|---|---|
| 그린 #B6FF3D on #0A0A0A | 16.9 : 1 | AAA | 본문 크기까지 자유 사용 |
| 블랙 #0A0A0A on 그린 | 16.9 : 1 | AAA | 그린 버튼 레이블 — 항상 블랙 |
| 퍼플 #B026FF on #0A0A0A | 4.31 : 1 | AA 본문 탈락 | 큰 글자(24px+)·보더·글로우 전용 |
| 화이트 on 퍼플 #B026FF | 4.60 : 1 | AA | 퍼플 버튼 레이블 — 항상 화이트 |
| 라이트퍼플 #C77DFF on #0A0A0A | 7.36 : 1 | AA+ | 작은 퍼플 텍스트가 필요할 때의 대체색 |
| 본문 #E5E5E5 on #0A0A0A | 15.9 : 1 | AAA | 순백(#FFF)은 헐레이션 때문에 쓰지 않아요 |
헤드라인에서 키워드 한 곳만 그린으로: "질문이 대화가 돼요."
한 문장에 그린·퍼플 동시 강조, 그린 배경 위 화이트 텍스트(항상 --bg 블랙).
Typography
두 서체의 역할이 겹치지 않아요. Paperlogy는 소리치는 곳(디스플레이·헤드라인), Pretendard는 설명하는 곳(본문·라벨·수치). 이 경계가 무너지면 페이지 전체 위계가 무너져요.
서체 패밀리
| 패밀리 | 웨이트 | 역할 | 파일 |
|---|---|---|---|
| Paperlogy | 900 Black · 800 ExtraBold | 디스플레이 · 섹션 헤드라인 · 브랜드 워드마크 | assets/fonts/Paperlogy-*.woff2 |
| Pretendard Variable | 400–800 (가변) | 본문 · 캡션 · 라벨 · 수치 · UI 텍스트 | vendor/pretendard/ |
타입 스케일 (사이트 실측)
규칙
- Paperlogy는 두 웨이트만. 900은 커버·챕터 디스플레이, 800은 섹션 헤드라인. 700 이하로 얇게 쓰지 않아요.
- 자간의 방향이 반대예요. 큰 글자(디스플레이)는 좁게(−0.02em), 작은 라벨은 넓게(+0.12em 이상). 반대로 쓰면 어색해져요.
- 본문은
word-break: keep-all— 한국어 어절 단위 줄바꿈이 전 요소 기본값이에요. - 수치 강조(87%, −40%)는 Pretendard 800 + 네온 컬러. Paperlogy로 숫자를 치지 않아요 — 숫자는 데이터의 목소리라 본문 서체가 맞아요.
헤드라인(Paperlogy 800) 아래 본문(Pretendard 400) — 대비가 위계를 만들어요.
본문을 Paperlogy로 쓰거나, 헤드라인을 Pretendard 900으로 대체. 라벨에 자간 없이 대문자만 쓰는 것.
Spacing
4px 배수 기반 17단계예요. 컴포넌트 내부는 sp-2~7, 컴포넌트 사이는 sp-8~11, 섹션 사이는 sp-13~16 — 세 구간을 넘나들지 않는 것이 리듬의 핵심이에요.
스케일
| 토큰 | 값 | 주 용도 | |
|---|---|---|---|
| sp-1 ~ 4 | 2 · 4 · 6 · 8 | 아이콘-텍스트 간격, 칩 내부 | |
| sp-5 ~ 7 | 12 · 16 · 24 | 버튼 패딩, 카드 내부 요소 | |
| sp-20 | 20px | 탭·칩 그룹 간격 — sp-6·7 사이 보간값 | |
| sp-8 ~ 9 | 32 · 40 | 카드 패딩, 카드 사이 | |
| sp-10 ~ 11 | 48 · 56 | 제목-본문 그룹 사이 | |
| sp-12 ~ 13 | 64 · 80 | 서브섹션 사이 | |
| sp-14 ~ 16 | 96 · 120 · 160 | 섹션 세로 패딩(--section-y: 100px), 챕터 전환 |
시맨틱 스페이싱 (상황 이름)
반복되는 간격 결정에는 이름을 붙여요 — 간격이 어휘가 되면 고민을 다시 하지 않아요.
| 이름 | 값 | 상황 |
|---|---|---|
| label-to-headline | 8px (sp-4) | 섹션 번호 라벨 → 헤드라인 |
| headline-to-lead | 16px (sp-6) | 헤드라인 → 리드 문단 |
| between-chips | 8px (sp-4) | 칩·태그 나열 간격 |
| group-gap | 48px (sp-10) | 본문 그룹 → 다음 그룹 |
| card-pad | 32~40px (sp-8~9) | 카드 내부 패딩 |
| section-y | 100px | 섹션 세로 패딩 — --section-y 하나로만 통제 |
| chapter-gap | 150px+ | 챕터 디바이더 상단 — 한 호흡 쉬는 자리 |
규칙
- 가까운 것은 더 가깝게, 먼 것은 확실히 멀게. 라벨→헤드라인 8px, 헤드라인→본문 16px, 본문→다음 그룹 48px처럼 격차를 계단식으로.
- 섹션 세로 리듬은
--section-y(100px) 하나로 통제 — 개별 섹션에서 임의 값을 넣지 않아요. - 모바일(640px 이하)에서는 섹션 패딩만 60~70%로 줄이고 컴포넌트 내부 간격은 유지해요.
Shape
Radius · Drop Shadow · Divider 세 요소로 컴포넌트의 깊이와 경계를 표현해요. 모서리는 요소 크기를 따라 작은 것은 각지게, 큰 것은 부드럽게 — 깊이는 그림자가 아닌 표면 밝기로.
Radius 스케일
--r-xs
4px · 체크박스
--r-sm
8px · 버튼
--r-card
12px · 소형카드
--r-md
16px · 카드
--r-lg
22px · 패널
--r-xl
28px · 모달
--r-2xl
32px · 바텀시트
--r-3xl
40px · 커버 카드
--r-full
9999px · 칩·FAB
| 토큰 | 값 | 주 용도 |
|---|---|---|
--r-xs | 4px | 체크박스 · 컬러 스와치 |
--r-sm | 8px | 버튼 · 인풋 · Overflow · 코드 블록 |
--r-card | 12px | 탭 상단 · mkt-panel 카드 · 유저플로우 카드 — sm·md 사이 보간 |
--r-md | 16px | 소형 카드 · 컨텍스트 메뉴 |
--r-lg | 22px | 패널 · 중형 카드 |
--r-xl | 28px | 모달 · 다이얼로그 |
--r-2xl | 32px | 바텀시트 상단 · 대형 카드 |
--r-3xl | 40px | 커버 inner 카드 (.cvr-inner) — 화면 가득한 요소에 부드러움 부여 |
--r-full | 9999px | 칩 · 태그 · FAB · 뱃지 |
Drop Shadow
다크 테마에서 그림자는 잘 보이지 않아요. 기본적으로 표면 밝기(surface 사다리)로 깊이를 표현하고, 꼭 필요한 경우에만 글로우로.
shadow-sm
0 2px 8px rgba(0,0,0,.35)
shadow-md
0 4px 16px rgba(0,0,0,.45)
glow-green
0 0 24px rgba(182,255,61,.18)
glow-purple
0 0 24px rgba(176,38,255,.18)
| 토큰 | 값 | 용도 |
|---|---|---|
--shadow-sm | 0 2px 8px rgba(0,0,0,.35) | 드롭다운 · 툴팁 · 소형 카드 |
--shadow-md | 0 4px 16px rgba(0,0,0,.45) | 모달 · 바텀시트 · 컨텍스트 메뉴 |
--glow-green | 0 0 24px rgba(182,255,61,.18) | 러닝 도메인 핵심 수치 강조 (절제 사용) |
--glow-purple | 0 0 24px rgba(176,38,255,.18) | 헬스 도메인 강조 요소 (절제 사용) |
Divider
요소 간 경계선이에요. 색이 아닌 선 하나로 — 명시적 구분이 꼭 필요한 곳에만 써요.
#1A1A1A) — 섹션 내부 항목 구분#262626) — 컴포넌트 경계 기본#383838) — 강조 구분선 · 아이콘 테두리- Divider는 마지막 수단이에요 — 여백만으로 충분히 구분되면 선을 넣지 않아요.
- 연속 항목(테이블 행)은
border-lo, 컴포넌트 간 경계는border, 강조 영역은border-hi.
규칙
- 칩·태그처럼 완전한 알약형은
--r-full(9999px) — 어중간한 곡률이 제일 어색해요. - 같은 카드 안에서 부모보다 자식의 radius가 크면 안 돼요. 부모
--r-lg면 자식은--r-sm~--r-md. - 다크에서 그림자는 불투명도를 2배로 — Fluent 기준(라이트 14% → 다크 28%). 이미 토큰에 반영돼 있어요.
Layout · Grid
1440px 캔버스 위 1248px 콘텐츠 — 12컬럼 그리드예요. 규칙은 하나: 같은 크기를 연속 두 번 쓰지 않기. 대/중/소 3단계 변주가 에디토리얼 리듬을 만들어요.
기준값
| 토큰 | 값 | 설명 |
|---|---|---|
| --page-max | 1440px | 페이지 최대 폭 (캔버스) |
| --content-max | 1248px | 콘텐츠 최대 폭 — 12컬럼 · 거터 24px |
| --page-pad-x | 96px | 좌우 여백 (모바일 20~24px) |
| --section-y | 100px | 섹션 세로 패딩 |
브레이크포인트
| 지점 | 변화 |
|---|---|
| 1024px | 여백 축소, 폰 목업 스케일 다운 |
| 900px | 사이드 요소 해제 · 오프셋 축소(위계는 유지) |
| 640px | 본격 1열 전환 — IA 4→2열, 페르소나 1열, 웨이브 2열 |
| 480px | UF 세로 전환 · 표는 가로 스크롤 |
리듬 원칙
- 크기 3단계(대/중/소) 변주 — 폰 목업 밴드는 줄마다 위계를 다르게. 같은 크기 4대 일렬은 금지 패턴이에요.
- 오프셋 — 인용·카드류는 좌/우/좌 55~60% 폭 배치. 세로로 8vh 정도 어긋나게.
- 풀블리드는 아껴서 — 마퀴·테이프 등 화면 끝까지 미는 요소는 페이지에 2~3곳만.
대형 1 + 소형 3 → 다음 줄은 역방향 — 줄마다 무게중심 이동.
균등 격자 섹션을 연속 3개 이상 배치 — "격자 사이트" 첫인상의 원인이에요.
서브페이지 레이아웃 (SPA / 도구형)
케이스 스터디 하위 서브페이지(운동 MBTI 등 단일 SPA 도구)는 별도 레이아웃 기준을 따라요.
| 속성 | 값 | 설명 |
|---|---|---|
| max-width | 800px | 콘텐츠 래퍼 최대 폭 — margin: 0 auto로 중앙 정렬 |
| side padding (mobile) | 20px | 기본 좌우 여백 |
| side padding (≥ 480px) | 32px | 480px 이상 |
| side padding (≥ 640px) | 48px | 640px 이상 |
| 배경색 | --bg | 래퍼·바디 모두 동일 — 전체가 하나의 화면처럼 |
서브페이지 브레이크포인트
| 지점 | 변화 |
|---|---|
| ≥ 480px | 좌우 여백 32px · 종목 선택 등 단순 목록 → 2열 그리드 전환 |
| ≥ 640px | 좌우 여백 48px · 장비 목록 → 2열 그리드 전환 · 헤드라인 폰트 업 |
| 800px cap | 콘텐츠 폭 고정 — 이상은 좌우 여백만 넓어짐 |
케이스 스터디 서브 SPA는 모두 max-width 800px 반응형으로 통일.
고정 폰 프레임(375px)으로 서브페이지를 강제 — 데스크탑에서 좌우 여백이 과도해져요.
Motion
모션은 콘텐츠를 소개하는 역할까지만 해요. 이징 하나, 지속시간 3단계 — 그리고 반드시 prefers-reduced-motion에 응답해요.
토큰
| 토큰 | 값 | 용도 |
|---|---|---|
--easing | cubic-bezier(.2,.7,.2,1) | 전 구간 공통 — 빠르게 나와 부드럽게 멈춤 |
--ease-spring | cubic-bezier(.16,1,.3,1) | 바텀시트·캐러셀 등 탄성 있는 진입 |
--ease-expo | cubic-bezier(0.87,0,0.13,1) | 날카로운 진입·퇴장 (드로어 등) |
--dur-fast | 0.2s | hover · 색 전환 · 버튼·칩·링크 |
--dur-base | 0.4s | 등장(fade + up 20~30px) · 섹션 리빌 |
--dur-reveal | 0.85s | IntersectionObserver 리빌 애니메이션 |
--dur-slow | 1.1s | 스크롤 연동 · 웨이브 패럴랙스 · 마퀴 |
Z-Index 스케일
| 토큰 | 값 | 용도 |
|---|---|---|
--z-base | 0 | 기준면 |
--z-raised | 10 | 카드 호버 등 소폭 상승 |
--z-overlay | 50 | 드롭다운 · 툴팁 · 컨텍스트 메뉴 |
--z-nav | 100 | 앱바 · 하단 내비게이션 |
--z-bar | 200 | 고정 상단 바 (앱바 위) |
--z-loader | 9000 | 풀페이지 로딩 오버레이 |
--z-grain | 9996 | 필름 그레인 (장식 레이어) |
--z-cursor-label | 9997 | 커서 레이블 |
--z-cursor-ring | 9998 | 커서 링 |
--z-cursor | 9999 | 커서 닷 (최상위) |
스테이트 레이어 (전역 규칙)
Material 3 방식이에요. 컴포넌트마다 호버색·눌림색을 따로 정하지 않고, 표면 위 텍스트색(on-color)을 낮은 불투명도로 덮는 규칙 하나로 통일해요. 컴포넌트가 늘어도 상태 색을 새로 정의할 일이 없어요.
| 상태 | 불투명도 | 적용 |
|---|---|---|
| Hover | 8% | on-color를 표면 위에 8% 오버레이 |
| Focus | 12% | 오버레이 + 포커스 링 --focus-ring(그린 2px, offset 3px) — WCAG 2.2 Focus Appearance 충족 |
| Pressed | 12% | 버튼은 예외 — green-700로 직접 어둡게 |
| Disabled 컨테이너 | 12% | on-surface 12% (= --border와 동일 계열) |
| Disabled 레이블 | 38% | on-surface 38% (= --text-lo 계열) |
다크 테마 모션·깊이 규칙
- 깊이는 그림자가 아니라 표면 밝기로 — 다크에서 그림자는 보이지 않아요. surface-1 → 2 → 3 사다리로 올려요 (Carbon의 layer 토큰 방식).
- 그림자를 써야 하면 다크에서는 불투명도를 2배로 (Fluent 기준 14% → 28%).
- 다크는 라이트의 단순 반전이 아니에요 (Apple HIG) — 색을 뒤집지 말고 역할별로 다시 정해요.
규칙
- 리빌은 IntersectionObserver 기반 — GSAP(ScrollTrigger)이 죽어도 콘텐츠는 보이는 방어 설계를 유지해요.
- 등장 모션은 opacity + translateY만. scale·rotate 등장은 테이프 요소 한정.
prefers-reduced-motion: reduce에서 마퀴 정지 · 리빌 즉시 표시.
Icon
서비스의 분위기와 목적을 전달할 수 있도록 간결하면서도 일관성 있게 제작해요. UI Icon(라인 기반)과 Visual Icon(색상 강조) 두 종류로 나뉘어요. 갤러리는 카테고리당 대표 샘플이에요 — 전체 810개 세트는 Figma에 있어요.
Key Line
키라인은 아이콘의 기준 격자예요. 구조(Structure), 기호(Character), 아이덴티티(Identity)를 고려해 4가지 기본 도형의 밀도감이 균일해 보이도록 각각 다른 크기로 맞춰요.
| 도형 | 크기 | 용도 |
|---|---|---|
| Circle | 36×36px | 원형 기반 아이콘 |
| Square | 34×34px | 정사각 기반 아이콘 |
| Rectangle V | 28×38px | 세로형 아이콘 |
| Rectangle H | 38×28px | 가로형 아이콘 |
Naming Rule
슬래시(/) 3단계 구조예요. 첫 번째 폴더명과 카테고리명의 첫 글자는 대문자, 나머지는 소문자로.
| 세그먼트 | 예시 | 규칙 |
|---|---|---|
| 폴더명 | Icon | 고정값 · 항상 대문자 시작 |
| 카테고리 | Security · Arrows · Media | Title Case · 영문 단어 |
| 아이콘 이름 | face-id-01 · arrow-up · lock-open-02 | 케밥케이스 · 시리즈는 -01/-02 접미사 |
UI Icon vs Visual Icon
| UI Icon | Visual Icon | |
|---|---|---|
| 스타일 | 라인 기반 (stroke) | 컬러 채움 (filled) |
| 크기 기준 | 4배수 — 16 · 20 · 24px | 별도 크기 세트 |
| 색 | --text-mid / --neon-green · --neon-purple | 별도 컬러셋 |
| 용도 | 내비게이션 · 버튼 · 필드 아이콘 | 카테고리 시각화 · 정보 강조 |
카테고리 (18개 · 810개)
아이콘 갤러리
규칙
- 내비게이션 아이콘은 20px 라인 아이콘 고정 — 활성:
--neon-green· 비활성:--text-lo. - 버튼 아이콘은 16px · 레이블 왼쪽 · 간격 6px(sp-3).
- 퍼플 도메인 화면에서는 아이콘 색도
--neon-purple로 — 색 신호는 도메인과 일관되게. - 아이콘만으로 의미를 전달할 때는 반드시
aria-label또는 툴팁을 함께.
Button
화면당 Primary는 하나예요. 네온 그린 위 텍스트는 항상 블랙(--bg) — 화이트를 올리는 순간 대비가 무너져요.
구성요소
| 요소 | 필수 여부 | 규칙 | |
|---|---|---|---|
| ① | 컨테이너 | ESSENTIAL | radius 8px · 패딩 12×28px · 배경 또는 1px 보더 |
| ② | 레이블 | ESSENTIAL | Pretendard 600 · 13px · 1~6자 동사형("추천 받기") |
| ③ | 아이콘 | OPTIONAL | 16px · 레이블 좌측 · 간격 6px(sp-3) |
상태
| 상태 | 배경 | 텍스트 | 비고 |
|---|---|---|---|
| Enabled | --neon-green #B6FF3D | #0A0A0A | 기준 |
| Hover | green-300 #C8FF5F | #0A0A0A | 150ms · 밝게 — 커지지 않아요 |
| Pressed | green-700 #6B8F24 | #0A0A0A | 어둡게 |
| Disabled | --border #262626 | --text-lo #4A4A4A | 커서 기본값 |
변형
| 변형 | 스타일 | 쓰임 |
|---|---|---|
| Primary | 그린 배경 + 블랙 텍스트 | 화면의 단 하나의 핵심 행동 |
| Neutral | --surface-2 배경 + 기본 텍스트 + --border 보더 | 일반 보조 행동 · 비강조 CTA |
| Ghost | 투명 배경 + 그린 1px 보더 + 그린 텍스트(--neon-green) | 보조 행동 · Primary 옆 |
| Health | 퍼플 배경 + 화이트 텍스트 | 헬스 도메인 화면 한정 |
사이즈
Primary(그린 채움)와 Secondary(그린 보더)는 동일한 5단계 높이를 공유해요. 화면에서 가장 흔히 쓰는 건 Medium(40px)이에요.
| 사이즈 | 높이 | 폰트 | 수평 패딩 | 주 사용처 |
|---|---|---|---|---|
| XSmall | 24px | 11px · 600 | 10px | 카드 내 마이크로 액션 · 인라인 편집 |
| Small | 32px | 12px · 600 | 14px | 목록 행 버튼 · 보조 액션 |
| Medium | 40px | 13px · 600 | 20px | 기본값 — 대부분의 화면 |
| Large | 48px | 14px · 600 | 24px | 온보딩 · 빈 상태(Empty State) CTA |
| XLarge | 56px | 15px · 600 | 28px | 하단 고정 CTA · 결제 확인 |
카피 규칙 (Content)
Polaris·Fluent 방식이에요 — 문구 규칙을 먼 곳의 라이팅 가이드가 아니라 컴포넌트 문서 안에 둬요. 쓰는 자리에서 바로 보여야 지켜져요.
| 규칙 | DO | DON'T |
|---|---|---|
| 동사로 시작 | "추천 받기" · "다시 고르기" | "추천" · "확인" |
| 맥락상 자명한 명사는 생략 | "저장하기" | "내 프로필 저장하기" |
| 1~6자 | "시작하기" | "지금 바로 나에게 맞는 장비 찾기" |
| 문장부호 없음 | "저장하기" | "저장하기!" |
| 취소 vs 닫기 | 진행 중 작업 중단 = "취소" / 화면만 닫기 = "닫기" | 둘을 섞어 쓰기 |
언제 무엇을 쓰나 (비교)
| Button | Chip | |
|---|---|---|
| 역할 | 행동을 실행해요 ("추천 받기") | 상태를 고르거나 표시해요 ("러닝화") |
| 레이블 | 동사형 | 명사형 |
| 선택 상태 | 없음 — 누르면 실행 | 있음 — 켜짐/꺼짐 유지 |
| 그린 사용 | 배경 채움 (블랙 텍스트) | 텍스트·보더만 (배경 채우지 않기) |
| 화면당 | Primary 1개 | 여러 개 가능 |
스펙
- 기본 크기(Medium): 높이 40px · 폰트 13px/600 · 수평 패딩 20px · radius 8px
- 터치 대상: Large(48px) 이상 권장 · Medium(40px)은 상하 여백 포함 시 최소 44px 확보
- 버튼 사이 간격: 12px(sp-5) · 아이콘-레이블: 6px(sp-3)
- 전환: background 150ms var(--easing)
키보드 인터랙션
| 키 | 동작 |
|---|---|
| Tab | 다음 버튼으로 포커스 이동 — --focus-ring(그린 2px · offset 3px)이 반드시 보여야 해요 |
| Space · Enter | 버튼 실행. 포커스는 버튼에 남아요(화면 전환 시엔 이동 대상으로) |
화면당 Primary 1개 + Ghost 보조. 그린 버튼 텍스트는 항상 블랙.
Primary 두 개 나란히, 그린과 퍼플 버튼을 같은 행에, 그린 위 화이트 텍스트.
Chip
필터·태그·키워드에 쓰는 알약형 요소예요. 선택 상태는 네온 그린 배경을 채워 명확하게 구분해요.
구성요소
| 요소 | 필수 여부 | 규칙 | |
|---|---|---|---|
| ① | 컨테이너 | ESSENTIAL | radius --r-full(9999px) · 알약형 · 패딩 5×12px · 1px 보더 |
| ② | 레이블 | ESSENTIAL | 11px · 500 · 1~5자 명사("러닝화", "#치트키") |
상태
| 상태 | 배경 | 보더 | 텍스트 |
|---|---|---|---|
| Default | transparent | --border-hi #383838 | --text-mid |
| Selected | --neon-green | --neon-green | --bg #0A0A0A |
| Disabled | transparent | 동일 · opacity .4 | 동일 · opacity .4 |
선택 = 네온 그린 배경 fill + 다크 텍스트. 다중 선택 나열 시 간격 8px(sp-4).
선택 칩에 그린 배경 채우기(버튼과 혼동), 칩 안에 두 줄 텍스트.
Checkbox · Radio
둘 다 20×20px, 같은 문법이에요. 다른 건 모서리 하나 — 체크박스는 5px, 라디오는 원. 선택은 언제나 그린이에요.
상태
스펙
| 속성 | Checkbox | Radio |
|---|---|---|
| 크기 | 20×20px | 20×20px |
| radius | 5px | 50% |
| 기본 보더 | --border-hi #383838 · 1px | |
| 선택 | 그린 채움 + 블랙 체크(6×10px · rotate 45°) | 그린 보더 + 중앙 그린 도트(inset 4px) |
| 레이블 간격 | 10px · 13px Pretendard 400 · 레이블 클릭도 동작 | |
언제 무엇을 쓰나 (비교)
| Checkbox | Radio | Chip (선택형) | |
|---|---|---|---|
| 선택 수 | 0개 이상 복수 | 정확히 1개 | 복수 (시각적 나열형) |
| 쓰는 곳 | 동의·옵션 목록 | 온보딩 단일 답변 | 필터·태그처럼 훑어보며 고를 때 |
| 레이아웃 | 세로 목록 | 세로 목록 | 가로 랩(wrap) 나열 |
| 기본 선택 | 상황에 따라 | 없음 — 답 유도 금지 | 없음 |
키보드 인터랙션
| 키 | Checkbox | Radio |
|---|---|---|
| Tab | 각 체크박스로 이동 | 그룹 전체가 하나의 탭 정지점 — 선택된 항목으로 이동 |
| Space | 선택 토글 | 포커스된 항목 선택 |
| ↑ ↓ ← → | — | 그룹 안에서 이동 + 즉시 선택 |
사용규칙
- 복수 선택은 체크박스, 단일 선택은 라디오 — 온보딩 5단계의 "하나만 고르는 질문"은 전부 라디오예요.
- 라디오 그룹은 최소 2개, 기본값을 미리 선택해두지 않아요(사용자의 답을 유도하지 않기).
선택 상태는 그린 단일 색. 터치 영역은 44px까지 투명 확장.
퍼플 체크박스(도메인 색을 셀렉션에 쓰지 않기), 15px 이하 축소.
Text Field
입력 필드는 조용해요. 포커스가 왔을 때만 그린 보더로 응답하고, 나머지 시간엔 서피스에 가라앉아 있어요.
상태
--border · 텍스트 --text-lo--neon-green-dim · 텍스트 --text로 상승--text 유지--surface-1상태 스펙
| 상태 | 보더 | 텍스트 색 | 비고 |
|---|---|---|---|
| Default | --border #262626 | --text-lo | radius --r-sm · padding 13×16px |
| Focus | --neon-green-dim #6B8F24 | --text | outline:none 대신 border 색으로 표현 |
| Filled | --neon-green-dim | --text | 값 있는 포커스 아웃 상태 |
| Error | rgba(255,23,68,.55) | --text | 헬퍼 텍스트 11px #FF1744 필수 병기 |
| Disabled | --border | --text-lo | opacity .38 · pointer-events none |
사용 규칙
- 플레이스홀더는 질문형 문장으로 — "어떤 장비를 찾고 있어요?" (명령형 "입력하세요" 금지)
- 플레이스홀더 색은
--text-lo— 입력값과 혼동되지 않게 두 단계 낮춰요. - 에러는 색으로만 말하지 않고 반드시 헬퍼 텍스트를 함께 — 색약 사용자 대응이에요.
- Disabled 상태에서 커서는
not-allowed— 왜 입력이 안 되는지 툴팁이나 안내가 가까이 있어야 해요.
App Bar
모든 화면 상단에 붙는 내비게이션 바예요. 현재 컨텍스트와 핵심 액션을 제공해요. 7가지 변형이 있어요.
변형
MAIN — 탭 루트 홈 화면 (로고 + 액션 아이콘)
MAIN-SCROLL — 스크롤 후 검색 활성 (로고 + 검색 알약)
POP — 뒤로가기 + 타이틀 + 닫기 (Push 네비게이션 레이어)
SUB — 카테고리 드롭다운 + 액션 아이콘 (목록·필터 화면)
SUB-SCROLL — 카테고리 + 그린 테두리 검색 알약
COMPLETE — 뒤로가기 + 타이틀 + 완료·닫기 (플로우 완료 화면)
POPUP — 타이틀 + 닫기 (바텀시트·모달, 뒤로가기 없음)
구성요소
| 요소 | 필수 여부 | 적용 변형 | 규칙 | |
|---|---|---|---|---|
| ① | 브랜드 워드마크 | ESSENTIAL | main · main-scroll | Paperlogy 800 · 17px · --neon-green |
| ② | 뒤로가기 아이콘 | ESSENTIAL | pop · sub · sub-scroll · complete | 36×36px 탭 영역 · 좌측 끝 고정 |
| ③ | 센터 타이틀 | ESSENTIAL | pop · complete · popup | 16px 500 · --text-mid · flex:1 · 가운데 정렬 |
| ④ | 카테고리 드롭다운 | ESSENTIAL | sub · sub-scroll | 18px 700 · --text + ▾ 드롭다운 아이콘 |
| ⑤ | 액션 아이콘 (벨·유저) | OPTIONAL | main · main-scroll · sub · sub-scroll | 36×36px 탭 영역 · 우측 끝 고정 · gap 8px |
| ⑥ | 닫기(✕) / 완료 | OPTIONAL | pop · complete · popup | pop·popup은 ✕ 아이콘 / complete는 "완료" 텍스트 버튼 |
| ⑦ | 검색 알약 | OPTIONAL | main-scroll · sub-scroll | h 40px · r 40px · main-scroll: --border-hi / sub-scroll: --neon-green 테두리 |
스펙
- 높이:
52px(단일 행) · scroll 변형은 52 + 40 + 16px =108px - 배경:
--surface-1 (#111111)· 하단 1px--border-lo - 패딩:
16px(좌우 동일) - 아이콘 탭 영역:
36×36px· 내부 아이콘24px - 스크롤 시
--shadow-sm추가 — 콘텐츠가 바 아래로 올라옴을 표시
변형 선택 규칙
| 화면 유형 | 사용 변형 | 이유 |
|---|---|---|
| 홈 / 장비 / 리뷰 / 마이 (탭 루트) | main | 브랜드 로고 노출 + 알림·프로필 접근 |
| 탭 루트에서 스크롤 후 | main-scroll | 검색 UX 강화 — 스크롤하면 검색 알약 나타남 |
| 카테고리 목록·필터 페이지 | sub | 카테고리 전환(드롭다운) + 알림·프로필 유지 |
| 카테고리 페이지 스크롤 후 | sub-scroll | 카테고리 + 검색 동시 제공 |
| Push 네비게이션 단계 화면 | pop | 뒤로가기 + 닫기로 스택 컨트롤 |
| 플로우 완료 직전 화면 | complete | 뒤로가기 + "완료" 액션 버튼 |
| 바텀시트 / 모달 | popup | 뒤로가기 없이 닫기만 — 스택 외 오버레이 |
FAB Deprecated
Floating Action Button이에요. 현재 화면의 부가 기능이 필요할 때 화면 위에 띄워 쓰는 버튼이에요. Quick Menu(메뉴 열기)와 Go to Top(최상단 이동) 두 종류예요.
Fab은 치트키 DS에서 deprecated됐어요. 신규 화면에는 확장형 FAB(c-fabext)을 사용하세요. 기존 구현은 현상 유지예요.변형
Quick Menu
Go to Top
| 변형 | 색 | 아이콘 | 쓰임 |
|---|---|---|---|
Quick MenuButton_FAB_Quick | 그린(--neon-green) + 블랙 | 플러스 / 닫기 | 퀵 액션 메뉴 열기 — 탭하면 액션 목록 펼침 |
Go to TopButton_FAB_Top | --surface-3 + --text-mid | 위 화살표 | 스크롤이 긴 화면에서 최상단 복귀 |
Quick Menu — 액션 목록
FAB을 탭하면 최대 5개의 액션 항목이 위로 펼쳐져요. 각 항목은 아이콘 + 레이블 조합이에요.
상태
| 상태 | Quick Menu | Go to Top |
|---|---|---|
| Default | 그린 배경 · 플러스 아이콘 | --surface-3 배경 · 위 화살표 |
| Pressed | green-700 #6B8F24 | --border 배경 |
스펙
- 크기: 56×56px · radius
--r-full(9999px) · 아이콘 24px - 위치: 화면 우하단 · 하단 내비게이션 바 위 16px(sp-6) 간격
- Go to Top은 스크롤 200px 이상 내려갔을 때만 표시 — 최상단에서는 숨김
사용 규칙
- 화면당 FAB은 하나 — Quick Menu와 Go to Top을 동시에 쓰지 않아요.
- Quick Menu 항목은 최대 5개 — 많아질수록 목적이 흐려져요.
- 레이블은 동사형 — "저장" 대신 "저장하기", "공유" 대신 "공유하기".
맥락에 딱 맞는 1~3개 핵심 액션만. Go to Top은 스크롤이 긴 목록 화면에만.
모든 화면에 FAB 표시, 메뉴 5개 초과, Quick Menu와 Go to Top 동시 사용.
Overflow
표시할 수 있는 것보다 더 많은 옵션이 존재할 때 쓰는 버튼이에요. 탭하면 컨텍스트 메뉴가 펼쳐지고, 나머지 액션에 접근할 수 있어요.
구성요소
| 요소 | 필수 여부 | 규칙 | |
|---|---|---|---|
| ① | 트리거 버튼 | ESSENTIAL | 24px 아이콘(ic_24_overflow) · 터치 영역 44px |
| ② | 컨텍스트 메뉴 | ESSENTIAL | 트리거 아래 · --surface-2 · --r-md · z-index --z-overlay |
| ③ | 메뉴 아이템 | ESSENTIAL | 13px · 패딩 10×12px · 아이콘 선택(OPTIONAL) |
상태
| 상태 | 트리거 | 메뉴 |
|---|---|---|
| Default | 아이콘 --text-lo | 숨김 |
| Pressed | on-color 8% 오버레이 | — |
| Open | 활성 — --text-mid | 표시 · 외부 탭 시 닫힘 |
사용 규칙
- 카드·목록 항목 오른쪽 끝에 배치 — 카드 패딩 안쪽, 상단 정렬.
- 메뉴 항목은 최대 7개 — 많아질수록 "기타" 아래 묶어요.
- 파괴적 액션(삭제 등)은 메뉴 가장 아래 ·
#FF5D5D색 처리. - Overflow와 Primary Button을 같은 카드에 함께 쓰지 않아요 — 행동 경로가 둘로 갈라지면 인지 비용이 늘어요.
주요 액션은 카드 본체에, 부가 액션만 Overflow로. 메뉴 항목 4개 이하가 이상적이에요.
버튼과 Overflow 동시 노출, 메뉴 레이블을 "더 보기 ∙∙∙"으로 쓰기.
Date Picker Beta
날짜 또는 연도·월을 선택하는 컴포넌트예요. Type A는 단일 날짜, Type B는 연도·월 선택이에요.
Type A — 단일 날짜 (Date)
| 상태 | 시각 처리 |
|---|---|
| Default | 숫자 --text-mid · 호버 시 --surface-3 배경 |
| Today | 숫자 --neon-green + 700 weight |
| Selected | 배경 --neon-green · 숫자 --bg 반전 · 700 weight |
| Unselectable | opacity 25% · pointer-events none (이전 달 · 이후 달 날짜) |
Type B — 연도·월 (Year & Month)
| 요소 | 필수 여부 | 규칙 | |
|---|---|---|---|
| ① | 헤더 (연도/월 + 이전·다음 화살표) | ESSENTIAL | 14px 600 · 좌우 화살표 18px · 탭 영역 32px |
| ② | 날짜 그리드 (Type A) | ESSENTIAL | 7열 고정 · 7px 패딩 · 요일 헤더 11px small-caps |
| ③ | 연도 컬럼 (Type B) | ESSENTIAL | 좌측 고정 · 위아래 화살표로 연도 변경 · 우측에 월 그리드 |
| ④ | 월 그리드 (Type B) | ESSENTIAL | 3열 고정 · 10px 패딩 · 현재 선택 월은 Selected 상태 |
스펙
- 컨테이너:
--surface-2· 1px--border·--r-md· padding 16px - Type A 최소 너비:
264px· Type B: 연도 열(56px) + 구분선 + 월 그리드 - 날짜 셀: 기본 7px 패딩 ·
--r-sm· 호버--surface-3 - 피커는 인풋 아래 배치 ·
--shadow-md·--z-overlay
키보드 인터랙션
| 키 | Type A (날짜) | Type B (연도·월) |
|---|---|---|
| Tab | 피커 열기·닫기 · 날짜 셀 진입 | 피커 열기·닫기 · 연도 버튼·월 셀 진입 |
| ← → ↑ ↓ | 날짜 이동 (행 끝에서 다음 행 연결) | 월 그리드 내 이동 (3열 기준) |
| Space · Enter | 날짜 선택 | 월 선택 |
| PageUp · PageDown | 이전·다음 달로 이동 | 연도 감소·증가 |
| Esc | 피커 닫기 — 인풋으로 포커스 복귀 | |
사용 규칙
- Type A는 특정 날짜 선택 (운동 기록, 일정 등), Type B는 월 단위 조회 (통계, 필터)에 사용해요.
- 선택 가능한 날짜 범위가 있으면 범위 밖은 반드시 Unselectable 처리 — 탭해도 반응 없음.
- 오늘 날짜는 항상 Today 상태로 강조 — 사용자가 현재 위치를 잃지 않도록.
Card / Product
상품의 썸네일·브랜드·이름·평점·태그를 하나의 단위로 묶는 카드예요. M은 그리드 나열, S는 랭킹 리스트 행에 써요.
Card/Product/M
Card/Product/S 랭킹 리스트
구성 요소
| 요소 | 타입 | Card/M | Card/S |
|---|---|---|---|
| Image | ESSENTIAL | 160×160px · r 16px · white bg | 48×48px · r 8px · white bg |
| Brand name | ESSENTIAL | 10px · --text-lo · Pretendard Light | |
| Product name | ESSENTIAL | 13px · --text · 1줄 이상 말줄임 | |
| Star rating | OPTIONAL | ★ 10px · 점수 bold --text-mid · 리뷰수 --text-lo | |
| Tag/Product | OPTIONAL | flex-wrap · max 3개 | 없음 |
| Like icon | OPTIONAL | absolute top-right · 32×32px | 없음 |
| Rank badge | OPTIONAL | absolute top-left · 28×28px · r 8px | 좌측 숫자 · 16px · --neon-green |
Tag/Product 색 규칙
| 태그 | 보더 | 텍스트 | 용도 |
|---|---|---|---|
| 러닝 도메인 | --neon-green | --neon-green | 러닝 카테고리 상품 |
| 헬스 도메인 | --neon-purple | --neon-purple | 헬스 카테고리 상품 |
| 속성 레이블 | --border-hi #383838 | white | 경량·고중량·내구성 등 |
스펙
| Card/M | Card/S | |
|---|---|---|
| 전체 폭 | 160px (고정) | flex-1 또는 204px |
| 이미지 | 160×160px · r 16px | 48×48px · r 8px |
| 이미지 배경 | white — 투명 PNG 상품 이미지 대응 | |
| 텍스트 패딩 | py 12px · px 4px | 없음 (flex gap 12px) |
| 텍스트 내부 간격 | brand↔name↔rating 6px | brand↔name 0 · +rating 4px |
| 태그 높이 | 20px · px 8px · r 99px | — |
| 랭크 뱃지 (M) | 28×28px · r 8px · --border-lo bg | — |
| 랭크 숫자 (S) | — | 24px 폭 · 16px bold · --neon-green |
이미지 영역은 흰 배경 고정 — 투명 PNG 상품컷이 어두운 배경에서 자연스럽게 보여요. 도메인 태그(러닝·헬스)는 항상 1번째 위치에 배치해요.
Card/M을 3열 이상 나열하지 않아요(160px×3+gap=500px+). 태그는 최대 3개 — 초과 시 +N으로 처리해요. Card/S의 랭크 번호에 브랜드 색 외 다른 색을 쓰지 않아요.
Badge
작은 레이블로 상태·카테고리·중요도를 시각화해요. 치트키 컨텍스트에 맞는 변형(variant)을 선택해 사용하세요.
Tone × Size
SIZE: MEDIUM (h 24px) — 카드 위·인라인
SIZE: LARGE (h 28px) — 헤더·섹션 제목 옆
Tone 선택 규칙
| Tone | 클래스 | 치트키 사용 컨텍스트 | 금지 |
|---|---|---|---|
| brand-solid | jb-badge--brand-solid |
신상 · HOT · 추천 — 주목을 끌어야 하는 상품 레이블 | 남용 금지 — 한 화면에 3개 이하 |
| brand-weak | jb-badge--brand-weak |
카테고리 분류 · 도메인 표시 (러닝 / 헬스 / 클라이밍) | |
| brand-outline | jb-badge--brand-outline |
선택된 필터 · 활성 태그 표시 | |
| critical | jb-badge--critical |
품절 · 구매 불가 · 마감 완료 | 성공/정보 메시지에 사용 금지 |
| positive | jb-badge--positive |
재입고 · 정상 판매 중 복귀 | |
| warning | jb-badge--warning |
마감 임박 · 재고 소진 예정 | |
| neutral | jb-badge--neutral |
단종 · 서비스 종료 · 비활성 상태 |
스펙
| 크기 | 높이 | 좌우 패딩 | 글꼴 | 사용 위치 |
|---|---|---|---|---|
| medium | 24px | 6px | 12px · 600 | 카드 위 · 텍스트 옆 인라인 |
| large | 28px | 8px | 13px · 600 | 섹션 헤더 · 페이지 타이틀 옆 |
클래스명 패턴
<span class="jb-badge jb-badge--{md|lg} jb-badge--{brand-solid|brand-weak|brand-outline|critical|positive|warning|neutral}">
레이블 텍스트
</span>
카드와의 조합
Card / Review
리뷰 목록에서 하나의 리뷰를 나타내는 카드예요. 유저 정보 · 별점 · 텍스트 · 좋아요로 구성되고, 3줄 이상은 잘라요.
구성요소
구성 요소 규칙
| 요소 | 필수 여부 | 규칙 |
|---|---|---|
| Avatar | ESSENTIAL | 32px(sm) 원형 · 기본 placeholder = 아이콘 |
| 유저명 | ESSENTIAL | 13px/600 · 최대 16자 · 초과 시 말줄임 |
| 작성일 | ESSENTIAL | 11px · --text-lo · YYYY.MM.DD |
| 별점 | ESSENTIAL | ★ 5개 · 채움 = --neon-green · 비움 = --border-hi · 우측 숫자 표기 |
| 태그 | OPTIONAL | 동일 도메인 스타일 chip · 최대 3개 |
| 본문 | ESSENTIAL | 13px · --text-mid · 3줄 이상 clamp · "더보기" 노출 |
| 이미지 | OPTIONAL | 64×64px 썸네일 · 최대 5장 · 가로 스크롤 |
| 좋아요 버튼 | ESSENTIAL | pill 버튼 · 눌린 상태 = 그린 보더·텍스트 |
별점 표기 규칙
| 상황 | 표기 |
|---|---|
| 리뷰 카드 · 목록 | ★ 아이콘 5개 + 숫자 (예: 4.0) |
| 상품 헤더 | ★ 단일 아이콘 + 평균점수 + 리뷰수 (예: ★ 4.8 (142)) |
| 최소 소수점 | 1자리 고정 (4.0 ○ / 4 ×) |
| 0건 | ★ - (0) — 숫자 대신 하이픈 |
스펙
- 카드 배경:
--surface-2· 보더:--border-lo· radius:--r-md(12px) - 내부 패딩: 16px · 섹션 간격(gap): 12px
- 좋아요 버튼: height 28px · px 12px · radius 99px
별점 색은 --neon-green만. "도움이 됐어요" 상태는 보더+텍스트만 그린으로 — 배경 채우지 않아요.
별점에 노란색 사용. "좋아요" 숫자만 단독 노출(버튼 레이블 없이). 본문 6줄 이상 펼쳐서 목록에 표시.
Review / Content
리뷰 상세(펼친 상태)예요. Card/Review의 본문을 완전히 펼치고 이미지 갤러리와 스펙 별점을 추가해요.
구성요소
Card/Review vs Review/Content
| Card/Review | Review/Content | |
|---|---|---|
| 맥락 | 목록 / 피드 | 상세 / 펼친 상태 |
| Avatar | 32px(sm) | 48px(md) |
| 본문 | 3줄 clamp + 더보기 | 전체 노출 |
| 이미지 | 없음 (썸네일 카운트만) | 64px 갤러리 행 |
| 스펙 별점 | 없음 | 3~5개 항목 그리드 |
| 작성일 부제 | 날짜만 | 날짜 · 사용기간 병기 |
스펙 별점 항목
| 도메인 | 항목 |
|---|---|
| 러닝 | 착화감 · 내구성 · 가성비 (+ 경량성 · 반발력 선택) |
| 헬스 | 착화감 · 내구성 · 가성비 (+ 그립력 · 지지력 선택) |
Rank / Card
리뷰 수·평점 기준 순위를 2열 그리드로 나열해요. 1~3위는 그린, 4위부터는 기본 텍스트 색을 써요.
구성요소
구성 요소 규칙
| 요소 | 필수 여부 | 규칙 |
|---|---|---|
| 순위 숫자 | ESSENTIAL | 14px/700 · 1~3위 --neon-green · 4위↑ --text-mid · 폭 18px 고정 |
| 썸네일 | ESSENTIAL | 56×56px · radius 8px · 흰 배경 (투명 PNG 대응) |
| 브랜드명 | ESSENTIAL | 10px · --text-lo |
| 상품명 | ESSENTIAL | 12px/600 · --text · 1줄 말줄임 |
| 별점 | OPTIONAL | Card/Product 동일 스타일 · 미확정 시 "★ - (0)" |
스펙
- 레이아웃: 2열 그리드 · 열 간격 24px · 행 간격 12px
- 최대 항목: 기본 6개 (3×2) · "전체보기" 시 무한 스크롤
- 기준: 최근 7일 리뷰 수 (헤더 부제 표기 필수)
1~3위 숫자는 그린으로 명확히 구별. 그리드는 항상 짝수 쌍으로 — 홀수 마지막 행은 빈 셀 없이 단일 항목만.
금·은·동 색상 사용(브랜드 색과 충돌). 3열 이상 그리드(썸네일+이름이 너무 좁아짐).
Avatar / Face
유저를 나타내는 원형 이미지예요. 사진이 없으면 앱 기본 3D 캐릭터 아이콘을 써요 — 이모지나 이니셜 폴백은 쓰지 않아요.
사이즈
사이즈 규칙
| 사이즈 | 크기 | 주 사용처 |
|---|---|---|
| SM | 32px | 리뷰 카드 · 댓글 · 인라인 멘션 |
| MD | 48px | 리뷰 상세 · 프로필 섹션 인라인 |
| LG | 64px | 마이페이지 헤더 · 프로필 설정 배너 |
| XL | 80px | 프로필 편집 화면 · 온보딩 캐릭터 선택 |
상태
(미설정)
구성 요소 규칙
| 상태 | 내용 | 규칙 |
|---|---|---|
| Default | 앱 기본 3D 캐릭터 | 앱 내 제공 에셋 사용 — 이니셜·이모지 대체 불가 |
| 캐릭터 선택됨 | 유저 선택 캐릭터 | 그린 배경 원형에 캐릭터 이미지 |
| 사진 등록됨 | 사용자 업로드 이미지 | circle crop · 그린 2px 보더 |
| 편집 버튼 | Avatar 위 + 버튼 (20px) | 마이페이지 편집 진입점에서만 노출 |
스펙
- 모양: 원형 고정 (border-radius 50%)
- 배경:
--surface-3(사진 없을 때) · 그린 (선택된 캐릭터) - 보더: 1px
--border-lo기본 · 사진 등록 시 2px--neon-green - 편집 핀(+): 20px · 그린 배경 · 검정 아이콘 · 원 우하단 절대위치
기본 상태는 반드시 앱 제공 3D 캐릭터로. Avatar 사이즈는 4단계(SM/MD/LG/XL) 안에서만 쓰세요.
이니셜 텍스트 폴백 사용. 정사각형이나 둥근 사각형 Avatar(원형만). 브랜드 색이 아닌 임의 색 배경.
Filter / Bar
상품 목록 상단에 붙는 가로 스크롤 필터 행이에요. "전체"가 항상 첫 번째 칩이고, 하나 이상 선택되면 "전체" 선택은 해제돼요.
기본 상태
필터 선택 상태
구성 요소 규칙
| 요소 | 필수 여부 | 규칙 |
|---|---|---|
| "전체" 칩 | ESSENTIAL | 항상 첫 번째 · 단독 선택 상태 시 활성 |
| 필터 칩 | ESSENTIAL | 도메인별 속성 · 복수 선택 가능 · 선택 시 "전체" 해제 |
| 정렬 칩 | OPTIONAL | 우측 끝 고정 · "최신순 ▾" 형태 · 정렬 전용 색 없음 |
칩 상태
| 상태 | 보더 | 텍스트 | 배경 |
|---|---|---|---|
| Default | --border-hi | --text-mid | 투명 |
| Selected | --neon-green | --neon-green | rgba(182,255,61,.06) |
스펙
- 칩 높이: 32px · 수평 패딩: 14px · radius: 99px
- 칩 간격: 6px · 폰트: 12px/500
- 스크롤: 가로 스크롤 · 스크롤바 숨김 · 끝단 페이드 처리 권장
- 위치: 섹션 헤더 바로 아래 · sticky 또는 컨텐츠 상단
"전체" 선택 = 모든 필터 칩 해제. 복수 선택 시 선택된 칩을 왼쪽으로 모으는 정렬 있으면 편해요.
필터 칩에 체크마크 아이콘 추가(색만으로 충분). 칩 30px 미만(터치 미흡). 도메인 외 임의 색 사용.
Select / Category
카테고리·정렬 기준을 드롭다운으로 선택하는 컴포넌트예요. AppBar의 SUB 변형에서 카테고리명 + ▾ 형태로도 나타나요.
인라인 드롭다운
AppBar 연동 — SUB 변형
AppBar > SUB 변형 — 카테고리명이 직접 AppBar 타이틀 역할을 해요. 탭 하면 Select/Category 드롭다운이 열려요.
구성 요소 규칙
| 요소 | 필수 여부 | 규칙 |
|---|---|---|
| 트리거 | ESSENTIAL | 현재 선택값 텍스트 + ▾ 아이콘 |
| 드롭다운 항목 | ESSENTIAL | 13px · 선택됨 = 그린 텍스트 + ✓ · 최대 8개 |
| 구분선 | OPTIONAL | 카테고리 그룹 구분 시 1px --border-lo |
스펙
- 트리거 높이: 44px · 수평 패딩: 16px · radius:
--r-sm(8px) - 드롭다운 최소 폭: 180px · 내부 패딩: 4px · 항목 높이: 44px
- 드롭다운 출현: opacity 0→1 + translateY -6px→0 ·
--dur-fast - 오버레이: 드롭다운 외부 탭 시 닫힘 (별도 dim 없음)
현재 선택값을 트리거에 항상 표시. 드롭다운은 트리거 하단 6px에 띄워요.
항목 9개 이상(스크롤 불편). 트리거 폭이 드롭다운보다 작게(드롭다운은 트리거 폭 이상).
Segmented Control
같은 레벨의 뷰·모드를 전환하는 컴포넌트예요. 한 번에 하나만 선택되고, 탭 사이를 이동해도 데이터는 유지돼요.
2세그먼트
3세그먼트
리뷰 정렬 (3세그먼트)
비활성 (Disabled)
전체 세그먼트 비활성 — opacity .35 + pointer-events none
구성 요소 규칙
| 요소 | 필수 여부 | 규칙 |
|---|---|---|
| 컨테이너 | ESSENTIAL | --surface-2 배경 · 3px 패딩 · radius --r-sm |
| 세그먼트 항목 | ESSENTIAL | 동일 폭 · 40px 높이 · radius 6px · 최대 4개 |
| 선택 인디케이터 | ESSENTIAL | --surface-3 배경 · shadow 0 1px 4px rgba(0,0,0,.4) |
Segmented Control vs Chip vs Tab
| Segmented Control | Chip (Filter) | Navigation Tab | |
|---|---|---|---|
| 선택 | 항상 1개 선택 | 0개 이상 복수 선택 | 항상 1개 선택 |
| 위치 | 콘텐츠 영역 내 | 목록 상단 필터 행 | 화면 하단 고정 |
| 전환 범위 | 같은 화면의 뷰 전환 | 같은 목록의 필터링 | 최상위 화면 전환 |
| 데이터 유지 | 유지 | 재필터링 | 화면별 독립 |
스펙
- 컨테이너: 내부 패딩 3px · radius 8px · 배경
--surface-2 - 세그먼트: 높이 40px · radius 6px · 폰트 14px/500 → 선택 14px/600
- 선택 전환: background + color
--dur-fast - 최대 세그먼트: 4개 (5개↑부터는 Filter/Bar 권장)
세그먼트 레이블은 명사형 1~4자로. 전환 시 현재 스크롤 위치 유지(콘텐츠 영역만 교체).
세그먼트 5개 이상. 세그먼트에 아이콘만 쓰기(텍스트 없으면 인식 어려움). 밑줄·보더 인디케이터(이 DS는 배경 채움 방식).
Progress / Step
리뷰 작성·온보딩 같은 멀티스텝 플로우에서 현재 단계를 보여줘요. 완료된 단계는 그린 채움, 현재 단계는 그린 보더, 미래 단계는 회색이에요.
3단계 — 리뷰 작성
4단계 — 온보딩
구성 요소 규칙
| 요소 | 필수 여부 | 규칙 |
|---|---|---|
| 스텝 닷 | ESSENTIAL | 28px 원형 · 완료 = 그린 채움 + ✓ · 현재 = 그린 보더 + 숫자 · 미래 = 회색 보더 + 숫자 |
| 연결선 | ESSENTIAL | 1px · 완료→현재 구간 = 그린 · 나머지 = --border-hi |
| 레이블 | ESSENTIAL | 10px · 현재 단계 = --text/600 · 완료 = --text-mid · 미래 = --text-lo |
스텝 상태
| 상태 | 닷 배경 | 닷 보더 | 닷 텍스트 | 연결선(우측) |
|---|---|---|---|---|
| 완료(done) | --neon-green | --neon-green | #0A0A0A (✓) | 그린 |
| 현재(active) | 투명 | --neon-green | --neon-green | 회색 |
| 미래 | 투명 | --border-hi | --text-lo | 회색 |
스펙
- 닷 크기: 28×28px · 보더: 2px · radius: 50%
- 연결선: 1px · 닷 세로 중앙(top 14px) · 닷 끝에서 시작
- 레이블: 10px · 닷 하단 6px
- 최대 스텝 수: 4개 (5개↑ 시 닷 폭이 너무 좁아짐)
완료 닷에는 숫자 대신 ✓ 아이콘. 레이블은 1~4자 명사형으로 — "1단계" 같은 서수 표현 금지.
스텝 5개 이상. 연결선 없이 닷만. 미래 스텝을 비활성 버튼처럼 클릭 가능하게 만들기.
Toast
일시적인 시스템 피드백을 화면 하단에 표시하는 컴포넌트예요. 3초 후 자동으로 사라지며 사용자 동작을 차단하지 않아요.
기본 타입
타입별 용도
| 타입 | 아이콘 | 보더 색 | 사용 시점 |
|---|---|---|---|
| 기본(neutral) | 없음 또는 맥락 아이콘 | --border-hi | 정보 전달, 완료 (중립적) |
| 성공(success) | ✓ | 그린 20% 불투명 | 장바구니 추가, 저장 완료, 리뷰 등록 |
| 오류(error) | ! | 빨강 20% 불투명 | 네트워크 오류, 입력 오류 |
구성 요소 규칙
| 요소 | 필수 여부 | 규칙 |
|---|---|---|
| 본문 | ESSENTIAL | 한 줄 메시지 또는 타이틀+설명 2줄 구조 · 최대 2행 |
| 아이콘 | OPTIONAL | 타입 시각화 · 16px · 텍스트 색과 동일 |
| 액션 버튼 | OPTIONAL | 그린 텍스트 · 1개만 · 2~4자 동사 ("보기", "취소") |
| 닫기 버튼 | OPTIONAL | 오류 타입에서 수동 닫기 필요 시 사용 |
스펙
- 위치: 화면 하단 중앙 · safe area 위 16px · 최대 폭 360px
- 수직 패딩: 14px · 수평 패딩: 16px · radius:
--r-md(16px) - 표시 시간: 3초(기본) / 액션 있으면 5초 / 오류는 수동 닫기 권장
- 동시 표시: 최대 1개 · 새 토스트는 기존 토스트를 밀어내며 등장
- 등장: translateY +8px → 0 + opacity 0→1 ·
--dur-fast
메시지는 15자 이내 단문. 액션 버튼은 동사형 1개만. 성공/오류 아이콘으로 타입을 즉시 인식시킬 것.
토스트 2개 동시 노출. 중요한 에러를 토스트로만 처리 (중요 에러는 Modal). 액션 버튼 2개 이상.
Bottom Sheet
모바일에서 필터·정렬·단순 선택 등 보조 작업을 수행하는 하단 슬라이드업 패널이에요. 스크림을 탭하거나 핸들을 드래그하면 닫혀요.
정렬 옵션 — 기본 리스트형
필터 옵션 — 액션 버튼 포함
구성 요소 규칙
| 요소 | 필수 여부 | 규칙 |
|---|---|---|
| 핸들 | ESSENTIAL | 36×4px · radius 2px · 색 --border-hi · 항상 최상단 12px 마진 |
| 스크림 | ESSENTIAL | rgba(0,0,0,.5) · 탭 시 닫힘 |
| 타이틀 | ESSENTIAL | 16px/700 · 하단 보더 --border-lo |
| 옵션 항목 | ESSENTIAL | 높이 52px · 선택됨 = 그린 + ✓ · 탭 즉시 닫힘(단일 선택) 또는 누적 후 "적용"(복수) |
| 액션 버튼 행 | OPTIONAL | 복수 선택 시 필수 · "초기화(보조)" + "적용하기(주)" 2버튼 |
스펙
- radius: top 22px(r-lg) · bottom 0
- 배경:
--surface-2· 그림자:--shadow-md - 최대 높이: 화면의 80% · 초과 시 내부 스크롤
- 등장: translateY +100% → 0 ·
--dur-base+--ease-spring - 해제: 핸들 드래그 다운 or 스크림 탭 or 단일 선택 즉시
단일 선택(정렬)은 탭 즉시 닫힘. 복수 선택(필터)은 "적용" 버튼 필수. 핸들 드래그 close 항상 지원.
Bottom Sheet 안에 또 다른 Bottom Sheet 띄우기. 항목 10개 이상(스크롤 고려 필요). 타이틀 없는 Bottom Sheet.
Empty State
데이터가 없는 상태를 사용자에게 알리고, 다음 행동을 유도하는 화면 패턴이에요. 빈 상태는 오류가 아니라 진입 포인트예요.
검색 결과 없음
리뷰 없음 — CTA 포함
첫 번째 리뷰를 남겨보세요!
네트워크 오류 — 재시도 포함
구성 요소 규칙
| 요소 | 필수 여부 | 규칙 |
|---|---|---|
| 일러스트/이모지 | ESSENTIAL | 48px · opacity 0.4 · 맥락에 맞는 단일 이모지 또는 SVG 일러스트 |
| 타이틀 | ESSENTIAL | 16px/700 · 상황을 정확히 설명 · "없음", "못했어요" 등 사실 기술 |
| 설명 | ESSENTIAL | 13px · 다음 행동을 암시 · 최대 2줄 |
| CTA 버튼 | OPTIONAL | 빈 상태 탈출 경로 제공 시 · Primary 또는 Neutral 버튼 1개 |
빈 상태 3종 패턴
| 패턴 | 타이틀 톤 | CTA | 예시 상황 |
|---|---|---|---|
| 결과 없음 | 검색어·필터 조건 명시 | 없음 또는 "조건 초기화" | 검색, 필터 후 상품 없음 |
| 콘텐츠 비어있음 | 첫 행동 유도 | Primary 버튼 | 리뷰 0건, 찜 목록 0건 |
| 네트워크/오류 | "못했어요" 사실 기술 | "다시 시도" Neutral 버튼 | API 오류, 타임아웃 |
"없음"을 설명한 뒤 다음 행동을 안내. 타이틀에 검색어나 조건 명시(검색어: "나이키 페가수스").
"데이터가 없습니다" 단독. 감정 없는 영문 코드 노출. CTA 없이 막힌 느낌만 주기.
Skeleton
콘텐츠 로딩 중 레이아웃 이동을 방지하고 대기 경험을 개선하는 플레이스홀더예요. 실제 컴포넌트 형태와 일치시켜야 해요.
상품 카드 스켈레톤
랭킹 리스트 스켈레톤
리뷰 카드 스켈레톤
구성 요소 규칙
| 요소 | 규칙 |
|---|---|
| 형태 일치 | 실제 컴포넌트의 레이아웃·크기를 최대한 모방 — 로딩 후 레이아웃 이동 없어야 함 |
| 애니메이션 | shimmer(좌→우 광택 이동) · 1.6s linear infinite · 방향 항상 좌→우 |
| 색상 | 베이스: --surface-2 · 하이라이트: --surface-3 |
| 텍스트 줄 | 실제 텍스트 줄 수·비율과 동일하게 · 높이 14px(본문) / 10px(캡션) |
사용 원칙
- 300ms 이상 로딩 예상 시 스켈레톤 표시 (그 미만은 스켈레톤 없이 바로 콘텐츠)
- 스피너와 스켈레톤은 같은 화면에 동시 사용 금지
- 스켈레톤 → 실제 콘텐츠 전환 시 fade-in 0.2s 권장 (레이아웃 이동 방지)
- 페이지 전체 로딩 시 AppBar는 실제 렌더, 콘텐츠 영역만 스켈레톤
실제 UI 형태와 크기를 최대한 맞춤. 상품 카드 2×2 그리드라면 스켈레톤도 동일 그리드 구조.
스켈레톤 박스 비율이 실제 콘텐츠와 크게 다름(레이아웃 이동 발생). 스피너 + 스켈레톤 혼용.
Search Bar
상품·리뷰를 찾는 전역 검색 입력이에요. AppBar 하단 또는 카테고리 상단에 고정 배치돼요.
기본 상태
위에서부터: 기본(Placeholder) · 입력값 있음(Clear 표시) · 포커스 상태
비활성 (Disabled)
opacity .35 + pointer-events none — 로딩 중이거나 검색 기능 미지원 화면
구성 요소 규칙
| 요소 | 필수 여부 | 규칙 |
|---|---|---|
| 검색 아이콘 | ESSENTIAL | 왼쪽 · 16px · 포커스 시 그린 |
| 입력 필드 | ESSENTIAL | placeholder 색 --text-lo · 14px · 배경 없음 |
| Clear 버튼 | ESSENTIAL | 값 있을 때만 표시 · ✕ · 탭 시 입력값 초기화 |
| 마이크/필터 아이콘 | OPTIONAL | 오른쪽 끝 · 음성 검색 또는 검색 범위 필터 |
스펙
- 높이: 48px · 수평 패딩: 16px · radius:
--r-full(9999px) - 배경:
--surface-2· 보더:--border→ 포커스:--neon-green-dim - 플레이스홀더: 카테고리별로 다름 ("궁금한 러닝 장비 검색해보세요")
- 모바일: 탭 시 키보드 즉시 노출 · 검색은 키보드 확인 키 사용
플레이스홀더에 카테고리명 포함. 입력 즉시 자동완성 or 실시간 결과 노출.
"검색" 텍스트 버튼 추가(키보드 확인으로 충분). 값 없을 때 Clear 버튼 노출. 사각형 radius.
Product Card
상품 목록 화면에서 사용하는 2열 그리드 카드예요. 썸네일 + 브랜드 + 상품명 + 별점·리뷰 수로 구성돼요.
기본 그리드 (2열)
구성 요소 규칙
| 요소 | 필수 여부 | 규칙 |
|---|---|---|
| 썸네일 | ESSENTIAL | 1:1 비율 · 배경 #FFF · 로딩 전 스켈레톤 |
| 브랜드명 | ESSENTIAL | 10px · --text-lo · 항상 상품명 위 |
| 상품명 | ESSENTIAL | 13px/600 · 1줄 말줄임 · 최대 20자 |
| 별점 + 리뷰 수 | ESSENTIAL | 별 11px 그린 · 리뷰 수 "(128)" 형태 |
| 뱃지 | OPTIONAL | 썸네일 좌상단 · NEW / HOT / BEST · 그린 배경 검정 텍스트 |
스펙
- 카드 radius:
--r-md(16px) · 배경:--surface-2· 보더:--border-lo - 바디 패딩: 10px 12px 12px
- 뱃지: 10px/700 · 좌상단 8px · radius 99px
- 리뷰 0건: 별 회색 · "(0)" 표시
- 호버: border-color →
--border-hi
썸네일 배경 흰색(투명 PNG 상품 이미지 대응). 브랜드명 → 상품명 순서 유지.
상품명 2줄 허용(그리드 높이 불균일). 가격 노출(이 앱은 정보·리뷰 앱).
Banner
사용자를 특정 행동이나 기능으로 유도하는 전폭 프로모 카드예요. 홈·카테고리 상단에 1개만 배치해요.
브랜드 배너 (그린 강조)
뉴트럴 배너 (이벤트·공지)
구성 요소 규칙
| 요소 | 필수 여부 | 규칙 |
|---|---|---|
| 레이블 | ESSENTIAL | 10px/700 · 대문자 · letter-spacing .08em · 그린 |
| 타이틀 | ESSENTIAL | 16px/700 · 최대 2줄 · 행동 유도 문장 |
| CTA 링크 | ESSENTIAL | 그린 텍스트 · 화살표 → · 배너 전체가 탭 영역 |
| 미디어 | OPTIONAL | 오른쪽 끝 · 56px · 이모지 또는 SVG |
배너 타입 선택 기준
| 타입 | 배경 | 사용 상황 |
|---|---|---|
| brand | 그린 그라디언트 | 핵심 기능 유도 (프로필, 리뷰 작성 등) |
| neutral | --surface-2 | 이벤트·공지·랭킹 등 콘텐츠 탐색 |
한 화면에 배너 1개만. 타이틀 2줄 이내. 전체 탭 영역을 CTA로(버튼 따로 없어도 됨).
배너 2개 연속. 타이틀 3줄 이상. brand 타입을 이벤트에 남용(희소성 희석).
Section Header
홈·카테고리 페이지 내 콘텐츠 블록 구분에 사용하는 타이틀 행이에요. 타이틀 + 서브텍스트 + 더보기 화살표로 구성돼요.
기본 (타이틀만)
서브텍스트 포함
더보기 없음 (전체 노출 시)
구성 요소 규칙
| 요소 | 필수 여부 | 규칙 |
|---|---|---|
| 타이틀 | ESSENTIAL | 18px/700 · 이모지 포함 가능 · 섹션 성격을 명확히 |
| 서브텍스트 | OPTIONAL | 12px · --text-lo · 기준·조건 보조 설명 |
| 더보기 링크 | OPTIONAL | "더보기 →" 또는 "전체보기 →" · 콘텐츠가 잘려 있을 때만 |
스펙
- 콘텐츠까지 하단 간격: 12px
- 더보기 링크 정렬:
align-items: flex-end(서브텍스트 있어도 링크는 하단 정렬) - 더보기 탭 영역: 최소 44×44px
서브텍스트는 "최근 7일 기준" 같은 데이터 조건만. 콘텐츠 전체 노출 시 더보기 생략.
타이틀 25자 이상. 더보기에 "클릭하세요" 불필요한 동사 추가. 이모지 2개 이상.
Rating
상품·리뷰의 만족도를 별점으로 표현하는 컴포넌트예요. 표시형(읽기 전용)과 입력형(탭 선택) 두 가지로 사용돼요.
표시형 — 사이즈 변형
입력형 — 리뷰 작성
이 장비는 어떠셨나요?
4점 — 만족해요
점수-레이블 매핑
| 점수 | 레이블 | 사용 맥락 |
|---|---|---|
| 5점 | 최고예요! | 입력 직후 실시간 피드백 |
| 4점 | 만족해요 | |
| 3점 | 보통이에요 | |
| 2점 | 아쉬워요 | |
| 1점 | 별로예요 |
스펙
- 별 색상: 선택됨 =
--neon-green/ 반 별 = 50% clip / 비선택 =--border-hi - SM: 11px · MD: 16px · LG: 24px
- 입력형: 32px · 탭 영역 최소 44×44px · 선택 후 레이블 즉시 표시
입력형은 탭 즉시 색 변경 + 레이블 피드백. 표시형 반 별(0.5 단위) 지원.
입력형에서 0점 허용(최소 1점 제출). 별 8개 이상. 텍스트 없이 별만으로 점수 표현.
Tag / Label
상품 속성과 상태를 작은 알약 형태로 표시해요. 필터 칩보다 작고 인터랙션 없이 정보 전달만 해요.
속성 태그 (Attribute)
선택된 속성 (Selected)
상태 레이블 (Status)
실제 사용 예 — Product Card 조합
구성 요소 규칙
| 타입 | 배경 | 텍스트 | 사용 시점 |
|---|---|---|---|
| attr(기본) | --surface-3 | --text-mid | 선택 안 된 속성 태그 |
| green(선택) | 그린 10% | --neon-green | 선택된 속성 · 카드 안 강조 태그 |
| status-new | 그린 12% | --neon-green | 신상품 · 최근 등록 (30일 이내) |
| status-hot | 오렌지 10% | #ff8c00 | 최근 7일 리뷰 급증 상품 |
| status-best | 퍼플 10% | #b026ff | 누적 리뷰 수 1위 |
스펙
- 높이: 24px · 수평 패딩: 10px · radius: 99px · 폰트: 11px/500
- 상태 레이블 텍스트: 대문자(uppercase) 권장
- 카드 1개당 태그 최대 3개 (이상이면 "+N" 생략 처리)
태그는 사실 정보만(속성·신상 여부). 카드 안 태그 최대 3개.
태그에 "좋아요" 같은 주관적 평가. Filter/Bar 칩을 태그로 교체(크기·인터랙션 다름).
Divider
섹션·콘텐츠·리스트 아이템을 시각적으로 구분하는 1px 선이에요. 세기에 따라 3가지 토큰을 사용해요.
강도별 3종
Subtle — --border-lo (#1A1A1A) · 카드 내부, 목록 아이템
Default — --border (#262626) · 섹션 구분, 탭바 하단
Strong — --border-hi (#383838) · 모달 헤더, Bottom Sheet 타이틀
레이블 구분선
사용 매핑
| 위치 | 강도 | 토큰 |
|---|---|---|
| 카드 내부 구분 · 리뷰 카드 헤더/바디 | Subtle | --border-lo |
| 섹션 구분 · AppBar 하단 · 목록 아이템 사이 | Default | --border |
| 모달 헤더 · Bottom Sheet 타이틀 하단 | Strong | --border-hi |
| 로그인 "또는" · 폼 구분 | 레이블 구분선 | --border-lo + 텍스트 |
카드 내부에는 항상 Subtle. 섹션 사이는 Divider 대신 여백(24px↑) 먼저 검토.
Divider 색을 임의 값으로 지정. 같은 화면에 3가지 강도 혼용.
Spinner
단순 액션(버튼 탭 후 응답 대기, 데이터 재요청)의 짧은 로딩 상태에 사용해요. 300ms 이상 예상될 때만 표시하고, 긴 로딩은 Skeleton을 우선해요.
사이즈
버튼 로딩 상태
전체 오버레이 로딩
사용 기준
| 상황 | 컴포넌트 | 이유 |
|---|---|---|
| 버튼 탭 후 API 응답 대기 | Spinner SM (버튼 안) | 버튼 크기 유지, 피드백 즉시 |
| 페이지 첫 데이터 로딩 | Skeleton | 레이아웃 안정, CLS 방지 |
| 풀 페이지 재로딩 (오류 재시도) | Spinner LG (오버레이) | 스켈레톤이 없는 상황 |
| 무한 스크롤 다음 페이지 | Spinner MD (하단 중앙) | 스켈레톤 추가보다 간결 |
버튼 로딩 중 disabled 처리(중복 탭 방지). 300ms 미만은 스피너 없이 바로 결과 표시.
페이지 첫 로딩에 스피너(Skeleton 우선). 스피너 + Skeleton 동시 사용. 스피너 색을 브랜드 그린 외 임의 색으로.
Carousel / Swiper
홈 배너·상품 이미지를 가로로 슬라이드하는 컴포넌트예요. 자동 재생과 스와이프 제스처를 지원해요.
홈 배너 캐러셀
구성 요소 규칙
| 요소 | 필수 여부 | 규칙 |
|---|---|---|
| 슬라이드 | ESSENTIAL | 16:9 비율 · 최대 5장 · 콘텐츠는 Banner 컴포넌트 재사용 권장 |
| 닷 인디케이터 | ESSENTIAL | 슬라이드 수와 동일 · 현재 슬라이드 = 그린 + 넓게 · 터치 영역 44px |
| 이전/다음 버튼 | OPTIONAL | 데스크톱에서 마우스 오버 시 표시 · 모바일에서는 숨김 |
| 자동 재생 | OPTIONAL | 4초 간격 · 탭/포커스 시 일시 정지 · 무한 루프 |
스펙
- 슬라이드 전환: transform translateX ·
--dur-base+--ease-spring - 스와이프 임계값: 50px 이상 드래그 시 다음/이전으로
- 닷: 기본 24×4px · 현재 32×4px · radius 2px · 간격 6px
슬라이드 3~5개. 각 슬라이드는 단일 CTA만. 닷 인디케이터 항상 표시.
슬라이드 6개 이상(탐색 어려움). 중요 정보를 3번째 슬라이드 이후에만 배치. 자동 재생 2초 이하.
Profile Card
마이페이지 상단에 표시되는 사용자 신원·활동 요약 카드예요. 아바타 + 닉네임 + 리뷰·좋아요 통계로 구성돼요.
기본 프로필 카드
미설정 상태 (게스트)
구성 요소 규칙
| 요소 | 필수 여부 | 규칙 |
|---|---|---|
| 아바타 | ESSENTIAL | Avatar/XL (80px · .av.xl) · 미설정 시 "+" 아이콘 |
| 닉네임 | ESSENTIAL | 16px/700 · 미설정 시 안내 문구 |
| 통계 | OPTIONAL | 리뷰 수·받은 좋아요·도움됨 · 3개 이하 |
| 수정 버튼 | OPTIONAL | 설정된 경우 우측 끝 · 미설정 시 Primary CTA |
미설정 상태엔 빈 카드 대신 행동 유도 문구 + Primary CTA. 통계는 3개 이하.
통계 4개 이상(카드 폭 넘침). 닉네임 없이 "사용자" 같은 임시 텍스트.
Stat Block
리뷰 집계·상품 성능 수치를 나란히 보여주는 수평 통계 블록이에요. 홈 요약·상품 상세 상단에 사용해요.
리뷰 통계
앱 전체 통계 (홈)
구성 요소 규칙
| 요소 | 필수 여부 | 규칙 |
|---|---|---|
| 수치 | ESSENTIAL | 22px/800 · 브랜드 그린(핵심 KPI) 또는 기본 텍스트 |
| 레이블 | ESSENTIAL | 11px · --text-lo · 수치 바로 아래 |
| 구분선 | ESSENTIAL | 항목 사이 1px --border-lo |
스펙
- 최대 항목: 3개 (4개↑ 수치 폰트 18px으로 축소)
- 배경:
--surface-2· radius:--r-md· 외곽 보더:--border-lo - 그린 강조: 페이지당 1개 KPI 수치에만 사용
핵심 KPI 1개만 그린. 수치는 천 단위 쉼표 포맷 (2,340). 레이블은 2자 이상 명사형.
항목 4개 이상(각 항목 폭 너무 좁아짐). 수치 2줄 표시. 레이블에 단위 생략("개" 없이 숫자만).
Load More
목록 하단에서 추가 콘텐츠를 불러오는 패턴이에요. 무한 스크롤(자동)과 버튼 로드(수동) 두 가지 방식을 지원해요.
무한 스크롤 — 로딩 중
더보기 버튼 (수동)
목록 끝
방식 선택 기준
| 방식 | 사용 상황 | UX 고려 |
|---|---|---|
| 무한 스크롤 | 탐색형 목록 (리뷰 피드, 랭킹) | 자동 로드 · Spinner SM 표시 · 스크롤 위치 유지 |
| 더보기 버튼 | 정보 중심 목록 (검색 결과, 필터 결과) | 수동 트리거 · 총 개수 노출 "더 보기 (127)" |
더보기 버튼에 남은 콘텐츠 수 표시. 목록 끝에는 "모든 리뷰를 확인했어요" 종료 메시지.
무한 스크롤 + 더보기 버튼 혼용. 끝 상태 없이 계속 로딩 시도.
Modal / Dialog
삭제 확인·구매 확인처럼 사용자의 명시적 결정이 필요한 순간에 사용해요. 배경을 딤 처리해 포커스를 모달에 집중시켜요.
확인 다이얼로그
정보 다이얼로그
구성 요소 규칙
| 요소 | 필수 여부 | 규칙 |
|---|---|---|
| 스크림 | ESSENTIAL | rgba(0,0,0,.65) · 터치 시 닫힘 (파괴적 동작 제외) |
| 타이틀 | ESSENTIAL | 17px/700 · 행동 결과를 서술 ("~할까요?" 형식) |
| 본문 | OPTIONAL | 14px · --text-mid · 2줄 이하 권장 |
| 액션 | ESSENTIAL | 항상 2개 · 취소/확인 순서 · 파괴 동작은 빨간 강조 |
타이틀을 의문문으로. 취소 버튼 항상 왼쪽. 파괴 동작은 빨간 계열 텍스트로 구분.
액션 3개 이상. 스크롤이 필요한 긴 본문. 타이틀과 버튼 텍스트가 동일한 내용.
Accordion
FAQ·상품 상세 정보처럼 콘텐츠를 접고 펼치는 패턴이에요. 여러 항목이 공존하며 독립적으로 열리고 닫혀요.
자주 묻는 질문 (FAQ)
구성 요소 규칙
| 요소 | 필수 여부 | 규칙 |
|---|---|---|
| 트리거 | ESSENTIAL | 14px/500 · 전체 행 터치 가능 · 최소 높이 52px |
| 아이콘 | ESSENTIAL | Chevron 20px · 열림 시 180° 회전 · --dur-fast |
| 본문 | ESSENTIAL | 13px · --text-mid · max-height 애니메이션 |
| 구분선 | ESSENTIAL | 항목 사이 --border-lo 1px |
스펙
- 기본 동작: 독립 개폐 (하나 열어도 나머지 닫히지 않음)
- 애니메이션:
max-height: 0 → 400px+--dur-base+--easing - 터치 영역: 트리거 전체 행 (아이콘만 X)
트리거 텍스트를 질문형으로. 기본 상태 첫 항목 열림 권장. 최대 7개 항목.
하나 열면 나머지 자동으로 닫힘 (Exclusive Mode) — FAQ에선 사용자가 비교 불가. 트리거를 아이콘 버튼으로만 한정.
Notice / Alert
페이지 내 인라인 상태 알림이에요. 사용자의 행동 결과(성공·오류)나 중요 안내를 콘텐츠 흐름 안에서 보여줄 때 사용해요. Toast와 달리 사라지지 않아요.
타입별 예시
Toast vs Notice 선택 기준
| 기준 | Toast | Notice |
|---|---|---|
| 표시 위치 | 화면 하단 오버레이 | 콘텐츠 흐름 인라인 |
| 지속 시간 | 3초 후 자동 사라짐 | 사라지지 않음 |
| 사용 상황 | 즉각적 피드백 (저장됨, 복사됨) | 상태 설명 (오류, 안내) |
오류 상태 notice는 폼 상단에 배치. 타이틀은 간결하게 (15자 이하). 아이콘으로 시각 코드 강화.
페이지에 2개 이상 동시 표시. notice + toast 동시 사용 (중복 알림). 단순 성공 상태에 error 색상 사용.
Quantity Stepper
장바구니·상품 상세에서 수량을 증감하는 인터랙티브 컨트롤이에요. − / 숫자 / + 세 영역으로 구성돼요.
기본 스테퍼
장바구니 행 (컨텍스트 사용)
구성 요소 규칙
| 요소 | 필수 여부 | 규칙 |
|---|---|---|
| 감소 버튼 | ESSENTIAL | 최솟값(1)에서 disabled · 터치 영역 44×44px 이상 |
| 수량 표시 | ESSENTIAL | 15px/600 · 양쪽 구분선 · 최소 40px 너비 |
| 증가 버튼 | ESSENTIAL | 재고 상한에서 disabled · 최대 99 표시 |
최솟값 1 미만으로 내려가지 않게. 최댓값은 재고 수량에 맞게. 수량 변경 시 총 금액 즉시 갱신.
수량 0 허용 (장바구니에서 0 = 삭제는 별도 UX로). 수량 직접 입력(텍스트 필드) 혼용 — 별도 패턴 필요. 소수점 수량.
Tab Bar
동일 페이지 내에서 관련 콘텐츠를 수평으로 전환하는 탭이에요. 상품 상세(정보/리뷰/Q&A)나 마이페이지 서브 섹션에 사용해요.
상품 상세 탭
나이키 페가수스 41은 일상적인 훈련부터 장거리까지 폭넓게 소화할 수 있는 데일리 러닝화예요.
- Air Zoom Pegasus 에어 쿠셔닝
- ReactX 폼 미드솔 — 전작 대비 반발력 13% 향상
- 와이드 토박스 개선으로 자연스러운 발 움직임
구성 요소 규칙
| 요소 | 필수 여부 | 규칙 |
|---|---|---|
| 탭 항목 | ESSENTIAL | 2~4개 · 균등 너비(flex:1) · 최소 44px 높이 |
| 활성 인디케이터 | ESSENTIAL | 하단 2px 그린 바 · 항목 좌우 패딩 16px 안쪽 길이 |
| 탭 패널 | ESSENTIAL | 활성 탭에만 display:block · 패딩 16px 상단 |
| 배지 숫자 | OPTIONAL | 탭 라벨 우측 공백 뒤 숫자 (별도 배지 태그 X) |
탭 항목 2~4개. 라벨 짧게 (6자 이하). 현재 탭 컨텐츠는 즉시 교체(애니메이션 X).
탭 5개 이상 (가로 스크롤 필요 → Filter/Bar 패턴 사용). 탭 변경 시 슬라이드 전환 — 스크롤 위치 이탈.
Price Display
상품 가격을 일관되게 표시하는 패턴이에요. 정가·할인율·최종가를 계층 구조로 시각화해요.
할인 가격
가격 표시 규칙
| 요소 | 규칙 |
|---|---|
| 최종가 | 22px/800 · 기본 --text · 핵심 KPI만 그린 |
| 정가 (취소선) | 13px · --text-lo · line-through · 최종가 위 |
| 할인율 배지 | 빨간 배경 · % 단위 · 정가와 같은 줄 |
| 단위(원) | 최종가와 같은 줄 · 13px · --text-lo |
천 단위 형식
- 항상
Intl.NumberFormat('ko-KR')사용 — 213,000 형식 - 소수점 가격 없음 · "원" 단위를 숫자 바로 오른쪽에 별도 span으로
- 0원은 "무료" 텍스트 (숫자 표기 X)
정가 → 할인율 → 최종가 순서. 할인율 배지는 정가와 같은 줄. 최종가가 가장 크고 굵게.
정가 없이 할인율만 표시. "149000" 천 단위 없이 표기. 최종가에 원을 붙여 한 span에 넣음.
Form Group
레이블 + 입력 필드 + 힌트/에러 메시지를 묶은 최소 단위예요. 로그인·프로필 수정·리뷰 작성 폼에서 반복 사용해요.
기본 폼 예시 (프로필 수정)
구성 요소 규칙
| 요소 | 필수 여부 | 규칙 |
|---|---|---|
| 레이블 | ESSENTIAL | 12px/600 · --text-mid · 필드 위 · 필수 * 빨강 |
| 입력 필드 | ESSENTIAL | Input 컴포넌트 참조 |
| 힌트 | OPTIONAL | 11px · --text-lo · 필드 아래 · 에러와 공존 불가 |
| 에러 | OPTIONAL | 11px · #f87171 · 필드 보더도 빨강 · 힌트 대체 |
레이블 항상 필드 위. 에러 메시지는 필드 바로 아래. 필수 필드만 *로 표시 (선택을 표시하는 것보다 효율적).
플레이스홀더만으로 레이블 대체 — 입력 시 가이던스 사라짐. 에러 + 힌트 동시 표시. 레이블에 콜론 붙임.
Switch / Toggle
알림·다크모드처럼 즉각 효과가 있는 On/Off 설정에 사용해요. 체크박스와 달리 탭 즉시 적용돼요.
상태별 예시
알림 설정 목록 (컨텍스트)
Switch vs Checkbox 선택
| 기준 | Switch | Checkbox |
|---|---|---|
| 적용 시점 | 탭 즉시 | 폼 제출 후 |
| 용도 | 시스템 설정, 알림 | 동의·선택 항목 |
| 상태 | On / Off (이진) | 선택 / 미선택 / 반선택 |
탭 즉시 효과 적용 (확인 버튼 불필요). 레이블은 행동이 아닌 기능명으로 ("알림 켜기" → "푸시 알림").
폼 안에서 Submit 전 적용되는 설정에 Switch 사용 — Checkbox로. Switch + "저장" 버튼 조합.
List Item / Row
설정·메뉴·선택 목록의 각 행 단위 패턴이에요. 아이콘 + 텍스트 + 우측 부가 요소의 3-존 레이아웃으로 구성돼요.
설정 목록
값 선택 목록
구성 요소 규칙
| 존 | 필수 여부 | 규칙 |
|---|---|---|
| 리딩 아이콘 | OPTIONAL | 36×36px · --surface-3 배경 · --r-sm |
| 바디 (제목+부제) | ESSENTIAL | 제목 14px/500 · 부제 12px · --text-lo |
| 트레일 | OPTIONAL | Chevron / Switch / 값 텍스트 / 선택 인디케이터 중 택 1 |
스펙
- 최소 행 높이: 52px · 실제 패딩: 14px 상하
- 항목 구분: 하단 1px
--border-lo· 마지막 항목 구분선 없음 - 터치 영역: 전체 행 (
cursor:pointer+:hover배경--surface-2)
트레일 요소는 1가지만. 탐색 목적 행에 Chevron. 값/상태 표시엔 텍스트 or 토글.
트레일에 Chevron + Switch 동시 사용. 아이콘 없는 행과 있는 행 혼용(들여쓰기 불일치).
Tooltip
아이콘·약어·잘린 텍스트의 의미를 탭하거나 호버했을 때 말풍선으로 설명해요. 12자 이하의 짧은 보조 텍스트에만 사용해요.
위치 변형
구성 요소 규칙
| 요소 | 규칙 |
|---|---|
| 텍스트 | 11px · --text-mid · 최대 30자 · 1줄 권장 |
| 배경 | --surface-3 + --border 테두리 |
| 화살표 | CSS border trick · 5px · 하단 중앙 (기본) |
| 트리거 | 탭(모바일) / 마우스 호버(데스크톱) |
스펙
- 표시 지연: 탭 즉시 / 호버 300ms 후
- 사라짐: 포커스 이탈 또는 2초 타임아웃(모바일)
- z-index:
--z-raised (10)
정보성 보조 설명에만 사용. 12자 이하 단문. 항상 트리거 요소 가까이 위치.
링크·버튼을 포함한 긴 설명 → Popover/Modal 사용. 항상 노출되는 안내 텍스트 → Notice 사용. 모바일에서 hover 의존.
Bottom CTA Bar
상품 상세 하단에 고정된 구매 행동 유도 바예요. 스크롤 여부와 관계없이 항상 화면 하단에 떠 있어요.
상품 상세 CTA
리뷰 작성 CTA
구성 요소 규칙
| 요소 | 필수 여부 | 규칙 |
|---|---|---|
| 배경 | ESSENTIAL | --bg · 상단 --border-lo 1px · 패딩 12px 16px |
| Primary CTA | ESSENTIAL | 그린 배경 · 높이 46~48px · flex:1 또는 고정폭 |
| Secondary CTA | OPTIONAL | 그린 테두리 · 장바구니 등 보조 동작 |
| 아이콘 버튼 | OPTIONAL | 찜/공유 · 48×48px · --border-hi 테두리 |
스펙
- 위치:
position: sticky; bottom: 0(SPA 내) 또는fixed(전체 페이지) - 안전 영역: iOS 홈 인디케이터를 위해
padding-bottom: env(safe-area-inset-bottom) - CTA 최대 2개 (아이콘 버튼 제외)
Primary CTA(구매)가 항상 우측. 바 배경은 반투명 blur 대신 불투명 --bg. Safe-area padding 적용.
CTA 3개 이상(터치 오류 증가). 상단 고정 사용(App Bar 영역 침범). 가격·수량 없이 "구매" 버튼만 노출.
Score / Metric
장비 세부 성능 항목(쿠셔닝·그립·무게)을 막대 그래프와 숫자로 시각화해요. 상품 상세 리뷰 집계 섹션에 사용해요.
세부 평점 (러닝화)
구성 요소 규칙
| 요소 | 필수 여부 | 규칙 |
|---|---|---|
| 항목 레이블 | ESSENTIAL | 13px · --text-mid · 고정 폭 72px · 5자 이하 |
| 바 | ESSENTIAL | 높이 6px · 반경 3px · 그린 fill · 회색 track |
| 수치 | ESSENTIAL | 13px/700 · 우측 고정 폭 28px |
| 전체 별점 | OPTIONAL | 좌측 큰 숫자 + 별 아이콘 + 리뷰 수 · 세부 항목과 세트로 |
항목 5개 이하. 수치와 바 함께 표시(바만 사용 시 인식 불명확). 전체 별점과 세트로 배치.
항목 6개 이상(스캔 어려움). 퍼센트 단위 표시("90%" 대신 "4.5"). 바 색상을 의미 없이 여러 색으로 사용.
Variant Selector
색상·사이즈·옵션을 선택하는 상품 상세 내 인터랙티브 선택기예요. 칩 형태(텍스트)와 컬러 스왓치 두 가지로 구성돼요.
사이즈 선택
색상 선택
구성 요소 규칙
| 상태 | 텍스트 칩 | 컬러 스왓치 |
|---|---|---|
| 기본 | --surface-2 배경 · --border-lo | 원형 36px · --border-lo 테두리 |
| 선택 | 그린 테두리 · 그린 텍스트 · 연그린 배경 | 그린 테두리 + 3px glow shadow |
| 품절 | 35% 투명 · 취소선 | 35% 투명 · 반투명 X 오버레이 |
선택된 값을 레이블 우측에 텍스트로 표시. 품절 옵션도 그레이로 표시(인식 제공). 색상 선택 시 이름도 함께 표시.
품절 옵션 완전 숨김(재고 인식 불가). 사이즈 칩 4개 이상일 때 1열 고정(overflow 대신 wrap 사용). 색상만 표시하고 이름 생략.
Photo Grid
리뷰 작성 시 사진을 첨부하거나, 상품·리뷰의 사진을 격자로 보여주는 컴포넌트예요.
리뷰 작성 — 사진 첨부
상품 리뷰 갤러리 (보기)
구성 요소 규칙
| 모드 | 그리드 | 규칙 |
|---|---|---|
| 업로드 | 3열 · 1:1 비율 | "+" 셀은 항상 마지막 · 최대 5장 초과 시 숨김 · 첨부 번호 배지 |
| 갤러리 | 3열 · 1:1 비율 | 6번째 셀에 나머지 수 "+N" 오버레이 · 탭하면 풀스크린 뷰어 |
스펙
- 그리드 간격: 4px · 셀 radius:
--r-sm - 최대 업로드: 5장 · jpg/png/webp · 5MB 이하
- "+N" 오버레이:
background:rgba(0,0,0,.45)· 텍스트 16px/700 · 흰색
"+" 셀 항상 마지막 위치. 첨부 중 로딩 Spinner 표시. 삭제는 셀 우상단 × 버튼.
"+N" 없이 사진 잘라서 표시(콘텐츠 누락 인지 불가). 2열·4열 혼용. 업로드 셀에 번호 없음(순서 알 수 없음).
Sort Sheet
피드·목록 화면에서 정렬 기준을 바꾸는 바텀 시트 변형이에요. 상단 "정렬" 버튼 탭 시 슬라이드업돼요.
리뷰 정렬 (인라인 데모)
랭킹 피드 정렬
구성 요소 규칙
| 요소 | 필수 여부 | 규칙 |
|---|---|---|
| 항목 | ESSENTIAL | 15px · 기본 --text-mid · 선택 그린/700 |
| 선택 인디케이터 | ESSENTIAL | 20px 원형 · 선택 시 그린 배경 + ✓ 흰색 |
| 항목 구분선 | ESSENTIAL | --border-lo · 마지막 항목 제외 |
| 헤더 | OPTIONAL | "정렬 기준" 레이블 + X 버튼 — Bottom Sheet 핸들 아래 |
항목 탭 즉시 적용 후 시트 닫힘. 현재 선택 항목에 체크 인디케이터. 항목 5개 이하.
"적용" 버튼 추가(즉시 적용과 중복). 정렬 + 필터 혼용 시트(별도 분리). 항목 6개 이상 — 스크롤 필요.
Spec Table
장비의 기술 제원(무게·소재·드롭)을 레이블-값 쌍으로 나열해요. 상품 상세 "상품 정보" 탭 내 주요 섹션이에요.
러닝화 제원
| 브랜드 | Nike |
| 모델명 | Pegasus 41 |
| 무게 | 283g (US 10 기준) |
| 드롭 | 10mm |
| 스택 높이 | 힐 40mm / 포어풋 30mm |
| 미드솔 | ReactX Foam |
| 아웃솔 | 고무 (발뒤꿈치·앞부분) |
| 갑피 | 엔지니어드 메시 |
| 추천 용도 | 데일리 트레이닝, 장거리 |
| 출시일 | 2024년 5월 |
헬멧 제원 (사이클링)
| 브랜드 | Giro |
| 인증 | CPSC, CE EN1078 |
| 무게 | 225g (M 기준) |
| 통풍구 | 25개 |
| 피팅 시스템 | Roc Loc Air Fit |
| 사이즈 | S(51-55) · M(55-59) · L(59-63) |
구성 요소 규칙
| 요소 | 규칙 |
|---|---|
| 레이블 셀 | 13px · --text-lo · 고정 폭 90px · 우측 정렬 X |
| 값 셀 | 13px/500 · --text · 줄바꿈 허용 |
| 행 구분선 | --border-lo 1px · 마지막 행 제외 |
| 행 수 | 6~12행 권장 · 초과 시 "더 보기" Accordion으로 |
레이블은 간결한 명사형 (4자 이하 권장). 단위는 값에 포함. 브랜드/모델명 최상단.
레이블과 값을 같은 스타일로 표시(구분 불명확). 빈 값 행 표시("–" 사용 또는 숨김). 행 13개 이상 노출.
Chip Input
리뷰 태그·키워드를 칩 형태로 추가·삭제하는 인풋이에요. Enter 또는 스페이스로 칩을 생성해요.
리뷰 태그 입력
구성 요소 규칙
| 요소 | 규칙 |
|---|---|
| 칩 | 11px · 그린 계열 · 높이 24px · × 삭제 버튼 포함 |
| 인풋 | 배경 없음 · 테두리 없음 · 13px · placeholder로 안내 |
| 래퍼 | --surface-2 배경 · --border 테두리 · focus시 그린dim |
| 최대 개수 | 5개 · 초과 시 인풋 비활성 + 힌트 갱신 |
Enter·Space·쉼표로 칩 생성. 공백 제거 후 생성. # 자동 prefix. 잔여 개수 힌트 표시.
칩 6개 이상(입력란 없어짐). 중복 태그 허용. 특수문자·이모지가 포함된 태그.
Step Wizard
결제·회원가입·온보딩처럼 단계가 정해진 플로우에서 현재 위치와 진행률을 보여줘요.
결제 단계 (3단계 중 2번째)
리뷰 작성 단계 (4단계 중 1번째)
구성 요소 규칙
| 상태 | 닷 | 레이블 | 연결선 |
|---|---|---|---|
| 완료(done) | 그린 배경 · 흰 ✓ | --text | 그린 2px |
| 현재(on) | 그린 테두리 · 그린 숫자 | --text | 그린 2px (이전 → 현재) |
| 미래 | 회색 테두리 · 회색 숫자 | --text-lo | --border-lo 2px |
스펙
- 최대 단계: 5 (6↑ 레이블 잘림)
- 연결선: 인접한 두 단계 사이 · 각 닷의 중앙(top:14px) 기준 수평
- 이전 단계 클릭: 허용 여부를 플로우마다 명시 (결제는 허용 / 리뷰 작성은 순차 강제)
단계 레이블은 명사형 (3자 이하 권장). 완료 단계에 ✓ 아이콘. 현재 단계 그린 강조.
단계 6개 이상(가로 공간 부족). 연결선 없는 단독 닷(순서 관계 불명확). 레이블 없이 숫자만 사용.
Swipe Action
리스트 아이템을 좌우로 스와이프해 북마크·삭제 등 액션을 노출하는 패턴이에요.
왼쪽 스와이프 (북마크 노출)
구성 요소 규칙
| 요소 | 규칙 |
|---|---|
| 스와이프 거리 | 64–80px · 콘텐츠 이동 + 배경 노출 |
| 왼쪽 액션 | Blue · 저장·공유 등 긍정 액션 |
| 오른쪽 액션 | Red · 삭제·숨기기 등 파괴적 액션 |
| spring easing | --ease-spring 으로 탄성감 부여 |
Pull to Refresh
리스트 최상단에서 아래로 당겨 콘텐츠를 갱신하는 네이티브 제스처 패턴이에요.
당기는 중
로딩 중
구성 요소 규칙
| 상태 | 아이콘 | 문구 |
|---|---|---|
| 당기는 중 | ↓ (화살표) | 당겨서 새로고침 |
| 임계점 초과 | ↑ (반전) | 놓으면 새로고침 |
| 로딩 중 | ↻ (스피너) | 업데이트 중... |
| 완료 | ✓ | 업데이트 완료 |
Onboarding
첫 실행 시 핵심 가치를 전달하는 인트로 카드예요. 스킵 옵션은 항상 제공해야 해요.
온보딩 카드 (2/3)
AI가 추천해줘요
구성 요소 규칙
| 요소 | 규칙 |
|---|---|
| 페이지 수 | 최대 3장 · 각 슬라이드는 단일 혜택만 |
| 스킵 버튼 | 항상 노출 · Border 스타일 |
| 진행 점 | 현재 페이지 32px, 나머지 24px |
| 히어로 | 3:2 비율 · 일러스트 또는 앱 화면 캡처 |
Search Result
검색어 하이라이트와 썸네일을 포함한 상품·콘텐츠 검색 결과 아이템이에요.
상품 검색 결과
검색 기록
결과 없음
다른 키워드로 검색해보세요.
구성 요소 규칙
| 요소 | 규칙 |
|---|---|
| 키워드 강조 | <mark> 태그 · neon-green · font-weight 700 |
| 썸네일 | 48×48px · r-sm 라운드 |
| 가격 | 우측 고정 · font-weight 700 |
| 빈 상태 | 이모지 + 제목 + 설명 3줄 구성 |
Range Slider
가격 범위·사이즈 등 연속 값의 최솟값·최댓값을 동시에 설정하는 듀얼 핸들 슬라이더예요.
가격 범위 필터
무게 범위 필터
구성 요소 규칙
| 요소 | 규칙 |
|---|---|
| 트랙 높이 | 4px · surface-3 배경 |
| 채움 색 | neon-green · 두 핸들 사이 구간 |
| 핸들 크기 | 20px 원형 · neon-green · shadow-md |
| 현재 값 표시 | 슬라이더 위에 font-weight 700 표시 |
Notification Item
알림 센터에 표시되는 이벤트·가격 변동·댓글 등 단건 알림 아이템이에요.
알림 목록
구성 요소 규칙
| 요소 | 규칙 |
|---|---|
| 미읽음 닷 | 아이콘 우상단 · 8px · neon-green |
| 미읽음 텍스트 | font-weight 700 (읽음: 500) |
| 아이콘 | 40px 원형 · surface-3 배경 |
| 시간 | 11px · text-lo · 우측 정렬 |
Size Chart
신발·의류 사이즈를 그리드로 선택하는 컴포넌트예요. 품절 사이즈는 시각적으로 구분해요.
신발 사이즈 선택
의류 사이즈 선택
구성 요소 규칙
| 상태 | 배경 | 테두리 | 텍스트 |
|---|---|---|---|
| 기본 | surface-2 | border-lo | text-mid |
| 선택(on) | neon-green | neon-green | --bg (검정) |
| 품절(sold) | surface-3 | border-hi 점선 | 취소선 + 35% 불투명 |
Quick Action
홈 화면·빠른 메뉴에서 주요 기능으로 즉시 이동하는 아이콘+라벨 버튼 그룹이에요.
홈 퀵 액션 (4열)
상품 상세 퀵 액션
구성 요소 규칙
| 요소 | 규칙 |
|---|---|
| 아이콘 크기 | 24px · 이모지 또는 SVG |
| 라벨 | 11px · font-weight 500 · text-mid |
| 배치 | flex · gap 8px · 균등 분할(flex:1) |
| primary 상태 | neon-green 테두리 + 배경 tint |
Countdown Timer
세일 종료·이벤트 마감까지 남은 시간을 시각화해 긴박감을 부여하는 컴포넌트예요.
플래시 세일 배너형
긴박 상태 (1시간 미만)
구성 요소 규칙
| 요소 | 규칙 |
|---|---|
| 기본 색상 | surface-2 배경 · text 숫자 |
| 긴박 임계값 | 1시간 미만 → urgent 클래스 · red 계열 |
| 숫자 폰트 | tabular-nums · font-weight 800 |
| 각 단위 | 2자리 고정 · 시·분·초 레이블 하단 |
Comparison Table
두 상품의 스펙을 나란히 비교해 구매 결정을 돕는 테이블이에요.
러닝화 2종 비교
| 항목 |
나이키
페가수스 41
189,000원
|
호카
클리프턴 9
219,000원
|
|---|---|---|
| 무게 | 287g | 310g |
| 힐 드롭 | 10mm | 5mm |
| 쿠셔닝 | 보통 | 매우 높음 |
| 적합 거리 | 10km 이하 | 하프·풀마라톤 |
| 리뷰 평점 | ★ 4.3 | ★ 4.7 |
구성 요소 규칙
| 요소 | 규칙 |
|---|---|
| 승자 셀 | neon-green · font-weight 700 |
| 중립 셀 | text-mid · 기본 weight |
| 헤더 | 브랜드 10px + 상품명 13px + 가격 12px green |
| 행 높이 | 패딩 12px 16px · 구분선 border-lo |
Review Summary
전체 리뷰 분포를 막대 차트로 보여주는 총합 평점 컴포넌트예요.
종합 평점
키워드 요약
구성 요소 규칙
| 요소 | 규칙 |
|---|---|
| 종합 점수 | 48px · font-weight 900 · 소수점 1자리 |
| 분포 바 | 6px 높이 · neon-green fill · 비율 width% |
| 별점 아이콘 | 16px · 소수 반영 (4.6 → ★★★★☆) |
| 키워드 칩 | 기존 chip 컴포넌트 재사용 |
Error State
네트워크 오류·404·빈 결과 등 예외 상황에서 사용자가 다음 행동을 취할 수 있도록 안내하는 페이지예요.
네트워크 오류
404 페이지 없음
서버 오류
구성 요소 규칙
| 유형 | 아이콘/코드 | CTA |
|---|---|---|
| 네트워크 오류 | 이모지 아이콘 | 다시 시도 (primary) |
| 404 | 64px 회색 숫자 | 홈으로 + 이전 페이지 |
| 서버 오류 5xx | 이모지 아이콘 | 새로고침 |
| 빈 결과 | 이모지 아이콘 | 검색어 변경 유도 |
FAB Extended
텍스트 라벨이 붙은 확장형 플로팅 버튼이에요. 화면의 주요 액션 1개에만 사용해요.
Primary (메인 액션)
Secondary (보조 액션)
구성 요소 규칙
| 요소 | 규칙 |
|---|---|
| 높이 | 56px · 일반 FAB(48px)보다 8px 높음 |
| 라벨 | 15px · font-weight 700 |
| 위치 | 화면 우하단 고정 · z-index raised |
| 사용 제한 | 화면당 Extended FAB 1개 · 주요 액션만 |
Progress Bar
다운로드·업로드·단계 진행 등 완료율을 선형으로 표시하는 컴포넌트예요.
확정 진행률
불확정 (Indeterminate)
얇은 형태 (4px)
구성 요소 규칙
| 유형 | 높이 | 색상 |
|---|---|---|
| 기본 (green) | 8px | neon-green |
| 정보 (blue) | 8px | #3b82f6 |
| 위험 (red) | 8px | #ef4444 · 91%+ 사용 |
| 얇은 형태 | 4px | 맥락에 따라 색상 선택 |
Color Swatch
상품의 색상 옵션을 원형 스와치로 선택하는 컴포넌트예요.
러닝화 색상 선택
어패럴 색상
구성 요소 규칙
| 상태 | 테두리 | 설명 |
|---|---|---|
| 기본 | transparent | 색상 그대로 노출 |
| 선택(on) | 2px text + 3px gap + 5px text | 이중 링 패턴 |
| 품절(sold) | — | 대각선 취소선 overlay |
| 흰색 스와치 | border-lo 항상 표시 | 배경과 구분 |
Timeline
주문 배송 현황·이력·단계 완료를 세로 타임라인으로 표시하는 컴포넌트예요.
배송 추적
구성 요소 규칙
| 상태 | 닷 색상 | 텍스트 |
|---|---|---|
| 완료(done) | neon-green 솔리드 | 기본 (text) |
| 현재(active) | neon-green + glow ring | font-weight 700 |
| 대기(pending) | border-hi 회색 | text-lo |
Gear Card
운동 장비·상품을 그리드에서 표시하는 핵심 카드예요. 썸네일·브랜드·이름·가격·평점을 포함해요.
2열 그리드
구성 요소 규칙
| 요소 | 규칙 |
|---|---|
| 이미지 비율 | 4:3 고정 · 배경 surface-3 |
| 카테고리 | 10px · font-weight 700 · 대문자 |
| 할인가 | 원래 가격 취소선 + danger 배지 |
| 평점 | ★ + 숫자 · 우측 정렬 · 12px |
Filter Chip Group
카테고리·브랜드·조건 등 필터를 가로 스크롤 칩 그룹으로 제공하는 컴포넌트예요.
카테고리 필터
브랜드 + 조건 복합
구성 요소 규칙
| 요소 | 규칙 |
|---|---|
| 기본 높이 | 34px · padding 0 14px |
| 선택 상태 | neon-green 테두리 + 배경 10% tint |
| 카운트 뱃지 | surface-3 배경 · 선택 시 green tint |
| 레이아웃 | flex-wrap 또는 가로 스크롤 (모바일) |
Map Pin
지도 위 매장·픽업 포인트를 표시하는 핀 말풍선이에요. 선택 상태와 비선택 상태를 구분해요.
핀 변형
구성 요소 규칙
| 상태 | 배경 | 설명 |
|---|---|---|
| 기본 | neon-green | 일반 핀 · 검정 텍스트 |
| 선택(selected) | bg(검정) + green 테두리 | 현재 선택된 매장 · glow |
| Secondary | surface-2 | 부가 정보 · 낮은 우선순위 |
| 꼬리 화살표 | ::after pseudo | 핀 아래 6px 삼각형 |
사용 규칙
- 핀 라벨에 브랜드명만 넣어요 — 거리나 영업 상태는 선택 후 팝업에서 표시해요.
- 선택된 핀(selected)은 화면 중앙으로 지도를 이동시키고 하단 정보 카드를 올려요.
- 핀이 3개 이상 겹치면 클러스터 핀으로 그룹화해요 — 숫자를 표시하고 탭하면 확대해요.
- 지도 로딩 전에는 Skeleton으로 대체해요. 핀은 지도 타일이 완성된 후 순차 등장.
- 핀 색은 neon-green · surface-2 두 가지만 — 임의 색 추가 금지.
Coupon Card
할인 쿠폰을 시각화하는 카드예요. 금액/퍼센트 할인과 사용 완료 상태를 구분해요.
사용 가능 쿠폰
사용 완료
구성 요소 규칙
| 요소 | 규칙 |
|---|---|
| 좌측 할인 영역 | neon-green · 28px 숫자 · min-width 90px |
| 점선 구분자 | repeating-gradient 세로 점선 |
| 사용 완료 | 전체 60% 불투명 · 좌측 surface-3 |
| 만료 텍스트 | 11px · text-lo |
Wishlist Button
상품을 찜 목록에 추가/제거하는 하트 버튼이에요. 찜 상태는 red 계열로 표시해요.
상품 카드 내 찜하기
크기 변형
구성 요소 규칙
| 상태 | 아이콘 | 색상 |
|---|---|---|
| 기본 | ♡ (빈 하트) | text-lo · surface-2 배경 |
| 찜됨(on) | ♥ (채운 하트) | #f87171 · red tint 배경 |
| hover | ♡ | border-hi · text |
Cart Item
장바구니의 단건 상품 행이에요. 썸네일·옵션·수량 조절·가격·삭제를 포함해요.
장바구니 목록
구성 요소 규칙
| 요소 | 규칙 |
|---|---|
| 썸네일 | 72×72px · r-sm |
| 수량 조절 | 기존 Quantity Stepper 컴포넌트 재사용 |
| 최소 수량 | 1 · 1일 때 − 버튼 disabled |
| 삭제 | underline 텍스트 버튼 · text-lo |
Member Tier
브론즈·실버·골드·플래티넘 등 멤버십 등급을 배지로 표시하고 다음 등급까지의 진행률을 보여줘요.
등급 배지
등급 카드 (골드)
72,000원 남음
구성 요소 규칙
| 등급 | 색상 | 기준 (월 구매) |
|---|---|---|
| 브론즈 | #b4783c 계열 | ~49,999원 |
| 실버 | #a0a0b4 계열 | 50,000~99,999원 |
| 골드 | #ffc800 계열 | 100,000~199,999원 |
| 플래티넘 | neon-green | 200,000원 이상 |
Callout
본문 내 중요 정보를 강조하는 인라인 블록이에요. 좌측 컬러 보더로 유형을 구분해요.
유형별 콜아웃
구성 요소 규칙
| 유형 | 보더 색 | 용도 |
|---|---|---|
| TIP (green) | neon-green | 유용한 팁·구매 가이드 |
| INFO (blue) | #3b82f6 | 중립적 안내·배송 정보 |
| WARNING (yellow) | #fbbf24 | 주의사항·정책 안내 |
| DANGER (red) | #ef4444 | 마감 임박·중요 경고 |
Delivery Status
주문의 배송 단계를 시각적으로 보여줘요. 현재 단계를 강조 표시해요.
배송 현황 트래커
배송 히스토리
| 상태 | 색상 | 의미 |
|---|---|---|
| 완료 | neon-green | 이전 단계 |
| 활성 | neon-green + glow | 현재 단계 |
| 대기 | border-hi | 미완료 단계 |
Order Summary
결제 전 금액 내역을 보여주는 요약 카드예요. 할인·배송비·최종 결제액을 포함해요.
주문 요약
| 항목 | 표시 방식 |
|---|---|
| 할인 금액 | #4ade80 녹색 |
| 무료 배송 | "무료" 텍스트 |
| 최종 금액 | neon-green + 굵게 |
Rating Prompt
앱 사용 중 적절한 시점에 평점을 요청하는 카드예요. 긍정 경험 이후 노출해요.
앱 평점 요청
| 트리거 | 조건 |
|---|---|
| 첫 주문 완료 | 완료 화면 이탈 후 2초 |
| 재방문 | 3회 연속 · 거절 후 30일 |
| 리뷰 작성 후 | 리뷰 등록 완료 시 |
Address Form
배송지를 입력하는 폼이에요. 우편번호 조회 → 도로명 자동 입력 → 상세 주소 순으로 입력해요.
배송지 입력
| 필드 | 입력 방식 | 검증 |
|---|---|---|
| 우편번호 | 주소 검색 API | 자동 입력 |
| 도로명 주소 | API 자동 완성 | 읽기 전용 |
| 상세 주소 | 직접 입력 | 1자 이상 |
Payment Method
결제 수단을 선택하는 컴포넌트예요. 선택된 항목은 neon-green 보더로 강조해요.
결제 수단 선택
| 상태 | 스타일 |
|---|---|
| 선택 | neon-green 보더 + 배경 tint |
| 미선택 | border-lo |
Recently Viewed
최근 본 상품을 수평 스크롤로 보여주는 컴포넌트예요.
최근 본 상품
구성요소 스펙
| 요소 | 값 | 비고 |
|---|---|---|
| 썸네일 | 80×80px · --r-sm | 상품 대표 이미지 · object-fit:cover |
| 상품명 | 12px · 400 · 1줄 말줄임 | 최대 8자 표시 권장 |
| 가격 | 12px · 600 · --text | 할인가 있으면 원가에 취소선 |
| 최대 노출 | 20개 | 초과 시 오래된 항목부터 제거 (FIFO) |
| 스크롤 | horizontal · 스크롤바 숨김 | iOS momentum scroll 적용 |
| 빈 상태 | 텍스트만 — "아직 본 상품이 없어요" | 섹션 헤더 자체를 숨기지 않기 |
사용 규칙
- 홈·상품 상세·장바구니 최하단에 배치 — 구매 여정의 이탈 방지 수단이에요.
- 각 아이템은 탭하면 해당 상품 상세로 바로 이동해야 해요.
- X 버튼으로 개별 항목을 삭제할 수 있어요 — 전체 기록 초기화는 설정에서만.
- 로그인 상태에서만 기록을 저장해요. 비로그인에서는 세션 내 임시 유지.
Push Notification
앱 푸시 알림의 외형과 내용 구조를 정의해요. 아이콘·제목·본문·시간으로 구성돼요.
알림 유형
| 요소 | 규칙 |
|---|---|
| 아이콘 | 40×40px · r-sm · 색상별 tint 배경 |
| 제목 | 14px semibold · 12자 이내 |
| 본문 | 13px · text-mid · 30자 이내 |
Product Detail
상품 상세 페이지의 핵심 헤더 영역이에요. 브랜드·상품명·별점·가격·재고를 포함해요.
상품 상세 헤더
상품 스펙 메타
| 요소 | 규칙 |
|---|---|
| 할인율 | #ef4444 빨강 |
| 별점 | #fbbf24 노랑 · 1자리 소수 |
| 포인트 | neon-green tint pill |
Stock Badge
상품의 재고 상태를 색상과 점으로 알려주는 인라인 배지예요.
재고 상태
사이즈 선택 사용 예시
| 상태 | 색상 | 기준 |
|---|---|---|
| 재고 충분 | neon-green | 10개 이상 |
| 재고 부족 | #fbbf24 노랑 | 1–9개 |
| 품절 | #f87171 빨강 | 0개 |
Point Badge
구매 시 적립되는 포인트를 상품·결제 화면에서 표시하는 배지예요.
포인트 표시 유형
| 유형 | 위치 |
|---|---|
| 인라인 pill | 상품 카드 · 상품 상세 |
| 결제 요약 | 주문 요약 화면 |
| 보유 포인트 카드 | 마이페이지 · 결제 화면 |
Info Banner
앱 내 주요 정보나 이벤트를 알리는 인라인 배너예요. 프로모션·안내·경고 3가지 유형이 있어요.
배너 유형
| 유형 | 배경 색상 | 용도 |
|---|---|---|
| promo | neon-green tint | 이벤트·할인 |
| info | #3b82f6 tint | 중립 안내 |
| warn | #fbbf24 tint | 주의 사항 |
Category Card
스포츠 카테고리를 그리드로 탐색하는 카드예요. 선택 상태는 neon-green으로 강조해요.
카테고리 그리드
구성요소
| 요소 | 필수 | 규칙 | |
|---|---|---|---|
| ① | 아이콘 | ESSENTIAL | 이모지 또는 SVG 아이콘 · 32px |
| ② | 레이블 | ESSENTIAL | 카테고리명 · 11px · 500 · 2~4자 이내 |
| ③ | 컨테이너 | ESSENTIAL | radius --r-md · 1px border-lo · 비율 1:1 |
상태
| 상태 | 배경 | 보더 | 레이블 색 |
|---|---|---|---|
| Default | --surface-2 | --border-lo | --text-mid |
| Selected | rgba(182,255,61,.08) | --neon-green 1.5px | --neon-green |
| Disabled | - | - | opacity .38 |
사용 규칙
- 카테고리는 5~8개를 권장해요 — 4개 미만은 굳이 그리드로 나눌 필요 없어요.
- 아이콘은 카테고리당 하나만 — 그린 이모지·컬러 이모지 혼용 금지.
- 선택 상태에서도 레이블이 짧고 명확해야 해요. "스포츠"보다 "러닝"이 더 구체적이에요.
- 멀티 선택 시 선택 수를 상단 카운터로 표시해요 (예: "2개 선택됨").
Fit Guide
신체 측정치 기반 사이즈 추천 테이블이에요. 내 사이즈에 해당하는 행을 강조 표시해요.
러닝화 사이즈 가이드
| 발 길이 (mm) | 발 너비 | 추천 사이즈 |
|---|---|---|
| 235–240 | 보통 | 240mm |
| 240–245 | 보통 | 245mm |
| 245–252 | 보통 | 250mm 추천 |
| 252–258 | 보통 | 255mm |
| 258–265 | 보통 | 260mm |
| 요소 | 규칙 |
|---|---|
| 현재 사이즈 행 | neon-green tint 배경 · bold 텍스트 |
| 추천 배지 | fit-rec pill |
Activity Summary
러닝·운동 기록을 요약한 카드예요. 종목·날짜·핵심 지표(거리·시간·페이스 등)를 표시해요.
러닝 기록 카드
웨이트 기록 카드
| 요소 | 규칙 |
|---|---|
| 종목 레이블 | neon-green · 11px · uppercase |
| 핵심 지표 | 22px bold · 단위 11px |
Gift Wrap
선물 포장 옵션을 선택하는 컴포넌트예요. 체크 인터랙션으로 선택 상태를 표시해요.
포장 옵션 선택
| 상태 | 스타일 |
|---|---|
| 선택 | neon-green 보더 · 체크 filled |
| 미선택 | border-lo · 빈 원 |
Promo Code
할인 코드를 입력하고 유효성을 확인하는 컴포넌트예요. 성공·실패 피드백을 즉시 표시해요.
코드 입력
| 상태 | 스타일 |
|---|---|
| 기본 | border-lo 테두리 |
| 포커스 | neon-green 테두리 |
| 성공 | neon-green 배경 + 텍스트 |
| 실패 | #ef4444 배경 + 텍스트 |
Return Flow
반품·환불 절차를 단계별로 안내하는 컴포넌트예요. 사용자가 현재 진행 상태를 명확히 파악할 수 있게 해요.
반품 사유 선택
반품 단계
| 상태 | 스타일 |
|---|---|
| 완료 | neon-green 원형 ✓ 배지 |
| 진행 중 | neon-green 테두리 번호 |
| 대기 | border-hi 회색 번호 |
Workout Plan
일별 운동 계획을 카드 형식으로 표시하는 컴포넌트예요. 운동 종목·세트·진행률을 한눈에 파악할 수 있게 해요.
오늘의 운동
| 요소 | 스타일 |
|---|---|
| 카드 헤더 | neon-green 그라디언트 배경 |
| 완료 세트 | neon-green ✓ + 텍스트 |
| 진행 바 | neon-green fill on surface-3 |
| 미완료 세트 | text-lo 회색 |
Brand Card
스포츠 브랜드를 카드 형식으로 표시하는 컴포넌트예요. 카테고리·특성 태그와 함께 선택 상태를 지원해요.
브랜드 선택
| 상태 | 스타일 |
|---|---|
| 기본 | surface-2 + border-lo |
| 호버 | border-hi |
| 선택 | neon-green 테두리 + surface 틴트 |
Equipment Compare
두 장비를 나란히 비교하는 컴포넌트예요. 스펙 막대 그래프로 우열을 시각적으로 표현해요.
런닝화 비교
| 요소 | 스타일 |
|---|---|
| 추천 카드 | neon-green 테두리 + 배지 |
| 추천 스펙 바 | neon-green fill |
| 비교 스펙 바 | border-hi 회색 fill |
Achievement
운동 목표 달성 배지를 표시하는 컴포넌트예요. 잠금/달성 상태와 진행률을 함께 보여줘요.
달성 배지
| 상태 | 스타일 |
|---|---|
| 달성 | neon-green 배경 + 배지 |
| 진행 중 | neon-green 진행 바 |
| 잠금 | grayscale + opacity .5 |
Streak Card
연속 운동 기록을 시각화하는 컴포넌트예요. 주간 달성 현황과 격려 메시지를 함께 보여줘요.
이번 주 스트릭
| 요소 | 스타일 |
|---|---|
| 완료 일 | neon-green 배경 ✓ |
| 오늘 | neon-green + glow ring |
| 미완료 | surface-3 빈 원 |
Body Stats
사용자의 신체 측정 데이터를 카드 그리드로 표시하는 컴포넌트예요. BMI 시각화와 변화 추이를 함께 보여줘요.
신체 측정 데이터
| 요소 | 스타일 |
|---|---|
| 개선 | neon-green ▼ + 텍스트 |
| 악화 | #ef4444 ▲ + 텍스트 |
| BMI 바 | 그라디언트 + white 마커 |
Video Card
운동 가이드 영상을 썸네일 카드 형식으로 표시하는 컴포넌트예요. 재생 버튼과 영상 길이를 항상 표시해요.
추천 운동 영상
| 요소 | 스타일 |
|---|---|
| 재생 버튼 | neon-green 원형 + bg 삼각형 |
| 영상 길이 | 검은 반투명 배경 + 흰 텍스트 |
| 오버레이 | rgba(0,0,0,.4) |
Cal Tracker
섭취·소모 칼로리를 추적하는 컴포넌트예요. 오늘의 칼로리 균형을 한눈에 파악할 수 있게 해요.
오늘의 칼로리
| 타입 | 스타일 |
|---|---|
| 소모 | neon-green − 접두사 |
| 섭취 | #f87171 + 접두사 |
| 순 칼로리 | neon-green 큰 숫자 |
Route Map
러닝·자전거 경로를 미니맵으로 시각화하는 컴포넌트예요. 거리·페이스·고도를 함께 표시해요.
오늘의 러닝 경로
| 요소 | 스타일 |
|---|---|
| 경로 선 | neon-green stroke + glow |
| 시작점 | neon-green 원 |
| 종료점 | #ef4444 원 |
Gear Health
장비의 소모 상태를 추적하는 컴포넌트예요. 사용 km 기반으로 교체 시기를 시각적으로 안내해요.
장비 상태
| 상태 | 색상 |
|---|---|
| 양호 (70%+) | neon-green |
| 주의 (30-69%) | #fbbf24 노란색 |
| 교체 필요 (<30%) | #ef4444 빨간색 |
Social Post
운동 기록을 소셜 피드에 공유하는 컴포넌트예요. 활동 요약 카드와 좋아요·댓글 인터랙션을 지원해요.
활동 피드
| 요소 | 스타일 |
|---|---|
| 활동 카드 | surface-3 배경 |
| 페이스 수치 | neon-green |
| 좋아요 (활성) | neon-green 텍스트 |
UX Writing
전체가 "-요"체 하나로 말해요. 데이터는 자신 있게, 예측은 정직하게 — 이 균형이 이 프로젝트 보이스의 핵심이에요.
보이스 원칙
| 원칙 | O (이렇게) | X (이렇게 말고) |
|---|---|---|
| 어체 통일 | "추정값이에요" | "추정값입니다" |
| 수사 표기 | "5단계"로 통일 | "5가지" · "다섯 단계" 혼용 금지 |
| 브랜드명 | "치트키" | "장비 빨" (띄어쓰기 금지) |
| 도메인 컬러 | 그린 = 러닝 · 퍼플 = 헬스 문맥에서만 강조 | 컬러 무작위 강조 |
| 예측치 표기 | 헤드라인에서 직접 — "출시하면, 이렇게 달라져요." | 각주로 미루기 |
카피 O / X 예시
| 맥락 | O (이렇게) | X (이렇게 말고) |
|---|---|---|
| 플레이스홀더 | "어떤 장비를 찾고 있어요?" 질문형 플레이스홀더 | "장비명을 입력하세요" 명령형 — 사용자를 지시하지 않아요 |
| 수치 서술 | "쿠션이 7mm 더 두꺼워요" 수치 근거로 말하기 | "쿠션이 더 좋아요" 근거 없는 형용사 — 신뢰를 낮춰요 |
| 에러 메시지 | "올바른 이메일 형식이 아니에요." 원인 직접 설명 | "오류가 발생했습니다." 모호한 오류 — 사용자가 뭘 해야 할지 몰라요 |
| 데이터 표현 | "38%가 더 오래 신었어요" 무인칭 — 데이터 자체가 말하게 | "저희 데이터에 따르면 사용 시간이 늘었습니다" "저희" 금지 · 수치 없이 막연한 서술 |
헤드라인 문형
- "-요"체 : 명사형 = 2 : 1 — 대화체 다음엔 명사형으로 리듬 전환. "질문이 대화가 돼요." → "커머스가 아니라, 큐레이션."
- 핵심 표현의 의도적 반복은 커버 · 중간 · 아웃트로 3곳까지만.
- 키워드 그린 강조는 헤드라인당 1곳 — 두 곳부터는 강조가 아니에요.
- 숫자는 아라비아 숫자로, 단위는 붙여쓰기 — "7mm", "38%", "46개".
디자인 체크리스트
Spectrum의 Design Checklist를 옮겼어요. 컴포넌트나 화면을 새로 만들 때 이 목록을 통과해야 "완성"이에요 — 리뷰 기준이자 QA 게이트예요.
컴포넌트를 새로 만들 때
| 항목 | 확인할 것 |
|---|---|
| 상태 | 기본 · 호버 · 눌림 · 비활성 · (해당 시) 포커스 · 로딩 전부 정의됐나 |
| 토큰 | 원시 HEX·px 대신 토큰만 썼나 (스펙 문서 포함) |
| 대비 | Color 페이지의 사전 검증 조합 안에 있나 — 작은 퍼플 텍스트 없나 |
| 터치 | 모바일 터치 영역 44×44px 이상인가 |
| 키보드 | Tab 도달 · 포커스 링 표시 · Space/Enter 동작 |
| 반응형 | 1440 · 900 · 640 · 390px에서 깨지지 않나 |
| 모션 | 이징·지속시간이 토큰 값인가 · reduced-motion에서 안전한가 |
| 카피 | "-요"체 · 동사형 레이블 · 그린 강조 1곳 이하 |
| 문서 | 이 시스템에 구성요소·상태·스펙·Do/Don't가 추가됐나 |
| Figma | 같은 이름의 컴포넌트/변수가 있나 · 상태 표에 등재했나 |
페이지에 적용할 때
- 같은 크기 요소가 연속 2회 이상 반복되지 않나 · 균등 격자 3연속이 아닌가
- 그린=러닝 / 퍼플=헬스 문맥이 맞나 · 한 위계에 두 색이 동시에 오지 않나
- 깊이를 그림자가 아니라 표면(surface-1/2/3)으로 만들었나
- 새로 만든 간격이 스페이싱 스케일 밖의 임의 값은 아닌가
파일 · 수정법
토큰은 전부 style.css 상단 :root에 있어요. 색 하나를 바꾸면 사이트 전체가 따라와요 — 그게 이 시스템의 목적이에요.
파일 구조
| 경로 | 내용 | 역할 |
|---|---|---|
index.html | 케이스 스터디 본문 | 마크업 · 인라인 JS |
assets/css/style.css | 전체 스타일 | 상단 :root가 토큰 원본 — 여기만 수정 |
assets/fonts/ | Paperlogy 800·900 | 디스플레이 서체 (TTF) |
assets/screens/ | 앱 화면 WebP 46장 | 케이스 스터디 화면 이미지 |
vendor/ | 서드파티 로컬 사본 | Pretendard · GSAP · ScrollTrigger · SplitType · QRCode.js |
cheatkey-ds/index.html | 이 디자인 시스템 문서 | 단일 HTML SPA |
토큰 수정 시나리오
--neon-green: #B6FF3D;
--neon-green-hover·--neon-green-dim도 같은 계열로 함께 조정--bg: #0A0A0A → #121212
var(--*) 토큰만 사용, 하드코딩 금지. 새 색이 필요하면 :root에 토큰을 먼저 추가.user-flow 구간에만 제한성능 메모
- Pretendard: 이미 동적 서브셋 woff2 사용 중 ✓
- Paperlogy: 현재 TTF → woff2로 변환 시 30~40% 절감.
@font-face에 woff2 우선, TTF 폴백 순서. - 앱 화면 이미지: WebP로 이미 최적화됨 ✓
- 인라인 JS: GSAP · ScrollTrigger는 vendor/ 로컬 — 네트워크 의존 없음 ✓
Figma
CSS가 source of truth예요. 색을 바꿀 땐 style.css :root와 피그마 Variables를 같은 날 동기화해요.
Variable Collections
| 컬렉션 | 역할 | 주요 그룹 |
|---|---|---|
Primitive | 원시 값 — 색·수치·타이포 원본 (89개 변수) | Color/Brand · Color/Scale · Color/Status · Typography · Number/Spacing · Number/Radius |
Semantic | 역할 토큰 — Primitive를 참조 (61개 변수) | Color/fg · Color/bg · Color/border · Spacing · Number/Radius · Number/Component · Number/Offset |
CSS ↔ Figma 대조
CSS 토큰 (style.css) | Figma Variable | 상태 |
|---|---|---|
--neon-green #B6FF3D | Color/Brand/primary-running → Color/bg/base-running | ✓ 동기화 완료 |
--neon-green-hover #C8FF5F | Color/Brand/primary-running-pressed | ✓ 동기화 완료 |
--neon-green-dim #6B8F24 | Color/Brand/primary-running-dim | ✓ 신규 추가 (2026-07-31) |
--neon-purple #B026FF | Color/Brand/primary-fitness → Color/bg/base-health | ✓ 동기화 완료 |
--neon-purple-dim #6D1AA0 | Color/Brand/primary-fitness-dim | ✓ 신규 추가 (2026-07-31) |
--bg #0A0A0A | Color/Brand/primary-black → Color/bg/base | ✓ 동기화 완료 |
--surface-1 #111111 | Color/Scale/surface-1 → Color/bg/elevated | ✓ 동기화 완료 |
--surface-2 #161616 | Color/Scale/surface-2 | ✓ 동기화 완료 |
--surface-3 #1D1D1D | Color/Scale/surface-3 → Color/bg/surface | ✓ 동기화 완료 |
--text #E5E5E5 | Color/Scale/text-hi → Color/fg/primary | ✓ 동기화 완료 |
--text-mid #7A7A7A | Color/Scale/text-mid → Color/fg/secondary | ✓ 동기화 완료 |
--text-lo #4A4A4A | Color/Scale/text-lo → Color/fg/tertiary | ✓ 동기화 완료 |
--border-lo #1A1A1A | Color/Scale/border-subtle → Color/border/light | ✓ 동기화 완료 |
--border #262626 | Color/Scale/border → Color/border/default | ✓ 동기화 완료 |
--border-hi #383838 | Color/Scale/border-strong → Color/border/strong | ✓ 동기화 완료 |
--r-xs 4px | Number/Radius/4 | ✓ 신규 추가 (2026-07-31) |
--r-sm 8px | Number/Radius/8 | ✓ 동기화 완료 |
--r-md 16px | Number/Radius/16 | ✓ 동기화 완료 |
--r-lg 22px | Number/Radius/22 | ✓ 신규 추가 (2026-07-31) |
--r-xl 28px | Number/Radius/28 | ✓ 신규 추가 (2026-07-31) |
--r-2xl 32px | Number/Radius/32 | ✓ 신규 추가 (2026-07-31) |
--r-full 9999px | Number/Radius/9999 | ✓ 동기화 완료 |
Dev Mode Code Syntax
2026-07-31 전체 동기화 — Primitive · Semantic 모든 변수에 WEB code syntax(var(--token-name)) 설정 완료예요. 피그마 Dev Mode에서 변수를 선택하면 CSS 토큰명이 바로 보여요.
운영 규칙
- 색 수정은
Primitive컬렉션의 원시 값만 —Semantic은 자동으로 따라와요. - CSS 토큰이 바뀌면 같은 날 피그마
Primitive값도 동기화하고, 변경 이력에 날짜를 기재해요. 미루면 CSS·Figma 불일치가 핸드오프 때 혼란을 만들어요. - 신규 토큰은 Primitive에 먼저 추가 → Semantic에서 alias → code syntax(WEB) 설정 순서로요.
- 폰트: Pretendard는 로컬 폰트 — 텍스트 편집은 피그마 안에서 직접 (외부 편집 시 폰트 로드 실패).
라이브 앱 비교
이 디자인 시스템은 케이스 스터디 페이지(style.css)의 토큰 문서예요. 실제 서비스인 better-with-gear-front.vercel.app은 React + Tailwind CSS v4 기반이라 토큰 이름과 값이 달라요. 이 페이지는 두 시스템의 차이를 명시해 혼동을 방지하기 위한 거예요.
왜 다른가
| 축 | 케이스 스터디 (이 DS) | 라이브 앱 |
|---|---|---|
| 기술 스택 | Vanilla HTML / CSS | React + Tailwind CSS v4 |
| 토큰 목적 | 포트폴리오 프레젠테이션 | 프로덕트 UI 컴포넌트 |
| Source of truth | style.css :root | Tailwind config / CSS @layer |
| 스케일 단위 | px 절대값 (--sp-*) | rem 기반 (--spacing: .25rem) |
| 연동 여부 | 없음 — 각자 독립적으로 유지됨 | |
브랜드 컬러 비교
| 역할 | 케이스 스터디 | 라이브 앱 | 비고 |
|---|---|---|---|
| Running 그린 | --neon-green#B6FF3D |
--color-brand-running#55d909 |
채도·명도 다름 (Figma 동기화 완료) |
| Health 퍼플 | --neon-purple#B026FF |
--color-brand-health#d64fff |
라이브가 더 밝음 |
| 배경 | --bg#0A0A0A |
--color-bg-base#0e0e0e |
미세 차이 |
| 표면 | --surface-1#111111 |
--color-bg-elevated#1a1a1a |
라이브가 더 밝음 |
Radius 비교
| 스텝 | 케이스 스터디 | 라이브 앱 |
|---|---|---|
| SM | --r-sm 8px | --radius-sm 4px |
| MD | --r-md 16px | --radius-md 6px |
| LG | --r-lg 22px | --radius-lg 8px |
| XL | --r-xl 28px | --radius-xl 12px |
케이스 스터디는 디바이스 프레임·카드 같은 대형 요소 중심이라 스케일이 높아요. 라이브 앱의 실제 UI 컴포넌트(버튼·입력 등)는 훨씬 낮은 값을 써요.
토큰 이름 체계 비교
| 케이스 스터디 | 라이브 앱 | |
|---|---|---|
| 브랜드색 접두사 | 기능 중심: --neon-green | 도메인 중심: --color-brand-running |
| 스페이싱 | --sp-1 ~ --sp-16 (2px~160px) | Tailwind utility 클래스 (gap-4, p-6) |
| 이징 | --easing: cubic-bezier(.2,.7,.2,1) | cubic-bezier(.4,0,.2,1) (Material easing) |
규칙
- 케이스 스터디 수정:
style.css :root가 source of truth. 이 문서를 함께 업데이트해요. - 라이브 앱 수정: React 레포의 Tailwind 설정이 source of truth. 이 문서를 참조하지 않아도 돼요.
- 브랜드 색이 바뀌면: 두 시스템을 각각 독립적으로 업데이트해요. 자동 연동은 없어요.
- 이 문서는 발산을 허용하되 명시해요 — 값이 달라지면 이 비교표를 최신 상태로 유지해요.
작업 프로세스
모든 변경은 실서버 체크 → 피그마 확인 → DS 반영 순서로 진행해요. 실제 구현이 source of truth이고, DS 문서는 마지막에 정리해요.
기본 흐름
| 단계 | 대상 | 하는 일 |
|---|---|---|
| ① 실서버 체크 | style.css :root |
실제 구현값 확인 — 토큰명·HEX·px 값이 source of truth |
| ② 피그마 확인 | Figma Variables | Primitive · Semantic 값이 style.css와 일치하는지 검증, 불일치 시 피그마 업데이트 |
| ③ DS 반영 | cheatkey-ds/index.html |
확인된 내용을 문서에 정리 — 대조표·스펙·변경이력 업데이트 |
시나리오별 체크리스트
토큰 값 변경
style.css :root값 수정- Figma
Primitive컬렉션 해당 변수 값 업데이트 - DS
r-figma대조표 값 수정 +r-changelog에 날짜·이유 기재
신규 토큰 추가
style.css :root에 토큰 추가- Figma
Primitive에 변수 생성 →Semantic에서 alias → WEB code syntax 설정 - DS 해당 파운데이션 섹션 표에 추가 +
r-figma대조표 +r-changelog
컴포넌트 스펙 변경
- 실사이트에서 실제 동작·값 확인
- Figma 컴포넌트 확인 — 값·상태·변형이 실사이트와 일치하는지 검증
- DS 컴포넌트 섹션 스펙 표 업데이트 +
r-changelog
원칙
- DS 문서를 먼저 고치지 않아요 — 항상 실서버·피그마 확인 후 마지막에 정리해요.
- 피그마와 CSS가 불일치하면 CSS가 이겨요 (CSS = 실제 배포된 것).
- 변경 이력은 빠뜨리지 않아요 — "언제·무엇이·왜" 세 가지를
r-changelog에 남겨요. - Figma 변수에 새 값을 추가할 때 WEB code syntax(
var(--token-name))를 반드시 설정해요.
변경 이력
Apple HIG·Spectrum처럼 변경 이력을 남겨요. 무엇이 언제 왜 바뀌었는지 적어두면, 같은 고민을 다시 하지 않아요.
v1.7 2026-08-03
- Seed Design System 의존 완전 제거 — CDN 링크(seed-design/css@2.3.0) · CSS 오버라이드 블록 삭제. 치트키 자체 토큰(
--neon-green등)으로 대체 완료. - Badge 컴포넌트 자체 구현 —
seed-badge__*클래스를jb-badge시스템으로 교체 (27개 인스턴스). solid/weak/outline × brand/critical/positive/warning/neutral 변형 완전 지원. - 박안에 박스 제거 — panel 내부 중첩 box 레이아웃 단순화, 정보 접근성 향상.
- 얇은 섹션 내용 보강 — c-categorycard · c-recentlyviewed · c-sharesheet · c-mappin 구성요소표·스펙표·사용규칙 추가.
v1.6 2026-07-31
- 외부 DS 의존 제거 — 외부 컴포넌트 라이브러리 의존 제거, 치트키 자체 컴포넌트로 전환
- FAB Deprecated 표시 —
c-fab섹션 태그 Beta → Deprecated,contextual-floating-button대체 안내 callout 추가 (치트키 DS 정책 반영) - 브랜드 컬러 실서버 동기화 — DS
--neon-green· Seed CSS 오버라이드 전체를#6BFF15→#B6FF3D(style.css source of truth)로 수정, 브랜드 토큰 오버라이드 표 값도 동일하게 정합 - DS 품질 감사 · Foundation —
--glow-green데모 라벨 구 색상 수정, Semantic Tokens에--text-hi·--text-bright·neon 변수명(hover·dim) 추가, Motion에--ease-spring·--ease-expo·--dur-reveal·Z-Index 스케일 10개 추가 - DS 품질 감사 · Components — c-appbar 스펙 정합(배경
--bg→--surface-1, 패딩 12/20px→16px, 아이콘 영역 32→36px), c-chip radius 20px→--r-full, c-button Ghost 텍스트 색 명시, c-overflow 행 높이 48px→패딩 실측값으로, c-profilecard Avatar LG(64px)→XL(80px)
v1.5 2026-07-31
- Figma Variables 전체 동기화 — Primitive · Semantic 모든 변수에 WEB code syntax(
var(--token-name)) 설정, Dev Mode에서 CSS 토큰명 직접 노출 - 누락 Primitive 변수 신규 추가 (6개) — 반지름:
Number/Radius/4(--r-xs) ·/22(--r-lg) ·/28(--r-xl) ·/32(--r-2xl), 딤 색상:Color/Brand/primary-running-dim(--neon-green-dim) ·primary-fitness-dim(--neon-purple-dim) - 브랜드 컬러 정합 확인 —
--neon-green#B6FF3D ·--neon-purple#B026FF 모두 FigmaColor/Brand/primary-*와 값 일치 - Figma 대조표 전면 재작성 — 6행 → 22행, Primitive→Semantic alias 경로 명시, 전 항목 "동기화 완료" 확인
v1.4
- FAB 컴포넌트 문서 추가 — Quick Menu · Go to Top 두 변형
- Overflow 컴포넌트 문서 추가 — 컨텍스트 메뉴 트리거
- Icon 파운데이션 문서 추가 — Key Line · Naming Rule · 19개 카테고리
- 랜딩페이지 전용 섹션 삭제 — Device Frame · Section Header · Wave Band · Responsive · 배포 체크리스트 · 테이프
- Figma Variables 네이밍 정리 — Radious 오타 수정 · Semantic 그룹 재구성(Color/fg · Spacing · Number/Radius)
- Input radius 정합 —
--r-sm(8px)으로 Radius 표·컴포넌트 스펙 통일 (이전 스펙 10px·--r-md 혼재 수정) - App Bar 검색 플레이스홀더 오타 수정 ("공간한" → "원하는")
- 데드 토큰
--text-bright제거 - Focus ring 토큰 추가 —
--focus-ring(그린 2px · offset 3px), 전역:focus-visible적용, WCAG 2.2 Focus Appearance 충족 - Date Picker 키보드 인터랙션 표 추가 — Tab·방향키·PageUp/Down·Esc, Type A·B 각각
- Navigation Bar aria 문서화 — role tablist/tab, aria-selected, aria-label
- Figma 동기화 원칙 강화 — 미동기화 항목 명시 + "같은 날 변경이력 기재" 의무화
- 파일 섹션에 Paperlogy woff2 변환 성능 메모 추가
- 컴포넌트 라이브 인터랙션 추가 — Chip 토글 · Checkbox/Radio 클릭 · Navigation Bar 탭 전환 · FAB Quick Menu 열기·닫기 · Overflow 컨텍스트 메뉴 · Calendar 월 이동·날짜 선택 · Type B 연도 이동·월 선택 · Switch/Toggle · Input 직접 입력 · 에러 헬퍼 텍스트 추가
v1.3
- 스테이트 레이어 규칙 추가 — 컴포넌트별 상태 색을 따로 정의하는 대신 on-color 오버레이 불투명도(8/12/12/38%)로 통일 (Material 3)
- 컴포넌트 상태 표 추가 — Stable/Beta 표기로 완성도 명시 (Primer)
- 키보드 인터랙션 표 — Button · Checkbox/Radio (Spectrum)
- 카피 규칙을 컴포넌트 문서 안으로 — Button 레이블 Do/Don't (Polaris)
- 디자인 체크리스트 페이지 신설 — 리뷰·QA 게이트 (Spectrum Design Checklist)
- 다크 테마 깊이 규칙 명문화 — 그림자 대신 표면 사다리, 그림자 사용 시 다크에서 불투명도 2배
v1.2
- 색 조합 대비 사전 검증표 추가 — 퍼플 #B026FF가 본문 대비 4.31:1로 AA 미달임을 명시하고 대체색(#C77DFF) 지정
- 컴포넌트 비교표 추가 — Button vs Chip, Checkbox vs Radio vs Chip
- 시맨틱 스페이싱 이름 도입 (
label-to-headline등) - 모션 지속시간에 토큰명(d1·d2·d3) 부여
v1.1
- 컴포넌트 문서를 구성요소(ESSENTIAL/OPTIONAL) → 상태 → 변형 → 스펙 → Do/Don't 구조로 재작성 (코드잇 디자인 시스템)
- 컬러를 Primitive → Semantic 2계층으로 분리
다음에 할 것
- Text Field 에러 상태 실사용 검증 → Beta 해제
- Figma 컴포넌트 상태를 이 문서의 상태 표와 동기화
- FAB Go to Top 변형 Figma 컴포넌트 추가
- Overflow 컨텍스트 메뉴 Figma 컴포넌트 추가