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,446 +8,301 @@ primary_color: "#00c471"
8
8
  logo:
9
9
  type: favicon
10
10
  slug: "https://www.google.com/s2/favicons?domain=inflearn.com&sz=256"
11
- verified: "2026-05-15"
11
+ verified: "2026-07-13"
12
12
  omd: "0.1"
13
+ verification_v2:
14
+ schema: 2
15
+ checked: "2026-07-13"
16
+ surfaces:
17
+ - { id: product-home, kind: product-home, url: "https://www.inflearn.com/", inspected: "2026-07-13" }
18
+ - { id: product-courses, kind: product-catalog, url: "https://www.inflearn.com/courses", inspected: "2026-07-13" }
19
+ - { id: engineering-documentation, kind: documentation-chrome, url: "https://tech.inflab.com/20260305-new-header/", inspected: "2026-07-13" }
20
+ sources:
21
+ - { id: home-capture, kind: product-surface, url: "https://www.inflearn.com/", captured: "2026-07-13" }
22
+ - { id: courses-capture, kind: product-surface, url: "https://www.inflearn.com/courses", captured: "2026-07-13" }
23
+ - { id: engineering-context, kind: official-doc, url: "https://tech.inflab.com/20260305-new-header/", captured: "2026-07-13" }
24
+ - { id: design-system-context, kind: official-doc, url: "https://tech.inflab.com/20240224-design-system/", captured: "2026-07-13" }
25
+ - { id: company-context, kind: official-doc, url: "https://story.inflab.com/main/%ED%9A%8C%EC%82%AC%EC%86%8C%EA%B0%9C/", captured: "2026-07-13" }
26
+ - { id: font-design, kind: official-doc, url: "https://github.com/orioncactus/pretendard/blob/main/packages/pretendard/docs/en/README.md", captured: "2026-07-13" }
27
+ - { id: font-license, kind: license, url: "https://github.com/orioncactus/pretendard/blob/main/LICENSE", captured: "2026-07-13" }
28
+ conflicts: []
29
+ claims:
30
+ "tokens.colors.canvas": &product { surface_id: product-home, source_id: home-capture, method: computed-style, captured: "2026-07-13" }
31
+ "tokens.colors.ink": *product
32
+ "tokens.colors.text": *product
33
+ "tokens.colors.neutral": *product
34
+ "tokens.colors.subtle": *product
35
+ "tokens.colors.hairline": *product
36
+ "tokens.colors.primary": *product
37
+ "tokens.colors.primary-hover": *product
38
+ "tokens.colors.info-surface": *product
39
+ "tokens.colors.info": *product
40
+ "tokens.colors.cyan-tag-surface": *product
41
+ "tokens.colors.cyan-tag": *product
42
+ "tokens.typography.family.ui": *product
43
+ "tokens.typography.product-body.size": *product
44
+ "tokens.typography.product-body.weight": *product
45
+ "tokens.typography.product-body.lineHeight": *product
46
+ "tokens.typography.product-body.use": *product
47
+ "tokens.typography.product-control.size": *product
48
+ "tokens.typography.product-control.weight": *product
49
+ "tokens.typography.product-control.lineHeight": *product
50
+ "tokens.typography.product-control.use": *product
51
+ "tokens.typography.course-badge.size": *product
52
+ "tokens.typography.course-badge.weight": *product
53
+ "tokens.typography.course-badge.lineHeight": *product
54
+ "tokens.typography.course-badge.use": *product
55
+ "tokens.spacing.xs": *product
56
+ "tokens.spacing.sm": *product
57
+ "tokens.spacing.md": *product
58
+ "tokens.spacing.lg": *product
59
+ "tokens.rounded.badge": *product
60
+ "tokens.rounded.input": *product
61
+ "tokens.rounded.pill": *product
62
+ "tokens.rounded.full": *product
63
+ "tokens.shadow.flat": *product
64
+ "tokens.components.product-search-submit.type": *product
65
+ "tokens.components.product-search-submit.bg": *product
66
+ "tokens.components.product-search-submit.fg": *product
67
+ "tokens.components.product-search-submit.radius": *product
68
+ "tokens.components.product-search-submit.font": *product
69
+ "tokens.components.product-search-submit.states": *product
70
+ "tokens.components.product-search-submit.use": *product
71
+ "tokens.components.product-nav-action.type": *product
72
+ "tokens.components.product-nav-action.bg": *product
73
+ "tokens.components.product-nav-action.fg": *product
74
+ "tokens.components.product-nav-action.radius": *product
75
+ "tokens.components.product-nav-action.padding": *product
76
+ "tokens.components.product-nav-action.font": *product
77
+ "tokens.components.product-nav-action.states": *product
78
+ "tokens.components.product-nav-action.use": *product
79
+ "tokens.components.product-course-card.type": *product
80
+ "tokens.components.product-course-card.radius": *product
81
+ "tokens.components.product-course-card.font": *product
82
+ "tokens.components.product-course-card.states": *product
83
+ "tokens.components.product-course-card.use": *product
84
+ "tokens.components.product-content-tab.type": *product
85
+ "tokens.components.product-content-tab.bg": *product
86
+ "tokens.components.product-content-tab.fg": *product
87
+ "tokens.components.product-content-tab.radius": *product
88
+ "tokens.components.product-content-tab.padding": *product
89
+ "tokens.components.product-content-tab.font": *product
90
+ "tokens.components.product-content-tab.states": *product
91
+ "tokens.components.product-content-tab.use": *product
92
+ "tokens.components.product-dialog-overlay.type": *product
93
+ "tokens.components.product-dialog-overlay.bg": *product
94
+ "tokens.components.product-dialog-overlay.font": *product
95
+ "tokens.components.product-dialog-overlay.states": *product
96
+ "tokens.components.product-dialog-overlay.use": *product
13
97
  tokens:
14
- source: prose-derived
15
- extracted: "2026-06-09"
98
+ source: reconciled
99
+ extracted: "2026-07-13"
100
+ note: "Selector-backed tokens are limited to the supplied Inflearn product-home and course-catalog capture. The Inflab engineering article is documentation chrome and official context, not a product-token source."
16
101
  colors:
17
- primary: "#00c471"
18
- primary-pressed: "#00a760"
19
- heading: "#212529"
20
- body: "#495057"
21
- muted: "#868e96"
22
102
  canvas: "#ffffff"
23
- surface-neutral: "#f8f9fa"
24
- border: "#dee2e6"
25
- disabled-bg: "#f1f3f5"
26
- disabled-fg: "#adb5bd"
27
- error: "#fa5252"
103
+ ink: "#212529"
104
+ text: "#495057"
105
+ neutral: "#f8f9fa"
106
+ subtle: "#f1f3f5"
107
+ hairline: "#dee2e6"
108
+ primary: "#00c471"
109
+ primary-hover: "#00a760"
110
+ info-surface: "#e7f5ff"
28
111
  info: "#228be6"
29
- warning: "#fcc419"
30
- teal-tag: "#1098ad"
112
+ cyan-tag-surface: "#e3fafc"
113
+ cyan-tag: "#1098ad"
31
114
  typography:
