oh-my-design-cli 1.8.7 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (247) hide show
  1. package/.claude/hooks/lib/preferences-parser.cjs +1 -0
  2. package/.claude/hooks/lib/preferences-writer.cjs +1 -0
  3. package/.claude/hooks/post-edit-watch.cjs +1 -0
  4. package/.claude/hooks/session-end-foldin.cjs +1 -0
  5. package/.claude/hooks/session-state-loader.cjs +1 -0
  6. package/.claude/hooks/skill-activation.cjs +1 -0
  7. package/.claude/settings.json +10 -1
  8. package/.github/assets/logo-bg.png +0 -0
  9. package/AGENTS.md +20 -1
  10. package/CHANGELOG.md +482 -0
  11. package/MIGRATION.md +103 -0
  12. package/README.ja.md +56 -19
  13. package/README.ko.md +47 -30
  14. package/README.md +48 -30
  15. package/README.zh-TW.md +59 -22
  16. package/agents/AGENT.md +8 -7
  17. package/agents/omd-codex-image.md +1 -1
  18. package/agents/omd-critic.md +6 -7
  19. package/agents/omd-designer-review.md +1 -1
  20. package/agents/omd-final-qa.md +1 -1
  21. package/agents/omd-humanizer.md +38 -0
  22. package/agents/omd-kr-writer.md +3 -4
  23. package/agents/omd-locale-adapter.md +12 -16
  24. package/agents/omd-master.md +24 -19
  25. package/agents/omd-microcopy.md +1 -1
  26. package/agents/omd-orchestrator.md +7 -8
  27. package/agents/omd-slop-auditor.md +31 -0
  28. package/agents/omd-ux-researcher.md +1 -1
  29. package/data/reference-fingerprints.json +1995 -38
  30. package/dist/bin/oh-my-design.js +16 -8
  31. package/dist/bin/oh-my-design.js.map +1 -1
  32. package/dist/chunk-UJIHCEYF.js +99 -0
  33. package/dist/chunk-UJIHCEYF.js.map +1 -0
  34. package/dist/doctor-LDWSFM3I.js +763 -0
  35. package/dist/doctor-LDWSFM3I.js.map +1 -0
  36. package/dist/install-skills-ZZFNJ2II.js +1120 -0
  37. package/dist/install-skills-ZZFNJ2II.js.map +1 -0
  38. package/docs/CLI_QUICKSTART.md +157 -0
  39. package/package.json +25 -4
  40. package/scripts/postinstall.cjs +5 -4
  41. package/skills/claude-design/SKILL.md +38 -14
  42. package/skills/claude-design/references/claude-design-flow.md +11 -11
  43. package/skills/claude-design/references/codebase-analysis.md +5 -4
  44. package/skills/omd-final-qa/SKILL.md +1 -1
  45. package/skills/omd-harness/SKILL.md +51 -50
  46. package/skills/omd-humanize/SKILL.md +116 -0
  47. package/skills/omd-humanize/agents/openai.yaml +4 -0
  48. package/skills/omd-humanize/references/locale-playbooks.md +102 -0
  49. package/skills/omd-humanize/references/sources.md +11 -0
  50. package/skills/omd-init/SKILL.md +18 -12
  51. package/skills/omd-locale-adapter/SKILL.md +58 -91
  52. package/skills/omd-orchestrator/SKILL.md +11 -5
  53. package/skills/omd-reference-capture/SKILL.md +80 -26
  54. package/skills/omd-reference-capture/scripts/PLAYWRIGHT-LICENSE.txt +202 -0
  55. package/skills/omd-reference-capture/scripts/PLAYWRIGHT-NOTICE.txt +5 -0
  56. package/skills/omd-reference-capture/scripts/THIRD_PARTY_NOTICES.md +3 -0
  57. package/skills/omd-reference-capture/scripts/capture-reference-evidence.mjs +159906 -0
  58. package/skills/omd-slop-audit/SKILL.md +110 -0
  59. package/skills/omd-slop-audit/agents/openai.yaml +4 -0
  60. package/skills/omd-slop-audit/references/pattern-catalog.md +96 -0
  61. package/skills/omd-slop-audit/references/sources.md +24 -0
  62. package/web/references/104/DESIGN.md +354 -0
  63. package/web/references/11st/DESIGN.md +197 -316
  64. package/web/references/29cm/DESIGN.md +297 -393
  65. package/web/references/42dot/DESIGN.md +390 -0
  66. package/web/references/8percent/DESIGN.md +438 -0
  67. package/web/references/ably/DESIGN.md +267 -572
  68. package/web/references/acer/DESIGN.md +329 -0
  69. package/web/references/airbnb/DESIGN.md +219 -557
  70. package/web/references/alipay/DESIGN.md +179 -420
  71. package/web/references/apple/DESIGN.md +224 -498
  72. package/web/references/asleep/DESIGN.md +402 -0
  73. package/web/references/au/DESIGN.md +334 -0
  74. package/web/references/autopedia/DESIGN.md +382 -0
  75. package/web/references/aws-cloudscape/DESIGN.md +241 -0
  76. package/web/references/baemin/DESIGN.md +332 -491
  77. package/web/references/banksalad/DESIGN.md +269 -180
  78. package/web/references/barogo/DESIGN.md +416 -0
  79. package/web/references/beusable/DESIGN.md +464 -0
  80. package/web/references/bilibili/DESIGN.md +206 -374
  81. package/web/references/bmw/DESIGN.md +162 -276
  82. package/web/references/brandi/DESIGN.md +184 -325
  83. package/web/references/catchtable/DESIGN.md +219 -264
  84. package/web/references/cgv/DESIGN.md +317 -0
  85. package/web/references/channeltalk/DESIGN.md +210 -336
  86. package/web/references/china-airlines/DESIGN.md +291 -0
  87. package/web/references/cjonstyle/DESIGN.md +453 -0
  88. package/web/references/class101/DESIGN.md +168 -387
  89. package/web/references/classum/DESIGN.md +228 -203
  90. package/web/references/claude/DESIGN.md +242 -479
  91. package/web/references/clay/DESIGN.md +179 -377
  92. package/web/references/clickhouse/DESIGN.md +254 -343
  93. package/web/references/cohere/DESIGN.md +214 -324
  94. package/web/references/coinone/DESIGN.md +199 -179
  95. package/web/references/corca/DESIGN.md +414 -0
  96. package/web/references/coupang/DESIGN.md +205 -475
  97. package/web/references/cursor/DESIGN.md +240 -381
  98. package/web/references/dabang/DESIGN.md +248 -213
  99. package/web/references/dable/DESIGN.md +431 -0
  100. package/web/references/datarize/DESIGN.md +217 -330
  101. package/web/references/dealicious/DESIGN.md +402 -0
  102. package/web/references/drdiary/DESIGN.md +404 -0
  103. package/web/references/elastic/DESIGN.md +238 -0
  104. package/web/references/elevenlabs/DESIGN.md +183 -321
  105. package/web/references/eslite/DESIGN.md +257 -0
  106. package/web/references/evaair/DESIGN.md +338 -0
  107. package/web/references/expo/DESIGN.md +238 -331
  108. package/web/references/familymart-tw/DESIGN.md +254 -0
  109. package/web/references/ferrari/DESIGN.md +160 -377
  110. package/web/references/figma/DESIGN.md +197 -451
  111. package/web/references/fitpet/DESIGN.md +445 -0
  112. package/web/references/flex/DESIGN.md +170 -253
  113. package/web/references/framer/DESIGN.md +197 -340
  114. package/web/references/freee/DESIGN.md +211 -533
  115. package/web/references/friendliai/DESIGN.md +431 -0
  116. package/web/references/frip/DESIGN.md +440 -0
  117. package/web/references/gangnamunni/DESIGN.md +154 -591
  118. package/web/references/gaudiolab/DESIGN.md +414 -0
  119. package/web/references/google/DESIGN.md +290 -398
  120. package/web/references/hashicorp/DESIGN.md +273 -318
  121. package/web/references/heydealer/DESIGN.md +429 -0
  122. package/web/references/humanscape/DESIGN.md +433 -0
  123. package/web/references/hyundai/DESIGN.md +158 -368
  124. package/web/references/hyundaicard/DESIGN.md +171 -121
  125. package/web/references/ibm/DESIGN.md +227 -378
  126. package/web/references/idus/DESIGN.md +450 -0
  127. package/web/references/igaworks/DESIGN.md +437 -0
  128. package/web/references/inflearn/DESIGN.md +221 -366
  129. package/web/references/intuit/DESIGN.md +244 -0
  130. package/web/references/jandi/DESIGN.md +191 -291
  131. package/web/references/jobplanet/DESIGN.md +415 -0
  132. package/web/references/kakao/DESIGN.md +287 -475
  133. package/web/references/kakaobank/DESIGN.md +220 -521
  134. package/web/references/kakaogames/DESIGN.md +220 -0
  135. package/web/references/kakaopay/DESIGN.md +207 -526
  136. package/web/references/karrot/DESIGN.md +227 -251
  137. package/web/references/kb-kookmin/DESIGN.md +308 -0
  138. package/web/references/kbank/DESIGN.md +220 -175
  139. package/web/references/kmong/DESIGN.md +281 -356
  140. package/web/references/krds/DESIGN.md +245 -19
  141. package/web/references/kream/DESIGN.md +224 -359
  142. package/web/references/kurly/DESIGN.md +211 -533
  143. package/web/references/lamborghini/DESIGN.md +198 -360
  144. package/web/references/lguplus/DESIGN.md +259 -0
  145. package/web/references/likelion/DESIGN.md +283 -0
  146. package/web/references/line/DESIGN.md +396 -355
  147. package/web/references/linear.app/DESIGN.md +209 -562
  148. package/web/references/lotteon/DESIGN.md +386 -0
  149. package/web/references/lovable/DESIGN.md +255 -349
  150. package/web/references/makinarocks/DESIGN.md +149 -349
  151. package/web/references/maum-ai/DESIGN.md +423 -0
  152. package/web/references/medibloc/DESIGN.md +425 -0
  153. package/web/references/megabox/DESIGN.md +232 -0
  154. package/web/references/mercari/DESIGN.md +217 -434
  155. package/web/references/microsoft/DESIGN.md +234 -388
  156. package/web/references/mildang/DESIGN.md +411 -0
  157. package/web/references/millie/DESIGN.md +183 -504
  158. package/web/references/minimax/DESIGN.md +264 -322
  159. package/web/references/miricanvas/DESIGN.md +182 -355
  160. package/web/references/miro/DESIGN.md +234 -232
  161. package/web/references/mistral.ai/DESIGN.md +231 -314
  162. package/web/references/mixi/DESIGN.md +234 -0
  163. package/web/references/moin/DESIGN.md +445 -0
  164. package/web/references/mongodb/DESIGN.md +219 -316
  165. package/web/references/musinsa/DESIGN.md +184 -510
  166. package/web/references/mynavi/DESIGN.md +242 -0
  167. package/web/references/myrealtrip/DESIGN.md +169 -406
  168. package/web/references/naver/DESIGN.md +328 -499
  169. package/web/references/naverwebtoon/DESIGN.md +172 -395
  170. package/web/references/nhn/DESIGN.md +169 -346
  171. package/web/references/nhncloud/DESIGN.md +185 -123
  172. package/web/references/notion/DESIGN.md +271 -475
  173. package/web/references/nrise/DESIGN.md +417 -0
  174. package/web/references/ohouse/DESIGN.md +210 -549
  175. package/web/references/oliveyoung/DESIGN.md +217 -326
  176. package/web/references/ollama/DESIGN.md +241 -308
  177. package/web/references/onestore/DESIGN.md +248 -0
  178. package/web/references/palantir/DESIGN.md +256 -0
  179. package/web/references/panasonic/DESIGN.md +276 -0
  180. package/web/references/patternfly/DESIGN.md +259 -0
  181. package/web/references/payhere/DESIGN.md +438 -0
  182. package/web/references/pega/DESIGN.md +262 -0
  183. package/web/references/peoplefund/DESIGN.md +431 -0
  184. package/web/references/petfriends/DESIGN.md +428 -0
  185. package/web/references/pinkfong/DESIGN.md +199 -367
  186. package/web/references/pinterest/DESIGN.md +258 -308
  187. package/web/references/poya/DESIGN.md +286 -0
  188. package/web/references/pozalabs/DESIGN.md +438 -0
  189. package/web/references/protopie/DESIGN.md +419 -0
  190. package/web/references/qraft/DESIGN.md +448 -0
  191. package/web/references/quotabook/DESIGN.md +449 -0
  192. package/web/references/recruit/DESIGN.md +247 -0
  193. package/web/references/remember/DESIGN.md +202 -396
  194. package/web/references/resend/DESIGN.md +274 -348
  195. package/web/references/sakura-internet/DESIGN.md +269 -0
  196. package/web/references/samsung/DESIGN.md +157 -359
  197. package/web/references/sandoll/DESIGN.md +445 -0
  198. package/web/references/sanity/DESIGN.md +241 -375
  199. package/web/references/scatterlab/DESIGN.md +412 -0
  200. package/web/references/selectstar/DESIGN.md +439 -0
  201. package/web/references/servicenow/DESIGN.md +289 -0
  202. package/web/references/shinhanbank/DESIGN.md +161 -341
  203. package/web/references/shinhancard/DESIGN.md +208 -319
  204. package/web/references/sionic/DESIGN.md +454 -0
  205. package/web/references/sktelecom/DESIGN.md +310 -0
  206. package/web/references/socar/DESIGN.md +125 -32
  207. package/web/references/softbank/DESIGN.md +231 -0
  208. package/web/references/sony/DESIGN.md +234 -0
  209. package/web/references/soop/DESIGN.md +261 -0
  210. package/web/references/spacex/DESIGN.md +184 -323
  211. package/web/references/spotify/DESIGN.md +253 -394
  212. package/web/references/squeezebits/DESIGN.md +441 -0
  213. package/web/references/stayfolio/DESIGN.md +422 -0
  214. package/web/references/stripe/DESIGN.md +212 -491
  215. package/web/references/supabase/DESIGN.md +244 -316
  216. package/web/references/tabling/DESIGN.md +415 -0
  217. package/web/references/taishinbank/DESIGN.md +243 -0
  218. package/web/references/teamlab/DESIGN.md +240 -0
  219. package/web/references/teamsparta/DESIGN.md +472 -0
  220. package/web/references/tellingme/DESIGN.md +392 -0
  221. package/web/references/tesla/DESIGN.md +244 -427
  222. package/web/references/thsr/DESIGN.md +284 -0
  223. package/web/references/thumbtack/DESIGN.md +302 -0
  224. package/web/references/together.ai/DESIGN.md +257 -304
  225. package/web/references/toss/DESIGN.md +251 -593
  226. package/web/references/toss-securities/DESIGN.md +255 -178
  227. package/web/references/tossbank/DESIGN.md +195 -491
  228. package/web/references/toyota/DESIGN.md +238 -0
  229. package/web/references/tving/DESIGN.md +197 -245
  230. package/web/references/typed/DESIGN.md +413 -0
  231. package/web/references/uber/DESIGN.md +256 -333
  232. package/web/references/udn/DESIGN.md +250 -0
  233. package/web/references/upbit/DESIGN.md +145 -256
  234. package/web/references/upstage/DESIGN.md +211 -204
  235. package/web/references/uswds/DESIGN.md +287 -0
  236. package/web/references/vercel/DESIGN.md +236 -440
  237. package/web/references/wanted/DESIGN.md +215 -487
  238. package/web/references/wise/DESIGN.md +223 -231
  239. package/web/references/wisetracker/DESIGN.md +462 -0
  240. package/web/references/wooribank/DESIGN.md +245 -0
  241. package/web/references/yanolja/DESIGN.md +250 -419
  242. package/web/references/yeogiotte/DESIGN.md +235 -418
  243. package/web/references/zapier/DESIGN.md +256 -377
  244. package/web/references/zendesk/DESIGN.md +288 -0
  245. package/web/references/zigzag/DESIGN.md +200 -621
  246. package/dist/install-skills-7UUDOLG2.js +0 -734
  247. package/dist/install-skills-7UUDOLG2.js.map +0 -1
