Zum Inhalt
Hey AlbertMarke und Designsystem
Als MarkdownEnglishEN

Grundlagen

Farbe

Warmes Papier, Tinte, ein rosa Akzent und ein Klebezettel je Mensch. Jede Farbe ist eine Rolle mit fester Bedeutung, hell und dunkel aus einer Quelle.

Hey Albert sieht aus wie ein Notizbuch. Der Grund ist warmes Papier, die Schrift ist Tinte. Jeder Mensch hat seinen Klebezettel. Ein Marker hebt hervor, was jetzt zählt. Die Leiste ist schwarz, der Akzent ist rosa.

Farbe kommt aus den Karten, nicht aus dem Grund. Der Grund bleibt ruhig: keine Verläufe, keine Texturen, keine Muster.

Rollen, nie Leitern

Jede Farbe hat einen Namen, der sagt, wofür sie da ist. Wir sagen „Karte“, nicht „Beige 200“. Ein Bauteil nennt nur die Rolle, nie den Wert. So schaltet der dunkle Modus um, ohne dass ein Bauteil davon weiß.

Die Werte stehen an genau einer Stelle: packages/design-system/tokens/quelle/. Daraus entstehen CSS, Tailwind und Swift. Alles auf dieser Seite wird zur Bauzeit von dort gelesen.

/* richtig: die Rolle */
.termin { background: var(--flaeche-karte); color: var(--text-koerper); border-radius: var(--radius-karte); }

