{# Composants de formulaire normalisés (charte « Accessible chaleureux »). Usage dans une page (dans un
qui inclut partials/csrf.html) : {% from "components/forms.html" import field, select_field, checkbox, submit %} {{ field("email", label="Courriel", type="email", required=True) }} {{ submit("Enregistrer") }} État d'erreur : passez error="message" à field/textarea_field/select_field pour afficher la bordure rouge et le message (validation serveur, réponse 422). Les macros produisent uniquement les champs : la balise , la méthode, l'action et le jeton CSRF restent à la charge de la page (principe 3 : pas de magie cachée). #} {%- set _label_cls = "block text-[12.5px] font-semibold text-subtle mb-1.5" -%} {%- set _input_base = "w-full px-3.5 py-3 text-sm bg-white border rounded-[10px] focus:outline-none focus:ring-[3px] transition" -%} {%- macro _border(error) -%} {{- "border-red-400 focus:border-red-500 focus:ring-red-500/20" if error else "border-field focus:border-teal focus:ring-teal/15" -}} {%- endmacro -%} {%- macro _label(name, label, required) -%} {% if label %}{% endif %} {%- endmacro -%} {%- macro _hint(error, help) -%} {% if error %}

{{ error }}

{% elif help %}

{{ help }}

{% endif %} {%- endmacro -%} {% macro field(name, label="", type="text", value="", placeholder="", required=False, help="", error="") %}
{{ _label(name, label, required) }} {{ _hint(error, help) }}
{% endmacro %} {% macro search_field(name="q", placeholder="Rechercher...", value="") %} {% endmacro %} {% macro file_field(name, label="", required=False, help="", error="", accept="") %}
{{ _label(name, label, required) }} {{ _hint(error, help) }}
{% endmacro %} {% macro textarea_field(name, label="", value="", rows=4, placeholder="", required=False, help="", error="") %}
{{ _label(name, label, required) }} {{ _hint(error, help) }}
{% endmacro %} {# options : liste de couples (valeur, libellé). #} {% macro select_field(name, label="", options=[], selected="", required=False, error="") %}
{{ _label(name, label, required) }} {{ _hint(error, help="") }}
{% endmacro %} {# options : liste de couples (valeur, libellé). #} {% macro radio_group(name, label="", options=[], selected="", error="") %}
{% if label %}{{ label }}{% endif %}
{% for value, text in options %} {% endfor %}
{{ _hint(error, help="") }}
{% endmacro %} {% macro checkbox(name, label, checked=False, value="1") %} {% endmacro %} {# Regroupe des champs sous un titre. Usage : {% call fieldset("Coordonnées") %} ... {% endcall %} #} {% macro fieldset(legend="") %}
{% if legend %}{{ legend }}{% endif %} {{ caller() }}
{% endmacro %} {# Résumé des erreurs en tête de formulaire. errors : liste de messages. #} {% macro form_errors(errors) %} {% if errors %}

Veuillez corriger les points suivants :

{% endif %} {% endmacro %} {% macro submit(label="Envoyer") %} {% endmacro %}