From b07a7acf4281a9e4d2798150bf2d3361c471b5b2 Mon Sep 17 00:00:00 2001 From: Sandro Date: Wed, 28 Oct 2026 23:21:20 +0100 Subject: [PATCH] fix(ui): tab counters sit on the label like in the nav bar Co-Authored-By: Claude Opus 5.5 --- Doku/ui-patterns.md | 2 +- .../src/features/lists/SharedListsView.tsx | 11 +++++++---- frontend/src/features/triage/TasksView.tsx | 19 ++++++++++++------- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/Doku/ui-patterns.md b/Doku/ui-patterns.md index 0c2e1f5..6fe68b2 100644 --- a/Doku/ui-patterns.md +++ b/Doku/ui-patterns.md @@ -49,7 +49,7 @@ Komponente: [CountBadge.tsx](../frontend/src/components/CountBadge.tsx), CSS-Kla - `muted` (Standard): reine Anzahl. Tabs der Aufgabenlisten und Listen, Organisationen, mobiles Menü. - Beide kommen aus den Theme-Variablen (`--accent-primary`/`--text-on-accent` bzw. `--text-muted`/`--bg-panel`) und passen sich damit jedem Theme an. - **Position (`position`):** - - `corner`: Benachrichtigungs-Badge oben rechts am nächsten `relative` Elternelement, mit Ring in der Seitenfarbe. So in der Navigation und an den Tabs. Zeilen mit solchen Tabs brauchen etwas Abstand (`gap-x-3`, `pt-2`), damit der Kreis nicht in den Nachbar-Tab ragt. + - `corner`: Benachrichtigungs-Badge oben rechts am nächsten `relative` Elternelement, mit Ring in der Seitenfarbe. In der Navigation und an den Tabs sitzt er **auf dem Text**: der Text steht in einem `relative inline-flex`-Span (mit `pr-2`, solange ein Zähler da ist), der Kreis bekommt `-top-1.5 -right-1`. - `inline`: im Textfluss. - Zahlen im mobilen Menü (`MobileActionContext`, `badge: number`) werden automatisch als `CountBadge` gezeigt; Text-Badges wie „2 aktiv“ bleiben Textmarken. - **Wichtig für neue Klassen:** Tailwind entfernt Klassen aus `@layer components`, die nicht wörtlich im Code stehen. Klassennamen deshalb nie zusammensetzen (`count-badge-${variant}`), sondern ausschreiben. diff --git a/frontend/src/features/lists/SharedListsView.tsx b/frontend/src/features/lists/SharedListsView.tsx index 0e0a28f..372d47c 100644 --- a/frontend/src/features/lists/SharedListsView.tsx +++ b/frontend/src/features/lists/SharedListsView.tsx @@ -843,8 +843,8 @@ export const SharedListsView: React.FC = ({ onRefreshGloba
{/* Top Header: List Tabs & Actions (Desktop) */}
- {/* List Tabs (counters sit on the top right corner, hence the extra gap) */} -
+ {/* List Tabs */} +
{lists.map((lst) => { const openCount = deduplicateItems(lst.items || []).filter((i) => !i.isCompleted).length; const isSelected = activeList?.id === lst.id; @@ -860,7 +860,11 @@ export const SharedListsView: React.FC = ({ onRefreshGloba className="h-full px-3 text-xs font-medium flex items-center gap-1.5 rounded-btn" > {lst.icon} - {lst.title} + {/* Counter on the label, like in the nav bar */} + 0 ? 'pr-2' : ''}`}> + {lst.title} + + = ({ onRefreshGloba className="ml-0.5" /> - {isSelected && lists.length > 1 && ( {safeTaskLists.map((tl) => ( @@ -1399,7 +1402,10 @@ export const TasksView: React.FC = ({ className="h-full px-3 text-xs font-medium flex items-center gap-1.5 rounded-btn" > {tl.icon} - {tl.title} + + {tl.title} + + {(() => { const isShared = (tl.shares && tl.shares.length > 0) || (tl.members && tl.members.length > 1); @@ -1422,7 +1428,6 @@ export const TasksView: React.FC = ({ ); })()} - {selectedListId === tl.id && (