91719740b9
- Неверный пароль не сжигает wrap сразу: Argon2-гейт до consume и лимит попыток (по умолчанию 3) в настройках - Подсветка синтаксиса, автоопределение языка, спиннеры, размеры файлов, пагинация audit - make push (git, Ctrl-D) и актуальный README
74 lines
3.9 KiB
HTML
74 lines
3.9 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="ru" data-theme="dark">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
<title>{{ title }} · Wrapped 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=IBM+Plex+Mono:wght@400;500&family=Outfit:wght@400;500;600;700&display=swap" rel="stylesheet" />
|
|
<link rel="stylesheet" href="/static/css/app.css" />
|
|
<link rel="icon" href="/static/favicon.svg" type="image/svg+xml" />
|
|
<link rel="icon" href="/static/favicon.ico" sizes="any" />
|
|
<link rel="apple-touch-icon" href="/static/apple-touch-icon.png" />
|
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css" crossorigin="anonymous" referrerpolicy="no-referrer" />
|
|
</head>
|
|
<body class="admin-body">
|
|
<div class="bg-grid" aria-hidden="true"></div>
|
|
<header class="admin-top">
|
|
<a class="brand" href="/admin">
|
|
<span class="brand-mark" aria-hidden="true">
|
|
<i class="fa-solid fa-shield-halved"></i>
|
|
</span>
|
|
<span class="brand-text">
|
|
<span class="brand-name">Wrapped</span>
|
|
<span class="brand-tagline" data-i18n="admin.brand.tagline">Admin console</span>
|
|
</span>
|
|
</a>
|
|
<div class="admin-top-right">
|
|
<nav class="admin-nav" aria-label="Admin">
|
|
<a href="/admin/settings" class="admin-nav-link {% if active == 'settings' %}active{% endif %}">
|
|
<i class="fa-solid fa-sliders" aria-hidden="true"></i>
|
|
<span data-i18n="admin.nav.settings">Settings</span>
|
|
</a>
|
|
<a href="/admin/audit" class="admin-nav-link {% if active == 'audit' %}active{% endif %}">
|
|
<i class="fa-solid fa-list" aria-hidden="true"></i>
|
|
<span data-i18n="admin.nav.audit">Audit</span>
|
|
</a>
|
|
<a href="/admin/danger" class="admin-nav-link admin-nav-danger {% if active == 'danger' %}active{% endif %}">
|
|
<i class="fa-solid fa-triangle-exclamation" aria-hidden="true"></i>
|
|
<span data-i18n="admin.nav.danger">Danger</span>
|
|
</a>
|
|
<a href="/" class="admin-nav-link" target="_blank" rel="noopener noreferrer">
|
|
<i class="fa-solid fa-arrow-up-right-from-square" aria-hidden="true"></i>
|
|
<span data-i18n="admin.nav.site">Site</span>
|
|
</a>
|
|
<form method="post" action="/admin/logout" class="inline">
|
|
<button class="admin-nav-link admin-nav-logout" type="submit">
|
|
<i class="fa-solid fa-right-from-bracket" aria-hidden="true"></i>
|
|
<span data-i18n="admin.nav.logout">Logout</span>
|
|
</button>
|
|
</form>
|
|
</nav>
|
|
<div class="top-actions">
|
|
<button type="button" class="icon-btn" id="lang-toggle" title="Language" aria-label="Language">
|
|
<span id="lang-label">RU</span>
|
|
</button>
|
|
<button type="button" class="icon-btn" id="theme-toggle" title="Theme" aria-label="Theme">
|
|
<svg id="theme-icon-sun" class="icon hidden" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8"><circle cx="12" cy="12" r="4"/><path d="M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4"/></svg>
|
|
<svg id="theme-icon-moon" class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8"><path d="M21 14.5A8.5 8.5 0 1 1 9.5 3a7 7 0 0 0 11.5 11.5z"/></svg>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</header>
|
|
<main class="admin-shell">
|
|
<h1 data-i18n="{% if active == 'audit' %}admin.audit.title{% elif active == 'danger' %}admin.danger.title{% else %}admin.settings.title{% endif %}">{{ title }}</h1>
|
|
{% block admin_content %}{% endblock %}
|
|
</main>
|
|
<script src="/static/js/i18n.js"></script>
|
|
<script src="/static/js/theme.js"></script>
|
|
<script src="/static/js/modal.js"></script>
|
|
{% block admin_scripts %}{% endblock %}
|
|
</body>
|
|
</html>
|