Fix duplicate badges, custom logout modal, cache bust v3

- Remove duplicate badges on md, parser, placeholder pages
- Custom logout modal (blur overlay, confirm/cancel buttons)
- Replace native confirm() with styled modal
- Cache bust shared.js?v=3
This commit is contained in:
treamz 2026-03-22 10:47:51 +03:00
parent 89345551ef
commit 06d9adf7d5
17 changed files with 51 additions and 36 deletions

View File

@ -5,7 +5,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Конвертер изображений — WA Dev Tools</title> <title>Конвертер изображений — WA Dev Tools</title>
<script src="/vendor/tailwind.js"></script> <script src="/vendor/tailwind.js"></script>
<script src="/shared.js?v=2"></script> <script src="/shared.js?v=3"></script>
<link href="/vendor/fonts.css" rel="stylesheet"> <link href="/vendor/fonts.css" rel="stylesheet">
<link href="/shared.css" rel="stylesheet"> <link href="/shared.css" rel="stylesheet">
<script>window.WA_TOOL_ID = 'compress';</script> <script>window.WA_TOOL_ID = 'compress';</script>

View File

@ -6,7 +6,7 @@
<title>Format Converter — WA Dev Tools</title> <title>Format Converter — WA Dev Tools</title>
<script src="/vendor/tailwind.js"></script> <script src="/vendor/tailwind.js"></script>
<script>window.WA_TOOL_ID = 'converter';</script> <script>window.WA_TOOL_ID = 'converter';</script>
<script src="/shared.js?v=2"></script> <script src="/shared.js?v=3"></script>
<link href="/vendor/fonts.css" rel="stylesheet"> <link href="/vendor/fonts.css" rel="stylesheet">
<link href="/shared.css" rel="stylesheet"> <link href="/shared.css" rel="stylesheet">
<script src="/vendor/marked.min.js"></script> <script src="/vendor/marked.min.js"></script>

View File

@ -6,7 +6,7 @@
<title>WA Dev Tools — Панель</title> <title>WA Dev Tools — Панель</title>
<script src="/vendor/tailwind.js"></script> <script src="/vendor/tailwind.js"></script>
<script>window.WA_TOOL_ID = 'home';</script> <script>window.WA_TOOL_ID = 'home';</script>
<script src="/shared.js?v=2"></script> <script src="/shared.js?v=3"></script>
<link href="/vendor/fonts.css" rel="stylesheet"> <link href="/vendor/fonts.css" rel="stylesheet">
<link href="/shared.css" rel="stylesheet"> <link href="/shared.css" rel="stylesheet">
<style> <style>

View File

@ -6,7 +6,7 @@
<title>Code Editor — WA Dev Tools</title> <title>Code Editor — WA Dev Tools</title>
<script src="/vendor/tailwind.js"></script> <script src="/vendor/tailwind.js"></script>
<script>window.WA_TOOL_ID = 'editor';</script> <script>window.WA_TOOL_ID = 'editor';</script>
<script src="/shared.js?v=2"></script> <script src="/shared.js?v=3"></script>
<link href="/vendor/fonts.css" rel="stylesheet"> <link href="/vendor/fonts.css" rel="stylesheet">
<link href="/shared.css" rel="stylesheet"> <link href="/shared.css" rel="stylesheet">
<link rel="stylesheet" href="/editor.css"> <link rel="stylesheet" href="/editor.css">

View File

@ -6,7 +6,7 @@
<title>Code Formatter — WA Dev Tools</title> <title>Code Formatter — WA Dev Tools</title>
<script src="/vendor/tailwind.js"></script> <script src="/vendor/tailwind.js"></script>
<script>window.WA_TOOL_ID = 'formatter';</script> <script>window.WA_TOOL_ID = 'formatter';</script>
<script src="/shared.js?v=2"></script> <script src="/shared.js?v=3"></script>
<link href="/vendor/fonts.css" rel="stylesheet"> <link href="/vendor/fonts.css" rel="stylesheet">
<link href="/shared.css" rel="stylesheet"> <link href="/shared.css" rel="stylesheet">
<style> <style>

