- {shown.map((a, idx) => (
+ {alarms.map((a, idx) => (
{
if (!onSelectMmsi) return;
diff --git a/apps/web/src/widgets/info/VesselInfoPanel.tsx b/apps/web/src/widgets/info/VesselInfoPanel.tsx
index b0c4a1f..845640e 100644
--- a/apps/web/src/widgets/info/VesselInfoPanel.tsx
+++ b/apps/web/src/widgets/info/VesselInfoPanel.tsx
@@ -2,6 +2,7 @@ import { ZONE_META } from "../../entities/zone/model/meta";
import { SPEED_MAX, VESSEL_TYPES } from "../../entities/vessel/model/meta";
import type { DerivedLegacyVessel } from "../../features/legacyDashboard/model/types";
import { haversineNm } from "../../shared/lib/geo/haversineNm";
+import { OVERLAY_RGB, rgbToHex } from "../../shared/lib/map/palette";
type Props = {
vessel: DerivedLegacyVessel;
@@ -93,7 +94,7 @@ export function VesselInfoPanel({ vessel: v, allVessels, onClose, onSelectMmsi }
쌍 이격
- 3 ? "#F59E0B" : "#22C55E" }}>
+ 3 ? rgbToHex(OVERLAY_RGB.pairWarn) : "#22C55E" }}>
{pairDist.toFixed(2)}NM {pairDist > 3 ? "⚠" : "✓"}
diff --git a/apps/web/src/widgets/legend/MapLegend.tsx b/apps/web/src/widgets/legend/MapLegend.tsx
index 5682992..3377175 100644
--- a/apps/web/src/widgets/legend/MapLegend.tsx
+++ b/apps/web/src/widgets/legend/MapLegend.tsx
@@ -1,4 +1,5 @@
import { ZONE_IDS, ZONE_META } from "../../entities/zone/model/meta";
+import { LEGACY_CODE_COLORS_HEX, OTHER_AIS_SPEED_HEX, OVERLAY_RGB, rgbToHex, rgba } from "../../shared/lib/map/palette";
export function MapLegend() {
return (
@@ -12,48 +13,56 @@ export function MapLegend() {
))}
- AIS 선박(속도)
+ 기타 AIS 선박(속도)
-
- SOG < 1 kt (or unknown)
+
+ SOG < 1 kt
+
+
CN Permit(업종)
+
밀도(3D)
@@ -66,25 +75,29 @@ export function MapLegend() {
연결선
+
);
}
diff --git a/apps/web/src/widgets/map3d/Map3D.tsx b/apps/web/src/widgets/map3d/Map3D.tsx
index 2468837..d3da34b 100644
--- a/apps/web/src/widgets/map3d/Map3D.tsx
+++ b/apps/web/src/widgets/map3d/Map3D.tsx
@@ -17,6 +17,7 @@ import type { ZoneId } from "../../entities/zone/model/meta";
import { ZONE_META } from "../../entities/zone/model/meta";
import type { MapToggleState } from "../../features/mapToggles/MapToggles";
import type { FcLink, FleetCircle, PairLink } from "../../features/legacyDashboard/model/types";
+import { LEGACY_CODE_COLORS_RGB, OVERLAY_RGB, rgba as rgbaCss } from "../../shared/lib/map/palette";
import { MaplibreDeckCustomLayer } from "./MaplibreDeckCustomLayer";
export type Map3DSettings = {
@@ -183,7 +184,7 @@ function makeFleetMemberMatchExpr(hoveredFleetMmsiList: number[]) {
return false;
}
const clauses = hoveredFleetMmsiList.map((mmsi) =>
- ["in", mmsi, ["coalesce", ["get", "vesselMmsis"], []]] as unknown[],
+ ["in", mmsi, ["coalesce", ["get", "vesselMmsis"], ["literal", []]]] as unknown[],
);
return ["any", ...clauses] as unknown[];
}
@@ -545,21 +546,141 @@ function getGlobeBaseShipColor({
if (rgb) return rgbToHex(lightenColor(rgb, 0.38));
}
- if (!isFiniteNumber(sog)) return "rgba(100,116,139,0.75)";
- if (sog >= 10) return "#3b82f6";
- if (sog >= 1) return "#22c55e";
- return "rgba(100,116,139,0.75)";
+ // Non-target AIS should be visible but muted so target vessels stand out.
+ // Encode speed mostly via brightness (not hue) to avoid clashing with target category colors.
+ if (!isFiniteNumber(sog)) return "rgba(100,116,139,0.55)";
+ if (sog >= 10) return "rgba(148,163,184,0.78)";
+ if (sog >= 1) return "rgba(100,116,139,0.74)";
+ return "rgba(71,85,105,0.68)";
}
-const LEGACY_CODE_COLORS: Record