← Dashboard
CI-Guide · Praxis Alter Markt

Gestaltungsraster für HTML-Ausgaben

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.

01

Farben

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.

Markenfarben

--primary#8FC1E3Akzent auf dunklem Grund
--primary-dark#5085A5Akzent auf hellem Grund
--secondary#687864Grün-Akzent, sparsam

Die vier Balkenfarben

Eigene Reihe für das Balken- und Ring-Motiv. --bar-2 gibt es in keinem anderen Token — es ist der dunkelste Ton der Marke.

--bar-1#538EA6≈ primary-dark
--bar-2#32738Cnur hier
--bar-3#8BBBD9≈ primary
--bar-4#687864= secondary
Kontrastregel. Die Markentöne taugen als Fläche und Dekoration, nicht als Textfarbe auf Weiß. #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.
02

Der Balken

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).

BalkenxBreiteFarbe
10154--bar-1
2175315--bar-2
3511314--bar-3
4847503--bar-4

Lücken: 21 / 21 / 22 px. Verhältnis 154 : 315 : 314 : 503.

Umsetzung

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>

Einsatzorte

.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;  }
04

Der Ring

Der Ring ist der aufgerollte Balken — dieselben Proportionen, dieselben Farben. Er greift die Bildmarke auf und ist das einzige bewegte Element im Layout.

Der entscheidende Punkt. Eine Gerade mit vier Balken hat drei Lücken, ein Kreis braucht vier. Wer die Balkenlängen direkt umrechnet, lässt Segment 4 und 1 aneinanderstoßen — sie sehen dann aus wie ein einziger Balken. Die Balken müssen um Faktor 0,98341 gestaucht werden, damit die vierte Lücke hineinpasst.
SegmentStartLängeFarbe
10°40,39°--bar-1
246,07°82,61°--bar-2
3134,37°82,34°--bar-3
4222,40°131,91°--bar-4

Vier Lücken à 5,69°. Summe exakt 360°.

Umsetzung

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); } }
Fallstrick. 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.
05

Typografie

Drei Schnitte mit klarer Aufgabenteilung. Größen über clamp(), damit sie ohne harte Breakpoints mitwachsen.

--font-heading · Roboto Slab 700

Ihre Gesundheit ist unser Auftrag

--font-body · Roboto 300–500

Fließtext steht in Roboto. Die Zeilenlänge wird bei 640px gedeckelt und wächst bewusst nicht mit der Inhaltsbreite mit.

--font-mono · JetBrains Mono 400–500

Kicker · Labels · Statuszeilen

EbeneGrößeEinsatz
h1clamp(2.4rem, 5vw, 4rem)genau einmal pro Seite
h2clamp(1.7rem, 3.5vw, 2.5rem)Sektionen
h3clamp(1.15rem, 2vw, 1.4rem)Karten, Blöcke
pclamp(1rem, 1.1vw, 1.125rem)max-width: 640px
Kicker0,8rem · letter-spacing .14emMono, versal, mit 22px-Strich davor
06

Icons

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.

Eigene Fachsymbole

StethoskopStethoskop
KardiogrammKardiogramm
LungeLunge
BlutdruckBlutdruck
TermineTermine

Bedienoberfläche · Phosphor

Kalender
Telefon
E-Mail
Adresse
Uhr
Person
Haus
Pfeil
Häkchen
Schließen
Menü
Lupe
Die fünf Fachsymbole liegen als SVG in img/ und sind eigens für die Praxis gezeichnet. Sie werden nur für Leistungen eingesetzt, nicht für Bedienelemente.
07

Buttons

Zwei Varianten, dazu der Zustandswechsel. Der Radius beträgt durchgehend var(--radius-sm) — 10 px, passend zu Karten und Feldern.

VarianteEinsatzRegel
.btn-primarydie eine Hauptaktionhöchstens einer je Abschnitt
.btn-outlinegleichrangige Zweitaktionnie zwei Primary nebeneinander
08

Badges & Tags

Kleine Auszeichnungen für Status, Kategorien und Leistungs-Schlagworte. Farbe nach --karte, damit die Zuordnung zu einer Leistung erhalten bleibt.

  • Internistische Versorgung
  • Check-up
  • Diagnostik-Labor
  • Akutsprechstunde
  • Vorsorge
  • Hausärztlich
  • Check-up
  • Labor
  • Vorsorge
