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)
This commit is contained in:
parent
5b528d243a
commit
e3afa5b95a
@ -3,95 +3,13 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>Сжать картинки</title>
|
<title>Сжатие картинок — WA Dev Tools</title>
|
||||||
<script src="/vendor/tailwind.js"></script>
|
<script src="/vendor/tailwind.js"></script>
|
||||||
|
<script src="/shared.js"></script>
|
||||||
<link href="/vendor/fonts.css" rel="stylesheet">
|
<link href="/vendor/fonts.css" rel="stylesheet">
|
||||||
<script>
|
<link href="/shared.css" rel="stylesheet">
|
||||||
tailwind.config = {
|
<script>window.WA_TOOL_ID = 'compress';</script>
|
||||||
darkMode: 'class',
|
|
||||||
theme: {
|
|
||||||
extend: {
|
|
||||||
fontFamily: {
|
|
||||||
mono: ['JetBrains Mono', 'monospace'],
|
|
||||||
sans: ['Manrope', 'sans-serif'],
|
|
||||||
},
|
|
||||||
colors: {
|
|
||||||
surface: { 900: '#060c18', 800: '#091020', 700: '#0d1828', 600: '#162040' },
|
|
||||||
accent: { DEFAULT: '#0054e6', dim: '#0043b8', bright: '#6b9fff' },
|
|
||||||
warn: '#ffd600',
|
|
||||||
danger: '#ff5252',
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<style>
|
<style>
|
||||||
/* Sidebar */
|
|
||||||
.sidebar{position:fixed;top:0;left:0;width:56px;height:100vh;display:flex;flex-direction:column;align-items:center;padding:16px 0 12px;z-index:50;border-right:1px solid var(--surface-600);background:var(--surface-800);backdrop-filter:blur(12px);transition:background .3s,border-color .3s}
|
|
||||||
.sidebar-logo{margin-bottom:24px;color:var(--text-muted);font-size:10px;font-weight:700;letter-spacing:.08em;font-family:'JetBrains Mono',monospace}
|
|
||||||
.sidebar-nav{display:flex;flex-direction:column;gap:6px;flex:1}
|
|
||||||
.sidebar-link{width:40px;height:40px;border-radius:10px;display:flex;align-items:center;justify-content:center;color:var(--text-muted);transition:all .2s;text-decoration:none;position:relative}
|
|
||||||
.sidebar-link:hover{color:var(--text-secondary);background:rgba(255,255,255,.04)}
|
|
||||||
.sidebar-link.active{color:#0054e6;background:rgba(0,84,230,.08)}
|
|
||||||
.sidebar-link.active::before{content:'';position:absolute;left:-8px;top:50%;transform:translateY(-50%);width:3px;height:20px;border-radius:0 3px 3px 0;background:#0054e6}
|
|
||||||
.sidebar-bottom{margin-top:auto;display:flex;flex-direction:column;align-items:center;gap:8px}
|
|
||||||
.main-content{margin-left:56px}
|
|
||||||
|
|
||||||
/* Mobile bottom bar */
|
|
||||||
@media(max-width:640px){
|
|
||||||
.sidebar{position:fixed;top:auto;bottom:0;left:0;width:100%;height:52px;flex-direction:row;justify-content:center;padding:0 16px;border-right:none;border-top:1px solid var(--surface-600);gap:0}
|
|
||||||
.sidebar-logo{display:none}
|
|
||||||
.sidebar-nav{flex-direction:row;gap:4px;flex:none}
|
|
||||||
.sidebar-bottom{margin-top:0;margin-left:auto;flex-direction:row}
|
|
||||||
.sidebar-link.active::before{left:50%;top:auto;bottom:-6px;transform:translateX(-50%);width:20px;height:3px;border-radius:3px 3px 0 0}
|
|
||||||
.main-content{margin-left:0;padding-bottom:60px}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Theme variables */
|
|
||||||
:root {
|
|
||||||
--bg: #f5f5f7;
|
|
||||||
--bg-grad1: rgba(0, 67, 184, 0.04);
|
|
||||||
--bg-grad2: rgba(0, 50, 140, 0.03);
|
|
||||||
--surface-800: rgba(255,255,255,0.85);
|
|
||||||
--surface-700: #f0f0f3;
|
|
||||||
--surface-600: #dde0e6;
|
|
||||||
--text-primary: #1a1a2e;
|
|
||||||
--text-secondary: #555;
|
|
||||||
--text-muted: #888;
|
|
||||||
--bar-bg: #e0e0e0;
|
|
||||||
--select-bg: #f0f0f3;
|
|
||||||
--select-color: #1a1a2e;
|
|
||||||
}
|
|
||||||
.dark {
|
|
||||||
--bg: #060c18;
|
|
||||||
--bg-grad1: rgba(0, 84, 230, 0.03);
|
|
||||||
--bg-grad2: rgba(0, 67, 184, 0.02);
|
|
||||||
--surface-800: rgba(9,16,32,0.8);
|
|
||||||
--surface-700: #0d1828;
|
|
||||||
--surface-600: #162040;
|
|
||||||
--text-primary: #fff;
|
|
||||||
--text-secondary: #c0c0c0;
|
|
||||||
--text-muted: #666;
|
|
||||||
--bar-bg: #0d1828;
|
|
||||||
--select-bg: #091020;
|
|
||||||
--select-color: #e0e0e0;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
background: var(--bg);
|
|
||||||
background-image:
|
|
||||||
radial-gradient(ellipse at 20% 50%, var(--bg-grad1) 0%, transparent 50%),
|
|
||||||
radial-gradient(ellipse at 80% 20%, var(--bg-grad2) 0%, transparent 50%);
|
|
||||||
min-height: 100vh;
|
|
||||||
transition: background 0.3s;
|
|
||||||
}
|
|
||||||
.dark .noise::before {
|
|
||||||
content: '';
|
|
||||||
position: fixed;
|
|
||||||
inset: 0;
|
|
||||||
background: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.03'/%3E%3C/svg%3E");
|
|
||||||
pointer-events: none;
|
|
||||||
z-index: 0;
|
|
||||||
}
|
|
||||||
.dropzone-active { border-color: #0054e6 !important; background: rgba(0, 84, 230, 0.05) !important; }
|
.dropzone-active { border-color: #0054e6 !important; background: rgba(0, 84, 230, 0.05) !important; }
|
||||||
.dropzone-active .drop-icon { transform: scale(1.1) translateY(-4px); }
|
.dropzone-active .drop-icon { transform: scale(1.1) translateY(-4px); }
|
||||||
.drop-icon { transition: transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); }
|
.drop-icon { transition: transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); }
|
||||||
@ -108,85 +26,21 @@
|
|||||||
progress::-webkit-progress-bar { background: var(--bar-bg); border-radius: 2px; }
|
progress::-webkit-progress-bar { background: var(--bar-bg); border-radius: 2px; }
|
||||||
progress::-webkit-progress-value { background: linear-gradient(90deg, #0043b8, #0054e6); border-radius: 2px; transition: width 0.2s; }
|
progress::-webkit-progress-value { background: linear-gradient(90deg, #0043b8, #0054e6); border-radius: 2px; transition: width 0.2s; }
|
||||||
select, select option { background: var(--select-bg); color: var(--select-color); }
|
select, select option { background: var(--select-bg); color: var(--select-color); }
|
||||||
|
|
||||||
/* Theme toggle */
|
|
||||||
.theme-toggle { position: relative; width: 44px; height: 24px; border-radius: 12px; cursor: pointer; transition: background 0.3s; }
|
|
||||||
.dark .theme-toggle { background: #162040; }
|
|
||||||
.theme-toggle { background: #dde0e6; }
|
|
||||||
.theme-toggle-knob { position: absolute; top: 2px; width: 20px; height: 20px; border-radius: 50%; transition: left 0.3s, background 0.3s; display: flex; align-items: center; justify-content: center; }
|
|
||||||
.dark .theme-toggle-knob { left: 22px; background: #0d1828; }
|
|
||||||
.theme-toggle-knob { left: 2px; background: #fff; box-shadow: 0 1px 3px rgba(0,0,0,0.15); }
|
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body class="noise dark:text-gray-200 text-gray-700 font-sans antialiased">
|
<body class="noise dark:text-gray-200 text-gray-700 font-sans antialiased">
|
||||||
|
|
||||||
<!-- Sidebar -->
|
|
||||||
<nav class="sidebar">
|
|
||||||
<div class="sidebar-logo">WA</div>
|
|
||||||
<div class="sidebar-nav">
|
|
||||||
<a href="/" class="sidebar-link" title="Главная">
|
|
||||||
<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 12l8.954-8.955c.44-.439 1.152-.439 1.591 0L21.75 12M4.5 9.75v10.125c0 .621.504 1.125 1.125 1.125H9.75v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21h4.125c.621 0 1.125-.504 1.125-1.125V9.75M8.25 21h8.25"/></svg>
|
|
||||||
</a>
|
|
||||||
<a href="/compress" class="sidebar-link active" title="Картинки">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/md" class="sidebar-link" title="Markdown">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/placeholder" class="sidebar-link" title="Placeholder">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/parser" class="sidebar-link" title="Parser">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/password" class="sidebar-link" title="Password">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/sanitizer" class="sidebar-link" title="Sanitizer">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/converter" class="sidebar-link" title="Converter">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/formatter" class="sidebar-link" title="Formatter">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/editor" class="sidebar-link" title="Editor">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/httpclient" class="sidebar-link" title="HTTP Client">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/redirects" class="sidebar-link" title="Redirect Analyzer">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/svgeditor" class="sidebar-link" title="SVG Редактор">
|
|
||||||
<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.53 16.122a3 3 0 00-5.78 1.128 2.25 2.25 0 01-2.4 2.245 4.5 4.5 0 008.4-2.245c0-.399-.078-.78-.22-1.128zm0 0a15.998 15.998 0 003.388-1.62m-5.043-.025a15.994 15.994 0 011.622-3.395m3.42 3.42a15.995 15.995 0 004.764-4.648l3.876-5.814a1.151 1.151 0 00-1.597-1.597L14.146 6.32a15.996 15.996 0 00-4.649 4.763m3.42 3.42a6.776 6.776 0 00-3.42-3.42"/></svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="sidebar-bottom">
|
|
||||||
<div class="theme-toggle" id="themeToggle" title="Переключить тему">
|
|
||||||
<div class="theme-toggle-knob">
|
|
||||||
<svg class="w-3 h-3 dark:hidden text-amber-500" fill="currentColor" viewBox="0 0 20 20"><path d="M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414zm2.12-10.607a1 1 0 010 1.414l-.706.707a1 1 0 11-1.414-1.414l.707-.707a1 1 0 011.414 0zM17 11a1 1 0 100-2h-1a1 1 0 100 2h1zm-7 4a1 1 0 011 1v1a1 1 0 11-2 0v-1a1 1 0 011-1zM5.05 6.464A1 1 0 106.465 5.05l-.708-.707a1 1 0 00-1.414 1.414l.707.707zm1.414 8.486l-.707.707a1 1 0 01-1.414-1.414l.707-.707a1 1 0 011.414 1.414zM4 11a1 1 0 100-2H3a1 1 0 000 2h1z"/></svg>
|
|
||||||
<svg class="w-3 h-3 hidden dark:block text-gray-400" fill="currentColor" viewBox="0 0 20 20"><path d="M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z"/></svg>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
|
|
||||||
<div class="main-content">
|
<div class="main-content">
|
||||||
<div class="relative z-10 max-w-2xl mx-auto px-4 py-8 sm:py-12">
|
<div class="tool-container relative z-10 max-w-2xl mx-auto py-8 sm:py-12">
|
||||||
|
|
||||||
<!-- Header -->
|
<!-- Header -->
|
||||||
<div class="text-center mb-8 fade-up">
|
<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">
|
<div class="page-header">
|
||||||
<span class="w-1.5 h-1.5 rounded-full bg-accent animate-pulse"></span>
|
<h1 class="text-3xl sm:text-4xl font-extrabold tracking-tight dark:text-white text-gray-900">
|
||||||
JPEG · PNG · WebP
|
Сжать <span class="text-accent">картинки</span>
|
||||||
|
</h1>
|
||||||
|
<p class="description mt-2 text-sm dark:text-gray-500 text-gray-400 font-mono">до 50 файлов · до 20 МБ каждый</p>
|
||||||
</div>
|
</div>
|
||||||
<h1 class="text-3xl sm:text-4xl font-extrabold tracking-tight dark:text-white text-gray-900">
|
|
||||||
Сжать <span class="text-accent">картинки</span>
|
|
||||||
</h1>
|
|
||||||
<p class="mt-2 text-sm dark:text-gray-500 text-gray-400 font-mono">до 50 файлов · до 20 МБ каждый</p>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Main Card -->
|
<!-- Main Card -->
|
||||||
@ -314,17 +168,6 @@
|
|||||||
</div><!-- /main-content -->
|
</div><!-- /main-content -->
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
// Theme toggle
|
|
||||||
const html = document.documentElement;
|
|
||||||
const savedTheme = localStorage.getItem('theme');
|
|
||||||
if (savedTheme) { html.className = savedTheme; }
|
|
||||||
else if (!window.matchMedia('(prefers-color-scheme: dark)').matches) { html.className = ''; }
|
|
||||||
|
|
||||||
document.getElementById('themeToggle').addEventListener('click', () => {
|
|
||||||
const isDark = html.classList.toggle('dark');
|
|
||||||
localStorage.setItem('theme', isDark ? 'dark' : '');
|
|
||||||
});
|
|
||||||
|
|
||||||
const $ = id => document.getElementById(id);
|
const $ = id => document.getElementById(id);
|
||||||
const dropzone = $('dropzone');
|
const dropzone = $('dropzone');
|
||||||
const fileInput = $('fileInput');
|
const fileInput = $('fileInput');
|
||||||
|
|||||||
@ -3,55 +3,14 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>Converter — images.wadevelop.ru</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 src="/shared.js"></script>
|
||||||
<link href="/vendor/fonts.css" rel="stylesheet">
|
<link href="/vendor/fonts.css" rel="stylesheet">
|
||||||
|
<link href="/shared.css" rel="stylesheet">
|
||||||
<script src="/vendor/marked.min.js"></script>
|
<script src="/vendor/marked.min.js"></script>
|
||||||
<script>
|
|
||||||
tailwind.config = {
|
|
||||||
darkMode: 'class',
|
|
||||||
theme: {
|
|
||||||
extend: {
|
|
||||||
fontFamily: {
|
|
||||||
mono: ['JetBrains Mono', 'monospace'],
|
|
||||||
sans: ['Manrope', 'sans-serif'],
|
|
||||||
},
|
|
||||||
colors: {
|
|
||||||
surface: { 900: '#060c18', 800: '#091020', 700: '#0d1828', 600: '#162040' },
|
|
||||||
accent: { DEFAULT: '#0054e6', dim: '#0043b8', bright: '#6b9fff' },
|
|
||||||
warn: '#ffd600',
|
|
||||||
danger: '#ff5252',
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<style>
|
<style>
|
||||||
.sidebar{position:fixed;top:0;left:0;width:56px;height:100vh;display:flex;flex-direction:column;align-items:center;padding:16px 0 12px;z-index:50;border-right:1px solid var(--surface-600);background:var(--surface-800);backdrop-filter:blur(12px);transition:background .3s,border-color .3s}
|
|
||||||
.sidebar-logo{margin-bottom:24px;color:var(--text-muted);font-size:10px;font-weight:700;letter-spacing:.08em;font-family:'JetBrains Mono',monospace}
|
|
||||||
.sidebar-nav{display:flex;flex-direction:column;gap:6px;flex:1}
|
|
||||||
.sidebar-link{width:40px;height:40px;border-radius:10px;display:flex;align-items:center;justify-content:center;color:var(--text-muted);transition:all .2s;text-decoration:none;position:relative}
|
|
||||||
.sidebar-link:hover{color:var(--text-secondary);background:rgba(255,255,255,.04)}
|
|
||||||
.sidebar-link.active{color:#0054e6;background:rgba(0,84,230,.08)}
|
|
||||||
.sidebar-link.active::before{content:'';position:absolute;left:-8px;top:50%;transform:translateY(-50%);width:3px;height:20px;border-radius:0 3px 3px 0;background:#0054e6}
|
|
||||||
.sidebar-bottom{margin-top:auto;display:flex;flex-direction:column;align-items:center;gap:8px}
|
|
||||||
.main-content{margin-left:56px}
|
|
||||||
@media(max-width:640px){
|
|
||||||
.sidebar{position:fixed;top:auto;bottom:0;left:0;width:100%;height:52px;flex-direction:row;justify-content:center;padding:0 16px;border-right:none;border-top:1px solid var(--surface-600);gap:0}
|
|
||||||
.sidebar-logo{display:none}
|
|
||||||
.sidebar-nav{flex-direction:row;gap:4px;flex:none}
|
|
||||||
.sidebar-bottom{margin-top:0;margin-left:auto;flex-direction:row}
|
|
||||||
.sidebar-link.active::before{left:50%;top:auto;bottom:-6px;transform:translateX(-50%);width:20px;height:3px;border-radius:3px 3px 0 0}
|
|
||||||
.main-content{margin-left:0;padding-bottom:60px}
|
|
||||||
}
|
|
||||||
:root{--bg:#f5f5f7;--bg-grad1:rgba(0,67,184,.04);--bg-grad2:rgba(0,150,60,.03);--surface-800:rgba(255,255,255,0.85);--surface-700:#f0f0f3;--surface-600:#dde0e6;--text-primary:#1a1a2e;--text-secondary:#555;--text-muted:#888;--select-bg:#f0f0f3;--select-color:#1a1a2e}
|
|
||||||
.dark{--bg:#060c18;--bg-grad1:rgba(0,84,230,.03);--bg-grad2:rgba(0,67,184,.02);--surface-800:rgba(9,16,32,0.8);--surface-700:#0d1828;--surface-600:#162040;--text-primary:#fff;--text-secondary:#c0c0c0;--text-muted:#666;--select-bg:#091020;--select-color:#e0e0e0}
|
|
||||||
body{background:var(--bg);background-image:radial-gradient(ellipse at 20% 50%,var(--bg-grad1) 0%,transparent 50%),radial-gradient(ellipse at 80% 20%,var(--bg-grad2) 0%,transparent 50%);min-height:100vh;transition:background .3s}
|
|
||||||
.dark .noise::before{content:'';position:fixed;inset:0;background:url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.03'/%3E%3C/svg%3E");pointer-events:none;z-index:0}
|
|
||||||
.theme-toggle{position:relative;width:44px;height:24px;border-radius:12px;cursor:pointer;transition:background .3s}
|
|
||||||
.dark .theme-toggle{background:#162040}.theme-toggle{background:#dde0e6}
|
|
||||||
.theme-toggle-knob{position:absolute;top:2px;width:20px;height:20px;border-radius:50%;transition:left .3s,background .3s;display:flex;align-items:center;justify-content:center}
|
|
||||||
.dark .theme-toggle-knob{left:22px;background:#0d1828}.theme-toggle-knob{left:2px;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.15)}
|
|
||||||
@keyframes fadeUp{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.fade-up{animation:fadeUp .4s ease-out forwards}.fade-up-delay{animation:fadeUp .4s ease-out .1s forwards;opacity:0}
|
@keyframes fadeUp{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.fade-up{animation:fadeUp .4s ease-out forwards}.fade-up-delay{animation:fadeUp .4s ease-out .1s forwards;opacity:0}
|
||||||
.tool-btn{transition:all .2s}.tool-btn.active{color:#0054e6;background:rgba(0,84,230,.08);border-color:rgba(0,84,230,.3)}
|
.tool-btn{transition:all .2s}.tool-btn.active{color:#0054e6;background:rgba(0,84,230,.08);border-color:rgba(0,84,230,.3)}
|
||||||
textarea{font-family:'JetBrains Mono',monospace;font-size:13px;resize:vertical}
|
textarea{font-family:'JetBrains Mono',monospace;font-size:13px;resize:vertical}
|
||||||
@ -59,43 +18,10 @@
|
|||||||
</head>
|
</head>
|
||||||
<body class="noise dark:text-gray-200 text-gray-700 font-sans antialiased">
|
<body class="noise dark:text-gray-200 text-gray-700 font-sans antialiased">
|
||||||
|
|
||||||
<nav class="sidebar">
|
|
||||||
<div class="sidebar-logo">WA</div>
|
|
||||||
<div class="sidebar-nav">
|
|
||||||
<a href="/" class="sidebar-link" title="Главная"><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 12l8.954-8.955c.44-.439 1.152-.439 1.591 0L21.75 12M4.5 9.75v10.125c0 .621.504 1.125 1.125 1.125H9.75v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21h4.125c.621 0 1.125-.504 1.125-1.125V9.75M8.25 21h8.25"/></svg></a>
|
|
||||||
<a href="/compress" class="sidebar-link" title="Картинки"><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></a>
|
|
||||||
<a href="/md" class="sidebar-link" title="Markdown"><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></a>
|
|
||||||
<a href="/placeholder" class="sidebar-link" title="Placeholder"><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></a>
|
|
||||||
<a href="/parser" class="sidebar-link" title="Parser"><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></a>
|
|
||||||
<a href="/password" class="sidebar-link" title="Password"><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></a>
|
|
||||||
<a href="/sanitizer" class="sidebar-link" title="Sanitizer"><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></a>
|
|
||||||
<a href="/converter" class="sidebar-link active" title="Converter"><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></a>
|
|
||||||
<a href="/formatter" class="sidebar-link" title="Formatter"><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></a>
|
|
||||||
<a href="/editor" class="sidebar-link" title="Editor"><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></a>
|
|
||||||
<a href="/httpclient" class="sidebar-link" title="HTTP Client">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/redirects" class="sidebar-link" title="Redirect Analyzer">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/svgeditor" class="sidebar-link" title="SVG Редактор">
|
|
||||||
<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.53 16.122a3 3 0 00-5.78 1.128 2.25 2.25 0 01-2.4 2.245 4.5 4.5 0 008.4-2.245c0-.399-.078-.78-.22-1.128zm0 0a15.998 15.998 0 003.388-1.62m-5.043-.025a15.994 15.994 0 011.622-3.395m3.42 3.42a15.995 15.995 0 004.764-4.648l3.876-5.814a1.151 1.151 0 00-1.597-1.597L14.146 6.32a15.996 15.996 0 00-4.649 4.763m3.42 3.42a6.776 6.776 0 00-3.42-3.42"/></svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="sidebar-bottom">
|
|
||||||
<div class="theme-toggle" id="themeToggle" title="Переключить тему">
|
|
||||||
<div class="theme-toggle-knob">
|
|
||||||
<svg class="w-3 h-3 dark:hidden text-amber-500" fill="currentColor" viewBox="0 0 20 20"><path d="M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414zm2.12-10.607a1 1 0 010 1.414l-.706.707a1 1 0 11-1.414-1.414l.707-.707a1 1 0 011.414 0zM17 11a1 1 0 100-2h-1a1 1 0 100 2h1zm-7 4a1 1 0 011 1v1a1 1 0 11-2 0v-1a1 1 0 011-1zM5.05 6.464A1 1 0 106.465 5.05l-.708-.707a1 1 0 00-1.414 1.414l.707.707zm1.414 8.486l-.707.707a1 1 0 01-1.414-1.414l.707-.707a1 1 0 011.414 1.414zM4 11a1 1 0 100-2H3a1 1 0 000 2h1z"/></svg>
|
|
||||||
<svg class="w-3 h-3 hidden dark:block text-gray-400" fill="currentColor" viewBox="0 0 20 20"><path d="M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z"/></svg>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
|
|
||||||
<div class="main-content">
|
<div class="main-content">
|
||||||
<div class="relative z-10 max-w-3xl mx-auto px-4 py-8 sm:py-12">
|
<div class="tool-container relative z-10 max-w-3xl mx-auto px-4 py-8 sm:py-12">
|
||||||
|
|
||||||
<div class="text-center mb-8 fade-up">
|
<div class="page-header 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">
|
<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>
|
||||||
HTML ↔ Markdown
|
HTML ↔ Markdown
|
||||||
@ -103,7 +29,7 @@
|
|||||||
<h1 class="text-3xl sm:text-4xl font-extrabold tracking-tight dark:text-white text-gray-900">
|
<h1 class="text-3xl sm:text-4xl font-extrabold tracking-tight dark:text-white text-gray-900">
|
||||||
Format <span class="text-accent">Converter</span>
|
Format <span class="text-accent">Converter</span>
|
||||||
</h1>
|
</h1>
|
||||||
<p class="mt-2 text-sm dark:text-gray-500 text-gray-400 font-mono">конвертация между HTML и Markdown</p>
|
<p class="description mt-2 text-sm dark:text-gray-500 text-gray-400 font-mono">конвертация между HTML и Markdown</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Tool Toggle -->
|
<!-- Tool Toggle -->
|
||||||
@ -150,15 +76,6 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
const html = document.documentElement;
|
|
||||||
const savedTheme = localStorage.getItem('theme');
|
|
||||||
if (savedTheme) { html.className = savedTheme; }
|
|
||||||
else if (!window.matchMedia('(prefers-color-scheme: dark)').matches) { html.className = ''; }
|
|
||||||
document.getElementById('themeToggle').addEventListener('click', () => {
|
|
||||||
const isDark = html.classList.toggle('dark');
|
|
||||||
localStorage.setItem('theme', isDark ? 'dark' : '');
|
|
||||||
});
|
|
||||||
|
|
||||||
let activeTool = 'htmlToMd';
|
let activeTool = 'htmlToMd';
|
||||||
const $ = id => document.getElementById(id);
|
const $ = id => document.getElementById(id);
|
||||||
|
|
||||||
|
|||||||
@ -1,40 +1,18 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="ru" class="dark">
|
<html lang="ru" class="dark">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>Editor — images.wadevelop.ru</title>
|
<title>Code Editor — WA Dev Tools</title>
|
||||||
<link href="/vendor/fonts.css" rel="stylesheet">
|
<script src="/vendor/tailwind.js"></script>
|
||||||
<link rel="stylesheet" href="/editor.css">
|
<script>window.WA_TOOL_ID = 'editor';</script>
|
||||||
|
<script src="/shared.js"></script>
|
||||||
|
<link href="/vendor/fonts.css" rel="stylesheet">
|
||||||
|
<link href="/shared.css" rel="stylesheet">
|
||||||
|
<link rel="stylesheet" href="/editor.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
<!-- Sidebar -->
|
|
||||||
<nav class="sidebar">
|
|
||||||
<div class="sidebar-logo">WA</div>
|
|
||||||
<div class="sidebar-nav">
|
|
||||||
<a href="/" class="sidebar-link" title="Главная"><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 12l8.954-8.955c.44-.439 1.152-.439 1.591 0L21.75 12M4.5 9.75v10.125c0 .621.504 1.125 1.125 1.125H9.75v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21h4.125c.621 0 1.125-.504 1.125-1.125V9.75M8.25 21h8.25"/></svg></a>
|
|
||||||
<a href="/compress" class="sidebar-link" title="Картинки"><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></a>
|
|
||||||
<a href="/md" class="sidebar-link" title="Markdown"><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></a>
|
|
||||||
<a href="/placeholder" class="sidebar-link" title="Placeholder"><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></a>
|
|
||||||
<a href="/parser" class="sidebar-link" title="Parser"><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></a>
|
|
||||||
<a href="/password" class="sidebar-link" title="Password"><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></a>
|
|
||||||
<a href="/sanitizer" class="sidebar-link" title="Sanitizer"><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></a>
|
|
||||||
<a href="/converter" class="sidebar-link" title="Converter"><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></a>
|
|
||||||
<a href="/formatter" class="sidebar-link" title="Formatter"><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></a>
|
|
||||||
<a href="/editor" class="sidebar-link active" title="Editor"><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></a>
|
|
||||||
<a href="/httpclient" class="sidebar-link" title="HTTP Client">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/redirects" class="sidebar-link" title="Redirect Analyzer">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/svgeditor" class="sidebar-link" title="SVG Редактор">
|
|
||||||
<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.53 16.122a3 3 0 00-5.78 1.128 2.25 2.25 0 01-2.4 2.245 4.5 4.5 0 008.4-2.245c0-.399-.078-.78-.22-1.128zm0 0a15.998 15.998 0 003.388-1.62m-5.043-.025a15.994 15.994 0 011.622-3.395m3.42 3.42a15.995 15.995 0 004.764-4.648l3.876-5.814a1.151 1.151 0 00-1.597-1.597L14.146 6.32a15.996 15.996 0 00-4.649 4.763m3.42 3.42a6.776 6.776 0 00-3.42-3.42"/></svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
|
|
||||||
<!-- Editor -->
|
<!-- Editor -->
|
||||||
<div class="editor-wrap">
|
<div class="editor-wrap">
|
||||||
<!-- Toolbar -->
|
<!-- Toolbar -->
|
||||||
|
|||||||
@ -3,54 +3,13 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>Code Formatter — images.wadevelop.ru</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 src="/shared.js"></script>
|
||||||
<link href="/vendor/fonts.css" rel="stylesheet">
|
<link href="/vendor/fonts.css" rel="stylesheet">
|
||||||
<script>
|
<link href="/shared.css" rel="stylesheet">
|
||||||
tailwind.config = {
|
|
||||||
darkMode: 'class',
|
|
||||||
theme: {
|
|
||||||
extend: {
|
|
||||||
fontFamily: {
|
|
||||||
mono: ['JetBrains Mono', 'monospace'],
|
|
||||||
sans: ['Manrope', 'sans-serif'],
|
|
||||||
},
|
|
||||||
colors: {
|
|
||||||
surface: { 900: '#060c18', 800: '#091020', 700: '#0d1828', 600: '#162040' },
|
|
||||||
accent: { DEFAULT: '#0054e6', dim: '#0043b8', bright: '#6b9fff' },
|
|
||||||
warn: '#ffd600',
|
|
||||||
danger: '#ff5252',
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<style>
|
<style>
|
||||||
.sidebar{position:fixed;top:0;left:0;width:56px;height:100vh;display:flex;flex-direction:column;align-items:center;padding:16px 0 12px;z-index:50;border-right:1px solid var(--surface-600);background:var(--surface-800);backdrop-filter:blur(12px);transition:background .3s,border-color .3s}
|
|
||||||
.sidebar-logo{margin-bottom:24px;color:var(--text-muted);font-size:10px;font-weight:700;letter-spacing:.08em;font-family:'JetBrains Mono',monospace}
|
|
||||||
.sidebar-nav{display:flex;flex-direction:column;gap:6px;flex:1}
|
|
||||||
.sidebar-link{width:40px;height:40px;border-radius:10px;display:flex;align-items:center;justify-content:center;color:var(--text-muted);transition:all .2s;text-decoration:none;position:relative}
|
|
||||||
.sidebar-link:hover{color:var(--text-secondary);background:rgba(255,255,255,.04)}
|
|
||||||
.sidebar-link.active{color:#0054e6;background:rgba(0,84,230,.08)}
|
|
||||||
.sidebar-link.active::before{content:'';position:absolute;left:-8px;top:50%;transform:translateY(-50%);width:3px;height:20px;border-radius:0 3px 3px 0;background:#0054e6}
|
|
||||||
.sidebar-bottom{margin-top:auto;display:flex;flex-direction:column;align-items:center;gap:8px}
|
|
||||||
.main-content{margin-left:56px}
|
|
||||||
@media(max-width:640px){
|
|
||||||
.sidebar{position:fixed;top:auto;bottom:0;left:0;width:100%;height:52px;flex-direction:row;justify-content:center;padding:0 16px;border-right:none;border-top:1px solid var(--surface-600);gap:0}
|
|
||||||
.sidebar-logo{display:none}
|
|
||||||
.sidebar-nav{flex-direction:row;gap:4px;flex:none}
|
|
||||||
.sidebar-bottom{margin-top:0;margin-left:auto;flex-direction:row}
|
|
||||||
.sidebar-link.active::before{left:50%;top:auto;bottom:-6px;transform:translateX(-50%);width:20px;height:3px;border-radius:3px 3px 0 0}
|
|
||||||
.main-content{margin-left:0;padding-bottom:60px}
|
|
||||||
}
|
|
||||||
:root{--bg:#f5f5f7;--bg-grad1:rgba(0,67,184,.04);--bg-grad2:rgba(0,150,60,.03);--surface-800:rgba(255,255,255,0.85);--surface-700:#f0f0f3;--surface-600:#dde0e6;--text-primary:#1a1a2e;--text-secondary:#555;--text-muted:#888;--select-bg:#f0f0f3;--select-color:#1a1a2e}
|
|
||||||
.dark{--bg:#060c18;--bg-grad1:rgba(0,84,230,.03);--bg-grad2:rgba(0,67,184,.02);--surface-800:rgba(9,16,32,0.8);--surface-700:#0d1828;--surface-600:#162040;--text-primary:#fff;--text-secondary:#c0c0c0;--text-muted:#666;--select-bg:#091020;--select-color:#e0e0e0}
|
|
||||||
body{background:var(--bg);background-image:radial-gradient(ellipse at 20% 50%,var(--bg-grad1) 0%,transparent 50%),radial-gradient(ellipse at 80% 20%,var(--bg-grad2) 0%,transparent 50%);min-height:100vh;transition:background .3s}
|
|
||||||
.dark .noise::before{content:'';position:fixed;inset:0;background:url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.03'/%3E%3C/svg%3E");pointer-events:none;z-index:0}
|
|
||||||
.theme-toggle{position:relative;width:44px;height:24px;border-radius:12px;cursor:pointer;transition:background .3s}
|
|
||||||
.dark .theme-toggle{background:#162040}.theme-toggle{background:#dde0e6}
|
|
||||||
.theme-toggle-knob{position:absolute;top:2px;width:20px;height:20px;border-radius:50%;transition:left .3s,background .3s;display:flex;align-items:center;justify-content:center}
|
|
||||||
.dark .theme-toggle-knob{left:22px;background:#0d1828}.theme-toggle-knob{left:2px;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.15)}
|
|
||||||
@keyframes fadeUp{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.fade-up{animation:fadeUp .4s ease-out forwards}.fade-up-delay{animation:fadeUp .4s ease-out .1s forwards;opacity:0}
|
@keyframes fadeUp{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.fade-up{animation:fadeUp .4s ease-out forwards}.fade-up-delay{animation:fadeUp .4s ease-out .1s forwards;opacity:0}
|
||||||
.tool-btn{transition:all .2s}.tool-btn.active{color:#0054e6;background:rgba(0,84,230,.08);border-color:rgba(0,84,230,.3)}
|
.tool-btn{transition:all .2s}.tool-btn.active{color:#0054e6;background:rgba(0,84,230,.08);border-color:rgba(0,84,230,.3)}
|
||||||
textarea{font-family:'JetBrains Mono',monospace;font-size:13px;resize:vertical}
|
textarea{font-family:'JetBrains Mono',monospace;font-size:13px;resize:vertical}
|
||||||
@ -58,43 +17,10 @@
|
|||||||
</head>
|
</head>
|
||||||
<body class="noise dark:text-gray-200 text-gray-700 font-sans antialiased">
|
<body class="noise dark:text-gray-200 text-gray-700 font-sans antialiased">
|
||||||
|
|
||||||
<nav class="sidebar">
|
|
||||||
<div class="sidebar-logo">WA</div>
|
|
||||||
<div class="sidebar-nav">
|
|
||||||
<a href="/" class="sidebar-link" title="Главная"><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 12l8.954-8.955c.44-.439 1.152-.439 1.591 0L21.75 12M4.5 9.75v10.125c0 .621.504 1.125 1.125 1.125H9.75v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21h4.125c.621 0 1.125-.504 1.125-1.125V9.75M8.25 21h8.25"/></svg></a>
|
|
||||||
<a href="/compress" class="sidebar-link" title="Картинки"><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></a>
|
|
||||||
<a href="/md" class="sidebar-link" title="Markdown"><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></a>
|
|
||||||
<a href="/placeholder" class="sidebar-link" title="Placeholder"><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></a>
|
|
||||||
<a href="/parser" class="sidebar-link" title="Parser"><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></a>
|
|
||||||
<a href="/password" class="sidebar-link" title="Password"><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></a>
|
|
||||||
<a href="/sanitizer" class="sidebar-link" title="Sanitizer"><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></a>
|
|
||||||
<a href="/converter" class="sidebar-link" title="Converter"><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></a>
|
|
||||||
<a href="/formatter" class="sidebar-link active" title="Formatter"><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></a>
|
|
||||||
<a href="/editor" class="sidebar-link" title="Editor"><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></a>
|
|
||||||
<a href="/httpclient" class="sidebar-link" title="HTTP Client">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/redirects" class="sidebar-link" title="Redirect Analyzer">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/svgeditor" class="sidebar-link" title="SVG Редактор">
|
|
||||||
<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.53 16.122a3 3 0 00-5.78 1.128 2.25 2.25 0 01-2.4 2.245 4.5 4.5 0 008.4-2.245c0-.399-.078-.78-.22-1.128zm0 0a15.998 15.998 0 003.388-1.62m-5.043-.025a15.994 15.994 0 011.622-3.395m3.42 3.42a15.995 15.995 0 004.764-4.648l3.876-5.814a1.151 1.151 0 00-1.597-1.597L14.146 6.32a15.996 15.996 0 00-4.649 4.763m3.42 3.42a6.776 6.776 0 00-3.42-3.42"/></svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="sidebar-bottom">
|
|
||||||
<div class="theme-toggle" id="themeToggle" title="Переключить тему">
|
|
||||||
<div class="theme-toggle-knob">
|
|
||||||
<svg class="w-3 h-3 dark:hidden text-amber-500" fill="currentColor" viewBox="0 0 20 20"><path d="M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414zm2.12-10.607a1 1 0 010 1.414l-.706.707a1 1 0 11-1.414-1.414l.707-.707a1 1 0 011.414 0zM17 11a1 1 0 100-2h-1a1 1 0 100 2h1zm-7 4a1 1 0 011 1v1a1 1 0 11-2 0v-1a1 1 0 011-1zM5.05 6.464A1 1 0 106.465 5.05l-.708-.707a1 1 0 00-1.414 1.414l.707.707zm1.414 8.486l-.707.707a1 1 0 01-1.414-1.414l.707-.707a1 1 0 011.414 1.414zM4 11a1 1 0 100-2H3a1 1 0 000 2h1z"/></svg>
|
|
||||||
<svg class="w-3 h-3 hidden dark:block text-gray-400" fill="currentColor" viewBox="0 0 20 20"><path d="M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z"/></svg>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
|
|
||||||
<div class="main-content">
|
<div class="main-content">
|
||||||
<div class="relative z-10 max-w-3xl mx-auto px-4 py-8 sm:py-12">
|
<div class="tool-container relative z-10 max-w-3xl mx-auto px-4 py-8 sm:py-12">
|
||||||
|
|
||||||
<div class="text-center mb-8 fade-up">
|
<div class="page-header 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">
|
<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>
|
||||||
CSS · JavaScript
|
CSS · JavaScript
|
||||||
@ -102,7 +28,7 @@
|
|||||||
<h1 class="text-3xl sm:text-4xl font-extrabold tracking-tight dark:text-white text-gray-900">
|
<h1 class="text-3xl sm:text-4xl font-extrabold tracking-tight dark:text-white text-gray-900">
|
||||||
Code <span class="text-accent">Formatter</span>
|
Code <span class="text-accent">Formatter</span>
|
||||||
</h1>
|
</h1>
|
||||||
<p class="mt-2 text-sm dark:text-gray-500 text-gray-400 font-mono">форматирование и beautify кода</p>
|
<p class="description mt-2 text-sm dark:text-gray-500 text-gray-400 font-mono">форматирование и beautify кода</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Tool Toggle -->
|
<!-- Tool Toggle -->
|
||||||
@ -149,15 +75,6 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
const html = document.documentElement;
|
|
||||||
const savedTheme = localStorage.getItem('theme');
|
|
||||||
if (savedTheme) { html.className = savedTheme; }
|
|
||||||
else if (!window.matchMedia('(prefers-color-scheme: dark)').matches) { html.className = ''; }
|
|
||||||
document.getElementById('themeToggle').addEventListener('click', () => {
|
|
||||||
const isDark = html.classList.toggle('dark');
|
|
||||||
localStorage.setItem('theme', isDark ? 'dark' : '');
|
|
||||||
});
|
|
||||||
|
|
||||||
let activeTool = 'css';
|
let activeTool = 'css';
|
||||||
const $ = id => document.getElementById(id);
|
const $ = id => document.getElementById(id);
|
||||||
|
|
||||||
|
|||||||
@ -3,58 +3,14 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>HTTP Client — images.wadevelop.ru</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 src="/shared.js"></script>
|
||||||
<link href="/vendor/fonts.css" rel="stylesheet">
|
<link href="/vendor/fonts.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">
|
||||||
<script>
|
|
||||||
tailwind.config = {
|
|
||||||
darkMode: 'class',
|
|
||||||
theme: {
|
|
||||||
extend: {
|
|
||||||
fontFamily: {
|
|
||||||
mono: ['JetBrains Mono', 'monospace'],
|
|
||||||
sans: ['Manrope', 'sans-serif'],
|
|
||||||
},
|
|
||||||
colors: {
|
|
||||||
surface: { 900: '#060c18', 800: '#091020', 700: '#0d1828', 600: '#162040' },
|
|
||||||
accent: { DEFAULT: '#0054e6', dim: '#0043b8', bright: '#6b9fff' },
|
|
||||||
warn: '#ffd600',
|
|
||||||
danger: '#ff5252',
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<style>
|
<style>
|
||||||
.sidebar{position:fixed;top:0;left:0;width:56px;height:100vh;display:flex;flex-direction:column;align-items:center;padding:16px 0 12px;z-index:50;border-right:1px solid var(--surface-600);background:var(--surface-800);backdrop-filter:blur(12px);transition:background .3s,border-color .3s}
|
|
||||||
.sidebar-logo{margin-bottom:24px;color:var(--text-muted);font-size:10px;font-weight:700;letter-spacing:.08em;font-family:'JetBrains Mono',monospace}
|
|
||||||
.sidebar-nav{display:flex;flex-direction:column;gap:6px;flex:1}
|
|
||||||
.sidebar-link{width:40px;height:40px;border-radius:10px;display:flex;align-items:center;justify-content:center;color:var(--text-muted);transition:all .2s;text-decoration:none;position:relative}
|
|
||||||
.sidebar-link:hover{color:var(--text-secondary);background:rgba(255,255,255,.04)}
|
|
||||||
.sidebar-link.active{color:#0054e6;background:rgba(0,84,230,.08)}
|
|
||||||
.sidebar-link.active::before{content:'';position:absolute;left:-8px;top:50%;transform:translateY(-50%);width:3px;height:20px;border-radius:0 3px 3px 0;background:#0054e6}
|
|
||||||
.sidebar-bottom{margin-top:auto;display:flex;flex-direction:column;align-items:center;gap:8px}
|
|
||||||
.main-content{margin-left:56px}
|
|
||||||
@media(max-width:640px){
|
|
||||||
.sidebar{position:fixed;top:auto;bottom:0;left:0;width:100%;height:52px;flex-direction:row;justify-content:center;padding:0 16px;border-right:none;border-top:1px solid var(--surface-600);gap:0}
|
|
||||||
.sidebar-logo{display:none}
|
|
||||||
.sidebar-nav{flex-direction:row;gap:4px;flex:none}
|
|
||||||
.sidebar-bottom{margin-top:0;margin-left:auto;flex-direction:row}
|
|
||||||
.sidebar-link.active::before{left:50%;top:auto;bottom:-6px;transform:translateX(-50%);width:20px;height:3px;border-radius:3px 3px 0 0}
|
|
||||||
.main-content{margin-left:0;padding-bottom:60px}
|
|
||||||
}
|
|
||||||
:root{--bg:#f5f5f7;--bg-grad1:rgba(0,67,184,.04);--bg-grad2:rgba(0,50,140,.03);--surface-800:rgba(255,255,255,0.85);--surface-700:#f0f0f3;--surface-600:#dde0e6;--text-primary:#1a1a2e;--text-secondary:#555;--text-muted:#888;--select-bg:#fff;--select-color:#1a1a2e}
|
|
||||||
.dark{--bg:#060c18;--bg-grad1:rgba(0,84,230,.03);--bg-grad2:rgba(0,67,184,.02);--surface-800:rgba(9,16,32,0.8);--surface-700:#0d1828;--surface-600:#162040;--text-primary:#fff;--text-secondary:#c0c0c0;--text-muted:#666;--select-bg:#091020;--select-color:#e0e0e0}
|
|
||||||
body{background:var(--bg);background-image:radial-gradient(ellipse at 20% 50%,var(--bg-grad1) 0%,transparent 50%),radial-gradient(ellipse at 80% 20%,var(--bg-grad2) 0%,transparent 50%);min-height:100vh;transition:background .3s}
|
|
||||||
.dark .noise::before{content:'';position:fixed;inset:0;background:url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.03'/%3E%3C/svg%3E");pointer-events:none;z-index:0}
|
|
||||||
.theme-toggle{position:relative;width:44px;height:24px;border-radius:12px;cursor:pointer;transition:background .3s}
|
|
||||||
.dark .theme-toggle{background:#162040}
|
|
||||||
.theme-toggle{background:#dde0e6}
|
|
||||||
.theme-toggle-knob{position:absolute;top:2px;width:20px;height:20px;border-radius:50%;transition:left .3s,background .3s;display:flex;align-items:center;justify-content:center}
|
|
||||||
.dark .theme-toggle-knob{left:22px;background:#0d1828}
|
|
||||||
.theme-toggle-knob{left:2px;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.15)}
|
|
||||||
|
|
||||||
/* HTTP Client UI */
|
/* HTTP Client UI */
|
||||||
.panel {
|
.panel {
|
||||||
background: var(--surface-800);
|
background: var(--surface-800);
|
||||||
@ -259,73 +215,15 @@
|
|||||||
</head>
|
</head>
|
||||||
<body class="noise dark:text-gray-200 text-gray-700 font-sans antialiased">
|
<body class="noise dark:text-gray-200 text-gray-700 font-sans antialiased">
|
||||||
|
|
||||||
<!-- Sidebar -->
|
|
||||||
<nav class="sidebar">
|
|
||||||
<div class="sidebar-logo">WA</div>
|
|
||||||
<div class="sidebar-nav">
|
|
||||||
<a href="/" class="sidebar-link" title="Главная">
|
|
||||||
<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 12l8.954-8.955c.44-.439 1.152-.439 1.591 0L21.75 12M4.5 9.75v10.125c0 .621.504 1.125 1.125 1.125H9.75v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21h4.125c.621 0 1.125-.504 1.125-1.125V9.75M8.25 21h8.25"/></svg>
|
|
||||||
</a>
|
|
||||||
<a href="/compress" class="sidebar-link" title="Картинки">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/md" class="sidebar-link" title="Markdown">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/placeholder" class="sidebar-link" title="Placeholder">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/parser" class="sidebar-link" title="Parser">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/password" class="sidebar-link" title="Password">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/sanitizer" class="sidebar-link" title="Sanitizer">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/converter" class="sidebar-link" title="Converter">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/formatter" class="sidebar-link" title="Formatter">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/editor" class="sidebar-link" title="Editor">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/httpclient" class="sidebar-link active" title="HTTP Client">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/redirects" class="sidebar-link" title="Redirect Analyzer">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/svgeditor" class="sidebar-link" title="SVG Редактор">
|
|
||||||
<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.53 16.122a3 3 0 00-5.78 1.128 2.25 2.25 0 01-2.4 2.245 4.5 4.5 0 008.4-2.245c0-.399-.078-.78-.22-1.128zm0 0a15.998 15.998 0 003.388-1.62m-5.043-.025a15.994 15.994 0 011.622-3.395m3.42 3.42a15.995 15.995 0 004.764-4.648l3.876-5.814a1.151 1.151 0 00-1.597-1.597L14.146 6.32a15.996 15.996 0 00-4.649 4.763m3.42 3.42a6.776 6.776 0 00-3.42-3.42"/></svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="sidebar-bottom">
|
|
||||||
<div class="theme-toggle" id="themeToggle" title="Переключить тему">
|
|
||||||
<div class="theme-toggle-knob">
|
|
||||||
<svg class="w-3 h-3 dark:hidden text-amber-500" fill="currentColor" viewBox="0 0 20 20"><path d="M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414zm2.12-10.607a1 1 0 010 1.414l-.706.707a1 1 0 11-1.414-1.414l.707-.707a1 1 0 011.414 0zM17 11a1 1 0 100-2h-1a1 1 0 100 2h1zm-7 4a1 1 0 011 1v1a1 1 0 11-2 0v-1a1 1 0 011-1zM5.05 6.464A1 1 0 106.465 5.05l-.708-.707a1 1 0 00-1.414 1.414l.707.707zm1.414 8.486l-.707.707a1 1 0 01-1.414-1.414l.707-.707a1 1 0 011.414 1.414zM4 11a1 1 0 100-2H3a1 1 0 000 2h1z"/></svg>
|
|
||||||
<svg class="w-3 h-3 hidden dark:block text-gray-400" fill="currentColor" viewBox="0 0 20 20"><path d="M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z"/></svg>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
|
|
||||||
<div class="main-content">
|
<div class="main-content">
|
||||||
<div class="relative z-10 max-w-7xl mx-auto px-4 py-6">
|
<div class="tool-container relative z-10 max-w-7xl mx-auto px-4">
|
||||||
|
|
||||||
<!-- Header -->
|
<!-- Header -->
|
||||||
<div class="mb-8 text-center">
|
<div class="page-header">
|
||||||
<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>
|
|
||||||
GET · POST · PUT · DELETE
|
|
||||||
</div>
|
|
||||||
<h1 class="text-3xl sm:text-4xl font-extrabold tracking-tight dark:text-white text-gray-900">
|
<h1 class="text-3xl sm:text-4xl font-extrabold tracking-tight dark:text-white text-gray-900">
|
||||||
HTTP <span class="text-accent">Клиент</span>
|
HTTP <span class="text-accent">Клиент</span>
|
||||||
</h1>
|
</h1>
|
||||||
<p class="mt-2 text-sm dark:text-gray-500 text-gray-400 font-mono">тест API запросов</p>
|
<p class="description mt-2 text-sm dark:text-gray-500 text-gray-400 font-mono">тест API запросов</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- URL Bar -->
|
<!-- URL Bar -->
|
||||||
@ -465,16 +363,6 @@
|
|||||||
<script src="/vendor/highlight.min.js"></script>
|
<script src="/vendor/highlight.min.js"></script>
|
||||||
<script>
|
<script>
|
||||||
(() => {
|
(() => {
|
||||||
// Theme
|
|
||||||
const html = document.documentElement;
|
|
||||||
const savedTheme = localStorage.getItem('theme');
|
|
||||||
if (savedTheme) html.className = savedTheme;
|
|
||||||
else if (!window.matchMedia('(prefers-color-scheme: dark)').matches) html.className = '';
|
|
||||||
document.getElementById('themeToggle').addEventListener('click', () => {
|
|
||||||
const isDark = html.classList.toggle('dark');
|
|
||||||
localStorage.setItem('theme', isDark ? 'dark' : '');
|
|
||||||
});
|
|
||||||
|
|
||||||
// State
|
// State
|
||||||
let reqTabs = {}, resTabs = {};
|
let reqTabs = {}, resTabs = {};
|
||||||
let isLoading = false;
|
let isLoading = false;
|
||||||
@ -568,7 +456,7 @@
|
|||||||
document.getElementById('urlInput').value = url;
|
document.getElementById('urlInput').value = url;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Params → append to URL
|
// Params -> append to URL
|
||||||
const params = getKvRows(paramsRows);
|
const params = getKvRows(paramsRows);
|
||||||
if (Object.keys(params).length > 0) {
|
if (Object.keys(params).length > 0) {
|
||||||
try {
|
try {
|
||||||
|
|||||||
@ -5,102 +5,11 @@
|
|||||||
<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"></script>
|
||||||
<link href="/vendor/fonts.css" rel="stylesheet">
|
<link href="/vendor/fonts.css" rel="stylesheet">
|
||||||
<script>
|
<link href="/shared.css" rel="stylesheet">
|
||||||
tailwind.config = {
|
<script>window.WA_TOOL_ID = 'home';</script>
|
||||||
darkMode: 'class',
|
|
||||||
theme: {
|
|
||||||
extend: {
|
|
||||||
fontFamily: {
|
|
||||||
mono: ['JetBrains Mono', 'monospace'],
|
|
||||||
sans: ['Manrope', 'sans-serif'],
|
|
||||||
},
|
|
||||||
colors: {
|
|
||||||
surface: { 900: '#060c18', 800: '#091020', 700: '#0d1828', 600: '#162040' },
|
|
||||||
accent: { DEFAULT: '#0054e6', dim: '#0043b8', bright: '#6b9fff' },
|
|
||||||
warn: '#ffd600',
|
|
||||||
danger: '#ff5252',
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<style>
|
<style>
|
||||||
/* Sidebar */
|
|
||||||
.sidebar{position:fixed;top:0;left:0;width:56px;height:100vh;display:flex;flex-direction:column;align-items:center;padding:16px 0 12px;z-index:50;border-right:1px solid var(--surface-600);background:var(--surface-800);backdrop-filter:blur(12px);transition:background .3s,border-color .3s}
|
|
||||||
.sidebar-logo{margin-bottom:24px;color:var(--text-muted);font-size:10px;font-weight:700;letter-spacing:.08em;font-family:'JetBrains Mono',monospace}
|
|
||||||
.sidebar-nav{display:flex;flex-direction:column;gap:6px;flex:1}
|
|
||||||
.sidebar-link{width:40px;height:40px;border-radius:10px;display:flex;align-items:center;justify-content:center;color:var(--text-muted);transition:all .2s;text-decoration:none;position:relative}
|
|
||||||
.sidebar-link:hover{color:var(--text-secondary);background:rgba(255,255,255,.04)}
|
|
||||||
.sidebar-link.active{color:#0054e6;background:rgba(0,84,230,.08)}
|
|
||||||
.sidebar-link.active::before{content:'';position:absolute;left:-8px;top:50%;transform:translateY(-50%);width:3px;height:20px;border-radius:0 3px 3px 0;background:#0054e6}
|
|
||||||
.sidebar-bottom{margin-top:auto;display:flex;flex-direction:column;align-items:center;gap:8px}
|
|
||||||
.main-content{margin-left:56px}
|
|
||||||
|
|
||||||
/* Mobile bottom bar */
|
|
||||||
@media(max-width:640px){
|
|
||||||
.sidebar{position:fixed;top:auto;bottom:0;left:0;width:100%;height:52px;flex-direction:row;justify-content:center;padding:0 16px;border-right:none;border-top:1px solid var(--surface-600);gap:0}
|
|
||||||
.sidebar-logo{display:none}
|
|
||||||
.sidebar-nav{flex-direction:row;gap:4px;flex:none}
|
|
||||||
.sidebar-bottom{margin-top:0;margin-left:auto;flex-direction:row}
|
|
||||||
.sidebar-link.active::before{left:50%;top:auto;bottom:-6px;transform:translateX(-50%);width:20px;height:3px;border-radius:3px 3px 0 0}
|
|
||||||
.main-content{margin-left:0;padding-bottom:60px}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Theme variables */
|
|
||||||
:root {
|
|
||||||
--bg: #f5f5f7;
|
|
||||||
--bg-grad1: rgba(0, 67, 184, 0.04);
|
|
||||||
--bg-grad2: rgba(0, 50, 140, 0.03);
|
|
||||||
--surface-800: rgba(255,255,255,0.85);
|
|
||||||
--surface-700: #f0f0f3;
|
|
||||||
--surface-600: #dde0e6;
|
|
||||||
--text-primary: #1a1a2e;
|
|
||||||
--text-secondary: #555;
|
|
||||||
--text-muted: #888;
|
|
||||||
--bar-bg: #e0e0e0;
|
|
||||||
--select-bg: #f0f0f3;
|
|
||||||
--select-color: #1a1a2e;
|
|
||||||
}
|
|
||||||
.dark {
|
|
||||||
--bg: #060c18;
|
|
||||||
--bg-grad1: rgba(0, 84, 230, 0.03);
|
|
||||||
--bg-grad2: rgba(0, 67, 184, 0.02);
|
|
||||||
--surface-800: rgba(9,16,32,0.8);
|
|
||||||
--surface-700: #0d1828;
|
|
||||||
--surface-600: #162040;
|
|
||||||
--text-primary: #fff;
|
|
||||||
--text-secondary: #c0c0c0;
|
|
||||||
--text-muted: #666;
|
|
||||||
--bar-bg: #0d1828;
|
|
||||||
--select-bg: #091020;
|
|
||||||
--select-color: #e0e0e0;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
background: var(--bg);
|
|
||||||
background-image:
|
|
||||||
radial-gradient(ellipse at 20% 50%, var(--bg-grad1) 0%, transparent 50%),
|
|
||||||
radial-gradient(ellipse at 80% 20%, var(--bg-grad2) 0%, transparent 50%);
|
|
||||||
min-height: 100vh;
|
|
||||||
transition: background 0.3s;
|
|
||||||
}
|
|
||||||
.dark .noise::before {
|
|
||||||
content: '';
|
|
||||||
position: fixed;
|
|
||||||
inset: 0;
|
|
||||||
background: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.03'/%3E%3C/svg%3E");
|
|
||||||
pointer-events: none;
|
|
||||||
z-index: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Theme toggle */
|
|
||||||
.theme-toggle { position: relative; width: 44px; height: 24px; border-radius: 12px; cursor: pointer; transition: background 0.3s; }
|
|
||||||
.dark .theme-toggle { background: #162040; }
|
|
||||||
.theme-toggle { background: #dde0e6; }
|
|
||||||
.theme-toggle-knob { position: absolute; top: 2px; width: 20px; height: 20px; border-radius: 50%; transition: left 0.3s, background 0.3s; display: flex; align-items: center; justify-content: center; }
|
|
||||||
.dark .theme-toggle-knob { left: 22px; background: #0d1828; }
|
|
||||||
.theme-toggle-knob { left: 2px; background: #fff; box-shadow: 0 1px 3px rgba(0,0,0,0.15); }
|
|
||||||
|
|
||||||
@keyframes fadeUp { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: translateY(0); } }
|
@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 { animation: fadeUp 0.4s ease-out forwards; }
|
||||||
.fade-up-delay { animation: fadeUp 0.4s ease-out 0.1s forwards; opacity: 0; }
|
.fade-up-delay { animation: fadeUp 0.4s ease-out 0.1s forwards; opacity: 0; }
|
||||||
@ -142,73 +51,17 @@
|
|||||||
</head>
|
</head>
|
||||||
<body class="noise dark:text-gray-200 text-gray-700 font-sans antialiased">
|
<body class="noise dark:text-gray-200 text-gray-700 font-sans antialiased">
|
||||||
|
|
||||||
<!-- Sidebar -->
|
|
||||||
<nav class="sidebar">
|
|
||||||
<div class="sidebar-logo">WA</div>
|
|
||||||
<div class="sidebar-nav">
|
|
||||||
<a href="/" class="sidebar-link active" title="Главная">
|
|
||||||
<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 12l8.954-8.955c.44-.439 1.152-.439 1.591 0L21.75 12M4.5 9.75v10.125c0 .621.504 1.125 1.125 1.125H9.75v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21h4.125c.621 0 1.125-.504 1.125-1.125V9.75M8.25 21h8.25"/></svg>
|
|
||||||
</a>
|
|
||||||
<a href="/compress" class="sidebar-link" title="Картинки">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/md" class="sidebar-link" title="Markdown">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/placeholder" class="sidebar-link" title="Placeholder">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/parser" class="sidebar-link" title="Parser">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/password" class="sidebar-link" title="Password">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/sanitizer" class="sidebar-link" title="Sanitizer">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/converter" class="sidebar-link" title="Converter">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/formatter" class="sidebar-link" title="Formatter">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/editor" class="sidebar-link" title="Editor">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/httpclient" class="sidebar-link" title="HTTP Client">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/redirects" class="sidebar-link" title="Redirect Analyzer">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/svgeditor" class="sidebar-link" title="SVG Редактор">
|
|
||||||
<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.53 16.122a3 3 0 00-5.78 1.128 2.25 2.25 0 01-2.4 2.245 4.5 4.5 0 008.4-2.245c0-.399-.078-.78-.22-1.128zm0 0a15.998 15.998 0 003.388-1.62m-5.043-.025a15.994 15.994 0 011.622-3.395m3.42 3.42a15.995 15.995 0 004.764-4.648l3.876-5.814a1.151 1.151 0 00-1.597-1.597L14.146 6.32a15.996 15.996 0 00-4.649 4.763m3.42 3.42a6.776 6.776 0 00-3.42-3.42"/></svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="sidebar-bottom">
|
|
||||||
<div class="theme-toggle" id="themeToggle" title="Переключить тему">
|
|
||||||
<div class="theme-toggle-knob">
|
|
||||||
<svg class="w-3 h-3 dark:hidden text-amber-500" fill="currentColor" viewBox="0 0 20 20"><path d="M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414zm2.12-10.607a1 1 0 010 1.414l-.706.707a1 1 0 11-1.414-1.414l.707-.707a1 1 0 011.414 0zM17 11a1 1 0 100-2h-1a1 1 0 100 2h1zm-7 4a1 1 0 011 1v1a1 1 0 11-2 0v-1a1 1 0 011-1zM5.05 6.464A1 1 0 106.465 5.05l-.708-.707a1 1 0 00-1.414 1.414l.707.707zm1.414 8.486l-.707.707a1 1 0 01-1.414-1.414l.707-.707a1 1 0 011.414 1.414zM4 11a1 1 0 100-2H3a1 1 0 000 2h1z"/></svg>
|
|
||||||
<svg class="w-3 h-3 hidden dark:block text-gray-400" fill="currentColor" viewBox="0 0 20 20"><path d="M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z"/></svg>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
|
|
||||||
<div class="main-content">
|
<div class="main-content">
|
||||||
<div class="relative z-10 max-w-5xl mx-auto px-4 py-8 sm:py-12">
|
<div class="tool-container relative z-10 max-w-5xl mx-auto py-8 sm:py-12">
|
||||||
|
|
||||||
<!-- Header -->
|
<!-- Header -->
|
||||||
<div class="mb-10 fade-up">
|
<div class="mb-10 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">
|
<div class="page-header">
|
||||||
<span class="w-1.5 h-1.5 rounded-full bg-accent animate-pulse"></span>
|
<h1 class="text-3xl sm:text-4xl font-extrabold tracking-tight dark:text-white text-gray-900">
|
||||||
images.wadevelop.ru
|
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>
|
||||||
<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="mt-2 text-sm dark:text-gray-500 text-gray-400 font-mono">Инструменты разработчика</p>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Tools Grid -->
|
<!-- Tools Grid -->
|
||||||
@ -339,17 +192,5 @@
|
|||||||
</div>
|
</div>
|
||||||
</div><!-- /main-content -->
|
</div><!-- /main-content -->
|
||||||
|
|
||||||
<script>
|
|
||||||
// Theme toggle
|
|
||||||
const html = document.documentElement;
|
|
||||||
const savedTheme = localStorage.getItem('theme');
|
|
||||||
if (savedTheme) { html.className = savedTheme; }
|
|
||||||
else if (!window.matchMedia('(prefers-color-scheme: dark)').matches) { html.className = ''; }
|
|
||||||
|
|
||||||
document.getElementById('themeToggle').addEventListener('click', () => {
|
|
||||||
const isDark = html.classList.toggle('dark');
|
|
||||||
localStorage.setItem('theme', isDark ? 'dark' : '');
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
179
public/md.html
179
public/md.html
@ -3,99 +3,16 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>Markdown Viewer</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 src="/shared.js"></script>
|
||||||
<link href="/vendor/fonts.css" rel="stylesheet">
|
<link href="/vendor/fonts.css" rel="stylesheet">
|
||||||
|
<link href="/shared.css" rel="stylesheet">
|
||||||
<script src="/vendor/marked.min.js"></script>
|
<script src="/vendor/marked.min.js"></script>
|
||||||
<script src="/vendor/highlight.min.js"></script>
|
<script src="/vendor/highlight.min.js"></script>
|
||||||
<link id="hljsTheme" href="/vendor/hljs-github-dark.css" rel="stylesheet">
|
<link id="hljsTheme" href="/vendor/hljs-github-dark.css" rel="stylesheet">
|
||||||
<script>
|
|
||||||
tailwind.config = {
|
|
||||||
darkMode: 'class',
|
|
||||||
theme: {
|
|
||||||
extend: {
|
|
||||||
fontFamily: {
|
|
||||||
mono: ['JetBrains Mono', 'monospace'],
|
|
||||||
sans: ['Manrope', 'sans-serif'],
|
|
||||||
},
|
|
||||||
colors: {
|
|
||||||
surface: { 900: '#060c18', 800: '#091020', 700: '#0d1828', 600: '#162040' },
|
|
||||||
accent: { DEFAULT: '#0054e6', dim: '#0043b8', bright: '#6b9fff' },
|
|
||||||
warn: '#ffd600',
|
|
||||||
danger: '#ff5252',
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<style>
|
<style>
|
||||||
/* Sidebar */
|
|
||||||
.sidebar{position:fixed;top:0;left:0;width:56px;height:100vh;display:flex;flex-direction:column;align-items:center;padding:16px 0 12px;z-index:50;border-right:1px solid var(--surface-600);background:var(--surface-800);backdrop-filter:blur(12px);transition:background .3s,border-color .3s}
|
|
||||||
.sidebar-logo{margin-bottom:24px;color:var(--text-muted);font-size:10px;font-weight:700;letter-spacing:.08em;font-family:'JetBrains Mono',monospace}
|
|
||||||
.sidebar-nav{display:flex;flex-direction:column;gap:6px;flex:1}
|
|
||||||
.sidebar-link{width:40px;height:40px;border-radius:10px;display:flex;align-items:center;justify-content:center;color:var(--text-muted);transition:all .2s;text-decoration:none;position:relative}
|
|
||||||
.sidebar-link:hover{color:var(--text-secondary);background:rgba(255,255,255,.04)}
|
|
||||||
.sidebar-link.active{color:#0054e6;background:rgba(0,84,230,.08)}
|
|
||||||
.sidebar-link.active::before{content:'';position:absolute;left:-8px;top:50%;transform:translateY(-50%);width:3px;height:20px;border-radius:0 3px 3px 0;background:#0054e6}
|
|
||||||
.sidebar-bottom{margin-top:auto;display:flex;flex-direction:column;align-items:center;gap:8px}
|
|
||||||
.main-content{margin-left:56px}
|
|
||||||
@media(max-width:640px){
|
|
||||||
.sidebar{position:fixed;top:auto;bottom:0;left:0;width:100%;height:52px;flex-direction:row;justify-content:center;padding:0 16px;border-right:none;border-top:1px solid var(--surface-600);gap:0}
|
|
||||||
.sidebar-logo{display:none}
|
|
||||||
.sidebar-nav{flex-direction:row;gap:4px;flex:none}
|
|
||||||
.sidebar-bottom{margin-top:0;margin-left:auto;flex-direction:row}
|
|
||||||
.sidebar-link.active::before{left:50%;top:auto;bottom:-6px;transform:translateX(-50%);width:20px;height:3px;border-radius:3px 3px 0 0}
|
|
||||||
.main-content{margin-left:0;padding-bottom:60px}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Theme variables */
|
|
||||||
:root {
|
|
||||||
--bg: #f5f5f7;
|
|
||||||
--bg-grad1: rgba(0, 67, 184, 0.04);
|
|
||||||
--bg-grad2: rgba(0, 50, 140, 0.03);
|
|
||||||
--surface-800: rgba(255,255,255,0.85);
|
|
||||||
--surface-700: #f0f0f3;
|
|
||||||
--surface-600: #dde0e6;
|
|
||||||
--text-primary: #1a1a2e;
|
|
||||||
--text-secondary: #555;
|
|
||||||
--text-muted: #888;
|
|
||||||
}
|
|
||||||
.dark {
|
|
||||||
--bg: #060c18;
|
|
||||||
--bg-grad1: rgba(0, 84, 230, 0.03);
|
|
||||||
--bg-grad2: rgba(0, 67, 184, 0.02);
|
|
||||||
--surface-800: rgba(9,16,32,0.8);
|
|
||||||
--surface-700: #0d1828;
|
|
||||||
--surface-600: #162040;
|
|
||||||
--text-primary: #fff;
|
|
||||||
--text-secondary: #c0c0c0;
|
|
||||||
--text-muted: #666;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
background: var(--bg);
|
|
||||||
background-image:
|
|
||||||
radial-gradient(ellipse at 20% 50%, var(--bg-grad1) 0%, transparent 50%),
|
|
||||||
radial-gradient(ellipse at 80% 20%, var(--bg-grad2) 0%, transparent 50%);
|
|
||||||
min-height: 100vh;
|
|
||||||
transition: background 0.3s;
|
|
||||||
}
|
|
||||||
.dark .noise::before {
|
|
||||||
content: '';
|
|
||||||
position: fixed;
|
|
||||||
inset: 0;
|
|
||||||
background: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.03'/%3E%3C/svg%3E");
|
|
||||||
pointer-events: none;
|
|
||||||
z-index: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Theme toggle */
|
|
||||||
.theme-toggle { position: relative; width: 44px; height: 24px; border-radius: 12px; cursor: pointer; transition: background 0.3s; }
|
|
||||||
.dark .theme-toggle { background: #162040; }
|
|
||||||
.theme-toggle { background: #dde0e6; }
|
|
||||||
.theme-toggle-knob { position: absolute; top: 2px; width: 20px; height: 20px; border-radius: 50%; transition: left 0.3s, background 0.3s; display: flex; align-items: center; justify-content: center; }
|
|
||||||
.dark .theme-toggle-knob { left: 22px; background: #0d1828; }
|
|
||||||
.theme-toggle-knob { left: 2px; background: #fff; box-shadow: 0 1px 3px rgba(0,0,0,0.15); }
|
|
||||||
|
|
||||||
/* Dropzone */
|
/* Dropzone */
|
||||||
.md-dropzone { border: 2px dashed var(--surface-600); transition: all .3s; }
|
.md-dropzone { border: 2px dashed var(--surface-600); transition: all .3s; }
|
||||||
.md-dropzone.active { border-color: #0054e6; background: rgba(0,84,230,.05); }
|
.md-dropzone.active { border-color: #0054e6; background: rgba(0,84,230,.05); }
|
||||||
@ -126,10 +43,6 @@
|
|||||||
.md-output hr { border: none; border-top: 1px solid var(--surface-600); margin: 1.5em 0; }
|
.md-output hr { border: none; border-top: 1px solid var(--surface-600); margin: 1.5em 0; }
|
||||||
.md-output img { max-width: 100%; border-radius: 8px; margin: .8em 0; }
|
.md-output img { max-width: 100%; border-radius: 8px; margin: .8em 0; }
|
||||||
|
|
||||||
@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; }
|
|
||||||
|
|
||||||
/* Tabs */
|
/* Tabs */
|
||||||
.tab-btn { transition: all .2s; }
|
.tab-btn { transition: all .2s; }
|
||||||
.tab-btn.active { color: #0054e6; border-color: #0054e6; }
|
.tab-btn.active { color: #0054e6; border-color: #0054e6; }
|
||||||
@ -137,62 +50,8 @@
|
|||||||
</head>
|
</head>
|
||||||
<body class="noise dark:text-gray-200 text-gray-700 font-sans antialiased">
|
<body class="noise dark:text-gray-200 text-gray-700 font-sans antialiased">
|
||||||
|
|
||||||
<!-- Sidebar -->
|
|
||||||
<nav class="sidebar">
|
|
||||||
<div class="sidebar-logo">WA</div>
|
|
||||||
<div class="sidebar-nav">
|
|
||||||
<a href="/" class="sidebar-link" title="Главная">
|
|
||||||
<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 12l8.954-8.955c.44-.439 1.152-.439 1.591 0L21.75 12M4.5 9.75v10.125c0 .621.504 1.125 1.125 1.125H9.75v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21h4.125c.621 0 1.125-.504 1.125-1.125V9.75M8.25 21h8.25"/></svg>
|
|
||||||
</a>
|
|
||||||
<a href="/compress" class="sidebar-link" title="Картинки">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/md" class="sidebar-link active" title="Markdown">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/placeholder" class="sidebar-link" title="Placeholder">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/parser" class="sidebar-link" title="Parser">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/password" class="sidebar-link" title="Password">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/sanitizer" class="sidebar-link" title="Sanitizer">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/converter" class="sidebar-link" title="Converter">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/formatter" class="sidebar-link" title="Formatter">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/editor" class="sidebar-link" title="Editor">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/httpclient" class="sidebar-link" title="HTTP Client">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/redirects" class="sidebar-link" title="Redirect Analyzer">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/svgeditor" class="sidebar-link" title="SVG Редактор">
|
|
||||||
<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.53 16.122a3 3 0 00-5.78 1.128 2.25 2.25 0 01-2.4 2.245 4.5 4.5 0 008.4-2.245c0-.399-.078-.78-.22-1.128zm0 0a15.998 15.998 0 003.388-1.62m-5.043-.025a15.994 15.994 0 011.622-3.395m3.42 3.42a15.995 15.995 0 004.764-4.648l3.876-5.814a1.151 1.151 0 00-1.597-1.597L14.146 6.32a15.996 15.996 0 00-4.649 4.763m3.42 3.42a6.776 6.776 0 00-3.42-3.42"/></svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="sidebar-bottom">
|
|
||||||
<div class="theme-toggle" id="themeToggle" title="Переключить тему">
|
|
||||||
<div class="theme-toggle-knob">
|
|
||||||
<svg class="w-3 h-3 dark:hidden text-amber-500" fill="currentColor" viewBox="0 0 20 20"><path d="M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414zm2.12-10.607a1 1 0 010 1.414l-.706.707a1 1 0 11-1.414-1.414l.707-.707a1 1 0 011.414 0zM17 11a1 1 0 100-2h-1a1 1 0 100 2h1zm-7 4a1 1 0 011 1v1a1 1 0 11-2 0v-1a1 1 0 011-1zM5.05 6.464A1 1 0 106.465 5.05l-.708-.707a1 1 0 00-1.414 1.414l.707.707zm1.414 8.486l-.707.707a1 1 0 01-1.414-1.414l.707-.707a1 1 0 011.414 1.414zM4 11a1 1 0 100-2H3a1 1 0 000 2h1z"/></svg>
|
|
||||||
<svg class="w-3 h-3 hidden dark:block text-gray-400" fill="currentColor" viewBox="0 0 20 20"><path d="M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z"/></svg>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
|
|
||||||
<div class="main-content">
|
<div class="main-content">
|
||||||
<div class="relative z-10 max-w-4xl mx-auto px-4 py-8 sm:py-12">
|
<div class="tool-container relative z-10 max-w-4xl mx-auto">
|
||||||
|
|
||||||
<!-- Header -->
|
<!-- Header -->
|
||||||
<div class="text-center mb-8 fade-up">
|
<div class="text-center mb-8 fade-up">
|
||||||
@ -200,10 +59,12 @@
|
|||||||
<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>
|
||||||
MD Viewer
|
MD Viewer
|
||||||
</div>
|
</div>
|
||||||
<h1 class="text-3xl sm:text-4xl font-extrabold tracking-tight dark:text-white text-gray-900">
|
<div class="page-header">
|
||||||
Просмотр <span class="text-accent">Markdown</span>
|
<h1 class="text-3xl sm:text-4xl font-extrabold tracking-tight dark:text-white text-gray-900">
|
||||||
</h1>
|
Просмотр <span class="text-accent">Markdown</span>
|
||||||
<p class="mt-2 text-sm dark:text-gray-500 text-gray-400 font-mono">drag-drop файл или вставьте текст</p>
|
</h1>
|
||||||
|
<p class="description mt-2 text-sm dark:text-gray-500 text-gray-400 font-mono">drag-drop файл или вставьте текст</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Input Card -->
|
<!-- Input Card -->
|
||||||
@ -269,23 +130,17 @@
|
|||||||
</div><!-- /main-content -->
|
</div><!-- /main-content -->
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
// Theme
|
|
||||||
const html = document.documentElement;
|
|
||||||
const savedTheme = localStorage.getItem('theme');
|
|
||||||
if (savedTheme) { html.className = savedTheme; }
|
|
||||||
else if (!window.matchMedia('(prefers-color-scheme: dark)').matches) { html.className = ''; }
|
|
||||||
|
|
||||||
function applyHljsTheme() {
|
function applyHljsTheme() {
|
||||||
const isDark = html.classList.contains('dark');
|
const isDark = document.documentElement.classList.contains('dark');
|
||||||
document.getElementById('hljsTheme').href = isDark ? '/vendor/hljs-github-dark.css' : '/vendor/hljs-github.css';
|
document.getElementById('hljsTheme').href = isDark ? '/vendor/hljs-github-dark.css' : '/vendor/hljs-github.css';
|
||||||
}
|
}
|
||||||
applyHljsTheme();
|
applyHljsTheme();
|
||||||
|
|
||||||
document.getElementById('themeToggle').addEventListener('click', () => {
|
// Listen for theme changes from shared.js
|
||||||
const isDark = html.classList.toggle('dark');
|
document.addEventListener('themeChanged', applyHljsTheme);
|
||||||
localStorage.setItem('theme', isDark ? 'dark' : '');
|
// Also observe class changes on html element for theme toggle
|
||||||
applyHljsTheme();
|
const observer = new MutationObserver(applyHljsTheme);
|
||||||
});
|
observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] });
|
||||||
|
|
||||||
// Tabs
|
// Tabs
|
||||||
document.querySelectorAll('.tab-btn').forEach(btn => {
|
document.querySelectorAll('.tab-btn').forEach(btn => {
|
||||||
|
|||||||
@ -3,101 +3,13 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>URL Parser — images.wadevelop.ru</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 src="/shared.js"></script>
|
||||||
<link href="/vendor/fonts.css" rel="stylesheet">
|
<link href="/vendor/fonts.css" rel="stylesheet">
|
||||||
<script>
|
<link href="/shared.css" rel="stylesheet">
|
||||||
tailwind.config = {
|
|
||||||
darkMode: 'class',
|
|
||||||
theme: {
|
|
||||||
extend: {
|
|
||||||
fontFamily: {
|
|
||||||
mono: ['JetBrains Mono', 'monospace'],
|
|
||||||
sans: ['Manrope', 'sans-serif'],
|
|
||||||
},
|
|
||||||
colors: {
|
|
||||||
surface: { 900: '#060c18', 800: '#091020', 700: '#0d1828', 600: '#162040' },
|
|
||||||
accent: { DEFAULT: '#0054e6', dim: '#0043b8', bright: '#6b9fff' },
|
|
||||||
warn: '#ffd600',
|
|
||||||
danger: '#ff5252',
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<style>
|
<style>
|
||||||
/* Sidebar */
|
|
||||||
.sidebar{position:fixed;top:0;left:0;width:56px;height:100vh;display:flex;flex-direction:column;align-items:center;padding:16px 0 12px;z-index:50;border-right:1px solid var(--surface-600);background:var(--surface-800);backdrop-filter:blur(12px);transition:background .3s,border-color .3s}
|
|
||||||
.sidebar-logo{margin-bottom:24px;color:var(--text-muted);font-size:10px;font-weight:700;letter-spacing:.08em;font-family:'JetBrains Mono',monospace}
|
|
||||||
.sidebar-nav{display:flex;flex-direction:column;gap:6px;flex:1}
|
|
||||||
.sidebar-link{width:40px;height:40px;border-radius:10px;display:flex;align-items:center;justify-content:center;color:var(--text-muted);transition:all .2s;text-decoration:none;position:relative}
|
|
||||||
.sidebar-link:hover{color:var(--text-secondary);background:rgba(255,255,255,.04)}
|
|
||||||
.sidebar-link.active{color:#0054e6;background:rgba(0,84,230,.08)}
|
|
||||||
.sidebar-link.active::before{content:'';position:absolute;left:-8px;top:50%;transform:translateY(-50%);width:3px;height:20px;border-radius:0 3px 3px 0;background:#0054e6}
|
|
||||||
.sidebar-bottom{margin-top:auto;display:flex;flex-direction:column;align-items:center;gap:8px}
|
|
||||||
.main-content{margin-left:56px}
|
|
||||||
@media(max-width:640px){
|
|
||||||
.sidebar{position:fixed;top:auto;bottom:0;left:0;width:100%;height:52px;flex-direction:row;justify-content:center;padding:0 16px;border-right:none;border-top:1px solid var(--surface-600);gap:0}
|
|
||||||
.sidebar-logo{display:none}
|
|
||||||
.sidebar-nav{flex-direction:row;gap:4px;flex:none}
|
|
||||||
.sidebar-bottom{margin-top:0;margin-left:auto;flex-direction:row}
|
|
||||||
.sidebar-link.active::before{left:50%;top:auto;bottom:-6px;transform:translateX(-50%);width:20px;height:3px;border-radius:3px 3px 0 0}
|
|
||||||
.main-content{margin-left:0;padding-bottom:60px}
|
|
||||||
}
|
|
||||||
|
|
||||||
:root {
|
|
||||||
--bg: #f5f5f7;
|
|
||||||
--bg-grad1: rgba(0, 67, 184, 0.04);
|
|
||||||
--bg-grad2: rgba(0, 50, 140, 0.03);
|
|
||||||
--surface-800: rgba(255,255,255,0.85);
|
|
||||||
--surface-700: #f0f0f3;
|
|
||||||
--surface-600: #dde0e6;
|
|
||||||
--text-primary: #1a1a2e;
|
|
||||||
--text-secondary: #555;
|
|
||||||
--text-muted: #888;
|
|
||||||
--select-bg: #f0f0f3;
|
|
||||||
--select-color: #1a1a2e;
|
|
||||||
}
|
|
||||||
.dark {
|
|
||||||
--bg: #060c18;
|
|
||||||
--bg-grad1: rgba(0, 84, 230, 0.03);
|
|
||||||
--bg-grad2: rgba(0, 67, 184, 0.02);
|
|
||||||
--surface-800: rgba(9,16,32,0.8);
|
|
||||||
--surface-700: #0d1828;
|
|
||||||
--surface-600: #162040;
|
|
||||||
--text-primary: #fff;
|
|
||||||
--text-secondary: #c0c0c0;
|
|
||||||
--text-muted: #666;
|
|
||||||
--select-bg: #091020;
|
|
||||||
--select-color: #e0e0e0;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
background: var(--bg);
|
|
||||||
background-image:
|
|
||||||
radial-gradient(ellipse at 20% 50%, var(--bg-grad1) 0%, transparent 50%),
|
|
||||||
radial-gradient(ellipse at 80% 20%, var(--bg-grad2) 0%, transparent 50%);
|
|
||||||
min-height: 100vh;
|
|
||||||
transition: background 0.3s;
|
|
||||||
}
|
|
||||||
.dark .noise::before {
|
|
||||||
content: '';
|
|
||||||
position: fixed;
|
|
||||||
inset: 0;
|
|
||||||
background: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.03'/%3E%3C/svg%3E");
|
|
||||||
pointer-events: none;
|
|
||||||
z-index: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.theme-toggle { position: relative; width: 44px; height: 24px; border-radius: 12px; cursor: pointer; transition: background 0.3s; }
|
|
||||||
.dark .theme-toggle { background: #162040; }
|
|
||||||
.theme-toggle { background: #dde0e6; }
|
|
||||||
.theme-toggle-knob { position: absolute; top: 2px; width: 20px; height: 20px; border-radius: 50%; transition: left 0.3s, background 0.3s; display: flex; align-items: center; justify-content: center; }
|
|
||||||
.dark .theme-toggle-knob { left: 22px; background: #0d1828; }
|
|
||||||
.theme-toggle-knob { left: 2px; background: #fff; box-shadow: 0 1px 3px rgba(0,0,0,0.15); }
|
|
||||||
|
|
||||||
@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; }
|
|
||||||
@keyframes pulse-border { 0%, 100% { border-color: rgba(0, 84, 230, 0.2); } 50% { border-color: rgba(0, 84, 230, 0.5); } }
|
@keyframes pulse-border { 0%, 100% { border-color: rgba(0, 84, 230, 0.2); } 50% { border-color: rgba(0, 84, 230, 0.5); } }
|
||||||
.processing { animation: pulse-border 1.5s ease-in-out infinite; }
|
.processing { animation: pulse-border 1.5s ease-in-out infinite; }
|
||||||
|
|
||||||
@ -126,62 +38,8 @@
|
|||||||
</head>
|
</head>
|
||||||
<body class="noise dark:text-gray-200 text-gray-700 font-sans antialiased">
|
<body class="noise dark:text-gray-200 text-gray-700 font-sans antialiased">
|
||||||
|
|
||||||
<!-- Sidebar -->
|
|
||||||
<nav class="sidebar">
|
|
||||||
<div class="sidebar-logo">WA</div>
|
|
||||||
<div class="sidebar-nav">
|
|
||||||
<a href="/" class="sidebar-link" title="Главная">
|
|
||||||
<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 12l8.954-8.955c.44-.439 1.152-.439 1.591 0L21.75 12M4.5 9.75v10.125c0 .621.504 1.125 1.125 1.125H9.75v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21h4.125c.621 0 1.125-.504 1.125-1.125V9.75M8.25 21h8.25"/></svg>
|
|
||||||
</a>
|
|
||||||
<a href="/compress" class="sidebar-link" title="Картинки">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/md" class="sidebar-link" title="Markdown">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/placeholder" class="sidebar-link" title="Placeholder">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/parser" class="sidebar-link active" title="Parser">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/password" class="sidebar-link" title="Password">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/sanitizer" class="sidebar-link" title="Sanitizer">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/converter" class="sidebar-link" title="Converter">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/formatter" class="sidebar-link" title="Formatter">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/editor" class="sidebar-link" title="Editor">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/httpclient" class="sidebar-link" title="HTTP Client">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/redirects" class="sidebar-link" title="Redirect Analyzer">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/svgeditor" class="sidebar-link" title="SVG Редактор">
|
|
||||||
<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.53 16.122a3 3 0 00-5.78 1.128 2.25 2.25 0 01-2.4 2.245 4.5 4.5 0 008.4-2.245c0-.399-.078-.78-.22-1.128zm0 0a15.998 15.998 0 003.388-1.62m-5.043-.025a15.994 15.994 0 011.622-3.395m3.42 3.42a15.995 15.995 0 004.764-4.648l3.876-5.814a1.151 1.151 0 00-1.597-1.597L14.146 6.32a15.996 15.996 0 00-4.649 4.763m3.42 3.42a6.776 6.776 0 00-3.42-3.42"/></svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="sidebar-bottom">
|
|
||||||
<div class="theme-toggle" id="themeToggle" title="Переключить тему">
|
|
||||||
<div class="theme-toggle-knob">
|
|
||||||
<svg class="w-3 h-3 dark:hidden text-amber-500" fill="currentColor" viewBox="0 0 20 20"><path d="M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414zm2.12-10.607a1 1 0 010 1.414l-.706.707a1 1 0 11-1.414-1.414l.707-.707a1 1 0 011.414 0zM17 11a1 1 0 100-2h-1a1 1 0 100 2h1zm-7 4a1 1 0 011 1v1a1 1 0 11-2 0v-1a1 1 0 011-1zM5.05 6.464A1 1 0 106.465 5.05l-.708-.707a1 1 0 00-1.414 1.414l.707.707zm1.414 8.486l-.707.707a1 1 0 01-1.414-1.414l.707-.707a1 1 0 011.414 1.414zM4 11a1 1 0 100-2H3a1 1 0 000 2h1z"/></svg>
|
|
||||||
<svg class="w-3 h-3 hidden dark:block text-gray-400" fill="currentColor" viewBox="0 0 20 20"><path d="M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z"/></svg>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
|
|
||||||
<div class="main-content">
|
<div class="main-content">
|
||||||
<div class="relative z-10 max-w-3xl mx-auto px-4 py-8 sm:py-12">
|
<div class="tool-container relative z-10 max-w-3xl mx-auto">
|
||||||
|
|
||||||
<!-- Header -->
|
<!-- Header -->
|
||||||
<div class="text-center mb-8 fade-up">
|
<div class="text-center mb-8 fade-up">
|
||||||
@ -189,10 +47,12 @@
|
|||||||
<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>
|
||||||
URL Article Parser
|
URL Article Parser
|
||||||
</div>
|
</div>
|
||||||
<h1 class="text-3xl sm:text-4xl font-extrabold tracking-tight dark:text-white text-gray-900">
|
<div class="page-header">
|
||||||
Парсер <span class="text-accent">статей</span>
|
<h1 class="text-3xl sm:text-4xl font-extrabold tracking-tight dark:text-white text-gray-900">
|
||||||
</h1>
|
Парсер <span class="text-accent">статей</span>
|
||||||
<p class="mt-2 text-sm dark:text-gray-500 text-gray-400 font-mono">извлечение контента из любой веб-страницы</p>
|
</h1>
|
||||||
|
<p class="description mt-2 text-sm dark:text-gray-500 text-gray-400 font-mono">извлечение контента из любой веб-страницы</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Input Card -->
|
<!-- Input Card -->
|
||||||
@ -352,17 +212,6 @@
|
|||||||
</div><!-- /main-content -->
|
</div><!-- /main-content -->
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
// Theme
|
|
||||||
const html = document.documentElement;
|
|
||||||
const savedTheme = localStorage.getItem('theme');
|
|
||||||
if (savedTheme) { html.className = savedTheme; }
|
|
||||||
else if (!window.matchMedia('(prefers-color-scheme: dark)').matches) { html.className = ''; }
|
|
||||||
|
|
||||||
document.getElementById('themeToggle').addEventListener('click', () => {
|
|
||||||
const isDark = html.classList.toggle('dark');
|
|
||||||
localStorage.setItem('theme', isDark ? 'dark' : '');
|
|
||||||
});
|
|
||||||
|
|
||||||
// State
|
// State
|
||||||
let currentMode = 'full';
|
let currentMode = 'full';
|
||||||
let lastResult = null;
|
let lastResult = null;
|
||||||
|
|||||||
@ -3,98 +3,13 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>Password Generator — images.wadevelop.ru</title>
|
<title>Генератор паролей — WA Dev Tools</title>
|
||||||
<script src="/vendor/tailwind.js"></script>
|
<script src="/vendor/tailwind.js"></script>
|
||||||
|
<script src="/shared.js"></script>
|
||||||
<link href="/vendor/fonts.css" rel="stylesheet">
|
<link href="/vendor/fonts.css" rel="stylesheet">
|
||||||
<script>
|
<link href="/shared.css" rel="stylesheet">
|
||||||
tailwind.config = {
|
<script>window.WA_TOOL_ID = 'password';</script>
|
||||||
darkMode: 'class',
|
|
||||||
theme: {
|
|
||||||
extend: {
|
|
||||||
fontFamily: {
|
|
||||||
mono: ['JetBrains Mono', 'monospace'],
|
|
||||||
sans: ['Manrope', 'sans-serif'],
|
|
||||||
},
|
|
||||||
colors: {
|
|
||||||
surface: { 900: '#060c18', 800: '#091020', 700: '#0d1828', 600: '#162040' },
|
|
||||||
accent: { DEFAULT: '#0054e6', dim: '#0043b8', bright: '#6b9fff' },
|
|
||||||
warn: '#ffd600',
|
|
||||||
danger: '#ff5252',
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<style>
|
<style>
|
||||||
/* Sidebar */
|
|
||||||
.sidebar{position:fixed;top:0;left:0;width:56px;height:100vh;display:flex;flex-direction:column;align-items:center;padding:16px 0 12px;z-index:50;border-right:1px solid var(--surface-600);background:var(--surface-800);backdrop-filter:blur(12px);transition:background .3s,border-color .3s}
|
|
||||||
.sidebar-logo{margin-bottom:24px;color:var(--text-muted);font-size:10px;font-weight:700;letter-spacing:.08em;font-family:'JetBrains Mono',monospace}
|
|
||||||
.sidebar-nav{display:flex;flex-direction:column;gap:6px;flex:1}
|
|
||||||
.sidebar-link{width:40px;height:40px;border-radius:10px;display:flex;align-items:center;justify-content:center;color:var(--text-muted);transition:all .2s;text-decoration:none;position:relative}
|
|
||||||
.sidebar-link:hover{color:var(--text-secondary);background:rgba(255,255,255,.04)}
|
|
||||||
.sidebar-link.active{color:#0054e6;background:rgba(0,84,230,.08)}
|
|
||||||
.sidebar-link.active::before{content:'';position:absolute;left:-8px;top:50%;transform:translateY(-50%);width:3px;height:20px;border-radius:0 3px 3px 0;background:#0054e6}
|
|
||||||
.sidebar-bottom{margin-top:auto;display:flex;flex-direction:column;align-items:center;gap:8px}
|
|
||||||
.main-content{margin-left:56px}
|
|
||||||
@media(max-width:640px){
|
|
||||||
.sidebar{position:fixed;top:auto;bottom:0;left:0;width:100%;height:52px;flex-direction:row;justify-content:center;padding:0 16px;border-right:none;border-top:1px solid var(--surface-600);gap:0}
|
|
||||||
.sidebar-logo{display:none}
|
|
||||||
.sidebar-nav{flex-direction:row;gap:4px;flex:none}
|
|
||||||
.sidebar-bottom{margin-top:0;margin-left:auto;flex-direction:row}
|
|
||||||
.sidebar-link.active::before{left:50%;top:auto;bottom:-6px;transform:translateX(-50%);width:20px;height:3px;border-radius:3px 3px 0 0}
|
|
||||||
.main-content{margin-left:0;padding-bottom:60px}
|
|
||||||
}
|
|
||||||
|
|
||||||
:root {
|
|
||||||
--bg: #f5f5f7;
|
|
||||||
--bg-grad1: rgba(0, 67, 184, 0.04);
|
|
||||||
--bg-grad2: rgba(0, 50, 140, 0.03);
|
|
||||||
--surface-800: rgba(255,255,255,0.85);
|
|
||||||
--surface-700: #f0f0f3;
|
|
||||||
--surface-600: #dde0e6;
|
|
||||||
--text-primary: #1a1a2e;
|
|
||||||
--text-secondary: #555;
|
|
||||||
--text-muted: #888;
|
|
||||||
--select-bg: #f0f0f3;
|
|
||||||
--select-color: #1a1a2e;
|
|
||||||
}
|
|
||||||
.dark {
|
|
||||||
--bg: #060c18;
|
|
||||||
--bg-grad1: rgba(0, 84, 230, 0.03);
|
|
||||||
--bg-grad2: rgba(0, 67, 184, 0.02);
|
|
||||||
--surface-800: rgba(9,16,32,0.8);
|
|
||||||
--surface-700: #0d1828;
|
|
||||||
--surface-600: #162040;
|
|
||||||
--text-primary: #fff;
|
|
||||||
--text-secondary: #c0c0c0;
|
|
||||||
--text-muted: #666;
|
|
||||||
--select-bg: #091020;
|
|
||||||
--select-color: #e0e0e0;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
background: var(--bg);
|
|
||||||
background-image:
|
|
||||||
radial-gradient(ellipse at 20% 50%, var(--bg-grad1) 0%, transparent 50%),
|
|
||||||
radial-gradient(ellipse at 80% 20%, var(--bg-grad2) 0%, transparent 50%);
|
|
||||||
min-height: 100vh;
|
|
||||||
transition: background 0.3s;
|
|
||||||
}
|
|
||||||
.dark .noise::before {
|
|
||||||
content: '';
|
|
||||||
position: fixed;
|
|
||||||
inset: 0;
|
|
||||||
background: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.03'/%3E%3C/svg%3E");
|
|
||||||
pointer-events: none;
|
|
||||||
z-index: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.theme-toggle { position: relative; width: 44px; height: 24px; border-radius: 12px; cursor: pointer; transition: background 0.3s; }
|
|
||||||
.dark .theme-toggle { background: #162040; }
|
|
||||||
.theme-toggle { background: #dde0e6; }
|
|
||||||
.theme-toggle-knob { position: absolute; top: 2px; width: 20px; height: 20px; border-radius: 50%; transition: left 0.3s, background 0.3s; display: flex; align-items: center; justify-content: center; }
|
|
||||||
.dark .theme-toggle-knob { left: 22px; background: #0d1828; }
|
|
||||||
.theme-toggle-knob { left: 2px; background: #fff; box-shadow: 0 1px 3px rgba(0,0,0,0.15); }
|
|
||||||
|
|
||||||
select, select option { background: var(--select-bg); color: var(--select-color); }
|
select, select option { background: var(--select-bg); color: var(--select-color); }
|
||||||
|
|
||||||
@keyframes fadeUp { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: translateY(0); } }
|
@keyframes fadeUp { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: translateY(0); } }
|
||||||
@ -151,73 +66,17 @@
|
|||||||
</head>
|
</head>
|
||||||
<body class="noise dark:text-gray-200 text-gray-700 font-sans antialiased">
|
<body class="noise dark:text-gray-200 text-gray-700 font-sans antialiased">
|
||||||
|
|
||||||
<!-- Sidebar -->
|
|
||||||
<nav class="sidebar">
|
|
||||||
<div class="sidebar-logo">WA</div>
|
|
||||||
<div class="sidebar-nav">
|
|
||||||
<a href="/" class="sidebar-link" title="Главная">
|
|
||||||
<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 12l8.954-8.955c.44-.439 1.152-.439 1.591 0L21.75 12M4.5 9.75v10.125c0 .621.504 1.125 1.125 1.125H9.75v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21h4.125c.621 0 1.125-.504 1.125-1.125V9.75M8.25 21h8.25"/></svg>
|
|
||||||
</a>
|
|
||||||
<a href="/compress" class="sidebar-link" title="Картинки">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/md" class="sidebar-link" title="Markdown">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/placeholder" class="sidebar-link" title="Placeholder">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/parser" class="sidebar-link" title="Parser">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/password" class="sidebar-link active" title="Password">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/sanitizer" class="sidebar-link" title="Sanitizer">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/converter" class="sidebar-link" title="Converter">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/formatter" class="sidebar-link" title="Formatter">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/editor" class="sidebar-link" title="Editor">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/httpclient" class="sidebar-link" title="HTTP Client">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/redirects" class="sidebar-link" title="Redirect Analyzer">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/svgeditor" class="sidebar-link" title="SVG Редактор">
|
|
||||||
<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.53 16.122a3 3 0 00-5.78 1.128 2.25 2.25 0 01-2.4 2.245 4.5 4.5 0 008.4-2.245c0-.399-.078-.78-.22-1.128zm0 0a15.998 15.998 0 003.388-1.62m-5.043-.025a15.994 15.994 0 011.622-3.395m3.42 3.42a15.995 15.995 0 004.764-4.648l3.876-5.814a1.151 1.151 0 00-1.597-1.597L14.146 6.32a15.996 15.996 0 00-4.649 4.763m3.42 3.42a6.776 6.776 0 00-3.42-3.42"/></svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="sidebar-bottom">
|
|
||||||
<div class="theme-toggle" id="themeToggle" title="Переключить тему">
|
|
||||||
<div class="theme-toggle-knob">
|
|
||||||
<svg class="w-3 h-3 dark:hidden text-amber-500" fill="currentColor" viewBox="0 0 20 20"><path d="M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414zm2.12-10.607a1 1 0 010 1.414l-.706.707a1 1 0 11-1.414-1.414l.707-.707a1 1 0 011.414 0zM17 11a1 1 0 100-2h-1a1 1 0 100 2h1zm-7 4a1 1 0 011 1v1a1 1 0 11-2 0v-1a1 1 0 011-1zM5.05 6.464A1 1 0 106.465 5.05l-.708-.707a1 1 0 00-1.414 1.414l.707.707zm1.414 8.486l-.707.707a1 1 0 01-1.414-1.414l.707-.707a1 1 0 011.414 1.414zM4 11a1 1 0 100-2H3a1 1 0 000 2h1z"/></svg>
|
|
||||||
<svg class="w-3 h-3 hidden dark:block text-gray-400" fill="currentColor" viewBox="0 0 20 20"><path d="M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z"/></svg>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
|
|
||||||
<div class="main-content">
|
<div class="main-content">
|
||||||
<div class="relative z-10 max-w-2xl mx-auto px-4 py-8 sm:py-12">
|
<div class="tool-container relative z-10 max-w-2xl mx-auto py-8 sm:py-12">
|
||||||
|
|
||||||
<!-- Header -->
|
<!-- Header -->
|
||||||
<div class="text-center mb-8 fade-up">
|
<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">
|
<div class="page-header">
|
||||||
<span class="w-1.5 h-1.5 rounded-full bg-accent animate-pulse"></span>
|
<h1 class="text-3xl sm:text-4xl font-extrabold tracking-tight dark:text-white text-gray-900">
|
||||||
Crypto · Client-side
|
Генератор <span class="text-accent">паролей</span>
|
||||||
|
</h1>
|
||||||
|
<p class="description mt-2 text-sm dark:text-gray-500 text-gray-400 font-mono">криптографически стойкая генерация</p>
|
||||||
</div>
|
</div>
|
||||||
<h1 class="text-3xl sm:text-4xl font-extrabold tracking-tight dark:text-white text-gray-900">
|
|
||||||
Генератор <span class="text-accent">паролей</span>
|
|
||||||
</h1>
|
|
||||||
<p class="mt-2 text-sm dark:text-gray-500 text-gray-400 font-mono">криптографически стойкая генерация</p>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Settings Card -->
|
<!-- Settings Card -->
|
||||||
@ -320,17 +179,6 @@
|
|||||||
</div><!-- /main-content -->
|
</div><!-- /main-content -->
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
// Theme
|
|
||||||
const html = document.documentElement;
|
|
||||||
const savedTheme = localStorage.getItem('theme');
|
|
||||||
if (savedTheme) { html.className = savedTheme; }
|
|
||||||
else if (!window.matchMedia('(prefers-color-scheme: dark)').matches) { html.className = ''; }
|
|
||||||
|
|
||||||
document.getElementById('themeToggle').addEventListener('click', () => {
|
|
||||||
const isDark = html.classList.toggle('dark');
|
|
||||||
localStorage.setItem('theme', isDark ? 'dark' : '');
|
|
||||||
});
|
|
||||||
|
|
||||||
// State
|
// State
|
||||||
const opts = { upper: true, lower: true, digits: true, symbols: false, exclude: false };
|
const opts = { upper: true, lower: true, digits: true, symbols: false, exclude: false };
|
||||||
const CHARSETS = {
|
const CHARSETS = {
|
||||||
|
|||||||
@ -3,98 +3,13 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>Placeholder — генератор заглушек</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 src="/shared.js"></script>
|
||||||
<link href="/vendor/fonts.css" rel="stylesheet">
|
<link href="/vendor/fonts.css" rel="stylesheet">
|
||||||
<script>
|
<link href="/shared.css" rel="stylesheet">
|
||||||
tailwind.config = {
|
|
||||||
darkMode: 'class',
|
|
||||||
theme: {
|
|
||||||
extend: {
|
|
||||||
fontFamily: {
|
|
||||||
mono: ['JetBrains Mono', 'monospace'],
|
|
||||||
sans: ['Manrope', 'sans-serif'],
|
|
||||||
},
|
|
||||||
colors: {
|
|
||||||
surface: { 900: '#060c18', 800: '#091020', 700: '#0d1828', 600: '#162040' },
|
|
||||||
accent: { DEFAULT: '#0054e6', dim: '#0043b8', bright: '#6b9fff' },
|
|
||||||
warn: '#ffd600',
|
|
||||||
danger: '#ff5252',
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<style>
|
<style>
|
||||||
/* Sidebar */
|
|
||||||
.sidebar{position:fixed;top:0;left:0;width:56px;height:100vh;display:flex;flex-direction:column;align-items:center;padding:16px 0 12px;z-index:50;border-right:1px solid var(--surface-600);background:var(--surface-800);backdrop-filter:blur(12px);transition:background .3s,border-color .3s}
|
|
||||||
.sidebar-logo{margin-bottom:24px;color:var(--text-muted);font-size:10px;font-weight:700;letter-spacing:.08em;font-family:'JetBrains Mono',monospace}
|
|
||||||
.sidebar-nav{display:flex;flex-direction:column;gap:6px;flex:1}
|
|
||||||
.sidebar-link{width:40px;height:40px;border-radius:10px;display:flex;align-items:center;justify-content:center;color:var(--text-muted);transition:all .2s;text-decoration:none;position:relative}
|
|
||||||
.sidebar-link:hover{color:var(--text-secondary);background:rgba(255,255,255,.04)}
|
|
||||||
.sidebar-link.active{color:#0054e6;background:rgba(0,84,230,.08)}
|
|
||||||
.sidebar-link.active::before{content:'';position:absolute;left:-8px;top:50%;transform:translateY(-50%);width:3px;height:20px;border-radius:0 3px 3px 0;background:#0054e6}
|
|
||||||
.sidebar-bottom{margin-top:auto;display:flex;flex-direction:column;align-items:center;gap:8px}
|
|
||||||
.main-content{margin-left:56px}
|
|
||||||
@media(max-width:640px){
|
|
||||||
.sidebar{position:fixed;top:auto;bottom:0;left:0;width:100%;height:52px;flex-direction:row;justify-content:center;padding:0 16px;border-right:none;border-top:1px solid var(--surface-600);gap:0}
|
|
||||||
.sidebar-logo{display:none}
|
|
||||||
.sidebar-nav{flex-direction:row;gap:4px;flex:none}
|
|
||||||
.sidebar-bottom{margin-top:0;margin-left:auto;flex-direction:row}
|
|
||||||
.sidebar-link.active::before{left:50%;top:auto;bottom:-6px;transform:translateX(-50%);width:20px;height:3px;border-radius:3px 3px 0 0}
|
|
||||||
.main-content{margin-left:0;padding-bottom:60px}
|
|
||||||
}
|
|
||||||
|
|
||||||
:root {
|
|
||||||
--bg: #f5f5f7;
|
|
||||||
--bg-grad1: rgba(0, 67, 184, 0.04);
|
|
||||||
--bg-grad2: rgba(0, 50, 140, 0.03);
|
|
||||||
--surface-800: rgba(255,255,255,0.85);
|
|
||||||
--surface-700: #f0f0f3;
|
|
||||||
--surface-600: #dde0e6;
|
|
||||||
--text-primary: #1a1a2e;
|
|
||||||
--text-secondary: #555;
|
|
||||||
--text-muted: #888;
|
|
||||||
--select-bg: #f0f0f3;
|
|
||||||
--select-color: #1a1a2e;
|
|
||||||
}
|
|
||||||
.dark {
|
|
||||||
--bg: #060c18;
|
|
||||||
--bg-grad1: rgba(0, 84, 230, 0.03);
|
|
||||||
--bg-grad2: rgba(0, 67, 184, 0.02);
|
|
||||||
--surface-800: rgba(9,16,32,0.8);
|
|
||||||
--surface-700: #0d1828;
|
|
||||||
--surface-600: #162040;
|
|
||||||
--text-primary: #fff;
|
|
||||||
--text-secondary: #c0c0c0;
|
|
||||||
--text-muted: #666;
|
|
||||||
--select-bg: #091020;
|
|
||||||
--select-color: #e0e0e0;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
background: var(--bg);
|
|
||||||
background-image:
|
|
||||||
radial-gradient(ellipse at 20% 50%, var(--bg-grad1) 0%, transparent 50%),
|
|
||||||
radial-gradient(ellipse at 80% 20%, var(--bg-grad2) 0%, transparent 50%);
|
|
||||||
min-height: 100vh;
|
|
||||||
transition: background 0.3s;
|
|
||||||
}
|
|
||||||
.dark .noise::before {
|
|
||||||
content: '';
|
|
||||||
position: fixed;
|
|
||||||
inset: 0;
|
|
||||||
background: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.03'/%3E%3C/svg%3E");
|
|
||||||
pointer-events: none;
|
|
||||||
z-index: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.theme-toggle { position: relative; width: 44px; height: 24px; border-radius: 12px; cursor: pointer; transition: background 0.3s; }
|
|
||||||
.dark .theme-toggle { background: #162040; }
|
|
||||||
.theme-toggle { background: #dde0e6; }
|
|
||||||
.theme-toggle-knob { position: absolute; top: 2px; width: 20px; height: 20px; border-radius: 50%; transition: left 0.3s, background 0.3s; display: flex; align-items: center; justify-content: center; }
|
|
||||||
.dark .theme-toggle-knob { left: 22px; background: #0d1828; }
|
|
||||||
.theme-toggle-knob { left: 2px; background: #fff; box-shadow: 0 1px 3px rgba(0,0,0,0.15); }
|
|
||||||
|
|
||||||
select, select option { background: var(--select-bg); color: var(--select-color); }
|
select, select option { background: var(--select-bg); color: var(--select-color); }
|
||||||
|
|
||||||
@keyframes fadeUp { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: translateY(0); } }
|
@keyframes fadeUp { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: translateY(0); } }
|
||||||
@ -122,62 +37,8 @@
|
|||||||
</head>
|
</head>
|
||||||
<body class="noise dark:text-gray-200 text-gray-700 font-sans antialiased">
|
<body class="noise dark:text-gray-200 text-gray-700 font-sans antialiased">
|
||||||
|
|
||||||
<!-- Sidebar -->
|
|
||||||
<nav class="sidebar">
|
|
||||||
<div class="sidebar-logo">WA</div>
|
|
||||||
<div class="sidebar-nav">
|
|
||||||
<a href="/" class="sidebar-link" title="Главная">
|
|
||||||
<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 12l8.954-8.955c.44-.439 1.152-.439 1.591 0L21.75 12M4.5 9.75v10.125c0 .621.504 1.125 1.125 1.125H9.75v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21h4.125c.621 0 1.125-.504 1.125-1.125V9.75M8.25 21h8.25"/></svg>
|
|
||||||
</a>
|
|
||||||
<a href="/compress" class="sidebar-link" title="Картинки">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/md" class="sidebar-link" title="Markdown">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/placeholder" class="sidebar-link active" title="Placeholder">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/parser" class="sidebar-link" title="Parser">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/password" class="sidebar-link" title="Password">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/sanitizer" class="sidebar-link" title="Sanitizer">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/converter" class="sidebar-link" title="Converter">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/formatter" class="sidebar-link" title="Formatter">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/editor" class="sidebar-link" title="Editor">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/httpclient" class="sidebar-link" title="HTTP Client">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/redirects" class="sidebar-link" title="Redirect Analyzer">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/svgeditor" class="sidebar-link" title="SVG Редактор">
|
|
||||||
<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.53 16.122a3 3 0 00-5.78 1.128 2.25 2.25 0 01-2.4 2.245 4.5 4.5 0 008.4-2.245c0-.399-.078-.78-.22-1.128zm0 0a15.998 15.998 0 003.388-1.62m-5.043-.025a15.994 15.994 0 011.622-3.395m3.42 3.42a15.995 15.995 0 004.764-4.648l3.876-5.814a1.151 1.151 0 00-1.597-1.597L14.146 6.32a15.996 15.996 0 00-4.649 4.763m3.42 3.42a6.776 6.776 0 00-3.42-3.42"/></svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="sidebar-bottom">
|
|
||||||
<div class="theme-toggle" id="themeToggle" title="Переключить тему">
|
|
||||||
<div class="theme-toggle-knob">
|
|
||||||
<svg class="w-3 h-3 dark:hidden text-amber-500" fill="currentColor" viewBox="0 0 20 20"><path d="M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414zm2.12-10.607a1 1 0 010 1.414l-.706.707a1 1 0 11-1.414-1.414l.707-.707a1 1 0 011.414 0zM17 11a1 1 0 100-2h-1a1 1 0 100 2h1zm-7 4a1 1 0 011 1v1a1 1 0 11-2 0v-1a1 1 0 011-1zM5.05 6.464A1 1 0 106.465 5.05l-.708-.707a1 1 0 00-1.414 1.414l.707.707zm1.414 8.486l-.707.707a1 1 0 01-1.414-1.414l.707-.707a1 1 0 011.414 1.414zM4 11a1 1 0 100-2H3a1 1 0 000 2h1z"/></svg>
|
|
||||||
<svg class="w-3 h-3 hidden dark:block text-gray-400" fill="currentColor" viewBox="0 0 20 20"><path d="M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z"/></svg>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
|
|
||||||
<div class="main-content">
|
<div class="main-content">
|
||||||
<div class="relative z-10 max-w-2xl mx-auto px-4 py-8 sm:py-12">
|
<div class="tool-container relative z-10 max-w-2xl mx-auto">
|
||||||
|
|
||||||
<!-- Header -->
|
<!-- Header -->
|
||||||
<div class="text-center mb-8 fade-up">
|
<div class="text-center mb-8 fade-up">
|
||||||
@ -185,10 +46,12 @@
|
|||||||
<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>
|
||||||
PNG · JPG · WebP
|
PNG · JPG · WebP
|
||||||
</div>
|
</div>
|
||||||
<h1 class="text-3xl sm:text-4xl font-extrabold tracking-tight dark:text-white text-gray-900">
|
<div class="page-header">
|
||||||
<span class="text-accent">Placeholder</span> генератор
|
<h1 class="text-3xl sm:text-4xl font-extrabold tracking-tight dark:text-white text-gray-900">
|
||||||
</h1>
|
Placeholder <span class="text-accent">генератор</span>
|
||||||
<p class="mt-2 text-sm dark:text-gray-500 text-gray-400 font-mono">изображения-заглушки любого размера</p>
|
</h1>
|
||||||
|
<p class="description mt-2 text-sm dark:text-gray-500 text-gray-400 font-mono">изображения-заглушки любого размера</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Controls Card -->
|
<!-- Controls Card -->
|
||||||
@ -300,17 +163,6 @@
|
|||||||
</div><!-- /main-content -->
|
</div><!-- /main-content -->
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
// Theme
|
|
||||||
const html = document.documentElement;
|
|
||||||
const savedTheme = localStorage.getItem('theme');
|
|
||||||
if (savedTheme) { html.className = savedTheme; }
|
|
||||||
else if (!window.matchMedia('(prefers-color-scheme: dark)').matches) { html.className = ''; }
|
|
||||||
|
|
||||||
document.getElementById('themeToggle').addEventListener('click', () => {
|
|
||||||
const isDark = html.classList.toggle('dark');
|
|
||||||
localStorage.setItem('theme', isDark ? 'dark' : '');
|
|
||||||
});
|
|
||||||
|
|
||||||
// Elements
|
// Elements
|
||||||
const widthEl = document.getElementById('width');
|
const widthEl = document.getElementById('width');
|
||||||
const heightEl = document.getElementById('height');
|
const heightEl = document.getElementById('height');
|
||||||
|
|||||||
@ -3,57 +3,13 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>Redirect Analyzer — images.wadevelop.ru</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 src="/shared.js"></script>
|
||||||
<link href="/vendor/fonts.css" rel="stylesheet">
|
<link href="/vendor/fonts.css" rel="stylesheet">
|
||||||
<script>
|
<link href="/shared.css" rel="stylesheet">
|
||||||
tailwind.config = {
|
|
||||||
darkMode: 'class',
|
|
||||||
theme: {
|
|
||||||
extend: {
|
|
||||||
fontFamily: {
|
|
||||||
mono: ['JetBrains Mono', 'monospace'],
|
|
||||||
sans: ['Manrope', 'sans-serif'],
|
|
||||||
},
|
|
||||||
colors: {
|
|
||||||
surface: { 900: '#060c18', 800: '#091020', 700: '#0d1828', 600: '#162040' },
|
|
||||||
accent: { DEFAULT: '#0054e6', dim: '#0043b8', bright: '#6b9fff' },
|
|
||||||
warn: '#ffd600',
|
|
||||||
danger: '#ff5252',
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<style>
|
<style>
|
||||||
.sidebar{position:fixed;top:0;left:0;width:56px;height:100vh;display:flex;flex-direction:column;align-items:center;padding:16px 0 12px;z-index:50;border-right:1px solid var(--surface-600);background:var(--surface-800);backdrop-filter:blur(12px);transition:background .3s,border-color .3s}
|
|
||||||
.sidebar-logo{margin-bottom:24px;color:var(--text-muted);font-size:10px;font-weight:700;letter-spacing:.08em;font-family:'JetBrains Mono',monospace}
|
|
||||||
.sidebar-nav{display:flex;flex-direction:column;gap:6px;flex:1}
|
|
||||||
.sidebar-link{width:40px;height:40px;border-radius:10px;display:flex;align-items:center;justify-content:center;color:var(--text-muted);transition:all .2s;text-decoration:none;position:relative}
|
|
||||||
.sidebar-link:hover{color:var(--text-secondary);background:rgba(255,255,255,.04)}
|
|
||||||
.sidebar-link.active{color:#0054e6;background:rgba(0,84,230,.08)}
|
|
||||||
.sidebar-link.active::before{content:'';position:absolute;left:-8px;top:50%;transform:translateY(-50%);width:3px;height:20px;border-radius:0 3px 3px 0;background:#0054e6}
|
|
||||||
.sidebar-bottom{margin-top:auto;display:flex;flex-direction:column;align-items:center;gap:8px}
|
|
||||||
.main-content{margin-left:56px}
|
|
||||||
@media(max-width:640px){
|
|
||||||
.sidebar{position:fixed;top:auto;bottom:0;left:0;width:100%;height:52px;flex-direction:row;justify-content:center;padding:0 16px;border-right:none;border-top:1px solid var(--surface-600);gap:0}
|
|
||||||
.sidebar-logo{display:none}
|
|
||||||
.sidebar-nav{flex-direction:row;gap:4px;flex:none}
|
|
||||||
.sidebar-bottom{margin-top:0;margin-left:auto;flex-direction:row}
|
|
||||||
.sidebar-link.active::before{left:50%;top:auto;bottom:-6px;transform:translateX(-50%);width:20px;height:3px;border-radius:3px 3px 0 0}
|
|
||||||
.main-content{margin-left:0;padding-bottom:60px}
|
|
||||||
}
|
|
||||||
:root{--bg:#f5f5f7;--bg-grad1:rgba(0,67,184,.04);--bg-grad2:rgba(0,50,140,.03);--surface-800:rgba(255,255,255,0.85);--surface-700:#f0f0f3;--surface-600:#dde0e6;--text-primary:#1a1a2e;--text-secondary:#555;--text-muted:#888;--select-bg:#fff;--select-color:#1a1a2e}
|
|
||||||
.dark{--bg:#060c18;--bg-grad1:rgba(0,84,230,.03);--bg-grad2:rgba(0,67,184,.02);--surface-800:rgba(9,16,32,0.8);--surface-700:#0d1828;--surface-600:#162040;--text-primary:#fff;--text-secondary:#c0c0c0;--text-muted:#666;--select-bg:#091020;--select-color:#e0e0e0}
|
|
||||||
body{background:var(--bg);background-image:radial-gradient(ellipse at 20% 50%,var(--bg-grad1) 0%,transparent 50%),radial-gradient(ellipse at 80% 20%,var(--bg-grad2) 0%,transparent 50%);min-height:100vh;transition:background .3s}
|
|
||||||
.dark .noise::before{content:'';position:fixed;inset:0;background:url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.03'/%3E%3C/svg%3E");pointer-events:none;z-index:0}
|
|
||||||
.theme-toggle{position:relative;width:44px;height:24px;border-radius:12px;cursor:pointer;transition:background .3s}
|
|
||||||
.dark .theme-toggle{background:#162040}
|
|
||||||
.theme-toggle{background:#dde0e6}
|
|
||||||
.theme-toggle-knob{position:absolute;top:2px;width:20px;height:20px;border-radius:50%;transition:left .3s,background .3s;display:flex;align-items:center;justify-content:center}
|
|
||||||
.dark .theme-toggle-knob{left:22px;background:#0d1828}
|
|
||||||
.theme-toggle-knob{left:2px;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.15)}
|
|
||||||
|
|
||||||
/* Redirect Analyzer UI */
|
/* Redirect Analyzer UI */
|
||||||
.panel {
|
.panel {
|
||||||
background: var(--surface-800);
|
background: var(--surface-800);
|
||||||
@ -281,74 +237,16 @@
|
|||||||
</head>
|
</head>
|
||||||
<body class="noise dark:text-gray-200 text-gray-700 font-sans antialiased">
|
<body class="noise dark:text-gray-200 text-gray-700 font-sans antialiased">
|
||||||
|
|
||||||
<!-- Sidebar -->
|
|
||||||
<nav class="sidebar">
|
|
||||||
<div class="sidebar-logo">IW</div>
|
|
||||||
<div class="sidebar-nav">
|
|
||||||
<a href="/" class="sidebar-link" title="Главная">
|
|
||||||
<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 12l8.954-8.955c.44-.439 1.152-.439 1.591 0L21.75 12M4.5 9.75v10.125c0 .621.504 1.125 1.125 1.125H9.75v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21h4.125c.621 0 1.125-.504 1.125-1.125V9.75M8.25 21h8.25"/></svg>
|
|
||||||
</a>
|
|
||||||
<a href="/compress" class="sidebar-link" title="Картинки">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/md" class="sidebar-link" title="Markdown">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/placeholder" class="sidebar-link" title="Placeholder">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/parser" class="sidebar-link" title="Parser">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/password" class="sidebar-link" title="Password">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/sanitizer" class="sidebar-link" title="Sanitizer">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/converter" class="sidebar-link" title="Converter">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/formatter" class="sidebar-link" title="Formatter">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/editor" class="sidebar-link" title="Editor">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/httpclient" class="sidebar-link" title="HTTP Client">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/redirects" class="sidebar-link active" title="Redirect Analyzer">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/svgeditor" class="sidebar-link" title="SVG Редактор">
|
|
||||||
<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.53 16.122a3 3 0 00-5.78 1.128 2.25 2.25 0 01-2.4 2.245 4.5 4.5 0 008.4-2.245c0-.399-.078-.78-.22-1.128zm0 0a15.998 15.998 0 003.388-1.62m-5.043-.025a15.994 15.994 0 011.622-3.395m3.42 3.42a15.995 15.995 0 004.764-4.648l3.876-5.814a1.151 1.151 0 00-1.597-1.597L14.146 6.32a15.996 15.996 0 00-4.649 4.763m3.42 3.42a6.776 6.776 0 00-3.42-3.42"/></svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="sidebar-bottom">
|
|
||||||
<div class="theme-toggle" id="themeToggle" title="Переключить тему">
|
|
||||||
<div class="theme-toggle-knob">
|
|
||||||
<svg class="w-3 h-3 dark:hidden text-amber-500" fill="currentColor" viewBox="0 0 20 20"><path d="M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414zm2.12-10.607a1 1 0 010 1.414l-.706.707a1 1 0 11-1.414-1.414l.707-.707a1 1 0 011.414 0zM17 11a1 1 0 100-2h-1a1 1 0 100 2h1zm-7 4a1 1 0 011 1v1a1 1 0 11-2 0v-1a1 1 0 011-1zM5.05 6.464A1 1 0 106.465 5.05l-.708-.707a1 1 0 00-1.414 1.414l.707.707zm1.414 8.486l-.707.707a1 1 0 01-1.414-1.414l.707-.707a1 1 0 011.414 1.414zM4 11a1 1 0 100-2H3a1 1 0 000 2h1z"/></svg>
|
|
||||||
<svg class="w-3 h-3 hidden dark:block text-gray-400" fill="currentColor" viewBox="0 0 20 20"><path d="M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z"/></svg>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
|
|
||||||
<!-- Main -->
|
<!-- Main -->
|
||||||
<div class="main-content">
|
<div class="main-content">
|
||||||
<div class="relative z-10 p-6 max-w-5xl mx-auto">
|
<div class="tool-container relative z-10 max-w-5xl mx-auto px-4">
|
||||||
|
|
||||||
<!-- Header -->
|
<!-- Header -->
|
||||||
<div class="mb-8 text-center">
|
<div class="page-header">
|
||||||
<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>
|
|
||||||
HTTP · HTTPS · 301 · 302
|
|
||||||
</div>
|
|
||||||
<h1 class="text-3xl sm:text-4xl font-extrabold tracking-tight dark:text-white text-gray-900">
|
<h1 class="text-3xl sm:text-4xl font-extrabold tracking-tight dark:text-white text-gray-900">
|
||||||
Redirect <span class="text-accent">Анализатор</span>
|
Redirect <span class="text-accent">Анализатор</span>
|
||||||
</h1>
|
</h1>
|
||||||
<p class="mt-2 text-sm dark:text-gray-500 text-gray-400 font-mono">анализ цепочки HTTP-редиректов</p>
|
<p class="description mt-2 text-sm dark:text-gray-500 text-gray-400 font-mono">анализ цепочки HTTP-редиректов</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- URL Bar -->
|
<!-- URL Bar -->
|
||||||
@ -458,16 +356,6 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
(function() {
|
(function() {
|
||||||
// Theme
|
|
||||||
const html = document.documentElement;
|
|
||||||
const savedTheme = localStorage.getItem('theme');
|
|
||||||
if (savedTheme) { html.className = savedTheme; }
|
|
||||||
else if (!window.matchMedia('(prefers-color-scheme: dark)').matches) { html.className = ''; }
|
|
||||||
document.getElementById('themeToggle').addEventListener('click', () => {
|
|
||||||
const isDark = html.classList.toggle('dark');
|
|
||||||
localStorage.setItem('theme', isDark ? 'dark' : '');
|
|
||||||
});
|
|
||||||
|
|
||||||
// State
|
// State
|
||||||
let lastResult = null;
|
let lastResult = null;
|
||||||
|
|
||||||
@ -709,4 +597,4 @@
|
|||||||
})();
|
})();
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@ -3,54 +3,13 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>HTML Sanitizer — images.wadevelop.ru</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 src="/shared.js"></script>
|
||||||
<link href="/vendor/fonts.css" rel="stylesheet">
|
<link href="/vendor/fonts.css" rel="stylesheet">
|
||||||
<script>
|
<link href="/shared.css" rel="stylesheet">
|
||||||
tailwind.config = {
|
|
||||||
darkMode: 'class',
|
|
||||||
theme: {
|
|
||||||
extend: {
|
|
||||||
fontFamily: {
|
|
||||||
mono: ['JetBrains Mono', 'monospace'],
|
|
||||||
sans: ['Manrope', 'sans-serif'],
|
|
||||||
},
|
|
||||||
colors: {
|
|
||||||
surface: { 900: '#060c18', 800: '#091020', 700: '#0d1828', 600: '#162040' },
|
|
||||||
accent: { DEFAULT: '#0054e6', dim: '#0043b8', bright: '#6b9fff' },
|
|
||||||
warn: '#ffd600',
|
|
||||||
danger: '#ff5252',
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<style>
|
<style>
|
||||||
.sidebar{position:fixed;top:0;left:0;width:56px;height:100vh;display:flex;flex-direction:column;align-items:center;padding:16px 0 12px;z-index:50;border-right:1px solid var(--surface-600);background:var(--surface-800);backdrop-filter:blur(12px);transition:background .3s,border-color .3s}
|
|
||||||
.sidebar-logo{margin-bottom:24px;color:var(--text-muted);font-size:10px;font-weight:700;letter-spacing:.08em;font-family:'JetBrains Mono',monospace}
|
|
||||||
.sidebar-nav{display:flex;flex-direction:column;gap:6px;flex:1}
|
|
||||||
.sidebar-link{width:40px;height:40px;border-radius:10px;display:flex;align-items:center;justify-content:center;color:var(--text-muted);transition:all .2s;text-decoration:none;position:relative}
|
|
||||||
.sidebar-link:hover{color:var(--text-secondary);background:rgba(255,255,255,.04)}
|
|
||||||
.sidebar-link.active{color:#0054e6;background:rgba(0,84,230,.08)}
|
|
||||||
.sidebar-link.active::before{content:'';position:absolute;left:-8px;top:50%;transform:translateY(-50%);width:3px;height:20px;border-radius:0 3px 3px 0;background:#0054e6}
|
|
||||||
.sidebar-bottom{margin-top:auto;display:flex;flex-direction:column;align-items:center;gap:8px}
|
|
||||||
.main-content{margin-left:56px}
|
|
||||||
@media(max-width:640px){
|
|
||||||
.sidebar{position:fixed;top:auto;bottom:0;left:0;width:100%;height:52px;flex-direction:row;justify-content:center;padding:0 16px;border-right:none;border-top:1px solid var(--surface-600);gap:0}
|
|
||||||
.sidebar-logo{display:none}
|
|
||||||
.sidebar-nav{flex-direction:row;gap:4px;flex:none}
|
|
||||||
.sidebar-bottom{margin-top:0;margin-left:auto;flex-direction:row}
|
|
||||||
.sidebar-link.active::before{left:50%;top:auto;bottom:-6px;transform:translateX(-50%);width:20px;height:3px;border-radius:3px 3px 0 0}
|
|
||||||
.main-content{margin-left:0;padding-bottom:60px}
|
|
||||||
}
|
|
||||||
:root{--bg:#f5f5f7;--bg-grad1:rgba(0,67,184,.04);--bg-grad2:rgba(0,150,60,.03);--surface-800:rgba(255,255,255,0.85);--surface-700:#f0f0f3;--surface-600:#dde0e6;--text-primary:#1a1a2e;--text-secondary:#555;--text-muted:#888;--select-bg:#f0f0f3;--select-color:#1a1a2e}
|
|
||||||
.dark{--bg:#060c18;--bg-grad1:rgba(0,84,230,.03);--bg-grad2:rgba(0,67,184,.02);--surface-800:rgba(9,16,32,0.8);--surface-700:#0d1828;--surface-600:#162040;--text-primary:#fff;--text-secondary:#c0c0c0;--text-muted:#666;--select-bg:#091020;--select-color:#e0e0e0}
|
|
||||||
body{background:var(--bg);background-image:radial-gradient(ellipse at 20% 50%,var(--bg-grad1) 0%,transparent 50%),radial-gradient(ellipse at 80% 20%,var(--bg-grad2) 0%,transparent 50%);min-height:100vh;transition:background .3s}
|
|
||||||
.dark .noise::before{content:'';position:fixed;inset:0;background:url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.03'/%3E%3C/svg%3E");pointer-events:none;z-index:0}
|
|
||||||
.theme-toggle{position:relative;width:44px;height:24px;border-radius:12px;cursor:pointer;transition:background .3s}
|
|
||||||
.dark .theme-toggle{background:#162040}.theme-toggle{background:#dde0e6}
|
|
||||||
.theme-toggle-knob{position:absolute;top:2px;width:20px;height:20px;border-radius:50%;transition:left .3s,background .3s;display:flex;align-items:center;justify-content:center}
|
|
||||||
.dark .theme-toggle-knob{left:22px;background:#0d1828}.theme-toggle-knob{left:2px;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.15)}
|
|
||||||
select,select option{background:var(--select-bg);color:var(--select-color)}
|
select,select option{background:var(--select-bg);color:var(--select-color)}
|
||||||
@keyframes fadeUp{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.fade-up{animation:fadeUp .4s ease-out forwards}.fade-up-delay{animation:fadeUp .4s ease-out .1s forwards;opacity:0}
|
@keyframes fadeUp{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.fade-up{animation:fadeUp .4s ease-out forwards}.fade-up-delay{animation:fadeUp .4s ease-out .1s forwards;opacity:0}
|
||||||
.tool-btn{transition:all .2s}.tool-btn.active{color:#0054e6;background:rgba(0,84,230,.08);border-color:rgba(0,84,230,.3)}
|
.tool-btn{transition:all .2s}.tool-btn.active{color:#0054e6;background:rgba(0,84,230,.08);border-color:rgba(0,84,230,.3)}
|
||||||
@ -60,43 +19,10 @@
|
|||||||
</head>
|
</head>
|
||||||
<body class="noise dark:text-gray-200 text-gray-700 font-sans antialiased">
|
<body class="noise dark:text-gray-200 text-gray-700 font-sans antialiased">
|
||||||
|
|
||||||
<nav class="sidebar">
|
|
||||||
<div class="sidebar-logo">WA</div>
|
|
||||||
<div class="sidebar-nav">
|
|
||||||
<a href="/" class="sidebar-link" title="Главная"><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 12l8.954-8.955c.44-.439 1.152-.439 1.591 0L21.75 12M4.5 9.75v10.125c0 .621.504 1.125 1.125 1.125H9.75v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21h4.125c.621 0 1.125-.504 1.125-1.125V9.75M8.25 21h8.25"/></svg></a>
|
|
||||||
<a href="/compress" class="sidebar-link" title="Картинки"><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></a>
|
|
||||||
<a href="/md" class="sidebar-link" title="Markdown"><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></a>
|
|
||||||
<a href="/placeholder" class="sidebar-link" title="Placeholder"><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></a>
|
|
||||||
<a href="/parser" class="sidebar-link" title="Parser"><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></a>
|
|
||||||
<a href="/password" class="sidebar-link" title="Password"><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></a>
|
|
||||||
<a href="/sanitizer" class="sidebar-link active" title="Sanitizer"><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></a>
|
|
||||||
<a href="/converter" class="sidebar-link" title="Converter"><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></a>
|
|
||||||
<a href="/formatter" class="sidebar-link" title="Formatter"><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></a>
|
|
||||||
<a href="/editor" class="sidebar-link" title="Editor"><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></a>
|
|
||||||
<a href="/httpclient" class="sidebar-link" title="HTTP Client">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/redirects" class="sidebar-link" title="Redirect Analyzer">
|
|
||||||
<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>
|
|
||||||
</a>
|
|
||||||
<a href="/svgeditor" class="sidebar-link" title="SVG Редактор">
|
|
||||||
<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.53 16.122a3 3 0 00-5.78 1.128 2.25 2.25 0 01-2.4 2.245 4.5 4.5 0 008.4-2.245c0-.399-.078-.78-.22-1.128zm0 0a15.998 15.998 0 003.388-1.62m-5.043-.025a15.994 15.994 0 011.622-3.395m3.42 3.42a15.995 15.995 0 004.764-4.648l3.876-5.814a1.151 1.151 0 00-1.597-1.597L14.146 6.32a15.996 15.996 0 00-4.649 4.763m3.42 3.42a6.776 6.776 0 00-3.42-3.42"/></svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="sidebar-bottom">
|
|
||||||
<div class="theme-toggle" id="themeToggle" title="Переключить тему">
|
|
||||||
<div class="theme-toggle-knob">
|
|
||||||
<svg class="w-3 h-3 dark:hidden text-amber-500" fill="currentColor" viewBox="0 0 20 20"><path d="M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414zm2.12-10.607a1 1 0 010 1.414l-.706.707a1 1 0 11-1.414-1.414l.707-.707a1 1 0 011.414 0zM17 11a1 1 0 100-2h-1a1 1 0 100 2h1zm-7 4a1 1 0 011 1v1a1 1 0 11-2 0v-1a1 1 0 011-1zM5.05 6.464A1 1 0 106.465 5.05l-.708-.707a1 1 0 00-1.414 1.414l.707.707zm1.414 8.486l-.707.707a1 1 0 01-1.414-1.414l.707-.707a1 1 0 011.414 1.414zM4 11a1 1 0 100-2H3a1 1 0 000 2h1z"/></svg>
|
|
||||||
<svg class="w-3 h-3 hidden dark:block text-gray-400" fill="currentColor" viewBox="0 0 20 20"><path d="M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z"/></svg>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
|
|
||||||
<div class="main-content">
|
<div class="main-content">
|
||||||
<div class="relative z-10 max-w-3xl mx-auto px-4 py-8 sm:py-12">
|
<div class="tool-container relative z-10 max-w-3xl mx-auto px-4 py-8 sm:py-12">
|
||||||
|
|
||||||
<div class="text-center mb-8 fade-up">
|
<div class="page-header 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">
|
<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>
|
||||||
XSS Protection · Client-side
|
XSS Protection · Client-side
|
||||||
@ -104,7 +30,7 @@
|
|||||||
<h1 class="text-3xl sm:text-4xl font-extrabold tracking-tight dark:text-white text-gray-900">
|
<h1 class="text-3xl sm:text-4xl font-extrabold tracking-tight dark:text-white text-gray-900">
|
||||||
HTML <span class="text-accent">Sanitizer</span>
|
HTML <span class="text-accent">Sanitizer</span>
|
||||||
</h1>
|
</h1>
|
||||||
<p class="mt-2 text-sm dark:text-gray-500 text-gray-400 font-mono">очистка, извлечение текста, entities, минификация</p>
|
<p class="description mt-2 text-sm dark:text-gray-500 text-gray-400 font-mono">очистка, извлечение текста, entities, минификация</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Tool Grid -->
|
<!-- Tool Grid -->
|
||||||
@ -166,15 +92,6 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
const html = document.documentElement;
|
|
||||||
const savedTheme = localStorage.getItem('theme');
|
|
||||||
if (savedTheme) { html.className = savedTheme; }
|
|
||||||
else if (!window.matchMedia('(prefers-color-scheme: dark)').matches) { html.className = ''; }
|
|
||||||
document.getElementById('themeToggle').addEventListener('click', () => {
|
|
||||||
const isDark = html.classList.toggle('dark');
|
|
||||||
localStorage.setItem('theme', isDark ? 'dark' : '');
|
|
||||||
});
|
|
||||||
|
|
||||||
const TOOLS = {
|
const TOOLS = {
|
||||||
sanitize: { btn: 'Очистить', ph: 'Вставьте HTML для очистки...' },
|
sanitize: { btn: 'Очистить', ph: 'Вставьте HTML для очистки...' },
|
||||||
htmlToText: { btn: 'Извлечь текст', ph: 'Вставьте HTML...' },
|
htmlToText: { btn: 'Извлечь текст', ph: 'Вставьте HTML...' },
|
||||||
|
|||||||
97
public/shared.css
Normal file
97
public/shared.css
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
/* WA Dev Tools — Shared Styles */
|
||||||
|
|
||||||
|
/* Theme variables */
|
||||||
|
:root {
|
||||||
|
--bg: #f5f5f7;
|
||||||
|
--bg-grad1: rgba(0, 67, 184, 0.04);
|
||||||
|
--bg-grad2: rgba(0, 50, 140, 0.03);
|
||||||
|
--surface-800: rgba(255,255,255,0.85);
|
||||||
|
--surface-700: #f0f0f3;
|
||||||
|
--surface-600: #dde0e6;
|
||||||
|
--text-primary: #1a1a2e;
|
||||||
|
--text-secondary: #555;
|
||||||
|
--text-muted: #888;
|
||||||
|
--bar-bg: #e0e0e0;
|
||||||
|
--select-bg: #f0f0f3;
|
||||||
|
--select-color: #1a1a2e;
|
||||||
|
--accent: #0054e6;
|
||||||
|
--accent-dim: #0043b8;
|
||||||
|
--accent-bright: #6b9fff;
|
||||||
|
--accent-bg: rgba(0,84,230,.08);
|
||||||
|
}
|
||||||
|
.dark {
|
||||||
|
--bg: #060c18;
|
||||||
|
--bg-grad1: rgba(0, 84, 230, 0.03);
|
||||||
|
--bg-grad2: rgba(0, 67, 184, 0.02);
|
||||||
|
--surface-800: rgba(9,16,32,0.8);
|
||||||
|
--surface-700: #0d1828;
|
||||||
|
--surface-600: #162040;
|
||||||
|
--text-primary: #fff;
|
||||||
|
--text-secondary: #c0c0c0;
|
||||||
|
--text-muted: #666;
|
||||||
|
--bar-bg: #0d1828;
|
||||||
|
--select-bg: #091020;
|
||||||
|
--select-color: #e0e0e0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Base */
|
||||||
|
body {
|
||||||
|
background: var(--bg);
|
||||||
|
background-image:
|
||||||
|
radial-gradient(ellipse at 20% 50%, var(--bg-grad1) 0%, transparent 50%),
|
||||||
|
radial-gradient(ellipse at 80% 20%, var(--bg-grad2) 0%, transparent 50%);
|
||||||
|
min-height: 100vh;
|
||||||
|
transition: background 0.3s;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sidebar */
|
||||||
|
.sidebar { position:fixed;top:0;left:0;width:56px;height:100vh;display:flex;flex-direction:column;align-items:center;padding:16px 0 12px;z-index:50;border-right:1px solid var(--surface-600);background:var(--surface-800);backdrop-filter:blur(12px);transition:background .3s,border-color .3s }
|
||||||
|
.sidebar-logo { margin-bottom:24px;color:var(--text-muted);font-size:10px;font-weight:700;letter-spacing:.08em;font-family:'JetBrains Mono',monospace }
|
||||||
|
.sidebar-nav { display:flex;flex-direction:column;gap:6px;flex:1 }
|
||||||
|
.sidebar-link { width:40px;height:40px;border-radius:10px;display:flex;align-items:center;justify-content:center;color:var(--text-muted);transition:all .2s;text-decoration:none;position:relative }
|
||||||
|
.sidebar-link:hover { color:var(--text-secondary);background:rgba(255,255,255,.04) }
|
||||||
|
.sidebar-link.active { color:var(--accent);background:var(--accent-bg) }
|
||||||
|
.sidebar-link.active::before { content:'';position:absolute;left:-8px;top:50%;transform:translateY(-50%);width:3px;height:20px;border-radius:0 3px 3px 0;background:var(--accent) }
|
||||||
|
.sidebar-bottom { margin-top:auto;display:flex;flex-direction:column;align-items:center;gap:8px }
|
||||||
|
.main-content { margin-left:56px }
|
||||||
|
|
||||||
|
/* Theme toggle */
|
||||||
|
.theme-toggle { width:32px;height:32px;border-radius:8px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background .2s;color:var(--text-muted) }
|
||||||
|
.theme-toggle:hover { background:rgba(255,255,255,.06);color:var(--text-secondary) }
|
||||||
|
.theme-toggle-knob { display:flex;align-items:center;justify-content:center }
|
||||||
|
|
||||||
|
/* Mobile bottom bar */
|
||||||
|
@media(max-width:640px) {
|
||||||
|
.sidebar { position:fixed;top:auto;bottom:0;left:0;width:100%;height:52px;flex-direction:row;justify-content:center;padding:0 16px;border-right:none;border-top:1px solid var(--surface-600);gap:0 }
|
||||||
|
.sidebar-logo { display:none }
|
||||||
|
.sidebar-nav { flex-direction:row;gap:4px;flex:none }
|
||||||
|
.sidebar-bottom { margin-top:0;margin-left:auto;flex-direction:row }
|
||||||
|
.sidebar-link.active::before { left:50%;top:auto;bottom:-6px;transform:translateX(-50%);width:20px;height:3px;border-radius:3px 3px 0 0 }
|
||||||
|
.main-content { margin-left:0;padding-bottom:60px }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Page header */
|
||||||
|
.page-header { margin-bottom:24px }
|
||||||
|
.page-header h1 { font-size:1.875rem;font-weight:800;letter-spacing:-0.025em;color:var(--text-primary);line-height:1.2 }
|
||||||
|
@media(min-width:640px) { .page-header h1 { font-size:2.25rem } }
|
||||||
|
.page-header h1 .accent { color:var(--accent) }
|
||||||
|
.page-header .description { margin-top:8px;font-size:0.875rem;color:var(--text-muted);font-family:'JetBrains Mono',monospace }
|
||||||
|
|
||||||
|
/* Standard content container */
|
||||||
|
.tool-container { padding:32px 16px }
|
||||||
|
@media(min-width:640px) { .tool-container { padding:48px 16px } }
|
||||||
|
|
||||||
|
/* Common form elements */
|
||||||
|
.wa-input { background:var(--select-bg);border:1px solid var(--surface-600);color:var(--select-color);padding:10px 14px;border-radius:8px;font-family:'JetBrains Mono',monospace;font-size:13px;outline:none;transition:border-color .2s }
|
||||||
|
.wa-input:focus { border-color:var(--accent) }
|
||||||
|
.wa-btn { padding:10px 20px;background:var(--accent);color:#fff;border:none;border-radius:8px;font-family:'Manrope',sans-serif;font-weight:600;font-size:14px;cursor:pointer;transition:background .2s }
|
||||||
|
.wa-btn:hover { background:var(--accent-dim) }
|
||||||
|
.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 }
|
||||||
|
|
||||||
|
/* Scrollbar */
|
||||||
|
::-webkit-scrollbar { width:6px;height:6px }
|
||||||
|
::-webkit-scrollbar-track { background:transparent }
|
||||||
|
::-webkit-scrollbar-thumb { background:var(--surface-600);border-radius:3px }
|
||||||
|
::-webkit-scrollbar-thumb:hover { background:var(--text-muted) }
|
||||||
111
public/shared.js
Normal file
111
public/shared.js
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
/* WA Dev Tools — Shared JS (sidebar, theme, tailwind config) */
|
||||||
|
|
||||||
|
/* Tailwind config */
|
||||||
|
if (typeof tailwind !== 'undefined') {
|
||||||
|
tailwind.config = {
|
||||||
|
darkMode: 'class',
|
||||||
|
theme: {
|
||||||
|
extend: {
|
||||||
|
fontFamily: {
|
||||||
|
mono: ['JetBrains Mono', 'monospace'],
|
||||||
|
sans: ['Manrope', 'sans-serif'],
|
||||||
|
},
|
||||||
|
colors: {
|
||||||
|
surface: { 900: '#060c18', 800: '#091020', 700: '#0d1828', 600: '#162040' },
|
||||||
|
accent: { DEFAULT: '#0054e6', dim: '#0043b8', bright: '#6b9fff' },
|
||||||
|
warn: '#ffd600',
|
||||||
|
danger: '#ff5252',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sidebar tools definition */
|
||||||
|
const WA_TOOLS = [
|
||||||
|
{ id: 'home', path: '/', title: 'Главная', icon: '<path stroke-linecap="round" stroke-linejoin="round" d="M2.25 12l8.954-8.955c.44-.439 1.152-.439 1.591 0L21.75 12M4.5 9.75v10.125c0 .621.504 1.125 1.125 1.125H9.75v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21h4.125c.621 0 1.125-.504 1.125-1.125V9.75M8.25 21h8.25"/>' },
|
||||||
|
{ id: 'compress', path: '/compress', title: 'Картинки', icon: '<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"/>' },
|
||||||
|
{ id: 'md', path: '/md', title: 'Markdown', icon: '<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"/>' },
|
||||||
|
{ id: 'placeholder', path: '/placeholder', title: 'Placeholder', icon: '<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"/>' },
|
||||||
|
{ id: 'parser', path: '/parser', title: 'Parser', icon: '<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"/>' },
|
||||||
|
{ id: 'password', path: '/password', title: 'Password', icon: '<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"/>' },
|
||||||
|
{ id: 'sanitizer', path: '/sanitizer', title: 'Sanitizer', icon: '<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"/>' },
|
||||||
|
{ id: 'converter', path: '/converter', title: 'Converter', icon: '<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"/>' },
|
||||||
|
{ id: 'formatter', path: '/formatter', title: 'Formatter', icon: '<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"/>' },
|
||||||
|
{ id: 'editor', path: '/editor', title: 'Editor', icon: '<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"/>' },
|
||||||
|
{ id: 'httpclient', path: '/httpclient', title: 'HTTP Client', icon: '<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"/>' },
|
||||||
|
{ id: 'redirects', path: '/redirects', title: 'Redirects', icon: '<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"/>' },
|
||||||
|
{ id: 'svgeditor', path: '/svgeditor', title: 'SVG Editor', icon: '<path stroke-linecap="round" stroke-linejoin="round" d="M9.53 16.122a3 3 0 00-5.78 1.128 2.25 2.25 0 01-2.4 2.245 4.5 4.5 0 008.4-2.245c0-.399-.078-.78-.22-1.128zm0 0a15.998 15.998 0 003.388-1.62m-5.043-.025a15.994 15.994 0 011.622-3.395m3.42 3.42a15.995 15.995 0 004.764-4.648l3.876-5.814a1.151 1.151 0 00-1.597-1.597L14.146 6.32a15.996 15.996 0 00-4.649 4.763m3.42 3.42a6.776 6.776 0 00-3.42-3.42"/>' },
|
||||||
|
{ id: 'logs', path: '/logs', title: 'Logs', icon: '<path stroke-linecap="round" stroke-linejoin="round" d="M3.75 12h16.5m-16.5 3.75h16.5M3.75 19.5h16.5M5.625 4.5h12.75a1.875 1.875 0 010 3.75H5.625a1.875 1.875 0 010-3.75z"/>' },
|
||||||
|
];
|
||||||
|
|
||||||
|
/* Build sidebar SVG icon */
|
||||||
|
function _svgIcon(innerPath) {
|
||||||
|
return `<svg width="22" height="22" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="1.5">${innerPath}</svg>`;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Inject sidebar into the page */
|
||||||
|
function initSidebar(activeId) {
|
||||||
|
// Determine active tool from activeId or URL
|
||||||
|
if (!activeId) {
|
||||||
|
const path = window.location.pathname;
|
||||||
|
const match = WA_TOOLS.find(t => t.path !== '/' && path.startsWith(t.path));
|
||||||
|
activeId = match ? match.id : 'home';
|
||||||
|
}
|
||||||
|
|
||||||
|
const links = WA_TOOLS.map(t =>
|
||||||
|
`<a href="${t.path}" class="sidebar-link${t.id === activeId ? ' active' : ''}" title="${t.title}">${_svgIcon(t.icon)}</a>`
|
||||||
|
).join('\n ');
|
||||||
|
|
||||||
|
const nav = document.createElement('nav');
|
||||||
|
nav.className = 'sidebar';
|
||||||
|
nav.innerHTML = `
|
||||||
|
<div class="sidebar-logo">WA</div>
|
||||||
|
<div class="sidebar-nav">
|
||||||
|
${links}
|
||||||
|
</div>
|
||||||
|
<div class="sidebar-bottom">
|
||||||
|
<div class="theme-toggle" id="themeToggle" title="Переключить тему">
|
||||||
|
<div class="theme-toggle-knob">
|
||||||
|
<svg class="wa-sun-icon" width="14" height="14" fill="currentColor" viewBox="0 0 20 20"><path d="M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414zm2.12-10.607a1 1 0 010 1.414l-.706.707a1 1 0 11-1.414-1.414l.707-.707a1 1 0 011.414 0zM17 11a1 1 0 100-2h-1a1 1 0 100 2h1zm-7 4a1 1 0 011 1v1a1 1 0 11-2 0v-1a1 1 0 011-1zM5.05 6.464A1 1 0 106.465 5.05l-.708-.707a1 1 0 00-1.414 1.414l.707.707zm1.414 8.486l-.707.707a1 1 0 01-1.414-1.414l.707-.707a1 1 0 011.414 1.414zM4 11a1 1 0 100-2H3a1 1 0 000 2h1z"/></svg>
|
||||||
|
<svg class="wa-moon-icon" width="14" height="14" fill="currentColor" viewBox="0 0 20 20"><path d="M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z"/></svg>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>`;
|
||||||
|
|
||||||
|
document.body.prepend(nav);
|
||||||
|
_updateThemeIcons();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Theme management */
|
||||||
|
function initTheme() {
|
||||||
|
const html = document.documentElement;
|
||||||
|
const saved = localStorage.getItem('theme');
|
||||||
|
if (saved === 'dark' || (!saved && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
|
||||||
|
html.classList.add('dark');
|
||||||
|
} else if (saved === '') {
|
||||||
|
html.classList.remove('dark');
|
||||||
|
}
|
||||||
|
|
||||||
|
document.addEventListener('click', (e) => {
|
||||||
|
const toggle = e.target.closest('#themeToggle');
|
||||||
|
if (!toggle) return;
|
||||||
|
const isDark = html.classList.toggle('dark');
|
||||||
|
localStorage.setItem('theme', isDark ? 'dark' : '');
|
||||||
|
_updateThemeIcons();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function _updateThemeIcons() {
|
||||||
|
const isDark = document.documentElement.classList.contains('dark');
|
||||||
|
document.querySelectorAll('.wa-sun-icon').forEach(el => el.style.display = isDark ? 'none' : 'block');
|
||||||
|
document.querySelectorAll('.wa-moon-icon').forEach(el => el.style.display = isDark ? 'block' : 'none');
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Auto-init on DOM ready */
|
||||||
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
|
initSidebar(window.WA_TOOL_ID);
|
||||||
|
});
|
||||||
|
|
||||||
|
/* Init theme immediately (before DOM ready to prevent flash) */
|
||||||
|
initTheme();
|
||||||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user