{# base.html — Application shell template. Active page convention (AR-8, architecture.md): EVERY render_template() call in every blueprint MUST pass active_page=''. Blueprint names to use: 'dashboard', 'transactions', 'budgets', 'bills', 'paydown', 'import_pdf', 'analytics', 'settings' The nav uses this variable to set aria-current="page" on the active link. Enforced by: tests/test_blueprints/test_base_template.py Flash message categories (AR-14): 'success' → flash-success (green) 'error' → flash-error (red) 'warning' → flash-warning (amber) 'info' → flash (blue, base class only — no modifier) Use ONLY these 4 categories. Any other value will render unstyled. #} {% block title %}Financials{% endblock %} {# Primer CSS — local copy. File is downloaded in Story 2.3 (static/vendor/primer/primer.css). This link is correct; the file will not exist until Story 2.3. Tests still pass. #} {# Domain semantic tokens — stub file present; fully implemented in Story 2.3 #} {# App-specific styles — stub file present; fully implemented in Story 2.3 #} {# Skip to main content — WCAG 2.1 AA keyboard accessibility #}
{# ── Sidebar Navigation (240px fixed) ──────────────────────────────────── #} {# Story 2.3 will add Primer ActionList classes once vendor CSS is available #} {# ── Main Content Area ──────────────────────────────────────────────────── #}
{# Flash messages — AR-14: only use success / error / warning / info #} {% with messages = get_flashed_messages(with_categories=True) %} {% if messages %} {% for category, message in messages %}
{{ message }}
{% endfor %} {% endif %} {% endwith %} {% block content %}{% endblock %}
{# JS utilities — stubs present; fully implemented in Story 2.4 #} {# Global JS variable so inline scripts can prefix API calls correctly when the app is served under a sub-path (e.g. /financials). #} {% block scripts %}{% endblock %}