* Listing detail: drop the new <NearbyPoiSidebar> below the price card
with default 1.5km radius and 6 categories (school/secondary/hospital/
market/bank/metro). Reads property.lat/lng — no-op when unset.
* KCN detail: same component but 3km radius with the categories that
matter for industrial parks (hospital/bank/gas/bus/metro/police).
* New <PoiSearchFilter> widget for the search page: pill button →
popover with radius dropdown (300m..5km), 3 quick presets ("Family",
"Commute", "Convenience"), and 6 grouped category checkboxes. Wires
to a `PoiNearbyConstraint` value so callers can pass it into search
filters when they're ready.
* docs/osm-data-model.md: canonical reference for every OSM-sourced
table, sync cadence, quality gates, runbook for ops, and a clear
"how to add a new POI category" guide.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Listing page: replace the 'Xem bản đồ / Ẩn bản đồ' toggle with a
three-mode view switch (Danh sách / Bản đồ / Chia đôi). Default to
Chia đôi on lg+, putting cards on the left and a sticky ParkMap on
the right so users see geography and details at a glance.
- Detail page: add a 'Vị trí trên bản đồ' card showing the park's
marker on a Mapbox map (height 360-420px) with the full address
underneath. Reuse the existing ParkMap by adapting the
IndustrialParkDetail to the IndustrialParkListItem shape it expects
via a small parkAsListItem() helper.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Add three new frontend page sections:
- Industrial parks (khu-cong-nghiep): listing, detail, filter bar
- Transfer listings (chuyen-nhuong): search, category tabs, detail
- AI reports dashboard: list, create, viewer with TOC
Includes components, API clients, hooks, server helpers, i18n keys,
navigation links in public and dashboard layouts, and lint fixes.
Co-Authored-By: Paperclip <noreply@paperclip.ing>