@@ -8,568 +8,296 @@ primary_color: "#0066ff"
8
8
  logo:
9
9
  type: favicon
10
10
  slug: "https://www.google.com/s2/favicons?domain=wanted.co.kr&sz=256"
11
- verified: "2026-05-15"
11
+ verified: "2026-07-12"
12
12
  omd: "0.1"
13
13
  ds:
14
14
  name: Wanted Montage
15
15
  url: "https://montage.wanted.co.kr/"
16
16
  type: system
17
- description: Wanted's Montage design system docs components, foundations, Wanted Sans, and the brandcenter resource hub.
17
+ description: Wanted's official product-experience design system with foundations, cross-platform components, UI kits, utilities, and usage guidance.
18
+ verification_v2:
19
+ schema: 2
20
+ checked: "2026-07-12"
21
+ surfaces:
22
+ - { id: home, kind: product-home, url: "https://www.wanted.co.kr/", inspected: "2026-07-12" }
23
+ - { id: jobs, kind: product-directory, url: "https://www.wanted.co.kr/wdlist/518", inspected: "2026-07-12" }
24
+ - { id: company, kind: product-service, url: "https://www.wanted.co.kr/company", inspected: "2026-07-12" }
25
+ - { id: montage, kind: official-design-system, url: "https://montage.wanted.co.kr/", inspected: "2026-07-12" }
26
+ - { id: foundations, kind: official-design-system, url: "https://montage.wanted.co.kr/docs/foundations", inspected: "2026-07-12" }
27
+ sources:
28
+ - { id: home-live, kind: product-surface, url: "https://www.wanted.co.kr/", captured: "2026-07-12" }
29
+ - { id: jobs-live, kind: product-surface, url: "https://www.wanted.co.kr/wdlist/518", captured: "2026-07-12" }
30
+ - { id: company-live, kind: product-surface, url: "https://www.wanted.co.kr/company", captured: "2026-07-12" }
31
+ - { id: montage-live, kind: official-doc, url: "https://montage.wanted.co.kr/", captured: "2026-07-12" }
32
+ - { id: foundations-live, kind: official-doc, url: "https://montage.wanted.co.kr/docs/foundations", captured: "2026-07-12" }
33
+ - { id: typography-doc, kind: official-doc, url: "https://montage.wanted.co.kr/docs/utilities/web-utilities/typography-style", captured: "2026-07-12" }
34
+ - { id: text-button-doc, kind: official-doc, url: "https://montage.wanted.co.kr/docs/components/actions/text-button/design", captured: "2026-07-12" }
35
+ conflicts: []
36
+ claims:
37
+ "tokens.colors.primary": &home_evidence { surface_id: home, source_id: home-live, method: live-inspect, captured: "2026-07-12" }
38
+ "tokens.colors.canvas": *home_evidence
39
+ "tokens.colors.heading": *home_evidence
40
+ "tokens.colors.body": *home_evidence
41
+ "tokens.colors.secondary": &jobs_evidence { surface_id: jobs, source_id: jobs-live, method: live-inspect, captured: "2026-07-12" }
42
+ "tokens.colors.subtle-surface": *home_evidence
43
+ "tokens.colors.hairline": *jobs_evidence
44
+ "tokens.colors.on-primary": *home_evidence
45
+ "tokens.typography.family.ui": *home_evidence
46
+ "tokens.typography.heading.size": *jobs_evidence
47
+ "tokens.typography.heading.weight": *jobs_evidence
48
+ "tokens.typography.heading.lineHeight": *jobs_evidence
49
+ "tokens.typography.heading.tracking": *jobs_evidence
50
+ "tokens.typography.heading.use": *jobs_evidence
51
+ "tokens.typography.subtitle.size": *jobs_evidence
52
+ "tokens.typography.subtitle.weight": *jobs_evidence
53
+ "tokens.typography.subtitle.lineHeight": *jobs_evidence
54
+ "tokens.typography.subtitle.tracking": *jobs_evidence
55
+ "tokens.typography.subtitle.use": *jobs_evidence
56
+ "tokens.typography.body.size": *home_evidence
57
+ "tokens.typography.body.weight": *home_evidence
58
+ "tokens.typography.body.lineHeight": *home_evidence
59
+ "tokens.typography.body.use": *home_evidence
60
+ "tokens.typography.caption.size": *jobs_evidence
61
+ "tokens.typography.caption.weight": *jobs_evidence
62
+ "tokens.typography.caption.lineHeight": *jobs_evidence
63
+ "tokens.typography.caption.tracking": *jobs_evidence
64
+ "tokens.typography.caption.use": *jobs_evidence
65
+ "tokens.spacing.xs": *jobs_evidence
66
+ "tokens.spacing.sm": *home_evidence
67
+ "tokens.spacing.md": *jobs_evidence
68
+ "tokens.spacing.lg": *home_evidence
69
+ "tokens.spacing.xl": *home_evidence
70
+ "tokens.rounded.control": *home_evidence
71
+ "tokens.rounded.card": *jobs_evidence
72
+ "tokens.rounded.menu": &montage_evidence { surface_id: montage, source_id: montage-live, method: live-inspect, captured: "2026-07-12" }
73
+ "tokens.rounded.full": *home_evidence
74
+ "tokens.shadow.menu": *montage_evidence
75
+ "tokens.components.header-action.type": *home_evidence
76
+ "tokens.components.header-action.bg": *home_evidence
77
+ "tokens.components.header-action.fg": *home_evidence
78
+ "tokens.components.header-action.border": *home_evidence
79
+ "tokens.components.header-action.radius": *home_evidence
80
+ "tokens.components.header-action.padding": *home_evidence
81
+ "tokens.components.header-action.height": *home_evidence
82
+ "tokens.components.header-action.font": *home_evidence
83
+ "tokens.components.header-action.states": *home_evidence
84
+ "tokens.components.header-action.use": *home_evidence
85
+ "tokens.components.filter-button.type": *jobs_evidence
86
+ "tokens.components.filter-button.bg": *jobs_evidence
87
+ "tokens.components.filter-button.fg": *jobs_evidence
88
+ "tokens.components.filter-button.border": *jobs_evidence
89
+ "tokens.components.filter-button.radius": *jobs_evidence
90
+ "tokens.components.filter-button.padding": *jobs_evidence
91
+ "tokens.components.filter-button.height": *jobs_evidence
92
+ "tokens.components.filter-button.font": *jobs_evidence
93
+ "tokens.components.filter-button.states": *jobs_evidence
94
+ "tokens.components.filter-button.use": *jobs_evidence
95
+ "tokens.components.mini-job-card.type": *home_evidence
96
+ "tokens.components.mini-job-card.bg": *home_evidence
97
+ "tokens.components.mini-job-card.radius": *home_evidence
98
+ "tokens.components.mini-job-card.gap": *home_evidence
99
+ "tokens.components.mini-job-card.font": *home_evidence
100
+ "tokens.components.mini-job-card.use": *home_evidence
101
+ "tokens.components.job-card.type": *jobs_evidence
102
+ "tokens.components.job-card.bg": *jobs_evidence
103
+ "tokens.components.job-card.radius": *jobs_evidence
104
+ "tokens.components.job-card.bodyPadding": *jobs_evidence
105
+ "tokens.components.job-card.gap": *jobs_evidence
106
+ "tokens.components.job-card.font": *jobs_evidence
107
+ "tokens.components.job-card.use": *jobs_evidence
108
+ "tokens.components.search-dialog.type": *home_evidence
109
+ "tokens.components.search-dialog.bg": *home_evidence
110
+ "tokens.components.search-dialog.fg": *home_evidence
111
+ "tokens.components.search-dialog.inputFont": *home_evidence
112
+ "tokens.components.search-dialog.states": *home_evidence
113
+ "tokens.components.search-dialog.use": *home_evidence
114
+ "tokens.components.montage-menu.type": *montage_evidence
115
+ "tokens.components.montage-menu.bg": *montage_evidence
116
+ "tokens.components.montage-menu.radius": *montage_evidence
117
+ "tokens.components.montage-menu.gap": *montage_evidence
118
+ "tokens.components.montage-menu.shadow": *montage_evidence
119
+ "tokens.components.montage-menu.states": *montage_evidence
120
+ "tokens.components.montage-menu.use": *montage_evidence
18
121
  tokens:
