refactor: split large page components + taxonomy/HeatBadge/FutureAvailability improvements

- Taxonomy: merge VERIFIED_PORTFOLIO + EXTERNAL_MARKET display → 'Plattform' (dark blue) across all surfaces
- HeatBadge: new flame indicator for hot properties (grid, list, pipeline views)
- FutureAvailabilityContextPanel: richer detail page with AI summary, strategic assessment, sources
- Refactor Pipeline.tsx (630→152 lines) → pipeline/PipelineCard, PipelineColumn, PipelineDetailPanel, pipelineConstants, pipelineUtils
- Refactor IntelligenceMatchCard.tsx (483→179 lines) → FutureAvailabilityCard extracted
- Refactor MatchDetail.tsx (559→464 lines) → useMatchDetailData hook, MatchDetailPropertyDetails
- Refactor Compare.tsx (638→485 lines) → compareUtils, CompareCriteriaCard extracted

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Benjamin Sutter
2026-05-23 23:36:03 +02:00
parent 72e4f08900
commit 22c195b4a5
28 changed files with 1615 additions and 1282 deletions
+4 -4
View File
@@ -3,14 +3,14 @@ import { ViewToggle } from '../shared'
interface Props {
total: number
verifiedCount: number
externalCount: number
platformCount: number
maisonWorkCount: number
futureCount: number
view?: 'list' | 'grid'
onViewChange?: (v: 'list' | 'grid') => void
}
export function ResultFeedHeader({ total, verifiedCount, externalCount, futureCount, view = 'list', onViewChange }: Props) {
export function ResultFeedHeader({ total, platformCount, maisonWorkCount, futureCount, view = 'list', onViewChange }: Props) {
return (
<Box sx={{ bgcolor: 'white', borderBottom: '1px solid #e2e8f0', px: 3, py: 2, display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
<Box>
@@ -18,7 +18,7 @@ export function ResultFeedHeader({ total, verifiedCount, externalCount, futureCo
{total} Empfehlungen
</Typography>
<Typography variant="body2" color="text.secondary">
{verifiedCount} Verifiziert · {externalCount} Extern · {futureCount} Marktsignale
{platformCount} Plattform · {maisonWorkCount} Maison Work · {futureCount} Future Availability
</Typography>
</Box>
{onViewChange && (
+4 -5
View File
@@ -1,8 +1,7 @@
import { Box, Card, Chip, Divider, Stack, Typography } from '@mui/material'
import { Building2, Zap } from 'lucide-react'
import type { ResultType } from '../../domain/enums'
type FilterSource = Exclude<ResultType, 'FUTURE_AVAILABILITY' | 'VERIFIED_PORTFOLIO'> | 'ALL'
type FilterSource = 'ALL' | 'PLATFORM' | 'MAISON_WORK'
type SortBy = 'score' | 'rent' | 'area'
interface Props {
@@ -18,9 +17,9 @@ interface Props {
}
const FILTER_OPTIONS: { value: FilterSource; label: string; color: string }[] = [
{ value: 'ALL', label: 'Alle', color: '#1e3a5f' },
{ value: 'EXTERNAL_MARKET', label: 'Direktinserat', color: '#b45309' },
{ value: 'MAISON_WORK', label: 'Maison Work', color: '#0369a1' },
{ value: 'ALL', label: 'Alle', color: '#1e3a5f' },
{ value: 'PLATFORM', label: 'Plattform', color: '#1e3a5f' },
{ value: 'MAISON_WORK', label: 'Maison Work', color: '#0369a1' },
]
const SORT_OPTIONS: { value: SortBy; label: string }[] = [