BauLynq

Design
Language

Every surface — product, website, a Nachtrag PDF, a slide in a Vergabegespräch — is built from the rules on this page.

Version
2.0 · 29.07.2026
Typefaces
Plus Jakarta Sans · Geist Mono
Licence
SIL Open Font License 1.1
Accessibility
WCAG 2.2 AA · light + dark
01

Foundation

German construction runs on documents that have to be exactly right. This system's job is to make BauLynq look like the software that gets them right.

Derived, not decorated

Chart colours come from a colour-blindness simulation. Spacing comes from a 4 pt unit. Type sizes come from one ratio. Nothing is here because it looked nice.

Hairlines and air

Structure comes from 1 px rules and space — never boxes, shadows or fills. A page should read like a well-set technical drawing.

One red

One German red, once per view — the primary action, the number in question, the brand. Spread it and it stops meaning anything.

The numbers are the product

A Leistungsverzeichnis is thousands of rows of money. Tabular figures, right alignment, mono, 1.234.567,89 €, hairline row separators, no vertical rules — all of it exists so those rows can be scanned and trusted at a glance.

Nr.BezeichnungZeitraumNettoStatus
AR-11Abschlagsrechnung01.06.–30.06.2026317.854,00 €In Prüfung
AR-10Abschlagsrechnung01.05.–31.05.2026289.410,00 €Freigegeben
N-07Nachtrag17.760,00 €Überfällig
AR-09Abschlagsrechnung01.04.–30.04.2026244.176,00 €Bezahlt
03

Typography

Two families. Plus Jakarta Sans carries the voice; Geist Mono carries every number, code and label. Both SIL OFL — free to use, embed and ship.

Why Plus Jakarta Sans

Nineteen open-source families were measured against the mark's geometry. It wins on the two things that bond type to a monoline mark:

TestThe markPlus JakartaReading
Stroke contrast1.001.12Near-monoline — modulates almost as little as the mark.
Bowl width ÷ height1.001.000Perfect circles. The only finalist to hit 1.000.
Stem ÷ cap0.1577At weight 600. The logotype sits at 800.
x-height ÷ cap0.726Holds up at 10 pt in a German LV table.
Weights200–800One family for display, UI and body. Tabular figures.
Space Grotesk is retired. A display face: at 10–11 pt its apertures close up and its width breaks Leistungsverzeichnis badly.

The logotype weight is not the headline weight. Only the logotype sits at 800 — headlines stay at 700/800.

The scale

display-1800 · -0.045em · 0.94Hero headline. One per page.
Ein Projekt.
display-2800 · -0.04em · 0.98Section opener, statement slides.
Ein Datensatz.
h1700 · -0.032em · 1.06Page and article titles.
Von der Ausschreibung bis zur Übergabe
h2700 · -0.026em · 1.12Major section heads.
Abrechnung auf einem Datensatz
h3600 · -0.02em · 1.2Sub-sections, card titles.
Nachträge und Abzugsregeln
h4600 · -0.014em · 1.3Inline heads, table group labels.
Leistungsverzeichnis
body-lg400 · -0.006em · 1.6Lead paragraph, one per section.
BauLynq verbindet Ausschreibung, Vergabe, Ausführung und Abrechnung auf einem Datensatz.
body400 · 0 · 1.6Default running text.
Von der Ausschreibung bis zur Übergabe geht nichts verloren. Jede Position, jedes Aufmaß und jeder Nachtrag hängt am selben Datensatz.
body-sm400 · 0 · 1.55Secondary text, help, footnotes.
Gilt für alle Vergabeeinheiten nach VOB/B § 16.
caption500 · 0.005em · 1.45Captions, metadata lines.
Stand: 29.07.2026 · Bauabschnitt 2
kicker500 · 0.16em · 1.2Eyebrow above a headline.
Die deutsche Bausoftware-Suite
data500 · 0 · 1.45Every number, code and identifier.
4.284.900,00 € · 62 % · AR-11

German typesetting

Do

  • Quotes are „low-high" — „Ein Projekt."
  • Thousands a dot, decimal a comma: 1.234.567,89 €
  • Non-breaking space before , %, §
  • Dates 29.07.2026, two-digit day and month in tables.
  • tnum anywhere numbers stack vertically.

Don't

  • Set long compounds in all caps — ABSCHLAGSRECHNUNG is unreadable.
  • Hyphenate a headline. Rewrite it shorter.
  • Use tabular figures for a big standalone number — 121 goes gappy.
  • Letterspace lowercase. Only the mono kicker gets tracking.
  • Mix ss alternates between site and documents.
04

Colour

Eight ramps, stepped in OKLCH so lightness moves evenly to the eye. Rot and Beton do almost all the work.

Rot

The brand. German industrial red pulled toward Bordeaux so it reads as engineering, not alarm.

50#FFEDE9
100#FFDFD9
200#FFBEB5
300#FF978B
400#F77469
500#D8574D
600#B83B36
700#8E2222
800#6B1112
900#4B0809
950#310404

Beton

The neutral. Every surface, rule and line of body text in both themes.

