oh-my-design-cli 1.8.7 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/hooks/lib/preferences-parser.cjs +1 -0
- package/.claude/hooks/lib/preferences-writer.cjs +1 -0
- package/.claude/hooks/post-edit-watch.cjs +1 -0
- package/.claude/hooks/session-end-foldin.cjs +1 -0
- package/.claude/hooks/session-state-loader.cjs +1 -0
- package/.claude/hooks/skill-activation.cjs +1 -0
- package/.claude/settings.json +10 -1
- package/.github/assets/logo-bg.png +0 -0
- package/AGENTS.md +20 -1
- package/CHANGELOG.md +482 -0
- package/MIGRATION.md +103 -0
- package/README.ja.md +56 -19
- package/README.ko.md +47 -30
- package/README.md +48 -30
- package/README.zh-TW.md +59 -22
- package/agents/AGENT.md +8 -7
- package/agents/omd-codex-image.md +1 -1
- package/agents/omd-critic.md +6 -7
- package/agents/omd-designer-review.md +1 -1
- package/agents/omd-final-qa.md +1 -1
- package/agents/omd-humanizer.md +38 -0
- package/agents/omd-kr-writer.md +3 -4
- package/agents/omd-locale-adapter.md +12 -16
- package/agents/omd-master.md +24 -19
- package/agents/omd-microcopy.md +1 -1
- package/agents/omd-orchestrator.md +7 -8
- package/agents/omd-slop-auditor.md +31 -0
- package/agents/omd-ux-researcher.md +1 -1
- package/data/reference-fingerprints.json +1995 -38
- package/dist/bin/oh-my-design.js +16 -8
- package/dist/bin/oh-my-design.js.map +1 -1
- package/dist/chunk-UJIHCEYF.js +99 -0
- package/dist/chunk-UJIHCEYF.js.map +1 -0
- package/dist/doctor-LDWSFM3I.js +763 -0
- package/dist/doctor-LDWSFM3I.js.map +1 -0
- package/dist/install-skills-ZZFNJ2II.js +1120 -0
- package/dist/install-skills-ZZFNJ2II.js.map +1 -0
- package/docs/CLI_QUICKSTART.md +157 -0
- package/package.json +25 -4
- package/scripts/postinstall.cjs +5 -4
- package/skills/claude-design/SKILL.md +38 -14
- package/skills/claude-design/references/claude-design-flow.md +11 -11
- package/skills/claude-design/references/codebase-analysis.md +5 -4
- package/skills/omd-final-qa/SKILL.md +1 -1
- package/skills/omd-harness/SKILL.md +51 -50
- package/skills/omd-humanize/SKILL.md +116 -0
- package/skills/omd-humanize/agents/openai.yaml +4 -0
- package/skills/omd-humanize/references/locale-playbooks.md +102 -0
- package/skills/omd-humanize/references/sources.md +11 -0
- package/skills/omd-init/SKILL.md +18 -12
- package/skills/omd-locale-adapter/SKILL.md +58 -91
- package/skills/omd-orchestrator/SKILL.md +11 -5
- package/skills/omd-reference-capture/SKILL.md +80 -26
- package/skills/omd-reference-capture/scripts/PLAYWRIGHT-LICENSE.txt +202 -0
- package/skills/omd-reference-capture/scripts/PLAYWRIGHT-NOTICE.txt +5 -0
- package/skills/omd-reference-capture/scripts/THIRD_PARTY_NOTICES.md +3 -0
- package/skills/omd-reference-capture/scripts/capture-reference-evidence.mjs +159906 -0
- package/skills/omd-slop-audit/SKILL.md +110 -0
- package/skills/omd-slop-audit/agents/openai.yaml +4 -0
- package/skills/omd-slop-audit/references/pattern-catalog.md +96 -0
- package/skills/omd-slop-audit/references/sources.md +24 -0
- package/web/references/104/DESIGN.md +354 -0
- package/web/references/11st/DESIGN.md +197 -316
- package/web/references/29cm/DESIGN.md +297 -393
- package/web/references/42dot/DESIGN.md +390 -0
- package/web/references/8percent/DESIGN.md +438 -0
- package/web/references/ably/DESIGN.md +267 -572
- package/web/references/acer/DESIGN.md +329 -0
- package/web/references/airbnb/DESIGN.md +219 -557
- package/web/references/alipay/DESIGN.md +179 -420
- package/web/references/apple/DESIGN.md +224 -498
- package/web/references/asleep/DESIGN.md +402 -0
- package/web/references/au/DESIGN.md +334 -0
- package/web/references/autopedia/DESIGN.md +382 -0
- package/web/references/aws-cloudscape/DESIGN.md +241 -0
- package/web/references/baemin/DESIGN.md +332 -491
- package/web/references/banksalad/DESIGN.md +269 -180
- package/web/references/barogo/DESIGN.md +416 -0
- package/web/references/beusable/DESIGN.md +464 -0
- package/web/references/bilibili/DESIGN.md +206 -374
- package/web/references/bmw/DESIGN.md +162 -276
- package/web/references/brandi/DESIGN.md +184 -325
- package/web/references/catchtable/DESIGN.md +219 -264
- package/web/references/cgv/DESIGN.md +317 -0
- package/web/references/channeltalk/DESIGN.md +210 -336
- package/web/references/china-airlines/DESIGN.md +291 -0
- package/web/references/cjonstyle/DESIGN.md +453 -0
- package/web/references/class101/DESIGN.md +168 -387
- package/web/references/classum/DESIGN.md +228 -203
- package/web/references/claude/DESIGN.md +242 -479
- package/web/references/clay/DESIGN.md +179 -377
- package/web/references/clickhouse/DESIGN.md +254 -343
- package/web/references/cohere/DESIGN.md +214 -324
- package/web/references/coinone/DESIGN.md +199 -179
- package/web/references/corca/DESIGN.md +414 -0
- package/web/references/coupang/DESIGN.md +205 -475
- package/web/references/cursor/DESIGN.md +240 -381
- package/web/references/dabang/DESIGN.md +248 -213
- package/web/references/dable/DESIGN.md +431 -0
- package/web/references/datarize/DESIGN.md +217 -330
- package/web/references/dealicious/DESIGN.md +402 -0
- package/web/references/drdiary/DESIGN.md +404 -0
- package/web/references/elastic/DESIGN.md +238 -0
- package/web/references/elevenlabs/DESIGN.md +183 -321
- package/web/references/eslite/DESIGN.md +257 -0
- package/web/references/evaair/DESIGN.md +338 -0
- package/web/references/expo/DESIGN.md +238 -331
- package/web/references/familymart-tw/DESIGN.md +254 -0
- package/web/references/ferrari/DESIGN.md +160 -377
- package/web/references/figma/DESIGN.md +197 -451
- package/web/references/fitpet/DESIGN.md +445 -0
- package/web/references/flex/DESIGN.md +170 -253
- package/web/references/framer/DESIGN.md +197 -340
- package/web/references/freee/DESIGN.md +211 -533
- package/web/references/friendliai/DESIGN.md +431 -0
- package/web/references/frip/DESIGN.md +440 -0
- package/web/references/gangnamunni/DESIGN.md +154 -591
- package/web/references/gaudiolab/DESIGN.md +414 -0
- package/web/references/google/DESIGN.md +290 -398
- package/web/references/hashicorp/DESIGN.md +273 -318
- package/web/references/heydealer/DESIGN.md +429 -0
- package/web/references/humanscape/DESIGN.md +433 -0
- package/web/references/hyundai/DESIGN.md +158 -368
- package/web/references/hyundaicard/DESIGN.md +171 -121
- package/web/references/ibm/DESIGN.md +227 -378
- package/web/references/idus/DESIGN.md +450 -0
- package/web/references/igaworks/DESIGN.md +437 -0
- package/web/references/inflearn/DESIGN.md +221 -366
- package/web/references/intuit/DESIGN.md +244 -0
- package/web/references/jandi/DESIGN.md +191 -291
- package/web/references/jobplanet/DESIGN.md +415 -0
- package/web/references/kakao/DESIGN.md +287 -475
- package/web/references/kakaobank/DESIGN.md +220 -521
- package/web/references/kakaogames/DESIGN.md +220 -0
- package/web/references/kakaopay/DESIGN.md +207 -526
- package/web/references/karrot/DESIGN.md +227 -251
- package/web/references/kb-kookmin/DESIGN.md +308 -0
- package/web/references/kbank/DESIGN.md +220 -175
- package/web/references/kmong/DESIGN.md +281 -356
- package/web/references/krds/DESIGN.md +245 -19
- package/web/references/kream/DESIGN.md +224 -359
- package/web/references/kurly/DESIGN.md +211 -533
- package/web/references/lamborghini/DESIGN.md +198 -360
- package/web/references/lguplus/DESIGN.md +259 -0
- package/web/references/likelion/DESIGN.md +283 -0
- package/web/references/line/DESIGN.md +396 -355
- package/web/references/linear.app/DESIGN.md +209 -562
- package/web/references/lotteon/DESIGN.md +386 -0
- package/web/references/lovable/DESIGN.md +255 -349
- package/web/references/makinarocks/DESIGN.md +149 -349
- package/web/references/maum-ai/DESIGN.md +423 -0
- package/web/references/medibloc/DESIGN.md +425 -0
- package/web/references/megabox/DESIGN.md +232 -0
- package/web/references/mercari/DESIGN.md +217 -434
- package/web/references/microsoft/DESIGN.md +234 -388
- package/web/references/mildang/DESIGN.md +411 -0
- package/web/references/millie/DESIGN.md +183 -504
- package/web/references/minimax/DESIGN.md +264 -322
- package/web/references/miricanvas/DESIGN.md +182 -355
- package/web/references/miro/DESIGN.md +234 -232
- package/web/references/mistral.ai/DESIGN.md +231 -314
- package/web/references/mixi/DESIGN.md +234 -0
- package/web/references/moin/DESIGN.md +445 -0
- package/web/references/mongodb/DESIGN.md +219 -316
- package/web/references/musinsa/DESIGN.md +184 -510
- package/web/references/mynavi/DESIGN.md +242 -0
- package/web/references/myrealtrip/DESIGN.md +169 -406
- package/web/references/naver/DESIGN.md +328 -499
- package/web/references/naverwebtoon/DESIGN.md +172 -395
- package/web/references/nhn/DESIGN.md +169 -346
- package/web/references/nhncloud/DESIGN.md +185 -123
- package/web/references/notion/DESIGN.md +271 -475
- package/web/references/nrise/DESIGN.md +417 -0
- package/web/references/ohouse/DESIGN.md +210 -549
- package/web/references/oliveyoung/DESIGN.md +217 -326
- package/web/references/ollama/DESIGN.md +241 -308
- package/web/references/onestore/DESIGN.md +248 -0
- package/web/references/palantir/DESIGN.md +256 -0
- package/web/references/panasonic/DESIGN.md +276 -0
- package/web/references/patternfly/DESIGN.md +259 -0
- package/web/references/payhere/DESIGN.md +438 -0
- package/web/references/pega/DESIGN.md +262 -0
- package/web/references/peoplefund/DESIGN.md +431 -0
- package/web/references/petfriends/DESIGN.md +428 -0
- package/web/references/pinkfong/DESIGN.md +199 -367
- package/web/references/pinterest/DESIGN.md +258 -308
- package/web/references/poya/DESIGN.md +286 -0
- package/web/references/pozalabs/DESIGN.md +438 -0
- package/web/references/protopie/DESIGN.md +419 -0
- package/web/references/qraft/DESIGN.md +448 -0
- package/web/references/quotabook/DESIGN.md +449 -0
- package/web/references/recruit/DESIGN.md +247 -0
- package/web/references/remember/DESIGN.md +202 -396
- package/web/references/resend/DESIGN.md +274 -348
- package/web/references/sakura-internet/DESIGN.md +269 -0
- package/web/references/samsung/DESIGN.md +157 -359
- package/web/references/sandoll/DESIGN.md +445 -0
- package/web/references/sanity/DESIGN.md +241 -375
- package/web/references/scatterlab/DESIGN.md +412 -0
- package/web/references/selectstar/DESIGN.md +439 -0
- package/web/references/servicenow/DESIGN.md +289 -0
- package/web/references/shinhanbank/DESIGN.md +161 -341
- package/web/references/shinhancard/DESIGN.md +208 -319
- package/web/references/sionic/DESIGN.md +454 -0
- package/web/references/sktelecom/DESIGN.md +310 -0
- package/web/references/socar/DESIGN.md +125 -32
- package/web/references/softbank/DESIGN.md +231 -0
- package/web/references/sony/DESIGN.md +234 -0
- package/web/references/soop/DESIGN.md +261 -0
- package/web/references/spacex/DESIGN.md +184 -323
- package/web/references/spotify/DESIGN.md +253 -394
- package/web/references/squeezebits/DESIGN.md +441 -0
- package/web/references/stayfolio/DESIGN.md +422 -0
- package/web/references/stripe/DESIGN.md +212 -491
- package/web/references/supabase/DESIGN.md +244 -316
- package/web/references/tabling/DESIGN.md +415 -0
- package/web/references/taishinbank/DESIGN.md +243 -0
- package/web/references/teamlab/DESIGN.md +240 -0
- package/web/references/teamsparta/DESIGN.md +472 -0
- package/web/references/tellingme/DESIGN.md +392 -0
- package/web/references/tesla/DESIGN.md +244 -427
- package/web/references/thsr/DESIGN.md +284 -0
- package/web/references/thumbtack/DESIGN.md +302 -0
- package/web/references/together.ai/DESIGN.md +257 -304
- package/web/references/toss/DESIGN.md +251 -593
- package/web/references/toss-securities/DESIGN.md +255 -178
- package/web/references/tossbank/DESIGN.md +195 -491
- package/web/references/toyota/DESIGN.md +238 -0
- package/web/references/tving/DESIGN.md +197 -245
- package/web/references/typed/DESIGN.md +413 -0
- package/web/references/uber/DESIGN.md +256 -333
- package/web/references/udn/DESIGN.md +250 -0
- package/web/references/upbit/DESIGN.md +145 -256
- package/web/references/upstage/DESIGN.md +211 -204
- package/web/references/uswds/DESIGN.md +287 -0
- package/web/references/vercel/DESIGN.md +236 -440
- package/web/references/wanted/DESIGN.md +215 -487
- package/web/references/wise/DESIGN.md +223 -231
- package/web/references/wisetracker/DESIGN.md +462 -0
- package/web/references/wooribank/DESIGN.md +245 -0
- package/web/references/yanolja/DESIGN.md +250 -419
- package/web/references/yeogiotte/DESIGN.md +235 -418
- package/web/references/zapier/DESIGN.md +256 -377
- package/web/references/zendesk/DESIGN.md +288 -0
- package/web/references/zigzag/DESIGN.md +200 -621
- package/dist/install-skills-7UUDOLG2.js +0 -734
- package/dist/install-skills-7UUDOLG2.js.map +0 -1
|
@@ -8,691 +8,349 @@ primary_color: "#0064ff"
|
|
|
8
8
|
logo:
|
|
9
9
|
type: favicon
|
|
10
10
|
slug: "https://static.toss.im/icons/png/4x/icon-toss-logo.png"
|
|
11
|
-
verified: "2026-
|
|
11
|
+
verified: "2026-07-11"
|
|
12
12
|
omd: "0.1"
|
|
13
13
|
ds:
|
|
14
|
-
name: TDS
|
|
14
|
+
name: TDS Mobile
|
|
15
15
|
url: "https://tossmini-docs.toss.im/tds-mobile/"
|
|
16
16
|
type: system
|
|
17
|
-
description: Toss's mobile design
|
|
17
|
+
description: Toss's public mobile design-system documentation.
|
|
18
|
+
verification_v2:
|
|
19
|
+
schema: 2
|
|
20
|
+
checked: "2026-07-11"
|
|
21
|
+
surfaces:
|
|
22
|
+
- { id: marketing-home, kind: marketing, url: "https://toss.im/", inspected: "2026-07-11" }
|
|
23
|
+
- { id: marketing-story, kind: marketing, url: "https://toss.im/docs/10290", inspected: "2026-07-11" }
|
|
24
|
+
- { id: tds-button, kind: design-system, url: "https://tossmini-docs.toss.im/tds-mobile/components/button/", inspected: "2026-07-11" }
|
|
25
|
+
- { id: tds-agreement-v3, kind: design-system, url: "https://tossmini-docs.toss.im/tds-mobile/components/Agreement/v3/", inspected: "2026-07-11" }
|
|
26
|
+
- { id: tds-agreement-v4, kind: design-system, url: "https://tossmini-docs.toss.im/tds-mobile/components/Agreement/v4/", inspected: "2026-07-11" }
|
|
27
|
+
sources:
|
|
28
|
+
- { id: toss-live, kind: product-surface, url: "https://toss.im/", captured: "2026-07-11" }
|
|
29
|
+
- { id: tds-button-live, kind: official-doc, url: "https://tossmini-docs.toss.im/tds-mobile/components/button/", captured: "2026-07-11" }
|
|
30
|
+
- { id: tds-text-field, kind: official-doc, url: "https://tossmini-docs.toss.im/tds-mobile/components/TextField/text-field/", captured: "2026-07-11" }
|
|
31
|
+
- { id: tds-badge, kind: official-doc, url: "https://tossmini-docs.toss.im/tds-mobile/components/badge/", captured: "2026-07-11" }
|
|
32
|
+
- { id: tds-agreement, kind: official-doc, url: "https://tossmini-docs.toss.im/tds-mobile/components/Agreement/v4/", captured: "2026-07-11" }
|
|
33
|
+
claims:
|
|
34
|
+
"tokens.colors.primary": &tds_button { surface_id: tds-button, source_id: tds-button-live, method: computed-style-and-official-doc, captured: "2026-07-11" }
|
|
35
|
+
"tokens.colors.primary-hover": *tds_button
|
|
36
|
+
"tokens.colors.canvas": &toss_live { surface_id: marketing-home, source_id: toss-live, method: computed-style, captured: "2026-07-11" }
|
|
37
|
+
"tokens.colors.foreground": *toss_live
|
|
38
|
+
"tokens.colors.body": *toss_live
|
|
39
|
+
"tokens.colors.muted": *toss_live
|
|
40
|
+
"tokens.colors.surface": *toss_live
|
|
41
|
+
"tokens.colors.border": *toss_live
|
|
42
|
+
"tokens.colors.on-primary": *tds_button
|
|
43
|
+
"tokens.colors.weak-background": *toss_live
|
|
44
|
+
"tokens.colors.weak-foreground": *toss_live
|
|
45
|
+
"tokens.colors.danger": *tds_button
|
|
46
|
+
"tokens.typography.family.sans": *tds_button
|
|
47
|
+
"tokens.typography.h1.size": *tds_button
|
|
48
|
+
"tokens.typography.h1.weight": *tds_button
|
|
49
|
+
"tokens.typography.h1.lineHeight": *tds_button
|
|
50
|
+
"tokens.typography.h2.size": *tds_button
|
|
51
|
+
"tokens.typography.h2.weight": *tds_button
|
|
52
|
+
"tokens.typography.h2.lineHeight": *tds_button
|
|
53
|
+
"tokens.typography.h3.size": *tds_button
|
|
54
|
+
"tokens.typography.h3.weight": *tds_button
|
|
55
|
+
"tokens.typography.h3.lineHeight": *tds_button
|
|
56
|
+
"tokens.typography.h4.size": *tds_button
|
|
57
|
+
"tokens.typography.h4.weight": *tds_button
|
|
58
|
+
"tokens.typography.h4.lineHeight": *tds_button
|
|
59
|
+
"tokens.typography.body.size": *tds_button
|
|
60
|
+
"tokens.typography.body.weight": *tds_button
|
|
61
|
+
"tokens.typography.body.lineHeight": *tds_button
|
|
62
|
+
"tokens.typography.body-small.size": *tds_button
|
|
63
|
+
"tokens.typography.body-small.weight": *tds_button
|
|
64
|
+
"tokens.typography.body-small.lineHeight": *tds_button
|
|
65
|
+
"tokens.spacing.xs": *tds_button
|
|
66
|
+
"tokens.spacing.sm": *tds_button
|
|
67
|
+
"tokens.spacing.md": *tds_button
|
|
68
|
+
"tokens.spacing.lg": *tds_button
|
|
69
|
+
"tokens.spacing.xl": *tds_button
|
|
70
|
+
"tokens.spacing.xxl": *tds_button
|
|
71
|
+
"tokens.rounded.sm": *tds_button
|
|
72
|
+
"tokens.rounded.md": *tds_button
|
|
73
|
+
"tokens.rounded.button-small": *tds_button
|
|
74
|
+
"tokens.rounded.button-medium": *tds_button
|
|
75
|
+
"tokens.rounded.button-large": *tds_button
|
|
76
|
+
"tokens.rounded.button-xlarge": *tds_button
|
|
77
|
+
"tokens.components.tds-button.type": *tds_button
|
|
78
|
+
"tokens.components.tds-button.bg": *tds_button
|
|
79
|
+
"tokens.components.tds-button.fg": *tds_button
|
|
80
|
+
"tokens.components.tds-button.radius": *tds_button
|
|
81
|
+
"tokens.components.tds-button.height": *tds_button
|
|
82
|
+
"tokens.components.tds-button.padding": *tds_button
|
|
83
|
+
"tokens.components.tds-button.font": *tds_button
|
|
84
|
+
"tokens.components.tds-button.states": *tds_button
|
|
85
|
+
"tokens.components.tds-button.use": *tds_button
|
|
86
|
+
"tokens.components.text-field.type": &tds_field { surface_id: tds-button, source_id: tds-text-field, method: official-doc, captured: "2026-07-11" }
|
|
87
|
+
"tokens.components.text-field.states": *tds_field
|
|
88
|
+
"tokens.components.text-field.use": *tds_field
|
|
89
|
+
"tokens.components.badge.type": &tds_badge_claim { surface_id: tds-button, source_id: tds-badge, method: official-doc, captured: "2026-07-11" }
|
|
90
|
+
"tokens.components.badge.states": *tds_badge_claim
|
|
91
|
+
"tokens.components.badge.use": *tds_badge_claim
|
|
92
|
+
"tokens.components.agreement.type": &tds_agreement_claim { surface_id: tds-agreement-v4, source_id: tds-agreement, method: computed-style-and-official-doc, captured: "2026-07-11" }
|
|
93
|
+
"tokens.components.agreement.states": *tds_agreement_claim
|
|
94
|
+
"tokens.components.agreement.use": *tds_agreement_claim
|
|
95
|
+
"tokens.components.marketing-primary.type": *toss_live
|
|
96
|
+
"tokens.components.marketing-primary.bg": *toss_live
|
|
97
|
+
"tokens.components.marketing-primary.fg": *toss_live
|
|
98
|
+
"tokens.components.marketing-primary.radius": *toss_live
|
|
99
|
+
"tokens.components.marketing-primary.height": *toss_live
|
|
100
|
+
"tokens.components.marketing-primary.padding": *toss_live
|
|
101
|
+
"tokens.components.marketing-primary.font": *toss_live
|
|
102
|
+
"tokens.components.marketing-primary.states": *toss_live
|
|
103
|
+
"tokens.components.marketing-primary.use": *toss_live
|
|
104
|
+
"tokens.components.marketing-dark.type": *toss_live
|
|
105
|
+
"tokens.components.marketing-dark.bg": *toss_live
|
|
106
|
+
"tokens.components.marketing-dark.fg": *toss_live
|
|
107
|
+
"tokens.components.marketing-dark.radius": *toss_live
|
|
108
|
+
"tokens.components.marketing-dark.height": *toss_live
|
|
109
|
+
"tokens.components.marketing-dark.padding": *toss_live
|
|
110
|
+
"tokens.components.marketing-dark.font": *toss_live
|
|
111
|
+
"tokens.components.marketing-dark.states": *toss_live
|
|
112
|
+
"tokens.components.marketing-dark.use": *toss_live
|
|
113
|
+
conflicts: []
|
|
18
114
|
tokens:
|
|
19
115
|
source: reconciled
|
|
20
|
-
extracted: "2026-
|
|
21
|
-
note: "
|
|
116
|
+
extracted: "2026-07-11"
|
|
117
|
+
note: "TDS Mobile product tokens and toss.im marketing variants are intentionally separate."
|
|
22
118
|
colors:
|
|
23
119
|
primary: "#3182f6"
|
|
24
120
|
primary-hover: "#2272eb"
|
|
25
|
-
brand: "#0064ff"
|
|
26
|
-
brand-gray: "#202632"
|
|
27
121
|
canvas: "#ffffff"
|
|
28
122
|
foreground: "#191f28"
|
|
29
|
-
|
|
30
|
-
grey-600: "#4e5968"
|
|
123
|
+
body: "#4e5968"
|
|
31
124
|
muted: "#8b95a1"
|
|
32
125
|
surface: "#f2f4f6"
|
|
33
126
|
border: "#e5e8eb"
|
|
34
127
|
on-primary: "#ffffff"
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
128
|
+
weak-background: "#e8f3ff"
|
|
129
|
+
weak-foreground: "#1b64da"
|
|
130
|
+
danger: "#e42939"
|
|
38
131
|
typography:
|
|
39
|
-
family: { sans: "Toss Product Sans"
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
body-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
spacing: { xs: 4, sm: 8, md: 12, base: 16, lg: 24, xl: 32, xxl: 48 }
|
|
49
|
-
rounded: { sm: 4, md: 8, lg: 16, full: 9999 }
|
|
50
|
-
shadow:
|
|
51
|
-
subtle: "0px 1px 3px rgba(0,0,0,0.06)"
|
|
52
|
-
standard: "0px 2px 8px rgba(0,0,0,0.08)"
|
|
53
|
-
elevated: "0px 4px 12px rgba(0,0,0,0.12)"
|
|
132
|
+
family: { sans: "Toss Product Sans" }
|
|
133
|
+
h1: { size: 36, weight: 700, lineHeight: "54px" }
|
|
134
|
+
h2: { size: 30, weight: 600, lineHeight: "45px" }
|
|
135
|
+
h3: { size: 24, weight: 600, lineHeight: "36px" }
|
|
136
|
+
h4: { size: 22, weight: 600, lineHeight: "33px" }
|
|
137
|
+
body: { size: 16, weight: 400, lineHeight: "24px" }
|
|
138
|
+
body-small: { size: 14, weight: 400, lineHeight: "21px" }
|
|
139
|
+
spacing: { xs: 4, sm: 6, md: 8, lg: 16, xl: 24, xxl: 32 }
|
|
140
|
+
rounded: { sm: 4, md: 6, button-small: 8, button-medium: 10, button-large: 14, button-xlarge: 16 }
|
|
54
141
|
components_harvested: true
|
|
55
142
|
components:
|
|
56
|
-
button
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
143
|
+
tds-button: { type: button, bg: "#3182f6", fg: "#ffffff", radius: "16px", height: "56px", padding: "0 20px", font: "17px / 600", states: "fill or weak; primary, danger, light, or dark; loading, disabled, pressed, and keyboard focus", use: "TDS Mobile xlarge primary action" }
|
|
144
|
+
text-field: { type: input, states: "box, line, big, hero; focus, error, disabled, read-only", use: "TDS Mobile text entry with help or error text" }
|
|
145
|
+
badge: { type: badge, states: "fill or weak; xsmall, small, medium, large; semantic color variants", use: "TDS Mobile status or category label; not an action" }
|
|
146
|
+
agreement: { type: toggle, states: "checked, unchecked, disabled, and nested agreement hierarchy", use: "TDS Mobile terms selection in v3 and v4 surfaces" }
|
|
147
|
+
marketing-primary: { type: button, bg: "#e8f3ff", fg: "#1b64da", radius: "7px", height: "40px", padding: "11px 16px", font: "15px / 600", states: "default observed; hover not captured in the retained evidence bundle", use: "toss.im light-blue marketing CTA" }
|
|
148
|
+
marketing-dark: { type: button, bg: "rgba(0, 12, 30, 0.8)", fg: "#ffffff", radius: "7px", height: "46px", padding: "11px 16px", font: "17px / 600", states: "default observed; hover not captured in the retained evidence bundle", use: "toss.im app-store style CTA" }
|
|
61
149
|
---
|
|
62
150
|
|
|
63
151
|
# Design System Inspiration of Toss (토스)
|
|
64
152
|
|
|
65
153
|
## 1. Visual Theme & Atmosphere
|
|
66
154
|
|
|
67
|
-
Toss is
|
|
155
|
+
Toss is a unified financial platform that tries to make consequential money decisions feel answerable, immediate, and visually calm. Its public design spans two related but distinct systems: TDS Mobile documents product UI with large, touch-oriented controls and explicit state contracts, while `toss.im` uses a tighter marketing-web button system. Across both, a strong blue action color, plain language, generous hierarchy, and purpose-built typography reduce the institutional distance people often feel around finance. This reference keeps product and marketing surfaces separate instead of forcing their geometry into one false universal component.
|
|
68
156
|
|
|
69
|
-
The
|
|
70
|
-
|
|
71
|
-
What defines Toss visually is its OKLCH-based color system, rebuilt from scratch for perceptual uniformity. Colors at the same scale level appear equally bright regardless of hue, enabling consistent semantic coloring where blue-500, red-500, and green-500 carry identical visual weight without manual tuning.
|
|
157
|
+
The verified common language is Toss Product Sans, a bright blue interaction accent, warm blue-grey neutrals, and direct hierarchy. Exact values below are limited to current computed styles or current official TDS documentation.
|
|
72
158
|
|
|
73
159
|
**Key Characteristics:**
|
|
74
|
-
-
|
|
75
|
-
- Toss Product Sans
|
|
76
|
-
-
|
|
77
|
-
-
|
|
78
|
-
- Three-tier token architecture: primitive → semantic → component
|
|
79
|
-
- Minimal shadow system -- trust comes from clarity, not depth
|
|
80
|
-
- Mobile-first at 375px design baseline with accessibility scaling up to 310%
|
|
160
|
+
- Product primary `#3182f6`; marketing weak CTA `#e8f3ff` / `#1b64da`
|
|
161
|
+
- Toss Product Sans loaded and used across all 810 visible TDS observations
|
|
162
|
+
- Four documented TDS button sizes with explicit loading and disabled behavior
|
|
163
|
+
- Surface-specific component geometry rather than one blended “Toss style”
|
|
81
164
|
|
|
82
165
|
## 2. Color Palette & Roles
|
|
83
166
|
|
|
84
|
-
###
|
|
85
|
-
- **
|
|
86
|
-
- **
|
|
87
|
-
- **
|
|
88
|
-
- **
|
|
89
|
-
- **
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
- **
|
|
93
|
-
- **
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
-
|
|
97
|
-
- **
|
|
98
|
-
-
|
|
99
|
-
- **Caution Yellow** (`#ffc342`): `yellow500`. Soft warnings, highlight moments.
|
|
100
|
-
- **Info Teal** (`#18a5a5`): `teal500`. Informational accent, alternative categorization.
|
|
101
|
-
- **Premium Purple** (`#a234c7`): `purple500`. Premium features, special offers.
|
|
102
|
-
|
|
103
|
-
### Neutral Scale
|
|
104
|
-
- **Grey 50** (`#f9fafb`): Lightest gray, `greyBackground` surface.
|
|
105
|
-
- **Grey 100** (`#f2f4f6`): Secondary background, card fills, disabled surfaces.
|
|
106
|
-
- **Grey 200** (`#e5e8eb`): Default border color, dividers, input backgrounds.
|
|
107
|
-
- **Grey 400** (`#b0b8c1`): Placeholder text, disabled icon fills.
|
|
108
|
-
- **Grey 500** (`#8b95a1`): Caption text, secondary labels.
|
|
109
|
-
- **Grey 600** (`#6b7684`): Body text, descriptions, metadata.
|
|
110
|
-
- **Grey 700** (`#4e5968`): Emphasized body text, sub-headings.
|
|
111
|
-
- **Grey 800** (`#333d4b`): Strong labels, navigation text.
|
|
112
|
-
|
|
113
|
-
### Surface & Borders
|
|
114
|
-
- **Border Default**: `#e5e8eb` (grey200). Standard card borders, input borders, dividers.
|
|
115
|
-
- **Border Strong**: `#d1d6db` (grey300). Emphasized borders, active input outlines.
|
|
116
|
-
- **Background Float**: `#ffffff`. `floatBackground`. Floating elements -- tooltips, dropdowns.
|
|
117
|
-
- **Overlay Scrim**: `rgba(2,9,19,0.5)` to `rgba(2,9,19,0.91)`. `greyOpacity` scale. Blue-tinted dark overlays.
|
|
167
|
+
### Product and shared roles
|
|
168
|
+
- **Primary** (`#3182f6`): TDS interaction blue and primary action reference.
|
|
169
|
+
- **Primary Hover / Strong Blue** (`#2272eb`): stronger blue visible in current TDS documentation.
|
|
170
|
+
- **Canvas** (`#ffffff`): principal light background.
|
|
171
|
+
- **Foreground** (`#191f28`): strongest product text.
|
|
172
|
+
- **Body** (`#4e5968`): emphasized body and neutral action text.
|
|
173
|
+
- **Muted** (`#8b95a1`): secondary product text.
|
|
174
|
+
- **Surface** (`#f2f4f6`): quiet neutral layer.
|
|
175
|
+
- **Border** (`#e5e8eb`): light divider or outline reference.
|
|
176
|
+
- **On Primary** (`#ffffff`): text on filled primary actions.
|
|
177
|
+
- **Danger** (`#e42939`): destructive/error text observed in the current TDS page.
|
|
178
|
+
|
|
179
|
+
### Marketing-web roles
|
|
180
|
+
- **Weak Background** (`#e8f3ff`) and **Weak Foreground** (`#1b64da`): current light-blue `toss.im` CTA pair.
|
|
181
|
+
- The official logo/brand blue in frontmatter is catalog identity metadata; do not substitute it for the verified UI primary `#3182f6`.
|
|
118
182
|
|
|
119
183
|
## 3. Typography Rules
|
|
120
184
|
|
|
121
185
|
### Font Family
|
|
122
|
-
- **
|
|
123
|
-
- **
|
|
124
|
-
- **
|
|
125
|
-
|
|
126
|
-
### Hierarchy
|
|
127
|
-
|
|
128
|
-
| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|
|
129
|
-
|------|------|------|--------|-------------|----------------|-------|
|
|
130
|
-
| Display Hero | Toss Product Sans | 30px | 700 | 40px (1.33) | normal | Splash screens, hero moments |
|
|
131
|
-
| Display Large | Toss Product Sans | 26px | 700 | 36px (1.38) | normal | Section headers, key metrics |
|
|
132
|
-
| Heading Large | Toss Product Sans | 22px | 700 | 30px (1.36) | normal | Feature titles, modal headers |
|
|
133
|
-
| Heading | Toss Product Sans | 20px | 600 | 28px (1.40) | normal | Card headings, sub-sections |
|
|
134
|
-
| Subtitle | Toss Product Sans | 16px | 600 | 24px (1.50) | normal | Navigation titles, list headers |
|
|
135
|
-
| Body Large | Toss Product Sans | 16px | 400 | 24px (1.50) | normal | Descriptions, explanations |
|
|
136
|
-
| Body | Toss Product Sans | 14px | 400 | 22px (1.57) | normal | Standard reading text |
|
|
137
|
-
| Body Small | Toss Product Sans | 13px | 400 | 20px (1.54) | normal | Secondary information |
|
|
138
|
-
| Caption | Toss Product Sans | 12px | 400 | 18px (1.50) | normal | Timestamps, fine print |
|
|
139
|
-
| Number Display | Toss Product Sans | 30px+ | 700 | tight | normal | Financial amounts -- tabular nums |
|
|
140
|
-
|
|
141
|
-
### Principles
|
|
142
|
-
- **Eight weights, three used**: Ships 300-950, but UI uses 400 (body), 600 (emphasis), 700 (headings). Restraint over variety.
|
|
143
|
-
- **Dual numeral modes**: Variable-width for display, fixed-width (tabular) for financial tables and stock tickers. Context determines mode.
|
|
144
|
-
- **Korean-Latin optical balance**: Korean characters and Latin/numerals are independently weighted so mixed text looks harmonious without manual kerning.
|
|
145
|
-
- **Financial symbol optimization**: %, comma separators, ±, currency symbols, and directional arrows given enhanced legibility at small sizes.
|
|
186
|
+
- **Canonical visible UI family**: `Toss Product Sans`. The collector found 810 visible first-family uses backed by loaded FontFace resources.
|
|
187
|
+
- **Tossface status**: declared in FontFace resources but not observed as the first family on a visible element. It is therefore context, not a canonical UI token.
|
|
188
|
+
- **Monospace**: no current canonical monospace claim.
|
|
146
189
|
|
|
147
|
-
|
|
190
|
+
### Current TDS documentation hierarchy
|
|
148
191
|
|
|
149
|
-
|
|
192
|
+
| Role | Size | Weight | Line Height | Evidence |
|
|
193
|
+
|---|---:|---:|---:|---|
|
|
194
|
+
| H1 | 36px | 700 | 54px | computed TDS documentation style |
|
|
195
|
+
| H2 | 30px | 600 | 45px | computed TDS documentation style |
|
|
196
|
+
| H3 | 24px | 600 | 36px | computed TDS documentation style |
|
|
197
|
+
| H4 | 22px | 600 | 33px | computed TDS documentation style |
|
|
198
|
+
| Body | 16px | 400 | 24px | dominant visible role |
|
|
199
|
+
| Body Small | 14px | 400 | 21px | secondary visible role |
|
|
150
200
|
|
|
151
|
-
|
|
201
|
+
These are evidence-backed public-document roles, not a claim that every native Toss product screen uses this exact hierarchy.
|
|
152
202
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
-
|
|
156
|
-
-
|
|
157
|
-
|
|
158
|
-
-
|
|
159
|
-
|
|
160
|
-
- Pressed: dim overlay via `--button-pressed-background-color` + `--button-pressed-opacity`
|
|
161
|
-
- Disabled: bg opacity scaled by `--button-disabled-opacity-color`
|
|
162
|
-
- Loading: 3-dot indicator replacing label, button width preserved
|
|
163
|
-
- Use: Primary CTA on light surfaces (송금하기, 확인) — 56px tall
|
|
203
|
+
| Evidence class | Toss status |
|
|
204
|
+
|---|---|
|
|
205
|
+
| **Official product-use** | Toss Product Sans was designed for financial symbols and mobile, desktop, and offline product contexts |
|
|
206
|
+
| **Live surface-use** | Toss Product Sans is loaded and visibly used throughout the inspected TDS documentation surfaces |
|
|
207
|
+
| **Official distributed asset** | No general redistribution right is asserted by the current official sources |
|
|
208
|
+
| **Declared-only** | Tossface is declared in captured FontFace resources but was not observed as the visible first family |
|
|
209
|
+
| **Unresolved** | Public redistribution/license terms and exact native-screen type metrics beyond documented TDS roles |
|
|
164
210
|
|
|
165
|
-
|
|
166
|
-
- Background: `#4e5968`
|
|
167
|
-
- Text: `#ffffff`
|
|
168
|
-
- Border: none
|
|
169
|
-
- Radius: 16px
|
|
170
|
-
- Padding: 0 20px
|
|
171
|
-
- Font: 17px / 600 / Toss Product Sans
|
|
172
|
-
- Use: Strong action where blue would feel too playful (admin/settings CTA)
|
|
211
|
+
## 4. Component Stylings
|
|
173
212
|
|
|
174
|
-
|
|
175
|
-
- Background: `#
|
|
213
|
+
### TDS Mobile Button
|
|
214
|
+
- Background: `#3182f6` for the canonical primary reference
|
|
176
215
|
- Text: `#ffffff`
|
|
177
|
-
-
|
|
178
|
-
-
|
|
216
|
+
- Radius: 16px at xlarge
|
|
217
|
+
- Height: 56px at xlarge
|
|
179
218
|
- Padding: 0 20px
|
|
180
219
|
- Font: 17px / 600 / Toss Product Sans
|
|
181
|
-
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
220
|
+
- Size scale: small 32px / 8px radius; medium 38px / 10px; large 48px / 14px; xlarge 56px / 16px
|
|
221
|
+
- States: fill or weak; primary, danger, light, or dark; loading, disabled, pressed, and keyboard focus
|
|
222
|
+
- Use: primary and secondary mobile actions; preserve width while loading
|
|
223
|
+
|
|
224
|
+
### TDS Mobile Text Field
|
|
225
|
+
- Variants: box, line, big, hero
|
|
226
|
+
- States: focus, error, disabled, read-only
|
|
227
|
+
- Use: text entry with label, help text, and error text. Do not transfer undocumented page-chrome colors into the product field token.
|
|
228
|
+
|
|
229
|
+
### TDS Mobile Badge
|
|
230
|
+
- Variants: fill or weak; xsmall, small, medium, large; semantic colors
|
|
231
|
+
- States: semantic and size variants; badge is descriptive rather than interactive
|
|
232
|
+
- Use: compact status or category label
|
|
233
|
+
|
|
234
|
+
### TDS Mobile Agreement
|
|
235
|
+
- States: checked, unchecked, disabled, and nested agreement hierarchy
|
|
236
|
+
- Use: terms selection; v3 and v4 are retained as separate official surfaces because both are publicly documented
|
|
237
|
+
|
|
238
|
+
### toss.im Marketing Primary
|
|
239
|
+
- Background: `#e8f3ff`
|
|
185
240
|
- Text: `#1b64da`
|
|
186
|
-
-
|
|
187
|
-
-
|
|
188
|
-
- Padding:
|
|
189
|
-
- Font:
|
|
190
|
-
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
-
|
|
195
|
-
- Border: none
|
|
196
|
-
- Radius: 16px
|
|
197
|
-
- Padding: 0 20px
|
|
198
|
-
- Font: 17px / 600 / Toss Product Sans
|
|
199
|
-
- Use: Secondary action paired with Fill / Primary on the same screen
|
|
200
|
-
|
|
201
|
-
**Weak / Dark**
|
|
202
|
-
- Background: `rgba(2, 32, 71, 0.05)`
|
|
203
|
-
- Text: `#4e5968`
|
|
204
|
-
- Border: none
|
|
205
|
-
- Radius: 16px
|
|
206
|
-
- Padding: 0 20px
|
|
207
|
-
- Font: 17px / 600 / Toss Product Sans
|
|
208
|
-
- Use: Neutral / cancel-style secondary (취소, 닫기)
|
|
209
|
-
|
|
210
|
-
**Weak / Danger**
|
|
211
|
-
- Background: `rgba(251, 136, 144, 0.15)`
|
|
212
|
-
- Text: `#e42939`
|
|
213
|
-
- Border: none
|
|
214
|
-
- Radius: 16px
|
|
215
|
-
- Padding: 0 20px
|
|
216
|
-
- Font: 17px / 600 / Toss Product Sans
|
|
217
|
-
- Use: Subtle destructive action (archive instead of delete)
|
|
218
|
-
|
|
219
|
-
**Weak / Light**
|
|
220
|
-
- Background: `rgba(255, 255, 255, 0.15)`
|
|
241
|
+
- Radius: 7px
|
|
242
|
+
- Height: 40px
|
|
243
|
+
- Padding: 11px 16px
|
|
244
|
+
- Font: 15px / 600 / Toss Product Sans
|
|
245
|
+
- States: default observed; hover not captured in the retained evidence bundle
|
|
246
|
+
- Use: light-blue marketing CTA
|
|
247
|
+
|
|
248
|
+
### toss.im Marketing Dark
|
|
249
|
+
- Background: `rgba(0, 12, 30, 0.8)`
|
|
221
250
|
- Text: `#ffffff`
|
|
222
|
-
-
|
|
223
|
-
-
|
|
224
|
-
- Padding:
|
|
251
|
+
- Radius: 7px
|
|
252
|
+
- Height: 46px
|
|
253
|
+
- Padding: 11px 16px
|
|
225
254
|
- Font: 17px / 600 / Toss Product Sans
|
|
226
|
-
-
|
|
227
|
-
|
|
228
|
-
Display modes — `inline` (auto-width), `block` (full-width with line break), `full` (fills parent). Size scale (height · font · radius): `small` 32px · 13px / 600 · 8px; `medium` 38px · 15px / 600 · 10px; `large` 48px · 17px / 600 · 14px; `xlarge` (default) 56px · 17px / 600 · 16px. CSS-var customization: `--button-color`, `--button-background-color`, `--button-pressed-background-color`, `--button-pressed-opacity`, `--button-disabled-opacity-color`, `--button-loader-color`, `--button-loading-background-color`, `--button-gradient-color`.
|
|
229
|
-
|
|
230
|
-
### Inputs
|
|
231
|
-
|
|
232
|
-
Toss `<TextField>` has 4 variants: `box` (default), `line`, `big`, `hero`. `hasError` toggles error state. Verified at `tossmini-docs.toss.im/tds-mobile/components/TextField/text-field`.
|
|
233
|
-
|
|
234
|
-
**Box (default)**
|
|
235
|
-
- Background: `rgba(0, 23, 51, 0.02)`
|
|
236
|
-
- Text: `#333d4b`
|
|
237
|
-
- Border: 1px solid `rgba(2, 32, 71, 0.05)`
|
|
238
|
-
- Radius: 14px
|
|
239
|
-
- Padding: 14px 16px
|
|
240
|
-
- Font: 17px / 400 / Toss Product Sans
|
|
241
|
-
- Placeholder: `#b0b8c1`
|
|
242
|
-
- Focus: border `#3182f6`
|
|
243
|
-
- Use: Standard form input — most-used variant
|
|
244
|
-
|
|
245
|
-
**Line**
|
|
246
|
-
- Background: transparent
|
|
247
|
-
- Text: `#333d4b`
|
|
248
|
-
- Border: 1px solid `#e5e8eb` (bottom only)
|
|
249
|
-
- Radius: 0px
|
|
250
|
-
- Padding: 0px 0px 4px
|
|
251
|
-
- Font: 17px / 400 / Toss Product Sans
|
|
252
|
-
- Use: Underline-style input on dense forms
|
|
253
|
-
|
|
254
|
-
**Big**
|
|
255
|
-
- Background: transparent
|
|
256
|
-
- Text: `#333d4b`
|
|
257
|
-
- Border: 1px solid `#e5e8eb` (bottom only)
|
|
258
|
-
- Radius: 0px
|
|
259
|
-
- Padding: 0px 0px 4px
|
|
260
|
-
- Font: 22px / 600 / Toss Product Sans
|
|
261
|
-
- Use: Highlighted single-line input (amount, name)
|
|
262
|
-
|
|
263
|
-
**Hero**
|
|
264
|
-
- Background: transparent
|
|
265
|
-
- Text: `#333d4b`
|
|
266
|
-
- Border: 1px solid `#e5e8eb` (bottom only)
|
|
267
|
-
- Radius: 0px
|
|
268
|
-
- Padding: 0px 0px 4px
|
|
269
|
-
- Font: 30px / 600 / Toss Product Sans
|
|
270
|
-
- Use: Eye-catching hero input — large amount entry, sign-up moment
|
|
271
|
-
|
|
272
|
-
**Error**
|
|
273
|
-
- Background: `rgba(0, 23, 51, 0.02)` (box variant base)
|
|
274
|
-
- Text: `#333d4b`
|
|
275
|
-
- Border: 1px solid `#f04452`
|
|
276
|
-
- Radius: 14px
|
|
277
|
-
- Padding: 14px 16px
|
|
278
|
-
- Font: 17px / 400 / Toss Product Sans
|
|
279
|
-
- Use: `hasError` state — paired with inline help message in `#f04452`
|
|
280
|
-
|
|
281
|
-
`SplitTextField` (OTP), `SecureKeypad` (financial PIN with randomised digit positions), and `TextArea` are documented separately under TDS but reuse the same focus ring and base radii.
|
|
282
|
-
|
|
283
|
-
### Cards
|
|
284
|
-
|
|
285
|
-
**Standard**
|
|
286
|
-
- Background: `#ffffff`
|
|
287
|
-
- Border: none
|
|
288
|
-
- Radius: 12px
|
|
289
|
-
- Padding: 20px
|
|
290
|
-
- Shadow: `0px 2px 8px rgba(0,0,0,0.08)`
|
|
291
|
-
- Use: Account, transaction, balance — the workhorse surface
|
|
292
|
-
|
|
293
|
-
**Featured**
|
|
294
|
-
- Background: `#ffffff`
|
|
295
|
-
- Border: none
|
|
296
|
-
- Radius: 16px
|
|
297
|
-
- Padding: 24px
|
|
298
|
-
- Shadow: `0px 2px 8px rgba(0,0,0,0.08)`
|
|
299
|
-
- Use: Hero/promotional cards on the home tab
|
|
300
|
-
|
|
301
|
-
**Compact**
|
|
302
|
-
- Background: `#ffffff`
|
|
303
|
-
- Border: 1px solid `#e5e8eb`
|
|
304
|
-
- Radius: 8px
|
|
305
|
-
- Padding: 12px
|
|
306
|
-
- Shadow: none
|
|
307
|
-
- Use: Inline list items where a softer 1px edge replaces shadow
|
|
308
|
-
|
|
309
|
-
### Badges
|
|
310
|
-
|
|
311
|
-
Toss `<Badge>` is a 3-axis component: **variant** × **color** × **size**. Variants `fill | weak`. Colors `blue | teal | green | red | yellow | elephant`. Sizes `xsmall | small | medium | large` (each shifts radius/font/padding). Verified at `tossmini-docs.toss.im/tds-mobile/components/badge`.
|
|
312
|
-
|
|
313
|
-
**Fill / Blue (medium default)**
|
|
314
|
-
- Background: `#3182f6`
|
|
315
|
-
- Text: `#ffffff`
|
|
316
|
-
- Border: none
|
|
317
|
-
- Radius: 12px
|
|
318
|
-
- Padding: 3px 7px
|
|
319
|
-
- Font: 13px / 700 / Toss Product Sans
|
|
320
|
-
- Use: Primary status / category emphasis ("NEW", "BEST")
|
|
321
|
-
|
|
322
|
-
**Fill / Green**
|
|
323
|
-
- Background: `#22c55e`
|
|
324
|
-
- Text: `#ffffff`
|
|
325
|
-
- Border: none
|
|
326
|
-
- Radius: 12px
|
|
327
|
-
- Padding: 3px 7px
|
|
328
|
-
- Font: 13px / 700 / Toss Product Sans
|
|
329
|
-
- Use: Success / completion state (입금 완료, 송금 성공)
|
|
330
|
-
|
|
331
|
-
**Fill / Red**
|
|
332
|
-
- Background: `#ef4444`
|
|
333
|
-
- Text: `#ffffff`
|
|
334
|
-
- Border: none
|
|
335
|
-
- Radius: 12px
|
|
336
|
-
- Padding: 3px 7px
|
|
337
|
-
- Font: 13px / 700 / Toss Product Sans
|
|
338
|
-
- Use: Negative / blocking state (실패, 차단)
|
|
339
|
-
|
|
340
|
-
**Fill / Yellow**
|
|
341
|
-
- Background: `#eab308`
|
|
342
|
-
- Text: `#ffffff`
|
|
343
|
-
- Border: none
|
|
344
|
-
- Radius: 12px
|
|
345
|
-
- Padding: 3px 7px
|
|
346
|
-
- Font: 13px / 700 / Toss Product Sans
|
|
347
|
-
- Use: Caution / pending (검토 중, 보류)
|
|
348
|
-
|
|
349
|
-
**Weak / Blue**
|
|
350
|
-
- Background: `rgba(100, 168, 255, 0.15)`
|
|
351
|
-
- Text: `#2272eb`
|
|
352
|
-
- Border: none
|
|
353
|
-
- Radius: 12px
|
|
354
|
-
- Padding: 3px 7px
|
|
355
|
-
- Font: 13px / 700 / Toss Product Sans
|
|
356
|
-
- Use: Subtle informational badge
|
|
357
|
-
|
|
358
|
-
**Weak / Green**
|
|
359
|
-
- Background: `rgba(34, 197, 94, 0.15)`
|
|
360
|
-
- Text: `#16a34a`
|
|
361
|
-
- Border: none
|
|
362
|
-
- Radius: 12px
|
|
363
|
-
- Padding: 3px 7px
|
|
364
|
-
- Font: 13px / 700 / Toss Product Sans
|
|
365
|
-
- Use: Subtle success state
|
|
366
|
-
|
|
367
|
-
**Weak / Red**
|
|
368
|
-
- Background: `rgba(239, 68, 68, 0.15)`
|
|
369
|
-
- Text: `#dc2626`
|
|
370
|
-
- Border: none
|
|
371
|
-
- Radius: 12px
|
|
372
|
-
- Padding: 3px 7px
|
|
373
|
-
- Font: 13px / 700 / Toss Product Sans
|
|
374
|
-
- Use: Subtle negative state
|
|
375
|
-
|
|
376
|
-
**Weak / Elephant**
|
|
377
|
-
- Background: `rgba(2, 32, 71, 0.05)`
|
|
378
|
-
- Text: `#4e5968`
|
|
379
|
-
- Border: none
|
|
380
|
-
- Radius: 12px
|
|
381
|
-
- Padding: 3px 7px
|
|
382
|
-
- Font: 13px / 700 / Toss Product Sans
|
|
383
|
-
- Use: Neutral metadata badge
|
|
384
|
-
|
|
385
|
-
Size scale (height · font · radius · padding): `xsmall` 21px · 10px / 600 · 9px · 3px 7px; `small` 24px · 12px / 700 · 11px · 3px 7px; `medium` 26px · 13px / 700 · 12px · 3px 7px; `large` 29px · 14px / 700 · 13px · 4px 8px. Color also supports `teal` and full mapping for each color name; values above show the most-used 4 fills + 4 weaks at medium size.
|
|
386
|
-
|
|
387
|
-
### Tabs
|
|
388
|
-
|
|
389
|
-
**Bottom Tab (Active)**
|
|
390
|
-
- Background: `#ffffff`
|
|
391
|
-
- Text: `#191f28`
|
|
392
|
-
- Border: 1px solid `#e5e8eb` (top border only)
|
|
393
|
-
- Active: `#3182f6` (icon and label)
|
|
394
|
-
- Disabled: `#b0b8c1` (icon) + `#8b95a1` (label)
|
|
395
|
-
- Font: 11px / 500 / Toss Product Sans
|
|
396
|
-
- Use: Bottom navigation bar — fixed white background, no shadow
|
|
397
|
-
|
|
398
|
-
**Segmented**
|
|
399
|
-
- Background: `#f2f4f6`
|
|
400
|
-
- Text: `#8b95a1`
|
|
401
|
-
- Border: none
|
|
402
|
-
- Radius: 12px
|
|
403
|
-
- Padding: 8px 16px
|
|
404
|
-
- Active: `#ffffff` background + `#191f28` text + `0px 2px 4px rgba(0,0,0,0.06)` shadow
|
|
405
|
-
- Font: 14px / 600 / Toss Product Sans
|
|
406
|
-
- Use: Section switching within a screen (월/주/일 전환)
|
|
407
|
-
|
|
408
|
-
### Toasts
|
|
409
|
-
|
|
410
|
-
**Default**
|
|
411
|
-
- Background: `#191f28`
|
|
412
|
-
- Text: `#ffffff`
|
|
413
|
-
- Border: none
|
|
414
|
-
- Radius: 8px
|
|
415
|
-
- Padding: 12px 16px
|
|
416
|
-
- Shadow: `0px 4px 12px rgba(0,0,0,0.12)`
|
|
417
|
-
- Font: 14px / 500 / Toss Product Sans
|
|
418
|
-
- Use: Auto-dismissing transient notification ("복사되었습니다"). Money-moved success is a dedicated screen, never a toast.
|
|
419
|
-
|
|
420
|
-
### Dialogs
|
|
421
|
-
|
|
422
|
-
**Centered Modal**
|
|
423
|
-
- Background: `#ffffff`
|
|
424
|
-
- Text: `#191f28`
|
|
425
|
-
- Border: none
|
|
426
|
-
- Radius: 16px
|
|
427
|
-
- Padding: 24px
|
|
428
|
-
- Shadow: `0px 4px 12px rgba(0,0,0,0.12)`
|
|
429
|
-
- Use: AlertDialog / ConfirmDialog for confirmation prompts
|
|
430
|
-
|
|
431
|
-
**Bottom Sheet**
|
|
432
|
-
- Background: `#ffffff`
|
|
433
|
-
- Text: `#191f28`
|
|
434
|
-
- Border: none
|
|
435
|
-
- Radius: 16px (top corners only)
|
|
436
|
-
- Padding: 24px 20px
|
|
437
|
-
- Shadow: `0px -4px 12px rgba(0,0,0,0.08)`
|
|
438
|
-
- Use: Bottom-attached overlay for selection, picker, secondary form (managed via `overlay-kit`)
|
|
439
|
-
|
|
440
|
-
### Toggles
|
|
441
|
-
|
|
442
|
-
**Default**
|
|
443
|
-
- Background: `#3182f6` (on) / `#d1d6db` (off)
|
|
444
|
-
- Border: none
|
|
445
|
-
- Radius: 9999px
|
|
446
|
-
- Thumb: `#ffffff` 18px circle with `0px 1px 2px rgba(0,0,0,0.1)` shadow
|
|
447
|
-
- Use: Boolean settings (알림 켜기, 자동 송금)
|
|
255
|
+
- States: default observed; hover not captured in the retained evidence bundle
|
|
256
|
+
- Use: app-store style marketing CTA
|
|
448
257
|
|
|
449
258
|
---
|
|
450
259
|
|
|
451
|
-
**Verified:** 2026-
|
|
452
|
-
**Tier 1 sources:** tossmini-docs.toss.im/tds-mobile
|
|
453
|
-
**Tier 2 sources:** getdesign.md/toss
|
|
454
|
-
**
|
|
455
|
-
**
|
|
456
|
-
**Conflicts unresolved:** none. TDS Mobile geometry (16px radius, 17px·600) and web `.p-button` (7px, 15px·600) coexist on different surfaces and were not in conflict.
|
|
260
|
+
**Verified:** 2026-07-11 (verification v2, live computed-style capture + current official TDS docs)
|
|
261
|
+
**Tier 1 sources:** https://toss.im/ https://toss.im/docs/10290 https://tossmini-docs.toss.im/tds-mobile/components/button/ https://tossmini-docs.toss.im/tds-mobile/components/TextField/text-field/ https://tossmini-docs.toss.im/tds-mobile/components/badge/
|
|
262
|
+
**Tier 2 sources:** https://getdesign.md/toss produced no importable Toss record; https://styles.refero.design/?q=Toss produced no importable result through the available fetch path.
|
|
263
|
+
**Surface split:** TDS Mobile xlarge uses 56px height and 16px radius; `toss.im` marketing actions observed here use 40–46px height and 7px radius.
|
|
264
|
+
**Conflicts unresolved:** none
|
|
457
265
|
|
|
458
266
|
## 5. Layout Principles
|
|
459
267
|
|
|
460
268
|
### Spacing System
|
|
461
|
-
-
|
|
462
|
-
-
|
|
463
|
-
- Horizontal padding: 20px (slightly wider than typical 16px)
|
|
464
|
-
- Financial data grids: tighter 4px internal spacing
|
|
269
|
+
- Captured TDS documentation clusters: 4px, 6px, 8px, 16px, 24px, and 32px.
|
|
270
|
+
- Treat those values as a compact working scale, not proof of every native product layout token.
|
|
465
271
|
|
|
466
272
|
### Grid & Container
|
|
467
|
-
-
|
|
468
|
-
-
|
|
469
|
-
- No explicit multi-column grid -- single-column, mobile-first
|
|
470
|
-
- Transaction lists: full-width rows with consistent left-align for amounts
|
|
471
|
-
|
|
472
|
-
### Whitespace Philosophy
|
|
473
|
-
- **Breathing room for money**: Financial numbers get extra surrounding space. A balance at 30px with 32px margins communicates security through spaciousness.
|
|
474
|
-
- **Progressive density**: Summary screens are spacious; detail/transaction screens are denser. The deeper you go, the more information-dense.
|
|
475
|
-
- **Grouped by function**: Send/receive/invest actions separated by 24px+ gaps; related data within a group uses 8-12px gaps.
|
|
273
|
+
- TDS component documentation is mobile-oriented; its xlarge button is designed as a strong touch action.
|
|
274
|
+
- The public marketing site uses a distinct responsive web composition and should not inherit mobile component geometry wholesale.
|
|
476
275
|
|
|
477
276
|
### Border Radius Scale
|
|
478
|
-
-
|
|
479
|
-
-
|
|
480
|
-
- Comfortable (12px): Standard cards, dialog corners
|
|
481
|
-
- Large (16px): Featured cards, bottom sheet top corners
|
|
482
|
-
- Pill (9999px): Toggle switches, floating chips
|
|
277
|
+
- Documentation chrome and components cluster around 4px and 6px for small surfaces.
|
|
278
|
+
- Button sizes use 8px, 10px, 14px, and 16px radii from small through xlarge.
|
|
483
279
|
|
|
484
280
|
## 6. Depth & Elevation
|
|
485
281
|
|
|
486
|
-
|
|
487
|
-
|-------|-----------|-----|
|
|
488
|
-
| Flat (Level 0) | No shadow | Page background, inline elements |
|
|
489
|
-
| Subtle (Level 1) | `0px 1px 3px rgba(0,0,0,0.06)` | Slight lift, list item separation |
|
|
490
|
-
| Standard (Level 2) | `0px 2px 8px rgba(0,0,0,0.08)` | Cards, content panels |
|
|
491
|
-
| Elevated (Level 3) | `0px 4px 12px rgba(0,0,0,0.12)` | Dropdowns, popovers, floating buttons |
|
|
492
|
-
| Modal (Level 4) | `0px 8px 24px rgba(0,0,0,0.16)` | Bottom sheets, dialogs, modals |
|
|
493
|
-
|
|
494
|
-
**Shadow Philosophy**: Toss keeps shadows minimal and neutral. In a financial app, visual noise undermines trust -- elevation is communicated through subtle opacity differences rather than dramatic depth. Pure black with low opacity creates clinical precision matching the fintech context. Where Stripe uses brand-colored shadows, Toss uses restraint as its brand statement.
|
|
495
|
-
|
|
496
|
-
### Blur Effects
|
|
497
|
-
- Menu components use backdrop blur for lightweight floating panels
|
|
498
|
-
- Navigation bar applies subtle blur on scroll for the sticky header
|
|
282
|
+
No canonical shadow token is promoted in this revision. The inspected evidence contains documentation-site chrome as well as TDS examples, so treating every computed shadow as a Toss product token would overstate the source. Use flat color layering until a component-specific official source verifies elevation.
|
|
499
283
|
|
|
500
284
|
## 7. Do's and Don'ts
|
|
501
285
|
|
|
502
286
|
### Do
|
|
503
|
-
-
|
|
504
|
-
-
|
|
505
|
-
-
|
|
506
|
-
-
|
|
507
|
-
-
|
|
508
|
-
- Show positive changes in green (`#03b26c`), negative in red (`#f04452`)
|
|
509
|
-
- Use blue50 (`#e8f3ff`) for subtle informational backgrounds
|
|
287
|
+
- Keep TDS Mobile and `toss.im` marketing variants explicitly named by surface.
|
|
288
|
+
- Use `Toss Product Sans` where the font is available, with a system fallback for resilience.
|
|
289
|
+
- Preserve documented loading, disabled, pressed, and keyboard-focus states on buttons.
|
|
290
|
+
- Treat badge content as status metadata, not as an action affordance.
|
|
291
|
+
- Use exact component geometry only where the evidence names a size and surface.
|
|
510
292
|
|
|
511
293
|
### Don't
|
|
512
|
-
- Don't
|
|
513
|
-
- Don't
|
|
514
|
-
- Don't
|
|
515
|
-
- Don't
|
|
516
|
-
- Don't
|
|
517
|
-
- Don't use border-radius > 16px except for pills/toggles
|
|
518
|
-
- Don't add decorative elements to financial data displays -- clarity is the aesthetic
|
|
294
|
+
- Don't use logo brand blue as a silent replacement for UI primary `#3182f6`.
|
|
295
|
+
- Don't claim Tossface is the visible primary UI font; it was declared but unused in this capture.
|
|
296
|
+
- Don't copy documentation-site colors into native product tokens without component-level evidence.
|
|
297
|
+
- Don't merge the 16px TDS radius with the 7px marketing radius into an average value.
|
|
298
|
+
- Don't invent cards, shadows, tabs, toasts, or dialogs from generic fintech conventions.
|
|
519
299
|
|
|
520
300
|
## 8. Responsive Behavior
|
|
521
301
|
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
| Mobile (Primary) | <480px | Full design fidelity, 375px baseline |
|
|
526
|
-
| Tablet | 480-768px | Expanded cards, optional side margins |
|
|
527
|
-
| Desktop (Web) | >768px | Centered column, max-width ~480px for mobile-web parity |
|
|
528
|
-
|
|
529
|
-
### Touch Targets
|
|
530
|
-
- Buttons: xlarge (~56px), large (~48px), medium (~40px), small (~36px)
|
|
531
|
-
- List items: minimum 52px row height for financial actions
|
|
532
|
-
- Keypad buttons: large targets (56-64px) for secure input
|
|
533
|
-
|
|
534
|
-
### Collapsing Strategy
|
|
535
|
-
- Desktop web mirrors mobile layout in a centered column
|
|
536
|
-
- Bottom sheet → modal dialog on larger screens
|
|
537
|
-
- Sticky bottom CTA bar with safe area insets on all devices
|
|
538
|
-
- Horizontal scrolling card carousels for product discovery
|
|
539
|
-
|
|
540
|
-
### Image Behavior
|
|
541
|
-
- Bank/service logos: 24-40px with consistent sizing within context
|
|
542
|
-
- Tossface emojis: inline at text size, display size for decorative use
|
|
543
|
-
- Charts/graphs: full-width, responsive, maintain aspect ratio
|
|
302
|
+
- TDS Mobile component sizes should remain touch-oriented; xlarge is the documented default button size.
|
|
303
|
+
- On web, preserve the observed 40px or 46px marketing button height rather than substituting the 56px mobile control.
|
|
304
|
+
- The public sources in this verification do not establish universal breakpoints, desktop maximum widths, or native safe-area values.
|
|
544
305
|
|
|
545
306
|
## 9. Agent Prompt Guide
|
|
546
307
|
|
|
547
|
-
|
|
548
|
-
-
|
|
549
|
-
-
|
|
550
|
-
-
|
|
551
|
-
- Background Surface: Light Gray (`#f2f4f6`)
|
|
552
|
-
- Heading text: Dark Charcoal (`#191f28`)
|
|
553
|
-
- Body text: Medium Gray (`#6b7684`)
|
|
554
|
-
- Caption text: Gray (`#8b95a1`)
|
|
555
|
-
- Placeholder: Soft Gray (`#b0b8c1`)
|
|
556
|
-
- Border: Gray 200 (`#e5e8eb`)
|
|
557
|
-
- Success/Positive: Green (`#03b26c`)
|
|
558
|
-
- Error/Negative: Red (`#f04452`)
|
|
559
|
-
- Warning: Orange (`#fe9800`)
|
|
560
|
-
|
|
561
|
-
### Example Component Prompts
|
|
562
|
-
- "Create a balance card: white bg, 12px radius, 20px padding. Balance label 14px weight 400, #8b95a1. Amount 30px weight 700, #191f28, tabular numerals. Currency '원' 20px weight 400. Shadow 0px 2px 8px rgba(0,0,0,0.08)."
|
|
563
|
-
- "Build a send-money button: #3182f6 bg, white text, 16px weight 600, min-height 56px, 12px radius, full-width. Pressed: overlay dim. Loading: 3-dot white animation."
|
|
564
|
-
- "Design a transaction row: full-width, 16px h-padding, 52px min-height. Left: 32px circle icon + name (14px weight 600, #191f28) + category (13px weight 400, #8b95a1). Right: amount (14px weight 600, #f04452 expense / #03b26c income)."
|
|
565
|
-
- "Create an OTP input: 6 boxes, each 48px wide, 56px tall, 8px radius, 1px border #e5e8eb. Active: 2px border #3182f6. Digit: 24px weight 700, centered, #191f28."
|
|
566
|
-
- "Design a bottom tab bar: white bg, top border 1px #e5e8eb. 4 tabs evenly spaced. Active: #3182f6 icon + #191f28 label 11px weight 500. Inactive: #b0b8c1 icon + #8b95a1 label. Tab height 56px with safe area."
|
|
567
|
-
|
|
568
|
-
### Iteration Guide
|
|
569
|
-
1. Always use the full Toss Product Sans font stack with Korean fallbacks
|
|
570
|
-
2. Primary interactive color is `#3182f6` (blue500) -- never `#0064FF` (brand blue)
|
|
571
|
-
3. Financial numbers: 700 weight, tabular numerals, right-aligned in lists
|
|
572
|
-
4. Grey scale has warm undertones: grey900 `#191f28`, grey50 `#f9fafb`
|
|
573
|
-
5. Border-radius: 8px inputs, 12px cards, 16px sheets, pill for toggles
|
|
574
|
-
6. Shadows are single-layer, pure black opacity, no colored tints
|
|
575
|
-
7. Mobile-first: design at 375px, 20px horizontal padding
|
|
576
|
-
|
|
577
|
-
---
|
|
308
|
+
- “Create a TDS Mobile xlarge primary button using `#3182f6`, white text, 56px height, 16px radius, 17px/600 Toss Product Sans, and explicit loading/disabled/focus behavior.”
|
|
309
|
+
- “Create a `toss.im` weak marketing CTA using `#e8f3ff` background, `#1b64da` text, 40px height, and 7px radius.”
|
|
310
|
+
- “Use Toss Product Sans for the verified UI family; do not promote Tossface without visible usage evidence.”
|
|
311
|
+
- “If building a component not listed here, mark it as an extension rather than presenting it as verified TDS.”
|
|
578
312
|
|
|
579
313
|
## 10. Voice & Tone
|
|
580
314
|
|
|
581
|
-
Toss speaks
|
|
582
|
-
|
|
583
|
-
| Context | Tone |
|
|
584
|
-
|---|---|
|
|
585
|
-
| CTAs | Imperative, short Korean verb form (`송금하기`, `확인`, `가입하기`) |
|
|
586
|
-
| Success toasts | Past-tense single sentence (`송금이 완료되었어요`). No emoji. |
|
|
587
|
-
| Error messages | Specific + blameless + actionable. Never `문제가 발생했습니다`. |
|
|
588
|
-
| Onboarding screens | Second-person, one idea per screen, no bullet lists. |
|
|
589
|
-
| Financial amounts | Bare numerals with comma separators, then currency unit. `1,240,000원`, never `₩1.24M`. |
|
|
590
|
-
| Empty states | Explain the *why* in one line, offer one action. Never `데이터가 없습니다`. |
|
|
591
|
-
| Legal / disclosure | Korean financial-regulation tone — formal `합니다` endings. Single exception to the casual voice. |
|
|
315
|
+
Toss speaks as a capable guide that removes work rather than displaying financial expertise. Copy is short and direct, but the governing idea is not minimal word count by itself: a person should understand the value, answer the question, and recover from uncertainty without decoding industry language. Official product-design writing describes principles such as **Easy to answer** and **Value first, cost later**—make choices concrete, and show why an action is worthwhile before asking for effort, data, or commitment.
|
|
592
316
|
|
|
593
|
-
|
|
317
|
+
In product flows, name the outcome and next action precisely. In education or product-branding surfaces, explain one unfamiliar idea in everyday language and let the interface carry the rest. Avoid vague reassurance, unexplained abbreviations, institutional phrasing, or playful copy that makes a financial consequence ambiguous.
|
|
594
318
|
|
|
595
319
|
## 11. Brand Narrative
|
|
596
320
|
|
|
597
|
-
Toss
|
|
321
|
+
Toss presents finance as a connected product experience rather than a collection of institutional silos. Its design system supports that ambition by making repeated actions—checking, comparing, agreeing, paying, and recovering—feel consistent even when the underlying financial products differ.
|
|
598
322
|
|
|
599
|
-
|
|
323
|
+
The company’s first-party design writing shows how this consistency became a brand system inside the product. Product branding is treated as the experience people receive while using a feature, not merely a campaign wrapped around it. Toss Product Sans extends the same logic into typography: numbers, symbols, Korean text, and multiple digital and offline contexts were considered as one product problem.
|
|
600
324
|
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
What Toss refuses: the institutional seriousness of legacy finance, the playfulness of consumer apps (no bright pink, no illustrations of cartoon piggy banks), the data-viz density of Bloomberg-style terminals. Toss occupies a narrow middle — calm but optimistic, dense with functionality but spacious in presentation.
|
|
325
|
+
The practical design position is therefore clarity with momentum. **Easy to answer** reduces the cognitive cost of a decision; **Value first, cost later** makes benefit legible before asking for commitment. Blue, typography, motion, and microcopy are useful only when they help a person move through money with more confidence.
|
|
604
326
|
|
|
605
327
|
## 12. Principles
|
|
606
328
|
|
|
607
|
-
|
|
608
|
-
2. **Progressive density.** Summary screens are spacious; detail and transaction screens are dense. The deeper the user navigates, the more information per pixel — they've committed to the context and want facts.
|
|
609
|
-
3. **One action per screen.** If a screen has two primary buttons, it is two screens. Secondary actions are acceptable; two primaries are never acceptable.
|
|
610
|
-
4. **Blue is interaction, not decoration.** `#3182f6` appears only where the user can tap. It never decorates. Illustrations, ornaments, borders, and headers never use blue500 unless they are interactive surfaces.
|
|
611
|
-
5. **Restraint communicates trust.** Shadows are single-layer, pure black, low opacity. No colored shadows, no multi-layer elevation stacks. In finance, visual noise is credibility tax.
|
|
612
|
-
6. **Korean and Latin are co-equal.** Never assume one is primary. Typography stacks, optical weights, and tabular numerals all assume both scripts render simultaneously in the same line.
|
|
613
|
-
7. **Numbers are typography.** Financial amounts use 700 weight and tabular numerals with the same care as display headings. Amounts never inherit body-text weight.
|
|
614
|
-
8. **Negative space is a brand asset.** If reducing padding would fit more on screen, the answer is another screen, not tighter packing.
|
|
615
|
-
|
|
616
|
-
## 13. Personas
|
|
329
|
+
The following are implementation principles derived from the verified surfaces, not quoted corporate doctrine:
|
|
617
330
|
|
|
618
|
-
|
|
331
|
+
1. Separate product-system evidence from marketing-surface evidence.
|
|
332
|
+
2. Make interaction blue functional rather than decorative.
|
|
333
|
+
3. Preserve component states, especially disabled, loading, pressed, and keyboard focus.
|
|
334
|
+
4. Prefer exact, readable typography over ornamental depth.
|
|
335
|
+
5. Treat financial outcomes as explicit states with clear next actions.
|
|
619
336
|
|
|
620
|
-
|
|
337
|
+
## 13. Personas
|
|
621
338
|
|
|
622
|
-
|
|
339
|
+
These are first-party product contexts, not invented demographic personas.
|
|
623
340
|
|
|
624
|
-
|
|
341
|
+
- **A person answering a financial question:** needs options translated into concrete, comparable choices rather than a dense form or open-ended prompt.
|
|
342
|
+
- **A person evaluating value before effort:** needs the likely benefit made visible before consent, document upload, consultation, or payment is requested.
|
|
343
|
+
- **A person recovering from an interrupted flow:** needs the current state, consequence, and next safe action stated explicitly, especially in insurance, payment, or account contexts.
|
|
625
344
|
|
|
626
345
|
## 14. States
|
|
627
346
|
|
|
628
|
-
|
|
|
347
|
+
| Component | Verified state contract |
|
|
629
348
|
|---|---|
|
|
630
|
-
|
|
|
631
|
-
|
|
|
632
|
-
|
|
|
633
|
-
|
|
|
634
|
-
| **Error (inline field)** | `#f04452` (red500) 2px border on the input, error text below in red500 13px. One actionable sentence (`계좌번호를 다시 확인해주세요`). |
|
|
635
|
-
| **Error (toast)** | `#191f28` background, white 14px 400 text, 3s auto-dismiss. One sentence. No icons. Bottom of screen with 20px inset. |
|
|
636
|
-
| **Error (screen-blocking)** | Reserved for server outage. White screen, centered single-line message in `grey900` 16px weight 600, retry button in blue500 below. No illustration. |
|
|
637
|
-
| **Success (inline flash)** | Brief flash of `#e8f3ff` (blue50) background behind the updated element, 300ms fade to default. For routine actions like toggling a setting. |
|
|
638
|
-
| **Success (money moved)** | Dedicated confirmation screen — not a toast. `#03b26c` (green500) checkmark top-center, exact amount in 30px weight 700 below, recipient name, timestamp. Single button: `확인`. This weight is intentional; money moving is never a toast. |
|
|
639
|
-
| **Skeleton** | `#f2f4f6` blocks at exact final dimensions. 1.2s shimmer as `linear-gradient` with 8% white highlight. Rounded at component radius (8px/12px/16px per component). Never used on financial amounts — those show `--`. |
|
|
640
|
-
| **Disabled** | Button opacity drops per `--button-disabled-opacity-color`. No grey-out of input borders — disabled inputs keep `grey200` border, so the geometry is stable if re-enabled. |
|
|
641
|
-
| **Loading inside pressed button** | Text is replaced by the 3-dot white animation. Width of the button does not change. Press is visually committed; user cannot double-submit. |
|
|
349
|
+
| TDS Button | fill/weak, semantic color, loading, disabled, pressed, keyboard focus |
|
|
350
|
+
| TDS Text Field | box/line/big/hero, focus, error, disabled, read-only |
|
|
351
|
+
| TDS Agreement | checked, unchecked, disabled, nested hierarchy |
|
|
352
|
+
| Marketing CTAs | default geometry captured; hover remains unclaimed |
|
|
642
353
|
|
|
643
354
|
## 15. Motion & Easing
|
|
644
355
|
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
| Token | Value | Use |
|
|
648
|
-
|---|---|---|
|
|
649
|
-
| `motion-instant` | 0ms | Toggle flips, checkbox state changes |
|
|
650
|
-
| `motion-fast` | 150ms | Hover, focus, small reveals, button press overlay |
|
|
651
|
-
| `motion-standard` | 250ms | The default — sheet opens, card expands, tab switches |
|
|
652
|
-
| `motion-slow` | 400ms | Emphasized transitions — success checkmarks, onboarding step advances |
|
|
653
|
-
| `motion-page` | 350ms | Full-screen transitions between top-level routes |
|
|
654
|
-
|
|
655
|
-
**Easings:**
|
|
656
|
-
|
|
657
|
-
| Token | Curve | Use |
|
|
658
|
-
|---|---|---|
|
|
659
|
-
| `ease-enter` | `cubic-bezier(0.0, 0.0, 0.2, 1)` | Things appearing — sheets, toasts, screen pushes |
|
|
660
|
-
| `ease-exit` | `cubic-bezier(0.4, 0.0, 1, 1)` | Things leaving — dismissals, pops |
|
|
661
|
-
| `ease-standard` | `cubic-bezier(0.4, 0.0, 0.2, 1)` | Two-way transitions — collapsible cards, tab content |
|
|
662
|
-
| `ease-spring` | `cubic-bezier(0.34, 1.56, 0.64, 1)` | Reserved. Only for money-moved success checkmark. Nowhere else — overshoot on routine UI would feel unserious. |
|
|
663
|
-
|
|
664
|
-
**Signature motions.**
|
|
665
|
-
|
|
666
|
-
1. **Money-moves.** When a balance updates, the old number slides up 20px and fades out (`motion-fast / ease-exit`), the new number slides in from below 20px (`motion-standard / ease-enter`). Never cross-fade money — a financial amount flickering between values looks like a bug.
|
|
667
|
-
2. **Bottom-sheet presentation.** Sheets rise from `y+40px` with `motion-standard / ease-enter` and a synchronized backdrop fade from `rgba(2,9,19,0)` to `rgba(2,9,19,0.5)`. Dismissal uses `motion-fast / ease-exit` — leaving feels lighter than entering.
|
|
668
|
-
3. **Success checkmark.** On money-moved confirmation, the checkmark draws over `motion-slow` with `ease-spring`. This is the one place spring easing is licensed. Everywhere else, standard easing.
|
|
669
|
-
4. **Reduce motion.** If `prefers-reduced-motion: reduce`, all `motion-*` tokens collapse to `motion-instant`. No exceptions. Crossfades replace slides. The app stays usable; just less kinetic.
|
|
670
|
-
|
|
671
|
-
<!--
|
|
672
|
-
OmD v0.1 Sources — Philosophy Layer (sections 10–15)
|
|
673
|
-
|
|
674
|
-
Direct verification via WebFetch (2026-04-19):
|
|
675
|
-
- https://toss.im/ — confirms Viva Republica (비바리퍼블리카) as operating company,
|
|
676
|
-
unified-finance super-app positioning ("내 모든 금융 내역을 한눈에 조회하고 한 곳에서 관리하세요"),
|
|
677
|
-
and mission framing "모두의 금융에 자유를" (financial freedom for everyone).
|
|
678
|
-
- https://slash.page/ — confirms Toss maintains a public open-source engineering
|
|
679
|
-
presence ("Copyright © 2024 Viva Republica - Toss Frontend Chapter"), with
|
|
680
|
-
packages including overlay-kit, suspensive, use-funnel — demonstrating the
|
|
681
|
-
design/engineering self-documentation culture referenced in §12 Principles.
|
|
682
|
-
|
|
683
|
-
Base DESIGN.md (sections 1–9) is the source for token-level claims including
|
|
684
|
-
Toss Blue #3182f6, Toss Product Sans, the OKLCH-based palette, and shadow tokens.
|
|
685
|
-
|
|
686
|
-
Not independently verified via WebFetch — widely documented public facts used:
|
|
687
|
-
- Toss (Viva Republica) was founded in 2013; the money-transfer app launched in 2015.
|
|
688
|
-
- Korean legacy-bank institutional palette context (KB, Shinhan, Woori, Hana) is
|
|
689
|
-
general industry knowledge, not a sourced Toss statement.
|
|
690
|
-
|
|
691
|
-
Personas (§13) are fictional archetypes informed by publicly described Korean
|
|
692
|
-
fintech user segments. Any resemblance to specific individuals is unintended.
|
|
693
|
-
|
|
694
|
-
Interpretive claims (e.g., "the specific cerulean was chosen because it was
|
|
695
|
-
not the indigo of any incumbent bank") are editorial readings of the design,
|
|
696
|
-
not documented Toss statements.
|
|
697
|
-
-->
|
|
698
|
-
|
|
356
|
+
No canonical motion duration or easing token is promoted in this revision. Preserve state clarity and reduced-motion compatibility, but label any exact animation curve or duration as a local extension until it is verified from an official component source.
|