cdragon 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/README.md +110 -0
  2. package/bin/cdragon.js +170 -0
  3. package/package.json +31 -0
  4. package/skills/agent-browser/SKILL.md +50 -0
  5. package/skills/grill-me/SKILL.md +7 -0
  6. package/skills/herdr-agent/SKILL.md +142 -0
  7. package/skills/herdr-cli/SKILL.md +388 -0
  8. package/skills/herdr-cli/scripts/herdr-agent-run-and-wait +203 -0
  9. package/skills/herdr-cli/scripts/herdr-agent-wait-complete +168 -0
  10. package/skills/notion-presentation/SKILL.md +170 -0
  11. package/skills/notion-presentation/references/example-redis-deck.md +97 -0
  12. package/skills/setup-matt-pocock-skills/SKILL.md +127 -0
  13. package/skills/setup-matt-pocock-skills/domain.md +51 -0
  14. package/skills/setup-matt-pocock-skills/issue-tracker-github.md +34 -0
  15. package/skills/setup-matt-pocock-skills/issue-tracker-gitlab.md +35 -0
  16. package/skills/setup-matt-pocock-skills/issue-tracker-local.md +19 -0
  17. package/skills/setup-matt-pocock-skills/triage-labels.md +15 -0
  18. package/skills/tdd/SKILL.md +108 -0
  19. package/skills/tdd/mocking.md +59 -0
  20. package/skills/tdd/refactoring.md +10 -0
  21. package/skills/tdd/tests.md +61 -0
  22. package/skills/to-html/SKILL.md +83 -0
  23. package/skills/to-html/designs/INDEX.md +74 -0
  24. package/skills/to-html/designs/airbnb.DESIGN.md +581 -0
  25. package/skills/to-html/designs/airtable.DESIGN.md +275 -0
  26. package/skills/to-html/designs/alipay.DESIGN.md +456 -0
  27. package/skills/to-html/designs/apple.DESIGN.md +566 -0
  28. package/skills/to-html/designs/banksalad.DESIGN.md +621 -0
  29. package/skills/to-html/designs/channeltalk.DESIGN.md +374 -0
  30. package/skills/to-html/designs/clay.DESIGN.md +398 -0
  31. package/skills/to-html/designs/clickhouse.DESIGN.md +374 -0
  32. package/skills/to-html/designs/cohere.DESIGN.md +361 -0
  33. package/skills/to-html/designs/coinone.DESIGN.md +218 -0
  34. package/skills/to-html/designs/coupang.DESIGN.md +502 -0
  35. package/skills/to-html/designs/cursor.DESIGN.md +416 -0
  36. package/skills/to-html/designs/elevenlabs.DESIGN.md +376 -0
  37. package/skills/to-html/designs/expo.DESIGN.md +373 -0
  38. package/skills/to-html/designs/figma.DESIGN.md +490 -0
  39. package/skills/to-html/designs/framer.DESIGN.md +393 -0
  40. package/skills/to-html/designs/freee.DESIGN.md +572 -0
  41. package/skills/to-html/designs/gangnamunni.DESIGN.md +621 -0
  42. package/skills/to-html/designs/gmarket.DESIGN.md +483 -0
  43. package/skills/to-html/designs/gogolook.DESIGN.md +131 -0
  44. package/skills/to-html/designs/hahow.DESIGN.md +158 -0
  45. package/skills/to-html/designs/hashicorp.DESIGN.md +369 -0
  46. package/skills/to-html/designs/hyundaicard.DESIGN.md +177 -0
  47. package/skills/to-html/designs/ibm.DESIGN.md +420 -0
  48. package/skills/to-html/designs/kakaobank.DESIGN.md +548 -0
  49. package/skills/to-html/designs/kakaopay.DESIGN.md +544 -0
  50. package/skills/to-html/designs/karrot.DESIGN.md +445 -0
  51. package/skills/to-html/designs/kdan.DESIGN.md +160 -0
  52. package/skills/to-html/designs/krds.DESIGN.md +997 -0
  53. package/skills/to-html/designs/line.DESIGN.md +431 -0
  54. package/skills/to-html/designs/linear.app.DESIGN.md +548 -0
  55. package/skills/to-html/designs/miro.DESIGN.md +272 -0
  56. package/skills/to-html/designs/mistral.ai.DESIGN.md +353 -0
  57. package/skills/to-html/designs/money-forward.DESIGN.md +401 -0
  58. package/skills/to-html/designs/mongodb.DESIGN.md +357 -0
  59. package/skills/to-html/designs/naver.DESIGN.md +533 -0
  60. package/skills/to-html/designs/nhncloud.DESIGN.md +174 -0
  61. package/skills/to-html/designs/opencode.ai.DESIGN.md +388 -0
  62. package/skills/to-html/designs/pinterest.DESIGN.md +322 -0
  63. package/skills/to-html/designs/posthog.DESIGN.md +430 -0
  64. package/skills/to-html/designs/raycast.DESIGN.md +422 -0
  65. package/skills/to-html/designs/remember.DESIGN.md +460 -0
  66. package/skills/to-html/designs/resend.DESIGN.md +396 -0
  67. package/skills/to-html/designs/sanity.DESIGN.md +449 -0
  68. package/skills/to-html/designs/sendbird.DESIGN.md +285 -0
  69. package/skills/to-html/designs/smarthr.DESIGN.md +404 -0
  70. package/skills/to-html/designs/socar.DESIGN.md +403 -0
  71. package/skills/to-html/designs/spotify.DESIGN.md +265 -0
  72. package/skills/to-html/designs/supabase.DESIGN.md +348 -0
  73. package/skills/to-html/designs/superhuman.DESIGN.md +414 -0
  74. package/skills/to-html/designs/together.ai.DESIGN.md +356 -0
  75. package/skills/to-html/designs/toss.DESIGN.md +655 -0
  76. package/skills/to-html/designs/uber.DESIGN.md +387 -0
  77. package/skills/to-html/designs/upstage.DESIGN.md +232 -0
  78. package/skills/to-html/designs/velog.DESIGN.md +168 -0
  79. package/skills/to-html/designs/vercel.DESIGN.md +479 -0
  80. package/skills/to-html/designs/wanted.DESIGN.md +529 -0
  81. package/skills/to-html/designs/wise.DESIGN.md +276 -0
  82. package/skills/to-html/designs/yanolja.DESIGN.md +463 -0
  83. package/skills/to-html/designs/yeogiotte.DESIGN.md +459 -0
  84. package/skills/to-html/designs/zapier.DESIGN.md +433 -0
  85. package/skills/to-html/designs/zigzag.DESIGN.md +633 -0
  86. package/skills/to-issues/SKILL.md +84 -0
  87. package/skills/to-prd/SKILL.md +75 -0
  88. package/src/colors.js +15 -0
  89. package/src/link.js +47 -0
  90. package/src/prompt.js +137 -0
  91. package/src/skills.js +75 -0
