diff --git a/drb-frontend/app/globals.css b/drb-frontend/app/globals.css index 215b20b..9dcc7c2 100644 --- a/drb-frontend/app/globals.css +++ b/drb-frontend/app/globals.css @@ -43,11 +43,11 @@ --line-strong: rgba(255,255,255,.17); --ink: #E8EBF0; --ink-2: #A5B0C2; - --ink-muted: #77839A; + --ink-muted: #8C98AE; /* was #77839A: 4.2:1 on raised, failed AA at the 10-12px it's used at (#136) */ --accent: #3987E5; --sev-moderate: #C98500; - --sev-major: #D03B3B; + --sev-major: #F05252; /* was #D03B3B: 3.7:1 as text on surface (#136) */ --map-bg: #0E131B; --map-block: #161C26; @@ -191,6 +191,14 @@ html:not(.dark) .border-indigo-800 { border-color: #a5b4fc !important; } z-index: 0; } +/* "Dark" base layer (#136): the prod tile URL is bright OSM, so dark-theme + * overlay cards sat on a bright, busy map. Inverting the raster keeps the + * keyless OSM source (CARTO's dark_all CDN proved flaky, #117) while giving + * the overlays the dark ground their palette was chosen for. */ +.leaflet-tile-pane .drb-tiles-dark { + filter: invert(1) hue-rotate(180deg) brightness(0.9) contrast(0.9) saturate(0.6); +} + /* Pinned 511 camera tiles (MapView DotCameraLayer): strip Leaflet's tooltip * padding and let the tile's own theme colours show, so the tile is no bigger * than the video it holds. */ diff --git a/drb-frontend/components/MapView.tsx b/drb-frontend/components/MapView.tsx index 1356181..3409220 100644 --- a/drb-frontend/components/MapView.tsx +++ b/drb-frontend/components/MapView.tsx @@ -1802,6 +1802,7 @@ function MapView({ @@ -2083,7 +2084,7 @@ function MapView({ {/* Gate A / A2 (server-26#46) — the rail's titles, locations and unit counts are pipeline output. Pinned above the scroll area so it cannot be scrolled off the screen it qualifies. */} -
+
{filteredFrom != null && (

{incidents.length} of {filteredFrom} · filtered

)} @@ -2104,12 +2105,13 @@ function MapView({ const latest = (callsByIncident.get(inc.incident_id) ?? []) .filter(hasAudio) .reduce((best, c) => (!best || c.started_at > best.started_at ? c : best), null); - const baseClass = `w-full text-left bg-surface/90 backdrop-blur-sm border rounded-lg px-3 py-2 text-xs hover:brightness-110 transition-all ${selected ? "ring-2 ring-accent" : ""}`; + // Opaque, not glass (#136): any see-through over a busy basemap put text on map colour. + const baseClass = `w-full text-left bg-surface border shadow rounded-lg px-3 py-2 text-xs hover:brightness-110 transition-all ${selected ? "ring-2 ring-accent" : ""}`; const cardBody = ( <>
- + {isKnownSeverity(inc.severity) ? SEVERITY_LABEL[inc.severity] : "Unknown"} {live && ON AIR} @@ -2123,9 +2125,9 @@ function MapView({ {onSelectIncident && units.length > 0 && (
{units.slice(0, 4).map((u) => ( - {u} + {u} ))} - {units.length > 4 && +{units.length - 4}} + {units.length > 4 && +{units.length - 4}}
)}
@@ -2137,7 +2139,7 @@ function MapView({ )}
{!inc.location_coords && !onSelectIncident && ( -

View details →

+

View details →

)} ); @@ -2153,7 +2155,7 @@ function MapView({ onClick={() => handleIncidentSelect(inc)} aria-pressed={selected} className={`${baseClass} ${latest ? "pr-10" : ""}`} - style={{ borderColor: color + "55" }} + style={{ borderColor: `color-mix(in srgb, ${color} 60%, transparent)` }} > {cardBody} @@ -2166,7 +2168,7 @@ function MapView({ {cardBody} @@ -2181,13 +2183,13 @@ function MapView({
{drawerOpen && ( -
+
{/* Gate A / A2 (server-26#46) */} {railIncidents.map((inc) => { @@ -2210,7 +2212,7 @@ function MapView({ handleIncidentSelect(inc); }} className="w-full text-left border rounded px-2 py-1.5 text-xs" - style={{ borderColor: color + "55" }} + style={{ borderColor: `color-mix(in srgb, ${color} 60%, transparent)` }} > {label} @@ -2221,7 +2223,7 @@ function MapView({ key={inc.incident_id} href={`/incidents/${inc.incident_id}`} className="block w-full text-left border rounded px-2 py-1.5 text-xs" - style={{ borderColor: color + "55" }} + style={{ borderColor: `color-mix(in srgb, ${color} 60%, transparent)` }} > {label}