{% comment %} The refreshable half of the custom-fields page. The list page renders this inline; every mutation's toast_response carries a `fieldsChanged` HX-Trigger, and this container answers it by re-fetching itself from `contacts:field_rows` — a view that renders this template alone. Fetching the full page and picking one div out of it with hx-select also works, and costs a whole shell render (sidebar, workspace switcher, every context-processor query) per keystroke-sized edit. The root element's id, hx-get, hx-trigger and hx-swap="outerHTML" are that seam and must stay on it — see contacts/_tag_rows.html for what moving them breaks. A field's type is shown but never editable: changing it would orphan every stored value in the column the old type used, where the condition engine reads the new type's column and sees nothing. See services.rename_custom_field. It is a pill beside the name rather than a control, so the page does not look like it is offering something it refuses. Delete is the only other thing you can do, and it is destructive, so it sits behind the "…" rather than as a second button of equal weight. The menu stays even with one item in it, so these rows do not disagree with the tag rows. {% endcomment %}
No custom fields yet
Save answers from flows, then use them to filter contacts.