Marke & Bausteine
Design System
Stimme, Typografie, Farben, Komponenten und Markenbausteine des Elternvereins Gildehaus — gesammelt an einem Ort, damit sich neue Seiten und Materialien konsistent anfühlen.
Markenstimme
Die ausführliche Referenz mit Vorher/Nachher-Beispielen steht in docs/voice.md. Hier die Kurzfassung.
Anrede
Durchgehend Du — kein Sie, kein „man“, auch nicht in Formularen und Rechtshinweisen. Der Verein spricht als wir. Das Du ist das Du unter Eltern am Schultor, nicht das Du an Jugendliche.
An wen wir schreiben
An die Eltern. Die Kinder der Grund- und Hauptschule sind 6 bis 16 — aber wer hier beitritt, spendet oder abstimmt, sind die Eltern. Zweitpublikum sind Lehrkräfte und Schulleitung: der Ton muss auch für sie tragen.
Tonfall
Konkret vor werbend. Der Verein wirkt durch Dinge, die man anfassen kann — Hochbeete, Kopfhörer, Warnwesten, ein Zirkusprojekt. Ein Satz, der für jeden beliebigen Förderverein stimmen würde, ist noch nicht fertig. Keine Superlative, Ausrufezeichen sparsam.
Überschriften
Echte Überschriften statt eines durchlaufenden Fließtexts — ausdrücklicher Kundenwunsch. Überschriften sind ganze Aussagen, keine Etiketten: „Seit 1966 an der Seite unserer Schule“, nicht „Über uns“.
Calls to Action
Verb zuerst, konkret: „Mitglied werden“, „Dafür abstimmen“, „Wunsch einreichen“ — fast immer mit einem Pfeil nach rechts. Deutsche Rechtschreibung, keine englische Title Case: „Wunsch einreichen“, nicht „Wunsch Einreichen“.
Formulare und Fehler
Formulare erben die Stimme, aber nicht die Wärme. Fehlermeldungen sagen, was zu tun ist, und stehen neben ihrem Feld. Keine Entschuldigungen, kein „Ups“: „Diese IBAN stimmt nicht. Bitte prüfe, ob du dich vertippt hast.“ statt „Ungültige IBAN!“.
Zahlen & Emphase
Deutsches Zahlenformat („ca. 12.500 €“). Betonte Wörter stehen kursiv innerhalb fetter Headlines, z. B. „Seit 1966 an der Seite unserer Schule“. Domänenwörter bleiben deutsch: Förderstufe, Wunschglas, Satzung, Einmalspende, Spendenbescheinigung.
Gesetzte Formulierungen
- Der Anspruch
- „Eine gute Sache braucht gute Freunde“ — steht auf Banner und Roll-up und muss auf der Seite vorkommen.
- Der Verein, lang
- Elternverein der Grund- und Hauptschule Gildehaus e.V.
- Der Verein, kurz
- Elternverein Gildehaus e.V., im Fließtext auch „der Elternverein“.
- Die Schule
- die Grund- und Hauptschule Gildehaus, im Fließtext „unsere Schule“.
- Gründung
- 1966, ältester Förderverein der Grafschaft — die Zahl bleibt, sie ist echt und selten.
- Nie
- Nie „Realschule“, nie „RSB“, nie „Bad Bentheim“ — die Schule ist eine Grund- und Hauptschule, und sie steht in Gildehaus.
Typografie
Zwei Schriften. Pally für Überschriften und Zahlen, variabel 100–900, liegt lokal in assets/fonts/Pally-Variable.woff2 und wird per @font-face in index.css eingebunden. Inter für Fließtext, variabel mit echtem Kursivschnitt, kommt vorläufig per @import von Google — der Preconnect dafür steht in snippets/header.php.
Display
Pally
--font-display · font-display · --font-family-heading
lokal, variabel 100–900, kein Kursivschnitt
Text
Inter Inter
--font-sans · font-sans · --font-family-sans
Google Fonts, variabel 100–900, mit Kursivschnitt
Überschriften
h1 — --text-2xl, leading-none
Seit 1966 an der Seite unserer Schule
h2 — --text-xl, leading-tight
Ab 1 € im Monat bist du dabei
h3 — --text-lg, leading-normal
Das Wunschglas
h4 — --text-base, leading-tight
Mitgliederversammlung
.home-h2 — --text-xl, Gewicht 900, für Sektionsköpfe auf der Startseite
Die Schule
.text — Fließtextblock aus dem Panel: Zeilenhöhe, Listen, unterstrichene Links
Der Elternverein unterstützt die Schule bei der Verwirklichung vielfältiger Projekte. Jeder Euro kommt direkt den Schülerinnen und Schülern zugute.
Emphase — kursiv innerhalb einer fetten Headline. Pally hat keinen eigenen Kursivschnitt, die Neigung ist synthetisch: gut für ein, zwei Wörter, nicht für ganze Sätze.
Seit 1966 an der Seite unserer Schule
Achtung: Elementregeln schlagen Utilities
Die Regeln für h1–h4 stehen in index.css außerhalb jeder @layer; Tailwind-Utilities liegen in @layer utilities. Unlayered gewinnt gegen jede Layer-Regel — <h2 class="text-3xl"> bleibt also bei --text-xl. Wer eine andere Größe braucht, nimmt eine unlayered Klasse (.home-h2, .h2) oder ein Element ohne Elementregel (<p> mit role="heading" nur im Notfall).
Fluide Skala — wächst per clamp() vom Mobile- zum Desktop-Viewport. Vollständig --text-3xs bis --text-11xl in input.css.
E-Mails setzen anders
Die Vorlagen in snippets/emails/ laufen auf Piazzolla mit Georgia-Fallback statt auf Pally: Mailprogramme laden Webfonts unzuverlässig, und eine Serifenschrift hat überall einen brauchbaren Ersatz. Das ist die einzige gewollte Abweichung von der Seitentypografie — auf der Website kommt Piazzolla nicht vor.
Farben
Zwei Familien: eine kühle um die Markenfarbe, eine warme als Akzent. Fünf Farben sind vom Verein geliefert und stehen als Anker exakt auf ihrem Wert; Dark Brown ist die einzige hinzugefügte, weil Mustard eine Schriftfarbe braucht. Alle übrigen Stufen sind in OKLCH zwischen genau diesen Ankern interpoliert — gleichmäßige Abstände in wahrgenommener Helligkeit, dichter am hellen Ende, Buntheit mit Maximum bei der Markenfarbe. Kein Schritt erreicht Reinweiß oder Reinschwarz. Werte 1:1 aus assets/css/input.css.
Die Ankerfarben
D4EBF0evg-200
70C1D1evg-400
1F3D44evg-900
FFD84Asand-400
F8F0D0sand-100
3A2A14sand-900
Kühle Rampe — Ton ~212°
Anker auf 200 (Light Cyan), 400 (Sky Blue) und 900 (Dark Teal), dazwischen gleichmäßige Abstände in wahrgenommener Helligkeit, dichter am hellen Ende.
Warme Rampe — Ton ~94°
Anker auf 100 (Cornsilk), 400 (Mustard) und 900 (Dark Brown). Akzent, nicht zweite Markenfarbe: die hellen Stufen tragen ausschließlich dunkle Schrift. 500 ist der Hover des CTA in der Kopfleiste, 900 die Schrift darauf.
Rollen
Nur diese gehören in Templates. Die Zahlenstufen darüber sind die Rohwerte. Links lesen ihre Farbe über --link-color, das auf evg-strong zeigt.
evg-surface
kühl getönte Fläche auf weißen Karten — nicht der Seitengrund, der ist paper
evg-soft
ruhige Füllung und Hover — auf weißen Karten, nicht auf dem Papiergrund
evg-line
Haarlinien und Trenner — Light Cyan
evg-muted
gedämpfte Dekoration, helle Schrift auf Dunkel
evg-base
DIE Markenfarbe (Sky Blue) — dekorativ, nie Text (2,1:1 auf Weiß)
evg-vivid
kräftige Dekoration
evg-mid
Rahmen, die eine Komponente sichtbar machen (3,9:1)
evg-strong
Buttons, Links, Icons (5,6:1 — Textgrenze)
evg-deep
Hover und Aktiv (8,2:1)
evg-text
Überschriften (11,6:1) — Dark Teal
evg-ink
tiefste Stufe (14,9:1) — dunkelste Schriftfarbe, für Hervorhebung im Fließtext
evg-accent-surface
blasseste warme Fläche — das warme Gegenstück zu surface. Für Flächen, die direkt auf dem Papiergrund liegen; eine kühle Fläche liest sich dort als Fremdkörper.
evg-accent
warmer Akzent (Mustard) — Fläche, nie Text (1,4:1). Trägt den Haupt-Button und den CTA in der Leiste.
evg-accent-soft
warme Fläche (Cornsilk) — trägt evg-text mit 10,2:1
evg-accent-text
Dark Brown — die einzige Schriftfarbe auf Mustard (10,0:1). Bewusst warm: ein kühles Dunkel kippt auf Gelb ins Grünliche.
Neutrale
Der Seitengrund ist nicht weiß, sondern Papier — --color-paper, .bg-paper. Der Grund dafür sind die Aquarelle: sie sind auf weißes Papier gemalt und standen auf Reinweiß als hellere Platte auf der Seite. Auf dem Papierton gehen sie per mix-blend-mode: multiply darin auf, ihr ausgefranster Rand wird wieder zum Rand des Bildes statt zur Kante einer Bilddatei. Weiß bleibt dem vorbehalten, was auf dem Papier liegt: Karten (.bg-fullwhite), Formulare, die Glasleiste.
Alle drei Neutralen tragen denselben Ton wie die warme Familie (95,5°) mit einem Bruchteil ihrer Buntheit. Kühle Grautöne wie das frühere #f4f4f4 fielen neben dem warmen Grund sofort auf. --color-background ist der Token für getönte Flächen (.bg-background), nicht für die Seite. Die beiden nicht verwechseln: eine getönte Fläche auf getöntem Grund ist keine Fläche mehr.
#f0eeea — Seitengrund
#ffffff —
.bg-fullwhite#f5f4ef —
.bg-background#e8e6e0 — Rahmen, Trenner,
.text code#333333
#777777
Eine Tinte, vier Stufen
Fließtext, Beschriftungen und Hinweise laufen alle auf evg-text — abgestuft über die Deckkraft, nicht über eine zweite Farbe. Vorher standen hier Tailwinds gray-400 bis gray-900: ein kühles Blaugrau, das auf dem warmen Grund als eigene Farbfamilie auffiel. Die Prozentwerte sind auf dem Papiergrund gemessen, dem ungünstigsten Untergrund — auf Weiß liegt jede Stufe höher. /70 gibt es bewusst nicht: mit 4,37:1 auf Papier fiele es unter AA.
Der einzige Rest Farbe: Fehler
Formularfehler bleiben rot. Das ist die einzige Farbe außerhalb der beiden Familien und das einzige Signal, das ohne Erklärung als „hier stimmt etwas nicht“ gelesen wird — eine türkise Fehlermeldung auf türkiser Oberfläche wäre keine Meldung mehr. Erfolgsmeldungen brauchen das nicht und laufen in Türkis. Das Rot kommt aus Tailwinds Standardpalette (red-100 Fläche, red-400 Rahmen, red-700 Schrift, red-500 für den Rahmen eines beanstandeten Feldes) — es ist bewusst nicht in die Palette aufgenommen, damit es nicht dekorativ verwendet wird.
Abstände, Radien & Schatten
Eckenradien — drei Stufen: Formularfelder unten, Auswahlkarten und Modals darüber, Bilder und große Flächen ganz oben. Buttons stehen außerhalb dieser Reihe: sie sind vollrunde Pillen. Wo der Browser corner-shape kennt, werden daraus Squircles.
--radius-fieldFelder, Selects
--radius-cardAuswahlkarten, Modals
--radius-mediaBilder, Projektkarten, Hero
Container
Icon-Kacheln
Buttons, Chips, Abzeichen
Squircle & Fallback — ein Squircle wirkt bei gleichem Radius enger als eine runde Ecke. Deshalb ist der Fallback bewusst kleiner gesetzt: Beide Formen haben optisch dasselbe Gewicht.
12px rund
20px
Dein Browser unterstützt corner-shape — die Token-Kacheln oben sind also echte Squircles: 20px, 24px und 32px. Die Umschaltung passiert per @supports; ohne Unterstützung fallen die drei Token auf 12px, 16px und 20px mit runden Ecken zurück.
Dein Browser unterstützt corner-shape noch nicht — du siehst überall den runden Fallback: 12px, 16px und 20px. In unterstützenden Browsern werden daraus 20px, 24px und 32px als Squircle.
Elevation — zwei Reihen. Die drei --shadow-elevation-* aus index.css sind gestapelte Ambient-Schatten für Karten und Leisten; die beiden --shadow-* aus dem Theme-Block heben Fotos an. --shadow-half ist die halbe Auslenkung von --shadow-max, für Bilder, die nicht das Hauptmotiv sind.
Abstandsskala — 0.25rem-Basis, u. a. für Padding & Gaps; Sektionen bekommen großzügige ~6rem vertikal
Formulare & Rückmeldung
Eine Klasse für alle Textfelder, Textareas und Selects: .input-field — Mitgliedsantrag, Wunschglas und Einmalspende teilen sie sich. Der Ruhezustand ist bewusst leise — 1px Haarlinie, großzügiges Polster, kein Kasten. Die Linie ist getönte Tinte und die Füllung durchscheinendes Weiß, weil dieselbe Klasse auf Weiß und auf dem Cyan-Panel der Einmalspende sitzt.
Zustände
Diese IBAN stimmt nicht. Bitte prüfe, ob du dich vertippt hast.
Der Fehler steht in aria-invalid, nicht in einer Klasse
Die rote Rahmenfarbe hängt an .input-field[aria-invalid="true"]. Die Auszeichnung, die der Screenreader ohnehin braucht, reicht damit auch fürs Auge — und sie kann im Template an keinem Feld vergessen werden. Die Regel steht absichtlich nach den :focus-Regeln: gleiche Spezifität, also entscheidet die Reihenfolge, und ein Feld mit Fehler bleibt auch im Fokus rot. Die Meldung trägt id="<feld>-fehler" und wird per aria-describedby verknüpft.
Auswahlkacheln — die Förderstufen
Das Radio ist sr-only, sichtbar ist die Kachel; peer-checked: übernimmt die Anzeige. Zwei mal zwei auf jeder Breite — vier nebeneinander gingen in der Formularspalte nur mit Worttrennung. Keine Stufe ist vorgewählt: eine Vorauswahl macht aus der Entscheidung, um die es hier geht, etwas, das man überspringt.
Schrittabzeichen
Die vier Abschnitte des Mitgliedsantrags tragen eine Nummer, damit die Länge absehbar ist. Die Scheibe ist Dekoration (aria-hidden); für Screenreader steht davor <span class="sr-only">Schritt 1 von 3: </span>.
Schritt 1 von 4: Deine Förderstufe
Schritt 2 von 4: Deine Daten
Schritt 3 von 4: Lastschrift
Schritt 4 von 4: Deine Zustimmung
Zustimmungskasten
Pflichtzustimmungen stehen im eigenen Kasten, nicht zwischen den Feldern: bg-evg-soft border-2 border-evg-mid rounded-card. Er trägt die stärkste Umrandung des ganzen Formulars — stärker als die Auswahlkacheln (1px, evg-text/25) und die Eingabefelder. Die Rangfolge ist Absicht: hier hakt jemand etwas rechtlich Bindendes ab. evg-mid ist dafür nicht frei gewählt, sondern genau die Rolle, die die Palette mit „Rahmen, die eine Komponente sichtbar machen“ beschreibt (3,9:1 auf Weiß) — dieselbe Kontur wie die Erfolgsmeldung darunter, nur zwei statt einem Pixel. Kühl darf der Kasten sein, weil er auf einer weißen Seitenkarte liegt und nicht auf dem Papiergrund.
Sammelmeldungen
Ohne Skript setzt der Browser nach dem Absenden oben an, und eine Meldung neben dem dritten Feld sieht dort niemand. Die Sammelmeldung steht deshalb über dem Formular, trägt role="alert" und tabindex="-1", und jeder Punkt verlinkt sein Feld.
Das hat noch nicht geklappt.
Danke — deine Anmeldung ist angekommen.
Du bekommst gleich eine Bestätigung per Mail.
Bausteine
Muster, die auf mehr als einer Seite vorkommen und deshalb gleich aussehen müssen. Was hier nicht steht, ist Einzelfall und darf einer bleiben.
Kicker
Eine Zeile Herkunft oder Kontext über der Überschrift. Immer evg-strong auf Weiß (5,6:1), immer versal, immer ohne Satzzeichen am Ende. Das Mittelpunkt-Trennzeichen (·) statt eines Kommas, damit die Zeile als Etikett und nicht als Satz gelesen wird.
Seit 1966 · ältester Förderverein der Grafschaft
text-2xs font-semibold uppercase tracking-wide text-evg-strong — über Seitenüberschriften
Kassenwartin
text-2xs font-medium uppercase tracking-widest text-evg-strong — Rollen im Vorstand, weiter gesperrt weil kürzer
Seitenkarte
Der Rahmen von /ideen, /mitglied-werden und den Projektseiten: bg-fullwhite, Breite max-w-6xl, und die Rundung erst ab md — auf schmalen Fenstern läuft die Karte randlos über die volle Breite, wo eine Rundung nur den Rand anknabbern würde. Seit der Seitengrund paper trägt, hat die Karte wieder einen Tonwertabstand zum Grund — auf Weiß hatte sie keinen und hing allein an md:border. Die Kontur bleibt trotzdem: der Abstand ist mit 1,16:1 ein Hauch, keine Kante.
Das Wunschglas · ohne Anmeldung, auch anonym
Wofür sollen wir als nächstes sammeln?
Drei Stimmen hast du. Verteil sie auf die Projekte, die dir am wichtigsten sind.
Abstimmen im Wunschglas
Alle drei Zustände — offen, abgestimmt, Stimmen aufgebraucht — stehen serverseitig im Markup und werden per data-state in CSS umgeschaltet. Das Skript baut nie Markup, es kippt nur ein Attribut; genau das hält Karte, Modal und Projektseite davon ab, auseinanderzulaufen. Die Rücknahme ist immer sichtbar und nicht erst beim Hover: Touch-Geräte haben keinen Hover, und das Telefon ist, wo die meisten abstimmen.
Karte im Inhalt
Die kleinere Schwester der Seitenkarte, für Listen innerhalb einer Seite — Aufklappfragen, Förderstufen, der Abbinder unter dem FAQ: bg-fullwhite border-2 border-paper-line rounded-card. Weiß als Fläche, warme Neutrale als Kontur. Getönte Karten gibt es hier bewusst nicht: eine kühle Fläche direkt auf dem Papiergrund liest sich als Fremdkörper, eine warme nimmt dem gelben Knopf darin die Abhebung. Die Farbe im Block ist der Knopf, sonst nichts.
Es sind noch Fragen offen?
Sollte etwas fehlen, schreib uns einfach, wir helfen gerne weiter!
Himmelband
.page-sky — das Aquarell, das auf allen Unterseiten von der Oberkante des Dokuments über die volle Breite läuft und die Kopfleiste trägt. Auf der Startseite nicht: dort liegt die Leiste im Keyvisual. Es ist Textur, kein zweites Keyvisual — deshalb Wolken statt Motiv, deshalb ausgeblendet statt abgeschnitten.
Drei Dinge halten es zusammen: mix-blend-mode: multiply, damit das weiße Papier der Vorlage im Papiergrund aufgeht — dasselbe Verfahren wie beim Keyvisual; z-index: -1, weil ein positioniertes Element mit z-index: 0 nach der Malreihenfolge über dem späteren Inhalt landet und die Überschrift verdeckt hätte; und ein Maskenverlauf, dessen letzter Halt eine Länge ist und nicht ein Prozentwert — er muss genau dort bei null sein, wo der Inhalt beginnt, und in Prozent liefe dieser Punkt bei jeder Fensterbreite woanders hin. Unter prefers-contrast: more fällt das Band ganz weg.
Glasleiste
Die Kopfleiste schwebt über allem und ist deshalb Glas: backdrop-filter: blur(16px) saturate(150%) auf 85 % Weiß, gescrollt 92 %. Das Nachsättigen gehört dazu — reines Weichzeichnen wäscht die Farben dahinter aus und macht aus Glas Milch. Die Deckkraft ist zweimal gestiegen: erst von 55 % auf 68 %, weil weiße Schrift über den dunklen Abschnitten unter 4,5:1 fiel, dann von 68 % auf 85 %, weil das Himmelband Struktur hinter die Wortmarke legte. Der zweite Fall ist der lehrreiche — das Kontrastverhältnis war die ganze Zeit einwandfrei, der helle Teil des Lockups verlor trotzdem seine Form, weil hinter jedem Buchstaben ein anderer Blauton stand. Gegen gemusterten Untergrund hilft keine Rechnung, nur Deckkraft. Unter 65 % darf sie nie fallen; prefers-reduced-transparency und fehlendes backdrop-filter machen die Fläche deckend.
Meta-Zeile
p.meta — 13px, evg-strong, für Datumsangaben und die Fußzeile.
Seitenbreiten
Die Breite steht als Tailwind-Utility am Wrapper, nicht in einer eigenen Klasse: max-w-6xl mx-auto px-4 md:px-12 für Formular- und Projektseiten, max-w-4xl für reine Textseiten. Das Polster wächst am Breakpoint mit, die Mitte bleibt die Mitte.
Logo
Sechs Dateien in assets/images/logo/, eingebunden über snippet('logo', ['variant' => …]). Das Snippet schneidet beim Einbetten width und height aus dem <svg>, damit CSS die Box bestimmt — und die Grafik wird von links angeschnitten statt skaliert. Genau das macht die Kopfleiste responsiv: Box verengen, und der Schriftzug fällt weg, das Signet bleibt in voller Größe. Kein zweites Markup, keine zweite Datei. Die Steckbriefe unten zeigen jede Datei dagegen vollständig und unbeschnitten.
lockup-full1197 × 127 · in der Kopfleiste
Farben fest im Pfad
lockup797 × 127 · breite Flächen, Briefkopf
lockup-compact795 × 127 · engere Flächen
stacked645 × 222 · quadratische Flächen
mark127 × 127 · Favicon, Avatar, App-Symbol
seal226 × 226 · Urkunden, Aufkleber, Stempel
Farben fest im Pfad
Farben des Logos
Das Signet behält sein eigenes Türkis, #6EB1BE — es liegt neben der Markenfarbe, ist aber nicht dieselbe und wird deshalb nicht durch evg-base ersetzt. Der Schriftzug läuft dagegen auf der Palette: #6EB1BE hält unter Text nur 2,4:1 — als Form lesbar, als Wort ausgewaschen.
--logo-mark
Signet — eigenes Türkis, nicht evg-base
--logo-word
Schriftzug „Elternverein“ — Dark Teal, 11,6:1
--logo-sub
Unterzeile „Freunde und Förderer e.V.“
Zwei Dateien hören nicht auf die Token
Vier der sechs Dateien tragen einen eigenen <style>-Block, der --logo-mark, --logo-word und --logo-sub liest — eine Datei bedient damit helle und dunkle Flächen. lockup-full.svg und seal.svg haben ihn nicht: dort stehen die Farben als fill in den Pfaden. Beide sind auf einem dunklen Grund also nicht umfärbbar, und lockup-full steht in der Kopfleiste. Wer die Leiste dunkel machen will, muss die Datei vorher auf die Token umstellen.
Icons
Outline-Icons im Tabler-Stil, 24×24-Raster, stroke: currentColor, Strichstärke 1.5–2 (2.5 in der Button-Scheibe, weil sie auf 18px Zeichenfläche schrumpft). Immer inline als <svg> im Markup: es gibt keine Icon-Bibliothek und keinen Sprite. Ein <svg> ohne eigene Maßangaben füllt seine Box — die Größe steht also am Container (w-8 h-8), nicht doppelt im Markup und im CSS.
Dekoration oder Bedeutung — nie beides offen lassen
Ein Icon neben einem Wort ist Dekoration und bekommt aria-hidden="true". Ein Icon statt eines Wortes braucht einen Namen am Bedienelement (aria-label), nicht am <svg>. Farbe allein trägt nie eine Bedeutung: evg-base und evg-accent liegen unter 3:1 und sind für Icons keine zulässige Strichfarbe — dafür ist evg-mid die Untergrenze, für Icons neben Text evg-strong.