/* falsch: der Wert. Im dunklen Modus bleibt die Karte hell. */
.termin { background: #EEE8DD; }
// richtig: die Rolle aus AlbertFarbe, sie trägt hell und dunkel
Text("Schwimmen mit Lena")
    .foregroundStyle(AlbertFarbe.textKoerper)
    .padding(AlbertRaum.karteInnen)
    .background(AlbertFarbe.flaecheKarte, in: .rect(cornerRadius: AlbertForm.radiusKarte))

// falsch: eine eigene Farbe oder eine Weiche nach dem Erscheinungsbild
// Color(hex: 0xEEE8DD) · if colorScheme == .dark { … }

Grundfarben

Die Grundfarben sind das Material. Die meisten Bauteile benutzen sie nicht direkt, sondern über die semantischen Rollen weiter unten.

#F8F2E7#14110DSeitenhintergrund, warmes Creme
#EEE8DD#2A2620Standardkarte (Termin), beige
#FBF7EE#201C17Tagesreiter, Menüs, Badges auf Karten, Suchfeld
#EDE6D8#322D26Segment-Regler inaktiv, sekundäre Knöpfe
#171717#0B0A08Leiste, primäre Knöpfe, heutiger Tag, aktive Auswahl
#2C2C2CSchwarz unter dem Zeiger (Knopf, Kreis, heutiger Reiter)
#3A3A3ASchwarz beim Drücken
#1A1A1A#F4EFE6Fließtext, Titel
#6E6A63#A9A297Zweittext, Zeiten, Beschriftungen
#D8D0BF#3D372EHaarlinien 1 px, Ränder von Feldern und Kreisen
#F3B8DFAkzent: Plus, Jetzt-Zeit, aktiver Ort, Zähler, Lupe
#F7CDE8Zustands-Pillen, Tageskreis mit Offenem
#F5D95CFamilie und Rituale, Alberts Vorschlag (iPhone), Zahlen
#E4C63AFormen auf gelben Karten
#BFD9A6Bewertung: gut (HQ)
#F5D95C→ gelbBewertung: Potenzial (HQ)
#EBA7A0Bewertung: schwach (HQ)
#2B2A25
#BFCDF0Fahrten
#9DB1E3Formen auf blauen Karten
#B8467F#F09CC6nur gestrichelter Rand für „ohne Zuständigen“
#4A4530Zweittext auf gelben Flächen
#F4EFE6Text und Zeichen auf Schwarz
#C9A0BD#B98CADgedämpftes Rosa-Grau für den Sonntag
  • --grund ist das Papier. Jede Fläche liegt darauf.
  • --karte ist die vertiefte Fläche, die Standardkarte für Termine.
  • --hell ist, was schwebt: Tagesreiter, Menüs, Suchfeld, Abzeichen auf Karten.
  • --schwarz trägt die Leiste, den Primärknopf und den heutigen Tag.
  • --tinte ist Fließtext und Titel. --grau ist Zweittext: Zeiten, Orte, Beschriftungen.
  • --linie zieht die Haarlinien.

Bedeutungen, die nie getauscht werden

Vier Farben tragen eine Bedeutung. Diese Bedeutung gilt überall: in der App, auf der Website, in Social Media, im Jahresbuch.

#F3B8DF→ rosaAkzent und „jetzt“ – nie Fehler
#F7CDE8→ rosa-hell
#B8467F#F09CC6→ offen
#BFCDF0→ blau
#9DB1E3→ blau-dunkel
#F5D95C→ gelb
#E4C63A→ gelb-dunkel
#EEE8DD#2A2620→ karte
FarbeHeißtBeispiele
Rosa (--akzent, --rosa)Akzent und JetztPlus, Jetzt-Zeit, aktiver Ort, Zähler, Lupe
Rosa hell (--rosa-hell)Zustand, der Aufmerksamkeit brauchtPille „Kein Fahrer“, Tageskreis mit Offenem
Gelb (--bedeutung-familie)Familie und RitualSonntagsrunde, Mittagessen bei Oma Grete, große Zahlen, Alberts Vorschlag auf dem iPhone
Blau (--bedeutung-fahrt)FahrtAbholen, Rückfahrt, Fahrt-Pillen
Offen-Rosa (--offen)ohne Zuständigennur als gestrichelter Rand, nie als Fläche
Grau gestrichelt (--rand-vorschlag)Vorschlag von Albertgestrichelter Rand, ohne eigene Füllung

Rosa heißt nie „Fehler“. Ein Fehler hat bei uns keine Alarmfarbe. Er sagt, was passiert ist und was ihr tun könnt.

Gelb ist nie Schriftfarbe. Auf dem Papier ist Gelb kaum lesbar. Gelb ist immer Fläche, der Text darauf läuft über --text-auf-gelb.

Semantische Rollen

Bauteile benutzen diese Rollen. Sie zeigen auf eine Grundfarbe und können im dunklen Modus auf eine andere zeigen.

Flächen

#F8F2E7#14110D→ grund
#FBF7EE#201C17→ hellwas schwebt: Menü, Reiter, Feld
#EEE8DD#2A2620→ karteTermin
#BFCDF0→ blauFahrt
#F5D95C→ gelbFamilie und Ritual
transparentVorschlag: gestrichelt, ohne Füllung
#171717#0B0A08→ schwarz
rgba(26, 26, 26, 0.32)rgba(0, 0, 0, 0.56)dämpft, was dahinter liegt
rgba(244, 239, 230, 0.08)Ort in der Leiste unter dem Zeiger
rgba(244, 239, 230, 0.14)aktiver Ort in der Leiste unter dem Zeiger

--flaeche-schleier ist die einzige durchscheinende Farbe. Er dämpft, was hinter einem Dialog, einem Menü oder dem Scanner liegt. Milchglas und Unschärfe gibt es nicht.

Text

#1A1A1A#F4EFE6→ tinte
#1A1A1A#F4EFE6→ tinte
#6E6A63#A9A297→ grau
#F4EFE6→ leistentext
#9A948B#8C857A
#4A4530→ auf-gelb
#1A1A1A→ tinte
#4A4F63Zweittext auf blauen Flächen (Fahrt)
#1A1A1A→ tinte
#A29B8F#7A7469gerechnet, keine Deckkraft

Text auf Gelb, Blau und Rosa hat eigene Rollen: --text-auf-gelb, --text-auf-blau, --text-auf-rosa. Sie bleiben im dunklen Modus dunkel, weil die Fläche hell bleibt. Wer dort --tinte nimmt, schreibt nachts creme auf hell.

--text-inaktiv ist eine gerechnete Farbe. Inaktiv heißt bei uns nie „halbe Deckkraft“.

Linien und Ränder

#D8D0BF#3D372E→ linie
#C2B8A2#524A3DKontur 1,5 px statt 1 px
#E4DDCE#2B2620gerechnet, keine Deckkraft
#1A1A1A#F4EFE6→ tintegestrichelte Jetzt-Achse
#6E6A63#A9A297→ graugestrichelt grau: Vorschlag von Albert
#B8467F#F09CC6→ offengestrichelt: ohne Zuständigen
#B8467F#F09CC6→ offen:focus-visible Ring
#171717#F4EFE6→ schwarz
#2C2C2C#E2DACD→ schwarz-zeigerDruck macht die Fläche nicht dunkler, sondern die Schrift ruhiger
#3A3A3A#CFC6B7→ schwarz-druck
#F4EFE6#171717→ leistentext
#EDE6D8#322D26→ knopf-zweit
#1A1A1A#F4EFE6→ tinte
#E9E2D4#2B2620
#A29B8F#7A7469→ text-inaktiv

Der Primärknopf wird unter dem Zeiger und beim Drücken heller, nicht dunkler. Auf Papier wirkt Aufhellen ruhiger. Im dunklen Modus dreht er sich um: helle Fläche, dunkle Schrift.

Personenfarben

Jeder Mensch im Haushalt hat einen Platz und damit eine Farbe. Acht Plätze gibt es. Familie Sonntag belegt fünf: Anna, Tobias, Felix, Lena und Sofia. Die Großeltern sind Gäste.

A
Anna--person-1#D5F5C2
T
Tobias--person-2#A8E5E5
F
Felix--person-3#F6D0FF
L
Lena--person-4#FFD6A5
S
Sofia--person-5#AEBAFF
G
Oma Grete--person-6#C7EFD0
W
Opa Werner--person-7#FFC9C9
H
Oma Hilde--person-8#E3DCA8

Jeder Platz hat zwei Gesichter:

  • Der Zettel (--person-1 bis --person-8) ist eine helle Fläche. Avatar, Klebezettel, eigene Spur. Text darauf ist immer --person-text, also Tinte. Der Zettel bleibt auch im dunklen Modus hell, denn ein Klebezettel ist auch nachts ein heller Schnipsel.
  • Die Linie (--person-linie-1 bis --person-linie-8) ist die kräftigere Stufe für Punkte, Ränder und Spuren. Im dunklen Modus wird sie noch kräftiger, sonst verschwindet sie.

Drei Regeln gelten immer:

  1. Farbe ist nie der einzige Träger. Neben jeder Personenfarbe steht die Initiale oder der Name. Die Personenlinien erreichen auf dem Papier nur zwischen 1,7:1 und 2,9:1. Das System verspricht dort keinen Kontrast, deshalb tragen Initiale und Name.
  2. Eine Person, eine Farbe, überall. Lena ist Pfirsich auf dem iPhone, auf dem Mac und in der Kampagne. Wer Anna kennt, erkennt ihre Farbe wieder.
  3. Gäste sind umrandet, Haushalt und Helfer gefüllt. Oma Grete steht als Ring da, Sofia als gefüllter Zettel.

Kinder gestalten ihren Bereich selbst, innerhalb von Kontrast-Leitplanken (Leitsatz 4).

Dunkler Modus

Der dunkle Modus ist keine zweite Gestaltung. Er definiert dieselben Rollen unter :root[data-modus="dunkel"] neu. In SwiftUI trägt jede Rolle beide Werte und entscheidet zur Laufzeit.

  • --grund wird ein tiefes Schwarz-Braun, --karte ein dunkles Beige-Grau.
  • --tinte wird Creme.
  • Rosa, Gelb und Blau bleiben helle Flächen. Text darauf bleibt dunkel.
  • Die Personen-Zettel bleiben hell, ihre Linien werden kräftiger.
  • --offen wird eine kräftigere Stufe, damit der gestrichelte Rand nachts trägt.

Die Farbfelder auf dieser Seite schalten mit. Der Knopf oben rechts wechselt den Modus.

Kontrast

Fließtext und Bedienelemente brauchen mindestens 4,5:1. Flächen und Konturen brauchen mindestens 3:1. Die Tabelle rechnet beide Modi aus den Tokens, bei jedem Bau neu.

PaarHellDunkel
Aatinte auf grund15,62:1 · AAA16,43:1 · AAA
Aatinte auf karte14,27:1 · AAA13,13:1 · AAA
Aagrau auf grund4,83:1 · AA7,44:1 · AAA
Aagrau auf karte4,41:1 · 3:15,94:1 · AA
Aatext-inaktiv auf grund2,47:1 · zu schwach4,06:1 · 3:1
Aatinte auf rosa10,55:1 · AAA1,44:1 · zu schwach
Aatinte auf gelb12,40:1 · AAA1,23:1 · zu schwach
Aatinte auf blau10,94:1 · AAA1,39:1 · zu schwach
Aatinte auf person-114,64:1 · AAA1,04:1 · zu schwach
Aatinte auf person-59,34:1 · AAA1,63:1 · zu schwach
Aahell auf schwarz16,77:1 · AAA1,17:1 · zu schwach
Aaoffen auf grund4,47:1 · 3:19,21:1 · AAA
Aalinie auf grund1,38:1 · zu schwach1,60:1 · zu schwach

Zur Kenntnis, nicht als Versprechen: Rosa, Blau und Gelb als Fläche auf dem Papier liegen bei 1,3:1 bis 1,5:1. Diese Flächen grenzen sich über ihre Haarlinie und ihren Inhalt ab, nicht über den Farbabstand.

Farben nur im HQ

--ampel-gruen, --ampel-gelb, --ampel-rot und --text-auf-ampel gibt es nur im internen HQ. Dort bewerten sie Zahlen: gut, Potenzial, schwach. In der App für Familien kommen sie nicht vor. Ein Kind sieht nie einen roten Stand.

Kurz