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
|
@@ -3,693 +3,272 @@ id: zigzag
|
|
|
3
3
|
name: ZIGZAG
|
|
4
4
|
country: KR
|
|
5
5
|
category: ecommerce
|
|
6
|
-
homepage: "https://zigzag.kr"
|
|
7
|
-
primary_color: "#
|
|
6
|
+
homepage: "https://zigzag.kr/"
|
|
7
|
+
primary_color: "#121212"
|
|
8
8
|
logo:
|
|
9
9
|
type: favicon
|
|
10
10
|
slug: "https://www.google.com/s2/favicons?domain=zigzag.kr&sz=256"
|
|
11
|
-
verified: "2026-
|
|
11
|
+
verified: "2026-07-13"
|
|
12
12
|
omd: "0.1"
|
|
13
13
|
ds:
|
|
14
|
-
name: ZIGZAG
|
|
15
|
-
url: "https://
|
|
16
|
-
type:
|
|
17
|
-
description: Kakaostyle
|
|
18
|
-
|
|
14
|
+
name: ZIGZAG Design System (ZDS)
|
|
15
|
+
url: "https://devblog.kakaostyle.com/ko/2024-12-13-1-rebuilding-frontend-design-system/"
|
|
16
|
+
type: system
|
|
17
|
+
description: Official Kakaostyle engineering account of the ZDS rebuild, CSS-variable token work, and product-card unification.
|
|
18
|
+
verification_v2:
|
|
19
|
+
schema: 2
|
|
20
|
+
checked: "2026-07-13"
|
|
21
|
+
surfaces:
|
|
22
|
+
- { id: home, kind: product-home, url: "https://zigzag.kr/", inspected: "2026-07-13" }
|
|
23
|
+
- { id: product-a, kind: product-detail, url: "https://zigzag.kr/catalog/products/145661347", inspected: "2026-07-13" }
|
|
24
|
+
- { id: product-b, kind: product-detail, url: "https://zigzag.kr/catalog/products/162934185", inspected: "2026-07-13" }
|
|
25
|
+
sources:
|
|
26
|
+
- { id: home-live, kind: product-surface, url: "https://zigzag.kr/", captured: "2026-07-13" }
|
|
27
|
+
- { id: product-a-live, kind: product-surface, url: "https://zigzag.kr/catalog/products/145661347", captured: "2026-07-13" }
|
|
28
|
+
- { id: product-b-live, kind: product-surface, url: "https://zigzag.kr/catalog/products/162934185", captured: "2026-07-13" }
|
|
29
|
+
- { id: zds-engineering, kind: official-doc, url: "https://devblog.kakaostyle.com/ko/2024-12-13-1-rebuilding-frontend-design-system/", captured: "2026-07-13" }
|
|
30
|
+
- { id: pretendard-license, kind: license, url: "https://github.com/orioncactus/pretendard/blob/main/LICENSE", captured: "2026-07-13" }
|
|
31
|
+
conflicts: []
|
|
32
|
+
claims:
|
|
33
|
+
"tokens.colors.strong": &product_a { surface_id: product-a, source_id: product-a-live, method: computed-style, captured: "2026-07-13" }
|
|
34
|
+
"tokens.colors.canvas": &home { surface_id: home, source_id: home-live, method: computed-style, captured: "2026-07-13" }
|
|
35
|
+
"tokens.colors.foreground": *home
|
|
36
|
+
"tokens.colors.secondary": *product_a
|
|
37
|
+
"tokens.colors.muted": *home
|
|
38
|
+
"tokens.colors.hairline": *home
|
|
39
|
+
"tokens.typography.heading.size": *product_a
|
|
40
|
+
"tokens.typography.heading.weight": *product_a
|
|
41
|
+
"tokens.typography.heading.lineHeight": *product_a
|
|
42
|
+
"tokens.typography.heading.tracking": *product_a
|
|
43
|
+
"tokens.typography.heading.use": *product_a
|
|
44
|
+
"tokens.typography.body.size": *home
|
|
45
|
+
"tokens.typography.body.weight": *home
|
|
46
|
+
"tokens.typography.body.lineHeight": *home
|
|
47
|
+
"tokens.typography.body.use": *home
|
|
48
|
+
"tokens.typography.metadata.size": *product_a
|
|
49
|
+
"tokens.typography.metadata.weight": *product_a
|
|
50
|
+
"tokens.typography.metadata.lineHeight": *product_a
|
|
51
|
+
"tokens.typography.metadata.tracking": *product_a
|
|
52
|
+
"tokens.typography.metadata.use": *product_a
|
|
53
|
+
"tokens.spacing.xs": *home
|
|
54
|
+
"tokens.spacing.sm": *home
|
|
55
|
+
"tokens.spacing.md": *home
|
|
56
|
+
"tokens.spacing.lg": *product_a
|
|
57
|
+
"tokens.rounded.square": *home
|
|
58
|
+
"tokens.rounded.icon": *home
|
|
59
|
+
"tokens.rounded.control": *product_a
|
|
60
|
+
"tokens.rounded.full": *product_a
|
|
61
|
+
"tokens.shadow.flat": *home
|
|
62
|
+
"tokens.components.product-thumbnail.type": *product_a
|
|
63
|
+
"tokens.components.product-thumbnail.bg": *product_a
|
|
64
|
+
"tokens.components.product-thumbnail.radius": *product_a
|
|
65
|
+
"tokens.components.product-thumbnail.use": *product_a
|
|
66
|
+
"tokens.components.product-card.type": *product_a
|
|
67
|
+
"tokens.components.product-card.radius": *product_a
|
|
68
|
+
"tokens.components.product-card.padding": *product_a
|
|
69
|
+
"tokens.components.product-card.use": *product_a
|
|
70
|
+
"tokens.components.detail-tab.type": *product_a
|
|
71
|
+
"tokens.components.detail-tab.fg": *product_a
|
|
72
|
+
"tokens.components.detail-tab.radius": *product_a
|
|
73
|
+
"tokens.components.detail-tab.padding": *product_a
|
|
74
|
+
"tokens.components.detail-tab.font": *product_a
|
|
75
|
+
"tokens.components.detail-tab.states": *product_a
|
|
76
|
+
"tokens.components.detail-tab.use": *product_a
|
|
77
|
+
"tokens.components.quick-menu-arrow.type": *home
|
|
78
|
+
"tokens.components.quick-menu-arrow.bg": *home
|
|
79
|
+
"tokens.components.quick-menu-arrow.fg": *home
|
|
80
|
+
"tokens.components.quick-menu-arrow.border": *home
|
|
81
|
+
"tokens.components.quick-menu-arrow.radius": *home
|
|
82
|
+
"tokens.components.quick-menu-arrow.states": *home
|
|
83
|
+
"tokens.components.quick-menu-arrow.use": *home
|
|
19
84
|
tokens:
|
|
20
|
-
source:
|
|
21
|
-
extracted: "2026-
|
|
85
|
+
source: reconciled
|
|
86
|
+
extracted: "2026-07-13"
|
|
87
|
+
note: "Three current public product surfaces. Current computed Pretendard JP did not match a loaded FontFace, so no font family is promoted. The legacy pink palette and unobserved commerce states were removed."
|
|
22
88
|
colors:
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
canvas: "#f5f6f6"
|
|
30
|
-
surface: "#ffffff"
|
|
31
|
-
on-surface: "#f9fafa"
|
|
32
|
-
heading: "#121212"
|
|
33
|
-
body: "#292b2b"
|
|
34
|
-
text-secondary: "#a1a9ad"
|
|
35
|
-
text-tertiary: "#878f91"
|
|
36
|
-
text-disabled: "#b3babd"
|
|
37
|
-
border: "#ecedee"
|
|
38
|
-
border-strong: "#d0d4d6"
|
|
39
|
-
border-active: "#c6cbcd"
|
|
40
|
-
on-primary: "#ffffff"
|
|
41
|
-
sale: "#fb4333"
|
|
42
|
-
ai: "#7463f2"
|
|
43
|
-
kakao: "#fee500"
|
|
44
|
-
success: "#51aa5b"
|
|
45
|
-
error: "#e84747"
|
|
89
|
+
strong: "#121212"
|
|
90
|
+
canvas: "#ffffff"
|
|
91
|
+
foreground: "#292b2b"
|
|
92
|
+
secondary: "#606567"
|
|
93
|
+
muted: "#878f91"
|
|
94
|
+
hairline: "#ecedee"
|
|
46
95
|
typography:
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
body-13: { size: 13, weight: 400, lineHeight: 1.23, tracking: 0, use: "Tertiary meta, review count, ratings" }
|
|
54
|
-
caption-12: { size: 12, weight: 400, lineHeight: 1.17, tracking: 0, use: "Tag chip text, timestamps" }
|
|
55
|
-
caption-11: { size: 11, weight: 600, lineHeight: 1.18, tracking: 0, use: "Micro labels, badges, tab labels" }
|
|
56
|
-
spacing: { xs: 4, sm: 8, md: 12, base: 16, lg: 24, xl: 32, xxl: 40 }
|
|
57
|
-
rounded: { sm: 4, md: 8, lg: 12, full: 9999 }
|
|
58
|
-
shadow:
|
|
59
|
-
subtle: "0px 1px 2px rgba(0,0,0,0.05)"
|
|
60
|
-
standard: "0px 2px 8px rgba(0,0,0,0.08)"
|
|
61
|
-
elevated: "0px 4px 16px rgba(0,0,0,0.12)"
|
|
62
|
-
modal: "0px 8px 32px rgba(0,0,0,0.16)"
|
|
63
|
-
components:
|
|
64
|
-
button-primary: { type: button, bg: "#f55dd6", fg: "#ffffff", radius: "12px", padding: "14px 20px", font: "16px / 600", use: "Primary commerce CTA — 구매하기, 장바구니 담기" }
|
|
65
|
-
button-black: { type: button, bg: "#121212", fg: "#ffffff", radius: "12px", padding: "14px 20px", font: "16px / 600", use: "Default primary CTA on non-brand surfaces — 다음, 확인, 주문하기" }
|
|
66
|
-
button-pink-ghost: { type: button, bg: "#ffffff", fg: "#f55dd6", radius: "12px", padding: "13px 19px", font: "16px / 600", use: "Secondary brand action — 찜한 상품 보기, 쿠폰함" }
|
|
67
|
-
button-outlined: { type: button, bg: "#ffffff", fg: "#292b2b", radius: "12px", padding: "13px 19px", font: "16px / 500", use: "Tertiary action — 취소, 더보기" }
|
|
68
|
-
button-kakao: { type: button, bg: "#fee500", fg: "#000000", radius: "12px", padding: "14px 20px", font: "16px / 600", use: "Kakao OAuth entry point only" }
|
|
69
|
-
switch-pink: { type: toggle, bg: "#f55dd6", radius: "9999px", use: "Notification preferences, filter inclusions; track-off gray-80, white thumb" }
|
|
70
|
-
product-card: { type: card, bg: "#ffffff", radius: "8px", use: "Workhorse grid cell; 1:1 thumbnail, title BODY_15 MEDIUM, price BOLD" }
|
|
71
|
-
chip-selected: { type: badge, bg: "#feeefa", fg: "#f55dd6", radius: "9999px", padding: "6px 12px", font: "13px / 500", use: "Filter pill active state" }
|
|
72
|
-
chip-default: { type: badge, bg: "#ffffff", fg: "#393b3d", radius: "9999px", padding: "6px 12px", font: "13px / 500", use: "Filter pill default" }
|
|
73
|
-
chip-ai: { type: badge, bg: "#ffffff", fg: "#7463f2", radius: "9999px", padding: "6px 12px", font: "13px / 600", use: "AI recommendation surfaces only" }
|
|
74
|
-
search-input: { type: input, bg: "#f5f6f6", fg: "#292b2b", radius: "12px", padding: "12px 14px", font: "15px / 400", use: "Header search bar; focus border gray-800, no pink ring" }
|
|
75
|
-
badge-discount: { type: badge, bg: "#fb4333", fg: "#ffffff", radius: "4px", padding: "2px 6px", font: "11px / 700", use: "Discount % on product thumbnails" }
|
|
76
|
-
badge-time: { type: badge, bg: "#121212", fg: "#ffffff", radius: "4px", padding: "4px 8px", font: "11px / 700", use: "Time-limited — 24시간 한정, 오늘만" }
|
|
77
|
-
badge-mdpick: { type: badge, bg: "#ffffff", fg: "#121212", radius: "4px", padding: "2px 6px", font: "10px / 700", use: "Editorial pick markers; 1px black border" }
|
|
78
|
-
bottom-sheet: { type: dialog, bg: "#ffffff", radius: "16px", padding: "8px", use: "Filter sheet, option selector; top corners only, gray-80 drag handle, dimmed backdrop" }
|
|
79
|
-
tab-bottom: { type: tab, bg: "#ffffff", fg: "#878f91", font: "11px / 600", active: "Npx #121212 icon + label", use: "Mobile primary nav — 홈/카테고리/찜/마이페이지/알림" }
|
|
96
|
+
heading: { size: 32, weight: 600, lineHeight: 1.4, tracking: 0, use: "Public product-detail section headings" }
|
|
97
|
+
body: { size: 16, weight: 400, lineHeight: normal, use: "Current page and product-card text" }
|
|
98
|
+
metadata: { size: 14, weight: 500, lineHeight: 1.21, tracking: 0, use: "Product-detail tab and supporting metadata" }
|
|
99
|
+
spacing: { xs: 4, sm: 8, md: 12, lg: 16 }
|
|
100
|
+
rounded: { square: 0, icon: 8, control: 24, full: 9999 }
|
|
101
|
+
shadow: { flat: "none" }
|
|
80
102
|
components_harvested: true
|
|
103
|
+
components:
|
|
104
|
+
product-thumbnail: { type: card, bg: "#ecedee", radius: "0px", use: "Public product-card thumbnail placeholder on both captured product-detail pages" }
|
|
105
|
+
product-card: { type: card, radius: "0px", padding: "0px 0px 8px", use: "Public product-card root on both captured product-detail pages" }
|
|
106
|
+
detail-tab: { type: tab, fg: "#121212", radius: "0px", padding: "0px 4px 17.5px", font: "14px / 600", states: "selected captured; default tab uses #878f91 at 14px / 500", use: "Product-detail tab list on both captured product-detail pages" }
|
|
107
|
+
quick-menu-arrow: { type: button, bg: "transparent", fg: "#000000", border: "1px solid #ecedee", radius: "50%", states: "default captured; previous arrow disabled with rgba(16,16,16,0.3)", use: "Home quick-menu carousel arrow" }
|
|
81
108
|
---
|
|
82
109
|
|
|
83
110
|
# Design System Inspiration of ZIGZAG (지그재그)
|
|
84
111
|
|
|
85
112
|
## 1. Visual Theme & Atmosphere
|
|
86
113
|
|
|
87
|
-
ZIGZAG is
|
|
88
|
-
|
|
89
|
-
The custom design system is internally called **ZDS (ZIGZAG Design System)**, shipped as a token-driven Vanilla Extract (zero-runtime CSS-in-JS) package set since mid-2023 — replacing the team's earlier Emotion-based implementation specifically so every color, type, and corner-radius reference resolves to a CSS variable at build time. Tokens are namespaced in three tiers: `--zds-color-palette-*` (raw scale), `--zds-color-semantic-*` (role-bound), `--zds-color-component-*` (component-bound). The brand pink lives at `--zds-color-semantic-brand-zigzag` and a secondary lighter shade `--zds-color-palette-pink-400: #f55dd6` powers the interactive pink button system.
|
|
114
|
+
ZIGZAG is KakaoStyle's style-commerce service: its public terms describe it as the mobile shopping service through which sellers and users transact, while the company's 2025 brand publication frames the service as a place for people to discover and complete their own tastes. The current public web evidence is deliberately product-led rather than a separate corporate-brand treatment: product photography and dense catalog information occupy the page, with a white `#ffffff` canvas, dark `#292b2b` reading text, muted metadata, and square-to-lightly-rounded geometry. The official ZDS engineering account explains why that consistency matters: Kakaostyle rebuilt the web design system around CSS-variable tokens and unified product-card work across surfaces. This reference preserves that engineering and commerce context, but promotes only the values observed on the three supplied current public product surfaces.
|
|
90
115
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
What truly distinguishes ZIGZAG is its commitment to **mobile-as-canvas at the desktop breakpoint**. The entire experience is locked to a `max-width: 600px` centred column even at 1920px — there is no responsive desktop reflow. The desktop "version" is the mobile version, centred. This is unusual restraint in Korean commerce (Coupang, Musinsa both render dramatically different desktop layouts) and signals a clear brand thesis: the trend-discovery loop happens on phones, so the design should not be optimised for any other surface.
|
|
116
|
+
The inspected home and two product details share a restrained neutral system. `#121212` is the strongest observed detail-tab text, `#292b2b` is the repeated body/card foreground, `#878f91` supports inactive tabs and home list text, and `#ecedee` appears in thumbnail placeholders and thin control borders. The 2025 brand story is marketing context, not an authorization to turn campaign color or copy into a current product token.
|
|
94
117
|
|
|
95
118
|
**Key Characteristics:**
|
|
96
|
-
|
|
97
|
-
-
|
|
98
|
-
-
|
|
99
|
-
-
|
|
100
|
-
-
|
|
101
|
-
-
|
|
102
|
-
- Corner-radius scale 0/2/4/6/8/12/16/20/full — pill (`9999px`) is licensed for chips and bottom-sheet handles only
|
|
103
|
-
- Coral-red (`#fb4333`) as an alert/accent partner color, distinct from the brand pink
|
|
104
|
-
- Brand colors of partners surfaced explicitly: `--zds-color-semantic-brand-kakao: #fee500` (Kakao chrome) and `--zds-color-semantic-brand-selected: #ff4c34` (cross-promo accent)
|
|
119
|
+
|
|
120
|
+
- Three current public product surfaces, not authenticated checkout or native-app screens
|
|
121
|
+
- White canvas with charcoal reading text and cool-gray metadata
|
|
122
|
+
- Product-card root, thumbnail, metadata, and tab substructures observed in current public markup
|
|
123
|
+
- 0px card geometry, 8px icon corners, 24px action corners, and full-pill carousel controls each tied to a specific observed role
|
|
124
|
+
- No published current pink token is promoted from the supplied product capture
|
|
105
125
|
|
|
106
126
|
## 2. Color Palette & Roles
|
|
107
127
|
|
|
108
|
-
###
|
|
109
|
-
|
|
110
|
-
- **
|
|
111
|
-
- **
|
|
112
|
-
- **
|
|
113
|
-
- **
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
- **Gray 20** (`#f5f6f6`): `--zds-color-semantic-background-base` (light). Page background — the canonical off-white.
|
|
121
|
-
- **Gray 30** (`#ecedee`): `--zds-color-semantic-border-primary` (light). Default borders, dividers.
|
|
122
|
-
- **Gray 50** (`#e2e5e6`): `--zds-color-semantic-fill-primary` (light). Filled surfaces, button ghost backgrounds.
|
|
123
|
-
- **Gray 80** (`#d0d4d6`): Divider strong, secondary borders.
|
|
124
|
-
- **Gray 100** (`#c6cbcd`): `--zds-color-semantic-border-active`.
|
|
125
|
-
- **Gray 200** (`#b3babd`): `--zds-color-semantic-text-disabled` (light).
|
|
126
|
-
- **Gray 250** (`#aab1b5`): Subtle text.
|
|
127
|
-
- **Gray 300** (`#a1a9ad`): `--zds-color-semantic-text-secondary` (light).
|
|
128
|
-
- **Gray 400** (`#878f91`): `--zds-color-semantic-text-tertiary`.
|
|
129
|
-
- **Gray 500** (`#707679`): Mid neutral.
|
|
130
|
-
- **Gray 550** (`#606567`): Secondary text on dark.
|
|
131
|
-
- **Gray 600** (`#505456`): Stronger secondary.
|
|
132
|
-
- **Gray 700** (`#393b3d`): Strong body on light surfaces.
|
|
133
|
-
- **Gray 800** (`#292b2b`): `--zds-color-semantic-text-primary` (light) — the body-text default.
|
|
134
|
-
- **Gray 900** (`#1f2020`): Strong heading.
|
|
135
|
-
- **Gray 950** (`#181818`): Background-surface in dark theme.
|
|
136
|
-
- **Gray 970** (`#121212`): `--zds-color-semantic-text-strong` (light) — display headings.
|
|
137
|
-
- **Gray 990** (`#050505`): Darkest base — dark-theme page background.
|
|
138
|
-
|
|
139
|
-
### Common
|
|
140
|
-
- **Common Black** (`#000`): Pure black, used sparingly for fixed dark chrome.
|
|
141
|
-
- **Common White** (`#fff`): Elevated surfaces, modals, button inverse text.
|
|
142
|
-
|
|
143
|
-
### Accent / Semantic Roles
|
|
144
|
-
- **Coral Red 400** (`#fb4333`): `--zds-color-semantic-accent-primary`. Sale tags, urgency badges, "🔥" promo markers. Distinct from the pink — pink is brand, coral is alert/sale.
|
|
145
|
-
- **Coral Red 50** (`#feecea`), **100** (`#fed9d6`), **300** (`#ff5d4f`), **500** (`#e13c2d`), **600** (`#c83528`), **700** (`#96281e`), **800** (`#701d16`).
|
|
146
|
-
- **Purple 400** (`#7463f2` / `--zds-color-palette-purple-400`): `--zds-color-semantic-accent-purple-primary`. AI-curation chips, "AI 추천" surfaces.
|
|
147
|
-
- **Purple 500** (`#8f82ff`): `--zds-color-semantic-brand-ai-primary` — secondary AI-feature anchor.
|
|
148
|
-
- **Brand Kakao** (`#fee500`): `--zds-color-semantic-brand-kakao`. Kakao-login chrome only — never decorative, never for ZIGZAG-owned CTAs.
|
|
149
|
-
- **Brand Selected** (`#ff4c34`): `--zds-color-semantic-brand-selected`. Cross-promo / co-brand campaign accent.
|
|
150
|
-
- **Brown 400** (`#b26b36`): Editorial accent (lookbook category chrome).
|
|
151
|
-
- **Blue 400** (`#216bff`): Link / info accent. Rare on commerce surfaces — pink is the primary interactive color.
|
|
152
|
-
- **Blue Gray 500** (`#3d4f6f`): Editorial chrome on premium-brand pages.
|
|
153
|
-
|
|
154
|
-
### State Roles
|
|
155
|
-
- **Success Green 500** (`#51aa5b` / `#5ac366`): Order-confirmed, review-submitted toasts.
|
|
156
|
-
- **Error Red** (`#e84747` / `#ff4d4d` / `#c31e18` / `#b21e18`): Payment-failed, validation errors.
|
|
157
|
-
|
|
158
|
-
### Surface & Borders (semantic tokens, light theme resolved)
|
|
159
|
-
- **Background base**: `#f5f6f6` (gray-20)
|
|
160
|
-
- **Background surface (cards)**: `#ffffff` (common-white)
|
|
161
|
-
- **Background on-surface (nested)**: `#f9fafa` (gray-10)
|
|
162
|
-
- **Border primary**: `#ecedee` (gray-30)
|
|
163
|
-
- **Border secondary**: `#d0d4d6` (gray-80)
|
|
164
|
-
- **Border active**: `#c6cbcd` (gray-100)
|
|
165
|
-
- **Text strong**: `#121212` (gray-970)
|
|
166
|
-
- **Text primary (body)**: `#292b2b` (gray-800)
|
|
167
|
-
- **Text secondary**: `#a1a9ad` (gray-300)
|
|
168
|
-
- **Text tertiary**: `#878f91` (gray-400)
|
|
169
|
-
- **Text disabled**: `#b3babd` (gray-200)
|
|
170
|
-
|
|
171
|
-
### Dark Theme Pairings
|
|
172
|
-
ZDS ships full dark-theme token mappings. Light/dark split is value-symmetric: `text-primary` resolves to `gray-800` in light, `gray-50` in dark; `background-base` resolves to `gray-20` in light, `gray-990` in dark. The brand pink does not shift across themes — `#fa6ee3` is constant.
|
|
128
|
+
### Current public product values
|
|
129
|
+
|
|
130
|
+
- **Strong detail text** (`#121212`): selected product-detail tab text and dark carousel navigation fill.
|
|
131
|
+
- **Foreground** (`#292b2b`): repeated body, card, and page text across home and both product details.
|
|
132
|
+
- **Canvas** (`#ffffff`): body and white control surface in the captured public pages.
|
|
133
|
+
- **Secondary** (`#606567`): supporting product-detail text.
|
|
134
|
+
- **Muted** (`#878f91`): inactive product-detail tabs and home list text.
|
|
135
|
+
- **Hairline / placeholder** (`#ecedee`): public product-thumbnail placeholder and 1px carousel-arrow border.
|
|
136
|
+
|
|
137
|
+
### Deliberately unpromoted groups
|
|
138
|
+
|
|
139
|
+
The legacy `#fa6ee3` / `#f55dd6` pink system, sale/status colors, Kakao-login color, dark theme, campaign colors, and hover/pressed values did not occur in the supplied current product evidence. The official ZDS article establishes token architecture, not those absent values on these captured surfaces, so they are omitted instead of reconstructed.
|
|
173
140
|
|
|
174
141
|
## 3. Typography Rules
|
|
175
142
|
|
|
176
|
-
### Font
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
|
191
|
-
|
|
192
|
-
|
|
|
193
|
-
|
|
|
194
|
-
|
|
|
195
|
-
|
|
|
196
|
-
| `CAPTION_12` | 12px | 14px | 16px | Tag chip text, timestamps |
|
|
197
|
-
| `CAPTION_11` | 11px | 13px | 14px | Micro labels — "MD's PICK" badges |
|
|
198
|
-
| `CAPTION_10` | 10px | 12px | 14px | Tiny labels |
|
|
199
|
-
| `CAPTION_9` | 9px | 11px | 12px | Smallest — legal disclaimers |
|
|
200
|
-
| Mono | 12–14px | — | — | Order numbers, receipts |
|
|
201
|
-
|
|
202
|
-
### Weight Modifiers (combined as second class: e.g. `HEAD_22 BOLD`)
|
|
203
|
-
- `.BOLD` — 700 (price emphasis, hero CTAs)
|
|
204
|
-
- `.SEMIBOLD` — 600 (section titles, important labels)
|
|
205
|
-
- `.MEDIUM` — 500 (product names, default emphasized)
|
|
206
|
-
- `.REGULAR` — 400 (body, descriptions)
|
|
207
|
-
|
|
208
|
-
### Principles
|
|
209
|
-
- **Pretendard with Korean fallbacks is non-negotiable.** Hangul rendering parity with Apple SD Gothic Neo / Noto Sans KR is the explicit reason Pretendard is loaded — it's a *systemic* substitute for Apple's proprietary Korean face on non-Apple platforms.
|
|
210
|
-
- **Literal class names over abstract scales.** `BODY_15` beats `--font-size-body-md`. Designers and engineers read DevTools without a translation table.
|
|
211
|
-
- **Multi-line line-height is generous (140%+).** Korean letterforms need vertical air; single-line line-height tracks 1.15–1.21x font-size, multi-line tracks 1.33–1.50x.
|
|
212
|
-
- **No display tracking.** Letter-spacing is `normal` at every size — Korean does not benefit from negative tracking the way Latin display type does.
|
|
213
|
-
- **Price = `BOLD`, name = `MEDIUM`.** Product cards encode the visual hierarchy of commerce: the number is the strongest element, the name supports it.
|
|
143
|
+
### Font evidence boundary
|
|
144
|
+
|
|
145
|
+
| Evidence class | Resolution |
|
|
146
|
+
|---|---|
|
|
147
|
+
| Official product-use | No first-party source inspected in this pass publishes a current universal ZIGZAG font-family claim. |
|
|
148
|
+
| Live computed surface-use | All three public product surfaces compute a stack beginning `"Pretendard JP", Pretendard, -apple-system, system-ui`; 912 visible uses were recorded. |
|
|
149
|
+
| Official distributed asset | Pretendard's own project documents the family and SIL Open Font License, but it is not a ZIGZAG-owned font asset. |
|
|
150
|
+
| Declared-only | `Pretendard`, `swiper-icons`, and `VideoJS` had declarations; only the latter two had data-URL declarations in the collector output. |
|
|
151
|
+
| Unresolved | The computed `Pretendard JP` family had no matching loaded FontFace or source URL in the supplied artifact. It is not promoted to `tokens.typography.family` and has no live specimen. |
|
|
152
|
+
|
|
153
|
+
The public hierarchy was measured as a stack, not a guaranteed loadable type family: product-detail headings reached 32px / 600 / 44.8px, common text was 16px / 400, and tabs/supporting metadata used 14px / 500 or selected 14px / 600. Letter spacing was `normal` throughout the sampled roles.
|
|
154
|
+
|
|
155
|
+
### Observed hierarchy
|
|
156
|
+
|
|
157
|
+
| Role | Size | Weight | Line height | Use |
|
|
158
|
+
|---|---:|---:|---:|---|
|
|
159
|
+
| Product-detail heading | 32px | 600 | 44.8px | Heading roles on both product-detail pages |
|
|
160
|
+
| Current body | 16px | 400 | normal | Page and product-card text |
|
|
161
|
+
| Detail metadata / tab | 14px | 500 | 17px | Inactive tab and supporting text |
|
|
162
|
+
| Selected detail tab | 14px | 600 | 17px | Selected product-detail tab |
|
|
214
163
|
|
|
215
164
|
## 4. Component Stylings
|
|
216
165
|
|
|
217
|
-
###
|
|
218
|
-
|
|
219
|
-
**
|
|
220
|
-
- Background: `#
|
|
221
|
-
-
|
|
222
|
-
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
-
|
|
226
|
-
-
|
|
227
|
-
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
**Primary Black (filled, default surface CTA)**
|
|
231
|
-
- Background: `#121212` (gray-970)
|
|
232
|
-
- Text: `#ffffff`
|
|
233
|
-
- Padding: 14px 20px
|
|
234
|
-
- Radius: 12px
|
|
235
|
-
- Font: 16px Pretendard / weight 600
|
|
236
|
-
- Hover: `#292b2b` background (gray-800)
|
|
237
|
-
- Pressed: `#393b3d` background (gray-700)
|
|
238
|
-
- Use: Default primary CTA on non-brand surfaces — "다음", "확인", "주문하기"
|
|
239
|
-
|
|
240
|
-
**Pink Ghost (white surface)**
|
|
241
|
-
- Background: `#ffffff`
|
|
242
|
-
- Text: `#f55dd6` (pink-400)
|
|
243
|
-
- Border: `1px solid #fccef2` (pink-150)
|
|
244
|
-
- Padding: 13px 19px
|
|
245
|
-
- Radius: 12px
|
|
246
|
-
- Font: 16px Pretendard / weight 600
|
|
247
|
-
- Hover: `rgba(245,93,214,0.08)` background (`--zds-color-component-button-pink-white-hovered`)
|
|
248
|
-
- Pressed: `rgba(245,93,214,0.12)` background (`--zds-color-component-button-pink-white-pressed`)
|
|
249
|
-
- Use: Secondary brand action — "찜한 상품 보기", "쿠폰함"
|
|
250
|
-
|
|
251
|
-
**Outlined Neutral**
|
|
252
|
-
- Background: `#ffffff`
|
|
253
|
-
- Text: `#292b2b` (gray-800)
|
|
254
|
-
- Border: `1px solid #ecedee` (gray-30)
|
|
255
|
-
- Padding: 13px 19px
|
|
256
|
-
- Radius: 12px
|
|
257
|
-
- Font: 16px Pretendard / weight 500
|
|
258
|
-
- Hover: `rgba(0,0,0,0.03)` background
|
|
259
|
-
- Pressed: `rgba(0,0,0,0.05)` background
|
|
260
|
-
- Use: Tertiary action — "취소", "더보기"
|
|
261
|
-
|
|
262
|
-
**Kakao Login (partner-mandated chrome)**
|
|
263
|
-
- Background: `#fee500` (brand-kakao)
|
|
264
|
-
- Text: `#000000` (black) at 85% opacity per Kakao guideline
|
|
265
|
-
- Padding: 14px 20px
|
|
266
|
-
- Radius: 12px
|
|
267
|
-
- Font: 16px Pretendard / weight 600
|
|
268
|
-
- Use: Kakao OAuth entry point only — never reused as a decorative yellow surface
|
|
269
|
-
|
|
270
|
-
### Pink Switch / Toggle
|
|
271
|
-
|
|
272
|
-
**Default**
|
|
273
|
-
- Track on: `#f55dd6` (pink-400)
|
|
274
|
-
- Track off: `#d0d4d6` (gray-80)
|
|
275
|
-
- Thumb: `#ffffff` 24px circle, `0px 2px 4px rgba(0,0,0,0.12)` shadow
|
|
276
|
-
- Radius: `9999px` (full pill)
|
|
277
|
-
- Disabled on: `rgba(245,93,214,0.3)` (`--zds-color-component-switch-on-disabled`)
|
|
278
|
-
- Use: Notification preferences, "찜한 알림 받기", filter inclusions
|
|
279
|
-
|
|
280
|
-
### Product Card (the workhorse component)
|
|
281
|
-
|
|
282
|
-
**Grid Cell (mobile, 2-up)**
|
|
283
|
-
- Background: `#ffffff`
|
|
284
|
-
- Border: none (separation is via spacing)
|
|
285
|
-
- Radius: 8px (thumbnail), 0 (card itself)
|
|
286
|
-
- Thumbnail aspect: 1:1 with rounded 8px corners
|
|
287
|
-
- Like button: 28–32px hit area, top-right `4–6px` inset
|
|
288
|
-
- Emblem/nudge max-width: `calc(100% - 36px)` (mobile) / `calc(100% - 42px)` (tablet) — preserves a no-overlap zone with the like button
|
|
289
|
-
- Pressed state: `rgba(0,0,0,0.03)` overlay (`--zds-color-component-product-card-pressed`)
|
|
290
|
-
- Title: 15px `BODY_15 MEDIUM` `#292b2b`, max 2 lines
|
|
291
|
-
- Brand: 13px `BODY_13 REGULAR` `#878f91`
|
|
292
|
-
- Price (sale): 16px `BODY_16 BOLD` `#fb4333` (coral-red-400)
|
|
293
|
-
- Price (regular): 16px `BODY_16 BOLD` `#121212`
|
|
294
|
-
- Original price (strike): 13px `BODY_13 REGULAR` `#a1a9ad` with line-through
|
|
295
|
-
- Discount rate: 14px `BODY_14 BOLD` `#fb4333` — always before the sale price
|
|
296
|
-
- Rating: 12px `CAPTION_12 SEMIBOLD` `#292b2b` + star glyph + review count in parens
|
|
297
|
-
|
|
298
|
-
### Chip / Filter Pill
|
|
299
|
-
|
|
300
|
-
**Selected (Pink)**
|
|
301
|
-
- Background: `rgba(245,93,214,0.08)` (`--zds-color-palette-pink-400-opacity-8`)
|
|
302
|
-
- Text: `#f55dd6` (pink-400)
|
|
303
|
-
- Border: `1px solid #fccef2` (pink-150)
|
|
304
|
-
- Padding: 6px 12px
|
|
305
|
-
- Radius: 9999px (full pill)
|
|
306
|
-
- Font: 13px `BODY_13 MEDIUM`
|
|
307
|
-
- Use: Filter pill active state — "지금 핫한 상품", "신상품만"
|
|
308
|
-
|
|
309
|
-
**Default**
|
|
310
|
-
- Background: `#ffffff`
|
|
311
|
-
- Text: `#393b3d` (gray-700)
|
|
312
|
-
- Border: `1px solid #ecedee` (gray-30)
|
|
313
|
-
- Padding: 6px 12px
|
|
314
|
-
- Radius: 9999px
|
|
315
|
-
- Font: 13px `BODY_13 MEDIUM`
|
|
316
|
-
|
|
317
|
-
**AI Recommendation**
|
|
318
|
-
- Background: `rgba(116,99,242,0.08)` (`--zds-color-palette-purple-400-opacity-8`)
|
|
319
|
-
- Text: `#7463f2` (purple-400)
|
|
320
|
-
- Border: `1px solid` purple-tint
|
|
321
|
-
- Padding: 6px 12px
|
|
322
|
-
- Radius: 9999px
|
|
323
|
-
- Font: 13px `BODY_13 SEMIBOLD`
|
|
324
|
-
- Use: AI-driven recommendation surfaces only — never decorative
|
|
325
|
-
|
|
326
|
-
### Search Input
|
|
327
|
-
|
|
328
|
-
**Header Search Bar**
|
|
329
|
-
- Background: `#f5f6f6` (gray-20)
|
|
330
|
-
- Border: none
|
|
331
|
-
- Radius: 12px
|
|
332
|
-
- Padding: 12px 14px
|
|
333
|
-
- Font: 15px `BODY_15 REGULAR` `#292b2b`
|
|
334
|
-
- Placeholder: `#878f91` (gray-400)
|
|
335
|
-
- Icon: leading 16px magnifier in `#707679` (gray-500)
|
|
336
|
-
- Focus: border `1px solid #292b2b` (gray-800) — no pink focus ring (would compete with brand)
|
|
337
|
-
|
|
338
|
-
### Sale / Urgency Badge
|
|
339
|
-
|
|
340
|
-
**Discount %**
|
|
341
|
-
- Background: `#fb4333` (coral-red-400)
|
|
342
|
-
- Text: `#ffffff`
|
|
343
|
-
- Padding: 2px 6px
|
|
344
|
-
- Radius: 4px
|
|
345
|
-
- Font: 11px `CAPTION_11 BOLD`
|
|
346
|
-
- Use: "-43%" on product thumbnails
|
|
347
|
-
|
|
348
|
-
**Time-limited**
|
|
349
|
-
- Background: `#121212`
|
|
350
|
-
- Text: `#ffffff`
|
|
351
|
-
- Padding: 4px 8px
|
|
352
|
-
- Radius: 4px
|
|
353
|
-
- Font: 11px `CAPTION_11 BOLD` with optional emoji glyph
|
|
354
|
-
- Use: "⏰ 24시간 한정", "오늘만"
|
|
355
|
-
|
|
356
|
-
**MD's PICK / Brand Curation**
|
|
357
|
-
- Background: `#ffffff`
|
|
166
|
+
### Public product components
|
|
167
|
+
|
|
168
|
+
**Product Thumbnail Placeholder**
|
|
169
|
+
- Background: `#ecedee`
|
|
170
|
+
- Radius: 0px
|
|
171
|
+
- Use: `.product-card-thumbnail` placeholder on `surface-2` and `surface-3`; representative 172px-wide product cards.
|
|
172
|
+
|
|
173
|
+
**Product Card Root**
|
|
174
|
+
- Radius: 0px
|
|
175
|
+
- Padding: 0px 0px 8px
|
|
176
|
+
- Use: `.product-card-root.product-card` on both captured product-detail surfaces; the root itself is transparent.
|
|
177
|
+
|
|
178
|
+
**Product-detail Tab**
|
|
358
179
|
- Text: `#121212`
|
|
359
|
-
-
|
|
360
|
-
- Padding:
|
|
361
|
-
-
|
|
362
|
-
-
|
|
363
|
-
- Use:
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
-
|
|
369
|
-
- Radius:
|
|
370
|
-
-
|
|
371
|
-
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
### Navigation
|
|
375
|
-
|
|
376
|
-
**Header (sticky)**
|
|
377
|
-
- Background: `#ffffff`
|
|
378
|
-
- Border-bottom: `1px solid #ecedee` (gray-30) — appears on scroll
|
|
379
|
-
- Height: ~52px
|
|
380
|
-
- Logo: ZIGZAG wordmark in `#fa6ee3` (brand pink) left-aligned
|
|
381
|
-
- Right cluster: search icon → cart icon → my-page icon, each in `#121212` with hit area 44px
|
|
382
|
-
- Sticky with `position: -webkit-sticky` and safe-area top inset
|
|
383
|
-
|
|
384
|
-
**Bottom Tab Bar (mobile primary nav)**
|
|
385
|
-
- Background: `#ffffff`
|
|
386
|
-
- Border-top: `1px solid #ecedee`
|
|
387
|
-
- Items: 4–5 evenly spaced (홈 / 카테고리 / 찜 / 마이페이지 / 알림)
|
|
388
|
-
- Active: `#121212` icon + label, 11px `CAPTION_11 SEMIBOLD`
|
|
389
|
-
- Inactive: `#878f91` (gray-400) icon + label
|
|
390
|
-
- Height: 56px + safe-area-inset-bottom
|
|
391
|
-
|
|
392
|
-
### Container
|
|
393
|
-
|
|
394
|
-
**Mobile-web Outer Frame (the signature 600px lock)**
|
|
395
|
-
- max-width: `600px`
|
|
396
|
-
- margin: `0 auto`
|
|
397
|
-
- min-height: `100vh`
|
|
398
|
-
- background: `#ffffff`
|
|
399
|
-
- The page beyond 600px on desktop is a neutral `#f5f6f6` margin band. This is the layout's strongest opinion.
|
|
180
|
+
- Radius: 0px
|
|
181
|
+
- Padding: 0px 4px 17.5px
|
|
182
|
+
- Font: 14px / 600 / computed Pretendard JP stack
|
|
183
|
+
- States: selected tab captured in `surface-2` and `surface-3`; the default tab is `#878f91`, 14px / 500, with the same control height.
|
|
184
|
+
- Use: product-detail tab list; selector provenance `surface-2::[data-omd-capture="28"]`.
|
|
185
|
+
|
|
186
|
+
**Home Quick-menu Arrow**
|
|
187
|
+
- Background: transparent
|
|
188
|
+
- Text: `#000000`
|
|
189
|
+
- Border: 1px solid `#ecedee`
|
|
190
|
+
- Radius: 50%
|
|
191
|
+
- Disabled: previous arrow captured with `rgba(16,16,16,0.3)` text.
|
|
192
|
+
- Use: home quick-menu carousel arrow; selector provenance `home::[data-omd-capture="74"]`.
|
|
193
|
+
|
|
194
|
+
No checkout CTA, search input, filter chip, toast, dialog, favorite state, hover, focus, or pressed variant is promoted: the collector reported zero safe interaction expansions, and those components were not present with sufficient selector/state proof in the supplied product surfaces.
|
|
400
195
|
|
|
401
196
|
---
|
|
402
|
-
|
|
403
|
-
**
|
|
404
|
-
**Tier
|
|
405
|
-
**
|
|
406
|
-
**Tier 2 status:** unavailable on both surfaces. Tier 1 (canonical production CSS bundle) treated as authoritative per pipeline.
|
|
407
|
-
**Conflicts unresolved:** none. The only ambiguity is which pink is "the" ZIGZAG pink — `#fa6ee3` (`--zds-color-semantic-brand-zigzag`) is the brand-anchor pink (wordmark, brand events); `#f55dd6` (`--zds-color-palette-pink-400`) is the interactive primary on the button system. Both are documented as distinct roles; no conflict, just a two-pink architecture.
|
|
408
|
-
**Playwright session note:** Live `browser_evaluate` capture on `zigzag.kr` was contended by a shared playwright session running parallel agents (tabs kept switching to kakaopay / banksalad / remember / zigbang mid-evaluate). Substituted with direct curl + production CSS bundle inspection, which yielded canonical tokens directly — a stronger source than runtime computed style would have been.
|
|
197
|
+
**Verified:** 2026-07-13
|
|
198
|
+
**Tier 1 sources:** https://zigzag.kr/ · https://zigzag.kr/catalog/products/145661347 · https://zigzag.kr/catalog/products/162934185
|
|
199
|
+
**Tier 2 sources:** https://getdesign.md/zigzag (attempted; unavailable) · https://styles.refero.design/?q=ZIGZAG (attempted; unavailable)
|
|
200
|
+
**Conflicts unresolved:** none
|
|
409
201
|
|
|
410
202
|
## 5. Layout Principles
|
|
411
203
|
|
|
412
|
-
|
|
413
|
-
-
|
|
414
|
-
-
|
|
415
|
-
-
|
|
416
|
-
- Card-grid gutter: 8px (2-up product grid)
|
|
417
|
-
- Section vertical rhythm: 24px between content blocks, 40px between major sections
|
|
418
|
-
|
|
419
|
-
### Grid & Container
|
|
420
|
-
- **Design baseline: 375px mobile width**
|
|
421
|
-
- **Hard ceiling: 600px** — every page is centred to `max-width: 600px` regardless of viewport
|
|
422
|
-
- Beyond 600px: gray-20 (`#f5f6f6`) margin band, no responsive reflow
|
|
423
|
-
- Product grid: 2 columns on mobile (8px gutter), occasionally 3 columns on category landings
|
|
424
|
-
- Editorial / lookbook: full-bleed 600px hero images, 16:20 portrait aspect on featured spreads
|
|
425
|
-
|
|
426
|
-
### Whitespace Philosophy
|
|
427
|
-
- **Breathing room for products, not for chrome.** Product cards get generous internal padding (12–14px). UI chrome (header height 52px, tab bar 56px) is tight by phone-app standards.
|
|
428
|
-
- **Photo-first, text-second.** Editorial sections lead with a full-bleed image, copy follows below — never overlaid. The product photography from 7,000+ partner shops is the visual asset; the system stays out of its way.
|
|
429
|
-
- **Progressive density.** Discovery surfaces (홈 / 카테고리 landing) are spacious; detail / option-select / cart screens become denser. Commitment narrows the canvas.
|
|
430
|
-
|
|
431
|
-
### Border Radius Scale (`--zds-corner-radius-*`)
|
|
432
|
-
- 0 (`#0`): Edge-to-edge images, full-width banners
|
|
433
|
-
- 2 (`2px`): Tiny micro-elements
|
|
434
|
-
- 4 (`4px`): Badges, sale tags, inline pills
|
|
435
|
-
- 6 (`6px`): Form switches in compact mode
|
|
436
|
-
- 8 (`8px`): Product thumbnails, small cards
|
|
437
|
-
- 12 (`12px`): Buttons, inputs, standard cards — the workhorse
|
|
438
|
-
- 16 (`16px`): Featured cards, bottom-sheet top corners (`16px 16px 0 0`)
|
|
439
|
-
- 20 (`20px`): Large dialog corners
|
|
440
|
-
- full (`9999px`): Chips, switch tracks, drag handles, circular icon buttons
|
|
204
|
+
- Keep product imagery and metadata as separate blocks. The current public card implementation exposes thumbnail and metadata as distinct product-card subcomponents.
|
|
205
|
+
- Treat the 8px bottom card padding as local card geometry, not a global spacing scale.
|
|
206
|
+
- Keep product-detail tabs as low-fill text controls; the observed selected state is conveyed by text weight/color rather than a filled pill.
|
|
207
|
+
- Do not infer desktop, native-app, cart, or checkout layout rules from these three public web pages.
|
|
441
208
|
|
|
442
209
|
## 6. Depth & Elevation
|
|
443
210
|
|
|
444
|
-
|
|
445
|
-
|-------|-----------|-----|
|
|
446
|
-
| Flat (Level 0) | No shadow | Page background, inline elements |
|
|
447
|
-
| Subtle (Level 1) | `0px 1px 2px rgba(0,0,0,0.05)` | List rows on hover, ambient lift |
|
|
448
|
-
| Standard (Level 2) | `0px 2px 8px rgba(0,0,0,0.08)` | Floating filter chip, sticky CTA |
|
|
449
|
-
| Elevated (Level 3) | `0px 4px 16px rgba(0,0,0,0.12)` | Bottom sheets, popovers, dropdown menus |
|
|
450
|
-
| Modal (Level 4) | `0px 8px 32px rgba(0,0,0,0.16)` | Centred dialogs, full takeover modals |
|
|
451
|
-
| Backdrop dim | `rgba(0,0,0,0.5)` (`--zds-color-semantic-background-dimmed`) | Behind every modal / bottom-sheet |
|
|
452
|
-
|
|
453
|
-
**Shadow Philosophy.** Shadows are pure black with low opacity, single-layer. Unlike Stripe's blue-tinted multi-layer shadow system, ZIGZAG's shadows are deliberately undecorated — the visual interest comes from the product photography, not from elevation chrome. The brand pink never appears in shadows.
|
|
454
|
-
|
|
455
|
-
### Blur Effects
|
|
456
|
-
- Sticky headers gain a `backdrop-filter: blur(12px)` on scroll, with the header background shifting to `rgba(255,255,255,0.9)` to let scrolled content tint through subtly.
|
|
211
|
+
The supplied public samples report `box-shadow: none` for the promoted card, tab, and quick-menu controls. Product thumbnails may use the neutral `#ecedee` placeholder; depth is not promoted as a canonical shadow system. White surfaces and hairlines should not be converted into an invented card-elevation scale.
|
|
457
212
|
|
|
458
213
|
## 7. Do's and Don'ts
|
|
459
214
|
|
|
460
215
|
### Do
|
|
461
|
-
- Use `#fa6ee3` (brand-zigzag) only for the wordmark + brand-event chrome; reserve `#f55dd6` (pink-400) for interactive primary buttons
|
|
462
|
-
- Use Pretendard with the full Korean fallback stack — Hangul rendering parity is the point
|
|
463
|
-
- Use literal `HEAD_22 SEMIBOLD` style classes — they map 1:1 to ZDS tokens
|
|
464
|
-
- Use `#fb4333` (coral-red-400) for sale prices, discount rates, urgency markers — never the pink
|
|
465
|
-
- Use the 600px max-width container even on desktop — it's the brand's mobile-as-canvas commitment
|
|
466
|
-
- Use `#f5f6f6` (gray-20) as page background instead of pure white — softer against product photography
|
|
467
|
-
- Use 12px radius for buttons, 8px for product thumbnails, 16px for bottom-sheet top corners
|
|
468
|
-
- Display price in BOLD and product name in MEDIUM — the number is the visual anchor
|
|
469
|
-
- Surface `#fee500` (kakao yellow) only for the Kakao login button — never decoratively
|
|
470
216
|
|
|
471
|
-
|
|
472
|
-
-
|
|
473
|
-
-
|
|
474
|
-
- Don't use pure `#ffffff` as the page background — gray-20 (`#f5f6f6`) is the canonical surface
|
|
475
|
-
- Don't use blue (`#216bff`) as a primary CTA — pink is the interactive anchor
|
|
476
|
-
- Don't responsively reflow desktop layouts — center the mobile layout at 600px max-width
|
|
477
|
-
- Don't overlay text on product photography — ZIGZAG's editorial respects photo as photo
|
|
478
|
-
- Don't use the kakao yellow (`#fee500`) for decoration or non-Kakao surfaces
|
|
479
|
-
- Don't use radius > 16px on commerce surfaces (except pill chips) — large rounding reads as consumer-app, not curated commerce
|
|
480
|
-
- Don't apply negative letter-spacing on Korean type — Hangul does not benefit from display tracking
|
|
481
|
-
- Don't use brand pink in shadows or as decorative ornament — pink earns its presence by being interactive or brand-anchoring
|
|
482
|
-
|
|
483
|
-
## 8. Responsive Behavior
|
|
217
|
+
- Keep `#292b2b` as the observed body/card foreground and reserve `#121212` for the strongest captured detail-tab state.
|
|
218
|
+
- Preserve the product-card split between thumbnail and metadata when using this reference's public-card pattern.
|
|
219
|
+
- Use 0px geometry only for the observed card/tab roles; use 8px, 24px, and full-pill values only in their evidenced icon, action, and carousel-control roles.
|
|
484
220
|
|
|
485
|
-
###
|
|
486
|
-
| Name | Width | Key Changes |
|
|
487
|
-
|------|-------|-------------|
|
|
488
|
-
| Mobile (Primary) | <600px | Full design fidelity, 375px baseline, 16px h-padding |
|
|
489
|
-
| Mobile Large | 600–768px | Same as mobile, content remains within 600px column |
|
|
490
|
-
| Desktop | >768px | Mobile layout centred at `max-width: 600px`, gray-20 margin band on either side |
|
|
491
|
-
|
|
492
|
-
**This is the layout's most opinionated decision.** ZIGZAG does not redesign for desktop. The experience is mobile-as-canvas at every breakpoint — desktop users see the mobile layout in a centred column.
|
|
221
|
+
### Don't
|
|
493
222
|
|
|
494
|
-
|
|
495
|
-
-
|
|
496
|
-
-
|
|
497
|
-
- Tab bar items: 56px tall (full bar height)
|
|
498
|
-
- Header icon clusters: 44px hit area minimum
|
|
223
|
+
- Do not present the legacy pink palette as a current public product token without new product-surface proof.
|
|
224
|
+
- Do not label the computed Pretendard JP stack as a browser-loadable ZIGZAG font or substitute a system font under that name.
|
|
225
|
+
- Do not invent sale, error, success, favorite, dialog, input, checkout, hover, focus, or pressed variants from adjacent marketing or native-app surfaces.
|
|
499
226
|
|
|
500
|
-
|
|
501
|
-
- No collapsing — desktop is mobile, full stop
|
|
502
|
-
- Bottom sheet → bottom sheet at all sizes (no transition to side-panel modal)
|
|
503
|
-
- Cart, login, filter — all bottom-sheet-first
|
|
227
|
+
## 8. Responsive Behavior
|
|
504
228
|
|
|
505
|
-
|
|
506
|
-
- Product thumbnails maintain 1:1 aspect at all sizes, 8px radius
|
|
507
|
-
- Hero / brand-event images use 16:20 portrait or 2:1 letterbox depending on campaign
|
|
508
|
-
- Lazy-loaded with `cf.res.s.zigzag.kr` CDN; placeholder is gray-20 block
|
|
509
|
-
- Editorial photography is never cropped under text overlays — copy lives below the image
|
|
229
|
+
The artifact was captured at `1440x900` and the public product content contained a 600px-wide product carousel/card region. That observation is not enough to claim a global max-width or native-mobile breakpoint policy. Responsive behavior, overlays, and interaction states remain outside this reference until independently captured.
|
|
510
230
|
|
|
511
231
|
## 9. Agent Prompt Guide
|
|
512
232
|
|
|
513
|
-
|
|
514
|
-
- Brand pink (wordmark): ZIGZAG Pink (`#fa6ee3`)
|
|
515
|
-
- Interactive pink (buttons): Pink 400 (`#f55dd6`)
|
|
516
|
-
- Pink hover: Pink 450 (`#e356c6`)
|
|
517
|
-
- Pink pressed: Pink 550 (`#d14fb7`)
|
|
518
|
-
- Background: Gray 20 (`#f5f6f6`) — not pure white
|
|
519
|
-
- Surface (cards): White (`#ffffff`)
|
|
520
|
-
- Heading: Gray 970 (`#121212`)
|
|
521
|
-
- Body: Gray 800 (`#292b2b`)
|
|
522
|
-
- Secondary text: Gray 300 (`#a1a9ad`)
|
|
523
|
-
- Tertiary text: Gray 400 (`#878f91`)
|
|
524
|
-
- Border: Gray 30 (`#ecedee`)
|
|
525
|
-
- Sale / urgency: Coral Red 400 (`#fb4333`)
|
|
526
|
-
- AI / curation: Purple 400 (`#7463f2`)
|
|
527
|
-
- Kakao login only: Kakao Yellow (`#fee500`)
|
|
528
|
-
|
|
529
|
-
### Example Component Prompts
|
|
530
|
-
- "Create a product card: white bg, 8px-radius square thumbnail, 12px vertical padding. Brand 13px Pretendard `BODY_13 REGULAR` `#878f91`. Title 15px `BODY_15 MEDIUM` `#292b2b` max 2 lines. Discount rate 14px `BODY_14 BOLD` `#fb4333` immediately before sale price 16px `BODY_16 BOLD` `#fb4333`. Original price 13px `#a1a9ad` strikethrough."
|
|
531
|
-
- "Build a primary pink CTA: `#f55dd6` bg, white text, 16px Pretendard SemiBold, 14px 20px padding, 12px radius. Hover `#e356c6`. Pressed `#d14fb7`. Min-height 48px, full-width on mobile."
|
|
532
|
-
- "Design a filter chip (selected): `rgba(245,93,214,0.08)` bg, `#f55dd6` text, `1px solid #fccef2` border, 6px 12px padding, full-pill radius, 13px Pretendard Medium."
|
|
533
|
-
- "Create a bottom sheet: white bg, `16px 16px 0 0` top radius. 36px×4px gray-80 drag handle, top-centred with 8px inset. Backdrop `rgba(0,0,0,0.5)`. Title 22px `HEAD_22 SEMIBOLD` `#121212`, body 16px `BODY_16 REGULAR` `#292b2b`."
|
|
534
|
-
- "Design the page container: `max-width: 600px`, `margin: 0 auto`, `min-height: 100vh`, white bg. Beyond 600px on desktop show gray-20 (`#f5f6f6`) margin. Do not reflow to multi-column."
|
|
535
|
-
|
|
536
|
-
### Iteration Guide
|
|
537
|
-
1. Always use Pretendard with the Korean fallback chain (Apple SD Gothic Neo → Noto Sans KR → Malgun Gothic) — Hangul rendering is the point
|
|
538
|
-
2. Brand pink `#fa6ee3` ≠ interactive pink `#f55dd6` — keep them in their lanes
|
|
539
|
-
3. Sale prices and urgency are coral-red (`#fb4333`), never pink — pink is brand/interaction, coral is alert
|
|
540
|
-
4. Background is `#f5f6f6` (gray-20), not pure white — preserves separation from product photography
|
|
541
|
-
5. Corner radius: 8px thumbnails, 12px buttons/cards, 16px top corners of bottom sheets, full-pill for chips
|
|
542
|
-
6. Shadows are pure black low-opacity, single-layer — no colored shadows, no multi-layer stacks
|
|
543
|
-
7. 600px max-width is non-negotiable — desktop is centred mobile, not a re-layout
|
|
544
|
-
8. Price BOLD, name MEDIUM — the number is the visual anchor on every product card
|
|
545
|
-
9. Pretendard weight scale: 400 / 500 / 600 / 700 — no 300 or 800 (not loaded)
|
|
546
|
-
|
|
547
|
-
---
|
|
233
|
+
Use this reference for a neutral, photo-led public fashion-product detail only: white canvas, `#292b2b` reading text, `#878f91` inactive metadata, `#ecedee` placeholder/hairline, a selected 14px / 600 `#121212` tab, and a transparent square product-card root. Do not ask it to supply a ZIGZAG pink CTA, a verified font file, or checkout-state patterns; those are not in this evidence set.
|
|
548
234
|
|
|
549
235
|
## 10. Voice & Tone
|
|
550
236
|
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
| Context | Tone |
|
|
554
|
-
|---|---|
|
|
555
|
-
| Hero campaign | Discovery-framed verb forms (`발견하세요`, `시작해보세요`). Confident, never hedged. |
|
|
556
|
-
| Product card brand line | Plain brand-name, no marketing copy — let the photography work |
|
|
557
|
-
| Promo banners | Short urgent imperatives + emoji glyph (`🔥 24시간만`, `⏰ 마감 임박`) — emoji is licensed on commerce surfaces, unlike Toss |
|
|
558
|
-
| Filter / category labels | Specific noun phrases (`오피스룩`, `데일리룩`, `홈웨어`) — never euphemisms |
|
|
559
|
-
| Search empty state | One-line explain + suggest action — never `결과가 없습니다` |
|
|
560
|
-
| Error (payment) | Specific code + plain-Korean guidance + one retry CTA |
|
|
561
|
-
| Success (order placed) | Celebrate without overpromising — `주문이 완료되었어요`, not `축하합니다 🎉🎉🎉` |
|
|
562
|
-
| Onboarding | Second-person, single idea per screen, casual `해요` register |
|
|
563
|
-
| Legal / disclosure | Formal `합니다` endings — the only register shift |
|
|
564
|
-
|
|
565
|
-
**Forbidden phrases.** `불편을 드려 죄송합니다`, generic `Oops`, ad-copy clichés (`혁신적인`, `세상에 없던`), aggressive marketing exclamations on functional surfaces (`!!!`), price approximations (`약 ~원` on commerce). Loyalty programs and badge copy never use English-only phrases — Korean-first or bilingual.
|
|
566
|
-
|
|
567
|
-
**Voice samples (verified live on `brunch.co.kr/@zigzag/73`, brand-owned 2022 publication):**
|
|
568
|
-
- *"나만의 스타일을 발견할 수 있는 플레이그라운드"* — the post-2022 mission statement
|
|
569
|
-
- *"쇼핑을 넘어, 나의 라이프 스타일을 찾는 곳"* — the lifestyle expansion framing
|
|
570
|
-
- *"다양함을 존중하는"* — diversity-respecting (used as a rebrand pillar)
|
|
571
|
-
- *"나답게"* — be true to yourself (the verb-form imperative)
|
|
572
|
-
- Rebrand pillars: *Memorable, Effortless, Inspiring, Contextual*
|
|
573
|
-
|
|
574
|
-
<!-- illustrative: empty-cart, payment-failed, order-placed below are reasoned defaults, not verified live app strings. A logged-in audit pass should replace. -->
|
|
575
|
-
- Empty cart: *"아직 담은 상품이 없어요. 마음에 드는 스타일을 찾아볼까요?"* + single pink CTA *"홈으로 가기"*
|
|
576
|
-
- Payment failed: *"결제가 완료되지 않았어요. 카드 정보를 확인하고 다시 시도해주세요."* (no `죄송합니다`)
|
|
577
|
-
- Order placed: *"주문이 완료되었어요. 곧 출고 알림을 보내드릴게요."*
|
|
237
|
+
Official current brand publishing uses a personal-style discovery frame: the 2025 ZIGZAG Beauty story calls the service a style-commerce platform and describes helping people find their own preferences. This is marketing voice, not a token or a verified logged-in-product microcopy guide. Keep product-detail labels concrete and item-led; do not manufacture error, payment, or retention copy from campaign language.
|
|
578
238
|
|
|
579
239
|
## 11. Brand Narrative
|
|
580
240
|
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
The founding rejection was of the assumption that fashion ecommerce should *be* a mall. Korean indie women's fashion in the mid-2010s was a long-tail of thousands of small shops, each with passionate audiences and zero discoverability beyond Naver bookmarks. ZIGZAG's bet was that the *bookmark* — the act of saving and returning — was the real product. The catchphrase *"니 맘대로 사세요"* (Live as you like / Buy as you like, popularised in TV campaigns starring 윤여정) made the framing explicit: the platform doesn't curate for you; it surfaces options so you can choose with confidence.
|
|
584
|
-
|
|
585
|
-
By 2020 ZIGZAG was a top-grossing women's fashion app in Korea ([byline.network](https://byline.network/2020/05/04-26/)). On **April 15, 2021**, Kakao Corporation acquired Croquis at an enterprise value estimated near 1 trillion KRW, and on **July 1, 2021** completed the merger that formed **KakaoStyle (카카오스타일)** — with Seo Jung-hoon retained as CEO and the ZIGZAG service name preserved ([asiae.co.kr](https://cm.asiae.co.kr/en/article/2021070110025515550)). KakaoStyle now operates as a 50.9%-Kakao-owned affiliate and crossed **1 trillion KRW combined transaction volume** across ZIGZAG and Fashion-by-Kakao by 2022.
|
|
586
|
-
|
|
587
|
-
The **2021 rebrand** ([brunch.co.kr/@zigzag/73](https://brunch.co.kr/@zigzag/73), [designcompass.org](https://designcompass.org/en/2022/08/25/zigzag-rebranding/), [heypop.kr](https://heypop.kr/n/38932/)) cooled the brand pink — the previous "hot pink" caused eye fatigue and refused to pair with anything but white or black. The new ZIGZAG pink (`#fa6ee3`) tones the saturation down so it harmonises with the editorial photography of 7,000+ partner shops, and the wordmark moved to a taller typeface. The brand mission was reframed from *"35 million women chose ZIGZAG"* (transactional / demographic) to *"나만의 스타일을 발견할 수 있는 플레이그라운드"* — a *playground for discovering your own style*. The rebrand pillars (**Memorable, Effortless, Inspiring, Contextual**) made the editorial intent explicit.
|
|
588
|
-
|
|
589
|
-
**ZDS (ZIGZAG Design System)** is the engineering substrate that carries this brand promise into pixels. Per the December 2024 [KakaoStyle frontend devblog](https://devblog.kakaostyle.com/ko/2024-12-13-1-rebuilding-frontend-design-system/), ZDS was rebuilt starting mid-2023: Emotion (runtime CSS-in-JS) was replaced with **Vanilla Extract** (zero-runtime, build-time CSS variables). Tokens are split into Core / Components / Icons / Themes / Tokens packages. Compound-component patterns expose components as `<ProductCard.Thumbnail>`, `<ProductCard.Metadata>`, `<ProductCard.MetadataItem>` — the markup *is* the design system, not a layer above it.
|
|
241
|
+
KakaoStyle's official 2025 ZIGZAG Beauty publication describes ZIGZAG as a style-commerce platform that began in fashion and expanded its categories and selection so people can discover their own preferences. The publication connects that idea to a beauty pop-up whose offline “online pouch” could link saved products back to the app cart. Separately, ZIGZAG's public terms define the service as a mobile shopping service in which the company intermediates transactions between sellers and users. Together, those first-party sources explain the reference's scope: a commerce service whose editorial discovery language sits beside a transactional product surface.
|
|
590
242
|
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
The parent KakaoStyle articulates its operating principles in six verbs ([kakaostyle.com](https://kakaostyle.com)): *내가 사용자가 됩니다 / '왜'에서 시작합니다 / 빠르게 시도합니다 / 팀을 위해 먼저 합니다 / 스스로 일합니다 / 투명하고 솔직하게 소통합니다*. The design surface reflects them: small, fast, opinionated, repeatedly tested against the user-self.
|
|
243
|
+
The official engineering account adds the system's current technical arc. Its ZDS rebuild began from the need to unify independently maintained product cards; the team adopted modular packages, CSS-variable token contracts, and a compound product-card structure that can vary by surface without losing its shared base. That background supports the documented card anatomy, but not token values absent from the July 2026 public capture.
|
|
594
244
|
|
|
595
245
|
## 12. Principles
|
|
596
246
|
|
|
597
|
-
1. **Discovery
|
|
598
|
-
2. **
|
|
599
|
-
3. **
|
|
600
|
-
4. **Two pinks, one role each.** `#fa6ee3` is the brand anchor (wordmark, brand-event banners); `#f55dd6` is the interactive primary (button fill, switch on-state). They never substitute for each other. *UI implication:* a CTA never uses `#fa6ee3`; the wordmark never uses `#f55dd6`.
|
|
601
|
-
5. **Price BOLD, name MEDIUM.** The number is the visual anchor on every commerce card. *UI implication:* `BODY_16 BOLD` for price, `BODY_15 MEDIUM` for product name — flipping the weights would feel like a magazine, not a marketplace.
|
|
602
|
-
6. **Coral is alert, pink is brand.** Sale prices, discount rates, urgency badges live in `#fb4333` (coral-red-400), not in pink. *UI implication:* a pink "-43%" badge would dilute brand pink into a sale color; coral keeps the lanes separate.
|
|
603
|
-
7. **Off-white over pure white.** Page background is `#f5f6f6` (gray-20). Pure white is reserved for elevated surfaces (cards, sheets, modals). *UI implication:* a card on a card creates a subtle elevation cue without needing a shadow.
|
|
604
|
-
8. **Korean type rules Korean type.** Pretendard with the full KR fallback stack, no negative letter-spacing on display sizes, generous multi-line line-height (140%+), four weights only (400/500/600/700). *UI implication:* never apply Latin display tracking to Hangul.
|
|
605
|
-
9. **The token names tell the truth.** ZDS exposes `--zds-color-semantic-brand-zigzag`, not `--zds-color-pink-primary`. The semantic layer carries intent. *UI implication:* component implementations reference semantic tokens, not palette tokens — if the brand pink ever moves, only the resolution changes.
|
|
247
|
+
1. **Discovery and transaction coexist.** The official brand story presents preference discovery while the terms define a transaction-intermediation service. *UI implication:* keep editorial/campaign interpretation separate from checkout claims unless each has surface evidence.
|
|
248
|
+
2. **Systemize the repeated product card.** ZDS was rebuilt in part to unify product-card work across surfaces. *UI implication:* preserve thumbnail and metadata as separable blocks rather than treating each card as an unstructured visual tile.
|
|
249
|
+
3. **Tokens need local proof.** CSS-variable architecture is official engineering context, but current values must still come from the correct product surface. *UI implication:* do not copy a marketing color or legacy CSS value into product tokens without computed evidence.
|
|
606
250
|
|
|
607
251
|
## 13. Personas
|
|
608
252
|
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
**소연 (Soyeon), 24, Seoul.** University senior, marketing major. Opens ZIGZAG 4–6 times a day — commute, between classes, lying in bed at 11pm. Doesn't search; scrolls categories and saves to 찜 obsessively. Has 200+ saved items she'll never buy and 8 she absolutely will. Treats the pink heart icon like a feed-curation tool, not a wishlist. Notices instantly when a brand's product photography is iPhone-shot vs studio — and trusts the studio-shot more.
|
|
612
|
-
|
|
613
|
-
**예린 (Yerin), 29, Daegu.** Office worker, marketing agency. Buys ZIGZAG 2–3 times a month, average basket ₩80k. Lives in the discount-rate column — `-43%` reads to her before the product photo. Filter-pill heavy user: 신상품만 + 무료배송 + 4.5★ 이상. Has a love-hate relationship with the recommendation chips — they're either eerily on-target or wildly off, never in between.
|
|
614
|
-
|
|
615
|
-
**민아 (Mina), 32, Bundang.** Mother of one, returned to work part-time. ZIGZAG is her one-handed phone shopping app while a 3-year-old naps. Speed of the cart → checkout path matters more than browsing. Distrusts brands she's never heard of unless the review count is >2,000. Reads Korean only — English in product copy is a friction signal.
|
|
253
|
+
These are stakeholder roles derived from first-party service/engineering descriptions, not synthetic user research or demographic claims.
|
|
616
254
|
|
|
617
|
-
|
|
255
|
+
- **Shopper:** uses the mobile shopping service to browse product information and complete a transaction through the platform.
|
|
256
|
+
- **Seller:** provides goods or services through the marketplace relationship described in the public terms.
|
|
257
|
+
- **Product-surface team:** maintains product-card UI across multiple surfaces using the ZDS component architecture described by Kakaostyle engineering.
|
|
618
258
|
|
|
619
259
|
## 14. States
|
|
620
260
|
|
|
621
|
-
| State |
|
|
261
|
+
| State | Evidence boundary |
|
|
622
262
|
|---|---|
|
|
623
|
-
|
|
|
624
|
-
|
|
|
625
|
-
|
|
|
626
|
-
|
|
|
627
|
-
|
|
|
628
|
-
|
|
|
629
|
-
|
|
|
630
|
-
|
|
|
631
|
-
| **Error (network)** | Toast at bottom, `#121212` background, white text, 3s auto-dismiss: *"네트워크 연결을 확인해주세요"*. No icon. No `Oops`. |
|
|
632
|
-
| **Success (added to cart)** | Inline toast 3s with `#51aa5b` (success green) glyph + text: *"장바구니에 담았어요"*. Tappable to navigate to cart. |
|
|
633
|
-
| **Success (order placed)** | Dedicated confirmation screen — not a toast. Pink confetti or simple checkmark animation, then order summary card. Single CTA "주문 상세 보기". The commitment is too important to be a 3s overlay. |
|
|
634
|
-
| **Skeleton (any list)** | Gray-30 blocks at exact final dimensions, 1.2s linear shimmer. Card thumbnails always at 1:1 aspect to avoid layout shift on resolution. |
|
|
635
|
-
| **Disabled** | Opacity reduced on the surface (`opacity: 0.3` per `--zds-color-component-switch-on-disabled`). Pink-on-disabled becomes `rgba(245,93,214,0.3)` — faded pink, not switched to gray, to preserve brand read. |
|
|
263
|
+
| Default product card | Transparent root, 0px radius, 0px 0px 8px padding on both captured product-detail pages. |
|
|
264
|
+
| Thumbnail placeholder | `#ecedee`, 0px radius on the captured `.product-card-thumbnail`. |
|
|
265
|
+
| Default detail tab | `#878f91`, 14px / 500, captured on both product-detail pages. |
|
|
266
|
+
| Selected detail tab | `#121212`, 14px / 600, captured on both product-detail pages. |
|
|
267
|
+
| Quick-menu arrow default | Transparent, `#000000`, 1px `#ecedee` border, 50% radius on home. |
|
|
268
|
+
| Quick-menu arrow disabled | `rgba(16,16,16,0.3)` text on the captured previous arrow. |
|
|
269
|
+
| Hover / focus / pressed | Not claimed: interaction coverage was zero. |
|
|
270
|
+
| Checkout, payment, error, success, toast, dialog | Not claimed: no public selector/state evidence in the supplied artifact. |
|
|
636
271
|
|
|
637
272
|
## 15. Motion & Easing
|
|
638
273
|
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
| Token | Value | Use |
|
|
642
|
-
|---|---|---|
|
|
643
|
-
| `motion-instant` | 0ms | Toggle flips, checkbox commits, focus rings |
|
|
644
|
-
| `motion-fast` | 150ms | Hover, press overlays, small reveals |
|
|
645
|
-
| `motion-standard` | 250ms | Default — bottom-sheet open, card expand, tab switch |
|
|
646
|
-
| `motion-slow` | 400ms | Emphasized — order-success animation, onboarding step advance |
|
|
647
|
-
| `motion-page` | 320ms | Full-screen route transitions |
|
|
648
|
-
|
|
649
|
-
**Easings:**
|
|
650
|
-
|
|
651
|
-
| Token | Curve | Use |
|
|
652
|
-
|---|---|---|
|
|
653
|
-
| `ease-enter` | `cubic-bezier(0.0, 0.0, 0.2, 1)` | Arriving — sheets, toasts, screen pushes |
|
|
654
|
-
| `ease-exit` | `cubic-bezier(0.4, 0.0, 1, 1)` | Dismissals — sheet close, toast leave |
|
|
655
|
-
| `ease-standard` | `cubic-bezier(0.4, 0.0, 0.2, 1)` | Two-way — tab content, accordions |
|
|
656
|
-
| `ease-bounce` | `cubic-bezier(0.34, 1.56, 0.64, 1)` | Reserved. Only for the 찜 (favorite) heart-fill animation and order-placed checkmark. The brand voice is playful enough to license bounce in two narrow places. |
|
|
657
|
-
|
|
658
|
-
**Signature motions.**
|
|
659
|
-
|
|
660
|
-
1. **찜 heart tap.** The favorite button uses `motion-fast / ease-bounce`: heart outline → filled pink (`#fa6ee3`) with a 1.15× overshoot scale, settling back to 1.0× over 250ms. This is one of the two places spring is licensed. Removing the favorite uses `ease-standard`, not bounce — *adding* something to your collection earns the delight; *removing* doesn't.
|
|
661
|
-
2. **Bottom-sheet presentation.** Sheets rise from `y+40px` with `motion-standard / ease-enter`, synchronized with a backdrop fade from `rgba(0,0,0,0)` to `rgba(0,0,0,0.5)`. Dismissal uses `motion-fast / ease-exit` — leaving feels lighter than entering.
|
|
662
|
-
3. **Product card press feedback.** On tap-down, the card overlays `rgba(0,0,0,0.03)` (`--zds-color-component-product-card-pressed`) over `motion-fast / ease-standard` and reverses on tap-release. No scale transform — the photography is the visual subject, scaling it would feel cheap.
|
|
663
|
-
4. **Order-placed checkmark.** Drawn over `motion-slow / ease-bounce`, the second licensed bounce. Commit moments deserve the delight; routine commerce does not.
|
|
664
|
-
5. **Reduce motion.** Under `prefers-reduced-motion: reduce`, all `motion-*` tokens collapse to `motion-instant`. `ease-bounce` is suppressed entirely — the heart-fill becomes a crossfade, the order-placed checkmark draws linearly. The app stays fully functional; motion is never load-bearing for comprehension.
|
|
665
|
-
|
|
666
|
-
<!--
|
|
667
|
-
OmD v0.1 Sources — Philosophy Layer (sections 10–15)
|
|
668
|
-
|
|
669
|
-
Direct verification (2026-05-13):
|
|
670
|
-
- https://zigzag.kr/ (Tier 1 live HTML + static asset) — confirms Pretendard self-hosted stack, literal HEAD_/BODY_/CAPTION_ typography classes, 600px max-width centred container.
|
|
671
|
-
- https://www.zigzag.kr/.../_next/static/css/c41594a1ffd08aa6.css — confirms full ZDS palette, semantic tokens including --zds-color-semantic-brand-zigzag: #fa6ee3, --zds-color-semantic-brand-kakao: #fee500, --zds-color-semantic-brand-selected: #ff4c34, pink-{50..950} scale, gray scale, corner-radius scale, light+dark theme pairings.
|
|
672
|
-
- https://devblog.kakaostyle.com/ko/2024-12-13-1-rebuilding-frontend-design-system/ — confirms ZDS Vanilla Extract zero-runtime rearchitecture, mid-2023 project start, compound-component pattern (<ProductCard.Thumbnail> et al.), package split (Core/Components/Icons/Themes/Tokens).
|
|
673
|
-
- https://brunch.co.kr/@zigzag/73 (ZIGZAG-owned brunch series) — confirms the post-2022 mission "나만의 스타일을 발견할 수 있는 플레이그라운드", the lifestyle-expansion framing "쇼핑을 넘어, 나의 라이프 스타일을 찾는 곳", the rebrand pillars Memorable / Effortless / Inspiring / Contextual, the diversity-respecting "다양함을 존중하는" and "나답게" voice.
|
|
674
|
-
- https://kakaostyle.com/ — confirms KakaoStyle parent operating principles in six verbs and the corporate tagline "당신만의 라이프스타일을 카카오스타일에서 발견하세요".
|
|
675
|
-
- https://designcompass.org/en/2022/08/25/zigzag-rebranding/ + https://heypop.kr/n/38932/ — confirm 2021 rebrand rationale (cool-toned pink replacing eye-fatiguing hot pink, taller wordmark typeface, tagline shift from "35 million women" to brand-fashion-life).
|
|
676
|
-
- https://m.apparelnews.co.kr/news/news_view/?idx=186346 — confirms Seo Jung-hoon's "connector not commerce" framing.
|
|
677
|
-
- https://www.fnnews.com/news/201902241808512757 — confirms Croquis 2012-02 founding, Seo Jung-hoon profile, 2015-06 ZIGZAG launch, 3-day Excel crawl + 300-mall seed.
|
|
678
|
-
- https://cm.asiae.co.kr/en/article/2021070110025515550 — confirms 2021-04-15 Kakao acquisition, 2021-07-01 KakaoStyle merger completion, Seo retained as CEO, ZIGZAG name preserved.
|
|
679
|
-
|
|
680
|
-
Not independently re-verified (used as widely documented context):
|
|
681
|
-
- 1 trillion KRW transaction volume by 2022 across ZIGZAG + Fashion-by-Kakao (from grokipedia / multiple press; cited but not primary).
|
|
682
|
-
- The "니 맘대로 사세요" / 윤여정 ad campaign provenance (KR pop-culture general knowledge; mentioned in designcompass + heypop articles as historical context).
|
|
683
|
-
|
|
684
|
-
Personas (§13) are fictional archetypes informed by publicly observable ZIGZAG user segments (Korean women 18–34, mobile-native fashion-discovery shoppers). Names are illustrative; any resemblance to real individuals is unintended.
|
|
685
|
-
|
|
686
|
-
Interpretive claims:
|
|
687
|
-
- "Two pinks, one role each" (§12.4) is the author's editorial reading of why ZDS exposes both --zds-color-semantic-brand-zigzag (#fa6ee3) and --zds-color-palette-pink-400 (#f55dd6) as separate tokens with distinct component-token wiring. The naming is documented; the role-assignment is editorial.
|
|
688
|
-
- The "mobile-as-canvas at desktop breakpoint" claim (§12.3) is the author's reading of the 600px max-width container observed in the production HTML; ZIGZAG has not, to this author's knowledge, published an explicit statement about it. The behavior is verified; the brand-thesis framing is editorial.
|
|
689
|
-
- Illustrative state copy in §14 is reasoned default behavior, not verified logged-in app strings. Marked as illustrative.
|
|
690
|
-
|
|
691
|
-
Distinction from coupang / musinsa (per task prompt):
|
|
692
|
-
- Coupang is logistics-density commerce — gray-blue palette, dense lists, no curation pinks. Optimised for "I know what I want, ship it tomorrow".
|
|
693
|
-
- Musinsa is editorial menswear-leaning fashion — black-and-white minimalism, magazine-style spreads, restrained color. Optimised for "show me the look".
|
|
694
|
-
- ZIGZAG is fashion-as-playground for KR women — branded pink, photography-first, discovery-led, mobile-locked. Optimised for "let me stumble onto something I love".
|
|
695
|
-
-->
|
|
274
|
+
No motion duration, easing curve, animation, or reduced-motion treatment was observed in the supplied capture. The product-card carousel and quick-menu arrows establish only structural control evidence; they do not authorize a motion token or a claimed transition behavior.
|