Add tabbed dashboard at /dashboard/ with three D3.js visualizations: - Vendor treemap (devices grouped by type and vendor) - SSID social graph (force-directed, shared probed SSIDs as edges) - Fingerprint clusters (packed circles by device behavior) Intelligence API endpoints at /api/v1/intelligence/ with param validation. Dashboard built on htmx + Pico CSS dark theme + D3 v7, all vendored locally (make vendor). 13 new tests (59 total).
31 lines
1.1 KiB
HTML
31 lines
1.1 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 %}ESP32-Web{% endblock %}</title>
|
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/vendor/pico.min.css') }}">
|
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/main.css') }}">
|
|
{% block head %}{% endblock %}
|
|
</head>
|
|
<body>
|
|
<nav class="container-fluid">
|
|
<ul>
|
|
<li><strong>ESP32-Web</strong></li>
|
|
</ul>
|
|
<ul>
|
|
<li><a href="{{ url_for('dashboard.index') }}">Dashboard</a></li>
|
|
<li><a href="/docs">API Docs</a></li>
|
|
<li><a href="/health">Health</a></li>
|
|
</ul>
|
|
</nav>
|
|
<main class="container">
|
|
{% block content %}{% endblock %}
|
|
</main>
|
|
<script src="{{ url_for('static', filename='js/vendor/htmx.min.js') }}"></script>
|
|
<script src="{{ url_for('static', filename='js/vendor/d3.min.js') }}"></script>
|
|
<script src="{{ url_for('static', filename='js/main.js') }}"></script>
|
|
{% block scripts %}{% endblock %}
|
|
</body>
|
|
</html>
|