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,306 @@
1
+ ---
2
+ id: flo
3
+ name: "FLO"
4
+ country: KR
5
+ category: consumer-tech
6
+ homepage: "https://www.music-flo.com"
7
+ primary_color: "#3f3fff"
8
+ logo:
9
+ type: favicon
10
+ slug: "https://www.google.com/s2/favicons?domain=music-flo.com&sz=256"
11
+ verified: "2026-06-03"
12
+ omd: "0.1"
13
+ ---
14
+
15
+ # FLO
16
+
17
+ FLO (플로) is South Korea's music streaming platform operated by Dreamus Company, offering 120 million tracks with deep personalization and AI-driven discovery.
18
+
19
+ ## 1. Visual Theme & Atmosphere
20
+
21
+ FLO's interface reads as clean, luminous, and quietly energetic. A pure electric blue (`#3f3fff`) punches through an overwhelmingly white canvas, anchoring interactive elements — buttons, progress bars, active tab indicators, and checked inputs — with a single, unwavering brand hue. The surrounding palette is almost entirely achromatic: near-black body text on white surfaces, mid-greys for metadata, and a barely-there light grey for resting chips and dividers. This restraint keeps the music and cover art front and center. A muted rose-pink (`#ff4d78`) appears only in error or warning states, creating a deliberate secondary signal language. Overall the product feels like a clean audio studio: cool-toned, confident, and built for extended listening sessions without visual fatigue.
22
+
23
+ ## 2. Color Palette & Roles
24
+
25
+ - **Brand Blue:** `#3f3fff` — primary CTA buttons, active tab underline, progress fill, checked-state labels
26
+ - **Blue Pressed / Hover:** `#2f2fae` — darkened blue on button press
27
+ - **Blue Pressed:** `#1a1a86` — pressed/active primary button state
28
+ - **Blue Mid (Player):** `#576aff` — mini-player seek bar fill
29
+ - **Blue Light:** `#7286ff` — lighter tint used on selected items, soft accents
30
+ - **Indigo Variant:** `#525cfd` — voucher card surfaces and secondary action text
31
+ - **Error / Alert Pink:** `#ff4d78` — error border, incorrect input highlight
32
+ - **White:** `#ffffff` — primary surface, button text on blue
33
+ - **Body Text:** `#181818` — headings, input values, primary labels
34
+ - **Secondary Text:** `#333333` — standard body copy, links (default)
35
+ - **Tertiary / Meta:** `#989898` — timestamps, secondary metadata
36
+ - **Placeholder:** `#c4c4c4` — input placeholder text
37
+ - **Divider:** `#ebebeb` — input underlines, hairline rules
38
+ - **Surface Grey:** `#f5f5f5` — inactive tab/chip backgrounds
39
+ - **Track Grey:** `#323232` — player progress track (unfilled)
40
+
41
+ ## 3. Typography Rules
42
+
43
+ - **Typeface:** Pretendard Variable → Pretendard → -apple-system → BlinkMacSystemFont → Roboto → Segoe UI → Helvetica → sans-serif
44
+ - **Body base:** 14px / 400 — most-used size for metadata and list items
45
+ - **Primary body:** 15px / 400–500 — track titles, main UI copy
46
+ - **Small:** 12px / 400 — timestamps, tags, chip labels
47
+ - **Label:** 13px / 500 — secondary labels, navigation items
48
+ - **Subhead:** 16px / 600 — section headers, modal titles
49
+ - **Section Title:** 18px / 600 — major section headings
50
+ - **Display Small:** 22–28px / 700 — promotional copy, chart numbers
51
+ - **Display Large:** 30–38px / 700 — hero callouts, large feature text
52
+ - **Input text:** 15px / 400 with `#181818`; search bar 28px / 700
53
+ - **Line height:** 1.2 default; labels and button text use explicit line-height matching the component height
54
+
55
+ ## 4. Component Stylings
56
+
57
+ ### Primary Button (Blue CTA)
58
+
59
+ **Standard (btn_bg_blue_s)**
60
+ - Background: `#3f3fff`
61
+ - Text: `#ffffff`
62
+ - Height: 36px
63
+ - Padding: 0 15px
64
+ - Radius: 5px
65
+ - Font: 14px / 400
66
+
67
+ **Large CTA (btn_bg_error_b base)**
68
+ - Background: `#3f3fff`
69
+ - Text: `#ffffff`
70
+ - Height: 62px
71
+ - Padding: 0 92px
72
+ - Font: 18px / 400
73
+
74
+ **Hover / Pressed**
75
+ - Background: `#2f2fae`
76
+ - Text: `#ffffff`
77
+
78
+ **Pressed / Active**
79
+ - Background: `#1a1a86`
80
+ - Text: `#ffffff`
81
+
82
+ ### Pill / Round Button
83
+
84
+ **Small Pill (btn-round)**
85
+ - Background: `#3f3fff`
86
+ - Text: `#ffffff`
87
+ - Height: 28px
88
+ - Padding: 0 12px
89
+ - Radius: 15px
90
+ - Font: 12px / 500
91
+
92
+ **Medium Pill (btn-buy)**
93
+ - Background: `#3f3fff`
94
+ - Text: `#ffffff`
95
+ - Height: 32px
96
+ - Padding: 0 17px
97
+ - Radius: 22px
98
+ - Font: 14px / 400
99
+
100
+ **Ghost Outline Chip (header-multi-track-search-button)**
101
+ - Background: `#ffffff`
102
+ - Text: `#3f3fff`
103
+ - Border: 0.5px solid `#3f3fff`
104
+ - Radius: 16px
105
+ - Padding: 9px 15px
106
+ - Font: 12px / 500
107
+
108
+ ### Text Input
109
+
110
+ **Default (comp_inp_txt)**
111
+ - Background: `#ffffff`
112
+ - Text: `#181818`
113
+ - Border: 1px solid `#ebebeb` (bottom only)
114
+ - Height: 58px
115
+ - Font: 15px / 400
116
+
117
+ **Password (comp_inp_pw)**
118
+ - Background: `#ffffff`
119
+ - Text: `#181818`
120
+ - Border: 1px solid `#ebebeb` (bottom only)
121
+ - Height: 58px
122
+ - Font: 15px / 400
123
+
124
+ **Focus**
125
+ - Border: 1px solid `#181818`
126
+
127
+ **Error**
128
+ - Border: 1px solid `#ff4d78`
129
+
130
+ **Valid / OK**
131
+ - Border: 1px solid `#3f3fff`
132
+
133
+ **Placeholder**
134
+ - Text: `#c4c4c4`
135
+
136
+ ### Card / Content Surface
137
+
138
+ **Album Thumbnail**
139
+ - Radius: 6px
140
+ - Height: 175px
141
+
142
+ **Voucher / Subscription Card**
143
+ - Background: `#f4f5f8`
144
+ - Radius: 8px
145
+ - Padding: 50px 60px
146
+
147
+ **Active Voucher Card**
148
+ - Background: `#525cfd`
149
+ - Text: `#ffffff`
150
+ - Radius: 8px
151
+
152
+ ### Navigation Tab
153
+
154
+ **Active Tab (main)**
155
+ - Text: `#3f3fff`
156
+ - Background: `#ffffff`
157
+ - Underline: 2px solid `#3f3fff`
158
+
159
+ **Inactive Tab**
160
+ - Text: `#6d6d6d`
161
+ - Background: `#f5f5f5`
162
+
163
+ **Hover Tab**
164
+ - Text: `#3f3fff`
165
+
166
+ ---
167
+ **Verified:** 2026-06-03
168
+ **Tier 1 sources:** https://www.music-flo.com (homepage HTML, 2026-06-03); https://cdn.music-flo.com/poc/p/fe/2026_05/291607/main.css (production CSS bundle, 467 KB, 2026-06-03); https://apps.apple.com/kr/app/flo-%ED%94%8C%EB%A1%9C/id1129048043 (App Store KR listing, 2026-06-03)
169
+ **Tier 2 sources:** getdesign.md/flo — NOT LISTED (returned "No designs found"). refero ?q=FLO — no result (KR brand, no refero entry expected).
170
+ **Conflicts unresolved:** none
171
+
172
+ ## 5. Layout Principles
173
+
174
+ - Desktop breakpoint: 1070px minimum container width; content area up to 960px centered
175
+ - Header height fixed at 96px with 80px horizontal padding
176
+ - Vertical rhythm anchors at 15px (body) and 25–50px (section gutters)
177
+ - Album grid uses 175×175px thumbnail cells with 14px top padding and 15px bottom margin
178
+ - Player bar fixed to bottom; full-screen player overlays entire viewport
179
+ - Mobile: container padding collapses to 30px horizontal at ≤955px; header padding reduces proportionally
180
+
181
+ ## 6. Depth & Elevation
182
+
183
+ - **Level 0 (flat surface):** No shadow — list items, inactive tabs, default cards
184
+ - **Level 1 (floating card):** `box-shadow: 0 4px 20px 0 rgba(0,0,0,0.10)` — album cover hover, dropdown menus, settings panels
185
+ - **Level 2 (modal / sheet):** `box-shadow: 0 6px 15px 0 rgba(0,0,0,0.20)` — popup overlays, player download modal
186
+ - **Overlay scrim:** `rgba(0,0,0,0.50)` — modal backdrop
187
+ - **Dark scrim (player art):** `rgba(0,0,0,0.80)` — full-screen player overlay behind controls
188
+
189
+ ## 7. Do's and Don'ts
190
+
191
+ ### Do
192
+ - Use `#3f3fff` exclusively for the single primary action on any given screen
193
+ - Apply Pretendard at 14–15px for all body copy to maintain readability across light and dark surfaces
194
+ - Keep album artwork as the dominant visual; let cover art supply color temperature to each screen
195
+ - Use pill shapes (radius 15–22px) for purchase and streaming action buttons; use square-cornered (radius 5px) for utility actions
196
+ - Reserve `#ff4d78` strictly for error, warning, and incorrect-input states
197
+ - Maintain bottom-border-only treatment on text inputs to preserve a clean, understated form aesthetic
198
+
199
+ ### Don't
200
+ - Don't apply blue to more than one CTA per screen — dilutes the click-priority hierarchy
201
+ - Don't mix the indigo variant (`#525cfd`) and the primary blue (`#3f3fff`) on adjacent interactive elements
202
+ - Don't use drop shadows on flat list rows — elevation is reserved for floating layers only
203
+ - Don't reduce body text below 12px — smallest label size in production is 12px
204
+ - Don't apply border-radius above 22px to rectangular content cards — pill radius is reserved for action chips and buttons
205
+
206
+ ## 8. Responsive Behavior
207
+
208
+ - Desktop (≥1070px): full sidebar nav, 960px content column, 80px horizontal padding, 96px header
209
+ - Tablet (956–1069px): sidebar collapses; content padding reduces to 30px
210
+ - Mobile (≤955px): container padding 30px; album thumbnail grid reflows to single column; header condenses; player bar remains pinned to bottom
211
+ - Font sizes do not scale with viewport — fixed px values used throughout; line heights compensate via explicit pixel or rem values (0.9375rem = 15px used in some components)
212
+
213
+ ## 9. Agent Prompt Guide
214
+
215
+ When building UI components that match FLO's design language:
216
+ - Set the primary action button to `background:#3f3fff`, `color:#fff`, `border-radius:5px` for rectangular or `border-radius:20px` for pill shapes, height 36px (small) or 62px (large CTA)
217
+ - Use `font-family: 'Pretendard Variable', Pretendard, -apple-system, BlinkMacSystemFont, Roboto, 'Segoe UI', Helvetica, sans-serif` as the single font stack
218
+ - Body text: `color:#333; font-size:14px; font-weight:400`
219
+ - Heading text: `color:#181818; font-size:16–18px; font-weight:600`
220
+ - Inputs: `border:0; border-bottom:1px solid #ebebeb; height:58px; font-size:15px; color:#181818`; on focus, `border-bottom-color:#181818`; on error, `border-bottom-color:#ff4d78`; on valid, `border-bottom-color:#3f3fff`
221
+ - Card surfaces: `background:#f4f5f8; border-radius:8px` (neutral) or `background:#3f3fff; border-radius:8px` (highlighted/active)
222
+ - Box shadows for floating elements: `0 4px 20px 0 rgba(0,0,0,0.10)`
223
+ - Error / warning accent: `#ff4d78` — use only for error states, never as a decorative color
224
+
225
+ ## 10. Voice & Tone
226
+
227
+ **Adjectives:** Friendly, direct, unforced.
228
+
229
+ | Dimension | Do | Don't |
230
+ |---|---|---|
231
+ | Register | Conversational Korean; speak to listeners like a fellow music fan | Corporate, stiff, or overly formal speech |
232
+ | Sentence length | Short punchy phrases (4–8 syllables) | Long compound clauses that bury the point |
233
+ | Emotional temperature | Warm enthusiasm about discovery, calm confidence about features | Hype superlatives ("best ever", "revolutionary") |
234
+ | Personalization | Speak about the listener's taste as genuinely theirs | Generic "music lovers" phrasing |
235
+
236
+ **Voice samples (illustrative):**
237
+ - "가볍게, 나답게 FLO." — the brand tagline; conveys effortlessness and personal identity in six syllables.
238
+ - "내가 원하는 음악이 물 흐르듯 끊임없이 흘러나온다." — (Illustrative) The music you want flows ceaselessly, like water — sensory and unhurried.
239
+ - "1억 곡 중에서 딱 나의 취향만." — (Illustrative) From 100 million songs, exactly my taste — confident without bragging.
240
+ - "오늘 기분에 맞는 음악, FLO가 먼저 알아요." — (Illustrative) FLO knows the music for your mood before you do — AI personalization stated as a quiet fact, not a feature claim.
241
+
242
+ ## 11. Brand Narrative
243
+
244
+ FLO launched in December 2018 as SK Telecom's answer to a market dominated by chart-first streaming services. Rather than leading with popularity rankings, FLO put personal taste on the home screen from day one — a deliberate counterpoint to the chart-centric paradigm that had defined Korean music streaming. The name itself is a promise: music flows, the way water does, continuously and without effort.
245
+
246
+ In 2021 the service was spun into Dreamus Company as an independent entity, inheriting SK Telecom's scale and infrastructure while gaining the flexibility to pursue a broader creative vision. The platform expanded from simple streaming into a fan ecosystem — RE;CORD (an automatic musical memoir organized by date and genre), FLO Studio (artist collaboration space), and in 2026, FLO Shop (global music merchandise). Each expansion stays anchored to the same premise: music is personal, and every listener deserves a platform that treats their taste as unique.
247
+
248
+ Today FLO serves 120 million tracks and positions itself at the intersection of music, fan culture, and algorithmic empathy. Its design language — restrained, blue-anchored, and content-first — expresses the same philosophy in pixels: get out of the way of the music, and let the listener find themselves in it.
249
+
250
+ ## 12. Principles
251
+
252
+ 1. **Taste is personal, not statistical.** FLO's recommendations lead with the individual listener's history, not chart position. *UI implication:* Home feed surfaces personal recommendations above any global trending section; personalized sections appear before editorial ones in the visual hierarchy.*
253
+
254
+ 2. **Flow without friction.** The brand name is a metaphor for effortless continuity — one song leading naturally to the next. *UI implication:* Autoplay and session-continuation are on by default; every disruptive confirmation dialog must earn its place; bottom-sheet modals slide up rather than hard-cut.*
255
+
256
+ 3. **Content leads, chrome follows.** Album artwork and track identity are the primary visual elements on every screen. *UI implication:* Brand blue appears only on interactive affordances; large areas of white and near-white keep the interface from competing with cover art.*
257
+
258
+ 4. **Clarity at every state.** Users should always know what is playing, what will play next, and what action the system expects of them. *UI implication:* The player bar is persistent; active/selected states use high-contrast blue with no ambiguity; error states switch to pink immediately with an explanatory label.*
259
+
260
+ 5. **Small moments of delight, not spectacle.** Animations are quick and purposeful — opacity fades at 0.3s, transforms at 0.25s — reinforcing response rather than demanding attention. *UI implication:* Motion budget is conservative; never block user intent with decorative animation; transitions serve orientation, not entertainment.*
261
+
262
+ ## 13. Personas
263
+
264
+ *Illustrative Daily Listener — "Minjeong, 28, Seoul"*
265
+ A professional who commutes by subway and needs music to shift her mental state within seconds. She rarely browses manually; she trusts FLO's daily mix to surface what she didn't know she needed. She uses the app in dark mode. A missed recommendation feels like a broken promise.
266
+
267
+ *Illustrative Fan Tracker — "Junho, 22, Busan"*
268
+ A K-pop enthusiast who follows specific artists religiously. He uses FLO's artist pages, checks chart positions, and purchases limited merchandise through FLO Shop. He opens the app multiple times a day and reads every notification from followed artists.
269
+
270
+ *Illustrative Casual Subscriber — "Hyunsook, 45, Incheon"*
271
+ An SKT subscriber who joined FLO through a bundled telecom plan. She plays background music while cooking and hasn't changed her playlist in weeks. The app needs to be completely transparent — no setting she didn't ask for, no screen she doesn't recognize.
272
+
273
+ *Illustrative Discovery Explorer — "Taeyun, 31, Daejeon"*
274
+ A crate-digger who uses FLO specifically for its genre-deep catalog, particularly indie and J-POP content. He triggers recommendations by seeding a niche track and is delighted when the algorithm surprises him. He evaluates FLO against its promise of 120 million tracks every time he searches for something obscure.
275
+
276
+ ## 14. States
277
+
278
+ - **Empty (no music history):** Soft illustration with prompt text; primary blue CTA "지금 음악 찾기" (Find music now); no error language
279
+ - **Empty (no search results):** Centered message at 16px/600 with secondary suggestion to try broader terms; zero shadows or borders to avoid visual noise
280
+ - **Loading (track list):** Skeleton rows — grey `#ebebeb` bars at content widths, animated shimmer; no spinner overlay
281
+ - **Loading (player artwork):** Album art placeholder in `#f5f5f5` with rounded corners matching the 6px radius; audio begins before art resolves
282
+ - **Error (network, playback failed):** Pink `#ff4d78` inline label below the affected control; retry button in outline style with `#3f3fff` text; no full-screen block unless unrecoverable
283
+ - **Error (input validation):** Bottom border switches to `#ff4d78`; helper text appears in `#ff4d78` at 12px below the field
284
+ - **Success (purchase complete):** Confirmation screen with checkmark icon in `#3f3fff`; message at 18px/600; secondary action to "내 구독 보기" (View my subscription)
285
+ - **Skeleton (browse feed):** Fixed-dimension grey blocks at album thumbnail proportions (175×175px) with 6px radius; staggered fade-in on resolution
286
+ - **Disabled (button):** `opacity: 0.2` on the base `#3f3fff` (no color change); pointer-events removed
287
+ - **Disabled (input):** `color: rgba(59,59,59,0.3); background-color: hsla(0,0%,94%,0.3)`; border-bottom remains at `#ebebeb`
288
+
289
+ ## 15. Motion & Easing
290
+
291
+ **Duration scale:**
292
+ - **Instant (0ms):** State changes with no visual transition (checked state icon swap)
293
+ - **Fast (150ms):** Micro-interactions: tooltip appear, focus ring appear
294
+ - **Standard (200–250ms):** Most UI transitions: `transform 0.25s ease-in`, fade overlays
295
+ - **Deliberate (300ms):** Opacity fade on full player overlay: `opacity 0.3s`
296
+ - **Entrance (300ms + 150ms delay):** Slide-in panel: `transform 0.15s ease-in` with `0.3s` delay for stagger
297
+
298
+ **Named easing:**
299
+ - `ease-in` — exits and element entrances (elements accelerate into resting position)
300
+ - `linear` — scrollbar opacity: `opacity 0.2s linear` — neutral, non-physical
301
+
302
+ **Motion rules:**
303
+ - Player seek bar fill uses continuous transition so that progress feels live, not stepped
304
+ - Volume slider uses the same `#3f3fff` fill with identical easing as the playback progress bar — consistent system language
305
+ - Modal bottom-sheets translate on Y axis; they do not scale or fade — orientation is preserved through directional motion
306
+ - Never autoplay video or looping animation in the browse feed — audio is the product; visual motion competes with listening attention
@@ -0,0 +1,250 @@
1
+ ---
2
+ id: fugle
3
+ name: "Fugle"
4
+ country: TW
5
+ category: fintech
6
+ homepage: "https://www.fugle.tw"
7
+ primary_color: "#f4af1c"
8
+ logo:
9
+ type: favicon
10
+ slug: "https://www.google.com/s2/favicons?domain=fugle.tw&sz=256"
11
+ verified: "2026-06-03"
12
+ omd: "0.1"
13
+ ---
14
+
15
+ # Fugle
16
+
17
+ Taiwan's visual-first stock research and trading platform, built by investors for serious investors.
18
+
19
+ ## 1. Visual Theme & Atmosphere
20
+
21
+ Fugle's interface speaks the language of precision and calm confidence. A predominantly light, near-white canvas — `#f5f5f5` for secondary surfaces, `#ffffff` for foreground containers — keeps the dense data of Taiwan equity markets easy to scan without overwhelming the eye. Against this quiet ground, the brand's signature amber `#f4af1c` appears sparingly but unmistakably: loading indicators, live-chat buttons, version badges, and chart reference lines all carry the same warm gold tone. The dark theme inverts the arrangement, dropping to a near-black `#131313` base with `#323232` surface layers, letting red and green trading signals pop with strong luminance contrast. Two modes share the same structural rhythm — compact rows, 4 px and 8 px radii, tight 12–14 px body type — giving both themes an identical sense of discipline and information density appropriate to active trading.
22
+
23
+ ## 2. Color Palette & Roles
24
+
25
+ - **Brand Amber:** `#f4af1c` — primary brand color; loading spinners, live-chat button, version badges, chart line accent, primary CTA background
26
+ - **Amber Dark:** `#e49b00` — hover state for primary buttons (`--p60`), icon fills on emphasis
27
+ - **Amber Tint:** `#fef4cf` — soft background for amber-highlighted content areas (`--p20`)
28
+ - **Secondary Blue:** `#4c85a0` — secondary interactive elements, link text default (`--s`, `--color-neutral-link-50`)
29
+ - **Secondary Blue Dark:** `#36708c` — secondary blue hover (`--s60`)
30
+ - **Surface White:** `#ffffff` — card backgrounds, modal surfaces, `--color-neutral-00-white`
31
+ - **Background Secondary:** `#f5f5f5` — page backgrounds, hover fills (`--color-neutral-04`)
32
+ - **Border Default:** `#eaeaea` — dividers, default strokes (`--color-neutral-08`)
33
+ - **Border Heavy:** `#dfdfdf` — emphasized borders (`--color-neutral-13`)
34
+ - **Secondary Text:** `#8b8a8a` — muted labels, helper text (`--color-neutral-46`)
35
+ - **Body Text:** `#323232` — primary foreground text (`--color-neutral-80`)
36
+ - **Dark Surface:** `#131313` — dark-mode primary background (`--color-neutral-93`)
37
+ - **Rise (Light):** `#f3746d` — stock price rise in light theme (TW convention: red = up)
38
+ - **Fall (Light):** `#6c9c46` — stock price fall in light theme (TW convention: green = down)
39
+ - **Error:** `#d12a2a` — system errors, form validation (`--color-red-600`)
40
+
41
+ ## 3. Typography Rules
42
+
43
+ Fugle uses **Lato** (via Google Fonts) as the Latin character family across the main web trading platform, complemented by **Noto Sans TC** and **Microsoft JhengHei** on the developer documentation portal for Traditional Chinese text. The Material Icons font handles iconography throughout.
44
+
45
+ Body text runs at **14 px / normal** weight for dense data rows, **12 px** for secondary labels and timestamps, and **16 px** for modal body copy and form inputs. Section headings use **20 px / 700** in dialogs, and data highlight values reach **18–24 px**. Line heights are kept tight to maximize data density — approximately 1.4–1.5× for multi-line text. Font weight vocabulary: 400 for body, 700 for emphasis and headings. No custom variable fonts detected.
46
+
47
+ ## 4. Component Stylings
48
+
49
+ ### Primary Button
50
+
51
+ **Amber CTA (e.g. "開始交易")**
52
+ - Background: `#f4af1c`
53
+ - Text: `#ffffff`
54
+ - Border: none
55
+ - Radius: 4px
56
+ - Font: 14px / 700
57
+
58
+ **Amber CTA Hover**
59
+ - Background: `#e49b00`
60
+ - Text: `#ffffff`
61
+ - Radius: 4px
62
+
63
+ ### Input Field
64
+
65
+ **Default Search / Trade Input**
66
+ - Background: `#eaeaea`
67
+ - Border: none
68
+ - Radius: 4px
69
+ - Height: 32px
70
+ - Padding: 0 5px 0 5px
71
+ - Font: 16px / 400
72
+
73
+ **Input Group (with label)**
74
+ - Border: 1px solid `#eaeaea`
75
+ - Radius: 4px
76
+ - Height: 32px
77
+
78
+ ### Stock Row (Watchlist)
79
+
80
+ **Default Stock List Item**
81
+ - Background: `#ffffff`
82
+ - Border: 1px solid `#eaeaea`
83
+ - Radius: 0px
84
+ - Height: 55px
85
+ - Font: 14px / 400
86
+
87
+ **Hovered Stock Row**
88
+ - Background: `rgba(0,0,0,0.04)`
89
+
90
+ ### Card / Trade Box
91
+
92
+ **Surface Card (e.g. fugle-trade-box)**
93
+ - Background: `#ffffff`
94
+ - Border: none
95
+ - Radius: 4px
96
+ - Padding: 20px 0
97
+
98
+ **Info Card (e.g. watchlist-stock__box)**
99
+ - Background: `#eaeaea`
100
+ - Radius: 8px
101
+
102
+ ### Modal
103
+
104
+ **Dialog Container**
105
+ - Background: `#ffffff`
106
+ - Radius: 4px
107
+ - Font: 16px / 400
108
+ - Padding: 16px
109
+
110
+ ---
111
+ **Verified:** 2026-06-03
112
+ **Tier 1 sources:** https://www.fugle.tw (HTML, inline CSS, manifest.json), https://dk91kmsnfr6kg.cloudfront.net/desktop/assets/fugle-desktop.d5b14f507dc94191ea072af78696b931.css, https://dk91kmsnfr6kg.cloudfront.net/desktop/assets/chunk.ac7daef9fdaa5882212c.css, https://developer.fugle.tw/assets/css/styles.46d8cd92.css, https://apps.apple.com/tw/app/fugle/id1542310263
113
+ **Tier 2 sources:** getdesign.md/fugle — No designs found for "fugle". refero — no TW/Fugle results expected.
114
+ **Conflicts unresolved:** HTML `theme-color` is `#f4af1c`; PWA manifest `theme_color` is `#fbcc67` (a lighter amber). The CSS custom property `--p` and developer portal's `--ifm-color-primary` both canonically define `#f4af1c`; the manifest value is likely a PWA splash-screen approximation. Primary recorded as `#f4af1c`.
115
+
116
+ ## 5. Layout Principles
117
+
118
+ Fugle's web trading platform is a dense multi-panel grid. The header is fixed at **50 px** height. A left sidebar watchlist panel (configurable width via `--watchListWidth`) sits beside a scrollable main canvas. The trading panel (`--tradingWidth`) expands from the right edge. The main content container caps at **1508 px** max-width for standard market views, but trading views use `max-width: initial` for full-bleed chart display. Column grids follow Bootstrap-compatible breakpoints: 576 px (sm), 768 px (md), 1280 px (lg), 1440 px / 1680 px (xl variants for watchlist density). Card grids use CSS grid with responsive `repeat(N, 1fr)` columns that scale from 2 up to 5 columns depending on viewport.
119
+
120
+ ## 6. Depth & Elevation
121
+
122
+ Fugle uses a layered shadow system that signals interactive hierarchy without dramatic depth:
123
+
124
+ - **Resting card:** `box-shadow: 0 2px 2px 0 rgba(0,0,0,.08), 0 2px 7px 0 rgba(0,0,0,.1)`
125
+ - **Dropdown / popover:** `box-shadow: 0 0 24px 0 rgba(0,0,0,.08)`
126
+ - **Modal / elevated panel:** `box-shadow: 0 0 17px 0 rgba(0,0,0,.14), 0 8px 9px 0 rgba(0,0,0,.12)`
127
+ - **Focus / active ring:** `box-shadow: 0 8px 10px 1px rgba(0,0,0,.14), 0 3px 14px 3px rgba(0,0,0,.12), 0 4px 15px 0 rgba(0,0,0,.2)`
128
+ - **Side panel frame:** `box-shadow: 0 4px 8px -4px var(--color-component-web-frame-shadow-default), 0 8px 16px -4px var(--color-component-web-frame-shadow-default)` — `rgba(0,0,0,0.08)` in light, `rgba(255,255,255,0.08)` in dark
129
+
130
+ Dark mode shadows use white-alpha variants to create the inverse glow effect. No `z-index`-heavy stacking unless modals are active.
131
+
132
+ ## 7. Do's and Don'ts
133
+
134
+ ### Do
135
+ - Use `#f4af1c` amber as the single primary CTA color across light and dark modes
136
+ - Show red (`#f3746d`) for rising prices and green (`#6c9c46`) for falling prices — follow Taiwan Stock Exchange convention, opposite of Western norms
137
+ - Keep card surfaces white (`#ffffff`) in light mode and dark (`#131313`) in dark mode; always separate with subtle border `#eaeaea` rather than heavy shadows
138
+ - Use Lato for Latin numerals in data-dense contexts; pair with Noto Sans TC for Chinese labels
139
+ - Apply `border-radius: 4px` uniformly to buttons, inputs, and cards; reserve `8px` for highlighted info boxes
140
+ - Limit the primary amber to interactive hotspots — loading states, primary buttons, notification badges — so it retains signal value
141
+
142
+ ### Don't
143
+ - Don't use amber as a neutral fill or background wash — it should always signal action or system state
144
+ - Don't swap the red/green convention to Western defaults; Fugle's users rely on red = up, green = down
145
+ - Don't use heavy drop shadows on resting states; the light `rgba(0,0,0,.08)` layered shadow is intentional
146
+ - Don't exceed 16 px body font in data rows — density is a core UX value
147
+ - Don't add decorative illustration or gradient washes to the trading canvas; the chart data is the visual
148
+ - Don't use the dark theme in onboarding or marketing contexts; it's designed for active-trading sessions
149
+
150
+ ## 8. Responsive Behavior
151
+
152
+ The platform targets desktop-first (min 1024 px canvas) and degrades gracefully to tablet. Breakpoints mirror Bootstrap: 576 px, 768 px, 1280 px, 1440 px, 1680 px. The watchlist sidebar collapses on narrow viewports. The trading panel (`--tradingWidth`) is hidden by default and slides in over the canvas on demand. Card grids scale: 1 column below 576 px, 2 columns at md, 3–5 at xl depending on feature area. Mobile is covered by the native iOS/Android app (Fugle app id 1542310263), which shares the brand's color and typography tokens but uses a card-based vertical scroll layout optimized for thumb navigation.
153
+
154
+ ## 9. Agent Prompt Guide
155
+
156
+ When building Fugle-style interfaces:
157
+
158
+ - Start with a white (`#ffffff`) or light-grey (`#f5f5f5`) canvas, dense 12–14 px body text in Lato, no decorative imagery
159
+ - Primary CTAs: `background #f4af1c`, white text, 4 px radius, no visible border, hover to `#e49b00`
160
+ - Data rows: `min-height 55px`, `border-bottom 1px solid #eaeaea`, hover `rgba(0,0,0,0.04)` background
161
+ - Price changes: **always** red for rise, green for fall (TW convention); use `#f3746d` / `#6c9c46` in light mode
162
+ - Cards: `border-radius 4px`, `box-shadow 0 2px 2px 0 rgba(0,0,0,.08), 0 2px 7px 0 rgba(0,0,0,.1)`, no border
163
+ - Form inputs: `height 32px`, `border-radius 4px`, background `#eaeaea`, `font-size 16px`
164
+ - Transitions: `0.2s cubic-bezier(.4,.6,.2,1)` for most UI state changes
165
+ - Dark mode: swap backgrounds to `#131313` / `#222222` surfaces; keep `#f4af1c` amber unchanged
166
+
167
+ ## 10. Voice & Tone
168
+
169
+ Fugle's voice is **precise, empowering, and peer-to-peer** — a fellow investor who happens to have built better tools, speaking directly to another serious investor.
170
+
171
+ | Dimension | Do | Don't |
172
+ |---|---|---|
173
+ | Register | Conversational but expert; uses financial terminology naturally | Dumbed-down language or over-explaining basics |
174
+ | Stance | Equal peer — "we research too" | Corporate authority — "our platform provides" |
175
+ | Framing | Research space, decision clarity, serious purpose | FOMO urgency, get-rich language, hype |
176
+ | Sentence length | Short to medium; punchy declaratives | Long compound clauses |
177
+
178
+ Voice samples (illustrative, modelled on App Store copy tone):
179
+
180
+ - "告別密密麻麻數字的傳統看盤軟體。" — *Illustrative: crisp one-liner that rejects the status quo without drama.*
181
+ - "認真的投資人,值得更好的工具。" — *Illustrative: the core brand promise stated as self-evident truth, not a sales claim.*
182
+ - "把時間花在決策,而非整理資料。" — *Illustrative: frames value through the user's time, not the product's features.*
183
+
184
+ ## 11. Brand Narrative
185
+
186
+ Fugle (富果, "rich harvest") was founded in Taiwan by Fortuna Intelligence, a team that describes itself as being simultaneously developers and practicing investors who watch the markets daily. The animating frustration was the poor quality of existing retail trading interfaces — dense, noisy, built around brokerage workflow rather than investor research workflow — and the refusal to accept that as the only option.
187
+
188
+ The platform launched as a web trading app paired with a market data API, positioning itself at the intersection of fintech and developer tooling. The developer portal (developer.fugle.tw) made real-time Taiwan stock data accessible via clean REST and WebSocket APIs, partnering with Fubon, Taishin, and E.Sun securities to offer actual order execution. This dual strategy — beautiful research UI for investors, clean API for developers — reflects a philosophy that serious financial tools should meet users where they are, whether at a trading terminal or a code editor.
189
+
190
+ Today Fugle frames its mission around a simple belief: "認真的投資人值得更好的工具" — serious investors deserve better tools. The product is designed not to compete with professional Bloomberg terminals or to simplify investing into a game, but to occupy a deliberate middle ground: rigorous, visual, and genuinely pleasant to use for hours of research.
191
+
192
+ ## 12. Principles
193
+
194
+ 1. **Data clarity over data density.** Every number on screen should earn its place. When a display becomes crowded, the answer is smarter information architecture — heatmaps, visual cards — not smaller type. *UI implication:* use whitespace and visual hierarchy in card layouts rather than cramming more data into fewer pixels.
195
+
196
+ 2. **Investor perspective, not brokerage perspective.** The interface is organized around how an investor thinks (by thesis, sector, comparison) not how a brokerage processes orders. *UI implication:* watchlists, custom research cards, and side-by-side comparisons are first-class features; order ticket is secondary until the user is ready to transact.
197
+
198
+ 3. **Amber signals action.** The brand's single accent color is reserved for interactive moments — loading, primary buttons, live notifications. Overuse dilutes the signal. *UI implication:* no decorative amber, no amber text, no amber borders; only amber fills on actionable elements.
199
+
200
+ 4. **Both modes are production-quality.** Light mode for daytime research, dark mode for active trading sessions — neither is an afterthought. *UI implication:* every component must be spec'd for both themes with equal care; dark mode uses near-black surfaces, not grey.
201
+
202
+ 5. **Serious tools should still feel fast.** Transitions are tight (0.2 s) and purposeful. Animation is reserved for loading states and layout expansions, not decoration. *UI implication:* use `cubic-bezier(.4,.6,.2,1)` easing on state changes; avoid entrance animations on data rows.
203
+
204
+ ## 13. Personas
205
+
206
+ *Illustrative — not based on published Fugle user research.*
207
+
208
+ **Illustrative: The Research-First Investor (個人投資者)**
209
+ Mid-career professional, 35–50, investing personal savings in Taiwan equities. Spends evenings building sector maps and comparing fundamentals across 5–15 stocks. Values clarity and speed; deeply annoyed by noise. Uses Fugle's custom card layout to structure a personal research SOP.
210
+
211
+ **Illustrative: The Developer-Investor (開發者投資人)**
212
+ Software engineer in their late 20s–early 40s who approaches investing algorithmically. Builds personal screeners using Fugle's marketdata API. Values API quality, documentation clarity, and free-tier access for prototyping. Attracted by the developer-friendly portal and Noto Sans TC-styled docs.
213
+
214
+ **Illustrative: The Active Trader (短線交易者)**
215
+ Experienced retail trader who watches intraday tick data and uses the dark theme during market hours. Needs every pixel to serve a function. Relies heavily on the watchlist panel and real-time price update animations. Irritated by anything that obscures the bid/ask spread display.
216
+
217
+ **Illustrative: The Student Investor (學習型投資人)**
218
+ University student or new entrant to Taiwan equity investing, 20–28. Discovered Fugle through a campus or online investing community. Drawn to the clean visual design compared to legacy broker platforms. Starts with the mobile app and explores web tools as confidence grows.
219
+
220
+ ## 14. States
221
+
222
+ - **Empty — Watchlist:** Watchlist panel shows a placeholder prompt to add a stock ticker; no skeleton rows; single amber CTA button "新增自選股"
223
+ - **Loading — Data fetch:** Three amber `#f4af1c` bouncing dots (border-radius 50%, 11 px, `lds-ellipsis` animation at 0.6 s cubic-bezier(0,1,1,0)); used both on initial page load and in-panel data refresh
224
+ - **Error — No data / API timeout:** Inline message inside the affected card or panel; muted text `#8b8a8a`; no modal interruption; retry link styled as secondary text link
225
+ - **Error — Form validation:** Input border switches to `#d12a2a` (`--color-red-600`); error message appears below field at 12 px muted red
226
+ - **Success — Order submitted:** In-panel confirmation message with a green `#6c9c46` checkmark icon; auto-dismisses after 3 s without blocking interaction
227
+ - **Skeleton — Chart/card loading:** Placeholder shimmer animation (`placeHolderShimmer` keyframe, 500 ms interval defined in `loadingDelay`); uses `#eaeaea` animated gradient across content areas
228
+ - **Disabled — Button:** `background-color rgba(0,0,0,.12)`, `color rgba(0,0,0,.26)`, `box-shadow none`, `cursor not-allowed`; no amber used on disabled state
229
+
230
+ ## 15. Motion & Easing
231
+
232
+ **Duration scale:**
233
+ - Micro (icon state): 0.1 s
234
+ - Fast (hover, focus): 0.2 s
235
+ - Standard (panel expand, input transitions): 0.3 s
236
+ - Moderate (fade, scroll animation): 0.425 s
237
+ - Slow (panel slide, complex layout): 0.6–0.65 s
238
+ - Extra-slow (chart loading dot): 0.6 s loop, 9 s total for secondary spinners
239
+
240
+ **Primary easing:** `cubic-bezier(.4,.6,.2,1)` — Fugle's signature curve, used on layout transitions, header animations, and most interactive state changes. It has a sharp initial acceleration (the `.6` control point) and a gentle deceleration that gives the UI a confident, purposeful feel.
241
+
242
+ **Secondary easing:** `cubic-bezier(0,1,.5,1)` — used for panel reveal/collapse; starts slow and exits fast, creating a "snap open" character.
243
+
244
+ **Loading animation:** `cubic-bezier(0,1,1,0)` — the bouncing dot easing; exaggerated overshoot gives the brand's only playful motion moment.
245
+
246
+ **Rules:**
247
+ - All data-row hover transitions use `0.2s` or less; never animate data values themselves
248
+ - Layout changes (watchlist open/close, trading panel) use the `--layoutDuration` CSS variable with the primary cubic-bezier curve
249
+ - No entrance animations on stock rows or chart data; they appear instantly
250
+ - Opacity fades use 0.425 s for modals and overlays
@@ -436,6 +436,25 @@ Motion tokens **partially captured** — the chrome relies on Swiper.js defaults
436
436
  - Layer / modal transitions should be 200–250ms with ease-out
