From f2a4dfe86394c70bce1a70f4acae97d5d8c5818a Mon Sep 17 00:00:00 2001 From: DCCONSTRUCTIONS Date: Wed, 29 Jul 2026 17:00:50 +0300 Subject: [PATCH] fix(map): align canonical map actions --- apps/control-station/src/styles/map.css | 39 ++++++++-- .../src/workspaces/map/WorldMapWorkspace.tsx | 75 ++++++------------- apps/control-station/test/mapView.test.mjs | 14 ++++ 3 files changed, 69 insertions(+), 59 deletions(-) diff --git a/apps/control-station/src/styles/map.css b/apps/control-station/src/styles/map.css index 2b1b9d5..e7bda6a 100644 --- a/apps/control-station/src/styles/map.css +++ b/apps/control-station/src/styles/map.css @@ -39,19 +39,37 @@ max-width: min(58%, 42rem); } -.mission-map__toolbar { +.mission-map__map-actions { position: absolute; - z-index: 4; - right: 50%; - bottom: 1rem; - left: auto; - transform: translateX(50%); + z-index: 5; + top: 1rem; + right: 1rem; + display: flex; + gap: 0.5rem; +} + +.mission-map__map-action.nodedc-icon-button { + background: var(--nodedc-map-glass-bg); + color: var(--nodedc-map-glass-text); + box-shadow: var(--nodedc-glass-dropdown-shadow); + backdrop-filter: blur(var(--nodedc-blur-control)); + -webkit-backdrop-filter: blur(var(--nodedc-blur-control)); +} + +.mission-map__map-action.nodedc-icon-button:hover:not(:disabled) { + background: var(--nodedc-map-glass-hover); + color: var(--nodedc-map-glass-text); +} + +.mission-map__map-action.nodedc-icon-button[aria-pressed="true"] { + background: var(--nodedc-map-glass-active); + color: var(--nodedc-glass-control-active-text); } .mission-map__layers { position: absolute; z-index: 5; - top: 1rem; + top: calc(1rem + var(--nodedc-icon-button-size) + 0.6rem); right: 1rem; display: grid; width: min(23rem, calc(100% - 2rem)); @@ -180,8 +198,13 @@ } .mission-map__layers { - top: 0.65rem; + top: calc(0.65rem + var(--nodedc-icon-button-size) + 0.6rem); right: 0.65rem; width: calc(100% - 1.3rem); } + + .mission-map__map-actions { + top: 0.65rem; + right: 0.65rem; + } } diff --git a/apps/control-station/src/workspaces/map/WorldMapWorkspace.tsx b/apps/control-station/src/workspaces/map/WorldMapWorkspace.tsx index 6f628f1..63ee955 100644 --- a/apps/control-station/src/workspaces/map/WorldMapWorkspace.tsx +++ b/apps/control-station/src/workspaces/map/WorldMapWorkspace.tsx @@ -1,7 +1,6 @@ import { useCallback, useEffect, - useMemo, useRef, useState, type CSSProperties, @@ -24,7 +23,6 @@ import { MapGlassSurface, RangeControl, StatusBadge, - Toolbar, Window, WindowFooterActions, } from "@nodedc/ui-react"; @@ -48,8 +46,6 @@ const editableInspectorSections = new Set([ "tile-cache", ]); -type ToolbarAction = "settings" | "layers" | "reset-view"; - export function WorldMapWorkspace({ definition, }: { @@ -105,15 +101,6 @@ export function WorldMapWorkspace({ } }, [controller, draft]); - const resetRenderer = useCallback(() => { - operatorCameraInteraction.current = false; - updateDraft((current) => { - current.view.camera = null; - return current; - }); - setRendererGeneration((generation) => generation + 1); - }, [updateDraft]); - const retryRenderer = useCallback(() => { operatorCameraInteraction.current = false; setRendererGeneration((generation) => generation + 1); @@ -137,35 +124,6 @@ export function WorldMapWorkspace({ }); }, [updateDraft]); - const toolbarItems = useMemo(() => [ - { - id: "settings" as const, - label: "Настройки карты", - icon: "settings" as const, - active: settingsOpen, - onSelect: () => { - setSettingsOpen((open) => !open); - setLayersOpen(false); - }, - }, - { - id: "layers" as const, - label: "Слои карты", - icon: "grid" as const, - active: layersOpen, - onSelect: () => { - setLayersOpen((open) => !open); - setSettingsOpen(false); - }, - }, - { - id: "reset-view" as const, - label: "Сбросить камеру", - icon: "target" as const, - onSelect: resetRenderer, - }, - ], [layersOpen, resetRenderer, settingsOpen]); - const status = runtimePresentation(runtimeState); const viewBlocking = !viewInitialized && controller.state !== "ready"; const runtimeBlocking = runtimeState.phase === "gateway-unavailable" @@ -234,15 +192,30 @@ export function WorldMapWorkspace({ /> ) : null} - - className="mission-map__toolbar" - placement="bottom" - label="Инструменты карты" - minSize={42} - maxSize={54} - lensCount={3} - items={toolbarItems} - /> +
+ { + setSettingsOpen((open) => !open); + setLayersOpen(false); + }} + > + + + { + setLayersOpen((open) => !open); + setSettingsOpen(false); + }} + > + + +
{layersOpen ? ( { + const source = await readFile( + new URL("../src/workspaces/map/WorldMapWorkspace.tsx", import.meta.url), + "utf8", + ); + + assert.doesNotMatch(source, /