Index: src/views/pages/ward.ejs
===================================================================
--- src/views/pages/ward.ejs	(revision 2086ea255ae8ea5a474fc805eda10bd71146c947)
+++ src/views/pages/ward.ejs	(revision 39dab6b0c3b5fd70bb2f06743430f0014384b3b7)
@@ -19,4 +19,5 @@
     <div class="topbar">
       <h1><%= state.strings.title %></h1>
+      <button id="theme-open" type="button" class="icon-btn" aria-label="<%= state.strings.theme %>">🎨</button>
       <button id="mode" type="button" aria-pressed="false"><%= state.strings.toSky %></button>
     </div>
@@ -141,4 +142,20 @@
   </dialog>
 
+  <!-- De mini-speler: één blijvende <audio> buiten de feed, zodat het geluid
+       een herteken en een wissel naar de hemel overleeft. -->
+  <div id="mini-player" hidden>
+    <audio id="mini-audio" preload="none"></audio>
+    <button id="mini-toggle" type="button" aria-label="<%= state.strings.playPause %>">▶</button>
+    <span id="mini-title"></span>
+    <button id="mini-close" type="button" aria-label="<%= state.strings.close %>">✕</button>
+  </div>
+
+  <!-- De themakiezer (SkyPalette): acht kleuren, de keuze kleurt de hele ward. -->
+  <dialog id="theme-dialog">
+    <h2><%= state.strings.theme %></h2>
+    <div id="theme-swatches" class="swatches"></div>
+    <button id="theme-close" type="button"><%= state.strings.cancel %></button>
+  </dialog>
+
   <!-- De begintoestand reist als JSON mee, zodat de pagina meteen compleet is
        en niet eerst leeg staat te wachten op een fetch. Geen inline script:
