Interne Seite. Sie wird beim Bauen aus der Website entfernt und ist nur während der Entwicklung erreichbar.

Styleguide

Alles, woraus diese Website gebaut ist. Klicken Sie auf einen Klassennamen, um ihn zu kopieren. Wer etwas am Aussehen ändern will, ändert es in src/styles/variables.css – nicht an einzelnen Stellen im Projekt.

Zu den Bausteinen – fertige Abschnitte als lebende Beispiele

Farben

Jede Farbe im Projekt kommt aus dieser Liste. Die Farben mit einer Rolle im Namen (Hintergrund, Text, Rahmen) verweisen auf eine der Grundfarben – so ändert sich mit einem Wert das ganze Erscheinungsbild.

Die Werte werden beim Öffnen der Seite geladen.

Schrift

Welches Tag benutzt wird (h1, h2, p), ergibt sich aus der Bedeutung. Wie groß es aussieht, aus der Klasse. Deshalb darf eine h2 die Klasse heading-style-h4 tragen, wenn sie optisch kleiner sein soll – die Reihenfolge der Überschriften bleibt trotzdem sauber.

Überschriften

Elektrotechnik aus Musterstadt
Elektrotechnik aus Musterstadt
Elektrotechnik aus Musterstadt
Elektrotechnik aus Musterstadt
Elektrotechnik aus Musterstadt
Elektrotechnik aus Musterstadt

Textgrößen

Wir verlegen Leitungen und prüfen Anlagen.
Wir verlegen Leitungen und prüfen Anlagen.
Wir verlegen Leitungen und prüfen Anlagen.
Wir verlegen Leitungen und prüfen Anlagen.
Wir verlegen Leitungen und prüfen Anlagen.

Schriftstärken

Musterhandwerk GmbH
Musterhandwerk GmbH
Musterhandwerk GmbH
Musterhandwerk GmbH
Musterhandwerk GmbH
Musterhandwerk GmbH

Textfarben

Beispieltext in dieser Farbe
Beispieltext in dieser Farbe
Beispieltext in dieser Farbe
Beispieltext in dieser Farbe
Text auf dunklem Grund

Ausrichtung

linksbündig

zentriert

rechtsbündig

Sonderformen

Zurückgenommener Text, etwa für Zusatzangaben
Großbuchstaben mit Sperrung

Ein Zitat oder ein hervorgehobener Satz.

Begrenzt die Zeilenlänge auf ein gut lesbares Maß. Lange Zeilen ermüden beim Lesen, weil das Auge den Anfang der nächsten Zeile schlechter findet.

Eine Überschrift, deren Zeilen gleichmäßig gefüllt werden

Dieser Text wird nach zwei Zeilen abgeschnitten. Das ist nützlich in Karten, damit alle Karten gleich hoch bleiben, auch wenn die Texte unterschiedlich lang sind. Diesen Teil sehen Sie nicht mehr.

Abstände

Alle Abstände kommen aus einer einzigen Reihe, von xxtiny bis xxhuge. Das hält das Bild ruhig: Es gibt keine krummen Zwischenwerte, die niemand wiederfindet.

Die Werte werden beim Öffnen der Seite geladen.

So werden die Größen benutzt

Jede Größe gibt es als Innenabstand, Außenabstand, Lücke und Abstandhalter. Statt xxsmall steht jede Größe aus der Liste oben.

Inhalt
Innenabstand rundherum
Inhalt
auch: bottom, left, right, vertical, horizontal
Inhalt
Außenabstand, gleiche Richtungen
eins
zwei
drei
Lücke zwischen Kindelementen
oben
unten
leeres Element als Abstandhalter

Struktur

Das Gerüst jeder Seite, von außen nach innen: page-wrapper, main-wrapper, section, padding-global, container. Diese Reihenfolge gilt überall, ohne Ausnahme.

page-wrapper

main-wrapper

section + padding-section-medium

padding-global

container-large

Eine Kante für die ganze Seite

Kopfzeile, jeder Abschnitt und die Fußzeile benutzencontainer-large. Immer. Wer eine Seite überfliegt, tastet mit dem Blick am linken Rand entlang – liegt der bei jedem Abschnitt woanders, muss das Auge bei jedem Absatz neu suchen. Bewusst merkt das niemand, es fühlt sich nur unruhig an.

Ein Fließtext soll trotzdem nicht über 80 rem laufen. Dafür gibt essektion-schmal. Es gehört in den container, nicht an ihn:

