{# HTML5 requires within the first 1024 bytes; any operator-injected snippet must come AFTER charset + viewport. See base.html for the full rationale. #} {# Operator-injected scripts (placement=head_start). Mirrors base.html so login/auth pages surface custom_scripts too. #} {% for s in custom_scripts | default([]) if s.placement == 'head_start' %} {{ s.html | safe }} {% endfor %} {% block title %}Data Analyst Portal{% endblock %} {% include '_theme.html' %} {# Operator-injected scripts (placement=head_end). Mirrors base.html. #} {% for s in custom_scripts | default([]) if s.placement == 'head_end' %} {{ s.html | safe }} {% endfor %} {% with messages = get_flashed_messages(with_categories=true) %} {% if messages %}
{% for category, message in messages %}
{{ message }}
{% endfor %}
{% endif %} {% endwith %} {% block content %}{% endblock %} {% include "_version_badge.html" %} {# Operator-injected scripts (placement=body_end). Mirrors base.html. #} {% for s in custom_scripts | default([]) if s.placement == 'body_end' %} {{ s.html | safe }} {% endfor %}