diff --git a/frontend/src/app/globals.css b/frontend/src/app/globals.css
index 53bbea46..a4ab1b3f 100644
--- a/frontend/src/app/globals.css
+++ b/frontend/src/app/globals.css
@@ -61,7 +61,8 @@ body {
background: var(--bg-app);
color: var(--fg-primary);
font-family:
- Inter,
+ var(--font-inter),
+ "Inter",
-apple-system,
"Segoe UI",
system-ui,
diff --git a/frontend/src/app/layout.tsx b/frontend/src/app/layout.tsx
index 6b158408..0cf70ef7 100644
--- a/frontend/src/app/layout.tsx
+++ b/frontend/src/app/layout.tsx
@@ -1,11 +1,20 @@
import type { Metadata } from "next";
-import { IBM_Plex_Mono } from "next/font/google";
+import { IBM_Plex_Mono, Inter } from "next/font/google";
import { RouteGuard } from "@/components/auth/RouteGuard";
import "./globals.css";
import { Providers } from "./providers";
+// App UI typeface (Inter). next/font is bundled — no package.json change.
+// Cyrillic + latin subsets so RU labels render correctly across the app.
+const inter = Inter({
+ subsets: ["latin", "cyrillic"],
+ weight: ["400", "500", "600", "700"],
+ variable: "--font-inter",
+ display: "swap",
+});
+
// ПТИЦА cockpit numerals (mono). next/font is bundled — no package.json change.
// Cyrillic + latin subsets so mono digits/labels render in the dark cockpit.
const plexMono = IBM_Plex_Mono({
@@ -26,7 +35,7 @@ export default function RootLayout({
children: React.ReactNode;
}) {
return (
-
+
{children}
diff --git a/frontend/src/app/site-finder/analysis/[cad]/ptica/ptica.module.css b/frontend/src/app/site-finder/analysis/[cad]/ptica/ptica.module.css
index 9e9a02f1..f164d9c4 100644
--- a/frontend/src/app/site-finder/analysis/[cad]/ptica/ptica.module.css
+++ b/frontend/src/app/site-finder/analysis/[cad]/ptica/ptica.module.css
@@ -10,7 +10,8 @@
/* ===================== SCOPED TOKENS (dark) ===================== */
.pticaRoot[data-theme="dark"] {
--font-ui:
- "Inter", "Manrope", -apple-system, "Segoe UI", system-ui, sans-serif;
+ var(--font-inter), "Inter", "Manrope", -apple-system, "Segoe UI",
+ system-ui, sans-serif;
--font-mono:
var(--font-plex-mono), "IBM Plex Mono", "Roboto Mono", ui-monospace,
monospace;
@@ -239,6 +240,18 @@
display: flex;
align-items: center;
gap: 12px;
+ /* Wordmark is the «На главную» link — visibly clickable, inherits cockpit
+ colors (no default link blue/underline). */
+ cursor: pointer;
+ text-decoration: none;
+ color: inherit;
+ border-radius: var(--radius-xs);
+}
+/* Visible focus ring on the home link — matches cockpit pattern
+ (.drawerClose / .gaugeButton :focus-visible). */
+.wordmark:focus-visible {
+ outline: var(--line-strong) solid var(--accent-cyan);
+ outline-offset: 3px;
}
.bird {
width: 26px;
@@ -433,6 +446,12 @@
overflow: hidden;
}
.mapMount :global(.leaflet-container) {
+ position: absolute;
+ inset: 0;
+ /* Contain Leaflet's panes (tile 200 / overlay 400 / marker 600 / popup 700)
+ in their OWN stacking context below the cockpit overlay (.mapOverlay /
+ .mapTools at z-index 4) so the legend is not buried under the tiles. */
+ z-index: 1;
width: 100%;
height: 100%;
background: transparent;
@@ -1193,6 +1212,12 @@
}
.hbarName {
color: var(--text-muted);
+ /* Keep one row per format — long bucket labels («5-80+ м²») must not wrap to
+ 2 lines and break the name / track / value column alignment across rows. */
+ min-width: 0;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
}
.hbarTrack {
height: 5px;
diff --git a/frontend/src/components/site-finder/ptica/PticaMapInner.tsx b/frontend/src/components/site-finder/ptica/PticaMapInner.tsx
index 783e465e..312756cb 100644
--- a/frontend/src/components/site-finder/ptica/PticaMapInner.tsx
+++ b/frontend/src/components/site-finder/ptica/PticaMapInner.tsx
@@ -35,6 +35,7 @@ import {
Polyline,
Popup,
Tooltip,
+ AttributionControl,
useMap,
useMapEvents,
} from "react-leaflet";
@@ -434,9 +435,13 @@ export default function PticaMapInner({
center={center}
zoom={geom ? 15 : 11}
zoomControl={false}
+ attributionControl={false}
scrollWheelZoom
style={{ cursor: addMode ? "crosshair" : "grab" }}
>
+ {/* Drop the Leaflet 1.9 flag/«Leaflet» prefix but KEEP the per-tile data
+ attribution (© Esri · Maxar / CARTO · OSM) required for licensing. */}
+
diff --git a/frontend/src/components/site-finder/ptica/PticaShell.tsx b/frontend/src/components/site-finder/ptica/PticaShell.tsx
index a8c548f8..73bc30f4 100644
--- a/frontend/src/components/site-finder/ptica/PticaShell.tsx
+++ b/frontend/src/components/site-finder/ptica/PticaShell.tsx
@@ -16,6 +16,7 @@
*/
import { useEffect, useState } from "react";
+import Link from "next/link";
import styles from "@/app/site-finder/analysis/[cad]/ptica/ptica.module.css";
@@ -319,7 +320,11 @@ export function PticaShell({ activeTab, onTabChange, children }: Props) {
{/* ── Main column ─────────────────────────────────────────────── */}
-
+
ПТИЦА
@@ -329,7 +334,7 @@ export function PticaShell({ activeTab, onTabChange, children }: Props) {
информационно-цифрового анализа
-
+