+ {/* Image section with 16:10 aspect ratio */}
+
+ {(property.photos?.length || property.photo_thumbnail) ? (
+
+ ) : null}
-
-
-
-
- £{property.total_price.toLocaleString()}
- {property.listing_type !== 'BUY' && (
- /mo
- )}
-
- {priceIndicator && (
-
- {priceIndicator.label}
-
- )}
-
-
-
-
-
- {/* Stats grid */}
-
-
-
- {property.rooms} bedrooms
-
-
-
- {property.qm} m²
-
-
-
-
£{property.qmprice}/m²
-
- {property.listing_type !== 'BUY' && property.available_from && (
-
-
- Available {formatDate(property.available_from)}
-
- )}
- {property.listing_type === 'BUY' && (
-
-
- Seen {lastSeenDays}d ago
-
- )}
-
-
- {/* Agency and last seen */}
-
-
- {property.agency}
- •
- Seen {lastSeenDays} days ago
-
-
- {/* POI Distances */}
- {allPOIs && allPOIs.length > 0 ? (
-
- ) : property.poi_distances && property.poi_distances.length > 0 ? (
-
- ) : null}
-
- {/* Price history */}
- {property.price_history.length > 1 && (
-
-
Price history
-
- {property.price_history.slice(0, 5).map((entry) => (
-
- {entry.last_seen.split('T')[0]}
- £{entry.price.toLocaleString()}
-
- ))}
-
-
- )}
-
- {/* Actions */}
-
+
+ {/* Content below image */}
+
+ {/* Price as dominant element */}
+
+
+ £{property.total_price.toLocaleString()}
+ {property.listing_type !== 'BUY' && (
+ /mo
+ )}
+
+ {priceIndicator && (
+
+ )}
+ {priceIndicator && (
+ {priceIndicator.label}
+ )}
+
+
+ {/* Key metrics on one line */}
+
+ {property.rooms}bed
+ ·
+ {property.qm} m²
+ ·
+ £{property.qmprice}/m²
+
+
+ {/* Location */}
+ {property.city && (
+
{property.city}
+ )}
+
+ {/* POI travel times */}
+ {allPOIs && allPOIs.length > 0 ? (
+
+ ) : property.poi_distances && property.poi_distances.length > 0 ? (
+
+ ) : null}
+
+ {/* Agency + freshness */}
+
+ {property.agency}
+ ·
+ {lastSeenDays}d ago
+
);
diff --git a/frontend/src/components/PropertyCardCompact.tsx b/frontend/src/components/PropertyCardCompact.tsx
index 28e945c..685734a 100644
--- a/frontend/src/components/PropertyCardCompact.tsx
+++ b/frontend/src/components/PropertyCardCompact.tsx
@@ -1,4 +1,4 @@
-import { Bed, Maximize2 } from 'lucide-react';
+import { Bed, MapPin } from 'lucide-react';
import type { PropertyProperties } from '@/types';
interface PropertyCardCompactProps {
@@ -20,20 +20,20 @@ export function PropertyCardCompact({
const isExpensive = avgPricePerSqm && property.qmprice > avgPricePerSqm * 1.1;
const priceIndicator = isGoodDeal
- ? { color: 'text-green-600 bg-green-50', label: 'Good deal' }
+ ? { dotColor: 'bg-[var(--deal-good)]', label: 'Good deal' }
: isExpensive
- ? { color: 'text-red-600 bg-red-50', label: 'Above avg' }
+ ? { dotColor: 'bg-[var(--deal-above)]', label: 'Above avg' }
: null;
return (