FOBLAND - Градиентный генератор

FOBLAND

Градиентный генератор

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Генератор градиентов для Minecraft</title>
    <style>
        :root {
            --primary: #667eea;
            --primary-dark: #5a6fd8;
            --secondary: #764ba2;
            --light: #f8f9fa;
            --dark: #343a40;
            --success: #28a745;
            --border: #dee2e6;
        }
        
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
        }
        
        body {
            background: linear-gradient(135deg, var(--primary) 0%, var(--secondary) 100%);
            min-height: 100vh;
            padding: 20px;
            color: var(--dark);
        }
        
        .container {
            max-width: 1200px;
            margin: 0 auto;
        }
        
        .header {
            text-align: center;
            margin-bottom: 30px;
            color: white;
            text-shadow: 0 2px 4px rgba(0,0,0,0.3);
        }
        
        .header h1 {
            font-size: 2.5rem;
            margin-bottom: 10px;
        }
        
        .header p {
            font-size: 1.1rem;
            opacity: 0.9;
        }
        
        .card {
            background: white;
            border-radius: 15px;
            box-shadow: 0 10px 30px rgba(0,0,0,0.2);
            overflow: hidden;
            margin-bottom: 20px;
        }
        
        .card-header {
            padding: 20px;
            border-bottom: 1px solid var(--border);
            background: var(--light);
        }
        
        .card-body {
            padding: 25px;
        }
        
        .main-content {
            display: grid;
            grid-template-columns: 1fr 1fr;
            gap: 25px;
            margin-bottom: 25px;
        }
        
        @media (max-width: 768px) {
            .main-content {
                grid-template-columns: 1fr;
            }
        }
        
        .control-group {
            margin-bottom: 20px;
        }
        
        .control-group label {
            display: block;
            margin-bottom: 8px;
            font-weight: 600;
            color: #555;
        }
        
        .color-pickers {
            display: grid;
            grid-template-columns: 1fr 1fr;
            gap: 15px;
            margin-bottom: 20px;
        }
        
        .color-input {
            width: 100%;
            height: 50px;
            border: none;
            border-radius: 8px;
            cursor: pointer;
            box-shadow: 0 2px 5px rgba(0,0,0,0.1);
        }
        
        .slider-container {
            background: var(--light);
            padding: 15px;
            border-radius: 8px;
        }
        
        input[type="range"] {
            width: 100%;
            margin: 10px 0;
        }
        
        .value-display {
            display: flex;
            justify-content: space-between;
            margin-top: 5px;
            font-size: 14px;
            color: #666;
        }
        
        .text-input {
            width: 100%;
            padding: 12px 15px;
            border: 1px solid var(--border);
            border-radius: 8px;
            font-size: 16px;
            margin-bottom: 15px;
        }
        
        .preview-box {
            min-height: 150px;
            border-radius: 10px;
            margin-bottom: 20px;
            border: 2px solid var(--border);
            display: flex;
            align-items: center;
            justify-content: center;
            padding: 20px;
            font-size: 24px;
            font-weight: bold;
            text-align: center;
            background: var(--light);
        }
        
        .code-output {
            background: #2d3748;
            color: #e2e8f0;
            padding: 20px;
            border-radius: 8px;
            font-family: 'Courier New', monospace;
            font-size: 16px;
            line-height: 1.5;
            margin-bottom: 15px;
            white-space: pre-wrap;
            word-break: break-all;
        }
        
        .buttons {
            display: grid;
            grid-template-columns: 1fr 1fr;
            gap: 15px;
            margin-top: 20px;
        }
        
        button {
            padding: 12px 20px;
            border: none;
            border-radius: 8px;
            font-size: 16px;
            font-weight: 600;
            cursor: pointer;
            transition: all 0.3s ease;
            display: flex;
            align-items: center;
            justify-content: center;
            gap: 8px;
        }
        
        .copy-btn {
            background: var(--success);
            color: white;
        }
        
        .copy-btn:hover {
            background: #218838;
        }
        
        .random-btn {
            background: var(--primary);
            color: white;
        }
        
        .random-btn:hover {
            background: var(--primary-dark);
        }
        
        .presets {
            display: grid;
            grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
            gap: 15px;
            margin-top: 20px;
        }
        
        .preset-item {
            height: 80px;
            border-radius: 8px;
            cursor: pointer;
            transition: transform 0.3s ease;
            border: 2px solid transparent;
            display: flex;
            align-items: center;
            justify-content: center;
            font-weight: bold;
            color: white;
            text-shadow: 0 1px 2px rgba(0,0,0,0.5);
        }
        
        .preset-item:hover {
            transform: scale(1.05);
        }
        
        .preset-item.active {
            border-color: var(--primary);
            box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.3);
        }
        
        .info-box {
            background: #e7f3ff;
            border-left: 4px solid var(--primary);
            padding: 15px;
            border-radius: 4px;
            margin-top: 20px;
            font-size: 14px;
        }
        
        .info-box h3 {
            margin-bottom: 8px;
            color: var(--primary);
        }
        
        .tabs {
            display: flex;
            border-bottom: 1px solid var(--border);
            margin-bottom: 20px;
        }
        
        .tab {
            padding: 12px 20px;
            cursor: pointer;
            border-bottom: 3px solid transparent;
            font-weight: 600;
        }
        
        .tab.active {
            border-bottom-color: var(--primary);
            color: var(--primary);
        }
        
        .tab-content {
            display: none;
        }
        
        .tab-content.active {
            display: block;
        }
        
        .format-option {
            display: flex;
            align-items: center;
            gap: 10px;
            margin-bottom: 15px;
        }
        
        .format-option input {
            width: 20px;
            height: 20px;
        }
        
        .minecraft-colors {
            display: grid;
            grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
            gap: 10px;
            margin-top: 15px;
        }
        
        .minecraft-color {
            height: 40px;
            border-radius: 5px;
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: 12px;
            font-weight: bold;
            cursor: pointer;
            color: white;
            text-shadow: 0 1px 2px rgba(0,0,0,0.5);
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="header">
            <h1>🎨 Генератор градиентов для Minecraft</h1>
            <p>Создавайте красивые цветные тексты для вашего сервера Minecraft</p>
        </div>
        
        <div class="main-content">
            <div class="card">
                <div class="card-header">
                    <h2>Настройки градиента</h2>
                </div>
                <div class="card-body">
                    <div class="control-group">
                        <label>Введите текст:</label>
                        <input type="text" class="text-input" id="textInput" value="Ваш текст здесь" placeholder="Введите текст для форматирования">
                    </div>
                    
                    <div class="color-pickers">
                        <div class="control-group">
                            <label for="color1">Цвет 1</label>
                            <input type="color" id="color1" class="color-input" value="#ff6b6b">
                        </div>
                        <div class="control-group">
                            <label for="color2">Цвет 2</label>
                            <input type="color" id="color2" class="color-input" value="#4ecdc4">
                        </div>
                    </div>
                    
                    <div class="control-group">
                        <label for="angle">Интенсивность градиента: <span id="angleValue">5</span></label>
                        <div class="slider-container">
                            <input type="range" id="angle" min="1" max="10" value="5">
                            <div class="value-display">
                                <span>Мягкий</span>
                                <span>Яркий</span>
                            </div>
                        </div>
                    </div>
                    
                    <div class="buttons">
                        <button class="copy-btn" onclick="copyCode()">
                            <span>📋</span> Копировать код
                        </button>
                        <button class="random-btn" onclick="generateRandom()">
                            <span>🎲</span> Случайный градиент
                        </button>
                    </div>
                </div>
            </div>
            
            <div class="card">
                <div class="card-header">
                    <h2>Результат</h2>
                </div>
                <div class="card-body">
                    <div class="preview-box" id="preview">
                        Ваш текст здесь
                    </div>
                    
                    <div class="tabs">
                        <div class="tab active" data-tab="minecraft">Код для Minecraft</div>
                        <div class="tab" data-tab="css">CSS градиент</div>
                    </div>
                    
                    <div class="tab-content active" id="minecraft-tab">
                        <div class="code-output" id="minecraftCode">
                            <!-- Код для Minecraft будет здесь -->
                        </div>
                    </div>
                    
                    <div class="tab-content" id="css-tab">
                        <div class="code-output" id="cssCode">
                            <!-- CSS код будет здесь -->
                        </div>
                    </div>
                    
                    <div class="info-box">
                        <h3>Как использовать:</h3>
                        <p>1. Настройте цвета и интенсивность градиента</p>
                        <p>2. Скопируйте сгенерированный код</p>
                        <p>3. Вставьте код в чат Minecraft или в конфигурационные файлы плагинов</p>
                    </div>
                </div>
            </div>
        </div>
        
        <div class="card">
            <div class="card-header">
                <h2>Популярные градиенты</h2>
            </div>
            <div class="card-body">
                <div class="presets" id="presetGrid">
                    <!-- Пресеты будут здесь -->
                </div>
                
                <div class="info-box">
                    <h3>Цветовые коды Minecraft</h3>
                    <div class="minecraft-colors" id="minecraftColors">
                        <!-- Цвета Minecraft будут здесь -->
                    </div>
                </div>
            </div>
        </div>
    </div>

    <script>
        // Элементы DOM
        const color1 = document.getElementById('color1');
        const color2 = document.getElementById('color2');
        const angle = document.getElementById('angle');
        const angleValue = document.getElementById('angleValue');
        const textInput = document.getElementById('textInput');
        const preview = document.getElementById('preview');
        const minecraftCode = document.getElementById('minecraftCode');
        const cssCode = document.getElementById('cssCode');
        const presetGrid = document.getElementById('presetGrid');
        const minecraftColors = document.getElementById('minecraftColors');
        
        // Цветовые коды Minecraft (формат BirdFlop)
        const minecraftColorCodes = [
            { code: '§0', name: 'Черный', hex: '#000000' },
            { code: '§1', name: 'Темно-синий', hex: '#0000AA' },
            { code: '§2', name: 'Темно-зеленый', hex: '#00AA00' },
            { code: '§3', name: 'Темно-бирюзовый', hex: '#00AAAA' },
            { code: '§4', name: 'Темно-красный', hex: '#AA0000' },
            { code: '§5', name: 'Фиолетовый', hex: '#AA00AA' },
            { code: '§6', name: 'Золотой', hex: '#FFAA00' },
            { code: '§7', name: 'Серый', hex: '#AAAAAA' },
            { code: '§8', name: 'Темно-серый', hex: '#555555' },
            { code: '§9', name: 'Синий', hex: '#5555FF' },
            { code: '§a', name: 'Зеленый', hex: '#55FF55' },
            { code: '§b', name: 'Бирюзовый', hex: '#55FFFF' },
            { code: '§c', name: 'Красный', hex: '#FF5555' },
            { code: '§d', name: 'Розовый', hex: '#FF55FF' },
            { code: '§e', name: 'Желтый', hex: '#FFFF55' },
            { code: '§f', name: 'Белый', hex: '#FFFFFF' }
        ];
        
        // Предустановленные градиенты
        const presets = [
            { colors: ['#ff6b6b', '#4ecdc4'], intensity: 5, name: 'Коралловый циан' },
            { colors: ['#667eea', '#764ba2'], intensity: 5, name: 'Фиолетовая мечта' },
            { colors: ['#f093fb', '#f5576c'], intensity: 6, name: 'Розовый закат' },
            { colors: ['#4facfe', '#00f2fe'], intensity: 5, name: 'Синий океан' },
            { colors: ['#43e97b', '#38f9d7'], intensity: 5, name: 'Зеленая свежесть' },
            { colors: ['#fa709a', '#fee140'], intensity: 7, name: 'Золотой рассвет' }
        ];
        
        // Инициализация
        function init() {
            updateGradient();
            generatePresets();
            generateMinecraftColors();
            setupTabs();
            
            // Слушатели событий
            color1.addEventListener('input', updateGradient);
            color2.addEventListener('input', updateGradient);
            angle.addEventListener('input', updateGradient);
            textInput.addEventListener('input', updateGradient);
            
            angle.addEventListener('input', function() {
                angleValue.textContent = this.value;
            });
        }
        
        // Настройка вкладок
        function setupTabs() {
            const tabs = document.querySelectorAll('.tab');
            tabs.forEach(tab => {
                tab.addEventListener('click', () => {
                    // Убираем активный класс у всех вкладок
                    tabs.forEach(t => t.classList.remove('active'));
                    // Добавляем активный класс к текущей вкладке
                    tab.classList.add('active');
                    
                    // Скрываем все содержимое вкладок
                    document.querySelectorAll('.tab-content').forEach(content => {
                        content.classList.remove('active');
                    });
                    
                    // Показываем содержимое активной вкладки
                    const tabId = tab.getAttribute('data-tab') + '-tab';
                    document.getElementById(tabId).classList.add('active');
                });
            });
        }
        
        // Обновление градиента
        function updateGradient() {
            const color1Value = color1.value;
            const color2Value = color2.value;
            const intensity = angle.value;
            const text = textInput.value || 'Ваш текст здесь';
            
            // Обновляем предпросмотр
            preview.innerHTML = text;
            preview.style.background = `linear-gradient(135deg, ${color1Value}, ${color2Value})`;
            preview.style.webkitBackgroundClip = 'text';
            preview.style.backgroundClip = 'text';
            preview.style.webkitTextFillColor = 'transparent';
            
            // Генерируем CSS код
            const gradientCSS = `background: linear-gradient(135deg, ${color1Value}, ${color2Value});
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
color: transparent;`;
            
            cssCode.textContent = gradientCSS;
            
            // Генерируем код для Minecraft
            generateMinecraftCode(text, color1Value, color2Value, intensity);
        }
        
        // Генерация кода для Minecraft
        function generateMinecraftCode(text, color1, color2, intensity) {
            // Конвертируем цвета в RGB
            const rgb1 = hexToRgb(color1);
            const rgb2 = hexToRgb(color2);
            
            let minecraftText = '';
            
            // Создаем градиент, добавляя цветовые коды для каждого символа
            for (let i = 0; i < text.length; i++) {
                const ratio = i / (text.length - 1);
                const r = Math.round(rgb1.r + (rgb2.r - rgb1.r) * ratio);
                const g = Math.round(rgb1.g + (rgb2.g - rgb1.g) * ratio);
                const b = Math.round(rgb1.b + (rgb2.b - rgb1.b) * ratio);
                
                // Находим ближайший цвет Minecraft
                const minecraftColor = findClosestMinecraftColor(r, g, b);
                
                minecraftText += minecraftColor + text[i];
            }
            
            minecraftCode.textContent = minecraftText;
        }
        
        // Поиск ближайшего цвета Minecraft
        function findClosestMinecraftColor(r, g, b) {
            let minDistance = Infinity;
            let closestColor = '§f'; // Белый по умолчанию
            
            for (const color of minecraftColorCodes) {
                const colorRgb = hexToRgb(color.hex);
                const distance = colorDistance(r, g, b, colorRgb.r, colorRgb.g, colorRgb.b);
                
                if (distance < minDistance) {
                    minDistance = distance;
                    closestColor = color.code;
                }
            }
            
            return closestColor;
        }
        
        // Расчет расстояния между цветами
        function colorDistance(r1, g1, b1, r2, g2, b2) {
            return Math.sqrt(
                Math.pow(r2 - r1, 2) + 
                Math.pow(g2 - g1, 2) + 
                Math.pow(b2 - b1, 2)
            );
        }
        
        // Конвертация HEX в RGB
        function hexToRgb(hex) {
            const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
            return result ? {
                r: parseInt(result[1], 16),
                g: parseInt(result[2], 16),
                b: parseInt(result[3], 16)
            } : { r: 0, g: 0, b: 0 };
        }
        
        // Генерация случайного градиента
        function generateRandom() {
            const randomColor1 = '#' + Math.floor(Math.random()*16777215).toString(16);
            const randomColor2 = '#' + Math.floor(Math.random()*16777215).toString(16);
            const randomIntensity = Math.floor(Math.random() * 10) + 1;
            
            color1.value = randomColor1;
            color2.value = randomColor2;
            angle.value = randomIntensity;
            angleValue.textContent = randomIntensity;
            
            updateGradient();
        }
        
        // Копирование кода
        function copyCode() {
            const activeTab = document.querySelector('.tab.active').getAttribute('data-tab');
            let codeToCopy = '';
            
            if (activeTab === 'minecraft') {
                codeToCopy = minecraftCode.textContent;
            } else {
                codeToCopy = cssCode.textContent;
            }
            
            navigator.clipboard.writeText(codeToCopy).then(() => {
                const btn = document.querySelector('.copy-btn');
                const originalText = btn.innerHTML;
                btn.innerHTML = '<span>✅</span> Скопировано!';
                setTimeout(() => {
                    btn.innerHTML = originalText;
                }, 2000);
            });
        }
        
        // Генерация пресетов
        function generatePresets() {
            presetGrid.innerHTML = '';
            presets.forEach((preset, index) => {
                const presetElement = document.createElement('div');
                presetElement.className = 'preset-item';
                presetElement.style.background = `linear-gradient(135deg, ${preset.colors[0]}, ${preset.colors[1]})`;
                presetElement.textContent = preset.name;
                
                presetElement.addEventListener('click', () => {
                    applyPreset(preset);
                    
                    document.querySelectorAll('.preset-item').forEach(item => {
                        item.classList.remove('active');
                    });
                    
                    presetElement.classList.add('active');
                });
                
                presetGrid.appendChild(presetElement);
            });
        }
        
        // Генерация цветов Minecraft
        function generateMinecraftColors() {
            minecraftColors.innerHTML = '';
            minecraftColorCodes.forEach(color => {
                const colorElement = document.createElement('div');
                colorElement.className = 'minecraft-color';
                colorElement.style.background = color.hex;
                colorElement.textContent = color.name;
                colorElement.title = `${color.name} (${color.code})`;
                
                colorElement.addEventListener('click', () => {
                    // Устанавливаем первый цвет выбранным
                    color1.value = color.hex;
                    updateGradient();
                });
                
                minecraftColors.appendChild(colorElement);
            });
        }
        
        // Применение пресета
        function applyPreset(preset) {
            color1.value = preset.colors[0];
            color2.value = preset.colors[1];
            angle.value = preset.intensity;
            angleValue.textContent = preset.intensity;
            
            updateGradient();
        }
        
        // Запуск при загрузке
        document.addEventListener('DOMContentLoaded', init);
    </script>
</body>
</html>