[hidden] sets display:none, but .m-view{display:flex} has equal
specificity and comes later, so it overrode the hidden attribute and
both #view-live and #view-arch rendered together. Add
.m-view[hidden]{display:none} so the inactive mode is actually hidden.
VERSION 0.0.152 -> 0.0.153
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Move mode selection (Live / Архив) into a top hamburger side-drawer
instead of the bottom bar. Header now shows the ☰ button + current mode
title. Live view has a single pause/play button (no seek bar); Archive
keeps native controls for seeking (перемотка).
VERSION 0.0.151 -> 0.0.152
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replace the two-tab bottom bar (Live / Архив) with a single centered
toggle button. It switches the mode either/or: shows the current mode
with a swap glyph (⇆), tap flips Live ⇄ Архив.
VERSION 0.0.150 -> 0.0.151
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
A new mobile dashboard is served on a second host port (8443) mapped to the
same backend, so the recorder/supervisor is not duplicated. main.py detects
the mobile port via the Host header and serves mobile.html instead of the
desktop index. The mobile SPA has two modes: Live (one camera with a selector)
and Archive (camera + date + segment list). Video is delivered as server-side
H.264 (live.mp4 / play.mp4 transcode) so a plain <video> plays on any phone.
Bottom tab bar, dark theme, safe-area aware.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>