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
Textgrößen
Schriftstärken
Textfarben
Ausrichtung
linksbündig
zentriert
rechtsbündig
Sonderformen
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.
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
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
Seitenrand
Ü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
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
Raster mit fester Spaltenzahl
Reihen und Spalten
Maximalbreiten
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
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
Richtig
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.
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.
Etikett, Trennlinie, Hinweis
Diese Anzeige läuft in zwei Wochen ab.
Hier steht noch nichts. So darf die Seite nicht online gehen.
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
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
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
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
Abläufe
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
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
Hintergründe
Fast jede Sektion nimmt die Eigenschaft grund. Damit heben sich Abschnitte voneinander ab, ohne dass man Farben von Hand setzt.
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.
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.
Barrierefreiheit
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 sonneVorhandene 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.