디자인 가이드
디토의 화면을 함께 만드는 기준입니다. 색과 글자부터 버튼과 위젯까지, 필요한 규칙을 찾아 적용하세요.
디토의 화면을 함께 만드는 기준입니다. 색과 글자부터 버튼과 위젯까지, 필요한 규칙을 찾아 적용하세요.
Splup의 색은 사용자가 무엇을 할 수 있는지 알려주고, 자신의 공간을 표현하도록 돕습니다. 이 가이드는 색을 고르는 이유부터 화면에 적용하는 방법까지 하나의 기준으로 정리합니다.
같은 뜻을 전달하는 요소에는 같은 색을 사용합니다. 예를 들어 적용 버튼은 브랜드 보라색, 보조 설명은 보랏빛 회색을 사용합니다. 화면을 만들 때는 01의 사용처별 색상에서 시작하고, 공간의 분위기를 더할 때는 03의 색 조합을 선택합니다.
기본색에 사용처를 연결하고, 그 이름을 버튼과 카드에서 함께 사용합니다. 공통 원본을 바꾸면 연결된 색상을 같은 기준으로 갱신할 수 있습니다. 브랜드 배경과 앱 아이콘의 색 조합은 03에서 따로 확인합니다.
모든 신규 UI 텍스트는 Pretendard를 사용합니다.
브랜드 설명과 사용자 콘텐츠 모두 Pretendard를 사용합니다. 위계는 크기·굵기·행간으로 구분하며, 로고는 원본 SVG 아트로 유지합니다.
글자 크기마다 행간을 함께 정합니다. 굵기는 보통(400), 중간(500), 굵게(700) 세 가지입니다. Static이 붙은 스타일은 기기의 글자 크기 설정과 관계없이 크기를 유지합니다. 국문은 Pretendard, 별도 영문 브랜드 예시는 LINE Seed Sans App을 사용합니다.
예제는 전 단계 동일 — 국문(Pretendard Bold) + 라틴(LINE Seed Sans App Regular)을 실제 크기/행간로 렌더. 각 단계 × Rg·Md·Bd = 스타일 42종 + 크기가 고정된 스타일 42종. 보드의 브랜드 스케일 48·24·18px이 t14·t9·t6에 정확히 일치하므로 브랜드 전용 커스텀 스타일이 필요 없다.
주고받은 것들은 파형으로 쌓입니다
디토는 공감의 표현 중 가장 비용이 큰 형태, 소유로 하는 공감입니다. 무엇을 들이는가가 곧 선택이고, 선택이라서 상대에게 의미가 됩니다. "나도(ditto)"라는 말이 가장 짧은 형태의 이 행동입니다.
디토는 공감의 표현 중 가장 비용이 큰 형태, 소유로 하는 공감입니다. 무엇을 들이는가가 곧 선택이고, 선택이라서 상대에게 의미가 됩니다. "나도(ditto)"라는 말이 가장 짧은 형태의 이 행동입니다.
기존 화면의 글자를 변경할 때는 왼쪽의 스타일을 찾아 오른쪽의 새 스타일로 바꿉니다. DDSType은 기존 앱의 글자 스타일 이름이고, t1–t14는 새 기준의 크기 단계입니다. 크기나 굵기가 달라지는 항목은 화면에서 다시 확인합니다.
| 기존 스타일 · 크기 / 행간 배수 | 새 스타일 · 크기 / 행간(px) | 달라지는 점 |
|---|---|---|
화면 강조 제목displayMd 28 굵게 /1.3 | t11Bold 28/38 | 행간 36.4px → 38px |
큰 제목titleLg 22 굵게 /1.35 | t8Bold 22/30 | 기존과 같은 크기 |
중간 제목titleMd 19 굵게 /1.4 | t7Bold 20/27 | 19px → 20px로 변경 |
작은 제목titleSm 17 약간 굵게 /1.4 | t6Bold 18/24 | 17px → 18px, 굵기 600 → 700 |
큰 본문bodyLg 17 보통 /1.6 | t6Regular 18/24 | 17px → 18px, 행간이 좁아짐 |
기본 본문bodyMd 16 보통 /1.55 | articleBody 16/24 | 본문용 스타일로 연결 |
작은 본문bodySm 14 보통 /1.5 | articleNote 14/22 | 기존과 같은 크기 |
큰 버튼 문구labelLg 16 약간 굵게 /1.0 | t5Bold 16/22 | 굵기 600 → 700, 행간 확대 |
기본 버튼 문구labelMd 14 약간 굵게 /1.0 | t4Bold 14/19 | 굵기 600 → 700, 행간 확대 |
작은 버튼 문구labelSm 13 약간 굵게 /1.0 | t3Bold 13/18 | 굵기 600 → 700, 행간 확대 |
보조 설명captionMd 12 보통 /1.4 | t2Regular 12/16 | 기존과 같은 크기 |
작은 보조 설명captionSm 11 중간 굵기 /1.3 | t1Medium 11/15 | 기존과 같은 크기 |
변경 후에는 글자 크기(19·17px), 굵기(600), 버튼 문구의 행간, 자간(−1%)을 확인합니다. 자세한 검토는 기존 구현 검토에 남겨두었습니다.
t14StaticBold+LINE Seed, 화면 타이틀 = screenTitle+Pretendard.tNStatic*을 쓴다. 스크롤되는 UI 본문은 기기의 글자 크기 설정을 따르는 스타일.화면 가장자리, 버튼 사이, 글자 사이의 간격을 같은 기준으로 맞춥니다. 먼저 사용처별 간격을 고르고, 맞는 항목이 없으면 아래 19단계에서 선택합니다.
| 토큰 | 값 | 시각 |
|---|---|---|
x0_5 | 2 | |
x1 | 4 | |
x1_5 | 6 | |
x2 | 8 | |
x2_5 | 10 | |
x3 | 12 | |
x3_5 | 14 | |
x4 | 16 | |
x4_5 | 18 | |
x5 | 20 | |
x6 | 24 | |
x7 | 28 | |
x8 | 32 | |
x9 | 36 | |
x10 | 40 | |
x12 | 48 | |
x13 | 52 | |
x14 | 56 | |
x16 | 64 |
| 토큰 | 참조 | 값 | 용도 |
|---|---|---|---|
globalGutter | x4 | 16 | 화면 좌우 기본 여백 (플래터 그리드 마진과 동일) |
betweenChips | x2 | 8 | 칩 사이 수평 간격 |
componentDefault | x3 | 12 | 컴포넌트 간 기본 수직 간격 |
navToTitle | x5 | 20 | 내비 바 ↔ 페이지 타이틀 |
screenBottom | x14 | 56 | 화면 하단 여백 |
betweenText | x1_5 | 6 | 텍스트 요소 간 수직 간격 |
스케일 밖 레이아웃 클리어런스 2종 — scrollBottomClearance 110(스크롤 콘텐츠가 플로팅 탭바/CTA를 피할 여유) · scrollBottomClearanceTall 148(홈 그리드 제외 리스트 탭). 레거시 별칭 s4~s48·screenMargin은 호환용 — 신규 코드 사용 금지.
모서리는 기본 16px, 내부 요소 8px, 완전한 원형으로 구분합니다. 그림자는 요소가 배경에서 얼마나 떠 있는지 보여줍니다. 위젯과 전용 버튼은 각자의 크기 규칙을 따릅니다.
위젯의 라운드는 이 3단이 아니라 크기 비례 공식을 따른다(음악은 모든 크기 24) — 위젯 모서리 참조. 브랜드 그래픽의 블롭은 라디우스 16–24 범위(브랜드 에셋).
| 토큰 | 색 | radius | y | 용도 |
|---|---|---|---|---|
e1 | black 6% | 1.5 | 1 | 위젯·카드 |
e2 | black 9% | 6 | 4 | 홈 네비·FAB |
e3 | black 14% | 16 | 12 | 시트·다이얼로그 |
| 토큰 | 스펙 | 용도 |
|---|---|---|
raised | black 8% · r3 · y1 | 세그먼트 활성 탭·작은 부상 요소 |
floating | black 9% · r6 · y2 | 컴포저 칩·팝오버 |
card | #E5E5E5 · r32 · y4 | 바탕에서 크게 뜬 부드러운 확산 (Figma light) |
glassDrop | black 5% · r23 · y18 | 글래스 재질의 드롭 성분 |
글래스 재질 dsGlass() — ultraThinMaterial 블러 + 화이트 35% 스트로크 0.8 + glassDrop 그림자. UpButton·탭바 계열 유리 질감의 공용 규격.
움직임은 눌렀는지, 화면이 바뀌었는지 알려주는 데 사용합니다. 아래 동작별 설정을 함께 사용해 같은 행동이 화면마다 다르게 느껴지지 않도록 합니다.
| 토큰 | 프리셋 | duration | 용도 |
|---|---|---|---|
Motion.lift | snappy | 0.30 | 드래그 리프트 등 소형 요소 |
Motion.push | smooth | 0.35 | 페이지 푸시 — 시스템 내비게이션 타이밍 |
Motion.settle | smooth | 0.35 | 탭바·플로팅 요소 출입 |
Motion.appear | smooth | 0.40 | 배너·토스트 등장 |
Motion.sheet | smooth | 0.50 | 시트 — 시스템 시트 타이밍 (바운스 없음) |
Motion.popIn | bouncy | 0.30 | 리액션 팝 — 유일하게 허용된 탄성 |
Motion.fade | easeInOut | 0.22 | 짧은 크로스페이드 표준 |
컴포넌트 내부 별칭 DSMotion: springFast(snappy 0.3) · springSoft(smooth 0.35) · easeQuick(0.2) · ease(0.22) — 새 코드는 의도가 뚜렷하면 Motion.* 우선.
모션 감소 설정(UIAccessibility.isReduceMotionEnabled)에서는 ① pressed 스케일 → 1 ② popIn(bouncy) → fade ③ 장식성 글로우 펄스 정지. 전환 자체(시트·푸시)는 시스템이 크로스페이드로 대체하므로 별도 처리 없음. 코드 연동은 추가 작업 2.
누를 수 있는 요소는 반응을 보여주고, 사용할 수 없는 요소는 상태를 구분합니다. 버튼의 크기 변화, 관계를 표현하는 빛, 카드 테두리의 기준을 확인하세요.
| 토큰 | 값 | 용도 | Reduced Motion |
|---|---|---|---|
pressedScaleButton | 0.97 | 일반 버튼 (PressableStyle 기본) | 1로 무효화 |
pressedScaleTile | 0.98 | 큰 타일·세그먼트 | 1로 무효화 |
pressedScaleFloating | 0.95 | 플로팅·캡슐 CTA | 1로 무효화 |
disabledOpacity | 0.4 | 비활성 전역 | — |
pressed 스케일 3단은 Reduced Motion 규칙에서 전부 1로 무효화된다. pressed 색 짝은 현재 fillBrandPressed 하나뿐 — 주요 fill·layer로 확장 예정(추가 작업 1).
주파수(퍼플)·관계 스택(오렌지) 게이트의 진행을 표현하는 디토! 고유 장치. 팡파레 없는 은은한 발광 — 주파수의 물성과 동일 원칙.
| 토큰 | 색 | α | radius |
|---|---|---|---|
frequencyBase | #7C4DFF ⚠ | .22 | 7 |
frequency1 | .28 | 10 | |
frequency2 | .50 | 16 | |
frequency3 | .72 | 22 | |
stack1 | DT.objOrange (레거시 참조) ⚠ | .24 | 10 |
stack2 | .45 | 16 | |
stack3 | .68 | 22 |
⚠ 주파수 글로우 #7C4DFF는 Splup(#AA4AF4)도 Deep(#6655D2)도 아닌 제3의 퍼플 — 검토 M에서 브랜드 축 정렬 결정 대기.
hairline(color:radius:) — 카드 공용 1px continuous 스트로크 오버레이. 기본색이 레거시 DT.lineSubtle 참조라 이관 시 borderDefault 계열로 교체 대상.
여러 화면이 함께 열릴 때 무엇을 앞에 보여줄지 정합니다. 상세 화면, 바텀시트, 카메라, 안내 메시지를 아래 5가지 순서에 맞춰 배치합니다.
| 화면 종류 | 범위 | 현재 표시하는 화면 |
|---|---|---|
page | 5 | FriendPlatterDetail · GroupDetail — 모달 아님, modalUp 미등록 |
sheet | 20–28 | Add/컴포저 20–21 · 디토 22–23 · 상세/댓글 24 · 신청 25 · 초대/프로필편집/교체 26 · 신고/그룹생성 27 · FullSheet 28 |
fullscreen | 29–33 | 프로필공유 29 · 내포스트 30 · 포스트상세 31 · 에디터/궤도 32 · 유저프로필/궤도프로필 33 |
capture | 34–35 | 폴라로이드 카메라 34 · 아카이브 35 |
toast | 36–40 | 배너 36 · 토스트 40 — 모달 아님 |
AppState.modalUp 한 곳에서 통합 — 새 모달 상태(@Published)를 추가하면 반드시 modalUp에 등록.page 밴드에 둔다.toast 밴드.scrim(black ≈45.5% — 시트·다이얼로그 표준 딤) · scrimMuted(≈17.3% — 맥락을 남기는 가벼운 딤).밝은 화면과 어두운 화면에서도 같은 역할을 알아볼 수 있어야 합니다. 배경, 콘텐츠, 글자의 밝기를 함께 조절해 읽기 편한 상태를 유지합니다.
| 지면 | 라이트 | 다크 | 적용 |
|---|---|---|---|
| 브랜드 지면 | Bright White #F4F9FF | Total Eclipse #2D313D | 발표·온보딩·스플래시·프로필 공유 카드 |
| 앱 UI 지면 | #FFFFFF / #FAFAFA | gray950 #181818 계열 | 탭·리스트·시트 등 일상 UI (기존 유지) |
이 분리가 확정되면 검토 A의 잉크 5종(#171719·#111111·#141317·#181818·#2D313D)이 지면별 토큰으로 수렴된다.
플래터는 위젯을 놓는 공간입니다. 위젯의 크기와 간격을 격자에 맞추고, 위치가 겹치거나 바깥으로 나갔을 때의 처리 방법을 함께 정합니다.
| 항목 | 값 | 비고 |
|---|---|---|
| 그리드 | 8열 × 16행 고정 | |
| 좌우 마진 | 16 | globalGutter와 동일 |
| 거터 | 8 | 스펙 고정 |
| 셀 | (W − 16×2 − 8×7) ÷ 8 | 화면 폭 반응 · W 클램프 320–620 |
| 피치 UNIT | CELL + 8 | 390pt 기준 ≈46 |
| 위젯 라운드 | min(20, 12 + (min(w,h)−2)×2) | 2단 12 · 3단 14 · 4단 16 · 6단+ 20 · 음악은 모든 크기 24. 본체·미리보기·후광·테두리 모두 Grid.radius(w) (위젯 모서리) |
| 위젯 크기 | 2×2 ~ 6×8 | 크기 조절 범위 제한(러버밴드) |
| 위젯 수 | 플래터당 10 | 디토 위젯 제외 카운트, 초과 시 안내 시트 |
타입×비율 매트릭스는 WidgetFrame.swift(WidgetFrameSpec)이 공통 원본.
| 함수 | 동작 |
|---|---|
findFree | 행 우선 첫 빈 슬롯 |
firstFit(start) | 지정 행부터 + 상단 랩어라운드 — 추가·대표 위젯으로 변경할 위치 |
resolve(dirs) | 방향 우선 푸시, 연쇄 깊이 ≤3, 실패 시 원래 위치로 복귀 |
trySwap | 동일 크기 단일 충돌 = 자리 교환 |
promote | 라이프→대표: 세그먼트 흡수 후 first-fit 착지 + 글로우. 편집 중 ‘대표로 ↑’ 라벨은 2026-10-11에 없앴어요 (편집 도구) |
GridEngine과 동일한 공식·규칙을 브라우저에서 재현한 데모입니다. 위젯을 추가하고 드래그해서 옮기고, 우하단 핸들로 크기를 늘려보세요 —
행 우선 착지, 동일 크기 자리 교환, 방향 푸시(연쇄 ≤3), 원래 위치로 복귀, 크기 조절 범위 제한(2×2~6×8 러버밴드), 10개 제한, 크기 비례 라운드가 실제 공식대로 동작합니다.
화면 폭 슬라이더로 셀의 반응형 계산(W 320–620 클램프)도 확인할 수 있어요.
데모 범위: findFree·resolve(드래그 방향 우선 푸시)·trySwap·리사이즈 러버밴드(2×2~6×8)·10개 캡·라운드/셀 공식. 앱 전용 동작(디토 슬롯·디토 잠금·promote 글로우)은 생략.
버튼은 행동을 실행하고, 칩과 선택 탭은 값을 고릅니다. 사용 목적에 맞는 형태를 선택하고 기본·눌림·비활성 상태를 함께 확인합니다.
| 속성 | 값 | 비고 |
|---|---|---|
| 높이 · 라운드 | 60 · 12 (continuous) | 기본 CTA 기준 — 화면별 예외는 별도 검수 |
| 라벨 | label (17 Bold) | 새 글자 기준 적용 후 t4Bold |
| 프라이머리 배경 | #C78FF7 → #AA4AF4 52% → #9430D8 | CTA 세로 그라디언트 + 상단 글로스(white 30%→0 @50%) |
| 프라이머리 섀도우 | #9430D8 28% · r10 · y4 | 은은한 브랜드 섀도우 — 비활성 시 제거 |
| 파괴적 | danger 배경 + 화이트 라벨 | 카피는 결과를 말한다("내리기") — UX Writing |
| pressed | scale 0.97 | PressableStyle(pressedScaleButton) · Reduced Motion 시 1 |
| disabled | 배경 subtle + 라벨 assistive | 터치 무시 · 로딩 중에는 스피너로 교체 |
| 컴포넌트 | 규격 | 상태 |
|---|---|---|
DChip | 높이 28 · 캡슐 · labelSm · 수평 패딩 x3(12) | 라이트/다크 2변형 — 사진 위에는 다크 |
SegmentControl | pill 컨테이너(라운드 13 · fill strong · 내부 패딩 x1) + 탭 라운드 10 | 활성 = 화이트 + raised 그림자(black 8% · r3 · y1) · pressed 0.98 |
| 규칙 | 값 | 비고 |
|---|---|---|
| 롱프레스 (허용 위젯) | 0.8s 게이지 | 편집 진입 — 게이지 완주 후 커밋 |
| 롱프레스 (비허용) | 0.45s 조기 흔들림 | 불가함을 빨리 알린다 — 기다리게 하지 않음 |
| 햅틱 표준 | 리프트 medium · 커밋 medium · 비허용 rigid · 소형 light | 전 컴포넌트 공통 |
| 상세 층위 | 내/친구 위젯 상세 = 시트(Motion.sheet) · 플래터 = 페이지 · 파괴적 = 알럿 | 층위 혼용 금지 |
| 컴포저 CTA 카피 | [추가하기] / [수정 완료] | 동작을 그대로 — UX Writing 형식 규칙 |
코드에 존재하는 전체 세트. 본 페이지는 버튼·칩·세그먼트를 선행 문서화한 것 — 나머지의 슬롯·변형·상태 스키마 문서화는 추가 작업 6.
| 파일 | 컴포넌트 |
|---|---|
Components.swift | DButton · DChip · SegmentControl · AvatarStack · StatusBar |
DSComponents.swift | Skeleton · Snackbar · Callout · Badge · Divider · ListRow · Switch · ProgressCircle · AlertDialog · Spinner · Toggle · Sheet(DSSheetSpec) · Banner · TextArea · ColorSheet |
AddComponents.swift | 컴포저 세트 — InputField · LinkField · PositionGrid · FormatRows |
SwipeTabs.swift | 텍스트 탭 + 페이징 |
친구의 일상을 내 공간에 담는 행동은 ‘디토’, 관계가 이어지는 리듬은 ‘주파수’라고 부릅니다. 같은 뜻은 같은 말로 표현하고, 사용자가 행동을 이해할 수 있도록 설명합니다.
| 개념 | 한 줄 정의 | 표현하는 느낌 |
|---|---|---|
| 플래터 | 내 방을 차려 보여주는 일 | 책상 위 물건들의 배열 — 8×16 그리드의 은유 |
| 디토 | 너의 것을 나도 갖는 일 | 상대의 조각을 간직하는 행동 — 소장품(keepsake)의 물성 |
| 주파수 | 어느새 친해져 있는 일 | 조용히 익는 신호 — 팡파레 없는 은은한 발광 |
사용자에게 필요한 정보만 짧게 전달합니다. 친근한 해요체를 사용하되, 공유나 반응을 재촉하지 않습니다. 무엇이 바뀌었고 다음에 무엇을 할 수 있는지 알려줍니다.
위젯 기획서 15종이 공유하는 고정 페르소나(00_공통규격_템플릿.md). 같은 화면도 관계 거리에 따라 다른 사람에게 말하고 있음을 항상 의식한다.
| 페르소나 | 관계·상태 | 카피가 해야 할 일 |
|---|---|---|
| 하늘 @skyblue · 22 · 대학생 | 만드는 사람 — 플래터를 매일 손보지만 대표 선정은 신중 | 부담 낮추기. 빈 상태·컴포저에서 "잘 써야 한다"는 압박을 지운다. 한 줄이면 충분하다고 말해준다 |
| 지민 @jimin_dt | 오래된 친구 — 자주 보지만 말은 아끼는 편 | 반응 문턱 낮추기. 댓글 대신 디토·리액션이라는 "말 없는 응답"이 충분한 반응임을 카피가 보증한다 |
| 유나 @yuna_dt | 친구의 친구(거리 2) — 비친구, 디토하며 주파수가 쌓이는 중 | 안전한 관망 허용. 볼 수 있는 것과 없는 것의 경계를 다정하게 긋는다. "권한 없음"이 아니라 "친구가 되면" |
| 도현 @dohyun_dt | 그룹 경유 3주차 친구 — 1:1로 말한 적 거의 없음 | 어색함 인정. 아직 서먹한 사이에 과한 친밀 어투를 강요하지 않는다. 그룹이라는 공용 지대의 말투 유지 |
| 항목 | 규칙 | 예 |
|---|---|---|
| 제목 | "제목 — 부제" 형식 허용 | 한줄일기 — 오늘을 한 줄로 |
| 금지 3종 | 설명형 꼬리말 · 시적 카피 · 내부 용어(Halo 등) | "~하는 공간입니다" 꼬리말 ✕ · 문서에 없는 시적 문구 ✕ |
| CTA | 동작을 그대로 말한다 — [추가하기] / [수정 완료] | 코드의 "블록 추가"는 카피 갭으로 기록됨 → [추가하기]로 수렴 |
| 토스트 | "~했어요 — 결과 위치" 패턴 | "위젯을 추가했어요 — 라이프에 게시됐어요" |
| 잠금 타일 | 수치 없는 예고 | "곧 열려요" |
| 비친구 상세 | 열람 ○ + 입력 대체 문구 | "친구가 되면 함께 쓸 수 있어요" |
| 글자수 | 카운터는 현재/최대만, 잔소리 없음 | 13/100 |
| 상황 (대상) | Do | Don't |
|---|---|---|
| 빈 플래터 (하늘) | "아직 비어 있어요 — 오늘 들은 노래 하나면 충분해요" | "첫 게시물을 작성하여 프로필을 완성하세요!" |
| 주파수 잠금 (유나) | "곧 열려요" | "D-3! 3일만 더 디토하면 잠금 해제!" |
| 비친구 입력 차단 (유나) | "친구가 되면 함께 쓸 수 있어요" | "권한이 없습니다" |
| 리액션 유도 (지민) | "마음에 남으면 디토해 두세요" | "댓글을 남겨 친구에게 관심을 표현해 보세요!" |
| 친구 상한 도달 (하늘) | "자리가 다 찼어요 — 디토!는 열다섯 명까지의 공간이에요" | "친구 한도 15/15 초과. 기존 친구를 삭제하세요" |
| 위젯 삭제 확인 (하늘) | "이 위젯을 내릴까요? 친구가 디토해 간 것은 그대로 남아요" | "정말 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다" |
| 오류 (전원) | "지금은 올릴 수 없어요 — 잠시 후 다시 시도해 주세요" | "요청 처리 중 오류가 발생했습니다 (코드 500)" |
| 알림 (지민→하늘) | "지민이 방명록에 한 줄 남겼어요" | "놓친 소식 3건! 지금 확인하세요 🔥" |
| 그룹 초대 (도현) | "'우리 음악 기록'에 초대받았어요 — 천천히 둘러봐도 돼요" | "도현님이 애타게 기다리고 있어요! 바로 수락하기" |
Don't 열의 문장은 일반 SNS의 관성 어투다 — Ditto!의 타겟이 떠나온 바로 그 말투이므로, 리뷰에서 이 패턴이 보이면 즉시 교체한다. 개념어 사용 범위는 용어 · 라이팅, 서체 층위는 Typography를 따른다.
로고, 아이콘, 배경 그래픽의 원본과 사용 기준입니다. 원본의 비율을 유지하고, 사용할 화면에 맞는 색과 크기를 선택합니다.
앱 에셋 카탈로그의 SVG 벡터 원본(Assets.xcassets/wordmark-*.imageset, 370×134)이 공통 원본.
단색 8패스라 지면에 따라 재채색해 쓴다 — 이 문서의 헤더·사이드바 로고도 이 원본을 currentColor로 임베드해 라이트/다크에 자동 적응한다.
심볼(스플럽 블롭)·앱 아이콘은 이번 업데이트에서 제외 — 다음 차수.
워드마크는 블랙/화이트 2종만 운용한다 — 퍼플 변형(wordmark-purple)은 사용 지면이 없어 v3에서 제외(에셋은 카탈로그에 잔존, 신규 사용 금지). 색은 지면이 말하고, 워드마크는 잉크로만 얹는다.
| 에셋 | 위치 | 용도 · 규정 |
|---|---|---|
| 스플럽 블롭 로고 | design/brand/splup-logo.png | 심볼 — 블루→퍼플 블롭. 문서 사이트·앱 아이콘 계열의 기준 형태 |
| 워드마크 블랙/화이트 | SVG 공통 원본 Assets.xcassets/wordmark-black.imageset · PNG .codex_tmp/*/assets/wordmark-*.png | 라이트 = 블랙, 다크(Eclipse)·포토 = 화이트. 퍼플 변형은 v3 제외(신규 사용 금지) |
| 브랜드 그라디언트 바 | brand-gradient-bar.png | 지면 장식 — 토큰 gradient.brandBar(#A848F2→#310183)와 동일 축 |
| 오브제 그라디언트 텍스처 7색 | grad-obj-* imageset (red·orange·yellow·green·blue·purple·black) | 배경(블러 확대)·이미지 카드 fill 전용 — UI 컬러로 쓰지 않는다 |
| 핸들 톤 10색 | DGrad.handleTones (코드 토큰) | 핸들 pill·프로필 배너 전용 — base·pastel·light + handleShine 규칙 |
| 디토 위젯 렌더 4종 | dittoWidget_{b,p,purple,yellow}_final.png | 발표·소개 지면의 위젯 실물 컷 |
| 무드 드래프트 S1–S5 | design/brand/mood-drafts/01–05 | 대역 이미지 — 실촬영 후 교체 예정 (브랜드 소품 전 컷 심기) |
Ditto_Iconography_Catalog.svg)는 에셋 소재로만 참조 — 별도 문서화는 하지 않는다.프로필 기본 아바타 10종 다운로드 ↗핸들과 연결한 SVG·PNG·팔레트
기존 화면을 새 기준에 맞추는 순서입니다. 색과 글꼴을 먼저 확인하고, 버튼은 실행할 행동에 맞게 선택합니다.
대표 보라색은 그대로예요. 브랜드 배경과 버튼은 각각 정해진 배색을 사용해요.
#AA4AF4기존 대표색 유지#6655D2브랜드 보조색#FA97E2브랜드 핑크 기준기존 화면의 모든 보라·핑크를 한꺼번에 바꾸지는 마세요. 글자·배경·상태색은 각 역할의 기준을 유지해요.
실제 그래픽과 버튼 배색 비교하기 →화면 제목, 본문, 버튼 문구 모두 Pretendard를 사용해요. 로고와 앱 아이콘은 제공된 SVG 원본을 사용하세요.
글자 크기와 굵기 보기 →위 이미지는 용도를 설명하는 예시예요. 실제 모양과 눌림은 ‘직접 눌러보기’에서 확인할 수 있어요.
완료 로컬 디자인 시스템 문서·컬러 기준·웹 예시
별도 확인 필요 Figma 최종 라이브러리와 실제 앱 화면 적용
디자인에서 정한 값을 코드에서 같은 이름으로 불러오기 위한 기준이에요.
gradient.brandGraphiccomponent.dittoButtonDDSColor · 글자, 배경, 테두리 등에 사용DDSPalette아래 표는 당시의 검토 기록이에요. 현재 확정안이 아니며, 이전의 LINE Seed 혼용이나 이관 제안은 위 최신 기준보다 우선하지 않아요.
| 영역 | 기존 (v2 · DDS) | 신규 (v3) | 판정 |
|---|---|---|---|
| 키 컬러 | purple500 #AA4AF4 | Splup Purple #AA4AF4 | ✅ 동일 — 유지 |
| 브랜드 2색 | 없음 (#6655D2는 indigo 핸들·프로필 장식색) | Deep Purple brand.deep | 🆕 승격 — 참조 6곳 재지정 |
| 브랜드 핑크 | accentPink #FA729A 外 산재 | Platter Pink #FA97E2 | 🔁 공통 원본 교체 — 감사 D |
| 브랜드 심도 | UI 램프 purple600–950 겸용 | night 4단 #8C2BD6→#2D0080 분리 | 🆕 별도 스케일 — UI 램프 유지 |
| 다크 앵커 | gray950 #181818 · ink #171719 혼재 | Total Eclipse #2D313D (브랜드 지면) | ⚠️ 이원화 결정 — 감사 A |
| 라이트 앵커 | #FFFFFF / #FAFAFA | Bright White #F4F9FF (브랜드 지면) | ⚠️ 지면 위계 정의 — 감사 A |
| 브랜드 그라디언트 | CTA DGrad.primaryButton (#C78FF7→#AA4AF4→#9430D8) | Splup Gradient (#B9A9FA→#920CB3) + brand-bar | ⚠️ 역할 분리 — 감사 I |
| 액센트 | DDSPalette.accent* 6종 (장식 전용) | 액센트 8종 (사용자 선택 구조) | 🔁 통폐합 매핑 — 감사 I |
| 서체 | Pretendard 단일 | 2보이스: LINE Seed(브랜드) + Pretendard(사용자) | 🆕 폰트만 치환 — 스타일은 공유 |
| 글자 크기 기준 | DDSType 12스타일 · 자간 −1% · 행간 배수 | 새 크기 기준: t1–t14 × 3웨이트 + Static + 별칭 3종 | 🔁 전면 이관 — 감사 L |
| 발표 덱 잉크 | #160F1E(5곳) · #241C2B(1곳) | Total Eclipse #2D313D | ⚠️ 교체 여부 — 감사 H |
아래는 이전 설계와 검토 기록입니다. 현재 제작은 Pretendard 단일 서체, 기본 CTA R12·60pt, 최신 Colorgraphy와 Ditto Action 규격을 우선합니다.
코드 전수 스캔 결과(2026-08-26, 워킹트리 기준). 충돌 = v3 도입과 부딪혀 결정이 필요한 것 · 정리 = 규칙 위반이라 순차 청소 대상 · 정보 = 알고 두면 되는 것.
다크 잉크가 #171719(12곳)·#111111(10곳)·#141317(5곳)·#181818(gray950)로 이미 4종 산재. Total Eclipse #2D313D가 들어오면 5종이 된다.
HomeTab.swift:52FriendPlatterDetail.swift:92Overlays.swift:831·878OnboardingScenes.swift:227Gradients.swift:59 (LP)수정 방향 — 지면 2층 선언: 브랜드 지면(발표·온보딩·프로필 공유)=Eclipse, 앱 UI 다크=gray950 유지. 잉크는 textStrong/WInk 토큰 경유로 수렴, #111111·#141317은 폐기.
#E5484D(뷰 10곳 + 에디터 T팔레트)와 시맨틱 danger500 #DC3F3A가 따로 논다. 어느 쪽이 파괴적 액션의 공통 원본인지 애매.
Views 전반 10곳LegacyTokens.swift:123 (editorTextColors)수정 방향 — UI 파괴 액션은 DDSColor.danger로 통일. #E5484D는 에디터 텍스트 팔레트(기능 구성값)에만 잔류 허용.
Deep Purple로 승격되는 #6655D2가 현재는 "장식색 중 하나"로 6곳에 산재 — indigo 핸들톤, 프로필 10색의 7번, objPurple 하단, LP 레코드 중심. 브랜드 2색이 사용자 선택지에 섞여 있으면 위계가 무너진다.
ColorGlobal.swift:71 (profile)Gradients.swift:26·57·58·101LegacyTokens.swift:81수정 방향 — brand.deep 토큰 신설 후 6곳을 참조로 교체. 프로필/핸들의 indigo를 브랜드와 분리할지(색 미세 조정) 결정 필요.
신규 Platter Pink #FA97E2 vs 기존 accentPink #FA729A vs 뷰에 흩어진 #EB8FD0(2)·#CEA0E9(3). 디토 슬롯(핑크 +)의 공통 원본이 불명확.
ColorGlobal.swift:69WidgetContent.swift 外수정 방향 — 디토 슬롯·그룹 접점은 전부 brand.platterPink로 공통 설정으로 통합, 나머지 유사 핑크는 근접 매핑 후 폐기.
앱·Figma 어디에도 LINE Seed가 없다. 현재 브랜드 보이스(온보딩 타이틀·워드마크 주변 카피)까지 전부 Pretendard. Figma 텍스트 스타일은 아직 Gothic A1 임시 상태(07-31 기록).
Typography.swift (Pretendard 단일)Figma 6bedL… 텍스트 스타일수정 방향 — OTF 5웨이트 번들 임베드 + UIAppFonts 등록 → t스케일 기반 DDSText 신설 → 브랜드 모먼트만 교체. Figma는 스타일 수동 교체(로컬 폰트라 API 불가).
덱(build_v2final.mjs)은 dark #160F1E(5곳)·ink #241C2B(1곳), 앱 다크는 #181818, 새 브랜드는 #2D313D — 세 지면의 "밤"이 전부 다른 색.
.codex_tmp/ditto_final/build_v2final.mjsCLAUDE.md 브랜드 토큰 절수정 방향 — 발표·인쇄물은 Total Eclipse로 교체(재빌드 1회). CLAUDE.md의 ink/dark 정의도 v3 값으로 갱신.
타입 스케일을 t1–t14로 이관하면 현행 DDSType과 어긋나는 축이 다섯: ① 19px(titleMd)·17px(titleSm·bodyLg) 소멸 → 20·18로 스냅 ② Semibold(600) 소멸 → 라벨류는 Bold(700) 스냅 ③ 라벨 행간 1.0 관행 vs v3 고정 짝(예 16/22) — pill·버튼 높이가 미세하게 변함 ④ 자간 −1% 폐지(새 크기 기준엔 자간 토큰 없음) ⑤ LINE Seed Sans App에 Medium(500) 웨이트 없음.
Typography.swift (DDSType 12종).dtype() 호출 전 화면수정 방향 — 이관표(Typography) 기준으로 DDSText 신설 후 파일 단위 점진 교체(빅뱅 금지). ③은 컴포넌트 고정 높이로 흡수, ⑤는 브랜드 보이스에서 Medium 사용 금지 규칙으로 해소.
주파수 글로우(GlowSpec)가 #7C4DFF — Splup #AA4AF4도 Deep #6655D2도 아닌 제3의 퍼플이 게이트 시그널이라는 핵심 표현을 맡고 있다. 관계 스택 글로우는 레거시 DT.objOrange를 Foundation 파일에서 직접 참조.
Interaction.swift:22-28수정 방향 — 주파수 글로우를 브랜드 축(Splup 또는 brand.deep)으로 재정의할지 결정. 시각 검증 후 α·radius 재조정, DT 참조는 토큰 경유로 교체.
§2 규칙(raw hex 금지) 위반이 17개 파일에 누적. 위젯 내부 고정 잉크(WInk) 같은 정당 케이스와 구분해 순차 이관 필요.
WidgetContent 45OnboardingScenes 29AppState 17FriendsTab 15Overlays 13OnboardingFlow 11PolaroidCamera 10+10개 파일수정 방향 — 빅뱅 금지 원칙대로, 파일을 기능 수정으로 열 때마다 해당 파일만 토큰 이관. v3 신규 색 도입 시 이 목록이 체크리스트.
.system(size:) 직접 호출이 34곳 — 스타일 외 임의 크기. LINE Seed 도입 시 브랜드/사용자 보이스 구분이 불가능해지는 지점이기도 하다.
OnboardingScenes 10WidgetContent 4StickerBoard 3기타 17곳수정 방향 — 신규 t스케일(DDSText.tN*)로 흡수. 스케일에 없는 크기는 가장 가까운 tN으로 스냅(§3 원칙 — 임의값 추가 금지).
기존 accent* 6종(장식)·핸들 10톤·오브제 7색 위에 신규 액센트 8종이 얹힌다. CTA 그라디언트(#C78FF7→#9430D8)와 Splup Gradient도 축이 미묘하게 다르다.
ColorGlobal.swift:68-69Gradients.swift:15-19수정 방향 — 역할 분리 선언: 신규 8종=사용자 선택 액센트 / 핸들·오브제=기존 유지(사용자 커스텀 자산) / 구 accent* 6종은 근접 매핑 후 폐기. CTA는 컴포넌트 토큰으로 유지, 브랜드 지면만 Splup Gradient.
DT 퍼플 램프(light #8E17EB 축)는 신규 night 램프와 완전히 다른 축이지만, 정의가 DDS로 재지정된 별칭이라 실해는 없음.
Legacy/LegacyTokens.swiftLegacy/SeedShim.swift수정 방향 — 정책 유지(신규 코드 사용 금지). 단 v3 신규 토큰의 레거시 별칭은 만들지 않는다.
v3 보드는 라이트(Bright White) 기준. 다크에서 Splup 계열은 기존 규칙(500→400 밝힘: #C588FF)이 이미 있으나, Deep Purple·Platter Pink·액센트 8종의 다크 대응값은 미정의.
ColorTheme.swift (adaptive 패턴)수정 방향 — 브랜드 3색은 다크에서도 원색 유지(지면이 Eclipse라 대비 충분), 액센트 8종은 채도 −8~12% 다크 짝을 tokens.json에 함께 정의.
아래는 이전 설계와 검토 기록입니다. 현재 제작은 Pretendard 단일 서체, 기본 CTA R12·60pt, 최신 Colorgraphy와 Ditto Action 규격을 우선합니다.
현 시스템에 추가·보강해야 할 항목만 정리한 목록입니다. 완료한 항목은 관련 문서에 반영합니다. 기존 것의 애매한 적용은 감사 보드가, 새로 필요한 것은 이 백로그가 담당한다.
| # | 항목 | 현황 | 추가할 것 | 우선순위 |
|---|---|---|---|---|
| 1 | pressed 색 짝 확장 | fillBrandPressed 1개뿐 | 주요 fill·layer 시맨틱에 pressed 쌍 정의 (tokens.json → DDSColor) | P1 |
| 2 | Reduced Motion 코드 연동 | 규칙만 문서화(Motion) | isReduceMotionEnabled 연동: pressed 스케일 1 · popIn→fade · 글로우 펄스 정지 | P1 |
| 3 | 액센트 8종 다크 짝 | 라이트 값만 확정 | 채도 −8~12% 다크 대응값을 tokens.json에 쌍으로 (검토 K) | P1 |
| 4 | 그라디언트 설정 통합 | 스톱이 코드(Gradients.swift) 하드코딩 | gradient.splup / brandBar를 tokens.json 1급 토큰으로 (로드맵 1과 연동) | P1 |
| 5 | 다이나믹 타입 연동 | Static(px 고정)만 정의 | 기기의 글자 크기 설정을 따르는 스타일의 UIFontMetrics 연동 — DDSText 신설과 함께 | P2 |
| 6 | 컴포넌트 스펙 문서화 | 코드만 존재 · 버튼 & 인터랙션만 선행 문서화 | 슬롯·변형·상태 스키마 + DSSnapshots 실렌더 카탈로그 (별도 트랙) | P2 |
| 7 | 접근성 명문화 | 대비 4.5:1 보장이 코드 주석 수준 | 대비 기준·터치 타깃 44pt·모션 감소를 규칙 페이지로 승격 | P2 |
| 8 | 토큰 모드 구조 | tokens.json 평면 (라이트/다크 쌍만) | color(light/dark) · motion(preferred/reduced) 컬렉션×모드 구조 도입 | P3 |
색, 글자, 간격처럼 여러 화면에서 반복하는 값을 이름으로 저장합니다. 같은 이름을 사용하면 공통 원본을 수정했을 때 연결된 화면을 함께 바꿀 수 있습니다. 아래 표에서 이름, 값, 적용 위치를 확인하세요.
purple.500→fillBrand→| tokens.json 경로 | 값 | Swift 공통 원본 | 용도 |
|---|---|---|---|
color.brand.splup | #AA4AF4 | DDSBrand.splup | 키 컬러 (= purple500 참조) |
color.brand.deep | #6655D2 | DDSBrand.deep | 브랜드 2색 |
color.brand.platterPink | #FA97E2 | DDSBrand.platterPink | 디토 슬롯·그룹 접점 |
color.brand.night.100–400 | #8C2BD6 · #6D01B9 · #4E009C · #2D0080 | DDSBrand.night1–4 | 브랜드 심도(그래픽 전용) |
color.brand.eclipse | #2D313D | DDSBrand.eclipse | 브랜드 다크 지면 (19-4010 TCX) |
color.brand.brightWhite | #F4F9FF | DDSBrand.brightWhite | 브랜드 라이트 지면 (11-0601 TCX) |
color.accent.magenta … sky (8) | #FF2CBF … #48B5F4 | DDSAccent.* | 사용자 선택 액센트 (+다크 짝) |
gradient.splup | #B9A9FA → #9A36F0 55% → #920CB3 | DGrad.splup | 키비주얼 세로 |
gradient.brandBar | #A848F2 → #310183 | DGrad.brandBar | 브랜드 가로 바 |
typography.fontFamily.global / korean | LINE Seed Sans App / Pretendard | DDSFont.lineSeed() / .pretendard() | 2보이스 서체 |
font-size.t1–t14 (+-static) | 11–48px | DDSText.tN{Rg,Md,Bd}(+ Static) | 글로벌 스케일 |
line-height.t1–t14 (+-static) | 15–60px (고정 짝) | 글로벌 스케일 | |
font-weight.regular/medium/bold | 400 / 500 / 700 | 자간 토큰 없음 | |
textStyle 별칭 3종 | screenTitle t10Bd · articleBody t5Rg+lh t6 · articleNote t4Rg+lh t5 | DDSText.screenTitle … | 시맨틱 별칭 |
문서에 그려진 모습과 앱에 적용된 상태는 다를 수 있습니다. 이 페이지에서는 무엇이 준비됐고 무엇을 더 확인해야 하는지 나눠 봅니다.
브랜드 컬러, 그래픽 팔레트, 프로필 10색, 우측 액션 5개 상태를 확인할 수 있습니다.
대표·라이프 표면과 친구 상태 아이콘을 같은 기준으로 정리했습니다.
10색 프로필 설정이 소스에 연결되어 있습니다. 실제 기기 화면은 별도 검증이 필요합니다.
사용자가 누를 수 있는 곳, 이미 고른 것, 아직 사용할 수 없는 것을 색으로 구분합니다. 일반 버튼부터 Ditto, 색상 선택, 프로필까지 실제 화면에 적용하는 방법을 설명합니다.
배경과 글자색을 따로 고르면 원하는 분위기와 읽기 편한 화면을 함께 만들 수 있습니다. 색상표의 무지개 버튼을 누르면 작은 컬러 휠이 열립니다. 그라디언트는 배경에만 사용합니다.
상세 컬러 토큰 JSON ↓ · 위젯 크기와 음원 출처 규격 →
프로필의 10가지 색은 나를 표현하는 선택지입니다. 같은 색을 프로필 핸들과 기본 아바타에 함께 사용합니다. 고른 색에는 테두리를, 키보드로 이동한 위치에는 바깥 링을 표시합니다.
| 대상 | 적용 기준 |
|---|---|
| 일반 화면 | 배경, 글자, 테두리는 사용처별 색상을 연결합니다. 밝은 화면과 어두운 화면을 함께 확인합니다. |
| Ditto | 로고와 문구가 있는 긴 버튼을 사용합니다. 3초 동안 누르면 색이 깊어지고, 일찍 떼면 360ms 동안 원래 색으로 돌아오며 취소됩니다. |
| 위젯 | 배경 25종 위에 이미지와 제목을 각각 배치합니다. 작은 Ditto 마크는 가져온 위젯임을 알려줍니다. |
| 재사용 | Figma에서는 Palette로 배경을, Title로 제목을, Artwork로 이미지를 바꿉니다. 앱에서는 같은 색상 데이터와 공통 버튼·카드를 사용합니다. |
color-system.json 변경 후 python3 scripts/sync_splup_colors.py로 앱 컬러를 갱신해요. SplupColor는 역할별 색, SplupGraphicPalette는 위젯·EVENT 배경, DittoHoldButton은 실제 가져오기 동작에 연결하는 컴포넌트예요. 비동기 저장을 연결할 때는 요청 중 중복 입력을 막고 성공 뒤에만 완료를 표시해요.
글자와 간격에서 움직임과 표면까지. 필요한 규칙을 골라 실제 예시와 함께 확인하세요.
모양만 보여주지 않고 상태와 반응, 적용 기준을 함께 정리했습니다.
단일 요소를 넘어, 플래터의 구성과 사용자를 대하는 언어를 확인하세요.
색, 간격, 모서리의 공통 설정값과 브랜드 원본 파일을 제공합니다. 기존 화면을 수정할 때는 변경 가이드를 함께 확인합니다.
카카오톡, X, 메시지에 ditto.place 링크를 붙이면 보이는 미리보기 이미지입니다. 모든 공개 페이지에 하나씩 두고, 같은 무리끼리는 같은 틀을 씁니다. 아래 이미지는 지금 ditto.place에 올라가 있는 실제 파일입니다.

| 항목 | 기준 | 이유 |
|---|---|---|
| 크기 | 1200 × 630 (1.91 : 1) | 카카오톡·X·페이스북·메시지가 공통으로 크게 보여 주는 비율 |
| 안전 영역 | 가운데 1080 × 560 | 카카오톡은 가로를 더 길게 잘라 위아래가, X는 왼쪽 아래 도메인 라벨과 둥근 모서리가 가장자리를 덮는다. 제목·얼굴·워드마크는 이 안에 |
| 글자 | Pretendard 제목 60px 이상 · 본문 24px 이상, 강조 영문은 Nunito Italic | 미리보기는 폭 300px 안팎으로 줄어든다 — 1/4로 줄어도 읽히는 크기 |
| 형식 | 그래픽 PNG · 사진이 들어가면 JPEG (품질 90) | 사진을 PNG로 저장하면 500KB를 넘고, 팔레트로 줄이면 얼룩이 생긴다 |
| 용량 | 300KB 이하 | 카카오톡·X가 큰 이미지를 건너뛰거나 늦게 보여 준다 |
| 주소 | https://ditto.place/… 절대 주소 | 상대 경로는 미리보기 서버가 읽지 못한다 |
페이지 <head>에 아래 태그를 모두 넣습니다. og:url은 .html 없는 깨끗한 주소로, 제목과 설명은 페이지마다 다르게 씁니다.
<meta property="og:type" content="website">
<meta property="og:site_name" content="ditto!">
<meta property="og:url" content="https://ditto.place/splup/design/site/navigation-sheets">
<meta property="og:title" content="상단 바와 바텀시트 · Splup 디자인 가이드">
<meta property="og:description" content="56pt 상단 바, 44pt 터치 영역, …">
<meta property="og:image" content="https://ditto.place/assets/og/guide-nav-sheets.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="…"> <meta name="twitter:description" content="…">
<meta name="twitter:image" content="https://ditto.place/assets/og/guide-nav-sheets.png">| 무리 | 파일 | 만드는 곳 |
|---|---|---|
| 브랜드 | /assets/og/brand-home.jpg (히어로) · /assets/og/brand-{페이지}.png | ditto-landing scripts/og_static.mjs — HTML을 Playwright로 찍는다 |
| 가이드 | /assets/og/guide-{페이지}.png | |
| 시안 모아 보기 | /assets/og/demo-index.jpg | |
| 프로필 | /og/{아이디}.jpg · 시안 /demo/{아이디}/og.jpg | ditto-landing scripts/build_site.py og_image() — 빌드 때 사람마다 |
고정 이미지는 모두 /assets/og/ 한곳에 {무리}-{페이지} 이름으로 둡니다. 가이드 페이지의 메타 태그는 prj_Ditto! 원본 HTML에 있어서 다음 동기화에도 그대로 유지됩니다.
모든 이미지 위에 1080 × 560 점선을 겹쳐 봅니다
홈 히어로와 같은 퍼플→핑크 대각 그라디언트, 화이트 워드마크, 흐린 하트. 페이지가 하는 일을 한 문장으로 크게 씁니다.

/assets/og/brand-home.jpg히어로 · 원본 og-landing.png를 300KB 이하 JPEG로
ditto.place
/assets/og/brand-download.png
ditto.place
/assets/og/brand-404.png새 아이디는 다음 빌드 전까지 404 페이지가 프로필을 그린다
ditto.place앱 ProfileHandle 카드(높이 64 · 아바타 48 R12 · 이름 16/500 · 아이디 12)를 2.5배로 그리고, 그 사람의 profiles.handle_color 그라디언트를 그대로 씁니다. 바탕은 같은 색을 옅게, 오른쪽은 대표 플래터의 사진 위젯 3장입니다. 시안 계정 10명이 Profile handle v2의 10색을 하나씩 씁니다.

/demo/haeunzip/og.jpg
ditto.place
/demo/junishere/og.jpg
ditto.place
/demo/soramaybe/og.jpg
ditto.place
/demo/jaeminarchive/og.jpg
ditto.place
/demo/nariday/og.jpg
ditto.place
/demo/dohyunlinks/og.jpg
ditto.place
/demo/jiuallday/og.jpg
ditto.place
/demo/seoyunpalette/og.jpg
ditto.place
/demo/rianafterdark/og.jpg
ditto.place
/demo/yeseofilm/og.jpg
ditto.placeSplup 문서 스킨 — 밝은 회색 바탕, 떠 있는 상단 바, 문서 표지와 같은 색·도형의 카드. 바뀌는 것은 제목·설명·주소·표지 색뿐입니다.

/assets/og/guide-splup.png/splup/ 진입 주소도 같은 이미지
ditto.place
/assets/og/guide-nav-sheets.png
ditto.place
/assets/og/guide-ditto-ds.png/splup/ditto/ 진입 주소도 같은 이미지
ditto.place
/assets/og/guide-motion.png
ditto.place
/assets/og/demo-index.jpgassets/rooms/ 방 캡처 10장
ditto.placeog:image에 상대 경로 쓰기, og:url에 .html 남기기프로필과 같은 색을 사용하는 기본 아바타 10가지입니다. 사진을 등록하지 않았을 때 표시하며, 아래 예시에서 실제 크기로 비교할 수 있습니다.
컬러를 고르면 같은 배색의 대표·라이프 핸들에 함께 적용돼요. 실제 48px 크기로 확인하세요.
01 · 퍼플 · 핑크
사각 프로필에 맞춰 만든 컬러 표면입니다. 크기와 비율을 바꿔도 색이 전체 영역을 채워요.
96 × 96 · 모서리 24
동일한 광택·번짐으로 통일했어요. 48×48 · 모서리 12의 라운드 사각형에 테두리 없이 적용합니다.
#B66BEC#9270D9#C792ED#9580DE#8D73CE#AE99E6#FA91D9#F064B3#F5A5D8#FFA36F#F68A50#FFBC87#62C3F1#369FD9#89CDEE#38DBB1#09BA97#6BDDC2#F77983#E9576F#F39CA8#F4D76C#DDC057#EDDA94#C8E96B#ACCE48#D1E796#AEB3BF#929AA9#BDC4D010종 모두 다운로드 ↗SVG · 1024px PNG · 512px 라운드 사각 PNG · 팔레트 JSON
01–06은 브랜드 그래픽, 07–10은 기존 프로필 핸들 팔레트에서 파생했어요. 아바타는 작은 크기에 맞춰 보조색의 채도를 조절합니다.
위쪽의 넓은 반사광과 아래쪽의 얕은 음영만 사용해요. 흰 테두리·노이즈·로고는 넣지 않습니다.
선택한 기본 아바타는 이미지 전체를 표시해요. 사진도 아바타 선택도 없으면 기존 라이트 그레이 바탕과 회색 사람 아이콘을 유지합니다.
라이프와 대표를 전환할 때 아바타는 유지합니다. 팔레트를 바꿀 때 같은 계열을 추천하되, 사용자가 고른 아바타를 임의로 바꾸지 않습니다.
component.profileAvatar · handlePaletteId로 프로필 핸들 배색을 연결합니다. 이 페이지는 디자인 시스템 예시이며 실제 앱 적용은 별도입니다. Figma에는 10종의 편집 가능한 그라디언트 컴포넌트와 대표·라이프 적용 예시를 등록했어요. 기존 프로필 핸들의 Avatar 항목에서 선택할 수 있어요. 크기 변경은 Resize, 비율을 유지하며 모서리까지 확대하려면 Scale(K)을 사용하세요.
같은 프로필을 대표와 라이프에서 어떻게 보여줄지 정합니다. 색을 선택해 두 모습을 비교하고, 오른쪽 버튼의 배치와 동작을 확인하세요.
기본 아바타 10종 보기 →한 사람의 핸들 색은 서버 profiles.handle_color 하나에 저장돼요. 내 폰, 친구 폰, 그룹·피드·알림·주파수 화면, ditto.place 프로필까지 모두 같은 값으로 그려요. 친구 목록 순서, 화면 위치, 이름 해시로 색을 정하지 않아요. 값이 없을 때만 기본색 라벤더를 써요.
10색은 Figma 페르소나 플래터의 헤더 색에서 가져왔어요. 글자 대비가 모자란 색(슬레이트·틸·모브)만 아래 스톱을 밝혔어요. 저장 값은 프리셋 키(lavender 등)나 직접 고른 #RRGGBB예요.
라벤더 lavender
위 #CAB7F2아래 #B092ED라이프 #C8B3F2
이름 9.9 · 7.0 : 1 · 보조 6.0 : 1
슬레이트 slate
위 #A8B3BF아래 #79899B라이프 #A1ADB9
이름 8.4 · 5.0 : 1 · 보조 4.8 : 1
라임 lime
위 #C5D593아래 #A5BE57라이프 #C0D289
이름 11.3 · 8.6 : 1 · 보조 7.0 : 1
틸 teal
위 #8FB2BD아래 #5C8F9F라이프 #8DB0BC
이름 7.9 · 5.0 : 1 · 보조 4.7 : 1
골드 gold
위 #D5C194아래 #BF9F5B라이프 #D2BC8C
이름 10.1 · 7.1 : 1 · 보조 6.1 : 1
코랄 coral
위 #EDAE91아래 #E07B4C라이프 #E9A382
이름 9.4 · 6.1 : 1 · 보조 5.5 : 1
핑크 pink
위 #EEAFC7아래 #E37CA2라이프 #EBA3BE
이름 9.9 · 6.5 : 1 · 보조 5.8 : 1
세이지 sage
위 #B3BDA6아래 #85946F라이프 #AAB49A
이름 9.2 · 5.5 : 1 · 보조 5.2 : 1
모브 mauve
위 #B5ADBA아래 #908498라이프 #B2A9B7
이름 8.2 · 5.1 : 1 · 보조 4.8 : 1
스카이 sky
위 #ADD5E5아래 #79BBD4라이프 #A1CFE1
이름 11.4 · 8.4 : 1 · 보조 6.9 : 1
DGrad.customTone과 웹 platter.handle_style이 같은 규칙이에요| 높이 | 최소 64. 큰 글자에서는 늘어나요 |
|---|---|
| 모서리 · 여백 | R16 · 사방 8 · 요소 간격 8 |
| 아바타 | 48 정사각 · R12 · 사진 없으면 #F1F2F4 + 사람 아이콘 24 |
| 이름 | Pretendard 16 / Medium 500 · 행간 1.45 · 자간 −1% · 한 줄 말줄임 |
| @핸들 | Pretendard 12 / Regular 400 · 잉크 85% · 이름과 간격 2 |
| 배경 | 위 스톱 → 아래 스톱 세로 그라디언트 + 상단 흰빛 18%(22% 지점에서 0) |
| 그림자 | 0 3 8 · #000 6% |
| 오른쪽 액션 | 터치 44 · 아이콘 20 · 간격 4 |
재민은 내 홈, 친구 폰, 그룹 멤버 시트, 알림에서 연 프로필, ditto.place까지 언제나 틸이에요. 색은 서버 값을 읽어서 그려요.
친구 목록의 몇 번째인지, 화면 위치, 이름 해시로 색을 정하지 마세요. 같은 사람이 기기마다 다른 색이 되면 누구인지 알아보기 어려워요.
정본: design/tokens/profile-handle.json · iOS DGrad.profileHandlePalettes · 서버 profiles.handle_color(체크 제약) · 웹 scripts/platter.py handle_style
주색의 깊이와 얕은 광택으로 강조해요.
같은 계열의 선명한 단색으로 구분해요.
Figma · 통합 Profile System 보기 →
컬러칩은 핸들과 같은 원본 색으로 표시해요. 좁은 화면에서는 옆으로 스와이프해 다른 색을 볼 수 있어요. 사진과 아바타는 그대로 유지돼요.
디자인 시스템 미리보기예요. 실제 프로필은 저장되지 않아요.
Figma · 통합 Profile System 보기 →
색을 줄이지 않고 가로로 넘겨요. 스와이프는 목록만 이동하고, 컬러칩을 눌러야 선택이 바뀌어요.
디자인 시스템 미리보기예요. 실제 프로필은 저장되지 않아요.
아래는 상태 전환을 확인하는 데모예요. 실제 프로필 저장이나 친구 요청은 전송되지 않아요.
수정은 프로필 편집을 열고, 설정은 계정 설정으로 이동해요.
수정완료 후 기본 상태로 돌아가요. 저장 중에는 중복 입력을 막아요.
사람과 체크를 함께 사용해 친구 관계를 표시해요. 친구 삭제를 즉시 실행하지 않아요.
요청을 보낸 뒤 요청됨으로 바꿔요. 수락 전에는 친구로 표시하지 않아요.
버튼은 비활성화하고 추가할 수 없는 사유를 아래에 안내해요.
수정 버튼을 눌러 상태 변화를 확인해보세요.
높이 64 · 모서리 16 · 프로필 이미지 48. 어두운 글자로 읽기 쉽게 맞췄어요. 위 핸들은 색과 형태를 비교하는 예시이며 편집·설정 기능은 연결되지 않았어요.
앱 소스의 프로필 선택도 10종으로 연결했어요. 기존 선택은 유지하고 이전 컬러 ID는 가까운 팔레트로 연결되며 직접 지정한 커스텀 색은 유지해요. 실제 기기 화면 검증은 별도입니다.
위젯 13개 유형의 콘텐츠, 글자 크기, 출처와 이동 표시를 웹 시안으로 확인하세요. 작은 크기에서는 글자를 축소하지 않고 표시하는 정보량을 조절합니다.
출시 위젯 15종의 목록과 추가·작성 화면은 위젯 추가와 편집, To-do는 To-do 위젯, 디토 가능 표시는 디토 허용 규칙에서 실제 앱 화면으로 확인하세요. 이 페이지의 위젯 그림은 웹에서 다시 그린 시안이에요.
Figma · CDP와 6×6·6×8 영상형 보기 ↗ · 음악 플레이어 규격
CDP 형태는 음악을 가져오는 방식과 별개예요. 앨범 커버를 CD에 넣고 커버의 주요 색을 본체에 밝게 적용합니다. 금속 테두리와 중앙 허브, 은은한 반사광을 함께 보여줍니다. 재생 시안은 누르면 회전하고 다시 누르면 멈춰요.
6×6·6×8은 뮤직비디오를 표시해요. 그 외 크기에서 CD는 가로·세로 1:1로 표시하며 전체 원이 보이도록 배치해요. 중심 구멍은 외경의 12.5%, 투명 허브는 27.5%를 사용해요. CD 치수 참고 ↗
6 × 2는 곡 정보와 CD를 좌우로, 2 × 6은 CD·곡 정보·재생 표시를 위아래로 배치해요. 긴 형태의 안쪽 여백은 10px입니다. 2 × 6은 곡명 두 줄, 아티스트 한 줄, 출처 아이콘을 사용하며 하단에는 진행 시간을 표시합니다.
카드 전체를 눌러 전환해요. 다른 음악을 누르면 이전 곡은 멈춰요.
곡과 재생 위치를 유지해요. 6×6·6×8은 영상형으로 바뀌며 본체 색은 앨범 커버를 따릅니다.
기기 설정에 맞춰 회전과 막대 움직임을 끄고 재생 상태를 글자로 보여줘요.
Figma · 검증한 앨범 9종 보기 ↗ · 앨범별 컬러 값
음악 위젯은 앨범 커버가 담긴 CD와 그 앨범의 색을 닮은 본체로 구성했어요. 402px 화면 기준 정사각·가로형·세로형을 비교해보세요. CD는 항상 1:1이며, 곡명과 아티스트는 편집 가능한 텍스트로 유지합니다.
직접 제공한 커버로 만든 디자인 예시입니다. 서비스에서 내려받은 데이터나 실제 재생 상태를 뜻하지 않습니다.
영상 포스터는 별도로 지정하고 본체 색상은 앨범에서 가져옵니다. MV가 연결되지 않은 경우에는 앨범 커버를 표시합니다. 별도 재생 버튼과 하단 원형 버튼 줄은 사용하지 않습니다.
현재 지원 기준은 YouTube입니다. 아래 다중 서비스 화면은 이전 비교 자료입니다.
커버와 음악 정보의 구성은 유지하고, 연결한 서비스 표시와 도착 위치를 명확하게 보여줘요.
연동 UI 데모 · API 계정 미연결 · 음악 재생 없음
음악은 앨범에서 추출한 색상, 메모는 14px 본문, 폴라로이드는 종이 여백을 사용합니다. 공통 Floating 음영은 바깥 표면에만 적용합니다.
GIF와 기분은 별도 위젯입니다. 기분·방명록·플레이리스트는 새 구조로 제안합니다. 미디어는 기존 시안의 예시이며 GIF·영상은 정적 예시이며 음악은 눌러서 무음 모션을 확인할 수 있습니다. 실제 오디오 테스트는 위의 음악 플레이어에서 가능합니다.
기분은 상태와 짧은 기록, 방명록은 친구의 메시지, 플레이리스트는 커버와 곡 목록에 집중합니다. 앱의 방명록 타일은 최근 안부와 ‘from. 이름 · 안부 남기기’로 그려요 — 방명록 규격.
숫자는 가로 칸 × 세로 칸입니다. 화면 폭을 바꿔도 글자와 출처 영역은 일정한 크기를 유지합니다.
앨범 선택에 따라 CD 커버와 본체 색이 함께 달라집니다. 사각 썸네일과 서비스 출처도 유지합니다.
높이 22px · 아이콘 14px · 글자 11px · 모서리 6px · 가장자리 여백 8px. 충분한 폭에서는 서비스명과 ↗를, 작은 카드에서는 아이콘과 ↗를 표시합니다. GIF는 파일 형식이므로 외부 이동 화살표와 구분합니다.
음악 서비스는 22px 행 안에 서비스명과 ↗를 표시합니다. Spotify 아이콘은 최소 21px와 주변 11px 여백을 확보해요. 음악 재생형은 위젯을 눌러 재생·일시정지하고, 링크형은 위젯 전체를 눌러 서비스에서 엽니다. 링크형에는 재생 표시를 붙이지 않아요.
배지는 도착 위치를 알려주는 표시입니다. 별도 작은 버튼으로 만들지 않고 위젯 전체를 눌러 이동합니다. 사진·GIF의 Ditto 배지는 우측 상단, 글자가 있는 위젯의 Ditto 배지는 출처 영역 우측에 배치합니다. 사진·영상의 서비스 배지는 우측 하단에 배치하고, 음악의 출처는 곡명·아티스트 아래에 정렬해요.
본문 14px / 행간 20px, 제목 14px, 보조 정보 11px를 유지합니다. 질문은 120자, 답변은 500자까지 입력할 수 있으며 카드에서는 질문 최대 3줄·답변 최대 6줄까지만 보이고 나머지는 말줄임합니다. 실제 앱에서는 전체 내용을 상세 화면에서 보여주도록 설계합니다. 이 페이지는 말줄임을 확인하는 예시입니다.
402px 화면 기준입니다. 가로 8칸, 좌우 여백 16px, 위젯 사이 간격 8px을 공유합니다. 아래 도형은 크기를 비교하기 위해 축소했습니다.
작은 크기에서 읽기 어려운 유형은 허용 목록에서 제외했습니다. 비율을 억지로 늘리지 않고 내용 배치를 바꿉니다.
| 유형 | 가로 × 세로 칸 | 내용 배치 |
|---|
사진 위젯을 기준으로 4×4, 6×4, 4×6, 6×6, 6×8의 5개 크기를 정리했습니다. 위의 ‘Ditto 출처 표시’를 켜면 직접 비교할 수 있습니다.
높이 52px · 아바타 28px · 이름 13px · 출처 11px. 좁은 카드는 아이디와 출처를 두 줄로 나눕니다.
디자인 시스템의 앱 아이콘 벡터를 사용합니다. 사진 위 배지는 32px이며, 기존 앱 아이콘과 얕은 내부 음영을 함께 유지합니다.
출처 배지는 상태 표시입니다. 실제 Ditto 액션은 로고와 문구가 있는 긴 버튼을 3초간 눌러 실행합니다. 작은 배지에는 액션을 넣지 않습니다.
웹 예시와 Figma 위젯 가이드를 같은 구성으로 정리했어요. Figma 문구는 Pretendard 텍스트로 직접 수정할 수 있어요. 네이티브 앱의 허용 크기와 동작은 별도 구현 대상입니다.
위젯 추가 시트에서 고를 수 있는 위젯, 카드 규격, 모든 위젯이 함께 쓰는 작성 화면과 플래터 편집 도구를 정리했어요. 이미지는 모두 실제 앱 화면이에요.
기준: 앱 소스 AddWidgetSheet.swift · PlatterAddSheet.swift · WidgetFrame.swift · GridEngine.swift. 1.0 출시 위젯은 15종이에요(WType.launchSet). 그 밖의 위젯은 ‘곧 열려요’로 잠겨 있어요. 추가 시트 규격 JSON
네 묶음은 1.0 출시 위젯(WType.launchSet)을 그대로 반영해요. 이름과 설명은 앱 카드 문구 그대로이고, ditto.place의 ‘붙일 수 있는 것들’과 같은 목록이에요. 기분은 상태에 합쳤고, 블록 자리는 포스트가 이어받았어요.














추가 시트 맨 끝에는 준비 중인 위젯을 모은 ‘곧 열려요’ 묶음이 있어요(Ask · 한줄일기 · 문답 · 버킷리스트 · 취향 콜렉션 · Ghost · 비밀게시글 · 폴라로이드 · 파파라치 · 빈티지 카메라 · 알림 전송). 흑백 잠금 카드로만 보이고, 누르면 ‘{이름}은(는) 곧 열려요’를 알려요. 이미 플래터에 있는 위젯은 그대로 보이고 동작해요. 출시 목록이 아니므로 위 네 묶음과 소개 페이지에는 넣지 않아요.


| 카드 요소 | 규격 |
|---|---|
| 미리보기 | 정사각 1:1 · 모서리 16. 대표 이미지, 또는 실제 위젯을 칸의 78% 크기로 줄여 바닥 면 가운데에 놓고 그림자 0 4 8 · 8% |
| 이름 | 16/600 · 한 줄 · 미리보기와 간격 10 |
| 설명 | 12/400 · 보조 글자색 · 한 줄(최대 85%까지 축소) |
| 잠금 | 흑백 · 투명도 45% · 왼쪽 위 ‘곧 열려요’ 배지(높이 22, 검정 55%). 누르면 ‘{이름}은(는) 곧 열려요’ 알림 |
| 누른 뒤 | 포스트 = 포스트 에디터 · Together = 전용 촬영 흐름 · 나머지 = 공통 작성 화면 |
위젯을 고르면 전체 화면 작성 화면이 열려요. 위젯마다 입력 칸은 다르지만 순서는 같아요.
| 위젯 | ‘위젯 추가’가 켜지는 조건 |
|---|---|
| 이미지 | 사진을 골랐을 때 |
| 음악 | 곡을 골랐을 때 |
| 영상 | 영상 파일이나 YouTube 영상을 골랐을 때(불러오는 중에는 꺼짐) |
| 텍스트 · 소셜 · D-Day | 글자를 입력했을 때 |
| To-do | 할 일을 하나 이상 적었을 때 |
| 플레이리스트 | 곡이나 항목이 하나 이상일 때 |
| 상태 | 이모지 모드는 바로, 문장 모드는 글자를 입력했을 때 |


플래터에서 ‘수정’을 누르면 같은 입력 칸을 시트로 열어요. 제목은 ‘{종류} 위젯 수정’, 닫기는 오른쪽, 하단 버튼은 ‘수정 완료’예요. 크기는 플래터에서 바꾸므로 시트에는 미리보기와 크기를 두지 않아요. 바꾼 내용이 있으면 끌어내려도 닫히지 않고 ‘변경사항을 저장하지 않고 닫을까요?’를 물어요(변경사항 버리기 · 계속 수정하기).
편집 중인 위젯에는 세 가지 도구만 붙어요. 편집 중 ‘대표로 ↑’ 라벨은 없앴어요(2026-10-11). 대표·라이프 이동은 위젯 수정·관리에서 해요.

| 도구 | 위치 | 규격 |
|---|---|---|
| 삭제 | 오른쪽 위, 위젯 위로 8 올라감 | 지름 30 진한 원 + 휴지통 16(흰색) · 그림자 0 2 4 · 25% |
| 수정 | 왼쪽 아래, 안쪽 12 | 높이 32 흰 사각(모서리 6) · 연필 16 + ‘수정’ 14. 2칸 폭 위젯은 아이콘만 |
| 크기 조절 | 오른쪽 아래 | 지름 30 진한 원 + 네 방향 화살표 · 터치 영역 44 |
위젯 본체, 미리보기, 디토 후광, 선택 테두리가 모두 같은 반경 Grid.radius(w)를 써요. 반경이 서로 다르면 후광과 테두리가 어긋나 보여요.
| 위젯 | 반경 |
|---|---|
| 음악 | 모든 크기 24 |
| 그 밖의 위젯 | min(20, 12 + (짧은 변 칸 − 2) × 2) → 2칸 12 · 3칸 14 · 4칸 16 · 6칸 이상 20 |
방명록은 서버에 저장돼요. 친구 누구나 안부를 남길 수 있고, 답글은 주인만 달 수 있어요.


| 상태 | 타일 | 상세 |
|---|---|---|
| 안부 없음 | ‘첫 안부를 기다려요. 짧은 한 줄을 남겨봐.’ · 아래 ‘첫 안부를 남겨봐’ | ‘첫 안부를 기다리고 있어요’ · ‘짧은 한 줄도 오래 남는 마음이 돼요.’ |
| 안부 있음 | 최근 안부(종이색 #FAF6ED 상자) · 제목 · ‘from. 이름 · 안부 남기기’ | 작성자(아바타 28) · 시간 · 글 · 주인의 답글 상자 |
| 답글 | — | 주인에게만 ‘답글 쓰기’/‘답글 수정’(터치 44). 저장 중이거나 이전 데이터인 안부에는 답글을 달 수 없어요 |
| 쓰기 | 타일을 누르면 상세 | 시트 ‘안부 남기기’/‘답글 쓰기’ · 최대 200자 · 빈 글은 저장 안 됨 |
타일 글자 수는 크기에 따라 달라요. 높이 150 미만은 2줄, 좁은 세로형은 6줄, 그 밖에는 3줄까지 보여요. 크기는 공통 12종을 모두 쓸 수 있어요. 친구 위젯 시트에도 최근 안부 4개를 미리 보여줘요.
카테고리별 할 일과 이번 주 기록을 보여줘요. 완료한 날은 숫자 대신 카테고리 색 배지로 쌓여요.
기준: TodoModel.swift · TodoWidget.swift. 완료율이나 ‘3/5’ 같은 숫자, 진행 막대는 쓰지 않아요(기획서 §2.6). 투두 완료는 피드에 올리지 않고, 디토할 수 없어요. To-do 토큰 JSON


| 항목 | 한도 |
|---|---|
| 카테고리 | 최대 5개 · 이름 8자 |
| 할 일 | 위젯 하나에 최대 20개 · 한 항목 30자 |
| 카테고리 없는 할 일 | ‘할 일’ 섹션으로 맨 앞에 모여요 |
체크 칸, 완료 배지, 칩에 같은 색을 써요. 위젯 표면은 항상 흰색이라 칩 바탕·글자는 고정값을, 시트는 어두운 화면용 값을 함께 써요. 새 카테고리에는 아직 쓰지 않은 색부터 주고, 기본 섹션 색은 현재 앱 아이콘 색 계열을 따라요.
어두운 화면의 칩 바탕은 채움색 24%예요. 빈 체크 칸·빈 배지는 #EEEDF2, 일요일은 #E5484D, 토요일은 #3D7BEA.
| 항목 | 규격 |
|---|---|
| 크기 | 상세 22 · 타일 13 · 모서리 = 크기 × 0.3(22에서 6.6) |
| 꺼짐 | 옅은 채움(타일은 #EEEDF2) |
| 켜짐 | 카테고리 채움색 + 흰 체크(크기 50%, 굵게) |
| 움직임 | 켤 때 0.8 → 1.14 → 1 스프링(0.08 · 0.14 · 0.22초). 움직임 줄이기에서는 크기 변화 없음 |
| 상태 | 모습 | 동작 |
|---|---|---|
| 기록 없음 | 빈 배지(모서리 둥근 사각, 34의 80%) | 누르면 그날 완료한 일만 보여줘요 |
| 기록 있음 | 그날 완료한 카테고리 색마다 체크 배지 하나. 1개 74% · 2개 62% · 3개 56% · 4개 52% 크기로 겹쳐 쌓고 흰 테두리로 구분(최대 4개) | 같음 |
| 오늘 | 날짜를 검은 원(30)에 흰 글자로 | 같음 |
| 선택 | 옅은 바탕 + 테두리(모서리 14) | 다시 누르면 전체 목록으로 |
| 미래 | 빈 배지 55% 투명 | 누를 수 없음 |
스크린 리더는 ‘10월 12일 월요일, 오늘’과 ‘완료 기록 있음/없음’을 읽어요.
크기는 3×4 · 4×4 · 4×3 · 6×2 네 가지예요. 타일 높이 150을 기준으로 두 가지 구성으로 나뉘어요.

| 구성 | 크기 | 내용 |
|---|---|---|
| 작은 타일 | 6×2 · 4×3 | 머리(색 점 + 제목, 폭이 넓으면 다음 할 일) · 7칸 미니 스트립(높이 32, 오늘 칸 강조) · 높이 110 이상이면 다음 할 일 1–2개 |
| 큰 타일 | 3×4 · 4×4 | 머리 · 카테고리 칩(높이 18, 글자 10/600) + 체크 행(16)을 높이 안에서 자름 · 높이 160 이상이면 아래에 미니 스트립 |
| 빈 상태 | 모두 | ‘할 일을 적어보세요’ · 모두 끝나면 ‘오늘 할 일을 다 했어요 ✨’ |
다음 빌드에서 바뀌는 점 (개발 중) 큰 타일에 다 들어가지 않는 항목은 ‘+N개 더’로, 모두 끝낸 날은 ‘모두 완료 · N개’로 알려줘요. 완료율이 아니라 남은 줄 수만 알려주는 표시예요.
어떤 위젯을 디토할 수 있는지, 몇 개까지 허용하는지, 디토할 수 있는 위젯을 어떻게 보여주는지 정리했어요.
기준: DittoAvailabilityBadge.swift · DittoBeam.swift · Overlays.swift(친구 위젯 시트) · WidgetDetailParts.swift. 글로우, 배지, 길게 누르기, 허용 토글은 모두 같은 판단(dittoable + allow)을 따라요. 디토 허용 토큰 JSON · 디토하기 버튼 →
| 위젯 | 디토 | 이유 |
|---|---|---|
| 디토로 가져온 위젯 | 불가 | 다시 디토하지 않아요. ‘{이름}님도 디토로 가져온 위젯이라 다시 디토할 수 없어요.’ |
| 스티커 보드 | 불가 | 친구들이 함께 채우는 보드예요. 서버도 허용을 꺼진 상태로 고정해요. |
| To-do | 불가 | 나의 할 일이에요(위젯명세 W-13). |
| 그 밖의 위젯 | 가능 | 주인이 ‘디토 허용’을 켰을 때만 가능해요. 기본은 꺼짐이에요. |
내 위젯 중 디토를 허용할 수 있는 위젯은 대표와 라이프를 합쳐 3개예요. 네 번째를 켜면 토글이 다시 꺼지고 ‘디토 허용은 3개까지예요. 다른 위젯의 허용을 먼저 꺼 주세요.’를 보여줘요. 수정 중인 위젯 자신은 세지 않아요.
| 어디서 | 허용 토글 |
|---|---|
| 작성 화면 · 옵션 | 이미지·GIF. ‘디토 가능하도록 허용’ · 켜면 ‘친구들이 이 위젯을 디토해갈 수 있어요 · 라이브 3개 한도’, 꺼지면 ‘허용은 의도적 행위예요 — 출품의 의미’. 켜진 동안 보라 테두리 1.2 |
| 위젯 관리 시트 | 디토할 수 있는 종류면 ‘디토 허용’ 행을 보여줘요 |
| 저장할 때 | 한 번 더 3개 한도를 확인해요 |

헷갈리기 쉬운 두 한도: 주인이 허용할 수 있는 위젯 3개와, 내가 라이프 플래터에 가져올 수 있는 디토 3칸은 서로 달라요. 라이프 3칸이 가득 차면 거절하지 않고 바꿀 디토를 고르게 해요(‘이 슬롯은 디토가 가득 찼어요!’). 이미 디토된 위젯(허용 + 1회 이상)은 내용을 수정할 수 없어요.
| 항목 | 규격 |
|---|---|
| 위치 | 위젯 뒤. 위젯 위에는 아무것도 그리지 않고, 터치는 통과해요 |
| 모양 | 위젯을 사방 3 키운 같은 모양, 반경 = 위젯 반경 + 3 |
| 색 | 현재 앱 아이콘 색 계열 3색. 앱 아이콘을 바꾸면 후광도 바뀌어요 |
| 두 겹 | 넓은 층: 왼쪽 위 → 오른쪽 아래 그라디언트, 흐림 9 · 가까운 층: 위 → 아래, 흐림 4, 55% |
| 움직임 | 2.8초 주기 숨쉬기만. 투명도 30–52%, 크기 100–101.5%. 회전·흐르는 빛줄기는 쓰지 않아요(2026-10-09) |
| 움직임 줄이기 | 멈춘 후광(중간값) |
| 상태 | 배지 |
|---|---|
| 디토 가능 | 후광 + 오른쪽 아래(안쪽 8)에 디토 아이콘 24, 얕은 그림자. 누르면 디토 시트를 열어요. 스크린 리더 ‘디토 가능 · 꾹 눌러 가져오기’ |
| 이미 디토함 | 후광 없이 오른쪽 위(안쪽 8)에 디토 아이콘 24. 표시 전용 · ‘이미 디토한 위젯’ |
| 불가 | 아무것도 그리지 않아요 |

친구 위젯을 누르면 내용 높이의 시트 하나에서 바로 디토해요. 머리(왼쪽 닫기 · 가운데 제목) → 미리보기 140 → 제목 → 출처 → 상태별 영역 순서예요.




다음 빌드에서 바뀌는 점 (개발 중) 시트의 주제가 디토에서 위젯으로 바뀌어요. 제목은 위젯 종류(예: ‘사진 위젯’), 출처는 ‘○○님의 위젯’(디토로 가져온 위젯만 ‘…에게서 가져옴’)이고, 종류별 행동(원본 크게 보기 · 영상 재생 · 링크 · 전문)과 댓글 아래에 디토 카드가 붙어요. 디토 카드는 ‘담을 수 있어요 · 담았어요 · 담을 수 없어요 + 이유’ 세 상태이고, 디토할 수 없는 종류(스티커 보드 · To-do)도 이유와 함께 보여줘요.