wa-dev-tools/public/index.html
treamz e3afa5b95a Standardize: shared.css/js, unified sidebar/theme/titles
- 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)
2026-03-21 22:36:59 +03:00

197 lines
10 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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>