{% comment %} The Triggers drawer's body (issue #11, SPEC §10). Rendered inside edit.html on first open and re-fetched whole on every `triggersChanged` event, so there is exactly one renderer for the list — a filtered view and a post-mutation refresh can never disagree about what a row looks like. Same pattern as contacts/_tag_rows.html and flows/_list_rows.html. Everything platform-supplied here (a keyword, a ref, a connection's display name) is attacker-adjacent user text and is rendered escaped. No mark_safe, no `|safe`. {% endcomment %} {% comment %} hx-include carries #trigger-focus, the hidden input in edit.html that holds the id of the trigger the canvas asked to open. It lives outside this region on purpose: this element is replaced wholesale by every refetch, and an input inside it would be swapped away mid-request. {% endcomment %}

Triggers

What starts this flow. Lower numbers run first and the first match wins, across every flow in this workspace, not just this one.

{% for label in duplicate_stage_labels %}
More than one “{{ label }}” trigger is enabled on this flow. Only the one with the lowest number will ever run.
{% endfor %} {% if not triggers %}
{% include "components/empty_state.html" with icon="flows" title="No triggers yet" body="A published flow with no trigger never runs. Add one below." %}
{% else %}
{% for row in triggers %} {% include "flows/_trigger_row.html" %} {% endfor %}
{% endif %} {% if can_edit %} {% comment %} Option cards rather than a