Design system

The META design system, in full.

This page is the living documentation of the system meta.lu is built from. Everything here renders with the same tokens as the rest of the site: roughly 80% neutrals, 15% black and white contrast, 5% orange. No gradients, no heavy shadows, radii of 3 to 4 pixels.

80% neutral

Whites, greys and hairlines carry the structure. Neutral lets content breathe and ages well.

15% contrast

Deep black and pure white for headings, bands and the footer. Contrast creates hierarchy.

5% orange

Orange marks an action, a key figure, an active state. Nothing else. Rare, therefore effective.

Zero effects

No gradients, no heavy drop shadows, radii of 3–4px. Geometry does the work.

00 — Logo

The META wordmark

The logo is typographic: Manrope 800, tight tracking, and a single orange full stop. It is the same markup the header renders — never an exported bitmap, never redrawn.

meta.Light surface
  • On light surfaces the wordmark uses the ink token (foreground), the dot uses primary.
  • On dark surfaces the wordmark turns pure white, the dot stays the same orange.
  • Keep clear space of at least the height of one letter on every side.
  • Never stretch, rotate, outline or add effects to the wordmark.
  • Never recolour it outside these tokens; the orange dot is never dropped.
01 — Colours

Colour tokens, light mode

Every colour on the site comes from a CSS variable declared in src/styles.css and exposed to Tailwind through @theme inline. Hardcoded values are not allowed in components — that is what makes dark mode free and global changes instant.

background / card
CSS variable
--background, --card
Value
oklch(1 0 0)
Hex
#ffffff
Usage
bg-background, bg-card
foreground / ink
CSS variable
--foreground, --ink
Value
oklch(0.1582 0.0072 258.37)
Hex
#0b0d10
Usage
text-foreground, bg-ink
muted-fg
CSS variable
--muted-fg
Value
oklch(0.5092 0.0121 261.77)
Hex
#62666d
Usage
text-muted-foreground
faint
CSS variable
--faint
Value
oklch(0.5492 0.0121 261.77)
Hex
#6d7179
Usage
text-faint, ::placeholder
line
CSS variable
--line
Value
oklch(0.9302 0.004 106.48)
Hex
#e8e8e5
Usage
border-line, border-border
line-strong
CSS variable
--line-strong
Value
oklch(0.89 0.0068 106.54)
Hex
#dbdbd6
Usage
border-line-strong, border-input
band / hover
CSS variable
--band, --hover
Value
oklch(0.9845 0.0026 106.45)
Hex
#fafaf8
Usage
bg-band, hover:bg-hover
primary
CSS variable
--primary
Value
oklch(0.7022 0.2004 45.1)
Hex
#ff6b00
Usage
bg-primary, text-primary, ring
primary-hover
CSS variable
--primary-hover
Value
oklch(0.6516 0.1879 44.5)
Hex
#e85f00
Usage
hover:bg-primary-hover
primary-foreground
CSS variable
--primary-foreground
Value
oklch(1 0 0)
Hex
#ffffff
Usage
text-primary-foreground
destructive
CSS variable
--color-destructive
Value
oklch(0.577 0.245 27.325)
Hex
#e7000b
Usage
text-destructive
destructive-foreground
CSS variable
--color-destructive-foreground
Value
oklch(0.985 0 0)
Hex
#fafafa
Usage
text-destructive-foreground
footer-bg
CSS variable
--footer-bg
Value
oklch(0.1582 0.0072 258.37)
Hex
#0b0d10
Usage
bg-footer
footer-fg
CSS variable
--footer-fg
Value
oklch(1 0 0)
Hex
#ffffff
Usage
text-footer-foreground
footer-muted
CSS variable
--footer-muted
Value
oklch(0.7461 0.0128 259.82)
Hex
#a8adb5
Usage
text-footer-muted
footer-line
CSS variable
--footer-line
Value
oklch(0.2799 0.0141 261.69)
Hex
#252930
Usage
border-footer-line

The header uses --header-bg = color-mix(in oklab, background 86%, transparent): a translucent surface that automatically picks up the active background colour, light or dark.

--header-bg: color-mix(in oklab, var(--background) 86%, transparent);

03 — Typography

Two families, no exceptions

Manrope (variable 200–800, self-hosted woff2, falling back to Helvetica then Arial) carries all text. IBM Plex Mono (400 and 500) is reserved for kickers, labels and numbers: it signals data, never prose.

Manrope weights

Manrope 200font-weight: 200
Manrope 300font-weight: 300
Manrope 400font-weight: 400
Manrope 500font-weight: 500
Manrope 600font-weight: 600
Manrope 700font-weight: 700
Manrope 800font-weight: 800

IBM Plex Mono

