{# The polled fragment: engine health, the exposure strip, the readings, and the chart data. The `hx-*` attributes ride on this element rather than on a wrapper because the swap replaces this element — a trigger declared on a parent would keep firing at whatever the parent used to point at, and one declared on a child would be swapped away with it. The chart *shells* deliberately live outside this fragment, in `dashboard.html`. Their uPlot instances survive every poll and are handed new data by `board.js`; re-rendering them here would tear down and rebuild a canvas every 30 seconds and lose the reader's place in the process. #} {# `data-window` is read by the heatmap island, which lives outside this fragment and has no other way to learn that the range changed. It belongs HERE rather than on the island because this element is what the swap replaces: an attribute on the island would have to be kept in step by hand, and the copy that is never updated is the one that silently disagrees. One element owns the range; everything else reads it. `data-cohort` follows the same rule and has no reader yet, deliberately. The heatmap island does NOT read it: `heatmap_minute` stores a packed grid and no staff dimension, so the overlays cannot follow the cohort at all — see the caveat below. The attribute is here so that anything which ever can follow it reads the one authoritative copy instead of starting a second one. `data-timezone` is the same pattern for the third reader: uPlot draws its axes in the browser, so the site's zone has to travel as data. The exposure tick beside it is converted server-side, and both come from `site.timezone` — one page, one clock (P3.9). #}
{{ since_label }} now
Readings show {{ cohort.value }}; heatmaps show everyone.
{% endif %}