{# `data-fcu-auth` / `data-fcu-menu` stamp the shell's session and menu; construct-core.js compares them with the X-Construct-Auth / -Menu response headers (see technical/architecture.org → The Main Menu). #} {# Varies per page (construct.page_title folds in the active view's name), so navigating between list/create/edit changes the document title. #} {% block title %}{{ construct.page_title }}{% endblock %} {# Icon library — chosen by the active icon mode (theme/design). Both fonts are self-hosted under construct_static (no external CDN). #} {% if construct.icon_mode == "bootstrap" %} {% else %} {% endif %} {# Core UI & Library assets #} {% if construct.design_stylesheet %} {# Built-in design skin (overrides whitelabel design tokens) #} {% endif %} {# Application stylesheets (FlaskConstructUI(stylesheets=…) / add_stylesheet). Linked after everything the library owns so app rules and --fcu-* overrides win the cascade. #} {% for href in construct.stylesheets or [] %} {% endfor %} {% block head_extra %}{% endblock %} {# First focusable element on the page: lets a keyboard user jump the sidebar (which can be 20+ links) straight to content. Visible only while focused. #} {{ construct.t("nav-skip-to-content") }}
{# Navbar / Top Header #}
{% block navbar %} {{ construct.title }} {% endblock navbar %}
{# Sidebar Wrapper #} {% block sidebar %} {% endblock sidebar %} {# Main Workspace #}
{% include "style/_flashes.html" %} {# Every page needs exactly one

. Templates that render their own visible heading override this block to empty (the CRUD views do); component pages, whose content the library does not compose, get this visually-hidden default. #} {% block page_heading %}

{{ construct.page_heading }}

{% endblock %} {% block content %} {% endblock %}
{# Footer #}