{# L'habillage de tous les champs du site. Il vit dans un thème plutôt que dans chaque gabarit : les trois écrans du formulaire de contact partagent leurs classes, et un champ ajouté demain ressemblera aux autres sans que personne y pense. Les classes sont posées sur les blocs de saisie eux-mêmes, jamais sur `widget_attributes` : ce dernier sert aussi aux cases à cocher et aux boutons radio, qui n'ont rien à faire d'une bordure et d'une pleine largeur. L'apparence d'un champ tient dans la classe `.field`, définie dans la feuille de style : un thème de formulaire ne partage pas ses variables entre blocs, et recopier vingt classes utilitaires trois fois de suite finit toujours par diverger. #} {% use 'form_div_layout.html.twig' %} {% block form_row %}
{{ form_label(form) }} {{ form_widget(form) }} {% if help is not empty %}

{{ help }}

{% endif %} {{ form_errors(form) }}
{% endblock %} {% block form_label %} {% if label is not same as(false) %} {% set label_attr = label_attr|merge({ class: (label_attr.class|default('') ~ ' block font-sans text-[0.85rem] font-semibold text-ink')|trim }) %} {{ parent() }} {% endif %} {% endblock %} {# Le texte d'aide est rendu par `form_row`, sous le champ. #} {% block form_help %}{% endblock %} {% block form_widget_simple %} {% set attr = attr|merge({ class: (attr.class|default('') ~ ' field')|trim }) %} {{ parent() }} {% endblock %} {% block textarea_widget %} {% set attr = attr|merge({ class: (attr.class|default('') ~ ' field leading-relaxed')|trim }) %} {{ parent() }} {% endblock %} {% block choice_widget_collapsed %} {% set attr = attr|merge({ class: (attr.class|default('') ~ ' field')|trim }) %} {{ parent() }} {% endblock %} {% block form_errors %} {% if errors|length > 0 %} {% endif %} {% endblock %}