oh-my-design-cli 1.6.0 → 1.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/AGENTS.md +1 -1
  2. package/README.ko.md +12 -0
  3. package/README.md +49 -0
  4. package/data/reference-fingerprints.json +957 -2
  5. package/dist/bin/oh-my-design.js +4 -3
  6. package/dist/bin/oh-my-design.js.map +1 -1
  7. package/dist/{install-skills-IETT2TBJ.js → install-skills-6QFSN5BN.js} +108 -42
  8. package/dist/install-skills-6QFSN5BN.js.map +1 -0
  9. package/package.json +9 -3
  10. package/scripts/postinstall.cjs +6 -6
  11. package/skills/claude-design/SKILL.md +385 -0
  12. package/skills/claude-design/references/claude-design-flow.md +425 -0
  13. package/skills/claude-design/references/codebase-analysis.md +373 -0
  14. package/skills/claude-design/scripts/analyze_codebase.py +1369 -0
  15. package/skills/claude-design/scripts/clickable_link.sh +48 -0
  16. package/skills/claude-design/scripts/collect_source.py +178 -0
  17. package/skills/claude-design/scripts/drive_claude_design.cjs +378 -0
  18. package/skills/claude-design/scripts/gather_references.py +437 -0
  19. package/web/references/91app/DESIGN.md +151 -0
  20. package/web/references/airtable/DESIGN.md +16 -2
  21. package/web/references/bithumb/DESIGN.md +170 -0
  22. package/web/references/bunjang/DESIGN.md +20 -1
  23. package/web/references/cakeresume/DESIGN.md +162 -0
  24. package/web/references/catchtable/DESIGN.md +19 -0
  25. package/web/references/classting/DESIGN.md +251 -0
  26. package/web/references/classum/DESIGN.md +19 -0
  27. package/web/references/coinone/DESIGN.md +218 -0
  28. package/web/references/dabang/DESIGN.md +19 -0
  29. package/web/references/devsisters/DESIGN.md +253 -0
  30. package/web/references/dji/DESIGN.md +0 -1
  31. package/web/references/drnow/DESIGN.md +331 -0
  32. package/web/references/fastcampus/DESIGN.md +19 -0
  33. package/web/references/flex/DESIGN.md +19 -0
  34. package/web/references/flo/DESIGN.md +306 -0
  35. package/web/references/fugle/DESIGN.md +250 -0
  36. package/web/references/gmarket/DESIGN.md +19 -0
  37. package/web/references/gogolook/DESIGN.md +131 -0
  38. package/web/references/grip/DESIGN.md +250 -0
  39. package/web/references/hahow/DESIGN.md +158 -0
  40. package/web/references/hogangnono/DESIGN.md +308 -0
  41. package/web/references/hyundaicard/DESIGN.md +177 -0
  42. package/web/references/inflearn/DESIGN.md +19 -0
  43. package/web/references/jkopay/DESIGN.md +249 -0
  44. package/web/references/jobkorea/DESIGN.md +310 -0
  45. package/web/references/kbank/DESIGN.md +18 -0
  46. package/web/references/kdan/DESIGN.md +160 -0
  47. package/web/references/kkbox/DESIGN.md +114 -0
  48. package/web/references/krafton/DESIGN.md +230 -0
  49. package/web/references/kream/DESIGN.md +18 -0
  50. package/web/references/laftel/DESIGN.md +253 -0
  51. package/web/references/lezhin/DESIGN.md +301 -0
  52. package/web/references/lunit/DESIGN.md +19 -0
  53. package/web/references/melon/DESIGN.md +153 -0
  54. package/web/references/momoshop/DESIGN.md +279 -0
  55. package/web/references/mustit/DESIGN.md +282 -0
  56. package/web/references/nhncloud/DESIGN.md +174 -0
  57. package/web/references/oliveyoung/DESIGN.md +19 -0
  58. package/web/references/payco/DESIGN.md +227 -0
  59. package/web/references/piccollage/DESIGN.md +277 -0
  60. package/web/references/rayark/DESIGN.md +132 -0
  61. package/web/references/riiid/DESIGN.md +228 -0
  62. package/web/references/sendbird/DESIGN.md +285 -0
  63. package/web/references/socar/DESIGN.md +18 -0
  64. package/web/references/toss-securities/DESIGN.md +19 -0
  65. package/web/references/trenbe/DESIGN.md +252 -0
  66. package/web/references/tving/DESIGN.md +18 -0
  67. package/web/references/upbit/DESIGN.md +19 -0
  68. package/web/references/upstage/DESIGN.md +18 -0
  69. package/web/references/velog/DESIGN.md +168 -0
  70. package/web/references/voicetube/DESIGN.md +227 -0
  71. package/web/references/wadiz/DESIGN.md +19 -0
  72. package/web/references/webflow/DESIGN.md +16 -2
  73. package/web/references/yeogiotte/DESIGN.md +19 -0
  74. package/data/architecture-proposals/2026-05-13-thin-install-fresh-fetch.md +0 -189
  75. package/data/issues/2026-05-13-multi-surface-schema-rfc.md +0 -67
  76. package/data/reference-audits/2026-05-13-kr10.md +0 -132
  77. package/data/reference-audits/2026-05-14-kr10.md +0 -72
  78. package/data/reference-audits/2026-05-15-kr10.md +0 -124
  79. package/data/research/2026-05-18-agent-landscape.md +0 -69
  80. package/data/research/2026-05-18-kr-style-presets.md +0 -572
  81. package/dist/install-skills-IETT2TBJ.js.map +0 -1