50#F7F7F5
100#EFEFEC
200#DDE0E3
300#C5C9CD
400#A8ACB1
500#8C9095
600#707478
700#53575B
800#383B3F
900#16181A
950#07080A

Stahl

Steel blue. Data slot 4, and the focus ring — the only blue in the system.

50#E6F9FF
100#D0F0FF
200#A7DBFF
300#7AC4FF
400#51A9EF
500#318FD4
600#0972B2
700#00548C
800#003C69
900#002849
950#001930

Grün

Freigegeben, bezahlt, geprüft. Data slot 3.

50#E8FCEE
100#D3F5DE
200#ADE5BF
300#82D19E
400#5BB980
500#3D9E66
600#1B804C
700#006133
800#004722
900#003015
950#001E0B

Bernstein

In Prüfung, Frist läuft. Data slot 5.

50#FFF3DE
100#FFE7C2
200#F9CD8F
300#ECB056
400#D79311
500#BC7800
600#985E00
700#724400
800#543000
900#3B1F00
950#271100

Violett

Data slot 2 only. Never a status, never a UI colour.

50#F7F2FF
100#EDE5FF
200#D8CAFF
300#C2ADFF
400#A98FEE
500#8F75D3
600#7359B2
700#563E8B
800#3E2B68
900#2A1B49
950#1A1030

Türkis

Reserve, for module tints when a module needs its own.

50#E4FBFB
100#CCF5F4
200#9FE4E3
300#6CCFCF
400#37B7B7
500#009D9D
600#007F7F
700#005F5F
800#004546
900#002F30
950#001E1E

Gold

Reserved. One place only — the Schwarz-Rot-Gold hairline in the footer.

50#FFF5DA
100#FCEABA
200#F0D280
300#E0B836
400#C99C00
500#AA8300
600#886700
700#664C00
800#4B3600
900#342300
950#221500

Semantic tokens

Never reference a ramp step in a component — reference the semantic token, and both themes take care of themselves. Contrast is measured against each theme's page canvas.

TokenLightDarkContrast L / DUse
--bl-bg#F7F7F5#07080A1.0 / 1.0Page canvas
--bl-surface#FFFFFF#1214181.1 / 1.1Cards, tables, chart surface
--bl-ink#16181A#F2F4F616.6 / 18.2Headings and body
--bl-ink-2#53575B#9AA0A66.8 / 7.6Secondary text
--bl-ink-3#8C9095#62676D3.0 / 3.5Hints, axis labels — never body text
--bl-line#E2E3E0rgba(255,255,255,0.08)1.2 / —Hairlines. 1 px, always
--bl-accent#8E2222#D8574D8.2 / 5.1Primary action, brand emphasis
--bl-focus#286CBE#5FA4FC4.9 / 7.8Focus ring. Deliberately not red

Status

Status colour never travels alone — it carries the German word, and usually a dot. A red row means nothing to a colour-blind Bauleiter without Überfällig beside it.

StatusLightDarkon whiteReads as
Erfolg#00633B#41BB887.37Freigegeben / Bezahlt / Geprüft
Warnung#985E00#EFAF4C5.34In Prüfung / Frist läuft
Kritisch#B83B36#F774695.65Überfällig / Abgelehnt
Neutral#53575B#9AA0A67.29Entwurf / Kein Status
Kritisch is not the brand red. #B83B36 sits two steps off #8E2222 so an error can never be mistaken for a primary button.
05

Data visualisation

Charts answer „wo stehen wir?". The palette was not picked — it was optimised, then validated against colour-blindness simulation.

Categorical — fixed order, never cycled

1 · Rot#A22626#D8574D
2 · Violett#A09BFF#5E54BA
3 · Grün#007A4B#19A572
4 · Stahl#60A6FF#1962B6
5 · Bernstein#9B6000#C57E00
6 · Magenta#DE75B4#A5417F
CheckLightDarkGate
Adjacent CVD ΔE20.720.8Target ≥ 8. Comfortably clear.
Normal-vision ΔE24.023.1Hard floor ≥ 15.
Lightness band, chroma floorpasspassAll six in band, all above the floor.
Contrast vs surface3 of 6 < 3:1all ≥ 3:1Slots 2, 4, 6 on white need labels or the table view.
Series cap. Bars, columns, lines and stacks use all six — only neighbours touch. Scatter, bubble, choropleth and small multiples use two. Past two, facet or fold into „Sonstige".

In practice

Abrechnungsstand je Gewerk

Abgerechnet und offen, in Tausend Euro

05001.0001.5002.0001.600Rohbau1.150Ausbau1.210TGA620Fassade430Außenanlagen
AbgerechnetOffen

Kumulierte Abrechnung

Februar bis Juni 2026, in Tausend Euro

05001.0001.500FebMärAprMaiJun1.380

Sequential and diverging

Sequential — one hue, light to dark. Magnitude only.

Diverging — Stahl ↔ Rot, neutral grey middle. Polarity only.

Marks

Do

  • Bars ≤ 24 px thick, 4 px rounded at the data end, square at the baseline.
  • 2 px lines; markers ≥ 8 px with a 2 px surface-colour ring.
  • A 2 px surface gap between stacked segments — never a stroke.
  • Hairline solid gridlines. Label the endpoint or the extreme, not every point.
  • A legend whenever there are two or more series.

