{% block head %}
{% block title %}
{% endblock title %}
| {{ request.site.name }}
{% comment %}
A favicon is requested without a theme, so the packaged resolvers have
nothing to read: the browser picks by its own colour scheme instead.
Two links rather than one file, because the brand mark is delivered as
a light and a dark SVG and a third copy of it would go stale the first
time the mark is touched. The light link is unconditional as well as
media-scoped so a browser that ignores `media` on an icon still gets one.
{% endcomment %}
{% block styles %}
{% endblock styles %}
{% comment %}
The front-end runtime the components are written against: Alpine with
its persist plugin, htmx, and theme-change. Bundled and
shipped with the package rather than fetched at page load, so the UI
does not depend on a third party staying up. Add your own Alpine
plugins or htmx extensions by extending `head` in your base template.
{% endcomment %}
{% comment %}
Conditional hide based on the applied theme. Keyed off the configured
pair rather than the literal names "light" and "dark", so a project
that sets its own two themes keeps these hooks working.
{% endcomment %}
{% endblock head %}
{% comment %}
Declared outside the app shell so a project that fills it renders
content above the entire sidebar/header/content grid, in normal
document flow: it scrolls away with the page while the header inside
`app.header` keeps pinning independently, matching the pattern where an
announcement bar sits above a sticky navbar (issue #244). Empty by
default and opinionated about nothing — content is entirely the
project's call, the same way `app.header.tray` decides nothing on a
project's behalf.
{% endcomment %}
{% block announcement %}
{% endblock announcement %}
{% block app %}
{% comment %}
Resolve the sidebar breakpoint/collapse knobs once, here in the shell,
so every region agrees. A page overrides them by setting `breakpoint`
and/or `collapse` in the context (view context, or a `{% with %}`
wrapping `{{ block.super }}` inside `{% block app %}`) — the sidebar
drawer, the sidebar rail AND the navbar toggle all follow.
{% endcomment %}
{% firstof breakpoint mvp_config.layout.sidebar.breakpoint as breakpoint %}
{% firstof collapse mvp_config.layout.sidebar.collapse as collapse %}
{% block app.sidebar %}
{% endblock app.sidebar %}
{% block app.header %}
{% block app.header.widgets %}
{% endblock app.header.widgets %}
{% block app.header.tray %}
{% endblock app.header.tray %}
{% endblock app.header %}
{% block app.main %}
{% block content %}
{% endblock content %}
{% endblock app.main %}
{% block app.footer %}
{% endblock app.footer %}
{% endblock app %}
{% block extra_js %}
{% endblock extra_js %}