19
- source: prose-derived
20
- extracted: "2026-06-09"
122
+ source: reconciled
123
+ extracted: "2026-07-12"
124
+ note: "Six-surface current capture plus official Montage docs. Pretendard Variable is the visible UI family. Wanted Sans Variable and Pretendard JP Variable were declared but had zero visible use in the capture and are not promoted as UI tokens."
21
125
  colors:
22
126
  primary: "#0066ff"
23
- brand-black: "#14191e"
24
- accent-orange: "#ff5c00"
25
- accent-pink: "#ff8eff"
26
- accent-sky: "#00adff"
27
- accent-violet: "#8364ff"
28
- brand-grey: "#f0f4f8"
29
127
  canvas: "#ffffff"
30
- surface-subtle: "#f7f7f8"
31
128
  heading: "#171719"
32
129
  body: "#333333"
33
- disabled: "#a0a0a0"
34
- divider: "#e5e8eb"
35
- error: "#f0483c"
36
- success: "#00b97c"
37
- warning: "#ffab00"
130
+ secondary: "#858688"
131
+ subtle-surface: "#f8f8f8"
132
+ hairline: "#e8e9ea"
133
+ on-primary: "#ffffff"
38
134
  typography:
39
- family: { sans: "Pretendard Variable", mono: "Pretendard Variable" }
40
- display: { size: 32, weight: 700, lineHeight: 1.25, use: "Brandcenter, montage hero" }
41
- h1: { size: 24, weight: 700, lineHeight: 1.4, use: "Job detail header" }
42
- h2: { size: 20, weight: 700, lineHeight: 1.4, use: "Section titles" }
43
- subtitle: { size: 16, weight: 600, lineHeight: 1.5, use: "JobCard position title" }
44
- body: { size: 14, weight: 400, lineHeight: 1.6, use: "Standard reading, filter chip label" }
45
- body-small: { size: 13, weight: 400, lineHeight: 1.5, use: "Company name on JobCard" }
46
- caption: { size: 12, weight: 400, lineHeight: 1.5, use: "Metadata, dates, location" }
47
- micro: { size: 10, weight: 500, lineHeight: 1.4, use: "Footer link strip" }
48
- spacing: { xs: 4, sm: 8, md: 12, base: 16, lg: 20, xl: 24, xxl: 32, section: 64 }
49
- rounded: { sm: 6, md: 8, lg: 12, full: 9999 }
135
+ family: { ui: "Pretendard Variable" }
136
+ heading: { size: 22, weight: 600, lineHeight: 1.36, tracking: -0.4268, use: "Current product section headings and Montage headings" }
137
+ subtitle: { size: 16, weight: 600, lineHeight: 1.5, tracking: 0.0912, use: "Job-card position title" }
138
+ body: { size: 14, weight: 400, lineHeight: 1.43, use: "Product lists, cards, actions, and supporting copy" }
139
+ caption: { size: 12, weight: 500, lineHeight: 1.33, tracking: 0.3024, use: "Job-card industry and metadata" }
140
+ spacing: { xs: 4, sm: 8, md: 14, lg: 20, xl: 40 }
141
+ rounded: { control: 8, card: 12, menu: 16, full: 9999 }
50
142
  shadow:
51
- floating: "0px 4px 12px rgba(0,0,0,0.08)"
52
- modal: "0px 8px 24px rgba(0,0,0,0.12)"
53
- components:
54
- button-primary: { type: button, bg: "#0066ff", fg: "#ffffff", radius: 8, padding: "7px 14px", font: "14px/400 Pretendard Variable", use: "Sign-up / apply CTA (filled)" }
55
- button-secondary: { type: button, fg: "#171719", radius: 8, padding: "7px 14px", font: "14px/400 Pretendard Variable", use: "Header nav text button" }
56
- filter-chip: { type: badge, fg: "#171719", radius: 10, padding: "7px 9px 7px 11px", font: "14px/400 Pretendard Variable", use: "Filter taxonomy chip, hover bg #f7f7f8" }
57
- jobcard: { type: card, bg: "#ffffff", radius: 12, padding: "12px 16px", use: "Job posting card, no shadow, gutter separation" }
58
- segmented: { type: tab, bg: "#f7f7f8", radius: 10, padding: "0 4px", font: "14px/400 Pretendard Variable", use: "Sort control track", active: "white segment 8px radius #333333 text" }
59
- reward-badge: { type: badge, fg: "#ffffff", radius: 2, font: "12px/600 Pretendard Variable", use: "합격보상금 overlay on thumbnail" }
60
- micro-tag: { type: badge, bg: "#a0a0a0", fg: "#ffffff", radius: 0, padding: "5px 7px", font: "10px/500 Pretendard Variable", use: "Footer legal pill" }
61
- search-input: { type: input, fg: "#171719", radius: 9999, font: "14px/400 Pretendard Variable", use: "Header search trigger" }
62
- avatar-pill: { type: avatar, bg: "#171719", radius: 9999, use: "Header user avatar 38x38" }
143
+ menu: "0 2px 4px -2px rgba(23,23,23,0.06), 0 4px 6px -1px rgba(23,23,23,0.06)"
63
144
  components_harvested: true
145
+ components:
146
+ header-action: { type: button, bg: "transparent", fg: "#0066ff", border: "1px inset rgba(112,115,124,0.16)", radius: "8px", padding: "7px 14px", height: "32px", font: "14px / 400", states: "default captured; no hover/focus token promoted", use: "Current product header account action" }
147
+ filter-button: { type: button, bg: "transparent", fg: "#171719", border: "1px inset rgba(112,115,124,0.16)", radius: "8px", padding: "7px 11px", height: "36px", font: "14px / 400", states: "default captured; no selected value inferred", use: "All-tags and filter trigger on the job directory" }
148
+ mini-job-card: { type: card, bg: "transparent", radius: "12px image", gap: "14px", font: "16px / 600 title", use: "Horizontal recommended-job card on the current home surface" }
149
+ job-card: { type: card, bg: "transparent", radius: "12px thumbnail", bodyPadding: "0px 6px", gap: "2px", font: "16px / 600 position title", use: "Vertical job result card on the current directory" }
150
+ search-dialog: { type: input, bg: "#ffffff", fg: "#171719", inputFont: "16px / 400 / 24px", states: "dialog-open captured on four product surfaces", use: "Full-screen product search input revealed from the header" }
151
+ montage-menu: { type: dialog, bg: "transparent", radius: "16px", gap: "4px", shadow: "0 2px 4px -2px rgba(23,23,23,0.06), 0 4px 6px -1px rgba(23,23,23,0.06)", states: "dialog-open captured on Montage pages", use: "Compact current Montage navigation/menu overlay" }
64
152
  ---