Don't

  • Two y-axes. Ever. Split into two charts or index to a base.
  • Colour bars by their value — bar length already says that.
  • Use a status colour as „Serie 4".
  • Colour label text with the series colour. Marks carry colour; text wears ink.
  • Dashed gridlines, 3-D, gradients, or a border around the plot.
06

Layout & space

One 4 pt unit, a 1200 px content maximum, and hairlines instead of boxes.

Spacing

Base unit 4 px. Scale 4 · 8 · 12 · 16 · 20 · 24 · 32 · 40 · 48 · 64 · 80 · 96 · 128 · 160. Section padding 96 / 56 px. Content max 1200 px, gutter clamp(20px, 4vw, 48px).

Radii

xs 6 · sm 10 · md 12 · lg 18 · xl 24 · pill 999. Cards lg, inputs md, chips and buttons pill. Print uses none.

Rules, not boxes

Sections are separated by a 1 px --bl-line rule and space — never a 2 px border, never a shadow. Elevation's three steps are reserved for things that genuinely float: menus, dialogs, the product mock, a toast.

07

Components

A small kit. If something is not here, build it from the tokens rather than inventing a value.

Buttons

One primary per view. Pill radius, 600 weight. Focus ring is Stahl, never red.

Module chips

BidXInrXReportsXFleetXCrewX

Mono, hairline outline, no fill. Camel case with a capital X.

Status badges

Freigegeben In Prüfung Überfällig Entwurf

Tinted background at step 50/100, text at 600/700. The word is mandatory.

KPI

Auftragssumme4.284.900,00 €Stand 29.07.2026
Abgerechnet62 %+8 %-Pkt. ggü. Juni

Mono label above, mono value below, tabular. One accent value per group.

08

Motion

Motion confirms an action. It never announces one.

TokenValueUse
--bl-fast140 msHover, focus, colour change.
--bl-base240 msReveal, expand, tab change.
--bl-slow420 msPage transitions, the product mock.
--bl-easecubic-bezier(.22,1,.36,1)Default — decelerating.
--bl-ease-iocubic-bezier(.65,0,.35,1)Symmetric moves.

Everything is gated by prefers-reduced-motion, and pointer effects additionally by pointer: fine. Nothing moves more than 24 px. Nothing bounces.

09

Voice

German, direct, technically literate — the way a good Bauleiter writes. Short sentences, exact nouns, no adjective doing a number's job.

Do

  • „Von der Ausschreibung bis zur Übergabe geht nichts verloren."
  • Name the artefact: Leistungsverzeichnis, Aufmaß, Nachtrag, Abschlagsrechnung.
  • Cite the rule where it earns trust: VOB/B § 16.
  • Headlines of one or two clauses. Sub-copy of one sentence.
  • Use „Sie". Address a Bauleiter, not a persona.

Don't

  • „Revolutionäre KI-gestützte Cloud-Lösung."
  • Anglicisms where a German word exists — Abrechnung, not Billing.
  • Exclamation marks. Ever.
  • Claims without a figure behind them.
  • Emoji, in any surface.

Naming

BauLynq — one word, camel case, capital B and L, everywhere. Modules are BidX, InrX, ReportsX, FleetX, CrewX — capital X, no space, no hyphen.

10

Documents

Word, PowerPoint and Excel templates ship with this system, all in German, all built from the same tokens.

FileWhat it is
BauLynq-Briefbogen.docxDIN 5008 letterhead — logo, mono kicker, hairline rules, real page-number fields.
BauLynq-Bericht.docxProject report — bleeding near-black cover, live table of contents, KPI row, invoice table.
BauLynq-Vorlage.dotxThe report as a true Word template with the named style set.
BauLynq-Praesentation.pptxTen German slides — title, agenda, statement, pillars, KPI, table, native chart, suite, timeline, close.
BauLynq-Vorlage.potxPowerPoint template — BauLynq theme colours and fonts, eight named layouts.
BauLynq-Kostenverfolgung.xlsxCost-control workbook — 32-position LV, formula-driven KPIs, invoice ageing, two native charts.
BauLynq-Vorlage.xltxThe workbook stripped to headers, formulas and formatting.
Install the fonts first. Without them Office falls back to Aptos or Calibri — the layout holds, the voice does not. Both families are SIL OFL, so install them company-wide and send the files to clients.
11

Downloads

Every artefact in the system. Regenerated whenever the tokens change.

Everything

This document

Logo

System

Using the tokens

<link rel="stylesheet" href="/assets/css/baulynq-tokens.css">

.card {
  background: var(--bl-surface);
  border: 1px solid var(--bl-line);
  border-radius: var(--bl-r-lg);
  color: var(--bl-ink);
}
.card .value {
  font: var(--bl-w-semibold) var(--bl-fs-data)/var(--bl-lh-data) var(--bl-mono);
  font-variant-numeric: tabular-nums;
}

Regenerate the CSS from the JSON rather than editing it. Change a value in one place and everything downstream follows.