Kickers, form labels, section numbers and figures. Two weights are enough: 400 for text, 500 for emphasis.

IBM Plex Mono 400 — 0123456789

IBM Plex Mono 500 — 0123456789

Manrope

--font-sans: Manrope, Helvetica, Arial, sans-serif;
--font-mono: "IBM Plex Mono", ui-monospace, monospace;
font-display: swap; woff2, latin + latin-ext

Type ramp

h-display

Digital that pays off.

  • clamp(52px, 4.9vw, 72px)
  • line-height 1.04
  • letter-spacing -0.045em
  • weight 700
  • ≤720px: 40px / 1.12
h-section

What we build

  • 46px
  • line-height 1.12
  • letter-spacing -0.035em
  • weight 700
  • ≤720px: 30px
kicker

01 — Foundations

  • IBM Plex Mono
  • 12px
  • letter-spacing 0.16em
  • uppercase
body

Body copy runs at 16px with a line height of 1.6; secondary paragraphs use the muted-fg colour.

  • 16px
  • line-height 1.6
  • Manrope 400
  • text-muted-foreground

::selection uses primary with white text. Form placeholders use faint, never muted-fg.

04 — Radii & spacing

Strict geometry

Four radii, one container, one header height. These values are not renegotiated page by page — that is where the site's calm comes from.

Radii

radius-sm3px
radius / radius-md4px
radius-lg6px
radius-xl8px

Container .sec

max-width
1240px
padding-inline
48px
≤ 1024px
32px
≤ 720px
20px
margin-inline
auto

Header

--header-h
73px
≥ 1024px
85px
position
sticky
scroll-padding-top
var(--header-h)
05 — Interaction & motion

Quiet, predictable, respectful

Motion serves reading, never spectacle. Transitions are short, states are visible, and everything stands still when a visitor asks for less animation.

Primary button

bg-primary → hover:bg-primary-hover, radius 4px, primary-foreground text, transition-colors.

Focus ring

:focus-visible draws a 2px primary outline with a 2px offset. Mouse focus never shows a ring.

Light / dark theme
0.25s on background and color
Cookie notice
200ms ease-in-out, no bounce
Scrolling
scroll-behavior: smooth
prefers-reduced-motion
0.01ms, single iteration, instant scrolling
Why

Why a strict design system changes everything

A design system is not a designer's indulgence. It is a business decision.

Consistency builds trust. Visitors cannot explain why a site feels credible, but they feel it within three seconds. When every page uses the same orange, the same heading weight, the same button radius, the brain stops working and focuses on the content. A page that changes its rules in every section sends the opposite signal: nobody watches the details here. If the website is careless, why would the service be any different?

A token is a decision made once. Without a system, choosing a text grey is repeated on every page, in every component, with every new team member. You end up with forty near-identical greys and nobody to arbitrate. With a system, muted-fg exists, it has a value, and the question never returns. The day the brand evolves, you change one line in styles.css and the whole site follows — light, dark, in every language.

Development gets faster and maintenance gets cheaper. Building a new page becomes assembly: the .sec container, a kicker, an h-section heading, a grid framed in line, a primary button. There is nothing to invent, so nothing to correct in review. Over the lifetime of a website, maintenance far exceeds the cost of the initial build — that is exactly where the system pays for itself.

Accessibility is built in, not bolted on. Contrast is validated at the source: body text hits a very high ratio on white, and muted-fg stays above the AA threshold for running text. Focus states are visible and identical everywhere; the 2px orange ring never depends on the component. And prefers-reduced-motion is honoured globally rather than component by component. Someone navigating by keyboard or sensitive to motion is not an edge case to handle later.

Performance follows the same logic. Fonts are self-hosted as woff2, split by Unicode range and served with font-display: swap — no third-party request, no invisible text while loading. Two families, not eight. No component library imported for three buttons. The result is measurable: pages render in under a second, and that speed is itself a conversion argument.

Dark mode comes free from the structure. Because no component knows a hardcoded colour, going dark means redefining eight variables. No second mockup, no scattered patches, no regression a month later. This is exactly the kind of feature that costs a fortune when improvised and almost nothing when the foundation is clean.

Then there is the discipline of constraint, the hardest part. It is tempting to add a gradient, a shadow, a second accent colour. Every addition looks harmless, and every one drains a little strength from the whole. Five percent orange on a page lands; orange everywhere says nothing at all. A useful system is one that says no — that is precisely its value.

We apply this standard to client projects exactly as we apply it to our own site. The result is not a prettier website in the abstract: it is a website that is faster to evolve, cheaper to maintain, more accessible and more credible. Over three years, the difference shows up in the accounts.

Want the same standard for your site?

Describe your project in three steps. We reply within one business day with a first assessment and a budget range.

Request a quote