{# `data-fcu-auth` fingerprints the session this shell (navbar user menu, sidebar) was rendered for. Fragment responses carry the same value in the X-Construct-Auth header; construct-core.js reloads the document when they diverge, since a partial swap can never bring the shell back in sync. #} {% block title %}{{ construct.title }}{% endblock %} {% if construct.icon_mode == "bootstrap" %} {% else %} {% endif %} {% if construct.design_stylesheet %} {% endif %} {% block head_extra %}{% endblock %}
{% block navbar %} {{ construct.title }}
{% block global_access %} {# Search & notifications are gated behind auth, so only show them when the user can actually use them (no auth provider, or logged in). #} {% if construct.search and construct.navbar_features_available %} {% endif %} {% if construct.notifications and construct.navbar_features_available %} {# No-JS dropdown via native
; refreshes via Unpoly polling in JS mode. The close-on-outside-click / open-state JS is below. #} {% include "navbar/notifications.html" %} {% endif %} {% if construct.auth and construct.auth.is_authenticated() %}
{{ construct.auth.current_user_name() or "" }} {{ icon("expand", cls="fcu-navbar__dropdown-arrow") }}
{% for item in construct.auth.user_menu_items() %} {% if item.icon %}{{ icon(item.icon) }}{% endif %} {{ item.label }} {% endfor %}
{% endif %} {% endblock global_access %}
{% endblock navbar %}
{% block sidebar %} {% endblock sidebar %}
{% include "style/_flashes.html" %} {% block content %} {% endblock %}