{# 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 %} {# Design-system tokens (`--ds-*`) — required so `.btn-primary` (Google SSO on /login) gets its `--ds-primary` green fill; otherwise the white button text renders invisible on a white card. Same reason base.html loads it globally. #} {% 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 %}