Repository navigation
Expand file tree
/
Copy pathNodeRunner.html
More file actions
122 lines (113 loc) · 7.51 KB
/
Copy pathNodeRunner.html
File metadata and controls
122 lines (113 loc) · 7.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
<!DOCTYPE html>
<html lang="en" data-theme="phosphor">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>NodeRunner</title>
<meta name="application-name" content="NodeRunner">
<meta name="description" content="NodeRunner — Map your network. Know every node.">
<meta name="theme-color" content="#07171a">
<link rel="icon" type="image/svg+xml" href="static/branding/favicon.svg">
<link rel="mask-icon" href="static/branding/favicon-mask.svg" color="#159d70">
<link rel="apple-touch-icon" sizes="180x180" href="static/branding/icon-180.png">
<link rel="manifest" href="static/manifest.webmanifest">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<link rel="stylesheet" href="static/style.css">
</head>
<body>
<nav class="view-navigation" aria-label="Views and actions">
<button type="button" class="brand brand-trigger" id="brand-button" aria-haspopup="dialog" aria-controls="changelog-dialog" title="Open changelog">
<img class="logo" src="static/branding/icon-96.webp" alt="" width="38" height="38">
<span class="brand-copy"><span class="title">Node<span>Runner</span></span><span class="app-version" id="app-version">Release notes</span></span>
</button>
<div class="navigation-center">
<div class="view-switch">
<button type="button" class="view-tab is-active" id="mapbtn" aria-current="page" aria-pressed="true">
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"><circle cx="12" cy="12" r="9"/><circle cx="12" cy="12" r="5"/><path d="M12 12V3M12 12l6.4-6.4"/><circle cx="15" cy="9" r="1" class="sonar-dot"/></svg>
<span>Map</span>
</button>
<button type="button" class="view-tab" id="regbtn" aria-current="false" aria-pressed="false">
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"><rect x="3" y="4" width="18" height="16" rx="2"/><path d="M3 9h18M8 9v11M8 14h13"/></svg>
<span>Registry</span>
</button>
</div>
<div class="toolbar-actions">
<button type="button" class="view-tab map-expand-action" id="map-expandbtn" aria-controls="wifi-panel wired-panel" aria-pressed="false" title="Hide side lists to expand the map">
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M9 3H3v6M15 3h6v6M3 15v6h6M21 15v6h-6M3 3l6 6M21 3l-6 6M3 21l6-6M21 21l-6-6"/></svg>
<span id="map-expand-label">Expand map</span>
</button>
<button type="button" class="view-tab settings-action" id="settingsbtn" title="Open settings" aria-controls="settings-root">
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="m9.7 3-.6 2.1-1.5.9-2.1-.5-2.3 4 1.5 1.6v1.8l-1.5 1.6 2.3 4 2.1-.5 1.5.9.6 2.1h4.6l.6-2.1 1.5-.9 2.1.5 2.3-4-1.5-1.6v-1.8l1.5-1.6-2.3-4-2.1.5-1.5-.9-.6-2.1Z"/><circle cx="12" cy="11.5" r="3"/></svg>
<span>Settings</span>
</button>
<button type="button" class="view-tab scan-action" id="scanbtn">
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M20 7v5h-5M4 17v-5h5M5.1 7a8 8 0 0 1 13.2-1L20 8M4 16l1.7 2A8 8 0 0 0 18.9 17"/></svg>
<span id="scan-label">Run scan</span>
</button>
<details class="theme-picker" id="theme-menu">
<summary id="theme-trigger" aria-label="Choose color theme">
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M12 3a9 9 0 1 0 0 18h1.5a2 2 0 0 0 1.4-3.4 1.5 1.5 0 0 1 1.1-2.6h1a4 4 0 0 0 4-4 9 9 0 0 0-9-8Z"/><circle cx="7" cy="11" r="1"/><circle cx="10" cy="7" r="1"/><circle cx="15" cy="7" r="1"/></svg>
<span class="theme-trigger-copy"><span class="theme-caption">Theme</span><strong id="theme-current">Phosphor</strong></span>
<span aria-hidden="true" class="theme-caret">▾</span>
</summary>
<div class="theme-options" role="group" aria-label="Color themes">
<p class="theme-options-title">Choose your theme</p>
<button type="button" class="theme-option" data-theme-option="light" aria-pressed="false"><span class="theme-swatch swatch-light" aria-hidden="true"></span><span class="theme-option-copy"><strong>Light</strong><small>Bright and easy to read</small></span><span class="theme-check" aria-hidden="true">✓</span></button>
<button type="button" class="theme-option" data-theme-option="phosphor" aria-pressed="true"><span class="theme-swatch swatch-phosphor" aria-hidden="true"></span><span class="theme-option-copy"><strong>Phosphor</strong><small>Classic green on dark</small></span><span class="theme-check" aria-hidden="true">✓</span></button>
<button type="button" class="theme-option" data-theme-option="ion" aria-pressed="false"><span class="theme-swatch swatch-ion" aria-hidden="true"></span><span class="theme-option-copy"><strong>Ion</strong><small>Cool cyan and navy</small></span><span class="theme-check" aria-hidden="true">✓</span></button>
</div>
</details>
<div class="scan-status" role="status" aria-label="Last scan status">
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"><circle cx="12" cy="12" r="9"/><path d="M12 7v5l3 2"/></svg>
<span class="lastscan" id="lastscan">No scans yet</span>
</div>
</div>
</div>
</nav>
<header>
<div class="stats" id="stats"></div>
</header>
<!-- anomalies from the latest scan show up here -->
<div class="anomaly" id="anomaly-bar"></div>
<main>
<!-- LEFT: WiFi hosts -->
<aside class="side" id="wifi-panel">
<div class="head">
<div class="lbl"><span style="color:var(--accent);font-weight:800;">)))</span> WiFi hosts</div>
<div class="cnt" id="wifi-cnt" style="color:var(--accent);">0</div>
</div>
<div class="sort">sorted by IP ↑</div>
<div class="list" id="wifi-list"></div>
</aside>
<!-- CENTER: topology -->
<div class="center">
<div class="map-viewport" tabindex="0" role="region" aria-label="Network map, scroll to explore rooms"><div class="stage" id="stage"></div></div>
<div class="map-help">Drag hosts freely · No automatic alignment · Scroll to explore rooms · Lines: Wired ─ / Wi-Fi ┄ / Unset ···</div>
</div>
<!-- RIGHT: Wired hosts -->
<aside class="side" id="wired-panel">
<div class="head">
<div class="lbl"><span style="color:var(--accent2);font-weight:800;">▬</span> Wired hosts</div>
<div class="cnt" id="wired-cnt" style="color:var(--accent2);">0</div>
</div>
<div class="sort">sorted by IP ↑</div>
<div class="list" id="wired-list"></div>
</aside>
</main>
<dialog class="release-dialog" id="changelog-dialog" aria-labelledby="changelog-title">
<div class="release-header"><div><p class="release-eyebrow">NodeRunner</p><h2 id="changelog-title">Changelog</h2></div><button type="button" class="release-close" id="changelog-close" aria-label="Close changelog">×</button></div>
<div class="release-body" id="changelog-content"></div>
<p style="padding:0 32px 24px;font-size:12px;line-height:1.7">Copyright © 2026 NodeRunner contributors · AGPL-3.0-only · No warranty. <a href="https://github.com/markhawks/NodeRunner">Source code</a> · <a href="https://github.com/markhawks/NodeRunner/blob/main/LICENSE">License</a></p>
</dialog>
<!-- drawer is injected here -->
<div id="drawer-root"></div>
<div id="registry-root"></div>
<div id="settings-root"></div>
<script src="static/icons.js"></script>
<script src="static/registry.js"></script>
<script src="static/settings.js"></script>
<script src="static/app.js"></script>
</body>
</html>