<div class="container-large">
  <div class="sektion-schmal is-eng"> ... </div>
</div>

Der container sorgt für die 80-rem-Spalte und setzt sie mittig ins Fenster. sektion-schmal begrenzt darin den Text und bleibt links stehen – auf derselben Linie wie die Kopfzeile.

Beides am selben Element ergäbe nur eine Box: Die wäre entweder zentriert – dann ist nichts gewonnen – oder sie verliert ihre Seitenränder und rutscht an den Fensterrand, weiter nach links als die Kopfzeile.

npm run raster prüft das nach und meldet jeden Abschnitt, der aus der Reihe fällt.

Inhaltsbreiten

container-small
container-medium
container-large

Seitenrand

Inhalt
hält den Inhalt vom Bildschirmrand weg

Überschrift und Inhalt

Zwischen dem Kopf eines Abschnitts – Überschrift und Einleitung – und seinem Inhalt steht überall derselbe Abstand:sektion-inhalt. Er kommt aus einer eigenen Variablen,--space-kopf, und ist damit an einer Stelle einstellbar.

Warum dafür eine eigene Variable und nicht einfachmargin-top-large: Dieser eine Abstand entscheidet mehr über den Eindruck einer Seite als jeder andere. Ist er zu klein, klebt alles aneinander und die Seite wirkt gedrängt – auch dann, wenn jeder Abschnitt für sich in Ordnung ist. Auf schmalen Bildschirmen wird er automatisch eine Stufe kleiner; dort sind 4 rem nicht großzügig, sondern Scrollarbeit.

Abstände zwischen Abschnitten

Abschnitt
oben und unten
Abschnitt
oben und unten
Abschnitt
oben und unten
nur oben
auch: padding-section-bottom-small
nur oben
auch: padding-section-bottom-medium
nur oben
auch: padding-section-bottom-large

Layout

Raster und Reihen. Die Klassen grid-auto-* rechnen die Spaltenzahl selbst aus: Sie legen nur fest, wie schmal eine Spalte höchstens werden darf.

Raster mit automatischer Spaltenzahl

eins
zwei
drei
vier
Spaltenzahl richtet sich nach dem Platz
eins
zwei
drei
vier
Spaltenzahl richtet sich nach dem Platz
eins
zwei
drei
vier
Spaltenzahl richtet sich nach dem Platz
eins
zwei
drei
vier
Spaltenzahl richtet sich nach dem Platz

Raster mit fester Spaltenzahl

1
2
bricht auf schmalen Bildschirmen um
1
2
3
bricht auf schmalen Bildschirmen um
1
2
3
4
bricht auf schmalen Bildschirmen um

Reihen und Spalten

eins
zwei
nebeneinander
eins
zwei
untereinander
ein längerer Eintrag
noch ein längerer Eintrag
und ein dritter Eintrag
umbrechen statt quetschen
links
rechts
auch: justify-start, -center, -end
hoch
mittig ausgerichtet
auch: align-start, -end, -baseline
fest
wächst
nimmt den übrigen Platz ein

Maximalbreiten

max-width-xsmall
max-width-small
max-width-medium
max-width-large

Seitenverhältnisse

Halten den Platz für ein Bild frei, bevor es geladen ist. Das verhindert, dass die Seite beim Laden springt.

Bausteine

Wiederkehrende Elemente. Sie werden hier einmal beschrieben und überall gleich verwendet. Neue Bausteine entstehen nur aus vorhandenen Variablen.

Schaltflächen

graue Fläche – zweite Wahl neben der Hauptaktion
sieht aus wie ein Link
braucht immer ein aria-label
nicht bedienbar

Warum die zweite Schaltfläche grau gefüllt ist und nicht nur umrandet: Sie hat denselben Rahmen wie die erste, nur in der Farbe ihrer eigenen Fläche. Dadurch sind beide exakt gleich groß und stehen sauber nebeneinander.

Die graue Fläche hebt sich von Weiß nur mit 1,17:1 ab. Das ist erlaubt und kein Versehen: Die Barrierefreiheitsrichtlinie verlangt die 3:1 nur für das, was zum Erkennen des Bedienelements nötig ist. Bei einer Schaltfläche mit sichtbarer Beschriftung übernimmt das die Schrift – und die steht hier mit 14,7:1 da.npm run kontrast prüft genau das.

Schaltflächen auf dunklem Grund

