akefin-design-system/README.md

205 lines
12 KiB
Markdown
Raw Permalink Normal View History

2026-05-23 11:59:45 +09:00
# Akefin Design System
A precision finance design system for **Akefin** — a multi-entity personal & business accounting platform for a solo consultant operating across South Korea (KRW), Turkey (TRY), and Japan (JPY).
This system is tuned for a domain where **density, trust, and bilingual (Latin + Hangul) text rendering** all matter. It draws aesthetic inspiration from `pi.dev` (the user's stated favourite): a calm, paper-light surface, a grid background, generously-italic serif display type, and crisp monospace data.
---
## Source materials
| Source | Notes |
|---|---|
| `alkimake/akefin-design-system` (private GitHub) | Empty at time of writing — this project IS that design system. Re-pull when populated. https://github.com/alkimake/akefin-design-system |
| `uploads/picode_screenshot.png` | The pi.dev landing page, attached as the aesthetic target |
| `uploads/screenshot-2026-05-22_22-25-21.png` | pi.dev code-edit interaction view |
| Akefin brief (in chat) | Three legal entities (Personal / 9TFox / Finacode), 3-tier AI categorization, double-entry plain-text ledger output |
> **For future readers / agents:** if you have access to the GitHub repo above, pull it before designing — there may be updated components, brand marks, or screenshots not reflected here.
---
## Product context
**Akefin** automates the import of Korean Toss bank exports, categorizes transactions through a 3-tier AI pipeline (**Rules → LLM → Agent**), and routes anything unmatched to a human review queue. Final output: plain-text double-entry ledger files, git-versioned for audit.
Primary surfaces:
- **Web dashboard** — the daily-driver. Review queue, rule management, ledger overview, import status.
- **Mobile (iOS/Android)** — same data, optimised for the review-on-the-go case.
Three independently-tracked entities, always visible as scope:
| Badge | Entity | Scope |
|---|---|---|
| **Personal** | Personal finances | KR (KRW), TR (TRY), JP (JPY) |
| **9TFox** | Korean sole trader | Consulting income/expenses (KRW) |
| **Finacode** | Turkish partnership | Partner-share only, Wise transfers |
Core UI primitives:
- **Confidence chip** — green (rules / 100%) → blue (LLM ≥0.85) → amber (0.700.85) → red (<0.70 or unmatched)
- **Tier badge** — Rules · LLM · Agent · Unmatched
- **Entity badge** — three distinct accent hues, used as scope, never as page tint
- **Account picker** — hierarchical, fuzzy-searchable, MRU-aware
- **Ledger preview** — monospace two-leg posting confirmation
---
## CONTENT FUNDAMENTALS
Akefin is professional financial-operations software. Copy reflects that.
**Voice & tone**
- **Authoritative, calm, technical.** Never marketing-y, never cute. Closer to a Unix man page than a SaaS dashboard.
- **Specific over generic.** "23 transactions staged for review" — not "You have new items".
- **No filler verbs.** "Review", "Categorize", "Post" — not "Let's review", "Time to categorize".
- **Domain language is welcome.** Use *ledger*, *posting*, *leg*, *account*, *entity*, *tier*, *match*, *unmatched*, *staged*. Don't over-translate accounting terms for a user who lives in them.
**Person & address**
- Predominantly **imperative** ("Approve", "Override", "Promote rule").
- Where a subject is needed, **you** (sparingly). Never *we*. Never *your money* — say *the ledger* or *this entity*.
**Casing**
- **Sentence case** for body, descriptions, table headers, menu items, button labels longer than two words.
- **UPPERCASE small-tracked** for tab labels, eyebrow labels, section dividers, status strips — the pi.dev `[ READ THE DOCS ]`-style chrome.
- **Title Case** only for proper nouns (entity names, currency codes, *Toss*).
**Numbers, currency, dates**
- Amounts: always **monospace, right-aligned, signed**. `+ 1,240,000 KRW` for income, ` 38,500 KRW` for expense. Decimal separator follows locale, but the column aligns on the decimal.
- Currency code follows the amount, separated by a thin space. Never use the currency symbol alone (₩, ₺, ¥ are ambiguous at a glance across these three).
- Dates: **ISO `YYYY-MM-DD`** in dense data views, `2 Mar 2026` in headers, never `03/02/26`.
- Confidence: two-decimal fixed-point, `0.92`, never `92%`.
**Korean (한국어) handling**
- Hangul appears natively in payee memos (*적요*) and bank institution names. Don't romanise. Don't translate inline.
- When showing a translated/AI-inferred name, render it secondary: `이마트 트레이더스 · E-Mart Traders (inferred)`.
**Emoji & decoration**
- **No emoji.** Anywhere. This is an accounting tool.
- Decorative iconography is sparse — keep glyphs functional (status, direction, expand/collapse).
**Sample copy**
> Review queue · 23 staged · 4 high-confidence · 19 need attention
>
> 2026-03-02 38,500 KRW 스타벅스 강남역점 Personal ★ 0.94 LLM
>
> [ APPROVE ] [ OVERRIDE ] [ SKIP ]
>
> Promote 17 suggested rules · Last import 4 min ago · 9TFox ledger clean
---
## VISUAL FOUNDATIONS
The system is **paper-quiet, grid-anchored, type-led**. It should feel like a precision instrument from a well-lit study, not a SaaS app.
**Surface & background**
- Primary surface: **warm cream paper** (`--bg`, `#ECE7DC`). The default page background.
- Secondary surface: **cool pale ink-grey** (`--surface`, `#EBEEF1`) for code/data blocks, terminal-style frames, ledger previews. The two-surface contrast is the system's signature.
- Background **grid texture** (1px × 1px, ~6% opacity grey lines, 24px spacing) is applied to the page body. This is a load-bearing motif — do not omit.
**Type**
- **Display serif (italic-leaning):** *Spectral* — substitutes for **Plantin MT Pro** which pi.dev uses. Headings prefer italic at light weight. *(Substitution flagged — please supply Plantin MT Pro woff2 to replace.)*
- **Body / UI sans:** *IBM Plex Sans* — used for tab labels, body text, button chrome.
- **Mono / data:** *JetBrains Mono* — all amounts, account paths, dates in dense views, code blocks, ledger postings. **Tabular figures are mandatory.**
- **Korean (Hangul):** *IBM Plex Sans KR* for chrome, *Pretendard* for body when Hangul is the primary content. Hangul lines up at slightly larger optical size than Latin.
- Type ramp lives in `colors_and_type.css`.
**Color**
- Background neutrals first; saturation is reserved for **semantic meaning** (confidence tiers, entity badges).
- Three entity hues — **Personal** (slate teal), **9TFox** (rust), **Finacode** (indigo) — only as badge accent / 4px scope strip, never as a full UI tint.
- Confidence spectrum: green → blue → amber → red. These are the only "decorative" colors in the chrome.
- Full palette in `colors_and_type.css`.
**Spacing & density**
- Base unit `4px`. Compact density: row height `32px` for review-queue lines, `40px` for primary list rows, `48px` for table headers / page tabs.
- Inner padding ramp `4 · 8 · 12 · 16 · 24 · 40`.
- Type at 14px / 1.45 line-height for chrome, 13px / 1.4 mono for data tables.
**Borders**
- **Hairline borders** are the primary divider — `1px solid var(--rule)` (`#D5CFC2` on cream, `#D7DCE2` on ink-grey). No shadow-as-divider.
- Card borders are 1px, never thicker. Border-radius is **2px**. Rounded-everything is explicitly not the look.
- Terminal-style code frames have a 1px border + an inset 1px hairline on the inner edge, mimicking a window chrome.
**Shadows**
- Reserved. Use only for **popovers, account-picker dropdowns, focus-mode dialogs**. Never on cards or inline rows.
- Single elevation: `0 1px 0 rgba(20,18,12,.04), 0 8px 24px -8px rgba(20,18,12,.16)`. Soft, paper-shadow, not material.
**Corner radii**
- `--r-sm: 2px`, `--r-md: 3px`, `--r-lg: 4px`. **Maximum 4px.** Pills (`--r-pill: 999px`) only on confidence chips and tier badges.
**Borders, hover, press**
- **Hover:** cream surfaces darken by ~3% (use `color-mix`); ink-grey surfaces lighten by ~2%. Text links underline on hover; underline thickness `1px`, offset `2px`.
- **Press:** scale `0.99`, never a color flash. Buttons get a 1px inset shadow.
- **Focus:** 2px outline in `--focus` (`#3A6FB0`), offset 2px. No focus ring removal.
**Transparency & blur**
- Used **only** for modals/popovers' backdrop (`rgba(20,18,12,0.32)`) and the global command-K palette. No frosted-glass elsewhere.
**Animation**
- Minimal and short. Cubic-bezier `(0.2, 0, 0.2, 1)`, durations `80ms` (chrome hover), `140ms` (popovers), `220ms` (modal/tab transitions).
- **No bounces, no springs.** A calm, instrument-like motion language. Confidence chips do not pulse, entity badges do not animate in.
**Layout rules**
- Fixed top chrome: a 56px header strip (entity scope + global search + status).
- Optional 240px left navigation rail with collapse to 56px icon strip.
- Content max-width `1440px`; tables and review queue may extend full-bleed inside the rail.
**Imagery vibe**
- Almost no photography. If product imagery is needed: cool, sober, well-lit, slight grain, no people, mostly objects. Default to *no image* and let type do the work.
**Iconography vibe**
- Light-weight (~1.25px stroke), monoline, geometric. Lucide is the substitute (see ICONOGRAPHY below).
**Dark theme** *(secondary)*
- A direct inversion: ink black background (`#13120F`), warm paper foreground. Same hues, same hierarchy. Not the default for the user, but supported.
---
## ICONOGRAPHY
Akefin has **no proprietary icon set** at time of writing. The system uses **Lucide** (https://lucide.dev) as the substitute — its 1.25px monoline geometric style matches the calm-instrument aesthetic.
- Loaded via CDN: `https://unpkg.com/lucide@latest`
- Used at three sizes only: `14px` (inline chrome), `16px` (default UI), `20px` (page headers)
- **No filled variants.** Stroked only.
- **No emoji.** Anywhere.
- **No unicode glyph icons** except: `↑ ↓ →` (sort + direction), `·` (separator), `✓` (matched), `—` (em-dash, range).
- The **Akefin wordmark** is the only branded glyph — it lives at `assets/akefin-wordmark.svg` and is a small monospaced lockup, see Brand cards in preview/.
- Three entity marks (**Personal**, **9TFox**, **Finacode**) are 2-3 letter monograms in mono type with a 4px coloured stripe — see `assets/entity-marks.svg`.
> **Flagged substitution:** Lucide stands in until an Akefin-native icon set is produced. The closest mono-line set was chosen specifically to match the pi.dev stroke weight.
---
## Index
```
/
├── README.md ← you are here
├── SKILL.md ← Claude/Agent Skill entrypoint
├── colors_and_type.css ← all color + type CSS variables + semantic classes
├── fonts/ ← webfonts (Spectral, IBM Plex Sans, IBM Plex Sans KR, JetBrains Mono, Pretendard)
├── assets/ ← logos, entity marks, sample iconography
├── preview/ ← design-system cards (registered in the Design System tab)
└── ui_kits/
├── web/ ← Akefin web dashboard recreation
│ ├── README.md
│ ├── index.html
│ └── *.jsx
└── mobile/ ← Akefin mobile (iOS frame) recreation
├── README.md
├── index.html
└── *.jsx
```
---
## Known caveats
1. **Plantin MT Pro** (pi.dev's display face) is proprietary — substituted with **Spectral** from Google Fonts. Please supply the original `.woff2` to replace.
2. The akefin-design-system GitHub repo was empty when this was generated — components here are synthesised from the brief + pi.dev aesthetic, not lifted from existing code.
3. No real Akefin screenshots were provided. The UI kits are an interpretation of the brief's component inventory, not a recreation of an existing UI. **Iterate.**
4. Dark theme is sketched but light is the priority per user preference.