47 lines
2 KiB
HTML
47 lines
2 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en" data-theme="{{ instance_theme | default('blue') }}">
|
|
<head>
|
|
{# HTML5 requires <meta charset> within the first 1024 bytes; any
|
|
operator-injected snippet must come AFTER charset + viewport. See
|
|
base.html for the full rationale. #}
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
{# 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 %}
|
|
<title>{% block title %}Data Analyst Portal{% endblock %}</title>
|
|
<link rel="stylesheet" href="{{ static_url('style-custom.css') }}">
|
|
{# 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. #}
|
|
<link rel="stylesheet" href="{{ static_url('css/design-tokens.css') }}">
|
|
{% 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 %}
|
|
</head>
|
|
<body>
|
|
{% with messages = get_flashed_messages(with_categories=true) %}
|
|
{% if messages %}
|
|
<div class="flash-messages" style="position: fixed; top: 20px; left: 50%; transform: translateX(-50%); z-index: 1000; max-width: 500px;">
|
|
{% for category, message in messages %}
|
|
<div class="flash flash-{{ category }}">
|
|
{{ message }}
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
{% 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 %}
|
|
</body>
|
|
</html>
|