{% load common_extras %}{% comment %} One template, as both the gallery and the flows empty state show it. Everything here is text from the validated document or from TEMPLATE_COPY — no |safe, no mark_safe, matching the rule the review page states: a template's message bodies carry {{placeholders}} that only apps.flows.rendering ever substitutes, and showing one must not be the exception. A plain form rather than hx-post: the response is a redirect to the mapping page, which is what the upload form already does. `searchable` is what the gallery page passes and the empty state does not. matches() is defined in template_gallery.html's x-data, and the empty state sits inside list.html's, which has no such method — an unguarded x-show there throws inside Alpine's evaluator on every card, on every render of the core Flows page. {% endcomment %}
{% comment %} The card's head says where it runs and how it starts (HANDOFF §3, Templates): the channel's own glyph and name, and the trigger as a tag. {% endcomment %}
{% for platform in entry.platforms|slice:":1" %} {% include "partials/_platform_icon.html" with platform=platform.key size="sm" %} {{ platform.label }} {% empty %} Any channel {% endfor %} {% if entry.triggers %}{{ entry.triggers.0 }}{% endif %}

{{ entry.card.name }}

{% if entry.card.summary %}

{{ entry.card.summary }}

{% endif %}
{% comment %} The channels it needs and whether you have them. A template that needs Instagram is worth knowing about before the review page asks you to map it, not after — and "connected" here means an *active* connection, because a disabled or re-auth-pending one cannot send. It warns; it never blocks. Somebody may legitimately be reading a template before connecting anything. Only the missing ones are listed: a connected channel is already named in the card's head, and repeating it as a chip was noise. {% endcomment %}
{% for platform in entry.platforms %}{% if not platform.connected %}Needs {{ platform.label }}{% endif %}{% endfor %}{% for need in entry.needs %}Needs {{ need|lower }}{% endfor %}{% if entry.card.calls_out %}Calls out to the internet{% endif %}
{% comment %} "Calls out to the internet": installing a template only ever touches your own workspace — except for this. An external_request node sends whatever the flow gathered to a third party, which is worth knowing before the install, not after. {% endcomment %} {% comment %} One secondary button per card. Every card used to carry the orange one, which on a grid of twenty made the page a wall of calls to action; the choice of template is the action, and none of them outranks another. {% endcomment %}
{% csrf_token %} {{ entry.card.step_count }} step{{ entry.card.step_count|pluralize }}{% if not entry.triggers %} · started by another flow{% endif %}