Files
guarddog-nexus/guarddog_nexus/web/templates/base.html
Marker689 d33411b719 feat: фаза 3 — i18n RU/EN, /metrics, AI disclaimer, initiator+IP, LLM очередь
3.3 i18n: модуль с RU/EN словарями, LangMiddleware (cookie+query),
     Jinja-фильтр t(), переключатель EN/RU в nav, перевод ключевых
     строк интерфейса
3.5 /metrics: Prometheus-совместимый endpoint (scans_total,
     scans_flagged, findings_total, by_status, by_ecosystem,
     last_scan_timestamp)
3.2 AI disclaimer: сноска под каждым LLM-вердиктом (.llm-disclaimer)
3.4 LLM очередь: asyncio.Semaphore(LLM_MAX_CONCURRENT_ANALYSES)
3.1 initiator + source_ip: поля в Scan, захват из webhook payload,
     показ в scan_detail + API
3.6 UI: убран stat-minibar и heatmap с дашборда
2026-05-10 07:37:22 +03:00

32 lines
1.4 KiB
HTML

<!DOCTYPE html>
<html lang="en" data-theme="dark">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{% block title %}GuardDog Nexus{% endblock %}</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.min.css">
<script src="https://unpkg.com/htmx.org@2.0.4"></script>
<link rel="stylesheet" href="/static/style.css">
<script src="/static/app.js"></script>
</head>
<body>
<main class="container">
<nav class="sticky">
<ul><li><strong><a href="/">{{ t('nav_dashboard', request.state.lang) }}</a></strong></li></ul>
<ul>
<li><a href="/">{{ t('nav_dashboard', request.state.lang) }}</a></li>
<li><a href="/scans">{{ t('nav_scans', request.state.lang) }}</a></li>
<li><a href="/packages">{{ t('nav_packages', request.state.lang) }}</a></li>
<li style="margin-left: 1rem;">
{% set next = 'ru' if request.state.lang == 'en' else 'en' %}
<small><a href="?lang={{ next }}" style="font-size: 0.8rem; opacity: 0.6;">{{ 'RU' if next == 'ru' else 'EN' }}</a></small>
</li>
</ul>
</nav>
{% block breadcrumbs %}{% endblock %}
{% block content %}{% endblock %}
</main>
{% block scripts %}{% endblock %}
</body>
</html>