admin / templates /index.html
CORVO-AI's picture
Upload 6 files
30a02c3 verified
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ServerClass — Admin</title>
<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=Playfair+Display:ital,wght@0,400;0,700;0,900;1,400;1,700&family=Source+Serif+4:ital,wght@0,400;0,600;1,400&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
</head>
<body>
<a href="#main" class="skip-link">Skip to content</a>
<!-- Top bar -->
<header class="topbar">
<div class="topbar__inner">
<div class="topbar__brand">
<span class="topbar__mark"></span>
<span class="topbar__name">ServerClass <em></em> Admin</span>
</div>
<div class="topbar__meta">
<span class="status-dot" id="connDot" data-state="off"></span>
<span class="mono" id="connLabel">DISCONNECTED</span>
<span class="topbar__sep">/</span>
<span class="mono" id="lastSync">— : — : —</span>
</div>
</div>
</header>
<!-- Hero -->
<section class="hero">
<div class="hero__inner">
<div class="hero__eyebrow mono">VOL. 01 — LIVE DASHBOARD</div>
<h1 class="hero__title">
Server<br>
<span class="italic">Class.</span>
</h1>
<div class="hero__rule">
<span class="hero__rule-line"></span>
<span class="hero__rule-square"></span>
<span class="hero__rule-line"></span>
</div>
<p class="hero__lede">
A real-time observatory for distributed authentication.
Twelve servers, finite capacity, infinite attention to detail.
</p>
</div>
</section>
<div class="divider divider--thick"></div>
<!-- Authentication -->
<main id="main">
<section class="section section--auth">
<div class="section__inner">
<div class="section__head">
<span class="section__num mono">§ 01</span>
<h2 class="section__title">Credentials</h2>
</div>
<form id="authForm" class="auth" autocomplete="off">
<label class="field">
<span class="field__label mono">Admin Secret</span>
<input type="password" id="adminSecret" class="field__input" placeholder="X-Admin-Secret" spellcheck="false">
</label>
<label class="field">
<span class="field__label mono">API Key</span>
<input type="password" id="apiKey" class="field__input" placeholder="X-API-Key" spellcheck="false">
</label>
<div class="auth__actions">
<button type="submit" class="btn btn--primary">
Authenticate <span class="btn__arrow"></span>
</button>
<button type="button" id="refreshBtn" class="btn btn--ghost">
Refresh now
</button>
</div>
</form>
<div id="errorBox" class="errors" aria-live="polite"></div>
</div>
</section>
</main>
<div class="divider divider--thick"></div>
<!-- Stats (inverted section) -->
<section class="section section--stats" aria-label="Statistics">
<div class="section__inner">
<div class="section__head section__head--invert">
<span class="section__num mono">§ 02</span>
<h2 class="section__title">Figures</h2>
</div>
<div class="stats" id="statsGrid">
<div class="stat stat--placeholder">
<div class="stat__label mono">Awaiting</div>
<div class="stat__value"></div>
<div class="stat__sub mono">Authenticate to populate</div>
</div>
</div>
</div>
</section>
<div class="divider divider--thick"></div>
<!-- Servers -->
<section class="section">
<div class="section__inner">
<div class="section__head">
<span class="section__num mono">§ 03</span>
<h2 class="section__title">Servers <span class="italic">— Status</span></h2>
</div>
<div id="serversContent" class="placeholder mono">
Enter credentials to load server topology.
</div>
</div>
</section>
<div class="divider divider--thick"></div>
<!-- Users -->
<section class="section">
<div class="section__inner">
<div class="section__head">
<span class="section__num mono">§ 04</span>
<h2 class="section__title">Users <span class="italic">— Index</span></h2>
</div>
<div class="search">
<input type="text" id="userSearch" class="search__input"
placeholder="Filter by username, telegram ID, or server number…"
oninput="filterUsers()">
<span class="search__hint mono" id="userCount">— records</span>
</div>
<div id="usersContent" class="placeholder mono">
Enter credentials to load user registry.
</div>
</div>
</section>
<div class="divider divider--ultra"></div>
<footer class="footer">
<div class="footer__inner">
<div class="mono footer__line">ServerClass / Admin Console</div>
<div class="mono footer__line">Auto-refresh every <span id="pollInterval">{{ poll_interval }}</span>s · Socket.IO</div>
<div class="mono footer__line">MMXXV</div>
</div>
</footer>
<script src="https://cdn.socket.io/4.7.5/socket.io.min.js"></script>
<script>
window.__POLL_INTERVAL__ = {{ poll_interval }};
</script>
<script src="{{ url_for('static', filename='js/dashboard.js') }}"></script>
</body>
</html>