{# Form field macros - renders the appropriate input for each field type #} {# Accessible version: aria-required, aria-invalid, aria-describedby #} {% macro render_field(field, values={}, errors={}) %} {% set value = values.get(field.name, field.default) if values else field.default %} {% set error = errors.get(field.name, "") if errors else "" %} {% set field_id = "field-" ~ field.name %} {% set error_id = "error-" ~ field.name %} {% set hint_id = "hint-" ~ field.name if field.hint is defined and field.hint else "" %} {% set described_by = ([error_id] if error else []) + ([hint_id] if hint_id else []) %}
{% if field.type == "checkbox" %} {# Checkbox: label is inline #} {% elif field.source %} {# Search-select: dynamic search with autofill #} {% include "fragments/search_select.html" %} {# ── Vendored widget overrides (Phase 4) ─────────────────────────── #} {% elif field.widget == "combobox" %} {% elif field.widget == "multi_select" %} {% elif field.widget == "tags" %} {% elif field.widget == "picker" and field.type in ("date", "datetime") %} {% elif field.widget == "range" and field.type in ("date", "datetime") %} {% elif field.widget == "color" %} {% elif field.widget == "rich_text" %} {% elif field.widget == "slider" %} {% else %} {# Standard fields: label above #} {% if field.hint is defined and field.hint %}

{{ field.hint }}

{% endif %} {% if field.type == "textarea" %} {% elif field.type == "select" %} {% elif field.type == "date" %} {% elif field.type == "datetime" %} {% elif field.type == "money" %} {# Money widget: major-unit display input + hidden minor-unit value #} {% set minor_val = values.get(field.name ~ '_minor', '') if values else '' %} {% if field.extra.get('currency_fixed', true) %} {# Pinned currency — static prefix symbol, Alpine dzMoney #}
{% else %} {# Unpinned currency — dropdown selector, Alpine dzMoney #}
{% endif %} {% elif field.type == "number" %} {% elif field.type == "email" %} {% elif field.type == "file" %} {# File upload: Alpine dzFileUpload component #}
{# File preview (shown when file exists) #}
{# Dropzone (shown when no file) #} {# Upload progress #}
{# Error message #}
{% else %} {# Default: text input #} {% endif %} {% endif %} {% if error %} {% endif %}
{% endmacro %}