@@ -0,0 +1,253 @@
1
+ ---
2
+ id: laftel
3
+ name: "Laftel"
4
+ country: KR
5
+ category: consumer-tech
6
+ homepage: "https://laftel.net"
7
+ primary_color: "#816BFF"
8
+ logo:
9
+ type: favicon
10
+ slug: "https://www.google.com/s2/favicons?domain=laftel.net&sz=256"
11
+ verified: "2026-06-03"
12
+ omd: "0.1"
13
+ ---
14
+
15
+ # Laftel
16
+
17
+ Korea's largest anime streaming platform — a dual-mode (light/dark) product built around a vivid purple identity, fan-curated discovery, and legal access to Japan's animation catalog.
18
+
19
+ ## 1. Visual Theme & Atmosphere
20
+
21
+ Laftel's interface reads as a dark-first entertainment shell with a saturated violet accent, much like a premium streaming dashboard tuned for anime fans. The default experience leans toward deep charcoal backgrounds (#121212 / #000000) layered with a luminous purple (#816BFF) that signals interactivity, brand moments, and delight. In light mode the same purple pops against near-white surfaces (#FFFFFF / #F7F7F7), giving the product a punchy, youthful energy without the visual fatigue of a fully dark app. Thumbnail-heavy grids dominate layouts, so colour takes a supporting role — framing content rather than competing with it. The result is a streaming UI that feels simultaneously otaku-authentic and modern enough for a mainstream Korean OTT audience.
22
+
23
+ ## 2. Color Palette & Roles
24
+
25
+ - **Purple 500 (Brand Primary):** `#816BFF` — primary CTA buttons, active nav links, badges, icons, brand foreground
26
+ - **Purple 50 (Highlight):** `#F0EDFF` — slight button background (light), hover highlight wash
27
+ - **Purple 100 (Slight 2):** `#D9D3FF` — hover state for slight buttons
28
+ - **Purple Gray 800 (Dark Surface):** `#242537` — dark toast background, dark button-purple-gray surface
29
+ - **Purple Gray 900 (Deep Nav):** `#191B2A` — light-mode button-purple-gray accent, deep overlay
30
+ - **Background 1 (Light):** `#FFFFFF` — primary surface in light mode
31
+ - **Background 1 (Dark):** `#121212` — primary surface in dark mode
32
+ - **Background 2 (Dark base):** `#000000` — deepest dark background
33
+ - **Background 3:** `#EEEEEE` / `#323232` — skeleton, subtle dividers (light/dark)
34
+ - **Foreground 1 (Light):** `#121212` — primary text on light
35
+ - **Foreground 1 (Dark):** `#F7F7F7` — primary text on dark
36
+ - **Foreground 2:** `#505050` / `#E2E2E2` — secondary text (light/dark)
37
+ - **Foreground 3:** `#8A8A8A` / `#ABABAB` — tertiary / metadata text
38
+ - **Border 1:** `#EEEEEE` / `#323232` — default hairline separator
39
+ - **Red 300:** `#F16361` — error / destructive state
40
+ - **Red 500:** `#FF1010` — critical alert
41
+
42
+ ## 3. Typography Rules
43
+
44
+ - **Font family:** Pretendard (loaded via cdn.jsdelivr.net/gh/orioncactus/pretendard), falling back to -apple-system, BlinkMacSystemFont, system-ui, Roboto, "Noto Sans KR"
45
+ - **Base size:** 16px on `html, body`
46
+ - **Scale (web):** title-xxl 40px · title-xl 32px · title-l 28px · title-m 24px · title-s 20px · text-l 18px · text-m 16px · text-s 14px · text-xs 13px · text-xxs 12px
47
+ - **Weight:** 700 is the only declared weight in component CSS (nav links, badges, buttons, labels); body inherits from Pretendard's default
48
+ - **Line height:** 1.5 globally via `:root`; badge label `line-height: 150%`
49
+ - **Letter spacing:** `normal` reset on all elements
50
+ - **Smoothing:** `-webkit-font-smoothing: antialiased`
51
+
52
+ ## 4. Component Stylings
53
+
54
+ ### Buttons
55
+
56
+ **Primary (md)**
57
+ - Background: `#816BFF`
58
+ - Text: `#FFFFFF`
59
+ - Border: none
60
+ - Radius: 4px
61
+ - Height: 56px
62
+ - Padding: 0 18px
63
+ - Font: 18px / 700
64
+ - Hover background: `#6E58FF`
65
+
66
+ **Primary (sm)**
67
+ - Background: `#816BFF`
68
+ - Text: `#FFFFFF`
69
+ - Border: none
70
+ - Radius: 4px
71
+ - Height: 48px
72
+ - Padding: 0 20px
73
+ - Font: 16px / 700
74
+
75
+ **Slight (secondary)**
76
+ - Background: `#F0EDFF`
77
+ - Text: `#816BFF`
78
+ - Border: none
79
+ - Radius: 4px
80
+ - Height: 56px
81
+ - Hover background: `#D9D3FF`
82
+
83
+ **Disabled**
84
+ - Background: `#EEEEEE`
85
+ - Text: `#D0D0D0`
86
+ - Radius: 4px
87
+ - Height: 56px
88
+
89
+ ### Navigation Bar
90
+
91
+ **Desktop Nav**
92
+ - Background: `#FFFFFF` / `#121212` (themed via CSS var)
93
+ - Height: 4rem (64px)
94
+ - Padding: 0 3.125rem (50px)
95
+ - Active link color: `#816BFF`
96
+ - Default link color: `var(--foreground-1)`
97
+ - Hover link color: `#816BFF`
98
+ - Font: 0.875rem (14px) / 700
99
+ - Bottom border: 1px solid `var(--border-1)`
100
+
101
+ ### Badge / Pill
102
+
103
+ **Notification Badge**
104
+ - Background: `#816BFF`
105
+ - Text: `#FFFFFF`
106
+ - Radius: 50%
107
+ - Height: 1.0625rem (17px)
108
+ - Font: 0.625rem (10px) / 700
109
+
110
+ ### Toast
111
+
112
+ **Default Toast**
113
+ - Background: `#000000` (light) / `#242537` (dark)
114
+ - Text: `#FFFFFF`
115
+ - Radius: 0.25rem (4px)
116
+ - Padding: 1rem 0.75rem
117
+ - Min-height: 3rem (48px)
118
+ - Font: 0.875rem (14px)
119
+ - Transition: opacity 0.2s ease, transform 0.2s ease
120
+
121
+ ---
122
+ **Verified:** 2026-06-03
123
+ **Tier 1 sources:** https://laftel.net (homepage HTML — full CSS custom properties block in inline `<style>`); https://laftel.net/_next/static/chunks/b3ccd441-eef37a2225571c0d.js (styled-components button/badge/nav definitions, full PURPLE scale, font scale); https://laftel.net/_next/static/css/4e57b743a29280e8.css (Pretendard font import); https://apps.apple.com/kr/app/라프텔/id1169440095 (App Store listing, brand copy)
124
+ **Tier 2 sources:** getdesign.md/laftel — NOT LISTED ("No designs found for 'laftel'"). refero ?q=Laftel — no result (page returned empty listing, 4201 bytes).
125
+ **Conflicts unresolved:** none
126
+
127
+ ## 5. Layout Principles
128
+
129
+ - **Grid:** Thumbnail-first horizontal carousels and vertical grid layouts; desktop max-width ~1920px reference in font-size calc
130
+ - **Breakpoints:** desktop ≤1280px · tablet ≤1024px · tabletVertical ≤768px · mobile ≤480px · mobileLandscape (orientation: landscape, max-height 576px)
131
+ - **Nav hidden below:** 1024px (`.ksUJkh` display:none at tablet)
132
+ - **Content padding:** 3.125rem (50px) horizontal on desktop nav; responsive fluid via vw-based font-size calc
133
+ - **Spacing rhythm:** base unit 0.5rem (8px); typical component margin 1rem (16px), 1.5rem (24px), 2.5rem (40px)
134
+
135
+ ## 6. Depth & Elevation
136
+
137
+ - **Hairline separator:** `box-shadow: 0 1px 0 0 var(--border-1)` on sticky nav
138
+ - **Basic shadow:** `rgba(0,0,0,0.25)` light / `rgba(0,0,0,0.5)` dark
139
+ - **Dropdown shadow:** `rgba(0,0,0,0.16)` light / `rgba(0,0,0,0.6)` dark
140
+ - **Scroll thumb:** 4px transparent border, `background-clip: content-box`, `border-radius: 8px`
141
+ - **Dim overlays:** `rgba(0,0,0,0.5)` (dim-1 light) · `rgba(0,0,0,0.7)` (dim-1/2 dark)
142
+ - **Skeleton:** gradient shimmer `linear-gradient(to right, --background-3 0%, --background-1 25%, --background-3 50%)`, animated at 1.5s infinite linear
143
+
144
+ ## 7. Do's and Don'ts
145
+
146
+ ### Do
147
+ - Use `#816BFF` (PURPLE500) for all primary CTAs and interactive accent moments
148
+ - Apply the purple-50 wash (`#F0EDFF`) for non-primary ("slight") button backgrounds
149
+ - Use Pretendard at 700 weight for all button labels and nav text
150
+ - Respect the dual-mode token system — always reference CSS custom properties (`--foreground-1`, `--background-1`) rather than hardcoded colours in themed contexts
151
+ - Use 4px border-radius on buttons and toast components for brand consistency
152
+ - Ensure scrollbars use the 8px border-radius thumb treatment
153
+
154
+ ### Don't
155
+ - Mix hardcoded hex literals in themed components — breaks dark mode
156
+ - Use border-radius values other than 4px (buttons), 8px (scrollbar/card accent), or 50% (circular badges) without design intent
157
+ - Replace Pretendard with a generic sans-serif — the Korean glyph quality matters for this audience
158
+ - Use purple accent on disabled states — disabled buttons must use `#EEEEEE` / `#D0D0D0`
159
+ - Increase font-weight above 700 — the scale tops out here in the design system
160
+
161
+ ## 8. Responsive Behavior
162
+
163
+ - Desktop (>1280px): Full horizontal nav with 50px side padding; wide carousels; large hero at 51.375em height; font-size calculated from 1920px reference width
164
+ - Tablet (768px–1024px): Nav collapses to mobile; layout adapts fluid grids; hero resizes
165
+ - Mobile (≤480px): Font-size recalculated from 360px reference width via `calc(16vw / 360 * 100)`; mobile-specific image proportions; thumbnail grids shift to 2-column
166
+ - Touch devices: `-webkit-tap-highlight-color: transparent`; `touch-action: pan-y` on sliders; `maximum-scale=1` in viewport to prevent iOS zoom
167
+
168
+ ## 9. Agent Prompt Guide
169
+
170
+ When generating Laftel-style UI:
171
+ - **Palette:** primary = `#816BFF`; slight surface = `#F0EDFF`; deep dark = `#121212`; toast dark = `#242537`
172
+ - **Buttons:** 4px radius, 48px (sm) or 56px (md) height, font-weight 700, Pretendard
173
+ - **Mode:** always implement both light and dark variants via CSS custom properties
174
+ - **Typography:** Pretendard, 16px base, scale: 12/13/14/16/18/20/24/28/32/40px
175
+ - **Transitions:** colour changes at 0.4s, opacity/transform at 0.2s ease
176
+ - **Skeleton:** shimmer gradient from `--background-3` to `--background-1` at 1.5s linear infinite
177
+ - **Layout:** breakpoints at 480/768/1024/1280px; horizontal padding 50px desktop, fluid below
178
+
179
+ ## 10. Voice & Tone
180
+
181
+ **Three adjectives:** Fan-fluent, warm-direct, quietly authoritative
182
+
183
+ | Dimension | Do | Don't |
184
+ |---|---|---|
185
+ | Register | Speak as a knowledgeable fellow fan ("덕후") | Sound like a corporate broadcast |
186
+ | Sentence length | Short, punchy; one idea per sentence | Long nested clauses |
187
+ | Vocabulary | K-anime vernacular where natural; plain Korean elsewhere | Jargon-heavy or overly formal keigo-style |
188
+ | Punctuation | Light use of `:D` emoticons in taglines only | Exclamation marks on every line |
189
+
190
+ **Voice samples (illustrative):**
191
+ - *Illustrative:* "세상 모든 애니를 라프텔에서 :D" — the brand's own App Store tagline; warm, inclusive, fan-to-fan energy.
192
+ - *Illustrative:* "추억의 애니부터 분기별 신작까지, 무제한 스트리밍 가능한 곳은 오직 라프텔." — confident authority without boasting; the "only Laftel" claim lands as fact, not hype.
193
+ - *Illustrative:* "뭘 볼지 모를 땐, 덕후가 직접 엄선한 애니 명작들을 시청!" — peer credibility; the recommendation comes from fans, not algorithms.
194
+
195
+ ## 11. Brand Narrative
196
+
197
+ Laftel was founded in October 2014 by Kim Beom-jun, a Yonsei University student who saw that Korea's vast appetite for Japanese animation was being served almost entirely by illegal download sites. The name "라프텔(Laftel)" is a play on "마지막 화까지 봤다" — "I watched all the way to the last episode" — enshrining the complete, satisfying anime experience in the brand itself. The service launched streaming in May 2017, building on a personalization-first model: new users rate a set of anime to calibrate their taste, and the platform surfaces recommendations through both AI-driven signals and hand-curated selections by in-house "덕후" (hardcore fans).
198
+
199
+ In 2019 Ridi, Korea's leading digital content platform, acquired Laftel, bringing engineering scale and content licensing resources. In November 2022 an Aniplus-led consortium (Aniplus — Korea’s largest anime broadcaster — with Keistone Partners) acquired a controlling 87.75 % stake, giving Laftel deeper ties to broadcast rights and a clearer path to simulcast programming. Through each ownership transition the product's core mission remained stable: make legal anime viewing so convenient and affordable that piracy becomes the inferior choice.
200
+
201
+ Today Laftel offers SVOD (unlimited streaming), TVOD (pay-per-episode rental/purchase), and AVOD (ad-supported free tier), available across web, iOS, Android, smart TV, and Chromecast. The Laftel Store extends the brand into anime merchandise, while original productions — including webtoon adaptations like "Super Secret" — signal ambitions beyond licensing.
202
+
203
+ ## 12. Principles
204
+
205
+ 1. **Legal first, fan always.** Every content deal is a legitimate contract; the product's legitimacy is a brand promise, not just a legal formality. *UI implication:* never use dark-pattern flows to upsell; membership upgrade prompts must be clear and skippable.
206
+
207
+ 2. **Personalization over browsing.** The preference-test onboarding and tag-based discovery are not features — they are the product. *UI implication:* recommendation surfaces should occupy prime real estate and update dynamically; generic "Popular" lists are a fallback, not the default.
208
+
209
+ 3. **Complete the series.** The name encodes the ideal outcome: watch every episode. *UI implication:* auto-play next episode is on by default; progress tracking, episode skips (OP/ED), and continue-watching rails are first-class features.
210
+
211
+ 4. **Fan credibility at every touch-point.** Editorial selections are attributed to "덕후" curators, not anonymous algorithms. *UI implication:* show curator handles or "staff pick" labels on themed collections; avoid anonymous "Recommended for you" copy.
212
+
213
+ 5. **Dual-mode comfort.** Fans watch at night; the dark theme must be as polished as the light theme. *UI implication:* all design tokens must resolve correctly in both modes; never hard-code colours in theme-sensitive components.
214
+
215
+ ## 13. Personas
216
+
217
+ *Illustrative — Classic Fan (클래식 덕후):* Tomoyuki, 32, IT engineer in Seoul. Has watched anime since high school; wants a reliable legal home for classics (2000s titles) that free-tier competitors don't carry. Values breadth of catalog and tag-based search. Pays for the annual plan without hesitation.
218
+
219
+ *Illustrative — Seasonal Watcher (분기 팔로워):* Ji-yeon, 24, university student. Follows 3–5 simulcast series each season. She checks Laftel every Monday for the latest episode. Skips OP/ED religiously. Sensitive to price; on the base plan, occasionally upgrades for a single season.
220
+
221
+ *Illustrative — New Discoverer (입문자):* Soo-min, 19, high school senior whose friends are into anime. Took the preference quiz and got hooked on a romance series. Mostly watches on mobile; uses the free AVOD tier but nudgeable toward membership via free-trial CTA.
222
+
223
+ *Illustrative — Goods Fan (굿즈 덕후):* Mi-rae, 28, designer. Subscribes mainly to access Laftel Store drops and exclusive merch. Browses the store tab weekly. For her, the streaming subscription is a loyalty perk on top of merchandise access.
224
+
225
+ ## 14. States
226
+
227
+ - **Empty (no history):** Show the preference quiz CTA prominently — "어떤 애니를 좋아하세요? 취향 테스트로 시작해요" with a primary purple button; no blank grid.
228
+ - **Loading / Streaming buffer:** Purple spinner (32×32px, `#816BFF`, stroke-dasharray animated at 1.4s ease-in-out infinite) centered in the player.
229
+ - **Skeleton:** Shimmer gradient tiles (`linear-gradient(to right, --background-3 0%, --background-1 25%, --background-3 50%)`) at 1.5s linear infinite in place of thumbnails and text rows.
230
+ - **Error — Network:** Inline message "잠시 후 다시 시도해 주세요" with a secondary retry button (slight variant); red 300 (`#F16361`) icon accent.
231
+ - **Error — Unlicensed Content:** Overlay with dim-1 backdrop (`rgba(0,0,0,0.5)`) and a locked-icon illustration; "이 작품은 현재 지역 서비스 불가" copy; no CTA escalation.
232
+ - **Success — Subscription:** Toast notification slides up from bottom center: dark background (`#000000` light / `#242537` dark), white text, 4px radius, 0.2s ease slide + fade; auto-dismisses after ~3s.
233
+ - **Disabled:** Buttons use `#EEEEEE` background, `#D0D0D0` text; cursor: default; no hover effect.
234
+ - **Offline / Download available:** Download badge in purple; offline indicator swaps to muted foreground-3 (`#8A8A8A`).
235
+
236
+ ## 15. Motion & Easing
237
+
238
+ **Duration scale:**
239
+ - Micro (state toggle, colour): 200ms
240
+ - Short (slide-in, fade): 400ms
241
+ - Medium (skeleton shimmer): 1400ms–1500ms (loop)
242
+
243
+ **Easing:**
244
+ - Default transitions: `ease` (cubic-bezier(0.25, 0.1, 0.25, 1))
245
+ - Spinner stroke animation: `ease-in-out` at 1.4s infinite
246
+ - Skeleton shimmer: `linear` at 1.5s infinite
247
+ - Toast slide: `ease` on both `opacity` and `transform`
248
+
249
+ **Rules:**
250
+ - Colour and background-colour transitions run at 0.4s (`transition:color 0.4s`, `transition:background-color 0.4s,box-shadow 0.4s`) for interactive elements
251
+ - Opacity and positional transforms run at 0.2s ease for overlays and toasts
252
+ - Never animate layout-affecting properties (width, height) on the main content grid — use opacity/transform only
253
+ - Skeleton shimmer uses `background-size: 200% 100%` sweep; clip-path masks define thumbnail shapes
@@ -0,0 +1,301 @@
1
+ ---
2
+ id: lezhin
3
+ name: "Lezhin Comics"
4
+ country: KR
5
+ category: consumer-tech
6
+ homepage: "https://www.lezhin.com"
7
+ primary_color: "#eb0014"
8
+ logo:
9
+ type: favicon
10
+ slug: "https://www.google.com/s2/favicons?domain=lezhin.com&sz=256"
11
+ verified: "2026-06-03"
12
+ omd: "0.1"
13
+ ---
14
+
15
+ # Lezhin Comics
16
+
17
+ Korea's first premium webtoon platform — bold, content-first, and unapologetically direct.
18
+
19
+ ## 1. Visual Theme & Atmosphere
20
+
21
+ Lezhin Comics presents a dark, immersive canvas that keeps the spotlight firmly on cover art and episode thumbnails. The interface uses a deep near-black base (`#111115`) punctuated by a single vivid crimson (`#eb0014`) that signals every interactive action — from primary buttons to the switch-selected state and the badge on adult content. Grey neutrals (`#e9e9ec` border-muted through `#09090b` ink-black) form a tight tonal ladder, producing clean hierarchy without decorative flourish. Content grids are tight and image-led; typography is set in Pretendard for sharp legibility in Korean and Latin. The overall atmosphere is premium but unadorned — a platform confident that its 8,000+ titles speak louder than chrome.
22
+
23
+ ## 2. Color Palette & Roles
24
+
25
+ - **Brand Red:** `#eb0014` — primary CTA buttons, state-switch-selected, state-form-bg-selected, badge
26
+ - **Red Hover:** `#ff5254` — primary button hover state
27
+ - **Red Focus/Dark:** `#c40017` — badge background, button focus/active state
28
+ - **Ink Black:** `#111115` — inverted background, text-default, icon-default
29
+ - **Deep Dark:** `#09090b` — dark-strong surface
30
+ - **Dark Charcoal:** `#222225` — secondary button background, border-default
31
+ - **Soft Black:** `#36363a` — text-soft, icon-soft
32
+ - **Mid Grey:** `#6f6f77` — text-subtle, icon-subtle
33
+ - **Muted Grey:** `#a1a1a9` — text-muted, icon-muted, placeholder
34
+ - **Border Muted:** `#e9e9ec` — card borders, dividers
35
+ - **Surface Muted:** `#f4f4f5` — background muted, disabled button, skeleton base
36
+ - **White:** `#ffffff` — default background (light), text-inverted
37
+
38
+ ## 3. Typography Rules
39
+
40
+ - **Primary typeface:** Pretendard Variable → Pretendard → -apple-system → Noto Sans KR → Malgun Gothic → sans-serif
41
+ - **Scale:** 10 / 12 / 13 / 14 / 15 / 16 / 17 / 18 / 20 / 24 / 28 / 32 / 36 / 40 / 56 / 80px (mapped via `--size-3xs` through `--size-10xl`)
42
+ - **Body default:** 16px / weight 400 (regular)
43
+ - **Caption / metadata:** 12–13px / weight 400
44
+ - **Label / UI text:** 14px / weight 500 (medium) or 600 (semibold)
45
+ - **Button labels:** 14px (small/medium) or 16px (large) / weight 600
46
+ - **Section headers:** 18–24px / weight 700
47
+ - **Font weights available:** 400 (regular), 500 (medium), 600 (semibold), 700 (bold)
48
+ - **Line height:** 1.5 for body; 1.35–1.4 for compact UI labels; `line-height: 100%` for buttons
49
+ - **Letter spacing:** −0.28px to −0.36px for tighter display text in Korean
50
+
51
+ ## 4. Component Stylings
52
+
53
+ ### Buttons
54
+
55
+ **Primary (lzButtonPrimary / lzBtn--filled_red)**
56
+ - Background: `#eb0014`
57
+ - Text: `#ffffff`
58
+ - Border: none
59
+ - Radius: 4px
60
+ - Height: 48px
61
+ - Padding: 0 12px
62
+ - Font: 14px / 600
63
+
64
+ **Primary Large**
65
+ - Background: `#eb0014`
66
+ - Text: `#ffffff`
67
+ - Border: none
68
+ - Radius: 4px
69
+ - Height: 56px
70
+ - Padding: 0 16px
71
+ - Font: 16px / 600
72
+
73
+ **Secondary (lzButtonSecondary / lzBtn--filled_bw)**
74
+ - Background: `#222225`
75
+ - Text: `#ffffff`
76
+ - Border: none
77
+ - Radius: 4px
78
+ - Height: 48px
79
+ - Padding: 0 12px
80
+ - Font: 14px / 600
81
+
82
+ **Tertiary (lzButtonTertiary / lzBtn--filled_grey)**
83
+ - Background: `#f4f4f5`
84
+ - Text: `#36363a`
85
+ - Border: none
86
+ - Radius: 4px
87
+ - Height: 48px
88
+ - Padding: 0 12px
89
+ - Font: 14px / 600
90
+
91
+ **Outlined (lzBtn--outlined)**
92
+ - Background: transparent
93
+ - Text: `#36363a`
94
+ - Border: 1px solid `#a1a1a9`
95
+ - Radius: 4px
96
+ - Height: 40px
97
+ - Padding: 0 20px
98
+ - Font: 14px / 600
99
+
100
+ ### Cards
101
+
102
+ **Comic Thumbnail Card (lzCard)**
103
+ - Background: `#f4f4f5`
104
+ - Border: 1px solid `rgba(17,17,21,0.1)`
105
+ - Radius: 4px
106
+ - Aspect ratio: 2/3 (portrait)
107
+
108
+ **Circle Thumb Card (lzCardCircleThumb)**
109
+ - Radius: 9999px
110
+ - Border: tracked ring at 3px stroke
111
+
112
+ ### Chips (lzChip)
113
+
114
+ **Default Chip**
115
+ - Background: transparent
116
+ - Text: `#6f6f77`
117
+ - Border: 1px solid `#e9e9ec`
118
+ - Radius: 999px
119
+ - Padding: 0 12px
120
+ - Height: 32px
121
+
122
+ **Selected Chip**
123
+ - Background: `rgba(255,82,84,0.15)`
124
+ - Text: `#c40017`
125
+ - Border: 1px solid transparent
126
+ - Radius: 999px
127
+
128
+ ### Tabs (lzTab)
129
+
130
+ **Default Tab**
131
+ - Background: `rgba(17,17,21,0.04)`
132
+ - Text: `#111115`
133
+ - Border: 1px solid `rgba(17,17,21,0.04)`
134
+ - Radius: 4px
135
+ - Padding: 0 12px
136
+ - Height: 36px
137
+
138
+ **Selected Tab**
139
+ - Background: `rgba(17,17,21,0.95)`
140
+ - Text: `#ffffff`
141
+ - Radius: 4px
142
+
143
+ ### Dropdown / Select (lzSelectPaper)
144
+
145
+ **Dropdown Container**
146
+ - Background: `#ffffff`
147
+ - Border: 1px solid `#f4f4f5`
148
+ - Radius: 4px
149
+ - Padding: 12px 0
150
+
151
+ ---
152
+ **Verified:** 2026-06-03
153
+ **Tier 1 sources:** https://www.lezhin.com (homepage HTML + 5 CSS bundles: 035ea059869bfd89.css, 9161416b11db8c9e.css, 06e1ad77298be69d.css, 0427f27bd4442fbd.css, 895581ecc829564e.css), https://about.lezhin.com/en (corporate brand/about page)
154
+ **Tier 2 sources:** getdesign.md/lezhin — NOT LISTED (no data). refero — not checked (KR brand, typically no result).
155
+ **Conflicts unresolved:** none
156
+
157
+ ## 5. Layout Principles
158
+
159
+ Lezhin uses a fluid column-grid whose gutter and column count adapt per viewport: 7 columns on desktop (≥ 961px), 4 columns on tablet (640–960px), 3–4 columns on mobile (≤ 639px). Card widths are computed via `calc((100% - (col-1) × gap) / col)` with 4px or 8px gutters on dense grids and 12–16px gutters on sparser layouts. The horizontal page max-widths are 1036px at 961–1280px breakpoint and 1212px at 1281px+. Horizontal scroll snap is used for compact-carousel sections (snap-scroll list) on mobile. All interactive regions maintain at minimum 36px touch targets.
160
+
161
+ ## 6. Depth & Elevation
162
+
163
+ Elevation is expressed through the shadow token ladder:
164
+
165
+ - **Level 1 – Subtle:** `rgba(17,17,21,0.06)` — hero banner ambient, near-flat cards
166
+ - **Level 2 – Soft:** `rgba(17,17,21,0.08)` — dropdown menus (lzSelectPaper: `0 2px 12px 0 rgba(17,17,21,.08)`)
167
+ - **Level 3 – Medium:** `rgba(17,17,21,0.25)` — drawers, floating elements
168
+ - **Level 4 – Strong:** `rgba(17,17,21,0.30)` — modals
169
+ - **Level 5 – Bold:** `rgba(17,17,21,0.50)` — overlay scrim base
170
+ - **Thumbnail shadow:** `rgba(17,17,21,0.20)` inset on cover art
171
+ - **Dark overlay (full scrim):** `rgba(17,17,21,0.85)` — background-overlay-bold
172
+
173
+ Dark mode uses the same numeric scale but on the dark surface (`#111115`), so card depth reads via subtle border differences (`--border-muted: #222225`) rather than box-shadow contrast.
174
+
175
+ ## 7. Do's and Don'ts
176
+
177
+ ### Do
178
+ - Use `#eb0014` exclusively for the single highest-priority CTA per screen
179
+ - Apply Pretendard (or Noto Sans KR fallback) — never substitute decorative display fonts
180
+ - Follow the exact button-height ladder: 28px (xs) / 40px (sm) / 48px (md) / 56px (lg)
181
+ - Use the pill chip (`border-radius: 999px`) for filterable genre or tag selectors
182
+ - Maintain 4px radius on cards and rectanglular buttons for the characteristic sharp-yet-soft look
183
+ - Use the skeleton shimmer (`lzSkeleton` — 1.8s ease-in-out infinite) during async content loads
184
+ - Reserve the AI gradient (`#4CECBE → #00BFE2 → #007EE0`) only for AI-feature UI accents
185
+
186
+ ### Don't
187
+ - Don't use red for destructive warnings — Lezhin's red is a brand/action signal, not a danger signal
188
+ - Don't mix primary and secondary CTAs at equal visual weight on the same card or row
189
+ - Don't apply `border-radius` larger than 12px on rectangular interactive components (chips and avatars are exempt)
190
+ - Don't place light-mode text (`#111115`) directly on the dark surface (`#111115`) — toggle to inverted tokens
191
+ - Don't hard-code pixel color values — always reference the semantic CSS variable so dark-mode tokens apply correctly
192
+ - Don't add decorative illustration or icon embellishments inside buttons
193
+
194
+ ## 8. Responsive Behavior
195
+
196
+ Lezhin uses three primary breakpoints:
197
+
198
+ - **Mobile** `max-width: 960px` — single-column flow, horizontal-scroll carousels, paddings collapse to 8–16px, card grids shift to 3–4 columns
199
+ - **Tablet** `min-width: 640px and max-width: 960px` — 4–6 column grids, moderate gutters (12–16px), nav bar adjusts to compact mode
200
+ - **Desktop** `min-width: 961px` — 7-column grids, 24–32px gutters, full GNB nav, fixed sidebar elements appear
201
+
202
+ Additional breakpoints handle edge cases: `max-width: 639px` (small mobile, 3-col grids), `max-width: 320px` (reduced padding to 8px), `min-width: 1281px` (max-width: 1212px container). Components observe `prefers-color-scheme: dark` via 53 scoped media queries, switching semantic tokens to their dark-palette counterparts without changing the component markup.
203
+
204
+ ## 9. Agent Prompt Guide
205
+
206
+ When building Lezhin-styled UI:
207
+
208
+ - **Color:** Treat `#eb0014` as the single brand accent; use it on the primary button and selected-state only. All other UI operates on the grey ladder (#111115 → #e9e9ec → #ffffff).
209
+ - **Typography:** Set the font stack to `Pretendard Variable, Pretendard, -apple-system, Noto Sans KR, sans-serif`. Use 14px/600 for buttons, 16px/400 for body copy, 12px/400 for metadata.
210
+ - **Radius:** Default to 4px on buttons and cards. Use 999px for pills (chips, avatars). Avoid values above 12px on rectangular elements.
211
+ - **Spacing:** Prefer 4/8/12/16/20/24px spacing increments. Card gutters are 4px (dense) or 8–12px (standard).
212
+ - **Dark mode:** Swap `--bg-default` to `#111115`, `--text-default` to `#ffffff`, border tokens adjust automatically when referencing CSS variables.
213
+ - **Animation:** Transitions are `0.2s ease-in-out` for background-color and borders; `0.25s linear` for transforms. Skeleton is `1.8s ease-in-out infinite`.
214
+ - **States:** Disabled buttons carry `rgba(255,82,84,0.2)` background. Focus states use `#9e0018` for primary.
215
+
216
+ ## 10. Voice & Tone
217
+
218
+ **Brand voice:** Direct, confident, candid
219
+
220
+ The Lezhin voice is **솔직한** (honest/frank) — it does not hedge or oversell. Copy leans toward short declarative punches rather than elaborate prose. It speaks to adult readers who know what they want and appreciate the platform getting out of the way.
221
+
222
+ | Do | Don't |
223
+ |----|-------|
224
+ | Use short, punchy sentences | Use vague or corporate euphemisms |
225
+ | Be direct about content types | Sanitize mature topics with excessive euphemism |
226
+ | Address readers as adults who make their own choices | Be paternalistic or add unsolicited warnings |
227
+ | Use Korean naturally (informal register is fine) | Over-translate Korean idioms into stiff English equivalents |
228
+ | Let the content title and art do the heavy lifting | Over-describe what readers can see for themselves |
229
+
230
+ **Voice samples (illustrative):**
231
+ - *Illustrative:* "솔직한 재미 대폭발 — 당신이 찾던 진짜 웹툰." (Honest fun explosion — the real webtoon you've been looking for.)
232
+ - *Illustrative:* "매일 업데이트. 오늘 뭐 읽을까?" (Updated every day. What are you reading today?)
233
+ - *Illustrative:* "재미있는 만화를, 쉽게 결제해서, 편하게 보게 하자." (Let's make great comics easy to buy and comfortable to read.)
234
+
235
+ ## 11. Brand Narrative
236
+
237
+ Lezhin Entertainment was founded in April 2012 by Han Hee-sung (the blogger known as "lezhin") and developer Kwon Jung-hyuk, launching its Android app on June 7, 2013. The company was acquired by Seoul-listed KidariStudio in December 2020. The platform was built on a simple conviction: great comics deserve frictionless commerce. By introducing a coin-based micro-payment system at a time when most Korean webtoon platforms relied on ad revenue, Lezhin created South Korea's first premium webtoon marketplace — positioning itself as the platform for creators who wanted to earn and readers who wanted more.
238
+
239
+ The company's governing mission is that "stories can make the world a better place." Lezhin Entertainment operates as a global content company, running the Lezhin Comics platform across Korea, the United States, and Japan. Its catalogue spans over 8,000 titles, and beyond reading, Lezhin Studio adapts webtoon IPs into films, dramas, and games while the Lezhin Shop brings physical merchandise to fans who want to hold their favourite stories in their hands.
240
+
241
+ The brand's tagline — "솔직한 재미 대폭발" (honest fun explosion) — encapsulates the operating philosophy: candid about content, direct about pricing, and unapologetically focused on reader satisfaction. Lezhin's four stated values — duty and self-reliance, mutual respect, customer satisfaction, and innovation — underpin both its creator relationships and its product decisions, from daily episode release schedules to the coin economy.
242
+
243
+ ## 12. Principles
244
+
245
+ 1. **Reader first, always.** Every service decision begins with the question of how readers discover and enjoy content. *UI implication:* Thumbnail art is the dominant visual element; interface chrome is minimal so it never competes with the cover image.
246
+
247
+ 2. **Honest commerce.** Lezhin pioneered transparent paid webtoons. The pricing model is explicit — coins, costs, and episode counts are surfaced without dark patterns. *UI implication:* Coin balances and episode prices are always visible in context before purchase; no hidden upsells.
248
+
249
+ 3. **Candid about content.** The platform serves adult audiences without euphemism. *UI implication:* Genre and content-type badges (including adult tags) are shown directly on thumbnail cards rather than hidden behind additional taps.
250
+
251
+ 4. **Data and intuition in balance.** The founding team values "2% crazy" creative instinct alongside clear analytical thinking. *UI implication:* The platform ships experimental features (AI search, Snack short-drama) as clearly-labelled distinct experiences rather than silently folding them into the main flow.
252
+
253
+ 5. **Global through localisation.** Lezhin operates dedicated services for KR, US, and JP markets with locale-specific content curation rather than a one-size-fits-all approach. *UI implication:* Typography stacks, locale date formats, and content catalogues adapt per region rather than defaulting to a single language baseline.
254
+
255
+ ## 13. Personas
256
+
257
+ *Illustrative — for design scenario use only:*
258
+
259
+ **The Weekend Binge Reader** — A Korean professional in their late 20s who subscribes to Lezhin Premium. They open the app on Friday night, scan the "New Updates" carousel, and burn through three episodes of their favourite romance series back-to-back. They top up coins proactively rather than per-episode. For them, friction = bad; they want zero loading states and instant next-episode transitions.
260
+
261
+ *Illustrative — for design scenario use only:*
262
+
263
+ **The Genre Explorer** — A 32-year-old who discovered Lezhin through a recommendation for a specific genre (BL, thriller, or isekai). They use the tag-filter chip system heavily and bookmark titles for later. They read on both mobile and desktop and expect the reading experience to be consistent across devices.
264
+
265
+ *Illustrative — for design scenario use only:*
266
+
267
+ **The Loyal Creator Fan** — A college student who follows a specific artist and gets notified for every update. They comment frequently using the page-stamp system and engage with the creator's social feeds. Price sensitivity is moderate; they will spend coins on a title they love but are cautious about new unfamiliar series.
268
+
269
+ *Illustrative — for design scenario use only:*
270
+
271
+ **The International Reader** — An English-speaking reader in the US or Japan accessing Lezhin via lezhinus.com or the JP equivalent. They tend toward licensed titles with professional translation. They are brand-new to the coin system and need clear onboarding. The UI's Korean-first defaults (label copy, currency display) can create friction if not properly localised.
272
+
273
+ ## 14. States
274
+
275
+ - **Empty (no content):** Shows the `lzEmpty` component with an illustrated book image (96×140px from `ccdn.lezhin.com/files/assets/img/empty-book-lt.png`); title in `#36363a` at 18px / weight 500; subtitle in `#6f6f77` at default size / weight 400
276
+ - **Loading (skeleton):** `lzSkeleton` — background `#f4f4f5`; shimmer overlay `hsla(0,0%,100%,0.6)` animated via `linear-gradient(120deg, transparent 35%, shimmer 50%, transparent 65%)` at 1.8s ease-in-out infinite; dark-mode variant uses `#3a3b3d` base and `hsla(0,0%,100%,0.08)` shimmer
277
+ - **Error (network/500):** `lzError` component centered at max-width 640px; title `#111115` at 34px / weight 500 (desktop) or 24px (mobile); error illustration displayed at `width: auto; height: 180px`; home button uses primary red CTA
278
+ - **Error (expired/access denied):** Same `lzError` structure; uses specific expired-state illustration (132px wide); body text in `#6f6f77` at 14px; action CTA in red primary button
279
+ - **Success:** State-form-bg-selected `#eb0014` applied to radio/checkbox fill; switch tracks when selected use `#eb0014`; snackbar uses dark `#2f353e` background with `#ffffff` text and blue-tinted link `#2992d6`
280
+ - **Skeleton (card-specific):** Comic card background holds `#f4f4f5` while image lazy-loads; once loaded, image covers the background fully with `object-fit: cover`
281
+ - **Disabled:** Primary button background `rgba(255,82,84,0.2)` with `#ffffff` text; tertiary button background `#fafafa` with `#dadadd` text; pointer-events none applied via attribute `[disabled]`
282
+
283
+ ## 15. Motion & Easing
284
+
285
+ **Duration scale:**
286
+ - **Fast (micro-interactions):** 125ms — sort-arrow expand/collapse
287
+ - **Standard:** 200ms — button background/border transitions, tab color, opacity fades (snackbar)
288
+ - **Deliberate:** 250ms — slide-in/slide-out transforms (drawer, sheet transitions), switch track background, skeleton reveal height
289
+
290
+ **Easing:**
291
+ - `ease-in-out` — background-color and border transitions on buttons and tabs
292
+ - `linear` — switch thumb position and track color
293
+ - `ease-in-out` — skeleton shimmer sweep (1.8s)
294
+
295
+ **Rules:**
296
+ - Button hover/focus: 200ms ease-in-out on `background-color` and `border`
297
+ - Drawer / bottom-sheet: `transform 250ms ease-in-out, opacity 250ms ease-in-out` — enters from below or from the left
298
+ - Snackbar: `opacity 200ms` fade-in / fade-out; no transform movement
299
+ - Skeleton: `translateX(-100% → 100%)` over 1.8s ease-in-out infinite; never use shorter durations as it feels cheap against dense content grids
300
+ - Switch: `250ms linear` for track background, `250ms linear` for circle position — simultaneous, never staggered
301
+ - AI gradient divider (search bar): `translateX` at 3s ease-in-out infinite — slower to feel ambient, not urgent
@@ -10,6 +10,25 @@ logo:
10
10
  slug: "https://www.google.com/s2/favicons?domain=lunit.io&sz=256"
11
11
  verified: "2026-05-14"
12
12
  omd: "0.1"
13
+
14
+ ## 16. Do's and Don'ts
15
+
16
+ ### Do
17
+ - Set every section, card, image, input, and footer to `border-radius: 0` and round only the single primary CTA pill to `100px`, honoring the binary radius thesis
18
+ - Pair ClashGrotesk for headings and Lexend for body, keeping both at LIGHT weights — H1 at 78px/84px weight 400, body at 18.4px weight 300 — so authority reads through size and air, not heft
19
+ - Fill the primary marketing CTA as a black pill (`#000000` background, `#ffffff` label) and withhold the signature blue `#1032cf` from primary actions
20
+ - Set body ink in warm-cool gunmetal `#232f32` and hero H1 in near-black `#151515`, never pure `#000`, for standing copy
21
+ - Build depth through full-bleed band switching (white canvas → black band → off-white footer `#eff0f4`) with `box-shadow: none` everywhere
22
+ - Reserve the signature blue `#1032cf` (bright sibling `#2a4eef`) for system, cookie, hover, and dark-band moments, and use AOS scroll-reveal fades as the only motion
23
+
24
+ ### Don't
25
+ - Apply mid-range radii like 4px, 6px, 8px, 12px, or 16px anywhere, or round cards, images, or surfaces that are not the primary action
26
+ - Use the saturated signature blue `#1032cf` on the primary CTA — the brand-action color is black, and blue is deliberately withheld
27
+ - Reach for bold or semibold typographic weights to add confidence; LIGHT weight is the rule across all heading levels
28
+ - Add drop shadows or floating card elevation — depth comes from band switching, not floating objects
29
+ - Add hero video autoplay, parallax, or animated stat counters on the `10,000+` band; keep motion to low-amplitude AOS fades
30
+ - Introduce stock smiling-team photography, hex-mesh/circuit-board/neural-net cliché, multi-accent green-blue-orange palettes, exclamation marks, or emotive verbs like 'transform lives'
31
+
13
32
  ---
14
33
 
15
34
  # Design System Inspiration of Lunit