diff --git a/tradein-mvp/frontend/src/components/trade-in/MapPicker.tsx b/tradein-mvp/frontend/src/components/trade-in/MapPicker.tsx index 2836dac8..316f9461 100644 --- a/tradein-mvp/frontend/src/components/trade-in/MapPicker.tsx +++ b/tradein-mvp/frontend/src/components/trade-in/MapPicker.tsx @@ -3,6 +3,7 @@ /* Выбор адреса на карте ЕКБ (Leaflet + OSM). Клик по дому → reverse-геокодинг. */ /* eslint-disable @typescript-eslint/no-explicit-any -- интероп с CDN-библиотекой Leaflet */ import { useEffect, useRef, useState } from "react"; +import { createPortal } from "react-dom"; import { API_BASE_URL } from "@/lib/api"; @@ -98,6 +99,11 @@ export function MapPicker({ onPick, onClose }: Props) { // тонкий hint «Точка дома по Яндексу», чтобы user понимал почему marker // переехал на пару метров от его клика. const [snapped, setSnapped] = useState(false); + // Portal-mount guard (SSR-safe): document доступен только после монтирования. + // Рендерим оверлей в document.body, чтобы position:fixed/z-index:1000 не были + // заперты в stacking-context формы (#771: полоски SourcesProgress наезжали). + const [mounted, setMounted] = useState(false); + useEffect(() => setMounted(true), []); useEffect(() => { let map: any = null; @@ -212,7 +218,9 @@ export function MapPicker({ onPick, onClose }: Props) { } }; - return ( + if (!mounted) return null; + + return createPortal(
- + , + document.body, ); }