@@ -0,0 +1,621 @@
1
+ ---
2
+ id: banksalad
3
+ name: Banksalad
4
+ country: KR
5
+ category: fintech
6
+ homepage: "https://www.banksalad.com"
7
+ primary_color: "#04c584"
8
+ logo:
9
+ type: favicon
10
+ slug: "https://www.google.com/s2/favicons?domain=banksalad.com&sz=256"
11
+ verified: "2026-05-15"
12
+ omd: "0.1"
13
+ ds:
14
+ name: Banksalad GitHub
15
+ url: "https://github.com/banksalad"
16
+ type: brand
17
+ description: Banksalad's public GitHub org including styleguide repos and BPL (Banksalad Product Library) reference material.
18
+ og_image: "https://avatars.githubusercontent.com/u/71009899?s=280&v=4"
19
+ ---
20
+
21
+ # Design System Inspiration of Banksalad
22
+
23
+ ## 1. Visual Theme & Atmosphere
24
+
25
+ Banksalad (뱅크샐러드) is the design language of a **trustworthy financial advisor that runs on data, not optimism**. Where Toss flattens money into one cheerful gesture and KakaoPay wraps it in Kakao yellow, Banksalad insists that *more information, clearly presented*, is the actual brand promise. The home page opens on a white canvas (`#ffffff`/`#fbfbfb`) with warm near-black text (`#2b2b2b` for headings, `#434444` for body — never pure `#000`), anchored by a saturated mint-green `#04c584` that does all the interactive work. The green is specifically a **salad-leaf green** (the brand name is literally "Bank + Salad" — financial data freshly tossed for you), warmer than Spotify's `#1db954` and far brighter than the corporate teal that legacy Korean banks default to.
26
+
27
+ The single most distinctive geometric choice is the radius scale. The CSS bundle contains **81 occurrences of `border-radius: 2px`** and only 5 of 8px and 3 of 4px. Banksalad is **almost-flat**: 2px is just enough to take the harshness off a corner without softening anything into "app-friendly" plumpness. This is a deliberate rejection of the Toss/Kakao consumer-app idiom (12–16px). It tells the user: this is data, not a toy. The tabular density follows from the same conviction — cards pack rows of numbers tightly, and the 700-weight Pretendard digits never apologize for taking up space.
28
+
29
+ Typography pairs **Pretendard** (the de-facto Korean modern sans, designed by Kil Hyun-jin, weight-axis variable) with **BM JUA** ("배민 주아체", Battle Grounds Jua — a rounded, friendly Korean display face) as an accent. Pretendard does 99% of the work; Jua appears only for marketing/landing display moments where Banksalad wants to feel warm rather than clinical. The default weight is **700** (160 of 304 weight declarations) — Banksalad numbers and headings are confident and chunky, with 500 as the secondary "emphasis on body" weight. Light weights (300) appear ~26 times — only for the largest hero numerals where the size carries the authority.
30
+
31
+ **Key Characteristics:**
32
+ - Pretendard + Apple SD Gothic Neo + Noto Sans KR font stack — Korean-native typography first
33
+ - "BM JUA" as accent display font for landing/promotional moments only
34
+ - Signature green `#04c584` (mint, salad-leaf) for all interactive moments
35
+ - Hover/focus green `#10df99` (one shade brighter) — interaction makes things *lighter*, not darker
36
+ - 2px radius dominance — the brand reads as data-tool, not consumer-app
37
+ - Warm near-black `#2b2b2b`/`#434444` for type instead of `#000000`
38
+ - Mint focus tint `#f3fdfa` on input backgrounds — the only branded background tint in the system
39
+ - 700 weight as default for headings and financial figures; 500 for body emphasis
40
+ - Subtle single-layer shadows `0 2px 5px rgba(0,0,0,.12)` — never colored, never theatrical
41
+ - Teal-gray data palette (`#34464b`/`#5c818a`/`#1c6c73`/`#a7c7cf`) for chart series — cool, advisor-grade
42
+
43
+ ## 2. Color Palette & Roles
44
+
45
+ ### Primary
46
+ - **Salad Green** (`#04c584`): Primary brand color, CTA backgrounds, links, accent rules, financial-status accents. Mint with a touch of grass — readable on white, energetic but not playful.
47
+ - **Hover Green** (`#10df99`): Brighter mint applied on hover, focus border, and the resting state of less-prominent CTAs. Banksalad lightens to indicate interaction (opposite of the conventional darken-on-hover pattern).
48
+ - **Mint Tint** (`#f3fdfa`): Focus background on inputs, success surface fill. The only branded tint in the system.
49
+
50
+ ### Heading & Body
51
+ - **Heading** (`#2b2b2b`): Warm near-black for headlines, prominent labels, and financial amounts. Never `#000`.
52
+ - **Body** (`#434444`): Standard reading text. Filled-input text color.
53
+ - **Body Light** (`#7b7b7b`): Captions, secondary descriptions.
54
+ - **Placeholder** (`#999999`): Input placeholders, muted metadata.
55
+ - **Disabled** (`#acacac` / `#c0c0c0`): Disabled text and icons.
56
+
57
+ ### Surface & Border
58
+ - **Page** (`#ffffff`): Default canvas.
59
+ - **Surface Light** (`#fbfbfb`): Soft surface alternation, panel fills.
60
+ - **Surface Neutral** (`#f5f5f5`): Dividers, separator backgrounds, content shelf fills (most-used neutral after green).
61
+ - **Border Input** (`#e1e1e1`): Default input border, divider line.
62
+ - **Surface Mint** (`#f3fdfa`): Success-state surface fill.
63
+
64
+ ### Data / Chart Palette (teal-slate family)
65
+ - **Deep Slate** (`#0b0c0c`): Maximum-depth axis labels.
66
+ - **Teal-Slate 900** (`#333a44`): Primary chart series.
67
+ - **Teal-Slate 800** (`#34464b`): Secondary chart series, table headers.
68
+ - **Teal-Slate 700** (`#436068`): Tertiary chart.
69
+ - **Teal 600** (`#1c6c73`): Highlighted data point.
70
+ - **Teal-Gray 500** (`#5c818a`): Subdued data, legend.
71
+ - **Teal 400** (`#318b93`): Mid-range fills.
72
+ - **Pale Teal** (`#a7c7cf`): Background fills for chart bands.
73
+
74
+ The teal-slate family is intentionally **cooler than the brand green**, so that chart series read as neutral data rather than as branded surfaces. Banksalad's green is for interaction; teal-slate is for information.
75
+
76
+ ### Semantic
77
+ - **Error Red** (`#fe493d`): Strong error states, blocking validation.
78
+ - **Error Soft** (`#ff8a84`): Light error tint, secondary error indicators.
79
+ - **Warning Orange** (`#fd8700`): Warning emphasis (rate spikes, expiry).
80
+ - **Warning Deep** (`#f56200`): Highest-severity warning.
81
+ - **Warning Light** (`#ff9900`): Soft warning highlights.
82
+ - **Info Blue** (`#0099ff`): External links, info notices (used sparingly — green is the default link color).
83
+ - **Success Green** (`#04c584` / `#10df99` / `#13bd7e`): Success uses brand green; there is no separate success hue.
84
+
85
+ ## 3. Typography Rules
86
+
87
+ ### Font Family
88
+ - **Primary**: `Pretendard, -apple-system, BlinkMacSystemFont, system-ui, "Segoe UI", Roboto, "Apple SD Gothic Neo", "Noto Sans KR", "Malgun Gothic", sans-serif`
89
+ - **Display Accent**: `"BM JUA", sans-serif` — reserved for marketing-landing headlines where a warm, rounded Korean voice is wanted (rare; default to Pretendard)
90
+ - Variable-axis Pretendard supplies 300/400/500/700/800/900 weights as needed; subset woff2 files for ExtraBold (800), Bold (700), Medium (500), Regular (400) are preloaded on the home page
91
+
92
+ ### Hierarchy
93
+
94
+ | Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
95
+ |---|---|---|---|---|---|---|
96
+ | Hero Display | Pretendard | 52px | 700 | 64px (1.23) | -1px | Largest landing headline; sometimes Jua for marketing warmth |
97
+ | Display Large | Pretendard | 48px | 700 | 1.2 | -1px | Secondary hero |
98
+ | Display | Pretendard | 38–44px | 700 | 1.25 | -1px | Section-opening figures (balances, scores) |
99
+ | Section Heading | Pretendard | 32–36px | 700 | 1.3 | -0.5px | Marketing section titles |
100
+ | Heading 1 | Pretendard | 28px | 700 | 32px | normal | In-app section titles |
101
+ | Heading 2 | Pretendard | 22–24px | 700 | 28px | normal | Card titles, panel headings |
102
+ | Heading 3 | Pretendard | 20px | 700 | 24px | normal | Sub-card headings |
103
+ | Subhead | Pretendard | 18px | 700 | 1.3 | normal | Featured-button text, key callouts |
104
+ | Body Large | Pretendard | 16px | 500 | 1.5 | normal | Standard reading text on data screens (700 for emphasis) |
105
+ | Body | Pretendard | 14px | 500 | 1.34 | normal | Default body text; 500 weight, not 400 |
106
+ | Body Tight | Pretendard | 13px | 500 | 1.34 | normal | Compact labels |
107
+ | Caption | Pretendard | 12px | 500 | 1.34 | normal | Metadata, helper text |
108
+ | Caption Small | Pretendard | 10px | 500 | 1 | normal | Disclosures, smallest labels |
109
+ | Button | Pretendard | 16–18px | 700 | tight | -1px on display CTAs | All CTAs are 700 |
110
+ | Financial Amount | Pretendard | 20–36px | 700 | 1 | normal | Always 700, comma-grouped, won unit follows in 500 |
111
+
112
+ ### Principles
113
+ - **700 is the default for everything that matters.** Headings, CTAs, and financial amounts. 500 is for body text. 400 is rare. There is no "400 headline" in Banksalad.
114
+ - **Pretendard everywhere.** Banksalad does not mix sans families. Jua is a *single* exception, only for warm marketing display.
115
+ - **Korean and Latin are co-equal.** Pretendard's optical metrics align Korean (한글) and Latin in the same line; never assume English is primary.
116
+ - **Tight letter-spacing at display.** Hero headlines and 18px+ CTAs use `-1px` tracking to compress for density.
117
+ - **Numerals as headings.** Financial amounts at 20–36px / 700 are treated as headings, not body — they get the same hierarchical weight as page titles.
118
+ - **Lightweight body is forbidden.** 300 only appears on display sizes where the size itself carries hierarchy (52px hero numerals); never on body text.
119
+
120
+ ## 4. Component Stylings
121
+
122
+ ### Buttons
123
+
124
+ **Primary CTA (Salad Green)**
125
+ - Background: `#04c584`
126
+ - Text: `#ffffff`
127
+ - Border: none
128
+ - Radius: 2px
129
+ - Padding: 12px 24px
130
+ - Height: 42px (line-height-driven)
131
+ - Font: 16px / 700 / Pretendard
132
+ - Hover: background `#10df99` (lightens — opposite of convention)
133
+ - Use: Primary CTA on data tables, recommendation rows, transactional flows ("내 카드 추천 받기", "신청하기")
134
+
135
+ **Primary CTA — Large Display**
136
+ - Background: `#04c584`
137
+ - Text: `#ffffff`
138
+ - Border: none
139
+ - Radius: 2px
140
+ - Padding: 16px 32px
141
+ - Height: 56px
142
+ - Font: 18px / 700 / Pretendard
143
+ - Letter-spacing: -1px
144
+ - Hover: `#10df99`
145
+ - Use: Hero CTA on landing surfaces ("앱 다운로드", "지금 시작하기")
146
+
147
+ **Primary CTA — Hover-Inverted (Retry)**
148
+ - Background: `#10df99` (default lighter)
149
+ - Text: `#ffffff`
150
+ - Border: none
151
+ - Radius: 2px
152
+ - Padding: 10px 20px
153
+ - Font: 14px / 500 / Pretendard
154
+ - Hover: background `#04c584` (darkens — the one place Banksalad uses the darken pattern)
155
+ - Use: Secondary retry / "다시 시도" actions where the resting state is a softer mint
156
+
157
+ **Ghost / Outlined**
158
+ - Background: `#ffffff`
159
+ - Text: `#04c584`
160
+ - Border: 1px solid `#04c584`
161
+ - Radius: 2px
162
+ - Padding: 12px 24px
163
+ - Font: 16px / 700 / Pretendard
164
+ - Hover: background `#f3fdfa` (mint tint)
165
+ - Use: Secondary actions paired with a Primary CTA
166
+
167
+ **Neutral / Cancel**
168
+ - Background: `#f5f5f5`
169
+ - Text: `#434444`
170
+ - Border: none
171
+ - Radius: 2px
172
+ - Padding: 12px 24px
173
+ - Font: 16px / 700 / Pretendard
174
+ - Hover: background `#e1e1e1`
175
+ - Use: Cancel / "취소" / dismiss actions
176
+
177
+ **Disabled**
178
+ - Background: `#e1e1e1`
179
+ - Text: `#acacac`
180
+ - Border: none
181
+ - Radius: 2px
182
+ - Font: 16px / 700 / Pretendard
183
+ - Use: Disabled state (form incomplete, retry cooling down)
184
+
185
+ **Link Button (Inline Text Link)**
186
+ - Background: transparent
187
+ - Text: `#04c584`
188
+ - Border: none
189
+ - Padding: 0
190
+ - Font: 14px / 500 / Pretendard
191
+ - Hover: text-decoration: underline
192
+ - Use: Inline links within content ("자세히 보기"), table-row jump links
193
+
194
+ ### Cards & Containers
195
+
196
+ **Data Card (Default)**
197
+ - Background: `#ffffff`
198
+ - Border: 1px solid `#e1e1e1` (some surfaces use no border + shadow only)
199
+ - Radius: 2px
200
+ - Padding: 20px 24px
201
+ - Shadow: `0 2px 5px rgba(0, 0, 0, 0.12)`
202
+ - Use: Recommendation rows, transaction cards, account summary blocks
203
+
204
+ **Card — Soft Variant**
205
+ - Background: `#fbfbfb`
206
+ - Border: none
207
+ - Radius: 8px
208
+ - Padding: 24px
209
+ - Shadow: `0 2px 8px rgba(0, 0, 0, 0.1)`
210
+ - Use: Marketing/landing feature cards (the rare 8px-radius case)
211
+
212
+ **Card — Highlight (Selected)**
213
+ - Background: `#f3fdfa`
214
+ - Border: 1px solid `#10df99`
215
+ - Radius: 2px
216
+ - Padding: 20px 24px
217
+ - Use: Selected state in product comparison lists (cards/loans), recommended-pick highlight
218
+
219
+ ### Inputs & Forms
220
+
221
+ **Text Input (Default)**
222
+ - Background: `#ffffff`
223
+ - Text: `#999999` (placeholder) / `#434444` (filled)
224
+ - Border: 1px solid `#e1e1e1`
225
+ - Radius: 2px
226
+ - Padding: 0 16px
227
+ - Height: 48px
228
+ - Font: 16px / 500 / Pretendard
229
+
230
+ **Text Input — Focus**
231
+ - Background: `#f3fdfa`
232
+ - Text: `#434444`
233
+ - Border: 1px solid `#10df99`
234
+ - Radius: 2px
235
+ - Use: Active typing state — the mint tint is the only branded background fill in the system
236
+
237
+ **Text Input — Error**
238
+ - Background: `#ffffff`
239
+ - Text: `#434444`
240
+ - Border: 1px solid `#fe493d`
241
+ - Radius: 2px
242
+ - Error message below: 12px / 500 / `#fe493d`
243
+ - Use: Validation failure state
244
+
245
+ **Amount Input (Financial)**
246
+ - Background: `#ffffff`
247
+ - Text: `#2b2b2b`
248
+ - Border: 2px solid `#f5f5f5`
249
+ - Radius: 2px
250
+ - Padding: 0 16px
251
+ - Height: 56px
252
+ - Font: 22px / 700 / Pretendard (right-aligned)
253
+ - Use: Specialized input for entering won amounts — heavier border (2px), bigger type, right-aligned, 700 weight; treats money input as a heading not a form field
254
+
255
+ ### Badges & Tags
256
+
257
+ **Status Pill (Brand)**
258
+ - Background: `#f3fdfa`
259
+ - Text: `#04c584`
260
+ - Border: none
261
+ - Radius: 41px (rare pill — used only on tag chips, not buttons)
262
+ - Padding: 4px 10px
263
+ - Font: 12px / 500 / Pretendard
264
+ - Use: Filter chips ("연회비 없음", "주유 할인") on card-recommendation pages
265
+
266
+ **Status Badge (Warning)**
267
+ - Background: `#ffffff`
268
+ - Text: `#f56200`
269
+ - Border: 1px solid `#fd8700`
270
+ - Radius: 2px
271
+ - Padding: 2px 8px
272
+ - Font: 12px / 700 / Pretendard
273
+ - Use: Rate-warning, expiry, attention-needed indicators
274
+
275
+ **Status Badge (Negative)**
276
+ - Background: `#ffffff`
277
+ - Text: `#fe493d`
278
+ - Border: 1px solid `#fe493d`
279
+ - Radius: 2px
280
+ - Padding: 2px 8px
281
+ - Font: 12px / 700 / Pretendard
282
+ - Use: Overdue, declined, blocking-issue indicators
283
+
284
+ ### Tables (Financial Data)
285
+
286
+ **Table Header Row**
287
+ - Background: `#f5f5f5`
288
+ - Text: `#7b7b7b`
289
+ - Border-bottom: 1px solid `#e1e1e1`
290
+ - Padding: 12px 16px
291
+ - Font: 13px / 700 / Pretendard / uppercase letter-spacing 0.05em
292
+ - Use: Column headers on transaction lists, fee schedules
293
+
294
+ **Table Body Row**
295
+ - Background: `#ffffff` (alternates with `#fbfbfb` on dense tables)
296
+ - Text: `#434444`
297
+ - Border-bottom: 1px solid `#e1e1e1`
298
+ - Padding: 12px 16px
299
+ - Font: 14px / 500 / Pretendard
300
+ - Amounts right-aligned: 14px / 700 / `#2b2b2b` (positive) or `#fe493d` (negative)
301
+ - Use: Transaction rows, line-item displays
302
+
303
+ ### Charts & Data Viz
304
+
305
+ **Chart Series Tokens**
306
+ - Series 1: `#34464b` (primary)
307
+ - Series 2: `#5c818a` (secondary)
308
+ - Series 3: `#1c6c73` (tertiary)
309
+ - Series 4: `#a7c7cf` (quaternary / pale)
310
+ - Highlight: `#04c584` (always reserved for "your value" / user's own data point)
311
+ - Negative: `#fe493d`
312
+ - Positive trend: `#04c584`
313
+
314
+ **Axis & Gridlines**
315
+ - Axis label: 10–12px / 500 / `#7b7b7b`
316
+ - Gridline: 1px dashed `#e1e1e1`
317
+ - Background: `#ffffff` or `#fbfbfb`
318
+
319
+ ### Navigation
320
+
321
+ - Header: sticky white (`#ffffff`), no shadow at rest, 1px bottom border `#f5f5f5`
322
+ - Logo: left, ~24–28px tall, brand wordmark in `#04c584` (or `#2b2b2b` mono variant)
323
+ - Nav links: 14px / 500 / Pretendard / `#434444`, hover `#04c584`
324
+ - Sign-in CTA: white background, `#2b2b2b` text, 1px solid `#d8dfe6` border, 16px radius, 6px 14px padding, 14px / 400 (the home-page header uses a softer 16px radius for the auth pill — exception to the 2px default; this is the only 16px-radius live observation in the captured DOM)
325
+
326
+ ### Shadows
327
+
328
+ | Level | Treatment | Use |
329
+ |---|---|---|
330
+ | Flat | none | Page background, inline elements |
331
+ | Soft (L1) | `0 1px 1px rgba(0,0,0,.08)` | Subtle row separators |
332
+ | Standard (L2) | `0 2px 5px rgba(0,0,0,.12)` | Default cards — most common (~38 occurrences) |
333
+ | Elevated (L3) | `0 4px 9px rgba(0,0,0,.15)` | Dropdowns, popovers |
334
+ | Deep (L4) | `0px 2px 8px rgba(0,0,0,.1)` | Floating panels |
335
+ | Modal (L5) | `0 17px 50px rgba(0,0,0,.19)` | Modal dialogs |
336
+ | Inset | `inset 0 1px 1px rgba(0,0,0,.12)` | Pressed-button / depressed input feel |
337
+
338
+ ---
339
+
340
+ **Verified:** 2026-05-13 (omd:add-reference CREATE mode)
341
+ **Tier 1 sources:** banksalad.com home (live HTML — Pretendard + Jua preload, 16px-radius sign-in pill via playwright DOM); webview-cdn.banksalad.com/.../v2.5c10981711a65fe446400c6ecec36a221b1c3e9e.bundle.css (865 KB CSS bundle — 81× `border-radius: 2px`, primary CTA `#04c584` rule, input focus `#10df99`/`#f3fdfa`, full color-frequency map); blog.banksalad.com/tech/banksalad-product-language-ios/ (BPL principle quote); github.com/banksalad (styleguide org confirmed).
342
+ **Tier 2 sources:** getdesign.md/banksalad — **no record** ("No designs found for 'banksalad'"). styles.refero.design/?q=banksalad — **no record** (search returns no banksalad cards). Tier 2 unavailable; Tier 1 treated as authoritative.
343
+ **Conflicts unresolved:** none. (Single playwright DOM observation of 16px-radius on the sign-in header pill is documented as an exception in §4 Navigation rather than treated as a token-system conflict — the bundle's overwhelming 81× 2px frequency is the system default.)
344
+ **Earlier gap:** none — this is CREATE.
345
+
346
+ ## 5. Layout Principles
347
+
348
+ ### Spacing System
349
+ - Base unit: 4px
350
+ - Scale: 4px, 8px, 12px, 16px, 20px, 24px, 32px, 40px, 48px, 64px
351
+ - Card internal padding: 20px / 24px (slightly tighter than Toss's 20px-horizontal default — Banksalad packs more data)
352
+ - Table-row vertical padding: 12px (denser than consumer apps)
353
+
354
+ ### Grid & Container
355
+ - Marketing/landing: max content width ~1080–1200px, centered
356
+ - App / data surfaces: full-width with 16–24px gutters; tables go edge-to-edge on mobile
357
+ - Card-recommendation lists: single-column on mobile, 2–3 column grid on desktop
358
+ - Charts: full-width within their card container, never bleed outside
359
+
360
+ ### Whitespace Philosophy
361
+ - **Density is the brand.** Where Toss says "breathing room for money", Banksalad says "more facts visible without scrolling". A balance, a comparison rate, an interest rate, and three filter chips can coexist in one card.
362
+ - **Section rhythm by surface fill.** White (`#ffffff`) and off-white (`#fbfbfb`) sections alternate quietly — not for drama, but to chunk dense data into scannable bands.
363
+ - **Tight gaps inside, generous gaps outside.** Inside a comparison card, rows sit on 12px vertical gaps. Between cards, 24–32px. The hierarchy of grouping is communicated through gap-size alone.
364
+
365
+ ### Border Radius Scale
366
+ - **2px (dominant — 81 occurrences in CSS)**: Buttons, inputs, cards, badges, banners. The signature.
367
+ - 4px: Small badges, inline pills.
368
+ - 8px: Soft marketing cards (rare).
369
+ - 10–12px: Promotional banner corners (rare).
370
+ - 30–41px: Filter pills, tag chips, avatar circles.
371
+ - 50%: Avatars, icon backdrops.
372
+
373
+ Banksalad's 2px is a typographic-engineering commitment: pixel rounding sharp enough to look engineered, soft enough to not draw blood. Any radius ≥ 12px feels Toss-ish and is reserved for explicitly marketing-warmth contexts.
374
+
375
+ ## 6. Depth & Elevation
376
+
377
+ | Level | Treatment | Use |
378
+ |---|---|---|
379
+ | Flat (L0) | No shadow | Page background, inline elements |
380
+ | Soft (L1) | `0 1px 1px rgba(0,0,0,.08)` | Subtle row lift, list-item separators |
381
+ | Standard (L2) | `0 2px 5px rgba(0,0,0,.12)` | Default cards — by far the most common (~38 occurrences) |
382
+ | Elevated (L3) | `0 4px 9px rgba(0,0,0,.15)` | Dropdowns, hover-elevated cards |
383
+ | Deep (L4) | `0px 2px 8px rgba(0,0,0,.1)` | Floating action panels |
384
+ | Modal (L5) | `0 17px 50px rgba(0,0,0,.19)` | Dialog modals, account-switch overlays |
385
+ | Inset (L-1) | `inset 0 1px 1px rgba(0,0,0,.12)` | Pressed button state, depressed input visual |
386
+ | Halo | `0 0 2px rgba(0,0,0,.26)` | Thin outline on overlay menus and popovers |
387
+
388
+ **Shadow Philosophy.** Shadows are **always neutral and single-layer.** No colored shadows, no parallax stacks. Where Stripe brands its shadows in navy and Toss uses near-zero shadows for clinical clarity, Banksalad sits between — visible enough that cards lift off the surface, restrained enough that the data inside is what the eye lands on. The signature `0 2px 5px rgba(0,0,0,.12)` is a small, low-cost lift used 38× in the bundle.
389
+
390
+ ## 7. Do's and Don'ts
391
+
392
+ ### Do
393
+ - Use `#04c584` for every interactive moment — CTAs, links, focus accents, "your data point" on charts
394
+ - Use `#10df99` for hover (it's *brighter* than `#04c584` — Banksalad lightens on interaction)
395
+ - Use `#f3fdfa` mint tint on input focus background — the only branded surface tint in the system
396
+ - Keep border-radius at 2px for buttons, inputs, cards, badges — the system's geometric signature
397
+ - Use Pretendard with the full Korean fallback stack; 700 as default weight for headings and CTAs
398
+ - Use `#2b2b2b`/`#434444` warm near-blacks for type instead of `#000000`
399
+ - Use the teal-slate family (`#34464b`/`#5c818a`/`#1c6c73`/`#a7c7cf`) for chart series — cooler than brand green by design
400
+ - Use `#04c584` only for "your value" on a chart — never as a generic data fill
401
+ - Right-align financial amounts in tables; use 700 weight for amounts even at 14px
402
+ - Use comma-separated won amounts with the currency unit in 500 weight (`12,400,000원`)
403
+
404
+ ### Don't
405
+ - Don't use Toss's 12px+ rounded corners — Banksalad is 2px; 8px is the soft-marketing exception
406
+ - Don't use Kakao yellow, KakaoPay yellow, or any warm accent for primary interaction — green is the sole interactive hue
407
+ - Don't use BM JUA inside the app — Jua is for marketing-landing display moments only
408
+ - Don't use weight 400 for body — Banksalad's body weight is 500
409
+ - Don't apply colored shadows (blue, green, branded) — shadows are always neutral black
410
+ - Don't pad financial cards generously like Toss — Banksalad packs density; data is the aesthetic
411
+ - Don't approximate currency amounts (`약 120만원`) on primary financial surfaces — bare numerals with commas only
412
+ - Don't use `#0099ff` info-blue for default links — green is the default link color; blue is reserved for *external* references
413
+ - Don't use Pretendard 300 on body — light weights only at hero display sizes (52px+)
414
+ - Don't sprinkle the brand green on chart series — green is for interaction, teal-slate is for data
415
+
416
+ ## 8. Responsive Behavior
417
+
418
+ ### Breakpoints
419
+ | Name | Width | Key Changes |
420
+ |---|---|---|
421
+ | Mobile | <600px | Single column, full-width tables (horizontal scroll if needed), 16px gutters |
422
+ | Tablet | 600–1024px | 2-column card grids, 20px gutters |
423
+ | Desktop | 1024–1280px | Full marketing layout, 3-column feature grids |
424
+ | Large | >1280px | Centered content max-width ~1200px |
425
+
426
+ ### Touch Targets
427
+ - Buttons minimum 42px height (default), 56px for hero display CTAs
428
+ - Table rows minimum 44px (slightly denser than 48px standard — Banksalad accepts a tighter tap)
429
+ - Filter pill chips: 28–32px height
430
+ - Input minimum 48px height; amount-input 56px
431
+
432
+ ### Collapsing Strategy
433
+ - Hero: 52px → 36px on mobile, weight 700 maintained
434
+ - Marketing 3-col feature grids → 2-col → single column
435
+ - Comparison tables: maintain table form on tablet, switch to stacked cards on mobile (each row becomes a card with key/value pairs)
436
+ - Charts: full-width, maintain aspect ratio, axis-label font drops 12px → 10px on mobile
437
+ - Filter chip rows: horizontal scroll (no wrap) on mobile to preserve the chip rhythm
438
+
439
+ ### Image Behavior
440
+ - Card/product logos: 24–40px, consistent square framing within rows
441
+ - Chart screenshots in marketing: full-width on mobile, 2-col on desktop
442
+ - Decorative illustrations: rare; when used, locked to a single accent illustration per landing surface (no illustration overload — data is the visual)
443
+
444
+ ## 9. Agent Prompt Guide
445
+
446
+ ### Quick Color Reference
447
+ - Primary CTA: Salad Green (`#04c584`)
448
+ - Hover: Hover Green (`#10df99`)
449
+ - Page background: White (`#ffffff`)
450
+ - Surface alt: Off-white (`#fbfbfb`)
451
+ - Neutral surface: (`#f5f5f5`)
452
+ - Heading text: Warm near-black (`#2b2b2b`)
453
+ - Body text: (`#434444`)
454
+ - Caption: (`#7b7b7b`)
455
+ - Placeholder: (`#999999`)
456
+ - Border: (`#e1e1e1`)
457
+ - Focus background tint: Mint (`#f3fdfa`)
458
+ - Chart series: `#34464b` / `#5c818a` / `#1c6c73` / `#a7c7cf`
459
+ - Error: `#fe493d`
460
+ - Warning: `#fd8700` / `#f56200`
461
+
462
+ ### Example Component Prompts
463
+ - "Create a Banksalad-style primary CTA: `#04c584` background, white text, 2px border-radius (not 12px), 700-weight Pretendard at 16px, 12px 24px padding, 42px height. Hover lightens to `#10df99`."
464
+ - "Design a card-recommendation row: white background, 1px solid `#e1e1e1` border, 2px radius, 20px 24px padding, shadow `0 2px 5px rgba(0,0,0,.12)`. Card logo 32px left, title 16px/700 `#2b2b2b`, three filter chips below (`#f3fdfa` bg, `#04c584` text, 41px radius, 12px/500), annual-fee figure right-aligned 18px/700 with '원' suffix in 500."
465
+ - "Build a focused amount input: 2px border `#f5f5f5`, on focus border `#10df99` and background `#f3fdfa`. Text 22px/700 right-aligned, `#2b2b2b`, won unit in 500 weight following the digits."
466
+ - "Create a data chart: white background, axis labels 10px/500 `#7b7b7b`, gridlines 1px dashed `#e1e1e1`. Series 1 `#34464b`, series 2 `#5c818a`, series 3 `#1c6c73`. User's own data point in `#04c584` to make 'your value' pop against neutral teal-slate."
467
+ - "Design a transaction table row: alternating `#ffffff` / `#fbfbfb` background, 12px 16px padding, 1px solid `#e1e1e1` bottom border. Date column 14px/500 `#7b7b7b`, merchant 14px/500 `#434444`, amount right-aligned 14px/700 — `#2b2b2b` for positive, `#fe493d` for negative."
468
+
469
+ ### Iteration Guide
470
+ 1. **Default radius is 2px.** If the AI produces 12px or 16px corners, reject — that's Toss, not Banksalad.
471
+ 2. **Default weight is 700 for anything important.** Headings, CTAs, financial amounts. 500 for body. Never 400 for body.
472
+ 3. **Green is for interaction only.** Never use `#04c584` as a generic background fill or decorative element. It always means: the user can tap this, or this is the user's own data.
473
+ 4. **Hover lightens.** `#04c584` → `#10df99` on hover (the opposite of conventional darken-on-hover). This is a signature.
474
+ 5. **Shadows are neutral and single-layer.** `0 2px 5px rgba(0,0,0,.12)` is the workhorse. No colored shadows.
475
+ 6. **Chart series are teal-slate, not green.** `#34464b` / `#5c818a` / `#1c6c73` / `#a7c7cf`. Reserve green for the user's own data point.
476
+ 7. **Pretendard is non-negotiable.** Always include the full Korean fallback stack. Jua only for marketing display.
477
+
478
+ ---
479
+
480
+ ## 10. Voice & Tone
481
+
482
+ Banksalad speaks like a **trustworthy financial advisor who happens to read the regulations carefully** — calm, factual, slightly older-feeling than Toss, never the "friend with money" voice that consumer-app fintech defaults to. Where Toss says *"송금 완료"*, Banksalad says *"내 신용점수가 5점 올랐어요. 이번 달 카드 결제 이력이 안정적이었기 때문이에요."* The voice explains *why* the number changed, not just that it changed. Korean is the primary register; English UI strings are translations, not parity.
483
+
484
+ | Context | Tone |
485
+ |---|---|
486
+ | CTAs | Imperative, concrete outcome. `내 카드 찾기`, `대출 한도 확인하기`, `신청하기`. Never `시작하기 →` with an arrow flourish. |
487
+ | Section headlines | Statement of fact, not a hook. `이번 달 지출 분석` not `이번 달, 얼마나 썼는지 보러 갈까요?`. |
488
+ | Recommendations | Justified. Every recommended card or loan has a one-sentence reason next to it (`연 30만원 이상 절약될 수 있어요`). Never a bare ranked list. |
489
+ | Financial figures | Bare numerals with commas. `1,240,000원`. Approximations (`약 124만원`) are forbidden on primary surfaces. |
490
+ | Success messages | One-line confirmation + the relevant figure. `신용점수가 855점으로 올랐어요.` No emoji, no exclamation. |
491
+ | Error / validation | Specific cause + one-line action. `주민등록번호가 일치하지 않아요. 다시 확인해주세요.` Never `오류가 발생했습니다`. |
492
+ | Empty states | Explain the *why*, then suggest one next step. `아직 연동된 카드가 없어요. 카드를 연동하면 자동으로 지출 분석이 시작돼요.` |
493
+ | Legal / disclosure | Formal `~합니다` endings. Pinned at the bottom of recommendation cards. Treated as part of the product, not a footer afterthought. |
494
+ | Health-asset (DNA, screening) | Same calm advisor voice as finance. No marketing exuberance about "discovering your DNA". Just `이번 검사로 18가지 항목을 확인할 수 있어요`. |
495
+
496
+ **Forbidden phrases.** `오류가 발생했습니다`, `Oops`, `간단하게`, `최고의 ~`, `놓치지 마세요`, exclamation marks on routine CTAs, emoji on financial surfaces, approximations on money (`약 ~원`), `놀라운 절약` / "amazing savings" / superlative-driven recommendations. Banksalad's voice is the opposite of clickbait — the user came here to think about money, and the product should respect the seriousness of that intent.
497
+
498
+ ## 11. Brand Narrative
499
+
500
+ Banksalad is the consumer brand of **Rainist (레이니스트)**, founded in **2012 by Kim Tae-hoon (김태훈)** — a Sogang University graduate who started the company inside the Smilegate game-studio incubator and whose **founding team manually classified 16 hours a day of Korean financial-product data to build the first comparison database** ([Hankyung 2019-03-12](https://www.hankyung.com/article/2019031275551)). The founding rejection was specific: every legacy Korean financial portal in 2012 (Bankrate-style aggregators, bank-run comparison pages) presented credit cards and loans in alphabetical lists optimized for the issuer, not the user. Kim Tae-hoon's stated thesis was *"정보 비대칭성을 해소해 누구나 똑똑해지는 세상을 만들겠다"* — "resolve information asymmetry so anyone can become smart [about their own money]" (founder interviews, Korean press 2018–2019). The product's design language follows directly from that thesis: **more facts, clearly tiered, with the reason next to every recommendation.**
501
+
502
+ Banksalad's monthly active users tripled to **1.5M in early 2019** ([Korea Herald 2019-02-22](http://www.koreaherald.com/view.php?ud=20190222000548)). The company raised a **₩45B ($37M USD) Series C at a ₩300B ($247M) valuation in 2019** ([Korea Herald 2019-08-28](https://www.koreaherald.com/article/2087712)) and has raised **$169.96M cumulatively** to date (PitchBook). Today the product spans credit-card recommendation, personal loans, mortgages, deposits/savings, and — uniquely — **a free DNA-based health-screening service** that extends the "manage your assets" framing from financial assets to health assets. The home-page tagline as of 2026-05-13 reads *"뱅크샐러드 \| 금융을 넘어 건강 자산까지"* ("Banksalad — from finance to health assets"), making that extension the brand's current positioning.
503
+
504
+ The design system is internally called **BPL — Banksalad Product Language**, documented on the official tech blog ([blog.banksalad.com/tech/banksalad-product-language-ios](https://blog.banksalad.com/tech/banksalad-product-language-ios/)). BPL's most-quoted principle is *"Communication cost is most expensive. Code and Show first, argue after that."* BPL is implemented on iOS with LayoutDrivenUI + RxSwift, on Android in Kotlin, on Web through the CSS bundle this DESIGN.md was extracted from. The system explicitly avoids premature component abstraction — similar components stay independent, matching how designers structure their Figma libraries. The mint-green (`#04c584`), the 2px radius, the Pretendard 700 default, the teal-slate chart palette — all are BPL primitives.
505
+
506
+ What Banksalad refuses: the cheerful consumer-app voice of Toss and KakaoPay (banksalad explains; it does not delight), the institutional-indigo of legacy Korean banks (which is why it picked green, not blue), the playful illustration of Kakao-family products (Banksalad does not use mascot characters), and the data-density of Bloomberg-terminal aesthetics (the tables are dense but the type is human-readable). Banksalad sits in a narrow middle: serious enough to be an advisor, modern enough to be the app a 26-year-old opens between subway stops.
507
+
508
+ ## 12. Principles
509
+
510
+ 1. **Show the number, then show the reason.** Every recommended card, loan, or asset comes with a one-sentence justification next to the figure. A ranked list without reasons is a violation of the brand. UI implication: every recommendation card must have a "justification line" slot in its component contract.
511
+ 2. **Density is trust.** Where consumer-app fintech treats whitespace as luxury, Banksalad treats density as competence. A user who can see four comparison rows at once is being respected as a researcher. UI implication: card padding 20–24px, not 32px+. Tables ship as tables, not as stacked single-rows.
512
+ 3. **Green is interaction, not decoration.** `#04c584` only appears where the user can act (CTA, link, focus, selection) or where the user's own data is shown ("your value" on a chart, "your score"). Never on a decorative gradient, never as a page-section background. UI implication: never use brand green as a fill that does not change on hover.
513
+ 4. **2px is a philosophical commitment.** The sharp corner reads as data-tool; Toss/Kakao's 12–16px reads as consumer-toy. Banksalad chooses to look engineered. UI implication: do not import any consumer-app card with rounded corners as-is; re-corner to 2px.
514
+ 5. **Numerals are headings.** Financial amounts at 20px+ are styled with the same hierarchical weight (700) as page titles. Money is information of the highest priority — it gets the typographic treatment of a heading, never of body. UI implication: amounts use heading-class typography tokens.
515
+ 6. **The reason for the recommendation is part of the product.** Disclaimers, comparison criteria, and rate sources are not legal footers — they are pinned inside the recommendation card, in the same visual frame as the recommendation itself. UI implication: every recommendation component reserves a `disclosure` slot that is always rendered, not collapsed-by-default.
516
+ 7. **Korean and Latin numerals must align.** Pretendard's optical alignment between 한글 and Latin numerals is non-negotiable — a column of `1,240,000원` and `$1,240` should read as one column, not two scripts arguing. UI implication: never substitute a Latin-only font for numeric display; Pretendard handles both.
517
+ 8. **Charts use teal-slate, not brand green, for the field.** Reserving green for the user's own value makes the user's position immediately legible against neutral series. UI implication: chart `seriesColors` defaults to `[#34464b, #5c818a, #1c6c73, #a7c7cf]`; user's series defaults to `#04c584`.
518
+ 9. **Approximations are a betrayal.** `약 ~원` on a primary money surface tells the user the product does not actually know the number. Banksalad's brand promise is information clarity; rounded figures are forbidden where the precise figure exists. UI implication: financial-amount components do not accept a `round: true` flag.
519
+
520
+ ## 13. Personas
521
+
522
+ *Personas below are fictional archetypes informed by publicly observable Banksalad user segments (Korean millennials managing credit-card portfolios, freelancers comparing loan products, mid-life users tracking health-and-finance side by side), not individual people.*
523
+
524
+ **박지혜 (Park Ji-hye), 31, Seoul.** Senior designer at a Seoul-based scaleup. Opens Banksalad once a week to scan her credit-card spend-by-category report. Switches cards every 18 months based on whichever one Banksalad's recommendation engine surfaces with the best annual-savings figure for her actual usage pattern — *not* the one with the flashiest sign-up bonus. Reads the one-sentence justification under every recommendation before tapping; would close the app permanently if it ever shipped a "best card 🔥" list without reasons.
525
+
526
+ **김상민 (Mr. Kim), 47, Daegu.** Self-employed, runs a small import business. Uses Banksalad primarily for comparing business-friendly credit cards and tracking interest-rate movements on his three commercial loans. Trusts the product because the rate comparison shows the source date and the underlying assumption (`연 환산 기준`). Pays attention to the disclosure text inside each recommendation card — would lose trust immediately if a recommendation appeared without its rate basis.
527
+
528
+ **이수연 (Lee Su-yeon), 28, Seongnam.** UX researcher. Uses Banksalad for two unrelated reasons: monthly spend analysis, and the free DNA-based health screening. Finds the same voice across both surfaces (calm, factual, advisor-tone) reassuring — it makes the health-screening feel like an extension of "manage your assets" rather than a sudden pivot. Compares Banksalad's spend analysis to Toss's and prefers Banksalad's because *"Toss는 다 정리되어 있고 깔끔한데, 뱅크샐러드는 왜 그런지를 알려줘요"* (illustrative paraphrase) — Toss tidies, Banksalad explains.
529
+
530
+ **조현우 (Cho Hyun-woo), 39, Busan.** Mid-career operations manager. Reviews Banksalad's monthly credit-report widget — has been watching his credit score climb from 820 to 868 over 14 months. Doesn't tap CTAs; uses Banksalad strictly as a dashboard. Trusts the green `#04c584` "your score" indicator on the score-trend chart because it always shows him *his* position against the teal-slate distribution of the population — the green-vs-teal distinction tells him at a glance which data is about him.
531
+
532
+ ## 14. States
533
+
534
+ | State | Treatment |
535
+ |---|---|
536
+ | **Empty (no linked accounts)** | White canvas. Single short paragraph in `#434444` body text explaining why the screen is empty (`아직 연동된 카드가 없어요. 카드를 연동하면 자동으로 지출 분석이 시작돼요.`). One primary CTA in Salad Green (`#04c584`, 2px radius). No illustration. |
537
+ | **Empty (filter cleared)** | Single line of `#7b7b7b` caption (`조건에 맞는 결과가 없어요. 필터를 조정해주세요.`). No CTA — user adjusts filters themselves. |
538
+ | **Empty (no transactions this period)** | Two-line message in `#434444` explaining the filter scope (`선택한 기간에 거래 내역이 없어요. 다른 기간을 선택하거나 카드 연동을 확인해보세요.`). |
539
+ | **Loading (first paint)** | Skeleton blocks at `#f5f5f5` matching the final layout exactly. Financial amounts render as `--원` placeholders rather than skeleton bars — a skeleton bar that resolves to a number is disorienting; `--` is honest. 1s shimmer with 8% white highlight using a `linear-gradient` sweep. |
540
+ | **Loading (refresh / in-place)** | Subtle `#04c584` 2px progress bar at top of the section. Previous values stay visible. Never block the table during refresh. |
541
+ | **Error (inline field)** | `#fe493d` 1px border on the input, 12px error text below in `#fe493d` weight 500. One actionable sentence (`주민등록번호가 일치하지 않아요. 다시 확인해주세요.`). |
542
+ | **Error (recommendation fetch failed)** | Inline banner inside the recommendation card area. `#fe493d` left border, white background, 14px `#434444` text explaining what failed + a `다시 시도하기` button in the retry-button style (`#10df99` resting → `#04c584` on hover). Never a generic toast. |
543
+ | **Error (data freshness warning)** | Soft warning banner with `#fd8700` left accent bar, white background, 13px `#7b7b7b` text noting the data is N hours stale. Non-blocking — the user can still see the (possibly stale) figures. |
544
+ | **Success (action confirmed)** | Inline confirmation row in `#f3fdfa` mint-tint background, `#04c584` 16px / 700 confirmation text, the relevant figure in 22px / 700 `#2b2b2b` below. No toast for important actions — they get their own confirmation surface. |
545
+ | **Success (passive update)** | 3s auto-dismiss toast at top-right. `#2b2b2b` background (NOT brand green — green is reserved for interactive surfaces), white 14px / 500 text, 2px radius, shadow `0 2px 5px rgba(0,0,0,.12)`. No emoji. |
546
+ | **Skeleton** | `#f5f5f5` blocks at exact final dimensions, 2px radius matching the component being loaded. 1s shimmer. Financial-amount slots show `--원`, not a bar. |
547
+ | **Disabled** | Background `#e1e1e1`, text `#acacac`, 2px radius preserved. Cursor `not-allowed`. The geometry stays identical to the enabled state so re-enabling does not shift layout. |
548
+ | **Pressed (button)** | Inset shadow `inset 0 1px 1px rgba(0,0,0,.12)` + background shifts by ~5% darker for the press duration. Returns instantly on release (no spring). |
549
+
550
+ ## 15. Motion & Easing
551
+
552
+ **Durations:**
553
+
554
+ | Token | Value | Use |
555
+ |---|---|---|
556
+ | `motion-instant` | 0ms | State commits, checkbox flips, focus ring appearance |
557
+ | `motion-fast` | 150ms | Hover, focus, button press overlays, inline value updates |
558
+ | `motion-standard` | 250ms | Card expand, dropdown open, tab content switch, modal open |
559
+ | `motion-slow` | 400ms | Page-level transitions, recommendation-card reveal animation |
560
+ | `motion-data` | 600ms | Chart series draw-in, score-bar count-up — slower because the user needs time to read the number |
561
+
562
+ **Easings:**
563
+
564
+ | Token | Curve | Use |
565
+ |---|---|---|
566
+ | `ease-enter` | `cubic-bezier(0.0, 0.0, 0.2, 1)` | Arriving — modals, dropdowns, sheets |
567
+ | `ease-exit` | `cubic-bezier(0.4, 0.0, 1, 1)` | Dismissals |
568
+ | `ease-standard` | `cubic-bezier(0.4, 0.0, 0.2, 1)` | Two-way transitions, chart draw-in |
569
+ | `ease-data` | `cubic-bezier(0.25, 0.46, 0.45, 0.94)` | Score count-up, chart series — eases out gradually so the final value is the calm resting state |
570
+
571
+ **Explicitly forbidden.** No spring overshoot anywhere. No bounce. No `cubic-bezier` with a middle control above `1.0`. Banksalad's voice is *advisor*, not *delighter* — spring-easing reads as a consumer app celebrating a transaction, which is the opposite of the brand promise. Where Toss licenses spring easing only for the money-moved checkmark, Banksalad does not license it at all.
572
+
573
+ **Signature motions.**
574
+
575
+ 1. **Score count-up.** When a credit-score or asset-total updates, the number animates from the previous value to the new value across `motion-data` (600ms) with `ease-data`. The duration is deliberately slow — the user is supposed to read the change, not see it flash. The Korean numeric separators (`,`) re-flow correctly during the count.
576
+ 2. **Chart series draw-in.** Time-series charts draw left-to-right in `motion-data` with `ease-standard`. The user's own series (`#04c584`) is drawn *last*, so the eye lands on the user's own data after the surrounding distribution has been established.
577
+ 3. **Recommendation card reveal.** When a fresh recommendation set loads, cards fade in with `motion-standard / ease-enter` from `opacity: 0; translateY(4px)`. Translate is intentionally small (4px, not 20px) — the cards arrive, they do not fly in.
578
+ 4. **Reduce motion.** Under `prefers-reduced-motion: reduce`, all `motion-*` tokens collapse to `motion-instant`. Score count-ups become instant value swaps. Chart draw-ins render their final state immediately. Banksalad remains fully usable; nothing in the product is information-dependent on motion.
579
+
580
+ <!--
581
+ OmD v0.1 Sources — Philosophy Layer (sections 10–15)
582
+
583
+ Direct verification via WebFetch + curl (2026-05-13):
584
+ - https://www.banksalad.com/ — confirms current tagline "뱅크샐러드 | 금융을 넘어 건강 자산까지"
585
+ and the Pretendard + BM JUA font stack via preload <link> tags.
586
+ - https://webview-cdn.banksalad.com/banksalad-web/static/dist/v2.5c10981711a65fe446400c6ecec36a221b1c3e9e.bundle.css
587
+ (865 KB) — all token-level claims (#04c584 primary green, 2px dominant radius,
588
+ Pretendard with full Korean fallback, 700 default weight, 0 2px 5px rgba(0,0,0,.12)
589
+ standard shadow, input focus border #10df99 / background #f3fdfa).
590
+ - https://blog.banksalad.com/tech/banksalad-product-language-ios/ — confirms
591
+ the design system is internally called "BPL" (Banksalad Product Language)
592
+ and the quoted principle "Communication cost is most expensive. Code and Show
593
+ first, argue after that."
594
+ - https://github.com/banksalad — confirms the official org and the
595
+ banksalad/styleguide public repo.
596
+
597
+ Brand facts via WebSearch (2026-05-13):
598
+ - Hankyung 2019-03-12 — manual 16-hour/day data classification origin
599
+ - Korea Herald 2019-02-22 — 1.5M MAU early 2019
600
+ - Korea Herald 2019-08-28 — ₩45B Series C at ₩300B valuation
601
+ - PitchBook — $169.96M total raised
602
+
603
+ Founder mission quote "정보 비대칭성을 해소해 누구나 똑똑해지는 세상을 만들겠다"
604
+ is attributed to Kim Tae-hoon per multiple Korean press interviews summarized
605
+ in the WebSearch result; the exact phrasing is widely cited in Korean fintech
606
+ coverage of Banksalad.
607
+
608
+ Personas (§13) are fictional archetypes informed by publicly described
609
+ Banksalad user segments (Korean millennials managing credit-card spend,
610
+ self-employed users comparing rates, UX researchers using the health-asset
611
+ extension, mid-career users using Banksalad as a passive dashboard). Names
612
+ are illustrative; they do not refer to real people. Yi Su-yeon's paraphrase
613
+ of Toss-vs-Banksalad voice in §13 is explicitly marked illustrative.
614
+
615
+ Interpretive claims (e.g., "2px is a philosophical commitment", "green is for
616
+ interaction, not decoration", "approximations are a betrayal") are editorial
617
+ readings of BPL's observable design choices, not directly sourced Banksalad
618
+ statements. They are anchored in the principle quote from BPL_iOS
619
+ ("Communication cost is most expensive...") and the founder's mission
620
+ ("resolve information asymmetry").
621
+ -->