A UK property listing app with advanced filtering, interactive Leaflet maps, shadcn/ui components, and Zustand state management.
Level: 2 · Status: ✅ Built · Live Demo · Source Code
This project teaches complex filtering (multiple criteria simultaneously), map integration (Leaflet), and building polished UIs with shadcn/ui (Radix primitives + Tailwind). Property listings are the perfect domain: users filter by price range, bedrooms, location, and type — all at once. The map view adds a spatial dimension to the data.
- Framework: React 18, TypeScript, Vite
- Styling: Tailwind CSS, shadcn/ui (Radix-based component library)
- State: Zustand
- Maps: Leaflet + react-leaflet
- UI Components: Radix UI (dialog, select, slider)
- Forms: React Hook Form + Zod
- Icons: Lucide React
- Utilities: clsx
- Deployment: Netlify
-
Set up the data layer. Property data from a JSON file (
api-data.json). Each property: title, price, bedrooms, bathrooms, area, type, coordinates, images. Zustand store holds properties and active filters. -
Build the filter system. Multiple simultaneous filters: price range (Radix slider), bedrooms (select), property type (select), search by location. Filters combine with AND logic. Show result count that updates as filters change.
-
Build the property card grid. Responsive grid of property cards with image, price, bedrooms/bathrooms count, and area. Click to view detail. Cards re-render efficiently when filters change.
-
Integrate Leaflet map. Map view showing property markers at their coordinates. Click a marker to see property preview popup. Map and list are synced — filtering updates both views.
-
Build the detail view. Radix Dialog showing full property info: image gallery, description, features list, location on map, and contact form.
-
Style with shadcn/ui. Pre-built accessible components (Select, Slider, Dialog) that use Radix primitives under the hood with Tailwind styling. Consistent, professional UI without building everything from scratch.
-
Deploy on Netlify. Static site with JSON data. No backend needed.
- Leaflet with React: use react-leaflet for declarative map components.
<MapContainer>,<TileLayer>,<Marker>,<Popup>— compose like any React component. - shadcn/ui is not a library you install — it's components you copy into your project. You own the code and can customize everything. This gives you the polish of a component library with the flexibility of custom code.
- Extension: add saved searches, property comparison, contact agent form, or virtual tour integration.