65
153
 
66
154
  # Design System Inspiration of Wanted (원티드)
67
155
 
68
156
  ## 1. Visual Theme & Atmosphere
69
157
 
70
- Wanted (원티드) is Korea's largest career marketplace — a recruitment platform run by **Wanted Lab** (원티드랩, founded 2015) that brokers matches between 3.6M+ working professionals and 35K+ companies through AI matching, referral bonuses (합격보상금), and a long-form job-posting format that reads more like a company introduction than a classified ad. The product's visual identity rejects the generic "job board" vocabulary (slate grays, stock photography, Times New Roman density) and instead borrows from Korean fintech and SaaS: a single saturated brand blue, a calm white-and-warm-grey canvas, generous whitespace around job cards, and a custom typeface **Wanted Sans** built in-house for "all possibilities of working people."
158
+ Wanted is a Korean career platform that connects job discovery, company information, career content, and employer services around the idea that every working person should be able to work more like themselves. Its current product is quieter and denser than a campaign page: white surfaces, `#171719` headings, `#333333` body copy, restrained translucent metadata, and `#0066ff` reserved for recognizable actions. The signature visual unit is not a generic elevated card but a job result composed from a 12px media thumbnail, a compact 16px/600 position title, company and location metadata, and generous grid rhythm.
71
159
 
72
- The brand color is a single, decisive **`#0066FF`** (PANTONE 2195 C) a slightly cooler, more confident hue than Toss's `#3182f6`, intentionally positioned to feel like "growth blue" rather than "transaction blue." It appears only on interactive surfaces: the 회원가입/로그인 CTA, the apply button on job detail pages, link text, and selection states. Heading text sits at near-black `#171719`, body at `#333333`, and secondary metadata at `rgba(55,56,60,0.61)` a translucent grey that lets backgrounds bleed through, signaling lower priority without committing to a hard hex value.
73
-
74
- The signature surface is the **JobCard** — a 12px-radius white container holding a thumbnail (12/12/0/0 corners), bookmark icon, company name, position title, salary range, and 합격보상금 (referral reward) badge. Cards sit in a 3-column grid on desktop, full-width on mobile, separated by 20–24px gutters. Filter chips above the grid use 9999px pill radii for country/condition/stack toggles, and a 10px-radius segmented control for sort order (최신순/추천순/인기순).
160
+ Montage is Wanted's current official product-experience design system. Its 2026 site frames reusable foundations and components as a way to combine individual parts into a consistent, intuitive service, and publishes cross-platform component guidance rather than only a static brand kit. The live product and Montage capture both visibly used Pretendard Variable. Wanted Sans Variable and Pretendard JP Variable were present as declared downloadable faces but had zero visible computed use in the inspected nodes, so this reference keeps their existence as font evidence without rendering either as the current UI family.
75
161
 
76
162
  **Key Characteristics:**
77
- - Single brand blue `#0066FF` (PANTONE 2195 C) used only for interaction
78
- - Wanted Sans (custom geometric-humanist) + Pretendard JP 7 weights, variable axes
79
- - Three-tier typography hierarchy: 23/16/14px for heading/sub/body
80
- - Class naming prefix `wds-*` (emotion-style atomic) + module-scoped `JobCard_*` / `AdCard_*` (CSS Modules)
81
- - JobCard at 12px radius is the signature surface — thumbnail / position / salary / reward badge
82
- - 9999px pill chips for filter taxonomy, 8/10/12px stepped radii for everything else
83
- - White canvas (`#FFFFFF`) + warm-grey panel (`#F7F7F8`) — no dark mode on web (Montage system supports it)
163
+ - `#0066ff` interactive accent on a white product canvas
164
+ - Loaded Pretendard Variable with 1,575 visible uses across product and Montage
165
+ - 12px image/card geometry, 8px controls, and 16px overlay menus
166
+ - Product search dialog captured through safe interaction on four product routes
167
+ - Current job-card composition documented separately from Montage primitives
84
168
 
85
169
  ## 2. Color Palette & Roles
86
170
 
87
- ### Primary (Brand)
88
- - **Wanted Blue** (`#0066FF`): PANTONE 2195 C. The only interaction color. Sign-up CTAs, apply buttons, link text, focus rings, selection highlights. Verified against `brandcenter` and live `rgb(0, 102, 255)` on `회원가입/로그인` button.
89
- - **Wanted Black** (`#14191E`): Brand-center secondary. Logo lockup on light backgrounds, marketing typography. Distinct from UI heading color `#171719`.
90
-
91
- ### Brand Accent (Marketing Only)
92
- - **Orange** (`#FF5C00`): Brand accent promotional banners, brand campaigns. Never on functional UI.
93
- - **Pink** (`#FF8EFF`): Brand accent illustration accents, secondary campaign moments.
94
- - **Sky Blue** (`#00ADFF`): Brand accent — paired with Wanted Blue in gradient marketing surfaces.
95
- - **Violet** (`#8364FF`): Brand accent premium / AI / Wanted+ feature surfaces.
96
- - **Brand Grey** (`#F0F4F8`): Cool-grey marketing canvas, distinct from UI surface grey.
97
-
98
- ### UI Surface & Text
99
- - **Background** (`#FFFFFF`): Page surface, card surface.
100
- - **Surface Subtle** (`#F7F7F8`): Segmented-control track, secondary panel background, filter dropdown menu surface.
101
- - **Heading** (`#171719`): Primary text — H1/H2, position title, company name on JobCard.
102
- - **Body** (`#333333`): Standard reading text, body paragraphs in job description.
103
- - **Secondary** (`rgba(55, 56, 60, 0.61)`): Metadata, breadcrumbs, "상품안내" sub-nav links — translucent grey, intentionally non-hex so it adapts to surface.
104
- - **Disabled** (`rgb(160, 160, 160)`): Pre-disabled link state and inactive controls.
105
-
106
- ### Border & Divider
107
- - **Border Default** (`rgba(112, 115, 124, 0.16)`): The standard 1px hairline — used on the dropdown toggle (`태그 전체` button) and as the universal card edge when shadow is suppressed. Translucent so it visually softens against any background.
108
- - **Divider** (`#E5E8EB`): Solid hairline for list separators inside content (job description sections).
109
-
110
- ### Semantic (Inherited from Montage / WDS theme)
111
- - **Error / Negative** (`#F0483C`): Form validation errors, application-failed states.
112
- - **Success / Positive** (`#00B97C`): Application success, payment confirmation.
113
- - **Warning** (`#FFAB00`): "Expiring soon" job badges, attention-needed.
114
- - **Info** (`#0066FF`): Same as primary — info uses brand blue, not a separate teal.
171
+ - **Primary action** (`#0066ff`): current account/action text across four product surfaces.
172
+ - **Heading** (`#171719`): product headings, position titles, and controls.
173
+ - **Body** (`#333333`): dominant product list and card copy.
174
+ - **Secondary** (`#858688`): the observed 61% metadata color resolved on white.
175
+ - **Canvas** (`#ffffff`): page, dialog, and content surface.
176
+ - **Subtle surface** (`#f8f8f8`): current secondary product background.
177
+ - **Hairline** (`#e8e9ea`): the observed 16% control boundary resolved on white.
178
+
179
+ The old marketing orange, pink, sky, violet, semantic error/success/warning, and `#f7f7f8` claims were not promoted because the current capture did not establish those roles at the same surface boundary.
115
180
 
116
181
  ## 3. Typography Rules
117
182
 
118
- ### Font Family
119
- - **Primary (UI)**: `"Pretendard Variable", "Pretendard JP Variable", -apple-system, BlinkMacSystemFont, "Apple SD Gothic Neo", system-ui, sans-serif` — verified live on every text node on wanted.co.kr.
120
- - **Brand / Display**: `"Wanted Sans", "Wanted Sans Std", "Pretendard Variable", sans-serif` — used in marketing pages, brandcenter, montage docs.
121
- - **Latin-only fallback**: `"Wanted Sans Std"` — for English-only contexts where Korean glyphs aren't needed.
183
+ ### Font evidence boundary
122
184
 
123
- Wanted maintains two parallel typefaces for two surfaces: **Pretendard Variable** drives the runtime product UI (faster to load via CDN, broad Hangul coverage); **Wanted Sans** drives the brand surfaces (marketing, brandcenter, Montage docs, hiring pages). Pretendard JP Variable extends Hangul support to Japanese kana for cross-border job postings. All three are open-source under SIL OFL 1.1.
185
+ | Evidence class | Resolution |
186
+ |---|---|
187
+ | Official product-use | Montage publishes Wanted's current product typography utilities and scale. |
188
+ | Live surface-use | Pretendard Variable loaded/high with 1,575 visible uses across six captured surfaces. |
189
+ | Official distributed asset | Montage links font resources; asset licensing must be checked per resource before redistribution. |
190
+ | Declared-only | Pretendard JP Variable and Wanted Sans Variable were declared with source files but zero visible use. |
191
+ | Unresolved | Campaign-only use of Wanted Sans and native-app overrides remain unresolved. |
124
192
 
125
- ### Hierarchy
193
+ ### Current observed hierarchy
126
194
 
127
- | Role | Font | Size | Weight | Line Height | Notes |
128
- |------|------|------|--------|-------------|-------|
129
- | Display | Wanted Sans | 32px+ | 700 | 1.25 | Brandcenter, montage hero |
130
- | H1 / Page Title | Pretendard Variable | 24px | 700 | 1.4 | Job detail header |
131
- | H2 / Section | Pretendard Variable | 20px | 700 | 1.4 | "주요업무", "자격요건" |
132
- | Subtitle | Pretendard Variable | 16px | 600 | 1.5 | JobCard position title |
133
- | Body | Pretendard Variable | 14px | 400 | 1.6 | Standard reading, filter chip label |
134
- | Body Small | Pretendard Variable | 13px | 400 | 1.5 | Company name on JobCard |
135
- | Caption | Pretendard Variable | 12px | 400 | 1.5 | Metadata, dates, location |
136
- | Micro | Pretendard Variable | 10px | 500 | 1.4 | Footer 사업자정보확인 strip |
195
+ | Role | Size | Weight | Line height | Tracking |
196
+ |---|---:|---:|---:|---:|
197
+ | Section heading | 22px | 600 | 30px | -0.4268px |
198
+ | Job position | 16px | 600 | 24px | 0.0912px |
199
+ | Supporting title | 15px | 600 | 22px | 0.144px |
200
+ | Product body | 14px | 400 | 20px | normal |
201
+ | Metadata | 12px | 500 | 16px | 0.3024px |
137
202
 