32
- family: { sans: "Pretendard", mono: "ui-monospace, SFMono-Regular, monospace" }
33
- h1: { size: 34, weight: 700, lineHeight: 1.3, use: "Page hero phrase" }
34
- h2: { size: 20, weight: 700, lineHeight: 1.35, use: "Section title" }
35
- body: { size: 16, weight: 400, lineHeight: 1.5, use: "Default running text" }
36
- nav: { size: 16, weight: 600, lineHeight: 1.5, use: "Nav label, button label" }
37
- caption: { size: 14, weight: 400, lineHeight: 1.4, use: "Instructor name, view count, price subtext" }
38
- spacing: { xs: 4, sm: 8, md: 12, base: 16, lg: 24, xl: 32, xxl: 48, section: 64 }
39
- rounded: { sm: 4, md: 8, lg: 32, full: 9999 }
115
+ family: { ui: "Pretendard" }
116
+ product-body: { size: 16, weight: 400, lineHeight: 1.50, use: "Repeated product-home and course-catalog text/card sample" }
117
+ product-control: { size: 16, weight: 400, lineHeight: 1.00, use: "Product GNB and control sample" }
118
+ course-badge: { size: 11, weight: 700, lineHeight: 1.64, use: "Course badge wrapper on product home and catalog" }
119
+ spacing: { xs: 4, sm: 8, md: 10, lg: 16 }
120
+ rounded: { badge: 4, input: 8, pill: 32, full: 999 }
40
121
  shadow:
41
122
  flat: "none"
42
123
  components:
43
- button-search: { type: button, bg: "#00c471", fg: "#ffffff", radius: 9999, font: "16px weight 400", use: "Signature green circle search-submit, 42px" }
44
- button-primary: { type: button, bg: "#00c471", fg: "#ffffff", radius: 8, padding: "0 24px", font: "16px weight 600", use: "Filled label CTA, hover #00a760" }
45
- nav-pill: { type: tab, bg: "#f8f9fa", fg: "#495057", radius: 32, font: "16px weight 600", use: "GNB nav pill, resting", active: "green tint bg, #00c471 text" }
46
- button-ghost: { type: button, bg: "#ffffff", fg: "#495057", radius: 32, font: "16px weight 600", use: "Inline secondary GNB item, hover #f8f9fa" }
47
- pagination-default: { type: button, bg: "#ffffff", fg: "#212529", radius: 8, font: "14px weight 400", use: "Page number button, gray border" }
48
- pagination-active: { type: button, bg: "#00c471", fg: "#ffffff", radius: 8, font: "14px weight 400", use: "Selected page" }
49
- button-disabled: { type: button, bg: "#f1f3f5", fg: "#adb5bd", radius: 8, use: "Form-incomplete state" }
124
+ product-search-submit: { type: button, bg: "#00c471", fg: "#ffffff", radius: "999px", font: "16px / 400 Pretendard", states: "hover observed: #00a760", use: "Product GNB search submit; home::[data-omd-capture=8]" }
125
+ product-nav-action: { type: button, bg: "#f8f9fa", fg: "#495057", radius: "32px", padding: "0px 22px", font: "16px / 600 Pretendard", states: "hover observed: rgba(241,243,245,0.65)", use: "Product GNB navigation action; home::[data-omd-capture=12]" }
126
+ product-course-card: { type: card, radius: "8px", font: "16px / 400 Pretendard", states: "default only; no card interaction state captured", use: "Product course article shell; home::article" }
127
+ product-content-tab: { type: tab, bg: "#25262b", fg: "#ffffff", radius: "9999px", padding: "10px 16px", font: "14px / 700 system sans-serif", states: "selected observed", use: "Product-home selected content tab; home::[data-omd-capture=19]" }
128
+ product-dialog-overlay: { type: dialog, bg: "rgba(0,0,0,0.6)", font: "16px / 400 Pretendard", states: "dialog-open observed", use: "Product dialog backdrop; home::[data-omd-interaction-capture=dialog-2-8]" }
50
129
  components_harvested: true
51
130
  ---
52
131
 
53
- # Design System Inspiration of Inflearn
132
+ # Design System Inspiration of Inflearn (인프런)
54
133
 
55
134
  ## 1. Visual Theme & Atmosphere
56
135
 
57
- Inflearn (인프런) is the design language of a **Korean lifelong-learning marketplace that wants to feel like a friendly bookshop, not a corporate LMS**. Where Coursera leans on muted academic blues and Udemy crowds the screen with discount stickers, Inflearn opens onto a **clean white canvas** with a single saturated **mint-green** (`#00C471`) doing all the interactive work — search submit, primary CTAs, active pagination, "free starter" tags. The green is specifically *Korean fintech-adjacent mint* (kin to Toss/Banksalad/Naver Pay families, but pulled brighter and more yellow-leaning than any of them), signalling "trustworthy, modern Korean web" without inheriting either Naver's dated green-tab idiom or KakaoTalk's yellow warmth.
58
-
59
- The page furniture is unmistakably **Mantine-built**: 162 `--mantine-color-*` CSS variables are exposed at runtime, plus the full `--mantine-radius-{xs,sm,md,lg,xl}` and `--mantine-spacing-*` scale. Inflearn has effectively adopted Mantine's theme primitives wholesale and overridden them with a brand green. This means the **radius vocabulary is mostly 8px (`md`)** for cards, inputs, and pagination — neither aggressive flat-2px (Banksalad's data-tool register) nor consumer-app plump-16px (Toss). Two exceptions tell the story: navigation pills round to **32px** (extra-soft, "browse-don't-task" feel) and the **search-submit and tag chips go full-pill at `999px`** — the green circle search button is the one decisive, on-brand moment in a deliberately calm GNB.
136
+ Inflearn is Inflab’s career-learning platform: its official company introduction describes a space where people can learn and share knowledge without economic or time constraints, while its public product routes organize that promise as a dense course catalogue. The supplied home and course-list captures use a white field, dark neutral text, a precise green action color, compact rounded navigation controls, and image-led course articles. The expression is practical rather than decorative: the emphasis is on finding, comparing, and entering learning content.
60
137
 
61
- Typography is **Pretendard-first** with no custom display face. Headings (H1 34px / 700, H2 20px / 700) sit in Mantine-dark `#212529`, body text in `#495057`, muted metadata in `#868E96` Inflearn does not use pure `#000` anywhere on type. The visual silhouette is intentionally close to "modern Korean SaaS landing" (Pretendard + clean white + one branded green) recognizable to anyone who has used Toss, Wanted, or Banksalad — because Inflearn's audience overlaps heavily with those products and the brand wants instant credibility, not novelty.
62
-
63
- **Key Characteristics:**
64
- - Pretendard-first system font stack (no bundled web-font; OS fallback handles Korean coverage)
65
- - Signature mint-green `#00C471` for all primary action; brighter and more yellow than Toss/Banksalad mints
66
- - Mantine theme primitives exposed live (`--mantine-radius-md = 0.5rem`, `--mantine-color-*`)
67
- - Two radius families: cards/inputs at `8px`, nav pills at `32px`, decisive CTAs full-pill `999px`
68
- - Sticky white GNB at 65px — no shadow, no border — the green search button is the only visual accent
69
- - Course tiles are borderless transparent cards (`article.mantine-Card-root`, radius 8px, ~230×310px) — thumbnail does the visual work
70
- - Pagination uses solid-green active page on white surroundings — the same green as the CTA, no second accent hue
71
- - No theatrical shadow / no gradient — Inflearn is "calm catalog, friendly green"
138
+ The current product shell should not be confused with every Inflearn-owned page. The supplied third route is an Inflab engineering article with separate documentation chrome; it is recorded as first-party context only. Inflab’s own engineering writing says the service has accumulated multiple systems and that its newer shared GNB serves courses, challenges, mentoring, clips, and community across multiple front-end environments. That is useful evidence for the header’s product importance, not authorization to turn documentation styles into product tokens.
72
139
 
