Bench design system

UI reference

Source of truth for product UI.

1. Colours

Use CSS variables (e.g. bg-primary, text-score-high). Values below reflect globals.css — toggle theme to see applied surfaces.

Background
--background

Light: #F5F5F5

Dark: #24301C

Foreground
--foreground

Light: #1C2B1C

Dark: #F0F5EE

Card
--card

Light: #C8D9C7

Dark: #2D3D25

Primary
--primary

Light: #5E1FC8

Dark: #5E1FC8

Primary foreground
--primary-foreground

Light: #F5F5F5

Dark: #F5F5F5

Secondary
--secondary

Light: #E23D1B

Dark: #E23D1B

Accent
--accent

Light: #52E38C

Dark: #52E38C

Accent foreground
--accent-foreground

Light: #1C2B1C

Dark: #1C2B1C

Muted
--muted

Light: #B5C9B4

Dark: #3D5233

Muted foreground
--muted-foreground

Light: #5A7056

Dark: #8FA888

Border
--border

Light: #B5C9B4

Dark: #3D5233

Score high
--score-high

Light: #52E38C

Dark: #52E38C

Score mid
--score-mid

Light: #F5A623

Dark: #F5A623

Score low
--score-low

Light: #E23D1B

Dark: #E23D1B

Forest dark (brand)
--color-forest-dark

Light: #24301C

Dark: #24301C

Forest mid (brand)
--color-forest-mid

Light: #2D3D25

Dark: #2D3D25

Sage (brand)
--color-sage

Light: #C8D9C7

Dark: #C8D9C7

Mint (brand)
--color-mint

Light: #52E38C

Dark: #52E38C

Coral (brand)
--color-coral

Light: #E23D1B

Dark: #E23D1B

Purple (brand)
--color-purple

Light: #5E1FC8

Dark: #5E1FC8

2. Typography

Typeface: Outfit (weights 300–700) via next/font/google --font-outfit on <html>, Tailwind font-sans.

Display

78

Heading 1

Performance clarity

Heading 2

Cash health pillar

Body

Bench compares your business to sector peers using standard accounting data — no manual entry.

Small

Updated when you run a new snapshot.

Label

Benchmark context

Metric

82

Large key numbers shown under a small label — e.g. pillar row score.

3. Spacing

Prefer Tailwind spacing tokens (4px grid). Examples: p-4, gap-6, space-y-8.

4px1
8px2
12px3
16px4
24px6
32px8
48px12
64px16

4. Core components

ScoreRing

Circular score 0–100; ring uses score semantic colours.

Pillar accordion

Full-width rows; one open at a time (controlled). Replaces the deprecated card grid.

All rows collapsed

MetricYour businessIndustry average
Monthly cashflow (first half average)DKK -11,965
Monthly cashflow (second half average)DKK -25,027
Cashflow directionDeclining ↓Stable or growing

How we calculated this

Monthly net cashflow split into two halves. Score = 50 + (trend × 40), clamped 1–100.

Based on: Trailing 12 months · Industry: Danish service-sector SMEs

MetricYour businessIndustry average
Gross margin61%62%
EBITDA margin18%16%

How we calculated this

Weighted average of gross margin score (50%) and EBITDA margin score (50%), each benchmarked against sector medians.

Based on: Trailing 12 months · Industry: Danish service-sector SMEs

MetricYour businessIndustry average
Cash runway4.2 months3.5 months
Debtor days38 days42 days

How we calculated this

Weighted average of cash runway score (50%) and debtor days score (50%).

Based on: Latest snapshot (point in time) · Industry: Danish service-sector SMEs

MetricYour businessIndustry average
Revenue per cost DKK1.42×1.39×
EBITDA margin18%16%

How we calculated this

Weighted average of revenue-per-opex score (50%) and EBITDA margin score (50%).

Based on: Trailing 12 months · Industry: Danish service-sector SMEs

MetricYour businessIndustry average
Debt ratio0.2%0.3%
Total liabilitiesDKK 330,000

How we calculated this

Debt-to-revenue ratio benchmarked against sector median.

Based on: Latest snapshot (point in time) · Industry: Danish service-sector SMEs

Growth expanded (mock)

MetricYour businessIndustry average
Monthly cashflow (first half average)DKK -11,965
Monthly cashflow (second half average)DKK -25,027
Cashflow directionDeclining ↓Stable or growing

How we calculated this

Monthly net cashflow split into two halves. Score = 50 + (trend × 40), clamped 1–100.

Based on: Trailing 12 months · Industry: Danish service-sector SMEs

MetricYour businessIndustry average
Gross margin61%62%
EBITDA margin18%16%

How we calculated this

Weighted average of gross margin score (50%) and EBITDA margin score (50%), each benchmarked against sector medians.

Based on: Trailing 12 months · Industry: Danish service-sector SMEs

MetricYour businessIndustry average
Cash runway4.2 months3.5 months
Debtor days38 days42 days

How we calculated this

Weighted average of cash runway score (50%) and debtor days score (50%).

Based on: Latest snapshot (point in time) · Industry: Danish service-sector SMEs

MetricYour businessIndustry average
Revenue per cost DKK1.42×1.39×
EBITDA margin18%16%

How we calculated this

Weighted average of revenue-per-opex score (50%) and EBITDA margin score (50%).

Based on: Trailing 12 months · Industry: Danish service-sector SMEs

MetricYour businessIndustry average
Debt ratio0.2%0.3%
Total liabilitiesDKK 330,000

How we calculated this

Debt-to-revenue ratio benchmarked against sector median.

Based on: Latest snapshot (point in time) · Industry: Danish service-sector SMEs

Saved score — no drill-down (static descriptions, no chevron)

