fix(web): floating preview shows a frame immediately on open + is resizable

The floating preview opened empty and stayed empty until the display next
CHANGED - the SSE stream only pushes frames on change, and the panel only
consumed frames while already open, so the connection's initial frame
(sent while the panel was closed) was dropped. Reported from mobile
testing as "the button doesn't work".

- updateDisplayPreview now caches the latest frame globally regardless of
  panel state; opening the panel populates the image from that cache
  instantly, then live frames take over.
- Resizable: a size button cycles 192/256/384/512px presets (persisted per
  browser; works on touch), and desktop additionally gets a native drag
  handle (CSS resize: both). The image is fluid within the panel; on
  phones the panel is capped to the viewport width. The size icon
  (fa-up-right-and-down-left-from-center) is verified present in the
  vendored FA 6.0.0.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KEZK1P1Q1fu5pcuVrkrCFZ
This commit is contained in:
ChuckBuilds
2026-07-16 14:46:59 -04:00
co-authored by Claude Sonnet 5
parent c958630ce3
commit 64871fd555
4 changed files with 62 additions and 8 deletions
+7
View File
@@ -1878,6 +1878,13 @@
const ledCanvas = document.getElementById('ledCanvas');
const placeholder = document.getElementById('displayPlaceholder');
// Always cache the latest frame so the floating preview can show
// something the moment it's opened — SSE only sends frames when
// the display CHANGES, so a late subscriber would otherwise stare
// at an empty panel until the next change.
if (data.image) {
window._lastPreviewFrame = data.image;
}
// Feed the floating mini preview (lives in base.html, present on
// every tab) before the overview-only guard below.
const floatImg = document.getElementById('floating-preview-img');