73
140
  ## 2. Color Palette & Roles
74
141
 
75
- ### Primary
76
- - **Inflearn Green** (`#00C471`): Primary brand color. Search submit, primary CTA, active pagination page, "starter / free" course tag fills, link accents.
77
- - **Inflearn Green Pressed** (`#00A760`): Pressed / focused / visited state. Observed as the high-frequency near-shade on the home palette histogram (450 instances) — likely the `:hover` / `:active` token paired with the primary.
78
-
79
- ### Text
80
- - **Heading** (`#212529`): Mantine dark-9 equivalent. H1/H2/H3, course tile titles.
81
- - **Body** (`#495057`): Default reading text and nav link colour.
82
- - **Muted / Caption** (`#868E96`): Metadata, instructor sublabels, view counts.
83
- - **On-Green** (`#FFFFFF`): Text colour on every green surface (search submit, primary CTA, active pagination).
84
-
85
- ### Surface
86
- - **Page** (`#FFFFFF`): Default canvas.
87
- - **Surface Neutral** (`#F8F9FA`): GNB pill button rest state, soft section dividers, secondary chip fills.
88
- - **Border / Divider Inferred** (`#DEE2E6`): Mantine gray-3 — implied separator hue (not directly captured but consistent with the Mantine system that Inflearn theme-extends).
142
+ ### Color tokens
89
143
 
90
- ### Semantic (Mantine-inherited)
91
- - **Error Red** (`#FA5252`): Form validation errors, destructive confirmation. (Mantine red-6.)
92
- - **Info Blue** (`#228BE6`): Inline informational accent, link-type chips. (Mantine blue-6.)
93
- - **Warning Yellow** (`#FCC419`): Caution / pending states. (Mantine yellow-5.)
94
- - **Teal Tag** (`#1098AD`): Category / lecture-type tag accent (mantine cyan-7). Appears with notable frequency on course cards.
144
+ - `#FFFFFF` — observed product canvas and control background.
145
+ - `#212529` repeatedly observed product ink.
146
+ - `#495057` repeatedly observed product control and secondary text.
147
+ - `#F8F9FA` observed GNB action background and product tab hover background.
148
+ - `#F1F3F5` observed hover/disabled neutral treatment; the source-specific alpha is retained in the component record below.
149
+ - `#DEE2E6` — observed product control border.
150
+ - `#00C471` — observed product GNB search-submit and selected control background.
151
+ - `#00A760` — observed hover treatment for the GNB search-submit and an observed course-badge background.
152
+ - `#E7F5FF` / `#228BE6` — observed blue course-badge wrapper/text pair.
153
+ - `#E3FAFC` / `#1098AD` — observed cyan course-badge wrapper/text pair.
95
154
 
96
- Inflearn does not maintain a separate brand semantic palette it inherits Mantine's `red / blue / yellow / cyan` scales and overrides only the `green` scale with the Inflearn primary. Designers picking from Inflearn should treat the Mantine palette as the de-facto extended system.
155
+ These values are product-route observations, not a claim that every public Inflab site has the same palette.
97
156
 
98
- ## 3. Typography Rules
157
+ ## 3. Typography & Layout Evidence
99
158
 
100
- ### Font Family
101
- - **Primary**: `Pretendard, -apple-system, BlinkMacSystemFont, system-ui, Roboto, "Helvetica Neue", "Segoe UI", "Apple SD Gothic Neo", "Noto Sans KR", "Malgun Gothic", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", sans-serif`
102
- - **Mono**: `ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace` (carried from Mantine default — surfaces inside code-snippet course previews and dev-tools-style screenshots)
103
- - No custom display face. Headings use the same Pretendard stack; differentiation comes from weight and size only.
104
- - No bundled web-font on `/`. Korean glyphs render through the OS fallback chain.
159
+ ### Typography evidence classes
105
160
 
106
- ### Hierarchy
161
+ - **Live product computed use:** `Pretendard` is the sole promoted UI family. It has 1,278 visible computed uses across the home and course catalog, and the supplied collector reports a loaded FontFaceSet match with high confidence. The artifact supplies no font-file URL for that loaded face, so the web-source location remains unresolved rather than invented.
162
+ - **System fallbacks:** `sans-serif` is a high-confidence system resolution in 153 observed product elements; `Arial` and `Roboto` each occur once in the full bundle. They remain system evidence, not Inflearn brand families.
163
+ - **Declared-only assets:** Fira Code, Font Awesome 6 Pro, KaTeX faces, and Source Serif 4 have zero visible use in this capture. Fira Code, Font Awesome, and Source Serif 4 include declared source URLs; the KaTeX declarations do not. None are promoted to UI tokens or rendered as substitutes.
164
+ - **Official distribution and licence boundary:** Pretendard’s upstream README documents static and variable webfont distribution, while its upstream project publishes the font software under SIL Open Font License 1.1. These identify the asset and licence only; the product-use claim comes from computed use plus the loaded FontFaceSet observation.
107
165
 
108
- | Role | Size | Weight | Line Height | Notes |
109
- |---|---|---|---|---|
110
- | H1 (page hero) | 34px | 700 | 44.2px (1.3) | Hero phrase: "인프런 - 라이프타임 커리어 플랫폼" |
111
- | H2 (section title) | 20px | 700 | 27px (1.35) | "0원으로 부담없이 시작하기" — section openers |
112
- | H3 (sub-section / card cluster head) | 18px (inferred) | 700 | 1.4 | Course-tile section labels |
113
- | Body | 16px | 400 | 1.5 | Default running text, nav default |
114
- | Nav label | 16px | 600 | 1.5 | "지식공유" / "로그인" / "카테고리" pills |
115
- | Button label (filled) | 16px | 600 | 1.0 | Primary CTA text |
116
- | Caption / Metadata | 13–14px (inferred) | 400 | 1.4 | Instructor name, view count, price subtext |
166
+ - The captured product surfaces expose repeated 4px, 8px, 10px, and 16px spacing values. They form the conservative observed spacing set in frontmatter.
167
+ - The product home and catalog both include course `article` shells at 8px radius with zero padding and no shadow. The capture does not establish a universal course-grid column count, image ratio, responsive breakpoint, course-detail layout, or checkout layout.
168
+ - Product navigation actions are route-level controls, not evidence for a universal page container or an application-wide 65px header rule.
117
169
 
