{# Server rendered, no JavaScript needed. Errors are announced and each message sits at its field. Schritte sind fieldsets: ohne Skript ein langes Formular mit Abschnitten, mit form-steps.js ein Schritt nach dem anderen. Bedingungen stehen als Datenattribute am Feld; der Server prüft sie beim Absenden selbst und verlangt nichts, was gar nicht galt. #} {% if form is null %}

{{ 'Dieses Formular ist nicht mehr vorhanden.'|kant_t }}

{% elseif sent %}

{{ form.settings.success|kant_t }}

{% else %} {% set hasSteps = form.fields|filter(f => f.type == 'step')|length > 0 %}
{% if form.locale|default(null) %}{% endif %} {# Bait for automated senders. Hidden from view, from assistive technology and from tab order. #} {% if errors._form is defined %} {% elseif errors is not empty %} {% endif %} {% for field in form.fields %} {% set id = blockId ~ '-' ~ field.name %} {% set error = errors[field.name]|default(null) %} {% set value = values[field.name]|default('') %} {% set described = (field.help ? id ~ '-help ' : '') ~ (error ? id ~ '-error' : '') %} {% set condition %}{% if field.showIf|default(null) %} data-show-if="{{ field.showIf.field }}" data-show-values="{{ field.showIf.values|join('|') }}"{% endif %}{% endset %} {% set requiredMark %}{% if field.required %} ({{ 'Pflichtfeld'|kant_t }}){% endif %}{% endset %} {% if field.type == 'step' %} {% if not loop.first and form.fields[0:loop.index0]|filter(f => f.type == 'step')|length > 0 %}{% endif %}
{{ field.label }} {% if field.help %}

{{ field.help }}

{% endif %} {% elseif field.type == 'consent' %}
{% if field.help %}

{{ field.help }}

{% endif %} {% if error %}

{{ error }}

{% endif %}
{% elseif field.type == 'radio' or field.type == 'checkboxes' %} {# Eine Gruppe: die Beschriftung ist die legend, jede Option hat ihr eigenes Feld. Bei der Mehrfachauswahl steht required nicht am Kästchen - das hieße „alle ankreuzen“ - sondern an der Gruppe; Skript und Server prüfen es dort. #} {# Hat eine Option ein Bild, wird die ganze Auswahl zur Bildauswahl: jede Option eine Karte mit Bild und Text, das Kästchen bleibt darin für Tastatur und Vorlesesoftware. #} {% set bildauswahl = field.images|default({})|length > 0 %}
{{ field.label }}{{ requiredMark }} {% set picked = field.type == 'checkboxes' ? value|split(', ') : [value] %} {% if bildauswahl %}
{% endif %} {% for option in field.options %} {% set bild = optionImages[field.images[option]|default('')]|default(null) %}
{% endfor %} {% if bildauswahl %}
{% endif %} {% if field.help %}

{{ field.help }}

{% endif %} {% if error %}

{{ error }}

{% endif %}
{% else %}
{% if field.type == 'textarea' %} {% elseif field.type == 'select' %} {% elseif field.type == 'number' %}
{% if field.unit|default('') %}{% endif %}
{% else %} {% endif %} {% if field.help %}

{{ field.help }}

{% endif %} {% if error %}

{{ error }}

{% endif %}
{% endif %} {% endfor %} {% if hasSteps %}
{% endif %} {% if turnstileKey|default('') %} {# Cloudflare Turnstile. Braucht JavaScript; ohne Skript bleibt das Formular unabsendbar, und genau deshalb ist die Prüfung eine Entscheidung und keine Voreinstellung. #}
{% endif %}
{% endif %}