Farben
Eine Palette, eine Schreibweise: das Token. Nicht bg-blue-600,
nicht #2563EB im Style-Attribut — beides kommt heute vor und
ist der Grund, warum der Dunkelmodus in beiden Anwendungen wirkungslos ist.
Grundpalette
Acht Werte. «Primär gedämpft» (#DBEAFE) ist gestrichen — es lag auf derselben Helligkeit wie der Rahmen (Kontrast 1.01) und machte keine eigene Aussage; für Hinterlegungen genügt die Info-Fläche #EFF6FF. Grund, Fläche und Rahmen bleiben zu dritt: Die Karte hebt sich durch den feinen Helligkeitssprung und den Rahmen ab.
Statusfarben — einmal definiert, überall benutzt
- Offen / Info
#EFF6FFauf#1D4ED8- In Arbeit / Achtung
#FEFCE8auf#A16207- Wartend / neutral
#F1F5F9auf#475569- Gelöst / Erfolg
#ECFDF5auf#047857— Emerald, nicht Green- Geschlossen
#F8FAFCauf#64748B- Fehler
#FEF2F2auf#B91C1C
Schrift
Inter Variable, selbst gehostet — in beiden Anwendungen bereits so. (Diese Seite zeigt die Systemschrift, weil sie ohne Build auskommen soll; Grössen und Gewichte stimmen.)
Die Stufen
Vier Grössen: 18 · 14 · 12 · 11. Die Zeilen dazwischen sind dieselbe Grösse mit anderem Gewicht oder anderer Farbe — genau der Kniff, der die fünfte Stufe erspart.
text-[10px] 574-mal, text-[9px] 111-mal, vereinzelt
bis text-[7px]. Sieben Pixel sind kein Text mehr, sondern ein
Muster — und die Menschen, die täglich damit arbeiten, werden nicht jünger.
Zahlen stehen untereinander
18'900.00
7.05
18'900.00
7.05
- Betrag
- rechtsbündig,
font-mono tabular-nums, Schweizer Format1'234.56 - Datum
TT.MM.JJJJ, rechtsbündig,tabular-nums- Leer
- «—» in
#94A3B8, nie eine leere Zelle
Grundriss
Die Seitenleiste läuft über die volle Höhe und trägt die Marke; die Werkzeugleiste steht nur über dem Inhalt. Die oberste Zeile ist der teuerste Platz der Anwendung — sie gehört den Werkzeugen, nicht der Identität. Beide Anwendungen bauen sie seit dem 19.08.2026 gleich.
Aufbau
Tickets
Test AG · Meldungen und ihr Stand
- Kopf der Leiste
- Signet und Wortmarke, verlinkt auf die Startseite, Trennlinie unten
- Werkzeugleiste links
- globale Suche — solange es keine gibt, bleibt der Platz leer
- Werkzeugleiste rechts
- Mandantenwähler · Kontextfilter · Papierkorb · Hilfe · Glocke · Hauptaktion · Avatar — Zustandswähler, Icon-Gruppe, Hauptaktion, Konto
- Avatar
- immer zuletzt, 32 px, Grund
#1E293B - Bildlauf
- Hülle
h-screen overflow-hidden; Leiste und Inhalt scrollen je für sich
Nichts steht zweimal
Der Mandant erscheint genau einmal, als Wähler in der Werkzeugleiste. Im Immotool stand er zusätzlich als stiller Text unter der Wortmarke — zwei Darstellungen desselben Zustands, von denen eine aussieht wie ein Bedienelement und keines ist.
Der Seitentitel gehört ebenfalls nicht in die Kopfzeile: Jede Seite
trägt ihn bereits als h1 im Inhalt.
Das Benutzermenü
- Auslöser
- Avatar mit bis zu zwei Initialen,
aria-label="Benutzermenü — {Name}" - Breite
- fest
w-60— sonst wächst das Menü mit der Adresse statt sie zu kürzen - gekürzt, voller Wert im
title - Reihenfolge
- Kopf · Trennlinie · Einstellungen · Abmelden
Seitenleiste
Dunkel, 224 Pixel, einklappbar. Beide Anwendungen verlinken einander im selben Tab — ein Wechsel der Grundfarbe beim Sprung wirkt wie ein Wechsel des Programms. Unterhalt hat am 19.08.2026 nachgezogen.
Aufbau
- Breite
- 224 px, eingeklappt 56 px, mobil als Schublade 256 px
- Grund
#1E293B, Text#CBD5E1- Gruppentitel
- 11 px, Grossbuchstaben,
#94A3B8, klappbar - Eintrag
px-2 py-1.5 rounded-md, 14 px- Aktiv
- Fläche
#2563EB, Text weiss, Gewicht 500 - Gesperrt
#94A3B8(der alte Ton#64748Bmisst hier nur 3.07), kein Zeiger,titleerklärt warum- Fremde Anwendung
- Pfeil ↗ am Zeilenende
Seitenkopf
Titel links, Aktionen rechts, in derselben Zeile; nur auf dem Telefon (unter 640 px) linksbündig unter Titel und Untertitel, sonst schrumpft der Titel zu «B…». Nie am Ende der Liste.
Immer so
Tickets
Test AG · Meldungen und ihr Stand
- Titel
- 18 px, 600,
#0F172A - Untertitel
- 12 px,
#64748B - Abstand nach unten
mb-4- Aktionen
size="sm", Iconh-3.5 w-3.5 mr-1, genau ein Hauptknopf- Breite der Seite
- voll — oder
max-w-3xlauf Lese- und Formularseiten. Sonst nichts.
Zählkachel
Beschriftung, Zahl, Akzentbalken. Sie steht über der Ticketliste (Klick filtert) und im Lagebild der Startseite (Klick führt zur gefilterten Liste) — ein Baustein für beides.
Die Leiste
- Höhe
36 px, einzeilig- Fläche
#FFFFFFmit Rahmen#E2E8F0- Balken
4 pxam linken Rand, Statusfarbe- Beschriftung
11 px, Versalien,#475569- Zahl
16 px, Gewicht 600,tabular-nums, rechts- Aktiv
- Fläche
#EFF6FF, Ring#2563EB, Zahl blau - Zähler 0
- bleibt stehen,
opacity 0.6
Weisse Fläche UND Rahmen. Bis zum 19.08.2026 stand die
Kachel auf #F8FAFC — exakt dem Wert des Seitengrunds — und
trug keinen Rahmen. Sie hatte damit keine Kante, nur einen farbigen
Strich. Dieselbe Rechnung wie bei den Statuschips: Eine Fläche, die sich
um 1.00 vom Grund abhebt, ist keine Fläche.
Einzeilig. Fünf Kacheln mit 18-px-Zahlen unter ihrer
Beschriftung sind eine zweite Überschriftenzeile — der Kopf der Seite
bekommt mehr Gewicht als ihr Inhalt.
Tabelle
Der häufigste Bildschirm beider Anwendungen. Es gibt drei Frameworks im Bestand — sie bleiben vorerst, aber sie sehen ab jetzt gleich aus.
Werkzeugleiste, Tabelle, Fusszeile
| Nummer | Titel | Status | Liegenschaft | Betrag | Erstellt |
|---|---|---|---|---|---|
| SB-TI-00124 | Wasser läuft aus der Decke im Treppenhaus | Offen | MEG Sonnenhof | 1'240.00 | 19.08.2026 |
| SB-TI-00123 | Lampe in der Einstellhalle flackert | In Bearbeitung | MEG Einstellhalle | 185.50 | 18.08.2026 |
| SB-TI-00122 | Briefkasten klemmt | Gelöst | MEG Sonnenhof | — | 17.08.2026 |
- Rahmen
rounded-lg border bg-white, Inhalt 12 px- Kopfzeile
bg-slate-50, klebt beim Scrollen, 11 px Grossbuchstaben leise- Zelle
px-2 py-1.5, einzeilig, überlanger Text mit «…»- Überfahren
bg-blue-50/50, aktive Zeilebg-blue-50- Zebrastreifen
- keine
- Zahlen
- rechtsbündig mit
tabular-nums - Sortierung
- Pfeil nur an der aktiven Spalte, dazu
aria-sort
Knöpfe
Vier Arten, zwei Grössen. Dieselbe Handlung sieht überall gleich aus — heute ist «Endgültig löschen» auf der Seite klein und im Dialog gross.
Arten
- Standard
- 32 px hoch,
rounded-lg, 14 px, Gewicht 500 - Klein
- 28 px, 12.8 px Schrift — Werkzeug- und Filterleisten
- Haupt
- genau einer je Ansicht
- Gefahr
- weiches Rot, nie als Hauptknopf gestaltet
- Beschriftung
- Verb plus Gegenstand; während der Arbeit sagt der Knopf, was er tut
Formularfelder
Beschriftung immer sichtbar über dem Feld. Ein Platzhalter ist kein Ersatz: Sobald jemand tippt, ist er weg — und mit ihm die Frage.
Zustände
- Höhe
- 32 px,
rounded-lg, Rahmen#E2E8F0 - Beschriftung
- 12 px, Gewicht 500, immer sichtbar
- Pflicht
- roter Stern hinter der Beschriftung
- Fokus
- Rahmen primär plus 3 px Ring
- Gesperrt
- halbe Deckkraft — und der Grund steht daneben
- Fehler
- unter dem Feld, sagt was zu tun ist
Auswahl mit Suche — ab acht Einträgen
- Schwelle
- Suchfeld ab 8 Einträgen — so viele passen ohne Scrollen ins Menü
- Umlaute
- in beide Richtungen: «gebaeude» findet «Gebäude» und umgekehrt
- Mehrere Wörter
- UND-verknüpft, Reihenfolge egal
- Tastatur
- Pfeile bewegen, Enter übernimmt, Esc leert erst die Suche
- Ohne Treffer
- «Nichts gefunden.» — nie ein leeres Menü
- Bildschirmleser
comboboxmitlistbox/option
Statuschips
Eine Form für alle: eckig, 12 px, normale Schreibweise, mit Rahmen.
Seit dem 19.08.2026 kommt sie aus components/ui/ton.tsx —
Statuschip mit einem der sechs Töne. Vorher gab es vier
Formen nebeneinander (eckig, rund, Badge, Roh-Span), und allein von
«Erfolg» sechs Farbfassungen.
Die eine Form
- Baustein
<Statuschip ton="info">Offen</Statuschip>— die Farbe steht nie im Aufruf- Töne
info·achtung·neutral·erfolg·erledigt·gefahr- Form
rounded(nichtrounded-full),px-1.5 py-0.5- Schrift
- 12 px, Gewicht 500, normale Schreibweise
- Farbe
- aus der Statustabelle — nie eine neue Kombination erfinden
- Rahmen
- Pflicht. Gemessen hebt sich die Fläche von der Tabellenzelle nur um Kontrast 1.03–1.10 ab; beim Überfahren der Zeile fällt das auf 1.00–1.05. Ohne Rahmen bleibt farbiger Text, kein Chip. Technisch
ring-1, nichtborder— der Ring verändert die Kastengrösse nicht. - Keine Versalien
- Grossbuchstaben kosten Breite, die in Tabellen knapp ist. Sie bleiben Spaltenköpfen und Gruppentiteln vorbehalten — Elementen, die keine Inhalte sind.
blue-50/blue-700
hiess gleichzeitig «offen», «Meldeportal», «Marke blau» und
«Titelbild» — wer den Chip sah, konnte nicht wissen, wovon er spricht.
Die Töne heissen jetzt nach der Aussage, nicht nach der Farbe: Wer
ton="erfolg" schreibt, entscheidet über die Bedeutung und
nicht über den Grünton.
Die vier Rollen je Ton
| Ton | Fläche | Text | Rahmen | Akzent | Chip |
|---|---|---|---|---|---|
info | #EFF6FF | #1E40AF | #BFDBFE | #3B82F6 | Offen |
achtung | #FEFCE8 | #854D0E | #FDE68A | #FBBF24 | In Bearbeitung |
neutral | #F1F5F9 | #334155 | #E2E8F0 | #94A3B8 | Wartend |
erfolg | #ECFDF5 | #065F46 | #A7F3D0 | #059669 | Gelöst |
erledigt | #F8FAFC | #475569 | #E2E8F0 | #64748B | Geschlossen |
gefahr | #FEF2F2 | #991B1B | #FECACA | #EF4444 | Fehler |
- Variablen
--status-<ton>,-foreground,-ring,-akzent— in beiden Anwendungen wortgleich- Akzent
- volldeckend, für Balken und Punkte (Zählkachel, Statuspunkt) — keine Fläche für Text
- Grün
- Emerald, nicht Green. Unterhalt hatte das schon so; das Immotool benutzte beide nebeneinander.
Dialog
Ein Dialog unterbricht — also fragt er so wenig wie möglich und ordnet, was er fragt. Ab sechs Feldern oder zwei Themen ordnen Kästen mit Titel.
Aufbau mit Kästen
Telefon-Schnellerfassung
Das Wichtigste zuerst. Alles Weitere lässt sich später am Ticket nachtragen.
- Breite
- bis 4 Felder
max-w-md· bis 8max-w-lg· darübermax-w-xl - Kästen
- ab 6 Feldern oder 2 Themen:
fieldsetmit Rahmen, Titel auf der Linie in 11 px Grossbuchstaben; BausteinFormularkasten - Abstände
gap-3im Kasten,gap-4zwischen Kästen- Schrift
- Beschriftung 12 px · Feldinhalt 14 px · Hinweis 12 px leise · Ankreuzfeld 12 px
- Raster
- ein oder zwei Spalten — nie drei; Freitext immer volle Breite
- Fusszeile
- abgesetzt, Abbrechen links, Hauptknopf rechts
- Reihenfolge
- folgt dem Gespräch, nicht der Datenbank
Meldungen
Ein Kasten, vier Töne. Jede Meldung sagt, was ist und was jetzt hilft.
Die vier Töne
- Baustein
<Hinweis ton="achtung">…</Hinweis>, optional mittitelundaktion(dem Weg heraus, rechts im Kasten)- Aufbau
rounded-lg border px-3 py-2 text-sm— dieselben Töne wie der Chip, aberborderstattring: Der Kasten steht frei, er muss keine Spaltenbreite schonen- Erfolg
- nur, wenn das Ergebnis nicht ohnehin sichtbar ist
- Nie
- nackter roter Text ohne Kasten
Leer und Laden
Zwei Leerzustände, die man nie verwechseln darf: nichts da — oder nur nichts gefunden.
Bestand leer gegen Filter ohne Treffer
Bestand leer
Filter ohne Treffer
<Leerzustand> ein
art="bestand" oder art="filter" — es gibt
keinen Vorgabewert, den man stehen lassen kann. gross macht
daraus den Wegweiser für eine ganze leere Seite.
Laden
- Regel
- Skelettbalken in der Form dessen, was kommt
- «Laden…»
- nur, wo die Form unbekannt ist
- Kreisel
- nur auf ganzen Schirmen, etwa der Anmeldung
Häufige Fehler
Alle vier sind im Bestand belegt — sie stehen hier, damit sie nicht wieder entstehen.
Rhythmus im Formular
So nicht
Vier Rasterwechsel, zwei Abstandswerte, drei Felder à 176 px — für eine E-Mail-Adresse zu schmal.
So
Ein Raster, ein Abstand. Freitext voll, Kurzfelder paarweise.
Ankreuzfeld in der Rasterzelle
So nicht
Ein Schalter, der wie ein Eingabefeld gerahmt ist.
So
Eigene Zeile im Kasten, 12 px wie die Beschriftungen.
Platzhalter statt Beschriftung
So nicht
Sobald jemand tippt, ist die Frage weg. War das die Telefonnummer der meldenden Person oder die des Hauswarts?
So
Die Beschriftung bleibt stehen.
Sicherheitsabfrage
So nicht
Natives confirm() — im Immotool an 29 Stellen. Sieht in
jedem Browser anders aus, lässt sich nicht übersetzen.
So
Anhang endgültig löschen
«Protokoll-2026-03.pdf» wird aus dem Speicher entfernt. Das lässt sich nicht rückgängig machen.
Zeichen, roter Titel, ein Satz zur Folge, das Verb auf dem Knopf. Der Fokus liegt auf «Abbrechen» — wer den Dialog mit der Tastatur wegdrückt, soll nicht löschen.