{#- Live run rows (#496), htmx-polled partial fragment. The first top-level element is the poller, which replaces itself (main outerHTML swap). Every row after it is an hx-swap-oob sibling that htmx lifts out first and swaps into the grid by id; wrapping them would break that, so this file has no root element. -#} {% from "legacy_runs/_live_poller.html" import poller %} {% from "legacy_runs/_run_row.html" import run_row %} {{ poller(live_ids, poll_seconds) }} {% for it in items %} {{ run_row(it, stage_progress.get(it.run_id), now, csrf_requeue, oob=true, just_finished=it.run_id in finished_ids) }} {% endfor %}