diff --git a/drb-frontend/app/globals.css b/drb-frontend/app/globals.css
index 9dcc7c2..372887b 100644
--- a/drb-frontend/app/globals.css
+++ b/drb-frontend/app/globals.css
@@ -199,6 +199,13 @@ html:not(.dark) .border-indigo-800 { border-color: #a5b4fc !important; }
filter: invert(1) hue-rotate(180deg) brightness(0.9) contrast(0.9) saturate(0.6);
}
+/* Leaflet popups stay white in both themes (their body text is a fixed
+ * gray-900), so the theme's muted ink — light grey in dark mode, ~2.9:1 on
+ * white — is pinned to a grey that holds AA on white (~6:1). */
+.leaflet-popup-content .text-ink-muted {
+ color: #5B6577;
+}
+
/* 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/app/nodes/[id]/page.tsx b/drb-frontend/app/nodes/[id]/page.tsx
index 0174722..72aa159 100644
--- a/drb-frontend/app/nodes/[id]/page.tsx
+++ b/drb-frontend/app/nodes/[id]/page.tsx
@@ -160,7 +160,8 @@ export default function NodeDetailPage() {
<> No timeout is currently enforced (permanent override).>
)}
}
)}
@@ -245,20 +246,29 @@ export default function NodeDetailPage() {
)}
{/* Actions */}
+ {/* Configure and Restart are admin-only on the server (server-26#222);
+ non-admins get a note instead of a button that 403s. */}
+ {!isAdmin && !node.configured && (
+
This node isn't configured yet. An admin needs to assign it a radio system.
}
{/* GET /tokens and PUT /tokens/{id}/prefer are platform-admin only
(server-26#204 item 6), so for anyone else this panel could
neither list the pool nor save a choice (server-26#213 item 4). */}
{isAdmin && }
-
-
-
-
+ {/* All admin-only routes (server-26#283), incl. area-context and
+ talkgroup-pending GETs and every vocabulary write. */}
+ {isAdmin && (
+ <>
+
+
+
+
+ >
+ )}
);
})}