138
- ### Principles
139
- - **Two surfaces, two fonts.** Product UI = Pretendard Variable (battle-tested, fast). Marketing/brand = Wanted Sans (proprietary, expressive). Never mix on the same screen.
140
- - **Three weights, mostly.** 400 (body), 600 (emphasis / subtitle), 700 (heading). 500 only appears on micro-text (footer link strip) and bookmark micro-labels.
141
- - **Korean is primary.** Wanted Sans was designed Korean-first; Latin glyphs are optically weighted to harmonize with Hangul. Never assume English is the default voice.
142
- - **Variable fonts everywhere.** Both Pretendard and Wanted Sans ship as variable fonts — interpolate weight at runtime rather than loading discrete weight files.
203
+ Montage's official typography utility documents a broader scale from Display 1 through Caption 2. That published scale is useful system context; the smaller machine token set above contains only roles grounded in this capture.
143
204
 
144
205
  ## 4. Component Stylings
145
206
 
146
- Wanted's product UI is implemented in two parallel layers: **`wds-*`** classes (Emotion / atomic generated, lowercase hash suffix) for the design-system primitives, and **module-scoped** classes (`JobCard_JobCard__thumb__iOtFn`, `Button_Button__root__MS62F`) for product-specific compositions on top. Live values below are observed from `https://www.wanted.co.kr/wdlist/518` (developer jobs feed) via playwright `getComputedStyle`.
147
-
148
- ### Buttons
149
-
150
- **Primary CTA / Brand**
151
- - Background: transparent (text-only on header) → `#0066FF` (filled on apply / sign-up surfaces)
152
- - Text: `#0066FF` (text variant) → `#FFFFFF` (filled)
153
- - Border: none
154
- - Radius: 8px
155
- - Padding: 7px 14px
156
- - Font: 14px / 400 / Pretendard Variable
157
- - Height: 32px (compact header) / 48–52px (apply CTA)
158
- - Use: `회원가입/로그인` header button (text variant) and 지원하기 (filled variant on job detail)
159
-
160
- **Secondary Text Button**
161
- - Background: transparent
162
- - Text: `#171719`
163
- - Border: none
164
- - Radius: 8px
165
- - Padding: 7px 14px
166
- - Font: 14px / 400 / Pretendard Variable
167
- - Height: 32px
168
- - Use: `기업 서비스`, header nav links — same geometry as primary text button, neutral color
169
-
170
- **Filter Chip / Pill (Country, Tag)**
171
- - Background: transparent (inactive) → `#F7F7F8` (hover/active)
172
- - Text: `#171719`
173
- - Border: none
174
- - Radius: 10px (10px on `한국` filter) / 9999px (pill on round chips)
175
- - Padding: 7px 9px 7px 11px (asymmetric — slightly tighter on right for chevron icon)
176
- - Font: 14px / 400 / Pretendard Variable
177
- - Height: 36px
178
- - Use: Filter taxonomy chips above job grid (한국 / 채용조건 / 기술스택 / 글로벌)
179
-
180
- **Tag Dropdown ("태그 전체")**
181
- - Background: transparent
182
- - Text: `#171719`
183
- - Border: none
184
- - Radius: 8px
185
- - Padding: 7px 11px
186
- - Font: 14px / 400 / Pretendard Variable
187
- - Height: 36px
188
- - Use: Dropdown trigger for tag taxonomy — paired with 8px outlined icon container (`1px solid rgba(112,115,124,0.16)`)
189
-
190
- **Filter Category Heading ("개발・개발 전체")**
191
- - Background: transparent
192
- - Text: `#171719`
193
- - Border: none
194
- - Radius: 6px
195
- - Padding: 4px 0
196
- - Font: 16px / 600 / Pretendard Variable
197
- - Height: 40px
198
- - Use: Active category label at top of job feed — larger, semibold, with trailing 8px-radius chevron icon button
199
-
200
- ### Cards
201
-
202
- **JobCard (primary surface)**
203
- - Background: `#FFFFFF`
204
- - Border: none
205
- - Radius: 12px (body) / 12px 12px 0 0 (thumbnail — top corners only)
206
- - Padding: 0 (thumbnail flush) / 12px 16px (body)
207
- - Shadow: none on default — relies on grid gutter for separation
208
- - Thumbnail aspect: 4:3 (≈ 251×167 at default width)
209
- - Logo crop: 50px square, 9px radius, positioned bottom-left overlapping thumbnail
210
- - Use: Job posting in feed grid — the signature Wanted surface
211
-
212
- **AdCard (sponsored / promoted listing)**
213
- - Background: `#FFFFFF`
214
- - Border: none
215
- - Radius: 12px 12px 0 0 (thumbnail) + 12px (full card)
216
- - Padding: 0
217
- - Thumbnail height: 114px (4:3 at 252 wide)
218
- - Use: Promoted job in feed — same geometry as JobCard, distinguished by a `상품안내` micro-link in the corner rather than visual treatment
219
-
220
- **Reward Badge ("합격보상금 100만원")**
221
- - Background: transparent overlay on thumbnail
222
- - Text: `#FFFFFF` on dark thumbnail tint
223
- - Border: none
224
- - Radius: inherits thumbnail
225
- - Font: 12px / 600 / Pretendard Variable
226
- - Use: Referral-reward callout — Wanted's signature growth lever, surfaced on every eligible JobCard
227
-
228
- ### Inputs
229
-
230
- **Search Input (header)**
231
- - Background: `#FFFFFF` inside translucent dark pill wrapper (`#171719`)
232
- - Wrapper: `38×38px`, 9999px radius, `#171719` background
233
- - Text: `#171719` placeholder
234
- - Font: 14px / 400 / Pretendard Variable
235
- - Use: Header search trigger — icon-only at 38px, expands on focus
236
-
237
- Detailed input variants (text/number/textarea/search) live in the `@wanteddev/wds` package — observable on Montage docs but not on the public-facing jobs feed surface inspected here.
238
-
239
- ### Segmented Controls / Sort Filter
240
-
241
- **Container ("최신순 / 추천순 / 인기순")**
242
- - Background: `#F7F7F8`
243
- - Border: none
244
- - Radius: 10px
245
- - Padding: 0 4px
246
- - Height: 40px
247
- - Width: 236px (3-segment auto)
248
- - Font: 14px / 400 / Pretendard Variable
249
-
250
- **Active Segment**
251
- - Background: `#FFFFFF`
252
- - Text: `#333333`
253
- - Border: none
254
- - Radius: 8px
255
- - Height: 32px (inset 4px on each side from container)
256
- - Shadow: none — relies on background contrast against container `#F7F7F8`
257
- - Use: Currently selected sort mode
258
-
259
- ### Icon Buttons
260
-
261
- **Round Icon (bookmark, close, expand)**
262
- - Background: transparent (default) → `#FFFFFF` (filled rest state)
263
- - Text/Icon: `#333333`
264
- - Border: none
265
- - Radius: 50%
266
- - Padding: 8px (30px target) / 11.3px (36px target) / 8px (40px target)
267
- - Sizes: 30px (compact list), 36px (toolbar), 40px (JobCard bookmark)
268
- - Use: Bookmark on JobCard, close on modals, expand on accordion sections
269
-
270
- ### Badges
271
-
272
- **Solid Badge ("FAQ" / brand callout)**
273
- - Background: `#171719` (or `#0066FF` for brand emphasis)
274
- - Text: `#FFFFFF`
275
- - Border: none
276
- - Radius: 2px
277
- - Padding: 4px 8px 4px 14px (asymmetric — leaves room for trailing chevron)
278
- - Font: 15px / 400 / Pretendard Variable
279
- - Height: 31px
280
- - Use: Inline brand callouts, footer FAQ chip
281
-
282
- **Micro Tag ("사업자정보확인" footer)**
283
- - Background: `#A0A0A0`
284
- - Text: `#FFFFFF`
285
- - Border: none
286
- - Radius: 0px
287
- - Padding: 5px 7px
288
- - Font: 10px / 500 / Pretendard Variable
289
- - Height: 22px
290
- - Use: Legal / regulatory micro-pill in footer — squared edges signal "official document" tone
291
-
292
- ### Header Avatar / Logo Lockup
293
-
294
- **Logo / Profile Pill (header right)**
295
- - Background: `#171719`
296
- - Border: none
297
- - Radius: 9999px
298
- - Size: 38×38px
299
- - Use: Logged-in user avatar placeholder + brand mark — full-pill, no border
207
+ ### Current verified components
300
208
 
301
- ---
209
+ #### Header account action
210
+ - Transparent background, `#0066ff` label, 8px radius
211
+ - 1px translucent inset boundary; 7px × 14px padding; 32px height
212
+
213
+ #### Job filter trigger
214
+ - Transparent, `#171719`, 8px radius, 1px translucent inset boundary
215
+ - 7px × 11px padding; 36px height; 14px/400
302
216
 
303
- **Verified:** 2026-05-13
304
- **Tier 1 sources:**
305
- - `https://www.wanted.co.kr/wdlist/518` live DOM inspection via playwright `getComputedStyle` (22 distinct component samples; class prefix `wds-*` / `JobCard_*` / `AdCard_*` / `TagList_*` / `SortFilter_*` / `IconButton_*` / `Button_*`)
306
- - `https://www.wanted.co.kr/brandcenter/` — official brand palette (`#0066FF` PANTONE 2195 C, secondary `#14191E`/`#FF5C00`/`#FF8EFF`/`#00ADFF`/`#8364FF`/`#F0F4F8`)
307
- - `https://montage.wanted.co.kr/` — Wanted Montage Design System (WDS) docs portal
308
- - `https://github.com/wanteddev/montage-web` — `@wanteddev/wds` package family (wds-theme, wds-engine, wds-icon, wds-lottie, wds-nextjs)
309
- - `https://github.com/wanteddev/wanted-sans` — Wanted Sans typeface (7 weights + variable, SIL OFL 1.1)
217
+ #### Mini job card
218
+ - Horizontal 120×90 media with 12px radius and 14px content gap
219
+ - Position title 16px/600/24px
310
220
 