118
- ### Rules
119
- - **Pretendard everywhere.** No serif, no rounded display face. Discipline is part of the calm-catalog feel.
120
- - **700 = heading. 600 = nav and labelled button. 400 = body, icon-only button, input.** There is no 500 — the weight scale is intentionally binary-ish.
121
- - Numerals (course price, ratings) inherit body weight 400 — Inflearn does not embolden prices the way fintech does. The decision to enrol should feel low-pressure.
122
- - Korean punctuation: full-width quotes `「」` / `『』` are avoided in UI; straight quotes only.
170
+ ## 4. Components
123
171
 
124
- ## 4. Component Stylings
172
+ ### Product GNB search submit
125
173
 
126
- ### Buttons
127
-
128
- **Primary CTA — Pill Search Submit**
129
- - Background: `#00C471`
130
- - Text: `#FFFFFF`
131
- - Border: 1px solid transparent
132
- - Radius: 999px
133
- - Padding: 0 (icon-only)
134
- - Height: 42px
135
- - Width: 42px
136
- - Font: 16px / 400 / Pretendard
137
- - Shadow: none
138
- - Use: The signature green circle search-submit button in the GNB — the single most-recognisable component on the site.
139
-
140
- **Primary CTA — Filled Label (Inferred)**
174
+ **Default**
141
175
  - Background: `#00C471`
142
176
  - Text: `#FFFFFF`
143
- - Border: none
144
- - Radius: 8px
145
- - Padding: 0 16px (icon-button observed); 0 24px for labelled
146
- - Height: 42px
147
- - Font: 16px / 600 / Pretendard
177
+ - Radius: `999px`
178
+ - Font: `16px / 400 Pretendard`
148
179
  - Hover: background `#00A760`
149
- - Use: "수강신청", "결제하기", primary actions inside course detail / cart.
180
+ - Use: Product GNB search-submit; `home::[data-omd-capture="8"]`. Hover provenance is `home::[data-omd-capture="8"]::state-hover` and is also present on the catalog surface.
181
+
182
+ ### Product GNB navigation action
150
183
 
151
- **Nav Pill — Resting (Neutral)**
184
+ **Default**
152
185
  - Background: `#F8F9FA`
153
186
  - Text: `#495057`
154
- - Border: 1px solid transparent
155
- - Radius: 32px
156
- - Padding: 0 22px (labelled) / 0 (icon-only 42×42)
157
- - Height: 42px
158
- - Font: 16px / 600 / Pretendard
159
- - Use: "로그인", "service-menu" icon, "카테고리" pill — every GNB action that is not the green search submit.
160
-
161
- **Nav Pill — Active (Selected)**
162
- - Background: `rgba(0, 196, 113, 0.1)` (inferred Mantine green tint)
163
- - Text: `#00C471`
164
- - Border: 1px solid transparent
165
- - Radius: 32px
166
- - Padding: 0 12px
167
- - Height: 42px
168
- - Font: 16px / 600 / Pretendard
169
- - Use: Active top-level nav section ("지식공유" when on /knowledge etc.).
170
-
171
- **Ghost / Text Link Button**
172
- - Background: transparent
173
- - Text: `#495057`
174
- - Border: 1px solid transparent
175
- - Radius: 32px
176
- - Padding: 0 12px
177
- - Font: 16px / 600 / Pretendard
178
- - Hover: background `#F8F9FA`
179
- - Use: Inline secondary GNB items ("지식공유"), category-row navigation.
180
-
181
- **Pagination — Default**
182
- - Background: `#FFFFFF`
183
- - Text: `#212529`
184
- - Border: 1px solid `#DEE2E6` (Mantine gray-3, inferred)
185
- - Radius: 8px
186
- - Padding: 0 12px
187
- - Height: 38px
188
- - Font: 14px / 400 / Pretendard
189
- - Use: Page number buttons on /courses listing.
190
-
191
- **Pagination — Active**
192
- - Background: `#00C471`
193
- - Text: `#FFFFFF`
194
- - Border: none
195
- - Radius: 8px
196
- - Padding: 0 12px
197
- - Height: 38px
198
- - Font: 14px / 400 / Pretendard
199
- - Use: Currently selected page in the /courses pagination cluster.
200
-
201
- **Disabled (Inferred from Mantine default)**
202
- - Background: `#F1F3F5`
203
- - Text: `#ADB5BD`
204
- - Border: none
205
- - Radius: 8px
206
- - Padding: 12px 24px
207
- - Font: 16px / 600 / Pretendard
208
- - Use: Form-incomplete state on enrol / payment flows.
209
-
210
- ### Inputs & Forms
211
-
212
- **Text Input — Default (Search)**
213
- - Background: `#FFFFFF`
214
- - Text: `#212529`
215
- - Placeholder: `#868E96` (inferred)
216
- - Border: 1px solid `#DEE2E6` (inferred — captured border was `0px none` on the inner input element; outer wrapper carries the border per Mantine pattern)
217
- - Radius: 8px
218
- - Padding: 0 12px
219
- - Height: 36px
220
- - Font: 16px / 400 / Pretendard
221
- - Use: GNB search field — paired with the green pill submit on its right.
222
-
223
- **Text Input — Focus (Inferred)**
224
- - Background: `#FFFFFF`
225
- - Border: 1px solid `#00C471`
226
- - Use: All form fields on focus.
227
-
228
- ### Cards & Containers
229
-
230
- **Course Tile (Default)**
231
- - Background: transparent
232
- - Border: none
233
- - Radius: 8px
234
- - Padding: 0 (thumbnail is the visual container; metadata sits below in flow)
235
- - Width × Height: ~230 × 310px (home) / ~230 × 325px (/courses)
236
- - Shadow: none
237
- - Use: The dominant content unit. A `article.mantine-Card-root` wrapper with a thumbnail image (radius 8px), title in `#212529` 700, instructor in `#868E96`, price in `#212529` 400, optional green starter / red discount tags.
238
-
239
- **Course Tile — Featured / Highlighted (Inferred)**
240
- - Background: `#FFFFFF`
241
- - Border: 1px solid `#DEE2E6` (Mantine gray-3)
242
- - Radius: 8px
243
- - Padding: 16px
244
- - Shadow: `0 1px 3px rgba(0, 0, 0, 0.05)` (Mantine `--mantine-shadow-xs` equivalent)
245
- - Use: "추천" / promoted course slot on home rails.
246
-
247
- **Tag — Free / Starter**
248
- - Background: `rgba(0, 196, 113, 0.12)`
249
- - Text: `#00C471`
250
- - Radius: 999px
251
- - Padding: 2px 10px
252
- - Font: 12px / 600 / Pretendard
253
- - Use: "무료" / starter-course indicator on course tiles.
254
-
255
- **Tag — Category (Cyan-Teal)**
256
- - Background: `rgba(16, 152, 173, 0.1)`
257
- - Text: `#1098AD`
258
- - Radius: 999px
259
- - Padding: 2px 10px
260
- - Font: 12px / 600 / Pretendard
261
- - Use: Category / lecture-type tags on tiles.
262
-
263
- ### Navigation
264
-
265
- **Global Nav (GNB)**
266
- - Background: `#FFFFFF`
267
- - Text: `#495057` (default) / `#212529` (heading & emphasized)
268
- - Border-bottom: none
187
+ - Radius: `32px`
188
+ - Padding: `0px 22px`
189
+ - Font: `16px / 600 Pretendard`
190
+ - Hover: background `rgba(241, 243, 245, 0.65)`
191
+ - Use: Product GNB navigation action; `home::[data-omd-capture="12"]`. The observed hover selector is `home::[data-omd-capture="12"]::state-hover`.
192
+
193
+ ### Product course card
194
+
195
+ **Default**
196
+ - Radius: `8px`
197
+ - Padding: `0px`
198
+ - Font: `16px / 400 Pretendard`
269
199
  - Shadow: none
