{% load static i18n statici18n conjunto %} {% get_current_language as LANGUAGE_CODE %} {% comment %} Slim, generic base template. Contains only the document shell: , , with CSS hooks, and with CSRF, scripts, modal and toast slots. It carries no topbar, sidebar, canvas or statusbar. Use this as the starting point for public / marketing / chrome-less pages. For the full application layout (topbar + sidebar + canvas + statusbar + offcanvas) extend ``conjunto/app_base.html`` instead. {% endcomment %} {% comment %} HTMX configuration. Two overrides on top of the htmx 2.x defaults: - ``disableInheritance: true`` — every ``hx-*`` must be declared on the element that uses it; ancestors do not silently leak ``hx-target``, ``hx-swap``, ``hx-select``, etc. into descendants. Prevents the whole class of "modal opens but is empty because the wrapper's hx-select was inherited" bugs. - ``responseHandling`` — swap 422 responses (form validation errors). Without this, ``ConjuntoLoginView.form_invalid`` and every modal form that returns 422 on validation failure would silently produce no UI change because htmx 2.x default drops 4xx/5xx bodies. The 422 entry has to come *before* the generic ``[45]..`` entry — htmx walks the list top-to-bottom and stops at the first match. Other 4xx/5xx still drop (errors that the page is not prepared to render in-place). {% endcomment %} {% if cj_environment %}[{{ cj_environment.name }}] {% endif %}{% block title %}{{ site.name|default:'Conjunto' }}{% endblock %} {% block meta %}{% endblock %} {% block extra_css %}{% endblock %} {% conjunto_css %} {% csrf_token %} {% include "conjunto/_environment_banner.html" %} {% block body %}{% endblock %} {# Modals / Toasts #} {% block modal %} {% endblock %} {% block toasts %} {% include "conjunto/includes/toasts.html" %} {% endblock %} {# Scripts #} {# id+hx-preserve on every {% conjunto_core_scripts %} {% block app_scripts %}{% endblock %} {% block feature_scripts %}{% conjunto_render_scripts %}{% endblock %} {% block scripts %}{% endblock %}