Auf dunklem oder farbigem Grund hat die normale Schaltfläche dieselbe Farbe wie der Hintergrund – sie ist dann buchstäblich unsichtbar. Deshalb gibt es die umgekehrte Fassung.

So sieht der Fehler aus

Links steht eine ganz normale Schaltfläche auf farbigem Grund. Ihr Kontrast beträgt 1,00:1 – sie ist nicht zu sehen. Rechts dieselbe Schaltfläche umgekehrt: 11,17:1.

Falsch

Anfrage schreiben

Richtig

Anfrage schreiben

Das passiert von selbst. In jedem Abschnitt mitgrund="dunkel" oder grund="farbig", in Aufmachern mit Hintergrundbild und in der dunklen Fußzeile werden Schaltflächen automatisch umgekehrt. Man kann es also nicht vergessen.

helle Fläche, dunkle Schrift – für dunklen Grund
nur umrandet, für dunklen Grund

npm run kontrast rechnet alle diese Kombinationen nach – auch die umgekehrten. Wer die Hauptfarbe ändert, sieht sofort, ob es noch reicht.

Karte

Beim Überfahren hebt sich eine anklickbare Karte an und bekommt einen Schatten. Weder Rahmen noch Schrift werden eingefärbt – auch die Überschrift nicht. Eine Karte wird nicht wichtiger, nur weil der Zeiger darüber steht, und der Farbblitz macht die Seite unruhig. Ist die Karte selbst ein Link, braucht sie dafür text-style-nolink.

Photovoltaik

Planung und Montage von Solaranlagen auf Dach und Fassade.

für anklickbare Karten

Etikett, Trennlinie, Hinweis

Vollzeit
Photovoltaik

Diese Anzeige läuft in zwei Wochen ab.

Hinweis, den man nicht übersehen soll

Hier steht noch nichts. So darf die Seite nicht online gehen.

für echte Probleme

Liste mit Haken

Für Aufzählungen, bei denen jeder Punkt eine Zusage ist: was im Preis enthalten ist, was mitzubringen ist, was der Betrieb übernimmt.

  • Anfahrt im Umkreis von 30 Kilometern
  • Prüfprotokoll für die Versicherung
  • Anmeldung beim Netzbetreiber
ul mit li, sonst nichts

Der Haken ist gezeichnet, nicht getippt: zwei Rahmenlinien eines gedrehten Kästchens. Damit gibt es kein Zeichen, das Vorleseprogramme mitlesen könnten – „Häkchen Feste Termine" will niemand hören. Auf dunklem und farbigem Grund kehrt er sich automatisch um.

Formularfeld

Platzhalter für gesperrte Fremdinhalte

Steht dort, wo ohne Einwilligung ein Video, eine Karte oder ein Terminkalender erscheinen würde. Die Technik dazu kommt in Phase 7.

Fließtext aus dem CMS

Ein Absatz, wie er aus dem CMS kommt.

Eine Zwischenüberschrift

Der Text darunter.

  • Ein Listenpunkt
  • Noch einer
umschließt Inhalte aus Markdown

Sektionen

Fertige Abschnitte für ganze Seiten. Sie werden mit deutschen Eigenschaften aufgerufen und bauen sich aus den Klassen dieses Styleguides zusammen - es gibt kein zweites System daneben.

Die Dateien liegen in src/components/sektionen/. Eine Seite besteht dann nur noch aus einer Handvoll Zeilen: Sektionen untereinander, jede mit ihren Texten.

Alle Abschnitte gibt es zum Ansehen.

Unter /bausteine steht jeder einzelne als echtes, lebendes Beispiel – samt Animation, links eine Liste zum Springen. Das ist die Seite, auf der man sich etwas aussucht. Hier steht nur, was es gibt.

Aufmacher

Text, keine Bilder. Oft die beste Wahl.
Text links oder rechts, Bild daneben
Bild im Hintergrund, Text darauf
zwei Hälften, eine farbig
großes Bild, kleineres versetzt davor

Zum Aufmacher mit Hintergrundbild: Zwischen Bild und Text liegt immer eine dunkle Schicht mit fester Deckkraft. Ob heller Text auf einem Foto lesbar ist, hängt sonst vom Foto ab – und das kann kein Prüfskript vorher wissen. Der Wert ist nachgerechnet:npm run kontrast prüft den ungünstigsten Fall, ein rein weißes Bild.

Inhalt