270
- - Position: sticky
271
- - Height: 65px
272
- - Layout: [logo] · [primary nav pills] · [search input + green pill submit] · [right-side icon pills + 로그인]
273
- - Use: The single GNB pattern; persists across home, courses, detail.
200
+ - Use: Product course article shell on home and course catalog; `home::article` and `surface-2::article`.
274
201
 
275
- **Footer (Inferred)**
276
- - Background: `#F8F9FA` (Mantine gray-0)
277
- - Text: `#495057` / `#868E96` for secondary lines
278
- - Padding: 48px 0 (block) — Mantine spacing-xl × 2
279
- - Use: Standard 4-column link list + company-info row.
202
+ ### Product content tab
280
203
 
281
- ---
282
-
283
- **Verified:** 2026-05-14
284
- **Tier 1 sources:**
285
- - `https://www.inflearn.com/` — live CDP inspect (browser-harness :9222) `assets/_reference/.live-inspect-proof.json` (12 raw_samples + 162 `--mantine-*` CSS vars + h1/h2 typography sample)
286
- - `https://www.inflearn.com/courses` — second-surface live CDP inspect → `assets/_reference/.live-inspect-proof-courses.json` (8 raw_samples + pagination active-state observed `#00C471`)
287
- - `https://tech.inflab.com/20260305-new-header/` Inflearn engineering blog post "MFE 환경에서 공통 헤더(GNB) 개편하기" confirming GNB rebuild as shared MFE component
288
-
289
- **Tier 2 sources:**
290
- - `https://getdesign.md/inflearn` — empty (verified 2026-05-14: "No designs found for 'inflearn'")
291
- - `https://styles.refero.design/?q=inflearn` — empty (verified 2026-05-14: no result cards returned)
204
+ **Selected**
205
+ - Background: `#25262B`
206
+ - Text: `#FFFFFF`
207
+ - Radius: `9999px`
208
+ - Padding: `10px 16px`
209
+ - Font: `14px / 700 system sans-serif`
210
+ - Use: Selected product-home content tab; `home::[data-omd-capture="19"]` and interaction capture `home::[data-omd-interaction-capture="tab-3-3"]`.
292
211
 
293
- **Conflicts unresolved:** none
212
+ **Hover**
213
+ - Background: `#F8F9FA`
214
+ - Text: `#212529`
215
+ - Radius: `9999px`
216
+ - Padding: `10px 16px`
217
+ - Font: `14px / 400 system sans-serif`
218
+ - Use: Product-home content-tab hover sample; `home::[data-omd-capture="20"]::state-hover`.
294
219
 
295
- **Inferred-but-not-live-captured tokens** (flagged for follow-up UPDATE on a course-detail / cart / payment surface): Primary CTA labelled fill (only icon-pill captured), focus state on inputs, disabled state, tag chip exact alpha values, footer exact spacing.
220
+ ### Product dialog overlay
296
221
 
297
- ## 5. Layout & Spacing
222
+ **Open**
223
+ - Background: `rgba(0, 0, 0, 0.6)`
224
+ - Font: `16px / 400 Pretendard`
225
+ - Use: Dialog backdrop expanded by the collector on home and catalog; `home::[data-omd-interaction-capture="dialog-2-8"]`.
298
226
 
299
- Inflearn inherits Mantine's spacing scale verbatim:
227
+ The supplied bundle records menu, dialog, and tab interactions (nine interaction expansions in total). Only the selectors and states listed above are reusable claims. No checkout, payment, error, toast, skeleton, course-card-hover, or responsive variant is inferred.
300
228
 
301
- | Token | Value | Typical use |
302
- |---|---|---|
303
- | `--mantine-spacing-xs` | `0.625rem` (10px) | Tight chip/tag padding, inline icon gaps |
304
- | `--mantine-spacing-sm` | `0.75rem` (12px) | Button horizontal padding, list-item gutters |
305
- | `--mantine-spacing-md` | `1rem` (16px) | Default card padding, form field gap |
306
- | `--mantine-spacing-lg` | `1.25rem` (20px) | Section content gutter |
307
- | `--mantine-spacing-xl` | `1.5rem` (24px) | Section block separator, footer column gap |
229
+ ---
308
230
 
309
- Course rails on the home page use a **6-column horizontal grid** (`~230px` tile × 6 = 1380px content width) with `24px` gap between tiles. The GNB content sits inside a `max-w-1200` container with `16px` left/right padding on viewport widths < 1280px. Vertical rhythm between content blocks is `48px–64px` — Mantine `xl × 2` to `xl × 2.5`.
231
+ **Verified:** 2026-07-13
232
+ **Tier 1 sources:** `https://www.inflearn.com/` (product home), `https://www.inflearn.com/courses` (product catalog), `https://tech.inflab.com/20260305-new-header/` (first-party engineering documentation/context), `https://tech.inflab.com/20240224-design-system/` (first-party design-system context), `https://story.inflab.com/main/%ED%9A%8C%EC%82%AC%EC%86%8C%EA%B0%9C/` (first-party company context), `https://github.com/orioncactus/pretendard/blob/main/packages/pretendard/docs/en/README.md` (upstream font distribution), and `https://github.com/orioncactus/pretendard/blob/main/LICENSE` (upstream font licence boundary)
233
+ **Tier 2 sources:** `https://getdesign.md/inflearn` (attempted; built-in web open returned an internal safe-open failure), `https://styles.refero.design/?q=inflearn` (attempted; built-in web open returned an internal safe-open failure); no usable Inflearn record was returned by the required cross-check attempts.
234
+ **Conflicts unresolved:** none
310
235
 
311
- Density is **catalog-tight, not Toss-airy** Inflearn assumes a returning user scanning for the next course, so it packs more tiles per fold than a marketing-first SaaS landing would. This is the major visual difference between Inflearn and (for example) Wanted: same Pretendard font, same Mantine-like radius vocabulary, but Inflearn shows you ~24 tiles above the fold; Wanted shows ~6.
236
+ Legacy claims about a universal Mantine token sheet, a named 65px sticky GNB contract, course-detail/cart/payment CTAs, input outlines, footer geometry, card motion, empty/error/success states, and unmeasured course-grid rules were removed because the supplied 2026 evidence does not establish them.
312
237
 
313
- ## 6. Iconography & Imagery
238
+ ## 5. Iconography & Imagery
314
239
 
