import { Box, Chip, Typography } from '@mui/material' import { Building2, ExternalLink } from 'lucide-react' import type { Property } from '../../domain/property' import type { ExtractedContact } from '../../domain/futureSignal' import { ObjectDeepLink } from '../team' import { CONTACT_ICONS } from './marketLeadHelpers' import { DS_BG, DS_BRAND, DS_SLATE, DS_TEXT } from '../../lib/ds' /** * Bausteine der Signal-Detailansicht auf der Nora-Seite. * * Ausgezogen aus `MarketIntelligence.tsx` — die Seite hält jetzt nur noch * Reiter, Auswahl und Rahmen. */ // ── Left pane list item ────────────────────────────────────────────────────── // ── Contact row ────────────────────────────────────────────────────────────── /** * Extrahierte Kontaktdaten (Runde 4, §7.3). * * Ohne Konfidenzstufe und ohne Farbpunkt: gezeigt wird nur noch, was klar * belegbar ist — siehe `confirmableContacts`. Ein Wert mit dem Hinweis * «spekulativ» hilft niemandem; entweder man kann ihn anschreiben oder nicht. */ function ContactRow({ contact }: { contact: ExtractedContact }) { const icon = CONTACT_ICONS[contact.type] const isClickable = contact.type === 'WEBSITE' || contact.type === 'LINKEDIN' || contact.type === 'EMAIL' const href = contact.type === 'EMAIL' ? `mailto:${contact.value}` : contact.type === 'WEBSITE' || contact.type === 'LINKEDIN' ? `https://${contact.value.replace(/^https?:\/\//, '')}` : undefined return ( {icon} {isClickable && href ? ( {contact.value} ) : ( {contact.value} )} {contact.label && ( {contact.label} )} ) } // ── Objektzeile ────────────────────────────────────────────────────────────── /** * Ein passendes Portfolioobjekt zu einem Signal. * * Der Anschreiben-Entwurf und die Reminder-Aktion sind mit Runde 4 entfallen * (§7.3), die Mehrfachauswahl mit Runde 8: sie diente allein dazu, Objekte an * die Exposé-Erstellung weiterzureichen, und diese Funktion gibt es bei Livia * nicht mehr. Eine Auswahl ohne Ziel wäre ein Bedienelement, das nichts * auslöst — schlimmer als keines. * * Geblieben ist, was Nora für die Entscheidung braucht: welches Objekt, wo, * wie gross, zu welchem Preis und wie gut die Fläche passt. */ function SignalPropertyRow({ p, fit, }: { p: Property fit: number | null }) { return ( {p.location.city} · {p.areaSqm.toLocaleString('de-CH')} m² · CHF {p.rentPricePerSqm}/m²/J {fit !== null && ( )} ) } export { ContactRow, SignalPropertyRow }