437
437
  - Respect `prefers-reduced-motion: reduce` — disable swiper auto-advance, eliminate non-essential transitions
438
438
 
439
+
440
+ ## 16. Do's and Don'ts
441
+
442
+ ### Do
443
+ - Reserve Gmarket Red #da120d (--Red-600) for numeric price-discount strings, percentage-off, and strike-through context — treat it as a semantic-price asset, not a generic CTA fill
444
+ - Set section H2s in Gmarket Sans at 28px/700 for hero modules and 24px/700 for compact modules, keeping the body on the Apple SD Gothic Neo / Noto Sans CJK KR system stack
445
+ - Stack 10+ category modules vertically with ~48-64px breaks and repeating thumbnail-price-chip card rhythm so users scan the grid, not headings
446
+ - Convey depth through borders and Gray-ladder tints (--Gray-200 #eeeeee card edge, --Gray-100 #f5f5f5 row/section tint) instead of box-shadow, which is absent in production chrome
447
+ - Map color to revenue programs via named sub-systems — Smile-Yellow #ffd200 for loyalty/SmilePay, StarDelivery-Purple #7130f3 for premium delivery, Club-Navy-Main #002041 for Smile Club rails
448
+ - Render Korean service-names exactly as-is (스마일배송 / 안전결제 / 도착보장 / 쿠폰적용가) and lead card copy with the price, letting the number do the work
449
+
450
+ ### Don't
451
+ - Flood Gmarket Red #da120d as a primary button fill across large surfaces — in 272 sampled chrome elements it appears on price text, not as a button background
452
+ - Place Smile-Yellow #ffd200 as a foreground on white (1.6:1 contrast, fails WCAG AA) — use it only as a background fill behind #222222 dark text
453
+ - Add box-shadow or elevation to product cards; separation comes from the 8-16px gutter and color tints, never drop shadows
454
+ - Pad sections to 'breathe' or introduce hierarchy that breaks the dense scan rhythm at the expense of card count per fold
455
+ - Translate or rebrand Korean service-names (e.g. 스마일배송 to 'Smile Delivery') in Korean chrome, and avoid emotional adjectives or hero-tagline gestures inside card chrome
456
+ - Collapse the type scale onto Medium 500 — production leans on the 400/700 binary, with 500 reserved mainly for the rendered logotype and banner overlays
457
+
439
458
  ---
440
459
 
441
460
  **Verified:** 2026-05-15