From 0231338a7f3f43e0848d7bc018ef1635eff822e6 Mon Sep 17 00:00:00 2001 From: bot-backend Date: Thu, 27 Aug 2026 13:42:56 +0300 Subject: [PATCH] =?UTF-8?q?fix(mera/ui):=20=D0=BA=D0=B0=D1=80=D1=82=D0=B0?= =?UTF-8?q?=20=D0=BF=D0=B5=D1=80=D0=B5=D1=81=D1=82=D0=B0=D0=BB=D0=B0=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=BA=D1=80=D1=8B=D0=B2=D0=B0=D1=82?= =?UTF-8?q?=D1=8C=20=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9=D1=81?= =?UTF-8?q?,=20=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D0=B0=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BC=D0=B5=D1=89=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D0=B2?= =?UTF-8?q?=20=D0=BE=D0=BA=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Три правки, две причины — обе найдены прогоном по живому проду 27.08 под аккаунтом админа. ## Карта поверх всего (два симптома, один корень) Контейнер мини-карты в HeroBar имел position: relative БЕЗ z-index. Такой блок контекст наложения не создаёт, поэтому внутренние слои Leaflet (тайлы 200, оверлеи 400, маркер 600, атрибуция 800) и карточка адреса (750) конкурировали не между собой, а со всей страницей. Отсюда: • меню аккаунта (UserMenu, z-index 200) открывалось ПОД картой; • карточка «АДРЕС» всплывала поверх таблицы раздела «Продажи в доме». Лечится изоляцией контейнера (isolation: isolate), а не гонкой чисел: перебивать 800 у атрибуции пришлось бы в каждом новом элементе, и гонка возвращалась бы. Меню шапки заодно поднято до 1000 — оно обязано быть сверху по замыслу, а не по совпадению. ## Страница не помещалась в окно Масштаб артборда 1536×1024 считался от window.innerWidth, который ВКЛЮЧАЕТ вертикальную полосу прокрутки. На рабочей области 1425px артборд выходил 1440px — страница получала постоянный горизонтальный скролл. Воспроизводится на любом десктопе: страница длинная, вертикальная полоса есть всегда. Считаем от document.documentElement.clientWidth. Пороги isMobile/ isSmallViewport намеренно оставлены на innerWidth: это классификация устройства, а не расчёт геометрии. --- tradein-mvp/frontend/src/app/v2/page.tsx | 13 ++++++++++++- .../frontend/src/components/auth/UserMenu.tsx | 11 ++++++++++- .../src/components/trade-in/v2/HeroBar.tsx | 17 +++++++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/tradein-mvp/frontend/src/app/v2/page.tsx b/tradein-mvp/frontend/src/app/v2/page.tsx index f0164c23..043c7a83 100644 --- a/tradein-mvp/frontend/src/app/v2/page.tsx +++ b/tradein-mvp/frontend/src/app/v2/page.tsx @@ -459,7 +459,18 @@ export default function TradeInV2Page() { const [isSmallViewport, setIsSmallViewport] = useState(false); useEffect(() => { const compute = () => { - setArtboardScale(Math.min(1, window.innerWidth / 1536)); + // clientWidth, а НЕ window.innerWidth. innerWidth включает вертикальную + // полосу прокрутки (~15px), поэтому артборд масштабировался под ширину, + // которой на самом деле нет: на 1425px рабочей области он выходил 1440px + // и страница получала ПОСТОЯННЫЙ горизонтальный скролл. Прод 27.08 — + // «юай не помещается»; воспроизводится на любом десктопе, потому что + // страница длинная и вертикальная полоса есть всегда. + // + // Пороги ниже намеренно остаются на innerWidth: это классификация + // устройства («телефон ли это»), а не расчёт геометрии, и полоса + // прокрутки на неё влиять не должна. + const usable = document.documentElement.clientWidth || window.innerWidth; + setArtboardScale(Math.min(1, usable / 1536)); setIsMobile(window.innerWidth < 768); setIsSmallViewport(window.innerWidth < 1024); }; diff --git a/tradein-mvp/frontend/src/components/auth/UserMenu.tsx b/tradein-mvp/frontend/src/components/auth/UserMenu.tsx index d8dd57ee..04f2de1f 100644 --- a/tradein-mvp/frontend/src/components/auth/UserMenu.tsx +++ b/tradein-mvp/frontend/src/components/auth/UserMenu.tsx @@ -195,7 +195,16 @@ export function UserMenu() { padding: 12, // Popover (не card) — допустимая лёгкая тень для отделения. boxShadow: "0 4px 12px rgba(0, 0, 0, 0.1)", - zIndex: 200, + // 1000, а не 200. Меню шапки обязано лежать поверх содержимого + // страницы: при 200 его перекрывала мини-карта отчёта, у которой + // внутренние слои Leaflet доходят до 800 (атрибуция). Найдено на + // проде 27.08 — меню аккаунта открывалось ПОД картой. + // + // Корень чинится в HeroBar (`isolation: isolate` на контейнере + // карты), эта правка — вторая половина: даже когда чужой блок снова + // начнёт соперничать за слои, шапка останется сверху по замыслу, а + // не по случайному совпадению чисел. + zIndex: 1000, }} >