Tags tragen keinen Rahmen im Ruhezustand, sondern nur eine feine Linie. Beim Überfahren der Karte nehmen sie deren Farbe an — die Karte und ihre Tags gehören sichtbar zusammen.
09

Eingabefelder

Schlichte Felder mit 10 px Radius. Der Fokus wird über Rahmenfarbe und einen weichen Hof gezeigt — nur Farbe allein wäre zu leise.

Beschriftungen stehen in Mono, versal und gesperrt — dieselbe Behandlung wie Kicker. Platzhalter ersetzen nie die Beschriftung.
10

Abstände

Grundmaß ist 8px. Sektionen atmen mit 66–100 px — die Ruhe ist Teil der Wirkung und wird nicht aus Platzmangel verkleinert.

8pxBasis
12px--gap-sm · innerhalb Karten
24px--gap · Standard zwischen Blöcken
36pxKarten-Innenabstand
66pxSektionsabstand (mobil)
100px--section-padding
Inhaltsbreite ist auf 1400px begrenzt und wird zentral über --content-width gesteuert. Fließtext bleibt zusätzlich bei 640px gedeckelt.
11

Wirkungen & Animationen

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.

AnhebenKarten: translateY(−4px) mit weichem Schatten
RahmenRahmenfarbe wechselt zum Akzent
Skalierennur bei Bildern, scale(1.03)
AbdunkelnDeckkraft — für überlagerte Bilder
Bewegung reduzieren. prefers-reduced-motion: reduce setzt alle Laufzeiten auf 0,01 ms. Das ist im Stylesheet global gesetzt, nicht je Element.
12

Komponenten

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.

Karte mit Akzent

Oben links ein kurzer Balken, der beim Hover auf volle Breite wächst.

  • Tag
  • Weiterer Tag

Zweite Farbe

Gleiches Markup, anderer Wert in --karte.

  • Tag
  • Noch einer

Dritte Farbe

Beim Hover leuchten die Tags gestaffelt auf.

  • Tag
  • Und einer
<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>

Buttons

Icons

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.

13

Dark Mode

Umgeschaltet wird über data-theme="dark" auf <html>. Überschrieben werden nur Flächen- und Text-Tokens.

Tokenhelldunkel
--bg#FFFFFF#16191d
--bg-alt#f4f3f1#1b1f24
--surface-1#FFFFFF#242a31
--text#33373D#e6e9ec
--accent--primary-dark--primary
--footer-bgbleibt in beiden Modi dunkel
<!-- 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>
14

Sieben Regeln

  1. Keine harten Farbwerte. Alles über Tokens, sonst bricht der Dark Mode.
  2. Markenfarben nie als Textfarbe auf hellem Grund — nur Flächen, Rahmen, Icons.
  3. Balkenlängen sind ungleich. 154 : 315 : 314 : 503, nicht vier gleiche Blöcke.
  4. Der Ring braucht vier Lücken, nicht drei. Faktor 0,98341 einrechnen.
  5. Icons inline, nie als <img> — sonst nicht umfärbbar.
  6. overflow-x: clip statt hidden auf html und body. hidden macht position: sticky kaputt.
  7. Floating-Elemente brauchen pointer-events: none am Container, auto nur auf den sichtbaren Teilen — sonst schluckt die unsichtbare Fläche Klicks auf allem darunter.
Prüfung vor Abgabe. Kontraste am gerenderten Screenshot messen und dabei textfreie Zonen abtasten, sonst verfälscht das Anti-Aliasing der Schrift den Wert. Klickbarkeit wichtiger Links mit document.elementFromPoint() gegenprüfen — reine Rechteckvergleiche übersehen überlagernde Container.
15

Design Tokens

Alle Werte, Texte, Assets und Links dieses Projekts als strukturierte Datei — als Grundlage für KI-Werkzeuge, Übersetzungen und die Weitergabe an Dienstleister.

tokens.json
Stammdaten, Farben samt Balkenwerten, Typografie mit Gewichten, alle Asset-Pfade (Logo als SVG und PNG), Originaltexte, Team, Leistungen, Öffnungszeiten, Navigation und alle Links.