feat: F023 signal-to-match pipeline & shadow market decision flow

This commit is contained in:
Benjamin Sutter
2026-05-15 15:52:53 +02:00
parent fce0f684af
commit c65e565dc7
20 changed files with 1957 additions and 0 deletions
+49
View File
@@ -0,0 +1,49 @@
import { useState } from 'react'
import { Box } from '@mui/material'
import { PageHeader } from '../../components/layout'
import { SignalInbox, SignalPipelineView, MarketSignalEmptyState } from '../../components/ops'
import { useMarketSignals } from '../../hooks/useMarketSignals'
import type { MarketSignalFilters } from '../../domain/marketSignal'
export default function SignalPipeline() {
const [selectedId, setSelectedId] = useState<string | null>(null)
const [filters, setFilters] = useState<MarketSignalFilters>({})
const { data: signals = [], isLoading } = useMarketSignals(filters)
const selectedSignal = signals.find((s) => s.id === selectedId) ?? null
return (
<Box sx={{ display: 'flex', flexDirection: 'column', height: '100%', overflow: 'hidden' }}>
<PageHeader
title="Signal Pipeline"
subtitle="Von der Markt-Evidenz zum strategischen Entscheidungs-Input"
/>
<Box sx={{ display: 'flex', flex: 1, overflow: 'hidden' }}>
<Box
sx={{
width: 360,
flexShrink: 0,
borderRight: '1px solid #e2e8f0',
overflow: 'hidden',
display: 'flex',
flexDirection: 'column',
}}
>
<SignalInbox
signals={signals}
isLoading={isLoading}
selectedId={selectedId}
onSelect={setSelectedId}
filters={filters}
onFiltersChange={setFilters}
/>
</Box>
<Box sx={{ flex: 1, overflow: 'hidden' }}>
{selectedSignal
? <SignalPipelineView signal={selectedSignal} />
: <MarketSignalEmptyState variant="no-selection" />
}
</Box>
</Box>
</Box>
)
}