diff --git a/src/components/staff/AgentStaffCard.tsx b/src/components/staff/AgentStaffCard.tsx index 32e7dba..8674696 100644 --- a/src/components/staff/AgentStaffCard.tsx +++ b/src/components/staff/AgentStaffCard.tsx @@ -55,9 +55,15 @@ export const AgentStaffCard = memo(function AgentStaffCard({ presence, onOpen }: flexDirection: 'column', alignItems: 'stretch', textAlign: 'left', + // Ohne `minWidth: 0` kann eine Flexkarte nicht unter ihre Inhaltsbreite + // schrumpfen. Die fünf Karten passten dadurch nicht in eine Reihe, + // brachen um — und die zweite Reihe drückte Titel und Filterbalken aus + // dem sichtbaren Bereich. + minWidth: 0, gap: 1.25, p: { xs: 1.75, xl: 2 }, borderRadius: 3, + overflow: 'hidden', // Keine eigene Höhe: im Flexlayout gibt die Zeile die Höhe vor, und alle // Karten einer Zeile werden von selbst gleich hoch. Mit `height: 100%` // beanspruchte jede Karte die volle Fläche und die zweite Zeile fiel @@ -100,12 +106,15 @@ export const AgentStaffCard = memo(function AgentStaffCard({ presence, onOpen }: {presence.name} {presence.role} @@ -116,9 +125,10 @@ export const AgentStaffCard = memo(function AgentStaffCard({ presence, onOpen }: fontSize: '0.6875rem', lineHeight: 1.3, color: 'rgba(255,255,255,0.42)', - overflow: 'hidden', - textOverflow: 'ellipsis', - whiteSpace: 'nowrap', + overflowWrap: 'break-word', + // Umbrechen statt abschneiden: in einer schmalen Karte fiele + // sonst ausgerechnet die Personalnummer weg, und die macht aus + // einem Werkzeug einen Mitarbeitenden. }} > {[presence.department, presence.personnelNumber].filter(Boolean).join(' · ')} @@ -164,6 +174,7 @@ export const AgentStaffCard = memo(function AgentStaffCard({ presence, onOpen }: fontSize: '0.8125rem', lineHeight: 1.45, color: 'rgba(255,255,255,0.92)', + overflowWrap: 'break-word', }} > {workload.voice} @@ -194,6 +205,7 @@ export const AgentStaffCard = memo(function AgentStaffCard({ presence, onOpen }: fontSize: '0.75rem', lineHeight: 1.4, color: 'rgba(255,255,255,0.62)', + overflowWrap: 'break-word', display: '-webkit-box', WebkitLineClamp: 2, WebkitBoxOrient: 'vertical', diff --git a/src/components/staff/AgentStaffOverview.tsx b/src/components/staff/AgentStaffOverview.tsx index 79669ba..d0887fb 100644 --- a/src/components/staff/AgentStaffOverview.tsx +++ b/src/components/staff/AgentStaffOverview.tsx @@ -8,29 +8,17 @@ import { WorkloadTone } from '../../domain/agentWorkload' import { DS_NEUTRAL } from '../../lib/ds' /** - * Höhe der globalen Kopfzeile plus des Bereichs, der unter der Belegschaft - * sichtbar bleiben muss: Titel «Meine Objekte» samt Untertitel und der Balken - * «Filter & Übersicht» (Runde 5, §2.3). + * Mindesthöhe, damit die Belegschaft eine Fläche hat und nicht als schmaler + * Streifen über der Objektliste klebt. * - * Deshalb wird gerechnet und nicht fest gesetzt: der Bereich bekommt, was die - * Viewport-Höhe hergibt, und auf einem 4K-Monitor bleibt derselbe Streifen - * unten sichtbar wie auf einem 13-Zoll-Laptop. + * Eine feste oder gedeckelte Höhe hatte dieser Bereich früher — und genau das + * war der Fehler: passte der Inhalt nicht hinein, scrollte er in sich selbst, + * die Porträts wurden oben abgeschnitten und neben der Seite stand ein zweiter + * Scrollbalken. Die Höhe richtet sich deshalb nach dem Inhalt. Damit der Titel + * «Meine Objekte» beim Einstieg sichtbar bleibt (§2.3), stehen die fünf + * Mitarbeitenden auf grossen Schirmen in einer einzigen Reihe statt in zweien. */ -const TOP_BAR_PX = 64 -const KEEP_VISIBLE_BELOW_PX = 118 -const RESERVED_PX = TOP_BAR_PX + KEEP_VISIBLE_BELOW_PX - -/** Darunter würde die Belegschaft zur Briefmarke — dann lieber scrollen. */ -const MIN_SCENE_PX = 420 - -/** - * Obergrenze der Höhe. Ohne sie wächst der Bereich auf hohen Schirmen mit der - * Viewport-Höhe mit, während die Karten ihre Inhaltshöhe behalten — auf einem - * 1440er Monitor stand über und unter den Karten ein halber Bildschirm leere - * dunkle Fläche. Der Titel «Meine Objekte» bleibt auch mit Deckel sichtbar; er - * rückt lediglich weiter nach oben, und mehr von der Objektliste wird sichtbar. - */ -const MAX_SCENE_PX = 760 +const MIN_SCENE_PX = 360 /** * Grösste Breite der Karten samt Anriss. Freilaufend würden bei drei Spalten @@ -80,10 +68,7 @@ export function AgentStaffOverview() { position: 'relative', display: 'flex', flexDirection: 'column', - height: `clamp(${MIN_SCENE_PX}px, calc(100vh - ${RESERVED_PX}px), ${MAX_SCENE_PX}px)`, - '@supports (height: 100dvh)': { - height: `clamp(${MIN_SCENE_PX}px, calc(100dvh - ${RESERVED_PX}px), ${MAX_SCENE_PX}px)`, - }, + minHeight: MIN_SCENE_PX, overflow: 'hidden', }} > @@ -94,7 +79,6 @@ export function AgentStaffOverview() { position: 'relative', display: 'flex', flexDirection: 'column', - height: '100%', width: '100%', maxWidth: MAX_CONTENT_PX, mx: 'auto', @@ -107,26 +91,30 @@ export function AgentStaffOverview() { *': { flex: { xs: '1 1 100%', sm: '0 1 calc((100% - 12px) / 2)', - lg: '0 1 calc((100% - 32px) / 3)', + md: '0 1 calc((100% - 24px) / 3)', + lg: '0 1 calc((100% - 64px) / 5)', }, }, - // Auf niedrigen Fenstern darf die Belegschaft scrollen, statt die - // Karten bis zur Unlesbarkeit zu stauchen. - overflowY: 'auto', }} > {staff.map(person => (