{% comment %} One card — a standalone `card` block, or one of a `gallery`'s. Shared, because it was not: the gallery branch grew a copy that rendered the image, title and link and quietly dropped the subtitle and the buttons, so a carousel arrived in the thread with its text and its actions missing. Two copies of markup this fiddly diverge; one cannot. Every URL here reached the view model through is_renderable_url, so an href is already known to be http(s) — see apps/inbox/rendering.py. `rel` and `target` are still explicit: the destination was chosen by the same stranger who wrote the message. {% endcomment %}
{% if card.image_url %}{% endif %} {% if card.title %}
{{ card.title }}
{% endif %} {% if card.subtitle %}
{{ card.subtitle }}
{% endif %} {% if card.url %}Open{% endif %} {% if card.buttons %}
{% for button in card.buttons %} {% if button.url %} {{ button.label }} {% else %} {% comment %}A postback: its target was the contact's app, so there is nothing here for a team member to press.{% endcomment %} {{ button.label }} {% endif %} {% endfor %}
{% endif %}