oh-my-design-cli 1.8.6 → 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.
- package/.claude/hooks/lib/preferences-parser.cjs +1 -0
- package/.claude/hooks/lib/preferences-writer.cjs +1 -0
- package/.claude/hooks/post-edit-watch.cjs +1 -0
- package/.claude/hooks/session-end-foldin.cjs +1 -0
- package/.claude/hooks/session-state-loader.cjs +1 -0
- package/.claude/hooks/skill-activation.cjs +1 -0
- package/.claude/settings.json +10 -1
- package/.github/assets/logo-bg.png +0 -0
- package/AGENTS.md +20 -1
- package/CHANGELOG.md +482 -0
- package/MIGRATION.md +103 -0
- package/README.ja.md +56 -19
- package/README.ko.md +47 -30
- package/README.md +48 -30
- package/README.zh-TW.md +59 -22
- package/agents/AGENT.md +8 -7
- package/agents/omd-codex-image.md +1 -1
- package/agents/omd-critic.md +6 -7
- package/agents/omd-designer-review.md +1 -1
- package/agents/omd-final-qa.md +1 -1
- package/agents/omd-humanizer.md +38 -0
- package/agents/omd-kr-writer.md +3 -4
- package/agents/omd-locale-adapter.md +12 -16
- package/agents/omd-master.md +24 -19
- package/agents/omd-microcopy.md +1 -1
- package/agents/omd-orchestrator.md +7 -8
- package/agents/omd-slop-auditor.md +31 -0
- package/agents/omd-ux-researcher.md +1 -1
- package/data/reference-fingerprints.json +2761 -85
- package/dist/bin/oh-my-design.js +16 -8
- package/dist/bin/oh-my-design.js.map +1 -1
- package/dist/chunk-UJIHCEYF.js +99 -0
- package/dist/chunk-UJIHCEYF.js.map +1 -0
- package/dist/doctor-LDWSFM3I.js +763 -0
- package/dist/doctor-LDWSFM3I.js.map +1 -0
- package/dist/install-skills-ZZFNJ2II.js +1120 -0
- package/dist/install-skills-ZZFNJ2II.js.map +1 -0
- package/docs/CLI_QUICKSTART.md +157 -0
- package/package.json +25 -4
- package/scripts/postinstall.cjs +5 -4
- package/skills/claude-design/SKILL.md +38 -14
- package/skills/claude-design/references/claude-design-flow.md +11 -11
- package/skills/claude-design/references/codebase-analysis.md +5 -4
- package/skills/omd-final-qa/SKILL.md +1 -1
- package/skills/omd-harness/SKILL.md +51 -50
- package/skills/omd-humanize/SKILL.md +116 -0
- package/skills/omd-humanize/agents/openai.yaml +4 -0
- package/skills/omd-humanize/references/locale-playbooks.md +102 -0
- package/skills/omd-humanize/references/sources.md +11 -0
- package/skills/omd-init/SKILL.md +18 -12
- package/skills/omd-locale-adapter/SKILL.md +58 -91
- package/skills/omd-orchestrator/SKILL.md +11 -5
- package/skills/omd-reference-capture/SKILL.md +80 -26
- package/skills/omd-reference-capture/scripts/PLAYWRIGHT-LICENSE.txt +202 -0
- package/skills/omd-reference-capture/scripts/PLAYWRIGHT-NOTICE.txt +5 -0
- package/skills/omd-reference-capture/scripts/THIRD_PARTY_NOTICES.md +3 -0
- package/skills/omd-reference-capture/scripts/capture-reference-evidence.mjs +159906 -0
- package/skills/omd-slop-audit/SKILL.md +110 -0
- package/skills/omd-slop-audit/agents/openai.yaml +4 -0
- package/skills/omd-slop-audit/references/pattern-catalog.md +96 -0
- package/skills/omd-slop-audit/references/sources.md +24 -0
- package/web/references/104/DESIGN.md +354 -0
- package/web/references/11st/DESIGN.md +197 -316
- package/web/references/29cm/DESIGN.md +297 -393
- package/web/references/42dot/DESIGN.md +390 -0
- package/web/references/8percent/DESIGN.md +438 -0
- package/web/references/ably/DESIGN.md +267 -572
- package/web/references/acer/DESIGN.md +329 -0
- package/web/references/airbnb/DESIGN.md +219 -557
- package/web/references/airbridge/DESIGN.md +451 -0
- package/web/references/alipay/DESIGN.md +179 -420
- package/web/references/apple/DESIGN.md +224 -498
- package/web/references/asleep/DESIGN.md +402 -0
- package/web/references/au/DESIGN.md +334 -0
- package/web/references/autopedia/DESIGN.md +382 -0
- package/web/references/aws-cloudscape/DESIGN.md +241 -0
- package/web/references/baemin/DESIGN.md +332 -491
- package/web/references/banksalad/DESIGN.md +269 -180
- package/web/references/barogo/DESIGN.md +416 -0
- package/web/references/beusable/DESIGN.md +464 -0
- package/web/references/bigin/DESIGN.md +454 -0
- package/web/references/bilibili/DESIGN.md +206 -374
- package/web/references/bmw/DESIGN.md +162 -276
- package/web/references/brandi/DESIGN.md +184 -325
- package/web/references/buzzvil/DESIGN.md +457 -0
- package/web/references/cafe24/DESIGN.md +472 -0
- package/web/references/catchtable/DESIGN.md +219 -264
- package/web/references/cgv/DESIGN.md +317 -0
- package/web/references/channeltalk/DESIGN.md +210 -336
- package/web/references/china-airlines/DESIGN.md +291 -0
- package/web/references/cjonstyle/DESIGN.md +453 -0
- package/web/references/class101/DESIGN.md +168 -387
- package/web/references/classum/DESIGN.md +228 -203
- package/web/references/claude/DESIGN.md +242 -479
- package/web/references/clay/DESIGN.md +179 -377
- package/web/references/clickhouse/DESIGN.md +254 -343
- package/web/references/codeit/DESIGN.md +470 -0
- package/web/references/cohere/DESIGN.md +214 -324
- package/web/references/coinone/DESIGN.md +199 -179
- package/web/references/corca/DESIGN.md +414 -0
- package/web/references/coupang/DESIGN.md +205 -475
- package/web/references/cursor/DESIGN.md +240 -381
- package/web/references/dabang/DESIGN.md +248 -213
- package/web/references/dable/DESIGN.md +431 -0
- package/web/references/datarize/DESIGN.md +338 -0
- package/web/references/dealicious/DESIGN.md +402 -0
- package/web/references/drdiary/DESIGN.md +404 -0
- package/web/references/elastic/DESIGN.md +238 -0
- package/web/references/elevenlabs/DESIGN.md +183 -321
- package/web/references/elice/DESIGN.md +445 -0
- package/web/references/eslite/DESIGN.md +257 -0
- package/web/references/evaair/DESIGN.md +338 -0
- package/web/references/expo/DESIGN.md +238 -331
- package/web/references/familymart-tw/DESIGN.md +254 -0
- package/web/references/ferrari/DESIGN.md +160 -377
- package/web/references/figma/DESIGN.md +197 -451
- package/web/references/fitpet/DESIGN.md +445 -0
- package/web/references/flex/DESIGN.md +170 -253
- package/web/references/framer/DESIGN.md +197 -340
- package/web/references/freee/DESIGN.md +211 -533
- package/web/references/friendliai/DESIGN.md +431 -0
- package/web/references/frip/DESIGN.md +440 -0
- package/web/references/furiosaai/DESIGN.md +450 -0
- package/web/references/gangnamunni/DESIGN.md +154 -591
- package/web/references/gaudiolab/DESIGN.md +414 -0
- package/web/references/google/DESIGN.md +290 -398
- package/web/references/goorm/DESIGN.md +470 -0
- package/web/references/greencar/DESIGN.md +420 -0
- package/web/references/hackle/DESIGN.md +472 -0
- package/web/references/hashicorp/DESIGN.md +273 -318
- package/web/references/heydealer/DESIGN.md +429 -0
- package/web/references/humanscape/DESIGN.md +433 -0
- package/web/references/hwahae/DESIGN.md +453 -0
- package/web/references/hyundai/DESIGN.md +158 -368
- package/web/references/hyundaicard/DESIGN.md +171 -121
- package/web/references/ibm/DESIGN.md +227 -378
- package/web/references/idus/DESIGN.md +450 -0
- package/web/references/igaworks/DESIGN.md +437 -0
- package/web/references/inflearn/DESIGN.md +221 -366
- package/web/references/intuit/DESIGN.md +244 -0
- package/web/references/jandi/DESIGN.md +191 -291
- package/web/references/jobplanet/DESIGN.md +415 -0
- package/web/references/kakao/DESIGN.md +287 -475
- package/web/references/kakaobank/DESIGN.md +220 -521
- package/web/references/kakaogames/DESIGN.md +220 -0
- package/web/references/kakaopay/DESIGN.md +207 -526
- package/web/references/karrot/DESIGN.md +227 -251
- package/web/references/kb-kookmin/DESIGN.md +308 -0
- package/web/references/kbank/DESIGN.md +220 -175
- package/web/references/kcd/DESIGN.md +432 -0
- package/web/references/kmong/DESIGN.md +281 -356
- package/web/references/krds/DESIGN.md +245 -19
- package/web/references/kream/DESIGN.md +224 -359
- package/web/references/kurly/DESIGN.md +211 -533
- package/web/references/kyobobook/DESIGN.md +445 -0
- package/web/references/lablup/DESIGN.md +474 -0
- package/web/references/lamborghini/DESIGN.md +198 -360
- package/web/references/lemonbase/DESIGN.md +452 -0
- package/web/references/lguplus/DESIGN.md +259 -0
- package/web/references/likelion/DESIGN.md +283 -0
- package/web/references/line/DESIGN.md +396 -355
- package/web/references/linear.app/DESIGN.md +209 -562
- package/web/references/lotteon/DESIGN.md +386 -0
- package/web/references/lovable/DESIGN.md +255 -349
- package/web/references/makinarocks/DESIGN.md +242 -0
- package/web/references/maum-ai/DESIGN.md +423 -0
- package/web/references/medibloc/DESIGN.md +425 -0
- package/web/references/megabox/DESIGN.md +232 -0
- package/web/references/mercari/DESIGN.md +217 -434
- package/web/references/microsoft/DESIGN.md +234 -388
- package/web/references/mildang/DESIGN.md +411 -0
- package/web/references/millie/DESIGN.md +183 -504
- package/web/references/minimax/DESIGN.md +264 -322
- package/web/references/miricanvas/DESIGN.md +182 -355
- package/web/references/miro/DESIGN.md +234 -232
- package/web/references/mistral.ai/DESIGN.md +231 -314
- package/web/references/mixi/DESIGN.md +234 -0
- package/web/references/moin/DESIGN.md +445 -0
- package/web/references/mongodb/DESIGN.md +219 -316
- package/web/references/moreh/DESIGN.md +437 -0
- package/web/references/musinsa/DESIGN.md +184 -510
- package/web/references/mynavi/DESIGN.md +242 -0
- package/web/references/myrealtrip/DESIGN.md +169 -406
- package/web/references/naver/DESIGN.md +328 -499
- package/web/references/naverwebtoon/DESIGN.md +172 -395
- package/web/references/neosapience/DESIGN.md +441 -0
- package/web/references/nhn/DESIGN.md +169 -346
- package/web/references/nhncloud/DESIGN.md +185 -123
- package/web/references/nota/DESIGN.md +451 -0
- package/web/references/notion/DESIGN.md +271 -475
- package/web/references/nrise/DESIGN.md +417 -0
- package/web/references/ohouse/DESIGN.md +210 -549
- package/web/references/oliveyoung/DESIGN.md +217 -326
- package/web/references/ollama/DESIGN.md +241 -308
- package/web/references/onestore/DESIGN.md +248 -0
- package/web/references/palantir/DESIGN.md +256 -0
- package/web/references/panasonic/DESIGN.md +276 -0
- package/web/references/patternfly/DESIGN.md +259 -0
- package/web/references/payhere/DESIGN.md +438 -0
- package/web/references/pega/DESIGN.md +262 -0
- package/web/references/peoplefund/DESIGN.md +431 -0
- package/web/references/petfriends/DESIGN.md +428 -0
- package/web/references/pinkfong/DESIGN.md +199 -367
- package/web/references/pinterest/DESIGN.md +258 -308
- package/web/references/portone/DESIGN.md +446 -0
- package/web/references/poya/DESIGN.md +286 -0
- package/web/references/pozalabs/DESIGN.md +438 -0
- package/web/references/protopie/DESIGN.md +419 -0
- package/web/references/qraft/DESIGN.md +448 -0
- package/web/references/queenit/DESIGN.md +432 -0
- package/web/references/quotabook/DESIGN.md +449 -0
- package/web/references/rebellions/DESIGN.md +449 -0
- package/web/references/recruit/DESIGN.md +247 -0
- package/web/references/remember/DESIGN.md +202 -396
- package/web/references/resend/DESIGN.md +274 -348
- package/web/references/returnzero/DESIGN.md +460 -0
- package/web/references/sakura-internet/DESIGN.md +269 -0
- package/web/references/samsung/DESIGN.md +157 -359
- package/web/references/sandoll/DESIGN.md +445 -0
- package/web/references/sanity/DESIGN.md +241 -375
- package/web/references/saramin/DESIGN.md +465 -0
- package/web/references/scatterlab/DESIGN.md +412 -0
- package/web/references/selectstar/DESIGN.md +439 -0
- package/web/references/servicenow/DESIGN.md +289 -0
- package/web/references/shiftee/DESIGN.md +468 -0
- package/web/references/shinhanbank/DESIGN.md +161 -341
- package/web/references/shinhancard/DESIGN.md +208 -319
- package/web/references/sionic/DESIGN.md +454 -0
- package/web/references/sktelecom/DESIGN.md +310 -0
- package/web/references/socar/DESIGN.md +125 -32
- package/web/references/softbank/DESIGN.md +231 -0
- package/web/references/solapi/DESIGN.md +483 -0
- package/web/references/sony/DESIGN.md +234 -0
- package/web/references/soop/DESIGN.md +261 -0
- package/web/references/spacex/DESIGN.md +184 -323
- package/web/references/spotify/DESIGN.md +253 -394
- package/web/references/squeezebits/DESIGN.md +441 -0
- package/web/references/stayfolio/DESIGN.md +422 -0
- package/web/references/stripe/DESIGN.md +212 -491
- package/web/references/supabase/DESIGN.md +244 -316
- package/web/references/supertone/DESIGN.md +413 -0
- package/web/references/tabling/DESIGN.md +415 -0
- package/web/references/taishinbank/DESIGN.md +243 -0
- package/web/references/teamlab/DESIGN.md +240 -0
- package/web/references/teamsparta/DESIGN.md +472 -0
- package/web/references/tellingme/DESIGN.md +392 -0
- package/web/references/tesla/DESIGN.md +244 -427
- package/web/references/thsr/DESIGN.md +284 -0
- package/web/references/thumbtack/DESIGN.md +302 -0
- package/web/references/together.ai/DESIGN.md +257 -304
- package/web/references/toss/DESIGN.md +251 -593
- package/web/references/toss-securities/DESIGN.md +255 -178
- package/web/references/tossbank/DESIGN.md +195 -491
- package/web/references/toyota/DESIGN.md +238 -0
- package/web/references/tving/DESIGN.md +197 -245
- package/web/references/typed/DESIGN.md +413 -0
- package/web/references/uber/DESIGN.md +256 -333
- package/web/references/udn/DESIGN.md +250 -0
- package/web/references/upbit/DESIGN.md +145 -256
- package/web/references/upstage/DESIGN.md +211 -204
- package/web/references/uswds/DESIGN.md +287 -0
- package/web/references/vercel/DESIGN.md +236 -440
- package/web/references/vuno/DESIGN.md +413 -0
- package/web/references/wanted/DESIGN.md +215 -487
- package/web/references/weverse/DESIGN.md +437 -0
- package/web/references/wise/DESIGN.md +223 -231
- package/web/references/wisetracker/DESIGN.md +462 -0
- package/web/references/wooribank/DESIGN.md +245 -0
- package/web/references/yanolja/DESIGN.md +250 -419
- package/web/references/yeogiotte/DESIGN.md +235 -418
- package/web/references/zapier/DESIGN.md +256 -377
- package/web/references/zendesk/DESIGN.md +288 -0
- package/web/references/zigzag/DESIGN.md +200 -621
- package/dist/install-skills-7UUDOLG2.js +0 -734
- package/dist/install-skills-7UUDOLG2.js.map +0 -1
|
@@ -8,488 +8,392 @@ primary_color: "#000000"
|
|
|
8
8
|
logo:
|
|
9
9
|
type: favicon
|
|
10
10
|
slug: "https://asset.29cm.co.kr/icon/apple-icon-144x144.png"
|
|
11
|
-
verified: "2026-
|
|
11
|
+
verified: "2026-07-11"
|
|
12
|
+
omd: "0.1"
|
|
13
|
+
verification_v2:
|
|
14
|
+
schema: 2
|
|
15
|
+
checked: "2026-07-11"
|
|
16
|
+
surfaces:
|
|
17
|
+
- { id: home, kind: storefront, url: "https://www.29cm.co.kr/", inspected: "2026-07-11" }
|
|
18
|
+
- { id: best, kind: catalog, url: "https://www.29cm.co.kr/best-products?period=HOURLY&ranking=POPULARITY&gender=F&age=30", inspected: "2026-07-11" }
|
|
19
|
+
- { id: magazine, kind: editorial, url: "https://www.29cm.co.kr/content/29magazine", inspected: "2026-07-11" }
|
|
20
|
+
- { id: showcase, kind: editorial, url: "https://www.29cm.co.kr/store/showcase", inspected: "2026-07-11" }
|
|
21
|
+
- { id: product, kind: product-detail, url: "https://www.29cm.co.kr/products/3970725", inspected: "2026-07-11" }
|
|
22
|
+
sources:
|
|
23
|
+
- { id: home-live, kind: product-surface, url: "https://www.29cm.co.kr/", captured: "2026-07-11" }
|
|
24
|
+
- { id: best-live, kind: product-surface, url: "https://www.29cm.co.kr/best-products?period=HOURLY&ranking=POPULARITY&gender=F&age=30", captured: "2026-07-11" }
|
|
25
|
+
- { id: magazine-live, kind: product-surface, url: "https://www.29cm.co.kr/content/29magazine", captured: "2026-07-11" }
|
|
26
|
+
- { id: showcase-live, kind: product-surface, url: "https://www.29cm.co.kr/store/showcase", captured: "2026-07-11" }
|
|
27
|
+
- { id: product-live, kind: product-surface, url: "https://www.29cm.co.kr/products/3970725", captured: "2026-07-11" }
|
|
28
|
+
claims:
|
|
29
|
+
"tokens.colors.accent": &best_evidence { surface_id: best, source_id: best-live, method: live-inspect, captured: "2026-07-11" }
|
|
30
|
+
"tokens.colors.border": &home_evidence { surface_id: home, source_id: home-live, method: live-inspect, captured: "2026-07-11" }
|
|
31
|
+
"tokens.colors.canvas": *home_evidence
|
|
32
|
+
"tokens.colors.foreground": *home_evidence
|
|
33
|
+
"tokens.colors.ink-secondary": &magazine_evidence { surface_id: magazine, source_id: magazine-live, method: live-inspect, captured: "2026-07-11" }
|
|
34
|
+
"tokens.colors.ink-tertiary": *best_evidence
|
|
35
|
+
"tokens.colors.muted": *home_evidence
|
|
36
|
+
"tokens.colors.primary": *home_evidence
|
|
37
|
+
"tokens.components.carousel-control.bg": &product_evidence { surface_id: product, source_id: product-live, method: live-inspect, captured: "2026-07-11" }
|
|
38
|
+
"tokens.components.carousel-control.fg": *product_evidence
|
|
39
|
+
"tokens.components.carousel-control.font": *product_evidence
|
|
40
|
+
"tokens.components.carousel-control.height": *product_evidence
|
|
41
|
+
"tokens.components.carousel-control.padding": *product_evidence
|
|
42
|
+
"tokens.components.carousel-control.radius": *product_evidence
|
|
43
|
+
"tokens.components.carousel-control.states": *product_evidence
|
|
44
|
+
"tokens.components.carousel-control.type": *product_evidence
|
|
45
|
+
"tokens.components.carousel-control.use": *product_evidence
|
|
46
|
+
"tokens.components.editorial-story-item.bg": &showcase_evidence { surface_id: showcase, source_id: showcase-live, method: live-inspect, captured: "2026-07-11" }
|
|
47
|
+
"tokens.components.editorial-story-item.radius": *showcase_evidence
|
|
48
|
+
"tokens.components.editorial-story-item.type": *showcase_evidence
|
|
49
|
+
"tokens.components.editorial-story-item.use": *showcase_evidence
|
|
50
|
+
"tokens.components.ghost-outline.bg": *home_evidence
|
|
51
|
+
"tokens.components.ghost-outline.border": *home_evidence
|
|
52
|
+
"tokens.components.ghost-outline.fg": *home_evidence
|
|
53
|
+
"tokens.components.ghost-outline.font": *home_evidence
|
|
54
|
+
"tokens.components.ghost-outline.height": *home_evidence
|
|
55
|
+
"tokens.components.ghost-outline.padding": *home_evidence
|
|
56
|
+
"tokens.components.ghost-outline.radius": *home_evidence
|
|
57
|
+
"tokens.components.ghost-outline.states": *home_evidence
|
|
58
|
+
"tokens.components.ghost-outline.type": *home_evidence
|
|
59
|
+
"tokens.components.ghost-outline.use": *home_evidence
|
|
60
|
+
"tokens.components.product-grid-item.bg": *best_evidence
|
|
61
|
+
"tokens.components.product-grid-item.radius": *best_evidence
|
|
62
|
+
"tokens.components.product-grid-item.type": *best_evidence
|
|
63
|
+
"tokens.components.product-grid-item.use": *best_evidence
|
|
64
|
+
"tokens.components.quantity-input.bg": *product_evidence
|
|
65
|
+
"tokens.components.quantity-input.border": *product_evidence
|
|
66
|
+
"tokens.components.quantity-input.fg": *product_evidence
|
|
67
|
+
"tokens.components.quantity-input.font": *product_evidence
|
|
68
|
+
"tokens.components.quantity-input.height": *product_evidence
|
|
69
|
+
"tokens.components.quantity-input.radius": *product_evidence
|
|
70
|
+
"tokens.components.quantity-input.states": *product_evidence
|
|
71
|
+
"tokens.components.quantity-input.type": *product_evidence
|
|
72
|
+
"tokens.components.quantity-input.use": *product_evidence
|
|
73
|
+
"tokens.rounded.chip": *product_evidence
|
|
74
|
+
"tokens.rounded.full": *product_evidence
|
|
75
|
+
"tokens.rounded.md": *home_evidence
|
|
76
|
+
"tokens.rounded.sm": *home_evidence
|
|
77
|
+
"tokens.shadow.flat": *home_evidence
|
|
78
|
+
"tokens.spacing.base": *home_evidence
|
|
79
|
+
"tokens.spacing.lg": *home_evidence
|
|
80
|
+
"tokens.spacing.md": *home_evidence
|
|
81
|
+
"tokens.spacing.sm": *home_evidence
|
|
82
|
+
"tokens.spacing.xl": *home_evidence
|
|
83
|
+
"tokens.spacing.xs": *home_evidence
|
|
84
|
+
"tokens.typography.body.lineHeight": *home_evidence
|
|
85
|
+
"tokens.typography.body.size": *home_evidence
|
|
86
|
+
"tokens.typography.body.use": *home_evidence
|
|
87
|
+
"tokens.typography.body.weight": *home_evidence
|
|
88
|
+
"tokens.typography.caption.lineHeight": *best_evidence
|
|
89
|
+
"tokens.typography.caption.size": *best_evidence
|
|
90
|
+
"tokens.typography.caption.use": *best_evidence
|
|
91
|
+
"tokens.typography.caption.weight": *best_evidence
|
|
92
|
+
"tokens.typography.editorial-title.lineHeight": *magazine_evidence
|
|
93
|
+
"tokens.typography.editorial-title.size": *magazine_evidence
|
|
94
|
+
"tokens.typography.editorial-title.use": *magazine_evidence
|
|
95
|
+
"tokens.typography.editorial-title.weight": *magazine_evidence
|
|
96
|
+
"tokens.typography.family.sans": *home_evidence
|
|
97
|
+
"tokens.typography.nav-display.lineHeight": *home_evidence
|
|
98
|
+
"tokens.typography.nav-display.size": *home_evidence
|
|
99
|
+
"tokens.typography.nav-display.use": *home_evidence
|
|
100
|
+
"tokens.typography.nav-display.weight": *home_evidence
|
|
101
|
+
"tokens.typography.product-brand.lineHeight": *best_evidence
|
|
102
|
+
"tokens.typography.product-brand.size": *best_evidence
|
|
103
|
+
"tokens.typography.product-brand.use": *best_evidence
|
|
104
|
+
"tokens.typography.product-brand.weight": *best_evidence
|
|
105
|
+
"tokens.typography.product-name.lineHeight": *best_evidence
|
|
106
|
+
"tokens.typography.product-name.size": *best_evidence
|
|
107
|
+
"tokens.typography.product-name.use": *best_evidence
|
|
108
|
+
"tokens.typography.product-name.weight": *best_evidence
|
|
109
|
+
"tokens.typography.product-price.lineHeight": *best_evidence
|
|
110
|
+
"tokens.typography.product-price.size": *best_evidence
|
|
111
|
+
"tokens.typography.product-price.use": *best_evidence
|
|
112
|
+
"tokens.typography.product-price.weight": *best_evidence
|
|
113
|
+
|
|
12
114
|
tokens:
|
|
13
|
-
source:
|
|
14
|
-
extracted: "2026-
|
|
15
|
-
note: "
|
|
115
|
+
source: reconciled
|
|
116
|
+
extracted: "2026-07-11"
|
|
117
|
+
note: "Five current public commerce/editorial surfaces. Pretendard Variable is loaded and used; Campton and swiper-icons are declared-only. Accent is current sale text #ff4800, not the previous #ff0066/#ff003c guess."
|
|
16
118
|
colors:
|
|
17
119
|
primary: "#000000"
|
|
18
120
|
foreground: "#000000"
|
|
19
|
-
body: "#000000"
|
|
20
121
|
canvas: "#ffffff"
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
error: "#ff003c"
|
|
27
|
-
skeleton: "#f5f5f5"
|
|
122
|
+
muted: "#5d5d5d"
|
|
123
|
+
ink-secondary: "#303033"
|
|
124
|
+
ink-tertiary: "#474747"
|
|
125
|
+
accent: "#ff4800"
|
|
126
|
+
border: "#dddddd"
|
|
28
127
|
typography:
|
|
29
128
|
family: { sans: "Pretendard Variable" }
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
product-price: { size: 12, weight: 700, lineHeight: 1.36, use: "Card price — same size as name, never dominates" }
|
|
40
|
-
price-caption: { size: 12, weight: 400, lineHeight: 1.36, use: "옵션비 별도 in muted grey" }
|
|
41
|
-
spacing: { xs: 4, sm: 8, md: 12, base: 16, page: 20, lg: 24, xl: 32, margin: 48 }
|
|
42
|
-
rounded: { sm: 2, md: 4 }
|
|
129
|
+
nav-display: { size: 40, weight: 700, lineHeight: 1.5, use: "Desktop editorial navigation" }
|
|
130
|
+
editorial-title: { size: 23, weight: 600, lineHeight: 1.3, use: "29Magazine lead story title" }
|
|
131
|
+
body: { size: 16, weight: 400, lineHeight: 1.5, use: "Shared commerce and editorial body" }
|
|
132
|
+
product-brand: { size: 11, weight: 700, lineHeight: 1.36, use: "Product-grid brand link" }
|
|
133
|
+
product-name: { size: 12, weight: 400, lineHeight: 1.36, use: "Product-grid item name" }
|
|
134
|
+
product-price: { size: 13, weight: 700, lineHeight: 1.4, use: "Price and discount percentage row" }
|
|
135
|
+
caption: { size: 10, weight: 500, lineHeight: 1.2, use: "Shipping and product flags" }
|
|
136
|
+
spacing: { xs: 2, sm: 4, md: 8, base: 16, lg: 24, xl: 28 }
|
|
137
|
+
rounded: { sm: 2, md: 4, chip: 10, full: 9999 }
|
|
43
138
|
shadow:
|
|
44
|
-
flat: "none
|
|
45
|
-
inverted: "#000000 background on #ffffff page — elevation by colour inversion"
|
|
139
|
+
flat: "none"
|
|
46
140
|
components_harvested: true
|
|
47
141
|
components:
|
|
48
|
-
ghost-outline: { type: button, bg: "#ffffff", fg: "#000000", radius:
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
omd: "0.1"
|
|
142
|
+
ghost-outline: { type: button, bg: "#ffffff", fg: "#000000", border: "1px solid #dddddd", radius: "4px", padding: "16px 16px 16px 20px", height: "52px", font: "14px / 700", states: "default on home and magazine; pressed observed on product outline CTA", use: "Editorial more and brand-home action" }
|
|
143
|
+
carousel-control: { type: button, bg: "rgba(0,0,0,0.5)", fg: "#ffffff", radius: "9999px", padding: "14px", height: "52px", font: "16px / 400", states: "disabled, focus, hover, pressed", use: "Product-image previous/next control" }
|
|
144
|
+
product-grid-item: { type: listItem, bg: "transparent", radius: "4px", use: "BEST product result with image, brand, name, discount, price, and shipping caption" }
|
|
145
|
+
editorial-story-item: { type: listItem, bg: "transparent", radius: "0px", use: "29Magazine and Showcase story/list entry" }
|
|
146
|
+
quantity-input: { type: input, bg: "#ffffff", fg: "#000000", border: "1px solid #dddddd", radius: "0px", height: "36px", font: "16px / 500", states: "default captured; no changed focus style observed", use: "Product-detail quantity field" }
|
|
54
147
|
---
|
|
55
148
|
|
|
56
149
|
# Design System Inspiration of 29CM
|
|
57
150
|
|
|
58
151
|
## 1. Visual Theme & Atmosphere
|
|
59
152
|
|
|
60
|
-
|
|
153
|
+
Across the current homepage, BEST catalog, 29Magazine, Showcase, and a public product-detail page, 29CM presents itself as a taste-led select shop and turns commerce into an editorial browsing experience. Large photography and oversized black navigation lead; product metadata is deliberately compact so curation and shopping efficiency coexist. The common canvas is `#ffffff`, the dominant ink is `#000000`, and the recurring neutral text colors are `#5d5d5d`, `#303033`, and `#474747`. The only repeated chromatic accent found in the captured commerce surfaces is the orange-red sale text `#ff4800`.
|
|
61
154
|
|
|
62
|
-
The
|
|
155
|
+
The desktop home navigation is materially larger than the previous reference described: the captured link is `40px` at weight `700` with a `60px` line height. 29Magazine lead titles use `23px/600`, while BEST product metadata compresses to an `11px/700` brand, `12px/400` name, `13px/700` discount and price, and `10px/500` flags. This scale contrast—not a single three-step type ramp—is the current signature.
|
|
63
156
|
|
|
64
|
-
|
|
157
|
+
Pretendard Variable was both declared and loaded, and the collector observed it on 1,562 elements across all five surfaces. `campton` and `swiper-icons` appeared in font declarations but had zero observed usage, so neither is promoted to a canonical family. The captured surfaces remain mostly flat, but they are not radius-free: an editorial outline action uses 4px corners, product cards use 4px, a 10px chip radius exists, and product-gallery controls are fully round at 9999px.
|
|
65
158
|
|
|
66
|
-
**
|
|
67
|
-
-
|
|
68
|
-
-
|
|
69
|
-
-
|
|
70
|
-
-
|
|
71
|
-
-
|
|
72
|
-
-
|
|
73
|
-
-
|
|
74
|
-
-
|
|
75
|
-
- No shadow system on the homepage — elevation reads as "raised image", not "elevated card"
|
|
76
|
-
- Lowercase, English-leaning category labels (`Special-Order`, `Showcase`, `Lookbook`, `29Magazine`) at 24-30px/700 — the brand's editorial register made literal
|
|
159
|
+
**Observed characteristics:**
|
|
160
|
+
- Five public surfaces reconciled in one capture: storefront, BEST, 29Magazine, Showcase, and product detail
|
|
161
|
+
- `#000000` and `#ffffff` dominate; `#ff4800` is sale text, not a filled pill
|
|
162
|
+
- Loaded primary family: Pretendard Variable
|
|
163
|
+
- 40px/700 desktop editorial navigation and 23px/600 magazine story title
|
|
164
|
+
- Compact commerce metadata from 10px to 13px
|
|
165
|
+
- Flat containers with targeted 0px, 2px, 4px, 10px, and full-round geometry
|
|
166
|
+
- Current outline border `#dddddd`; previous `#c4c4c4` claim was not retained
|
|
167
|
+
- Component inventory is based on native buttons, inputs, and list items across multiple routes
|
|
77
168
|
|
|
78
169
|
## 2. Color Palette & Roles
|
|
79
170
|
|
|
80
|
-
###
|
|
81
|
-
- **
|
|
82
|
-
- **
|
|
171
|
+
### Core
|
|
172
|
+
- **Primary / foreground** — `#000000`: navigation, product text, headings, and primary ink.
|
|
173
|
+
- **Canvas** — `#ffffff`: page and control surfaces.
|
|
174
|
+
- **Muted** — `#5d5d5d`: repeatedly observed secondary copy; some instances render with alpha.
|
|
175
|
+
- **Secondary ink** — `#303033`: magazine and product-detail copy.
|
|
176
|
+
- **Tertiary ink** — `#474747`: catalog and product-detail supporting copy.
|
|
177
|
+
- **Border** — `#dddddd`: live outline-button and quantity-control border.
|
|
178
|
+
- **Accent** — `#ff4800`: current discount percentage text on BEST and product-detail surfaces.
|
|
83
179
|
|
|
84
|
-
|
|
85
|
-
- **Muted Grey 64%** (`rgba(93, 93, 93, 0.64)`): Secondary captions, "옵션비 별도" hints, badge counts, inactive nav items. The single most-used non-primary color on the site, and it is a transparency, not a swatch — meaning the actual rendered colour shifts with whatever sits behind it.
|
|
86
|
-
- **Outline Grey** (`#c4c4c4`): The only border colour used for ghost-style buttons and editorial tile dividers. Mid-light, neutral, no warm tint.
|
|
180
|
+
The accent is rendered as text on a transparent background with 0px radius; it should not be reconstructed as the old `#ff0066` or `#ff003c` sale pill. Low-frequency page-specific values such as `#f4f4f4` were captured but remain evidence rather than canonical tokens because they were not sufficiently recurrent.
|
|
87
181
|
|
|
88
|
-
|
|
89
|
-
- **Sale Red** (`#ff0066` / `#ff003c` family): Appears only on discount badges and percent-off pills on product cards. Never used for UI affordances or CTAs.
|
|
90
|
-
- **Brand Black on Brand Black**: Floating help CTAs ("FAQ", "1:1 문의") use `#000000` background with `#ffffff` text — the inverse of the page, treated as a high-contrast, low-frequency control.
|
|
182
|
+
## 3. Typography Rules
|
|
91
183
|
|
|
92
|
-
###
|
|
93
|
-
- No brand blue, brand purple, or brand red. The category buttons that read "FAQ"/"1:1 문의" are not "primary" — they are inverted black, the same as the footer.
|
|
94
|
-
- No tinted neutrals (no `#fafafa`, no warm cream). Backgrounds are `#ffffff`, full stop.
|
|
95
|
-
- No semantic colour system beyond the discount-red badge. There is no success-green, warning-yellow, or info-blue on the marketing surface.
|
|
184
|
+
### Font evidence
|
|
96
185
|
|
|
97
|
-
|
|
186
|
+
| Evidence class | Resolution |
|
|
187
|
+
|---|---|
|
|
188
|
+
| Official product-use | No separate public typography standard was located; product-use comes from inspected first-party surfaces. |
|
|
189
|
+
| Live surface-use | Loaded `Pretendard Variable` appeared on 1,562 elements across five surfaces. |
|
|
190
|
+
| Official distributed asset | No 29CM product font asset is promoted from distribution evidence. |
|
|
191
|
+
| Declared-only | `campton` and `swiper-icons` had zero observed text usage. |
|
|
192
|
+
| Unresolved | Native-app-only or campaign-specific families remain unresolved until inspected. |
|
|
98
193
|
|
|
99
|
-
|
|
100
|
-
- **Primary**: `Pretendard Variable`, with fallback chain `ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"`
|
|
101
|
-
- **Single-family system**: There is no separate display face, no serif companion, no monospace. Pretendard Variable handles 100% of legible surfaces.
|
|
102
|
-
|
|
103
|
-
### Hierarchy
|
|
104
|
-
|
|
105
|
-
| Role | Size | Weight | Line Height | Notes |
|
|
106
|
-
|------|------|--------|-------------|-------|
|
|
107
|
-
| Section Headline (Special-Order / 29Magazine) | 30px | 700 | ~1.13 | Lowercase-English / mixed Korean editorial headlines |
|
|
108
|
-
| Sub-Headline (lower category) | 24px | 700 | ~1.21 | Smaller category nav items |
|
|
109
|
-
| Editorial Card Title | 22px | 700 | 29.92px (1.36) | The signature card title — PT subjects, themed collections |
|
|
110
|
-
| Editorial Body / Description | 15px | 400 | 22.5px (1.50) | Card descriptions, editorial blurbs |
|
|
111
|
-
| Nav Link (primary) | 16px | 200-800 | normal | 200 = inactive secondary, 800 = active "BEST" / current section |
|
|
112
|
-
| Floating CTA ("FAQ", "1:1 문의") | 15px | 400 | normal | Black bg, white text, 2px radius |
|
|
113
|
-
| Ghost CTA ("더보기") | 14px | 700 | normal | White bg, 1px `#c4c4c4` border |
|
|
114
|
-
| Footer Heading | 13px | 700 | 18.2px (1.40) | Caps Latin section labels — `NOTICE`, `ABOUT US`, `MY ORDER`, `HELP` |
|
|
115
|
-
| Product Name (card) | 12px | 400 | 16.32px (1.36) | Black ink, restrained, sits under the image |
|
|
116
|
-
| Product Price | 12px | 700 | 16.32px (1.36) | Same size as the name — price never dominates the card |
|
|
117
|
-
| Price Caption ("옵션비 별도") | 12px | 400 | 16.32px (1.36) | In `rgba(93,93,93,0.64)` grey |
|
|
118
|
-
|
|
119
|
-
### Principles
|
|
120
|
-
|
|
121
|
-
- **One family, three weights.** Pretendard Variable at 400 (body, captions), 700 (titles, prices, ghost CTAs), and 800 (active navigation). 200 appears on inactive secondary nav as a quiet hint. There is no italic; emphasis is by weight, never style.
|
|
122
|
-
- **Editorial card title = 22px/700.** This is the unit of voice. Most magazine-style tiles on the homepage carry one 22-29px Korean sentence at weight 700, then a 15px/400 description in the same line-height ratio. The pair is the brand's grammar.
|
|
123
|
-
- **Latin labels at large sizes, Korean at body sizes.** Category navigation uses English (`Special-Order`, `Showcase`, `PT`, `29Magazine`) at display sizes (24-30px), while Korean dominates body and editorial copy. The mixing is intentional — the English serves as a magazine table-of-contents register.
|
|
124
|
-
- **Prices are never the loudest thing on a card.** 12px/700 is by design subordinate to the 22px title and the photo. Where Coupang puts price first, 29CM puts price last.
|
|
125
|
-
- **Letter-spacing is `normal` almost everywhere.** No tight tracking, no display-tracking compensation. The font is well-cut enough to carry display sizes without spacing intervention.
|
|
126
|
-
- **Line-height ≈ 1.36-1.50.** Korean bodies need air; the editorial register needs more. 1.36 on titles, 1.50 on prose — never tighter.
|
|
194
|
+
Specimen availability is separate from family truth and follows a loadable, licensed source.
|
|
127
195
|
|
|
128
|
-
|
|
196
|
+
- **Canonical family:** `Pretendard Variable` — loaded and used across all five inspected surfaces.
|
|
197
|
+
- **Declared-only:** `campton` and `swiper-icons` — zero observed element usage; do not use as canonical text families.
|
|
198
|
+
- **Fallbacks:** preserve the product's CSS fallback chain when implementing, but do not infer a separate display face from declarations alone.
|
|
199
|
+
|
|
200
|
+
### Captured hierarchy
|
|
201
|
+
|
|
202
|
+
| Role | Size | Weight | Line height | Captured surface |
|
|
203
|
+
|---|---:|---:|---:|---|
|
|
204
|
+
| Desktop editorial navigation | 40px | 700 | 60px | Home |
|
|
205
|
+
| Magazine lead story title | 23px | 600 | 29.9px | 29Magazine |
|
|
206
|
+
| Shared body | 16px | 400 | 24px | Home and editorial |
|
|
207
|
+
| Product-grid brand | 11px | 700 | 15.0px | BEST |
|
|
208
|
+
| Product-grid name | 12px | 400 | 16.3px | BEST |
|
|
209
|
+
| Product price and discount | 13px | 700 | 18.2px | BEST and product detail |
|
|
210
|
+
| Shipping and product flag | 10px | 500 | 12px | BEST and product detail |
|
|
129
211
|
|
|
130
|
-
|
|
212
|
+
Use the large-to-small contrast intentionally: editorial navigation and stories establish discovery, while dense commerce metadata stays compact. Do not substitute the obsolete 30px/700 and 22px/700 hierarchy as if it were the current live system.
|
|
131
213
|
|
|
132
|
-
|
|
214
|
+
## 4. Component Stylings
|
|
215
|
+
|
|
216
|
+
### Ghost Outline
|
|
217
|
+
- Type: button
|
|
133
218
|
- Background: `#ffffff`
|
|
134
219
|
- Text: `#000000`
|
|
135
|
-
- Border: `1px solid #
|
|
220
|
+
- Border: `1px solid #dddddd`
|
|
136
221
|
- Radius: 4px
|
|
137
|
-
- Padding: 16px 16px 16px 20px
|
|
222
|
+
- Padding: 16px 16px 16px 20px
|
|
138
223
|
- Height: 52px
|
|
139
|
-
- Font: 14px
|
|
140
|
-
-
|
|
224
|
+
- Font: 14px at weight 700
|
|
225
|
+
- States: default captured on home and magazine; a related product outline action exposed pressed state
|
|
226
|
+
- Use: editorial more action and brand-home action
|
|
141
227
|
|
|
142
|
-
|
|
143
|
-
-
|
|
228
|
+
### Carousel Control
|
|
229
|
+
- Type: button
|
|
230
|
+
- Background: `rgba(0,0,0,0.5)`
|
|
144
231
|
- Text: `#ffffff`
|
|
145
|
-
- Border: none
|
|
146
|
-
- Radius:
|
|
147
|
-
- Padding:
|
|
148
|
-
- Height:
|
|
149
|
-
- Font:
|
|
150
|
-
-
|
|
151
|
-
|
|
152
|
-
**Category Pill (navigation count badges — "63", "175", "6K")**
|
|
153
|
-
- Background: transparent
|
|
154
|
-
- Text: `rgba(93, 93, 93, 0.64)`
|
|
155
|
-
- Border: none
|
|
156
|
-
- Radius: 4px (inherited from container)
|
|
157
|
-
- Padding: 0
|
|
158
|
-
- Height: 52px (tap target, not visual height)
|
|
159
|
-
- Font: 16px Pretendard Variable weight 400
|
|
160
|
-
- Use: Category nav row count badges — number-only, large tap target, no visual chrome
|
|
161
|
-
|
|
162
|
-
**Sale Discount Pill** (product card overlay)
|
|
163
|
-
- Background: `#ffffff` or transparent
|
|
164
|
-
- Text: `#ff0066` (sale red)
|
|
165
|
-
- Border: none
|
|
166
|
-
- Radius: 0px
|
|
167
|
-
- Font: 12px weight 700
|
|
168
|
-
- Use: Percent-off badge on product cards, often paired with the price
|
|
232
|
+
- Border: none observed
|
|
233
|
+
- Radius: 9999px
|
|
234
|
+
- Padding: 14px
|
|
235
|
+
- Height: 52px
|
|
236
|
+
- Font: 16px at weight 400
|
|
237
|
+
- States: disabled, focus, hover, and pressed captured
|
|
238
|
+
- Use: product-image previous and next controls
|
|
169
239
|
|
|
170
|
-
###
|
|
240
|
+
### Product Grid Item
|
|
241
|
+
- Type: listItem
|
|
242
|
+
- Background: transparent
|
|
243
|
+
- Radius: 4px
|
|
244
|
+
- Content: image, brand, name, `#ff4800` discount text, price, and shipping caption
|
|
245
|
+
- Use: BEST result grid
|
|
171
246
|
|
|
172
|
-
|
|
173
|
-
-
|
|
174
|
-
-
|
|
175
|
-
- Radius: 0px on the outer container; image inherits 0px (square / hard-edged)
|
|
176
|
-
- Padding: image full-bleed; caption block has 16-20px top padding
|
|
177
|
-
- Shadow: none — relies on photography and whitespace for separation
|
|
178
|
-
- Title: 22px / 700 / `#000000` / lh 29.92px sitting directly under the image
|
|
179
|
-
- Body: 15px / 400 / `#000000` / lh 22.5px
|
|
180
|
-
- Use: The dominant homepage unit — themed brand stories, lookbooks, editor curations
|
|
181
|
-
|
|
182
|
-
**Product Card**
|
|
183
|
-
- Background: `#ffffff`
|
|
184
|
-
- Border: none
|
|
247
|
+
### Editorial Story Item
|
|
248
|
+
- Type: listItem
|
|
249
|
+
- Background: transparent
|
|
185
250
|
- Radius: 0px
|
|
186
|
-
-
|
|
187
|
-
-
|
|
188
|
-
- Price: 12px / 700 / `#000000` (or red `#ff0066` if on sale)
|
|
189
|
-
- Caption ("옵션비 별도", "무료배송"): 12px / 400 / `rgba(93,93,93,0.64)`
|
|
190
|
-
- Spacing: 8-12px between rows of the card meta block
|
|
191
|
-
- Use: Standard catalog item — image-first, text small, no chrome
|
|
192
|
-
|
|
193
|
-
### Inputs & Forms
|
|
251
|
+
- Content: large editorial media with story metadata
|
|
252
|
+
- Use: 29Magazine and Showcase lists
|
|
194
253
|
|
|
254
|
+
### Quantity Input
|
|
255
|
+
- Type: input
|
|
195
256
|
- Background: `#ffffff`
|
|
196
|
-
-
|
|
257
|
+
- Text: `#000000`
|
|
258
|
+
- Border: `1px solid #dddddd`
|
|
197
259
|
- Radius: 0px
|
|
198
|
-
-
|
|
199
|
-
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
- Header background: `#ffffff` (transparent over hero on scroll)
|
|
204
|
-
- Layout: logo center / utility links left and right at 16px / weight 200
|
|
205
|
-
- Primary category row: 16-30px Latin labels, weight 700-800 active, 200 inactive
|
|
206
|
-
- Logo: 29CM wordmark — see Logo asset
|
|
207
|
-
- Sticky behaviour: header stays, drops the secondary category row after scroll
|
|
208
|
-
- Mobile: hamburger toggle, full-screen sheet with same hierarchy
|
|
260
|
+
- Height: 36px
|
|
261
|
+
- Font: 16px at weight 500
|
|
262
|
+
- States: default captured; no visually distinct changed focus style was observed
|
|
263
|
+
- Use: product-detail quantity field
|
|
209
264
|
|
|
210
|
-
|
|
265
|
+
The collector found 68 component variants across the five routes: 40 button variants, 27 list-item variants, and one input variant. No safe click expansion was executed because the candidate interactions could mutate navigation or commerce state; pseudo-state capture still recorded disabled, focus, hover, and pressed variants where available.
|
|
211
266
|
|
|
212
|
-
|
|
213
|
-
- Padding: 20px 48px 48px (asymmetric — tight top, generous bottom)
|
|
214
|
-
- Section headings: 13px / weight 700 / `#000000`, all-caps Latin (`NOTICE`, `ABOUT US`, `MY ORDER`, `MY ACCOUNT`, `HELP`)
|
|
215
|
-
- Body links: ~13-14px / weight 400 / `#000000`
|
|
216
|
-
- No background tint, no top border — the footer is just more whitespace with denser type
|
|
267
|
+
---
|
|
217
268
|
|
|
218
|
-
|
|
269
|
+
**Verified:** 2026-07-11 (five-surface live recapture and deterministic reconciliation)
|
|
270
|
+
**Tier 1 sources:** https://www.29cm.co.kr/ , https://www.29cm.co.kr/best-products?period=HOURLY&ranking=POPULARITY&gender=F&age=30 , https://www.29cm.co.kr/content/29magazine , https://www.29cm.co.kr/store/showcase , https://www.29cm.co.kr/products/3970725
|
|
271
|
+
**Tier 2 sources:** https://getdesign.md/29cm returned “No designs found for 29cm”; https://styles.refero.design/?q=29CM exposed no 29CM-specific style result in the rendered search path inspected on 2026-07-11.
|
|
272
|
+
**Conflicts unresolved:** none
|
|
219
273
|
|
|
220
|
-
|
|
221
|
-
- **Trailing-arrow on ghost CTAs.** "더보기" buttons carry a thin `>` chevron at the right — the only systematic icon use on marketing surfaces.
|
|
222
|
-
- **Sale red as the single accent.** When a percent-off ribbon appears on a product, it is the only chromatic moment on that tile. The restraint makes it work.
|
|
274
|
+
Current live evidence supersedes the prior pink accent, `#c4c4c4` outline, 22px/700 editorial title, and radius-ceiling assumptions.
|
|
223
275
|
|
|
224
|
-
|
|
276
|
+
## 5. Layout Principles
|
|
225
277
|
|
|
226
|
-
|
|
227
|
-
**Tier 1 sources:** www.29cm.co.kr/ (live DOM inspect, Pretendard Variable + #000/#fff + 22px/700 editorial cards + 1px `#c4c4c4` ghost CTAs + 2px-radius floating black CTAs — confirmed via getComputedStyle on home surface, scroll-loaded editorial tiles, footer, and floating help affordances)
|
|
228
|
-
**Tier 2 sources:** getdesign.md/29cm — *no entry returned* ("No designs found for '29cm'"); styles.refero.design/?q=29cm — *no 29CM-tagged styles found* (search returned generic editorial/gallery references unrelated to 29CM)
|
|
229
|
-
**Conflicts unresolved:** none — Tier 2 was silent on every claim, so Tier 1 live observation is the sole source. Token values in this section come exclusively from live `getComputedStyle()` on www.29cm.co.kr 2026-05-13.
|
|
278
|
+
The observed surfaces alternate between wide editorial storytelling and dense commerce lists. Home and magazine reserve large blocks for imagery and navigation; BEST compresses repeated product metadata; product detail separates gallery controls from the purchase panel. Preserve those surface-specific densities instead of forcing one universal card grid.
|
|
230
279
|
|
|
231
|
-
|
|
280
|
+
The canonical spacing samples are 2px, 4px, 8px, 16px, 24px, and 28px. They are measured reusable values, not a claim that every page follows a strict mathematical scale. Product and story lists should use their native list-item structure so a renderer can preserve image, label, title, price, and flag relationships.
|
|
232
281
|
|
|
233
|
-
|
|
234
|
-
- Base unit: 4px (derived from 4-8-12-16-20-24-32-48 cascade observed in padding values)
|
|
235
|
-
- Page horizontal margin: 48px desktop, ~16-20px mobile
|
|
236
|
-
- Editorial tile gap: 24-32px between major sections
|
|
237
|
-
- Card meta gap (image → title → price): 8-12px between rows
|
|
238
|
-
- Footer block padding: 20px top / 48px bottom — asymmetric, generous at the bottom
|
|
239
|
-
|
|
240
|
-
### Grid & Container
|
|
241
|
-
- Max content width: ~1280px centered, with full-bleed exceptions for hero editorial
|
|
242
|
-
- Editorial grid: 2-column on tablet, 3-4 column on desktop for product tiles, 1-2 column for PT/Magazine stories
|
|
243
|
-
- Hero: typically full-bleed image with 30px/700 caption sitting beneath, not overlaid
|
|
244
|
-
- Category nav row: horizontal scroll on mobile, fully visible on desktop
|
|
245
|
-
|
|
246
|
-
### Whitespace Philosophy
|
|
247
|
-
- **Whitespace is the brand asset.** 29CM treats empty space the way Apple treats it on iPhone hero pages — as proof that the curation was tight enough to remove rather than add.
|
|
248
|
-
- **Photography is the second voice.** Image columns are oversized relative to text columns; captions stay short and well-set rather than competing with the image.
|
|
249
|
-
- **Price is not the destination.** The vertical rhythm of a product card — image, title, price — keeps price last so the user reads narrative before number.
|
|
250
|
-
|
|
251
|
-
### Border Radius Scale
|
|
252
|
-
- 0px: Images, editorial tiles, search inputs, category labels — most surfaces
|
|
253
|
-
- 2px: Inverted black CTAs (`FAQ`, `1:1 문의`) — the smallest radius in the system, used on the highest-contrast control
|
|
254
|
-
- 4px: Ghost outline buttons (`더보기`), boxed form inputs on PDP
|
|
255
|
-
- No pill shapes, no >8px radii anywhere on the marketing surface
|
|
282
|
+
The captured radius vocabulary is 2px, 4px, 10px, and 9999px, plus square 0px surfaces. Fully round geometry is valid for image-carousel controls; the earlier rule that prohibited radii above 8px was incorrect.
|
|
256
283
|
|
|
257
284
|
## 6. Depth & Elevation
|
|
258
285
|
|
|
259
|
-
|
|
|
260
|
-
|
|
261
|
-
| Flat
|
|
262
|
-
|
|
|
263
|
-
|
|
|
264
|
-
|
|
|
265
|
-
| Focus | 2px black outline offset | Keyboard focus ring on interactive elements |
|
|
286
|
+
| Treatment | Captured use |
|
|
287
|
+
|---|---|
|
|
288
|
+
| Flat, no shadow | Page, editorial story items, and product list items |
|
|
289
|
+
| `1px solid #dddddd` | Ghost outline action and quantity input |
|
|
290
|
+
| `rgba(0,0,0,0.5)` overlay | Product-gallery carousel control |
|
|
291
|
+
| Full-round geometry | 52px carousel controls |
|
|
266
292
|
|
|
267
|
-
|
|
293
|
+
The canonical shadow token is `none`. This does not imply that every transient or uninspected surface lacks elevation; it means no reusable box-shadow could be promoted from the five captured public routes.
|
|
268
294
|
|
|
269
295
|
## 7. Do's and Don'ts
|
|
270
296
|
|
|
271
297
|
### Do
|
|
272
|
-
- Use Pretendard Variable
|
|
273
|
-
-
|
|
274
|
-
-
|
|
275
|
-
-
|
|
276
|
-
-
|
|
277
|
-
-
|
|
278
|
-
-
|
|
279
|
-
- Mix Latin labels (Special-Order, Showcase, 29Magazine) at display sizes with Korean body copy at smaller sizes.
|
|
298
|
+
- Use loaded `Pretendard Variable` as the canonical text family.
|
|
299
|
+
- Keep `#000000` and `#ffffff` as structural colors and `#ff4800` for observed sale text.
|
|
300
|
+
- Reproduce the 40px/700 navigation, 23px/600 editorial title, and compact 10–13px product metadata as distinct roles.
|
|
301
|
+
- Use `#dddddd` for the verified outline and quantity borders.
|
|
302
|
+
- Preserve list-item semantics for product grids and editorial story collections.
|
|
303
|
+
- Allow full-round product-gallery controls where the live component uses them.
|
|
304
|
+
- Distinguish loaded fonts from declared-only font resources.
|
|
280
305
|
|
|
281
306
|
### Don't
|
|
282
|
-
- Don't
|
|
283
|
-
- Don't
|
|
284
|
-
- Don't
|
|
285
|
-
- Don't
|
|
286
|
-
- Don't
|
|
287
|
-
- Don't
|
|
288
|
-
- Don't
|
|
289
|
-
- Don't use decorative iconography on hero — the image is the decoration.
|
|
307
|
+
- Don't restore `#ff0066` or `#ff003c` as the current discount accent.
|
|
308
|
+
- Don't render discount text as a filled pill; the captured treatment is transparent with 0px radius.
|
|
309
|
+
- Don't promote Campton or swiper-icons to a canonical text family without observed usage.
|
|
310
|
+
- Don't assert that 4px is the maximum radius.
|
|
311
|
+
- Don't invent mobile breakpoints, motion timings, semantic state colors, or focus treatments that were not captured.
|
|
312
|
+
- Don't combine editorial and product metadata into a single generic typography style.
|
|
313
|
+
- Don't replace `#dddddd` with the obsolete `#c4c4c4` outline claim.
|
|
290
314
|
|
|
291
315
|
## 8. Responsive Behavior
|
|
292
316
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
| Large Desktop | >1440px | 1280px max centered content, generous margins flanking |
|
|
300
|
-
|
|
301
|
-
### Touch Targets
|
|
302
|
-
- Category badge buttons: 52px tap height even when visually smaller
|
|
303
|
-
- Floating CTAs ("FAQ", "1:1 문의"): 31px height — minimum acceptable on mobile, paired with 8-12px padding
|
|
304
|
-
- Editorial tiles: full tile is tappable, no separate "view" button
|
|
305
|
-
|
|
306
|
-
### Collapsing Strategy
|
|
307
|
-
- Section headlines: 30px → 22px on mobile, weight 700 maintained
|
|
308
|
-
- Nav row: full horizontal list → hamburger sheet
|
|
309
|
-
- Product grid: 4-column → 2-column on mobile, image-aspect maintained
|
|
310
|
-
- Page margin: 48px → 16-20px on mobile
|
|
311
|
-
- Floating help CTA: stays bottom-right at all viewports — the one consistent control
|
|
312
|
-
|
|
313
|
-
### Image Behavior
|
|
314
|
-
- Editorial photography: full-bleed at all sizes; aspect ratio held
|
|
315
|
-
- Product cards: square or 4:5 portrait, maintained on mobile
|
|
316
|
-
- No lazy-load skeletons styled as cards — placeholder is a flat grey block, no shimmer
|
|
317
|
+
The July 11 evidence set validates current desktop layouts and component geometry. It does not provide enough controlled multi-viewport samples to canonize breakpoints or mobile transformations.
|
|
318
|
+
|
|
319
|
+
- Preserve image aspect ratio and metadata order when adapting product and story list items.
|
|
320
|
+
- Keep the full 52px carousel control target when space permits; verify any compact mobile variant separately.
|
|
321
|
+
- Retain semantic list and button structure at every viewport.
|
|
322
|
+
- Treat navigation collapse, mobile column counts, tablet gutters, and fixed-position help behavior as `[FILL IN: controlled multi-viewport capture required]`.
|
|
317
323
|
|
|
318
324
|
## 9. Agent Prompt Guide
|
|
319
325
|
|
|
320
|
-
### Quick
|
|
321
|
-
-
|
|
322
|
-
-
|
|
323
|
-
- Muted
|
|
324
|
-
-
|
|
325
|
-
- Sale
|
|
326
|
-
-
|
|
327
|
-
-
|
|
328
|
-
-
|
|
329
|
-
-
|
|
330
|
-
-
|
|
331
|
-
- Editorial body: 15px / 400 / lh 22.5px
|
|
326
|
+
### Quick token reference
|
|
327
|
+
- Canvas: `#ffffff`
|
|
328
|
+
- Foreground and primary: `#000000`
|
|
329
|
+
- Muted: `#5d5d5d`
|
|
330
|
+
- Secondary and tertiary ink: `#303033`, `#474747`
|
|
331
|
+
- Sale accent: `#ff4800`
|
|
332
|
+
- Border: `#dddddd`
|
|
333
|
+
- Font: `Pretendard Variable`
|
|
334
|
+
- Navigation: 40px / 700 / 60px
|
|
335
|
+
- Editorial title: 23px / 600 / 29.9px
|
|
336
|
+
- Product brand: 11px / 700
|
|
332
337
|
- Product name: 12px / 400
|
|
333
|
-
- Product price:
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
-
|
|
338
|
-
-
|
|
339
|
-
-
|
|
340
|
-
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
1. Always use Pretendard Variable — it is the brand font; do not substitute Noto Sans KR or Apple SD Gothic Neo unless the runtime cannot load Pretendard.
|
|
344
|
-
2. Default to `#000000` on `#ffffff`. Reach for `rgba(93,93,93,0.64)` only for secondary captions. Reach for any other colour only if you can name a specific brand reason.
|
|
345
|
-
3. Editorial card titles are 22px/700 with 29.92px line-height. This pair is the single most distinctive typographic unit in the system — replicate it precisely.
|
|
346
|
-
4. Product price is 12px/700 and lives under the title, not above. Inverting this order is the most common mistake when adapting other commerce designs to 29CM.
|
|
347
|
-
5. Radius scale is 0 / 2 / 4 — never 8, never pill. The 4px ghost button is the largest radius on the marketing surface.
|
|
348
|
-
6. White space is the brand. If a layout feels "empty", you are probably close to correct. Resist the urge to fill.
|
|
349
|
-
7. The inverted black CTA is high-cost. Use it once or twice per screen at most.
|
|
350
|
-
8. Photography does the visual heavy lifting. If you have weak imagery, no amount of typography will recover the 29CM register.
|
|
338
|
+
- Product price and discount: 13px / 700
|
|
339
|
+
- Product flag: 10px / 500
|
|
340
|
+
|
|
341
|
+
### Construction prompts
|
|
342
|
+
- “Build a 29CM ghost action with a white background, black 14px/700 text, 1px `#dddddd` border, 4px radius, 52px height, and 16px 16px 16px 20px padding.”
|
|
343
|
+
- “Build a BEST product list item with image, 11px/700 brand, 12px/400 product name, transparent `#ff4800` 13px/700 discount text, 13px/700 price, and 10px/500 shipping flag.”
|
|
344
|
+
- “Build a product-gallery control at 52px square with `rgba(0,0,0,0.5)` background, white icon, 14px padding, and 9999px radius. Include disabled, focus, hover, and pressed variants.”
|
|
345
|
+
- “Build a quantity input at 36px height with white background, black 16px/500 text, 1px `#dddddd` border, and 0px radius.”
|
|
346
|
+
|
|
347
|
+
Use the exact component evidence before extrapolating. If a requested state, viewport, or pattern is absent, mark it for capture rather than filling it with a generic commerce convention.
|
|
351
348
|
|
|
352
349
|
---
|
|
353
350
|
|
|
354
351
|
## 10. Voice & Tone
|
|
355
352
|
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
| Context | Tone |
|
|
359
|
-
|---|---|
|
|
360
|
-
| Editorial card titles | Short Korean phrases, often poetic or sensory (`나폴리의 산들바람`, `쿨링 시스템`). No imperatives. |
|
|
361
|
-
| Editorial card body | One sensory sentence + invitation. `스치는 바람처럼 여유로운 여름을 담은 지노키오의 여름 컬렉션을 같이 구경해요.` — the verb endings (`~해요`) are friendly-formal, never `~합니다`. |
|
|
362
|
-
| Product names | Brand-led, restrained — `[29CM 단독] (uni)Breeze 아이보리 솔리드 파자마`. Brackets carry exclusivity markers. |
|
|
363
|
-
| CTAs | `더보기`, `자세히 보기`, `장바구니 담기`. Bare verb-stems with `~기` endings. Never English (`SHOP NOW`), never exclamatory. |
|
|
364
|
-
| Price captions | Bare numerals + `원` later in the line. Modifier captions (`옵션비 별도`, `무료배송`) sit quietly under the price in muted grey. |
|
|
365
|
-
| PT (Presentation) copy | Long-form editorial — opens with a thesis sentence, then product context, then story. Reads like a Brunch essay. |
|
|
366
|
-
| Push / email | Same magazine register — `오늘의 컬렉션을 큐레이션했어요` rather than `세일 시작! 지금 클릭!`. |
|
|
367
|
-
| Empty states | Single Korean line explaining the absence — `아직 찜한 상품이 없어요`. Never `데이터가 없습니다`. |
|
|
353
|
+
The current site title identifies 29CM as “감도 깊은 취향 셀렉트샵 29CM.” Public navigation mixes Korean utility language with English editorial labels such as BEST, Showcase, and 29Magazine. Product grids use concise brand, item, discount, price, and shipping strings; editorial surfaces allow longer story titles.
|
|
368
354
|
|
|
369
|
-
|
|
355
|
+
These observations establish interface examples, not a complete official writing standard. They support one practical boundary: navigation and commerce metadata stay concise, while editorial stories may use longer, curatorial language. A current official voice-and-tone guide was not located, so this reference does not invent forbidden phrases, sentence endings, push copy, or error-copy rules. Future claims in those areas require first-party guidance or a captured product state.
|
|
370
356
|
|
|
371
357
|
## 11. Brand Narrative
|
|
372
358
|
|
|
373
|
-
29CM
|
|
359
|
+
29CM presents itself on its current official storefront as “감도 깊은 취향 셀렉트샵.” The five inspected surfaces support an observable editorial-commerce positioning through magazine stories, showcases, catalog ranking, and product purchase flows.
|
|
374
360
|
|
|
375
|
-
The
|
|
361
|
+
The current first-party surfaces describe the product posture but do not establish a name origin, founding mythology, mission, ownership narrative, or unpublished brand-book structure. Those topics remain omitted until a current official source is available. This preserves the useful observable story—editorial discovery leading into purchase—without converting third-party history or plausible interpretation into brand fact.
|
|
376
362
|
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
What 29CM refuses: discount-led merchandising (no permanent sale banners), demographic segmentation (age/gender bins are replaced by taste-based personas), urgency theatre (no countdowns, no "마감 임박"), and decorative chrome (no gradients, no shadows, no brand colour beyond black-on-white). What it embraces: long-form editorial inside the storefront, photography as the primary voice, Korean as the primary language with English borrowed from magazine convention, and the conviction that the customer is a reader first and a buyer second.
|
|
363
|
+
Across those surfaces, curation is expressed structurally rather than through a large set of brand effects. Magazine and Showcase create context around objects; BEST compresses comparison into a ranked grid; product detail translates that interest into price, option, delivery, and purchase information. The same black-and-white restraint lets imagery and selection do the expressive work. This is the supported narrative boundary: 29CM behaves like an editor inside a store, while claims about internal brand doctrine remain absent until first-party publication.
|
|
380
364
|
|
|
381
365
|
## 12. Principles
|
|
382
366
|
|
|
383
|
-
|
|
384
|
-
*UI implication:* Reserve the top 60-70% of every editorial unit for photography. Captions are subordinates, not co-headlines.
|
|
385
|
-
|
|
386
|
-
2. **Price is the punctuation, not the verb.** Product prices render at 12px/700 — the same size as the product name. Promoting price violates the editorial hierarchy and reframes the page as discount commerce.
|
|
387
|
-
*UI implication:* Price never exceeds product-name size on a card. Discount red is a single accent, used sparingly on percent badges only.
|
|
388
|
-
|
|
389
|
-
3. **Whitespace is more expensive than ink.** 29CM's curation is proven by what is removed, not what is added. Page margins of 48px, section gaps of 32px, and an absence of dividers are the brand's structural commitment.
|
|
390
|
-
*UI implication:* Default to more padding, fewer borders. If a layout reads "spacious", you are likely close to correct.
|
|
391
|
-
|
|
392
|
-
4. **One face, three weights, no italic.** Pretendard Variable is the entire typographic system. Emphasis is by weight (400 → 700 → 800). Adding a serif companion or a display face dilutes the editorial register.
|
|
393
|
-
*UI implication:* Reject design contributions that introduce a second family. Bold is the only emphasis primitive.
|
|
394
|
-
|
|
395
|
-
5. **Korean is the primary voice; English is the section label.** Body copy, captions, error states, and onboarding are Korean. English appears at display sizes for navigation categories — borrowed from print-magazine convention, not adopted as parallel UI language.
|
|
396
|
-
*UI implication:* Avoid English microcopy in body strings. Reserve English for top-level category names where it functions as decoration.
|
|
397
|
-
|
|
398
|
-
6. **Restraint is the brand.** The only "colour" is the discount-red badge. The only "elevation" is colour inversion. The only iconography is a trailing chevron. Every additional visual element competes with the photography.
|
|
399
|
-
*UI implication:* Before adding a shadow, a border, an icon, or a colour — name a specific editorial reason. If there isn't one, remove.
|
|
367
|
+
Official published design or brand principles were not located in this verification pass. The following are clearly labeled implementation inferences from the captured UI, not 29CM-authored principles:
|
|
400
368
|
|
|
401
|
-
|
|
402
|
-
|
|
369
|
+
1. **Separate editorial and commerce density.** Large navigation and story titles coexist with compact product metadata.
|
|
370
|
+
2. **Use color sparingly.** Black and white structure the surface; `#ff4800` identifies current sale information.
|
|
371
|
+
3. **Let component geometry follow function.** Story items are square-edged, product items use small corners, and gallery controls are fully round.
|
|
372
|
+
4. **Require observed usage before promoting a resource.** Pretendard Variable is canonical because it loaded and appeared on elements; declared-only fonts are not.
|
|
403
373
|
|
|
404
374
|
## 13. Personas
|
|
405
375
|
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
**지윤 (Jiyoon), 29, Seoul.** Marketing manager at a small lifestyle startup. Opens 29CM on her phone during the commute and on desktop at lunch. Reads PT pieces front-to-back before adding anything to cart — the editorial is the reason she's there. Owns one item from at least 12 different niche Korean brands, none of which she would have discovered on Musinsa. Resists discount notifications; deletes the app immediately if it starts pushing "오늘만" banners.
|
|
409
|
-
|
|
410
|
-
**민호 (Minho), 34, Seongsu.** Industrial designer. Treats 29CM as a curated showroom rather than a shop. Goes to the Seongsu offline store on weekends to handle objects in person, then buys online a week later. Will spend ₩280,000 on a single ceramic vase without flinching but considers a ₩9,900 cable organizer beneath consideration. The brand-story PT format is the deciding factor on every purchase above ₩100,000.
|
|
411
|
-
|
|
412
|
-
**서연 (Seoyeon), 26, Busan.** Recent grad, working her first office job. Uses 29CM as her "taste education" — she follows specific brand collections that 29CM has curated and slowly builds a wardrobe around them. Knows the difference between 29Magazine and Showcase. Reads Lookbook on Sunday evenings like other people read magazines. Has never used a 29CM coupon code.
|
|
413
|
-
|
|
414
|
-
**현우 (Hyeonwoo), 41, Gangnam.** Senior consultant. Buys gifts on 29CM — for partners, clients, parents. The site's editorial framing solves a problem ordinary commerce can't: it produces gift recommendations that feel "considered" rather than "expensive". Trusts the 29CM curation enough to buy without comparison shopping. Reads PT for vocabulary he can use in the card.
|
|
376
|
+
No current first-party persona definitions were verified. Observable task contexts include browsing a curated story, scanning ranked products, comparing product details, and moving from editorial discovery into purchase. Do not treat fictional demographic profiles as brand facts. If persona work is needed, create a separately labeled research artifact with recruitment data, tasks, and behavioral evidence; keep it outside this canonical reference until 29CM publishes or confirms it.
|
|
415
377
|
|
|
416
378
|
## 14. States
|
|
417
379
|
|
|
418
|
-
| State |
|
|
380
|
+
| State | Verified treatment |
|
|
419
381
|
|---|---|
|
|
420
|
-
|
|
|
421
|
-
|
|
|
422
|
-
|
|
|
423
|
-
|
|
|
424
|
-
|
|
|
425
|
-
|
|
|
426
|
-
|
|
|
427
|
-
|
|
|
428
|
-
|
|
|
429
|
-
|
|
|
430
|
-
|
|
431
|
-
|
|
382
|
+
| Default | Captured for buttons, list items, and the product quantity input |
|
|
383
|
+
| Hover | Captured on eligible button controls |
|
|
384
|
+
| Focus | Captured on eligible button controls |
|
|
385
|
+
| Pressed | Captured on eligible button controls |
|
|
386
|
+
| Disabled | Captured on product-gallery controls |
|
|
387
|
+
| Sale | `#ff4800` text, transparent background, 0px radius |
|
|
388
|
+
| Empty | `[FILL IN: dedicated public empty-state capture required]` |
|
|
389
|
+
| Loading | `[FILL IN: dedicated loading-state capture required]` |
|
|
390
|
+
| Error | `[FILL IN: dedicated public error-state capture required]` |
|
|
391
|
+
| Success | `[FILL IN: dedicated public success-state capture required]` |
|
|
392
|
+
|
|
393
|
+
Pseudo-state evidence records visual variants available without executing state-changing commerce interactions. It does not prove every control implements every state.
|
|
432
394
|
|
|
433
395
|
## 15. Motion & Easing
|
|
434
396
|
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|---|---|---|
|
|
439
|
-
| `motion-instant` | 0ms | Toggle flips, like-button state changes |
|
|
440
|
-
| `motion-quick` | 150ms | Hover state on ghost buttons, focus ring fades |
|
|
441
|
-
| `motion-standard` | 250ms | Default — image hover scale, sheet opens, tile reveal |
|
|
442
|
-
| `motion-editorial` | 400ms | Editorial transitions — hero image cross-fade, PT chapter advance |
|
|
443
|
-
| `motion-page` | 350ms | Full-screen route transitions |
|
|
444
|
-
|
|
445
|
-
**Easings:**
|
|
446
|
-
|
|
447
|
-
| Token | Curve | Use |
|
|
448
|
-
|---|---|---|
|
|
449
|
-
| `ease-out` | `cubic-bezier(0.2, 0.0, 0.0, 1.0)` | Appearing — sheets enter, tiles reveal, hovers settle |
|
|
450
|
-
| `ease-in` | `cubic-bezier(0.4, 0.0, 1.0, 1.0)` | Leaving — dismissals, pops |
|
|
451
|
-
| `ease-standard` | `cubic-bezier(0.4, 0.0, 0.2, 1.0)` | Two-way transitions — accordion expand, tab content |
|
|
452
|
-
| `linear` | `linear` | Image scrubbing in editorial galleries — preserves perceptual neutrality |
|
|
453
|
-
|
|
454
|
-
**Signature motions.**
|
|
455
|
-
|
|
456
|
-
1. **Image hover scale.** Hovering an editorial tile scales the image to 1.04 over `motion-standard` with `ease-out`; the surrounding tile chrome does not move. The motion is photographic, not interface — the photograph leans toward the cursor.
|
|
457
|
-
2. **Tile reveal on scroll.** Editorial tiles fade in from opacity 0 with a 12px upward translate over `motion-editorial` with `ease-out`. The stagger between tiles is 80-120ms, mimicking page-turn rhythm rather than dashboard pop-in.
|
|
458
|
-
3. **CTA hover (ghost outline).** The `#c4c4c4` border darkens to `#000000` over `motion-quick`, no fill change. The change is felt, not announced — typical of editorial restraint.
|
|
459
|
-
4. **CTA hover (inverted black).** Background lightens 4% over `motion-quick`. No transform, no shadow added. The brand never animates depth.
|
|
460
|
-
5. **Reduce motion.** If `prefers-reduced-motion: reduce`, all `motion-*` tokens collapse to `motion-instant`. Image hover scale disables. Cross-fades replace translates. The site stays usable; just less kinetic.
|
|
461
|
-
|
|
462
|
-
<!--
|
|
463
|
-
OmD v0.1 Sources — Philosophy Layer (sections 10-15)
|
|
464
|
-
|
|
465
|
-
Direct verification via WebFetch / live inspect (2026-05-13):
|
|
466
|
-
- https://www.29cm.co.kr/ — confirmed homepage tagline "감도 깊은 취향 셀렉트샵 29CM",
|
|
467
|
-
editorial tile structure, Pretendard Variable typography, monochrome palette,
|
|
468
|
-
inverted-black FAQ/1:1 CTA pattern (live getComputedStyle 2026-05-13).
|
|
469
|
-
- https://brunch.co.kr/@likenoothers/11 — confirmed brand book title
|
|
470
|
-
"Guide to better 29CM, 더 나은 29CM를 위한 가이드북", 4-part structure (우리다운
|
|
471
|
-
방식 / 우리의 초상 / 우리만의 목소리 / 그들의 취향), 9 taste-based personas,
|
|
472
|
-
"착하지만 엉뚱한" persona description.
|
|
473
|
-
- https://designcompass.org/2023/08/21/29cm-seongsu/ — confirmed wordmark dot
|
|
474
|
-
motif, ruler-mark visual identity, "변하지 않는 본질" framing, "Guide to
|
|
475
|
-
Better Choice" mission language.
|
|
476
|
-
- https://blog.asiance.com/2021/03/24/vertical-platform-for-mz-generation/ —
|
|
477
|
-
confirmed "C = Commerce, M = Media" name etymology and editorial commerce
|
|
478
|
-
positioning, Musinsa acquisition timeline.
|
|
479
|
-
|
|
480
|
-
Tier 2 (getdesign.md/refero) returned no 29CM-specific entries — §4 token
|
|
481
|
-
values are sourced exclusively from Tier 1 live inspect.
|
|
482
|
-
|
|
483
|
-
Not independently verified — widely documented public facts used:
|
|
484
|
-
- 29CM founding year (2011), Musinsa acquisition (2021).
|
|
485
|
-
- "29CM = 29 centimeters = closest distance to open hearts" — brand's own
|
|
486
|
-
framing as referenced in Asiance and NamuWiki; treated as brand-stated
|
|
487
|
-
mythology rather than externally documented etymology.
|
|
488
|
-
|
|
489
|
-
Personas (§13) are fictional archetypes informed by 29CM's stated taste-based
|
|
490
|
-
9-persona segmentation. Any resemblance to specific individuals is unintended.
|
|
491
|
-
|
|
492
|
-
Interpretive claims (e.g., "the image is the headline", "whitespace is more
|
|
493
|
-
expensive than ink") are editorial readings of the live design surface, not
|
|
494
|
-
documented 29CM statements.
|
|
495
|
-
-->
|
|
397
|
+
`[FILL IN: no canonical motion duration or easing curve was published or extracted in this verification pass.]`
|
|
398
|
+
|
|
399
|
+
The evidence set records static default and pseudo-state snapshots only. Do not infer 150ms/250ms durations, cubic-bezier curves, image scaling, scroll reveals, stagger timing, toast dismissal, or reduced-motion substitutions from the visual captures. A future motion pass should record computed transition properties, animation names, durations, easing, and reduced-motion behavior per component.
|