Zum Inhalt
Hey AlbertMarke und Designsystem
Als MarkdownEnglishEN

Grundlagen

Form

Radien aus fünf Stufen, Linien, die etwas bedeuten, und Tiefe ohne Schatten – aus Schleier, Kontur und Kippung. Dazu Klebezettel, spielerische Formen und die Anatomie einer Karte.

Die Formen von Hey Albert sind weich und flach. Alles ist Papier auf Papier. Nichts glänzt, nichts wirft Schatten.

Radien

Fünf Radien, jeder mit einer Aufgabe. Was keinen Token hat, hat keinen Radius.

--radius-karte16pxKarten und Menüs
--radius-klein12pxTagesreiter, kleine Karten
--radius-leiste24pxiPhone-Leiste
--radius-block22pxMac-Block
--radius-pille999pxPillen, Kreise, Knöpfe

Kein freier Radius. Was keinen Token hat, hat keinen Radius.

  • --radius-karte für Karten, Menüs, Dialoge.
  • --radius-klein für Tagesreiter und kleine Karten.
  • --radius-leiste für die iPhone-Leiste, --radius-block für den schwarzen Block der Mac-Leiste.
  • --radius-pille für Pillen, Kreise und alle Knöpfe. Knöpfe sind bei uns immer rund.

Linien bedeuten etwas

Eine Linie ist bei uns nie Schmuck. Die Art des Rands sagt, in welchem Zustand eine Sache ist.

ruhiges Feld
Haarlinie 1 px--strich-haar · --linie
Zeiger darauf, statt Schatten
Kontur 1,5 px--strich-stark
Vorschlag von Albert
Gestrichelt grau--strich-gestrichelt · --muster-gestrichelt
ohne Zuständigen
Gestrichelt Offen-Rosa--offen
2 px mit 2 px Abstand, nur :focus-visible
Fokus-Ring--fokus-ring · --fokus-abstand
liegt: −0,3°
Kippung--kippung-zettel
RandHeißtTokens
durchgezogen, Haarlinieruhiges Feld, alles geklärt--strich-haar, --linie-haar
durchgezogen, Konturder Zeiger liegt darauf--strich-stark, --linie-stark
gestrichelt grauVorschlag von Albert, noch nicht übernommen--strich-gestrichelt, --muster-gestrichelt, --rand-vorschlag
gestrichelt Offen-Rosaohne Zuständigen--rand-offen
gestrichelt dünnBereichs-Chip im Kopf der Fläche--strich-haar
Ring mit AbstandFokus über die Tastatur--fokus-ring, --fokus-abstand, --rand-fokus

Haarlinien sind immer --strich-haar. Das Strichmuster ist überall dasselbe: --muster-gestrichelt.

Keine Schatten

Es gibt keine Schatten. Nicht unter Karten, nicht unter Menüs, nicht unter Knöpfen. Der Token --schatten steht auf none und ist nicht verhandelbar.

Tiefe entsteht aus drei Mitteln:

  1. Der Schleier. --flaeche-schleier dämpft, was hinter einem Dialog, einem Menü oder dem Scanner liegt.
  2. Die Kontur. Was der Zeiger berührt, bekommt eine stärkere Linie: --strich-haar wird --strich-stark. Die Fläche bleibt gleich.
  3. Die Kippung. Was liegt, ist leicht gekippt (--kippung-zettel). Was schwebt, steht gerade (--kippung-null). Klebezettel liegen, Menüs schweben.

Klebezettel

Jeder Mensch hat seinen Zettel in seiner Personenfarbe. Avatare, Spuren je Mensch und die Zettel auf der Fläche „Heute“ sind Klebezettel.

  • Fläche --person-1 bis --person-8, Text --person-text.
  • Leicht gekippt, abwechselnd nach links und rechts: --kippung-zettel.
  • Immer mit Initiale oder Name. Farbe allein reicht nie.

Spielerische Formen

Stern, Herz, Kleks, Kreis und Puzzleteil (Bauteil DekoForm) bringen Freude auf eine Fläche. Sie sind kein Schmuck für alles.

  • Nur auf gelben und rosa Flächen.
  • Immer in der dunkleren Stufe derselben Farbe: --gelb-dunkel auf Gelb.
  • Angeschnitten am Rand der Fläche, nie mitten im Text.
  • Nie auf Karten mit Bedienelementen, nie im Safe, nie bei Finanzen, nie im Register Sachbearbeiter.

DekoForm

components/bausteine/DekoForm.jsx
Auf Gelb · dunklere Stufe
Auf Blau

Die spielerische Form auf einer gelben oder rosa Fläche – Freude, kein Schmuck.

<DekoForm form="stern" groesse={110} farbe="var(--gelb-dunkel)" style={{ right: -18, bottom: -22 }} />

Die Elternfläche braucht position: relative und overflow: hidden. Nie auf Karten mit Bedienelementen, nie im Safe, nie bei Finanzen.

Typen (.d.ts)
/** Spielerische Form als Deko auf gelben und rosa Flaechen - Stern, Herz, Kleks, Puzzleteil. */
export interface DekoFormProps {
  form?: "stern" | "herz" | "kleks" | "kreis" | "puzzle";
  groesse?: number;
  /** Immer die dunklere Stufe derselben Flaechenfarbe: var(--gelb-dunkel), var(--blau-dunkel). */
  farbe?: string;
  drehung?: number;
  style?: React.CSSProperties;
}
export function DekoForm(props: DekoFormProps): JSX.Element;

