{# Rolling frame log — swap target for both the manual Refresh button and the auto-poll trigger. Newest first. #}
{% if not frames %}

No frames captured yet. Anything on the bus will appear here.

{% else %} {% for f in frames %} {% if f.details %} {% endif %} {% endfor %}
Time Src Type Summary Data
{{ f.time_str }} {{ f.source_alias }} {# Filter-to-this-alias affordance: sets the src filter to this row's alias + triggers the filter form's input event so htmx re-fetches. Kept small + inline so it sits next to the alias without visual noise. #} [only] {% if f.is_us %}us{% endif %} {{ '%#x' | format(f.frame_type) }} {{ f.summary }} {{ f.data_hex or '(empty)' }} {# Replay: reuses olcbFillFrame() from the send-form preset buttons. data-header/data-body match the preset button convention, so one JS function serves both. #}
{% endif %}