- Extract shared CSS (sidebar, theme vars, layout) into shared.css - Extract shared JS (tailwind config, sidebar injection, theme toggle) into shared.js - Remove ~1200 lines of duplicated code across 13 HTML pages - Standardize all titles to format: Tool Name — WA Dev Tools - Standardize page headers (h1 + description) across all tools - Standardize container padding (tool-container class) - Sidebar now injected via JS — single source of truth - Use CSS variables for accent colors everywhere (no more hardcoded #0054e6)
197 lines
10 KiB
HTML
197 lines
10 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="ru" class="dark">
|
||
<head>
|
||
<meta charset="UTF-8" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||
<title>WA Dev Tools — Инструменты</title>
|
||
<script src="/vendor/tailwind.js"></script>
|
||
<script src="/shared.js"></script>
|
||
<link href="/vendor/fonts.css" rel="stylesheet">
|
||
<link href="/shared.css" rel="stylesheet">
|
||
<script>window.WA_TOOL_ID = 'home';</script>
|
||
<style>
|
||
@keyframes fadeUp { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: translateY(0); } }
|
||
.fade-up { animation: fadeUp 0.4s ease-out forwards; }
|
||
.fade-up-delay { animation: fadeUp 0.4s ease-out 0.1s forwards; opacity: 0; }
|
||
|
||
/* Dashboard tiles */
|
||
.tool-tile {
|
||
display: flex;
|
||
flex-direction: column;
|
||
gap: 12px;
|
||
padding: 20px;
|
||
border-radius: 16px;
|
||
border: 1px solid var(--surface-600);
|
||
background: var(--surface-700);
|
||
color: inherit;
|
||
text-decoration: none;
|
||
transition: all .2s;
|
||
}
|
||
.tool-tile:hover {
|
||
transform: translateY(-2px);
|
||
border-color: rgba(0,84,230,.3);
|
||
box-shadow: 0 8px 24px rgba(0,0,0,.3);
|
||
background: var(--surface-800);
|
||
}
|
||
.tile-icon {
|
||
width: 44px;
|
||
height: 44px;
|
||
border-radius: 12px;
|
||
background: rgba(0,84,230,.1);
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
color: #0054e6;
|
||
transition: background .2s;
|
||
}
|
||
.tool-tile:hover .tile-icon { background: rgba(0,84,230,.15); }
|
||
.tile-title { font-size: 15px; font-weight: 600; color: var(--text-primary); margin-bottom: 4px; }
|
||
.tile-desc { font-size: 12px; color: var(--text-muted); font-family: 'JetBrains Mono', monospace; }
|
||
</style>
|
||
</head>
|
||
<body class="noise dark:text-gray-200 text-gray-700 font-sans antialiased">
|
||
|
||
<div class="main-content">
|
||
<div class="tool-container relative z-10 max-w-5xl mx-auto py-8 sm:py-12">
|
||
|
||
<!-- Header -->
|
||
<div class="mb-10 fade-up">
|
||
<div class="page-header">
|
||
<h1 class="text-3xl sm:text-4xl font-extrabold tracking-tight dark:text-white text-gray-900">
|
||
WA Dev <span class="text-accent">Tools</span>
|
||
</h1>
|
||
<p class="description mt-2 text-sm dark:text-gray-500 text-gray-400 font-mono">Инструменты разработчика</p>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Tools Grid -->
|
||
<div class="grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 gap-4 fade-up-delay">
|
||
|
||
<!-- Сжать картинки -->
|
||
<a href="/compress" class="tool-tile group">
|
||
<div class="tile-icon">
|
||
<svg width="22" height="22" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M2.25 15.75l5.159-5.159a2.25 2.25 0 013.182 0l5.159 5.159m-1.5-1.5l1.409-1.409a2.25 2.25 0 013.182 0l2.909 2.909M3.75 21h16.5A2.25 2.25 0 0023.25 18.75V5.25A2.25 2.25 0 0021 3H3.75A2.25 2.25 0 001.5 5.25v13.5A2.25 2.25 0 003.75 21z"/></svg>
|
||
</div>
|
||
<div>
|
||
<div class="tile-title">Сжать картинки</div>
|
||
<div class="tile-desc">JPEG, PNG, WebP до 20МБ</div>
|
||
</div>
|
||
</a>
|
||
|
||
<!-- Markdown -->
|
||
<a href="/md" class="tool-tile group">
|
||
<div class="tile-icon">
|
||
<svg width="22" height="22" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m0 12.75h7.5m-7.5 3H12M10.5 2.25H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z"/></svg>
|
||
</div>
|
||
<div>
|
||
<div class="tile-title">Markdown</div>
|
||
<div class="tile-desc">Просмотр Markdown файлов</div>
|
||
</div>
|
||
</a>
|
||
|
||
<!-- Placeholder -->
|
||
<a href="/placeholder" class="tool-tile group">
|
||
<div class="tile-icon">
|
||
<svg width="22" height="22" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M9.75 3.104v5.714a2.25 2.25 0 01-.659 1.591L5 14.5M9.75 3.104c-.251.023-.501.05-.75.082m.75-.082a24.301 24.301 0 014.5 0m0 0v5.714a2.25 2.25 0 00.659 1.591L19 14.5M14.25 3.104c.251.023.501.05.75.082M19 14.5l-2.47 2.47a2.25 2.25 0 01-1.59.659H9.06a2.25 2.25 0 01-1.591-.659L5 14.5m14 0V17a2.25 2.25 0 01-2.25 2.25H7.25A2.25 2.25 0 015 17v-2.5"/></svg>
|
||
</div>
|
||
<div>
|
||
<div class="tile-title">Placeholder</div>
|
||
<div class="tile-desc">Генератор заглушек для изображений</div>
|
||
</div>
|
||
</a>
|
||
|
||
<!-- URL Parser -->
|
||
<a href="/parser" class="tool-tile group">
|
||
<div class="tile-icon">
|
||
<svg width="22" height="22" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M13.19 8.688a4.5 4.5 0 011.242 7.244l-4.5 4.5a4.5 4.5 0 01-6.364-6.364l1.757-1.757m9.86-2.06a4.5 4.5 0 00-6.364-6.364L6.257 6.514a4.5 4.5 0 001.242 7.244"/></svg>
|
||
</div>
|
||
<div>
|
||
<div class="tile-title">URL Parser</div>
|
||
<div class="tile-desc">Извлечение контента из URL</div>
|
||
</div>
|
||
</a>
|
||
|
||
<!-- Пароли -->
|
||
<a href="/password" class="tool-tile group">
|
||
<div class="tile-icon">
|
||
<svg width="22" height="22" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M15.75 5.25a3 3 0 013 3m3 0a6 6 0 01-7.029 5.912c-.563-.097-1.159.026-1.563.43L10.5 17.25H8.25v2.25H6v2.25H2.25v-2.818c0-.597.237-1.17.659-1.591l6.499-6.499c.404-.404.527-1 .43-1.563A6 6 0 1121.75 8.25z"/></svg>
|
||
</div>
|
||
<div>
|
||
<div class="tile-title">Пароли</div>
|
||
<div class="tile-desc">Генератор надёжных паролей</div>
|
||
</div>
|
||
</a>
|
||
|
||
<!-- Sanitizer -->
|
||
<a href="/sanitizer" class="tool-tile group">
|
||
<div class="tile-icon">
|
||
<svg width="22" height="22" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12.75L11.25 15 15 9.75m-3-7.036A11.959 11.959 0 013.598 6 11.99 11.99 0 003 9.749c0 5.592 3.824 10.29 9 11.623 5.176-1.332 9-6.03 9-11.622 0-1.31-.21-2.571-.598-3.751h-.152c-3.196 0-6.1-1.248-8.25-3.285z"/></svg>
|
||
</div>
|
||
<div>
|
||
<div class="tile-title">Sanitizer</div>
|
||
<div class="tile-desc">Очистка HTML от мусора</div>
|
||
</div>
|
||
</a>
|
||
|
||
<!-- Конвертер -->
|
||
<a href="/converter" class="tool-tile group">
|
||
<div class="tile-icon">
|
||
<svg width="22" height="22" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M7.5 21L3 16.5m0 0L7.5 12M3 16.5h13.5m0-13.5L21 7.5m0 0L16.5 12M21 7.5H7.5"/></svg>
|
||
</div>
|
||
<div>
|
||
<div class="tile-title">Конвертер</div>
|
||
<div class="tile-desc">Конвертация форматов данных</div>
|
||
</div>
|
||
</a>
|
||
|
||
<!-- Форматтер -->
|
||
<a href="/formatter" class="tool-tile group">
|
||
<div class="tile-icon">
|
||
<svg width="22" height="22" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M17.25 6.75L22.5 12l-5.25 5.25m-10.5 0L1.5 12l5.25-5.25m7.5-3l-4.5 16.5"/></svg>
|
||
</div>
|
||
<div>
|
||
<div class="tile-title">Форматтер</div>
|
||
<div class="tile-desc">Форматирование кода</div>
|
||
</div>
|
||
</a>
|
||
|
||
<!-- Редактор -->
|
||
<a href="/editor" class="tool-tile group">
|
||
<div class="tile-icon">
|
||
<svg width="22" height="22" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L10.582 16.07a4.5 4.5 0 01-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 011.13-1.897l8.932-8.931zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0115.75 21H5.25A2.25 2.25 0 013 18.75V8.25A2.25 2.25 0 015.25 6H10"/></svg>
|
||
</div>
|
||
<div>
|
||
<div class="tile-title">Редактор</div>
|
||
<div class="tile-desc">Фоторедактор в браузере</div>
|
||
</div>
|
||
</a>
|
||
|
||
<!-- HTTP Client -->
|
||
<a href="/httpclient" class="tool-tile group">
|
||
<div class="tile-icon">
|
||
<svg width="22" height="22" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M6 12L3.269 3.126A59.768 59.768 0 0121.485 12 59.77 59.77 0 013.27 20.876L5.999 12zm0 0h7.5"/></svg>
|
||
</div>
|
||
<div>
|
||
<div class="tile-title">HTTP Client</div>
|
||
<div class="tile-desc">Тест API запросов — Postman lite</div>
|
||
</div>
|
||
</a>
|
||
|
||
<!-- Redirect Analyzer -->
|
||
<a href="/redirects" class="tool-tile group">
|
||
<div class="tile-icon">
|
||
<svg width="22" height="22" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M13.5 6H5.25A2.25 2.25 0 003 8.25v10.5A2.25 2.25 0 005.25 21h10.5A2.25 2.25 0 0018 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25"/></svg>
|
||
</div>
|
||
<div>
|
||
<div class="tile-title">Redirect Analyzer</div>
|
||
<div class="tile-desc">Анализ цепочки HTTP-редиректов</div>
|
||
</div>
|
||
</a>
|
||
|
||
</div>
|
||
</div>
|
||
</div><!-- /main-content -->
|
||
|
||
</body>
|
||
</html>
|