View File

@ -6,7 +6,7 @@
<title>HTTP Client — WA Dev Tools</title> <title>HTTP Client — WA Dev Tools</title>
<script src="/vendor/tailwind.js"></script> <script src="/vendor/tailwind.js"></script>
<script>window.WA_TOOL_ID = 'httpclient';</script> <script>window.WA_TOOL_ID = 'httpclient';</script>
<script src="/shared.js?v=2"></script> <script src="/shared.js?v=3"></script>
<link href="/vendor/fonts.css" rel="stylesheet"> <link href="/vendor/fonts.css" rel="stylesheet">
<link href="/shared.css" rel="stylesheet"> <link href="/shared.css" rel="stylesheet">
<link rel="stylesheet" href="/vendor/hljs-github-dark.css"> <link rel="stylesheet" href="/vendor/hljs-github-dark.css">

View File

@ -6,7 +6,7 @@
<title>Markdown Viewer — WA Dev Tools</title> <title>Markdown Viewer — WA Dev Tools</title>
<script src="/vendor/tailwind.js"></script> <script src="/vendor/tailwind.js"></script>
<script>window.WA_TOOL_ID = 'md';</script> <script>window.WA_TOOL_ID = 'md';</script>
<script src="/shared.js?v=2"></script> <script src="/shared.js?v=3"></script>
<link href="/vendor/fonts.css" rel="stylesheet"> <link href="/vendor/fonts.css" rel="stylesheet">
<link href="/shared.css" rel="stylesheet"> <link href="/shared.css" rel="stylesheet">
<script src="/vendor/marked.min.js"></script> <script src="/vendor/marked.min.js"></script>
@ -54,11 +54,6 @@
<div class="tool-container relative z-10 max-w-4xl mx-auto"> <div class="tool-container relative z-10 max-w-4xl mx-auto">
<!-- Header --> <!-- Header -->
<div class="text-center mb-8 fade-up">
<div class="inline-flex items-center gap-2 mb-3 px-3 py-1 rounded-full border dark:border-surface-600 border-gray-300 dark:bg-surface-800/60 bg-white/60 text-xs font-mono dark:text-gray-400 text-gray-500 tracking-wide">
<span class="w-1.5 h-1.5 rounded-full bg-accent animate-pulse"></span>
MD Viewer
</div>
<div class="page-header" style="text-align:center;"> <div class="page-header" style="text-align:center;">
<div class="inline-flex items-center gap-2 mb-3 px-3 py-1 rounded-full border dark:border-surface-600 border-gray-300 dark:bg-surface-800/60 bg-white/60 text-xs font-mono dark:text-gray-400 text-gray-500 tracking-wide"> <div class="inline-flex items-center gap-2 mb-3 px-3 py-1 rounded-full border dark:border-surface-600 border-gray-300 dark:bg-surface-800/60 bg-white/60 text-xs font-mono dark:text-gray-400 text-gray-500 tracking-wide">
<span class="w-1.5 h-1.5 rounded-full bg-accent animate-pulse"></span> <span class="w-1.5 h-1.5 rounded-full bg-accent animate-pulse"></span>

View File

