Toss is Korea's fintech super-app that redefined what a financial interface could feel like -- calm, confident, and deceptively simple. The page opens on a clean white canvas (#ffffff) with deep charcoal headings (#191f28) and a signature blue (#3182f6) that functions as the universal interactive accent. This isn't the cold, institutional blue of legacy banking; it's a bright, optimistic cerulean that says "your money is in good hands, and we'll make it easy."
The custom Toss Product Sans typeface is the quiet hero. Developed with Korean type foundries Sandoll and Leedotype, it was purpose-built for financial contexts: numerals and Latin characters are optically weighted to match Korean hangul proportions, and financial symbols (%, commas, ±) are given enhanced legibility. The font ships in 8 weights (300-950) but the UI exercises restraint, primarily using 400, 600, and 700. The system supports both variable-width numerals for display and fixed-width (tabular) numerals for data tables -- context determines mode.
What defines Toss visually is its OKLCH-based color system, rebuilt from scratch for perceptual uniformity. Colors at the same scale level appear equally bright regardless of hue, enabling consistent semantic coloring where blue-500, red-500, and green-500 carry identical visual weight without manual tuning.
Key Characteristics:
#3182f6) as the primary interactive color -- bright, optimistic, trustworthy#3182f6): blue500. Primary interactive color -- CTAs, links, active states, selection highlights. The workhorse of every tappable element.#2272eb): blue600. Hover/pressed state for blue500 elements.#e8f3ff): blue50. Informational backgrounds, subtle blue-tinted surfaces.#ffffff): background, layeredBackground. Page background, card surfaces.#191f28): grey900. Primary heading color, strongest text. Warm near-black with subtle blue undertone.#0064FF): Official Toss brand color (Pantone 2175 C). Logo and marketing materials only -- distinct from UI blue500.#202632): Official secondary brand color (Pantone 433 C). Corporate contexts.#f04452): red500. Error states, destructive actions, negative financial indicators.#03b26c): green500. Positive financial indicators, confirmations.#fe9800): orange500. Pending states, attention-needed indicators.#ffc342): yellow500. Soft warnings, highlight moments.#18a5a5): teal500. Informational accent, alternative categorization.#a234c7): purple500. Premium features, special offers.#f9fafb): Lightest gray, greyBackground surface.#f2f4f6): Secondary background, card fills, disabled surfaces.#e5e8eb): Default border color, dividers, input backgrounds.#b0b8c1): Placeholder text, disabled icon fills.#8b95a1): Caption text, secondary labels.#6b7684): Body text, descriptions, metadata.#4e5968): Emphasized body text, sub-headings.#333d4b): Strong labels, navigation text.#e5e8eb (grey200). Standard card borders, input borders, dividers.#d1d6db (grey300). Emphasized borders, active input outlines.#ffffff. floatBackground. Floating elements -- tooltips, dropdowns.rgba(2,9,19,0.5) to rgba(2,9,19,0.91). greyOpacity scale. Blue-tinted dark overlays."Toss Product Sans", "Tossface", "SF Pro KR", "SF Pro Display", -apple-system, BlinkMacSystemFont, "Basier Square", "Apple SD Gothic Neo", Roboto, "Noto Sans KR", sans-serif"SF Mono", SFMono-Regular, Menlo, Consolas, monospaceTossface -- Toss's custom emoji font (3500+ emojis, open-source on GitHub)| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|---|---|---|---|---|---|---|
| Display Hero | Toss Product Sans | 30px | 700 | 40px (1.33) | normal | Splash screens, hero moments |
| Display Large | Toss Product Sans | 26px | 700 | 36px (1.38) | normal | Section headers, key metrics |
| Heading Large | Toss Product Sans | 22px | 700 | 30px (1.36) | normal | Feature titles, modal headers |
| Heading | Toss Product Sans | 20px | 600 | 28px (1.40) | normal | Card headings, sub-sections |
| Subtitle | Toss Product Sans | 16px | 600 | 24px (1.50) | normal | Navigation titles, list headers |
| Body Large | Toss Product Sans | 16px | 400 | 24px (1.50) | normal | Descriptions, explanations |
| Body | Toss Product Sans | 14px | 400 | 22px (1.57) | normal | Standard reading text |
| Body Small | Toss Product Sans | 13px | 400 | 20px (1.54) | normal | Secondary information |
| Caption | Toss Product Sans | 12px | 400 | 18px (1.50) | normal | Timestamps, fine print |
| Number Display | Toss Product Sans | 30px+ | 700 | tight | normal | Financial amounts -- tabular nums |
Toss <Button> is a 2-axis component: variant × color × size. Default size is xlarge (the values below); see the size-scale paragraph at the end for small/medium/large. Verified against tossmini-docs.toss.im/tds-mobile/components/button (TDS Mobile, public docs).
Fill / Primary
#3182f6#ffffff--button-pressed-background-color + --button-pressed-opacity--button-disabled-opacity-colorFill / Dark
#4e5968#ffffffFill / Danger
#f04452#ffffffFill / Light
#ffffff#1b64daWeak / Primary
rgba(100, 168, 255, 0.15)#2272ebWeak / Dark
rgba(2, 32, 71, 0.05)#4e5968Weak / Danger
rgba(251, 136, 144, 0.15)#e42939Weak / Light
rgba(255, 255, 255, 0.15)#ffffffDisplay modes — inline (auto-width), block (full-width with line break), full (fills parent). Size scale (height · font · radius): small 32px · 13px / 600 · 8px; medium 38px · 15px / 600 · 10px; large 48px · 17px / 600 · 14px; xlarge (default) 56px · 17px / 600 · 16px. CSS-var customization: --button-color, --button-background-color, --button-pressed-background-color, --button-pressed-opacity, --button-disabled-opacity-color, --button-loader-color, --button-loading-background-color, --button-gradient-color.
Toss <TextField> has 4 variants: box (default), line, big, hero. hasError toggles error state. Verified at tossmini-docs.toss.im/tds-mobile/components/TextField/text-field.
Box (default)
rgba(0, 23, 51, 0.02)#333d4brgba(2, 32, 71, 0.05)#b0b8c1#3182f6Line
#333d4b#e5e8eb (bottom only)Big
#333d4b#e5e8eb (bottom only)Hero
#333d4b#e5e8eb (bottom only)Error
rgba(0, 23, 51, 0.02) (box variant base)#333d4b#f04452hasError state — paired with inline help message in #f04452SplitTextField (OTP), SecureKeypad (financial PIN with randomised digit positions), and TextArea are documented separately under TDS but reuse the same focus ring and base radii.
Standard
#ffffff0px 2px 8px rgba(0,0,0,0.08)Featured
#ffffff0px 2px 8px rgba(0,0,0,0.08)Compact
#ffffff#e5e8ebToss <Badge> is a 3-axis component: variant × color × size. Variants fill | weak. Colors blue | teal | green | red | yellow | elephant. Sizes xsmall | small | medium | large (each shifts radius/font/padding). Verified at tossmini-docs.toss.im/tds-mobile/components/badge.
Fill / Blue (medium default)
#3182f6#ffffffFill / Green
#22c55e#ffffffFill / Red
#ef4444#ffffffFill / Yellow
#eab308#ffffffWeak / Blue
rgba(100, 168, 255, 0.15)#2272ebWeak / Green
rgba(34, 197, 94, 0.15)#16a34aWeak / Red
rgba(239, 68, 68, 0.15)#dc2626Weak / Elephant
rgba(2, 32, 71, 0.05)#4e5968Size scale (height · font · radius · padding): xsmall 21px · 10px / 600 · 9px · 3px 7px; small 24px · 12px / 700 · 11px · 3px 7px; medium 26px · 13px / 700 · 12px · 3px 7px; large 29px · 14px / 700 · 13px · 4px 8px. Color also supports teal and full mapping for each color name; values above show the most-used 4 fills + 4 weaks at medium size.
Bottom Tab (Active)
#ffffff#191f28#e5e8eb (top border only)#3182f6 (icon and label)#b0b8c1 (icon) + #8b95a1 (label)Segmented
#f2f4f6#8b95a1#ffffff background + #191f28 text + 0px 2px 4px rgba(0,0,0,0.06) shadowDefault
#191f28#ffffff0px 4px 12px rgba(0,0,0,0.12)Centered Modal
#ffffff#191f280px 4px 12px rgba(0,0,0,0.12)Bottom Sheet
#ffffff#191f280px -4px 12px rgba(0,0,0,0.08)overlay-kit)Default
#3182f6 (on) / #d1d6db (off)#ffffff 18px circle with 0px 1px 2px rgba(0,0,0,0.1) shadowVerified: 2026-05-08 (full-depth, A1 loop)
Tier 1 sources: tossmini-docs.toss.im/tds-mobile (TDS Mobile spec docs — Button/TextField/Badge), toss.im (live DOM via playwright — .p-button web variants #3182f6 / 7px radius / 15px / 600, distinct from TDS Mobile geometry; nav links #4e5968 8px transparent; App Store/Play CTA rgba(0,12,30,0.8) / 7px / 17px·600)
Tier 2 sources: getdesign.md/toss — no record. styles.refero.design — no record (?q=Toss returns 0 hits).
Tier 2b status: unavailable; Tier 1 (TDS Mobile docs + live web inspect) treated as authoritative per pipeline.
Surface split: §4 above documents the TDS Mobile (app) system. The marketing web (toss.im) uses a distinct .p-button system — Primary #3182f6 / 7px / 15px·600 / 11×16 / 40px height; Secondary Light Blue #e8f3ff bg / #1b64da text / 7px (parallel geometry). Both retained as parallel systems.
Conflicts unresolved: none. TDS Mobile geometry (16px radius, 17px·600) and web .p-button (7px, 15px·600) coexist on different surfaces and were not in conflict.
| Level | Treatment | Use |
|---|---|---|
| Flat (Level 0) | No shadow | Page background, inline elements |
| Subtle (Level 1) | 0px 1px 3px rgba(0,0,0,0.06) | Slight lift, list item separation |
| Standard (Level 2) | 0px 2px 8px rgba(0,0,0,0.08) | Cards, content panels |
| Elevated (Level 3) | 0px 4px 12px rgba(0,0,0,0.12) | Dropdowns, popovers, floating buttons |
| Modal (Level 4) | 0px 8px 24px rgba(0,0,0,0.16) | Bottom sheets, dialogs, modals |
Shadow Philosophy: Toss keeps shadows minimal and neutral. In a financial app, visual noise undermines trust -- elevation is communicated through subtle opacity differences rather than dramatic depth. Pure black with low opacity creates clinical precision matching the fintech context. Where Stripe uses brand-colored shadows, Toss uses restraint as its brand statement.
#3182f6) for all interactive elements -- links, buttons, toggles, selections#03b26c), negative in red (#f04452)#e8f3ff) for subtle informational backgrounds#0064FF) with UI Blue (#3182f6) -- brand is for marketing/logo only| Name | Width | Key Changes |
|---|---|---|
| Mobile (Primary) | <480px | Full design fidelity, 375px baseline |
| Tablet | 480-768px | Expanded cards, optional side margins |
| Desktop (Web) | >768px | Centered column, max-width ~480px for mobile-web parity |
#3182f6)#2272eb)#ffffff)#f2f4f6)#191f28)#6b7684)#8b95a1)#b0b8c1)#e5e8eb)#03b26c)#f04452)#fe9800)#3182f6 (blue500) -- never #0064FF (brand blue)#191f28, grey50 #f9fafbToss speaks like a friend who happens to be a fiduciary: calm, unhurried, zero jargon, positive statements without hedging. Balance is stated, not "approximately" anything. Korean is the primary voice — English UI strings are secondary translations, not parity. Sentences end in periods; buttons do not. No emoji in financial contexts. Tossface exists as brand decoration but is disallowed on money-handling screens.
| Context | Tone |
|---|---|
| CTAs | Imperative, short Korean verb form (송금하기, 확인, 가입하기) |
| Success toasts | Past-tense single sentence (송금이 완료되었어요). No emoji. |
| Error messages | Specific + blameless + actionable. Never 문제가 발생했습니다. |
| Onboarding screens | Second-person, one idea per screen, no bullet lists. |
| Financial amounts | Bare numerals with comma separators, then currency unit. 1,240,000원, never ₩1.24M. |
| Empty states | Explain the why in one line, offer one action. Never 데이터가 없습니다. |
| Legal / disclosure | Korean financial-regulation tone — formal 합니다 endings. Single exception to the casual voice. |
Forbidden phrases. 불편을 드려 죄송합니다, Oops, 죄송하지만, 약 ~원 (approximation on money), any sentence starting with I'm sorry in English strings. Rounded currency amounts (약 120만원) are forbidden on primary surfaces; exact numerals only.
Toss is the consumer brand of Viva Republica (비바리퍼블리카), founded by Lee Seung-gun (이승건) — a former dentist who left a Samsung-owned hospital to build it (Wikipedia: Viva Republica, Fortune Asia, 2025). Lee tried eight failed ventures before Toss; the Toss money-transfer product launched in 2014 (Caproasia, 2025) into a Korean banking market dominated by legacy institutions — KB, Shinhan, Woori, Hana — each with institutional-indigo websites, 12-digit account numbers, Active-X plug-ins, and the presumption that handling money had to feel like filing taxes. The founding rejection was of that entire aesthetic vocabulary. The specific cerulean #3182f6 was chosen because it was not the indigo of any incumbent bank. The optimism of the color was the whole thesis: money could feel light.
Toss reached 20M+ users by 2021 (Wikipedia) and operates as a financial super-app spanning lending, payments, brokerage, insurance, and credit scoring. As of 2025, the company plans a US IPO in 2026 at ~$15B valuation, raising $2.5B (Caproasia, July 2025), with investors including Altos Ventures, Goodwater Capital, HongShan Capital, PayPal, GIC, and Korea Development Bank.
Toss is not a neo-bank. It's a super-app: one interface holds transfers, investments, credit scoring, insurance, brokerage, and lending. The design's job is to flatten that complexity into one gesture per screen. That requires extreme restraint — shadows are single-layer black, palette is blue-and-neutral, type is one family in three weights. Every ornamental move costs clarity, and clarity is the entire brand promise.
What Toss refuses: the institutional seriousness of legacy finance, the playfulness of consumer apps (no bright pink, no illustrations of cartoon piggy banks), the data-viz density of Bloomberg-style terminals. Toss occupies a narrow middle — calm but optimistic, dense with functionality but spacious in presentation.
#3182f6 appears only where the user can tap. It never decorates. Illustrations, ornaments, borders, and headers never use blue500 unless they are interactive surfaces.Personas below are fictional archetypes informed by publicly described Korean fintech user segments, not individual people.
정민 (Jeongmin), 28, Seoul. Software engineer at a mid-size startup. Opens Toss 2–3 times a day — morning subway, post-lunch balance check, evening transfer to a flatmate. Expects the app to open directly to the account screen and paint in under 1s. If she has to tap twice to see her money, she's already irritated. Uses both Korean and English on-device; reads financial English natively but prefers Korean UI for speed.
이선생님 (Mr. Lee), 54, Busan. Runs a three-person machining shop. His daughter set up Toss for him two years ago. Primary use: transferring to suppliers and receiving invoice payments. Needs one-tap repeat transfer — he has about 12 regular counterparties. Distrusts anything that looks like an advertisement. Would uninstall the app before tapping a promoted banner. Reads Korean only; English strings on product surfaces are invisible to him. Values receipts and transaction history — never deletes them.
예은 (Yeeun), 21, Daegu. University student, third year, Economics. Toss is her primary banking app — she opened her first account through it, and has never touched a legacy bank's web interface except under duress. Expects Toss Blue to be "banking blue." If another financial app uses cerulean, she assumes it's imitating Toss. Sends ₩5,000–₩30,000 amounts constantly (splitting bills, paying back friends). Treats the app like a messaging app with money attached.
| State | Treatment |
|---|---|
| Empty (first use) | Single paragraph of grey700 body text explaining why the screen is empty (아직 거래내역이 없어요), plus one suggested action as a secondary button (blue50 bg, blue500 text). Never an illustration. Never 데이터가 없습니다. |
| Empty (filter cleared) | Single line of grey500 caption (조건에 맞는 결과가 없어요). No button — user resets the filter themselves. |
| Loading (first paint) | Skeleton blocks matching the final layout's structure at #f2f4f6 (grey100). Financial amounts render as -- until resolved; they never appear as skeleton blocks (would look like they have a placeholder value). |
| Loading (refresh) | Top bar pull-down spinner in blue500. No overlay, no blocking. Content stays visible with its previous values. |
| Error (inline field) | #f04452 (red500) 2px border on the input, error text below in red500 13px. One actionable sentence (계좌번호를 다시 확인해주세요). |
| Error (toast) | #191f28 background, white 14px 400 text, 3s auto-dismiss. One sentence. No icons. Bottom of screen with 20px inset. |
| Error (screen-blocking) | Reserved for server outage. White screen, centered single-line message in grey900 16px weight 600, retry button in blue500 below. No illustration. |
| Success (inline flash) | Brief flash of #e8f3ff (blue50) background behind the updated element, 300ms fade to default. For routine actions like toggling a setting. |
| Success (money moved) | Dedicated confirmation screen — not a toast. #03b26c (green500) checkmark top-center, exact amount in 30px weight 700 below, recipient name, timestamp. Single button: 확인. This weight is intentional; money moving is never a toast. |
| Skeleton | #f2f4f6 blocks at exact final dimensions. 1.2s shimmer as linear-gradient with 8% white highlight. Rounded at component radius (8px/12px/16px per component). Never used on financial amounts — those show --. |
| Disabled | Button opacity drops per --button-disabled-opacity-color. No grey-out of input borders — disabled inputs keep grey200 border, so the geometry is stable if re-enabled. |
| Loading inside pressed button | Text is replaced by the 3-dot white animation. Width of the button does not change. Press is visually committed; user cannot double-submit. |
Durations (named, not raw milliseconds):
| Token | Value | Use |
|---|---|---|
motion-instant | 0ms | Toggle flips, checkbox state changes |
motion-fast | 150ms | Hover, focus, small reveals, button press overlay |
motion-standard | 250ms | The default — sheet opens, card expands, tab switches |
motion-slow | 400ms | Emphasized transitions — success checkmarks, onboarding step advances |
motion-page | 350ms | Full-screen transitions between top-level routes |
Easings:
| Token | Curve | Use |
|---|---|---|
ease-enter | cubic-bezier(0.0, 0.0, 0.2, 1) | Things appearing — sheets, toasts, screen pushes |
ease-exit | cubic-bezier(0.4, 0.0, 1, 1) | Things leaving — dismissals, pops |
ease-standard | cubic-bezier(0.4, 0.0, 0.2, 1) | Two-way transitions — collapsible cards, tab content |
ease-spring | cubic-bezier(0.34, 1.56, 0.64, 1) | Reserved. Only for money-moved success checkmark. Nowhere else — overshoot on routine UI would feel unserious. |
Signature motions.
motion-fast / ease-exit), the new number slides in from below 20px (motion-standard / ease-enter). Never cross-fade money — a financial amount flickering between values looks like a bug.y+40px with motion-standard / ease-enter and a synchronized backdrop fade from rgba(2,9,19,0) to rgba(2,9,19,0.5). Dismissal uses motion-fast / ease-exit — leaving feels lighter than entering.motion-slow with ease-spring. This is the one place spring easing is licensed. Everywhere else, standard easing.prefers-reduced-motion: reduce, all motion-* tokens collapse to motion-instant. No exceptions. Crossfades replace slides. The app stays usable; just less kinetic.Toss is Korea's fintech super-app that redefined what a financial interface could feel like -- calm, confident, and deceptively simple. The page opens on a clean white canvas (#ffffff) with deep charcoal headings (#191f28) and a signature blue (#3182f6) that functions as the universal interactive accent. This isn't the cold, institutional blue of legac
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 | 32px | |
| Card padding | 16px | |
| Element gap | 12px |
Border Radius
| Element | Value | Preview |
|---|---|---|
| smallCompact | 4px | |
| inlineCompact | 4px | |
| inputsStandard | 8px | |
| smallStandard | 8px | |
| compactStandard | 8px | |
| standardComfortable | 12px | |
| dialogsComfortable | 12px | |
| featuredLarge | 16px | |
| bottomLarge | 16px | |
| togglePill | 9999px | |
| floatingPill | 9999px |
Elevation
Do and Don't guidelines parsed from DESIGN.md.
Do
Don't
Buttons
Inputs
Cards