14.04.2026 Update

This commit is contained in:
2026-04-15 11:38:26 +03:00
parent 6aa0349f5d
commit f50d79fab3
45 changed files with 5645 additions and 751 deletions

View File

@@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Клиенты — AlpineRouter</title>
<title>Клиенты — NanoRouter</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
@@ -15,21 +15,21 @@
<path d="M2 17l10 5 10-5"/>
<path d="M2 12l10 5 10-5"/>
</svg>
<h1>AlpineRouter</h1>
<h1>NanoRouter</h1>
</div>
<div class="header-right">
<button class="btn btn-ghost" id="refreshBtn" title="Обновить">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="16" height="16">
<path d="M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"/>
<path d="M3 3v5h5"/>
</svg>
Обновить
</button>
</div>
</header>
<nav class="tab-nav">
<a href="/" class="tab-link">
<a href="/home.html" class="tab-link">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="15" height="15">
<path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/>
<polyline points="9 22 9 12 15 12 15 22"/>
</svg>
Главная
</a>
<a href="/ifaces.html" class="tab-link">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="15" height="15">
<path d="M12 2L2 7l10 5 10-5-10-5z"/>
<path d="M2 17l10 5 10-5"/>
@@ -64,9 +64,41 @@
</svg>
Прокси
</a>
<a href="/profile.html" class="tab-link">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="15" height="15">
<path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"/>
<circle cx="12" cy="7" r="4"/>
</svg>
Профиль
</a>
</nav>
<main class="clients-main">
<!-- Policy management panel -->
<div class="policy-panel">
<div class="policy-section">
<div class="policy-section-label">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="13" height="13">
<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/>
</svg>
Политика для новых устройств
</div>
<div class="segmented" id="defaultPolicySelector">
<button type="button" class="seg-btn" data-val="disabled">Отключён</button>
<button type="button" class="seg-btn" data-val="direct">Напрямую</button>
<button type="button" class="seg-btn active" data-val="vpn">Через VPN</button>
</div>
</div>
<div class="policy-divider"></div>
<div class="policy-section">
<div class="policy-section-label">Применить ко всем</div>
<div class="policy-apply-all">
<button type="button" class="btn btn-ghost btn-sm policy-all-btn" data-val="disabled">Отключить всех</button>
<button type="button" class="btn btn-ghost btn-sm policy-all-btn" data-val="direct">Напрямую</button>
<button type="button" class="btn btn-primary btn-sm policy-all-btn" data-val="vpn">Через VPN</button>
</div>
</div>
</div>
<div class="clients-toolbar">
<div class="clients-summary" id="clientsSummary"></div>
@@ -92,6 +124,7 @@
<th>MAC-адрес</th>
<th>Интерфейс</th>
<th>Тип</th>
<th>Маршрут</th>
<th class="col-tx">↑ Отправлено</th>
<th class="col-rx">↓ Получено</th>
<th>Активность</th>
@@ -143,15 +176,14 @@
<hr class="form-divider">
<div class="form-row" style="flex-direction:row; align-items:center; justify-content:space-between;">
<div>
<div style="font-weight:600;">Доступ в интернет</div>
<div style="font-size:.8rem;color:var(--muted);margin-top:2px;" id="modalBlockHint">Отключите, чтобы запретить устройству выход в интернет</div>
<div class="form-row form-row--col">
<label>Выход в интернет</label>
<div class="segmented" id="modalPolicySelector">
<button type="button" class="seg-btn" data-val="disabled">Отключён</button>
<button type="button" class="seg-btn" data-val="direct">Напрямую</button>
<button type="button" class="seg-btn" data-val="vpn">Через VPN</button>
</div>
<label class="toggle-label" id="modalBlockToggle">
<input type="checkbox" id="modalBlocked">
<span class="toggle-slider"></span>
</label>
<span class="form-hint" id="modalPolicyHint">Пусто = использовать политику по умолчанию</span>
</div>
<div class="modal-footer" style="padding:18px 0 0;">