@ -6,7 +6,7 @@
<title>Парсер статей — WA Dev Tools</title> <title>Парсер статей — WA Dev Tools</title>
<script src="/vendor/tailwind.js"></script> <script src="/vendor/tailwind.js"></script>
<script>window.WA_TOOL_ID = 'parser';</script> <script>window.WA_TOOL_ID = 'parser';</script>
<script src="/shared.js?v=2"></script> <script src="/shared.js?v=3"></script>
<link href="/vendor/fonts.css" rel="stylesheet"> <link href="/vendor/fonts.css" rel="stylesheet">
<link href="/shared.css" rel="stylesheet"> <link href="/shared.css" rel="stylesheet">
<style> <style>
@ -42,11 +42,6 @@
<div class="tool-container relative z-10 max-w-3xl mx-auto"> <div class="tool-container relative z-10 max-w-3xl mx-auto">
<!-- Header --> <!-- Header -->
<div class="text-center mb-8 fade-up">
<div class="inline-flex items-center gap-2 mb-3 px-3 py-1 rounded-full border dark:border-surface-600 border-gray-300 dark:bg-surface-800/60 bg-white/60 text-xs font-mono dark:text-gray-400 text-gray-500 tracking-wide">
<span class="w-1.5 h-1.5 rounded-full bg-accent animate-pulse"></span>
URL Article Parser
</div>
<div class="page-header" style="text-align:center;"> <div class="page-header" style="text-align:center;">
<div class="inline-flex items-center gap-2 mb-3 px-3 py-1 rounded-full border dark:border-surface-600 border-gray-300 dark:bg-surface-800/60 bg-white/60 text-xs font-mono dark:text-gray-400 text-gray-500 tracking-wide"> <div class="inline-flex items-center gap-2 mb-3 px-3 py-1 rounded-full border dark:border-surface-600 border-gray-300 dark:bg-surface-800/60 bg-white/60 text-xs font-mono dark:text-gray-400 text-gray-500 tracking-wide">
<span class="w-1.5 h-1.5 rounded-full bg-accent animate-pulse"></span> <span class="w-1.5 h-1.5 rounded-full bg-accent animate-pulse"></span>

View File

@ -5,7 +5,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Генератор паролей — WA Dev Tools</title> <title>Генератор паролей — WA Dev Tools</title>
<script src="/vendor/tailwind.js"></script> <script src="/vendor/tailwind.js"></script>
<script src="/shared.js?v=2"></script> <script src="/shared.js?v=3"></script>
<link href="/vendor/fonts.css" rel="stylesheet"> <link href="/vendor/fonts.css" rel="stylesheet">
<link href="/shared.css" rel="stylesheet"> <link href="/shared.css" rel="stylesheet">
<script>window.WA_TOOL_ID = 'password';</script> <script>window.WA_TOOL_ID = 'password';</script>

View File

@ -6,7 +6,7 @@
<title>WA Dev Tools — PDF инструменты</title> <title>WA Dev Tools — PDF инструменты</title>
<script src="/vendor/tailwind.js"></script> <script src="/vendor/tailwind.js"></script>
<script>window.WA_TOOL_ID = 'pdf';</script> <script>window.WA_TOOL_ID = 'pdf';</script>
<script src="/shared.js?v=2"></script> <script src="/shared.js?v=3"></script>
<link href="/vendor/fonts.css" rel="stylesheet"> <link href="/vendor/fonts.css" rel="stylesheet">
<link href="/shared.css" rel="stylesheet"> <link href="/shared.css" rel="stylesheet">
<style> <style>

View File

@ -6,7 +6,7 @@
<title>Placeholder — WA Dev Tools</title> <title>Placeholder — WA Dev Tools</title>
<script src="/vendor/tailwind.js"></script> <script src="/vendor/tailwind.js"></script>
<script>window.WA_TOOL_ID = 'placeholder';</script> <script>window.WA_TOOL_ID = 'placeholder';</script>
<script src="/shared.js?v=2"></script> <script src="/shared.js?v=3"></script>
<link href="/vendor/fonts.css" rel="stylesheet"> <link href="/vendor/fonts.css" rel="stylesheet">
<link href="/shared.css" rel="stylesheet"> <link href="/shared.css" rel="stylesheet">
<style> <style>
@ -41,11 +41,6 @@
<div class="tool-container relative z-10 max-w-2xl mx-auto"> <div class="tool-container relative z-10 max-w-2xl mx-auto">
<!-- Header --> <!-- Header -->
<div class="text-center mb-8 fade-up">
<div class="inline-flex items-center gap-2 mb-3 px-3 py-1 rounded-full border dark:border-surface-600 border-gray-300 dark:bg-surface-800/60 bg-white/60 text-xs font-mono dark:text-gray-400 text-gray-500 tracking-wide">
<span class="w-1.5 h-1.5 rounded-full bg-accent animate-pulse"></span>
PNG &middot; JPG &middot; WebP
</div>
<div class="page-header" style="text-align:center;"> <div class="page-header" style="text-align:center;">
<div class="inline-flex items-center gap-2 mb-3 px-3 py-1 rounded-full border dark:border-surface-600 border-gray-300 dark:bg-surface-800/60 bg-white/60 text-xs font-mono dark:text-gray-400 text-gray-500 tracking-wide"> <div class="inline-flex items-center gap-2 mb-3 px-3 py-1 rounded-full border dark:border-surface-600 border-gray-300 dark:bg-surface-800/60 bg-white/60 text-xs font-mono dark:text-gray-400 text-gray-500 tracking-wide">
<span class="w-1.5 h-1.5 rounded-full bg-accent animate-pulse"></span> <span class="w-1.5 h-1.5 rounded-full bg-accent animate-pulse"></span>

