{# _app_shell.html — sidebar + main + modeline for post-auth pages. Inheritance chain: base.html └── _partials/_app_shell.html (this file) └── settings.html, admin/applications_*, admin/users_*, admin/sessions_list.html, admin/audit_log.html Child responsibility: - fill {% block page_content %} with the page body (or {% block content %} for backwards compat — page_content wraps content by default). - fill {% block sidebar_nav %} with role-filtered nav links. - optionally override {% block pagetitle %}, {% block crumbs %}, {% block page_meta %}, {% block topbar %}, and {% block main_class %} (defaults to "has-header"; list pages use "has-tablewrap"). Block overrides this shell sets on base.html: - html_attrs data-mode / data-mode-locked when branding.forced_mode is set - body_class "wf-app" - body_content shell + main + modeline (no second tag) - head app grid CSS - scripts mode-toggle.js (super() preserves HTMX) Expected context: - branding (optional BrandingConfig; forced_mode drives html_attrs) - application_name (optional string) - status_* keys (optional; see _modeline.html) - csrf_token, is_production (from the renderer) Shell chrome comes from upstream Wave Funk layouts.css — .wf-app / .wf-shell / .wf-sidebar / .wf-main own the grid; responsive sidebar collapse is built into .wf-sidebar itself. #} {% extends "base.html" %} {% block html_attrs %}{% if branding and branding.forced_mode %}data-mode="{{ branding.forced_mode }}" data-mode-locked{% endif %}{% endblock %} {% block body_class %}wf-app{% endblock %} {% block head %} {{ super() }} {% endblock %} {% block body_content %}
{% block topbar %}{% endblock %}
{% block crumbs %}{% endblock %}

{% block pagetitle %}{% endblock %}

{% block page_meta %}{% endblock %}
{% include "_partials/_flash.html" %}
{% block page_content %}{% block content %}{% endblock %}{% endblock %}
{% include "_partials/_modeline.html" %} {% endblock %} {% block scripts %} {{ super() }} {% endblock %}