Alle Werte sind aus dem CI-Material ausgemessen, nicht geschätzt. Wer HTML für diese Marke erzeugt, kann die Blöcke unverändert übernehmen — sie entsprechen 1:1 dem produktiven Entwurf.
Markenfarben bleiben in beiden Modi identisch. Nur Flächen- und Text-Tokens werden im Dark Mode überschrieben — deshalb nie eine Farbe hart notieren, immer den Token verwenden.
#8FC1E3Akzent auf dunklem Grund#5085A5Akzent auf hellem Grund#687864Grün-Akzent, sparsamEigene Reihe für das Balken- und Ring-Motiv. --bar-2 gibt es in keinem anderen Token — es ist der dunkelste Ton der Marke.
#538EA6≈ primary-dark#32738Cnur hier#8BBBD9≈ primary#687864= secondary#8BBBD9 erreicht dort nur etwa 2:1 — WCAG AA verlangt 4,5:1. Farbige Texte deshalb neutral setzen (var(--text-light), geprüft 5,4:1) und die Farbe über Rahmen, Flächen, Icons und Pfeile transportieren.
Das Leitelement der Marke. Vier Balken mit bewusst ungleichen Längen — keine vier gleich breiten Blöcke. Die Werte stammen aus der Originalgrafik (1350 × 20 px, Lücken transparent).
| Balken | x | Breite | Farbe |
|---|---|---|---|
| 1 | 0 | 154 | --bar-1 |
| 2 | 175 | 315 | --bar-2 |
| 3 | 511 | 314 | --bar-3 |
| 4 | 847 | 503 | --bar-4 |
Lücken: 21 / 21 / 22 px. Verhältnis 154 : 315 : 314 : 503.
Als Inline-SVG mit fester viewBox und preserveAspectRatio="none". Damit sind die Längenverhältnisse auf jeder Bildschirmbreite gesperrt, während die Höhe frei über CSS steuerbar bleibt.
<svg class="ci-divider" viewBox="0 0 1350 20"
preserveAspectRatio="none" aria-hidden="true">
<rect x="0" y="0" width="154" height="20" fill="var(--bar-1)"/>
<rect x="175" y="0" width="315" height="20" fill="var(--bar-2)"/>
<rect x="511" y="0" width="314" height="20" fill="var(--bar-3)"/>
<rect x="847" y="0" width="503" height="20" fill="var(--bar-4)"/>
</svg>
position:absolute; top:0.ci-divider { display: block; width: 100%; height: 14px; }
.ci-divider rect {
transform: scaleX(0);
transform-box: fill-box; /* ohne das dreht sich der Ursprung weg */
transform-origin: left center;
transition: transform .75s cubic-bezier(.4,0,.2,1);
}
.ci-divider.visible rect { transform: scaleX(1); }
.ci-divider.visible rect:nth-child(1) { transition-delay: 0s; }
.ci-divider.visible rect:nth-child(2) { transition-delay: .12s; }
.ci-divider.visible rect:nth-child(3) { transition-delay: .24s; }
.ci-divider.visible rect:nth-child(4) { transition-delay: .36s; }
Der Ring ist der aufgerollte Balken — dieselben Proportionen, dieselben Farben. Er greift die Bildmarke auf und ist das einzige bewegte Element im Layout.
| Segment | Start | Länge | Farbe |
|---|---|---|---|
| 1 | 0° | 40,39° | --bar-1 |
| 2 | 46,07° | 82,61° | --bar-2 |
| 3 | 134,37° | 82,34° | --bar-3 |
| 4 | 222,40° | 131,91° | --bar-4 |
Vier Lücken à 5,69°. Summe exakt 360°.
pathLength="360" ist der Trick: dadurch sind stroke-dasharray und stroke-dashoffset unmittelbar Gradzahlen, die Tabelle oben steht also 1:1 im CSS. Die Gruppe wird um −90° gedreht, damit 0° auf 12 Uhr liegt.
<svg class="ring" viewBox="0 0 200 200" aria-hidden="true">
<g transform="rotate(-90 100 100)"> <!-- 0 Grad = 12 Uhr -->
<circle class="seg s1" cx="100" cy="100" r="94" pathLength="360"/>
<circle class="seg s2" cx="100" cy="100" r="94" pathLength="360"/>
<circle class="seg s3" cx="100" cy="100" r="94" pathLength="360"/>
<circle class="seg s4" cx="100" cy="100" r="94" pathLength="360"/>
</g>
</svg>
/* fill:none gehoert auf die gemeinsame Klasse, nicht auf einen Elternselektor */
.seg { fill: none; stroke-width: 2.2; stroke-linecap: round; }
/* dank pathLength="360" sind die Werte direkt Gradzahlen */
.s1 { stroke: var(--bar-1); stroke-dasharray: 40.39 319.61; stroke-dashoffset: 0; }
.s2 { stroke: var(--bar-2); stroke-dasharray: 82.61 277.39; stroke-dashoffset: -46.07; }
.s3 { stroke: var(--bar-3); stroke-dasharray: 82.34 277.66; stroke-dashoffset: -134.37; }
.s4 { stroke: var(--bar-4); stroke-dasharray: 131.91 228.09; stroke-dashoffset: -222.40; }
.ring { animation: ring-spin 70s linear infinite; }
@keyframes ring-spin { to { transform: rotate(360deg); } }
fill: none muss auf der gemeinsamen Segmentklasse liegen, nicht auf einem Elternselektor wie .hero-ring .seg. Sonst rendert jeder weitere Ring auf der Seite als gefüllte Scheibe statt als Ring.
Drei Schnitte mit klarer Aufgabenteilung. Größen über clamp(), damit sie ohne harte Breakpoints mitwachsen.
Ihre Gesundheit ist unser Auftrag
Fließtext steht in Roboto. Die Zeilenlänge wird bei 640px gedeckelt und wächst bewusst nicht mit der Inhaltsbreite mit.
Kicker · Labels · Statuszeilen
| Ebene | Größe | Einsatz |
|---|---|---|
| h1 | clamp(2.4rem, 5vw, 4rem) | genau einmal pro Seite |
| h2 | clamp(1.7rem, 3.5vw, 2.5rem) | Sektionen |
| h3 | clamp(1.15rem, 2vw, 1.4rem) | Karten, Blöcke |
| p | clamp(1rem, 1.1vw, 1.125rem) | max-width: 640px |
| Kicker | 0,8rem · letter-spacing .14em | Mono, versal, mit 22px-Strich davor |
Zwei Quellen mit klarer Aufgabenteilung: eigene Fachsymbole für medizinische Inhalte,
Phosphor für die Bedienoberfläche. Alle inline eingebunden und über currentColor
umfärbbar — nie als Hintergrundbild, sonst lässt sich nichts umfärben.
img/
und sind eigens für die Praxis gezeichnet. Sie werden nur für Leistungen eingesetzt, nicht für Bedienelemente.Zwei Varianten, dazu der Zustandswechsel. Der Radius beträgt durchgehend
var(--radius-sm) — 10 px, passend zu Karten und Feldern.
| Variante | Einsatz | Regel |
|---|---|---|
.btn-primary | die eine Hauptaktion | höchstens einer je Abschnitt |
.btn-outline | gleichrangige Zweitaktion | nie zwei Primary nebeneinander |
Kleine Auszeichnungen für Status, Kategorien und Leistungs-Schlagworte. Farbe nach
--karte, damit die Zuordnung zu einer Leistung erhalten bleibt.
Schlichte Felder mit 10 px Radius. Der Fokus wird über Rahmenfarbe und einen weichen Hof gezeigt — nur Farbe allein wäre zu leise.
Grundmaß ist 8px. Sektionen atmen mit 66–100 px — die Ruhe ist Teil der Wirkung und wird nicht aus Platzmangel verkleinert.
1400px begrenzt und wird zentral über
--content-width gesteuert. Fließtext bleibt zusätzlich bei 640px gedeckelt.Zurückhaltend und kurz. Alles läuft über --duration (0,3 s) mit der Kurve
cubic-bezier(0.4, 0, 0.2, 1) — kein Federn, kein Überschwingen.
prefers-reduced-motion: reduce setzt alle Laufzeiten
auf 0,01 ms. Das ist im Stylesheet global gesetzt, nicht je Element.
Jede Karte bekommt ihre Farbe über eine lokale Variable --karte. Das CSS bleibt dadurch farbagnostisch — eine Karte umzufärben heißt, ein Attribut zu ändern.
Oben links ein kurzer Balken, der beim Hover auf volle Breite wächst.
Gleiches Markup, anderer Wert in --karte.
Beim Hover leuchten die Tags gestaffelt auf.
<a class="karte" href="..." style="--karte: var(--bar-3)">
<span class="karte-icon"><svg viewBox="0 0 24 24">...</svg></span>
<h3>Titel</h3>
<p>Beschreibung.</p>
<ul class="tags"><li>Stichwort</li></ul>
</a>
<style>
.karte { position: relative; overflow: hidden; padding-top: 38px; }
.karte::before { /* Akzentbalken oben links */
content: ""; position: absolute; top: 0; left: 0;
height: 6px; width: 64px; background: var(--karte);
transition: width .45s cubic-bezier(.4,0,.2,1);
}
.karte:hover::before { width: 100%; }
.karte-icon { /* Farbe bei 18 %, mit Fallback */
background: var(--accent-soft);
background: color-mix(in srgb, var(--karte) 18%, transparent);
color: var(--karte);
}
.karte:hover .karte-icon { background: var(--karte); color: #fff; }
</style>
Ausschließlich Inline-SVG mit stroke: currentColor, Strichstärke 1,6, runde Enden. Als <img> geladene SVGs sind nicht per CSS umfärbbar und verschwinden im Dark Mode — deshalb inline einbetten.
Umgeschaltet wird über data-theme="dark" auf <html>. Überschrieben werden nur Flächen- und Text-Tokens.
| Token | hell | dunkel |
|---|---|---|
--bg | #FFFFFF | #16191d |
--bg-alt | #f4f3f1 | #1b1f24 |
--surface-1 | #FFFFFF | #242a31 |
--text | #33373D | #e6e9ec |
--accent | --primary-dark | --primary |
--footer-bg | bleibt in beiden Modi dunkel | |
--surface-1 muss im Dark Mode heller als --bg-alt sein, sonst verschwindet die Kartenkante<head> setzt data-theme vor dem ersten Paint<!-- ganz oben im <head>, vor dem Stylesheet -->
<script>
(function () {
var t;
try { t = localStorage.getItem('pam-theme'); } catch (e) {}
if (!t) t = matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
document.documentElement.setAttribute('data-theme', t);
})();
</script>
<img> — sonst nicht umfärbbar.overflow-x: clip statt hidden auf html und body. hidden macht position: sticky kaputt.pointer-events: none am Container, auto nur auf den sichtbaren Teilen — sonst schluckt die unsichtbare Fläche Klicks auf allem darunter.document.elementFromPoint() gegenprüfen — reine Rechteckvergleiche übersehen überlagernde Container.
Alle Werte, Texte, Assets und Links dieses Projekts als strukturierte Datei — als Grundlage für KI-Werkzeuge, Übersetzungen und die Weitergabe an Dienstleister.