{#- Composants partagés, importés via {% import "components.html" as c %}. Les macros askama ne voient que leurs arguments : passer `shell` explicitement. Convention pour les paramètres optionnels de type texte (max, input_aria) : chaîne vide = attribut absent. -#} {% macro chevron_left(size) %}{% endmacro %} {% macro chevron_right(size) %}{% endmacro %} {#- Sélecteur de durée : stepper ± 5 min (liens, zéro JS) + libellé « pretty » + presets. L'amélioration progressive vit dans app.html, déléguée sur form[data-duration] : le form appelant doit porter cet attribut. -#} {% macro duration_picker(shell, minus_href, plus_href, minutes, minutes_pretty, input_aria, presets) %}
{{ shell.tr.minutes_unit }}
{{ minutes_pretty }}
{% for p in presets %} {{ p.label }} {% endfor %}
{% endmacro %} {#- Rangée date : ← input →. next_href est une Option (None = aujourd'hui, flèche désactivée). js=true pose les data-attrs du stepping délégué d'app.html (form[data-duration]) ; js=false = navigation par rechargement. -#} {% macro date_row(shell, id, name, value, max, input_aria, prev_href, next_href, js) %}
{% call chevron_left(16) %}{% endcall %} {% if let Some(next) = next_href %} {% call chevron_right(16) %}{% endcall %} {% else %} {% call chevron_right(16) %}{% endcall %} {% endif %}
{% endmacro %} {#- Navigation ← → d'un graphique de stats (next : Option, None = période courante, flèche désactivée). -#} {% macro chart_nav(shell, prev, next) %}
{% call chevron_left(15) %}{% endcall %} {% if let Some(n) = next %} {% call chevron_right(15) %}{% endcall %} {% else %} {% call chevron_right(15) %}{% endcall %} {% endif %}
{% endmacro %}