{% load static i18n %}{% comment %} The estate skeleton. Every service's own base.html extends this and fills the blocks; nothing here is meant to be copied into a service. The navbar is written out here rather than {% include %}d because blocks inside an included template cannot be overridden — and the navbar's layout has to be identical everywhere while its items differ per service. Same for the footer's position. Fill `navbar_items` and `navbar_tools`; change nothing else. Blocks a service normally fills: title the page, in sentence case ("Data sources", not "Data Sources") title_suffix the service, the same on every page ("YKSA TDAS") meta_description, meta_keywords the rest of the head brand_url where the logo links navbar_items the left-hand
  • list navbar_tools extra right-hand items (auth, duty) main_class a density scope, e.g. "ops" content the page extra_head, extra_js per-page assets {% endcomment %} {% block title %}{% trans "YKSA" %}{% endblock title %} — {% block title_suffix %}YKSA{% endblock title_suffix %} {% comment %} Icons load here, not per page. Loading them in extra_head is why icons rendered on some pages and not others in two services. {% endcomment %} {% block extra_head %}{% endblock extra_head %} {% include "yksa/includes/_messages.html" %} {% block pre-content %}{% endblock pre-content %} {% comment %} A density scope, if the service needs one, goes on
    and never on : the navbar and footer keep the estate's default type scale so they stay identical across services. {% endcomment %}
    {% block content %}{% endblock content %}
    {% include "yksa/includes/_cookie_banner.html" %} {% include "yksa/includes/_footer.html" %} {% comment %}Shows the toasts yksa/includes/_messages.html renders.{% endcomment %} {% block extra_js %}{% endblock extra_js %}