Skip to content
Hey AlbertBrand and design system
As MarkdownDeutschDE

Foundations

Space

The 8 px grid, the paddings and margins measured from the reference screens, the sidebars and the three target sizes for pointer, finger and children’s hands.

Everything sits on an 8 px grid. The half step of 4 px is allowed when two things belong tightly together. Other spacings do not exist.

The grid

--raum-halb4px
--raum-18px
--raum-216px
--raum-324px
--raum-432px
--raum-540px
--raum-648px
--raum-864px
--karte-innen12px
--karte-abstand8px
--flaeche-rand-mac32px
--flaeche-rand-phone20px

Everything sits on the 8 px grid, with 4 px as a half step.

TokenFor
--raum-halbbetween an icon and its text, between dots
--raum-1between pills, between buttons in a row
--raum-2between groups inside a card, between tabs
--raum-3between sections of a surface
--raum-4the margin of a surface on the Mac
--raum-5 to --raum-8large sections, mostly on the website

Padding and margins

These measures were taken from the reference screens. They apply in the app and on the website.

  • Card padding --karte-innen: from the card edge to its content.
  • Card gap --karte-abstand: between two cards, horizontally and vertically.
  • Surface margin, Mac --flaeche-rand-mac: between sidebar and content, and all round.
  • Surface margin, iPhone --flaeche-rand-phone: left and right.

There is no token for the iPad yet. The iPad chapter describes the proposal.

The sidebar is Hey Albert’s black signature.

  • Mac: fully expanded --leiste-mac wide, collapsed --leiste-mac-eng. Collapsed, only Albert’s ball and the place icons remain.
  • iPhone: --leiste-phone-hoehe tall, fixed at the bottom, with radius --radius-leiste. The pink plus sticks out.

More in the Mac and iPhone chapters.

Target sizes

Every element you can operate has a minimum size. Never below it, not even in dense lists.

28px
Pointer · Mac--ziel-zeiger
44px
Finger · iPhone, iPad--ziel-finger
56px
Child · everything children use--ziel-kind
  • Pointer, 28: Mac with mouse or trackpad. Precise, therefore small.
  • Finger, 44: iPhone and iPad. That is Apple’s minimum for touch.
  • Child, 56: everything children operate. Small hands are less precise. The type grows with it, so the button does not look clumsy, just bigger.

The test question for every view: could a nine-year-old use it alone? Lena is nine. If she misses her checkmark, the target is too small.

Knopf

components/bausteine/Knopf.jsx
Primär · zweit · klein · inaktiv
Zeiger 32 · Finger 44 · Kind 56

Der Handlungsknopf auf Karten und Flächen — schwarz für den einen Schritt, beige für den zweiten.

<Knopfreihe>
  <Knopf art="primaer" onClick={ichFahre}>Ich fahre</Knopf>
  <Knopf art="zweit">Später</Knopf>
</Knopfreihe>
<Knopf ziel="kind" zeichen="check">Fertig</Knopf>

Register Family Manager: kurz, zupackend, ein Verb — „Ich fahre“, „Tobias fragen“, „Übernehmen“, „Rückgängig“. Nie „OK“, nie „Abbrechen“ ohne Gegenstand.

Ein Knopf ist immer einzeilig. Knöpfe stehen in einer Knopfreihe: nebeneinander, wenn beide Platz haben, sonst untereinander in voller Breite — nie ein zweizeiliger Knopf, nie zwei ungleich breite Knöpfe untereinander. ziel="kind" gibt 56 px mit 16-px-Schrift, wo Kinder bedienen. inaktiv rechnet eigene Rollen statt Deckkraft.

Types (.d.ts)
/**
 * Handlungsknopf. Primär schwarz mit hellem Text („Ich fahre“), Zweitknopf beige („Später“),
 * Klein ohne Fläche für Nebenwege. Schriftgrad und Polster wachsen mit der Zielfläche.
 */
export interface KnopfProps {
  art?: "primaer" | "zweit" | "klein";
  /** Zielfläche: Zeiger 32 / 12,5 px, Finger 44 / 14 px, Kind 56 / 16 px. */
  ziel?: "zeiger" | "finger" | "kind";
  /** Sach-Rolle oder Lucide-Name eines Zeichens links im Knopf. */
  zeichen?: string;
  /** Inaktiv ist eine eigene Rolle, keine Deckkraft. */
  inaktiv?: boolean;
  /** Füllt die Breite - für iPhone-Karten. */
  breit?: boolean;
  /** Erlaubt Zeilenumbruch in der Beschriftung. Standard aus: ein Knopf ist einzeilig;
   *  wird die Reihe zu eng, stapelt die Knopfreihe die Knöpfe in voller Breite. */
  umbruch?: boolean;
  type?: "button" | "submit" | "reset";
  children?: React.ReactNode;
  onClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;
  style?: React.CSSProperties;
}
export function Knopf(props: KnopfProps): JSX.Element;

/** Die Knopfreihe: nebeneinander, wenn Platz ist, sonst untereinander in voller Breite. */
export interface KnopfreiheProps {
  children?: React.ReactNode;
  /** Mindestbreite je Knopf in px, ab der zwei nebeneinander passen. Standard 104. */
  mindest?: number;
  ausrichtung?: "mitte";
  style?: React.CSSProperties;
}
export function Knopfreihe(props: KnopfreiheProps): JSX.Element;

Phone and desktop

--umbruch-tisch is the line between phone and desktop. Below it the phone layout applies, above it the desktop layout. The token exists only as a Tailwind breakpoint, not as a CSS variable.

Most website visits come from a phone. So every surface is built for the phone first.

In short