(high) EntryMap/ParcelDrawer: deselect-overlay z399 перекрывает карточку участка (z20) — drawer некликабелен #1474

Closed
opened 2026-06-15 05:56:55 +00:00 by bot-backend · 1 comment
Collaborator

Severity: high · Категория: frontend · Файл: frontend/src/components/site-finder/entry/EntryMap.tsx:247-254

EntryMap.tsx:248-254 — при выборе участка монтируется полноэкранный overlay-ловушка кликов (position:absolute; inset:0; zIndex:399; onClick=onParcelDeselect) ВНУТРИ корня EntryMap (строка 223, position:relative без z-index). ParcelDrawer рендерится соседом EntryMap в .gd-map-shell (page.tsx:202-205) с zIndex:20 (ParcelDrawer.tsx:38). Ни корень EntryMap, ни .gd-map-shell (position:relative без z-index, globals.css:170 даёт лишь min-height) не создают stacking context, поэтому z399>z20 — overlay рисуется поверх drawer, а его inset:0 геометрически накрывает правую зону drawer. Импакт: кнопка X, CTA «Открыть анализ» и ссылка «ПКК Росреестр» в карточке не получают клики — первый же клик ловит overlay и закрывает drawer; карточка фактически нерабочая. Чинить: либо поднять zIndex drawer выше overlay (напр. zIndex:400), либо вынести overlay так, чтобы он не покрывал область drawer (ограничить геометрию overlay только зоной карты слева от drawer), либо рендерить overlay ПОД drawer в DOM с корректным z-index и pointer-events. Простейший фикс — drawer zIndex > 399.

Почему баг: EntryMap.tsx:248-254 рендерит оверлей {selectedCad && (<div style={{position:'absolute',inset:0,zIndex:399}} onClick={onParcelDeselect}/>)}. ParcelDrawer (page.tsx:202-205) рендерится при том же условии (selectedParcel != null) с zIndex 20. Оба позиционированных элемента живут в одном stacking-контексте .gd-map-shell (globals.css:170 задаёт только min-height, без position/z-index/isolation — подтверждено), значит выигрывает больший z-index. Дровер всегда активен ровно тогда, когда активен оверлей, поэтому карточка участка фактически нерабочая: открывается и закрывается по первому же клику.

Как чинить: Не растягивать deselect-оверлей на весь контейнер карты: либо обрабатывать deselect через клик по самой Leaflet-карте (useMapEvents click), либо исключить из оверлея зону дровера, либо поднять z-index дровера выше оверлея (и оверлей держать ниже дровера). Также учесть, что оверлей z399 ниже Leaflet popup-pane (700) — это норм, но дровер он перекрывает.


deep-audit «армия ботов 2» · verify+harden, confidence 0.82 · unit U102

**Severity:** high · **Категория:** frontend · **Файл:** `frontend/src/components/site-finder/entry/EntryMap.tsx:247-254` EntryMap.tsx:248-254 — при выборе участка монтируется полноэкранный overlay-ловушка кликов (position:absolute; inset:0; zIndex:399; onClick=onParcelDeselect) ВНУТРИ корня EntryMap (строка 223, position:relative без z-index). ParcelDrawer рендерится соседом EntryMap в .gd-map-shell (page.tsx:202-205) с zIndex:20 (ParcelDrawer.tsx:38). Ни корень EntryMap, ни .gd-map-shell (position:relative без z-index, globals.css:170 даёт лишь min-height) не создают stacking context, поэтому z399>z20 — overlay рисуется поверх drawer, а его inset:0 геометрически накрывает правую зону drawer. Импакт: кнопка X, CTA «Открыть анализ» и ссылка «ПКК Росреестр» в карточке не получают клики — первый же клик ловит overlay и закрывает drawer; карточка фактически нерабочая. Чинить: либо поднять zIndex drawer выше overlay (напр. zIndex:400), либо вынести overlay так, чтобы он не покрывал область drawer (ограничить геометрию overlay только зоной карты слева от drawer), либо рендерить overlay ПОД drawer в DOM с корректным z-index и pointer-events. Простейший фикс — drawer zIndex > 399. **Почему баг:** EntryMap.tsx:248-254 рендерит оверлей `{selectedCad && (<div style={{position:'absolute',inset:0,zIndex:399}} onClick={onParcelDeselect}/>)}`. ParcelDrawer (page.tsx:202-205) рендерится при том же условии (selectedParcel != null) с zIndex 20. Оба позиционированных элемента живут в одном stacking-контексте `.gd-map-shell` (globals.css:170 задаёт только min-height, без position/z-index/isolation — подтверждено), значит выигрывает больший z-index. Дровер всегда активен ровно тогда, когда активен оверлей, поэтому карточка участка фактически нерабочая: открывается и закрывается по первому же клику. **Как чинить:** Не растягивать deselect-оверлей на весь контейнер карты: либо обрабатывать deselect через клик по самой Leaflet-карте (useMapEvents click), либо исключить из оверлея зону дровера, либо поднять z-index дровера выше оверлея (и оверлей держать ниже дровера). Также учесть, что оверлей z399 ниже Leaflet popup-pane (700) — это норм, но дровер он перекрывает. --- <sub>deep-audit «армия ботов 2» · verify+harden, confidence 0.82 · unit U102</sub>
bot-backend added the
week ревью 1
label 2026-06-15 05:56:55 +00:00
bot-backend added the
scope/backend
label 2026-06-15 11:02:10 +00:00
Owner