Überschrift und Fließtext
Bild links oder rechts, Text daneben
Raster aus Karten, anklickbar
kurze Punkte mit Symbol
rote Symbolkachel – für das Problem des Kunden
grüne Symbolkachel – für das, was der Betrieb dagegen tut
dieselben Punkte mit Foto statt Symbol
schmale Zeile mit Eckdaten unter dem Aufmacher
Kennzahlen nebeneinander
ein Satz, hervorgehoben
mehrere Kundenstimmen – nur echte!
Überschrift links, Fragen rechts – Plus dreht sich zum Kreuz
Bilder als Raster, versetzt oder eng
Abschluss mit dem nächsten Schritt

Abläufe

nummerierter Ablauf, form='reihe' oder 'liste'
zeitliche Folge, senkrecht, abwechselnd oder waagerecht

Der Unterschied: Schritte beschreiben etwas, das jemand durchläuft – vom Anruf bis zum Protokoll. DerZeitstrahl beschreibt eine Folge in der Zeit, etwa die Geschichte des Betriebs. Bei beiden wächst die Linie beim Scrollen mit und zeigt die Richtung.

Menschen und Kontakt

wer im Betrieb arbeitet, mit Bild und Kontakt
Kontaktangaben aus den Firmendaten
Anschrift, Zeiten, Route – Landkarte nur auf Wunsch
Erreichbarkeit und Weg zum Formular

Landkarte und Terminkalender sind abgeschaltet

Beides lädt von einem fremden Server und überträgt dabei die IP-Adresse jedes Besuchers – bevor irgendjemand etwas angeklickt hat. Das braucht eine Einwilligung, und eine Einwilligung braucht ein Banner auf der ganzen Website.

Ohne Einbettung zeigen beide Sektionen Anschrift, Zeiten, Telefon und den Weg zum Formular. Der Knopf „Route planen" ist ein ganz normaler Link: Er überträgt nichts, solange niemand ihn anklickt. Für die meisten Betriebe reicht das.

Wer die Karte trotzdem will, findet die fünf nötigen Schritte im Kopf von SektionKarte.astro. Wird einer vergessen, bricht der Bau ab und sagt, welcher.

Zeichen

Zertifikate, Innungen, Hersteller – ruhig
dieselben Zeichen als laufendes Band

Hintergründe

Fast jede Sektion nimmt die Eigenschaft grund. Damit heben sich Abschnitte voneinander ab, ohne dass man Farben von Hand setzt.

Normaler Hintergrund
Leicht abgesetzt
Dunkel, heller Text
In der Hauptfarbe

So sieht eine Seite damit aus

<HeroBild
  titel="Wallbox-Montage"
  text="Wir prüfen den Anschluss und melden beim Netzbetreiber an."
  bild="/medien/wallbox.webp"
  bildAlt="Wallbox an einer Garagenwand"
  bildSeite="rechts"
/>

<SektionSchritte titel="So läuft es ab" schritte={schritte} grund="hell" />

<SektionFragen titel="Häufige Fragen" fragen={fragen} />

<SektionAufruf
  titel="Wallbox geplant?"
  schaltflaecheText="Anfrage schreiben"
  schaltflaecheZiel="/kontakt/"
/>

Alle Eigenschaften stehen im Kopf der jeweiligen Datei, mit Erklärung. Claude kennt sie – es genügt zu sagen, was auf die Seite soll.

Helfer

Kleine Klassen, die genau eine Sache tun. Sie stehen in der Kaskade zuletzt und dürfen deshalb überschreiben.

immer ausgeblendet
ab 991 Pixel Breite abwärts ausgeblendet
ab 767 Pixel Breite abwärts ausgeblendet
schneidet Überstehendes ab
Scrollbalken bei Bedarf
waagerecht scrollen, etwa bei Tabellen
Klicks gehen hindurch
auch: z-base, z-sticky, z-overlay
übernimmt die Farbe vom Elternelement
übernimmt die Größe vom Elternelement
volle Breite
ein einzelnes Kind an den Anfang setzen
wird vorgelesen, aber nicht angezeigt

Icons

Icons werden als Inline-SVG eingebunden, damit sie die Textfarbe übernehmen und keine zusätzliche Anfrage auslösen.

26 Icons vorhanden. Ein Klick kopiert den fertigen Aufruf.

Größen

Farbe

Ein Icon übernimmt immer die Textfarbe seiner Umgebung. Man färbt es also nicht selbst ein, sondern setzt eine Textfarbe auf das Elternelement.

