diff --git a/frontend/src/components/concept/ConceptVariantsResult.tsx b/frontend/src/components/concept/ConceptVariantsResult.tsx index c8ee27e2..57faf676 100644 --- a/frontend/src/components/concept/ConceptVariantsResult.tsx +++ b/frontend/src/components/concept/ConceptVariantsResult.tsx @@ -8,6 +8,7 @@ import dynamic from "next/dynamic"; import { useState } from "react"; +import { Box, Map as MapIcon } from "lucide-react"; import { KpiCard } from "@/components/analytics/KpiCard"; import { Section } from "@/components/analytics/Section"; @@ -48,6 +49,39 @@ const ConceptResultMap = dynamic( }, ); +// 3D massing viewer — Three.js, client-only (ssr:false), lazy so it never bloats +// the report bundle and only the active placement tab mounts its engine. +const Massing3DViewer = dynamic( + () => + import("./Massing3DViewer").then((m) => ({ default: m.Massing3DViewer })), + { + ssr: false, + loading: () => ( +
+ Браузер не поддерживает WebGL — объёмную модель отрисовать нельзя. + Откройте план застройки на вкладке «План (2D)». +
++ + Объёмы по фактически размещённым корпусам; высота этажа{" "} + {floorHeightM.toLocaleString("ru")} м + {floorHeightM === DEFAULT_FLOOR_HEIGHT + ? " (норматив движка)" + : " — визуально; ТЭП и финмодель считались при 3,0 м/этаж"} + . Подложка — карта © OpenStreetMap. +
+