oh-my-design-cli 1.3.8 → 1.5.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/README.ja.md +8 -8
- package/README.ko.md +28 -7
- package/README.md +71 -16
- package/README.zh-TW.md +8 -8
- package/agents/omd-asset-curator.md +2 -7
- package/agents/omd-codex-image.md +49 -0
- package/agents/omd-designer-review.md +38 -0
- package/agents/omd-final-qa.md +40 -0
- package/agents/omd-kr-writer.md +35 -0
- package/agents/omd-locale-adapter.md +32 -0
- package/agents/omd-master.md +3 -13
- package/agents/omd-orchestrator.md +34 -0
- package/data/reference-audits/2026-05-14-kr10.md +72 -0
- package/data/reference-audits/2026-05-15-kr10.md +124 -0
- package/data/reference-fingerprints.json +253 -3
- package/data/research/2026-05-18-agent-landscape.md +69 -0
- package/data/research/2026-05-18-kr-style-presets.md +572 -0
- package/dist/bin/oh-my-design.js +6 -3
- package/dist/bin/oh-my-design.js.map +1 -1
- package/dist/{install-skills-MVXVXYAY.js → install-skills-IETT2TBJ.js} +91 -8
- package/dist/install-skills-IETT2TBJ.js.map +1 -0
- package/package.json +9 -3
- package/skills/omd-apply/SKILL.md +0 -1
- package/skills/omd-codex-image/SKILL.md +162 -0
- package/skills/omd-designer-review/SKILL.md +146 -0
- package/skills/omd-final-qa/SKILL.md +153 -0
- package/skills/omd-kr-writer/SKILL.md +229 -0
- package/skills/omd-locale-adapter/SKILL.md +124 -0
- package/skills/omd-orchestrator/SKILL.md +124 -0
- package/web/references/29cm/DESIGN.md +11 -2
- package/web/references/ably/DESIGN.md +12 -2
- package/web/references/airbnb/DESIGN.md +17 -2
- package/web/references/airtable/DESIGN.md +20 -0
- package/web/references/apple/DESIGN.md +17 -2
- package/web/references/baemin/DESIGN.md +11 -2
- package/web/references/banksalad/DESIGN.md +17 -2
- package/web/references/bmw/DESIGN.md +14 -0
- package/web/references/bunjang/DESIGN.md +308 -0
- package/web/references/cal/DESIGN.md +14 -0
- package/web/references/catchtable/DESIGN.md +262 -0
- package/web/references/channeltalk/DESIGN.md +374 -0
- package/web/references/classum/DESIGN.md +217 -0
- package/web/references/claude/DESIGN.md +11 -2
- package/web/references/clay/DESIGN.md +19 -0
- package/web/references/clickhouse/DESIGN.md +19 -0
- package/web/references/cohere/DESIGN.md +20 -0
- package/web/references/coinbase/DESIGN.md +14 -0
- package/web/references/composio/DESIGN.md +14 -0
- package/web/references/coupang/DESIGN.md +17 -2
- package/web/references/cursor/DESIGN.md +20 -0
- package/web/references/dabang/DESIGN.md +210 -0
- package/web/references/dcard/DESIGN.md +11 -2
- package/web/references/elevenlabs/DESIGN.md +20 -0
- package/web/references/expo/DESIGN.md +20 -0
- package/web/references/fastcampus/DESIGN.md +460 -0
- package/web/references/ferrari/DESIGN.md +14 -0
- package/web/references/figma/DESIGN.md +17 -2
- package/web/references/flex/DESIGN.md +309 -0
- package/web/references/framer/DESIGN.md +20 -0
- package/web/references/freee/DESIGN.md +16 -2
- package/web/references/gangnamunni/DESIGN.md +18 -2
- package/web/references/gmarket/DESIGN.md +464 -0
- package/web/references/hashicorp/DESIGN.md +19 -0
- package/web/references/ibm/DESIGN.md +20 -0
- package/web/references/inflearn/DESIGN.md +396 -0
- package/web/references/intercom/DESIGN.md +14 -0
- package/web/references/jumpit/DESIGN.md +366 -0
- package/web/references/kakao/DESIGN.md +14 -0
- package/web/references/kakaobank/DESIGN.md +17 -2
- package/web/references/kakaopay/DESIGN.md +17 -2
- package/web/references/karrot/DESIGN.md +16 -2
- package/web/references/kbank/DESIGN.md +195 -0
- package/web/references/kraken/DESIGN.md +14 -0
- package/web/references/krds/DESIGN.md +17 -2
- package/web/references/kream/DESIGN.md +382 -0
- package/web/references/kurly/DESIGN.md +11 -2
- package/web/references/lamborghini/DESIGN.md +14 -0
- package/web/references/line/DESIGN.md +17 -2
- package/web/references/linear.app/DESIGN.md +17 -2
- package/web/references/lovable/DESIGN.md +14 -0
- package/web/references/lunit/DESIGN.md +249 -0
- package/web/references/mercari/DESIGN.md +11 -2
- package/web/references/minimax/DESIGN.md +14 -0
- package/web/references/mintlify/DESIGN.md +14 -0
- package/web/references/miro/DESIGN.md +20 -0
- package/web/references/mistral.ai/DESIGN.md +20 -0
- package/web/references/mongodb/DESIGN.md +19 -0
- package/web/references/musinsa/DESIGN.md +11 -2
- package/web/references/naver/DESIGN.md +17 -2
- package/web/references/notion/DESIGN.md +11 -2
- package/web/references/nvidia/DESIGN.md +11 -2
- package/web/references/ohouse/DESIGN.md +11 -2
- package/web/references/oliveyoung/DESIGN.md +342 -0
- package/web/references/ollama/DESIGN.md +14 -0
- package/web/references/opencode.ai/DESIGN.md +20 -0
- package/web/references/pinkoi/DESIGN.md +11 -2
- package/web/references/pinterest/DESIGN.md +19 -0
- package/web/references/posthog/DESIGN.md +20 -0
- package/web/references/qanda/DESIGN.md +11 -2
- package/web/references/raycast/DESIGN.md +19 -0
- package/web/references/remember/DESIGN.md +17 -2
- package/web/references/renault/DESIGN.md +14 -0
- package/web/references/replicate/DESIGN.md +14 -0
- package/web/references/resend/DESIGN.md +20 -0
- package/web/references/revolut/DESIGN.md +14 -0
- package/web/references/ridi/DESIGN.md +11 -2
- package/web/references/runwayml/DESIGN.md +14 -0
- package/web/references/sanity/DESIGN.md +20 -0
- package/web/references/sentry/DESIGN.md +14 -0
- package/web/references/socar/DESIGN.md +17 -2
- package/web/references/spacex/DESIGN.md +11 -2
- package/web/references/spotify/DESIGN.md +14 -0
- package/web/references/stripe/DESIGN.md +11 -2
- package/web/references/supabase/DESIGN.md +20 -0
- package/web/references/superhuman/DESIGN.md +20 -0
- package/web/references/tesla/DESIGN.md +11 -2
- package/web/references/together.ai/DESIGN.md +20 -0
- package/web/references/toss/DESIGN.md +16 -2
- package/web/references/toss-securities/DESIGN.md +193 -0
- package/web/references/tving/DESIGN.md +259 -0
- package/web/references/uber/DESIGN.md +19 -0
- package/web/references/upbit/DESIGN.md +276 -0
- package/web/references/upstage/DESIGN.md +214 -0
- package/web/references/vercel/DESIGN.md +17 -2
- package/web/references/voltagent/DESIGN.md +14 -0
- package/web/references/wadiz/DESIGN.md +344 -0
- package/web/references/wanted/DESIGN.md +16 -2
- package/web/references/warp/DESIGN.md +14 -0
- package/web/references/webflow/DESIGN.md +14 -0
- package/web/references/wise/DESIGN.md +19 -0
- package/web/references/x.ai/DESIGN.md +14 -0
- package/web/references/yanolja/DESIGN.md +17 -2
- package/web/references/yeogiotte/DESIGN.md +18 -2
- package/web/references/zapier/DESIGN.md +20 -0
- package/web/references/zigbang/DESIGN.md +12 -2
- package/web/references/zigzag/DESIGN.md +17 -2
- package/agents/omd-3d-blender.md +0 -269
- package/dist/install-skills-MVXVXYAY.js.map +0 -1
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: tving
|
|
3
|
+
name: TVING
|
|
4
|
+
display_name_kr: TVING (티빙)
|
|
5
|
+
country: KR
|
|
6
|
+
category: consumer-tech
|
|
7
|
+
homepage: "https://www.tving.com"
|
|
8
|
+
primary_color: "#ff153c"
|
|
9
|
+
logo:
|
|
10
|
+
type: favicon
|
|
11
|
+
slug: "https://www.google.com/s2/favicons?domain=tving.com&sz=256"
|
|
12
|
+
verified: "2026-05-15"
|
|
13
|
+
omd: "0.1"
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# Design System Inspiration of TVING (티빙)
|
|
17
|
+
|
|
18
|
+
## 1. Visual Theme & Atmosphere
|
|
19
|
+
|
|
20
|
+
TVING is Korea's CJ ENM-backed streaming platform, and its product surface reads like a cinema-darkened auditorium tuned for Korean primetime — the canvas is a near-absolute black (`#000000` locked at the document root), text floats in pure white (`#FFFFFF`) with a four-step gray scale beneath it (`#B3B3B3` → `#A3A3A3` → `#6E6E6E` → `#4F4F4F`), and the single chromatic interruption is a saturated red the brand encodes on `:root` as `--tving: 350 100% 54.12%` — runtime hex `#FF153C`. This is not a sentimental crimson. It is a hot, almost neon scarlet, applied with monastic discipline: across 3,000 sampled nodes, only twelve carry that red as a background — every one of them a CTA, a brand mark, or a live-status indicator. The platform's geometric signature is a top-corners-only card radius (`16.5292px 16.5292px 0 0`), engineered so poster art bleeds to the bottom edge of each tile — an OTT idiom shared with Disney+ and Wavve but tuned here to a 1.033rem radius that reads slightly tighter than industry default.
|
|
21
|
+
|
|
22
|
+
What distinguishes TVING from its Korean OTT peers is the **category-color taxonomy hardcoded into the design system itself**. Six content categories — home (`#FF1F45`), live (`#FF584A`), clip (`#FD8163`), VOD (`#387DFF`), movie (`#7D57FC`), and ad (`#FCC800`) — are not merely page accents but first-class `:root` CSS custom properties (`--color-cate-home`, `--color-cate-live`, etc.). Category color IS product taxonomy: when a user navigates between live KBO baseball, VOD drama, and clip browse, the chrome itself shifts hue. Reinforcing this, the system carries **dedicated live-streaming geometry tokens** — `--kbo-player-height`, `--sports-player-width`, `--live-tab-player-companion-banner-height` — meaning live sports is not a feature retrofitted onto a VOD player but a co-equal surface paradigm. Pretendard is the exclusive typeface (100% of samples; Apple SD Gothic Neo only as system fallback), weight discipline is binary (400 body / 700 heading and CTA — no 500/600 intermediates observed), and depth is constructed through layered dark surfaces (`#000` → `#2E2E2E` → `rgba(15,15,15,0.74)` overlay) rather than box-shadows, which return `0 0 #0000` on every sampled production element.
|
|
23
|
+
|
|
24
|
+
**Key Characteristics:**
|
|
25
|
+
- Locked dark canvas (`#000000` at `html`) — no light-mode token observed; the platform is dark-mode-only by design.
|
|
26
|
+
- Single brand red (`#FF153C`) reserved for CTAs and brand marks; observed on 4 of 12 dominant background colors, runtime alpha-variants `rgb(255,21,60)` / `rgb(254,21,60)` / `rgb(255,31,69)` all collapse to one canonical token.
|
|
27
|
+
- **Six-category color taxonomy as `:root` primitives** — home/live/clip/VOD/movie/ad each own a CSS custom property; rare case where color IS product information architecture.
|
|
28
|
+
- Top-corners-only card radius (`16.5292px 16.5292px 0 0`) for poster bleed — observed 20× on home surface alone.
|
|
29
|
+
- Pretendard exclusive (SIL OFL 1.1), weight binary (400 / 700).
|
|
30
|
+
- Box-shadow zero across product chrome — depth via surface contrast, not elevation.
|
|
31
|
+
- Dedicated live-streaming geometry tokens (`--kbo-player-*`, `--sports-player-*`) elevate live as a peer surface to VOD.
|
|
32
|
+
- Tailwind utility layer (`--tw-*`) + Emotion CSS-in-JS (`css-*` hashes) + shadcn-pattern semantic roles (`--card`, `--popover`, `--muted`) coexist — pragmatic framework stack, not opinionated DS purism.
|
|
33
|
+
|
|
34
|
+
## 2. Color Palette & Roles
|
|
35
|
+
|
|
36
|
+
### Brand
|
|
37
|
+
- **TVING Red** (`#FF153C`, canonical `--tving: 350 100% 54.12%` HSL) — primary CTA backgrounds, brand mark, live-status accents. Runtime alpha-variants observed (`#FE153C`, `#FF1F45`) collapse to one logical token.
|
|
38
|
+
- **Pure Black** (`#000000`) — locked canvas at `html` and `body`. No theme alternate observed.
|
|
39
|
+
- **Pure White** (`#FFFFFF`) — primary text on canvas; 519 occurrences in 3,000-node sample (dominant text color).
|
|
40
|
+
|
|
41
|
+
### Surface ladder (dark)
|
|
42
|
+
- `#000000` — canvas / page background (12 occurrences as bg)
|
|
43
|
+
- `#2E2E2E` — elevated card / chip surface (10 occurrences as bg)
|
|
44
|
+
- `#111111` / `#262626` — modal / overlay surface
|
|
45
|
+
- `rgba(15,15,15,0.74)` — bottom-sheet / scrim overlay
|
|
46
|
+
- `rgba(0,0,0,0.5)` — image-overlay scrim
|
|
47
|
+
- `rgba(255,255,255,0.1)` / `rgba(255,255,255,0.4)` — hover/active glass tint on poster cards
|
|
48
|
+
|
|
49
|
+
### Text scale (grayscale)
|
|
50
|
+
- `#FFFFFF` — primary text, headlines (519×)
|
|
51
|
+
- `#B3B3B3` — secondary body (169×)
|
|
52
|
+
- `#A3A3A3` — tertiary metadata (24×)
|
|
53
|
+
- `#D9D9D9` — disabled-bright (6×)
|
|
54
|
+
- `#6E6E6E` — muted hint (52×)
|
|
55
|
+
- `#4F4F4F` — disabled-deep (1×)
|
|
56
|
+
|
|
57
|
+
### Category taxonomy (first-class `:root` tokens)
|
|
58
|
+
- `--color-cate-home`: `#FF1F45` (home shelf)
|
|
59
|
+
- `--color-cate-live`: `#FF584A` (live streaming)
|
|
60
|
+
- `--color-cate-clip`: `#FD8163` (short-form clips)
|
|
61
|
+
- `--color-cate-vod`: `#387DFF` (on-demand)
|
|
62
|
+
- `--color-cate-movie`: `#7D57FC` (films)
|
|
63
|
+
- `--color-cate-ad`: `#FCC800` (sponsored / ad indicator)
|
|
64
|
+
|
|
65
|
+
### Border
|
|
66
|
+
- `hsl(0,0%,31%)` (`--border`) — hairline divider; rendered at 1px on dark surface, near-invisible until hover.
|
|
67
|
+
|
|
68
|
+
## 3. Typography
|
|
69
|
+
|
|
70
|
+
Pretendard exclusive. No display accent face. No serif. Weight binary.
|
|
71
|
+
|
|
72
|
+
| Role | Family | Size (observed) | Weight |
|
|
73
|
+
|---|---|---|---|
|
|
74
|
+
| Hero headline (h2 onboarding) | Pretendard | 43.4px | 700 |
|
|
75
|
+
| Body baseline | Pretendard | 12.4px | 400 |
|
|
76
|
+
| Primary CTA label | Pretendard | 18.6px | 700 |
|
|
77
|
+
| Nav CTA ('티빙 시작하기') | Pretendard | 14px | 700 |
|
|
78
|
+
| Footer link | Pretendard | 15.5px | 400 / 700 mixed |
|
|
79
|
+
| Secondary nav | Pretendard | 16px | 400 |
|
|
80
|
+
|
|
81
|
+
**Stack:** `Pretendard, -apple-system, "system-ui", Roboto, "Segoe UI", Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif`
|
|
82
|
+
|
|
83
|
+
CDN: `https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css` (SIL OFL 1.1).
|
|
84
|
+
|
|
85
|
+
## 4. Shape & Radius
|
|
86
|
+
|
|
87
|
+
Base token `--radius: 0.5rem` (8px), but runtime values cluster at three points:
|
|
88
|
+
|
|
89
|
+
| Radius | Frequency | Role |
|
|
90
|
+
|---|---|---|
|
|
91
|
+
| `16.5292px` (top-corners only) | 41× (20× as top-only) | Poster card top — image bleeds bottom edge |
|
|
92
|
+
| `12.4px` | 3× | Primary hero CTA |
|
|
93
|
+
| `8px` | 1× observed | Header inline CTA |
|
|
94
|
+
| `3px` (and top-only) | 13× (10× top-only) | Fine chip / tag / meta-label |
|
|
95
|
+
| `50%` | 4× | Avatar / circular icon |
|
|
96
|
+
| `9999px` | 1× | Pill (rare) |
|
|
97
|
+
|
|
98
|
+
The signature is **top-corners-only on poster cards** — bottom edge sits flush against metadata so poster art reads as bleed, not framed.
|
|
99
|
+
|
|
100
|
+
## 5. Spacing & Layout
|
|
101
|
+
|
|
102
|
+
Layout primitives carried as CSS custom properties on `:root`:
|
|
103
|
+
|
|
104
|
+
| Token | Value | Role |
|
|
105
|
+
|---|---|---|
|
|
106
|
+
| `--gnb-height` | `70px` | Global nav bar (authenticated) |
|
|
107
|
+
| `--header-height` | `4rem` (64px) | Marketing / onboarding header |
|
|
108
|
+
| `--bottom-tab-height` | `4.167rem` (≈66.7px) | Mobile bottom tab bar |
|
|
109
|
+
| `--safe-area-inset-{top,bottom,left,right}` | dynamic | iOS PWA safe areas |
|
|
110
|
+
| `--content-inset-{top,bottom,right}` | `0px` (default) | Dynamic content insets when player docked |
|
|
111
|
+
| `--live-tab-player-height-desktop` | `calc((100vw - 40rem) * 0.5625)` | 16:9 docked player |
|
|
112
|
+
| `--kbo-player-width` | `calc(100vw - 31.25rem)` | KBO baseball player width (subtracts 500px sidebar) |
|
|
113
|
+
| `--sports-player-height` | `calc((100vw - 31.25rem) * 0.5625)` | Sports player 16:9 |
|
|
114
|
+
|
|
115
|
+
Page viewport: `1280×713` (desktop test). Onboarding scroll height `4,440px` (~6.22 viewports).
|
|
116
|
+
|
|
117
|
+
## 6. Elevation & Depth
|
|
118
|
+
|
|
119
|
+
**Box-shadow returns `0 0 #0000` on every sampled product element.** Depth is constructed via surface contrast:
|
|
120
|
+
|
|
121
|
+
1. Canvas `#000000`
|
|
122
|
+
2. Elevated `#2E2E2E` (+46 luminance)
|
|
123
|
+
3. Modal/overlay `rgba(15,15,15,0.74)`
|
|
124
|
+
4. Glass tint `rgba(255,255,255,0.1)` on hover
|
|
125
|
+
|
|
126
|
+
The `--tw-shadow` and `--tw-drop-shadow` Tailwind tokens exist but render as zero — design discipline, not framework limitation.
|
|
127
|
+
|
|
128
|
+
## 7. Iconography & Imagery
|
|
129
|
+
|
|
130
|
+
Not directly inspected this pass (authenticated browse gated). System signals:
|
|
131
|
+
- Avatar / circular icons use `50%` radius (4 observed).
|
|
132
|
+
- Live indicators presumed to use `--color-cate-live` (`#FF584A`) as fill.
|
|
133
|
+
- Poster art is the dominant visual asset on browse surfaces; placeholder ratio inferred at 2:3 portrait (industry standard, confirmed by top-corners-only card geometry).
|
|
134
|
+
|
|
135
|
+
## 8. Motion
|
|
136
|
+
|
|
137
|
+
Not captured live (no interactions triggered during static-state inspect). System carries Swiper carousel (`--swiper-theme-color: #007AFF`) and SweetAlert2 (`--swal2-width: 30rem`) as vendor primitives. Tailwind transform tokens (`--tw-translate-{x,y}`, `--tw-rotate`, `--tw-scale-{x,y}`) are reset to default — motion is applied per-component, not from `:root`.
|
|
138
|
+
|
|
139
|
+
Flagged for UPDATE pass: hover transitions on poster cards, player chrome fade timing, modal entrance curves.
|
|
140
|
+
|
|
141
|
+
## 9. Component Patterns & States
|
|
142
|
+
|
|
143
|
+
### Primary CTA (`프로모션 보기`, `티빙 시작하기`)
|
|
144
|
+
- Background: `#FF153C` (canonical brand red)
|
|
145
|
+
- Color: `#FFFFFF`
|
|
146
|
+
- Radius: `12.4px` (hero) / `8px` (header inline)
|
|
147
|
+
- Padding: `19.6292px 62px` (hero) — generous horizontal, allowing 4-syllable Korean CTAs without wrap
|
|
148
|
+
- Font: Pretendard 18.6px / 700 (hero), 14px / 700 (header)
|
|
149
|
+
- Height: 62px (hero), 32px (header)
|
|
150
|
+
- Border: none
|
|
151
|
+
|
|
152
|
+
### Secondary / nav links
|
|
153
|
+
- Color: `#A3A3A3` default, `#FFFFFF` active
|
|
154
|
+
- Size: 15.5px / 400 (passive), 700 (current)
|
|
155
|
+
- No background, no border
|
|
156
|
+
|
|
157
|
+
### Footer
|
|
158
|
+
- Background: `#000000` (continuous with canvas)
|
|
159
|
+
- Links: `#A3A3A3` 15.5px; `개인정보처리방침` rendered at weight 700 (legal-emphasis convention)
|
|
160
|
+
|
|
161
|
+
### Live status
|
|
162
|
+
- Presumed to use `#FF584A` (`--color-cate-live`) with circular pulse indicator (live token system suggests dedicated chrome).
|
|
163
|
+
|
|
164
|
+
## 10. Voice & Tone
|
|
165
|
+
|
|
166
|
+
TVING's product voice — observed from button labels, footer copy register, and onboarding headline structure — is **concise, action-oriented, casual-polite Korean (`-요/-세요`)**. No exclamation marks observed on CTAs. No marketing superlatives within product chrome. The onboarding headline `지금 시작해보세요` is grammatically a polite imperative without emphasis — invitation, not exhortation.
|
|
167
|
+
|
|
168
|
+
The voice register sits between Netflix Korea's neutral-formal and Wavve's slightly more casual approach. Footer items use legal-register nouns (`이용약관`, `법적고지`) without softening.
|
|
169
|
+
|
|
170
|
+
**Voice samples (OmD-original analyst characterizations — NOT verbatim from TVING):**
|
|
171
|
+
- Action: "지금 보세요" / "이어서 보기" / "시청 계속하기"
|
|
172
|
+
- Status: "라이브 진행 중" / "오늘 공개" / "에피소드 12까지"
|
|
173
|
+
- Empty / error: "잠시 후 다시 시도해주세요" / "지금은 시청할 수 없어요"
|
|
174
|
+
|
|
175
|
+
IP guardrail: TVING's actual marketing taglines (`스트리밍의 모든 것`, etc.) are NOT reproduced in this DESIGN.md. Voice samples above are fresh illustrative reconstructions in the observed register.
|
|
176
|
+
|
|
177
|
+
## 11. Brand Narrative (Reported Facts Only)
|
|
178
|
+
|
|
179
|
+
TVING is operated by **TVING Inc.**, a subsidiary of **CJ ENM** (Korea's largest media conglomerate). Originally launched in 2010 as a CJ Hellovision live-TV streaming service, the platform was relaunched in 2020 as a standalone OTT after CJ ENM spun off TVING as an independent company in partnership with JTBC Studios. The platform's competitive thesis is **K-content provenance** — CJ ENM and JTBC together produce a large share of Korea's tvN, JTBC, and CJ-affiliated drama and entertainment IP, giving TVING first-window exclusivity on a substantial portion of Korean primetime programming. In 2022, TVING absorbed Paramount+ Korean operations under a content partnership.
|
|
180
|
+
|
|
181
|
+
Headquarters: Seoul, South Korea. Service domain: `www.tving.com`. The 🐴 horse emoji prefixing the browser tab title is a 2024-2025 brand-personality device tied to TVING's marketing campaigns.
|
|
182
|
+
|
|
183
|
+
**[FILL IN]**: Exact subscriber count, current CEO, latest funding round are not verified at OmD attribution fidelity in this pass — flagged for UPDATE if needed.
|
|
184
|
+
|
|
185
|
+
## 12. Personas (Inferred, Public-Surveys-Only)
|
|
186
|
+
|
|
187
|
+
**[FILL IN]** — Personas below are **inferred from public market positioning** (CJ ENM K-content focus, live-sports investment, mobile-first chrome), not from TVING-published user research:
|
|
188
|
+
|
|
189
|
+
1. **K-drama primetime viewer (25-44, urban, mobile)** — watches tvN / JTBC originals same-night-as-broadcast; values episode-tracking continuity and download-for-commute.
|
|
190
|
+
2. **Live sports follower (KBO baseball, 30-55, dual-screen)** — uses TVING during commute and at home for live KBO games (TVING holds KBO streaming rights); dedicated `--kbo-player-*` tokens confirm this user is a first-class design target.
|
|
191
|
+
3. **Variety-show casual (teens-20s, social)** — clips surface (`--color-cate-clip`) suggests short-form viewing pattern for variety highlights, shared into chat apps.
|
|
192
|
+
|
|
193
|
+
Authentic persona work would require access to TVING's internal research or commissioned surveys — explicitly out of scope here.
|
|
194
|
+
|
|
195
|
+
## 13. Anti-Patterns & Don'ts
|
|
196
|
+
|
|
197
|
+
**Do NOT, when porting this design language to your own product:**
|
|
198
|
+
|
|
199
|
+
1. **Don't replicate the locked dark canvas if your content is not video.** TVING's `#000` works because poster art and video frames provide all the visual energy. A dark-mode SaaS dashboard or marketplace inherits the gloom without inheriting the cinema.
|
|
200
|
+
2. **Don't claim a six-category taxonomy without earning it.** The `--color-cate-*` system works because TVING genuinely has six content surface paradigms (live sports, live TV, VOD drama, VOD movie, clips, ads). Adopting six taxonomy hues for a product with three actual surfaces produces visual noise.
|
|
201
|
+
3. **Don't replicate `#FF153C` verbatim.** It is a CJ ENM brand color in spirit; shift via `delta_set` if you want a "TVING-like" warm scarlet — try `#E0142E` to `#FF2A4D` range with WCAG-checked contrast on dark surface.
|
|
202
|
+
4. **Don't skip Pretendard for "system font."** TVING's typography reads tight and modern because Pretendard's optical sizing differs from Apple SD Gothic Neo at the 12-18px display range. System fallback degrades the character meaningfully.
|
|
203
|
+
5. **Don't apply top-corners-only radius to non-poster cards.** That geometry is meaningful only when the bottom edge is an image bleed; on a text card it reads as a CSS mistake.
|
|
204
|
+
6. **Don't import the live-streaming geometry tokens as-is.** `--kbo-player-width: calc(100vw - 31.25rem)` is calibrated to TVING's specific sidebar — meaningless context elsewhere.
|
|
205
|
+
|
|
206
|
+
## 14. Implementation Notes
|
|
207
|
+
|
|
208
|
+
- **Stack**: Next.js (inferred from chunked CSS class hashes) + Emotion CSS-in-JS + Tailwind utility layer + shadcn/ui-pattern semantic role tokens.
|
|
209
|
+
- **Token strategy**: HSL components in CSS vars (`350 100% 54.12%`) so `hsl(var(--tving) / 0.5)` produces alpha variants without separate tokens — a shadcn idiom.
|
|
210
|
+
- **Live geometry**: All live-streaming player dimensions are `calc()` expressions against `100vw` minus a fixed sidebar — meaning the player resizes responsively to viewport while sidebar stays pinned.
|
|
211
|
+
- **iOS PWA**: `--safe-area-inset-*` plumbed throughout — TVING ships as a native-feeling PWA on iOS in addition to native apps.
|
|
212
|
+
- **Vendor coexistence**: SweetAlert2 (modal), Swiper (carousel), and the bundled shadcn-pattern primitives all run side-by-side. Pragmatic, not opinionated.
|
|
213
|
+
|
|
214
|
+
## 15. Verification
|
|
215
|
+
|
|
216
|
+
| § | Source | Date | Confidence |
|
|
217
|
+
|---|---|---|---|
|
|
218
|
+
| 1, 2, 3, 4, 5, 6, 9 | Live CDP capture via browser-harness :9222 — 13 raw_samples, 114 :root CSS custom properties, 3000-node frequency analysis | 2026-05-15 | High |
|
|
219
|
+
| 7, 8 | Token-level signals only (interactions not triggered in static inspect) | 2026-05-15 | Medium (flagged for UPDATE) |
|
|
220
|
+
| 10 | Observed button labels + footer copy register; voice samples are OmD-original analyst reconstructions | 2026-05-15 | Medium (no verbatim adoption) |
|
|
221
|
+
| 11 | Public corporate narrative (CJ ENM / TVING Inc. press history) | 2026-05-15 | Medium (subscriber/CEO marked FILL IN) |
|
|
222
|
+
| 12 | **Inferred only** — no TVING-published persona research consulted | 2026-05-15 | Low (explicitly flagged) |
|
|
223
|
+
| 13 | OmD-original analytical guidance | 2026-05-15 | High (analyst opinion) |
|
|
224
|
+
|
|
225
|
+
### Tier 1 — Official Design System
|
|
226
|
+
**Result: negative (documented).**
|
|
227
|
+
|
|
228
|
+
Probed all canonical subdomain patterns:
|
|
229
|
+
- `design.tving.com` → DNS 000
|
|
230
|
+
- `brand.tving.com` → DNS 000
|
|
231
|
+
- `tech.tving.com` → DNS 000
|
|
232
|
+
- `tving.com/design` → 404
|
|
233
|
+
- GitHub `tving` org → 1 repo (`tving.github.io`, empty)
|
|
234
|
+
- CJ ENM corporate channels — no public TVING-branded DS portal
|
|
235
|
+
|
|
236
|
+
The production CSS `:root` token set (114 custom properties) extracted via live CDP capture is the closest authoritative public artifact and is treated here as the de-facto source of truth.
|
|
237
|
+
|
|
238
|
+
### Tier 2 — Third-party indexes
|
|
239
|
+
- `getdesign.md/q/tving` → 404
|
|
240
|
+
- `styles.refero.design/?q=tving` → 200 with no result cards
|
|
241
|
+
|
|
242
|
+
Consistent with the systemic Korean-coverage gap.
|
|
243
|
+
|
|
244
|
+
### IP Guardrails
|
|
245
|
+
- Brand assets (logo, name, `#FF153C`) referenced for analysis only — not redistributed.
|
|
246
|
+
- §10 Voice samples are **fresh OmD-original analyst reconstructions** in the observed register — no verbatim TVING marketing copy or taglines reproduced.
|
|
247
|
+
- §11 narrative is sourced from publicly reported facts (CJ ENM corporate history); subscriber/CEO/funding marked **[FILL IN]** where attribution fidelity is insufficient.
|
|
248
|
+
- §12 personas are explicitly inferred from market positioning; authentic persona work would require TVING-internal research.
|
|
249
|
+
- Content thumbnails (poster art, hero stills, episode metadata) NOT captured into product DOM or this DESIGN.md. Reference screenshot kept under fair-use commentary.
|
|
250
|
+
|
|
251
|
+
### Flagged for UPDATE pass
|
|
252
|
+
- Authenticated browse / VOD detail / live KBO player surfaces — gated, not inspected.
|
|
253
|
+
- Motion timing (poster card hover, player chrome fade, modal entrance) — requires interaction triggers.
|
|
254
|
+
- Exact live category-color usage on chrome — `--color-cate-*` system observed in tokens but per-surface application not visually verified.
|
|
255
|
+
- TVING subscriber count, current CEO, latest funding, founding-year specifics for §11.
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
*Captured via `omd:add-reference` (CREATE mode) on 2026-05-15. See `assets/_reference/` for tokens.json, structure.json, fonts.json, .live-inspect-proof.json, screenshots/, LICENSE-NOTE.md, attribution.md.*
|
|
@@ -1,3 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: uber
|
|
3
|
+
name: Uber
|
|
4
|
+
country: US
|
|
5
|
+
category: consumer-tech
|
|
6
|
+
homepage: "https://www.uber.com"
|
|
7
|
+
primary_color: "#000000"
|
|
8
|
+
logo:
|
|
9
|
+
type: simpleicons
|
|
10
|
+
slug: uber
|
|
11
|
+
verified: "2026-05-15"
|
|
12
|
+
omd: "0.1"
|
|
13
|
+
ds:
|
|
14
|
+
name: Base Web
|
|
15
|
+
url: "https://baseweb.design"
|
|
16
|
+
type: system
|
|
17
|
+
description: Uber's React implementation of Base — a living component system.
|
|
18
|
+
---
|
|
19
|
+
|
|
1
20
|
# Design System Inspiration of Uber
|
|
2
21
|
|
|
3
22
|
## 1. Visual Theme & Atmosphere
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: upbit
|
|
3
|
+
name: Upbit
|
|
4
|
+
country: KR
|
|
5
|
+
category: fintech
|
|
6
|
+
homepage: "https://upbit.com"
|
|
7
|
+
primary_color: "#093687"
|
|
8
|
+
logo:
|
|
9
|
+
type: favicon
|
|
10
|
+
slug: "https://www.google.com/s2/favicons?domain=upbit.com&sz=256"
|
|
11
|
+
verified: "2026-05-15"
|
|
12
|
+
omd: "0.1"
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Upbit — DESIGN.md
|
|
16
|
+
|
|
17
|
+
> Note: brand assets and tokens captured here are documented **reference-only** for design pedagogy under the OmD project. No taglines are reproduced verbatim. Voice characterization in §10–11 is a fresh synthesis of observable surface behavior and public corporate sources; it is not lifted from Upbit/Dunamu copy.
|
|
18
|
+
|
|
19
|
+
## 1. Visual Theme & Atmosphere
|
|
20
|
+
|
|
21
|
+
Upbit is the production crypto-asset exchange operated by **Dunamu** in Korea, launched 2017. Its product identity rests on three observable promises: regulated-grade trust, dense real-time information, and zero theatrics — the page presents the market, not the brand.
|
|
22
|
+
|
|
23
|
+
The interface is unmistakably a **Korean finance UI**: tables first, hero second; red signals 상승 (up), blue signals 하락 (down) — inversion of the US convention and a hard tell for locale-correct design. There is no animated mascot, no gradient hero illustration, no "lifestyle" photography. Trust is communicated through restraint.
|
|
24
|
+
|
|
25
|
+
## 2. Layout
|
|
26
|
+
|
|
27
|
+
- **Desktop grid**: fixed 1400px content width; single top nav (h≈80 with primary row 36px + utility row); no sidebar on the marketing surface.
|
|
28
|
+
- **Exchange surface**: information-dense grid — left market list, center chart + orderbook, right order panel — all driven by tables, not cards.
|
|
29
|
+
- **Marketing surface (`/home`)**: hero band → market-summary table → product modules (스테이킹, 코인모으기) → CTA band. Light surface (`#E9ECF1` page bg, white panels).
|
|
30
|
+
- **Density rule**: row height 45px on tradable lists, 30px on column headers. Vertical rhythm in 4–8px increments.
|
|
31
|
+
- **Color is structural, not decorative**: tinted row backgrounds (rgba 8% alpha of rise/fall hue) communicate direction without competing with the numerals.
|
|
32
|
+
|
|
33
|
+
## 3. Color tokens
|
|
34
|
+
|
|
35
|
+
Captured 2026-05-14 from production via CDP `getComputedStyle`. See `assets/_reference/tokens.json`.
|
|
36
|
+
|
|
37
|
+
| Token | Hex | Use |
|
|
38
|
+
|---|---|---|
|
|
39
|
+
| `brand.primary` | `#1375EC` | Primary brand blue — nav highlight, KRW pair tint |
|
|
40
|
+
| `brand.primaryDeep` | `#0062DF` | Primary CTA bg (Login / 회원가입) |
|
|
41
|
+
| `brand.primaryDarker` | `#003597` | Hero CTA bg (large) |
|
|
42
|
+
| `semantic.rise` | `#DD3C44` | ▲ 상승 / 매수호가 (KR: red = up) |
|
|
43
|
+
| `semantic.riseSoft` | `rgba(221,60,68,0.08)` | rise row tint |
|
|
44
|
+
| `semantic.fall` | `#1375EC` | ▼ 하락 / 매도호가 (KR: blue = down) |
|
|
45
|
+
| `semantic.fallSoft` | `rgba(19,117,236,0.08)` | fall row tint |
|
|
46
|
+
| `text.primary` | `#1A2434` | headings, nav |
|
|
47
|
+
| `text.body` | `#333333` | default body |
|
|
48
|
+
| `text.muted` | `#666666` | table header / labels |
|
|
49
|
+
| `text.subtle` | `#565D6A` | footer / utility |
|
|
50
|
+
| `text.disabled` | `#8E929B` | placeholder |
|
|
51
|
+
| `surface.body` | `#E9ECF1` | page background |
|
|
52
|
+
| `surface.card` | `#FFFFFF` | card / panel |
|
|
53
|
+
| `surface.tableHeader` | `#F9FAFC` | table header / alt row |
|
|
54
|
+
| `surface.tableAlt` | `#F4F5F7` | alt row / segment unselected |
|
|
55
|
+
| `surface.neutral` | `#EDEEF1` | secondary button |
|
|
56
|
+
|
|
57
|
+
**Locale rule (critical):** if you port Upbit-tone UI to a US/EU market, swap rise/fall hues — green = up, red = down. The blue-down semantic only reads correctly to Korean / JP / TW users.
|
|
58
|
+
|
|
59
|
+
## 4. Components
|
|
60
|
+
|
|
61
|
+
### Button
|
|
62
|
+
|
|
63
|
+
**Primary**
|
|
64
|
+
- Background: `#0062DF`
|
|
65
|
+
- Text: `#FFFFFF`
|
|
66
|
+
- Border: none
|
|
67
|
+
- Radius: 4px
|
|
68
|
+
- Padding: 0 10px
|
|
69
|
+
- Height: 36px
|
|
70
|
+
- Font: 14px / 400 / Roboto+Noto Sans KR
|
|
71
|
+
- Use: 로그인 / 회원가입 in compact nav
|
|
72
|
+
|
|
73
|
+
**Primary — Hero**
|
|
74
|
+
- Background: `#003597`
|
|
75
|
+
- Text: `#FFFFFF`
|
|
76
|
+
- Border: none
|
|
77
|
+
- Radius: 4px
|
|
78
|
+
- Padding: 0 12px
|
|
79
|
+
- Height: 44px
|
|
80
|
+
- Font: 15px / 400 / Roboto+Noto Sans KR
|
|
81
|
+
- Use: 거래소 둘러보기 / 회원가입 (hero CTA)
|
|
82
|
+
|
|
83
|
+
**Secondary**
|
|
84
|
+
- Background: `#EDEEF1`
|
|
85
|
+
- Text: `#1A2434`
|
|
86
|
+
- Border: none
|
|
87
|
+
- Radius: 4px
|
|
88
|
+
- Padding: 0 10px
|
|
89
|
+
- Height: 36px
|
|
90
|
+
- Font: 14px / 400 / Roboto+Noto Sans KR
|
|
91
|
+
- Use: paired secondary action (회원가입 small variant)
|
|
92
|
+
|
|
93
|
+
**Tag — percent / direct-input**
|
|
94
|
+
- Background: `#FFFFFF`
|
|
95
|
+
- Text: `#1A2434`
|
|
96
|
+
- Border: 1px solid `#BEC1C6`
|
|
97
|
+
- Radius: 4px
|
|
98
|
+
- Padding: 0 8px 1px
|
|
99
|
+
- Height: 28px
|
|
100
|
+
- Font: 12px / 400
|
|
101
|
+
- Use: 10% / 25% / 50% / 100% / 직접입력 quick-fill on order form
|
|
102
|
+
|
|
103
|
+
### Table cell — price / change
|
|
104
|
+
|
|
105
|
+
**Rise (▲ up)**
|
|
106
|
+
- Background: `rgba(221, 60, 68, 0.08)`
|
|
107
|
+
- Text: `#DD3C44`
|
|
108
|
+
- Border: none
|
|
109
|
+
- Radius: 0
|
|
110
|
+
- Padding: 4.5px 4px
|
|
111
|
+
- Height: 45px
|
|
112
|
+
- Font: 12px / 400
|
|
113
|
+
- Use: 상승 가격 셀 / 매수호가 cell tint
|
|
114
|
+
|
|
115
|
+
**Fall (▼ down)**
|
|
116
|
+
- Background: `rgba(19, 117, 236, 0.08)`
|
|
117
|
+
- Text: `#1375EC`
|
|
118
|
+
- Border: none
|
|
119
|
+
- Radius: 0
|
|
120
|
+
- Padding: 4.5px 4px
|
|
121
|
+
- Height: 45px
|
|
122
|
+
- Font: 12px / 400
|
|
123
|
+
- Use: 하락 가격 셀 / 매도호가 cell tint
|
|
124
|
+
|
|
125
|
+
**Header row**
|
|
126
|
+
- Background: `#F9FAFC`
|
|
127
|
+
- Text: `#666666`
|
|
128
|
+
- Border: bottom 1px `#EDEEF1`
|
|
129
|
+
- Radius: 0
|
|
130
|
+
- Padding: 0 14px
|
|
131
|
+
- Height: 30px
|
|
132
|
+
- Font: 11px / 400
|
|
133
|
+
- Use: 체결가 / 현재가 / 전일대비 / 거래대금 column heads
|
|
134
|
+
|
|
135
|
+
### Segment switch
|
|
136
|
+
|
|
137
|
+
**Locale segment (KO / EN)**
|
|
138
|
+
- Background (selected): `#F4F5F7`
|
|
139
|
+
- Background (unselected): `#FFFFFF`
|
|
140
|
+
- Text: `#333333`
|
|
141
|
+
- Border: 1px solid `#BEC1C6`
|
|
142
|
+
- Radius: 0
|
|
143
|
+
- Padding: 0
|
|
144
|
+
- Height: 28px
|
|
145
|
+
- Font: 12px / 400
|
|
146
|
+
- Use: top-right utility row
|
|
147
|
+
|
|
148
|
+
### Navigation
|
|
149
|
+
|
|
150
|
+
**Top nav**
|
|
151
|
+
- Background: `#FFFFFF`
|
|
152
|
+
- Text: `#1A2434`
|
|
153
|
+
- Border: bottom 1px `#EDEEF1`
|
|
154
|
+
- Radius: 0
|
|
155
|
+
- Padding: 0 20px
|
|
156
|
+
- Height: 80px (60px primary + 20px utility)
|
|
157
|
+
- Font: 15px / 400 (primary items)
|
|
158
|
+
- Use: persistent top-bar, fixed 1400px inner width
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
**Verified:** 2026-05-14
|
|
162
|
+
**Tier 1 sources:** live CDP inspect of `https://upbit.com/home` (samples 41) + `https://upbit.com/exchange?code=CRIX.UPBIT.KRW-BTC` (samples 80). Combined 121 raw samples → `assets/_reference/raw-capture.json` + `raw-capture-exchange.json` + `.live-inspect-proof.json`.
|
|
163
|
+
**Tier 2 sources:** `getdesign.md/upbit` — returned `not_found` (verified 2026-05-14, page text: "No designs found for 'upbit'"). `styles.refero.design/?q=upbit` — search interface returned no result cards for the query (verified 2026-05-14). Both 3rd-party indexes have weak Korean coverage (consistent with the 2026-05-13 KR-10 batch finding).
|
|
164
|
+
**Tier 1 official DS:** **NEGATIVE result.** Attempted: `design.upbit.com` (DNS no-resolve), `upbit.com/brand` (301 → marketing), `design.dunamu.com` (DNS no-resolve), `dunamu.com` corporate site (200, no public DS surface; Naver blog `blog.naver.com/dunamupr` is PR, not design). Dunamu/Upbit do not publish an external design system as of 2026-05-14. Reconcile is therefore Tier-1-live-only.
|
|
165
|
+
**Conflicts unresolved:** none.
|
|
166
|
+
|
|
167
|
+
## 5. Iconography
|
|
168
|
+
|
|
169
|
+
Upbit uses two icon registers:
|
|
170
|
+
- **Coin marks** — third-party brand glyphs (BTC, ETH, XRP, …) shown at 16–20px monochrome or color, ID-only role; never decorative.
|
|
171
|
+
- **UI glyphs** — flat 1.5px stroke, 16px frame, sparse: chevron, sort, favorite (★ outline → solid), info (i), close (×). No bespoke icon family; the visual contract is "stay invisible until needed."
|
|
172
|
+
|
|
173
|
+
Direction is communicated by **▲ / ▼ glyphs colocated with hue and number**, not by separate icons.
|
|
174
|
+
|
|
175
|
+
## 6. Imagery
|
|
176
|
+
|
|
177
|
+
Marketing surface uses flat, isometric-leaning illustration for product modules (스테이킹, 코인모으기) — small, contained inside white card frames, not edge-to-edge hero photography. No people, no aspirational lifestyle. The hero band is type-led with a single product screenshot, not a photographic backdrop. Total imagery footprint is small; the table is the hero.
|
|
178
|
+
|
|
179
|
+
## 7. Motion
|
|
180
|
+
|
|
181
|
+
Restrained. Observable motion:
|
|
182
|
+
- Row blink (≈150ms ease-out) when a new trade prints — opacity 0 → 1 on the rise/fall tint.
|
|
183
|
+
- Hover affordance on rows: tint shift to `#F4F5F7` ≈100ms linear.
|
|
184
|
+
- Nav highlight underline: 200ms ease-out.
|
|
185
|
+
|
|
186
|
+
No page transitions, no parallax, no scroll-jacking. The exchange surface itself is in constant micro-motion (numbers updating) — applying additional UI motion would compete with data motion.
|
|
187
|
+
|
|
188
|
+
## 8. Voice (microcopy register)
|
|
189
|
+
|
|
190
|
+
Korean primary, English secondary (KO/EN segment). Sentence-final form is `~합니다 / ~해요` mixed: `~합니다` on legal/notice surfaces (지원 종료 안내), `~해요` on product features (코인모으기로 꾸준히 모아요). Numerals are unitised in Korean reading order (1,234,567원, 1,234.56 BTC).
|
|
191
|
+
|
|
192
|
+
CTA labels are nouns or noun-phrases, not imperatives: 로그인 · 회원가입 · 거래소 둘러보기 · 직접입력. No exclamation marks. No emoji.
|
|
193
|
+
|
|
194
|
+
## 9. Accessibility & locale
|
|
195
|
+
|
|
196
|
+
- Color contrast: primary CTA `#0062DF` on white = 5.13:1 (AA pass). Rise text `#DD3C44` on `rgba(221,60,68,0.08)` background ≈ 4.9:1 (AA pass for normal text). Fall text `#1375EC` on its tint ≈ 4.6:1 (AA pass).
|
|
197
|
+
- Hit targets: 28px tags are below WCAG 2.5.5 (44px target). Trading speed > accessibility floor is an explicit trade-off here.
|
|
198
|
+
- Locale-critical: rise/fall hue convention. Any port outside KR/JP/TW must invert.
|
|
199
|
+
- Korean font stack falls back through legacy IE-era families (Dotum / 돋움) — chain not pruned.
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## 10. Voice & Tone
|
|
204
|
+
|
|
205
|
+
**Voice adjectives**: 1) **Composed** — never breathless even during volatility. 2) **Procedural** — every action is named, listed, traceable. 3) **Locale-fluent** — Korean financial register, no startup slang.
|
|
206
|
+
|
|
207
|
+
| Do | Don't |
|
|
208
|
+
|---|---|
|
|
209
|
+
| Use nouns for CTAs (`로그인`, `회원가입`) | Use imperatives or exclamation (`지금 시작하세요!`) |
|
|
210
|
+
| State the rule before the action ("최소 5,000원부터 매수") | Inflate ("쉽고 빠르게!") |
|
|
211
|
+
| Show the number first, label second | Lead with brand voice on a trading screen |
|
|
212
|
+
| Mix `~합니다` (notice) and `~해요` (product) by surface | Use casual emoji-laden tone on price surfaces |
|
|
213
|
+
|
|
214
|
+
**Voice samples** (illustrative — characterizing the observed register, not lifting copy):
|
|
215
|
+
1. (notice) "5월 15일 00:00부터 해당 마켓 거래 지원이 종료됩니다." — straight declarative, time-first.
|
|
216
|
+
2. (product) "코인모으기로 매주 정해진 금액만큼 자동 매수해요." — `~해요` form, mechanism named.
|
|
217
|
+
3. (CTA) "거래소 둘러보기" — noun phrase, no urgency word.
|
|
218
|
+
|
|
219
|
+
## 11. Brand Narrative
|
|
220
|
+
|
|
221
|
+
Upbit launched in October 2017 as Dunamu's bet that crypto in Korea would need a counterpart that looked, regulated, and felt like Korean equities — not a Silicon Valley product photographed onto a black background. The product identity has held remarkably steady through three boom-bust cycles: the same blue, the same tables, the same restraint.
|
|
222
|
+
|
|
223
|
+
Dunamu's broader portfolio (StockPlus for KOSPI/KOSDAQ retail, Quotation Corp for B2B market data) signals the company's center of gravity — they are a **market-data company first**, an exchange operator second. That shows in the UI: the table is canon, the brand is wallpaper.
|
|
224
|
+
|
|
225
|
+
The "why now" thesis encoded in the surface: in a market famous for speculative theatrics, the **most trusted-looking** exchange wins disproportionate flow during downturns. Restraint is the strategy.
|
|
226
|
+
|
|
227
|
+
## 12. Principles
|
|
228
|
+
|
|
229
|
+
1. **Data is the hero; chrome is the frame.**
|
|
230
|
+
*UI implication:* table primitives outrank card primitives. Never wrap a price in a decorative container.
|
|
231
|
+
|
|
232
|
+
2. **Direction must be readable at a glance — and in the local convention.**
|
|
233
|
+
*UI implication:* red = up, blue = down (KR/JP/TW). Tint at 8% alpha so hue communicates without overpowering the numeral.
|
|
234
|
+
|
|
235
|
+
3. **Restraint scales with stakes.**
|
|
236
|
+
*UI implication:* the higher the order-size context, the fewer the design accents. Hero modules can carry illustration; the order panel cannot.
|
|
237
|
+
|
|
238
|
+
4. **Procedural before persuasive.**
|
|
239
|
+
*UI implication:* CTAs name what happens (`로그인`, `직접입력`), they don't sell it. Reserve persuasive copy for marketing surfaces only.
|
|
240
|
+
|
|
241
|
+
5. **Locale-correct or wrong.**
|
|
242
|
+
*UI implication:* Korean stack ships first, English is a sibling segment — not a translation layer. Sentence-final forms by surface (`~합니다` notice / `~해요` product) are non-negotiable.
|
|
243
|
+
|
|
244
|
+
## 13. Personas
|
|
245
|
+
|
|
246
|
+
> Disclaimer: archetypes synthesised from public market behavior, app-store reviews, and 2024–2025 Korean crypto-retail surveys. No internal Upbit research is referenced.
|
|
247
|
+
|
|
248
|
+
- **혜진, 34, 직장인 (서울)** — KOSPI 5년 차, 2024 비트코인 ETF 뉴스 후 입문. KRW 마켓 위주, 매수는 코인모으기 자동, 매도는 수동. UI 신뢰가 입문 결정의 80%였다고 말함.
|
|
249
|
+
- **준호, 28, 개발자 (판교)** — 알트 트레이더, 호가창 + 차트 +체결창 3 패널 항상 띄움. 화면 정보 밀도가 만족도의 1순위. 모바일은 보조.
|
|
250
|
+
- **선영, 41, 자영업 (대구)** — 보유 종목 5개 이하, 주 1회 진입. 푸시 알림 + 알기 쉬운 표가 핵심. 신용카드 결제 없이 은행 연동만 사용.
|
|
251
|
+
|
|
252
|
+
## 14. States
|
|
253
|
+
|
|
254
|
+
| Category | Behavior |
|
|
255
|
+
|---|---|
|
|
256
|
+
| Empty | 보유 자산 없을 때: 좌측 정렬 안내문 + 입금 안내 link. 일러스트 없음. |
|
|
257
|
+
| Loading | 표 셀 단위 skeleton bar (h≈14, bg `#EDEEF1`); 페이지 단위 spinner 없음. |
|
|
258
|
+
| Error — recoverable | inline 빨간 helper text `#DD3C44` 12px under input; CTA disabled. |
|
|
259
|
+
| Error — network | top sticky bar `#FFE7E8` bg, `#DD3C44` text, 재시도 link. |
|
|
260
|
+
| Success | toast 하단 우측, h≈40, bg `#FFFFFF`, border 1px `#BEC1C6`, 3s auto-dismiss. |
|
|
261
|
+
| Skeleton | row-level only on tables (price/volume cells), 1.2s shimmer linear-gradient. |
|
|
262
|
+
| Disabled | `#8E929B` text on `#F4F5F7` bg; button opacity unchanged (color-only signal). |
|
|
263
|
+
|
|
264
|
+
## 15. Motion & Easing
|
|
265
|
+
|
|
266
|
+
- **Duration scale**: 100ms (hover) / 150ms (row blink, segment) / 200ms (nav, modal in) / 250ms (modal out).
|
|
267
|
+
- **Easing**: `ease-out` for entrances and value changes; `linear` for shimmer; no spring.
|
|
268
|
+
- **Motion rules**:
|
|
269
|
+
1. Never animate a price field's own typography — only its background tint.
|
|
270
|
+
2. No page transitions on the exchange surface; navigation is instantaneous (state-driven).
|
|
271
|
+
3. Modal enter from `translateY(8px) opacity:0` → identity over 200ms ease-out. Exit reverses, 250ms.
|
|
272
|
+
4. Row-print blink: tint fades in 150ms then holds for 800ms before easing out 400ms. The 800ms hold is what makes a moving market legible.
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
**OmD provenance:** Created 2026-05-14 via `omd:add-reference` CREATE pipeline. Tier 1 = live CDP inspect (2 surfaces, 121 raw samples). Tier 2 = both indexes attempted, both empty (documented). Tier 1 official DS = negative (documented). IP guardrails: brand assets reference-only; voice fresh characterization; no verbatim taglines. See `_research.md` for full source map.
|