erbt die Textfarbe
erbt die Textfarbe

Barrierefreiheit

schmückend, wird nicht vorgelesen
steht allein, muss vorgelesen werden

Ein kaputtes Icon sieht man nicht am Code

Ein SVG mit einem Fehler öffnet sich, lädt und meldet nichts – es zeichnet nur etwas anderes. Genau das ist hier einmal passiert: Dem Briefsymbol fehlten am Umschlag die Angaben für Breite und Höhe. Übrig blieb die Klappe, und die sah aus wie ein Haken – neben jeder E-Mail-Adresse der Website.

npm run icon-check prüft seitdem jedes Icon: fehlende Maße, Verweise ins Leere, feste Farben, leere Dateien. Der Befehl läuft bei npm run pruefen mit.

Ein neues Icon holen

Icons werden einzeln geholt, nicht als ganze Bibliothek. Den Original-Namen findet man auf der Website der jeweiligen Bibliothek.

npm run icon -- lucide sun sonne

Vorhandene Icons stammen aus: Lucide (ISC), Simple Icons (CC0-1.0). Die vollständigen Lizenzangaben stehen in DRITTANBIETER-LIZENZEN.md.

Markenlogos

Die Zeichen sozialer Netzwerke liegen getrennt insrc/icons/marken/ und werden über eine eigene Komponente eingebunden. Die Trennung ist Absicht, nicht Ordnungsliebe.

Markenrecht gilt unabhängig von der Lizenz der Bilddatei.Die Dateien stehen unter CC0, das Zeichen selbst bleibt die eingetragene Marke seines Inhabers. Erlaubt ist der Hinweis auf das eigene Profil bei diesem Dienst. Nicht erlaubt ist alles, was nach Partnerschaft oder Empfehlung aussieht – und jede Veränderung des Logos. Einzelheiten insrc/icons/marken/LIESMICH.md.

Radien, Schatten und Icon-Größen

Auch Ecken, Schatten und Icon-Größen sind festgelegte Werte. Wer hier eigene Zahlen einsetzt, bricht die Einheitlichkeit.

Eckenradien

Die Werte werden beim Öffnen der Seite geladen.

Drei Stufen, jede doppelt so groß wie die vorige: 2, 4 und 8 Pixel. Angegeben in rem, damit die Rundung mitwächst, wenn jemand im Browser die Schrift größer stellt.

Diese Werte darfst Du ändern – dafür stehen sie invariables.css. Was Du nicht tun solltest: einzelnen Bausteinen eigene Werte geben. Die Rundung ist eines der Dinge, an denen man einen einheitlich gestalteten Auftritt erkennt.

Runde Ecken ineinander: Sitzt ein runder Kasten in einem runden Kasten, wäre der äußere Radius eigentlich der innereplus der Innenabstand – sonst wirkt die äußere Ecke enger als die innere. Bei 8 Pixeln sieht das aber niemand; die Regel greift erst ab etwa 20 Pixeln. Im Kit gibt es deshalb keine Stelle, die so rechnet. Wer die Radien deutlich vergrößert, sollte daran denken.

Schatten

Die Werte werden beim Öffnen der Seite geladen.

Alle drei sind weich und weit gestreut: kleine Deckkraft, großer Weichzeichner. Ein harter, enger Schatten sieht nach aufgeklebt aus – das ist der häufigste Grund, warum eine Oberfläche billig wirkt, ohne dass man sagen kann, woran es liegt. Wer einen Schatten braucht, nimmt einen von hier und erfindet keinen neuen.

Icon-Größen

Die Werte werden beim Öffnen der Seite geladen.

Schriftgrößen als Werte

Die Werte werden beim Öffnen der Seite geladen.

Weitere Werte

Die Werte werden beim Öffnen der Seite geladen.

Die Werte werden beim Öffnen der Seite geladen.

Die Werte werden beim Öffnen der Seite geladen.

Die Werte werden beim Öffnen der Seite geladen.

Die Werte werden beim Öffnen der Seite geladen.

Die Werte werden beim Öffnen der Seite geladen.

Die Werte werden beim Öffnen der Seite geladen.

Die Werte werden beim Öffnen der Seite geladen.

Die Werte werden beim Öffnen der Seite geladen.

Die Werte werden beim Öffnen der Seite geladen.

Die Werte werden beim Öffnen der Seite geladen.

Cookie-Einstellungen ändern