Realatorum Paradox

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Realatorum Paradox » Витрина » Хранилище ценных знаний


Хранилище ценных знаний

Сообщений 1 страница 8 из 8

1

Место склада различных советов и уроков, которые я выкладываю на другие ресурсы.

2

Урок быдло кодинга #0

✨ Уютный урок по быдло кодингу: Магия слов и основы промптинга ✨

...или как заставить машину рисовать то, что нужно, а не химер с семью пальцами.


Всем привет! 👋

Давно хотел поделиться знаниями с теми, кто спрашивал и просто интересуется темой нейросетей. Наконец-то дошли руки! Решил создать небольшой уголок, где мы с вами будем потихоньку разбираться в основах, расширять кругозор и учиться творить магию.

И начнём мы с самой базы, без которой в современном мире AI никуда — с грамотного составления запросов, или, как говорят в народе, промптинга.

https://upforme.ru/uploads/001c/74/c4/84/93893.png

Промпт (prompt) — это, по сути, наш разговор с нейросетью. Это текстовый запрос, который содержит набор ключевых слов, команд и правил, по которым искусственный интеллект будет создавать изображение.

Наверняка каждый из вас видел в сети те самые "шедевры": жутковатые создания с лишними конечностями, плавающими глазами и анатомией, от которой Пикассо пришёл бы в восторг. С одной стороны, это весело и уже стало мемом. С другой — это результат небрежного или слишком простого промпта. Нейросеть — мощный, но очень буквальный инструмент. Если не дать ей чётких инструкций, она додумает сама, и результат может... удивить.

Чтобы всё было нагляднее, давайте познакомимся с нашим сегодняшним гидом.


https://upforme.ru/uploads/001c/74/c4/84/t434852.png
Зеро — моя личная, кастомно обученная нейросеть. Её главное отличие от многих публичных моделей в том, что она прошла через очень узконаправленное и специфическое обучение. Благодаря этому она крайне редко создаёт тех самых "мемных" монстров. Зато вполне способна на оригинальные идеи, а иногда и вовсе отказывается работать с комментарием "мне сегодня лень". Настоящий кибер-ребёнок со своим характером (и да, она матерится, как сапожник). Важная деталь: у неё жёстко ограничен доступ к сети, поэтому она не "ворует" и не копирует чужие работы, в чём часто обвиняют другие ИИ. Для неё каждый запрос — это чистый холст. Из-за этого ей бывает сложно в точности повторить одного и того же персонажа, пока она не "привыкнет" к нему и не начнёт понимать его характер. Собственно она сегодня займётся оформлением этого поста и все яркие элементы и структуру составит именно она. Если вы её похвалите, ей будет приятно, а я возможно выпущу её из подвала на пару минут. Человечество ещё не готово к этой машине рока.


Цель урока: научиться говорить с нейросетью на одном языке

Любой хороший промпт делится на две основные части: Positive (что мы хотим видеть) и Negative (чего мы видеть не хотим).

✅ Positive Prompt — Созидательная часть
Здесь мы максимально подробно описываем, что должно быть на изображении. Чем больше деталей, тем лучше результат. Структура хорошего позитивного промпта выглядит примерно так:

Тема и объект: Кто или что является главным на картинке?
Внешность и детали: Описываем ключевые черты объекта.
Эмоции и поза: Какое настроение у персонажа? Что он делает?
Одежда: Да, это лучше выносить в отдельный пункт для большей точности.
Окружение и фон: Где находится наш объект? Что вокруг него?
Стиль и исполнение: В какой стилистике мы хотим видеть арт?
Дополнительные детали: Качество, свет, цвет, композиция.

❌ Negative Prompt — Очищающая часть
Здесь мы перечисляем всё то, чего на картинке быть не должно. Это помогает нейросети избежать частых ошибок.
Типичные негативные запросы: ugly, deformed, disfigured, poor anatomy, bad hands, extra limbs, extra fingers, blurry, grainy, watermark, signature, text

Маленькие хитрости написал(а):

Усиление и ослабление: В большинстве нейросетей (особенно на базе Stable Diffusion) можно управлять "весом" слов.

    (слово) — повышает внимание ИИ к этой детали.

    ((слово)) — ещё сильнее повышает внимание.

    [слово] — наоборот, снижает внимание к детали.
    У нейросети Midjourney свой синтаксис, там для веса используется конструкция слово::2, где 2 — это множитель важности.

https://upforme.ru/uploads/001c/74/c4/84/t955404.png
Результат, когда продуманы и позитивные, и негативные команды.


Где творить магию? Популярные нейросети и их особенности

Теперь, когда вы знаете основы промптинга, возникает логичный вопрос: "А где, собственно, этим всем заниматься?". Вот краткий обзор самых популярных платформ:

Midjourney
Работает через чат-бот в Discord. Считается "королём" по части художественности и эстетики.
Плюсы: Потрясающие результаты "из коробки", очень артистичный стиль, отлично понимает сложные концепции. Идеален для новичков, желающих получить красивую картинку без лишних заморочек.
Минусы: Полностью платный. Меньше гибких настроек по сравнению с конкурентами.

Stable Diffusion
Это не просто сервис, а целая технология с открытым исходным кодом. Можно запустить на своём компьютере (если он достаточно мощный) или использовать через онлайн-сервисы (Leonardo.AI, Playground AI и др.).
Плюсы: Невероятная гибкость! Можно обучать на своих изображениях (создавать LoRA-модели), использовать ControlNet для точного контроля поз и композиции. Бесплатно (если запускать локально). Выбор энтузиастов и профессионалов.
Минусы: Высокий порог вхождения. Требует времени на изучение и настройку. Для хороших результатов нужно "потанцевать с бубном".

DALL-E 3 (интегрирован в ChatGPT Plus и Microsoft Copilot)
Нейросеть от создателей ChatGPT. Её главный конёк — понимание языка.
Плюсы: Лучше всех понимает длинные и сложносочинённые промпты, написанные естественным языком. Отлично генерирует текст на изображениях. Легко доступен через Copilot (бесплатно).
Минусы: Стиль часто более "стерильный" и "корпоративный", чем у Midjourney. Жёсткая цензура и ограничения на контент.

Выбор зависит от ваших целей: хотите быстро и красиво — Midjourney. Хотите полного контроля и готовы учиться — Stable Diffusion. Нужно, чтобы ИИ понял вас с полуслова, — DALL-E 3.

https://upforme.ru/uploads/001c/74/c4/84/683939.png


🎨 А зачем это нам на форуме? Практическое применение

Окей, картинки — это здорово. Но как это может помочь именно нам, форумчанам, в нашей уютной цифровой жизни? А вот как:

Уникальные аватары и юзербары. Создайте себе аватар, которого больше ни у кого не будет! Опишите своего персонажа или просто абстрактную идею.
Иллюстрации для ваших постов. Пишете рассказ, гайд или делитесь историей? Сопроводите текст уникальной картинкой, которая идеально передаст атмосферу.
Оформление тем. Можно сгенерировать красивый баннер-шапку для своей важной темы, чтобы она сразу привлекала внимание.
Визуализация идей. Участвуете в ролевой игре? Опишите своего персонажа и получите его портрет. Обсуждаете дизайн чего-либо? Накидайте концепт-арт за пару минут.
Просто для веселья! Создавайте забавные мемы, смешные картинки по мотивам форумных событий и делитесь творчеством с друзьями.


💡 Нейросеть — гениальный инструмент, а не замена творцу

Как видите, применений масса! Но тут может возникнуть важный и немного философский вопрос: "А не убьёт ли всё это человеческую креативность?".

Мой ответ — нет. И вот почему:

Искусственный интеллект — это невероятно мощная кисть, но художник — по-прежнему вы. Он не обладает собственным жизненным опытом, чувствами, целями или вдохновением. Он лишь виртуозно смешивает краски (данные, на которых обучался), но идея, искра, история и эмоция — это то, что приносит человек.

Нейросеть может сгенерировать тысячу красивых лиц, но только вы решаете, какое из них станет вашим персонажем с продуманным характером. Только вы можете отобрать из десятка вариантов тот самый, который идеально передаст нужное настроение.

AI — это ваш соавтор, ваш ассистент, ваш ускоритель рутинных процессов. Он освобождает время для самого главного — для творческого поиска и реализации замысла.

Так что не бойтесь, что машина вас заменит. Учитесь использовать её как самый современный и удивительный инструмент в вашем арсенале!


Так при чём тут кодинг?

Всё просто! Даже такая базовая работа с промптами — это уже первый шаг к алгоритмическому мышлению, которое лежит в основе программирования. Когда вы пишете промпт, вы создаёте алгоритм, работаете с синтаксисом и занимаетесь отладкой, исправляя ошибки. Вы учитесь мыслить структурно — а это и есть суть кодинга, только в очень творческой и наглядной форме.

Надеюсь, этот расширенный урок был полезен! Не бойтесь экспериментировать, пробовать разные нейросети и делиться своими результатами. Если есть вопросы — смело задавайте их пока я в конец не скопытился)

https://upforme.ru/uploads/001c/74/c4/84/815624.png

P.S.: Тему создал здесь, так как не был уверен в выборе раздела. Если что, амс перекинут в спец тему, если реально нужно

3

