fix: modulekolom past zich aan het aantal modules aan

Er is een vierde binnenmodule bijgekomen. De kaart verscheen al vanzelf
(StationMapper leest alle NAModule4-modules uit), maar de kolom was op
drie kaarten ontworpen: vier kaarten van 120px duwden de rij op 481px en
daarmee de onderste strook 39px voorbij de onderrand van het canvas.

De kolom heeft nu een vaste hoogte van 412px met overflow verborgen, en
fitRooms() verkleint de inhoud met een schaal zodra die niet past. Bij
drie modules verandert er niets (schaal 1), bij vier wordt het 0,86 en
met een vastgezette module 0,78. Zo blijft het scherm kloppen, ongeacht
hoeveel modules erbij komen.

De dev-fixture heeft er een vierde module bij, zodat dit lokaal te zien
is zonder Netatmo-koppeling. Servicewerker naar v12.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-14 18:44:38 +02:00
co-authored by Claude Opus 5
parent 75111a5571
commit ca2fc76552
8 changed files with 49 additions and 7 deletions
+15 -1
View File
@@ -2,7 +2,7 @@ import {
f1, fInt, fmm, markerPos, barHeights, wmoIcon, trendLabel,
formatDate, formatTime, dayAbbr, monthName, isOlderThan, msUntil,
co2Level, fPct, fHpa, seriesRange, sparklinePath,
windArrowDeg, fKmh, formatHour, formatFullDate, pinRoom, hourTicks,
windArrowDeg, fKmh, formatHour, formatFullDate, pinRoom, hourTicks, scaleToFit,
} from './format.js';
import { icon, windArrow } from './icons.js';
@@ -17,6 +17,7 @@ const FALLBACK_TZ = 'Europe/Berlin';
const OVERLAY_MS = 20000; // hoe lang een overlay blijft staan zonder tik
const RADAR_BUCKET_MS = 240000; // hergebruikvenster voor het radarbeeld, gelijk aan de servercache
const HOURLY_WIDTH = 1045; // = stage-breedte 1133 min 2x 44px padding, zelfde marge als de rest van het scherm
const INSIDE_H = 412; // hoogte van de middelste rij: 744 - 2x30 padding - 40 kopregel - 232 onderstrook
const $ = (id) => document.getElementById(id);
const stage = $('stage');
@@ -112,6 +113,19 @@ function renderRooms(rooms) {
</div>`;
});
$('rooms').innerHTML = html.join('');
fitRooms();
}
/**
* Houdt de modulekolom binnen zijn vaste hoogte. Bij drie modules past alles op ware grootte; komt er een
* module bij (of groeit er een doordat je hem vastzet), dan wordt het geheel net genoeg verkleind. Zonder
* dit duwt een vierde kaart de onderste strook van het scherm af.
*/
function fitRooms() {
const el = $('rooms');
el.style.transform = 'none';
const scale = scaleToFit(el.scrollHeight, INSIDE_H);
el.style.transform = scale < 1 ? `scale(${scale.toFixed(4)})` : '';
}
function renderRain(rain, now) {
+6
View File
@@ -246,3 +246,9 @@ export function hourTicks(startIso, endIso, tz, stepHours = 6, minGapPercent = 9
}
return ticks;
}
/** Schaal om `natural` px binnen `available` px te passen; nooit vergroten, nooit negatief. */
export function scaleToFit(natural, available) {
if (!(natural > 0) || !(available > 0)) return 1;
return Math.min(1, available / natural);
}
+1 -1
View File
@@ -62,7 +62,7 @@
</div>
</section>
<section class="a-inside" id="rooms"></section>
<section class="a-inside"><div id="rooms"></div></section>
<section class="a-bottom">
<div id="rain-block">
+4 -2
View File
@@ -109,8 +109,10 @@ html, body {
.a-spark-grid { stroke: var(--line); stroke-width: 1; vector-effect: non-scaling-stroke; opacity: .6; }
.a-spark-line { fill: none; stroke: var(--rain); stroke-width: 2.4; stroke-linecap: round; stroke-linejoin: round; vector-effect: non-scaling-stroke; }
/* Binnen */
.a-inside { align-self: center; }
/* Binnen. Vaste hoogte met overflow verborgen: hoeveel modules er ook zijn, de kolom duwt nooit de
onderste strook van het scherm af. Past de inhoud niet, dan verkleint fitRooms() hem met een schaal. */
.a-inside { align-self: center; height: 412px; display: flex; align-items: center; overflow: hidden; }
#rooms { width: 100%; transform-origin: center center; }
.a-room { padding: 12px 0; border-top: 1px solid var(--line); }
.a-room:first-child { border-top: 0; }
.a-rname { font-size: 19px; color: var(--muted); display: flex; justify-content: space-between; align-items: center; }
+1 -1
View File
@@ -1,6 +1,6 @@
/* Service worker: app-shell cache-first, API network-first met timeout en fallback op de laatste response. */
const VERSION = 'weerscherm-v11';
const VERSION = 'weerscherm-v12';
const SHELL = [
'./',
'./index.html',