Growth6
Revenue trajectory and momentum versus sector norms.
Profitability52
How much revenue converts into sustainable profit.
Cash health72
Liquidity and cash-related resilience.
Efficiency58
How leanly the business uses resources.
Stability64
Consistency and volatility of performance.

MetricsComparisonTable (isolated)

Growth
MetricYour businessIndustry average
Monthly cashflow (first half average)DKK -11,965
Monthly cashflow (second half average)DKK -25,027
Cashflow directionDeclining ↓Stable or growing

How we calculated this

Monthly net cashflow split into two halves. Score = 50 + (trend × 40), clamped 1–100.

Based on: Trailing 12 months · Industry: Danish service-sector SMEs

Profitability
MetricYour businessIndustry average
Gross margin61%62%
EBITDA margin18%16%

How we calculated this

Weighted average of gross margin score (50%) and EBITDA margin score (50%), each benchmarked against sector medians.

Based on: Trailing 12 months · Industry: Danish service-sector SMEs

Cash health
MetricYour businessIndustry average
Cash runway4.2 months3.5 months
Debtor days38 days42 days

How we calculated this

Weighted average of cash runway score (50%) and debtor days score (50%).

Based on: Latest snapshot (point in time) · Industry: Danish service-sector SMEs

Efficiency
MetricYour businessIndustry average
Revenue per cost DKK1.42×1.39×
EBITDA margin18%16%

How we calculated this

Weighted average of revenue-per-opex score (50%) and EBITDA margin score (50%).

Based on: Trailing 12 months · Industry: Danish service-sector SMEs

Stability
MetricYour businessIndustry average
Debt ratio0.2%0.3%
Total liabilitiesDKK 330,000

How we calculated this

Debt-to-revenue ratio benchmarked against sector median.

Based on: Latest snapshot (point in time) · Industry: Danish service-sector SMEs

Score hero

Forest score block with industry + period under the percentile, and a sparkline on the right.

Animated (count-up)

Bench score

Currently your business
is scored at

0


~58th percentile

Service sector

Trailing 12 months

Last updated: 17 Apr 2026

Score over time

OlderNewer

Static (no animation)

Bench score

Currently your business
is scored at

72


~58th percentile

Service sector

Trailing 12 months

Last updated: 17 Apr 2026

Score over time

OlderNewer

StatusBadge

ConnectedPendingFailedUnscored

MetricRow

Cash runway (months)
4.2 monthsSector median: 3.1 months
Gross margin %
62%Top quartile in your sector: 58%
EBITDA margin %
14%vs sector median 11%

LoadingSkeleton

Score ring

Pillar card

Bench score

5. Accuracy flow

Onboarding to improve benchmark accuracy. Static previews below do not call the API.

State: question 1

Increase accuracy
Answer three short questions so we can benchmark you against similar businesses.

Progress: 0/3 questions

0%

What best describes your business?

State: question 2

Increase accuracy
Answer three short questions so we can benchmark you against similar businesses.

Progress: 0/3 questions

0%

How many people work here?

State: question 3

Increase accuracy
Answer three short questions so we can benchmark you against similar businesses.

Progress: 0/3 questions

0%

How long has the business been operating?

State: complete

Increase accuracy
Answer three short questions so we can benchmark you against similar businesses.

You're all set

Your score will now use sector-specific benchmarks for your businesses with similar-sized employees.

6. Layout primitives

Page container

page-container max width, horizontal padding (this page uses it).

Section spacing

Stack major sections with space-y-20 or py-16 between blocks.

Card grid

Grid item 1
Responsive 2- and 3-column layout.
Grid item 2
Responsive 2- and 3-column layout.
Grid item 3
Responsive 2- and 3-column layout.

Dividers

LeftRight

7. Common patterns

Forms

Compose with Field* from components/ui/field, Input, Select, Textarea, Checkbox, Switch, RadioGroup. End cards with FormActions from components/bench/.

Company profile
Example layout — not wired to the API.
Basics

Shown on snapshots and exports.

Preferences

Lists

ListRow for settings-style stacks; Table for dense data; ScrollArea for long columns inside a fixed height.

Integrations
ListRow + StatusBadge-style actions.

E-conomic

Accounting data sync

Webhooks

Coming soon

Recent snapshots
Table pattern with hover rows.
DateScoreSector
24 Mar 202674Services
10 Mar 202671Services
24 Feb 202668Services
Scrollable list
ScrollArea around a vertical list.

Empty & alert states

No snapshot yet

Connect your accounting system and run your first Bench snapshot to see scores.

Tabs

High-level Bench score and benchmark line.

Accordion

Overlays & menus

Dialog for focused tasks, Sheet for mobile-friendly panels, DropdownMenu for overflow actions, Popover for lightweight contextual content.

8. Design rules

  • Always use CSS variables for colours — never hardcode hex in product components; swatches above use token classes (bg-primary, etc.).
  • Score colours must only come from score-high, score-mid, score-low (70–100 / 40–69 / 0–39).
  • All new components must be added to /design before use in product pages.
  • Dark mode must work for every component — test both themes.
  • No inline styles — Tailwind classes and SVG attributes only.
  • Typography must use the defined scale — no arbitrary font sizes.
  • Spacing must use the Tailwind scale — no arbitrary pixel values.
  • Components live in frontend/src/components/bench/ — not colocated with routes.
  • Forms: compose Field* + Input / Select / Textarea; use FormActions for submit rows.
  • Lists: ListRow for settings-style stacks; Table for dense tabular data; see section 7 for examples.
  • Generic primitives (dialog, sheet, tabs, etc.) live in frontend/src/components/ui/ — add new shadcn components with npx shadcn add, then document usage on /design.
shadcn Button