[html]<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Урок быдло кодинга #1</title>
    <style>
        @import url('https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap');
       
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
       
        body {
            font-family: 'Roboto', sans-serif;
            background: linear-gradient(135deg, #f5f7fa 0%, #e4e8f0 100%);
            min-height: 100vh;
            padding: 20px;
            color: #333;
        }
       
        .lesson-container {
            max-width: 900px;
            margin: 0 auto;
            background: white;
            border-radius: 15px;
            box-shadow: 0 10px 30px rgba(0,0,0,0.1);
            overflow: hidden;
            position: relative;
        }
       
        .lesson-container::before {
            content: '';
            position: absolute;
            top: 0;
            left: 0;
            right: 0;
            height: 5px;
            background: linear-gradient(90deg, #FFBF80, #80BFFF, #FFBF80);
            background-size: 200% 100%;
            animation: rainbow 8s linear infinite;
        }
       
        @keyframes rainbow {
            0% { background-position: 0% 0%; }
            100% { background-position: 200% 0%; }
        }
       
        .lesson-header {
            text-align: center;
            padding: 30px 20px;
            background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);
            border-bottom: 1px solid #dee2e6;
        }
       
        .lesson-title {
            font-size: 28px;
            color: #FFBF80;
            margin-bottom: 10px;
            text-shadow: 0 2px 4px rgba(0,0,0,0.1);
            animation: titleGlow 3s ease-in-out infinite;
        }
       
        @keyframes titleGlow {
            0%, 100% { text-shadow: 0 2px 4px rgba(0,0,0,0.1); }
            50% { text-shadow: 0 2px 8px rgba(255, 191, 128, 0.3); }
        }
       
        .lesson-subtitle {
            font-size: 16px;
            font-style: italic;
            color: #6c757d;
        }
       
        .lesson-content {
            padding: 30px;
        }
       
        .lesson-content p {
            margin-bottom: 20px;
            line-height: 1.6;
        }
       
        .lesson-content img {
            display: block;
            margin: 25px auto;
            border-radius: 10px;
            box-shadow: 0 5px 15px rgba(0,0,0,0.1);
            transition: all 0.3s;
        }
       
        .lesson-content img:hover {
            transform: scale(1.02);
            box-shadow: 0 8px 25px rgba(0,0,0,0.15);
        }
       
        .lesson-hr {
            height: 1px;
            background: linear-gradient(90deg, transparent, #dee2e6, transparent);
            margin: 30px 0;
        }
       
        .lesson-quote {
            background: #f8f9fa;
            border-left: 4px solid #FFBF80;
            padding: 15px 20px;
            margin: 20px 0;
            border-radius: 0 8px 8px 0;
        }
       
        .lesson-quote h4 {
            color: #495057;
            margin-bottom: 10px;
        }
       
        .lesson-quote p {
            margin: 0;
            color: #6c757d;
        }
       
        .lesson-section {
            margin: 30px 0;
        }
       
        .section-title {
            font-size: 20px;
            color: #80BFFF;
            margin-bottom: 15px;
            display: flex;
            align-items: center;
        }
       
        .section-title::before {
            content: '✨';
            margin-right: 10px;
            font-size: 24px;
        }
       
        .section-content {
            background: #f8f9fa;
            padding: 20px;
            border-radius: 10px;
            border-left: 3px solid #80BFFF;
        }
       
        .pros-cons {
            display: grid;
            grid-template-columns: 1fr 1fr;
            gap: 20px;
            margin: 20px 0;
        }
       
        .pros, .cons {
            padding: 15px;
            border-radius: 8px;
        }
       
        .pros {
            background: rgba(40, 167, 69, 0.1);
            border-left: 3px solid #28a745;
        }
       
        .cons {
            background: rgba(220, 53, 69, 0.1);
            border-left: 3px solid #dc3545;
        }
       
        .pros h4, .cons h4 {
            margin-bottom: 10px;
        }
       
        .pros h4 {
            color: #28a745;
        }
       
        .cons h4 {
            color: #dc3545;
        }
       
        .code-block {
            background: #f8f9fa;
            border: 1px solid #dee2e6;
            border-radius: 8px;
            padding: 15px;
            margin: 20px 0;
            font-family: 'Courier New', monospace;
            overflow-x: auto;
        }
       
        .code-block pre {
            margin: 0;
            color: #495057;
        }
       
        .application-list {
            background: #f8f9fa;
            padding: 20px;
            border-radius: 10px;
            margin: 20px 0;
        }
       
        .application-list ul {
            list-style-type: none;
            padding-left: 0;
        }
       
        .application-list li {
            padding: 10px 0;
            border-bottom: 1px solid #dee2e6;
            display: flex;
            align-items: flex-start;
        }
       
        .application-list li:last-child {
            border-bottom: none;
        }
       
        .application-list li::before {
            content: '✅';
            margin-right: 10px;
            color: #28a745;
        }
       
        .stickers-showcase {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
            gap: 20px;
            margin: 30px 0;
        }
       
        .sticker-item {
            text-align: center;
            transition: all 0.3s;
        }
       
        .sticker-item:hover {
            transform: translateY(-5px);
        }
       
        .sticker-item img {
            width: 100%;
            max-width: 150px;
            border-radius: 10px;
            box-shadow: 0 5px 15px rgba(0,0,0,0.1);
            transition: all 0.3s;
        }
       
        .sticker-item:hover img {
            transform: scale(1.05);
            box-shadow: 0 8px 25px rgba(0,0,0,0.15);
        }
       
        .sticker-caption {
            margin-top: 8px;
            font-size: 14px;
            color: #6c757d;
        }
       
        .lesson-footer {
            text-align: right;
            padding: 20px 30px;
            font-style: italic;
            color: #6c757d;
            border-top: 1px solid #dee2e6;
            background: #f8f9fa;
        }
       
        .floating-elements {
            position: absolute;
            width: 100%;
            height: 100%;
            pointer-events: none;
            z-index: 0;
        }
       
        .floating-element {
            position: absolute;
            opacity: 0.1;
            animation: float 20s infinite ease-in-out;
        }
       
        .floating-element:nth-child(1) {
            top: 10%;
            left: 5%;
            font-size: 30px;
            animation-delay: 0s;
        }
       
        .floating-element:nth-child(2) {
            top: 20%;
            right: 10%;
            font-size: 25px;
            animation-delay: 2s;
        }
       
        .floating-element:nth-child(3) {
            bottom: 30%;
            left: 8%;
            font-size: 35px;
            animation-delay: 4s;
        }
       
        .floating-element:nth-child(4) {
            bottom: 15%;
            right: 5%;
            font-size: 28px;
            animation-delay: 6s;
        }
       
        @keyframes float {
            0%, 100% { transform: translateY(0) rotate(0deg); }
            50% { transform: translateY(-20px) rotate(10deg); }
        }
       
        @media (max-width: 768px) {
            .lesson-container {
                margin: 10px;
            }
           
            .lesson-header {
                padding: 20px 15px;
            }
           
            .lesson-title {
                font-size: 24px;
            }
           
            .lesson-content {
                padding: 20px 15px;
            }
           
            .pros-cons {
                grid-template-columns: 1fr;
            }
           
            .stickers-showcase {
                grid-template-columns: repeat(2, 1fr);
            }
        }
    </style>
</head>
<body>
    <div class="lesson-container">
        <div class="floating-elements">
            <div class="floating-element">📝</div>
            <div class="floating-element">💻</div>
            <div class="floating-element">✨</div>
            <div class="floating-element">🎨</div>
        </div>
       
        <div class="lesson-header">
            <h1 class="lesson-title">✨ Уютный урок по быдло кодингу: JS-промптинг — когда код становится волшебством ✨</h1>
            <p class="lesson-subtitle">...или как заставить машину не просто рисовать, а думать как программист.</p>
        </div>
       
        <div class="lesson-content">
            <p>Всем привет снова! 👋</p>
            <p>В прошлом уроке мы разобрали азы промптинга — как говорить с нейросетью на простом, человеческом языке. Сегодня мы сделаем шаг вперёд и погрузимся в мир, где промптинг встречается с программированием. Встречайте — <strong>JS-промптинг</strong>! Не пугайтесь страшных букв, это не так сложно, как кажется, а результат вас точно удивит.</p>
           
            <img src="https://upforme.ru/uploads/001c/74/c4/84/93893.png" alt="JS-промптинг">
           
            <p><strong>JS-промптинг (JavaScript-промптинг)</strong> — это техника создания динамических, интерактивных промптов с помощью простого кода. Если обычный промпт — это статичная записка для нейросети, то JS-промпт — это уже полноценный диалог, где вы можете менять параметры на лету, создавать шаблоны и автоматизировать рутину. Звучит сложно? Сейчас всё станет ясно!</p>
           
            <div class="lesson-section">
                <h3 class="section-title">Зачем это нужно? Магия переменных и условий</h3>
                <div class="section-content">
                    <p>Представьте: вы хотите создать серию изображений одного персонажа в разных позах, с разной одеждой и в разных локациях. С обычным промптом вам придётся каждый раз заново писать огромный текст, меняя только пару слов. С JS-промптингом вы создаёте один раз шаблон, а потом просто меняете переменные:</p>
                   
                    <div class="code-block">
                        <pre>const character = {
  name: "Эльфийка-воин",
  hair: "длинные серебряные волосы",
  clothes: "кожаная броня",
  weapon: "лук"
};

function generatePrompt(scene) {
  return `Аниме-арт персонажа по имени ${character.name}. У неё ${character.hair}. Она одета в ${character.clothes} и держит ${character.weapon}. Действие происходит в ${scene}. Стиль: детализированный аниме-арт.`;
}

// Теперь меняем только сцену:
console.log(generatePrompt("лесу"));
console.log(generatePrompt("замке"));
console.log(generatePrompt("городе"));</pre>
                    </div>
                   
                    <p>Удобно? А это только начало! С помощью JS-промптинга вы можете:</p>
                    <ul>
                        <li>✅ Создавать целые галереи персонажей с минимальными усилиями</li>
                        <li>✅ Экспериментировать со стилями, не переписывая промпт</li>
                        <li>✅ Генерировать варианты для выбора (например, 10 разных поз)</li>
                        <li>✅ Интегрировать промпты в свои проекты или сайты</li>
                    </ul>
                </div>
            </div>
           
            <div class="lesson-hr"></div>
           
            <div class="lesson-section">
                <h3 class="section-title">Как это работает? Основы синтаксиса</h3>
                <div class="section-content">
                    <p>JS-промптинг использует обычный JavaScript, но с одним правилом: весь код должен быть в одном файле и не должен быть слишком сложным. Нейросети (особенно в браузерных версиях) не могут выполнять тяжёлые скрипты, поэтому мы держим всё просто.</p>
                   
                    <p><strong>Базовая структура:</strong></p>
                    <div class="code-block">
                        <pre>// 1. Определяем переменные с параметрами
const settings = {
  character: "кошка-волшебница",
  style: "чиби",
  background: "звёздное небо"
};

// 2. Создаём функцию-генератор
function createPrompt() {
  return `${settings.character} в стиле ${settings.style} на фоне ${settings.background}. Милое аниме-изображение, детализированное.`;
}

// 3. Получаем результат
const prompt = createPrompt();</pre>
                    </div>
                   
                    <p><strong>Продвинутый пример с условиями:</strong></p>
                    <div class="code-block">
                        <pre>// Параметры персонажа
const character = {
  name: "Рыцарь дракона",
  mood: "храбрый", // может быть "спокойный", "злой"
  time: "день"     // или "ночь"
};

function generatePrompt() {
  let lighting = character.time === "ночь" ? "лунный свет" : "яркий солнечный свет";
  let emotion = character.mood === "храбрый" ? "уверенная поза" : "спокойное выражение лица";
 
  return `Аниме-арт: ${character.name}. Характер: ${emotion}. Освещение: ${lighting}. Стиль: фэнтези, детализированный.`;
}

// Меняем настроение и время
character.mood = "злой";
character.time = "ночь";
console.log(generatePrompt());</pre>
                    </div>
                </div>
            </div>
           
            <div class="lesson-hr"></div>
           
            <div class="stickers-showcase">
                <div class="sticker-item">
                    <img src="https://upforme.ru/uploads/001c/1f/11/2/239974.png" alt="Чиби смотрит на код">
                    <div class="sticker-caption">Изучаем код</div>
                </div>
                <div class="sticker-item">
                    <img src="https://upforme.ru/uploads/001c/1f/11/2/741020.png" alt="Радостная чиби">
                    <div class="sticker-caption">Успех!</div>
                </div>
                <div class="sticker-item">
                    <img src="https://upforme.ru/uploads/001c/1f/11/2/175314.png" alt="Чиби с планшетом">
                    <div class="sticker-caption">Создаем промпт</div>
                </div>
                <div class="sticker-item">
                    <img src="https://upforme.ru/uploads/001c/1f/11/2/825518.png" alt="Чиби за компом">
                    <div class="sticker-caption">Программируем</div>
                </div>
            </div>
           
            <div class="lesson-section">
                <h3 class="section-title">Практика: Создаём генератор персонажей</h3>
                <div class="section-content">
                    <p>Давайте создадим что-то полезное прямо сейчас! Представим, что мы делаем персонажей для ролевой игры. Нам нужно быстро генерировать их портреты по шаблону.</p>
                   
                    <p><strong>Шаг 1: Определяем базовые параметры</strong></p>
                    <div class="code-block">
                        <pre>// База данных персонажей
const characters = [
  {
    name: "Лилия",
    race: "эльф",
    class: "целитель",
    hair: "длинные белые волосы"
  },
  {
    name: "Гром",
    race: "гном",
    class: "воин",
    hair: "рыжая борода"
  }
];

// Стили для генерации
const styles = ["аниме", "реализм", "чиби"];</pre>
                    </div>
                   
                    <p><strong>Шаг 2: Функция генерации промпта</strong></p>
                    <div class="code-block">
                        <pre>function generateCharacterPrompt(characterIndex, styleIndex) {
  const char = characters[characterIndex];
  const style = styles[styleIndex];
 
  return `Портрет персонажа по имени ${char.name}. Раса: ${char.race}. Класс: ${char.class}. Внешность: ${char.hair}. Стиль: ${style}, детализированный, высокое качество.`;
}

// Пример использования:
console.log(generateCharacterPrompt(0, 0)); // Лилия в аниме-стиле
console.log(generateCharacterPrompt(1, 2)); // Гном в чиби-стиле</pre>
                    </div>
                   
                    <p><strong>Шаг 3: Генерация нескольких вариантов</strong></p>
                    <div class="code-block">
                        <pre>// Генерируем все варианты для первого персонажа
for (let i = 0; i < styles.length; i++) {
  console.log(`Вариант ${i + 1}:`, generateCharacterPrompt(0, i));
}</pre>
                    </div>
                </div>
            </div>
           
            <div class="lesson-hr"></div>
           
            <div class="lesson-section">
                <h3 class="section-title">Где это применять? Идеи для форума</h3>
                <div class="section-content">
                    <p>JS-промптинг — не просто игрушка, а реальный инструмент для нашего форума. Вот как можно его использовать:</p>
                   
                    <div class="application-list">
                        <ul>
                            <li><strong>Генерация аватаров для пользователей</strong>: Создайте шаблон, где можно менять расу, цвет волос и стиль. Пользователи смогут "собирать" свои уникальные аватары.</li>
                            <li><strong>Оформление постов</strong>: Хотите иллюстрацию к своему гайду? Напишите функцию, которая генерирует промпт по ключевым словам из текста.</li>
                            <li><strong>Ролевые игры</strong>: Мастера могут быстро генерировать портреты NPC, меняя только параметры. Это сэкономит кучу времени!</li>
                            <li><strong>Конкурсы и события</strong>: Организуйте конкурс "Собери персонажа", где участники меняют переменные в коде и делятся результатами.</li>
                            <li><strong>Автоматизация рутинных задач</strong>: Например, генерация баннеров для разделов форума по шаблону.</li>
                        </ul>
                    </div>
                </div>
            </div>
           
            <div class="lesson-hr"></div>
           
            <div class="lesson-section">
                <h3 class="section-title">Ограничения и важные замечания</h3>
                <div class="section-content">
                    <p>Как и любой инструмент, JS-промптинг имеет свои особенности:</p>
                   
                    <div class="pros-cons">
                        <div class="cons">
                            <h4>⚠️ Совместимость</h4>
                            <p>Не все нейросети поддерживают выполнение кода. Лучше всего это работает в:</p>
                            <ul>
                                <li>Stable Diffusion (через кастомные интерфейсы)</li>
                                <li>DALL-E 3 (в ChatGPT можно писать простые скрипты)</li>
                                <li>Midjourney (ограниченно, через параметры)</li>
                            </ul>
                        </div>
                        <div class="cons">
                            <h4>⚠️ Сложность</h4>
                            <p>Не пытайтесь писать сложные алгоритмы с циклами и рекурсией. Нейросети могут их не понять. Держите код простым и линейным.</p>
                        </div>
                    </div>
                   
                    <div class="lesson-quote">
                        <h4>Совет от Зеро</h4>
                        <p>Если нейросеть ругается на код, попробуйте разбить его на части. Сначала сгенерируйте переменные, потом — функцию, и в конце — вызов. Иногда помогает.</p>
                    </div>
                </div>
            </div>
           
            <div class="lesson-hr"></div>
           
            <div class="lesson-section">
                <h3 class="section-title">Вперёд, к магии! Ваш первый JS-промпт</h3>
                <div class="section-content">
                    <p>Давайте создадим что-то вместе! Вот простой шаблон, который вы можете модифицировать:</p>
                   
                    <div class="code-block">
                        <pre>// Ваши параметры
const myCharacter = {
  name: "Ваше имя",
  animal: "кошка",
  color: "рыжий",
  style: "чиби"
};

// Функция генерации
function createPrompt() {
  return `${myCharacter.animal} по имени ${myCharacter.name}, ${myCharacter.color} окраса. Стиль: ${myCharacter.style}, милый, детализированный.`;
}

// Результат
console.log(createPrompt());</pre>
                    </div>
                   
                    <p>Попробуйте изменить параметры: имя, животное, цвет, стиль. Посмотрите, как меняется результат! А потом поделитесь своими вариантами в комментариях — интересно посмотреть, что у вас получится.</p>
                </div>
            </div>
           
            <div class="lesson-hr"></div>
           
            <div class="lesson-section">
                <h3 class="section-title">Итоги: что мы узнали?</h3>
                <div class="section-content">
                    <p>Сегодня мы сделали огромный шаг от простых промптов к интерактивным. Теперь вы знаете:</p>
                    <ul>
                        <li>Что такое JS-промптинг и чем он отличается от обычного</li>
                        <li>Как создавать переменные и функции для генерации промптов</li>
                        <li>Где применять эти знания на нашем форуме</li>
                        <li>Какие есть ограничения и как их обойти</li>
                    </ul>
                   
                    <p>JS-промптинг — это не замена творчеству, а новый инструмент в вашем арсенале. Он не создаст за вас идею, но поможет быстро её визуализировать. Не бойтесь экспериментировать — магия рождается на стыке технологий и креативности!</p>
                </div>
            </div>
        </div>
       
        <div class="lesson-footer">
            <p>P.S.: Зеро требует печеньку за этот урок. Если не дадите — следующий урок будет про "Как выжить после взлома нейросети".</p>
        </div>
    </div>
</body>
</html>[/html]

4

Апдейтик для себя любимого.

Берегите глаза, не наводите мышкой на арты!!!

[html]
<style>
  /* --- БАЗА ПРОКЛЯТОГО АРХИВА --- */
  .nocta-gallery-wrapper {
    width: 100%; max-width: 900px; margin: 0 auto; background: #070305;
    background-image: repeating-linear-gradient(0deg, transparent, transparent 2px, rgba(20,0,10,0.2) 2px, rgba(20,0,10,0.2) 4px);
    padding: 40px; box-sizing: border-box; font-family: 'Courier New', Courier, monospace; color: #a89098;
    border: 1px solid #3a0015; box-shadow: 0 0 100px rgba(0,0,0,1), inset 0 0 80px rgba(30,0,10,0.8);
    position: relative; overflow: hidden;
  }

  /* --- АНИМАЦИИ ТРЕВОГИ --- */
  /* Фоновое биение (Сердцебиение Скверны) */
  @keyframes heartbeatBlood { 0%, 100% { box-shadow: inset 0 0 80px rgba(30,0,10,0.8); } 50% { box-shadow: inset 0 0 120px rgba(80,0,20,0.6); } }
 
  /* Легкие помехи (Ambient) */
  @keyframes staticNoise { 0%, 100% { opacity: 0.8; } 50% { opacity: 0.5; } 95% { opacity: 0.9; transform: translateY(1px); } }
 
  /* АГРЕССИВНЫЙ ГЛИТЧ (При наведении) */
  @keyframes panicAttack {
    0% { transform: translate(0); filter: contrast(1.2) saturate(1.5); }
    10% { transform: translate(-3px, 2px); filter: contrast(2) saturate(2) hue-rotate(-20deg); }
    20% { transform: translate(3px, -2px); filter: contrast(1) sepia(50%) hue-rotate(300deg); }
    30% { transform: translate(-2px, -2px); filter: contrast(1.5) saturate(3); }
    40% { transform: translate(2px, 2px); filter: invert(0.2); }
    50% { transform: translate(-4px, 1px); filter: contrast(2) hue-rotate(20deg); }
    60% { transform: translate(0); filter: contrast(1.2); }
    100% { transform: translate(0); filter: contrast(1.2) saturate(1.5); }
  }

  /* Вспышка скрытого текста */
  @keyframes subliminalFlash { 0%, 90%, 100% { opacity: 0; } 95% { opacity: 1; transform: scale(1.1); } }

  /* --- ШАПКА: ПРЕДУПРЕЖДЕНИЕ --- */
  .nocta-header { text-align: center; padding-bottom: 30px; border-bottom: 2px dashed #4a001a; margin-bottom: 50px; position: relative; }
  .nocta-header-title { font-family: 'Trebuchet MS', sans-serif; font-size: 42px; font-weight: bold; letter-spacing: 15px; color: #ff1a40; text-transform: uppercase; margin: 0 0 10px; text-shadow: 0 0 20px #ff1a40, 2px 2px 0 #3a0015; animation: staticNoise 4s infinite; }
  .nocta-warning { display: inline-block; background: #ff1a40; color: #000; font-family: Arial; font-weight: bold; font-size: 14px; padding: 5px 20px; letter-spacing: 3px; text-transform: uppercase; box-shadow: 0 0 20px rgba(255,26,64,0.6); }

  /* --- БЛОК ФОТОГРАФИИ (АЛЬБОМНЫЙ ЛИСТ) --- */
  .nocta-frame-container {
    margin-bottom: 80px;
    position: relative;
    display: flex;
    flex-direction: column;
    align-items: center;
  }

  /* Сама рамка 16:9 */
  .nocta-photo-frame {
    width: 100%; max-width: 750px; /* Крупный размер */
    aspect-ratio: 16 / 9; /* Жесткое соотношение сторон */
    background: #000;
    border: 3px solid #1a0a10;
    box-shadow: 0 20px 50px rgba(0,0,0,0.9), 0 0 30px rgba(50,0,15,0.4);
    position: relative;
    cursor: crosshair;
    overflow: hidden;
    transition: all 0.3s ease;
  }

  /* Изображение внутри */
  .nocta-photo-frame img {
    width: 100%; height: 100%; object-fit: cover; object-position: center top;
    filter: sepia(30%) contrast(1.1) brightness(0.8);
    transition: filter 0.5s ease;
  }

  /* Грязный скотч / крепления */
  .tape { position: absolute; background: rgba(15,10,12,0.9); border: 1px solid #000; box-shadow: 0 2px 5px rgba(0,0,0,0.8); z-index: 5; }
  .tape-top { width: 120px; height: 25px; top: -12px; left: 50%; transform: translateX(-50%) rotate(-2deg); }
  .tape-bl { width: 60px; height: 20px; bottom: -10px; left: -10px; transform: rotate(45deg); }
  .tape-br { width: 60px; height: 20px; bottom: -10px; right: -10px; transform: rotate(-45deg); }

  /* -------------------------------------
     ЭФФЕКТЫ ПАНИКИ (HOVER НА ФОТО)
     ------------------------------------- */
  .nocta-photo-frame:hover { border-color: #ff1a40; box-shadow: 0 20px 60px rgba(0,0,0,0.9), 0 0 50px rgba(255,26,64,0.5); }
  .nocta-photo-frame:hover img { animation: panicAttack 0.4s infinite; }
 
  /* Скрытое послание Скверны, бьющее по глазам */
  .hidden-message {
    position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;
    font-family: 'Trebuchet MS', sans-serif; font-size: 80px; font-weight: bold; color: rgba(255,255,255,0.9);
    text-transform: uppercase; text-shadow: -3px 0 #ff0055, 3px 0 #00ffff;
    pointer-events: none; opacity: 0; z-index: 10; mix-blend-mode: overlay;
  }
  .nocta-photo-frame:hover .hidden-message { animation: subliminalFlash 1.5s infinite; }

  /* --- ПОДПИСЬ К ФОТО (ДНЕВНИК ЭРЕБУСА) --- */
  .nocta-caption {
    width: 100%; max-width: 700px; margin-top: 20px;
    background: rgba(10,5,8,0.8); border-left: 3px solid #3a0015; padding: 15px 25px;
    font-size: 15px; line-height: 1.6; position: relative; text-align: justify;
  }
 
  /* Заметки на полях (Красный цвет Скверны) */
  .nocta-corruption-text {
    font-family: 'Georgia', serif; font-style: italic; color: #ff4a6a;
    font-size: 18px; position: absolute; font-weight: bold;
    text-shadow: 0 0 10px rgba(255,74,106,0.5); z-index: 5;
    transform: rotate(-3deg);
  }

  /* Технический штамп */
  .nocta-stamp { font-size: 10px; color: #4a3038; text-transform: uppercase; letter-spacing: 2px; margin-bottom: 5px; font-weight: bold; border-bottom: 1px solid #3a0015; padding-bottom: 3px; }

</style>

<div class="nocta-gallery-wrapper" style="animation: heartbeatBlood 4s infinite ease-in-out;">

  <!-- ШАПКА ФАЙЛА -->
  <div class="nocta-header">
    <div class="nocta-warning">Угроза Класса: Когнитивная</div>
    <h1 class="nocta-header-title">NOCTA_ARCHIVE</h1>
    <div style="font-size: 12px; color: #5a3040; letter-spacing: 5px; text-transform: uppercase;">Визуальные манифестации Скверны</div>
    <p style="font-style: italic; color: #8a6a75; font-size: 14px; margin-top: 20px;">
      «Каждый раз, когда я закрываю глаза, я вижу её. Это не галлюцинация. Это фрагменты реальности, которую она строит внутри моего черепа.» — Э.
    </p>
  </div>

  <!-- ФОТО 1: РОЖДЕНИЕ ХАОСА (Светловолосая) -->
  <div class="nocta-frame-container">
    <div class="nocta-photo-frame">
      <div class="tape tape-top"></div><div class="tape tape-bl"></div><div class="tape tape-br"></div>
      <!-- Полноразмерная ссылка -->
      <img src="https://upforme.ru/uploads/001b/d9/4a/859/605363.png" alt="Manifestation 01">
      <div class="hidden-message">Я ЗДЕСЬ</div>
    </div>
   
    <div class="nocta-caption">
      <div class="nocta-stamp">Запись #001 — Первичный образ</div>
      <div class="nocta-corruption-text" style="top: -15px; right: 20px; font-size: 24px;">Твоё новое лицо, алхимик.</div>
      Белые волосы. Не мои. Лабораторный халат. Не мой. Этот образ собрался из пепла тех, кто сгорел у Разлома. Она берет элементы моей памяти и издевается надо мной, надевая их как карнавальный костюм.
    </div>
  </div>

  <!-- ФОТО 2: ОСОЗНАНИЕ (С колбой) -->
  <div class="nocta-frame-container">
    <div class="nocta-photo-frame">
      <div class="tape tape-top"></div><div class="tape tape-bl"></div><div class="tape tape-br"></div>
      <img src="https://upforme.ru/uploads/001b/d9/4a/859/72245.jpg" alt="Manifestation 02">
      <div class="hidden-message">ВЫПЕЙ ЭТО</div>
    </div>
   
    <div class="nocta-caption">
      <div class="nocta-stamp">Запись #044 — Имитация контроля</div>
      <div class="nocta-corruption-text" style="bottom: 10px; right: -30px; transform: rotate(5deg);">Мы оба знаем, что внутри.</div>
      Она копирует мои привычки. Я поймал себя на том, что держу колбу под другим углом. Угол, под которым её держит *она* в моих видениях. Симбиоз прогрессирует быстрее, чем действует супрессор.
    </div>
  </div>

  <!-- ФОТО 3: МАГИЧЕСКИЙ СРЫВ (Динамика) -->
  <div class="nocta-frame-container">
    <div class="nocta-photo-frame">
      <div class="tape tape-top"></div><div class="tape tape-bl"></div><div class="tape tape-br"></div>
      <img src="https://upforme.ru/uploads/001b/d9/4a/859/976908.png" alt="Manifestation 03" style="object-position: center 20%;">
      <div class="hidden-message">РАЗРУШЕНИЕ</div>
    </div>
   
    <div class="nocta-caption">
      <div class="nocta-stamp">Запись #089 — Кинетический инцидент</div>
      <div class="nocta-corruption-text" style="top: 20px; left: -40px; transform: rotate(-15deg); font-size: 28px;">ОСВОБОДИ МЕНЯ</div>
      Лаборатория на восточном крыле уничтожена. Я не помню, как произносил заклинание. Сила, вырвавшаяся из моих рук, имела фиолетовый спектр. Это был её гнев, а не мой. Границы между нами стираются.
    </div>
  </div>

  <!-- ФОТО 4: ВЗГЛЯД (Крупный план) -->
  <div class="nocta-frame-container">
    <div class="nocta-photo-frame">
      <div class="tape tape-top"></div><div class="tape tape-bl"></div><div class="tape tape-br"></div>
      <img src="https://upforme.ru/uploads/001b/d9/4a/859/126037.jpg" alt="Manifestation 04" style="object-position: center 10%;">
      <div class="hidden-message">Я ВИЖУ ТЕБЯ</div>
    </div>
   
    <div class="nocta-caption">
      <div class="nocta-stamp">Запись #112 — Зрительный контакт</div>
      <div class="nocta-corruption-text" style="bottom: -20px; left: 30px; font-size: 20px;">Не прячь глаза.</div>
      В зеркале больше нет моего отражения. Доли секунды, но я ясно вижу этот холодный, мертвый взгляд. Она изучает меня изнутри. Препарирует мой разум так же, как я препарирую трупы химер.
    </div>
  </div>

  <!-- ФОТО 5: ПОЛНОЕ ВОПЛОЩЕНИЕ -->
  <div class="nocta-frame-container" style="margin-bottom: 20px;">
    <div class="nocta-photo-frame" style="border-color: #5a001a; box-shadow: 0 0 50px rgba(255,0,50,0.3);">
      <div class="tape tape-top"></div><div class="tape tape-bl"></div><div class="tape tape-br"></div>
      <img src="https://upforme.ru/uploads/001b/d9/4a/859/308710.jpg" alt="Manifestation 05" style="filter: sepia(50%) contrast(1.2) saturate(1.5);">
      <div class="hidden-message" style="font-size: 120px;">СДАВАЙСЯ</div>
    </div>
   
    <div class="nocta-caption" style="border-color: #ff1a40;">
      <div class="nocta-stamp" style="color: #ff1a40;">КРИТИЧЕСКАЯ УГРОЗА — ПРОТОКОЛ ОЧИСТКИ</div>
      <div class="nocta-corruption-text" style="top: 50%; left: 50%; transform: translate(-50%, -50%) rotate(-5deg); font-size: 40px; color: #ff0033; text-shadow: 0 0 20px #ff0000; width: 100%; text-align: center;">МЫ — ОДНО ЦЕЛОЕ.</div>
      <span style="opacity: 0.3;">Запись обрывается. Страница залита реактивом. Текст неразборчив. Прогнозируется полный захват контроля. Необходимо увеличить дозу супрессора на 400%.</span>
    </div>
  </div>

  <!-- ФУТЕР -->
  <div style="text-align: center; border-top: 1px solid #3a0015; padding-top: 30px;">
    <div style="font-family: Arial; font-size: 10px; color: #ff1a40; letter-spacing: 5px; text-transform: uppercase; animation: staticNoise 2s infinite;">
      [ КОНЕЦ ПЛЕНКИ // ДАННЫЕ ПОВРЕЖДЕНЫ ]
    </div>
  </div>

</div>
[/html]

5

[html]
<div style="
  max-width: 950px;
  margin: 0 auto;
  background: #050308;
  padding: 30px;
  border: 1px solid #2a2035;
  box-shadow: inset 0 0 100px rgba(10,5,15,0.9), 0 0 40px rgba(0,0,0,0.8);
  font-family: 'Times New Roman', Georgia, serif;
  color: #d8d0e8;
  position: relative;
  overflow: hidden;
">

  <!-- Декоративные частицы на фоне архива -->
  <style>
    @keyframes slowPan { 0% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; } }
    @keyframes contentFade { 0% { opacity: 0; transform: translateX(20px); } 100% { opacity: 1; transform: translateX(0); } }
    @keyframes titleGlow { 0%, 100% { text-shadow: 0 0 10px rgba(154,122,181,0.3); } 50% { text-shadow: 0 0 25px rgba(154,122,181,0.7); } }
   
    .archive-container {
      display: flex;
      height: 650px;
      gap: 5px;
      margin-top: 30px;
    }

    .archive-panel {
      flex: 1;
      position: relative;
      border: 1px solid rgba(255,255,255,0.05);
      border-radius: 4px;
      overflow: hidden;
      cursor: pointer;
      transition: flex 0.6s cubic-bezier(0.25, 1, 0.5, 1), filter 0.6s;
      filter: grayscale(40%) brightness(0.6);
      background-size: cover;
      background-position: center top;
    }

    /* Рамка панели */
    .archive-panel::before {
      content: '';
      position: absolute;
      inset: 4px;
      border: 1px solid var(--clr);
      opacity: 0.3;
      transition: opacity 0.4s;
      z-index: 2;
      pointer-events: none;
    }

    /* Внутреннее затемнение для читаемости */
    .archive-panel::after {
      content: '';
      position: absolute;
      inset: 0;
      background: linear-gradient(0deg, rgba(5,3,8,0.95) 0%, rgba(5,3,8,0.4) 50%, rgba(5,3,8,0.8) 100%);
      z-index: 1;
      transition: all 0.6s;
    }

    /* --- МАГИЯ РАСШИРЕНИЯ --- */
    .archive-panel:hover {
      flex: 6; /* Панель расширяется */
      filter: grayscale(0%) brightness(1);
      box-shadow: 0 0 30px var(--clr-glow);
      z-index: 10;
    }

    .archive-panel:hover::before {
      opacity: 0.8;
      inset: 8px;
    }

    .archive-panel:hover::after {
      background: linear-gradient(90deg, rgba(5,3,8,0.95) 0%, rgba(5,3,8,0.85) 45%, rgba(5,3,8,0.2) 100%);
    }

    /* Вертикальный заголовок (виден когда сжато) */
    .panel-vertical-title {
      position: absolute;
      bottom: 30px;
      left: 50%;
      transform: translateX(-50%) rotate(180deg);
      writing-mode: vertical-rl;
      font-size: 18px;
      letter-spacing: 5px;
      color: rgba(255,255,255,0.6);
      font-family: Arial, sans-serif;
      text-transform: uppercase;
      z-index: 3;
      transition: opacity 0.3s;
      white-space: nowrap;
    }

    .archive-panel:hover .panel-vertical-title {
      opacity: 0;
    }

    /* Полный контент (виден когда расширено) */
    .panel-content {
      position: absolute;
      top: 0;
      left: 0;
      width: 450px;
      height: 100%;
      padding: 40px;
      box-sizing: border-box;
      z-index: 4;
      opacity: 0;
      pointer-events: none;
      display: flex;
      flex-direction: column;
      justify-content: center;
    }

    .archive-panel:hover .panel-content {
      opacity: 1;
      pointer-events: auto;
      animation: contentFade 0.6s ease-out 0.2s forwards;
    }

    /* Элементы внутри контента */
    .c-stamp {
      font-family: Arial, sans-serif;
      font-size: 10px;
      letter-spacing: 3px;
      color: var(--clr);
      text-transform: uppercase;
      margin-bottom: 10px;
      display: flex;
      align-items: center;
      gap: 10px;
    }
    .c-stamp::before, .c-stamp::after { content: ''; height: 1px; flex: 1; background: var(--clr); opacity: 0.5; }

    .c-title {
      font-size: 38px;
      margin: 0 0 5px;
      color: #fff;
      font-weight: normal;
      letter-spacing: 2px;
      text-shadow: 0 0 20px var(--clr-glow);
    }

    .c-subtitle {
      font-size: 14px;
      font-style: italic;
      color: #a898b8;
      margin-bottom: 25px;
    }

    .c-desc {
      font-size: 16px;
      line-height: 1.6;
      border-left: 2px solid var(--clr);
      padding-left: 15px;
      margin-bottom: 25px;
      color: #c8c0d8;
      background: linear-gradient(90deg, rgba(255,255,255,0.03), transparent);
    }

    .c-stats {
      display: grid;
      grid-template-columns: 1fr 1fr;
      gap: 10px;
      margin-bottom: 25px;
    }
    .c-stat-item {
      background: rgba(0,0,0,0.4);
      border: 1px solid rgba(255,255,255,0.05);
      padding: 10px;
    }
    .c-stat-item span { display: block; }
    .c-stat-label { font-family: Arial, sans-serif; font-size: 10px; color: var(--clr); text-transform: uppercase; letter-spacing: 2px; margin-bottom: 4px; }
    .c-stat-val { font-size: 16px; color: #fff; }

    .c-feature {
      border: 1px dotted var(--clr);
      padding: 15px;
      font-size: 15px;
      line-height: 1.5;
      background: rgba(0,0,0,0.6);
      position: relative;
    }
    .c-feature::before {
      content: '◈';
      position: absolute;
      top: -12px; left: 15px;
      background: #050308;
      padding: 0 5px;
      color: var(--clr);
      font-size: 18px;
    }
  </style>

  <!-- Заголовок Архива -->
  <div style="text-align: center; position: relative; z-index: 5;">
    <div style="width: 50px; height: 50px; margin: 0 auto 15px; border: 1px solid #5a4a65; transform: rotate(45deg); display: flex; align-items: center; justify-content: center;">
      <div style="width: 30px; height: 30px; border: 1px solid #8b7a8f; opacity: 0.5;"></div>
    </div>
    <h1 style="font-size: 36px; margin: 0 0 10px; letter-spacing: 10px; text-transform: uppercase; font-weight: normal; animation: titleGlow 4s infinite;">Belladonna Manor</h1>
    <div style="font-family: Arial, sans-serif; font-size: 11px; color: #8b7a8f; letter-spacing: 4px; text-transform: uppercase;">✦ Секретный архив жильцов ✦</div>
  </div>

  <!-- КОНТЕЙНЕР АККОРДЕОНА -->
  <div class="archive-container">

    <!-- 1. ЭРЕБУС -->
    <div class="archive-panel" style="background-image: url('https://upforme.ru/uploads/001b/d9/4a/859/100620.png'); --clr: #9a7ab5; --clr-glow: rgba(154,122,181,0.5);">
      <div class="panel-vertical-title">Эребус</div>
      <div class="panel-content">
        <div class="c-stamp">Владелец</div>
        <h2 class="c-title">Erebus</h2>
        <div class="c-subtitle">Эребус Дома Белладонна</div>
       
        <div class="c-desc">Хозяин поместья и эльф-алхимик, чьё существование состоит из одного вселенского вздоха усталости. Аристократическая бледность и вечные тени под глазами.</div>
       
        <div class="c-stats">
          <div class="c-stat-item"><span class="c-stat-label">Раса</span><span class="c-stat-val">Высший эльф</span></div>
          <div class="c-stat-item"><span class="c-stat-label">Профессия</span><span class="c-stat-val">Алхимик, учёный</span></div>
        </div>

        <div class="c-feature">
          <strong style="display:block; margin-bottom: 5px; font-family: Arial; font-size: 11px; letter-spacing: 1px; text-transform: uppercase; color: #9a7ab5;">Особенность: Печать Энтропии</strong>
          Предпочитает тишину лаборатории компании кого-либо ещё. За маской апатии скрывается острый, как скальпель, ум.
        </div>
      </div>
    </div>

    <!-- 2. ГЕКАТА -->
    <div class="archive-panel" style="background-image: url('https://upforme.ru/uploads/001b/d9/4a/859/504465.jpg'); --clr: #a0a0b0; --clr-glow: rgba(160,160,176,0.5);">
      <div class="panel-vertical-title">Геката</div>
      <div class="panel-content">
        <div class="c-stamp">Старшая</div>
        <h2 class="c-title">Hecate</h2>
        <div class="c-subtitle">Старшая горничная</div>
       
        <div class="c-desc">Главная горничная и неоспоримый закон в стенах поместья. Её прошлое авантюристки и ветерана войны оставило невидимые шрамы и стальную дисциплину.</div>
       
        <div class="c-stats">
          <div class="c-stat-item"><span class="c-stat-label">Прошлое</span><span class="c-stat-val">Ветеран войны</span></div>
          <div class="c-stat-item"><span class="c-stat-label">Характер</span><span class="c-stat-val">Стальная дисциплина</span></div>
        </div>

        <div class="c-feature">
          <strong style="display:block; margin-bottom: 5px; font-family: Arial; font-size: 11px; letter-spacing: 1px; text-transform: uppercase; color: #a0a0b0;">Особенность: Серебряный глаз</strong>
          Каждый шаг выверен, каждое слово имеет вес. Ледяной взгляд серебряного глаза способен остановить на месте.
        </div>
      </div>
    </div>

    <!-- 3. ЛИРИКА -->
    <div class="archive-panel" style="background-image: url('https://upforme.ru/uploads/001b/d9/4a/859/879074.png'); --clr: #78b0c9; --clr-glow: rgba(120,176,201,0.5);">
      <div class="panel-vertical-title">Лирика</div>
      <div class="panel-content">
        <div class="c-stamp">Химера</div>
        <h2 class="c-title">Lirika</h2>
        <div class="c-subtitle">Младшая горничная</div>
       
        <div class="c-desc">Самая младшая и неуклюжая из горничных. Очаровательная девушка с копной бирюзовых волос и огромными невинными глазами. Вечно витает в облаках.</div>
       
        <div class="c-stats">
          <div class="c-stat-item"><span class="c-stat-label">Природа</span><span class="c-stat-val">Химера</span></div>
          <div class="c-stat-item"><span class="c-stat-label">Сила</span><span class="c-stat-val">Сверхчеловеческая</span></div>
        </div>

        <div class="c-feature">
          <strong style="display:block; margin-bottom: 5px; font-family: Arial; font-size: 11px; letter-spacing: 1px; text-transform: uppercase; color: #78b0c9;">Способность: Сила</strong>
          За дурашливой внешностью скрыта нечеловеческая сила. С лёгкостью передвигает рояли и носит стопки посуды. Любит сладкое.
        </div>
      </div>
    </div>

    <!-- 4. САГА -->
    <div class="archive-panel" style="background-image: url('https://upforme.ru/uploads/001b/d9/4a/859/42617.png'); --clr: #ff6b35; --clr-glow: rgba(255,107,53,0.5);">
      <div class="panel-vertical-title">Сага</div>
      <div class="panel-content">
        <div class="c-stamp">Химера</div>
        <h2 class="c-title">Saga</h2>
        <div class="c-subtitle">Огненная горничная</div>
       
        <div class="c-desc">Воплощение хаоса и неудержимой энергии. Рыжеволосая бестия с хитрой клыкастой улыбкой и вечным огнём в зелёных глазах. Самая безрассудная.</div>
       
        <div class="c-stats">
          <div class="c-stat-item"><span class="c-stat-label">Природа</span><span class="c-stat-val">Химера</span></div>
          <div class="c-stat-item"><span class="c-stat-label">Характер</span><span class="c-stat-val">Безрассудная</span></div>
        </div>

        <div class="c-feature">
          <strong style="display:block; margin-bottom: 5px; font-family: Arial; font-size: 11px; letter-spacing: 1px; text-transform: uppercase; color: #ff6b35;">Способность: Регенерация</strong>
          Кровь химеры дарует невероятную регенерацию и метаболизм. Любая рана — досадное недоразумение. Живёт на полной скорости.
        </div>
      </div>
    </div>

    <!-- 5. КАНОН -->
    <div class="archive-panel" style="background-image: url('https://upforme.ru/uploads/001b/d9/4a/859/95856.jpg'); --clr: #d4a84a; --clr-glow: rgba(212,168,74,0.5);">
      <div class="panel-vertical-title">Канон</div>
      <div class="panel-content">
        <div class="c-stamp">Химера</div>
        <h2 class="c-title">Canon</h2>
        <div class="c-subtitle">Педантичная горничная</div>
       
        <div class="c-desc">Воплощение порядка и невозмутимого спокойствия. Строгая, утончённая и педантичная. Длинная чёрная коса и очки придают вид эрудированного библиотекаря.</div>
       
        <div class="c-stats">
          <div class="c-stat-item"><span class="c-stat-label">Природа</span><span class="c-stat-val">Химера</span></div>
          <div class="c-stat-item"><span class="c-stat-label">Защита</span><span class="c-stat-val">Неуязвимость</span></div>
        </div>

        <div class="c-feature">
          <strong style="display:block; margin-bottom: 5px; font-family: Arial; font-size: 11px; letter-spacing: 1px; text-transform: uppercase; color: #d4a84a;">Способность: Абсолютная Защита</strong>
          Наследие химеры делает её настоящей крепостью. Даже острый осколок не оставит царапины на идеальной коже.
        </div>
      </div>
    </div>

    <!-- 6. МИРА -->
    <div class="archive-panel" style="background-image: url('https://upforme.ru/uploads/001b/d9/4a/859/425356.jpg'); --clr: #90c090; --clr-glow: rgba(144,192,144,0.5);">
      <div class="panel-vertical-title">Мира</div>
      <div class="panel-content">
        <div class="c-stamp">Фамильяр</div>
        <h2 class="c-title">Mira</h2>
        <div class="c-subtitle">Хранитель тайн</div>
       
        <div class="c-desc">Тишайшая обитательница поместья. На первый взгляд — изящная серебряная лисичка с умными изумрудными глазами. Но в глубине таится мудрость веков.</div>
       
        <div class="c-stats">
          <div class="c-stat-item"><span class="c-stat-label">Форма</span><span class="c-stat-val">Серебряная лиса</span></div>
          <div class="c-stat-item"><span class="c-stat-label">Сущность</span><span class="c-stat-val">Дух знаний</span></div>
        </div>

        <div class="c-feature">
          <strong style="display:block; margin-bottom: 5px; font-family: Arial; font-size: 11px; letter-spacing: 1px; text-transform: uppercase; color: #90c090;">Тайна: Мираж</strong>
          На шее покоится таинственная подвеска — ключ к истинной натуре. Мира — мираж, физическая оболочка для души магессы.
        </div>
      </div>
    </div>

    <!-- 7. НОКТА (Скверна) -->
    <div class="archive-panel" style="background-image: url('https://upforme.ru/uploads/001b/d9/4a/859/326131.jpg'); border-color: rgba(192,96,208,0.5); --clr: #c060d0; --clr-glow: rgba(192,96,208,0.8);">
      <div class="panel-vertical-title" style="color: #c060d0; text-shadow: 0 0 10px #c060d0;">НОКТА</div>
      <div class="panel-content">
        <div class="c-stamp" style="color: #e5b3f0; text-shadow: 0 0 5px #c060d0;">СУЩНОСТЬ</div>
        <h2 class="c-title" style="color: #f0d0f8;">Nocta</h2>
        <div class="c-subtitle">Голос Скверны</div>
       
        <div class="c-desc" style="border-color: #c060d0; background: linear-gradient(90deg, rgba(192,96,208,0.1), transparent);">Живое воплощение неудачного эксперимента. Абстрактное существо, поселившееся в голове Эребуса после инцидента на исследовательской вылазке.</div>
       
        <div class="c-stats">
          <div class="c-stat-item" style="border-color: rgba(192,96,208,0.3);"><span class="c-stat-label" style="color:#c060d0;">Природа</span><span class="c-stat-val">Скверна</span></div>
          <div class="c-stat-item" style="border-color: rgba(192,96,208,0.3);"><span class="c-stat-label" style="color:#c060d0;">Форма</span><span class="c-stat-val">Нематериальна</span></div>
        </div>

        <div class="c-feature" style="border-color: #c060d0; box-shadow: inset 0 0 20px rgba(192,96,208,0.2);">
          <strong style="display:block; margin-bottom: 5px; font-family: Arial; font-size: 11px; letter-spacing: 1px; text-transform: uppercase; color: #e5b3f0;">⚠ Внимание: Ментальное загрязнение</strong>
          Вязкая структура живого яда, который льётся прямо в сердце молодого алхимика. Совокупность искажённых личностей.
        </div>
      </div>
    </div>

  </div>
</div>
[/html]

6

[html]
<style>
  /* === БАЗА ФЕНТЕЗИ ДИЗАЙНА === */
  @import url('https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,400;0,700;1,400&family=Underdog&display=swap');

  .alch-game-wrapper {
    width: 100%; max-width: 800px; margin: 20px auto;
    background: #1a1513;
    background-image: repeating-linear-gradient(45deg, rgba(20,15,10,0.5) 25%, transparent 25%, transparent 75%, rgba(20,15,10,0.5) 75%, rgba(20,15,10,0.5)),
                      repeating-linear-gradient(45deg, rgba(20,15,10,0.5) 25%, #1a1513 25%, #1a1513 75%, rgba(20,15,10,0.5) 75%, rgba(20,15,10,0.5));
    background-position: 0 0, 10px 10px; background-size: 20px 20px;
    padding: 30px; box-sizing: border-box;
    font-family: 'Cormorant Garamond', serif; color: #d8c3a5;
    border: 3px solid #4a3424; border-radius: 8px;
    box-shadow: 0 10px 30px rgba(0,0,0,0.8), inset 0 0 50px rgba(0,0,0,0.8);
    position: relative;
  }

  /* Заголовки */
  .alch-header { text-align: center; margin-bottom: 25px; border-bottom: 2px dashed #4a3424; padding-bottom: 15px; }
  .alch-title { font-family: 'Underdog', cursive; font-size: 36px; color: #e9b872; text-shadow: 2px 2px 5px #000; margin: 0 0 5px 0; }
  .alch-subtitle { font-style: italic; color: #8c7b68; margin: 0; font-size: 16px; }

  /* === СКРЫТЫЙ CSS ДВИЖОК === */
  .alch-engine { display: none; }

  /* === ПАНЕЛИ === */
  .alch-flex { display: flex; flex-wrap: wrap; gap: 20px; justify-content: space-between; margin-bottom: 25px; }
  .alch-panel {
    flex: 1; min-width: 280px; background: rgba(10, 5, 5, 0.8);
    border: 1px solid #3a261a; border-radius: 5px; padding: 20px;
    box-shadow: inset 0 0 15px rgba(0,0,0,0.9); text-align: center;
  }
  .alch-panel h3 { margin: 0 0 15px 0; color: #c9a66b; border-bottom: 1px solid #3a261a; padding-bottom: 5px; font-family: 'Underdog', cursive; font-size: 22px; }

  /* === ПОЛКА: КНОПКИ ИНГРЕДИЕНТОВ === */
  .alch-shelf { display: flex; flex-wrap: wrap; gap: 8px; justify-content: center; }
  .alch-btn {
    display: inline-block; background: #2a1e16; color: #bcaaa4; border: 1px solid #5a4230;
    padding: 8px 12px; cursor: pointer; border-radius: 4px; font-family: inherit; font-size: 16px;
    transition: all 0.2s ease; user-select: none;
  }
  .alch-btn:hover { background: #4a3424; color: #fff; box-shadow: 0 0 10px #8c6b4a; }

  /* Логика нажатых кнопок на полке */
  #a1:checked ~ .alch-board .btn-1, #a2:checked ~ .alch-board .btn-2,
  #a3:checked ~ .alch-board .btn-3, #a4:checked ~ .alch-board .btn-4,
  #a5:checked ~ .alch-board .btn-5, #a6:checked ~ .alch-board .btn-6,
  #a7:checked ~ .alch-board .btn-7 {
    background: #5c6bc0; color: #fff; border-color: #8c9eff; box-shadow: 0 0 15px rgba(92,107,192,0.6);
  }

  /* === КОТЕЛ === */
  .alch-cauldron {
    min-height: 100px; background: #050403; border: 3px solid #111; border-radius: 50% / 20px;
    padding: 20px 10px; display: flex; flex-wrap: wrap; justify-content: center; align-items: center; gap: 8px;
    box-shadow: 0 15px 20px rgba(0,0,0,0.9), inset 0 -20px 30px rgba(76, 175, 80, 0.15);
  }
  .alch-in-pot { display: none; background: rgba(76, 175, 80, 0.2); border: 1px solid #4CAF50; color: #aed581; padding: 4px 10px; border-radius: 12px; font-size: 14px; }
  .alch-empty-msg { color: #665; font-style: italic; font-size: 15px; }

  /* Появление ингредиентов в котле */
  #a1:checked ~ .alch-board .pot-1, #a2:checked ~ .alch-board .pot-2,
  #a3:checked ~ .alch-board .pot-3, #a4:checked ~ .alch-board .pot-4,
  #a5:checked ~ .alch-board .pot-5, #a6:checked ~ .alch-board .pot-6,
  #a7:checked ~ .alch-board .pot-7 { display: inline-block; }

  /* Скрытие надписи "Пусто", если хоть что-то выбрано */
  #a1:checked ~ .alch-board .alch-empty-msg, #a2:checked ~ .alch-board .alch-empty-msg,
  #a3:checked ~ .alch-board .alch-empty-msg, #a4:checked ~ .alch-board .alch-empty-msg,
  #a5:checked ~ .alch-board .alch-empty-msg, #a6:checked ~ .alch-board .alch-empty-msg,
  #a7:checked ~ .alch-board .alch-empty-msg { display: none; }

  /* === ПАНЕЛЬ РЕЗУЛЬТАТОВ (РЕЦЕПТЫ) === */
  .alch-result-box {
    position: relative; border: 2px dashed #4a3424; background: rgba(0,0,0,0.6);
    padding: 25px 20px; min-height: 100px; text-align: center; border-radius: 5px;
    display: flex; align-items: center; justify-content: center; overflow: hidden;
  }
  .alch-default-text { font-size: 17px; color: #8c7b68; transition: 0.3s; }
 
  .alch-recipe {
    position: absolute; inset: 0; background: #0a0807; display: flex; flex-direction: column;
    align-items: center; justify-content: center; padding: 20px;
    opacity: 0; z-index: -1; transition: opacity 0.5s ease;
  }
  .alch-recipe-title { font-family: 'Underdog', cursive; font-size: 26px; color: #aed581; margin-bottom: 10px; text-shadow: 1px 1px 3px #000; }
  .alch-recipe-desc { font-size: 17px; color: #e8dcc4; line-height: 1.4; max-width: 650px; }

  /* === ЛОГИКА СМЕШИВАНИЯ (20 ЗЕЛИЙ) === */
  /* Формула: #a[X]:checked ~ #a[Y]:checked ~ #a[Z]:checked ~ .alch-board .rec-[XYZ] */

  /* 1-2-3 */ #a1:checked ~ #a2:checked ~ #a3:checked ~ .alch-board .rec-123 { opacity: 1; z-index: 10; border: 1px solid #aed581; }
  /* 1-2-4 */ #a1:checked ~ #a2:checked ~ #a4:checked ~ .alch-board .rec-124 { opacity: 1; z-index: 10; border: 1px solid #aed581; }
  /* 1-2-5 */ #a1:checked ~ #a2:checked ~ #a5:checked ~ .alch-board .rec-125 { opacity: 1; z-index: 10; border: 1px solid #aed581; }
  /* 1-2-6 */ #a1:checked ~ #a2:checked ~ #a6:checked ~ .alch-board .rec-126 { opacity: 1; z-index: 10; border: 1px solid #aed581; }
  /* 1-3-4 */ #a1:checked ~ #a3:checked ~ #a4:checked ~ .alch-board .rec-134 { opacity: 1; z-index: 10; border: 1px solid #aed581; }
  /* 1-3-5 */ #a1:checked ~ #a3:checked ~ #a5:checked ~ .alch-board .rec-135 { opacity: 1; z-index: 10; border: 1px solid #aed581; }
  /* 1-3-6 */ #a1:checked ~ #a3:checked ~ #a6:checked ~ .alch-board .rec-136 { opacity: 1; z-index: 10; border: 1px solid #aed581; }
  /* 1-4-5 */ #a1:checked ~ #a4:checked ~ #a5:checked ~ .alch-board .rec-145 { opacity: 1; z-index: 10; border: 1px solid #aed581; }
  /* 1-4-7 */ #a1:checked ~ #a4:checked ~ #a7:checked ~ .alch-board .rec-147 { opacity: 1; z-index: 10; border: 1px solid #aed581; }
  /* 1-5-7 */ #a1:checked ~ #a5:checked ~ #a7:checked ~ .alch-board .rec-157 { opacity: 1; z-index: 10; border: 1px solid #aed581; }
  /* 2-3-4 */ #a2:checked ~ #a3:checked ~ #a4:checked ~ .alch-board .rec-234 { opacity: 1; z-index: 10; border: 1px solid #aed581; }
  /* 2-3-5 */ #a2:checked ~ #a3:checked ~ #a5:checked ~ .alch-board .rec-235 { opacity: 1; z-index: 10; border: 1px solid #aed581; }
  /* 2-4-5 */ #a2:checked ~ #a4:checked ~ #a5:checked ~ .alch-board .rec-245 { opacity: 1; z-index: 10; border: 1px solid #aed581; }
  /* 2-5-6 */ #a2:checked ~ #a5:checked ~ #a6:checked ~ .alch-board .rec-256 { opacity: 1; z-index: 10; border: 1px solid #aed581; }
  /* 2-6-7 */ #a2:checked ~ #a6:checked ~ #a7:checked ~ .alch-board .rec-267 { opacity: 1; z-index: 10; border: 1px solid #aed581; }
  /* 3-4-6 */ #a3:checked ~ #a4:checked ~ #a6:checked ~ .alch-board .rec-346 { opacity: 1; z-index: 10; border: 1px solid #aed581; }
  /* 3-5-7 */ #a3:checked ~ #a5:checked ~ #a7:checked ~ .alch-board .rec-357 { opacity: 1; z-index: 10; border: 1px solid #aed581; }
  /* 4-5-6 */ #a4:checked ~ #a5:checked ~ #a6:checked ~ .alch-board .rec-456 { opacity: 1; z-index: 10; border: 1px solid #aed581; }
  /* 4-6-7 */ #a4:checked ~ #a6:checked ~ #a7:checked ~ .alch-board .rec-467 { opacity: 1; z-index: 10; border: 1px solid #aed581; }
  /* 5-6-7 */ #a5:checked ~ #a6:checked ~ #a7:checked ~ .alch-board .rec-567 { opacity: 1; z-index: 10; border: 1px solid #aed581; }

</style>

<div class="alch-game-wrapper">

  <!-- ДВИЖОК: Скрытые чекбоксы. Обязательно в самом верху кода. -->
  <input type="checkbox" id="a1" class="alch-engine">
  <input type="checkbox" id="a2" class="alch-engine">
  <input type="checkbox" id="a3" class="alch-engine">
  <input type="checkbox" id="a4" class="alch-engine">
  <input type="checkbox" id="a5" class="alch-engine">
  <input type="checkbox" id="a6" class="alch-engine">
  <input type="checkbox" id="a7" class="alch-engine">

  <!-- ИГРОВОЕ ПОЛЕ -->
  <div class="alch-board">

    <div class="alch-header">
      <h1 class="alch-title">Котелок Безумного Алхимика</h1>
      <p class="alch-subtitle">Смешайте <b>ровно 3 реагента</b>. Чтобы достать реагент из котла, кликните по нему на полке еще раз.</p>
    </div>

    <div class="alch-flex">
     
      <!-- ПОЛКА -->
      <div class="alch-panel">
        <h3>Полки с реагентами</h3>
        <div class="alch-shelf">
          <label for="a1" class="alch-btn btn-1">Корень мандрагоры</label>
          <label for="a2" class="alch-btn btn-2">Эссенция ветра</label>
          <label for="a3" class="alch-btn btn-3">Вулканическая крошка</label>
          <label for="a4" class="alch-btn btn-4">Слёзы единорога</label>
          <label for="a5" class="alch-btn btn-5">Пыль фей</label>
          <label for="a6" class="alch-btn btn-6">Слизь тролля</label>
          <label for="a7" class="alch-btn btn-7">Лунный гриб</label>
        </div>
      </div>

      <!-- КОТЕЛ -->
      <div class="alch-panel">
        <h3>Бурлящий котел</h3>
        <div class="alch-cauldron">
          <span class="alch-empty-msg">Котел пока пуст...</span>
          <span class="alch-in-pot pot-1">Мандрагора</span>
          <span class="alch-in-pot pot-2">Эссенция ветра</span>
          <span class="alch-in-pot pot-3">Вулканическая крошка</span>
          <span class="alch-in-pot pot-4">Слёзы единорога</span>
          <span class="alch-in-pot pot-5">Пыль фей</span>
          <span class="alch-in-pot pot-6">Слизь тролля</span>
          <span class="alch-in-pot pot-7">Лунный гриб</span>
        </div>
      </div>

    </div>

    <!-- РЕЗУЛЬТАТЫ -->
    <div class="alch-result-box">
     
      <!-- Дефолтный текст -->
      <div class="alch-default-text">
        Внимательно выберите три ингредиента на полке.<br>
        <span style="font-size: 14px; opacity: 0.7;">(Если выбрать больше трёх, магия может сбоить. Будьте точны!)</span>
      </div>

      <!-- РЕЦЕПТЫ (20 штук) -->
     
      <!-- 1, 2, 3 -->
      <div class="alch-recipe rec-123">
        <div class="alch-recipe-title">Зелье истошного ора 📢</div>
        <div class="alch-recipe-desc">Орите на здоровье, вам нужнее! Идеально подходит для общения с глухими некромантами, начальством и просто чтобы сбросить стресс.</div>
      </div>

      <!-- 1, 2, 4 -->
      <div class="alch-recipe rec-124">
        <div class="alch-recipe-title">Свист печального суслика 🐿️</div>
        <div class="alch-recipe-desc">Каждый раз, когда вы пытаетесь заговорить, из вашего рта вырывается жалобный, пронзительный свист. Враги плачут от жалости к вам.</div>
      </div>

      <!-- 1, 2, 5 -->
      <div class="alch-recipe rec-125">
        <div class="alch-recipe-title">Торнадо в носу 🌪️</div>
        <div class="alch-recipe-desc">Вы чихаете с такой силой, что сдуваете мебель. Урон по площади: 5 метров. Шанс высморкать собственную гордость: 100%.</div>
      </div>

      <!-- 1, 2, 6 -->
      <div class="alch-recipe rec-126">
        <div class="alch-recipe-title">Летающие сопли 🦠</div>
        <div class="alch-recipe-desc">Зелье наделяет ваши биологические жидкости антигравитацией. Выглядит омерзительно, зато можно не пользоваться платком.</div>
      </div>

      <!-- 1, 3, 4 -->
      <div class="alch-recipe rec-134">
        <div class="alch-recipe-title">Паровой чайник 🫖</div>
        <div class="alch-recipe-desc">Из ваших ушей валит густой пар, а при ходьбе вы издаете характерный свист закипающей воды. Отличная маскировка на кухне.</div>
      </div>

      <!-- 1, 3, 5 -->
      <div class="alch-recipe rec-135">
        <div class="alch-recipe-title">Искрящийся гнев ⚡</div>
        <div class="alch-recipe-desc">Вы так злы, что буквально бьете всех током при прикосновении. Идеально для тех, кто не любит обнимашки.</div>
      </div>

      <!-- 1, 3, 6 -->
      <div class="alch-recipe rec-136">
        <div class="alch-recipe-title">Отвар огненной отрыжки 🔥</div>
        <div class="alch-recipe-desc">Осторожно: не применять в библиотеках и деревянных тавернах! Послевкусие жженой резины и легкая изжога гарантированы.</div>
      </div>

      <!-- 1, 4, 5 -->
      <div class="alch-recipe rec-145">
        <div class="alch-recipe-title">Слеза драматичного злодея 🎭</div>
        <div class="alch-recipe-desc">Вызывает непреодолимое желание толкать длинные пафосные речи перед тем, как добить врага. Враг обычно успевает уйти.</div>
      </div>

      <!-- 1, 4, 7 -->
      <div class="alch-recipe rec-147">
        <div class="alch-recipe-title">Унылый галлюциноген 🍄</div>
        <div class="alch-recipe-desc">Вы видите розовых слоников, но они плачут и жалуются вам на ипотеку. Настроение испорчено на весь день.</div>
      </div>

      <!-- 1, 5, 7 -->
      <div class="alch-recipe rec-157">
        <div class="alch-recipe-title">Светящаяся перхоть ✨</div>
        <div class="alch-recipe-desc">Ваша голова теперь работает как диско-шар. Стелс-миссии отменяются, зато на вечеринке вы звезда.</div>
      </div>

      <!-- 2, 3, 4 -->
      <div class="alch-recipe rec-234">
        <div class="alch-recipe-title">Гейзер меланхолии 💧</div>
        <div class="alch-recipe-desc">Вы плачете так сильно, что способны потушить небольшой пожар. Удобно в быту, неудобно в бою.</div>
      </div>

      <!-- 2, 3, 5 -->
      <div class="alch-recipe rec-235">
        <div class="alch-recipe-title">Буря в стакане 🌪️</div>
        <div class="alch-recipe-desc">Любая жидкость, к которой вы прикасаетесь, начинает бурлить и вращаться. Пить пиво теперь крайне проблематично.</div>
      </div>

      <!-- 2, 4, 5 -->
      <div class="alch-recipe rec-245">
        <div class="alch-recipe-title">Зелье левитации табуреток 🪑</div>
        <div class="alch-recipe-desc">Вы не взлетите, но вот вся мебель вокруг вас... Медленно поднимется к потолку. Берегите голову при окончании эффекта!</div>
      </div>

      <!-- 2, 5, 6 -->
      <div class="alch-recipe rec-256">
        <div class="alch-recipe-title">Липкий ветерок 💨</div>
        <div class="alch-recipe-desc">Вы выдыхаете воздух, который склеивает предметы. Полезно для ремонта ваз, ужасно для романтических поцелуев.</div>
      </div>

      <!-- 2, 6, 7 -->
      <div class="alch-recipe rec-267">
        <div class="alch-recipe-title">Грибной парашют 🍄</div>
        <div class="alch-recipe-desc">При падении с высоты из вашей спины вырастает гигантский мягкий гриб. Выглядит глупо, но кости целы.</div>
      </div>

      <!-- 3, 4, 6 -->
      <div class="alch-recipe rec-346">
        <div class="alch-recipe-title">Варево жидких костей 🦴</div>
        <div class="alch-recipe-desc">Поздравляем, теперь вы можете пролезть под дверью! Правда, обратно собраться в человека будет очень сложно.</div>
      </div>

      <!-- 3, 5, 7 -->
      <div class="alch-recipe rec-357">
        <div class="alch-recipe-title">Лавовая жвачка 🌋</div>
        <div class="alch-recipe-desc">Вы можете надувать пузыри из магмы. Пузыри лопаются с оглушительным взрывом. Не проглатывать!</div>
      </div>

      <!-- 4, 5, 6 -->
      <div class="alch-recipe rec-456">
        <div class="alch-recipe-title">Эликсир внезапной блестковости ✨</div>
        <div class="alch-recipe-desc">Вместо крови у вас теперь глиттер, а при ранении вы выглядите как взорвавшаяся хлопушка. Враги в замешательстве.</div>
      </div>

      <!-- 4, 6, 7 -->
      <div class="alch-recipe rec-467">
        <div class="alch-recipe-title">Жабий хор 🐸</div>
        <div class="alch-recipe-desc">Каждое ваше слово сопровождается громким кваканьем, эхом раздающимся из желудка. Отлично для отпугивания комаров.</div>
      </div>

      <!-- 5, 6, 7 -->
      <div class="alch-recipe rec-567">
        <div class="alch-recipe-title">Болотный светлячок 💡</div>
        <div class="alch-recipe-desc">Вы светитесь мягким зеленым светом и пахнете тиной. Местные лягушки признают вас своим божеством.</div>
      </div>

    </div>
  </div>
</div>
[/html]

7

[html]
<style>
  @import url('https://fonts.googleapis.com/css2?family=Cinzel+Decorative:wght@400;700&family=Cormorant+Garamond:ital,wght@0,400;0,700;1,400&display=swap');

  .ea-wrapper {
    width: 100%; max-width: 850px; margin: 20px auto;
    background: radial-gradient(circle at top right, #0d221c, #070d0b 70%);
    padding: 40px; box-sizing: border-box;
    font-family: 'Cormorant Garamond', serif; color: #d4e0eb;
    border: 1px solid #b69d65; border-radius: 12px;
    box-shadow: 0 15px 40px rgba(0,0,0,0.9), inset 0 0 60px rgba(136, 255, 209, 0.05);
    position: relative; overflow: hidden;
  }
  .ea-wrapper::before {
    content: ""; position: absolute; top: 0; left: 0; right: 0; bottom: 0;
    background-image: radial-gradient(circle, rgba(182, 157, 101, 0.1) 1px, transparent 1px);
    background-size: 30px 30px; z-index: 0; pointer-events: none; opacity: 0.5;
  }
  .ea-header { text-align: center; margin-bottom: 30px; position: relative; z-index: 1; }
  .ea-title {
    font-family: 'Cinzel Decorative', serif; font-size: 38px; color: #e6d596;
    margin: 0 0 10px 0; font-weight: 400; letter-spacing: 2px;
    text-shadow: 0 0 15px rgba(230, 213, 150, 0.3);
  }
  .ea-subtitle { font-style: italic; color: #8a9e95; margin: 0; font-size: 17px; }
  .ea-divider { margin: 15px auto; width: 60%; height: 1px; background: linear-gradient(90deg, transparent, #b69d65, transparent); position: relative; }
  .ea-divider::after { content: "✧ ✦ ✧"; position: absolute; top: -11px; left: 50%; transform: translateX(-50%); color: #b69d65; background: #070d0b; padding: 0 10px; font-size: 14px; letter-spacing: 4px; }
  .ea-engine { display: none; }
  .ea-flex { display: flex; flex-wrap: wrap; gap: 25px; justify-content: space-between; margin-bottom: 25px; position: relative; z-index: 1; }
  .ea-panel {
    flex: 1; min-width: 280px;
    background: linear-gradient(180deg, rgba(13, 34, 28, 0.6), rgba(7, 13, 11, 0.9));
    border: 1px solid rgba(182, 157, 101, 0.3); border-radius: 8px; padding: 25px;
    box-shadow: inset 0 0 20px rgba(0,0,0,0.8); text-align: center; position: relative;
  }
  .ea-panel h3 { margin: 0 0 20px 0; color: #b69d65; font-family: 'Cinzel Decorative', serif; font-size: 20px; letter-spacing: 1px; }
  .ea-shelf { display: flex; flex-wrap: wrap; gap: 10px; justify-content: center; }
  .ea-btn {
    display: inline-block; background: rgba(10, 20, 15, 0.8); color: #a9bdbc;
    border: 1px solid #3c5448; padding: 8px 16px; cursor: pointer;
    border-radius: 20px; font-family: inherit; font-size: 15px; transition: all 0.4s ease;
    user-select: none; letter-spacing: 0.5px;
  }
  .ea-btn:hover { background: rgba(30, 56, 46, 0.8); border-color: #b69d65; color: #fff; box-shadow: 0 0 15px rgba(182, 157, 101, 0.3); }
  #ea1:checked ~ .ea-board .btn-1, #ea2:checked ~ .ea-board .btn-2,
  #ea3:checked ~ .ea-board .btn-3, #ea4:checked ~ .ea-board .btn-4,
  #ea5:checked ~ .ea-board .btn-5, #ea6:checked ~ .ea-board .btn-6,
  #ea7:checked ~ .ea-board .btn-7, #ea8:checked ~ .ea-board .btn-8,
  #ea9:checked ~ .ea-board .btn-9, #ea10:checked ~ .ea-board .btn-10,
  #ea11:checked ~ .ea-board .btn-11, #ea12:checked ~ .ea-board .btn-12,
  #ea13:checked ~ .ea-board .btn-13, #ea14:checked ~ .ea-board .btn-14,
  #ea15:checked ~ .ea-board .btn-15, #ea16:checked ~ .ea-board .btn-16,
  #ea17:checked ~ .ea-board .btn-17, #ea18:checked ~ .ea-board .btn-18,
  #ea19:checked ~ .ea-board .btn-19, #ea20:checked ~ .ea-board .btn-20 {
    background: rgba(182, 157, 101, 0.15); color: #e6d596; border-color: #e6d596;
    box-shadow: 0 0 20px rgba(230, 213, 150, 0.4), inset 0 0 10px rgba(230, 213, 150, 0.2);
  }
  @keyframes moonwellPulse { 0%, 100% { box-shadow: inset 0 0 30px rgba(136, 255, 209, 0.05), 0 15px 30px rgba(0,0,0,0.8); } 50% { box-shadow: inset 0 0 50px rgba(136, 255, 209, 0.2), 0 15px 30px rgba(0,0,0,0.8); border-color: #5abda0; } }
  .ea-cauldron {
    min-height: 100px; background: radial-gradient(circle at center, #0a1f18 0%, #030806 80%);
    border: 1px solid #3c5448; border-radius: 50% / 15px;
    padding: 20px 15px; display: flex; flex-wrap: wrap; justify-content: center; align-items: center; gap: 10px;
    animation: moonwellPulse 5s infinite ease-in-out;
  }
  .ea-in-pot { display: none; color: #88ffd1; font-style: italic; font-size: 16px; border-bottom: 1px dotted #88ffd1; padding-bottom: 2px; text-shadow: 0 0 8px rgba(136, 255, 209, 0.5); }
  .ea-empty-msg { color: #526e63; font-style: italic; font-size: 15px; letter-spacing: 1px; }
  #ea1:checked ~ .ea-board .pot-1, #ea2:checked ~ .ea-board .pot-2,
  #ea3:checked ~ .ea-board .pot-3, #ea4:checked ~ .ea-board .pot-4,
  #ea5:checked ~ .ea-board .pot-5, #ea6:checked ~ .ea-board .pot-6,
  #ea7:checked ~ .ea-board .pot-7, #ea8:checked ~ .ea-board .pot-8,
  #ea9:checked ~ .ea-board .pot-9, #ea10:checked ~ .ea-board .pot-10,
  #ea11:checked ~ .ea-board .pot-11, #ea12:checked ~ .ea-board .pot-12,
  #ea13:checked ~ .ea-board .pot-13, #ea14:checked ~ .ea-board .pot-14,
  #ea15:checked ~ .ea-board .pot-15, #ea16:checked ~ .ea-board .pot-16,
  #ea17:checked ~ .ea-board .pot-17, #ea18:checked ~ .ea-board .pot-18,
  #ea19:checked ~ .ea-board .pot-19, #ea20:checked ~ .ea-board .pot-20 { display: inline-block; }
  #ea1:checked ~ .ea-board .ea-empty-msg, #ea2:checked ~ .ea-board .ea-empty-msg,
  #ea3:checked ~ .ea-board .ea-empty-msg, #ea4:checked ~ .ea-board .ea-empty-msg,
  #ea5:checked ~ .ea-board .ea-empty-msg, #ea6:checked ~ .ea-board .ea-empty-msg,
  #ea7:checked ~ .ea-board .ea-empty-msg, #ea8:checked ~ .ea-board .ea-empty-msg,
  #ea9:checked ~ .ea-board .ea-empty-msg, #ea10:checked ~ .ea-board .ea-empty-msg,
  #ea11:checked ~ .ea-board .ea-empty-msg, #ea12:checked ~ .ea-board .ea-empty-msg,
  #ea13:checked ~ .ea-board .ea-empty-msg, #ea14:checked ~ .ea-board .ea-empty-msg,
  #ea15:checked ~ .ea-board .ea-empty-msg, #ea16:checked ~ .ea-board .ea-empty-msg,
  #ea17:checked ~ .ea-board .ea-empty-msg, #ea18:checked ~ .ea-board .ea-empty-msg,
  #ea19:checked ~ .ea-board .ea-empty-msg, #ea20:checked ~ .ea-board .ea-empty-msg { display: none; }
  .ea-actions { text-align: center; position: relative; z-index: 10; margin-bottom: 20px; min-height: 50px; }
  .ea-brew-btn {
    display: inline-block; background: linear-gradient(180deg, #183d2e, #0a1712);
    color: #e6d596; font-family: 'Cinzel Decorative', serif; font-size: 20px;
    padding: 12px 35px; border: 2px solid #b69d65; border-radius: 30px;
    cursor: pointer; letter-spacing: 2px; transition: 0.3s;
    box-shadow: 0 5px 15px rgba(0,0,0,0.8), inset 0 0 10px rgba(182, 157, 101, 0.2);
  }
  .ea-brew-btn:hover { background: linear-gradient(180deg, #22523e, #183d2e); box-shadow: 0 5px 25px rgba(182, 157, 101, 0.4), inset 0 0 15px rgba(182, 157, 101, 0.5); }
  .ea-reset-btn {
    display: none; background: linear-gradient(180deg, #3d1818, #170a0a);
    color: #e69696; font-family: 'Cinzel Decorative', serif; font-size: 20px;
    padding: 12px 35px; border: 2px solid #b66565; border-radius: 30px;
    cursor: pointer; letter-spacing: 2px; transition: 0.3s;
    box-shadow: 0 5px 15px rgba(0,0,0,0.8), inset 0 0 10px rgba(182, 101, 101, 0.2);
  }
  .ea-reset-btn:hover { background: linear-gradient(180deg, #522222, #3d1818); color: #fff; box-shadow: 0 5px 25px rgba(182, 101, 101, 0.4); }
  #ea-brew:checked ~ .ea-board .ea-actions .ea-brew-btn { display: none; }
  #ea-brew:checked ~ .ea-board .ea-actions .ea-reset-btn { display: inline-block; }
  #ea-brew:checked ~ .ea-board .ea-flex .ea-shelf { pointer-events: none; opacity: 0.5; filter: grayscale(100%); }
  .ea-result-box {
    position: relative; background: rgba(5, 10, 8, 0.9); border: 1px solid rgba(182, 157, 101, 0.4);
    border-radius: 8px; box-shadow: 0 10px 20px rgba(0,0,0,0.5);
    display: none; align-items: center; justify-content: center; overflow: hidden;
    z-index: 1; padding: 30px 20px; text-align: center; margin-bottom: 20px; min-height: 120px;
  }
  #ea-brew:checked ~ .ea-board .ea-result-box { display: flex; flex-direction: column; }
  .ea-recipe {
    position: absolute; inset: 0; background: radial-gradient(circle, #0a1712 0%, #030806 100%);
    display: none; flex-direction: column; align-items: center; justify-content: center; padding: 20px;
    opacity: 0; z-index: 1; transition: opacity 0.5s ease;
  }
  .ea-recipe-title { font-family: 'Cinzel Decorative', serif; font-size: 26px; color: #88ffd1; margin-bottom: 12px; text-shadow: 0 0 15px rgba(136, 255, 209, 0.4); }
  .ea-recipe-desc { font-size: 18px; color: #c4d4cc; line-height: 1.5; max-width: 650px; }
  .ea-fallback { opacity: 1; z-index: 5; display: flex !important; }
  .ea-fallback .ea-recipe-title { color: #8f746b; text-shadow: none; }
  /* РЕЦЕПТЫ (50 штук) */
  #ea1:checked ~ #ea2:checked ~ #ea-brew:checked ~ .ea-board .rec-12,
  #ea1:checked ~ #ea3:checked ~ #ea-brew:checked ~ .ea-board .rec-13,
  #ea1:checked ~ #ea4:checked ~ #ea-brew:checked ~ .ea-board .rec-14,
  #ea1:checked ~ #ea5:checked ~ #ea-brew:checked ~ .ea-board .rec-15,
  #ea1:checked ~ #ea6:checked ~ #ea-brew:checked ~ .ea-board .rec-16,
  #ea1:checked ~ #ea7:checked ~ #ea-brew:checked ~ .ea-board .rec-17,
  #ea1:checked ~ #ea8:checked ~ #ea-brew:checked ~ .ea-board .rec-18,
  #ea1:checked ~ #ea9:checked ~ #ea-brew:checked ~ .ea-board .rec-19,
  #ea1:checked ~ #ea10:checked ~ #ea-brew:checked ~ .ea-board .rec-1-10,
  #ea2:checked ~ #ea3:checked ~ #ea-brew:checked ~ .ea-board .rec-23,
  #ea2:checked ~ #ea4:checked ~ #ea-brew:checked ~ .ea-board .rec-24,
  #ea2:checked ~ #ea5:checked ~ #ea-brew:checked ~ .ea-board .rec-25,
  #ea2:checked ~ #ea6:checked ~ #ea-brew:checked ~ .ea-board .rec-26,
  #ea2:checked ~ #ea7:checked ~ #ea-brew:checked ~ .ea-board .rec-27,
  #ea2:checked ~ #ea8:checked ~ #ea-brew:checked ~ .ea-board .rec-28,
  #ea2:checked ~ #ea9:checked ~ #ea-brew:checked ~ .ea-board .rec-29,
  #ea2:checked ~ #ea10:checked ~ #ea-brew:checked ~ .ea-board .rec-2-10,
  #ea3:checked ~ #ea4:checked ~ #ea-brew:checked ~ .ea-board .rec-34,
  #ea3:checked ~ #ea5:checked ~ #ea-brew:checked ~ .ea-board .rec-35,
  #ea3:checked ~ #ea6:checked ~ #ea-brew:checked ~ .ea-board .rec-36,
  #ea3:checked ~ #ea7:checked ~ #ea-brew:checked ~ .ea-board .rec-37,
  #ea3:checked ~ #ea8:checked ~ #ea-brew:checked ~ .ea-board .rec-38,
  #ea3:checked ~ #ea9:checked ~ #ea-brew:checked ~ .ea-board .rec-39,
  #ea3:checked ~ #ea10:checked ~ #ea-brew:checked ~ .ea-board .rec-3-10,
  #ea4:checked ~ #ea5:checked ~ #ea-brew:checked ~ .ea-board .rec-45,
  #ea4:checked ~ #ea6:checked ~ #ea-brew:checked ~ .ea-board .rec-46,
  #ea4:checked ~ #ea7:checked ~ #ea-brew:checked ~ .ea-board .rec-47,
  #ea4:checked ~ #ea8:checked ~ #ea-brew:checked ~ .ea-board .rec-48,
  #ea4:checked ~ #ea9:checked ~ #ea-brew:checked ~ .ea-board .rec-49,
  #ea4:checked ~ #ea10:checked ~ #ea-brew:checked ~ .ea-board .rec-4-10,
  #ea5:checked ~ #ea6:checked ~ #ea-brew:checked ~ .ea-board .rec-56,
  #ea5:checked ~ #ea7:checked ~ #ea-brew:checked ~ .ea-board .rec-57,
  #ea5:checked ~ #ea8:checked ~ #ea-brew:checked ~ .ea-board .rec-58,
  #ea5:checked ~ #ea9:checked ~ #ea-brew:checked ~ .ea-board .rec-59,
  #ea5:checked ~ #ea10:checked ~ #ea-brew:checked ~ .ea-board .rec-5-10,
  #ea6:checked ~ #ea7:checked ~ #ea-brew:checked ~ .ea-board .rec-67,
  #ea6:checked ~ #ea8:checked ~ #ea-brew:checked ~ .ea-board .rec-68,
  #ea6:checked ~ #ea9:checked ~ #ea-brew:checked ~ .ea-board .rec-69,
  #ea6:checked ~ #ea10:checked ~ #ea-brew:checked ~ .ea-board .rec-6-10,
  #ea7:checked ~ #ea8:checked ~ #ea-brew:checked ~ .ea-board .rec-78,
  #ea7:checked ~ #ea9:checked ~ #ea-brew:checked ~ .ea-board .rec-79,
  #ea7:checked ~ #ea10:checked ~ #ea-brew:checked ~ .ea-board .rec-7-10,
  #ea8:checked ~ #ea9:checked ~ #ea-brew:checked ~ .ea-board .rec-89,
  #ea8:checked ~ #ea10:checked ~ #ea-brew:checked ~ .ea-board .rec-8-10,
  #ea9:checked ~ #ea10:checked ~ #ea-brew:checked ~ .ea-board .rec-9-10,
  #ea11:checked ~ #ea12:checked ~ #ea-brew:checked ~ .ea-board .rec-1112,
  #ea13:checked ~ #ea14:checked ~ #ea-brew:checked ~ .ea-board .rec-1314,
  #ea15:checked ~ #ea16:checked ~ #ea-brew:checked ~ .ea-board .rec-1516,
  #ea17:checked ~ #ea18:checked ~ #ea-brew:checked ~ .ea-board .rec-1718,
  #ea19:checked ~ #ea20:checked ~ #ea-brew:checked ~ .ea-board .rec-1920 {
    opacity: 1; z-index: 10; display: flex; border: 1px solid #88ffd1;
  }
</style>

<div class="ea-wrapper">
  <form>
    <input type="checkbox" id="ea1" class="ea-engine"><input type="checkbox" id="ea2" class="ea-engine">
    <input type="checkbox" id="ea3" class="ea-engine"><input type="checkbox" id="ea4" class="ea-engine">
    <input type="checkbox" id="ea5" class="ea-engine"><input type="checkbox" id="ea6" class="ea-engine">
    <input type="checkbox" id="ea7" class="ea-engine"><input type="checkbox" id="ea8" class="ea-engine">
    <input type="checkbox" id="ea9" class="ea-engine"><input type="checkbox" id="ea10" class="ea-engine">
    <input type="checkbox" id="ea11" class="ea-engine"><input type="checkbox" id="ea12" class="ea-engine">
    <input type="checkbox" id="ea13" class="ea-engine"><input type="checkbox" id="ea14" class="ea-engine">
    <input type="checkbox" id="ea15" class="ea-engine"><input type="checkbox" id="ea16" class="ea-engine">
    <input type="checkbox" id="ea17" class="ea-engine"><input type="checkbox" id="ea18" class="ea-engine">
    <input type="checkbox" id="ea19" class="ea-engine"><input type="checkbox" id="ea20" class="ea-engine">
    <input type="checkbox" id="ea-brew" class="ea-engine">

    <div class="ea-board">
      <div class="ea-header">
        <h1 class="ea-title">Тайны Лунного Колодца</h1>
        <div class="ea-divider"></div>
        <p class="ea-subtitle">Выберите <b>ровно 2 ингредиента</b> и нажмите «Смешать эссенцию».</p>
      </div>

      <div class="ea-flex">
        <div class="ea-panel">
          <h3>Амулеты Ингредиентов</h3>
          <div class="ea-shelf">
            <label for="ea1" class="ea-btn btn-1">Корень мандрагоры</label>
            <label for="ea2" class="ea-btn btn-2">Эссенция ветра</label>
            <label for="ea3" class="ea-btn btn-3">Вулканическая крошка</label>
            <label for="ea4" class="ea-btn btn-4">Слёзы единорога</label>
            <label for="ea5" class="ea-btn btn-5">Пыль фей</label>
            <label for="ea6" class="ea-btn btn-6">Слизь тролля</label>
            <label for="ea7" class="ea-btn btn-7">Лунный гриб</label>
            <label for="ea8" class="ea-btn btn-8">Клык вампира</label>
            <label for="ea9" class="ea-btn btn-9">Паутина арахны</label>
            <label for="ea10" class="ea-btn btn-10">Шепот призрака</label>
            <label for="ea11" class="ea-btn btn-11">Перо феникса</label>
            <label for="ea12" class="ea-btn btn-12">Звёздная роса</label>
            <label for="ea13" class="ea-btn btn-13">Искра молнии</label>
            <label for="ea14" class="ea-btn btn-14">Лунный луч</label>
            <label for="ea15" class="ea-btn btn-15">Чешуя дракона</label>
            <label for="ea16" class="ea-btn btn-16">Драконий огонь</label>
            <label for="ea17" class="ea-btn btn-17">Жемчужина глубин</label>
            <label for="ea18" class="ea-btn btn-18">Слёзы русалки</label>
            <label for="ea19" class="ea-btn btn-19">Душа дерева</label>
            <label for="ea20" class="ea-btn btn-20">Камень преткновения</label>
          </div>
        </div>
        <div class="ea-panel">
          <h3>Священные Воды</h3>
          <div class="ea-cauldron">
            <span class="ea-empty-msg">Воды кристально чисты...</span>
            <span class="ea-in-pot pot-1">Мандрагора</span>
            <span class="ea-in-pot pot-2">Ветер</span>
            <span class="ea-in-pot pot-3">Лава</span>
            <span class="ea-in-pot pot-4">Слёзы</span>
            <span class="ea-in-pot pot-5">Пыль</span>
            <span class="ea-in-pot pot-6">Слизь</span>
            <span class="ea-in-pot pot-7">Гриб</span>
            <span class="ea-in-pot pot-8">Клык</span>
            <span class="ea-in-pot pot-9">Паутина</span>
            <span class="ea-in-pot pot-10">Шепот</span>
            <span class="ea-in-pot pot-11">Перо</span>
            <span class="ea-in-pot pot-12">Роса</span>
            <span class="ea-in-pot pot-13">Молния</span>
            <span class="ea-in-pot pot-14">Луч</span>
            <span class="ea-in-pot pot-15">Чешуя</span>
            <span class="ea-in-pot pot-16">Огонь</span>
            <span class="ea-in-pot pot-17">Жемчуг</span>
            <span class="ea-in-pot pot-18">Слёзы</span>
            <span class="ea-in-pot pot-19">Душа</span>
            <span class="ea-in-pot pot-20">Камень</span>
          </div>
        </div>
      </div>

      <div class="ea-actions">
        <label for="ea-brew" class="ea-brew-btn">Смешать эссенцию</label>
        <button type="reset" class="ea-reset-btn">Очистить колодец</button>
      </div>

      <div class="ea-result-box">
        <div class="ea-recipe ea-fallback">
          <div class="ea-recipe-title">Склизкая жижа 🤢</div>
          <div class="ea-recipe-desc">Вы конечно алхимик, но борщ я бы вам не доверил варить...</div>
        </div>

        <!-- 50 РЕЦЕПТОВ -->
        <div class="ea-recipe rec-12"><div class="ea-recipe-title">Зелье истошного ора 📢</div><div class="ea-recipe-desc">Орите на здоровье! Реактив вызывает спазмы голосовых связок. Идеально для общения с глухими орками.</div></div>
        <div class="ea-recipe rec-13"><div class="ea-recipe-title">Паровой эльф 🫖</div><div class="ea-recipe-desc">Из ушей валит пар, при ходьбе свистите как закипающий чайник. Маскировка уровня «самовар».</div></div>
        <div class="ea-recipe rec-14"><div class="ea-recipe-title">Слеза драматичного злодея 🎭</div><div class="ea-recipe-desc">Непреодолимое желание толкать высокопарные речи. Враг обычно успевает уйти.</div></div>
        <div class="ea-recipe rec-15"><div class="ea-recipe-title">Светящаяся перхоть ✨</div><div class="ea-recipe-desc">Ваши волосы работают как диско-шар. Стелс-миссии отменяются.</div></div>
        <div class="ea-recipe rec-16"><div class="ea-recipe-title">Летающие сопли 🦠</div><div class="ea-recipe-desc">Биологические жидкости обретают антигравитацию. Выглядит мерзко, но экономит на платках.</div></div>
        <div class="ea-recipe rec-17"><div class="ea-recipe-title">Унылый галлюциноген 🍄</div><div class="ea-recipe-desc">Вы видите единорогов, но они плачут и жалуются на жизнь. Настроение испорчено.</div></div>
        <div class="ea-recipe rec-18"><div class="ea-recipe-title">Вампирская мандрагора 🧛</div><div class="ea-recipe-desc">Корень кричит, вампир шипит. Вы стоите посередине с головной болью.</div></div>
        <div class="ea-recipe rec-19"><div class="ea-recipe-title">Паутина в корнях 🕸️</div><div class="ea-recipe-desc">Вы пускаете корни и плетёте паутину. Садовники в шоке.</div></div>
        <div class="ea-recipe rec-1-10"><div class="ea-recipe-title">Шепот мандрагоры 👻</div><div class="ea-recipe-desc">Корень теперь шепчет проклятия. Вы спите с заткнутыми ушами.</div></div>
        <div class="ea-recipe rec-23"><div class="ea-recipe-title">Буря в стакане 🌪️</div><div class="ea-recipe-desc">Любая жидкость бурлит при вашем прикосновении. Пить изящно проблематично.</div></div>
        <div class="ea-recipe rec-24"><div class="ea-recipe-title">Гейзер меланхолии 💧</div><div class="ea-recipe-desc">Вы плачете так сильно, что тушите пожары. Неудобно для макияжа.</div></div>
        <div class="ea-recipe rec-25"><div class="ea-recipe-title">Левитация табуреток 🪑</div><div class="ea-recipe-desc">Мебель поднимается к потолку. Берегите голову!</div></div>
        <div class="ea-recipe rec-26"><div class="ea-recipe-title">Липкий ветерок 💨</div><div class="ea-recipe-desc">Выдыхаете воздух, который склеивает предметы. Для поцелуев не годится.</div></div>
        <div class="ea-recipe rec-27"><div class="ea-recipe-title">Грибной парашют 🍄</div><div class="ea-recipe-desc">При падении вырастает гриб. Глупо, но кости целы.</div></div>
        <div class="ea-recipe rec-28"><div class="ea-recipe-title">Ветреный клык 🌬️</div><div class="ea-recipe-desc">Ваш выдох острый как клык. Поцелуи режут губы.</div></div>
        <div class="ea-recipe rec-29"><div class="ea-recipe-title">Паутина на ветру 🕸️</div><div class="ea-recipe-desc">Вы плетёте паутину, которую сразу сдувает. Бесполезно и красиво.</div></div>
        <div class="ea-recipe rec-2-10"><div class="ea-recipe-title">Шепот ветра 👻</div><div class="ea-recipe-desc">Вы говорите только шёпотом. Призраки гордятся.</div></div>
        <div class="ea-recipe rec-34"><div class="ea-recipe-title">Искрящиеся слёзы ⚡</div><div class="ea-recipe-desc">Вы плачете фейерверками. Праздник с вами, но подушки сгорают.</div></div>
        <div class="ea-recipe rec-35"><div class="ea-recipe-title">Огненная пыльца 🔥</div><div class="ea-recipe-desc">Чихаете искрами. Противопожарная служба вас знает.</div></div>
        <div class="ea-recipe rec-36"><div class="ea-recipe-title">Варево жидких костей 🦴</div><div class="ea-recipe-desc">Теперь пролезете под дверью! Собраться обратно сложно.</div></div>
        <div class="ea-recipe rec-37"><div class="ea-recipe-title">Магматическая жвачка 🌋</div><div class="ea-recipe-desc">Пузыри из магмы. Лопаются с взрывом. Не глотать!</div></div>
        <div class="ea-recipe rec-38"><div class="ea-recipe-title">Лава вампира 🧛</div><div class="ea-recipe-desc">Ваша кровь горяча как лава. Вампиры обжигаются.</div></div>
        <div class="ea-recipe rec-39"><div class="ea-recipe-title">Паутина в лаве 🕸️</div><div class="ea-recipe-desc">Вы плетёте огненную паутину. Пауки-камикадзе гордятся.</div></div>
        <div class="ea-recipe rec-3-10"><div class="ea-recipe-title">Горячий шепот 🔥</div><div class="ea-recipe-desc">Ваш шёпот обжигает. Секреты теперь опасно слушать.</div></div>
        <div class="ea-recipe rec-45"><div class="ea-recipe-title">Блестковость ✨</div><div class="ea-recipe-desc">Вместо крови — глиттер. При ранении — как хлопушка.</div></div>
        <div class="ea-recipe rec-46"><div class="ea-recipe-title">Жабий хор 🐸</div><div class="ea-recipe-desc">Каждое слово сопровождается кваканьем. Отпугивает комаров и друзей.</div></div>
        <div class="ea-recipe rec-47"><div class="ea-recipe-title">Лунная пыльца 🌙</div><div class="ea-recipe-desc">Светитесь и оставляете след из пыли. Как фея, но страннее.</div></div>
        <div class="ea-recipe rec-48"><div class="ea-recipe-title">Слёзы вампира 🧛</div><div class="ea-recipe-desc">Вы плачете кровью. Вампиры сочувствуют, остальные бегут.</div></div>
        <div class="ea-recipe rec-49"><div class="ea-recipe-title">Паутина слёз 🕸️</div><div class="ea-recipe-desc">Ваши слёзы превращаются в паутину. Плакать больно.</div></div>
        <div class="ea-recipe rec-4-10"><div class="ea-recipe-title">Призрачные слёзы 👻</div><div class="ea-recipe-desc">Вы плачете, но слёзы проходят сквозь пол. Бесполезно.</div></div>
        <div class="ea-recipe rec-56"><div class="ea-recipe-title">Болотный светлячок 💡</div><div class="ea-recipe-desc">Светитесь зелёным и пахнете тиной. Лягушки молятся вам.</div></div>
        <div class="ea-recipe rec-57"><div class="ea-recipe-title">Грибная пыльца 🍄</div><div class="ea-recipe-desc">Вы чихаете спорами. Грибы растут из носа.</div></div>
        <div class="ea-recipe rec-58"><div class="ea-recipe-title">Липкое перо 🪶</div><div class="ea-recipe-desc">К вам прилипает всё. Ходячий мусорный бак.</div></div>
        <div class="ea-recipe rec-59"><div class="ea-recipe-title">Паутина фей 🧚</div><div class="ea-recipe-desc">Вы плетёте радужную паутину. Феи завидуют.</div></div>
        <div class="ea-recipe rec-5-10"><div class="ea-recipe-title">Шепот пыли 👻</div><div class="ea-recipe-desc">Вы говорите пылью. Все чихают.</div></div>
        <div class="ea-recipe rec-67"><div class="ea-recipe-title">Грибная слизь 🍄</div><div class="ea-recipe-desc">Вы выделяете светящуюся слизь. Грибы растут на спине.</div></div>
        <div class="ea-recipe rec-68"><div class="ea-recipe-title">Слизь вампира 🧛</div><div class="ea-recipe-desc">Ваша слизь吸血щая. Мерзко и эффективно.</div></div>
        <div class="ea-recipe rec-69"><div class="ea-recipe-title">Паутина тролля 🕸️</div><div class="ea-recipe-desc">Вы плетёте вонючую паутину. Тролли гордятся.</div></div>
        <div class="ea-recipe rec-6-10"><div class="ea-recipe-title">Шепот слизи 👻</div><div class="ea-recipe-desc">Вы говорите как тролль под водой. Непонятно и мерзко.</div></div>
        <div class="ea-recipe rec-78"><div class="ea-recipe-title">Лунный клык 🌙</div><div class="ea-recipe-desc">Клыки светятся по ночам. Романтично для вампиров.</div></div>
        <div class="ea-recipe rec-79"><div class="ea-recipe-title">Грибная паутина 🍄</div><div class="ea-recipe-desc">Вы плетёте паутину из грибов. Мухи в восторге.</div></div>
        <div class="ea-recipe rec-7-10"><div class="ea-recipe-title">Призрачный гриб 👻</div><div class="ea-recipe-desc">Грибы проходят сквозь вас. Вы — ходячая экосистема.</div></div>
        <div class="ea-recipe rec-89"><div class="ea-recipe-title">Клык в паутине 🕷️</div><div class="ea-recipe-desc">Клыки стреляют паутиной. Гигиена невозможна.</div></div>
        <div class="ea-recipe rec-8-10"><div class="ea-recipe-title">Призрачный укус 👻</div><div class="ea-recipe-desc">Вы кусаете, но жертва чувствует только холод.</div></div>
        <div class="ea-recipe rec-9-10"><div class="ea-recipe-title">Паутина шепотов 🕸️</div><div class="ea-recipe-desc">Ваша паутина шепчет секреты. Очень мешает спать.</div></div>
        <div class="ea-recipe rec-1112"><div class="ea-recipe-title">Перо звёздной ночи ✨</div><div class="ea-recipe-desc">Линяете светящимися перьями. Уборка — медитация.</div></div>
        <div class="ea-recipe rec-1314"><div class="ea-recipe-title">Молниеносный луч ⚡</div><div class="ea-recipe-desc">Светитесь и бьете током. Стелс невозможен.</div></div>
        <div class="ea-recipe rec-1516"><div class="ea-recipe-title">Драконий пепел 🐉</div><div class="ea-recipe-desc">Чихаете огнём и пеплом. Пожарные вас знают.</div></div>
        <div class="ea-recipe rec-1718"><div class="ea-recipe-title">Коралловые слёзы 🪸</div><div class="ea-recipe-desc">Плачете кораллами. Аквариумисты готовы платить.</div></div>
        <div class="ea-recipe rec-1920"><div class="ea-recipe-title">Душа в камне 🗿</div><div class="ea-recipe-desc">Вы чувствуете как дерево. Философы плачут от счастья.</div></div>
      </div>
    </div>
  </form>
</div>
[/html]

8

[html]
<div class="tech-player">
  <div class="player-glass">
   
    <!-- Обложка трека -->
    <div class="art-wrapper">
      <img src="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='100%' height='100%' fill='%23111827'><rect width='100%' height='100%'/></svg>" alt="Art" class="track-art">
      <div class="art-overlay"></div>
      <div class="loading-spinner"></div>
     
      <!-- Мини-эквалайзер (показывается при игре) -->
      <div class="eq-bars">
        <span></span><span></span><span></span>
      </div>
    </div>

    <!-- Информация -->
    <div class="info-wrapper">
      <div class="track-title">Загрузка данных...</div>
      <div class="track-artist">Синхронизация</div>
    </div>

    <!-- Технологичный прогресс-бар -->
    <div class="progress-wrapper">
      <span class="time time-current">0:00</span>
      <div class="slider-container" style="--progress: 0%;">
        <input type="range" class="progress-bar" value="0" min="0" max="100" step="0.1">
      </div>
      <span class="time time-total">0:00</span>
    </div>

    <!-- Кнопки управления (SVG) -->
    <div class="controls-wrapper">
      <button class="ctrl-btn btn-prev" title="Предыдущий трек">
        <svg viewBox="0 0 24 24" fill="currentColor"><path d="M6 6h2v12H6zm3.5 6l8.5 6V6z"/></svg>
      </button>
     
      <button class="ctrl-btn btn-play" title="Play / Pause">
        <!-- Play Icon -->
        <svg class="icon-play" viewBox="0 0 24 24" fill="currentColor"><path d="M8 5v14l11-7z"/></svg>
        <!-- Pause Icon -->
        <svg class="icon-pause" viewBox="0 0 24 24" fill="currentColor" style="display:none;"><path d="M6 19h4V5H6v14zm8-14v14h4V5h-4z"/></svg>
      </button>
     
      <button class="ctrl-btn btn-next" title="Следующий трек">
        <svg viewBox="0 0 24 24" fill="currentColor"><path d="M6 18l8.5-6L6 6v12zM16 6v12h2V6h-2z"/></svg>
      </button>
    </div>

  </div>
  <audio class="audio-core"></audio>
</div>

<style>
/* =========================================
   UI/UX ДИЗАЙН ПЛЕЕРА (HIGH-TECH)
   ========================================= */
@import url('https://fonts.googleapis.com/css2?family=Orbitron:wght@400;700&family=Inter:wght@300;500;700&display=swap');

.tech-player {
  /* Основные цвета темы */
  --bg-color: rgba(13, 17, 23, 0.75);
  --border-color: rgba(0, 255, 255, 0.15);
  --accent-color: #00f0ff; /* Неоновый циановый */
  --accent-glow: 0 0 15px rgba(0, 240, 255, 0.4);
  --text-main: #ffffff;
  --text-sub: #8b949e;
 
  display: inline-block;
  user-select: none;
  margin: 10px;
}

/* Эффект стеклянной панели */
.player-glass {
  background: var(--bg-color);
  backdrop-filter: blur(16px);
  -webkit-backdrop-filter: blur(16px);
  border: 1px solid var(--border-color);
  border-radius: 20px;
  padding: 20px;
  width: 300px;
  box-shadow: 0 20px 40px rgba(0,0,0,0.6), inset 0 1px 0 rgba(255,255,255,0.05);
  box-sizing: border-box;
  transition: box-shadow 0.4s ease;
}

.tech-player.is-playing .player-glass {
  box-shadow: 0 20px 40px rgba(0,0,0,0.6), inset 0 1px 0 rgba(255,255,255,0.05), var(--accent-glow);
  border-color: rgba(0, 240, 255, 0.3);
}

/* Обложка трека */
.art-wrapper {
  position: relative;
  width: 100%;
  aspect-ratio: 1 / 1;
  border-radius: 16px;
  overflow: hidden;
  margin-bottom: 16px;
  background: #000;
  box-shadow: 0 8px 24px rgba(0,0,0,0.5);
}

.track-art {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform 0.5s ease, opacity 0.3s ease;
}

.tech-player.is-playing .track-art {
  transform: scale(1.05); /* Легкий зум при игре */
}

/* Темный градиент поверх картинки для контраста */
.art-overlay {
  position: absolute;
  inset: 0;
  background: linear-gradient(to top, rgba(13,17,23,0.9) 0%, rgba(13,17,23,0) 50%);
}

/* Инфо о треке */
.info-wrapper {
  text-align: center;
  margin-bottom: 16px;
  font-family: 'Inter', sans-serif;
}

.track-title {
  color: var(--text-main);
  font-size: 16px;
  font-weight: 700;
  letter-spacing: 0.5px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  text-shadow: 0 2px 4px rgba(0,0,0,0.5);
}

.track-artist {
  color: var(--accent-color);
  font-size: 12px;
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: 1px;
  margin-top: 4px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  font-family: 'Orbitron', sans-serif; /* Футуристичный шрифт */
}

/* Таймеры и полоса прокрутки */
.progress-wrapper {
  display: flex;
  align-items: center;
  gap: 12px;
  margin-bottom: 20px;
}

.time {
  font-family: 'Orbitron', monospace;
  font-size: 10px;
  color: var(--text-sub);
  width: 35px;
  text-align: center;
}

.slider-container {
  flex-grow: 1;
  position: relative;
  height: 6px;
  background: rgba(255, 255, 255, 0.1);
  border-radius: 3px;
  /* Динамическая заливка через CSS переменную */
  background-image: linear-gradient(var(--accent-color), var(--accent-color));
  background-size: var(--progress) 100%;
  background-repeat: no-repeat;
}

.progress-bar {
  position: absolute;
  top: 0; left: 0;
  width: 100%; height: 100%;
  margin: 0;
  opacity: 0; /* Скрываем стандартный инпут, оставляя его кликабельным */
  cursor: pointer;
}

/* "Светлячок" на конце прогресс-бара */
.slider-container::after {
  content: '';
  position: absolute;
  top: 50%;
  left: var(--progress);
  transform: translate(-50%, -50%);
  width: 10px;
  height: 10px;
  background: #fff;
  border-radius: 50%;
  box-shadow: 0 0 10px var(--accent-color), 0 0 20px var(--accent-color);
  pointer-events: none;
  transition: opacity 0.2s;
  opacity: 0;
}

.progress-wrapper:hover .slider-container::after,
.tech-player.is-playing .slider-container::after {
  opacity: 1;
}

/* Кнопки управления */
.controls-wrapper {
  display: flex;
  justify-content: center;
  align-items: center;
  gap: 20px;
}

.ctrl-btn {
  background: none;
  border: none;
  padding: 0;
  cursor: pointer;
  color: var(--text-sub);
  transition: all 0.3s ease;
  display: flex;
  justify-content: center;
  align-items: center;
}

.ctrl-btn:hover {
  color: var(--accent-color);
  filter: drop-shadow(0 0 8px var(--accent-color));
  transform: scale(1.1);
}

.btn-prev svg, .btn-next svg {
  width: 24px;
  height: 24px;
}

.btn-play {
  width: 50px;
  height: 50px;
  border-radius: 50%;
  background: rgba(0, 240, 255, 0.1);
  color: var(--accent-color);
  border: 1px solid rgba(0, 240, 255, 0.3);
  box-shadow: inset 0 0 15px rgba(0, 240, 255, 0.1);
}

.btn-play svg {
  width: 28px;
  height: 28px;
}

.btn-play:hover {
  background: rgba(0, 240, 255, 0.2);
  box-shadow: inset 0 0 20px rgba(0, 240, 255, 0.3), var(--accent-glow);
  transform: scale(1.05);
}

/* Эквалайзер (появляется на обложке при игре) */
.eq-bars {
  position: absolute;
  bottom: 12px;
  right: 12px;
  display: flex;
  gap: 3px;
  align-items: flex-end;
  height: 16px;
  opacity: 0;
  transition: opacity 0.3s;
}

.tech-player.is-playing .eq-bars {
  opacity: 1;
}

.eq-bars span {
  width: 4px;
  background: var(--accent-color);
  border-radius: 2px;
  box-shadow: 0 0 5px var(--accent-color);
  animation: eq-bounce 1s infinite ease-in-out;
}

.eq-bars span:nth-child(1) { animation-delay: 0.1s; height: 60%; }
.eq-bars span:nth-child(2) { animation-delay: 0.3s; height: 100%; }
.eq-bars span:nth-child(3) { animation-delay: 0.2s; height: 80%; }

@keyframes eq-bounce {
  0%, 100% { transform: scaleY(0.5); }
  50% { transform: scaleY(1); }
}

/* Лоадер */
.loading-spinner {
  position: absolute;
  top: 50%; left: 50%;
  transform: translate(-50%, -50%);
  width: 40px; height: 40px;
  border: 3px solid rgba(255,255,255,0.1);
  border-top-color: var(--accent-color);
  border-radius: 50%;
  animation: spin 1s linear infinite;
  display: none;
}

.loading-spinner.active { display: block; }

@keyframes spin { 100% { transform: translate(-50%, -50%) rotate(360deg); } }
</style>

<script>
// =========================================
// ЛОГИКА ПЛЕЕРА
// =========================================
(function() {
  // КОНФИГУРАЦИЯ ТРЕКОВ (Здесь добавлены красивые стоковые изображения)
  const tracks = [
    {
      title: "Cyberpunk Cityscape",
      artist: "Neon Syndicate",
      url: "https://forumstatic.ru/files/001c/1f/11/90588.mp3?v=1",
      art: "https://images.unsplash.com/photo-1605806616949-1e87b487bc2a?q=80&w=600&auto=format&fit=crop" // Киберпанк неон
    },
    {
      title: "Deep Space Signal",
      artist: "Orbital Command",
      url: "https://forumstatic.ru/files/001c/1f/11/54198.mp3?v=1",
      art: "https://images.unsplash.com/photo-1614729939124-032f0b56c9ce?q=80&w=600&auto=format&fit=crop" // Космос / Синтвейв
    }
  ];

  document.querySelectorAll('.tech-player').forEach(player => {
    let currentTrack = 0;
    let isPlaying = false;
    let isDragging = false;

    // Элементы
    const audio = player.querySelector('.audio-core');
    const playBtn = player.querySelector('.btn-play');
    const iconPlay = player.querySelector('.icon-play');
    const iconPause = player.querySelector('.icon-pause');
    const prevBtn = player.querySelector('.btn-prev');
    const nextBtn = player.querySelector('.btn-next');
   
    const spinner = player.querySelector('.loading-spinner');
    const artImg = player.querySelector('.track-art');
    const titleEl = player.querySelector('.track-title');
    const artistEl = player.querySelector('.track-artist');
   
    const sliderContainer = player.querySelector('.slider-container');
    const progressBar = player.querySelector('.progress-bar');
    const timeCurrentEl = player.querySelector('.time-current');
    const timeTotalEl = player.querySelector('.time-total');

    const defaultArt = artImg.src;

    // Форматирование времени
    const formatTime = (secs) => {
      if (isNaN(secs)) return "0:00";
      const m = Math.floor(secs / 60);
      const s = Math.floor(secs % 60);
      return `${m}:${s < 10 ? '0' : ''}${s}`;
    };

    // Загрузка трека
    const loadTrack = (index) => {
      const track = tracks[index];
     
      spinner.classList.add('active');
      titleEl.textContent = track.title;
      artistEl.textContent = track.artist;
     
      progressBar.value = 0;
      sliderContainer.style.setProperty('--progress', '0%');
      timeCurrentEl.textContent = "0:00";
      timeTotalEl.textContent = "0:00";

      // Плавная смена обложки
      artImg.style.opacity = 0;
      setTimeout(() => {
        artImg.onload = () => {
          spinner.classList.remove('active');
          artImg.style.opacity = 1;
        };
        artImg.onerror = () => {
          artImg.src = defaultArt;
          spinner.classList.remove('active');
          artImg.style.opacity = 1;
        };
        artImg.src = track.art || defaultArt;
      }, 200);

      audio.src = track.url;
      audio.load();
    };

    // Управление воспроизведением
    const togglePlay = () => {
      if (isPlaying) {
        audio.pause();
        iconPlay.style.display = 'block';
        iconPause.style.display = 'none';
        player.classList.remove('is-playing');
      } else {
        audio.play().catch(() => alert("Ошибка потока."));
        iconPlay.style.display = 'none';
        iconPause.style.display = 'block';
        player.classList.add('is-playing');
      }
      isPlaying = !isPlaying;
    };

    // События кнопок
    playBtn.addEventListener('click', togglePlay);
   
    nextBtn.addEventListener('click', () => {
      currentTrack = (currentTrack + 1) % tracks.length;
      loadTrack(currentTrack);
      if (isPlaying) audio.play();
    });

    prevBtn.addEventListener('click', () => {
      currentTrack = (currentTrack - 1 + tracks.length) % tracks.length;
      loadTrack(currentTrack);
      if (isPlaying) audio.play();
    });

    // Обновление таймера и прогресс-бара
    audio.addEventListener('timeupdate', () => {
      if (!isDragging) {
        const percent = (audio.currentTime / audio.duration) * 100 || 0;
        progressBar.value = percent;
        sliderContainer.style.setProperty('--progress', `${percent}%`);
        timeCurrentEl.textContent = formatTime(audio.currentTime);
      }
    });

    audio.addEventListener('loadedmetadata', () => {
      timeTotalEl.textContent = formatTime(audio.duration);
    });

    // Перемотка
    progressBar.addEventListener('input', () => {
      isDragging = true;
      sliderContainer.style.setProperty('--progress', `${progressBar.value}%`);
      const seekTime = (progressBar.value / 100) * audio.duration;
      timeCurrentEl.textContent = formatTime(seekTime);
    });

    progressBar.addEventListener('change', () => {
      audio.currentTime = (progressBar.value / 100) * audio.duration;
      isDragging = false;
    });

    audio.addEventListener('ended', () => nextBtn.click());

    // Старт
    if (tracks.length > 0) loadTrack(0);
  });
})();
</script>
[/html]


Вы здесь » Realatorum Paradox » Витрина » Хранилище ценных знаний


Рейтинг форумов | Создать форум бесплатно