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.
- package/AGENTS.md +1 -1
- package/README.ko.md +12 -0
- package/README.md +49 -0
- package/data/reference-fingerprints.json +957 -2
- package/dist/bin/oh-my-design.js +4 -3
- package/dist/bin/oh-my-design.js.map +1 -1
- package/dist/{install-skills-IETT2TBJ.js → install-skills-6QFSN5BN.js} +108 -42
- package/dist/install-skills-6QFSN5BN.js.map +1 -0
- package/package.json +9 -3
- package/scripts/postinstall.cjs +6 -6
- package/skills/claude-design/SKILL.md +385 -0
- package/skills/claude-design/references/claude-design-flow.md +425 -0
- package/skills/claude-design/references/codebase-analysis.md +373 -0
- package/skills/claude-design/scripts/analyze_codebase.py +1369 -0
- package/skills/claude-design/scripts/clickable_link.sh +48 -0
- package/skills/claude-design/scripts/collect_source.py +178 -0
- package/skills/claude-design/scripts/drive_claude_design.cjs +378 -0
- package/skills/claude-design/scripts/gather_references.py +437 -0
- package/web/references/91app/DESIGN.md +151 -0
- package/web/references/airtable/DESIGN.md +16 -2
- package/web/references/bithumb/DESIGN.md +170 -0
- package/web/references/bunjang/DESIGN.md +20 -1
- package/web/references/cakeresume/DESIGN.md +162 -0
- package/web/references/catchtable/DESIGN.md +19 -0
- package/web/references/classting/DESIGN.md +251 -0
- package/web/references/classum/DESIGN.md +19 -0
- package/web/references/coinone/DESIGN.md +218 -0
- package/web/references/dabang/DESIGN.md +19 -0
- package/web/references/devsisters/DESIGN.md +253 -0
- package/web/references/dji/DESIGN.md +0 -1
- package/web/references/drnow/DESIGN.md +331 -0
- package/web/references/fastcampus/DESIGN.md +19 -0
- package/web/references/flex/DESIGN.md +19 -0
- package/web/references/flo/DESIGN.md +306 -0
- package/web/references/fugle/DESIGN.md +250 -0
- package/web/references/gmarket/DESIGN.md +19 -0
- package/web/references/gogolook/DESIGN.md +131 -0
- package/web/references/grip/DESIGN.md +250 -0
- package/web/references/hahow/DESIGN.md +158 -0
- package/web/references/hogangnono/DESIGN.md +308 -0
- package/web/references/hyundaicard/DESIGN.md +177 -0
- package/web/references/inflearn/DESIGN.md +19 -0
- package/web/references/jkopay/DESIGN.md +249 -0
- package/web/references/jobkorea/DESIGN.md +310 -0
- package/web/references/kbank/DESIGN.md +18 -0
- package/web/references/kdan/DESIGN.md +160 -0
- package/web/references/kkbox/DESIGN.md +114 -0
- package/web/references/krafton/DESIGN.md +230 -0
- package/web/references/kream/DESIGN.md +18 -0
- package/web/references/laftel/DESIGN.md +253 -0
- package/web/references/lezhin/DESIGN.md +301 -0
- package/web/references/lunit/DESIGN.md +19 -0
- package/web/references/melon/DESIGN.md +153 -0
- package/web/references/momoshop/DESIGN.md +279 -0
- package/web/references/mustit/DESIGN.md +282 -0
- package/web/references/nhncloud/DESIGN.md +174 -0
- package/web/references/oliveyoung/DESIGN.md +19 -0
- package/web/references/payco/DESIGN.md +227 -0
- package/web/references/piccollage/DESIGN.md +277 -0
- package/web/references/rayark/DESIGN.md +132 -0
- package/web/references/riiid/DESIGN.md +228 -0
- package/web/references/sendbird/DESIGN.md +285 -0
- package/web/references/socar/DESIGN.md +18 -0
- package/web/references/toss-securities/DESIGN.md +19 -0
- package/web/references/trenbe/DESIGN.md +252 -0
- package/web/references/tving/DESIGN.md +18 -0
- package/web/references/upbit/DESIGN.md +19 -0
- package/web/references/upstage/DESIGN.md +18 -0
- package/web/references/velog/DESIGN.md +168 -0
- package/web/references/voicetube/DESIGN.md +227 -0
- package/web/references/wadiz/DESIGN.md +19 -0
- package/web/references/webflow/DESIGN.md +16 -2
- package/web/references/yeogiotte/DESIGN.md +19 -0
- package/data/architecture-proposals/2026-05-13-thin-install-fresh-fetch.md +0 -189
- package/data/issues/2026-05-13-multi-surface-schema-rfc.md +0 -67
- package/data/reference-audits/2026-05-13-kr10.md +0 -132
- package/data/reference-audits/2026-05-14-kr10.md +0 -72
- package/data/reference-audits/2026-05-15-kr10.md +0 -124
- package/data/research/2026-05-18-agent-landscape.md +0 -69
- package/data/research/2026-05-18-kr-style-presets.md +0 -572
- 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
|