Gangnamunni (강남언니)'s design system uses #d54300 as its primary color and Pretendard JP Variable for typography and ui-monospace for code, with 16px corner radius. 강남언니's web surface is the rare medical platform that reads as warm rather than clinical.
강남언니's web surface is the rare medical platform that reads as warm rather than clinical. The page opens on pure white (#ffffff) with deep blue-gray text (#131517 — --cell-base-color-bluegray-900) and a single saturated orange (#d54300 / #FF540F accent) doing all the brand work. There is no "medical blue", no surgical green, no pastel reassurance palette. Instead the system commits to one warm hue and lets the rest of the canvas stay cool-neutral — bluegray, never true gray. The combination reads as honest information first, hospitality second — appropriate for a category (성형수술·피부시술 reviews and hospital discovery) where users arrive cautious and need facts before they need feelings.
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.
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.
The brand operates two design systems by name (confirmed by the team's own engineering blog at https://blog.gangnamunni.com/post/welchis/):
--cell-base-* and --cell-semantic-*. This is what the consumer surface uses.This DESIGN.md focuses on Cell — the consumer-facing token system.
Key Characteristics:
#d54300 (semantic strong) / #f66336 (semantic regular) / #FF540F (raw accent fill used on hot-deal and review badges)--cell-base-dimension-scale-200)9999px, with 16px (radius-400) as the default chrome radius for buttons / pills / cards#d54300): --cell-base-color-orange-500. Deep brand orange. Used for the primary brand mark, brand-strong text, pressed states.#f66336): --cell-base-color-orange-400. --cell-semantic-color-fg-brand-regular-default. Primary brand FG — links, icons, accent text.#ab350c): --cell-base-color-orange-600. --cell-semantic-color-fg-brand-strong-default. Used where brand text must override a tinted background.#fa8563): --cell-base-color-orange-300. --cell-semantic-color-border-brand-subtle-default. Subtle orange-tinted border on selected pills, chip outlines.#feeee9): --cell-base-color-orange-100. Surface for promoted rows, hot-deal cards, brand-tinted badges.#fef6f4): --cell-base-color-orange-50. Lightest brand wash — section backgrounds, hover wash on neutral surfaces.#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.#131517): --cell-base-color-bluegray-900. Headings, primary text, important labels.#21272d): --cell-base-color-bluegray-800. Strong border (--border-neutral-strong-default), inverse-bg text.#3a444d): --cell-base-color-bluegray-700. Body text, secondary headings.#515e6a): --cell-base-color-bluegray-600. Long-form body.#697683): --cell-base-color-bluegray-500. Captions, meta info, timestamps.#8694a2): --cell-base-color-bluegray-400. Input placeholders, disabled text.#b5bfc9): --cell-base-color-bluegray-300. Stronger dividers.#d8dfe6): --cell-base-color-bluegray-200. --cell-semantic-color-border-neutral-subtle-default. Default 1px border on cards, inputs, header sign-in button.#e4e8ec): --cell-base-color-bluegray-150. --cell-semantic-color-border-neutral-weak-default. Hairline dividers in lists.#eff2f5): --cell-base-color-bluegray-100. Card subtle bg, footer band, section break.#f7f9fa): --cell-base-color-bluegray-50. Lightest surface wash.#ffffff): --cell-base-color-white. Canvas, primary surface.#27a86d): --cell-base-color-green-400. Success badges, checkmarks.#1a8656): --cell-base-color-green-500. Strong success border, badge stroke.#d73f39): --cell-base-color-red-500. Field error, danger CTA, decline.#f75e54): --cell-base-color-red-400. Inline error text accent.#f9c647): --cell-base-color-yellow-400. Caution badges (#fff8e9 tint surface).#3270d6): --cell-base-color-blue-500. Verified-clinic badges, info banners.#0b819d): --cell-base-color-lightblue-500. Payment-flow accents, refund states.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.#feeee9 / #fef6f4)#e8f6ec / #d5ebdc)#ffedeb / #fff6f5)#fff0d3 / #fff8e9)#ebf2ff / #f5f9ff)Pretendard JP Variable, fallback PretendardVariable → PretendardVariable Fallback → sans-serifui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospacePretendard JP Variable (default/JP), Noto Sans JP, Noto Sans SC, Noto Sans TC, Noto Sans Thai, PingFang SC/TC, Hiragino Sans, Sukhumvit — the brand supports Korean, Japanese, Thai, and Chinese rendering through the same Cell semantic typography classes.--cell-base-font-weight-{300..700}. The product uses 400 for body, 500-600 for labels/buttons, 700 for prices and amounts. 300 exists in the ramp but is rare on-product.--cell-base-font-size-*)| Token | rem | px | Use |
|---|---|---|---|
| 100 | 0.6875 | 11 | Smallest meta — legal, very fine print |
| 200 | 0.75 | 12 | label-xs — chips, timestamps, tag pills |
| 300 | 0.8125 | 13 | label-sm — secondary buttons, "전체보기" links |
| 400 | 0.875 | 14 | label-md / body-md — default UI text |
| 500 | 1.0 | 16 | label-lg / body-lg — primary body, card titles |
| 600 | 1.125 | 18 | label-xl / title-md — section subheads |
| 700 | 1.25 | 20 | title-md-strong — card headings |
| 800 | 1.375 | 22 | sub-display |
| 900 | 1.5 | 24 | title-lg-strong — page section titles |
| 1000 | 1.75 | 28 | display-md-strongest — feature headlines |
| 1100 | 2.0 | 32 | title-xl-strong — landing headlines |
| 1200 | 2.25 | 36 | hero |
| 1300 | 2.5 | 40 | hero large |
| 1400 | 2.75 | 44 | hero xl |
| 1500 | 3.0 | 48 | display max (rare) |
The system emits 7 families × multiple sizes × {regular, strong, strongest, subtle}:
cell-semantic-typography-display-{sm,md}-strongestcell-semantic-typography-title-{xs,sm,md,lg,xl}-strongcell-semantic-typography-label-{xxs,xs,sm,md,lg,xl}-{regular,strong,subtle}cell-semantic-typography-body-single-{sm,md,lg,xl}-{regular,strong,subtle}cell-semantic-typography-body-multi-{sm,md,lg,xl}-{regular,subtle}cell-semantic-typography-description-{xs,sm,md,lg,xl}-{regular,subtle}cell-semantic-typography-caption-*--cell-base-font-letterspacing-none is the default everywhere; letterspacing-200 exists only on display-strongest. No Stripe-style negative tracking on headlines.display-{sm,md}-strongest) appear on marketing surfaces; the consumer app surface stays in title-*-strong (20-32px) and below.Primary Brand
#d54300#ffffff--cell-base-radius-400)spacing-300 vertical / spacing-500 horizontal)#ab350c (orange-600)#93250a (orange-700)#fbb8a4 (orange-200)Primary Brand (raw accent variant)
#FF540F#ffffff#FF540F#d54300.Outline / Secondary
#ffffff#131517 (bluegray-900)#d8dfe6 (bluegray-200)#f7f9fa (bluegray-50)#8694a2, border #e4e8ecGhost / Tertiary
#3a444d (bluegray-700)rgba(216,223,230,0.4)Brand Subtle (tinted)
#fef6f4 (orange-50)#d54300 (orange-500)#feeee9 (orange-100) — optionalDanger
#d73f39 (red-500)#ffffff#b02b27 (red-600)Icon Button
radius-full)#eff2f5 (bluegray-100)Text Input — Default
#ffffff#131517#8694a2 (bluegray-400)#d8dfe6 (bluegray-200)radius-300)#d54300 (orange-500), focus ring 2px outset of radius-300#d73f39, ring red-500#f7f9fa, text #8694a2, border #e4e8ecSearch Input — Hero
#eff2f5 (bluegray-100) or #ffffff with border#131517#697683 (bluegray-500) — "병원, 시술, 의사 검색"#d8dfe6radius-full)Doctor / Clinic Card
#ffffff#d8dfe6 (bluegray-200) — or none on grid layouts where the bluegray-50 page bg provides separationradius-300)#f7f9fa, no shadow change#131517#697683 — "강남구 · 0.4km · 후기 7,300건"#131517 with strikethrough on --list-price in #8694a2Review / Article Card (gap-2 column flex)
#000000 (live-observed as rgb(0,0,0) — slightly heavier than the semantic bluegray-900 on rich-media surfaces)Event / Promo Card (orange-tinted)
#fef6f4 (orange-50)#feeee9 (orange-100)#d54300 or #FF540F flag tag (top-left)Brand Badge ("HOT", "특가")
#FF540F#ffffffradius-100)Success Badge ("인증 병원")
#e8f6ec (green-100)#1a8656 (green-500)#aed2ba (green-200) — optionalInfo Badge ("의료광고 사전심의")
#ebf2ff (blue-100)#1b59bd (blue-600)Neutral Pill (category)
#ffffff#131517#d8dfe6#fef6f4 (orange-50), text #d54300, border #fa8563Global Header
#ffffff0px solid #f5f5f5 (effectively a hairline divider via Tailwind utility — visually a subtle seam)outline variant — 32px tall, 16px radius)Category Nav (icon + label, horizontal)
#131517Bottom Nav (mobile primary chrome)
#ffffff (translucent on iOS via backdrop-blur on real mobile shell)#d8dfe6#d54300 (orange-500)#f5f5f5 (bluegray-100 alias)#d6d6d6 — the system's heaviest single divider#3a444dField Error
#d73f39 on input#d73f39 below inputinfo glyph in #d73f39Toast (bottom-center)
#131517 (bluegray-900)#ffffff 14px / 500Skeleton
#eff2f5 (bluegray-100)Verified: 2026-05-13
Tier 1 sources: https://www.gangnamunni.com/ (live DOM getComputedStyle on header / sign-in button / category nav / article card / bottom nav / footer); https://next-static.gangnamunni.com/cheetah/rc-ad53c62/_next/static/css/d246c5b2edcb00b6.css (production CSS bundle — full --cell-base-* + --cell-semantic-* token map extracted); https://blog.gangnamunni.com/post/welchis/ (engineering blog confirming Cell + Welchis two-system architecture)
Tier 2 sources: Tier 2: not found in getdesign/refero as of 2026-05-13 (getdesign.md/gangnamunni → "No designs found"; styles.refero.design/?q=gangnamunni and ?q=강남언니 → no brand-matched style cards)
Conflicts unresolved: none (no Tier 2 data to conflict with Tier 1)
--cell-base-dimension-scale-200 = 0.5rem)spacing-1200 (48px) between major sections, spacing-800 (32px) within sections.spacing-400).#d6d6d6 divider is the strongest horizontal rule in the layout — it tells the user "you've reached company info, what's above was content."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).full (9999px): Search bar, avatars, icon buttons, category pills| Level | Treatment | Use |
|---|---|---|
| Flat (Level 0) | No shadow, no border | Inline text, page bg |
| Hairline (Level 1) | 1px solid #d8dfe6 (bluegray-200) | Default for cards, inputs, headers — replaces a drop shadow |
| Tinted Surface (Level 2) | bluegray-50 (#f7f9fa) or bluegray-100 (#eff2f5) bg | Section backgrounds, hover surfaces |
| Soft Shadow (Level 3) | 0 4px 12px rgba(0, 0, 0, 0.08) | Bottom sheets, dropdowns, popovers |
| Modal (Level 4) | 0 12px 32px rgba(0, 0, 0, 0.16) + 60% black backdrop | Full-screen modals, reservation confirmation |
| Heavy Divider | border-top: 4px solid #d6d6d6 | Page footer separation — unique single use |
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.
#d54300 (or raw #FF540F for time-sensitive flags) as the sole brand accent — orange is the entire brand identity#d8dfe6 borders on cards instead of drop shadows#fef6f4) as a tint surface for event/promo cards — keeps the brand orange visible without an overwhelming CTA-orange washradius-400) chrome radius for buttons and sign-in CTAs — confirmed by live header inspection#131517) for headings — not #000#000000) for headings — always #131517 bluegray-900 (live-observed black-on-rich-media images is an exception)letterspacing-none is the default| Name | Width | Key Changes |
|---|---|---|
| Mobile | <640px | 4-col category nav, 2-col card grid, bottom nav visible |
| Tablet | 640-1024px | 6-col category nav, 3-col card grid, bottom nav hidden, header sign-in visible |
| Desktop | 1024-1280px | 8-10 col category nav, 4-col card grid, full footer |
| Large Desktop | >1280px | Content max 1200px centered, side padding 48px+ |
object-fit: cover — never stretched#d54300 (--cell-base-color-orange-500)#f66336 (--cell-base-color-orange-400)#FF540F#ffffff#eff2f5 / Bluegray-50 #f7f9fa#131517#3a444d#697683#d8dfe6#27a86d / Green-500 #1a8656#d73f39#f9c647#3270d6#d6d6d6 (4px solid top border) on #f5f5f5 band#d54300, text #ffffff, 16px radius, padding 12px 20px, Pretendard JP Variable 16px weight 600. Hover background #ab350c."#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."#FF540F, white text, 4px radius, 2px 6px padding, 12px Pretendard weight 700. Position absolute top-left of event card."#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."#131517. Transparent background. Tap target spans full cell."#f5f5f5 background, border-top: 4px solid #d6d6d6, 30px padding, link text 13px Pretendard 400 in #3a444d. No social icons inline."1px solid #d8dfe6 borders on resting cards. Only apply shadows when an element actually floats (popover, sheet, modal).#697683 for caption, #3a444d for body, #131517 for heading. The cool undertone separates the brand from generic warm-neutral medical UI.radius-400 (16px). Smaller pills (chips, badges) use 4-8px. Search bars and avatars go to radius-full.강남언니's voice is the careful clinician who happens to be on your side — informational first, reassuring second, never sales-y. The product handles a category where users are nervous (성형수술, 피부시술, 모발이식 are not impulse purchases) and where misinformation is the historical norm in Korean beauty media. So the copy refuses the consumer-beauty register: no "✨ 예뻐지자!", no exclamation marks on routine CTAs, no rounded "약 30만원~" pricing. Information is exact ("후기 7,300건", "강남구 · 0.4km · 1,234곳"), and the system explains why before asking the user to act.
Korean is the primary voice; English UI strings exist for overseas surfaces but are translations, not parity. Sentences in body copy end with .; CTA buttons do not. No emoji on medical-information surfaces.
| Context | Tone |
|---|---|
| Card titles (hospital, doctor, treatment) | Factual, scan-friendly. "강남 OO성형외과 — 코재수술 전문". Never "예뻐지는 비결". |
| CTAs | Imperative + concrete object. "병원 예약하기", "후기 작성하기", "쿠폰 받기", "상담 신청". Never "지금 시작하기!" with exclamation. |
| Review prompts | Second-person, soft. "솔직한 후기를 들려주세요." Never "꼭 남겨주세요!!". |
| Hospital meta | Comma-separated facts. 강남구 · 0.4km · 후기 7,300건 · 인증 병원. Numerals always exact. |
| Price display | 350,000원 (comma-separated), with --list-price strikethrough where applicable. Never 약 35만원, never 35만원대. |
| Empty state (search) | One reassuring line in #697683: "조건에 맞는 결과가 없어요. 필터를 조정해보세요." |
| Error (form / API) | Specific + blameless. "이메일 형식을 확인해주세요." Never "오류가 발생했습니다." |
| Verification / regulatory | Formal medical-advertising tone — 의료광고 사전심의필, 보건복지부 지침에 따라 — required by Korean medical-advertising regulation. |
| Onboarding (overseas / Unni) | English mirror of Korean voice — same restraint, same factual register. |
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.
Voice samples (verified against live home 2026-05-13).
종아리 보톡스 맞으면 발목 두꺼워져? 효과·부작용·용량·주기 — 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.)보톡스 입문자 가이드, 효과·비용·부작용부터 국산vs수입 차이까지 — same pattern: target reader + comma-separated index of contents. Sets expectation precisely. (Verified: gangnamunni.com home 2026-05-13.)로그인/가입 — the sign-in CTA. One slash, no "회원가입은 무료입니다!". Zero salesmanship. (Verified: gangnamunni.com header.)강남언니 is the consumer brand of 힐링페이퍼 (Healingpaper), a Korean medtech company founded in July 2012 by 홍승일 (Hong Seung-il) — co-founder and CEO (Rocketpunch — 홍승일 / vanitymind, Rocketpunch — Healingpaper). The mission is straightforward and stated repeatedly in the company's own materials: "더 좋은 의료를 더 많은 사람들이 접할 수 있도록" (make better medical services accessible to more people). The product entered a Korean cosmetic-surgery information market that had been dominated by opaque pricing, paid placements masquerading as reviews, and 압구정 office-tower fliers — the design's refusal of beauty-app pinks-and-sparkles is a refusal of that media culture.
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, TheVC — 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.
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). 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.
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.
#d54300 (or its raw cousin #FF540F) is the only brand color. Every other color in the system has a specific semantic role (green = success / certified, red = danger / decline, blue = info / regulatory, yellow = warning). Brand never bleeds into status; status never decorates brand. UI implication: a "popular" tag cannot be orange; it goes pink-tinted or neutral. A success badge cannot use brand orange.350,000원 (comma-separated, weight 700) rather than 약 35만원. Distances in 0.4km rather than 근거리. Review counts in 7,300건 rather than 많음. The exactness signals "we have the data; we are not rounding to soften a sale." UI implication: numbers always tabular-weighted (700) and never abbreviated; ranges show both endpoints (300,000 – 450,000원), never a single rounded figure.#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."의료광고 사전심의필 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.Personas below are fictional archetypes informed by publicly observable 강남언니 user segments (Korean cosmetic-procedure researchers, overseas medical-tourism inbound users, partner-clinic operators using the Welchis back-office). Names are illustrative — they do not refer to real people.
지수 (Jisoo), 26, 서울 신촌. Marketing associate considering 코재수술 after her first rhinoplasty 4 years ago. Opens 강남언니 most evenings, scrolls 칼럼 articles for 30-45 minutes before bed, has saved 18 hospitals in her shortlist. Will not consult any clinic that doesn't have at least 200 후기 with photos on 강남언니. Reads the regulatory 의료광고 사전심의필 badge specifically as a trust marker — if the certification icon is missing, the clinic moves to a "not yet" list. Distrusts any banner that uses an exclamation mark.
선생님 박 (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.
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.
준호 (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.
| State | Treatment |
|---|---|
| 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. |
| 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). |
| Empty (no reviews yet on a hospital page) | Bluegray-700 single line: 아직 후기가 작성되지 않았어요. + secondary brand-subtle CTA: 첫 후기 작성하기 in #fef6f4 bg / #d54300 text. |
| 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. |
| 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. |
| 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. |
| 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. |
| Error (network / offline) | Full-screen state. White canvas. 16px #131517 heading 연결이 끊어졌어요. + 14px #697683 subtitle 네트워크 상태를 확인해주세요. + Outline retry button. |
| 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. |
| Success (review saved / settings updated) | 3s auto-dismiss toast bottom-center. #131517 bg, white 14px weight 500 text, 12px radius, 후기를 저장했어요. No emoji, no exclamation. |
| 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). |
| 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. |
| 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). |
Durations.
| Token | Value | Use |
|---|---|---|
motion-instant | 0ms | Toggle flips, checkmark commits, focus rings |
motion-fast | 150ms | Hover, focus, small reveals, pill-select state change |
motion-standard | 250ms | Default — sheet open, card expand, tab switch, dropdown |
motion-slow | 350ms | Booking-confirmation surface entry, success checkmark draw |
motion-page | 320ms | Top-level route transitions on web; iOS-style push on mobile |
Easings.
| Token | Curve | Use |
|---|---|---|
ease-enter | cubic-bezier(0.0, 0.0, 0.2, 1) | Things arriving — bottom sheets, toasts, success surfaces |
ease-exit | cubic-bezier(0.4, 0.0, 1, 1) | Dismissals — sheet close, toast disappear |
ease-standard | cubic-bezier(0.4, 0.0, 0.2, 1) | Two-way transitions — tabs, collapsible filter, accordion |
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).
Signature motions.
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.#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.예약 완료 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.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.강남언니's web surface is the rare medical platform that reads as warm rather than clinical. The page opens on pure white (#ffffff) with deep blue-gray text (#131517 — --cell-base-color-bluegray-900) and a single saturated orange (#d54300 / #FF540F accent) doing all the brand work. There is no "medical blue", no surgical green, no pastel reassurance pa
Brand
Accent
Neutrals
Semantic
Type Scale
Rendered in system-ui to clearly show scale & weight.
Fonts
Spacing
| Purpose | Value | Preview |
|---|---|---|
| Density | comfortable | |
| Base unit | 8px | |
| Section gap | 16px | |
| Card padding | 12px | |
| Element gap | 8px |
Border Radius
| Element | Value | Preview |
|---|---|---|
| inlineMicro | 2px | |
| smallMicro | 2px | |
| inlineSmall | 6px | |
| statusSmall | 6px | |
| cardsStandard | 12px | |
| inputsStandard | 12px | |
| defaultMedium | 16px | |
| signMedium | 16px | |
| searchMedium | 16px | |
| primaryMedium | 16px | |
| bottomLarge | 20px | |
| largeLarge | 20px |
Borders
| Element | Value | Preview |
|---|---|---|
| Border-Bottom | 0px solid #f5f5f5 |
Elevation
Do and Don't guidelines parsed from DESIGN.md.
Do
Don't
Buttons
Inputs
Cards
Badges
Toasts