{% extends "base.html" %} {% block title %}{{ page.title }} — {{ plugin.package }}{% endblock %} {% block content %}

{{ page.title }}

{# The live state (severity badge, tiles, refused notices, plots) lives INSIDE the poll region: a polling browser swaps only this region, so anything outside it freezes at the first render (fold R-a). #} {# Waveform first (fold F8, owner directive — issue comment 6127477670): a digital analyzer leads with its lane traces, so the declared captures render BEFORE the readings region on pages that carry them. Pages WITHOUT lanes plots keep the tile-first shape below. #} {% if lanes %}
{{ lanes }}
{% endif %} {# The live state (severity badge, tiles, refused notices, scalar plots) lives INSIDE the poll region: a polling browser swaps only this region. The lanes figure above sits OUTSIDE it — a poll must not wipe viewport state (the page's own controls rule, extended); slice 3's zoom/scroll swaps land on that stable wrapper. #}
{% include "page-readings.html" %}
{% if controls %} {# Staged changes are HOST state: the inputs render outside the poll region (a poll must not wipe an operator's in-flight input), and a staged value appears only here — never in a reading tile (§E.3). #}

Staged changes

{% if action_error %} {% endif %}
{%- for control in controls %}{{ control.input }}{% endfor %}

Apply writes each staged value, then re-reads the parameter — the page shows the read-back. No lease or policy guards this write.

{% endif %}
{% endblock %}