Die Anatomie einer Karte

Die Karte ist das Ding, aus dem Heute, Woche und Kalender bestehen. Sie hat immer denselben Aufbau.

  • Fläche nach Art: Termin --flaeche-karte, Fahrt --flaeche-karte-fahrt, Familie --flaeche-karte-familie, Vorschlag --flaeche-karte-vorschlag mit grauem gestricheltem Rand, Offen mit gestricheltem Rand in Offen-Rosa.
  • Radius --radius-karte, Polster --karte-innen, Abstand zur nächsten Karte --karte-abstand.
  • Rand: eine Haarlinie als Platzhalter für die Kontur. Kein Schatten.
  • Kopf: links das Symbol der Sache im hellen Kreis, rechts die Punkte der Menschen. Dazwischen nichts, kein Menü, kein Pfeil.
  • Titel in --grad-karten-titel, darunter Zeit und Ort in --grad-zweit.
  • Pillen für Zustände, zum Beispiel „Kein Fahrer“.
  • Knöpfe unten, in einer Knopfreihe. Ein Vorschlag hat immer zwei: „Übernehmen“ und „Rückgängig“, oder eine Frage mit zwei Antworten.

Drei Träger an drei Orten: Die Kartenfarbe sagt die Art. Das Symbol sagt die Sache. Die Punkte sagen die Leute.

Karte

components/karten/Karte.jsx
AL
Kieferorthopädin
Praxis Dr. Voss
16:00 – 17:00
TF
Handball, Halle Süd
Schule → Halle Süd
Fr 16:40
Tobias fährt 16:40 · Kombi
ATFL
Mittagessen bei Oma Grete
So 12:30 · alle
Bei Tobias steht ab 13:00 nichts. Fragen?
Vorschlag von Albert
Abholen Halle Süd
19:00
Ohne Zuständigen
Mathe mit Felix17:30F

Die Karte – das Ding, aus dem Heute, Woche und Kalender bestehen. Ein Datenmodell, viele Ansichten.

<Karte art="fahrt" titel="Rückfahrt Auswärtsspiel" ort="Sportplatz Nord → Zuhause"
  zeit="14:00 – 14:30" leute={["felix"]} hoehe="hoch"
  pillen={<ZustandsPille>Kein Fahrer</ZustandsPille>}
  knoepfe={<Knopf>Ich fahre</Knopf>} />

<Karte art="vorschlag" titel="Bei Tobias steht ab 13:00 nichts. Fragen?"
  unterzeile="Vorschlag von Albert"
  knoepfe={<KarteVorschlagKnoepfe onUebernehmen={…} onZurueck={…} />} />

Register Family Manager, kurz und ruhig. Die Bedeutungen werden nicht getauscht: blau ist Fahrt, gelb ist Familie, gestrichelt rosa heisst "ohne Zuständigen". Ein Vorschlag hat immer zwei Knöpfe – Albert erledigt nie still.

Typen (.d.ts)
/**
 * Die Karte in fuenf Arten. Die Farbe sagt die Art, das Symbol die Sache, die Punkte die Leute.
 */
export interface KarteProps {
  /** "termin" beige | "fahrt" blau | "familie" gelb | "vorschlag" gestrichelt grau | "offen" gestrichelt rosa. */
  art?: "termin" | "fahrt" | "familie" | "vorschlag" | "offen";
  /** Kartentitel, ein Gegenstand: "Rückfahrt Auswärtsspiel". */
  titel: string;
  /** Zweitzeile: Ort oder Bündel-Teile, mit " · " getrennt. */
  ort?: React.ReactNode;
  /** Zeitspanne als "16:00 – 17:00" (Halbgeviertstrich mit Leerzeichen). */
  zeit?: string;
  /** Wer dabei ist; der Zustaendige zuerst. */
  leute?: string[];
  /** Sach-Symbol, wenn es nicht aus der Art folgt: "schule", "sport", "arzt", "musik". */
  symbol?: string;
  /** "kurz" (78 px) oder "hoch" (132 px) - fuer das Stundenraster. */
  hoehe?: "kurz" | "hoch";
  /** Zustands- und Fahrt-Pillen. */
  pillen?: React.ReactNode;
  /** Handlungsknoepfe; bei Vorschlaegen immer zwei. */
  knoepfe?: React.ReactNode;
  /** Kleine Zeile unter dem Inhalt, z. B. "Vorschlag von Albert". */
  unterzeile?: React.ReactNode;
  /** Einzeiler fuer Listen: Symbol, Titel, Zeit, Punkt. */
  kompakt?: boolean;
  klickbar?: boolean;
  /** Leicht gekippt, wie ein liegender Klebezettel. */
  gekippt?: boolean;
  children?: React.ReactNode;
  style?: React.CSSProperties;
}
export function Karte(props: KarteProps): JSX.Element;
export function KarteVorschlagKnoepfe(props: { uebernehmen?: string; zurueck?: string; onUebernehmen?: () => void; onZurueck?: () => void }): JSX.Element;