Nutzung: Diese Datei ist der Brand Guide
Teilbare, in sich geschlossene Referenz — die Logos sind eingebettet, die Datei funktioniert eigenständig und offline. Wer TFCZ-Material erstellt (Mensch oder KI), hält sich an diese Datei. Quelle der Wahrheit bleibt CLAUDE.md im TFCZ-Projekt; bei Widerspruch gilt CLAUDE.md.
So nutzt du die Datei mit Claude (oder einem anderen Tool)
Datei mitgeben und schreiben: „Halte dich strikt an den TFCZ Brand Guide in dieser Datei — Farben, Logos, Typografie, Bausteine und alle Regeln." Alle Werte sind kopierbar (Klick auf Farben/Gradients), alle Bausteine sind live und ihr Code steht in dieser Datei. Jedes neue Design muss die Checkliste in Sektion 19 bestehen.
Blau oben · Gold unten
Die Brand-Line ist DAS Markenzeichen. Print/Social = harter Schnitt, keine Verläufe. Screen-UI = Rahmen-Signatur an Fenstern & sticky Bars (blau #5ca7dc oben / gold #cda857 unten, ~3px am abgerundeten Container).
Gold ist knapp
Gold = Auswahl/Aktiv im UI und die zentrale Handlung der Seite: echte Conversion („Mitglied werden") oder Lead-Anfrage („Verfügbarkeit prüfen"). Nie Grossfläche, nie für Info-/Navigations-Buttons. So bleibt Gold wertvoll.
Dunkle, frosted Boxen
Cards, Fenster & Bausteine im Screen-UI immer als DarkNavy-Gradient, leicht transparent + backdrop-blur — nie helle Boxen.
Nunito Sans
Einzige Schrift der Marke. Im UI: 400 / 500 / 700 / 900. Fallback: moderne, geometrische Sans-Serif.
Öffentlich hell · intern dunkel
Öffentliche Seiten = Hellblau-Verlauf, ohne Dark-Mode-Umschalter. Login-geschützte Tools (POS, Livestudio, Cockpit …) = Navy.
Responsive, ohne Ausnahme
Breakpoints 640 / 1024 / 1400. Nie ein horizontaler Scrollbalken. Touch: dense but tappable (iPad-first).
Sprache
Deutsch (Schweiz), CHF, Du-Form — und nie gendern. Emotion & Vibe kommen vor der Information.
Ein Logo, klare Regeln
Nur Originaldateien, richtige Variante pro Hintergrund, Schutzzone respektieren — Details in Sektion 01b.
Strategie & Stimme
Das Fundament, aus dem alles Weitere folgt: wer wir sind, wofür wir stehen, wie wir klingen. Wer eine neue Seite, einen Post, eine Mail oder einen Flyer macht, startet hier — nicht bei der Farbe. Teil 2 (Design) macht es schön; dieser Teil macht es richtig und überall gleich. So läuft der Verein weiter, auch ohne Marketing-Spezialisten im Raum.
Positionierung
Der eine Satz, der uns einordnet und unterscheidet. Alles, was wir sagen, muss dazu passen.
Kategorie
Tischfussball-Verein in Zürich — Sportverein, Community und Erlebnisort in einem.
Für wen
Alle, die in Zürich Tischfussball erleben wollen — vom allerersten Mal an der Stange bis zur Weltspitze.
Anders als …
… eine Bar mit Töggelikasten (kein echter Sport) und anders als ein reiner Elite-Club (nicht für alle). Wir sind beides: nahbar wie ein Treffpunkt, ernsthaft wie eine Nati.
Warum glaubwürdig
100+ Mitglieder, WM-/SM-/Nati-/Bundesliga-Sieger im Verein, 10 Leonhart-Turniertische, Zürich Open mit YouTube-Stream — und seit über 30 Jahren am selben Ort.
Mission, Vision & Werte
Warum es uns gibt, wohin wir wollen, und die Werte, die jede Entscheidung tragen.
Mission — warum
Tischfussball in Zürich für alle zugänglich machen — und gleichzeitig Spitzensport auf Weltniveau fördern.
Vision — wohin
Zürichs lebendigste Tischfussball-Community und das sichtbare Aushängeschild des Schweizer Tischfussballs.
Werte
- Alle willkommen
- Offenheit ist wörtlich gemeint — jeder Level, jede Herkunft, am selben Tisch.
- Gemeinschaft
- Getragen von Ehrenamt und Herzblut; wir fangen jeden Neuen auf.
- Spielfreude
- Spass zuerst — der Rest kommt von selbst.
- Exzellenz
- Echter Wettkampf, Weltklasse-Können, ohne Angeberei.
- Beständigkeit
- Seit 1990 am selben Ort — Tradition als Vertrauensanker.
Markenpersönlichkeit & Archetyp
Wenn der TFCZ ein Mensch wäre — der Charakter, der in Text, Bild und Ton durchscheinen muss.
5 Eigenschaften
Wenn TFCZ eine Person wäre
Der Kollege, der dich am ersten Abend abholt, dir alles zeigt und dich zum Lachen bringt — und nebenbei Schweizermeister ist, ohne es an die grosse Glocke zu hängen.
Wie es klingt / aussieht
Du-Form, kurze warme Sätze, konkret. Visuell: Blau/Gold, dunkel & edel, echte Fotos, viel Bewegung.
Markenversprechen & Geschichte
Was wir jedem versprechen — und das Narrativ, das wir immer wieder erzählen. Fertige Textbausteine zum Übernehmen.
Boilerplate · 1 Satz
Der Tischfussball Club Zürich ist der grösste Profi-Tischfussballverein der Schweiz — seit 1990 in Wipkingen, wo Anfänger und Weltmeister am selben Tisch spielen.
Boilerplate · 3 Sätze
Der TFCZ ist der grösste Profi-Tischfussballverein der Schweiz, seit 1990 in Wipkingen zuhause. Bei uns spielen Anfänger und Weltmeister am selben Tisch — getragen von einer Community, die jeden auffängt. Offenes Training, Turniere, Käsekick und Firmenevents: bei uns ist jeder willkommen.
Boilerplate · 5 Sätze
Der Tischfussball Club Zürich (TFCZ) ist der grösste Profi-Tischfussballverein der Schweiz. Seit 1990 sind wir in derselben Halle in Wipkingen zuhause. Auf 10 Leonhart-Turniertischen trainieren Nationalspieler neben Leuten, die zum ersten Mal an der Stange stehen. Wir tragen Turniere aus, streamen das Zürich Open auf YouTube — und feiern beim Käsekick genauso ausgelassen. Komm vorbei: der erste Abend ist gratis.
Zielgruppen & Ansprache
Für wen wir schreiben — mit Bedürfnis, Kanal und passendem Handlungsaufruf (CTA).
Einsteiger / Neugierige
Bedürfnis: Unverbindlich reinschnuppern, keine Hürde. Ton: warm, einladend. Kanal: Instagram, Website. CTA: „Erster Abend gratis".
Aktive Mitglieder
Bedürfnis: Termine, spontane Updates, dazugehören. Ton: kurz, direkt, menschlich. Kanal: WhatsApp. CTA: „Komm Dienstag".
Turnier- / Pro-Spieler
Bedürfnis: Ranglisten, Formate, Ernst. Ton: energetisch, sport-fokussiert. Kanal: Website, STF/Coral. CTA: „Jetzt anmelden".
Firmen / HR
Bedürfnis: Teamevent, das hängen bleibt, ohne Aufwand. Ton: professionell-herzlich, lösungsorientiert. Kanal: Website, E-Mail. CTA: „Firmenevent anfragen".
Familien / Kinder
Bedürfnis: Betreute, sichere Freizeit mit Spass. Ton: leicht, herzlich. Kanal: Website, Instagram. CTA: „Kindertraining & Ferienplausch".
Tone of Voice
Vier Eigenschaften bestimmen jeden Text. Immer Du-Form, sportlich-herzlich, keine Corporate-Sprache. Je Kontext etwas anders (Fun locker, Turnier energetisch, Firma professionell-herzlich) — aber immer diese vier.
1 · Einladend
2 · Echt
3 · Spielfreudig
4 · Stolz & nahbar
Botschaften & Messaging
Vier Kernbotschaften (Pillars). Jede Seite/jeder Post trägt eine davon klar — mit Beleg, damit es glaubwürdig bleibt.
1 · Alle willkommen
Botschaft: Anfänger bis Profi, am selben Tisch. Beleg: offenes Training, Schnuppern gratis, Community fängt auf. Wofür: Home, Mitglied-werden, Insta-Reels.
2 · Echter Spitzensport
Botschaft: Weltklasse spielt hier. Beleg: WM/SM/Nati, Zürich Open, YouTube-Stream, 10 Leonhart-Tische. Wofür: Turnier-Seiten, Stream, Presse.
3 · Community & Tradition
Botschaft: Seit 1990, getragen von Menschen. Beleg: dieselbe Halle in Wipkingen, Ehrenamt, Herzblut. Wofür: Über uns, Geschichte, Gönner/Sponsoring.
4 · Erlebnis & Spass
Botschaft: Bei uns wird gelacht. Beleg: Käsekick, Mittwochs Crazy DYP, Firmenevents. Wofür: Events, Firmenevent-Landingpage, Social.
Sprache & Lexikon
Verbindliche Sprachregeln und unser Wortschatz — damit alles wie aus einem Guss klingt.
Regeln
- Sprache
- Deutsch (Schweiz), Du-Form. ss statt ß, CHF, Apostroph bei Tausendern (1'000).
- Nie gendern
- Kein :in / *innen / Binnen-I, keine Doppelnennungen. Generisches Maskulinum oder neutral („alle", „Leute", „das Team").
- Satzbau
- Kurze Sätze, aktiv, konkret. Emotion vor Information — der Vibe muss zuerst rüberkommen.
- Fakten
- Nie erfinden — Zahlen/Adressen/Preise immer aus dem Steckbrief (Abschnitt I) bzw. Vault
verein.md.
Fakten & Steckbrief
Die Datenbasis für jede Seite. Hier stehen die belastbaren Fakten — nichts erfinden, im Zweifel aus dem Vault verein.md prüfen.
| Verein | Tischfussball Club Zürich (TFCZ) |
| Ort | Landenbergstrasse 10, 8037 Zürich (Wipkingen) — seit 1990 dieselbe Halle |
| Grösse | Grösster Profi-Tischfussballverein der Schweiz · 100+ Mitglieder · 20+ pro Abend |
| Tische | Leonhart-Verein: 10 Leonhart + 1 Ullrich permanent; weitere (Garlando, Bonzini, Tornado, Roberto) je Anlass |
| Öffnung | Di ab 18:00 (Offenes Training) · Mi ab 19:00 (Crazy DYP, Start 20:15) · Events gemäss Ausschreibung |
| Training mit Philipp | Di 18:45–20:15, 14 Einheiten/Semester · gratis für Mitglieder, CHF 100 für Nicht-Mitglieder |
| Mitgliedschaft | Schnuppern gratis (danach CHF 5/Eintritt) · Aktiv CHF 200/Jahr · Key Player CHF 250 + Schlüssel · Gönner auf Anfrage |
| Kanäle | Instagram @tischfussballclubzuerich · YouTube @tischfussballclubzuerich · WhatsApp (intern) · tfcz.ch |
| Kontakt | info@tfcz.ch |
| Sport-Kontext | WM/SM/Nati/Bundesliga-Sieger im Verein · Zürich Open (Heim-Turnier) · Pro Turniere STF Regio/STRT · Elite = ITSF |
Interne GV-/Finanzzahlen (Umsatz, Zahlungsarten) sind nicht öffentlich — nur Teilnahmezahlen kommunizieren.
Playbook: neue Seite in 7 Schritten
Der rote Faden, der Teil 1 (Marke) und Teil 2 (Design) verbindet — damit jeder ohne Spezialist eine markenkonforme Landingpage bauen kann.
- Ziel & Zielgruppe wählen (Abschnitt E) — für wen ist die Seite, was soll sie auslösen?
- Kernbotschaft festlegen (Abschnitt G) — genau eine der vier Pillars trägt die Seite.
- Ton wählen (Abschnitt F) — passend zum Kontext, immer Du-Form, nie gendern.
- Fakten einsetzen (Abschnitt I) — Zahlen/Adresse/Preise übernehmen, nichts erfinden.
- Textbausteine nutzen (Abschnitt D) — Claim, Boilerplate, Signatur-CTA.
- Design bauen (Teil 2) — Farben, Typo, Signatur, Buttons, Nav/Burger, Karten, Hintergrund-Modul.
- Checkliste prüfen (Abschnitt 19) — dann ausliefern.
Immer gültig (Pflicht)
Visuelles System
Die Bausteine, mit denen die Marke sichtbar wird — Farben, Typografie, Komponenten, Bewegung. Alles copy-fertig und markenkonform.
Farben & Gradients
Kanonische Palette. Primär + Neutral, Sekundär-Akzente (max. ~5 % Fläche) und die vier erlaubten 2-Farb-Gradients. Klicken kopiert.
| Farbe | HEX | RGB | CMYK | Pantone | Einsatz |
|---|---|---|---|---|---|
| TFCZ Blau (Logo) | #4489c7 | 68 · 137 · 199 | 73 · 38 · 0 · 0 | — | Primärfarbe, Logo-Blau, Icon-Ringe, Aktions-Buttons |
| Blau Primär (hell) | #5ca7dc | 92 · 167 · 220 | — | — | Brand-Line oben, Kategorie „Fun", helle Akzente |
| Blau Sekundär 2 | #005a94 | 0 · 90 · 148 | — | — | Kategorie „Pro", dunkle Blauflächen |
| Navy | #0d273d | 13 · 39 · 61 | — | — | Dunkler Grund (intern), Text auf Gold/Sand |
| TFCZ Gold | #cda857 | 205 · 168 · 87 | 21 · 32 · 78 · 0 | 7563 C | Brand-Line unten, Auswahl/Aktiv, Conversion- und Lead-CTA, Elite-Akzent |
| Gold hell | #e9c475 | 233 · 196 · 117 | — | — | Gold-Hover, goldene Texte auf dunklem Grund |
| TFCZ Neutral (Sand) | #e6e3da | 230 · 227 · 218 | 9 · 7 · 12 · 0 | — | Helle Flächen NUR in Print/Social — nie als Screen-Box |
- Blau und Gold arbeiten immer zusammen — sie sind das Farb-Duo der Marke
- Sekundär-Akzente (Grün / Orange / Rot) nur zusammen mit den Primärfarben im selben Kontext, nie allein — und max. ~5% der Fläche
- Schwarz & Weiss primär für Typografie; sonst Primärfarben oder Neutral
- Gradients: max. 2 Farben, nur die vier gezeigten Kombinationen, linear oder radial, primär für Hintergründe — nie im Logo, nie in Print-/Social-Brand-Lines
- Farbgenauigkeit vor Auslieferung gegen diese Tabelle prüfen — Abweichungen sind ein bekannter Reibungspunkt
- Kontrast (WCAG AA): Navy-Text auf Gold und Gold-Text auf Navy sind barrierefrei (je 6,8:1), helle Schrift auf Navy erst recht (13,8:1). Kein abgedunkeltes oder transparentes Grau als Text auf Gold — das rutscht unter die 4,5:1-Marke (ein
opacityauf Navy-Text ergab nur 4,28:1). Kleintext auf Gold immer voll deckendes Navy.
Logos & Verwendung
Verbindliche Logo-Regeln nach TFCZ Brand Manual 2026. Nur die Originaldateien verwenden — das Logo nie nachbauen, editieren, umfärben oder verzerren. Alle Vorschauen sind in dieser Datei eingebettet.










Freiraum-Regeln
1Horizontal: Freiraum = Höhe des Z aus der Wortmarke.
2Vertikal: Freiraum = Breite des Z.
3Symbol solo: Freiraum = Abstand zwischen Schildrand und Figur (linke Seite).
Innerhalb der Schutzzone stehen keine Texte, Bilder oder fremden Logos. Fürs Web gilt zusätzlich: Kopf-Logo-Höhe 38.8px (Mobile 35.2px), flex:none — das Logo wird nie komprimiert.
- Zu wenig Kontrast zwischen Logo und Hintergrund
- Symbol und Wortmarke gegeneinander verschieben oder einzeln skalieren
- Verzerren — jede Skalierung nur proportional
- Eine andere Schrift in der Wortmarke (auch ähnliche nicht)
- Umfärben oder Verläufe im Logo
- Drehen / anwinkeln
- Schatten unter dem Logo oder Texturen auf dem Logo
- Neigen / skewen einzelner Teile
- Farben invertieren — nur die gelieferten Versionen einsetzen
- Logo nachzeichnen oder editieren — immer die Originaldatei nehmen
| Datei | Was | Einsatz |
|---|---|---|
assets/img/logo-horizontal-white.png | Primärlogo horizontal, weiss (Graphic Device) | DAS Kopf-/Nav-Logo jeder Seite (einzige erlaubte Kopf-Datei) und generell dunkle Hintergründe |
assets/img/logo-crest.png | Sekundärlogo „TFCZ" + Schild, blau | Helle Hintergründe, kompakte Flächen |
assets/img/logo-shield.png | Symbol mit weissem Graphic Device | Dunkle / farbige Hintergründe, Icon-Einsatz |
assets/img/emblem-blue.png | Symbol blau mit weissem Device | Belohnungen (Easter-Egg), Icons auf dunklem Grund |
assets/img/emblem-black.pngemblem-white.png | Symbol S/W | Einfarbige Reproduktion (schwarz auf hell / weiss auf dunkel) |
assets/img/pattern.png | Schild-Pattern | Dekorative Flächen — Regeln unten |
„TFCZ – Ordner" → Logo/ | Master: AI · EPS · PDF · PNG, RGB + CMYK | Print & Produktion — CMYK für Print, RGB für digital |


Kopf-Logo-Verhalten
Siehe Sektion 4d: Klick führt zur Home mit Press-Bounce (logoPress, Navigation ~230ms verzögert). Immer dieselbe Datei, Höhe 38.8px / Mobile 35.2px — das Logo schrumpft nie, egal wie viele Nav-Links daneben stehen.
Typografie
Nunito Sans — einzige Schrift der Marke (Extralight bis Black verfügbar; im UI: 400 / 500 / 700 / 900). Fallback ohne Nunito Sans: moderne, geometrische Sans-Serif. Letterspacing nur bei UPPERCASE-Labels (.12–.22em). Kicker-Signature als Section-Eyebrow.
- Nie gendern — keine :in/:innen/*in-Formen, kein Binnen-I, keine Doppelnennungen. Generisches Maskulinum oder neutrale Umformulierung („Spieler", „jeder", „alle", „die Community"). Beispiel: „Werd einer von uns" statt „Werd eine:r von uns".
- Deutsch (Schweiz): ss statt ß · Währung CHF · Du-Form, direkt und herzlich
- Emotion zuerst: der Vibe („alle sind willkommen", „seit 1990 in Wipkingen") kommt vor der reinen Information
- Kategorien-Wording: Kategorie heisst „Fun" (nicht „Plausch"), „Pro Turniere" (nicht „Ranglisten-Turniere"), „Elite" = alles ITSF inkl. SM — der Event-Name „Plausch-Turnier" bleibt als Titel erlaubt
Tokens: Radius · Spacing · Elevation
Konsistente Skalen statt Zufallswerte. Andock-Elemente runden nur die oberen Ecken (6px 6px 0 0). Elevation nur für Schwebendes (verbindlich): e-2/e-3 gehören zu Modals, Popups, sticky Bars und Hover-Lift — grosse ruhende Container (Sektionen, Inhalts-Boxen, Grids) tragen KEINE schweren Drop-Shadows (nur 1px-Border + inset-Highlight, max. e-1), sonst fluten die Schatten die Lücken und decken das animierte Punktfeld zu.
--ease cubic-bezier(.2,.7,.2,1) — Standard
--bounce cubic-bezier(.34,1.56,.64,1) — Brand-Bounce (Burger, Drawer, Unlocks, Egg)
--t-fast .15s--t-base .3s
CTA-System · Buttons
Sechs Typen — mehr braucht die Seite nicht. Jeder hat genau eine Bedeutung, damit jeder (auch Dritte) weiss, welcher Button wohin gehört und Gold sich nie abnutzt. Alle Buttons kommen aus einem Baustein system/buttons.css; Grösse und Radius stehen als Token in system/tokens.css. Ändert man --btn-radius dort, ändern sich ALLE Buttons auf ALLEN Seiten — der Text bleibt im HTML. (Icon-Button bleibt immer rund.)
.btn-goldConversion & Lead — die eine wichtigste Handlung: jemanden in den Verein holen oder eine qualifizierte Anfrage auslösen. Nie für reine Navigation („Alle Regeln", „Komm vorbei") oder Formular-Absenden.
.btn-bluePrimär-Aktion — die normale „Jetzt machen"-Handlung: absenden, öffnen, erstellen, weiter. Darf mehrfach vorkommen.
.btn-ghostNavigation & Sekundär — weiterführende oder Nebenhandlungen. Steht oft neben Gold/Blau und tritt bewusst zurück.
.btn-textText-Link — die leiseste Stufe, kein Kasten. Für kleine Weiter-Hinweise im Fliesstext oder neben einem grösseren Button.
.btn-dangerGefahr & Löschen — nur unumkehrbare/verwerfende Handlungen. Selten, damit Rot ein echtes Warnsignal bleibt.
.btn-successBestätigen & Hinzufügen — positive Bestätigung (nutzt das Brand-Grün --green).
.btn-iconNur-Icon-Button, immer rund. Feste Farb-Semantik: Schliessen/X = Rot (.i-close), Hinzufügen/+ = Grün (.i-add). Sonst neutral (Ghost) oder Blau.
.btn-sm = kompakter (Toolbars, „mehr laden"). .btn-icon = rund, nur Icon. Beide an jeden Typ anhängbar.
.btn-socialSocial-Buttons sind im Ruhezustand immer neutral (frosted) und nehmen ihre Netzwerk-Farbe erst beim Hover an — Fremdfarben passen nicht als Grundfläche ins Brand. Klassen .s-wa / .s-ig / .s-yt / .s-li.
Chips & Toggles sind keine Buttons. Filter-Chips, Sprach-/Ansicht-Umschalter
und Profil-Chips behalten bewusst die Pill-Form und tragen kein .btn — sie folgen
--btn-radius nicht. So bleibt der Unterschied „Handlung" (Button) vs. „Auswahl/Filter" (Chip) sichtbar.
system/tokens.css → --btn-radius (Standard 12px), --btn-pad-y/x, --btn-font. Eine Zeile — gilt auf allen Seiten und hier im Brand Guide. Der Icon-Button bleibt immer rund.Menü-/Burger-Button · Standard „Scroll-Loop"
Überall derselbe Menü-/Listen-Trigger: drei eng gestapelte Zeilen in Blau · Weiss · Gold. Wechselt nie zu einem X (öffnet eine Liste/ein Menü). Animation = Scroll-Loop mit Bounce (Hover & Klick): die Zeilen scrollen gestaffelt nach unten weg und kommen oben smooth wieder rein. Referenz: .nav .burger in index.html.
Logo · Kopf / Menü
Immer dasselbe Logo (assets/img/logo-horizontal-white.png) im Kopf/Menü jeder Seite. Klick führt zur Home. Klick-Feedback = kurze Press-Bounce-Animation (scale runter → kleiner Bounce → zurück). Klick zum Ansehen:
Fenster-Signatur / Brand-Line
Blau oben (#5ca7dc) / Gold unten (#cda857) als border-top/-bottom am abgerundeten Container — läuft an den Ecken schmaler aus. Bei genau EINEM Fenster oder sticky Bars: direkt umranden. Bei MEHREREN Boxen: nur einmal als Seitenrahmen, Boxen dezent.
Einzelnes Fenster
Trägt die Signatur direkt (border-top blau / border-bottom gold, ~3px).
Signatur nur einmal am Seitenrahmen.
Cards, Tags & Datenreihen
Immer dunkler Navy-Gradient, leicht transparent + backdrop-blur — nie hell. Angedockte Eyebrow-Tags runden nur oben. Datenreihen: Sieger gold, Verlierer gedimmt.
Standard-Card
--card + 1px Border + e-2. Basis-Baustein.
Akzent-Card
Kategorie-Streifen links (Fun).
Formular-Elemente
Fokus = Gold-Rahmen (nicht Browser-Blau). Dropdowns (verbindlich): JEDE Auswahl-Liste nutzt das Custom-Dropdown .csel — dunkle Navy-Liste mit Brand-Line (blau oben / gold unten), Drop-Cascade beim Öffnen, gewählte Option mit Gold-Haken, Schliessen per Klick daneben + Esc. Native Browser-Aufklapp-Menüs sind nicht brand-fähig und daher verboten. Umsetzung: tfczEnhanceSelects() (Code in dieser Datei) — der native <select> bleibt unsichtbar im DOM, Formular-Wert und Validierung funktionieren weiter. Chips, Tabs, Toggle.
Eingabe-Controls
Die Standard-Controls im TFCZ-Stil (Basis-Satz nach den gängigen Libraries — Material, Bootstrap, shadcn). Semantik überall gleich: Checked/Auswahl = Gold · Aktion = Blau · Fokus = Gold-Rahmen · Hover = Brand-Rahmen (nur bei NICHT gewählten Elementen, per inset box-shadow).
Icons · Lucide
Keine Emojis — nirgends im Projekt (verbindlich, Vasco 14.07.2026). Jedes Icon kommt aus dieser Bibliothek. Auch Symbol-Glyphen wie Kreuz, Häkchen, Stern oder Pfeil-runter sind Emoji-Ersatz und verboten — dafür gibt es x, check, star, download. War ein Zeichen reine Dekoration, wird es ersatzlos gestrichen. SVG braucht IMMER eine Grössenregel: ersetzt du einen Text-Glyph durch ein Lucide-SVG, muss der Button eine ausdrückliche Regel bekommen — .mein-button svg{width:17px;height:17px;display:block;flex:none}. Ohne sie wird das Icon im Flex-Container auf 0 gequetscht und ist unsichtbar (so verschwand das X im Menü-Drawer). Nach jedem Icon-Tausch prüfen, ob das Icon wirklich sichtbar ist — nicht nur, ob das Markup stimmt. Alle 1746 Lucide-Icons (ISC), offline eingebettet. Klick kopiert das SVG (stroke = currentColor).
assets/icons/lucide-index.json mit name, tags, use. Regel: nie Emojis, immer ein passendes Lucide-Icon.Hover vs. Auswahl
Hover = Brand-Rahmen (blau oben / gold unten). Auswahl = Gold-Rahmen. Nie beide gleichzeitig am selben Element. „Heute" = goldene Zahl.
Hover-Brand-Rahmen · NIE mit Layout-Sprung
Der Brand-Hover (blaue Linie oben / goldene unten) darf die Box-Grösse niemals verändern. Einzig erlaubte Umsetzung: inset box-shadow — nie eine border-Dicke im :hover. Diese Regel wurde mehrfach verletzt („nie nie nie mehr") und gilt ausnahmslos.
/* RICHTIG — nur box-shadow, Layout bleibt stabil, folgt der border-radius */ .el{ border:1px solid var(--card-brd); border-radius:8px; } .el:hover{ border-color:transparent; box-shadow: inset 0 2px 0 var(--blue), inset 0 -2px 0 var(--gold); } /* hat das Element schon eine Elevation-Shadow, kombinieren: box-shadow: inset 0 2px 0 var(--blue), inset 0 -2px 0 var(--gold), var(--e-1); */ /* VERBOTEN — border-Dicke im Hover ändert die Boxgrösse, Inhalt springt */ .el:hover{ border-top:2px solid var(--blue); border-bottom:2px solid var(--gold); } /* ebenfalls verboten: border:0 im Grundzustand → border:2px im Hover (auch mit Padding-Kompensation tabu — fehleranfällig) */
Merksatz
Im :hover steht nie ein border-top/border-bottom mit px-Wert — nur box-shadow: inset … (plus optional border-color:transparent). Gilt für den Zurück-Button, Accordion-Header, Chips, Tabs, Cards — ausnahmslos. Und: Hover-Brand-Rahmen und Gold-Auswahlrahmen nie gleichzeitig am selben Element (Sektion 08). Vor dem Ausliefern jeden neuen Hover gegen Layout-Sprung testen.
Kategorie-Badges
Turnier-/Kalender-Farbsystem: Fun = #5ca7dc · Pro = #005a94 · Elite = Gold-Akzent · Event (extern) = Grün #3b7657. Box bleibt dunkel, Gold nie als Grossfläche.
Paket-Karten
pcard mit „Beliebt"-Ribbon & Gold-Check-Bullets. Gold-Rahmen = gewählt.
- 1 Abend testen
- Leihmaterial
- Freies Training
- Alle Turniere
- Eigener Schlüssel
- 24/7 Zugang
Fun-Barometer + Kennwert-Balken
Ein Baustein, kein Nachbau. Unten läuft system/components/baro.js — dieselbe
Datei wie auf der Home. Web-Pflicht: vertikale Tube (Spass oben / Wettkampf unten) IMMER zusammen mit dem
Beschreibungs-Panel + Kennwert-Balken — nie nur eins von beiden. 5 Stufen: Käsekick · Offenes Training ·
Plausch-Turnier · Pro Turniere · Elite. Auswahl (Hover/Klick) steuert Tube-Level, Kategorie-Akzent und Panel.
Kein separates „SM-Quali" — die SM gehört zu Elite. Icons sind Lucide (party-popper /
trophy), nie Emojis. Der frühere mitlaufende Marker-Stab an der Tube ist entfernt.
So baut man ihn ein
<div data-tfcz="baro"></div>
<script defer src="system/components/baro.js"></script>
Die 5 Stufen samt Texten und Kennwerten stehen nur im Baustein. Nie ein zweites Barometer bauen. Hover = Brand-Rahmen · Auswahl = Gold — nie beides am selben Element. Käsekick (voller Spass) zündet Konfetti; der Info-Knopf öffnet den ausführlichen Text.
Live — der echte Baustein
Stream · Spielstatistik-Widget
Vollbild-Grafik (1920×1080), die im Livestream zwischen den Spielen erscheint: eine Statistik pro Screen, Auto-Wechsel alle 5 Sek. Nur die Zahlen tragen Team-Farbe (Grün vs. Schwarz). Die Tisch-Grafik mit Pfeilen zeigt, wo auf dem Tisch die Aktion passiert — auch für Neulinge verständlich.
spielstatistik-widget.html · engine.js · pitch.js
Sonst strikt Brand: Navy-Hintergrund, Gold nur Marke/Akzent, Blau für Fenster-Signatur & Feldlinien. Schwarze Zahl immer mit hellem Rand.
Endstand → Aufbau (Pass 5→3) → Abschluss (Schuss) → Torwartzone → Tor aus dem Mittelfeld → Ballverluste. Eine Statistik pro Screen, Wechsel alle 5 Sek. Ein Screen erscheint nur, wenn Daten da sind.
1 Statistik pro Screen · grosse Zahlen (mobil lesbar) · Tisch + Pfeile zeigen wo · immer beide Richtungen · nur Zahlen grün/schwarz · Namen voll auf dem Screen, Kurzform im Kopf.
Mehrere Stats auf einen Screen · viel Text · Gold für Teams · schwarze Zahl ohne Rand · Pfeil/Highlight in Gold statt Team-Farbe · Assets extern verlinken.
Scoreboard · Ecken-Overlay
Kompaktes Live-Board (Sätze · Tore · Timeouts · Set-/Match-Ball · Turnier-Runde) — im Stream unten links. Fenster-Signatur (blau oben / gold unten) auf frosted Navy, Nunito Sans. Team-Identität wie beim Stat-Widget: Grün #57A639 vs. Schwarz #0c0f14 + heller Rand — nur Name & Tore tragen Team-Farbe. Sätze bleiben neutral, Gold nur als Akzent (Turnier-Zeile), Blau für Sätze & Set-Ball. Leader = dezenter Glow, nie Gold.
sop/public/widgets/scoreboard.html · Position per ?position=bottom-left · Daten via WebSocket//state
Possession-Timer · Ballbesitz
Zeigt oben rechts, wie lange ein Stab den Ball hält (3er / 5er / Torwart) — zählt live hoch, friert beim Limit ein und wird rot über dem Limit (3er/Torwart 15s, 5er 10s). Fenster-Signatur (blau oben / gold unten) auf frosted Navy, Nunito Sans, goldenes Eyebrow. Gold nur Akzent, nie für Teams.
sop/public/widgets/possession.html · Position per ?position=top-right · Trigger POSSESSION_TIMER
Kamera-Rahmen · Einzel & Split
Transparentes Overlay für die Kamera-Einblendungen (Player L/R, Rally, Defensive) — statt Vollfarbe hinter der Kamera: Fenster-Signatur blau oben / gold unten, Navy-Rahmen, runde Ecken, Mitte durchsichtig für die Kamera. Split = zwei gerahmte Fenster mit Navy-Trenner (neue OBS-Szene). In OBS als Browser-Quelle über die Kamera legen, Grösse = Kamera-Bereich.
sop/public/widgets/camera-frame.html · ?mode=single|split · Feintuning ?lw= ?r= ?m=
Kalender-Zellen
Woche = macOS-Dock-Lupe (gehoverter Tag am grössten, Nachbarn geschoben). Monat = Fokuszelle (Gold-Rahmen) zeigt pro Event nur den Kategorie-Badge. Monats-Default = 6 Wochen (aktueller Monat); jeder Klick auf „Mehr laden" hängt +2 Monate an. „Heute" = goldene Zahl.
Dock-Lupe · Baustein
Ein Baustein, überall wiederverwendbar. Der macOS-Dock-Effekt (das Element unter
der Maus wird am grössten, die Nachbarn skalieren stufenlos runter und werden auseinandergeschoben) steckt
jetzt in system/components/dock-magnify.js — nicht mehr fest im Kalender verdrahtet. Aufruf auf
jede horizontale Reihe mit gleich breiten Kindern: Wochentage, Kacheln, Foto-Streifen, Filter-Chips …
läuft rein auf der GPU (transform), animiert nie margin und misst
nicht pro Frame das Layout — darum glatt statt ruckelig. Respektiert
prefers-reduced-motion (dann aus).
So baut man ihn ein
<div class="myrow">…gleich breite Kinder…</div>
<script defer src="system/components/dock-magnify.js"></script>
<script>
addEventListener('DOMContentLoaded', function(){
TFCZ.dockMagnify(document.querySelector('.myrow'), {
amp: 0.34, // max. Vergrösserung (+34 %)
sigma: 1.4, // Reichweite in Zellen
spread: true // Nachbarn schieben (Dock) statt nur skalieren
});
});
</script>
Kind-CSS: transform-origin:center bottom; will-change:transform;
transition:transform .16s ease. Optionen: fade (entfernte dimmen),
scrollFocus (Touch/Strips: beim Scrollen die Mitte vergrössern). Rückgabe:
.destroy() / .refresh().
Live — Wochentage (wie im Kalender)
Mit der Maus über die Reihe fahren. Dieselbe Optik wie die
Kalender-Woche — aber als GPU-Baustein, nicht als CSS-Hover mit margin.
Live — beliebige Kacheln (derselbe Baustein)
Exakt derselbe Aufruf, andere Reihe — der Effekt ist wiederverwendbar für alles mit gleich breiten Kindern.
Hintergrund-Animationen & Modi
Zwei Seiten-Hintergründe: Hellblau (öffentlich) & Dunkel-Navy (login-intern). Standard-Effekt = Schwerkraft-Wirbel aus dem globalen Modul assets/js/bg-swirl.js — diese Seite nutzt seit v2.1 genau dieses Modul (der frühere Inline-Wirbel mit Dauer-Idle-Kreisen war ein Bug und ist entfernt). Idle-Verhalten (verbindlich): der Wirbel wirbelt nur bei Mausbewegung; stoppt die Maus (~140ms), kehren die Punkte langsam & smooth per Genie-Feder (0.010 / 0.91) zurück und der Loop hält an — kein Dauer-Idle-Wirbel. prefers-reduced-motion respektieren. Floating Lines (~116°) bleiben als Alternative erlaubt (Snippets: 01_Web/hintergrund-spielwiese.html). Umschalter oben im Kopf.
Modus (strikt)
Navy = NUR interne, login-geschützte Tools (POS, Bar-Display, Livestudio, Design Studio, Cockpit, Admin). Hellblau = jede öffentliche Seite — dort gibt es keinen Umschalter und keinen Dark Mode. Umsetzung immer über das globale Modul assets/js/bg-swirl.js — nie pro Seite inline duplizieren.
Einbindung (Pflicht)
Jede Seite bindet nur <script defer src="assets/js/bg-swirl.js"></script> ein — das Modul erstellt Canvas + CSS selbst. Nie inline kopieren: Inline-Kopien veralten (genau so entstand der Dauer-Idle-Bug dieser Seite, behoben 10.07.2026). Boxen bleiben immer dunkel & frosted — ohne schwere Drop-Shadows, damit das Punktfeld sichtbar bleibt.
Modal-Test & Deselektierung
Deselektierung (verbindlich): jedes Popup schliesst bei Klick ausserhalb des Inhalts — Backdrop, Menü-Balken-Bereich oder leere Fläche daneben — plus Esc. Aktiv bleiben nur Inhalt + Steuerelemente (Bild-Player: Bild, Pfeile, X, Herz). Gilt für alle Popups. Test: neben das Popup klicken schliesst.
Unlock- & Feedback-Animationen
Wiederverwendbare Game-Style-Animationen. Level-Up (z. B. Achievement / Fortschritt) und Sterne-Rating (z. B. Feedback-Bewertung). Keine Emojis, alles SVG/CSS. Klick „Abspielen" zum erneuten Triggern.
Level-Up
Sterne-Rating
Bilder-System · Galerie (full/thumb) & Foto-Manager
Grundregel: Inhaltsbilder werden NIE fest im HTML/CSS verdrahtet. Jedes Bild lebt im Galerie-CMS als WebP in zwei Auflösungen — assets/fotos/galerie/full/… (grosse Darstellung, ~1600px: Hero, Sektionsbilder) und assets/fotos/galerie/thumb/… (klein: Strips, Feeds, Karussell-Kacheln). Roh-JPG/PNG gehören nicht direkt in Seiten. Ausnahme: Logos/Embleme/Muster = geteilte Assets in assets/img/.
Wie Bilder auf die Seite kommen (Slots)
<!-- src wird beim Veröffentlichen aus mapping.json ins HTML gebacken (echtes Bild, kein Platzhalter) -->
<img data-slot="index.hero" class="hc-img" src="assets/fotos/galerie/full/795.webp" alt="…">
<div data-slot="index.bg-bar"></div> <!-- Hintergrund-Slot -->
system/tfcz-images.js setzt zur Laufzeit Bild bzw. Background aus assets/fotos/galerie/mapping.json; system/tfcz-carousel.js macht dasselbe für Karussells. mapping.json ist die Laufzeit-Quelle der Wahrheit (Slot → Bild), slots.json hält die Slot-Definitionen, galerie.json den Foto-Katalog. Beim Veröffentlichen bäckt _tools/bake-slots.mjs das gemappte Bild direkt ins src jeder Slot-<img> — so lädt sofort das richtige Bild ohne Flash und ohne Doppel-Laden; tfcz-images.js ist dann nur noch Fallback.
Bilder ändern — nur über den Foto-Manager
- Foto-Manager öffnen:
assets/fotos/galerie/foto-manager.html. - Pro Slot ein Galerie-Foto wählen — Auflösung full oder thumb.
- Speichern → schreibt
mapping.json(oder „mapping.json exportieren“ und inassets/fotos/galerie/ersetzen). node _tools/bake-slots.mjslaufen lassen — bäckt die Bilder inssrc.- Veröffentlichen, damit es live erscheint.
Neue Fotos kommen ausschliesslich über den tfcz-fotos-Skill in die Galerie: er erzeugt full+thumb-WebP, katalogisiert in galerie.json und fragt vorher nach Event/Kategorie. Nicht von Hand katalogisieren.
Nie
Bild-Player & Foto-Like
Ein Baustein, kein Nachbau. Player (X · Pfeile · Thumbnail-Dock · Herz) und
Like-Zähler kommen aus system/components/lightbox.js + system/likes.js — dieselbe
Datei, die Home und Training benutzen. Diese Seite bindet sie ein: die Demo unten ist der ausgelieferte
Baustein, keine Kopie. Nie eine Bilder-Strecke ohne Player bauen (Reuse-First).
So baut man ihn ein
<!-- 1. Bilder-Gruppe markieren -->
<section data-lightbox>
<div class="foto">
<img src="assets/fotos/action/action-01.jpg" alt="">
<span class="tfcz-like-badge" data-h="action-01"></span>
</div>
</section>
<!-- 2. Bausteine laden -->
<script src="system/likes.js"></script>
<script defer src="system/components/lightbox.js"></script>
Der Player baut sich selbst und verdrahtet jeden Klick auf ein Bild
der Gruppe. Hat die Seite eine eigene Drag-Logik (Home-Marquee), setzt sie zusätzlich
data-lightbox-manual und ruft TFCZ.lightbox.openFrom(imgEl).
Live — klick ein Bild




Dieselben Bild-IDs wie auf der Website — der Zähler ist derselbe. Likest du hier, siehst du es auf der Home wieder.
Regeln
- Herz = Lucide-Herz, nie ein Herz-Glyph (Unicode-Zeichen). Ruhe = weisse Outline, geliked = brand-blau gefüllt
(
tfczHeartPop) + aufsteigende Herzen (tfczHeartFly). Blau, nicht Gold — ein Like ist eine Aktion, keine Conversion. - Bild-ID = Dateiname (
action-04). Ein Like hängt an der ID, nicht an der Seite: derselbe Zähler auf jeder Seite, und derselbe Nutzer kann ein Bild nur einmal liken (nochmal klicken = Unlike). Veröffentlichte Bilder nie umbenennen — sonst startet der Zähler bei null. - Zähler-Badge: jedes Element mit
data-h="<bildId>"wird automatisch gefüllt (leer bei 0). - Schliessen per X (rund, Hover rot, Quetschen), Esc und Klick neben das Bild — Standard-Deselektierung.
- Backend vorbereitet: sobald
window.TFCZ_API(undTFCZ_USER) gesetzt ist, syncen die Likes aufs Profil — ohne Frontend-Umbau.
Getränkeliste
Ein Baustein, eine Liste. Vorher stand das Sortiment zweimal im HTML (Über uns mit
Emojis und „CHF –.–", Firmenevents ohne Snacks und „vor Ort") — zwei Wahrheiten, die auseinanderliefen.
Jetzt: Struktur in system/drinks.js, Darstellung in system/components/drinks.js.
Kategorie-Icons sind Lucide, nie Emojis.
So baut man sie ein
<!-- Platzhalter — mehr schreibt die Seite nicht -->
<div data-tfcz="drinks" data-snacks="0" data-preis="vor Ort"></div>
<script src="system/drinks.js"></script>
<script defer src="system/components/drinks.js"></script>
Optionen: data-snacks="0" (Snacks weglassen)data-preis (Text für noch offene Preise)data-spaltendata-zahlung="1" (Zahlungshinweis darunter).
Live — der echte Baustein
Regeln
- Preise kommen aus der API —
GET {TFCZ_API}/api/drinks. Sie werden nie ins HTML und nie insystem/drinks.jsgeschrieben. Dort steht nur die Struktur;preis: nullheisst „kommt vom Server", nicht „fehlt". - Sobald
window.TFCZ_APIgesetzt ist (auch nachträglich), holt der Baustein die Live-Liste und rendert neu. Antwortet der Server nicht, bleibt der Platzhalter stehen — die Seite bricht nie. - Sortiment ändern = eine Datei:
system/drinks.js. Nie eine Liste in eine Seite kopieren. - Icons = Lucide (
beer,cup-soda,coffee,cookie) — keine Emojis. Kategorie-Zeile in Gold, Preis in Gold, offener Preis gedämpft. - Später lesen Bar-Display und Kassensystem dieselbe Quelle — darum steht das Sortiment nicht in der Seite.
Portal-Schliessen
Fenster öffnen und schliessen SOFORT — ohne Auf-/Zu-Animation.
system/components/portal.js. Kein Zusammensinken, kein Verblassen, kein Skalieren aus dem
Klickpunkt. (Vasco 26.07.2026: „kein Ein- und Ausschalten der Fenster mehr — auch nicht bei den Easter
Eggs.") Das Schliessen läuft weiterhin zentral über den Baustein, damit alle Fenster gleich reagieren —
nur eben ohne Effekt. Das EINZIGE, das noch federt, ist der X-Button (Hover-Quetschung).
So benutzt man ihn
<script defer src="system/components/portal.js"></script>
// Statt das Fenster selbst zu verstecken — zentral schliessen (sofort, ohne Animation):
TFCZ.portal.close(fensterEl, function () {
overlay.classList.remove('on'); // aufräumen
});
fensterEl = die Box (nicht der Backdrop).
Der Callback läuft sofort; es gibt keine Animationsdauer und keinen Zustand mehr.
Live — öffnen und schliessen
Schliessen per X, Esc oder Klick daneben — jeweils sofort, ohne Effekt.
Regeln
- Nie ein Fenster selbst ausblenden (
display:none, Klasse entfernen, wegschieben). Jede Schliess-Aktion läuft überTFCZ.portal.close(). - Keine Auf-/Zu-Animation für Fenster — weder Zusammensinken/Verblassen noch Skalieren. Popups erscheinen und verschwinden sofort.
- Verdrahtet: Menü-Drawer, Tages-Maske, Video-Modal, Bild-Player, Barometer-Sheet, dieses Inhaltsverzeichnis, das Demo-Popup, die Easter-Egg-Popups und das Design Studio.
- Der X-Button bleibt der Standard-X: runder Kreis, Hover rot, Quetsch-Animation — das ist die einzige verbliebene Fenster-nahe Animation.
Formulare
Ein Baustein für alle Formulare. Felder und Mail-Texte stehen in
system/forms.js, das Verhalten in system/components/form.js: rendern,
Pflichtfelder prüfen, Mail bauen, „Mail geöffnet?"-Fallback, Text kopieren. Acht Formulare auf vier
Seiten (fünf Mitglied-Pakete, Training, Firmenevents, Medien) — vorher stand dieselbe Logik vier Mal im HTML.
Live — dasselbe Bauteil wie auf der Website
Die Felder unten stehen nicht in dieser Datei — sie kommen aus
system/forms.js. Wähle ein Formular: derselbe Wechsel, den „Mitglied" bei der Paketwahl macht
(data-form umsetzen + TFCZ.formUI.neu(form)).
So baut man es ein
<form data-tfcz="form" data-form="training" novalidate>
<div class="fgrid" id="fFields"></div> <!-- Felder kommen vom Baustein -->
<button class="btn btn-gold" type="submit">Als Mail senden</button>
<span class="formerr" id="fErr">Bitte fülle die markierten Pflichtfelder aus.</span>
</form>
<script src="system/forms.js"></script>
<script defer src="system/components/form.js"></script>
Wechselt die Seite das Formular (Mitglied: Paketwahl), setzt sie
data-form um und ruft TFCZ.formUI.neu(form) — nur die Felder werden neu gerendert,
die Verdrahtung bleibt.
Regeln
- Der Absender ist der KUNDE. Schlusssätze nie aus Vereinssicht: „Bitte meldet euch mit Verfügbarkeit und Ablauf" — nicht „Wir melden uns …". Das war ein echter Fehler im Mailtext.
- Nichts darf still verschwinden. Ein optionales Feld, dessen Fehlen eine Aussage ist
(Wunschzeit), bekommt
leerTextund steht dann als „Wunschzeit: noch offen" im Text. - Felder nur in
system/forms.js— nie im HTML. Empfänger kommt aussystem/content.js. - Backend: ist
window.TFCZ_APIgesetzt, geht die Anfrage zusätzlich perPOST /api/forms/<id>an den Server. Der mailto-Weg läuft unabhängig weiter — das Formular funktioniert also immer. Vertrag:API.md. - Die Farbe des Absenden-Buttons folgt dem ZWECK, nicht dem Formular. Ist das Absenden die
Conversion/Lead (Mitglied, Training, Firmenevent) →
.btn .btn-gold. Ist es eine normale Anfrage (Medien) →.btn .btn-blue. Darum steht in der Live-Demo oben Blau (Medien) und im Einbau-Beispiel Gold (Training). - Toast ist global:
TFCZ.toast('Text kopiert').
Design-Tokens · eine Datei
Farben, Radien, Schatten, Zeiten und Easing stehen an EINER Stelle:
system/tokens.css — 45 Tokens, geladen vor dem seiten-eigenen CSS.
Vorher hatte jede Seite ihr eigenes :root: 34 Tokens waren gleich, aber 11 liefen
auseinander — --r-xl in vier Varianten (16/22/24/26px), drei Schatten-Varianten,
zwei Easing-Kurven. Darum sah dieselbe Karte auf zwei Seiten anders aus.
Ladereihenfolge — immer so
<head>
<link rel="stylesheet" href="system/tokens.css"> <!-- 1. Tokens -->
<style> /* 2. nur noch Seiten-Spezifisches */ </style>
</head>
Kein :root mehr in einer Seite.
Referenz ist die Home. Ändert man einen Wert in tokens.css, ändert er sich
auf allen Seiten gleichzeitig.
Regeln
- Neue Tokens gehören in
system/tokens.css— nie in eine Seite. - Eine bewusste Ausnahme pro Seite ist erlaubt (die Seite lädt zuletzt), muss dort aber explizit stehen — damit sie sichtbar und dokumentiert ist.
- Vor dem Ausliefern prüfen: keine Seite bringt ein eigenes
:rootmit (Soll: 0). - Noch offen: die geteilte Klassen-Bibliothek (
tfcz-base.css). Der erste Versuch hat die Seiten zerlegt — wenn, dann Klasse für Klasse mit Bildvergleich.
Karte · Google Maps
Ein Baustein, beide Seiten. Home und Firmenevents zeigen dieselbe Karte über
system/components/map.js. Es ist Google Maps, keyless (klassischer
output=embed, kein API-Key, keine Kosten), hell, mit Pin direkt an der
Vereinsadresse. Der Pin kommt über die Adresse als Suchbegriff (q=), die
Google selbst geocodiert — nicht über eine Koordinate (die alten Registry-Koordinaten waren der
generische Zürich-Default und sassen daneben). Adresse aus system/content.js
(TFCZ.content.ort.label): eine Zeile, überall gültig. loading="lazy" lädt
die Karte erst beim Hinscrollen (Performance). Dark Mode bewusst nicht — echtes dunkles
Google Maps bräuchte die JavaScript-API + API-Key; hell & keyless ist gewollt.
So baut man sie ein
<div data-tfcz="map"></div>
<script src="system/content.js"></script>
<script defer src="system/components/map.js"></script>
Optional pro Platzhalter:
data-q="Strasse 1, 8000 Ort" (Adresse überschreiben) · data-zoom="16".
Zieht der Verein um, ändert man eine Zeile in system/content.js — beide
Karten folgen.
Live — der echte Baustein
Easter-Egg · Emblem-Pop
Belohnungs-Popup der Eiersuche. Klasse .eegg: Ei fällt rein, wackelt zunehmend (Spannung), knackt dann auf — das blaue TFCZ-Emblem springt mit Bounce heraus, Käse regnet herum (thematisch zum Käsekick, wie im echten assets/js/tfcz-fx.js → startCheese()). Wiederverwendbar für jeden Egg-Fund.
Emblem-Pop

Fund-Logik & Belohnung
Nach dem ersten Fund erscheint der Hinweis, dass ein Login nötig ist, um den Fortschritt zu speichern — der Hinweis bleibt, bis man angemeldet ist. Ohne Login wird ein Ei beim Refresh wieder aktiv. Ab Login wird der Fortschritt im Profil gespeichert und jeder neue Fund zeigt, wie viele noch offen sind. Motivation (immer sichtbar): 10 gefundene Eier = 1 Gratis-Raclette an einem KäseKick der Wahl.
Käse-Feier & Performance
Die Feier lässt Käse-Emoji (thematisch zum Käsekick) über den Bildschirm regnen. Physik: die Käse fallen und bleiben liegen — kein Aufspringen, kein Eigendreh; Anklicken/Wischen schleudert sie hoch (zum Wegspicken/Lesen). Quelle: assets/js/tfcz-fx.js → startCheese().
Performance-Knöpfe (Pflicht bei geräteschwachen Nutzern): Partikel gedeckelt (Mobile ≤600px 120, sonst 200) hält die O(n²)-Kollision günstig · Fallflächen-Canvas dpr 1.5 statt 2 (~1.8× weniger Füllrate) · prefers-reduced-motion überspringt die Feier komplett · Selbst-Stopp: Canvas werden beim Schliessen entfernt (kein Leck, Heap ~1–2 MB). Gemessen 22.07.2026 (Chromium/CDP): Mobile 4× CPU 28→34 fps, 6× 23→30 fps.
Interaktive Standard-Bausteine
Verbindliche UI-Bausteine in Brand-Farben. Social-Buttons und Formular-Felder werden nur noch so verwendet.
Social-Buttons — Standard (Hover = Plattform-Farbe)
Für Instagram, YouTube, WhatsApp, LinkedIn & Co. Immer dieses Muster: weisser Kreis, Tooltip, Hover färbt sich in die Plattform-Farbe.
Formular-Feld — Standard (Floating Label)
Alle Eingabefelder in Formularen sind so: Label wandert beim Fokus hoch, Unterlinie wird zum Blau→Gold-Verlauf, Label wird gold.
Toggle-Switch
Für An/Aus-Optionen (z. B. „angemeldet bleiben"). Aktiv = Blau→Gold.
Segmented / Glass-Radio
Glas-Umschalter mit gleitendem Marker — für 2–3 Optionen (Tabs, Ansichten, Stufen).
Tabs / Reiter (Ansichten)
Für den Wechsel ganzer Ansichten/Inhalte. Aktiver Reiter = Frost + 3px blaue Oberkante, sitzt auf der goldenen Grundlinie (Blau oben / Gold unten). Für 2–3 inline-Optionen stattdessen den Segmented-Baustein oben.
Profil-Avatar · Emblem-Form
Profilbilder tragen die TFCZ-Wappenform (Foto im Schild) statt eines Kreises. Rahmen blau oben / gold unten.
Live-Einsatz aller vier in Brand-Farben: login.html (Login/Registrieren/Passwort-vergessen).
Seitengerüst & Navigation
Jede Seite — Home UND jede Unterseite/Landingpage — nutzt dasselbe Gerüst. Abweichende Breiten oder „nur auf der Home"-Verhalten sind verboten. Das sticky Menü ganz oben in dieser Datei ist die Referenz.
| Element | Regel |
|---|---|
| Inhaltsbreite | .wrap{max-width:1160px; padding:0 22px} — überall identisch, auch der Footer (.fwrap). Nie 1000/1080px o. ä. |
| Sticky-Menü | Fluchtet mit .wrap via padding:12px max(22px, calc((100% - 1160px)/2 + 22px))unten abgerundete Ecken 0 0 16px 16pxBrand-Line ~3px (der goldene Streifen läuft über die Rundung schmaler aus). Sticky Bars tragen die Signatur IMMER — unabhängig von der Boxen-Anzahl. |
| Anordnung | 1 · Logo ganz links (flex:none, Link zur Home) · 2 · Nav-Links direkt daneben, links eingerückt (margin-left:18px — nicht über die Breite verteilt) · 3 · ganz rechts IMMER „← Zur Website" (margin-left:auto, Ghost-Stil — nie Gold an dieser Position). |
| Nav-Links | Die EIGENE In-Page-Navigation der Unterseite (Anker auf Sektionen DIESER Seite — nicht auf Home-Sektionen). Hover = Gold-Unterstrich. ≤860px: Links ausblenden, Zurück-Button bleibt. |
| Logo | Immer dieselbe Datei assets/img/logo-horizontal-white.png, Höhe 38.8px (Mobile 35.2px), nie komprimiert. Klick = Press-Bounce, Navigation ~230ms verzögert. |
| Global | Logo-Press, Burger „Scroll-Loop", Drop-Cascade-Menü und Brand-Signatur existieren auf JEDER Seite identisch — beim Bauen einer neuen Seite den Nav-Baustein 1:1 aus index.html übernehmen. |
| Hintergrund | <script defer src="assets/js/bg-swirl.js"></script> einbinden — das globale Modul ist die einzige Quelle (Feder 0.010 · Dämpfung 0.91), nie pro Seite inline duplizieren. |
Sektionen starten mit Eyebrow-Kicker (Goldstrich), Headline 900 und Lead-Text. Beim Scrollen: Reveal — opacity 0→1, translateY(28px)→0, gestaffelt (+0.1s je Stufe). prefers-reduced-motion respektieren.
- Voll responsive — Referenz-Breakpoints 640 / 1024 / 1400px · POS/Touch: dense but tappable (Listen/Grids statt grosser Cards, iPad-first)
- Nie ein horizontaler Scrollbalken: Flex-Textkinder bekommen
min-width:0, vertikale Scroll-Container explizitoverflow-x:hidden - Jedes Popup schliesst per Backdrop-Klick, Klick neben dem Inhalt UND Esc — Standard-Deselektierung für jedes neue Popup
- Öffentliche Seiten = Hellblau-Hintergrund ohne Umschalter · Login-Bereiche = Navy · Boxen bleiben in beiden Fällen dunkel & frosted
Print, Social & Icons
Ausserhalb des Screen-UI gilt die harte Brand-Line: Blau oben, Gold unten — als Schnitt, nie als Verlauf, kein Mischen. Sand #e6e3da ist die helle Print-/Social-Fläche (nie als Screen-Box).
Regeln
Blau #5ca7dc oben, Gold #cda857 unten — keine Verläufe in Print/Social (der dekorative Blau→Gold-Verlauf ist nur im Screen-UI von POS & Bar-Display erlaubt).
Gold = Premium-Sekundärfarbe, breit einsetzbar — auf Flyern als Prestige/CTA erlaubt, nie als Grossfläche.
Kategorie-Farben wie im Web: Fun #5ca7dcPro #005a94Elite = Gold-Akzent.
Produktion: CMYK · digital: RGB.

| Kanal | Format | Werkzeug |
|---|---|---|
| Instagram Post / Flyer | 1080×1080 (1:1) | Design Studio (Flyer-Generator, Vorlagen KäseKick & PRO) |
| Instagram Story / Panorama | 1080×1920 (9:16) — Panorama = mehrere Slides, die wie EIN Bild wirken | Skill tfcz-insta-stories |
| Highlight- / Profil- / WhatsApp-Icons | rund, Ring-Specs oben | Skill tfcz-icon-builder |
| YouTube-Thumbnail | 1280×720 (16:9), Export PNG + HTML | Design Studio · YouTube-Tab |
| Stream-Overlay | 1920×1080 (OBS-Browser-Quelle) | Livestudio — Bausteine siehe Sektion 12 |
Checkliste vor dem Ausliefern
Jedes neue TFCZ-Design — Seite, Flyer, Overlay, Tool — muss alle Punkte bestehen. Nicht bestanden = nicht ausliefern.
- Farben exakt kanonisch — nur Werte aus Sektion 01, gegen die Tabelle geprüft.
- Brand-Line korrekt — blau oben / gold unten. Print/Social: harter Schnitt. Screen-UI: Signatur an Fenstern & sticky Bars.
- Hover ohne Layout-Sprung — Brand-Hover nur als
inset box-shadow(Sektion 8b), nie border-Dicke im Hover. - Icon sichtbar? Jedes SVG in einem Button braucht eine
svg-Grössenregel — sonst quetscht der Flex-Container es auf 0 (unsichtbares Icon). Nach jedem Glyph→Lucide-Tausch im Browser nachschauen. - Fenster schliessen nur über den Portal-Baustein (Sektion 15d) — nie selbst ausblenden.
- Keine Emojis — nirgends. Icons sind immer Lucide (Sektion 7c). Das gilt auch für Symbol-Glyphen, die als Icon missbraucht werden (Kreuz, Häkchen, Stern, Pfeil-runter, Herz) und für Text-Schmuck in Captions, Persona-Daten und Doku. War es Dekoration: ersatzlos streichen. Vor dem Ausliefern gegen Emoji-Unicode-Ranges scannen — Soll: 0.
- Gold-Disziplin — Gold-CTA nur für Beitritt/Conversion („Mitglied werden") oder Lead-Anfrage („Verfügbarkeit prüfen"); reine Navigation nie gold. Sonst Gold nur als Auswahl-/Elite-Akzent, nie Grossfläche.
- Hover ≠ Auswahl — Brand-Rahmen (Hover) und Gold-Rahmen (selektiert) nie gleichzeitig; „Heute" = goldene Zahl.
- Kein X-Overflow — nirgends ein horizontaler Scrollbalken (
min-width:0/overflow-x:hiddengeprüft). - Responsive — 640 / 1024 / 1400 getestet; Touch: dense but tappable.
- Boxen dunkel & frosted — DarkNavy-Gradient + blur, nie helle Boxen; öffentlich = Hellblau ohne Dark Mode, intern = Navy.
- Popup-Standard — Backdrop-Klick + Klick neben Inhalt + Esc schliessen; X-Button 36px mit Rot-Hover & Quetsch-Animation, innerhalb des Containers.
- Nav-Baustein komplett — 1160px-Raster, korrekte Logo-Datei & -Grösse, eigene In-Page-Links, Zurück-Button rechts, Burger/Drawer/Logo-Press vorhanden.
- Logo-Regeln — richtige Variante pro Hintergrund, Schutzzone frei, keine Don'ts aus Sektion 01b verletzt.
- Motion —
prefers-reduced-motionrespektiert; Hintergrund überbg-swirl.js, Wirbel nur bei Mausbewegung. - Sprache — Deutsch, CHF, nie gendern; Emotion/Vibe transportiert.
- Hintergrund bleibt sichtbar — ruhende Container ohne e-2/e-3-Drop-Shadows (nur Border + inset); schwere Schatten nur für Modals, Popups, sticky Bars, Hover-Lift.
- Konsistenz — gegen diese Datei geprüft; jede Abweichung braucht eine explizite Freigabe von Vasco.
Feedback & Status
Alerts nutzen die Sekundär-Akzente (sparsam, max. ~5% Fläche): Blau = Info · Grün = Erfolg · Orange = Warnung · Rot = Fehler/ungespeichert. Der Spinner trägt die Brand-Line (blau oben / gold unten). Skeletons statt leerer Flächen beim Laden.
Daten & Listen
Tabellen, Avatare und Akkordeons. Akkordeon-Hover = Brand-Rahmen per inset box-shadow (Referenz: .acc-head auf tfcz-regeln.html — die alte border-Umsetzung war genau der verbotene Layout-Sprung).
| Spieler | Siege | Turnier | Kategorie |
|---|---|---|---|
| O. Grieder | 5 | Zürich Open | Pro |
| M. Sauter | 4 | Käsekick | Fun |
| S. Schöb | 7 | Schweizermeisterschaft | Elite |
Schnuppern gratis, Aktivmitglied CHF 200, Key Player CHF 250 (mit eigenem Schlüssel, 24/7).
Nein — alle sind willkommen, vom Anfänger bis zum Weltmeister.
Landenbergstrasse 10, Zürich Wipkingen — seit 1990 am selben Ort.
Starter-Template für neue Seiten
Kopierfertiges Grundgerüst: korrekter Nav-Baustein (Logo links · Links eingerückt · Zurück rechts), 1160px-Raster, Brand-Tokens, Kicker-Sektion, Footer mit Brand-Line und bg-swirl-Einbindung. Damit startet jede neue Seite regelkonform.
Version & Änderungslog
Kursierende Kopien lassen sich an der Versionsnummer im Kopf erkennen. Massgeblich ist immer die neueste Version aus dem TFCZ-Projekt (website-v2/brandguide.html).
| Version | Datum | Änderungen |
|---|---|---|
| v2.3 | 10.07.2026 | Custom-Dropdown .csel als verbindlicher Standard für ALLE Auswahl-Listen (Navy-Liste, Brand-Line, Drop-Cascade, Gold-Haken) inkl. Enhancer tfczEnhanceSelects() — native Browser-Listen verboten. Auf mitglied.html übernommen. |
| v2.2 | 10.07.2026 | Select-Feld brand-konform: appearance:none + eigener Chevron statt nativer Browser-Pfeile (Fokus = goldener Chevron), dunkle Options — auch auf mitglied.html nachgezogen. Fix: fehlende --bounce-Variable definiert (Level-Up, Sterne-Rating und Emblem-Pop blieben unsichtbar/abgeschnitten, weil ihre Animationen auf var(--bounce) zeigten). |
| v2.1 | 10.07.2026 | Wirbel-Bug behoben (globales Modul bg-swirl.js statt Inline-Altstand mit Dauer-Idle) · neue Regel „Elevation nur für Schwebendes" (Schatten decken das Punktfeld nie zu) · Element-Galerien: Eingabe-Controls, Navigations-Elemente, Feedback & Status, Daten & Listen · Starter-Template · „HTML kopieren" je Sektion · Tokens-Copy · Versionierung. |
| v2.0 | 10.07.2026 | Ausbau zum teilbaren Brand Guide: Logo-Sektion nach Brand Manual 2026 (Varianten, Hintergrund-Matrix, Schutzzonen, Don'ts, Datei-Matrix, Pattern), Farbwerte (RGB/CMYK/Pantone), Sprachregeln, strikte Gold-CTA-Regel, Hover-ohne-Layout-Sprung, Seitengerüst & Navigation, Print/Social/Icons, Checkliste — Logos als Base64 eingebettet. |
| v1.x | bis 09.07.2026 | Component Library: Farben, Typo, Tokens, Buttons, Burger, Drop-Cascade, Logo-Press, Signatur, Cards, Formulare, Auswahl, Badges, Pakete, Barometer, Overlay, Kalender, Hintergrund, Unlocks, Easter-Egg. |