fix(agenten): Thomas' Chat klappt wirklich ein, Einzahl bei Livias Zählung

Der Smoke-Test der fünf betroffenen Seiten hat zwei Fehler aus Runde 8
aufgedeckt, die Typecheck, Lint und Tests nicht sehen konnten.

Thomas' Chatkopf blieb stehen, statt in den Titelbalken zu wandern. Seine Seite
bot nur 307 Pixel Scrollweg, der Chatkopf misst aber rund 400 — der
IntersectionObserver löste deshalb nie aus. Bei den anderen Agenten leistet die
lange Liste unter dem Chat den nötigen Weg; hier haben die drei
Verwaltungsbereiche ihre eigene Höhe und scrollen innen, also muss die
Bedingung ausdrücklich stehen. Die Mindesthöhe des Abschnitts ist jetzt eine
Bildschirmhöhe abzüglich des obersten Balkens; `TOP_BAR_PX` kommt dafür aus
`AgentWorkspaceHero` statt als zweite Zahl danebenzustehen.

Livias Zählzeile schrieb «1 Risiken». Einzahl und Mehrzahl werden nun für alle
drei Werte der Zeile unterschieden.

Geprüft im Browser gegen den Produktionsbuild: fünf Seiten ohne Laufzeitfehler,
Thomas' kompakter Chat erscheint nach dem Scrollen im Balken, Chance- und
Risiko-Beispiele sichtbar, alle fünf Vertragstypen bei Ferdi vorhanden, keine
Matching-Darstellung auf Livias Seite.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Benjamin SutterandClaude Opus 5 committed 2026-08-23 22:22:01 +02:00
1 parent 2037e5a463
commit f5451f649f
4 files changed
+15 -4

No files matched your search

@@ -51,7 +51,8 @@ export function ResearchWorkspace() {
<Typography variant="caption" sx={{ color: DS_TEXT.muted }}>
{isLoading
? 'Leads werden geladen …'
: `${research.length} Leads aus externen Quellen · ${chancen} Chancen, ${risiken} Risiken`}
: `${research.length} ${research.length === 1 ? 'Lead' : 'Leads'} aus externen Quellen · ` +
`${chancen} ${chancen === 1 ? 'Chance' : 'Chancen'}, ${risiken} ${risiken === 1 ? 'Risiko' : 'Risiken'}`}
</Typography>
<UnifiedLeadList
+1 -1
View File
@@ -19,7 +19,7 @@ export interface AgentWorkspaceHeroProps {
* Höhe des obersten globalen Balkens. Der Chatkopf gilt bereits als verschwunden,
* sobald er darunter liegt — nicht erst, wenn er den Fensterrand verlässt.
*/
const TOP_BAR_PX = 64
export const TOP_BAR_PX = 64
/**
* Gemeinsamer Chat-Einstieg aller fünf Agentenseiten (Runde 4, §4; Runde 5, §5).
+1 -1
View File
@@ -26,7 +26,7 @@ export { HistorySection } from './HistorySection'
export { ChannelsSection } from './ChannelsSection'
// Gemeinsame Bausteine der fünf Agentenseiten
export { AgentWorkspaceHero } from './AgentWorkspaceHero'
export { AgentWorkspaceHero, TOP_BAR_PX } from './AgentWorkspaceHero'
export { AgentChatStickyBar } from './AgentChatStickyBar'
export { useAgentChat } from './useAgentChat'
export { ObjectDeepLink } from './ObjectDeepLink'
+11 -1
View File
@@ -4,6 +4,7 @@ import { Box } from '@mui/material'
import {
TeamPageHeader,
AgentWorkspaceHero,
TOP_BAR_PX,
AgentWorkspaceTabs,
PersonnelSection,
HistorySection,
@@ -68,7 +69,16 @@ export default function MeineAgenten() {
tabs={<AgentWorkspaceTabs value={section} onChange={handleChange} />}
/>
<Box sx={{ display: 'flex', flexDirection: 'column', minHeight: '70vh' }}>
{/*
Die Mindesthöhe ist kein Gestaltungsmass, sondern die Bedingung dafür,
dass der Chatkopf überhaupt wegscrollen kann: Er misst rund 400 Pixel,
und erst wenn der Inhalt darunter mindestens eine Bildschirmhöhe
einnimmt, entsteht genug Scrollweg, damit er unter den obersten Balken
rutscht und `AgentChatStickyBar` übernimmt. Bei den anderen Agenten
leistet das die lange Liste; hier hat der Abschnitt seine eigene Höhe
und scrollt innen, also muss die Bedingung ausdrücklich stehen.
*/}
<Box sx={{ display: 'flex', flexDirection: 'column', minHeight: `calc(100vh - ${TOP_BAR_PX}px)` }}>
{section === AGENT_SECTIONS.PERSONNEL && <PersonnelSection />}
{section === AGENT_SECTIONS.HISTORY && <HistorySection />}
{section === AGENT_SECTIONS.CHANNELS && <ChannelsSection />}