View File

@ -6,7 +6,7 @@
<title>Redirect Analyzer — WA Dev Tools</title> <title>Redirect Analyzer — WA Dev Tools</title>
<script src="/vendor/tailwind.js"></script> <script src="/vendor/tailwind.js"></script>
<script>window.WA_TOOL_ID = 'redirects';</script> <script>window.WA_TOOL_ID = 'redirects';</script>
<script src="/shared.js?v=2"></script> <script src="/shared.js?v=3"></script>
<link href="/vendor/fonts.css" rel="stylesheet"> <link href="/vendor/fonts.css" rel="stylesheet">
<link href="/shared.css" rel="stylesheet"> <link href="/shared.css" rel="stylesheet">
<style> <style>

View File

@ -6,7 +6,7 @@
<title>HTML Sanitizer — WA Dev Tools</title> <title>HTML Sanitizer — WA Dev Tools</title>
<script src="/vendor/tailwind.js"></script> <script src="/vendor/tailwind.js"></script>
<script>window.WA_TOOL_ID = 'sanitizer';</script> <script>window.WA_TOOL_ID = 'sanitizer';</script>
<script src="/shared.js?v=2"></script> <script src="/shared.js?v=3"></script>
<link href="/vendor/fonts.css" rel="stylesheet"> <link href="/vendor/fonts.css" rel="stylesheet">
<link href="/shared.css" rel="stylesheet"> <link href="/shared.css" rel="stylesheet">
<style> <style>

View File