315
- - **Icon set**: Custom SVG line icons (24×24 viewbox, 1.5px stroke) for the GNB and inline actions. Stroke colour follows text-context (`#495057` default, `#00C471` when paired with active green surface).
316
- - **Course thumbnail style**: 16:9 photographic or illustrative — wide stylistic range because covers are author-submitted. Inflearn standardizes the radius (8px) and aspect ratio, not the art direction.
317
- - **Hero illustrations**: When used, soft flat-vector with a single mint-green accent so they read as "Inflearn-coloured" without dominating.
318
- - **Photography**: Sparse on product surfaces; reserved for instructor profile portraits in course detail.
240
+ The product surfaces include course articles and standard controls, but the supplied evidence does not identify a named icon library, SVG stroke rule, image aspect-ratio contract, or universal thumbnail treatment. Course imagery and any inline icon implementation remain route content rather than promoted system tokens.
319
241
 
320
- ## 7. Motion
242
+ ## 6. Shape & Elevation
321
243
 
322
- Inflearn motion is **minimal-functional**:
323
- - Nav pill hover: background fade `200ms ease`.
324
- - Card hover: thumbnail scale `1.0 → 1.02`, `200ms ease-out`, paired with a subtle elevation increase (shadow `xs` → `sm`).
325
- - Page transitions: no client-side animated transitions — full SSR navigation on link click; the perceived motion budget is spent on the in-place hover affordances.
326
- - Loading: Mantine `Loader` (rotating dot ring) in `#00C471`.
244
+ - Product evidence includes 4px badge wrappers, 8px course-card/input shells, 32px GNB actions, and `999px`/`9999px` pill controls. These are distinct observed shapes, not a mandate to round unrelated interfaces.
245
+ - The selector-backed GNB controls, search submit, course article, and dialog backdrop have `box-shadow: none`. A separate course-catalog control has a local shadow observation, but the bundle does not establish a reusable elevation scale.
327
246
 
328
- Mantine's default transition timing function is `--mantine-transition-timing-function: ease` — Inflearn does not override it.
247
+ ## 7. Content & Voice
329
248
 
330
- ## 8. States
249
+ Inflab’s official company page frames the service around career learning, knowledge sharing, fair access to growth opportunities, transparent course/review information, and content rather than inflated marketing. Treat this as brand context: it supports clear, learner-respecting copy but does not establish fictional UI slogans, exact CTA wording, or a product-wide Korean grammatical style guide.
331
250
 
332
- - **Hover**: nav pill bg `#F8F9FA → #E9ECEF` (inferred); card thumbnail scale 1.02; CTA bg `#00C471 → #00A760`.
333
- - **Focus**: 2px outline `#00C471` at 2px offset on keyboard focus; input border swaps to `#00C471`.
334
- - **Active / Pressed**: CTA bg `#00A760`; pagination active page solid `#00C471` on white.
335
- - **Disabled**: Mantine default — `#F1F3F5` background, `#ADB5BD` text, `cursor: not-allowed`.
336
- - **Loading**: Mantine `Loader` in primary green; CTA can swap label for inline spinner.
337
- - **Empty**: Centered illustration + headline (`아직 수강 중인 강의가 없어요`) + secondary outlined CTA (`강의 둘러보기`).
338
- - **Error**: Inline `#FA5252` 14px text below the offending field; field border swaps to `#FA5252`.
339
- - **Success**: One-line confirmation in `#00C471` 14px, no toast theatre.
340
- - **Skeleton**: `#F1F3F5` block, shimmer `1.5s` linear (Mantine `Skeleton` default).
251
+ ### Do
341
252
 
342
- ## 9. Accessibility & Internationalization
253
+ - Keep learner and knowledge-sharing context tied to the official company narrative.
254
+ - Preserve source-domain boundaries when referring to product, documentation, or company-story content.
343
255
 
344
- - **Korean is the primary language.** English surfaces exist for `/en/` mirror but are translations, not parity. Date formats follow Korean conventions (`2026년 5월 14일`).
345
- - **Pretendard** is a Korean-display-first font — supports the full Hangul block plus extended Latin; English text reads naturally without a separate Latin font.
346
- - **Color contrast**: Heading `#212529` on `#FFFFFF` = 16.0:1 (AAA). Body `#495057` on `#FFFFFF` = 8.6:1 (AAA). Primary green `#00C471` on `#FFFFFF` = 2.45:1 — **fails AA for body text**; Inflearn correctly uses it only on white-on-green CTAs (where contrast is 4.4:1, passes AA), as accent fills, and for >18pt heading-scale text. Designers should not use `#00C471` for body-text links without a darker variant — use `#00A760` (3.5:1, still borderline AA for body) and prefer underline + bold.
347
- - **Keyboard nav**: Mantine `focusRing="auto"` — visible 2px green ring on Tab navigation.
348
- - **Screen reader**: GNB icon-only buttons carry `aria-label` (`search-menu`, `service-menu` observed). Course tiles use semantic `<article>`.
256
+ ### Don't
349
257
 
258
+ - Turn a company mission statement into an unobserved product microcopy template.
259
+ - Present declared-only or system fonts as loaded Inflearn UI fonts.
350
260
 
351
- ## 16. Do's and Don'ts
261
+ ## 8. Accessibility & States
352
262
 
353
- ### Do
354
- - Use the single mint-green #00C471 for all primary action search submit, primary CTA, active pagination, free/starter tag fills and swap to #00A760 only for hover/pressed states
355
- - Set type in the Pretendard-first stack with a binary-ish weight scale: 700 for headings (H1 34px, H2 20px), 600 for nav and labelled buttons, 400 for body and prices there is no 500
356
- - Apply the two-family radius vocabulary: 8px for cards, inputs, and pagination; 32px for nav pills; and full-pill 999px only for the green search submit and tag chips
357
- - Render the GNB as a sticky 65px white bar with no shadow and no border, letting the green circular search button be the only visual accent
358
- - Keep course tiles borderless and transparent (~230x310px, 8px thumbnail radius) so the thumbnail does the visual work, with title in #212529, instructor in #868E96, and price in #212529 weight 400
359
- - Inherit the Mantine semantic palette for non-brand needs — red #FA5252 for errors, blue #228BE6 for info, cyan-teal #1098AD for category tags — and reach for it instead of inventing new hues
263
+ - The captured search-submit is white text on `#00C471`; the source records its observed hover background as `#00A760`.
264
+ - The captured dialog backdrop is `rgba(0, 0, 0, 0.6)`. The bundle confirms that a dialog-open state exists but does not provide a general dialog-panel accessibility specification.
265
+ - The home capture includes one disabled button with `#F1F3F5` background, `#ADB5BD` text, a `#DEE2E6` border, and 32px radius. It is a selector-specific observation, not a universal disabled-state token because the catalog’s disabled sample differs.
266
+ - No accessibility conformance, focus-visible outline, keyboard order, error message, loading, empty, success, or responsive behavior is claimed beyond the recorded interaction states.
360
267
 