311
- **Tier 2 sources:**
312
- - `getdesign.md/wanted` no record (search returned "No designs found for 'wanted'"). Logged as unavailable per pipeline.
313
- - `styles.refero.design/?q=wanted` playwright session contested by parallel agents (tab kept switching to a-bly, zigzag, refero/socar). Could not reliably capture refero result for `q=wanted` within this turn. Logged as **unavailable**; Tier 1 (live DOM + brandcenter + Montage docs + GitHub source) treated as authoritative.
221
+ #### Directory job card
222
+ - 308×205 media thumbnail with 12px radius and 8px bottom margin
223
+ - Body uses 0 6px padding and 2px internal gap; position title 16px/600
314
224
 
315
- **Tier 2b status:** partial — getdesign confirmed empty; refero unreliable due to session contention. Tier 1 is comprehensive enough to stand alone (official brand palette + live computed styles + open-source token package family).
225
+ #### Search dialog
226
+ - White full-screen search surface revealed through the current header
227
+ - Input `#171719`, 16px/400/24px; `dialog-open` observed on four product routes
316
228
 
317
- **Conflicts unresolved:** none. The live `rgb(0, 102, 255)` on the sign-up CTA matches the brandcenter-declared `#0066FF` exactly. Logo avatar background `rgb(23, 23, 25)` (`#171719`) differs by 7-8 units from the brand-secondary `#14191E` — this is a known split between **UI heading color** (`#171719`, used in product) and **brand black** (`#14191E`, used on marketing). Both retained as parallel tokens.
229
+ #### Montage menu
230
+ - 16px radius, 4px gap, subtle two-layer shadow
231
+ - Open overlay captured on both Montage surfaces
232
+
233
+ No filled apply CTA, segmented control, form validation, toast, or native navigation token is promoted without a current matching sample.
318
234
 
319
235
  ## 5. Layout Principles
320
236
 
321
- ### Spacing System
322
- - Base unit: 4px
323
- - Common values: 4 / 8 / 12 / 16 / 20 / 24 / 32 / 40 / 48 / 64
324
- - JobCard internal padding: 12px 16px (asymmetric tighter top/bottom)
325
- - Filter row padding: 45px 0 20px (large top buffer, smaller bottom)
326
- - Header height: 56px on desktop, 52px on mobile
327
-
328
- ### Grid & Container
329
- - Max content width: 1185px (observed on `JobList_JobList__filter` div)
330
- - Job feed grid: 4 columns at ≥1185px / 3 at ≥768px / 2 at ≥480px / 1 at <480px
331
- - Card width at 4-col: ~252px (matches `AdCard_AdCard__thumbnail` width)
332
- - Gutter: 20px horizontal, 24px vertical
333
- - Page horizontal padding: 0 (cards flush to grid edge) with internal card padding handling visual breathing room
334
-
335
- ### Whitespace Philosophy
336
- - **Generous filter zone**: 45px above the filter row, 20px below — the filter UI deserves emphasis as the primary navigation pattern.
337
- - **Tight card interiors**: JobCard body uses 12px 16px padding — denser than Toss (which uses 20px) because cards are smaller and meant to be scanned in a grid, not read in isolation.
338
- - **Hierarchical density**: Job feed is dense (grid of 12–16 cards visible). Job detail is spacious (single column, ≥24px vertical rhythm between sections).
339
-
340
- ### Border Radius Scale
341
- - Squared (0–2px): Legal/regulatory micro-pills, official-document callouts
342
- - Compact (4–6px): Filter category heading, small accents
343
- - Standard (8px): Buttons, inputs, secondary controls
344
- - Comfortable (10px): Segmented-control container, filter chips
345
- - Card (12px): JobCard, AdCard, sheets
346
- - Pill (9999px): Header avatar, search trigger, country filter (`한국`)
237
+ - Job discovery uses repeatable grid rhythm while the card body itself stays flat.
238
+ - Keep 12px media rounding distinct from 8px product controls and 16px overlays.
239
+ - Dense metadata belongs below a clear 16px/600 position title.
240
+ - Product composition and Montage documentation examples may share foundations but are not interchangeable evidence.
347
241
 
348
242
  ## 6. Depth & Elevation
349
243
 
350
- | Level | Treatment | Use |
351
- |-------|-----------|-----|
352
- | Flat (Level 0) | No shadow | Page background, JobCard at rest |
353
- | Border (Level 1) | `1px solid rgba(112, 115, 124, 0.16)` | Dropdown trigger icon, hairline edges |
354
- | Hover (Level 2) | Subtle bg shift to `#F7F7F8` | Filter chip hover, segmented-control segment |
355
- | Floating (Level 3) | `0px 4px 12px rgba(0,0,0,0.08)` | Dropdown menus, popovers, "더보기" overflow |
356
- | Modal (Level 4) | `0px 8px 24px rgba(0,0,0,0.12)` | Application-form dialogs, full-screen sheets |
357
-
358
- **Shadow Philosophy.** Wanted prefers background-tint elevation over drop shadows. JobCards float on a white canvas without shadows — separation comes from the 20–24px grid gutter and the warm-grey `#F7F7F8` of the surrounding filter bar. Shadows only appear on floating overlays (dropdowns, modals), and they're single-layer pure black at low opacity — no colored tints, no multi-layer stacks. This matches Toss's restraint principle but is implemented through grid spacing rather than shadow tokens.
244
+ Most current product cards are flat. Controls use an inset 1px translucent boundary, while the captured Montage menu uses a low-opacity two-layer shadow. No generic modal shadow is promoted.
359
245
 
360
246
  ## 7. Do's and Don'ts
361
247
 
362
248
  ### Do
363
- - Use `#0066FF` for every interactive element — links, primary CTAs, focus rings, selection states
364
- - Pair Pretendard Variable (UI) and Wanted Sans (brand) — never mix them in the same surface
365
- - Use 12px radius for JobCard and any "container of job content" surface — it's the recognizable Wanted shape
366
- - Use `#F7F7F8` for segmented-control tracks and secondary panels — it's the Wanted "surface grey"
367
- - Display 합격보상금 (referral bonus) prominently on every JobCard that has one — it's a brand differentiator
368
- - Use translucent secondary text (`rgba(55, 56, 60, 0.61)`) for metadata — it adapts to surface automatically
249
+ - Reserve `#0066ff` for clear actions and selection meaning.
250
+ - Use the verified flat job-card composition for career listings.
251
+ - Keep declared fonts separate from visibly used fonts.
369
252
 
370
253
  ### Don't
371
- - Don't use any blue other than `#0066FF` for interaction even the marketing accents (`#00ADFF` sky, `#8364FF` violet) are decorative only
372
- - Don't put shadows on cards at rest Wanted uses gutter separation, not elevation
373
- - Don't mix brand black `#14191E` and UI heading `#171719` on the same screen — pick the surface (marketing vs product)
374
- - Don't use Wanted Sans on dense UI (job listings, forms) — it's a display face, Pretendard handles density better
375
- - Don't square the JobCard corners — 12px radius is the brand mark of the surface
376
- - Don't use 합격보상금 callouts on non-job surfaces — the badge is reserved for job postings with active referral programs
377
- - Don't put bold (700) weight on body text — reserved for headings and job titles
254
+ - Do not render Wanted Sans as current product UI merely because its files are declared.
255
+ - Do not invent colored semantic states or filled CTAs from an old snapshot.
256
+ - Do not turn every content block into a shadowed 12px card.
378
257
 
379
258
  ## 8. Responsive Behavior
380
259
 
381
- ### Breakpoints
382
- | Name | Width | Key Changes |
383
- |------|-------|-------------|
384
- | Mobile | <480px | 1-column job feed, full-width cards, hamburger nav |
385
- | Tablet | 480–768px | 2-column job feed, condensed filter bar (scrolls horizontally) |
386
- | Desktop | 768–1185px | 3-column job feed, full filter bar visible |
387
- | Wide | ≥1185px | 4-column job feed, centered content with 1185px max-width |
388
-
389
- ### Touch Targets
390
- - Filter chips: 36px height — comfortable for thumb-tap, dense enough for desktop
391
- - Icon buttons: 30 / 36 / 40px stepped — context-dependent (compact / toolbar / card-action)
392
- - Apply CTA: 48–52px — full-width on mobile, fixed width on desktop
393
-
394
- ### Collapsing Strategy
395
- - Filter bar: scrolls horizontally on mobile rather than wrapping (preserves the linear chip taxonomy)
396
- - JobCard thumbnail: maintains 4:3 aspect ratio at all widths
397
- - Header search: collapses to 38px icon trigger on mobile, expands to inline input on desktop ≥768px
398
-
399
- ### Image Behavior
400
- - Company logos: 50px square, 9px radius, bottom-left overlap on JobCard thumbnail
401
- - Job thumbnails: 4:3 aspect, object-fit cover, no skeleton — uses solid `#F0F4F8` background while loading
402
- - Brand illustrations (marketing pages): full-bleed, responsive, follow Wanted Sans display rhythm
260
+ The inspected product adapts repeated job units and search overlays while retaining the same type and radius hierarchy. Exact breakpoints and native-app navigation behavior were not promoted from these desktop captures.
403
261
 
404
262
  ## 9. Agent Prompt Guide
405
263
 
