{% load static mvp %} {% 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 %}