361
- ### Don't
362
- - Introduce a second brand accent hue for a sub-product — tint the existing #00C471 (e.g. rgba(0,196,113,0.1)) or fall back to the Mantine red/blue/yellow/cyan scales instead
363
- - Use #00C471 for body-text links or small text — it scores only 2.45:1 on white and fails AA, so reserve it for white-on-green CTAs and >18pt headings
364
- - Embolden prices in red or add strikethrough discount callouts outside intentional sale rails — keep price in body weight 400 as a fact, not a flag
365
- - Add campaign drama like rotating banner carousels, parallax, or auto-advancing home rails — show ~24 calm catalog tiles above the fold and make card thumbnail scale (1.0 to 1.02) the only ambient motion
366
- - Use pressure or hype microcopy such as 지금 바로!, 놓치지 마세요, 최저가, 최고의 강의, Oops!, or 오류가 발생했습니다 — write agency-on-the-learner copy in casual-polite ~해요 instead
367
- - Call instructors 강사 or 교수 or pit them against each other with ranking labels — use the brand term 지식공유자님 and neutral counts like 수강생 12,400명
268
+ ## 9. Source Boundaries
368
269
 
369
- ---
270
+ The product home and course catalog are the only sources of product tokens and component claims in this reference. The Inflab engineering article is documentation chrome and describes the 2025 GNB redesign, its MFE/App Shell context, and the product’s core service navigation; it must not populate product CSS tokens. The company introduction supplies factual narrative about career learning and knowledge sharing. No separate public marketing surface was captured, and no login, course-detail, cart, payment, or learning-room flow was treated as observed.
370
271
 
371
272
  ## 10. Voice & Tone
372
273
 
373
- Inflearn speaks like **the friendly senior who shows you their bookshelf**, not the strict instructor. The tagline "**라이프타임 커리어 플랫폼**" (lifetime career platform) is the single most load-bearing piece of voice on the site every microcopy decision reinforces *"learning is something you keep doing"* rather than *"finish this course and pass"*. Where Coursera says *"Earn a verified certificate"* and Udemy says *"30-Day Money-Back Guarantee"*, Inflearn says *"부담없이 시작하기"* (start without pressure) the verb framing is always agency-on-the-learner, not pressure-from-the-platform.
374
-
375
- Korean is the dominant register; English appears only for technical course titles (where the technology has an English name — "React", "Spring", "Kubernetes") and for the `/en` mirror. The voice avoids the formal `~합니다` ending in product surfaces (it survives in legal / refund / receipt screens) and uses the casual-polite `~해요` everywhere users are choosing what to learn.
274
+ The first-party company introduction addresses people who build careers and dreams, describes expert knowledge sharing, and frames Inflearn as a career-learning platform. It also explicitly values transparent course information, opportunities to learn despite cost or time constraints, and good content over inflated marketing. Together those statements support a grounded, learner-respecting brand voice: clarity about what is being learned and who is sharing the knowledge is more defensible than pressure or spectacle.
376
275
 
377
- | Context | Tone |
378
- |---|---|
379
- | CTAs | Imperative + concrete outcome, no exclamation. `수강신청 하기`, `결제하기`, `장바구니에 담기`. Never `지금 바로!`. |
380
- | Section headlines | A friendly invitation, not a sales hook. `0원으로 부담없이 시작하기` rather than `무료 강의 BEST 100!`. |
381
- | Course tile metadata | Bare facts. Instructor name, run time, rating, price. No promotional copy on the tile itself. |
382
- | Free tag | Two characters: `무료`. Green pill on white tile. No "FREE!" / "Limited time!" framing. |
383
- | Empty states | Why empty + one next step. `아직 수강 중인 강의가 없어요. 관심 분야의 강의를 둘러보세요.` |
384
- | Error / validation | Specific cause + action. `이메일 형식이 올바르지 않아요. 다시 확인해주세요.` Never `오류가 발생했습니다`. |
385
- | Success | One line, no celebration. `수강신청이 완료되었어요. 내 강의실에서 확인할 수 있어요.` |
386
- | Instructor surfaces | Respectful 2nd-person `~님`. `지식공유자님` is the brand term for instructor — never `강사`, which would feel one-way. |
387
-
388
- **Forbidden phrases (illustrative — not from a published Inflearn guide; derived from observed restraint on `/` and `/courses`)**: `오류가 발생했습니다`, `놓치지 마세요`, `Oops!`, `지금 바로!`, `최저가`, exclamation marks on routine CTAs, emoji on price or enrolment surfaces, superlatives on course recommendations (`최고의 강의`, `이번 주 1등`). Where ranking matters, Inflearn uses neutral counts (`수강생 12,400명`) instead of editorialized rank labels.
276
+ They are not a published UI copy manual. The product capture confirms controls and course content but does not prove an exact CTA vocabulary, a required Korean sentence ending, a particular error-message formulation, or a campaign-copy rule. Preserve the company’s stated commitments as context and leave specific product strings unclaimed unless a product surface directly supplies them.
389
277
 
390
278
  ## 11. Brand Narrative
391
279
 
392
- Inflearn was founded in **2015** by **Lee Hyung-joo (이형주)** under the parent company **Inflab (인프랩)**, headquartered in Seoul. The founding observation was specifically Korean: that working developers, designers, and PMs were learning more from short-form online courses than from university or formal certification, but the existing Korean e-learning market was dominated by exam-prep cram services (수능, 공무원) that treated adult professional learners as if they were teenagers preparing for the SAT.
280
+ Inflab’s own introduction describes Inflearn as a career-learning platform for people who pursue work and dreams. It says the service aims to let people learn and share knowledge without being prevented by economic or time constraints, and it presents knowledge sharers with substantial professional experience as a source of expertise. The company also frames transparent course information and a long-term growth ecosystem as part of its purpose.
393
281
 
394
- Inflearn's bet was that **the same people who built the Korean IT industry engineers, designers, marketers would also teach it**, if given a low-friction marketplace and a respectful split of the revenue. The platform brand name itself is *Information + Learn*, and Inflab's tagline frames the company as a **"lifetime career platform"** rather than an LMS or a course store the design language reflects that framing: a calm catalog you return to, not a campaign-driven sales surface.
282
+ Its engineering writing gives that public product a current operational context. A 2024 design-system retrospective says historical systems coexisted, while the 2026 GNB account explains how a new shared header made the core services—courses, challenges, mentoring, clips, and community—more legible across multiple front-end environments. This is an evolution in product infrastructure and navigation, not evidence that every public surface shares a single stylesheet or component library.
395
283
 
396
- By 2026, Inflearn lists tens of thousands of courses across IT, design, business, language, and lifestyle, and has expanded into roadmap-style course bundles, live mentoring, and a Q&A community. The visual evolution from the early-2010s blue-and-white directory layout to the current Mantine-built mint-green catalog is itself documented on the Inflab engineering blog (`tech.inflab.com`), where the team has written publicly about the design and infrastructure of the redesign — including, in 2026-03, a post on rebuilding the shared GNB header across the company's micro-frontend architecture.
284
+ The reference therefore keeps the official service and evolution story, but does not invent founder history, customer metrics, a uniform visual system, or a quantified design outcome beyond what those sources state.
397
285
 
398
286
  ## 12. Principles
399
287
 
