Files
MindSift/Doku/ui-patterns.md
T
sandrodachandClaude Opus 5.5 73fad1c5db
MindSift CI & Docker Release / Build, Test in Container & Push (push) Successful in 2m36s
feat(tasks): assign tasks in shared lists, unified people search, list avatars
- Tasks in shared task lists can be assigned to one or more people with access
  (task_assignees); assignments are pruned whenever access is lost
- UserAutocomplete: type-to-search everywhere, nothing before typing, max 3 results,
  first match preselected
- Task list and list tabs: avatar stack of members and round monochrome counter
- Shared list items remember who added them (list_items.created_by)
- Doku/ui-patterns.md documents the shared UI patterns

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 20:26:55 +01:00

2.9 KiB
Raw Blame History

UI-Muster

Wiederkehrende Bedienelemente, die überall gleich aussehen und sich gleich verhalten. Wer eines davon neu braucht, nimmt die vorhandene Komponente und baut keine eigene Variante.

Komponente: UserAutocomplete.tsx

Eingesetzt beim Teilen (UnifiedShareModal), beim Hinzufügen zu Gruppen (GroupsView) und beim Zuweisen von Aufgaben (TaskDetailModal).

  • Keine Liste vorab: Solange das Feld leer ist, erscheint nichts, auch nicht beim Reinklicken. Kein Dropdown mit allen Personen.
  • Erst beim Tippen erscheinen Treffer direkt unter dem Feld, höchstens 3 (MAX_RESULTS). Gesucht wird in Anzeigename, @Benutzername und E-Mail.
  • Der erste Treffer ist vorausgewählt: Tippen + Enter übernimmt ihn. Pfeiltasten wechseln, Escape schließt.
  • Bereits gewählte oder freigegebene Personen werden über excludeUserIds ausgeblendet.
  • Einzelauswahl (Teilen, Gruppen): selectedUser setzen; das Feld zeigt dann die gewählte Person mit ×.
  • Mehrfachauswahl (Aufgaben zuweisen): selectedUser={null} lassen und in onSelectUser zur Liste hinzufügen. Die Gewählten stehen als Chips (Avatar, Name, ×) über dem Feld, das Feld bleibt für die nächste Suche frei.

Profilbilder als Stapel

Komponente: AvatarStack.tsx (nutzt UserAvatar)

  • Kleine runde Profilbilder, leicht überlappend, höchstens 3. Weitere Personen erscheinen als monochromer Kreis „+n“.
  • Ohne Profilbild zeigt UserAvatar die Initialen.
  • ringClass bekommt die Farbe der Fläche dahinter (meist ring-[var(--bg-panel)] oder ring-[var(--bg-app)]), damit die Kreise sauber getrennt sind.
  • Größen: xxs (16 px) in Tabs, Kanban-Karten und Listeneinträgen, xs (20 px) in Aufgabenzeilen und Kopfzeilen.
  • Kein Hover-Effekt im Stapel selbst. Einzige Ausnahme ist die Anwesenheit in Notizen (PresenceAvatars.tsx): Dort zeigt Hover oder Tastaturfokus die Liste „Gerade online“.
Ort Wer wird gezeigt
Notiz-Kopfzeile wer die Notiz gerade geöffnet hat (Profilbilder aus /users/directory)
Tabs der Aufgabenlisten und Listen alle mit Zugriff außer mir (members)
Aufgabenzeile und Kanban-Karte zugewiesene Personen (nur in geteilten Listen)
Eintrag einer geteilten Liste wer ihn hinzugefügt hat (createdBy); ältere Einträge ohne Autor zeigen nichts

Zähler

CSS-Klasse badge-count in index.css: runder Zähler in der Form der Zähler der Navigationsleiste, aber monochrom (grau gefüllt) statt in der Akzentfarbe.

  • Verwendet für die Anzahl offener Einträge in den Tabs der Aufgabenlisten und der Listen.
  • Die Zähler der Navigationsleiste bleiben blau (Akzent), weil sie auf neue Inhalte aufmerksam machen.
  • Kein eckiges badge-neutral mehr für Zähler in Tabs.