{# T28 admin layout — full-width Tailwind UI. Standalone (does NOT extend #} {# `dashboard_layout.html`). Loads Tailwind via CDN (~150 KB; acceptable #} {# for the internal-admin surface — see phase-2-todo.md T28 QA notes). #} {# Sub-layouts: `partials/admin_sidebar.html`, `partials/admin_header.html`.#} {# T27.1 — CSRF token, also used by sign-out form below. #} {% block page_title %}Admin{% endblock %} — browser-recon {# Inter font (Google Fonts CDN) — Tailwind config inline below maps #} {# `font-sans` to Inter so the body class flows through without extra #} {# arbitrary-value classes per element. #} {# Tailwind CDN. ~150 KB; admin-only surface, internal users. #} {# T31 — marked.js + DOMPurify for chat-style rendering of LLM prompts #} {# and responses on the debug page + sandbox diff. Loaded in the layout #} {# so every admin page can drop the ``llm_chat_view`` partial without #} {# importing them per-page. XSS contract: every untrusted string must #} {# pass through ``DOMPurify.sanitize(marked.parse(...))``. The escape #} {# helper is only for error strings / JSON code blocks (non-markdown). #} {# Chart.js v4 — used by the cost-trend card on the dashboard. Other #} {# admin pages don't render charts but the CDN cost is negligible and #} {# loading it from the layout keeps each page self-contained. #} {% block head_extra %}{% endblock %}
{% include 'partials/admin_sidebar.html' %}
{% include 'partials/admin_header.html' %}
{% block content %}{% endblock %}
{% block scripts %}{% endblock %}