406
- ### Quick Color Reference
407
- - Primary / Interactive: `#0066FF` (Wanted Blue, PANTONE 2195 C)
408
- - Heading text: `#171719`
409
- - Body text: `#333333`
410
- - Secondary text: `rgba(55, 56, 60, 0.61)`
411
- - Surface: `#FFFFFF`
412
- - Surface subtle: `#F7F7F8`
413
- - Border default: `rgba(112, 115, 124, 0.16)`
414
- - Brand black (marketing): `#14191E`
415
- - Marketing accents: `#FF5C00` / `#FF8EFF` / `#00ADFF` / `#8364FF` / `#F0F4F8`
416
-
417
- ### Example Component Prompts
418
- - "Create a JobCard: white bg, 12px radius, 4:3 thumbnail with top-corners-only radius (12 12 0 0), 50px-square company logo (9px radius) overlapping bottom-left of thumbnail. Below thumbnail: 12 16px padding, position title 16px weight 600 `#171719`, company name 13px weight 400 `#333333`, location + experience caption 12px `rgba(55,56,60,0.61)`, optional 합격보상금 badge as small pill at top-right of thumbnail. Bookmark icon button 40px circle, top-right of card."
419
- - "Build a sign-up CTA: `#0066FF` background, white text 14px weight 400, 8px radius, 32px height (header) or 48px (apply page), 7px 14px padding. No shadow."
420
- - "Design a filter chip row: horizontal scroll on mobile. Each chip 36px height, 10px radius, transparent bg with `#171719` text 14px weight 400, 7–11px asymmetric padding. Active chip uses `#F7F7F8` background. Country chip (`한국`) uses 10px radius with trailing chevron."
421
- - "Create a segmented control for sort (최신순/추천순/인기순): `#F7F7F8` container at 40px height, 10px radius, 0 4px padding. Active segment is white at 32px height with 8px radius. Inactive segments transparent. 14px Pretendard Variable text."
422
- - "Design a referral-reward badge (합격보상금 100만원): translucent overlay at top-left of JobCard thumbnail, white 12px weight 600 text, no background shape — just text on a subtle dark gradient overlay across the top 30% of the thumbnail for legibility."
423
-
424
- ### Iteration Guide
425
- 1. Always use Pretendard Variable for product UI, Wanted Sans for marketing
426
- 2. The interactive color is `#0066FF` — never a different blue, even if a Material/Tailwind blue looks close
427
- 3. JobCard 12px radius is non-negotiable — that radius is the brand
428
- 4. Borders should be `rgba(112, 115, 124, 0.16)` translucent — not a solid `#E5E8EB`
429
- 5. Use grid gutter (20–24px) for card separation, not shadow
430
- 6. Filter chips are pill-or-10px-radius — never square
431
- 7. Secondary text is translucent (`rgba(55,56,60,0.61)`), not a fixed grey hex
432
-
433
- ---
264
+ > Build a calm Korean career-discovery surface with a white canvas, `#171719` headings, `#333333` body text, `#0066ff` actions, Pretendard Variable, flat job cards, 12px media, and compact 8px filter controls. Include only observed search-dialog state; omit speculative status colors and native patterns.
434
265
 
435
266
  ## 10. Voice & Tone
436
267
 
437
- Wanted speaks like a career mentor who happens to run a marketplace: confident without being pushy, growth-oriented without inflating expectations, factual about salary and conditions without becoming a spreadsheet. Korean is the primary voice; English UI is a secondary translation that follows the Korean structure (not the other way around). The brandcenter explicitly codifies four communication values: **"부드럽지만 명확하게"** (gentle yet clear), confident messaging that supports career growth, respectful framing that considers the audience's perspective, and straightforward fact-based communication without embellishment.
438
-
439
- | Context | Tone |
440
- |---|---|
441
- | CTAs | Imperative, short Korean verb form (`지원하기`, `회원가입`, `로그인`, `이력서 만들기`) |
442
- | Job posting headers | Long-form descriptive, not pitch-y — `OO에서 함께 일할 백엔드 엔지니어를 찾습니다` |
443
- | Salary range | Exact range or "회사 내규에 따름" — never "competitive" / "negotiable" alone |
444
- | Referral reward (합격보상금) | Concrete amount in 만원 (`100만원`, `200만원`) — never approximate |
445
- | Empty states | One sentence stating the *why*, one action — `조건에 맞는 채용공고가 없어요` + reset button |
446
- | Error messages | Blameless, specific, actionable — `잠시 후 다시 시도해주세요` is acceptable; never `오류가 발생했습니다` alone |
447
- | Onboarding | Second-person, growth-framed — `당신의 다음 커리어를 찾아드릴게요`, not `회원가입을 진행해주세요` |
448
- | Marketing voice | Confident, possibility-oriented — "일하는 사람들의 모든 가능성" is the master tagline |
449
-
450
- **Forbidden phrases.** `대박 채용`, `핫한 회사`, `놓치지 마세요` (urgency-as-marketing — Wanted positions itself above shallow recruitment ads), `Oops`, generic `문제가 발생했습니다`, any sentence that hedges salary (`약 X만원`, `최대 X까지`). The brand promise is precision and respect for the candidate's time.
268
+ Wanted's official system language is practical, encouraging, and centered on helping working people become more themselves. Product copy should make the next career action legible without overpromising a match or outcome. Search, filter, and job-detail language should prioritize concrete role, company, location, and process information. Employer-facing or system documentation may be more technical, but should preserve the same directness and respect for the reader's decision. Use direct labels, specific role/company information, and respectful guidance rather than motivational clichés.
451
269
 
452
270
  ## 11. Brand Narrative
453
271
 
