{% block title %}{{ spa_title }}{% endblock %}
{% comment %}
Boot configuration for the shell. Rendered as a JSON script element,
never as inline JavaScript: a CSP without 'unsafe-inline' for scripts
allows it, and this way the values are data the app reads, not code.
{% endcomment %}
{{ spa_config|json_script:"conjunto-config" }}
{% comment %}
The translation catalogue — the `djangojs` domain of every installed
app, so each plugin's own translations are simply there. A classic
script rather than a module: those run before module scripts whatever
the order, which is what lets @conjunto/ui's gettext() be an ordinary
synchronous call instead of something every screen has to await. Its
own URL rather than inline, so the browser keeps it across document
loads and revalidates against the ETag.
{% endcomment %}
{% block head %}{% endblock %}
{% comment %}
The import map (framework runtime + shared libraries), the stylesheets
those libraries declared, the shell configuration and the shell module.
Must come before any other module script on the page.
{% endcomment %}
{% frontend_head %}
{% block body %}
{% comment %}
The one slot this document carries. The host's shell fills it; everything
else — rail, topbar, screens — is rendered inside that component.
{% endcomment %}
{% endblock %}