/design-system
SOI UI v2 — Design System
Locked tokens, typography, and patterns. Living reference for product development and client reviews. Not linked from production navigation.
Colours
18 tokens, shadcn-compatible. Brand colours extracted from soi-lernwelt.ch.
Brand (5)
Navy + teal pair, plus a text-safe teal variant.
--color-primaryHeader, footer, primary CTAs, brand surfaces, focus rings.
--color-primary-foregroundText on navy. AAA contrast (12.2:1).
--color-accentBrand accent. Fills, icons, illustrations.
--color-accent-foregroundWhite text on accent. AA-large only. Prefer dark text.
--color-accent-deepText-safe variant. Links, badge text, inline highlights.
Neutrals (7)
shadcn scale with a navy tint; muted-foreground darkened and navy-tinted for AAA contrast.
--color-backgroundPage background. Faint navy-tinted gray; cards lift above it.
--color-foregroundTitles and body text; weight drives hierarchy. Navy, 12.2:1 AAA.
--color-cardCards, panels, raised surfaces. Pure white, lifts above the page.
--color-mutedSubtle backgrounds, hover states, disabled fills. Navy-tinted.
--color-muted-foregroundSecondary text, captions, placeholders. Navy-tinted, AAA (7.7:1).
--color-borderBorders, dividers, separators. Navy-tinted.
Semantic (4)
Separated from brand. Each colour means exactly one thing.
--color-successSuccessful actions. Form saved, payment received.
--color-warningWarnings, unsaved changes, action required.
--color-destructiveDelete, withdraw, validation errors.
--color-destructive-foregroundText on destructive backgrounds. AA (4.8:1).
Structural (2)
Referenced by shadcn primitives. Derived from existing tokens.
--color-inputInput borders. Same as border.
--color-ringFocus rings. Same as primary.
Typography
Inter for body, JetBrains Mono for code and numeric values. Variable fonts, all weights available.
Font families
Inter is designed for UI at small sizes; tabular figures align financial data; OFL-licensed.
Inter Sans
--font-sans · 400, 500, 600, 700
The quick brown fox jumps over the lazy dog.
0123456789 — Mortgage capacity assessment.
JetBrains Mono
--font-mono · 400, 500, 600
CHF 1'234'567.89
dossier-id: D-2026-0142 · 12.05.2026
Scale
Tailwind v4 default (modular ratio ~1.125). Tight enough for admin, generous enough for hierarchy.
text-3xl30 / 36text-2xl24 / 32text-xl20 / 28text-lg18 / 28text-base16 / 24text-sm14 / 20text-xs12 / 16Default body size: text-sm (14px). Admin tools handle 14px well; 16px feels too generous in dense forms.
Weights
Four weights cover everything. 300 is too thin at small sizes; 800+ is rarely needed in admin UIs.
400 regularThe quick brown fox jumps over the lazy dog.500 mediumThe quick brown fox jumps over the lazy dog.600 semiboldThe quick brown fox jumps over the lazy dog.700 boldThe quick brown fox jumps over the lazy dog.Tabular figures (financial data)
Currencies, dossier IDs and dates use tabular-nums so digits stay aligned in columns. Compare:
| Dossier | Without tabular-nums | With tabular-nums |
|---|---|---|
| D-2026-0142 | CHF 1'250'000 | CHF 1'250'000 |
| D-2026-0143 | CHF 845'000 | CHF 845'000 |
| D-2026-0144 | CHF 2'100'000 | CHF 2'100'000 |
| D-2026-0145 | CHF 11'750'000 | CHF 11'750'000 |
| D-2026-0146 | CHF 685'000 | CHF 685'000 |
Right column: digits form clean vertical lines regardless of value. Left column: ragged. Financial tables must use tabular-nums.
Hierarchy demo
Representative page layout. Shows that the scale produces clear hierarchy in context.
Dossiers / New Financing / D-2026-0142
New Financing for Müller AG
Purchase price CHF 1'250'000 · Equity CHF 250'000 · Mortgage CHF 1'000'000
Equity
Breakdown of equity by source and availability. We verify plausibility and source documentation.
Bank / savings account
CHF 80'000 · UBS Switzerland · since 2018
Last updated: 12 May 2026 · Proof uploaded
Components in Use
shadcn primitives with locked tokens. Real examples from the broker workflow.
Buttons
Soft default for everyday actions; navy primary marks the one main action per screen. 7 variants, 4 sizes.
Inputs
Fields with label, helper text, and error state.
Full company name or individual.
Please enter a valid email address.
Selection
Checkbox, Radio Group, Select.
Documents available
Property type
Table
With tabular-nums for aligned amounts.
| Dossier | Applicant | Status | Purchase price |
|---|---|---|---|
| D-2026-0142 | Müller AG | Submitted | CHF 1'250'000 |
| D-2026-0143 | Bertschi Family | In Progress | CHF 845'000 |
| D-2026-0144 | Steiner GmbH | Open | CHF 2'100'000 |
| D-2026-0145 | Egli Construction AG | Offered | CHF 11'750'000 |
| D-2026-0146 | Wenger Private | Contract | CHF 685'000 |
Cards
Header + Content + Footer composition.
Tabs
Content grouping within a card or section.
General overview of the dossier with key data and status.
Alerts
Status messages with icon indicator and semantic colour.
Dossier successfully submitted
Dossier D-2026-0142 has been forwarded to UBS Switzerland.
Unsaved changes
You have unsaved changes. Leaving this page will discard them.
Validation failed
Please correct the highlighted fields before submitting the dossier.
Notice
Your session expires in 5 minutes. Please save your work.
Badges
Status indicators, short labels.
Dialog
Modal confirmation for critical actions.
Toasts (Sonner)
Short-lived notifications at the edge of the screen.
Brand Patterns
Specific pairings we use, with contrast verification.
Brand pair: Navy + Teal
The two signature brand colours. Navy carries structure, teal carries accent.
bg-primary · text-primary-foreground
Primary Navy
Header, CTAs, brand surfaces · 12.2:1 AAA
bg-accent · text-foreground
Accent Teal
Accent fills with dark text · 4.2:1 AA-large
On-accent: not white
shadcn's default text-accent-foreground (white) fails AA (2.9:1). The dark navy foreground reaches 4.2:1, enough for large text only: keep small text off accent fills.
Accent-deep: text-safe
When brand teal should appear as text (links, inline highlights), use accent-deep.
Dossier submitted to UBS Zurich for processing. Estimated response time: 5 business days.
text-accent-deep · 9.1:1 AAA on white
Accent as icon
Most common production use: icons in the accent colour paired with a text label.
Selected card
Active or chosen state: a teal border marks the selected card, echoing the brand accent. For selection lists and active options.
Standard option
Resting card with the neutral border.
Selected option
Teal border (border-accent) marks the active choice.