454
- Wanted is the consumer-facing product of **Wanted Lab** (원티드랩, 비상장 KOSDAQ-listed 2021), founded in **2015** in Seoul. The company's thesis was that Korean recruitment was broken by an asymmetry candidates couldn't see salary ranges until offer stage, companies paid head-hunters 25–30% commissions, and "good fit" was assessed through resume scanning rather than data. Wanted's answer was a **referral-bonus marketplace** (합격보상금): when a successful hire happens, the platform pays a cash bonus split between the candidate, the referrer, and Wanted itself flipping the traditional headhunting fee structure outward toward the labor side.
455
-
456
- The product launched as a job-posting platform but evolved into what Wanted Lab now calls an "AI-powered career platform" — **3.6M+ registered professionals**, **35K+ companies**, AI matching trained on 10M+ historical matches, and adjacent products (Wanted Plus for premium career coaching, Wanted Gigs for freelance, Wanted ATS for company recruitment ops). The platform's signature mechanic — surfacing salary ranges on every posting — became a cultural force in Korean tech: by the late 2010s "원티드에 올라온 연봉" was treated as a market-rate reference across the industry.
457
-
458
- The design system, **Montage** (몽타주), was first released as an open-source design library on **April 1, 2024** (initially as an April Fool's gesture that took on a life of its own) and expanded into a full multi-platform system (`montage-web`, `montage-ios`, `montage-android`) on April 3, 2025. The team built it because internal product complexity — with 70+ components and 20–30 variants each — was outpacing their ability to maintain consistency. The system's central principle, the **"Makers' Principle"** (메이커 원칙), codifies how components should be used: background colors intuitively indicate availability, customization scope is clearly bounded, and the system is "more communicative than restrictive."
459
-
460
- Wanted's visual rejection is of two opposing job-platform aesthetics: the grey-and-bureaucratic legacy boards (Saramin, JobKorea) with their dense list layouts and institutional typography, and the playful-but-shallow consumer apps (some startup-y competitors with cartoon mascots and gamification). Wanted occupies the middle: confident enough to feel professional, warm enough to feel like a career partner.
461
-
462
- What Wanted refuses: urgency marketing, salary obfuscation, recruiter spam tone. The brand promise is **respect for the working person's time** — and the design system enforces it by making every job posting structurally identical, every salary range visible, every CTA singular.
272
+ Wanted's service story connects career possibility with a concrete browsing and matching workflow. Montage extends that promise internally: separate foundations and components combine into one coherent product experience, emphasizing extensibility, consistency, and efficiency. The current product therefore feels systematic without looking like a component showcaseblue actions and job information carry the experience while decoration stays secondary. The relationship matters because career decisions require both emotional confidence and reliable comparison. Wanted's public product supplies the browsable opportunities, while Montage documents how repeatable interaction patterns keep that information coherent as teams add new features. Typography stays neutral and highly legible so role and company evidence can lead. Brand color marks actions and ownership without turning every listing into campaign content.
463
273
 
464
274
  ## 12. Principles
465
275
 
466
- 1. **One screen, one decision.** Job feed shows job cards. Job detail shows one job. Apply flow shows one form. No "promoted alongside organic" mixed-intent screens that blur user goals.
467
- 2. **Salary is sacred.** Every job posting surfaces a salary range or `회사 내규` disclosure — never hidden, never "ask in interview." The grid layout is built to make salary visible without clicking through.
468
- 3. **Brand blue is interaction, not decoration.** `#0066FF` appears on links, CTAs, focus rings, and selection states. Marketing illustrations may use the accent palette (orange/pink/sky/violet), but the product UI is monochromatic blue.
469
- 4. **The card is the brand.** JobCard's 12px radius, 4:3 thumbnail, bottom-left logo crop, and bookmark-top-right placement are the strongest visual signature. Other surfaces should reference its rhythm, not invent new ones.
470
- 5. **Korean-first, English-parity.** Wanted serves a Korean-primary audience with global ambitions. UI strings are written in Korean first; English translations preserve sentence structure, not literal word order.
471
- 6. **Density follows context.** Job feed is dense (4×N grid). Job detail is spacious (single column, large vertical rhythm). The deeper the user goes, the more breathing room they get.
472
- 7. **Gentle but clear.** From the brandcenter: never sacrifice clarity for friendliness, never sacrifice warmth for precision. Both/and, not either/or.
276
+ 1. **Help people work more like themselves.** Career choices should remain understandable and user-directed.
277
+ 2. **Compose consistency from reusable parts.** Follow Montage's published extensibility, consistency, and efficiency framing.
278
+ 3. **Information leads decoration.** Job role, company, and metadata establish hierarchy before campaign color.
279
+ 4. **Font truth follows visible use.** A declared asset is not automatically the current UI face.
473
280
 
474
281
  ## 13. Personas
475
282
 
476
- *Personas below are fictional archetypes informed by publicly described Korean career-platform user segments and Wanted Lab's published positioning (3.6M+ professionals, 35K+ companies). Not individual people.*
477
-
478
- **민준 (Minjun), 31, Seoul.** Backend engineer at a Series B startup, 7 years experience, mid-level. Opens Wanted 2–3 times a week to passive-browse — not actively job-hunting, but watching the market. Scans salary ranges to benchmark his current comp against peers. Bookmarks 5–10 listings a month "just in case." Sees the referral bonus as a small bonus rather than a deciding factor. Reads job descriptions end-to-end before applying; bounces immediately if salary is hidden.
283
+ Public surfaces establish task contexts, not verified biographical personas:
284
+ - A job seeker comparing role, company, location, and reward information.
285
+ - A working professional using search to narrow a new career direction.
286
+ - An employer or product maker consulting Wanted's company service or Montage guidance.
479
287
 
480
- **지영 (Jiyoung), 27, Pangyo.** UX designer transitioning from agency to in-house, 4 years experience. Uses Wanted intensively for 3–4 weeks at a time during active job searches, then dormant. Cares deeply about company culture descriptions and the long-form posting format values that Wanted presents jobs as company introductions, not classifieds. Filters heavily by company stage (Series A–C) and stack tags. Cross-references with company brunch.co.kr posts before applying.
481
-
482
- **박PM (Park, PM), 38, Gangnam.** Product manager at a mid-size SaaS company, hiring side. Uses Wanted ATS to post 2–3 roles per quarter. Pays the success fee (referral bonus) without negotiation because Wanted candidates tend to be pre-filtered for fit. Posts roles with explicit salary bands because he's seen what happens when companies hide them ("우리 회사도 그러면 안 보이게 돼요"). Values Wanted's company-introduction format over short job descriptions.
483
-
484
- **유진 (Yujin), 24, Busan.** Recent CS grad, first full-time search. Found Wanted through her university career center's blog post. Treats every salary range as ground truth and uses Wanted's 인기순 sort to learn which companies are popular at her experience level. Has applied to 30 roles, gotten 4 interviews. The referral-bonus mechanic confused her at first ("내가 받는 거예요?") but now uses it as a signal — `100만원` bonus = company is serious about filling the role.
288
+ Project-specific names, ages, goals, company sizes, and conversion assumptions are intentionally unspecified and must come from the product brief.
485
289
 
486
290
  ## 14. States
487
291
 
488
- | State | Treatment |
489
- |---|---|
490
- | **Empty (filter zero results)** | Single line of `#333333` body text (`조건에 맞는 채용공고가 없어요`) + secondary line of `rgba(55,56,60,0.61)` caption suggesting filter relaxation + `#0066FF` text button to reset filters. No illustration. |
491
- | **Empty (no bookmarks yet)** | Single paragraph explaining the *why* (`관심있는 채용공고를 북마크 해보세요`) + CTA to browse feed. Uses the `#F7F7F8` surface for the empty-state card to differentiate from the white feed. |
492
- | **Loading (first paint)** | Skeleton blocks at `#F7F7F8` matching final JobCard dimensions — 4:3 thumbnail rectangle + 3 horizontal line placeholders for title/company/salary. 12px radius preserved. |
493
- | **Loading (refresh / pagination)** | Inline spinner at bottom of feed in `#0066FF`. No overlay, no blocking. Existing cards stay rendered. |
494
- | **Error (form field)** | `#F0483C` 1px border on input + 13px `#F0483C` helper text below. One actionable sentence. |
495
- | **Error (network failure)** | Centered message with `#171719` heading + `#333333` body, retry button in `#0066FF`. No illustration on inline errors; only on full-page outages. |
496
- | **Error (full-page server outage)** | White screen, centered Wanted logo at top, single-line message in 16px `#171719` weight 600, retry button in `#0066FF` filled style. |
497
- | **Success (applied)** | Brief inline flash — bookmark turns `#0066FF`, "지원완료" badge appears in `#00B97C` for 2s, then settles to a persistent "지원함" status pill. No toast — application is a state change, not an event. |
498
- | **Success (saved / bookmarked)** | Bookmark icon fills `#0066FF`, brief 200ms scale animation (1.0 → 1.15 → 1.0) with `ease-spring` easing. No toast. |
499
- | **Skeleton** | `#F7F7F8` blocks at exact final dimensions. 1.5s shimmer with 6% white highlight gradient. JobCard skeletons preserve 12px radius and 4:3 thumbnail aspect. |
500
- | **Disabled** | Button opacity drops to 0.4. Disabled inputs keep their `rgba(112,115,124,0.16)` border (geometry stable). Disabled chips show `#A0A0A0` text on transparent background. |
501
- | **Hover (chip / button)** | Background transitions to `#F7F7F8` over 150ms with `ease-standard`. Text color unchanged. |
502
- | **Focus (keyboard)** | 2px outline ring in `#0066FF` with 2px offset. Replaces hover background — focused element doesn't double up bg-change + ring. |
292
+ The current full-screen search dialog and Montage menu open states were captured. Default product buttons and filters were captured without a safe hover/focus expansion. Error, success, loading, empty, disabled, and application-completion states remain absent.
503
293
 
504
294
  ## 15. Motion & Easing
505
295
 
506
- **Durations:**
507
-
508
- | Token | Value | Use |
509
- |---|---|---|
510
- | `motion-instant` | 0ms | Bookmark fill, chip selection state, checkbox flip |
511
- | `motion-fast` | 150ms | Hover transitions, chip background fade, button press |
512
- | `motion-standard` | 250ms | The default dropdown open, modal fade-in, card hover lift |
513
- | `motion-slow` | 400ms | Page transitions, success state celebrations, filter drawer slide |
514
- | `motion-page` | 350ms | Full-page route transitions |
515
-
516
- **Easings:**
517
-
518
- | Token | Curve | Use |
519
- |---|---|---|
520
- | `ease-enter` | `cubic-bezier(0.0, 0.0, 0.2, 1)` | Elements appearing — dropdowns, modals, toasts, sheets |
521
- | `ease-exit` | `cubic-bezier(0.4, 0.0, 1, 1)` | Elements leaving — dismissals, pops, modal close |
522
- | `ease-standard` | `cubic-bezier(0.4, 0.0, 0.2, 1)` | Two-way transitions — chips, accordions, tab switches |
523
- | `ease-spring` | `cubic-bezier(0.34, 1.56, 0.64, 1)` | Reserved for bookmark fill animation and apply-success badge. Overshoot only on celebration moments. |
524
-
525
- **Signature motions.**
526
-
527
- 1. **Bookmark fill.** When a user bookmarks a job, the icon scales 1.0 → 1.15 → 1.0 over `motion-standard` with `ease-spring` while the color transitions from `#333333` to `#0066FF`. This is the one place where overshoot is licensed — bookmarking is a small celebration.
528
- 2. **Filter chip selection.** Active state transitions: background `transparent` → `#F7F7F8` over `motion-fast` with `ease-standard`. Text color stays constant. The change feels deliberate but not flashy.
529
- 3. **JobCard hover (desktop).** Subtle lift — `translateY(0)` → `translateY(-2px)` over `motion-fast` with `ease-standard`. No shadow change, just position. This keeps the flat aesthetic while signaling interactivity.
530
- 4. **Apply success.** "지원완료" badge fades in (`motion-standard` / `ease-enter`) with a brief scale pulse (`motion-fast` overlap, `ease-spring`). Persists for 2s, then settles to a quieter "지원함" status. Never a toast — application is a permanent state change.
531
- 5. **Reduce motion.** `prefers-reduced-motion: reduce` collapses all durations to `motion-instant`. Transitions become state swaps. The product stays fully functional; just less kinetic.
532
-
533
- <!--
534
- OmD v0.1 Sources — Philosophy Layer (§10-15)
535
-
536
- Verified via WebFetch / WebSearch (2026-05-13):
537
- - https://www.wanted.co.kr/brandcenter/ — primary brand color #0066FF (PANTONE 2195 C),
538
- secondary palette (#14191E, #FF5C00, #FF8EFF, #00ADFF, #8364FF, #F0F4F8),
539
- four brand voice values: "부드럽지만 명확하게" / confident growth messaging /
540
- respectful framing / fact-based communication without embellishment.
541
- - https://www.wantedlab.com/en/ — Wanted Lab founded 2015, 3.6M+ professionals,
542
- 35K+ companies, AI-Powered HR Tech positioning, "AI Agents trained on 10M+
543
- matching data" claim, 70% time-to-hire reduction marketing claim.
544
- - https://blog.wantedlab.com/library/insight/wds — WDS design system launch
545
- April 1, 2024 (April Fool gesture that took off), expanded April 3, 2025,
546
- 70+ components, "Makers' Principle" referenced, principle of
547
- "더 나은 협업 방식과 사용자 경험".
548
- - https://montage.wanted.co.kr/ — Montage system name, "From Separate Core Blocks
549
- To a Seamless Flow" tagline, Wanted Sans + Pretendard JP typography stack.
550
- - https://github.com/wanteddev/wanted-sans — Wanted Sans: "A Sans-serif font;
551
- Geometric with a heart, Humanist with a soul", 7 weights + variable,
552
- SIL OFL 1.1, supports 97+ languages, Korean-first design.
553
- - https://github.com/wanteddev/montage-web — @wanteddev/wds package family
554
- (wds, wds-engine, wds-theme, wds-icon, wds-lottie, wds-nextjs, wds-codemod,
555
- wds-mcp, eslint-plugin-wds), MIT licensed, 295 releases.
556
-
557
- Live DOM token observations (playwright getComputedStyle on
558
- https://www.wanted.co.kr/wdlist/518):
559
- - Primary CTA color: rgb(0, 102, 255) = #0066FF (confirmed brand alignment)
560
- - Heading text: rgb(23, 23, 25) = #171719
561
- - Body text: rgb(51, 51, 51) = #333333
562
- - Secondary text: rgba(55, 56, 60, 0.61)
563
- - Border: rgba(112, 115, 124, 0.16)
564
- - Surface subtle: rgb(247, 247, 248) = #F7F7F8
565
- - Font stack: "Pretendard Variable", "Pretendard JP Variable", system-ui
566
- - JobCard radius: 12px; SortFilter container: 10px; segments: 8px
567
-
568
- Personas (§13) are fictional archetypes informed by Wanted Lab's published
569
- positioning data (user/company counts, AI matching claim, product surface
570
- list). Any resemblance to specific individuals is unintended.
571
-
572
- Interpretive claims (e.g., "the cooler blue positions as growth-blue rather
573
- than transaction-blue") are editorial readings of the design vs Toss's
574
- #3182f6, not documented Wanted statements.
575
- -->
296
+ No reusable duration or easing token was established. Dialog/menu expansion proves state change only; it does not authorize a universal motion curve.
297
+
298
+ ---
299
+
300
+ **Verified:** 2026-07-12 (omd:migrate)
301
+ **Tier 1 sources:** https://www.wanted.co.kr/ ; https://www.wanted.co.kr/wdlist/518 ; https://www.wanted.co.kr/company ; https://montage.wanted.co.kr/ ; https://montage.wanted.co.kr/docs/foundations ; https://montage.wanted.co.kr/docs/utilities/web-utilities/typography-style ; https://montage.wanted.co.kr/docs/components/actions/text-button/design
302
+ **Tier 2 attempts:** getdesign.md/wanted and styles.refero.design search; unavailable as positive evidence
303
+ **Conflicts unresolved:** none