feat: Future Availability Intelligence — rebrand & card redesign

Replaces "Schattenmarkt" branding with professional Future Availability
Intelligence throughout the UI. Two distinct card types: Pre-Market
(LEASE_EXPIRY + verified, green accent) and Market Signal (probabilistic,
blue accent). Professioneller Data-Header replaces dark purple gradient.
New detail panel sections: Erkannte Marktindikatoren, Strategische
Interpretation, Bestätigt/Nicht bestätigt. All 15 mock signals enriched
with concrete Swiss CRE market indicators and strategic interpretations.
Signal quality shown as 4-dot indicator (Hoch/Mittel/Niedrig).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Benjamin Sutter
2026-05-20 13:06:16 +02:00
parent d5a4862a28
commit 5fe15bac62
12 changed files with 531 additions and 358 deletions
+1 -1
View File
@@ -172,7 +172,7 @@ export default function MatchDetail() {
sx={{ bgcolor: '#f1f5f9', color: '#475569', fontWeight: 700, letterSpacing: 0.5 }}
/>
{isFuture && (
<Chip label="Probabilistisches Signal" size="small" sx={{ bgcolor: '#faf5ff', color: '#7c3aed', fontWeight: 600 }} />
<Chip label="Future Availability Signal" size="small" sx={{ bgcolor: '#faf5ff', color: '#7c3aed', fontWeight: 600 }} />
)}
</Box>
+6 -6
View File
@@ -38,7 +38,7 @@ export default function Results() {
const { currentUser } = useSessionStore()
const [filterSource, setFilterSource] = useState<FilterSource>('ALL')
const [sortBy, setSortBy] = useState<SortBy>('score')
const [showSchattenmarkt, setShowSchattenmarkt] = useState(true)
const [showFutureAvailability, setShowFutureAvailability] = useState(true)
const [showOwnProperties, setShowOwnProperties] = useState(false)
const [view, setView] = useState<'list' | 'grid'>(() =>
(localStorage.getItem('view-results') as 'list' | 'grid') ?? 'list'
@@ -73,8 +73,8 @@ export default function Results() {
const filtered = results.filter(r => {
if (r.resultType === 'VERIFIED_PORTFOLIO') return showOwnProperties && currentUser?.role === 'PROPERTY_MANAGER'
// Schattenmarkt toggle is independent of the source filter
if (r.resultType === 'FUTURE_AVAILABILITY') return showSchattenmarkt
// Future Availability toggle is independent of the source filter
if (r.resultType === 'FUTURE_AVAILABILITY') return showFutureAvailability
return filterSource === 'ALL' || r.resultType === filterSource
})
@@ -176,8 +176,8 @@ export default function Results() {
onFilterChange={setFilterSource}
sortBy={sortBy}
onSortChange={setSortBy}
showSchattenmarkt={showSchattenmarkt}
onShowSchattenmarktChange={setShowSchattenmarkt}
showFutureAvailability={showFutureAvailability}
onShowFutureAvailabilityChange={setShowFutureAvailability}
showOwnProperties={showOwnProperties}
onShowOwnPropertiesChange={setShowOwnProperties}
isPropertyManager={currentUser?.role === 'PROPERTY_MANAGER'}
@@ -186,7 +186,7 @@ export default function Results() {
{isLoading ? (
<FeedSkeleton />
) : sorted.length === 0 ? (
<FeedEmptyState filtered={filterSource !== 'ALL' || !showSchattenmarkt || !showOwnProperties} />
<FeedEmptyState filtered={filterSource !== 'ALL' || !showFutureAvailability || !showOwnProperties} />
) : (
<UnifiedResultFeed results={sorted} view={view} />
)}