{% comment %} The contact's tags, plus a typeahead that can attach one. Refreshes itself on `contactTagsChanged`, which the add and remove endpoints' toasts carry — the same event/refetch pairing `_tag_rows.html` uses. There is no tag *editor* here: renaming, merging and deleting tags live on the settings page, and duplicating them beside this control was the named failure mode for this issue. This attaches and detaches, which is what a contact page is for. {% endcomment %}

Tags

{% for tag in contact_tags %} {{ tag.name }} {% if can_edit_contacts %} {% endif %} {% empty %} No tags yet. {% endfor %}
{% if can_edit_contacts %} {% comment %} The typeahead is a plain htmx GET into a results list. `name` is sent rather than a chosen id only when the caller may also create tags — the view enforces that split, and `_tag_suggestions.html` only renders the "create" affordance for a `manage_crm` holder, so the two agree. {% endcomment %}
{% endif %}