- Click-to-select instead of geocoding on every move: pan the map freely
(drag), then tap to drop the pin — reverse geocodes that point ONCE.
Saves Map.ir reverse tokens. Shows a "tap to select" hint until a point
is chosen; a draggable-style red marker marks the selection (and the
existing point in edit mode, without re-geocoding).
- "موقعیت فعلی من" button: uses the device geolocation to fly to and
select the current position (with an error toast if denied/unsupported).
- removed the old center-pin + moveend auto-geocode and the unused
user-location-found event/pulse effect.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- register MapLibre's RTL text plugin (@mapbox/mapbox-gl-rtl-text) so
Persian/Arabic map labels render correctly instead of reversed/broken.
Guarded via getRTLTextPluginStatus so it's set only once.
- reverse geocoding now prefers Map.ir's address_compact (shorter, cleaner
address) over the full address.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Replace the broken-looking Leaflet/OSM address picker with a MapLibre GL
map using Map.ir vector tiles, plus Map.ir reverse geocoding for fast
coordinates -> Persian address.
- InteractiveMap: drop react-leaflet/leaflet; init a MapLibre map (Map.ir
style via transformRequest x-api-key), a NavigationControl, and a fixed
center pin — the map moves under the pin and the centre is reverse-
geocoded on moveend (debounced). Wrapped dir=ltr so the map renders
correctly inside the RTL page (fixes the scattered-tiles bug). Selected
address shown in an overlay chip; city select / geolocation fly the map.
- reverse geocoding: Nominatim -> Map.ir (https://map.ir/reverse), which
returns proper Persian addresses (Nominatim was weak for Iran and its
TOS forbids production use).
- default map centre fixed to Tehran (matched the "تهران" selector).
- key via VITE_MAPIR_KEY (documented in .env.example; real key in env).
- deps: add maplibre-gl, remove leaflet/react-leaflet/@types/leaflet.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>