diff --git a/backend/app/maps.py b/backend/app/maps.py
index e5cc064..1713050 100644
--- a/backend/app/maps.py
+++ b/backend/app/maps.py
@@ -618,6 +618,7 @@ def install(api, db, current_user, lobby_for, dm_only, hub, event, store_dir: Pa
"vision": {"los": ctx["los"], "empty": ctx["empty"], "rev": ctx["rev"], "fog": ctx.get("fog")}}
if ctx["is_dm"]:
res["los_on"] = bool(lobby["los"])
+ res["wall_count"] = len(ctx["walls"])
res["sight"] = lobby["sight"] if lobby["sight"] is not None else m["sight"]
res["sight_map"] = m["sight"]
res["fog_on"] = bool(lobby["fog"])
diff --git a/frontend/src/Lobbies.jsx b/frontend/src/Lobbies.jsx
index 01ab171..407e0f3 100644
--- a/frontend/src/Lobbies.jsx
+++ b/frontend/src/Lobbies.jsx
@@ -916,19 +916,19 @@ function LobbyView({ id, rules, user }) {
{lobby.members.map((m) => )}
)}
- {lobby.is_dm && mapState.walls?.length > 0 && mapState.los_on && <>
+ {lobby.is_dm && mapState.wall_count > 0 && mapState.los_on && <>
{mapState.fog_on && }
>}
- {full && mapState.walls?.length > 0 && mapState.los_on && }
- {lobby.is_dm && mapState.walls?.length > 0 && }
- {full && mapState.walls?.length > 0 && }
+ {lobby.is_dm && mapState.wall_count > 0 && mapState.los_on && }
+ {lobby.is_dm && mapState.wall_count > 0 && }
+ {lobby.is_dm && mapState.wall_count > 0 && }
- {full && }
- {full && }
- {full && }
+ {lobby.is_dm && }
+ {lobby.is_dm && }
+ {lobby.is_dm && }
{full && (rv || mapState.reveals?.length > 0) && (
diff --git a/frontend/src/styles.css b/frontend/src/styles.css
index ea7bb3e..410bb11 100644
--- a/frontend/src/styles.css
+++ b/frontend/src/styles.css
@@ -629,3 +629,10 @@ textarea.pwrite:focus { box-shadow: 0 0 0 1px var(--pg); }
.tokenform .mini { min-height: 0; padding: .15rem .5rem; }
.tokenlist .tokrow > button:first-child { width: auto; flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.tokenlist .tokrow > button.mini { width: auto; flex: none; }
+/* table tool buttons: low and readable on the dark map */
+.maptools button, .maptools select { padding: .1rem .5rem; font-size: .76rem; line-height: 1.2; height: 1.6rem; min-height: 0; }
+.maptools button.ghost, .maptools select { background: rgba(20,22,26,.85); color: #f1f1f1; border: 1px solid rgba(255,255,255,.35); }
+.maptools button.on { background: var(--accent, #2f7d32); color: #fff; border-color: transparent; }
+.maptools button:disabled { opacity: .45; }
+.maptools .sightrange input { height: 1.6rem; padding: 0 .3rem; }
+.maptools .sightrange { color: #f1f1f1; }