oh-my-design-cli 1.3.9 → 1.5.1

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.
Files changed (168) hide show
  1. package/README.ja.md +8 -8
  2. package/README.ko.md +7 -7
  3. package/README.md +50 -16
  4. package/README.zh-TW.md +8 -8
  5. package/agents/omd-asset-curator.md +2 -7
  6. package/agents/omd-codex-image.md +49 -0
  7. package/agents/omd-designer-review.md +38 -0
  8. package/agents/omd-final-qa.md +40 -0
  9. package/agents/omd-kr-writer.md +35 -0
  10. package/agents/omd-locale-adapter.md +32 -0
  11. package/agents/omd-master.md +3 -13
  12. package/agents/omd-orchestrator.md +34 -0
  13. package/data/reference-audits/2026-05-14-kr10.md +72 -0
  14. package/data/reference-audits/2026-05-15-kr10.md +124 -0
  15. package/data/reference-fingerprints.json +1409 -254
  16. package/data/research/2026-05-18-agent-landscape.md +69 -0
  17. package/data/research/2026-05-18-kr-style-presets.md +572 -0
  18. package/dist/bin/oh-my-design.js +6 -3
  19. package/dist/bin/oh-my-design.js.map +1 -1
  20. package/dist/{install-skills-MVXVXYAY.js → install-skills-IETT2TBJ.js} +91 -8
  21. package/dist/install-skills-IETT2TBJ.js.map +1 -0
  22. package/package.json +7 -1
  23. package/skills/omd-apply/SKILL.md +0 -1
  24. package/skills/omd-codex-image/SKILL.md +162 -0
  25. package/skills/omd-designer-review/SKILL.md +146 -0
  26. package/skills/omd-final-qa/SKILL.md +153 -0
  27. package/skills/omd-kr-writer/SKILL.md +229 -0
  28. package/skills/omd-locale-adapter/SKILL.md +124 -0
  29. package/skills/omd-orchestrator/SKILL.md +124 -0
  30. package/web/references/17live/DESIGN.md +424 -0
  31. package/web/references/29cm/DESIGN.md +11 -2
  32. package/web/references/ably/DESIGN.md +12 -2
  33. package/web/references/airbnb/DESIGN.md +17 -2
  34. package/web/references/airtable/DESIGN.md +20 -0
  35. package/web/references/alipay/DESIGN.md +456 -0
  36. package/web/references/appier/DESIGN.md +420 -0
  37. package/web/references/apple/DESIGN.md +17 -2
  38. package/web/references/baemin/DESIGN.md +11 -2
  39. package/web/references/banksalad/DESIGN.md +17 -2
  40. package/web/references/bilibili/DESIGN.md +426 -0
  41. package/web/references/bmw/DESIGN.md +14 -0
  42. package/web/references/bunjang/DESIGN.md +308 -0
  43. package/web/references/cal/DESIGN.md +14 -0
  44. package/web/references/catchtable/DESIGN.md +262 -0
  45. package/web/references/channeltalk/DESIGN.md +374 -0
  46. package/web/references/class101/DESIGN.md +433 -0
  47. package/web/references/classum/DESIGN.md +217 -0
  48. package/web/references/claude/DESIGN.md +11 -2
  49. package/web/references/clay/DESIGN.md +19 -0
  50. package/web/references/clickhouse/DESIGN.md +19 -0
  51. package/web/references/cohere/DESIGN.md +20 -0
  52. package/web/references/coinbase/DESIGN.md +14 -0
  53. package/web/references/composio/DESIGN.md +14 -0
  54. package/web/references/cookpad/DESIGN.md +357 -0
  55. package/web/references/coupang/DESIGN.md +17 -2
  56. package/web/references/cursor/DESIGN.md +20 -0
  57. package/web/references/dabang/DESIGN.md +210 -0
  58. package/web/references/dcard/DESIGN.md +11 -2
  59. package/web/references/dji/DESIGN.md +416 -0
  60. package/web/references/elevenlabs/DESIGN.md +20 -0
  61. package/web/references/expo/DESIGN.md +20 -0
  62. package/web/references/fastcampus/DESIGN.md +460 -0
  63. package/web/references/ferrari/DESIGN.md +14 -0
  64. package/web/references/figma/DESIGN.md +17 -2
  65. package/web/references/flex/DESIGN.md +309 -0
  66. package/web/references/framer/DESIGN.md +20 -0
  67. package/web/references/freee/DESIGN.md +16 -2
  68. package/web/references/gangnamunni/DESIGN.md +18 -2
  69. package/web/references/gmarket/DESIGN.md +464 -0
  70. package/web/references/gogoro/DESIGN.md +403 -0
  71. package/web/references/hashicorp/DESIGN.md +19 -0
  72. package/web/references/ibm/DESIGN.md +20 -0
  73. package/web/references/ichef/DESIGN.md +411 -0
  74. package/web/references/inflearn/DESIGN.md +396 -0
  75. package/web/references/intercom/DESIGN.md +14 -0
  76. package/web/references/jumpit/DESIGN.md +366 -0
  77. package/web/references/kakao/DESIGN.md +14 -0
  78. package/web/references/kakaobank/DESIGN.md +17 -2
  79. package/web/references/kakaopay/DESIGN.md +17 -2
  80. package/web/references/kakaot/DESIGN.md +454 -0
  81. package/web/references/karrot/DESIGN.md +16 -2
  82. package/web/references/kbank/DESIGN.md +195 -0
  83. package/web/references/kkday/DESIGN.md +423 -0
  84. package/web/references/kraken/DESIGN.md +14 -0
  85. package/web/references/krds/DESIGN.md +17 -2
  86. package/web/references/kream/DESIGN.md +382 -0
  87. package/web/references/kurly/DESIGN.md +11 -2
  88. package/web/references/lamborghini/DESIGN.md +14 -0
  89. package/web/references/line/DESIGN.md +17 -2
  90. package/web/references/linear.app/DESIGN.md +17 -2
  91. package/web/references/lovable/DESIGN.md +14 -0
  92. package/web/references/lunit/DESIGN.md +249 -0
  93. package/web/references/meituan/DESIGN.md +424 -0
  94. package/web/references/mercari/DESIGN.md +11 -2
  95. package/web/references/millie/DESIGN.md +533 -0
  96. package/web/references/minimax/DESIGN.md +14 -0
  97. package/web/references/mintlify/DESIGN.md +14 -0
  98. package/web/references/miro/DESIGN.md +20 -0
  99. package/web/references/mistral.ai/DESIGN.md +20 -0
  100. package/web/references/money-forward/DESIGN.md +401 -0
  101. package/web/references/mongodb/DESIGN.md +19 -0
  102. package/web/references/musinsa/DESIGN.md +11 -2
  103. package/web/references/myrealtrip/DESIGN.md +445 -0
  104. package/web/references/naver/DESIGN.md +17 -2
  105. package/web/references/naverwebtoon/DESIGN.md +429 -0
  106. package/web/references/note/DESIGN.md +318 -0
  107. package/web/references/notion/DESIGN.md +11 -2
  108. package/web/references/nvidia/DESIGN.md +11 -2
  109. package/web/references/ohouse/DESIGN.md +11 -2
  110. package/web/references/oliveyoung/DESIGN.md +342 -0
  111. package/web/references/ollama/DESIGN.md +14 -0
  112. package/web/references/opencode.ai/DESIGN.md +20 -0
  113. package/web/references/pinkoi/DESIGN.md +11 -2
  114. package/web/references/pinterest/DESIGN.md +19 -0
  115. package/web/references/posthog/DESIGN.md +20 -0
  116. package/web/references/publy/DESIGN.md +511 -0
  117. package/web/references/qanda/DESIGN.md +11 -2
  118. package/web/references/raycast/DESIGN.md +19 -0
  119. package/web/references/remember/DESIGN.md +17 -2
  120. package/web/references/renault/DESIGN.md +14 -0
  121. package/web/references/replicate/DESIGN.md +14 -0
  122. package/web/references/resend/DESIGN.md +20 -0
  123. package/web/references/revolut/DESIGN.md +14 -0
  124. package/web/references/ridi/DESIGN.md +11 -2
  125. package/web/references/runwayml/DESIGN.md +14 -0
  126. package/web/references/sanity/DESIGN.md +20 -0
  127. package/web/references/sentry/DESIGN.md +14 -0
  128. package/web/references/smarthr/DESIGN.md +404 -0
  129. package/web/references/smartnews/DESIGN.md +331 -0
  130. package/web/references/socar/DESIGN.md +17 -2
  131. package/web/references/spacex/DESIGN.md +11 -2
  132. package/web/references/spoon/DESIGN.md +446 -0
  133. package/web/references/spotify/DESIGN.md +14 -0
  134. package/web/references/stripe/DESIGN.md +11 -2
  135. package/web/references/supabase/DESIGN.md +20 -0
  136. package/web/references/superhuman/DESIGN.md +20 -0
  137. package/web/references/tada/DESIGN.md +528 -0
  138. package/web/references/tesla/DESIGN.md +11 -2
  139. package/web/references/together.ai/DESIGN.md +20 -0
  140. package/web/references/toss/DESIGN.md +16 -2
  141. package/web/references/toss-securities/DESIGN.md +193 -0
  142. package/web/references/tossbank/DESIGN.md +519 -0
  143. package/web/references/triple/DESIGN.md +434 -0
  144. package/web/references/tumblbug/DESIGN.md +530 -0
  145. package/web/references/tving/DESIGN.md +259 -0
  146. package/web/references/uber/DESIGN.md +19 -0
  147. package/web/references/upbit/DESIGN.md +276 -0
  148. package/web/references/upstage/DESIGN.md +214 -0
  149. package/web/references/vercel/DESIGN.md +17 -2
  150. package/web/references/voltagent/DESIGN.md +14 -0
  151. package/web/references/wadiz/DESIGN.md +344 -0
  152. package/web/references/wanted/DESIGN.md +16 -2
  153. package/web/references/warp/DESIGN.md +14 -0
  154. package/web/references/watcha/DESIGN.md +425 -0
  155. package/web/references/wavve/DESIGN.md +438 -0
  156. package/web/references/wconcept/DESIGN.md +511 -0
  157. package/web/references/webflow/DESIGN.md +14 -0
  158. package/web/references/wise/DESIGN.md +19 -0
  159. package/web/references/x.ai/DESIGN.md +14 -0
  160. package/web/references/xiaohongshu/DESIGN.md +423 -0
  161. package/web/references/yanolja/DESIGN.md +17 -2
  162. package/web/references/yeogiotte/DESIGN.md +18 -2
  163. package/web/references/yogiyo/DESIGN.md +465 -0
  164. package/web/references/zapier/DESIGN.md +20 -0
  165. package/web/references/zigbang/DESIGN.md +12 -2
  166. package/web/references/zigzag/DESIGN.md +17 -2
  167. package/agents/omd-3d-blender.md +0 -269
  168. 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.