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,670 +8,233 @@ homepage: "https://www.gangnamunni.com"
|
|
|
8
8
|
primary_color: "#d54300"
|
|
9
9
|
logo:
|
|
10
10
|
type: favicon
|
|
11
|
-
slug: "https://www.
|
|
12
|
-
verified: "2026-
|
|
11
|
+
slug: "https://www.gangnamunni.com/favicon.ico"
|
|
12
|
+
verified: "2026-07-13"
|
|
13
13
|
omd: "0.1"
|
|
14
14
|
ds:
|
|
15
15
|
name: Gangnamunni Blog
|
|
16
16
|
url: "https://blog.gangnamunni.com/post/welchis/"
|
|
17
17
|
type: brand
|
|
18
|
-
description:
|
|
19
|
-
|
|
18
|
+
description: Official account of Cell for the consumer app and Welchis for the PC back office.
|
|
19
|
+
verification_v2:
|
|
20
|
+
schema: 2
|
|
21
|
+
checked: "2026-07-13"
|
|
22
|
+
surfaces:
|
|
23
|
+
- { id: home, kind: product, url: "https://www.gangnamunni.com/", inspected: "2026-07-13" }
|
|
24
|
+
- { id: events, kind: product, url: "https://www.gangnamunni.com/events", inspected: "2026-07-13" }
|
|
25
|
+
- { id: welchis-post, kind: documentation, url: "https://blog.gangnamunni.com/post/welchis/", inspected: "2026-07-13" }
|
|
26
|
+
sources:
|
|
27
|
+
- { id: live-home, kind: product-surface, url: "https://www.gangnamunni.com/", captured: "2026-07-13" }
|
|
28
|
+
- { id: live-events, kind: product-surface, url: "https://www.gangnamunni.com/events", captured: "2026-07-13" }
|
|
29
|
+
- { id: official-welchis, kind: official-doc, url: "https://blog.gangnamunni.com/post/welchis/", captured: "2026-07-13" }
|
|
30
|
+
- { id: official-voice, kind: official-doc, url: "https://blog.gangnamunni.com/post/ui-text-guideline", captured: "2026-07-13" }
|
|
31
|
+
- { id: pretendard-license, kind: license, url: "https://github.com/orioncactus/pretendard/blob/main/LICENSE", captured: "2026-07-13" }
|
|
32
|
+
claims:
|
|
33
|
+
"tokens.colors.canvas": &card { surface_id: home, source_id: live-home, method: computed-style, selector: "home::[data-omd-capture=20]", captured: "2026-07-13" }
|
|
34
|
+
"tokens.colors.foreground": &cta { surface_id: home, source_id: live-home, method: computed-style, selector: "home::[data-omd-capture=3]", captured: "2026-07-13" }
|
|
35
|
+
"tokens.colors.muted": &events { surface_id: events, source_id: live-events, method: computed-style, selector: "surface-2::p.typo-label-sm-subtle", captured: "2026-07-13" }
|
|
36
|
+
"tokens.colors.surface": &chip { surface_id: home, source_id: live-home, method: computed-style, selector: "home::[data-omd-capture=34]", captured: "2026-07-13" }
|
|
37
|
+
"tokens.colors.border": *cta
|
|
38
|
+
"tokens.typography.family.sans": *card
|
|
39
|
+
"tokens.typography.body.size": *card
|
|
40
|
+
"tokens.typography.body.weight": *card
|
|
41
|
+
"tokens.typography.body.lineHeight": *card
|
|
42
|
+
"tokens.typography.label.size": *chip
|
|
43
|
+
"tokens.typography.label.weight": *chip
|
|
44
|
+
"tokens.typography.label.lineHeight": *chip
|
|
45
|
+
"tokens.typography.title.size": &title { surface_id: home, source_id: live-home, method: computed-style, selector: "home::h3", captured: "2026-07-13" }
|
|
46
|
+
"tokens.typography.title.weight": *title
|
|
47
|
+
"tokens.typography.title.lineHeight": *title
|
|
48
|
+
"tokens.spacing.sm": *cta
|
|
49
|
+
"tokens.spacing.md": *cta
|
|
50
|
+
"tokens.rounded.cta": *cta
|
|
51
|
+
"tokens.rounded.card": *card
|
|
52
|
+
"tokens.rounded.full": *chip
|
|
53
|
+
"tokens.components.outline-cta.type": *cta
|
|
54
|
+
"tokens.components.outline-cta.fg": *cta
|
|
55
|
+
"tokens.components.outline-cta.border": *cta
|
|
56
|
+
"tokens.components.outline-cta.radius": *cta
|
|
57
|
+
"tokens.components.outline-cta.padding": *cta
|
|
58
|
+
"tokens.components.outline-cta.font": *cta
|
|
59
|
+
"tokens.components.outline-cta.states": *cta
|
|
60
|
+
"tokens.components.outline-cta.use": *cta
|
|
61
|
+
"tokens.components.filter-chip.type": *chip
|
|
62
|
+
"tokens.components.filter-chip.bg": *chip
|
|
63
|
+
"tokens.components.filter-chip.fg": *chip
|
|
64
|
+
"tokens.components.filter-chip.radius": *chip
|
|
65
|
+
"tokens.components.filter-chip.height": *chip
|
|
66
|
+
"tokens.components.filter-chip.padding": *chip
|
|
67
|
+
"tokens.components.filter-chip.font": *chip
|
|
68
|
+
"tokens.components.filter-chip.states": *chip
|
|
69
|
+
"tokens.components.filter-chip.use": *chip
|
|
70
|
+
conflicts: []
|
|
20
71
|
tokens:
|
|
21
|
-
source:
|
|
22
|
-
extracted: "2026-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
brand-regular: "#f66336"
|
|
26
|
-
brand-strong-fg: "#ab350c"
|
|
27
|
-
brand-accent-raw: "#ff540f"
|
|
28
|
-
brand-tint-100: "#feeee9"
|
|
29
|
-
brand-tint-50: "#fef6f4"
|
|
30
|
-
canvas: "#ffffff"
|
|
31
|
-
heading: "#131517"
|
|
32
|
-
body: "#3a444d"
|
|
33
|
-
caption: "#697683"
|
|
34
|
-
placeholder: "#8694a2"
|
|
35
|
-
border: "#d8dfe6"
|
|
36
|
-
border-weak: "#e4e8ec"
|
|
37
|
-
surface-subtle: "#eff2f5"
|
|
38
|
-
surface-faint: "#f7f9fa"
|
|
39
|
-
success: "#27a86d"
|
|
40
|
-
success-strong: "#1a8656"
|
|
41
|
-
danger: "#d73f39"
|
|
42
|
-
warning: "#f9c647"
|
|
43
|
-
info: "#3270d6"
|
|
72
|
+
source: reconciled
|
|
73
|
+
extracted: "2026-07-13"
|
|
74
|
+
note: "Only current computed consumer-product values are tokens. Frontmatter primary_color is catalog identity metadata, not a current token."
|
|
75
|
+
colors: { canvas: "#ffffff", foreground: "#131517", muted: "#697683", surface: "#eff2f5", border: "#b5bfc9" }
|
|
44
76
|
typography:
|
|
45
|
-
family: { sans: "
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
title
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
body-lg: { size: 16, weight: 400, lineHeight: 1.5, use: "Primary body, card titles" }
|
|
52
|
-
body: { size: 14, weight: 400, lineHeight: 1.5, use: "Default UI text" }
|
|
53
|
-
label-sm: { size: 13, weight: 500, lineHeight: 1.4, use: "Secondary buttons, links" }
|
|
54
|
-
label-xs: { size: 12, weight: 500, lineHeight: 1.4, use: "Chips, timestamps, tag pills" }
|
|
55
|
-
meta: { size: 11, weight: 400, lineHeight: 1.4, use: "Smallest meta, fine print" }
|
|
56
|
-
spacing: { xs: 4, sm: 8, md: 12, base: 16, lg: 20, xl: 32, section: 48 }
|
|
57
|
-
rounded: { sm: 4, md: 12, lg: 16, full: 9999 }
|
|
58
|
-
shadow:
|
|
59
|
-
soft: "0 4px 12px rgba(0,0,0,0.08)"
|
|
60
|
-
modal: "0 12px 32px rgba(0,0,0,0.16)"
|
|
61
|
-
components:
|
|
62
|
-
button-primary: { type: button, bg: "#d54300", fg: "#ffffff", radius: "16px", padding: "12px 20px", font: "16px / 600", use: "Primary brand CTA; hover #ab350c, disabled orange-200" }
|
|
63
|
-
button-accent: { type: button, bg: "#ff540f", fg: "#ffffff", radius: "16px", padding: "12px 20px", font: "16px / 600", use: "Hot-deal / time-limited promo CTA" }
|
|
64
|
-
button-outline: { type: button, bg: "#ffffff", fg: "#131517", radius: "16px", padding: "10px 16px", font: "14px / 500", use: "Neutral secondary, 1px #d8dfe6 border; hover #f7f9fa" }
|
|
65
|
-
button-subtle: { type: button, bg: "#fef6f4", fg: "#d54300", radius: "16px", padding: "8px 14px", font: "14px / 600", use: "Secondary brand CTA, tinted" }
|
|
66
|
-
button-danger: { type: button, bg: "#d73f39", fg: "#ffffff", radius: "16px", padding: "10px 16px", font: "14px / 600", use: "Destructive action" }
|
|
67
|
-
input-text: { type: input, bg: "#ffffff", fg: "#131517", radius: "12px", padding: "12px 16px", font: "16px / 400", use: "Standard form field, 48px height; focus #d54300, error #d73f39" }
|
|
68
|
-
card-clinic: { type: card, bg: "#ffffff", radius: "12px", padding: "16px", use: "Hospital / doctor card, 1px #d8dfe6 border, no shadow" }
|
|
69
|
-
card-promo: { type: card, bg: "#fef6f4", radius: "12px", padding: "16px", use: "Event / promo card, 1px #feeee9 border" }
|
|
70
|
-
badge-brand: { type: badge, bg: "#ff540f", fg: "#ffffff", radius: "4px", padding: "2px 6px", font: "12px / 700", use: "HOT / 특가 time-sensitive flag" }
|
|
71
|
-
badge-success: { type: badge, bg: "#e8f6ec", fg: "#1a8656", radius: "9999px", padding: "2px 8px", font: "12px / 600", use: "인증 병원 verification badge" }
|
|
72
|
-
badge-info: { type: badge, bg: "#ebf2ff", fg: "#1b59bd", radius: "4px", padding: "2px 6px", font: "11px / 600", use: "Regulatory / certification label" }
|
|
73
|
-
pill-category: { type: badge, bg: "#ffffff", fg: "#131517", radius: "9999px", padding: "6px 12px", font: "14px / 500", use: "Category filter pill; selected #fef6f4 bg + #d54300 text + #fa8563 border" }
|
|
74
|
-
toast: { type: toast, bg: "#131517", fg: "#ffffff", radius: "12px", padding: "12px 16px", font: "14px / 500", use: "Bottom-center toast, 3s duration" }
|
|
77
|
+
family: { sans: "PretendardVariable" }
|
|
78
|
+
body: { size: 16, weight: 400, lineHeight: "24px" }
|
|
79
|
+
label: { size: 14, weight: 500, lineHeight: "19.6px" }
|
|
80
|
+
title: { size: 20, weight: 700, lineHeight: "28px" }
|
|
81
|
+
spacing: { sm: 8, md: 12 }
|
|
82
|
+
rounded: { cta: 6, card: 20, full: 9999 }
|
|
75
83
|
components_harvested: true
|
|
84
|
+
components:
|
|
85
|
+
outline-cta: { type: button, fg: "#131517", border: "1px solid #b5bfc9", radius: "6px", padding: "8px 12px", font: "13px / 600", states: "pressed state captured; no changed pressed value retained", use: "Current small outline CTA on home and events" }
|
|
86
|
+
filter-chip: { type: button, bg: "#eff2f5", fg: "#131517", radius: "9999px", height: "32px", padding: "0px 10px", font: "14px / 500", states: "selected-false and selected-true DOM variants captured; no interaction expansion", use: "Current procedure filter chip on home" }
|
|
76
87
|
---
|
|
77
88
|
|
|
78
89
|
# Design System Inspiration of Gangnamunni (강남언니)
|
|
79
90
|
|
|
80
91
|
## 1. Visual Theme & Atmosphere
|
|
81
92
|
|
|
82
|
-
강남언니
|
|
83
|
-
|
|
84
|
-
The typography is **Pretendard JP Variable** (Korean: PretendardVariable) at five weights (300/400/500/600/700) across a 15-step size ramp (`--cell-base-font-size-100` = 11px through `--cell-base-font-size-1500` = 48px). Pretendard's tight metrics and excellent Korean-Latin pairing make it a natural choice for a market where every screen mixes 한글 (hospital names, body parts, procedure names) with Latin numerals and the occasional English brand term (보톡스, 필러, BTL EmFace). The system uses 600 weight for emphasis on labels, 700 for prices and amounts, and stays at 400 for body — *no display-light experimentation*, no Stripe-style weight 300 headlines. This is finance-precision typography in a beauty-medical context.
|
|
85
|
-
|
|
86
|
-
What truly distinguishes 강남언니 is what it refuses: **no shadows on cards**, no gradients on CTAs, no decorative illustrations on empty states, no warm-pink consumer-beauty cues despite the category. Elevation is communicated by 1px hairline borders in `--cell-base-color-bluegray-200` (`#d8dfe6`) and surface tinting through bluegray-50 (`#f7f9fa`) or orange-50 (`#fef6f4`) instead of drop shadows. The footer is a single broad band of bluegray-100 (`#f5f5f5`) capped by a `4px solid #d6d6d6` top divider — the only "heavy" structural line in the whole layout, used like a paragraph break between content and meta.
|
|
87
|
-
|
|
88
|
-
The brand operates **two design systems** by name (confirmed by the team's own engineering blog at https://blog.gangnamunni.com/post/welchis/):
|
|
89
|
-
- **Cell** — mobile-first (iOS, Android, mobile web). Compiled tokens are visible on the public web bundle as `--cell-base-*` and `--cell-semantic-*`. This is what the consumer surface uses.
|
|
90
|
-
- **Welchis** — PC back-office system. Welchis Design (tone/manner/style) + Welchis UI (Figma library + web library). Storybook is the handoff bridge; no Zeplin pixel-measure.
|
|
91
|
-
|
|
92
|
-
This DESIGN.md focuses on **Cell** — the consumer-facing token system.
|
|
93
|
+
강남언니 is a Korean consumer service for finding and comparing medical-procedure information, hospitals, and event prices. Its current public product routes put this research task ahead of ornamental branding: the homepage and events surface use a white canvas, blue-grey text, quiet grey filter fills, and compact procedure controls that can be scanned quickly. The official team describes Cell as the system for the consumer app across iOS, Android, and mobile web, while Welchis is a separate PC back-office system; their component geometry must not be blended. The product’s public copy frames the service around confidence in a choice, and the design team’s writing guidance connects that confidence to clear, understandable information.
|
|
93
94
|
|
|
94
95
|
**Key Characteristics:**
|
|
95
|
-
-
|
|
96
|
-
-
|
|
97
|
-
-
|
|
98
|
-
-
|
|
99
|
-
- 8px base spacing grid (`--cell-base-dimension-scale-200`)
|
|
100
|
-
- Radius ramp 2px → 32px → `9999px`, with 16px (`radius-400`) as the default chrome radius for buttons / pills / cards
|
|
101
|
-
- Status palette already wired: green-400 success, red-500 danger, yellow-400 warning, blue-500 info — used sparingly
|
|
102
|
-
- Information-density bias: medical category data (price ranges, review counts, doctor specialties) gets list-and-table treatment, not card-hero treatment
|
|
96
|
+
- Current canvas `#ffffff`, foreground `#131517`, muted text `#697683`, and filter surface `#eff2f5`
|
|
97
|
+
- Loaded, visible consumer-product family `PretendardVariable`
|
|
98
|
+
- Compact outline CTA and 32px full-radius filter-chip geometry
|
|
99
|
+
- Cell consumer surfaces and Welchis back-office documentation are separate evidence domains
|
|
103
100
|
|
|
104
101
|
## 2. Color Palette & Roles
|
|
105
102
|
|
|
106
|
-
|
|
107
|
-
- **
|
|
108
|
-
- **
|
|
109
|
-
- **
|
|
110
|
-
- **
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
- **Brand Accent Raw** (`#FF540F`): Raw hex emitted by Tailwind utilities on the live home for "hot-deal" / review-flag fills. Slightly more saturated than `#d54300`; co-existent with the semantic ramp.
|
|
114
|
-
|
|
115
|
-
### Neutral (Bluegray)
|
|
116
|
-
- **Text Primary** (`#131517`): `--cell-base-color-bluegray-900`. Headings, primary text, important labels.
|
|
117
|
-
- **Text 800** (`#21272d`): `--cell-base-color-bluegray-800`. Strong border (`--border-neutral-strong-default`), inverse-bg text.
|
|
118
|
-
- **Text Secondary** (`#3a444d`): `--cell-base-color-bluegray-700`. Body text, secondary headings.
|
|
119
|
-
- **Text 600** (`#515e6a`): `--cell-base-color-bluegray-600`. Long-form body.
|
|
120
|
-
- **Text Tertiary** (`#697683`): `--cell-base-color-bluegray-500`. Captions, meta info, timestamps.
|
|
121
|
-
- **Text Placeholder** (`#8694a2`): `--cell-base-color-bluegray-400`. Input placeholders, disabled text.
|
|
122
|
-
- **Border 300** (`#b5bfc9`): `--cell-base-color-bluegray-300`. Stronger dividers.
|
|
123
|
-
- **Border Default** (`#d8dfe6`): `--cell-base-color-bluegray-200`. `--cell-semantic-color-border-neutral-subtle-default`. Default 1px border on cards, inputs, header sign-in button.
|
|
124
|
-
- **Border Weak** (`#e4e8ec`): `--cell-base-color-bluegray-150`. `--cell-semantic-color-border-neutral-weak-default`. Hairline dividers in lists.
|
|
125
|
-
- **Surface Subtle** (`#eff2f5`): `--cell-base-color-bluegray-100`. Card subtle bg, footer band, section break.
|
|
126
|
-
- **Surface Faint** (`#f7f9fa`): `--cell-base-color-bluegray-50`. Lightest surface wash.
|
|
127
|
-
- **Pure White** (`#ffffff`): `--cell-base-color-white`. Canvas, primary surface.
|
|
128
|
-
|
|
129
|
-
### Status
|
|
130
|
-
- **Success FG** (`#27a86d`): `--cell-base-color-green-400`. Success badges, checkmarks.
|
|
131
|
-
- **Success Strong** (`#1a8656`): `--cell-base-color-green-500`. Strong success border, badge stroke.
|
|
132
|
-
- **Danger** (`#d73f39`): `--cell-base-color-red-500`. Field error, danger CTA, decline.
|
|
133
|
-
- **Danger Weak** (`#f75e54`): `--cell-base-color-red-400`. Inline error text accent.
|
|
134
|
-
- **Warning** (`#f9c647`): `--cell-base-color-yellow-400`. Caution badges (`#fff8e9` tint surface).
|
|
135
|
-
- **Info / Certification** (`#3270d6`): `--cell-base-color-blue-500`. Verified-clinic badges, info banners.
|
|
136
|
-
- **Payment** (`#0b819d`): `--cell-base-color-lightblue-500`. Payment-flow accents, refund states.
|
|
137
|
-
- **Trending** (`pink-300` ramp present): `--cell-base-color-pink-300` is referenced by `--cell-semantic-color-border-trending-subtle-default` — soft pink for trending/popular chips. Used sparingly, never as primary brand.
|
|
138
|
-
|
|
139
|
-
### Tinted Surfaces (for badges)
|
|
140
|
-
- Orange tint (`#feeee9` / `#fef6f4`)
|
|
141
|
-
- Green tint (`#e8f6ec` / `#d5ebdc`)
|
|
142
|
-
- Red tint (`#ffedeb` / `#fff6f5`)
|
|
143
|
-
- Yellow tint (`#fff0d3` / `#fff8e9`)
|
|
144
|
-
- Blue tint (`#ebf2ff` / `#f5f9ff`)
|
|
103
|
+
- **Canvas** (`#ffffff`): captured home feature-card action.
|
|
104
|
+
- **Foreground** (`#131517`): captured home outline CTA and filter chip.
|
|
105
|
+
- **Muted** (`#697683`): captured events-page tertiary label.
|
|
106
|
+
- **Surface** (`#eff2f5`): captured unselected home filter chip.
|
|
107
|
+
- **Border** (`#b5bfc9`): captured home outline CTA.
|
|
108
|
+
|
|
109
|
+
The catalog identity color in frontmatter was not retained as a current computed component value, so no orange value is offered as a reusable UI token.
|
|
145
110
|
|
|
146
111
|
## 3. Typography Rules
|
|
147
112
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
|
159
|
-
|
|
160
|
-
|
|
|
161
|
-
|
|
|
162
|
-
| 300 | 0.8125 | 13 | `label-sm` — secondary buttons, "전체보기" links |
|
|
163
|
-
| 400 | 0.875 | 14 | `label-md` / `body-md` — default UI text |
|
|
164
|
-
| 500 | 1.0 | 16 | `label-lg` / `body-lg` — primary body, card titles |
|
|
165
|
-
| 600 | 1.125 | 18 | `label-xl` / `title-md` — section subheads |
|
|
166
|
-
| 700 | 1.25 | 20 | `title-md-strong` — card headings |
|
|
167
|
-
| 800 | 1.375 | 22 | sub-display |
|
|
168
|
-
| 900 | 1.5 | 24 | `title-lg-strong` — page section titles |
|
|
169
|
-
| 1000 | 1.75 | 28 | `display-md-strongest` — feature headlines |
|
|
170
|
-
| 1100 | 2.0 | 32 | `title-xl-strong` — landing headlines |
|
|
171
|
-
| 1200 | 2.25 | 36 | hero |
|
|
172
|
-
| 1300 | 2.5 | 40 | hero large |
|
|
173
|
-
| 1400 | 2.75 | 44 | hero xl |
|
|
174
|
-
| 1500 | 3.0 | 48 | display max (rare) |
|
|
175
|
-
|
|
176
|
-
### Semantic typography classes (Cell)
|
|
177
|
-
The system emits 7 families × multiple sizes × {regular, strong, strongest, subtle}:
|
|
178
|
-
- `cell-semantic-typography-display-{sm,md}-strongest`
|
|
179
|
-
- `cell-semantic-typography-title-{xs,sm,md,lg,xl}-strong`
|
|
180
|
-
- `cell-semantic-typography-label-{xxs,xs,sm,md,lg,xl}-{regular,strong,subtle}`
|
|
181
|
-
- `cell-semantic-typography-body-single-{sm,md,lg,xl}-{regular,strong,subtle}`
|
|
182
|
-
- `cell-semantic-typography-body-multi-{sm,md,lg,xl}-{regular,subtle}`
|
|
183
|
-
- `cell-semantic-typography-description-{xs,sm,md,lg,xl}-{regular,subtle}`
|
|
184
|
-
- `cell-semantic-typography-caption-*`
|
|
185
|
-
|
|
186
|
-
### Principles
|
|
187
|
-
- **Pretendard everywhere.** No serif, no display custom font, no script. Pretendard's Korean-Latin metrics are the brand's typographic constant.
|
|
188
|
-
- **Numbers are bold (700).** Prices, review counts ("후기 7,300건"), star ratings, distance ("0.4km") all use 700 weight against 400-weight body. The numeric weight contrast is how the eye picks out information.
|
|
189
|
-
- **No tracking experiments.** Letter-spacing token `--cell-base-font-letterspacing-none` is the default everywhere; `letterspacing-200` exists only on `display-strongest`. No Stripe-style negative tracking on headlines.
|
|
190
|
-
- **Display-strongest is rare.** Display sizes (`display-{sm,md}-strongest`) appear on marketing surfaces; the consumer app surface stays in `title-*-strong` (20-32px) and below.
|
|
113
|
+
| Role | Family | Size | Weight | Line Height | Evidence |
|
|
114
|
+
|---|---|---:|---:|---:|---|
|
|
115
|
+
| Body | PretendardVariable | 16px | 400 | 24px | current consumer-product observation |
|
|
116
|
+
| Label | PretendardVariable | 14px | 500 | 19.6px | current home filter chip |
|
|
117
|
+
| Title | PretendardVariable | 20px | 700 | 28px | current home observation |
|
|
118
|
+
|
|
119
|
+
| Evidence class | Status |
|
|
120
|
+
|---|---|
|
|
121
|
+
| **Official product-use** | No current Gangnamunni announcement naming a product font was found. |
|
|
122
|
+
| **Live computed surface-use** | `PretendardVariable` is first family in 616 visible consumer-product observations and has one loaded Gangnamunni-hosted WOFF2 source. |
|
|
123
|
+
| **Official distributed font asset** | Pretendard’s upstream project documents `Pretendard Variable` and SIL Open Font License 1.1; this is not a Gangnamunni distribution claim. |
|
|
124
|
+
| **Documentation chrome** | The Welchis blog loaded separate `pretendard` files in 66 observations; those are not consumer-product tokens. |
|
|
125
|
+
| **Declared-only** | `color-emoji`, `commitMono`, `icomoon`, and fallback families had no visible usage. |
|
|
126
|
+
| **Unresolved** | No public evidence establishes a product font-license notice, native-app type contract, or monospace family. |
|
|
191
127
|
|
|
192
128
|
## 4. Component Stylings
|
|
193
129
|
|
|
194
|
-
###
|
|
195
|
-
|
|
196
|
-
**
|
|
197
|
-
- Background: `#d54300`
|
|
198
|
-
- Text: `#ffffff`
|
|
199
|
-
- Border: none
|
|
200
|
-
- Radius: 16px (`--cell-base-radius-400`)
|
|
201
|
-
- Padding: 12px 20px (`spacing-300` vertical / `spacing-500` horizontal)
|
|
202
|
-
- Font: 16px / 600 / Pretendard JP Variable
|
|
203
|
-
- Hover: Background `#ab350c` (`orange-600`)
|
|
204
|
-
- Pressed: Background `#93250a` (`orange-700`)
|
|
205
|
-
- Disabled: Background `#fbb8a4` (`orange-200`)
|
|
206
|
-
- Use: Primary CTA — "병원 예약하기", "후기 작성하기", "이벤트 보기"
|
|
207
|
-
|
|
208
|
-
**Primary Brand (raw accent variant)**
|
|
209
|
-
- Background: `#FF540F`
|
|
210
|
-
- Text: `#ffffff`
|
|
211
|
-
- Border: 1px solid `#FF540F`
|
|
212
|
-
- Radius: 16px
|
|
213
|
-
- Padding: 12px 20px
|
|
214
|
-
- Font: 16px / 600 / Pretendard JP Variable
|
|
215
|
-
- Use: Hot-deal CTA, time-limited promo — raw Tailwind utility variant of the brand color, slightly more saturated than the semantic `#d54300`.
|
|
216
|
-
|
|
217
|
-
**Outline / Secondary**
|
|
218
|
-
- Background: `#ffffff`
|
|
219
|
-
- Text: `#131517` (bluegray-900)
|
|
220
|
-
- Border: 1px solid `#d8dfe6` (bluegray-200)
|
|
221
|
-
- Radius: 16px (32px → pill when small)
|
|
222
|
-
- Padding: 6px 14px (sign-in size) → 10px 16px (default) → 12px 20px (large)
|
|
223
|
-
- Font: 14-16px / 400-500 / Pretendard JP Variable
|
|
224
|
-
- Hover: Background `#f7f9fa` (bluegray-50)
|
|
225
|
-
- Disabled: Text `#8694a2`, border `#e4e8ec`
|
|
226
|
-
- Use: "로그인/가입" header CTA (32px tall, 16px radius — observed live), filter pills, neutral secondary action.
|
|
227
|
-
|
|
228
|
-
**Ghost / Tertiary**
|
|
229
|
-
- Background: transparent
|
|
230
|
-
- Text: `#3a444d` (bluegray-700)
|
|
231
|
-
- Border: none
|
|
232
|
-
- Radius: 16px
|
|
233
|
-
- Padding: 6px 12px
|
|
234
|
-
- Font: 14px / 500 / Pretendard JP Variable
|
|
235
|
-
- Hover: Background `rgba(216,223,230,0.4)`
|
|
236
|
-
- Use: Tab strip, in-card secondary action, "더보기".
|
|
237
|
-
|
|
238
|
-
**Brand Subtle (tinted)**
|
|
239
|
-
- Background: `#fef6f4` (orange-50)
|
|
240
|
-
- Text: `#d54300` (orange-500)
|
|
241
|
-
- Border: 1px solid `#feeee9` (orange-100) — optional
|
|
242
|
-
- Radius: 16px
|
|
243
|
-
- Padding: 8px 14px
|
|
244
|
-
- Font: 14px / 600 / Pretendard JP Variable
|
|
245
|
-
- Use: Secondary-yet-brand CTA — "관심 병원에 추가", "쿠폰 받기".
|
|
246
|
-
|
|
247
|
-
**Danger**
|
|
248
|
-
- Background: `#d73f39` (red-500)
|
|
249
|
-
- Text: `#ffffff`
|
|
250
|
-
- Border: none
|
|
251
|
-
- Radius: 16px
|
|
252
|
-
- Padding: 10px 16px
|
|
253
|
-
- Font: 14px / 600 / Pretendard JP Variable
|
|
254
|
-
- Hover: Background `#b02b27` (red-600)
|
|
255
|
-
- Use: Destructive action — "예약 취소", "후기 삭제".
|
|
256
|
-
|
|
257
|
-
**Icon Button**
|
|
258
|
-
- Background: transparent
|
|
259
|
-
- Border: none
|
|
260
|
-
- Radius: 9999px (`radius-full`)
|
|
261
|
-
- Hit target: 40px × 40px (8px padding around 24px icon)
|
|
262
|
-
- Hover: Background `#eff2f5` (bluegray-100)
|
|
263
|
-
- Use: Bookmark, share, dismiss.
|
|
264
|
-
|
|
265
|
-
### Inputs & Forms
|
|
266
|
-
|
|
267
|
-
**Text Input — Default**
|
|
268
|
-
- Background: `#ffffff`
|
|
269
|
-
- Text: `#131517`
|
|
270
|
-
- Placeholder: `#8694a2` (bluegray-400)
|
|
271
|
-
- Border: 1px solid `#d8dfe6` (bluegray-200)
|
|
272
|
-
- Radius: 12px (`radius-300`)
|
|
273
|
-
- Padding: 12px 16px
|
|
274
|
-
- Font: 16px / 400 / Pretendard JP Variable
|
|
275
|
-
- Height: 48px
|
|
276
|
-
- Focus: Border `#d54300` (orange-500), focus ring `2px` outset of `radius-300`
|
|
277
|
-
- Error: Border `#d73f39`, ring `red-500`
|
|
278
|
-
- Disabled: Background `#f7f9fa`, text `#8694a2`, border `#e4e8ec`
|
|
279
|
-
- Use: Standard form field — sign-in, review form, hospital review search.
|
|
280
|
-
|
|
281
|
-
**Search Input — Hero**
|
|
282
|
-
- Background: `#eff2f5` (bluegray-100) or `#ffffff` with border
|
|
130
|
+
### Outline CTA
|
|
131
|
+
|
|
132
|
+
**Small outline CTA**
|
|
283
133
|
- Text: `#131517`
|
|
284
|
-
-
|
|
285
|
-
-
|
|
286
|
-
-
|
|
287
|
-
-
|
|
288
|
-
-
|
|
289
|
-
-
|
|
290
|
-
- Use: Hero search bar above category nav.
|
|
134
|
+
- Border: 1px solid `#b5bfc9`
|
|
135
|
+
- Radius: 6px
|
|
136
|
+
- Padding: 8px 12px
|
|
137
|
+
- Font: 13px / 600 / PretendardVariable
|
|
138
|
+
- Pressed: State captured; no changed pressed value retained.
|
|
139
|
+
- Use: `home::[data-omd-capture="3"]`; same fingerprint on home and events.
|
|
291
140
|
|
|
292
|
-
###
|
|
141
|
+
### Procedure filter
|
|
293
142
|
|
|
294
|
-
**
|
|
295
|
-
- Background: `#
|
|
296
|
-
- Border: 1px solid `#d8dfe6` (bluegray-200) — or none on grid layouts where the bluegray-50 page bg provides separation
|
|
297
|
-
- Radius: 12px (`radius-300`)
|
|
298
|
-
- Padding: 16px
|
|
299
|
-
- Shadow: **none by default** — elevation is conveyed by border + bluegray-50 page wash
|
|
300
|
-
- Hover: Background tint `#f7f9fa`, no shadow change
|
|
301
|
-
- Title: 16-18px / 700 / `#131517`
|
|
302
|
-
- Meta row: 13px / 400 / `#697683` — "강남구 · 0.4km · 후기 7,300건"
|
|
303
|
-
- Price row: 14px / 700 / `#131517` with strikethrough on `--list-price` in `#8694a2`
|
|
304
|
-
- Use: Hospital list cards, doctor cards, treatment cards.
|
|
305
|
-
|
|
306
|
-
**Review / Article Card (gap-2 column flex)**
|
|
307
|
-
- Background: transparent (image-led)
|
|
308
|
-
- Border: none
|
|
309
|
-
- Radius: 12px on the image, no container border
|
|
310
|
-
- Title: 16px / 400 / `#000000` (live-observed as `rgb(0,0,0)` — slightly heavier than the semantic bluegray-900 on rich-media surfaces)
|
|
311
|
-
- Padding: 0 (image touches container edges, text below)
|
|
312
|
-
- Height observed: 330px (image + title + meta)
|
|
313
|
-
- Use: 칼럼/community article grid.
|
|
314
|
-
|
|
315
|
-
**Event / Promo Card (orange-tinted)**
|
|
316
|
-
- Background: `#fef6f4` (orange-50)
|
|
317
|
-
- Border: 1px solid `#feeee9` (orange-100)
|
|
318
|
-
- Radius: 12px
|
|
319
|
-
- Padding: 16px
|
|
320
|
-
- Heading accent: `#d54300` or `#FF540F` flag tag (top-left)
|
|
321
|
-
- Use: 핫딜 / 이벤트 / 한정 promo block.
|
|
322
|
-
|
|
323
|
-
### Badges, Tags & Pills
|
|
324
|
-
|
|
325
|
-
**Brand Badge ("HOT", "특가")**
|
|
326
|
-
- Background: `#FF540F`
|
|
327
|
-
- Text: `#ffffff`
|
|
328
|
-
- Border: none
|
|
329
|
-
- Radius: 4px (`radius-100`)
|
|
330
|
-
- Padding: 2px 6px
|
|
331
|
-
- Font: 11-12px / 700 / Pretendard JP Variable
|
|
332
|
-
- Use: Time-sensitive flags overlaid on event cards.
|
|
333
|
-
|
|
334
|
-
**Success Badge ("인증 병원")**
|
|
335
|
-
- Background: `#e8f6ec` (green-100)
|
|
336
|
-
- Text: `#1a8656` (green-500)
|
|
337
|
-
- Border: 1px solid `#aed2ba` (green-200) — optional
|
|
338
|
-
- Radius: 9999px
|
|
339
|
-
- Padding: 2px 8px
|
|
340
|
-
- Font: 12px / 600 / Pretendard JP Variable
|
|
341
|
-
- Use: Verification, success indicators.
|
|
342
|
-
|
|
343
|
-
**Info Badge ("의료광고 사전심의")**
|
|
344
|
-
- Background: `#ebf2ff` (blue-100)
|
|
345
|
-
- Text: `#1b59bd` (blue-600)
|
|
346
|
-
- Border: none
|
|
347
|
-
- Radius: 4px
|
|
348
|
-
- Padding: 2px 6px
|
|
349
|
-
- Font: 11px / 600 / Pretendard JP Variable
|
|
350
|
-
- Use: Regulatory / certification labels.
|
|
351
|
-
|
|
352
|
-
**Neutral Pill (category)**
|
|
353
|
-
- Background: `#ffffff`
|
|
143
|
+
**Unselected fill chip**
|
|
144
|
+
- Background: `#eff2f5`
|
|
354
145
|
- Text: `#131517`
|
|
355
|
-
- Border: 1px solid `#d8dfe6`
|
|
356
146
|
- Radius: 9999px
|
|
357
|
-
-
|
|
358
|
-
-
|
|
359
|
-
-
|
|
360
|
-
-
|
|
147
|
+
- Height: 32px
|
|
148
|
+
- Padding: 0px 10px
|
|
149
|
+
- Font: 14px / 500 / PretendardVariable
|
|
150
|
+
- Selected: Separate selected-true DOM variant captured with `#131517` background and `#ffffff` text; no interaction expansion.
|
|
151
|
+
- Use: `home::[data-omd-capture="34"]`.
|
|
361
152
|
|
|
362
|
-
###
|
|
153
|
+
### Media card action
|
|
363
154
|
|
|
364
|
-
**
|
|
155
|
+
**Home feature-card action**
|
|
365
156
|
- Background: `#ffffff`
|
|
366
|
-
-
|
|
367
|
-
-
|
|
368
|
-
-
|
|
369
|
-
-
|
|
370
|
-
|
|
371
|
-
**Category Nav (icon + label, horizontal)**
|
|
372
|
-
- Item: 88px tall (icon 56px stacked above 13px label)
|
|
373
|
-
- Background: transparent
|
|
374
|
-
- Font: 13px / 400 / `#131517`
|
|
375
|
-
- Use: Procedure category grid on home (제모 / 가슴성형 / 보톡스 / 필러 / 리프팅 / 모발이식 ...)
|
|
376
|
-
|
|
377
|
-
**Bottom Nav (mobile primary chrome)**
|
|
378
|
-
- Background: `#ffffff` (translucent on iOS via backdrop-blur on real mobile shell)
|
|
379
|
-
- Border-top: 1px solid `#d8dfe6`
|
|
380
|
-
- Height: 64-65px
|
|
381
|
-
- Five items: 홈 / 병원 / 이벤트 / 커뮤니티 / 칼럼
|
|
382
|
-
- Active state: icon and label switch to `#d54300` (orange-500)
|
|
383
|
-
- Font: 11px / 500 / Pretendard JP Variable on label
|
|
384
|
-
|
|
385
|
-
### Footer
|
|
386
|
-
- Background: `#f5f5f5` (bluegray-100 alias)
|
|
387
|
-
- Border-top: 4px solid `#d6d6d6` — the system's heaviest single divider
|
|
388
|
-
- Padding: 30px
|
|
389
|
-
- Text: 13-14px / 400 / `#3a444d`
|
|
390
|
-
- Link rows: Company / PR / 병원입점신청 / 이용약관 / 인재영입 / 위치기반서비스 이용약관 / 개인정보처리방침
|
|
391
|
-
- No social icon row inline — kept text-only.
|
|
392
|
-
|
|
393
|
-
### Status & Inline States
|
|
394
|
-
|
|
395
|
-
**Field Error**
|
|
396
|
-
- Border: 1px solid `#d73f39` on input
|
|
397
|
-
- Helper text: 12-13px / 400 / `#d73f39` below input
|
|
398
|
-
- Icon: optional 16px `info` glyph in `#d73f39`
|
|
399
|
-
|
|
400
|
-
**Toast (bottom-center)**
|
|
401
|
-
- Background: `#131517` (bluegray-900)
|
|
402
|
-
- Text: `#ffffff` 14px / 500
|
|
403
|
-
- Border: none
|
|
404
|
-
- Radius: 12px
|
|
405
|
-
- Padding: 12px 16px
|
|
406
|
-
- Duration: 3s
|
|
407
|
-
|
|
408
|
-
**Skeleton**
|
|
409
|
-
- Background: `#eff2f5` (bluegray-100)
|
|
410
|
-
- Radius: matches component being loaded (4 / 8 / 12 / 16)
|
|
411
|
-
- Shimmer: 8% white gradient sweep, 1.2s linear
|
|
157
|
+
- Text: `#000000`
|
|
158
|
+
- Radius: 20px
|
|
159
|
+
- Font: 16px / 400 / PretendardVariable
|
|
160
|
+
- Use: `home::[data-omd-capture="20"]`; 303px rendered height is context, not a portable token.
|
|
412
161
|
|
|
413
162
|
---
|
|
414
163
|
|
|
415
|
-
**Verified:** 2026-
|
|
416
|
-
**Tier 1 sources:** https://www.gangnamunni.com/
|
|
417
|
-
**Tier 2 sources:**
|
|
418
|
-
**
|
|
164
|
+
**Verified:** 2026-07-13 (verification v2; supplied current computed-style bundle plus first-party source review)
|
|
165
|
+
**Tier 1 sources:** https://www.gangnamunni.com/ · https://www.gangnamunni.com/events · https://blog.gangnamunni.com/post/welchis/ · https://blog.gangnamunni.com/post/ui-text-guideline
|
|
166
|
+
**Tier 2 sources:** https://getdesign.md/gangnamunni direct detail attempt returned an internal fetch error; https://styles.refero.design/?q=gangnamunni and https://styles.refero.design/?q=%EA%B0%95%EB%82%A8%EC%96%B8%EB%8B%88 direct search attempts returned internal fetch errors. No Tier 2 value was imported.
|
|
167
|
+
**Surface split:** Home and events are consumer-product surfaces. The Welchis post is documentation context only; its typography and controls are not Cell/product tokens.
|
|
168
|
+
**Conflicts unresolved:** none
|
|
169
|
+
|
|
170
|
+
No importable Tier 2 value was available to conflict with current Tier 1 observations.
|
|
419
171
|
|
|
420
172
|
## 5. Layout Principles
|
|
421
173
|
|
|
422
|
-
|
|
423
|
-
-
|
|
424
|
-
-
|
|
425
|
-
- Page-section vertical rhythm typically uses `spacing-1200` (48px) between major sections, `spacing-800` (32px) within sections.
|
|
426
|
-
|
|
427
|
-
### Grid & Container
|
|
428
|
-
- Mobile-first; the consumer app surface is the primary design target. Web is a re-skin of the mobile layout.
|
|
429
|
-
- Max content width on web home: ~1200px centered with 24px side padding on tablet, 48px+ on desktop.
|
|
430
|
-
- Category nav: 4 columns mobile, 8-10 columns desktop, icons fixed 56px.
|
|
431
|
-
- Card grids: 2 columns mobile, 3-4 columns desktop, 16px gap (`spacing-400`).
|
|
432
|
-
|
|
433
|
-
### Whitespace Philosophy
|
|
434
|
-
- **Information density first.** The category-discovery surface is intentionally dense — users scanning for a treatment do not want a hero. Spacing within cards is tight (16px paddings) while between cards remains generous (16-24px gaps).
|
|
435
|
-
- **Footer-as-paragraph-break.** The single 4px `#d6d6d6` divider is the strongest horizontal rule in the layout — it tells the user "you've reached company info, what's above was content."
|
|
436
|
-
- **Tint, not shadow.** Section breaks use `bluegray-50` or `orange-50` washes rather than elevation. Saves visual budget for the few places where contrast really matters (price, review count, certified-clinic badge).
|
|
437
|
-
|
|
438
|
-
### Border Radius Scale
|
|
439
|
-
- Micro (2-4px): Inline badges, small tags
|
|
440
|
-
- Small (6-8px): Inline chips, status pills
|
|
441
|
-
- Standard (12px): Cards, inputs — the workhorse
|
|
442
|
-
- Medium (16px): **Default chrome radius** — buttons, sign-in pill, search containers, primary CTA
|
|
443
|
-
- Large (20-24px): Bottom sheets, large card variants
|
|
444
|
-
- 32px raw: Special-case rounded chrome (e.g., floating action buttons, full-width media containers)
|
|
445
|
-
- `full` (9999px): Search bar, avatars, icon buttons, category pills
|
|
174
|
+
- Retained component observations include 8px and 12px CTA padding, 10px horizontal chip padding, 6px CTA radius, 20px media-card radius, and full-radius chips.
|
|
175
|
+
- These are public-surface samples, not a complete Cell scale or native-app layout specification.
|
|
176
|
+
- Cell is the consumer system; Welchis is the PC back office. Do not transfer documentation chrome between them.
|
|
446
177
|
|
|
447
178
|
## 6. Depth & Elevation
|
|
448
179
|
|
|
449
|
-
|
|
450
|
-
|---|---|---|
|
|
451
|
-
| Flat (Level 0) | No shadow, no border | Inline text, page bg |
|
|
452
|
-
| Hairline (Level 1) | 1px solid `#d8dfe6` (bluegray-200) | **Default for cards, inputs, headers** — replaces a drop shadow |
|
|
453
|
-
| Tinted Surface (Level 2) | `bluegray-50` (`#f7f9fa`) or `bluegray-100` (`#eff2f5`) bg | Section backgrounds, hover surfaces |
|
|
454
|
-
| Soft Shadow (Level 3) | `0 4px 12px rgba(0, 0, 0, 0.08)` | Bottom sheets, dropdowns, popovers |
|
|
455
|
-
| Modal (Level 4) | `0 12px 32px rgba(0, 0, 0, 0.16)` + 60% black backdrop | Full-screen modals, reservation confirmation |
|
|
456
|
-
| Heavy Divider | `border-top: 4px solid #d6d6d6` | Page footer separation — unique single use |
|
|
457
|
-
|
|
458
|
-
**Elevation philosophy.** Gangnamunni's medical context demands trust, and dramatic shadows look "consumer-app fun" rather than "clinically clean". The system communicates depth through **hairline borders + tinted backgrounds** rather than shadow stacks. Drop shadows appear only at popover/sheet/modal levels — never on resting cards. The single heaviest divider (4px `#d6d6d6` footer top) carries the structural break that other systems would use a section shadow for.
|
|
180
|
+
The retained component representatives report `box-shadow: none`. This describes those components only; it does not establish a global shadow, modal, or card-depth contract.
|
|
459
181
|
|
|
460
182
|
## 7. Do's and Don'ts
|
|
461
183
|
|
|
462
184
|
### Do
|
|
463
|
-
|
|
464
|
-
-
|
|
465
|
-
-
|
|
466
|
-
-
|
|
467
|
-
-
|
|
468
|
-
- Pretendard JP Variable across all locales — the system is multilingual-by-design
|
|
469
|
-
- Use the 16px (`radius-400`) chrome radius for buttons and sign-in CTAs — confirmed by live header inspection
|
|
470
|
-
- Use bluegray-900 (`#131517`) for headings — not `#000`
|
|
185
|
+
|
|
186
|
+
- Name tokens by their captured product role and source surface.
|
|
187
|
+
- Use loaded `PretendardVariable` for a reconstruction of this consumer web capture.
|
|
188
|
+
- Preserve the captured 32px full-radius filter-chip geometry.
|
|
189
|
+
- Keep Cell consumer work separate from Welchis references.
|
|
471
190
|
|
|
472
191
|
### Don't
|
|
473
|
-
|
|
474
|
-
- Don't
|
|
475
|
-
- Don't
|
|
476
|
-
- Don't
|
|
477
|
-
- Don't
|
|
478
|
-
- Don't substitute pure gray for the bluegray neutrals — the cool undertone is intentional
|
|
479
|
-
- Don't add tracking experiments on Korean text — `letterspacing-none` is the default
|
|
480
|
-
- Don't replace category icons with stock photography — the home is icon-grid-driven
|
|
192
|
+
|
|
193
|
+
- Don't promote catalog identity orange without a current component observation.
|
|
194
|
+
- Don't reuse blog `pretendard` or declared `commitMono` as the product family.
|
|
195
|
+
- Don't invent hover, focus, disabled, error, toast, or changed pressed values.
|
|
196
|
+
- Don't promote responsive 303px card height into a general token.
|
|
481
197
|
|
|
482
198
|
## 8. Responsive Behavior
|
|
483
199
|
|
|
484
|
-
|
|
485
|
-
| Name | Width | Key Changes |
|
|
486
|
-
|---|---|---|
|
|
487
|
-
| Mobile | <640px | 4-col category nav, 2-col card grid, bottom nav visible |
|
|
488
|
-
| Tablet | 640-1024px | 6-col category nav, 3-col card grid, bottom nav hidden, header sign-in visible |
|
|
489
|
-
| Desktop | 1024-1280px | 8-10 col category nav, 4-col card grid, full footer |
|
|
490
|
-
| Large Desktop | >1280px | Content max 1200px centered, side padding 48px+ |
|
|
491
|
-
|
|
492
|
-
### Touch Targets
|
|
493
|
-
- Bottom nav items: 64px tall, ≥ 48px wide
|
|
494
|
-
- Sign-in button (header): 32px tall — small for desktop, the mobile shell uses a different chrome
|
|
495
|
-
- Category icons: 56px icon + 13px label = 88px total touch target
|
|
496
|
-
- Card-level tap zones span full card width (no hidden hit-targets)
|
|
497
|
-
|
|
498
|
-
### Collapsing Strategy
|
|
499
|
-
- Header: full nav links → search icon + sign-in pill (mobile)
|
|
500
|
-
- Category nav: 8-10 columns → 4 columns, scrollable horizontal strip on narrow tablet
|
|
501
|
-
- Card grid: 4 → 3 → 2 → 1 column
|
|
502
|
-
- Footer: link grid stacks vertically below 640px
|
|
503
|
-
|
|
504
|
-
### Image Behavior
|
|
505
|
-
- Doctor / clinic / event card images use 12px radius (matching card radius)
|
|
506
|
-
- Aspect ratios: 1:1 (doctor portrait), 4:3 (treatment), 16:9 (event banner)
|
|
507
|
-
- Always `object-fit: cover` — never stretched
|
|
200
|
+
The supplied evidence has one retained capture context and establishes no breakpoints, grids, mobile navigation, or native-app behavior. Treat responsive behavior as unresolved.
|
|
508
201
|
|
|
509
202
|
## 9. Agent Prompt Guide
|
|
510
203
|
|
|
511
|
-
|
|
512
|
-
- Primary brand: Orange `#d54300` (`--cell-base-color-orange-500`)
|
|
513
|
-
- Brand FG regular: Orange `#f66336` (`--cell-base-color-orange-400`)
|
|
514
|
-
- Brand accent raw: `#FF540F`
|
|
515
|
-
- Background canvas: `#ffffff`
|
|
516
|
-
- Surface subtle: Bluegray-100 `#eff2f5` / Bluegray-50 `#f7f9fa`
|
|
517
|
-
- Heading: Bluegray-900 `#131517`
|
|
518
|
-
- Body: Bluegray-700 `#3a444d`
|
|
519
|
-
- Caption: Bluegray-500 `#697683`
|
|
520
|
-
- Border default: Bluegray-200 `#d8dfe6`
|
|
521
|
-
- Success: Green-400 `#27a86d` / Green-500 `#1a8656`
|
|
522
|
-
- Danger: Red-500 `#d73f39`
|
|
523
|
-
- Warning: Yellow-400 `#f9c647`
|
|
524
|
-
- Info: Blue-500 `#3270d6`
|
|
525
|
-
- Footer divider: `#d6d6d6` (4px solid top border) on `#f5f5f5` band
|
|
526
|
-
|
|
527
|
-
### Example Component Prompts
|
|
528
|
-
- "Create a primary brand CTA: background `#d54300`, text `#ffffff`, 16px radius, padding 12px 20px, Pretendard JP Variable 16px weight 600. Hover background `#ab350c`."
|
|
529
|
-
- "Build a hospital card: white background, 1px solid `#d8dfe6` border, 12px radius, 16px padding, **no shadow**. Title at 16px Pretendard weight 700, color `#131517`. Meta row '강남구 · 0.4km · 후기 7,300건' at 13px weight 400 color `#697683`. Price `350,000원` at 14px weight 700 color `#131517` with list price strikethrough in `#8694a2`."
|
|
530
|
-
- "Design a hot-deal badge: background `#FF540F`, white text, 4px radius, 2px 6px padding, 12px Pretendard weight 700. Position absolute top-left of event card."
|
|
531
|
-
- "Create the global header: 48px tall, white background, hairline `#f5f5f5` bottom seam, Pretendard 16px / 400 link text in `#131517`. Sign-in button on the right: 32px tall, white bg, `1px solid #d8dfe6` border, 16px radius, 6px 14px padding, 14px Pretendard 400, '로그인/가입' label."
|
|
532
|
-
- "Build the category nav: 4 columns mobile, 8 desktop. Each item is an 88px-tall stack: 56px icon, 8px gap, 13px Pretendard 400 label in `#131517`. Transparent background. Tap target spans full cell."
|
|
533
|
-
- "Design the footer band: `#f5f5f5` background, `border-top: 4px solid #d6d6d6`, 30px padding, link text 13px Pretendard 400 in `#3a444d`. No social icons inline."
|
|
534
|
-
|
|
535
|
-
### Iteration Guide
|
|
536
|
-
1. **One brand hue only.** If your CTA isn't orange, it isn't the primary CTA. Pink, blue, green are reserved for status, trending chips, or info badges — never primary.
|
|
537
|
-
2. **Hairline > shadow.** Default to `1px solid #d8dfe6` borders on resting cards. Only apply shadows when an element actually floats (popover, sheet, modal).
|
|
538
|
-
3. **Bluegray, not gray.** Always `#697683` for caption, `#3a444d` for body, `#131517` for heading. The cool undertone separates the brand from generic warm-neutral medical UI.
|
|
539
|
-
4. **Numbers in 700.** Prices, review counts, distances all switch to weight 700. Don't mix; numbers should always read "heavier" than surrounding body.
|
|
540
|
-
5. **16px radius for chrome.** Buttons, sign-in pills, primary CTAs all use `radius-400` (16px). Smaller pills (chips, badges) use 4-8px. Search bars and avatars go to `radius-full`.
|
|
541
|
-
6. **No display-light.** Stick to 400-700. The brand does not use weight 300 on display headlines.
|
|
542
|
-
7. **Pretendard JP Variable** is the only font. No serif, no display custom, no script.
|
|
543
|
-
8. **Korean-first copy.** UI labels and CTAs should be Korean by default. English exists in technical labels (BTL, IPL) but never on chrome buttons.
|
|
204
|
+
"Recreate the current Gangnamunni consumer-web filter area with `#ffffff` canvas, `#131517` foreground, `#697683` muted labels, and `#eff2f5` chips. Use loaded `PretendardVariable`; make chips 32px high with 9999px radius and 0px 10px padding. The small outline CTA uses 6px radius, 8px 12px padding, `#131517` text, and a 1px `#b5bfc9` border. Do not add an unobserved primary-orange CTA, shadows, or interaction states."
|
|
544
205
|
|
|
545
206
|
---
|
|
546
207
|
|
|
547
208
|
## 10. Voice & Tone
|
|
548
209
|
|
|
549
|
-
|
|
210
|
+
The official UI-text guideline calls for confident communication, easy-to-understand medical information, and one topic at a time. It permits restrained emphasis, including an exclamation mark, when it makes value or a completed journey clear; the earlier legacy claim banning exclamation marks has been removed.
|
|
550
211
|
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
|
554
|
-
|
|
555
|
-
|
|
|
556
|
-
| CTAs | Imperative + concrete object. "병원 예약하기", "후기 작성하기", "쿠폰 받기", "상담 신청". Never "지금 시작하기!" with exclamation. |
|
|
557
|
-
| Review prompts | Second-person, soft. "솔직한 후기를 들려주세요." Never "꼭 남겨주세요!!". |
|
|
558
|
-
| Hospital meta | Comma-separated facts. `강남구 · 0.4km · 후기 7,300건 · 인증 병원`. Numerals always exact. |
|
|
559
|
-
| Price display | `350,000원` (comma-separated), with `--list-price` strikethrough where applicable. Never `약 35만원`, never `35만원대`. |
|
|
560
|
-
| Empty state (search) | One reassuring line in `#697683`: "조건에 맞는 결과가 없어요. 필터를 조정해보세요." |
|
|
561
|
-
| Error (form / API) | Specific + blameless. "이메일 형식을 확인해주세요." Never "오류가 발생했습니다." |
|
|
562
|
-
| Verification / regulatory | Formal medical-advertising tone — `의료광고 사전심의필`, `보건복지부 지침에 따라` — required by Korean medical-advertising regulation. |
|
|
563
|
-
| Onboarding (overseas / Unni) | English mirror of Korean voice — same restraint, same factual register. |
|
|
564
|
-
|
|
565
|
-
**Forbidden phrases.** `예뻐지세요!`, `~할 수 있어요!` (with exclamation), `약 ~원` on primary pricing, rounded review counts (`후기 약 7,000건`), generic `오류가 발생했습니다`, "✨", "💖", "🥺", any phrase that frames cosmetic surgery as cosmetic-only ("예쁘게"). Promotional sales-speak ("초특가", "100만원 할인!!") is restricted to flagged hot-deal cards with the `#FF540F` badge, never used in body copy.
|
|
566
|
-
|
|
567
|
-
**Voice samples (verified against live home 2026-05-13).**
|
|
568
|
-
1. `종아리 보톡스 맞으면 발목 두꺼워져? 효과·부작용·용량·주기` — article title; question form invites the user, mid-dot separator lists exactly what will be covered. No fluff. *(Verified: gangnamunni.com home, observed via playwright snapshot 2026-05-13.)*
|
|
569
|
-
2. `보톡스 입문자 가이드, 효과·비용·부작용부터 국산vs수입 차이까지` — same pattern: target reader + comma-separated index of contents. Sets expectation precisely. *(Verified: gangnamunni.com home 2026-05-13.)*
|
|
570
|
-
3. `로그인/가입` — the sign-in CTA. One slash, no "회원가입은 무료입니다!". Zero salesmanship. *(Verified: gangnamunni.com header.)*
|
|
212
|
+
| Principle | Apply | Avoid |
|
|
213
|
+
|---|---|---|
|
|
214
|
+
| Confidence | State a feature’s value and completion directly. | Hesitant wording. |
|
|
215
|
+
| Understandability | Use familiar language and a next action for an exception. | Jargon or generic error text. |
|
|
216
|
+
| One topic | Keep one message focused; split distinct cases. | Dense combined instructions. |
|
|
571
217
|
|
|
572
218
|
## 11. Brand Narrative
|
|
573
219
|
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
The company crossed the **예비 유니콘 (pre-unicorn)** threshold by 2021 and as of recent funding has cumulative investment near **313억원 ($230M+)** across multiple rounds: Seed 2015-07 (3억), Series A 2019-07 (45억) with Premier Partners / Stonebridge Ventures / Won-Ik Investment, Series B 2020-03 (185억) with Premier / Stonebridge / Legend Capital / Hana Ventures / KB Investment, and a Series D growth round of **428억원** in **2025-02** ([Hankook Ilbo — 2025-02-17](https://www.hankookilbo.com/News/Read/A2025021715490005621), [TheVC — Healingpaper](https://thevc.kr/healingpaper)). The platform now serves **7M+ users globally** across Korea, Japan, Thailand, and other markets — the overseas-only app *Unni* alone passed **700,000 users by March 2024**.
|
|
577
|
-
|
|
578
|
-
The design system is named **Cell** (mobile: iOS / Android / mWeb) and **Welchis** (PC back-office for partner clinics) — the team published the rationale on their own engineering blog: *"앱과 백오피스는 UX 패턴이 본질적으로 달라서 (앱은 바텀시트, 백오피스는 팝업·테이블), 한 시스템으로 묶기보다 둘로 나눴습니다."* (the back-office and the consumer app have fundamentally different UX patterns — bottom sheets vs. popups-and-tables — so they're split rather than merged) ([Welchis 소개 — gangnamunni blog](https://blog.gangnamunni.com/post/welchis/)). Welchis itself is split into **Welchis Design** (tone / manner / visual) and **Welchis UI** (Figma file + web component library), with Storybook as the design-engineering handoff bridge — explicitly replacing Zeplin pixel-measurement.
|
|
579
|
-
|
|
580
|
-
What 강남언니 refuses: the visual vocabulary of consumer-beauty apps (cartoon pinks, sparkle emojis, "예뻐지는 비결"), the opacity of legacy cosmetic-surgery media (rounded pricing, anonymous testimonials, undisclosed paid placements), and the institutional sterility of hospital websites (cold blues, medical iconography). What it embraces: exact numerals (`후기 7,300건`, `0.4km`), single-hue brand restraint (orange-500 only), bluegray neutrals (warmer than pure gray, cooler than beige), and a footer that ends with `의료광고 사전심의` rather than social-media icons.
|
|
220
|
+
The public product presents Gangnamunni as a place to compare procedure information and prices with confidence in a choice. The company’s design writing states a mission to make better medical services accessible to anyone and describes customer perspective as central to product work. Its engineering account separates Cell’s consumer mobile platforms from Welchis’s PC back office because their users and interaction patterns differ.
|
|
581
221
|
|
|
582
222
|
## 12. Principles
|
|
583
223
|
|
|
584
|
-
1. **
|
|
585
|
-
2. **
|
|
586
|
-
3. **
|
|
587
|
-
4. **Hairlines over shadows.** Default elevation is a 1px `#d8dfe6` border, not a drop shadow. Shadows are reserved for surfaces that *literally* float (popover, sheet, modal). This is the system's strictest aesthetic line — consumer-app shadow stacks would make the surface feel less like a medical product. *UI implication: resting cards never have `box-shadow`. A designer adding one is making the surface "less trusted," even if it looks "more polished."*
|
|
588
|
-
5. **Two systems, one voice.** Cell (app) and Welchis (back-office) are split because their *form* differs, not because their *voice* differs. The tone of an error message on the partner-clinic dashboard reads the same as the tone of a review prompt on the consumer app — both refuse "오류가 발생했습니다" in favor of specific blameless guidance. *UI implication: a designer working in Welchis cannot import consumer-app voice patterns directly, but they cannot drift into IT-admin sterility either.*
|
|
589
|
-
6. **Regulatory disclosure is part of the design.** Korean medical advertising is regulated; `의료광고 사전심의필` and `보건복지부 지침` callouts are mandatory and visible on the footer. The system treats those badges as **part of trust** rather than legal afterthought — they're typeset with the same care as a UI label. *UI implication: never hide regulatory text in a sub-modal. It belongs on the surface, near the action.*
|
|
590
|
-
7. **Korean is primary, not localized.** The product is a Korean medical platform first; English and other-locale strings (Japanese, Thai) are translations of the Korean source-of-truth, not parallel design targets. Pretendard JP Variable was chosen because it renders Korean and Japanese with equal care — but the design grammar is Korean-first. *UI implication: a UI string that reads well in English but awkwardly in Korean must be rewritten. The reverse is acceptable.*
|
|
224
|
+
1. **Make the next step understandable.** *UI implication:* give an error a concrete recovery action when current evidence supports that state.
|
|
225
|
+
2. **Keep a message to one topic.** *UI implication:* separate unrelated procedure conditions or instructions.
|
|
226
|
+
3. **Use the system for its user and platform.** *UI implication:* do not import Welchis desktop geometry into Cell without direct evidence.
|
|
591
227
|
|
|
592
228
|
## 13. Personas
|
|
593
229
|
|
|
594
|
-
|
|
230
|
+
No named synthetic personas are included. First-party sources substantiate only consumer-app users (Cell) and PC back-office users (Welchis).
|
|
595
231
|
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
**선생님 박 (Dr. Park), 47, 강남.** Plastic surgeon, head of a 4-doctor clinic. Uses the **Welchis** back-office daily to manage events, respond to consultations, and track inquiry-to-booking conversion. Has strong opinions about the consultation-response template UI — wants no animation delay between "new message" toast and the chat opening. Reads the Welchis Storybook component names ("HeaderDefault", "BookingTable") in the same language as his front-end developer son, which he considers oddly satisfying.
|
|
599
|
-
|
|
600
|
-
**Mei (메이), 32, 上海 → 강남.** Inbound medical-tourism user, uses the *Unni* overseas app in English with occasional 한글 cross-references when she sees a doctor's name. Decision factors in priority order: certification badge → before/after photos (`수술 전후`) → English-fluent staff indicator → price range → distance from her hotel. Will not book without a written quote in writing within the app — phone-call-only clinics are filtered out.
|
|
601
|
-
|
|
602
|
-
**준호 (Junho), 34, 대구.** Considering 모발이식 after a year of medication that plateaued. Browses on mobile during lunch breaks. Sensitive to pricing transparency — has bookmarked one clinic specifically because their event card shows `1,500모: 2,400,000원` (exact graft count, exact price) rather than the more common `상담 후 결정`. Reads the 칼럼 article gateway titles ("탈모 정도별 추천 시술") as decision aids, not entertainment.
|
|
232
|
+
**[FILL IN]** Add research-backed decision, accessibility, and locale needs only when a user or first-party source supplies them.
|
|
603
233
|
|
|
604
234
|
## 14. States
|
|
605
235
|
|
|
606
|
-
|
|
607
|
-
|---|---|
|
|
608
|
-
| **Empty (saved-hospitals list)** | White canvas. Bluegray-700 body text at 16px: `아직 저장한 병원이 없어요.` Single brand CTA below: `병원 둘러보기` (16px Pretendard weight 600, white text, `#d54300` background, 16px radius). No illustration, no mascot. |
|
|
609
|
-
| **Empty (search results)** | Bluegray-500 caption at 14px: `조건에 맞는 결과가 없어요.` Filter chips remain visible above so the user can adjust scope. No suggested-content fallback grid (the system trusts the user to refine the query themselves). |
|
|
610
|
-
| **Empty (no reviews yet on a hospital page)** | Bluegray-700 single line: `아직 후기가 작성되지 않았어요.` + secondary brand-subtle CTA: `첫 후기 작성하기` in `#fef6f4` bg / `#d54300` text. |
|
|
611
|
-
| **Loading (first paint — hospital list)** | Skeleton blocks at `#eff2f5` (bluegray-100), exact final card dimensions, 12px radius matching cards. 1.2s shimmer at 8% white. Price areas show narrower skeleton bars (matches the typographic width of `350,000원`) — never wider than the final value. |
|
|
612
|
-
| **Loading (in-place refresh — review list)** | 2px `#d54300` progress bar across the top of the list. Previous reviews stay visible and interactive. No spinner overlay. |
|
|
613
|
-
| **Error (form validation)** | Field-level. 1px solid `#d73f39` (red-500) border on the input. Below the input: 13px `#d73f39` text describing exactly what's invalid (`전화번호 형식을 확인해주세요. 예: 010-1234-5678.`). Never `필수 입력입니다.` alone. |
|
|
614
|
-
| **Error (API call failed)** | Inline banner above the action area. `#fff6f5` (red-50) background, 1px `#fbb7af` (red-200) border, 13px `#d73f39` text. Message = what failed + concrete retry guidance (`예약 정보를 불러오지 못했어요. 잠시 후 다시 시도해주세요.`). Retry button as Outline secondary. |
|
|
615
|
-
| **Error (network / offline)** | Full-screen state. White canvas. 16px `#131517` heading `연결이 끊어졌어요.` + 14px `#697683` subtitle `네트워크 상태를 확인해주세요.` + Outline retry button. |
|
|
616
|
-
| **Success (booking confirmed)** | Dedicated confirmation surface — not a toast. `#27a86d` (green-400) checkmark icon top-center (40px), heading `예약이 완료됐어요` at 20px weight 700 below, then booking facts (clinic / doctor / date / price). Single brand CTA: `예약 내역 보기`. Money-affecting actions are never toasts. |
|
|
617
|
-
| **Success (review saved / settings updated)** | 3s auto-dismiss toast bottom-center. `#131517` bg, white 14px weight 500 text, 12px radius, `후기를 저장했어요`. No emoji, no exclamation. |
|
|
618
|
-
| **Skeleton** | `#eff2f5` blocks at exact final dimensions, radius matched to the loading component (4 / 8 / 12 / 16). Linear-gradient shimmer 8% white over 1.2s. Prices and other tabular numerals always render `--` rather than a skeleton block (a placeholder block where money is expected reads as "the system thinks something is here" — visually misleading). |
|
|
619
|
-
| **Disabled** | Button opacity collapses surface and text together. Brand-orange CTA disabled → `#fbb8a4` (orange-200). Outline button disabled → text `#8694a2`, border `#e4e8ec`. Geometry never changes. |
|
|
620
|
-
| **Selected (category pill)** | Background switches from white to `#fef6f4` (orange-50). Text switches from `#131517` to `#d54300`. Border switches from `#d8dfe6` to `#fa8563` (orange-300). |
|
|
236
|
+
**[FILL IN]** The supplied bundle has `interactionCount: 0` and no current first-party contract for loading, empty, error, success, disabled, or selection behavior beyond the captured DOM variants.
|
|
621
237
|
|
|
622
238
|
## 15. Motion & Easing
|
|
623
239
|
|
|
624
|
-
**
|
|
625
|
-
|
|
626
|
-
| Token | Value | Use |
|
|
627
|
-
|---|---|---|
|
|
628
|
-
| `motion-instant` | 0ms | Toggle flips, checkmark commits, focus rings |
|
|
629
|
-
| `motion-fast` | 150ms | Hover, focus, small reveals, pill-select state change |
|
|
630
|
-
| `motion-standard` | 250ms | Default — sheet open, card expand, tab switch, dropdown |
|
|
631
|
-
| `motion-slow` | 350ms | Booking-confirmation surface entry, success checkmark draw |
|
|
632
|
-
| `motion-page` | 320ms | Top-level route transitions on web; iOS-style push on mobile |
|
|
633
|
-
|
|
634
|
-
**Easings.**
|
|
635
|
-
|
|
636
|
-
| Token | Curve | Use |
|
|
637
|
-
|---|---|---|
|
|
638
|
-
| `ease-enter` | `cubic-bezier(0.0, 0.0, 0.2, 1)` | Things arriving — bottom sheets, toasts, success surfaces |
|
|
639
|
-
| `ease-exit` | `cubic-bezier(0.4, 0.0, 1, 1)` | Dismissals — sheet close, toast disappear |
|
|
640
|
-
| `ease-standard` | `cubic-bezier(0.4, 0.0, 0.2, 1)` | Two-way transitions — tabs, collapsible filter, accordion |
|
|
641
|
-
|
|
642
|
-
**Explicitly forbidden.** No spring, no bounce, no overshoot. The medical category cannot afford the consumer-app "delight" register. A button that wiggles on press reads less trustworthy. The system intentionally has no `ease-spring` token (unlike Toss, which licenses one specifically for the money-moved checkmark — 강남언니's confirmation surface uses `motion-slow / ease-enter` linear-checkmark draw instead, no overshoot).
|
|
643
|
-
|
|
644
|
-
**Signature motions.**
|
|
645
|
-
|
|
646
|
-
1. **Bottom-sheet present (mobile).** Sheets rise from `y+40px` with `motion-standard / ease-enter`, synchronized backdrop fade from `rgba(19,21,23,0)` to `rgba(19,21,23,0.5)`. Dismissal uses `motion-fast / ease-exit`. The sheet is the dominant pattern for hospital-detail, doctor-detail, review-photo gallery.
|
|
647
|
-
2. **Category pill select.** When a user picks a procedure (보톡스 → selected), the pill background transitions from white → `#fef6f4` over `motion-fast / ease-standard`, the text color transitions in parallel. Border stroke transition is on the same curve. No scale animation, no shadow pulse.
|
|
648
|
-
3. **Booking confirmation entry.** When `예약 완료` surface mounts: checkmark icon draws from center over `motion-slow / ease-enter` (stroke-dashoffset animation, no bounce). Body content fades in at `motion-standard / ease-enter` with a `y+8px` slide. The entire sequence reads as **calm** rather than celebratory — appropriate for a high-stakes medical-procedure booking.
|
|
649
|
-
4. **Reduce motion.** Under `prefers-reduced-motion: reduce`, all `motion-*` tokens collapse to `motion-instant`. The sheet appears in place. The checkmark renders complete. The app is fully usable without any kinetic feedback.
|
|
650
|
-
|
|
651
|
-
<!--
|
|
652
|
-
OmD v0.1 Sources — Philosophy Layer (§10-15)
|
|
653
|
-
|
|
654
|
-
Direct verification (2026-05-13):
|
|
655
|
-
- https://www.gangnamunni.com/ — voice samples §10 (article titles "종아리 보톡스...", "보톡스 입문자 가이드...", header CTA "로그인/가입")
|
|
656
|
-
confirmed via playwright snapshot.
|
|
657
|
-
- https://blog.gangnamunni.com/post/welchis/ — confirms Cell + Welchis architecture, Storybook handoff,
|
|
658
|
-
custom UI library rationale (multiple products requiring consistent updates, third-party API
|
|
659
|
-
conflicts with design specs, fork maintenance burden, missing component classes).
|
|
660
|
-
- https://www.hankookilbo.com/News/Read/A2025021715490005621 — 2025-02 Series D 428억원 round.
|
|
661
|
-
- https://thevc.kr/healingpaper — cumulative funding ≈ 313억, founder/CEO 홍승일.
|
|
662
|
-
- https://www.rocketpunch.com/@vanitymind — confirms 홍승일 as Healingpaper Co-founder/CEO (vanitymind handle).
|
|
663
|
-
- https://www.rocketpunch.com/companies/healingpaper — 2012-07 founding, company profile.
|
|
664
|
-
|
|
665
|
-
Not independently verified — widely reported public facts used:
|
|
666
|
-
- 7M+ global users across KR / JP / TH (multiple press cites, see WebSearch synthesis 2026-05-13).
|
|
667
|
-
- 'Unni' overseas app at 700,000 users as of 2024-03.
|
|
668
|
-
|
|
669
|
-
Personas (§13) are fictional archetypes informed by publicly observable 강남언니 user segments
|
|
670
|
-
(Korean cosmetic-procedure researchers, overseas medical-tourism users, partner-clinic operators).
|
|
671
|
-
Names and specific shortlist sizes / 모 counts are illustrative.
|
|
672
|
-
|
|
673
|
-
Interpretive claims (e.g., "the brand's refusal of pink-and-sparkle consumer-beauty cues is a refusal
|
|
674
|
-
of the legacy 압구정 media culture", "hairline borders are stricter aesthetic line than shadow stacks
|
|
675
|
-
in a medical context") are editorial readings connecting the system's observed restraint to its
|
|
676
|
-
category positioning, not directly sourced 강남언니 statements.
|
|
677
|
-
-->
|
|
240
|
+
**[FILL IN]** No current first-party motion token, duration, easing curve, or reduced-motion behavior was collected.
|