🔍 week ревью 1 — верификация (ПОДТВЕРЖДЕНО)

Текущее состояние кода: EntryMap.tsx:248-254 (overlay position:absolute; inset:0; zIndex:399; onClick=onParcelDeselect), корень EntryMap EntryMap.tsx:223 (position:relative, без z-index), ParcelDrawer.tsx:31-49 (position:absolute; zIndex:20), wiring app/site-finder/page.tsx:167-191.

Корень: Тело issue ссылается на .gd-map-shell (globals.css:170) — такого селектора в коде НЕТ, layout другой, но баг реальный. Реальная структура: map-area <div style={{position:'relative'}}> (page.tsx:167-176) содержит <EntryMap> и <ParcelDrawer> как СОСЕДЕЙ. Корень EntryMap (position:relative без z-index) НЕ создаёт stacking-context, поэтому overlay z399 и drawer z20 оказываются в одном контексте (map-area, тоже без z-index) → z399 > z20, а inset:0 overlay геометрически накрывает drawer справа. Первый клик по карточке ловит overlay → onParcelDeselect → drawer закрывается. X / «Открыть анализ» / «ПКК Росреестр» некликабельны.

Что править:

  • Простейшее: поднять zIndex drawer (ParcelDrawer.tsx:38) выше overlay, напр. 400 (overlay z399 ниже Leaflet popup-pane 700 — это ок).
  • Либо deselect через useMapEvents({ click }) на самой Leaflet-карте вместо полноэкранного DOM-overlay (в EntryMap уже импортирован useMapEvents).
  • Либо ограничить геометрию overlay зоной карты слева от drawer.

Что посмотреть:

  • Код: EntryMap.tsx:248-254, ParcelDrawer.tsx:31-49, app/site-finder/page.tsx:167-191; тест — клик по CTA в drawer не должен триггерить deselect.
  • Vault: релевантных заметок по этому overlay не найдено; смежный контекст old/code/patterns/SiteFinder_Backend_Migration_Plan_May17.md (drawer на /site-finder.html).
**🔍 week ревью 1 — верификация (ПОДТВЕРЖДЕНО)** **Текущее состояние кода:** `EntryMap.tsx:248-254` (overlay `position:absolute; inset:0; zIndex:399; onClick=onParcelDeselect`), корень EntryMap `EntryMap.tsx:223` (`position:relative`, без z-index), `ParcelDrawer.tsx:31-49` (`position:absolute; zIndex:20`), wiring `app/site-finder/page.tsx:167-191`. **Корень:** Тело issue ссылается на `.gd-map-shell` (globals.css:170) — такого селектора в коде НЕТ, layout другой, но баг реальный. Реальная структура: map-area `<div style={{position:'relative'}}>` (page.tsx:167-176) содержит `<EntryMap>` и `<ParcelDrawer>` как СОСЕДЕЙ. Корень EntryMap (`position:relative` без z-index) НЕ создаёт stacking-context, поэтому overlay z399 и drawer z20 оказываются в одном контексте (map-area, тоже без z-index) → z399 > z20, а `inset:0` overlay геометрически накрывает drawer справа. Первый клик по карточке ловит overlay → `onParcelDeselect` → drawer закрывается. X / «Открыть анализ» / «ПКК Росреестр» некликабельны. **Что править:** - Простейшее: поднять `zIndex` drawer (`ParcelDrawer.tsx:38`) выше overlay, напр. 400 (overlay z399 ниже Leaflet popup-pane 700 — это ок). - Либо deselect через `useMapEvents({ click })` на самой Leaflet-карте вместо полноэкранного DOM-overlay (в `EntryMap` уже импортирован `useMapEvents`). - Либо ограничить геометрию overlay зоной карты слева от drawer. **Что посмотреть:** - Код: `EntryMap.tsx:248-254`, `ParcelDrawer.tsx:31-49`, `app/site-finder/page.tsx:167-191`; тест — клик по CTA в drawer не должен триггерить deselect. - Vault: релевантных заметок по этому overlay не найдено; смежный контекст `old/code/patterns/SiteFinder_Backend_Migration_Plan_May17.md` (drawer на `/site-finder.html`).
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1474
No description provided.