@ -102,6 +102,20 @@ body {
.wa-btn:disabled { opacity:0.5;cursor:not-allowed } .wa-btn:disabled { opacity:0.5;cursor:not-allowed }
.wa-card { background:var(--surface-700);border:1px solid var(--surface-600);border-radius:12px;padding:20px;transition:background .3s,border-color .3s } .wa-card { background:var(--surface-700);border:1px solid var(--surface-600);border-radius:12px;padding:20px;transition:background .3s,border-color .3s }
/* Modal overlay */
.wa-modal-overlay { position:fixed;inset:0;background:rgba(0,0,0,.5);backdrop-filter:blur(4px);z-index:1000;display:flex;align-items:center;justify-content:center;animation:fadeIn .15s ease-out }
.wa-modal { background:var(--surface-700);border:1px solid var(--surface-600);border-radius:16px;padding:28px 24px;max-width:340px;width:90%;text-align:center;box-shadow:0 20px 60px rgba(0,0,0,.3);animation:slideUp .2s ease-out }
.wa-modal h3 { font-size:17px;font-weight:700;color:var(--text-primary);margin-bottom:6px }
.wa-modal p { font-size:13px;color:var(--text-muted);margin-bottom:20px }
.wa-modal-actions { display:flex;gap:8px }
.wa-modal-actions button { flex:1;padding:10px;border-radius:8px;font-family:'Manrope',sans-serif;font-weight:600;font-size:14px;cursor:pointer;border:none;transition:all .15s }
.wa-modal-cancel { background:var(--surface-600);color:var(--text-secondary) }
.wa-modal-cancel:hover { background:var(--surface-800) }
.wa-modal-danger { background:#ef4444;color:#fff }
.wa-modal-danger:hover { background:#dc2626 }
@keyframes fadeIn { from{opacity:0} to{opacity:1} }
@keyframes slideUp { from{opacity:0;transform:translateY(8px)} to{opacity:1;transform:translateY(0)} }
/* Top header (public pages: landing, auth, status) */ /* Top header (public pages: landing, auth, status) */
.top-header { position:fixed;top:0;left:0;right:0;height:56px;background:var(--surface-800);border-bottom:1px solid var(--surface-600);display:flex;align-items:center;padding:0 24px;z-index:50;backdrop-filter:blur(12px) } .top-header { position:fixed;top:0;left:0;right:0;height:56px;background:var(--surface-800);border-bottom:1px solid var(--surface-600);display:flex;align-items:center;padding:0 24px;z-index:50;backdrop-filter:blur(12px) }
.top-logo { font-size:18px;font-weight:800;color:var(--text-primary);text-decoration:none;display:flex;align-items:center;gap:8px } .top-logo { font-size:18px;font-weight:800;color:var(--text-primary);text-decoration:none;display:flex;align-items:center;gap:8px }

View File

@ -123,9 +123,7 @@ async function _loadUser() {
container.style.display = 'block'; container.style.display = 'block';
avatar.addEventListener('click', () => { avatar.addEventListener('click', () => {
if (confirm('Выйти из аккаунта?')) { _showLogoutModal(user.name || user.email);
window.location.href = '/auth/logout';
}
}); });
// Show admin links for admin users // Show admin links for admin users
@ -137,6 +135,24 @@ async function _loadUser() {
} catch {} } catch {}
} }
/* Logout modal */
function _showLogoutModal(userName) {
const overlay = document.createElement('div');
overlay.className = 'wa-modal-overlay';
overlay.innerHTML = `<div class="wa-modal">
<h3>Выход из аккаунта</h3>
<p>${userName}</p>
<div class="wa-modal-actions">
<button class="wa-modal-cancel" id="modalCancel">Отмена</button>
<button class="wa-modal-danger" id="modalLogout">Выйти</button>
</div>
</div>`;
document.body.appendChild(overlay);
overlay.querySelector('#modalCancel').addEventListener('click', () => overlay.remove());
overlay.querySelector('#modalLogout').addEventListener('click', () => { window.location.href = '/auth/logout'; });
overlay.addEventListener('click', (e) => { if (e.target === overlay) overlay.remove(); });
}
/* Theme management */ /* Theme management */
function initTheme() { function initTheme() {
const html = document.documentElement; const html = document.documentElement;

View File

@ -6,7 +6,7 @@
<title>SVG Editor — WA Dev Tools</title> <title>SVG Editor — WA Dev Tools</title>
<script src="/vendor/tailwind.js"></script> <script src="/vendor/tailwind.js"></script>
<script>window.WA_TOOL_ID = 'svgeditor';</script> <script>window.WA_TOOL_ID = 'svgeditor';</script>
<script src="/shared.js?v=2"></script> <script src="/shared.js?v=3"></script>
<link href="/vendor/fonts.css" rel="stylesheet"> <link href="/vendor/fonts.css" rel="stylesheet">
<link href="/shared.css" rel="stylesheet"> <link href="/shared.css" rel="stylesheet">
<script src="/vendor/opentype.min.js"></script> <script src="/vendor/opentype.min.js"></script>

View File

@ -6,7 +6,7 @@
<title>WA Dev Tools — Видео конвертер</title> <title>WA Dev Tools — Видео конвертер</title>
<script src="/vendor/tailwind.js"></script> <script src="/vendor/tailwind.js"></script>
<script>window.WA_TOOL_ID = 'video';</script> <script>window.WA_TOOL_ID = 'video';</script>
<script src="/shared.js?v=2"></script> <script src="/shared.js?v=3"></script>
<link href="/vendor/fonts.css" rel="stylesheet"> <link href="/vendor/fonts.css" rel="stylesheet">
<link href="/shared.css" rel="stylesheet"> <link href="/shared.css" rel="stylesheet">
<style> <style>