{% extends "base.html" %} {# The page frame. Everything that changes with a poll is in `_board.html`, which is rendered inline here on first load and then replaces itself every 30 seconds. The chart shells are here rather than in the fragment on purpose — see the note there. The first plate is the lead: it is the metric the operator configured first, given the height to be read from across the counter rather than leaned into. #} {% block content %} {% include "_board.html" %}
{% for chart in charts %}
{{ chart.metric.replace("_", " ") }}
{% endfor %}
{# Zone heatmaps. Shells here rather than in the fragment for the same reason the plates are: a canvas inside `#board` would be destroyed and repainted every 30 seconds. One figure per zone whose config asked for `heatmap`, built from the config rather than from the data — a zone nobody has walked through yet renders cold, which is the true answer, where omitting the figure would read as "this zone is not being watched". #} {% if heatmaps %}
{% for scope in heatmaps %}
{{ scope.zone_id }} {{ scope.camera_id }}

busiest cell

{% endfor %}
{% endif %} {% endblock %}