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. | Bezeichnung | Zeitraum | Netto | Status |
|---|---|---|---|---|
AR-11 | Abschlagsrechnung | 01.06.–30.06.2026 | 317.854,00 € | In Prüfung |
AR-10 | Abschlagsrechnung | 01.05.–31.05.2026 | 289.410,00 € | Freigegeben |
N-07 | Nachtrag | — | 17.760,00 € | Überfällig |
AR-09 | Abschlagsrechnung | 01.04.–30.04.2026 | 244.176,00 € | Bezahlt |
Logo
The mark is a B — two interlocking links on a 320 × 320 square. It stands alone, on no tile. There is no lockup.
The mark — this is the logo
One file, filled with currentColor: near-black #16181A on a light
surface, paper #F7F7F5 on a dark one. Set the colour once on a parent and both themes are
correct. Minimum 20 px — below that the counters close up. Clear space is half the mark's width.
colorThe badge — only where the background is not yours
The mark reversed inside a rounded square: corner radius 23.5 % of the side, mark inset 22 % so it fills 56 % of the tile. It exists for the three places the surface behind the logo cannot be controlled — favicons and app icons, avatars, and placement over photography. Anywhere else, use the bare mark. Minimum 18 px.
color is
correct on every canvas — light, dark, red, photographic — and the mark can never disappear into its
own tile.The name
Ordinary typography. Nothing constrains its weight any more, so it is properly bold.
| Size | Weight | Tracking | Where |
|---|---|---|---|
| 28 px and up | 800 | −0.030 em | Covers, slide titles, the website hero. |
| Below 28 px | 700 | −0.012 em | App headers, footers, captions. |
Placement — opposite ends
The mark anchors one end of a bar or surface. The name sits at the far end, or on a different edge entirely. Minimum separation is 8 × the mark's width. Where the far end is already occupied — a CTA, a toolbar — the name moves to the next uncluttered anchor, usually the footer. It does not move next to the mark.
Rules
Do
- Use the bare mark. It is the logo.
- Set
coloronce and let one file serve both themes. - Put the name at the far end, or leave it off entirely — the mark carries the brand.
- Keep the mark square. Scale it uniformly or not at all.
- Below 20 px use the badge, not the bare mark.
Don't
- Build a lockup. Not horizontal, not stacked, not "just this once".
- Put the name beside, under or over the mark.
- Put a badge on a surface you control — that is what the bare mark is for.
- Match the name's weight to the mark's stroke. That constraint is gone.
- Redraw, smooth, crop or recolour the mark.
- Put more than one mark on a surface.
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:
| Test | The mark | Plus Jakarta | Reading |
|---|---|---|---|
| Stroke contrast | 1.00 | 1.12 | Near-monoline — modulates almost as little as the mark. |
| Bowl width ÷ height | 1.00 | 1.000 | Perfect circles. The only finalist to hit 1.000. |
| Stem ÷ cap | — | 0.1577 | At weight 600. The logotype sits at 800. |
| x-height ÷ cap | — | 0.726 | Holds up at 10 pt in a German LV table. |
| Weights | — | 200–800 | One family for display, UI and body. Tabular figures. |
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.display-2800 · -0.04em · 0.98Section opener, statement slides.h1700 · -0.032em · 1.06Page and article titles.h2700 · -0.026em · 1.12Major section heads.h3600 · -0.02em · 1.2Sub-sections, card titles.h4600 · -0.014em · 1.3Inline heads, table group labels.body-lg400 · -0.006em · 1.6Lead paragraph, one per section.body400 · 0 · 1.6Default running text.body-sm400 · 0 · 1.55Secondary text, help, footnotes.caption500 · 0.005em · 1.45Captions, metadata lines.kicker500 · 0.16em · 1.2Eyebrow above a headline.data500 · 0 · 1.45Every number, code and identifier.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. tnumanywhere numbers stack vertically.
Don't
- Set long compounds in all caps —
ABSCHLAGSRECHNUNGis unreadable. - Hyphenate a headline. Rewrite it shorter.
- Use tabular figures for a big standalone number —
121goes gappy. - Letterspace lowercase. Only the mono kicker gets tracking.
- Mix
ssalternates between site and documents.
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.
Beton
The neutral. Every surface, rule and line of body text in both themes.
Stahl
Steel blue. Data slot 4, and the focus ring — the only blue in the system.
Grün
Freigegeben, bezahlt, geprüft. Data slot 3.
Bernstein
In Prüfung, Frist läuft. Data slot 5.
Violett
Data slot 2 only. Never a status, never a UI colour.
Türkis
Reserve, for module tints when a module needs its own.
Gold
Reserved. One place only — the Schwarz-Rot-Gold hairline in the footer.
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.
| Token | Light | Dark | Contrast L / D | Use |
|---|---|---|---|---|
--bl-bg | #F7F7F5 | #07080A | 1.0 / 1.0 | Page canvas |
--bl-surface | #FFFFFF | #121418 | 1.1 / 1.1 | Cards, tables, chart surface |
--bl-ink | #16181A | #F2F4F6 | 16.6 / 18.2 | Headings and body |
--bl-ink-2 | #53575B | #9AA0A6 | 6.8 / 7.6 | Secondary text |
--bl-ink-3 | #8C9095 | #62676D | 3.0 / 3.5 | Hints, axis labels — never body text |
--bl-line | #E2E3E0 | rgba(255,255,255,0.08) | 1.2 / — | Hairlines. 1 px, always |
--bl-accent | #8E2222 | #D8574D | 8.2 / 5.1 | Primary action, brand emphasis |
--bl-focus | #286CBE | #5FA4FC | 4.9 / 7.8 | Focus 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.
| Status | Light | Dark | on white | Reads as |
|---|---|---|---|---|
| Erfolg | #00633B | #41BB88 | 7.37 | Freigegeben / Bezahlt / Geprüft |
| Warnung | #985E00 | #EFAF4C | 5.34 | In Prüfung / Frist läuft |
| Kritisch | #B83B36 | #F77469 | 5.65 | Überfällig / Abgelehnt |
| Neutral | #53575B | #9AA0A6 | 7.29 | Entwurf / Kein Status |
#B83B36 sits two steps off
#8E2222 so an error can never be mistaken for a primary button.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
#A22626#D8574D#A09BFF#5E54BA#007A4B#19A572#60A6FF#1962B6#9B6000#C57E00#DE75B4#A5417F| Check | Light | Dark | Gate |
|---|---|---|---|
| Adjacent CVD ΔE | 20.7 | 20.8 | Target ≥ 8. Comfortably clear. |
| Normal-vision ΔE | 24.0 | 23.1 | Hard floor ≥ 15. |
| Lightness band, chroma floor | pass | pass | All six in band, all above the floor. |
| Contrast vs surface | 3 of 6 < 3:1 | all ≥ 3:1 | Slots 2, 4, 6 on white need labels or the table view. |
In practice
Abrechnungsstand je Gewerk
Abgerechnet und offen, in Tausend Euro
Kumulierte Abrechnung
Februar bis Juni 2026, in Tausend Euro
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.
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.
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
Mono, hairline outline, no fill. Camel case with a capital X.
Status badges
Tinted background at step 50/100, text at 600/700. The word is mandatory.
KPI
Mono label above, mono value below, tabular. One accent value per group.
Motion
Motion confirms an action. It never announces one.
| Token | Value | Use |
|---|---|---|
--bl-fast | 140 ms | Hover, focus, colour change. |
--bl-base | 240 ms | Reveal, expand, tab change. |
--bl-slow | 420 ms | Page transitions, the product mock. |
--bl-ease | cubic-bezier(.22,1,.36,1) | Default — decelerating. |
--bl-ease-io | cubic-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.
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.
Documents
Word, PowerPoint and Excel templates ship with this system, all in German, all built from the same tokens.
| File | What it is |
|---|---|
BauLynq-Briefbogen.docx | DIN 5008 letterhead — logo, mono kicker, hairline rules, real page-number fields. |
BauLynq-Bericht.docx | Project report — bleeding near-black cover, live table of contents, KPI row, invoice table. |
BauLynq-Vorlage.dotx | The report as a true Word template with the named style set. |
BauLynq-Praesentation.pptx | Ten German slides — title, agenda, statement, pillars, KPI, table, native chart, suite, timeline, close. |
BauLynq-Vorlage.potx | PowerPoint template — BauLynq theme colours and fonts, eight named layouts. |
BauLynq-Kostenverfolgung.xlsx | Cost-control workbook — 32-position LV, formula-driven KPIs, invoice ageing, two native charts. |
BauLynq-Vorlage.xltx | The workbook stripped to headers, formulas and formatting. |
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.