oh-my-design-cli 1.0.2 → 1.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.
- package/README.md +15 -18
- package/data/reference-fingerprints.json +337 -3
- package/data/reference-tags.md +15 -1
- package/package.json +2 -2
- package/skills/omd-init/SKILL.md +1 -1
- package/web/AGENTS.md +5 -0
- package/{references → web/references}/airbnb/DESIGN.md +158 -19
- package/web/references/airtable/DESIGN.md +241 -0
- package/{references → web/references}/apple/DESIGN.md +131 -76
- package/web/references/baemin/DESIGN.md +470 -0
- package/{references → web/references}/bmw/DESIGN.md +138 -9
- package/{references → web/references}/cal/DESIGN.md +173 -17
- package/{references → web/references}/claude/DESIGN.md +11 -1
- package/{references → web/references}/clay/DESIGN.md +75 -0
- package/{references → web/references}/clickhouse/DESIGN.md +74 -0
- package/{references → web/references}/cohere/DESIGN.md +75 -0
- package/web/references/coinbase/DESIGN.md +205 -0
- package/{references → web/references}/composio/DESIGN.md +74 -0
- package/web/references/coupang/DESIGN.md +487 -0
- package/{references → web/references}/cursor/DESIGN.md +74 -0
- package/web/references/dcard/DESIGN.md +567 -0
- package/{references → web/references}/elevenlabs/DESIGN.md +91 -0
- package/{references → web/references}/expo/DESIGN.md +72 -0
- package/{references → web/references}/ferrari/DESIGN.md +72 -0
- package/{references → web/references}/figma/DESIGN.md +124 -48
- package/{references → web/references}/framer/DESIGN.md +143 -16
- package/web/references/freee/DESIGN.md +558 -0
- package/{references → web/references}/hashicorp/DESIGN.md +72 -0
- package/{references → web/references}/ibm/DESIGN.md +68 -0
- package/{references → web/references}/intercom/DESIGN.md +73 -0
- package/web/references/kakao/DESIGN.md +490 -0
- package/web/references/kakaobank/DESIGN.md +533 -0
- package/web/references/karrot/DESIGN.md +431 -0
- package/web/references/kraken/DESIGN.md +219 -0
- package/web/references/krds/DESIGN.md +982 -0
- package/web/references/kurly/DESIGN.md +574 -0
- package/{references → web/references}/lamborghini/DESIGN.md +74 -0
- package/{references → web/references}/line/DESIGN.md +84 -43
- package/{references → web/references}/linear.app/DESIGN.md +8 -1
- package/{references → web/references}/lovable/DESIGN.md +73 -0
- package/web/references/mercari/DESIGN.md +464 -0
- package/{references → web/references}/minimax/DESIGN.md +72 -0
- package/{references → web/references}/mintlify/DESIGN.md +72 -0
- package/web/references/miro/DESIGN.md +252 -0
- package/{references → web/references}/mistral.ai/DESIGN.md +72 -0
- package/{references → web/references}/mongodb/DESIGN.md +72 -0
- package/web/references/musinsa/DESIGN.md +536 -0
- package/web/references/naver/DESIGN.md +518 -0
- package/{references → web/references}/notion/DESIGN.md +9 -1
- package/web/references/nvidia/DESIGN.md +491 -0
- package/web/references/ohouse/DESIGN.md +570 -0
- package/{references → web/references}/ollama/DESIGN.md +72 -0
- package/{references → web/references}/opencode.ai/DESIGN.md +73 -0
- package/web/references/pinkoi/DESIGN.md +575 -0
- package/{references → web/references}/pinterest/DESIGN.md +73 -0
- package/{references → web/references}/posthog/DESIGN.md +172 -18
- package/web/references/qanda/DESIGN.md +459 -0
- package/{references → web/references}/raycast/DESIGN.md +169 -34
- package/{references → web/references}/renault/DESIGN.md +72 -0
- package/{references → web/references}/replicate/DESIGN.md +73 -0
- package/{references → web/references}/resend/DESIGN.md +73 -0
- package/{references → web/references}/revolut/DESIGN.md +74 -0
- package/web/references/ridi/DESIGN.md +517 -0
- package/{references → web/references}/runwayml/DESIGN.md +152 -24
- package/{references → web/references}/sanity/DESIGN.md +72 -0
- package/{references → web/references}/sentry/DESIGN.md +73 -0
- package/web/references/spacex/DESIGN.md +379 -0
- package/web/references/spotify/DESIGN.md +426 -0
- package/{references → web/references}/stripe/DESIGN.md +44 -1
- package/{references → web/references}/supabase/DESIGN.md +73 -0
- package/{references → web/references}/superhuman/DESIGN.md +159 -17
- package/{references → web/references}/tesla/DESIGN.md +170 -0
- package/{references → web/references}/together.ai/DESIGN.md +73 -0
- package/{references → web/references}/toss/DESIGN.md +304 -50
- package/{references → web/references}/uber/DESIGN.md +73 -0
- package/{references → web/references}/vercel/DESIGN.md +9 -1
- package/{references → web/references}/voltagent/DESIGN.md +73 -0
- package/{references → web/references}/warp/DESIGN.md +142 -15
- package/web/references/webflow/DESIGN.md +253 -0
- package/{references → web/references}/wise/DESIGN.md +84 -0
- package/{references → web/references}/x.ai/DESIGN.md +85 -0
- package/web/references/yanolja/DESIGN.md +448 -0
- package/web/references/yeogiotte/DESIGN.md +424 -0
- package/{references → web/references}/zapier/DESIGN.md +85 -0
- package/references/airtable/DESIGN.md +0 -107
- package/references/baemin/DESIGN.md +0 -260
- package/references/coinbase/DESIGN.md +0 -129
- package/references/dcard/DESIGN.md +0 -302
- package/references/freee/DESIGN.md +0 -308
- package/references/kakao/DESIGN.md +0 -261
- package/references/karrot/DESIGN.md +0 -252
- package/references/kraken/DESIGN.md +0 -146
- package/references/mercari/DESIGN.md +0 -294
- package/references/miro/DESIGN.md +0 -108
- package/references/nvidia/DESIGN.md +0 -308
- package/references/pinkoi/DESIGN.md +0 -309
- package/references/spacex/DESIGN.md +0 -205
- package/references/spotify/DESIGN.md +0 -246
- package/references/webflow/DESIGN.md +0 -109
|
@@ -0,0 +1,558 @@
|
|
|
1
|
+
---
|
|
2
|
+
omd: 0.1
|
|
3
|
+
brand: freee
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Design System Inspiration of freee
|
|
7
|
+
|
|
8
|
+
## 1. Visual Theme & Atmosphere
|
|
9
|
+
|
|
10
|
+
freee is Japan's leading cloud accounting / HR / payroll SaaS, and its design system **Vibes** is fully open-source at [github.com/freee/vibes](https://github.com/freee/vibes). The token files (`stylesheets/lv0/_colors.scss`, `_size.scss`, `_fonts.scss`) form a clean, semantic, three-tier architecture: **scale tokens** (`$vbColorsP01`–`P10` for primary blues, `S01`–`S10` for grayscale, etc.), **semantic tokens** (`$vbPrimaryColor`, `$vbAccentColor`, `$vbAlertColor`), and **component tokens** (line-height, font sizes mapped to typography roles). This is the cleanest token architecture among the OMD references — and it's all readable from one place.
|
|
11
|
+
|
|
12
|
+
The brand is anchored in a **deep enterprise blue** (`#285ac8`, `$vbColorsP07`) — calm, trustworthy, financial-software professional. A lighter accent blue (`#73a5ff`, `$vbColorsP04`) handles secondary emphasis. The color system extends across 9 hue families (Primary, Secondary/gray, Red, Orange, Yellow, Yellow-Green, Green, Blue-Green, Purple, Gray) with each having 5-10 calibrated shades, giving designers a complete palette for status, illustrations, and category coding.
|
|
13
|
+
|
|
14
|
+
Typography is a Japanese-first system stack: `-apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'ヒラギノ角ゴ ProN', Hiragino Kaku Gothic ProN, Arial, 'メイリオ', Meiryo, sans-serif`. The brand wordmark uses Noto Sans CJK JP Medium loaded explicitly as `freee-logo`. The type scale is a tight 5-step rhythm (10 / 12 / 14 / 16 / 24dp), with mobile sizes stepping down for headline tiers. Spacing follows a consistent 4dp baseline (4 / 8 / 16 / 24 / 32 / 48dp).
|
|
15
|
+
|
|
16
|
+
**Key Characteristics:**
|
|
17
|
+
- **Open-source design system** ([freee/vibes](https://github.com/freee/vibes)) with three-tier token architecture (scale → semantic → component)
|
|
18
|
+
- Enterprise blue brand: `#285ac8` primary (`$vbColorsP07`), `#73a5ff` accent (`$vbColorsP04`)
|
|
19
|
+
- 9-hue palette: Primary (P), Secondary/gray (S), Red (RE), Orange (OR), Yellow (YE), Yellow-Green (YG), Green (GR), Blue-Green (BG), Purple (PU), pure Gray (GY)
|
|
20
|
+
- Each hue scale has 5-10 calibrated shades (P01 lightest → P10 darkest)
|
|
21
|
+
- 4dp baseline spacing scale: `xs 4dp / s 8dp / basic 16dp / large 24dp / xl 32dp / xxl 48dp`
|
|
22
|
+
- Tight 5-step type scale: `10 / 12 / 14 / 16 / 24dp` — no display extremes, no middle gaps
|
|
23
|
+
- Form-control heights as design tokens: `small 24dp / basic 36dp / large 48dp`
|
|
24
|
+
- Container max-width `1120dp` (`70rem`) — wider than Bootstrap defaults but narrower than Mercari
|
|
25
|
+
- Three explicit shadow recipes: card, floating, popup (graduated weights)
|
|
26
|
+
- Z-index hierarchy with semantic names: overlay 100 → form actions 200 → floating 500 → full-screen 700 → modal 1000 → popup 2000 → max
|
|
27
|
+
- Japanese-first font stack with Hiragino Kaku Gothic ProN as the primary CJK fallback
|
|
28
|
+
|
|
29
|
+
## 2. Color Palette & Roles
|
|
30
|
+
|
|
31
|
+
All values extracted from `stylesheets/lv0/_colors.scss` in the open-source [freee/vibes](https://github.com/freee/vibes) repo (vibes_2021).
|
|
32
|
+
|
|
33
|
+
### Primary Blue (`$vbColorsP01–P10`)
|
|
34
|
+
- `#ebf3ff` (P01) — lightest tint, page background hint
|
|
35
|
+
- `#dce8ff` (P02) — light surface, badge bg
|
|
36
|
+
- `#aac8ff` (P03) — light accent
|
|
37
|
+
- `#73a5ff` (P04) — **`$vbAccentColor`** (accent, hover for primary)
|
|
38
|
+
- `#2864f0` (P05) — bright primary
|
|
39
|
+
- `#3264dc` (P06) — primary mid
|
|
40
|
+
- `#285ac8` (P07) — **`$vbPrimaryColor`** (primary actions, links, brand)
|
|
41
|
+
- `#1e46aa` (P08) — primary dark
|
|
42
|
+
- `#23418c` (P09) — primary darker
|
|
43
|
+
- `#143278` (P10) — primary darkest
|
|
44
|
+
|
|
45
|
+
### Secondary / Neutral (`$vbColorsS01–S10`)
|
|
46
|
+
- `#f7f5f5` (S01) — `$vbColumnColor` (column / table bg)
|
|
47
|
+
- `#f0eded` (S02) — `$vbBaseColor1` (subtle surface 1)
|
|
48
|
+
- `#e9e7e7` (S03) — `$vbBaseColor2` (subtle surface 2)
|
|
49
|
+
- `#e1dcdc` (S04)
|
|
50
|
+
- `#d7d2d2` (S05)
|
|
51
|
+
- `#bebaba` (S06)
|
|
52
|
+
- `#aaa7a7` (S07)
|
|
53
|
+
- `#8c8989` (S08) — `$vbBaseColor3` (mid neutral, captions)
|
|
54
|
+
- `#6e6b6b` (S09) — `$vbBurntColor` (text-burnt)
|
|
55
|
+
- `#464343` (S10) — darkest neutral
|
|
56
|
+
|
|
57
|
+
### Status (Red, Orange, Yellow scales)
|
|
58
|
+
- **Red** (`RE02 #fad2d7`, `RE04 #f07882`, `RE05 #dc1e32`, `RE07 #a51428`, `RE10 #6e0f19`)
|
|
59
|
+
- `$vbAlertColor: $vbColorsRE05` (`#dc1e32`) — alerts, errors, destructive actions
|
|
60
|
+
- **Orange** (`OR02 #ffe1d2`, `OR04 #ffaa78`, `OR05 #fa6414`, `OR07 #be4b0f`, `OR10 #7d320a`)
|
|
61
|
+
- **Yellow** (`YE02 #fff0d2`, `YE04 #ffd278`, `YE05 #ffb91e`, `YE07 #be8c14`, `YE10 #825a0f`)
|
|
62
|
+
- `$vbNoticeColor: $vbColorsYE07` (`#be8c14`) — warnings, notices
|
|
63
|
+
|
|
64
|
+
### Yellow-Green / Green / Blue-Green (success, growth)
|
|
65
|
+
- **Yellow-Green** (`YG02 #e6f0d2`, `YG04 #b4dc7d`, `YG05 #82c31e`, `YG07 #50961e`, `YG10 #3c5f14`)
|
|
66
|
+
- **Green** (`GR02 #cdebd7`, `GR04 #64be8c`, `GR05 #00963c`, `GR07 #006e2d`, `GR10 #004b1e`) — success
|
|
67
|
+
- **Blue-Green / Teal** (`BG02 #cdf0f0`, `BG04 #64d2d2`, `BG05 #00b9b9`, `BG07 #008c8c`, `BG10 #146464`)
|
|
68
|
+
|
|
69
|
+
### Purple
|
|
70
|
+
- `PU02 #e6d7fa`, `PU04 #b482f0`, `PU05 #733ce6`, `PU07 #5a2daa`, `PU10 #3c1e73`
|
|
71
|
+
|
|
72
|
+
### Pure Gray (`$vbColorsGY01–GY10`)
|
|
73
|
+
- `#fbfbfb` (GY01) — page bg highlight
|
|
74
|
+
- `#dcdcdc` (GY02)
|
|
75
|
+
- `#a0a0a0` (GY04)
|
|
76
|
+
- `#5a5a5a` (GY05)
|
|
77
|
+
- `#323232` (GY07) — **`$vbBlackColor`** (default text color)
|
|
78
|
+
- `#1e1e1e` (GY10) — darkest gray
|
|
79
|
+
|
|
80
|
+
### Semantic Aliases (the design contracts)
|
|
81
|
+
| Semantic | Value | Use |
|
|
82
|
+
|---|---|---|
|
|
83
|
+
| `$vbPrimaryColor` | `$vbColorsP07` (`#285ac8`) | Primary CTAs, brand actions |
|
|
84
|
+
| `$vbAccentColor` | `$vbColorsP04` (`#73a5ff`) | Accent hover, secondary brand |
|
|
85
|
+
| `$vbLinkColor` | `$vbColorsP07` (`#285ac8`) | Hyperlinks (matches primary) |
|
|
86
|
+
| `$vbColumnColor` | `$vbColorsS01` (`#f7f5f5`) | Table column bg |
|
|
87
|
+
| `$vbBaseColor1` | `$vbColorsS02` (`#f0eded`) | Subtle surface 1 |
|
|
88
|
+
| `$vbBaseColor2` | `$vbColorsS03` (`#e9e7e7`) | Subtle surface 2 |
|
|
89
|
+
| `$vbBaseColor3` | `$vbColorsS08` (`#8c8989`) | Mid neutral text |
|
|
90
|
+
| `$vbBurntColor` | `$vbColorsS09` (`#6e6b6b`) | Burnt-out text (de-emphasized) |
|
|
91
|
+
| `$vbBlackColor` | `$vbColorsGY07` (`#323232`) | Default text color |
|
|
92
|
+
| `$vbAlertColor` | `$vbColorsRE05` (`#dc1e32`) | Alerts, errors, destructive |
|
|
93
|
+
| `$vbNoticeColor` | `$vbColorsYE07` (`#be8c14`) | Warnings, notices |
|
|
94
|
+
| `$vbBackgroundColor` | `$vbColorsP01` (`#ebf3ff`) | Page tint background |
|
|
95
|
+
|
|
96
|
+
### Scrim / Overlay
|
|
97
|
+
- `$vbScrimColor: rgba(0, 0, 0, 0.5)` — modal backdrop
|
|
98
|
+
- `$vbThinScrimColor: rgba(0, 0, 0, 0.12)` — light overlay (e.g., disabled state)
|
|
99
|
+
|
|
100
|
+
## 3. Typography Rules
|
|
101
|
+
|
|
102
|
+
### Font Stack
|
|
103
|
+
```scss
|
|
104
|
+
$vbFontFamily: '-apple-system', BlinkMacSystemFont, 'Helvetica Neue',
|
|
105
|
+
'ヒラギノ角ゴ ProN', Hiragino Kaku Gothic ProN, Arial, 'メイリオ', Meiryo,
|
|
106
|
+
sans-serif;
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
`-apple-system` and `BlinkMacSystemFont` lead for native rendering on macOS/iOS, then Helvetica Neue, then Japanese fallbacks (Hiragino → Meiryo). The brand wordmark uses **Noto Sans CJK JP Medium** loaded explicitly as `font-family: 'freee-logo'` from Google Fonts.
|
|
110
|
+
|
|
111
|
+
### Type Scale (verified from `_size.scss`)
|
|
112
|
+
| Token | Size | Use |
|
|
113
|
+
|---|---|---|
|
|
114
|
+
| `$vbFontSize0625` | `0.625rem` (10dp) | Smallest icon font |
|
|
115
|
+
| `$vbFontSize0750` | `0.75rem` (12dp) | Caption |
|
|
116
|
+
| `$vbFontSize0875` | `0.875rem` (14dp) | Normal body, Headline 3 |
|
|
117
|
+
| `$vbFontSize1000` | `1rem` (16dp) | Headline 2 |
|
|
118
|
+
| `$vbFontSize1500` | `1.5rem` (24dp) | Headline 1 |
|
|
119
|
+
|
|
120
|
+
### Semantic Typography Tokens
|
|
121
|
+
| Token | Value |
|
|
122
|
+
|---|---|
|
|
123
|
+
| `$vbCaptionFontSize` | `0.75rem` (12dp) |
|
|
124
|
+
| `$vbNormalFontSize` | `0.875rem` (14dp) |
|
|
125
|
+
| `$vbHeadline3FontSize` | `0.875rem` (14dp) |
|
|
126
|
+
| `$vbHeadline2FontSize` | `1rem` (16dp) |
|
|
127
|
+
| `$vbHeadline1FontSize` | `1.5rem` (24dp) |
|
|
128
|
+
|
|
129
|
+
### Mobile Typography (steps down for tablets/phones)
|
|
130
|
+
- `$vbMobileHeadline1FontSize: 16dp` (was 24dp)
|
|
131
|
+
- `$vbMobileHeadline2FontSize: 14dp` (was 16dp)
|
|
132
|
+
- `$vbMobileHeadline3FontSize: 14dp` (unchanged)
|
|
133
|
+
|
|
134
|
+
### Line Height
|
|
135
|
+
- `$vbLineHeight: 1.5` — universal default (generous for CJK readability)
|
|
136
|
+
|
|
137
|
+
### Conventions
|
|
138
|
+
- **No display sizes above 24dp** — freee's voice is utilitarian SaaS, not editorial
|
|
139
|
+
- **Body and Headline 3 share 14dp** — visual hierarchy comes from weight + color, not size
|
|
140
|
+
- **Mobile compresses everything to 14-16dp** — preserves 1.5 line-height for cramped screens
|
|
141
|
+
- **Brand wordmark uses Noto Sans CJK JP Medium** — only place a custom font loads
|
|
142
|
+
|
|
143
|
+
## 4. Component Stylings
|
|
144
|
+
|
|
145
|
+
### Buttons
|
|
146
|
+
|
|
147
|
+
**Primary**
|
|
148
|
+
- Background: `#285ac8` (`$vbPrimaryColor`)
|
|
149
|
+
- Text: `#ffffff`
|
|
150
|
+
- Radius: 4px
|
|
151
|
+
- Padding: 8px 16px (basic) — small `4px 16px`, large `12px 24px`
|
|
152
|
+
- Height: 36px (`$vbFormControlHeight`)
|
|
153
|
+
- Font: 14px / 500-700
|
|
154
|
+
- Disabled: overlay `rgba(0,0,0,0.12)` (`$vbThinScrimColor`)
|
|
155
|
+
- Use: Primary CTAs, brand actions
|
|
156
|
+
|
|
157
|
+
**Small**
|
|
158
|
+
- Background: `#285ac8`
|
|
159
|
+
- Text: `#ffffff`
|
|
160
|
+
- Radius: 4px
|
|
161
|
+
- Padding: 4px 16px
|
|
162
|
+
- Height: 24px (`$vbFormControlSmallHeight`)
|
|
163
|
+
- Font: 14px / 500
|
|
164
|
+
- Use: Compact buttons in dense tables
|
|
165
|
+
|
|
166
|
+
**Large**
|
|
167
|
+
- Background: `#285ac8`
|
|
168
|
+
- Text: `#ffffff`
|
|
169
|
+
- Radius: 4px
|
|
170
|
+
- Padding: 12px 24px
|
|
171
|
+
- Height: 48px (`$vbFormControlLargeHeight`)
|
|
172
|
+
- Font: 16px / 700
|
|
173
|
+
- Use: Hero CTAs, mobile-friendly forms
|
|
174
|
+
|
|
175
|
+
**Accent**
|
|
176
|
+
- Background: `#73a5ff` (`$vbAccentColor`)
|
|
177
|
+
- Text: `#ffffff`
|
|
178
|
+
- Radius: 4px
|
|
179
|
+
- Padding: 8px 16px
|
|
180
|
+
- Use: Hover/secondary brand actions
|
|
181
|
+
|
|
182
|
+
### Inputs
|
|
183
|
+
|
|
184
|
+
**Default**
|
|
185
|
+
- Background: `#ffffff`
|
|
186
|
+
- Text: `#323232` (`$vbBlackColor`)
|
|
187
|
+
- Border: 1px solid `#8c8989` (`$vbBaseColor3`)
|
|
188
|
+
- Radius: 4px
|
|
189
|
+
- Padding: 8px 12px
|
|
190
|
+
- Height: 36px (`$vbFormControlHeight`)
|
|
191
|
+
- Focus: border `#285ac8` (`$vbPrimaryColor`)
|
|
192
|
+
- Error: border `#dc1e32` (`$vbAlertColor`); helper text in same red
|
|
193
|
+
- Use: Standard form input
|
|
194
|
+
|
|
195
|
+
**Small**
|
|
196
|
+
- Background: `#ffffff`
|
|
197
|
+
- Border: 1px solid `#8c8989`
|
|
198
|
+
- Radius: 4px
|
|
199
|
+
- Height: 24px
|
|
200
|
+
- Use: Compact inputs, dense tables
|
|
201
|
+
|
|
202
|
+
### Cards
|
|
203
|
+
|
|
204
|
+
**Standard Panel**
|
|
205
|
+
- Background: `#ffffff`
|
|
206
|
+
- Border: 1px solid `#e9e7e7` (`$vbBaseColor2`)
|
|
207
|
+
- Radius: 4px
|
|
208
|
+
- Padding: 16px (`$vbBasicSize`)
|
|
209
|
+
- Use: Default card / panel surface
|
|
210
|
+
|
|
211
|
+
**Subtle Panel**
|
|
212
|
+
- Background: `#f7f5f5` (`$vbColumnColor`)
|
|
213
|
+
- Border: 1px solid `#e9e7e7`
|
|
214
|
+
- Radius: 4px
|
|
215
|
+
- Padding: 24px (`$vbLargeSize`)
|
|
216
|
+
- Use: Subtle differentiation panel
|
|
217
|
+
|
|
218
|
+
### Badges
|
|
219
|
+
|
|
220
|
+
**Success**
|
|
221
|
+
- Background: `#cdebd7` (GR02)
|
|
222
|
+
- Text: `#006e2d` (GR07)
|
|
223
|
+
- Radius: 4px
|
|
224
|
+
- Padding: 2px 8px
|
|
225
|
+
- Font: 12px / 500
|
|
226
|
+
- Use: Success / confirmation status
|
|
227
|
+
|
|
228
|
+
**Alert**
|
|
229
|
+
- Background: `#fad2d7` (RE02)
|
|
230
|
+
- Text: `#dc1e32` (RE05 / `$vbAlertColor`)
|
|
231
|
+
- Radius: 4px
|
|
232
|
+
- Padding: 2px 8px
|
|
233
|
+
- Font: 12px / 500
|
|
234
|
+
- Use: Errors, destructive states
|
|
235
|
+
|
|
236
|
+
**Notice**
|
|
237
|
+
- Background: `#fff0d2` (YE02)
|
|
238
|
+
- Text: `#be8c14` (YE07 / `$vbNoticeColor`)
|
|
239
|
+
- Radius: 4px
|
|
240
|
+
- Padding: 2px 8px
|
|
241
|
+
- Font: 12px / 500
|
|
242
|
+
- Use: Warnings, notices
|
|
243
|
+
|
|
244
|
+
**Info**
|
|
245
|
+
- Background: `#dce8ff` (P02)
|
|
246
|
+
- Text: `#285ac8` (P07)
|
|
247
|
+
- Radius: 4px
|
|
248
|
+
- Padding: 2px 8px
|
|
249
|
+
- Font: 12px / 500
|
|
250
|
+
- Use: Informational status
|
|
251
|
+
|
|
252
|
+
### Tables
|
|
253
|
+
- Column bg alternates: white / `$vbColumnColor` (`#f7f5f5`)
|
|
254
|
+
- Row dividers: `1px solid $vbBaseColor2` (`#e9e7e7`)
|
|
255
|
+
- Header: bold weight, dark text on white
|
|
256
|
+
- Compact and dense — freee is enterprise productivity software
|
|
257
|
+
|
|
258
|
+
### Navigation
|
|
259
|
+
- Primary nav: white bg with subtle bottom border, `$vbPrimaryColor` for active link
|
|
260
|
+
- Secondary nav: tab-style with underline indicator in `$vbPrimaryColor`
|
|
261
|
+
|
|
262
|
+
## 5. Layout Principles
|
|
263
|
+
|
|
264
|
+
### Spacing Scale (verified from `_size.scss`)
|
|
265
|
+
| Token | Value | dp |
|
|
266
|
+
|---|---|---|
|
|
267
|
+
| `$vbMinimum` | `1px` | 1px hairline |
|
|
268
|
+
| `$vbXSmallSize` | `0.25rem` | 4dp |
|
|
269
|
+
| `$vbSmallSize` | `0.5rem` | 8dp |
|
|
270
|
+
| `$vbBasicSize` | `1rem` | 16dp |
|
|
271
|
+
| `$vbLargeSize` | `1.5rem` | 24dp |
|
|
272
|
+
| `$vbXLargeSize` | `2rem` | 32dp |
|
|
273
|
+
| `$vbXXLargeSize` | `3rem` | 48dp |
|
|
274
|
+
|
|
275
|
+
### Container
|
|
276
|
+
- `$vbContainerSize: 70rem` (1120dp) — page max-width
|
|
277
|
+
- Mobile breakpoint: `$vbMobileBoundaryWidth: 48rem` (768dp)
|
|
278
|
+
|
|
279
|
+
### Density
|
|
280
|
+
freee is **medium-density enterprise SaaS**. Forms breathe with `16dp` padding. Tables stay tight. Dashboards prefer 24-32dp section gaps. Avoid the high-density commerce aesthetic of Mercari/Pinkoi.
|
|
281
|
+
|
|
282
|
+
## 6. Depth & Elevation
|
|
283
|
+
|
|
284
|
+
### Three explicit shadow recipes (from `_colors.scss`)
|
|
285
|
+
- **Card** — `$vbCardShadow`:
|
|
286
|
+
```
|
|
287
|
+
0 0 1rem rgba(0, 0, 0, 0.1),
|
|
288
|
+
0 0.125rem 0.25rem rgba(0, 0, 0, 0.2)
|
|
289
|
+
```
|
|
290
|
+
- **Floating** — `$vbFloatingShadow`:
|
|
291
|
+
```
|
|
292
|
+
0 0 1.5rem rgba(0, 0, 0, 0.1),
|
|
293
|
+
0 0.25rem 0.5rem rgba(0, 0, 0, 0.2)
|
|
294
|
+
```
|
|
295
|
+
- **Popup** — `$vbPopupShadow`:
|
|
296
|
+
```
|
|
297
|
+
0 0 2rem rgba(0, 0, 0, 0.1),
|
|
298
|
+
0 0.375rem 0.75rem rgba(0, 0, 0, 0.2)
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
Each level uses the same dual-shadow technique (ambient diffuse + directional drop), scaling the radius progressively.
|
|
302
|
+
|
|
303
|
+
### Z-Index Hierarchy (named tokens)
|
|
304
|
+
| Token | Value | Use |
|
|
305
|
+
|---|---|---|
|
|
306
|
+
| `$vbOverlayZIndex` | `100` | Subtle overlays |
|
|
307
|
+
| `$vbFormActionsZIndex` | `200` | Form action bars |
|
|
308
|
+
| `$vbFloatingZIndex` | `500` | Floating cards |
|
|
309
|
+
| `$vbFullScreenZIndex` | `700` | Full-screen views |
|
|
310
|
+
| `$vbModalZIndex` | `1000` | Modals |
|
|
311
|
+
| `$vbMessageModalZIndex` | `1500` | Message modals |
|
|
312
|
+
| `$vbPopupZIndex` | `2000` | Popups |
|
|
313
|
+
| `$vbPopupMessageZIndex` | `3000` | Popup messages |
|
|
314
|
+
| `$vbFixedMessageZIndex` | `4000` | Fixed messages |
|
|
315
|
+
| `$vbMaxZIndex` | `2147483647` | Maximum (system reserved) |
|
|
316
|
+
|
|
317
|
+
### Animation
|
|
318
|
+
Not explicitly tokenized in `_size.scss` extracted — components use SCSS-default transitions (`0.2-0.3s ease`).
|
|
319
|
+
|
|
320
|
+
## 7. Do's and Don'ts
|
|
321
|
+
|
|
322
|
+
- **DO** use the three-tier token system: scale (`$vbColorsP07`) → semantic (`$vbPrimaryColor`) → component-level. Always reference semantic over scale where possible.
|
|
323
|
+
- **DON'T** invent new color values. The 9 hue scales × 5-10 shades cover virtually any need.
|
|
324
|
+
- **DO** lead with `$vbPrimaryColor` (`#285ac8`) for brand actions and links. It's the same value — links should match buttons in this system.
|
|
325
|
+
- **DON'T** use bright accent blue (`$vbAccentColor: #73a5ff`) as a primary CTA. It's reserved for hover states and secondary emphasis.
|
|
326
|
+
- **DO** use the named font-size tokens (`$vbHeadline1FontSize`, `$vbNormalFontSize`) instead of raw rem values. The 5-step scale is the contract.
|
|
327
|
+
- **DON'T** use display sizes above 24dp. freee is enterprise SaaS — restraint is the voice.
|
|
328
|
+
- **DO** apply `$vbLineHeight: 1.5` universally. Japanese readers need generous vertical breathing room.
|
|
329
|
+
- **DO** use the locale font stack with `-apple-system` first and Hiragino/Meiryo CJK fallbacks. The brand `freee-logo` font is for the wordmark only.
|
|
330
|
+
- **DO** snap to the 4dp spacing scale (4 / 8 / 16 / 24 / 32 / 48). Never use intermediate values like 6, 10, or 14.
|
|
331
|
+
- **DON'T** invent custom shadow values — use `$vbCardShadow`, `$vbFloatingShadow`, `$vbPopupShadow` for the three elevation tiers.
|
|
332
|
+
- **DO** use the named z-index tokens (`$vbModalZIndex`, `$vbPopupZIndex`, etc.). The hierarchy spans 100 → 4000 with deliberate gaps.
|
|
333
|
+
- **DON'T** use arbitrary z-index values like `9999` — that breaks the layered system.
|
|
334
|
+
- **DO** use status colors with the matching family (e.g., `RE02` bg + `RE05/RE07` text for alerts).
|
|
335
|
+
- **DON'T** mix hue families in a single status badge (e.g., never red bg with orange text).
|
|
336
|
+
|
|
337
|
+
## 8. Responsive Behavior
|
|
338
|
+
|
|
339
|
+
### Breakpoint
|
|
340
|
+
- `$vbMobileBoundaryWidth: 48rem` (768dp) — single breakpoint between desktop and mobile
|
|
341
|
+
|
|
342
|
+
### Mobile Adjustments
|
|
343
|
+
- All headline sizes step down (`$vbMobileHeadline1FontSize: 16dp` vs. desktop 24dp)
|
|
344
|
+
- Form controls remain at the same height tokens (mobile-friendly already at 36-48dp)
|
|
345
|
+
- Container width adapts to viewport (no fixed mobile container)
|
|
346
|
+
|
|
347
|
+
### Touch
|
|
348
|
+
- Form controls at `36-48dp` heights = touch-friendly by default
|
|
349
|
+
- Buttons inherit form-control heights
|
|
350
|
+
|
|
351
|
+
### Image Behavior
|
|
352
|
+
- Not tokenized in vibes — application-specific
|
|
353
|
+
- Brand logo uses the `freee-logo` font for crisp scaling at any size
|
|
354
|
+
|
|
355
|
+
## 9. Agent Prompt Guide
|
|
356
|
+
|
|
357
|
+
### Quick Color Reference
|
|
358
|
+
- Primary CTA / Link: `#285ac8` (`$vbPrimaryColor` / `$vbColorsP07`)
|
|
359
|
+
- Accent (hover, secondary): `#73a5ff` (`$vbAccentColor` / `$vbColorsP04`)
|
|
360
|
+
- Default text: `#323232` (`$vbBlackColor` / `$vbColorsGY07`)
|
|
361
|
+
- Muted text: `#6e6b6b` (`$vbBurntColor` / `$vbColorsS09`)
|
|
362
|
+
- Caption text: `#8c8989` (`$vbBaseColor3` / `$vbColorsS08`)
|
|
363
|
+
- Page bg: `#ffffff` (or `#ebf3ff` for tinted bg)
|
|
364
|
+
- Subtle surface: `#f0eded` (`$vbBaseColor1`)
|
|
365
|
+
- Border default: `#e9e7e7` (`$vbBaseColor2`)
|
|
366
|
+
- Alert: `#dc1e32` (`$vbAlertColor`)
|
|
367
|
+
- Notice: `#be8c14` (`$vbNoticeColor`)
|
|
368
|
+
- Success: `#00963c` (`$vbColorsGR05`)
|
|
369
|
+
|
|
370
|
+
### Example Component Prompts
|
|
371
|
+
- "Build a freee primary button: `36px` height (`$vbFormControlHeight`), bg `#285ac8`, white text, weight 500, padding `8px 16px`, `4px` radius. Hover: bg `#3264dc` (P06). Active: bg `#1e46aa` (P08). Disabled: bg + 12% black overlay (`$vbThinScrimColor`). Use Noto-friendly font stack with Hiragino fallbacks."
|
|
372
|
+
- "Create a freee status badge: rounded `4px` corners, `8px 12px` padding, weight 500 12px text. For success: bg `#cdebd7` (GR02) + text `#006e2d` (GR07). For alert: bg `#fad2d7` (RE02) + text `#dc1e32` (RE05). For notice: bg `#fff0d2` (YE02) + text `#be8c14` (YE07). For info: bg `#dce8ff` (P02) + text `#285ac8` (P07)."
|
|
373
|
+
- "Design a freee data table: column bg alternates white / `#f7f5f5` (`$vbColumnColor`). Row dividers `1px solid #e9e7e7`. Header row: weight 700 14px text `#323232`, bg `#f0eded`, sticky on scroll. Cell padding `12px 16px`. Selected row: bg `#ebf3ff` (P01)."
|
|
374
|
+
- "Build a freee elevated card: white bg, `1px solid #e9e7e7` border, `4px` radius, `24px` padding. Box-shadow: `0 0 1rem rgba(0,0,0,0.1), 0 0.125rem 0.25rem rgba(0,0,0,0.2)` (`$vbCardShadow`). Heading at 24px weight 700 `#323232`. Body at 14px line-height 1.5 `#323232`."
|
|
375
|
+
- "Create a freee form input: `36px` height, `1px solid #8c8989` border, `4px` radius, `12px` horizontal padding. Placeholder color `#8c8989`. Focus: border `#285ac8`, no shadow ring. Error state: border `#dc1e32`, helper text `#dc1e32` 12px below."
|
|
376
|
+
|
|
377
|
+
### Iteration Guide
|
|
378
|
+
1. **Always reference semantic tokens (`$vbPrimaryColor`, `$vbAlertColor`)** instead of scale values (`$vbColorsP07`, `$vbColorsRE05`) when writing component-level code.
|
|
379
|
+
2. **The 9-hue palette is comprehensive** — don't introduce off-system hex values. If you need green, use the GR scale; if you need teal, use BG.
|
|
380
|
+
3. **`#285ac8` is both the link color AND the primary button color** — they're the same semantic in vibes. Maintain visual coherence.
|
|
381
|
+
4. **`border-radius: 4px`** is the de facto standard (vibes doesn't tokenize radius, components use 4px consistently).
|
|
382
|
+
5. **Type scale: 10 / 12 / 14 / 16 / 24dp** — five steps total. Don't introduce 18 or 20 or 28.
|
|
383
|
+
6. **Mobile shrinks H1 from 24dp → 16dp**, H2 from 16dp → 14dp. H3 stays at 14dp.
|
|
384
|
+
7. **Spacing snaps to the 4dp scale: 4 / 8 / 16 / 24 / 32 / 48**. Never 6, 10, or 14.
|
|
385
|
+
8. **Three shadow recipes only** (`$vbCardShadow`, `$vbFloatingShadow`, `$vbPopupShadow`) — graduated radius and offset.
|
|
386
|
+
9. **Z-index uses named tokens** with massive gaps (100 / 200 / 500 / 700 / 1000 / 1500 / 2000 / 3000 / 4000) — leaves room for future layers.
|
|
387
|
+
10. **Form-control heights are tokens** (24 / 36 / 48dp) — never use arbitrary heights for inputs/buttons.
|
|
388
|
+
11. **Line-height 1.5 is universal** — preserves Japanese vertical rhythm and accessibility.
|
|
389
|
+
12. **The brand wordmark uses Noto Sans CJK JP Medium** loaded as `font-family: 'freee-logo'` from Google Fonts — everywhere else uses the system stack.
|
|
390
|
+
|
|
391
|
+
---
|
|
392
|
+
|
|
393
|
+
## 10. Voice & Tone
|
|
394
|
+
|
|
395
|
+
freee speaks to Japanese small-business owners and the accountants who support them — people who did not ask to become back-office operators and would rather spend the afternoon running the shop. The voice is therefore **plain, reassuring, and unobtrusively competent**: it uses everyday 丁寧語 instead of compliance jargon, names the next concrete step before it names the rule, and never performs sophistication. Numbers, due dates, and tax categories are treated as the subjects of sentences; the product itself stays quiet. The brand's public Design Philosophy names four adjectives — *かろやか* (light-footed), *シンプル*, *あんしん* (reassuring), *インテリジェント* — and those four are the register to hold, together at all times ([brand.freee.co.jp/designphilosophy](https://brand.freee.co.jp/designphilosophy/)).
|
|
396
|
+
|
|
397
|
+
| Context | Tone |
|
|
398
|
+
|---|---|
|
|
399
|
+
| CTAs | Plain imperative naming the outcome — *「確定して保存」「申告書を作成する」*. Never clever, never hedged. |
|
|
400
|
+
| Empty states | Name the next concrete action, not the absence. *「最初の取引を登録しましょう」* over *「データがありません」*. |
|
|
401
|
+
| Error (validation) | Say what is wrong and what to do, in that order; never blame the user. *「金額を半角数字で入力してください」*. |
|
|
402
|
+
| Error (system / network) | Admit the condition, state the user's safe next move. *「通信エラーが発生しました。少し待ってからもう一度お試しください」*. |
|
|
403
|
+
| Success (money-moved) | Confirm the ledger state, not the feeling. *「仕訳を登録しました」*. No celebratory emoji, no 🎉. |
|
|
404
|
+
| Onboarding | First-person plural in 丁寧語 — *「まずは事業者情報を登録しましょう」*. Calm, step-by-step, no surprise. |
|
|
405
|
+
| Help / inline explanation | One sentence of plain language before any tax-code reference. Technical term on second mention, parenthetical on first. |
|
|
406
|
+
| Accessibility surfaces | Written for screen reader + keyboard first; visible copy and `aria-label` say the same thing in the same register (`a11y-guidelines.freee.co.jp`). |
|
|
407
|
+
|
|
408
|
+
**Voice samples.**
|
|
409
|
+
- *「スモールビジネスを、世界の主役に。」* — corporate mission tagline, set at marketing hero scale. <!-- verified: https://corp.freee.co.jp/mission/ , 2026-04 -->
|
|
410
|
+
- *「だれでもビジネスの主役になれる」* — accessibility-page framing; states *why* accessibility is non-negotiable at freee. <!-- verified: https://corp.freee.co.jp/sustainability/social/accessibility/ , 2026-04 -->
|
|
411
|
+
- *「かろやか・シンプル・あんしん・インテリジェント」* — the four-adjective voice register published on the brand site; used as the header of product voice decisions. <!-- cited: https://brand.freee.co.jp/designphilosophy/ -->
|
|
412
|
+
- Empty state for an unstarted ledger: *「まだ取引がありません。最初の取引を登録しましょう。」* <!-- illustrative: not verified as live freee copy; register modelled on corp.freee.co.jp 丁寧語 -->
|
|
413
|
+
- Validation error on an amount field: *「金額を半角数字で入力してください。」* <!-- illustrative: not verified as live freee copy; register matches a11y-guidelines.freee.co.jp form-error examples -->
|
|
414
|
+
- Success toast after saving a journal entry: *「仕訳を登録しました。」* <!-- illustrative: not verified as live freee copy; plain 丁寧語 past-tense state confirmation -->
|
|
415
|
+
|
|
416
|
+
**Forbidden phrases.** In Japanese product copy: カタカナ-heavy jargon that does not carry its weight — *イノベーティブ*, *ディスラプティブ*, *ネクストジェネレーション*, *革命的*. In English surfaces: *revolutionary*, *game-changer*, *next-generation*, *AI-powered* as a standalone claim. In money-moved and filing-submitted confirmations: emoji of any kind — 🎉 ✨ 🚀 💯 are all wrong for a tax filing. Absolutes that a tax authority could contradict: *完全自動*, *絶対に間違えません*, *100% 正確*. Second-person scolding in error states (*「入力ミスです」*) — rewrite as instructive (*「…を入力してください」*).
|
|
417
|
+
|
|
418
|
+
## 11. Brand Narrative
|
|
419
|
+
|
|
420
|
+
freee was founded **July 2012** by **Daisuke "Dice" Sasaki**, who had previously run **APAC SMB Marketing Development at Google** (and was CFO/VP at ALBERT Inc. before that) ([Daisuke Sasaki — LinkedIn](https://www.linkedin.com/in/daisukesasaki/), [DCFmodeling — freee history](https://www.dcfmodeling.com/blogs/history/4478t-history-mission-ownership)). Cloud accounting freee launched **March 2013**; expanded into HR/payroll/labor in 2015. Pre-IPO funding totaled **~$227.9M across 9 rounds** with **Mitsubishi UFJ, LINE, Life Card, Nippon Life, Sharp, Salesforce, Recruit, SBI, and Greyhound Capital** as investors ([TechCrunch — freee $60M 2018](https://techcrunch.com/2018/08/07/japans-freee-raises-60m/)). **Tokyo Stock Exchange IPO December 2019** (ticker **4478**) — the **second-biggest Japanese IPO of 2019** ([AsiaTechDaily — freee 2nd-biggest IPO Japan 2019](https://asiatechdaily.com/freee-second-biggest-ipo-of-japan-in-2019/)). Sasaki had previously run SMB marketing for Google Japan and the Asia-Pacific region ([corp.freee.co.jp/company](https://corp.freee.co.jp/company/)). The starting observation was that the smallest Japanese businesses — the shops, clinics, studios, and single-person LLCs that make up most of the economy — spent a disproportionate share of their week on bookkeeping they had not signed up for. Cloud accounting freee launched in 2013, and over the following decade grew into an integrated platform spanning accounting, HR, payroll, and approval workflows.
|
|
421
|
+
|
|
422
|
+
The mission, refreshed in 2018, is *「スモールビジネスを、世界の主役に。」* — *"Put small businesses center stage"* ([corp.freee.co.jp/mission](https://corp.freee.co.jp/mission/)). freee frames small businesses as *「多様な価値観や生き方を生み出す、イノベーションの源泉」* — the catalysts that push the rest of the economy forward — and positions its product as the back-office infrastructure that lets those businesses spend their time being businesses instead of clerks. Accessibility is treated as a literal extension of the mission: *「すべての人が freee のサービスを使える必要がある」* ([corp.freee.co.jp/sustainability/social/accessibility](https://corp.freee.co.jp/sustainability/social/accessibility/)), which is why freee publishes its accessibility guidelines ([a11y-guidelines.freee.co.jp](https://a11y-guidelines.freee.co.jp/)) and the Vibes design system ([github.com/freee/vibes](https://github.com/freee/vibes)) as open source.
|
|
423
|
+
|
|
424
|
+
What freee refuses: the marketing-first aesthetics of consumer SaaS, the stern compliance tone of legacy Japanese enterprise software, and the "magic AI" framing that obscures what the software actually did to a ledger. What it embraces: plain 丁寧語, the four-adjective register (*かろやか / シンプル / あんしん / インテリジェント*), a single enterprise-blue brand signal (`#285ac8`), and a design system that treats accessibility as a quality constraint rather than a feature — scored against WCAG 2.1 AA from the component level up.
|
|
425
|
+
|
|
426
|
+
## 12. Principles
|
|
427
|
+
|
|
428
|
+
1. **Give small businesses their time back.** Every screen is measured against whether it removes back-office work or adds it. *UI implication:* default to the shortest path that still produces a legally correct record — pre-fill from prior entries, hide advanced fields behind disclosure, never ask for data the product already has. Example: a repeat invoice reuses the last vendor, amount, and tax category; the user confirms, not re-enters.
|
|
429
|
+
2. **かろやか and シンプル, together.** *Light-footed* and *simple* are the first two adjectives of the brand register; they act on layout and density. *UI implication:* snap every measurement to the 4dp scale (`$vbXSmallSize` → `$vbXXLargeSize`); keep the type scale to the five published steps (10 / 12 / 14 / 16 / 24dp); no display sizes above 24dp anywhere in product UI. Example: a dashboard headline is `$vbHeadline1FontSize` (24dp) — never 32 or 40, even on the hero.
|
|
430
|
+
3. **あんしん is a legibility contract.** *Reassurance* on a tax filing means the user can *see* what will happen before it happens. *UI implication:* confirmation screens state the ledger effect in words and in numbers, journal entries preview their debit/credit pair before commit, destructive actions say exactly what will be deleted. Default text color is `$vbBlackColor` (`#323232`) at line-height 1.5 — never light-gray body type on white.
|
|
431
|
+
4. **インテリジェント means the software did the work, not the copy.** Automation earns its adjective by producing the right entry, not by announcing itself. *UI implication:* auto-matched transactions show the matching rule in plain language and a one-click override; never label a feature *AI* on the surface when a verb ("自動で仕訳") is more precise. No sparkle icons on automated suggestions.
|
|
432
|
+
5. **One brand blue, used like a signature.** `$vbPrimaryColor` (`#285ac8`, `$vbColorsP07`) is simultaneously the primary-action color, the link color, and the brand mark color. *UI implication:* do not introduce a second blue for links; do not use the lighter accent (`#73a5ff`, P04) as a primary CTA — it is a hover/secondary tint only. Example: a screen has at most one primary blue button per task region; everything else is neutral.
|
|
433
|
+
6. **Status lives in hue families, not in one-off hexes.** The 9-hue palette (P / S / RE / OR / YE / YG / GR / BG / PU / GY) is the complete vocabulary for success, warning, alert, info, and category tagging. *UI implication:* a status badge uses the `02` tint as background and the `05`-or-`07` shade as foreground, both from the same family (e.g., `RE02 #fad2d7` bg + `RE05 #dc1e32` text). Never mix families inside a single status (no orange text on red background).
|
|
434
|
+
7. **Accessibility is a product constraint, not a checklist.** freee publishes its accessibility guidelines as an open standard because accessibility is how the mission reaches *everyone who needs the software* ([a11y-guidelines.freee.co.jp](https://a11y-guidelines.freee.co.jp/)). *UI implication:* every interactive component ships with a keyboard path, visible focus (`_focus.scss`), and a screen-reader label that matches the visible label; WCAG 2.1 AA contrast is enforced by the semantic tokens (`$vbPrimaryColor` on white clears 4.5:1). A component without a keyboard path is not finished.
|
|
435
|
+
8. **Fewer words, placed next to the decision.** Japanese SMB users skim; accountants scan. *UI implication:* inline helper text appears only at the field where a costly mis-entry is possible, not on every field; terms of art are glossed once on first appearance, not repeated; error messages sit directly under the input, not in a summary banner. Example: the tax-code selector has a one-line helper; the company-name field has none.
|
|
436
|
+
|
|
437
|
+
## 13. Personas
|
|
438
|
+
|
|
439
|
+
*Personas are fictional archetypes informed by publicly described freee user segments — Japanese small-business owners, their employees, and the tax accountants who support them. They are not individual people.*
|
|
440
|
+
|
|
441
|
+
**Kenji Tanaka, 52, Setagaya.** Owner of a six-seat ramen shop. Uses freee on an iPad at the counter to photograph receipts between lunch and dinner service; the auto-matching has to be right on the first pass because he will not re-open the app. Cares about one question at year-end — *is the filing done correctly* — and judges the product entirely on that.
|
|
442
|
+
|
|
443
|
+
**Haruka Mori, 34, freelance illustrator, Kichijōji.** Registered sole proprietor (個人事業主). Opens freee once a week on a laptop to log invoices and expenses, once a quarter to pay consumption tax, once a year to e-file 確定申告. Switched from paper because the app walks her through the filing in plain Japanese — she has never read a tax form in her life and does not intend to start.
|
|
444
|
+
|
|
445
|
+
**Ms. Sato, 47, licensed tax accountant (税理士), Nagoya.** Runs a practice with 40 SMB clients, most on freee. Lives in the accountant's dashboard: bulk review, anomaly flags, quarterly closes. Prefers keyboard-first workflows, dense tables, and `$vbColumnColor` striping because she reads ledgers all day. Notices immediately if an error message is imprecise about *which row* failed.
|
|
446
|
+
|
|
447
|
+
**Yamada-san, 29, back-office lead at a 20-person design studio, Shibuya.** Handles payroll, expense approvals, and onboarding in freee HR. Routes approval requests via Slack and expects state to be visible at a glance — submitted, approved, returned — without opening each item. Forwards the freeeアクセシビリティー・ガイドライン to the studio's web team as a matter of course.
|
|
448
|
+
|
|
449
|
+
## 14. States
|
|
450
|
+
|
|
451
|
+
| State | Treatment |
|
|
452
|
+
|---|---|
|
|
453
|
+
| **Empty (ledger, no transactions yet)** | White canvas. One 14dp `$vbBlackColor` sentence naming the next step (*「最初の取引を登録しましょう」*). One `$vbPrimaryColor` 36dp pill-less rectangular (`4px` radius) CTA. No illustration — *かろやか* means not filling the space. |
|
|
454
|
+
| **Empty (search / filter, no matches)** | Muted 14dp body in `$vbBurntColor` (`#6e6b6b`) stating the filter used and one "Clear filter" link in `$vbLinkColor` (`#285ac8`). Never suggests the data doesn't exist — suggests the filter is narrow. |
|
|
455
|
+
| **Loading (table)** | Rows render as `$vbBaseColor2` (`#e9e7e7`) skeleton blocks at final width. 1.2s shimmer over the whole grid. Amount columns show `¥ -` placeholder in `$vbBurntColor`, not a bare dash — keeps currency context visible. |
|
|
456
|
+
| **Loading (in-button, saving a journal entry)** | Button retains `$vbFormControlHeight` (36dp) and `$vbPrimaryColor` background; label swaps to *「保存中…」* with a 14dp neutral spinner on the left. Button stays disabled; no width jump. |
|
|
457
|
+
| **Error (form validation)** | Input border becomes `$vbAlertColor` (`#dc1e32`). Helper text appears directly below the field in the same red at 12dp — one sentence naming both the problem and the corrective action. |
|
|
458
|
+
| **Error (system / API)** | Inline banner at the top of the working region, `RE02` (`#fad2d7`) background + `RE07` (`#a51428`) text, no dismiss icon during the first 3s. Includes a retry button — the banner disappears when the request succeeds. |
|
|
459
|
+
| **Error (permission / auth)** | Full-region empty-canvas treatment with a single 16dp sentence in `$vbBlackColor` stating which role is required and one link to the admin. Never a modal — permission errors are not interruptions. |
|
|
460
|
+
| **Success (journal entry saved)** | Inline toast at top-right: `GR02` (`#cdebd7`) bg + `GR07` (`#006e2d`) text, 3s auto-dismiss, message *「仕訳を登録しました」*. No checkmark animation; the new row appearing in the table is the confirmation. |
|
|
461
|
+
| **Success (e-filing submitted)** | Full-screen confirmation. `$vbPrimaryColor` header bar, white card with the submitted form type, timestamp, and reference number in `$vbHeadline1FontSize` (24dp). Single *「ダッシュボードに戻る」* button. This is the only full-screen success in the product; it earns the scale because a tax submission is final. |
|
|
462
|
+
| **Skeleton** | `$vbBaseColor2` (`#e9e7e7`) blocks at exact final dimensions. 1.2s shimmer. Currency fields show `¥ -`, dates show `----/--/--` — locale-formatted placeholders, never bare dashes. |
|
|
463
|
+
| **Disabled** | Apply `$vbThinScrimColor` (`rgba(0, 0, 0, 0.12)`) overlay to the whole control. Disabled control keeps its `4px` radius and 36dp height — does not shrink, does not change shape, never loses its label. |
|
|
464
|
+
| **Approval pending (HR / expense workflow)** | Inline pill in `YE02` (`#fff0d2`) bg + `YE07` (`#be8c14`) text: *「承認待ち」*. Row stays in the primary list, not archived — the work is not done until it is approved. |
|
|
465
|
+
|
|
466
|
+
## 15. Motion & Easing
|
|
467
|
+
|
|
468
|
+
**Durations.**
|
|
469
|
+
|
|
470
|
+
| Token | Value | Use |
|
|
471
|
+
|---|---|---|
|
|
472
|
+
| `motion-instant` | 0ms | Toggle commits, selection state, disabled-state transitions |
|
|
473
|
+
| `motion-fast` | 120ms | Button hover/press color change, tab underline slide |
|
|
474
|
+
| `motion-standard` | 200ms | Toast enter/exit, dropdown open, inline banner appear |
|
|
475
|
+
| `motion-slow` | 320ms | Modal enter, full-screen success reveal, sheet rise |
|
|
476
|
+
|
|
477
|
+
**Easings.**
|
|
478
|
+
|
|
479
|
+
| Token | Curve | Use |
|
|
480
|
+
|---|---|---|
|
|
481
|
+
| `ease-enter` | `cubic-bezier(0.2, 0.6, 0.25, 1)` | Things arriving — toasts, modals, sheets |
|
|
482
|
+
| `ease-exit` | `cubic-bezier(0.4, 0.0, 0.9, 1)` | Dismissals, closes |
|
|
483
|
+
| `ease-standard` | `cubic-bezier(0.25, 0.1, 0.25, 1)` | Two-way transitions — hover, focus ring, tab switch |
|
|
484
|
+
|
|
485
|
+
**Spring stance.** **No spring. No overshoot. No bounce.** freee is accounting, HR, payroll, and tax filing software — the product's job is to make the user trust the number on screen, not to delight them about it. Spring easing tells a user "watch this," which is exactly the wrong message next to a ledger balance. The four-adjective register is *かろやか / シンプル / あんしん / インテリジェント* — none of those adjectives license a bounce. Motion is therefore strictly linear-to-eased; any curve that overshoots its target is forbidden across product surfaces.
|
|
486
|
+
|
|
487
|
+
**Signature motions.**
|
|
488
|
+
|
|
489
|
+
1. **Row commit.** When a new journal entry is saved, the row fades into the table at `motion-standard` with `ease-enter`. No slide-down, no color flash — the row simply *is there*. The success toast (§14) confirms in words; the table does not need to celebrate.
|
|
490
|
+
2. **Button press.** Primary buttons transition `background-color` from `$vbPrimaryColor` (`#285ac8`) to the pressed-darker shade over `motion-fast` with `ease-standard`. No scale transform — a button that shrinks under a finger feels imprecise for a money action.
|
|
491
|
+
3. **Modal enter.** Backdrop fades to `$vbScrimColor` (`rgba(0, 0, 0, 0.5)`) over `motion-standard`; the dialog translates from +8dp to 0 and fades in over `motion-slow` with `ease-enter`. No zoom, no spring.
|
|
492
|
+
4. **Inline banner (error / info).** Banner translates from -8dp to 0 and fades in over `motion-standard` with `ease-enter`. Dismiss reverses with `ease-exit` over `motion-fast`.
|
|
493
|
+
5. **Full-screen filing success.** The full-screen confirmation page (§14) fades in over `motion-slow` with `ease-enter`. The reference-number text does not animate in — it is present immediately, so the user can screenshot it without waiting.
|
|
494
|
+
6. **Reduce motion.** Under `prefers-reduced-motion: reduce`, all `motion-*` tokens collapse to `motion-instant`. Row commits, banners, modals, and the full-screen success all appear without transition. No exceptions — accessibility is a product constraint, not a feature (see Principle 7).
|
|
495
|
+
|
|
496
|
+
<!--
|
|
497
|
+
OmD v0.1 Sources — Philosophy Layer (sections 10–15)
|
|
498
|
+
|
|
499
|
+
## Direct verification via WebFetch (2026-04-20)
|
|
500
|
+
- https://corp.freee.co.jp/mission/ — mission statement "スモールビジネスを、世界の主役に。" and surrounding
|
|
501
|
+
framing of small businesses as catalysts of innovation. Used in §11 narrative and §10 voice samples.
|
|
502
|
+
- https://corp.freee.co.jp/company/ — founding year (July 2012), founder Daisuke Sasaki, his prior roles
|
|
503
|
+
at Google / CLSA / Hakuhodo / ALBERT, and the Hitotsubashi commerce-department education. Used in §11.
|
|
504
|
+
- https://corp.freee.co.jp/sustainability/social/accessibility/ — "だれでもビジネスの主役になれる" accessibility
|
|
505
|
+
framing; the "すべての人が freee のサービスを使える必要がある" rationale. Used in §10 samples, §11, §12.7.
|
|
506
|
+
- https://a11y-guidelines.freee.co.jp/intro/intro.html — purpose statement of the open-source accessibility
|
|
507
|
+
guidelines; WCAG 2.1 AA basis; concrete-over-abstract editorial stance. Used in §12.7.
|
|
508
|
+
- https://developers.freee.co.jp/entry/growing-vibes — Vibes' accessibility-as-foundation stance, the
|
|
509
|
+
tiered designer/engineer/QA accessibility model, the "scrap-and-build" reset history. Used in §12.7.
|
|
510
|
+
|
|
511
|
+
## Cited (search-surface confirmation, not full live fetch)
|
|
512
|
+
- https://brand.freee.co.jp/designphilosophy/ — the four-adjective register (かろやか / シンプル / あんしん /
|
|
513
|
+
インテリジェント) and the supporting adjectives (まえむき / リラックス / たのしさ as spice). Source for §10 intro,
|
|
514
|
+
§10 forbidden-phrases register decisions, and §12.2–12.4 principle framings. Page itself returned
|
|
515
|
+
minimal markdown to WebFetch, but the four adjectives are consistently documented across search-surface
|
|
516
|
+
summaries of the page and multiple third-party analyses (Takram's freee rebrand case, note.com writeups,
|
|
517
|
+
developers.freee.co.jp reading-group article).
|
|
518
|
+
- https://speakerdeck.com/magi1125/dezainpurinsipurunotukurikata — "Design Principle creation" deck.
|
|
519
|
+
Confirms that freee operates against concrete principles such as "segment screens by business workflow",
|
|
520
|
+
"restrict explanatory text to critical error-prevention areas", and "prioritize efficiency in repetitive
|
|
521
|
+
workflows". Principles 1 and 8 echo this framing at a general level.
|
|
522
|
+
- https://corp.freee.co.jp/news/20231219_design.html — 2023-12-19 press release announcing Vibes as
|
|
523
|
+
open-source, framing accessibility as the headline engineering asset. Supports §11 and §12.7.
|
|
524
|
+
|
|
525
|
+
## JP-translated / illustrative
|
|
526
|
+
- §10 voice samples marked `illustrative` are written in plain 丁寧語 matching the register observed on
|
|
527
|
+
corp.freee.co.jp and a11y-guidelines.freee.co.jp; they are NOT verified as live freee product strings.
|
|
528
|
+
A reviewer with freee product access should cross-check these against actual screens before they are
|
|
529
|
+
used as microcopy source by an agent.
|
|
530
|
+
|
|
531
|
+
## Base DESIGN.md (§1–9) — carry-from-base, not re-verified
|
|
532
|
+
- All token-level claims (#285ac8 $vbPrimaryColor, 4dp spacing scale, 5-step type scale 10/12/14/16/24dp,
|
|
533
|
+
three shadow recipes, z-index hierarchy, Hiragino-led font stack) are sourced from the base DESIGN.md
|
|
534
|
+
§1–9, which was extracted in 2026-04-17 from the open-source github.com/freee/vibes SCSS partials.
|
|
535
|
+
These were not re-verified in the Philosophy pass; §14 and §15 reference them as authoritative.
|
|
536
|
+
|
|
537
|
+
## Interpretive / editorial claims (flagged for honesty)
|
|
538
|
+
- The framing of freee's voice as "plain, reassuring, unobtrusively competent" is an editorial synthesis
|
|
539
|
+
of the four-adjective register + the accessibility-first mission; freee does not publish a voice-and-tone
|
|
540
|
+
document that uses those exact words.
|
|
541
|
+
- The "no spring, no overshoot" motion stance (§15) is an editorial derivation from the product category
|
|
542
|
+
(accounting / tax filing) + the four-adjective register; freee's published materials do not include a
|
|
543
|
+
motion spec. A reviewer with access to Vibes component source can verify or refute this stance against
|
|
544
|
+
the actual component library.
|
|
545
|
+
- Personas (§13) are fictional archetypes informed by publicly described freee user segments (SMB owners,
|
|
546
|
+
sole proprietors, 税理士, in-house back-office leads). Names are illustrative and do not refer to real
|
|
547
|
+
people.
|
|
548
|
+
-->
|
|
549
|
+
|
|
550
|
+
---
|
|
551
|
+
|
|
552
|
+
**Verified:** 2026-05-08 (omd:migrate run 26 — Apple-tier)
|
|
553
|
+
**Tier 1 sources:** freee.co.jp home + /accounting (live DOM via playwright — Primary `#2864f0` Freee Blue two-tier {5px header 31-34px / 8px hero 48px} 4-10×16-20 / 14-16px·**700** strict; Outline `#fff` w/ `#2864f0` text; segment-tint cards `#ebf3ff`).
|
|
554
|
+
**Tier 2 sources:** styles.refero.design / getdesign.md — no record.
|
|
555
|
+
**Tier 2 (Philosophy/founders):** Daisuke Sasaki LinkedIn, DCFmodeling, TechCrunch, VentureBeat, AsiaTechDaily, corp.freee.co.jp/company.
|
|
556
|
+
**Style ref:** `line` (JP East-Asian register, retained).
|
|
557
|
+
**Conflicts unresolved:** Brand blue HEX — live DOM `#2864f0` vs §2 doc `#285ac8` (likely 2024-2025 rebrand drift; both retained, live wins for new UI).
|
|
558
|
+
|
|
@@ -276,3 +276,75 @@ The component system uses the `mds` (Markdown Design System) prefix, indicating
|
|
|
276
276
|
4. Product colors are sacred — each product owns exactly one color
|
|
277
277
|
5. Focus rings are always 3px solid, color-matched to product context
|
|
278
278
|
6. Uppercase labels are the systematic wayfinding pattern — 13px, 600, 1.3px tracking
|
|
279
|
+
|
|
280
|
+
## 10. Voice & Tone
|
|
281
|
+
|
|
282
|
+
HashiCorp's voice is **infrastructure-engineer-fluent** — speaks the language of platform teams who manage clouds, secrets, and clusters. Copy is capability-driven, with strong open-source narrative. Each product (Terraform, Vault, Consul, Nomad, Boundary, Packer, Waypoint) has its own micro-brand within the HashiCorp identity.
|
|
283
|
+
|
|
284
|
+
| Context | Tone |
|
|
285
|
+
|---|---|
|
|
286
|
+
| CTA | Verb. "Try Terraform", "Get started", "Sign up" |
|
|
287
|
+
| Marketing | Product-specific. Terraform copy ≠ Vault copy ≠ Consul copy |
|
|
288
|
+
| Documentation | HCL/CLI heavy, deep code examples |
|
|
289
|
+
| Error (apply) | Plan diff + specific resource error |
|
|
290
|
+
|
|
291
|
+
**Voice samples**
|
|
292
|
+
- Marketing tagline (KR): *"혁신을 위한 인프라"* <!-- verified: hashicorp.com/ko homepage 2026-05 -->
|
|
293
|
+
|
|
294
|
+
**Forbidden phrases.** Marketing superlatives without numbers. "Revolutionary infrastructure" framing.
|
|
295
|
+
|
|
296
|
+
## 11. Brand Narrative
|
|
297
|
+
|
|
298
|
+
HashiCorp was founded **2012** in San Francisco by **Mitchell Hashimoto** and **Armon Dadgar** — classmates at the **University of Washington's Paul G. Allen School of Computer Science**, where they met **2008** working on a research project to make then-emerging Amazon/Microsoft public-cloud tech accessible to scientists ([HashiCorp — Origin Story](https://www.hashicorp.com/en/about/origin-story), [HashiCorp — Wikipedia](https://en.wikipedia.org/wiki/HashiCorp)). Hashimoto was already running open-source **Vagrant**; he created **Terraform**, which became the de-facto standard for infrastructure-as-code. The product family expanded to **Vault** (secrets), **Consul** (service mesh), **Nomad** (orchestration), **Boundary**, **Packer**, and **Waypoint**. **NASDAQ IPO 2021-12-09** under ticker **HCP**, priced at **$80/share** (above $68-72 range), valuing HashiCorp at **~$13B**. **IBM announced acquisition April 24 2024 for $6.4B**; deal **closed February 27 2025** after regulatory review, bringing HashiCorp into IBM's hybrid cloud strategy ([IBM acquisition closed — HashiCorp blog](https://www.hashicorp.com/en/blog/hashicorp-officially-joins-the-ibm-family), [Logan Bartlett podcast — Dadgar 48hrs after IBM sale](https://www.theloganbartlettshow.com/archive/ep-102-armon-dadgar-hashicorp-co-founder-reflects-48-hours-after-selling-to-ibm)). **Hashimoto resigned December 2023** ahead of the IBM deal — later launched **Ghostty** (GPU-accelerated terminal, public Dec 2024) and joined **Vercel's board March 2026** ([BusinessWire — Vercel + Hashimoto](https://www.businesswire.com/news/home/20260318957008/en/Vercel-Appoints-Mitchell-Hashimoto-Co-Founder-of-HashiCorp-and-Creator-of-Terraform-to-Board-of-Directors)). The brand voice retains its open-source-first, platform-engineering register.
|
|
299
|
+
|
|
300
|
+
## 12. Principles
|
|
301
|
+
|
|
302
|
+
1. **Infrastructure as code.** Every product expects HCL or equivalent declarative input. *UI implication:* CLI-first; UI dashboards exist but never replace HCL primacy.
|
|
303
|
+
2. **Multi-cloud is the default.** *UI implication:* every concept is provider-agnostic in copy; specific provider logos appear only in integration grids.
|
|
304
|
+
3. **Each product has a color, none are loud.** Terraform `#7B42BC` purple, Vault `#FFEC6E` yellow-green, Consul `#E03875` magenta — but used sparingly. *UI implication:* product-specific brand color appears only on hero + product nav.
|
|
305
|
+
4. **3px focus rings, color-matched.** *UI implication:* don't use generic blue focus; match to the active product theme.
|
|
306
|
+
5. **Uppercase labels for wayfinding.** *UI implication:* tab labels and section dividers can use uppercase 13px / 600 / 1.3px tracking — systematic, never decorative.
|
|
307
|
+
|
|
308
|
+
## 13. Personas
|
|
309
|
+
|
|
310
|
+
*Personas are fictional archetypes informed by HashiCorp user segments (platform engineers, DevOps leads, security architects), not individual people.*
|
|
311
|
+
|
|
312
|
+
**Sergey Volkov, 38, Berlin.** Senior platform engineer. Manages Terraform state for 120+ AWS accounts. Vault for production secrets.
|
|
313
|
+
|
|
314
|
+
**Priya Krishnan, 31, Bengaluru.** SRE at fintech. Consul service mesh + Nomad orchestration replacing K8s for specific workloads.
|
|
315
|
+
|
|
316
|
+
**Marcus Davies, 45, London.** Security architect. Vault is the entire reason their compliance audit passed.
|
|
317
|
+
|
|
318
|
+
## 14. States
|
|
319
|
+
|
|
320
|
+
| State | Treatment |
|
|
321
|
+
|---|---|
|
|
322
|
+
| **Empty (no resources)** | "Define resources in your `.tf` file" + sample HCL block |
|
|
323
|
+
| **Empty (no secrets)** | "Add your first secret" CTA + CLI command |
|
|
324
|
+
| **Loading (terraform apply)** | Plan diff visible + apply progress per resource |
|
|
325
|
+
| **Loading (state)** | Per-resource spinner |
|
|
326
|
+
| **Error (plan)** | HCL line:column + specific resource + recommended fix |
|
|
327
|
+
| **Error (apply)** | Resource-level rollback option |
|
|
328
|
+
| **Success (apply)** | Resource list + state-locked indicator clear |
|
|
329
|
+
| **Success (rotate)** | Vault rotation timestamp + next-rotation due date |
|
|
330
|
+
| **Skeleton (resource list)** | Dark cards with charcoal borders |
|
|
331
|
+
| **Disabled (locked state)** | Lock icon + "State locked by user@team" |
|
|
332
|
+
| **Loading (long apply)** | Real-time per-resource progress |
|
|
333
|
+
|
|
334
|
+
## 15. Motion & Easing
|
|
335
|
+
|
|
336
|
+
| Token | Value | Use |
|
|
337
|
+
|---|---|---|
|
|
338
|
+
| `motion-instant` | 0ms | Toggle |
|
|
339
|
+
| `motion-fast` | 150ms | Hover |
|
|
340
|
+
| `motion-standard` | 250ms | Modal, panel |
|
|
341
|
+
|
|
342
|
+
Standard cubic-bezier; no bounce. **Focus rings** never animate — appear instant for accessibility. `prefers-reduced-motion: reduce` removes panel slide-ins.
|
|
343
|
+
|
|
344
|
+
---
|
|
345
|
+
|
|
346
|
+
**Verified:** 2026-05-08 (omd:migrate run 27 — Apple-tier)
|
|
347
|
+
**Tier 1 sources:** hashicorp.com/en home + /en/products/terraform (live DOM via playwright — Shared Primary **`#1060ff`** HC Blue 5px / 36-48px / 16px·500; Light Secondary `#fafafa`/`#3b3d45` 5px; nav 4px sub-distinction; **per-product accent system** confirmed via Terraform Purple `#7b42bc`).
|
|
348
|
+
**Tier 2 sources:** styles.refero.design / getdesign.md — no record.
|
|
349
|
+
**Tier 2 (Philosophy/IPO/IBM):** Wikipedia (HashiCorp), HashiCorp Origin Story, Mayfield (UW Allen School origin), HashiCorp blog (IBM close 2025-02), BusinessWire (Hashimoto Vercel board 2026-03), Logan Bartlett Show ep 102 (Dadgar 48hrs post-sale).
|
|
350
|
+
**Style ref:** `stripe`. **Conflicts unresolved:** none. **Earlier mistake reverted:** prior footer captured nav-only — canonical Primary is `#1060ff` HC Blue with documented per-product-accent pattern (Terraform Purple).
|