{% load static vantage i18n %} {% block title %}{{ page_title }} · {{ settings.SITE_TITLE }}{% endblock %} {% if settings.FAVICON %}{% endif %} {# Blocking and inline on purpose: a deferred script paints light first and flips. #} {{ no_flash_script|safe }} {{ theme_css|safe }} {# Carries the skip link and the auth chrome; every panel screen needs the first. #} {% if settings.CUSTOM_CSS %}{% endif %} {% block head %}{% endblock %} {% comment %} WCAG 2.4.1. First element in the body and therefore the first tab stop, ahead of the banners: a skip link placed after the thing it skips is decoration. The target carries tabindex="-1" because without it Safari and Chrome move the scroll position and leave focus behind on . {% endcomment %} {% translate "Skip to main content" %} {% comment %} The banner is the environment control's default home, not a separate feature: it is the same slot the top-bar arrangement can switch off, or move into the header as a chip, in which case `topbar.banner` is empty and it renders there instead. {% endcomment %} {% if topbar.banner %}
{{ topbar.banner }}
{% endif %} {% if impersonating %} {% comment %} Loud on purpose. Someone acting as another account needs to be unable to forget it, and anyone looking over their shoulder needs to see it too. {% endcomment %}
{% blocktranslate trimmed with username=user.get_username real_username=real_user.get_username %} Acting as {{ username }} — signed in as {{ real_username }} {% endblocktranslate %}
{% csrf_token %}
{% endif %} {% if read_only %}
{% icon "shield" %}{{ read_only }}
{% endif %}
{% comment %} A
, not an
{% comment %} Django's JS translation catalogue, scoped to this package only — see JavaScriptCatalog(packages=["vantage"]) in urls.py. Not deferred, and deliberately first: every script below calls gettext()/ngettext(), so it has to have already run by the time they do. vantage-i18n-fallback.js right after it is what keeps that safe when the catalogue route 404s, a proxy strips it, or a project has not wired i18n at all — it defines pass-through stand-ins only if the real ones never showed up, so nothing downstream throws "gettext is not defined" and every string still renders, in English, exactly as it was written. Both are external ` {% block scripts %}{% endblock %}