Marke & Präsenz
Wie eine ZVV-App dort erscheint, wo sie noch niemand geöffnet hat: in der Link-Vorschau, in der Registerkarte, auf dem Home-Bildschirm. Alles auf dieser Seite ist live — die Karte unten ist dieselbe Route, die Teams abruft.
1 · Die Link-Vorschau
Eine interne Fachanwendung wird selten gesucht — sie wird weitergeleitet. Der erste Kontakt ist damit fast immer diese Karte in einem Chatfenster, nicht die Startseite. Wer sie nicht gestaltet, überlässt die Antwort auf «von wem ist das?» dem Zufall.
zvvLogo() zeichnet stattdessen die Geometrie aus assets/zvv-logo.svg.// app/opengraph-image.tsx — der ganze Unterschied zwischen zwei ZVV-Apps
export default function OgImage() {
return new ImageResponse(
ogCard({
title: 'Fahrzeugdatenbank',
subtitle: 'Asset Management · Lifecycle · Audit-Trail',
lead: 'Mehrmandanten-Plattform für die acht MVUs des ZVV.',
domain: 'fzdb.zvv.ch',
mark: busBlaupause(380),
fontFamily: OG_FONT_FAMILY,
footer: { label: '8 MVUs:', items: ['VBZ', 'VBG', 'PAG', 'VZO'] },
}),
{ ...OG_GROESSE, fonts: OG_FONTS },
)
}2 · Das App-Zeichen
Weisses Bildzeichen auf ZVV-blauer Kachel. Die Kachel ist bei allen gleich, das Zeichen nie — nebeneinander sind sie als Familie erkennbar und trotzdem einzeln unterscheidbar. Menschen erkennen ungleich besser, als sie erinnern.
| Datei | Was ohne sie passiert |
|---|---|
| app/icon.svg | Der Browser zeigt ein leeres Blatt. In einer Leiste mit dreissig Registerkarten ist die App nicht auffindbar. |
| app/apple-icon.tsx | iOS liest kein SVG. Safari erzeugt stattdessen einen verkleinerten Bildschirmabzug der Startseite als Symbol — der häufigste stille Ausfall der Kette. |
| app/manifest.ts | Chrome nimmt den Seitentitel als Symbolnamen und schneidet ihn nach etwa zwölf Zeichen ab — «ZVV Fahrzeugd…». |
Die Eckenrundung ist 22 % der Kantenlänge, nicht eine feste Zahl. Sonst trägt dieselbe App in der Registerkarte eine andere Form als auf dem Startbildschirm — genau das war in fzdb der Fall (6/32 gegen 36/180).
// app/apple-icon.tsx
export default function AppleIcon() {
return new ImageResponse(
appleIcon({ glyph: atlasKachel(112), kuerzel: 'ATLAS' }),
{ ...size, fonts: OG_FONTS },
)
}3 · Logo-Anwendung
RecipeZwei Dateien, ein Schutzraum, ein Mindestmass je Flächenart — und ein Verbot, das immer wieder verletzt wird.
Im Schutzraum steht nichts — kein App-Name, kein Trennstrich, keine Kante eines Nachbarelements. Häufigster Verstoss: eine Topbar, in der das Logo bündig an der Trennlinie zur Navigation klebt.
Auf einer Markenfläche steht die Marke für sich — Login, Deckblatt, Mail-Kopf, Print. Dort gilt eine Mindestbreite.
Topbar, Sidebar-Kopf, Footer — dort ist das Logo Herkunftsmarker neben dem App-Namen, nicht Absender. Gemessen wird die Höhe, weil sie das ist, was ein Band beschränkt.
Die 80/120 px sind ein Präsenz-Minimum, keine Lesbarkeitsschwelle. Auf die Chrome angewandt fordern sie ein 83 px hohes Band — das ist keine Topbar mehr. Beide Fassungen liegen im DOM und schalten per Klasse um; nicht per JavaScript nachladen, das flackert beim ersten Rendern.
zvvLogo() auch in `next/og`Der Grund für den Nachbau ist immer derselbe: Es sieht so aus, als stünde in einer OG-Karte kein Logo zur Verfügung — kein CSS, kein Zugriff auf /zvv-logo.svg. Es steht aber zur Verfügung. Wenn du das Logo gerade zeichnest statt es zu laden, ist es der falsche Weg — auch wenn das Ergebnis gut aussieht.
4 · Prüfung
RecipeEin Fehler auf diesen Flächen ist besonders teuer, weil ihn niemand sieht: Sie erscheinen nur in fremden Oberflächen, und Teams und Slack cachen eine Karte für Tage. Wer den Fehler bemerkt, sieht ihn bereits verteilt. Deshalb steht hier mehr Maschine als anderswo.
| Satori-Falle | Verhalten |
|---|---|
| Mehrere Kinder ohne display: flex | Laufzeitfehler — die Route liefert 500 |
| className statt style | still ignoriert, Karte rendert ungestyltschweigt |
| display: grid | still zu Block, Layout kipptschweigt |
| Relative Bild-URL | Bild fehlt stillschweigt |
pruefeSatori() ist exportiert und nicht intern: jede ZVV-App soll ihre eigene Karte damit prüfen, nicht nur Atlas die seine.
import { pruefeSatori } from '@zvvch/atlas/brand'
it('rendert satori-sicher', () => {
expect(pruefeSatori(meineKarte())).toEqual([])
})- Das PNG ansehen — ist es die Hausschrift? Steht das echte Logo oben?
- Auf einem echten iPhone zum Home-Bildschirm hinzufügen — Zeichen oder Bildschirmabzug?
Genau dort sitzen die stillen Fehler.
5 · Wirkung — und ihre Grenze
Kapitel 14Wirkung ist erlaubt, wo sie hilft, eine wahre Aussage ankommen zu lassen. Sie ist verboten, wo sie eine Entscheidung erzeugt, die ohne sie anders ausgefallen wäre. Bei einer öffentlichen Stelle fehlt das Korrektiv des Wettbewerbs — Nutzende können nicht abstimmen, indem sie gehen.