400
- 1. **Friendly, not formal.** Casual-polite `~해요` is the default Korean ending. *UI implication:* avoid `~하시기 바랍니다` in product surfaces; reserve `~합니다` for legal screens.
401
-
402
- 2. **Catalog density over campaign drama.** Returning users dominate the audience; the home page is a place to *scan*, not to *be sold to*. *UI implication:* show ~24 course tiles above the fold; reserve hero space for one calm headline, not a rotating banner carousel.
403
-
404
- 3. **One green, used decisively.** A single brand colour for every interaction. *UI implication:* never introduce a secondary brand colour for a sub-product; tint the existing green or fall back to the Mantine semantic palette (red/blue/yellow/cyan).
405
-
406
- 4. **The instructor is `지식공유자님`.** Knowledge-sharer, not lecturer. *UI implication:* avoid hierarchy language (`강사` / `교수`) and avoid star/rating language that pits instructors against each other on the same screen.
407
-
408
- 5. **Price is a fact, not a flag.** Course prices appear in body weight 400, not bold red, not strikethrough-with-discount-callout (except on intentional sale rails). *UI implication:* a course tile is a content card first, a commerce card second.
409
-
410
- ## 13. Personas
288
+ 1. **Career learning and knowledge sharing.** The company describes a platform for people to learn and share expertise. *UI implication:* do not replace that service context with unsupported commerce or credential claims.
289
+ 2. **Transparent information.** The company says it publishes learner counts and course evaluations without selection or manipulation. *UI implication:* where such data is presented, distinguish actual product evidence from marketing interpretation.
290
+ 3. **Opportunity through accessibility.** The company describes reducing economic and time barriers to learning. *UI implication:* do not turn that narrative into unobserved pricing, promotion, or eligibility UI.
411
291
 
412
- *(Personas inferred from observable surface targeting on `/`, `/courses`, `tech.inflab.com`; not from a published Inflearn persona doc.)*
292
+ ## 13. Stakeholder Groups
413
293
 
414
- - **The Switching IC.** 28–35, working in a Korean tech / non-tech company, considering a role pivot (e.g., backend engineer thinking about ML, marketer thinking about product). Comes to Inflearn evenings and weekends; values roadmap-style course bundles; reads instructor credentials carefully.
294
+ The official company page identifies learners seeking career development and experts who share knowledge. The product’s current GNB article additionally names courses, challenges, mentoring, clips, and community as core services. These are stakeholder/service facts, not synthetic personas; no age, task frequency, conversion behavior, or preference is inferred.
415
295
 
416
- - **The Senior Upskilling.** 35–45, mid-to-senior IC or first-line manager, topping up a specific gap (Kubernetes, React Server Components, FP&A). Buys 1–2 courses per quarter; impatient with marketing fluff; wants the table-of-contents on screen before deciding.
296
+ ## 14. Observed Interaction States
417
297
 
418
- - **The Student-to-Industry.** 21–26, university or bootcamp student, building the portfolio for first-job applications. Uses the free starter (`무료`) courses heavily; price-sensitive; the green free-tag is the most-clicked element on the home page for this persona.
419
-
420
- - **The Adjacent-Function Curious.** 28–40, designer learning a bit of code, PM learning analytics, engineer learning design. Browses outside their core category; sensitive to course difficulty signalling; relies on instructor rating and student count more than course title.
421
-
422
- ## 14. States Catalog
423
-
424
- | Category | Treatment |
425
- |---|---|
426
- | **Empty — My Courses** | Center-aligned illustration; `아직 수강 중인 강의가 없어요`; secondary outlined CTA `강의 둘러보기` linking to `/courses`. |
427
- | **Empty — Wishlist** | `위시리스트가 비어 있어요. 마음에 드는 강의를 담아두세요.` + secondary CTA. |
428
- | **Empty — Search results** | `'<query>'에 대한 결과가 없어요.` + 3 chip suggestions from related categories. |
429
- | **Loading — page** | Mantine `Skeleton` placeholders for course tiles (6 tiles per row, 230×310). |
430
- | **Loading — submit** | Inline 16px spinner replaces CTA label; CTA remains green; pointer disabled. |
431
- | **Error — Network** | Inline banner `네트워크 연결을 확인해주세요. 다시 시도하시면 정상적으로 이용하실 수 있어요.` `다시 시도` outlined button. |
432
- | **Error — Validation** | 14px `#FA5252` text below field; field border `#FA5252`; field icon-side error icon. |
433
- | **Error — Payment** | Modal with specific cause line + `다른 결제 수단으로 시도하기` primary button. |
434
- | **Success — Enrolment** | Inline `수강신청이 완료되었어요.` `내 강의실로 가기` primary CTA. |
435
- | **Skeleton — Card** | `#F1F3F5` blocks for thumbnail (16:9) + 2 text lines; shimmer 1.5s linear. |
436
- | **Disabled — Form** | `#F1F3F5` bg, `#ADB5BD` text, `cursor: not-allowed`. Tooltip on hover explaining what is missing. |
298
+ | State | Selector-backed observation | Boundary |
299
+ |---|---|---|
300
+ | Hover | GNB search submit changes to `#00A760`; GNB action has `rgba(241,243,245,0.65)` background. | Only the listed selectors are promoted. |
301
+ | Selected | Product content tab has `#25262B` background, white 14px/700 text, and full pill radius. | Product-home tab only. |
302
+ | Menu open | Collector expanded a product menu; a 14px Pretendard option at 8px radius and `10px 12px` padding was recorded. | No general menu token is inferred. |
303
+ | Dialog open | Collector recorded a `rgba(0,0,0,0.6)` product backdrop. | No dialog-panel, validation, or checkout state is inferred. |
304
+ | Disabled | Home selector records a neutral 32px button; catalog selector records a different 8px control. | Keep them selector-local; do not create a universal token. |
437
305
 
438
306
  ## 15. Motion & Easing
439
307
 
440
- | Token | Value | Use |
441
- |---|---|---|
442
- | `motion-fast` | 150ms | Hover bg fade, focus ring appear |
443
- | `motion-base` | 200ms | Card thumbnail scale, nav pill bg, button colour |
444
- | `motion-slow` | 300ms | Modal open, drawer slide |
445
- | `easing-default` | `ease` | All hover / focus transitions (Mantine default — `--mantine-transition-timing-function`) |
446
- | `easing-emphasized` | `cubic-bezier(0.4, 0, 0.2, 1)` | Modal / drawer enter — material-style emphasized easing |
447
- | `easing-decelerate` | `cubic-bezier(0, 0, 0.2, 1)` | Skeleton shimmer, page-content fade-in |
448
-
449
- **Motion rules**:
450
- - No carousel auto-advance on home rails (a deliberate departure from Korean commerce convention; Inflearn's audience is reading instructor names, not glancing at banners).
451
- - No parallax. No scroll-triggered hero animation on the marketing surfaces.
452
- - Card hover is the only ambient motion — every other animation requires explicit user input.
453
- - Respect `prefers-reduced-motion: reduce` — fall back to instant transitions, keep colour fades only.
308
+ No duration, easing curve, card-scale, skeleton animation, page transition, or reduced-motion rule was captured in the supplied product evidence. The first-party GNB article discusses a shift from reflow-based scroll motion to composite-based scroll motion for the shared header, but it does not supply reusable animation tokens. No motion token is therefore promoted.