Нефритовая пыль

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

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


Вы здесь » Нефритовая пыль » Флуд и игры » Флуд


Флуд

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

1

https://i.imgur.com/daaG1Pj.jpeg

+1

2

[html]<div id="val-smooth-game" style="width: 100%; max-width: 800px; margin: 0 auto; aspect-ratio: 16 / 9; position: relative; background: #fff0f3; overflow: hidden; font-family: 'Segoe UI', Arial, sans-serif; border: 4px solid #ff4d6d; border-radius: 20px; transition: background 0.8s; touch-action: none;">
   
    <div id="v-ui" style="display: none; position: absolute; top: 10px; width: 100%; padding: 0 20px; z-index: 10; justify-content: space-between; align-items: center; font-weight: bold; color: #ff4d6d; pointer-events: none; text-shadow: 1px 1px 2px rgba(0,0,0,0.1);">
        <div id="v-score">Счёт: 0</div>
        <div id="v-cheer" style="font-size: clamp(12px, 2.5vw, 16px); text-align: center; flex: 1; margin: 0 10px; opacity: 0; transition: opacity 0.8s; font-style: italic;"></div>
        <div id="v-timer">60s</div>
    </div>

    <div id="v-start" style="position: absolute; inset: 0; background: #fff0f3; z-index: 20; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center;">
        <h2 style="color: #ff4d6d;">Ловец Сердец ❤️</h2>
        <input type="text" id="v-name" placeholder="Имя героя" maxlength="12" style="padding: 10px; border: 2px solid #ff4d6d; border-radius: 8px; margin-bottom: 15px; outline: none; text-align: center;">
        <button id="v-btn" style="padding: 10px 25px; background: #ff4d6d; color: white; border: none; border-radius: 8px; cursor: pointer; font-weight: bold;">Начать!</button>
        <div id="v-board" style="margin-top: 15px; font-size: 13px; color: #888;"></div>
    </div>

    <div id="v-p" style="position: absolute; bottom: 15px; left: 50%; width: 70px; height: 50px; transform: translateX(-50%); display: none; z-index: 5; will-change: left;">
        <svg viewBox="0 0 100 60"><path d="M10 10H90L80 50H20L10 10Z" fill="#d97706" stroke="#92400e" stroke-width="4"/><path d="M5 10H95" stroke="#92400e" stroke-width="6" stroke-linecap="round"/></svg>
    </div>

    <script>
        (function() {
            const stage = document.getElementById('val-smooth-game'), start = document.getElementById('v-start'), ui = document.getElementById('v-ui');
            const player = document.getElementById('v-p'), scoreDisp = document.getElementById('v-score');
            const timeDisp = document.getElementById('v-timer'), cheerDisp = document.getElementById('v-cheer');
            let score = 0, time = 60, active = false, pName = "", phrases = [];

            const rawPhrases = [
                "Весь магический мир в шоке от тебя!", "Толпы поклонниц плачут в восторге!",
                "[NAME], это незаконно — быть таким ловким!", "Амур нервно курит в сторонке!",
                "Магнит для любви активирован!", "Даже котики завидуют твоей реакции!",
                "Ты разбиваешь статистику форума!", "Сердечный маг 80-го уровня!",
                "Где ты научился так красть сердца, [NAME]?", "Поклонницы уже строчат тебе письма!"
            ];

            const shufflePhrases = () => { phrases = [...rawPhrases].sort(() => Math.random() - 0.5); };

            function play() {
                pName = document.getElementById('v-name').value.trim() || "Герой";
                active = true; score = 0; time = 60; shufflePhrases();
                start.style.display = 'none'; player.style.display = 'block'; ui.style.display = 'flex';
                const t = setInterval(() => {
                    time--; timeDisp.innerText = time + 's';
                    if (time <= 0) { clearInterval(t); finish(); }
                }, 1000);
                spawn();
            }

            function finish() {
                active = false;
                const d = JSON.parse(localStorage.getItem('v_rank_final') || '[]');
                d.push({n: pName, s: score});
                d.sort((a,b) => b.s - a.s);
                localStorage.setItem('v_rank_final', JSON.stringify(d));
                alert(`ФИНАЛ! ${pName}, твой счёт: ${score}`);
                location.reload();
            }

            const move = (cx) => {
                if (!active) return;
                const r = stage.getBoundingClientRect();
                player.style.left = Math.max(35, Math.min(cx - r.left, r.width - 35)) + 'px';
            };
            stage.addEventListener('mousemove', (e) => move(e.clientX));
            stage.addEventListener('touchmove', (e) => { e.preventDefault(); move(e.touches[0].clientX); }, {passive: false});

            function spawn() {
                if (!active) return;
                const h = document.createElement('div');
                h.style.cssText = `position: absolute; top: -40px; width: 30px; height: 30px; transform: translateX(-50%); pointer-events: none; will-change: top;`;
                const heartColor = score >= 30 ? '#fff' : '#ff4d6d';
                h.innerHTML = `<svg viewBox="0 0 24 24" fill="${heartColor}"><path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z"/></svg>`;
                h.style.left = (20 + Math.random() * (stage.offsetWidth - 40)) + 'px';
                stage.appendChild(h);

                let y = -40, spd = 2.2 + (score * 0.04) + Math.random() * 1.8; // Чуть снизил базовую скорость
                function f() {
                    if (!active) { h.remove(); return; }
                    y += spd; h.style.top = y + 'px';
                    const pR = player.getBoundingClientRect(), hR = h.getBoundingClientRect();
                    if (hR.bottom >= pR.top && hR.right >= pR.left && hR.left <= pR.right && hR.top <= pR.bottom) {
                        score++; scoreDisp.innerText = `Счёт: ${score}`;
                       
                        if (score === 15) { stage.style.background = "#ffb3c1"; ui.style.color = "#8d001a"; }
                        if (score === 30) { stage.style.background = "#ff4d6d"; ui.style.color = "#ffffff"; }

                        // Фраза теперь появляется каждые 12 очков
                        if (score % 12 === 0) {
                            if (phrases.length === 0) shufflePhrases();
                            cheerDisp.innerText = phrases.pop().replace("[NAME]", pName);
                            cheerDisp.style.opacity = 1;
                            // Текст висит 4 секунды
                            setTimeout(() => { cheerDisp.style.opacity = 0; }, 4000);
                        }
                        h.remove(); return;
                    }
                    if (y > stage.offsetHeight) { h.remove(); return; }
                    requestAnimationFrame(f);
                }
                requestAnimationFrame(f);
                setTimeout(spawn, Math.max(350, 800 - score * 7));
            }
            document.getElementById('v-btn').onclick = play;
            const updateBoard = () => {
                const d = JSON.parse(localStorage.getItem('v_rank_final') || '[]');
                document.getElementById('v-board').innerHTML = d.length ? "<b>Рекорды:</b><br>" + d.slice(0,3).map(i => `${i.n}: ${i.s}`).join('<br>') : "";
            };
            updateBoard();
        })();
    </script>
</div>
[/html]

0

3

[html]<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>Ловец сердец</title>
<link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@400;700;900&family=Pacifico&display=swap" rel="stylesheet">

<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
    font-family: 'Montserrat', sans-serif;
    background: #1a1a1a;
    display: flex;
    justify-content: center;
    align-items: center;
    min-height: 100vh;
    touch-action: none;
    overflow: hidden;
}

.game-wrap {
    width: 95vw;
    max-width: 800px;
    aspect-ratio: 16/9;
    position: relative;
    background: linear-gradient(135deg, #fff0f3, #ffe5ec);
    border: 3px solid #ff4d6d;
    border-radius: 20px;
    overflow: hidden;
}

h2 {
    font-family: 'Pacifico', cursive;
    color: #ff4d6d;
    line-height: 1.1;
    font-size: clamp(24px, 5vw, 34px);
    margin-bottom: 8px;
}

.ui { position: absolute; top: 12px; width: 100%; padding: 0 20px; display: none; justify-content: space-between; z-index: 10; color: #ff4d6d; pointer-events: none; }
.score, .timer { font-size: clamp(16px, 3.2vw, 22px); font-weight: 700; }

.cheer {
    position: absolute; top: 30%; left: 50%; transform: translate(-50%, -50%);
    font-size: clamp(14px, 2.8vw, 19px); text-align: center; color: #ff4d6d;
    opacity: 0; max-width: 80%; font-weight: 800;
    z-index: 15; pointer-events: none;
    text-shadow: 1px 1px 0px #fff;
}
.cheer.show { animation: cheerPop 2.5s ease-out forwards; }
@keyframes cheerPop {
    0% { opacity: 0; transform: translate(-50%, -20%) scale(0.9); }
    15% { opacity: 1; transform: translate(-50%, -50%) scale(1.05); }
    100% { opacity: 0; transform: translate(-50%, -80%) scale(1); }
}

.player { position: absolute; bottom: 12px; left: 50%; width: 70px; height: 45px; transform: translateX(-50%); z-index: 20; display: none; transition: transform 0.1s; }
.basket { width: 100%; height: 100%; background: #d97706; border: 2px solid #92400e; border-radius: 5px 5px 20px 20px; }

/* Эффект поимки */
@keyframes catchEffect {
    0% { transform: translateX(-50%) scale(1); filter: brightness(1); }
    50% { transform: translateX(-50%) scale(1.2); filter: brightness(1.4); }
    100% { transform: translateX(-50%) scale(1); filter: brightness(1); }
}
.catch-anim { animation: catchEffect 0.2s ease-out; }

.screen { position: absolute; inset: 0; z-index: 30; display: flex; flex-direction: column; align-items: center; justify-content: center; background: linear-gradient(135deg, #fff0f3, #ffe5ec); padding: 15px; }
.logo { width: clamp(70px, 12vw, 90px); height: auto; margin-bottom: 10px; border-radius: 50%; }

.screen input { padding: 10px; border: 2px solid #ff4d6d; border-radius: 12px; margin-bottom: 12px; font-size: 15px; font-family: inherit; text-align: center; width: 200px; outline: none; }
.screen button { padding: 10px 30px; background: #ff4d6d; color: white; border: none; border-radius: 50px; cursor: pointer; font-weight: 700; font-size: 17px; box-shadow: 0 4px 0 #c41c3b; transition: 0.2s; }

#end-screen { display: none; z-index: 40; }
.res-info { margin-bottom: 5px; text-align: center; }

.res-info .status {
    font-family: 'Pacifico', cursive;
    color: #d9480f;
    font-size: clamp(20px, 4.5vw, 30px);
    margin-bottom: 2px;
    display: block;
}
.res-info .score-val {
    font-size: 48px;
    color: #ff4d6d;
    font-weight: 900;
    line-height: 0.9;
    margin-bottom: 4px;
}
.res-info .p-label { color: #888; font-size: 13px; font-weight: 700; text-transform: uppercase; letter-spacing: 1px; }

.status.legend {
    color: #ff4d6d !important;
    text-shadow: 2px 2px 0px #fff;
    filter: drop-shadow(0 0 5px rgba(255, 77, 109, 0.3));
}

.leaderboard-box { width: 85%; max-width: 270px; background: rgba(255,255,255,0.5); padding: 10px; border-radius: 15px; border: 1px solid #ffb3c1; margin-bottom: 10px; }
.leader-row { display: flex; justify-content: space-between; font-size: 13px; padding: 4px 8px; border-radius: 8px; color: #444; }
.leader-row:nth-child(even) { background: rgba(255, 77, 109, 0.06); }
</style>
</head>
<body>

<div class="game-wrap" id="game-container">
    <div class="ui" id="game-ui">
        <div class="score">❤️ <span id="val-score">0</span></div>
        <div class="timer"><span id="val-time">60</span>s</div>
    </div>
    <div class="cheer" id="val-cheer"></div>
   
    <div class="screen" id="start-screen">
        <img src="https://i.imgur.com/G42b7SB.png" alt="Heart Icon" class="logo">
        <h2>Ловец сердец</h2>
        <input type="text" id="p-name" placeholder="Имя ловца" maxlength="12">
        <button id="start-btn">Начать!</button>
        <div id="leaderboard" class="leaderboard-box" style="margin-top: 10px;"></div>
    </div>
   
    <div class="player" id="game-player"><div class="basket"></div></div>
   
    <div class="screen" id="end-screen">
        <h2>Ритуал завершен!</h2>
        <div class="res-info">
            <span id="res-status" class="status"></span>
            <div id="res-score" class="score-val"></div>
            <div id="res-name" class="p-label"></div>
        </div>
        <div class="leaderboard-box" id="final-board"></div>
        <button onclick="location.reload()">Еще разок</button>
    </div>
</div>

<script>
const game = {
    score: 0, time: 60, active: false, name: '',
    phrasesPool: [], currentPhrases: [], timerInt: null,
    lastPhraseScore: 0,

    init() {
        this.updateBoard('leaderboard');
        this.phrasesPool = [
            "Магический рекорд!", "Фанатки в восторге!", "[NAME], ты легенда!",
            "[NAME], ты ювелир!", "Настоящий магнит для любви!", "Поймай и моё сердце, крошка)",
            "Где ты так научился, [NAME]?", "Твои движения безупречны!", "Руки загребуки!",
            "Поток заряжен!", "Создатель бы тобой гордился, [NAME]!", "[NAME], а ты точно волшебник?",
            "Это всё твои чары?", "Слишком хорош для этого мира!", "[NAME], ты просто космос!",
            "Сердца так и липнут к тебе!", "Магия вне Салема, чесслово!", "Кто-то остановите [NAME]!",
            "Мастер амурных дел в здании!"
        ];
        this.resetPhrases();
        document.getElementById('start-btn').onclick = () => this.start();
    },

    resetPhrases() { this.currentPhrases = [...this.phrasesPool].sort(() => Math.random() - 0.5); },

    start() {
        this.name = document.getElementById('p-name').value.trim() || 'Гость';
        this.active = true;
        document.getElementById('start-screen').style.display = 'none';
        document.getElementById('game-ui').style.display = 'flex';
        document.getElementById('game-player').style.display = 'block';
        this.timerInt = setInterval(() => {
            this.time--;
            document.getElementById('val-time').textContent = this.time;
            if (this.time <= 0) this.finish();
        }, 1000);
        this.spawn();
    },

    spawn() {
        if (!this.active) return;
        const h = document.createElement('div');
        h.style.cssText = `position: absolute; top: -40px; width: 32px; height: 32px; z-index: 5;`;
        const isBonus = Math.random() < 0.15;
        h.innerHTML = isBonus ? `<svg viewBox="0 0 24 24" fill="#ffcc00"><path d="M12 .587l3.668 7.568 8.332 1.151-6.064 5.828 1.48 8.279-7.416-3.967-7.417 3.967 1.481-8.279-6.064-5.828 8.332-1.151z"/></svg>` : `<svg viewBox="0 0 24 24" fill="#ff4d6d"><path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z"/></svg>`;
        const wrap = document.getElementById('game-container');
        h.style.left = (Math.random() * (wrap.offsetWidth - 40)) + 'px';
        wrap.appendChild(h);
        let y = -40;
        const speed = 3.6 + (this.score * 0.04);
        const fall = () => {
            if (!this.active) { h.remove(); return; }
            y += speed; h.style.top = y + 'px';
            const pEl = document.getElementById('game-player');
            const pR = pEl.getBoundingClientRect();
            const hR = h.getBoundingClientRect();
            if (hR.bottom >= pR.top && hR.right >= pR.left && hR.left <= pR.right && hR.top <= pR.bottom) {
                this.score += isBonus ? 5 : 1;
                document.getElementById('val-score').textContent = this.score;
               
                // ЭФФЕКТ ПОИМКИ
                pEl.classList.remove('catch-anim');
                void pEl.offsetWidth; // сброс анимации
                pEl.classList.add('catch-anim');

                if (this.score >= this.lastPhraseScore + 5) { this.showCheer(); this.lastPhraseScore = this.score; }
                h.remove(); return;
            }
            if (y > wrap.offsetHeight) { h.remove(); return; }
            requestAnimationFrame(fall);
        };
        requestAnimationFrame(fall);
        setTimeout(() => this.spawn(), Math.max(250, 850 - this.score * 4));
    },

    showCheer() {
        if (this.currentPhrases.length === 0) this.resetPhrases();
        const c = document.getElementById('val-cheer');
        c.textContent = this.currentPhrases.pop().replace('[NAME]', this.name);
        c.classList.remove('show'); void c.offsetWidth; c.classList.add('show');
    },

    finish() {
        this.active = false;
        clearInterval(this.timerInt);
        const s = JSON.parse(localStorage.getItem('m_scores_v17') || '[]');
        s.push({n: this.name, s: this.score});
        const sorted = s.sort((a,b)=>b.s-a.s).slice(0,5);
        localStorage.setItem('m_scores_v17', JSON.stringify(sorted));
       
        document.getElementById('end-screen').style.display = 'flex';
        document.getElementById('res-name').textContent = this.name;
        document.getElementById('res-score').textContent = this.score;
       
        const st = document.getElementById('res-status');
        st.classList.remove('legend');
        if (this.score >= 80) { st.textContent = "Маг любви 80 уровня!"; st.classList.add('legend'); }
        else if (this.score > 50) st.textContent = "Мастер амурных дел";
        else if (this.score > 20) st.textContent = "Уверенный пользователь сердец";
        else st.textContent = "Наивняк";
       
        this.updateBoard('final-board');
    },

    updateBoard(tid) {
        const s = JSON.parse(localStorage.getItem('m_scores_v17') || '[]');
        const c = document.getElementById(tid);
        if (s && s.length > 0) {
            c.style.display = 'block';
            c.innerHTML = '<b style="color:#ff4d6d;font-size:10px;display:block;margin-bottom:4px;padding-left:8px;text-transform:uppercase;">Топ ловцов:</b>' +
                s.map((x,i)=>`<div class="leader-row"><span>${i+1}. ${x.n}</span><b>${x.s} ❤️</b></div>`).join('');
        } else if (c) { c.style.display = 'none'; }
    }
};

const mv = (e) => {
    if (!game.active) return;
    const r = document.getElementById('game-container').getBoundingClientRect();
    const x = (e.touches ? e.touches[0].clientX : e.clientX) - r.left;
    document.getElementById('game-player').style.left = Math.max(35, Math.min(x, r.width - 35)) + 'px';
};
window.addEventListener('mousemove', mv);
window.addEventListener('touchmove', (e) => { if(game.active) e.preventDefault(); mv(e); }, {passive: false});
game.init();
</script>
</body>
</html>[/html]

0

4

[html]<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Ленни x Фарид </title>
    <style>
        @import url('https://fonts.googleapis.com/css2?family=Lora:ital,wght@0,400;0,600;0,700;1,400&family=Crimson+Text:wght@400;600;700&display=swap');
       
        .fandom-page {
            font-family: 'Lora', serif;
            color: #333;
            max-width: 800px;
            margin: 0 auto;
            padding: 20px;
            font-size: 14px;
        }
       
        .fandom-page * {
            box-sizing: border-box;
        }
       
        /* Header */
        .fp-header {
            background: white;
            border: 2px solid #333;
            padding: 15px;
            margin-bottom: 20px;
        }
       
        .header-layout {
            display: grid;
            grid-template-columns: 200px 1fr;
            gap: 20px;
            align-items: start;
        }
       
        .fp-cover {
            width: 200px;
            height: auto;
            border: 3px solid #333;
            box-shadow: 6px 6px 15px rgba(0, 0, 0, 0.3);
            display: block;
            cursor: pointer;
            transition: transform 0.3s ease, box-shadow 0.3s ease;
        }
       
        .fp-cover.zoomed {
            transform: scale(1.3);
            box-shadow: 10px 10px 25px rgba(0, 0, 0, 0.5);
            z-index: 100;
            position: relative;
        }
       
        .fp-info {
            display: flex;
            flex-direction: column;
        }
       
        .fp-title {
            font-family: 'Crimson Text', serif;
            font-size: 1.8em;
            font-weight: 700;
            color: #333;
            margin: 0 0 15px 0;
            line-height: 1.2;
            cursor: pointer;
            transition: color 0.2s ease, transform 0.2s ease;
        }
       
        .fp-title:hover {
            color: #666;
        }
       
        /* Roar animation */
        .roar-text {
            position: fixed;
            right: -200px;
            top: 50%;
            transform: translateY(-50%);
            font-family: 'Crimson Text', serif;
            font-size: 4em;
            font-weight: 700;
            color: #333;
            text-shadow: 3px 3px 6px rgba(0, 0, 0, 0.3);
            z-index: 1000;
            pointer-events: none;
            animation: roarSlide 2s ease-out forwards;
        }
       
        @keyframes roarSlide {
            0% {
                right: -200px;
                opacity: 0;
            }
            20% {
                right: 20px;
                opacity: 1;
            }
            80% {
                right: 20px;
                opacity: 1;
            }
            100% {
                right: -200px;
                opacity: 0;
            }
        }
       
        @keyframes titleShake {
            0%, 100% { transform: translateX(0) rotate(0deg); }
            10% { transform: translateX(-3px) rotate(-1deg); }
            20% { transform: translateX(3px) rotate(1deg); }
            30% { transform: translateX(-3px) rotate(-1deg); }
            40% { transform: translateX(3px) rotate(1deg); }
            50% { transform: translateX(-3px) rotate(-1deg); }
            60% { transform: translateX(3px) rotate(1deg); }
            70% { transform: translateX(-2px) rotate(-0.5deg); }
            80% { transform: translateX(2px) rotate(0.5deg); }
            90% { transform: translateX(-1px) rotate(-0.2deg); }
        }
       
        .fp-title.shake {
            animation: titleShake 0.6s ease-in-out;
        }
       
        .fp-meta {
            display: grid;
            grid-template-columns: repeat(3, 1fr);
            gap: 10px;
            margin-top: 0;
            text-align: left;
        }
       
        .fp-meta-item {
            padding: 8px;
            border-left: 3px solid #333;
            background: #f5f5f5;
        }
       
        .fp-meta-label {
            font-size: 0.75em;
            color: #999;
            text-transform: uppercase;
            letter-spacing: 0.5px;
            font-weight: 600;
            margin-bottom: 3px;
        }
       
        .fp-meta-value {
            font-size: 0.95em;
            color: #333;
            font-weight: 500;
        }
       
        .fp-rating {
            color: #333;
            font-weight: 700;
        }
       
        /* Summary */
        .fp-summary {
            background: #f5f5f5;
            border: 2px solid #e0e0e0;
            padding: 15px;
            margin-bottom: 20px;
            line-height: 1.7;
            font-size: 1.05em;
        }
       
        .fp-summary p {
            margin: 0 0 10px 0;
        }
       
        .fp-summary p:last-child {
            margin-bottom: 0;
        }
       
        .fp-summary em {
            color: #333;
            font-style: italic;
        }
       
        /* Section */
        .fp-section {
            background: white;
            border: 2px solid #333;
            padding: 20px;
            margin-bottom: 20px;
        }
       
        .fp-section-title {
            font-family: 'Crimson Text', serif;
            font-size: 1.4em;
            color: #333;
            margin: 0 0 12px 0;
            font-weight: 700;
            border-bottom: 2px solid #e0e0e0;
            padding-bottom: 6px;
        }
       
        /* Characters */
        .fp-characters {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
            gap: 12px;
        }
       
        .fp-char {
            background: #f5f5f5;
            border: 2px solid #e0e0e0;
            border-left: 4px solid #333;
            padding: 12px;
            cursor: pointer;
            transition: all 0.3s ease;
        }
       
        .fp-char:hover {
            border-left-color: #000;
            box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
        }
       
        .fp-char-name {
            font-family: 'Crimson Text', serif;
            font-size: 1.3em;
            color: #333;
            margin: 0 0 5px 0;
            font-weight: 700;
        }
       
        .fp-char-role {
            color: #666;
            font-size: 0.8em;
            font-weight: 600;
            margin: 0 0 10px 0;
            text-transform: uppercase;
            letter-spacing: 0.5px;
        }
       
        .fp-char-desc {
            max-height: 0;
            overflow: hidden;
            opacity: 0;
            transition: all 0.4s ease;
            font-size: 0.95em;
            line-height: 1.5;
            color: #555;
        }
       
        .fp-char.active .fp-char-desc {
            max-height: 250px;
            opacity: 1;
            margin-top: 10px;
            padding-top: 10px;
            border-top: 1px solid #e0e0e0;
        }
       
        /* Tags */
        .fp-tags {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
            gap: 10px;
        }
       
        .fp-tag {
            background: #f5f5f5;
            border-left: 3px solid #333;
            padding: 8px 10px;
            font-size: 0.95em;
            transition: all 0.3s ease;
        }
       
        .fp-tag:hover {
            background: #e0e0e0;
            transform: translateX(3px);
        }
       
        .fp-tag-title {
            font-weight: 600;
            color: #333;
            display: block;
            margin-bottom: 3px;
            font-size: 0.85em;
            text-transform: uppercase;
            letter-spacing: 0.5px;
        }
       
        /* Hashtags */
        .fp-hashtags {
            display: flex;
            flex-wrap: wrap;
            gap: 8px;
        }
       
        .fp-hashtag {
            background: white;
            border: 1px solid #333;
            color: #333;
            padding: 5px 10px;
            font-size: 0.9em;
            font-weight: 600;
            border-radius: 15px;
            transition: all 0.3s ease;
            cursor: pointer;
            display: inline-block;
        }
       
        .fp-hashtag:hover {
            background: #333;
            color: white;
        }
       
        /* Footer */
        .fp-footer {
            background: white;
            border: 2px solid #333;
            padding: 15px;
            text-align: center;
            color: #666;
            font-style: italic;
            font-size: 0.9em;
        }
       
        @media (max-width: 600px) {
            .header-layout {
                grid-template-columns: 1fr;
                gap: 15px;
            }
           
            .fp-cover {
                width: 100%;
                max-width: 200px;
                margin: 0 auto;
            }
           
            .fp-title {
                font-size: 1.5em;
            }
           
            .fp-meta {
                grid-template-columns: repeat(2, 1fr);
            }
           
            .fp-characters,
            .fp-tags {
                grid-template-columns: 1fr;
            }
        }
    </style>
</head>
<body>
    <div class="fandom-page">
        <!-- Header -->
        <div class="fp-header">
            <div class="header-layout">
                <img src="https://upforme.ru/uploads/001c/82/f2/10/107525.jpg" alt="Обложка" class="fp-cover">
               
                <div class="fp-info">
                    <h1 class="fp-title">The man I was promised</h1>
                   
                    <div class="fp-meta">
                        <div class="fp-meta-item">
                            <div class="fp-meta-label">Рейтинг</div>
                            <div class="fp-meta-value"><span class="fp-rating">Explicit</span></div>
                        </div>
                        <div class="fp-meta-item">
                            <div class="fp-meta-label">Статус</div>
                            <div class="fp-meta-value">Ongoing</div>
                        </div>
                        <div class="fp-meta-item">
                            <div class="fp-meta-label">Главы</div>
                            <div class="fp-meta-value">∞</div>
                        </div>
                        <div class="fp-meta-item">
                            <div class="fp-meta-label">Вселенная</div>
                            <div class="fp-meta-value">Kindred Spirits</div>
                        </div>
                        <div class="fp-meta-item">
                            <div class="fp-meta-label">Жанр</div>
                            <div class="fp-meta-value">Angst, Romance</div>
                        </div>
                        <div class="fp-meta-item">
                            <div class="fp-meta-label">Пейринг</div>
                            <div class="fp-meta-value">Rosenclaire</div>
                        </div>
                    </div>
                   
                    <div class="fp-tags" style="margin-top: 15px;">
                        <div class="fp-tag">
                            <span class="fp-tag-title">Отношения</span>
                            Toxic Love / Codependency
                        </div>
                        <div class="fp-tag">
                            <span class="fp-tag-title">Персонажи</span>
                            Фарид / Ленни
                        </div>
                        <div class="fp-tag">
                            <span class="fp-tag-title">Предупреждения</span>
                            Emotional Abuse, Violence
                        </div>
                        <div class="fp-tag">
                            <span class="fp-tag-title">Тема</span>
                            Пара / Слэш
                        </div>
                        <div class="fp-tag">
                            <span class="fp-tag-title">Сеттинг</span>
                            Magical Academy
                        </div>
                        <div class="fp-tag">
                            <span class="fp-tag-title">Динамика</span>
                            Power Play
                        </div>
                    </div>
                </div>
            </div>
        </div>
       
        <!-- Summary -->
        <div class="fp-summary">
            <p>Иногда людей связывает не сходство, а совпадение трещин.</p>
            <p>Фарид и Ленни встречаются трижды — и каждая из этих встреч меняет их сильнее, чем должна была бы. Между ними возникает связь, в которой холод и уязвимость цепляются друг за друга, не оставляя пространства для безопасной близости.</p>
            <p>Один привык прятать боль глубоко внутри и не называть её вслух. Другой живёт так, будто всё должно быть видно сразу — каждое чувство, каждый надлом. Они причиняют друг другу боль, путая её с честностью, и снова и снова пытаются удержать то, что рассыпается у них в руках.</p>
            <p>Где-то между <em>«иди нахер»</em> и <em>«я всё для тебя сделаю»</em> живёт их любовь — тяжёлая, болезненная, почти невозможная к исправлению. Любовь, которая не спасает, но не отпускает.</p>
        </div>
       
        <!-- Hashtags -->
        <div class="fp-section">
            <div class="fp-hashtags">
                <span class="fp-hashtag">#мыопятьпоссорились</span>
                <span class="fp-hashtag">#спаситезаебал</span>
                <span class="fp-hashtag">#янедоговорил</span>
                <span class="fp-hashtag">#на_коЛенни</span>
                <span class="fp-hashtag">#тыобещал</span>
                <span class="fp-hashtag">#раздевайся</span>
                <span class="fp-hashtag">#ToxicLove</span>
                <span class="fp-hashtag">#FaridAndLenny</span>
            </div>
        </div>
       
        <!-- Footer -->
        <div class="fp-footer" style="text-align: center !important;">
            <p style="text-align: center !important; margin: 5px 0;">✦ Скоро во всех книжных страны | Сильнее любви, дороже дружбы ✦</p>
            <p style="text-align: center !important; margin: 5px 0;">The clock is set for nine but you know you're gonna make it eight</p>
            <p style="text-align: center !important; margin: 5px 0;">So that you two can take some time, teach each other to reciprocate</p>
        </div>
    </div>
   
    <script>
        // Character box toggle
        document.querySelectorAll('.fp-char').forEach(char => {
            char.addEventListener('click', function() {
                this.classList.toggle('active');
            });
        });
       
        // Image zoom on click
        const cover = document.querySelector('.fp-cover');
        if (cover) {
            cover.addEventListener('click', function() {
                this.classList.toggle('zoomed');
            });
        }
       
        // Lion roar VISUAL effect on title click
        const title = document.querySelector('.fp-title');
        if (title) {
            title.addEventListener('click', function() {
                // Создаем элемент с текстом "РЫЫЫЫ"
                const roarText = document.createElement('div');
                roarText.className = 'roar-text';
                roarText.textContent = 'РЫЫЫЫ!!!';
                document.body.appendChild(roarText);
               
                // Удаляем элемент после анимации
                setTimeout(() => {
                    roarText.remove();
                }, 2000);
               
                // Добавляем тряску заголовка
                this.classList.add('shake');
                setTimeout(() => {
                    this.classList.remove('shake');
                }, 600);
            });
        }
    </script>
</body>
</html>[/html]

0

5

[html]<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Зелье забвения</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
       
        body {
            font-family: 'Georgia', serif;
            background: transparent;
            min-height: 100vh;
            overflow-x: hidden;
            color: #fff;
        }
       
        .dark-wrapper {
            background: linear-gradient(135deg, #1a1a2e 0%, #16213e 50%, #0f3460 100%);
            min-height: 100vh;
            padding: 40px 20px;
            margin: 0;
            border: 3px solid #ec4899;
            border-radius: 15px;
            box-shadow: 0 0 30px rgba(236, 72, 153, 0.5);
        }
       
        .container {
            max-width: 1200px;
            margin: 0 auto;
            padding: 40px 20px;
            position: relative;
        }
       
        /* Potion bottle in center */
        .potion-container {
            position: relative;
            width: 300px;
            height: 400px;
            margin: 0 auto 60px;
            cursor: pointer;
            transition: transform 0.3s ease;
        }
       
        .potion-container:hover {
            transform: scale(1.05);
        }
       
        .bottle {
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            width: 120px;
            height: 180px;
            background: linear-gradient(180deg, rgba(236, 72, 153, 0.3) 0%, rgba(236, 72, 153, 0.8) 100%);
            border: 3px solid rgba(236, 72, 153, 0.6);
            border-radius: 20px 20px 40px 40px;
            box-shadow:
                0 0 30px rgba(236, 72, 153, 0.5),
                inset 0 0 20px rgba(255, 255, 255, 0.1);
            position: relative;
            overflow: hidden;
        }
       
        .bottle::before {
            content: '';
            position: absolute;
            top: -40px;
            left: 50%;
            transform: translateX(-50%);
            width: 40px;
            height: 50px;
            background: linear-gradient(180deg, rgba(236, 72, 153, 0.4) 0%, rgba(236, 72, 153, 0.6) 100%);
            border: 3px solid rgba(236, 72, 153, 0.6);
            border-radius: 10px 10px 0 0;
        }
       
        .liquid {
            position: absolute;
            bottom: 0;
            left: 0;
            right: 0;
            height: 70%;
            background: linear-gradient(135deg, #ec4899 0%, #f472b6 25%, #fbbf24 50%, #f59e0b 75%, #ec4899 100%);
            background-size: 400% 400%;
            border-radius: 0 0 37px 37px;
            animation: liquidShimmer 8s ease-in-out infinite;
            position: relative;
            overflow: hidden;
        }
       
        @keyframes liquidShimmer {
            0% {
                background-position: 0% 50%;
                filter: brightness(1) saturate(1);
            }
            25% {
                background-position: 50% 50%;
                filter: brightness(1.1) saturate(1.2);
            }
            50% {
                background-position: 100% 50%;
                filter: brightness(1.2) saturate(1.3);
            }
            75% {
                background-position: 50% 50%;
                filter: brightness(1.1) saturate(1.2);
            }
            100% {
                background-position: 0% 50%;
                filter: brightness(1) saturate(1);
            }
        }
       
        .liquid::after {
            content: '';
            position: absolute;
            top: 0;
            left: -100%;
            width: 100%;
            height: 100%;
            background: linear-gradient(90deg,
                transparent 0%,
                rgba(255, 255, 255, 0.3) 25%,
                rgba(255, 255, 255, 0.5) 50%,
                rgba(255, 255, 255, 0.3) 75%,
                transparent 100%
            );
            animation: sparkle 3s ease-in-out infinite;
        }
       
        @keyframes sparkle {
            0% {
                left: -100%;
            }
            100% {
                left: 200%;
            }
        }
       
        .shimmer {
            position: absolute;
            top: 10%;
            left: 15%;
            width: 25%;
            height: 60%;
            background: linear-gradient(135deg, transparent, rgba(255, 255, 255, 0.4), transparent);
            border-radius: 50%;
            animation: shimmerMove 5s ease-in-out infinite;
            filter: blur(8px);
        }
       
        @keyframes shimmerMove {
            0%, 100% {
                transform: translateY(0) translateX(0) rotate(45deg);
                opacity: 0.4;
            }
            25% {
                transform: translateY(-15px) translateX(5px) rotate(50deg);
                opacity: 0.6;
            }
            50% {
                transform: translateY(-25px) translateX(-5px) rotate(40deg);
                opacity: 0.7;
            }
            75% {
                transform: translateY(-15px) translateX(5px) rotate(45deg);
                opacity: 0.5;
            }
        }
       
        /* Flying ingredients */
        .ingredient {
            position: absolute;
            font-size: 2em;
            opacity: 0;
            pointer-events: none;
            filter: drop-shadow(0 0 10px rgba(236, 72, 153, 0.8));
        }
       
        .ingredient.flying-left {
            animation: flyFromLeft 4s ease-in-out infinite;
        }
       
        .ingredient.flying-right {
            animation: flyFromRight 4s ease-in-out infinite;
        }
       
        @keyframes flyFromLeft {
            0% {
                left: -100px;
                opacity: 0;
                transform: translateY(0) rotate(0deg);
            }
            30% {
                opacity: 1;
            }
            50% {
                left: 50%;
                transform: translateY(-20px) rotate(180deg);
            }
            70% {
                opacity: 0.3;
            }
            100% {
                left: 50%;
                opacity: 0;
                transform: translateY(100px) rotate(360deg) scale(0.5);
            }
        }
       
        @keyframes flyFromRight {
            0% {
                right: -100px;
                opacity: 0;
                transform: translateY(0) rotate(0deg);
            }
            30% {
                opacity: 1;
            }
            50% {
                right: 50%;
                transform: translateY(-20px) rotate(-180deg);
            }
            70% {
                opacity: 0.3;
            }
            100% {
                right: 50%;
                opacity: 0;
                transform: translateY(100px) rotate(-360deg) scale(0.5);
            }
        }
       
        /* Text area - hidden by default */
        .text-container {
            background: rgba(22, 33, 62, 0.95);
            border: 2px solid rgba(236, 72, 153, 0.5);
            border-radius: 15px;
            padding: 0;
            margin-top: 0;
            line-height: 1.8;
            font-size: 1.1em;
            max-height: 0;
            overflow: hidden;
            opacity: 0;
            transition: all 0.8s ease;
            box-shadow: 0 10px 40px rgba(0, 0, 0, 0.5);
        }
       
        .text-container.visible {
            max-height: 600px;
            overflow-y: auto;
            opacity: 1;
            margin-top: 40px;
            margin-bottom: 40px;
            padding: 40px;
        }
       
        /* Scrollbar styling */
        .text-container::-webkit-scrollbar {
            width: 10px;
        }
       
        .text-container::-webkit-scrollbar-track {
            background: rgba(22, 33, 62, 0.5);
            border-radius: 10px;
        }
       
        .text-container::-webkit-scrollbar-thumb {
            background: rgba(236, 72, 153, 0.6);
            border-radius: 10px;
        }
       
        .text-container::-webkit-scrollbar-thumb:hover {
            background: rgba(236, 72, 153, 0.9);
        }
       
        .text-container p {
            margin-bottom: 15px;
            color: #e0e0e0;
        }
       
        .dialogue {
            margin: 10px 0;
            padding-left: 20px;
            border-left: 3px solid rgba(236, 72, 153, 0.5);
        }
       
        .narrator {
            font-style: italic;
            color: #f9a8d4;
        }
       
        .title {
            text-align: center !important;
            font-size: 2.5em !important;
            margin-bottom: 20px !important;
            color: #f9a8d4 !important;
            text-shadow: 0 0 20px rgba(236, 72, 153, 0.8) !important;
            font-weight: 700 !important;
            display: block !important;
        }
       
        .instruction {
            text-align: center !important;
            font-size: 14px !important;
            color: #f9a8d4 !important;
            margin: 20px auto !important;
            animation: pulse 2s ease-in-out infinite;
            display: block !important;
            width: 100% !important;
        }
       
        @keyframes pulse {
            0%, 100% { opacity: 0.6; }
            50% { opacity: 1; }
        }
       
        /* Particle effects */
        .particles {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            pointer-events: none;
            overflow: hidden;
        }
       
        .particle {
            position: absolute;
            width: 4px;
            height: 4px;
            background: rgba(236, 72, 153, 0.6);
            border-radius: 50%;
            animation: float 15s linear infinite;
        }
       
        @keyframes float {
            0% {
                transform: translateY(100vh) translateX(0);
                opacity: 0;
            }
            10% {
                opacity: 1;
            }
            90% {
                opacity: 1;
            }
            100% {
                transform: translateY(-100px) translateX(100px);
                opacity: 0;
            }
        }
    </style>
</head>
<body>
    <div class="dark-wrapper">
    <div class="particles" id="particles"></div>
   
    <div class="container">
        <h1 class="title">Зелье Разрыва</h1>
       
        <div class="potion-container" id="potion">
            <div class="bottle">
                <div class="liquid"></div>
                <div class="shimmer"></div>
            </div>
           
            <!-- Flying ingredients -->
            <div class="ingredient flying-left" style="top: 20%; animation-delay: 0s;">❀</div>
            <div class="ingredient flying-right" style="top: 30%; animation-delay: 0.5s;">♥</div>
            <div class="ingredient flying-left" style="top: 40%; animation-delay: 1s;">❦</div>
            <div class="ingredient flying-right" style="top: 50%; animation-delay: 1.5s;">☙</div>
            <div class="ingredient flying-left" style="top: 60%; animation-delay: 2s;">✿</div>
            <div class="ingredient flying-right" style="top: 70%; animation-delay: 2.5s;">※</div>
            <div class="ingredient flying-left" style="top: 35%; animation-delay: 3s;">♥</div>
            <div class="ingredient flying-right" style="top: 55%; animation-delay: 3.5s;">✦</div>
        </div>
       
        <p class="instruction">Нажмите на флакон, чтобы раскрыть историю...</p>
       
        <div class="text-container" id="textContainer">
            <div class="dialogue">— Остыло же уже.</div>
            <div class="dialogue">— Еще нет.</div>
            <div class="dialogue">— У тебя рука не устала?</div>
            <div class="dialogue">— Нет, а должна?</div>
            <div class="dialogue">— Конечно. Однообразные ритмичные движения уже почти полчаса. Туннельный синдром тебе не грозит с таким навыком. Завидую твоей выносливости.</div>
            <div class="dialogue">— ...</div>
            <div class="dialogue">— А ты же не только мешать ложкой в котле так полчаса можешь ритмично и долго?</div>
           
            <p class="narrator">— Я тебя сейчас из лаборатории выгоню, — у Ленни брови сдвинуты серьезно и насуплено, голос строг, но губы разъезжаются в улыбку против воли самого ведьмака. Фарид низко смеется, откладывая с колен учебник по обрядам и ритуалистике, подтягивается на кулаках вперед по столу и ближе, чуть нависая над вяло испускающим пар котелком, что уже давно не облизывается снизу пламенем горелки, а Ленни все мешает и мешает свое варево длинной латунной ложкой. Это завораживает, успокаивает и навевает сонливость. Фаре точно, сам Сент-Клер собран и ясен взором, будто водородную бомбу изобретает. А кстати?</p>
           
            <div class="dialogue">— Ты название этой... субстанции уже придумал?</div>
            <div class="dialogue">— Нет. Надо сначала протестировать ее и окончательно выявить все свойства и побочки.</div>
            <div class="dialogue">— И только потом патентовать и в Швецию за нобелевкой по химии!</div>
            <div class="dialogue">— Ага.</div>
            <div class="dialogue">— Прикинь, в твою честь весь подвал Академии назовут, — Фарид взмахивает руками, растягивая перед собой невидимую вывеску. — Алхимические лаборатории имени Ленни Розенкранца!</div>
            <div class="dialogue">— ...</div>
           
            <p class="narrator">Лязгает ложечка по чугунному борту. Сейчас или варево полетит Фариду в красивые щи или сразу весь котел на голову нахлобучится, потому восточная красавица шарахается назад и прикрывается локтями от неминуемой кары. Но ее не следует. Напротив, Ленни переливает наконец-то изумительно-красивый раствор какого-то перламуторово-розового цвета в стеклянную бутылочку, ставит перед сложенными по-турецки коленями своего льва и отвлекается на записи. Бормочет про себя, пока любопытный и избежавший, на удивление, кары Фарид тянется любопытной лапой к флакону, чтобы рассмотреть содержимое ближе. Слышит где-то на периферии слуха: омела, асфодель, полынь, чертополох, но сам весь поглощен созерцанием переливов в точеных гранях стекла. Не может оторвать взгляда, его тянет к нему, как к самому необходимому и важному в жизни. Ноздри дразнит неуловимый аромат табака своих сигарет, своего любимого кедрового парфюма, чего то очень сладкого и чего-то настолько важного, необходимого, что-то, что звенит в районе гипофиза и никак не приходит четкой мыслью на ум. Красный волос, капля пота, капля слезы, капля крови.</p>
           
            <div class="dialogue">— Оно так пахнет...</div>
           
            <p class="narrator">Бубнеж прекращается. Фарид не видит, что золотые глаза за стеклами очков холодны и печальны, как этот самый мягкий, но металл. Ленни кивает сам себе, делает пометку в записях "объект сразу же попадает под влияние отвара" откладывает тетрадь и устало снимает с переносицы окуляры. Протирает их краешком рубашки, смотрит на своего фамильяра и спрашивает удивительно нежно и ласково.</p>
           
            <div class="dialogue">— О чем ты думаешь?</div>
            <div class="dialogue">— О тебе.</div>
           
            <p class="narrator">Ленни нервно сглатывает и моргает чаще. Тщательней протирает круглое стекло, будто в этом весь смысл и это самое главное.</p>
           
            <div class="dialogue">— Я сказал маме о тебе. Что у меня появился любимый человек, с которым я хочу прожить жизнь. А бабуле с дедулей сказал, что приеду летом с другом. Помнишь, я рассказывал про средиземное море и закаты над ним?</div>
            <div class="dialogue">— Помню. Не шути так на счет моей фамилии, Фарид, — его голос чуть дрогает, но Роз не слышит и этого, он вообще сейчас будто в трансе, полностью подчиненный сверкающей и какой-то будто живой субстанции между своих пальцев, от кожи которой разделяет только тонкое стекло.</div>
            <div class="dialogue">— А я не шутил. Я серьезно, Ленни. Я хочу быть с тобой до конца, и в горе и в радости.</div>
            <div class="dialogue">— Фарид, ты должен это выпить.</div>
            <div class="dialogue">— Но на меня же не подейств...</div>
            <div class="dialogue">— Это подействует.</div>
           
            <p class="narrator">Фарид не слышит всхлипа. Раньше бы среагировал еще в зародыше, ведь нет страшнее звука, чем когда Ленни плачет, а сейчас. Сейчас ему кажется, что нежная жидкость испускает манящие лепестки, будто сама тянется к нему из тонкого горлышка. И Фарид улыбается, смело втягивая глубоко аромат. Всегда блестящие глаза заволакивает матовым покрытием, тело расслабляется, а черты лица смягчаются, становятся такими юными, будто он совсем-совсем мальчишка.</p>
           
            <div class="dialogue">— Оно пахнет тобой. Это все-таки оно, да? Ты смог его сварить.</div>
           
            <p class="narrator">Ленни молчит. С подбородка срываются горькие капли, падают на рубашку и расплываются темными пятнами.</p>
           
            <div class="dialogue">— Ты же мог просто попросить. Зачем врать, что это твоя домашка? Я бы не отказал. А ты всегда этого хотел.</div>
           
            <p class="narrator">Ленни дрожит, накрывает лицо руками и плачет уже вслух навзрыд и горько.</p>
           
            <div class="dialogue">— Я умру, да?</div>
            <div class="dialogue">— Нет! Не должен, это просто... Я... Я не знаю. Нет, не пей, я не уверен. Я передумал!</div>
            <div class="dialogue">— Но ты же этого так хотел. Главное, что ты будешь счастлив. Пусть оно подействует.</div>
            <div class="dialogue">— Фарид!</div>
           
            <p class="narrator">Лев успевает быстрее, чем Ленни делает рывок и пытается отнять опасный флакон. Выпивает весь до капли, выдыхает и замирает. Переводит взгляд на Ленни и улыбается ему.</p>
           
            <p class="narrator">А потом улыбка тает. Фарид слезает со стола, подхватывает учебник и уходит бесшумно, ни разу не оглянувшись. Растворяется, будто его никогда и не было.</p>
           
            <p class="narrator">Ленни остается в лаборатории один. Чувствующий себя на пике силы, совершенный, цельный, самодостаточный и всемогущий. Гениальный алхимик, что сделал невозможное и такое желанное: изобрел зелье, что отвязывает истинных друг от друга, делая их абсолютно независимыми. Полными без союза. Без ритуального убийства второго. Без связи.</p>
           
            <p class="narrator" style="text-align: center; font-size: 1.3em; margin-top: 30px; color: #fbbf24;">Без пары.</p>
        </div>
    </div>
   
    <script>
        // Create floating particles
        const particlesContainer = document.getElementById('particles');
        for (let i = 0; i < 30; i++) {
            const particle = document.createElement('div');
            particle.className = 'particle';
            particle.style.left = Math.random() * 100 + '%';
            particle.style.animationDelay = Math.random() * 15 + 's';
            particle.style.animationDuration = (15 + Math.random() * 10) + 's';
            particlesContainer.appendChild(particle);
        }
       
        // Toggle text visibility on potion click
        const potion = document.getElementById('potion');
        const textContainer = document.getElementById('textContainer');
        const instruction = document.querySelector('.instruction');
       
        potion.addEventListener('click', function() {
            textContainer.classList.toggle('visible');
            if (textContainer.classList.contains('visible')) {
                instruction.style.display = 'none';
            } else {
                instruction.style.display = 'block';
            }
        });
    </script>
    </div>
</body>
</html>[/html]

0

6

[html]<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <link href="https://fonts.googleapis.com/css2?family=Comfortaa:wght@700&display=swap" rel="stylesheet">
    <style>
        #game-wrapper {
            max-width: 800px; width: 95%; margin: 10px auto; border: 4px solid #ff85a2;
            background: #fff0f3; padding: 20px; font-family: 'Comfortaa', cursive;
            text-align: center; border-radius: 25px; box-sizing: border-box;
            box-shadow: 0 15px 35px rgba(255, 133, 162, 0.4);
            position: relative; min-height: 550px; overflow: hidden;
            display: flex; flex-direction: column; justify-content: center;
        }
        .main-title {
            font-size: 85px; margin: 0; color: #ff4d6d; font-weight: 900;
            text-transform: uppercase; text-shadow: 4px 4px 0px #fff;
            animation: titlePulse 3s infinite ease-in-out; line-height: 0.9;
        }
        .subtitle { color: #a4133c; font-size: 22px; margin: 20px 0 25px 0; font-weight: bold; }
        @keyframes titlePulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.05); } }
       
        #menu-screen, #win-screen {
            position: absolute; top: 0; left: 0; width: 100%; height: 100%;
            background: #fff0f3; z-index: 200; display: flex; flex-direction: column;
            justify-content: center; align-items: center; padding: 20px; box-sizing: border-box;
        }
        #win-screen { display: none; z-index: 300; }
       
        .char-select-container { display: flex; gap: 40px; }
        .char-card {
            cursor: pointer; padding: 25px; background: white; border: 4px solid #ffe5ec;
            border-radius: 35px; transition: 0.3s;
        }
        .char-card:hover { border-color: #ff4d6d; transform: translateY(-10px); }
        .char-card img { width: 120px; }
        .char-card span { font-weight: bold; color: #590d22; font-size: 24px; }

        #score-board { font-size: 30px; color: #590d22; font-weight: 900; margin-bottom: 20px; display: none; }
        #arena {
            position: relative; width: 100%; aspect-ratio: 2 / 1;
            background: linear-gradient(135deg, #ff9a9e 0%, #fecfef 100%);
            border: 4px solid #ffb3c1; border-radius: 20px; overflow: hidden; display: none;
        }
        .character { position: absolute; width: 12%; z-index: 2; }
        #heart { position: absolute; width: 6%; z-index: 3; filter: drop-shadow(0 0 5px white); }
       
        .falling-heart {
            position: absolute; color: #ff4d6d; font-size: 20px;
            user-select: none; pointer-events: none; z-index: 400;
            animation: fall linear forwards;
        }
        @keyframes fall {
            to { transform: translateY(600px) rotate(360deg); opacity: 0; }
        }

        .bubble {
            position: absolute; background: white; border: 2px solid #333;
            border-radius: 12px; padding: 8px 14px; font-size: 13px; font-weight: bold;
            white-space: nowrap; z-index: 50; pointer-events: none;
        }
        .up-anim { animation: fadeUp 1.5s forwards; }
        .down-anim { animation: fadeDown 1.5s forwards; }
        @keyframes fadeUp { 0% { opacity: 0; } 15% { opacity: 1; transform: translateY(-10px); } 100% { opacity: 0; transform: translateY(-50px); } }
        @keyframes fadeDown { 0% { opacity: 0; } 15% { opacity: 1; transform: translateY(10px); } 100% { opacity: 0; transform: translateY(50px); } }
       
        .btn-restart { padding: 15px 40px; background: #ff4d6d; color: white; border: none; border-radius: 40px; font-weight: bold; cursor: pointer; font-size: 20px; box-shadow: 0 6px 0 #c9184a; }
    </style>
</head>
<body>

<div id="game-wrapper">
    <div id="menu-screen">
        <h1 class="main-title">Антивалентинка</h1>
        <p class="subtitle">Кто будет защищать границы?</p>
        <div class="char-select-container">
            <div class="char-card" onclick="startGame('lenny')">
                <img src="https://i.ibb.co/pjqQtqwC/SP-Studio-1.png"><br><span>Ленни</span>
            </div>
            <div class="char-card" onclick="startGame('farid')">
                <img src="https://i.ibb.co/RpjBQkJV/SP-Studio.png"><br><span>Фарид</span>
            </div>
        </div>
    </div>

    <div id="score-board">ЛЕННИ <span id="s_lenny">0</span> : <span id="s_farid">0</span> ФАРИД</div>
   
    <div id="arena">
        <img id="lenny" class="character" src="https://i.ibb.co/pjqQtqwC/SP-Studio-1.png" style="left:2%; top:40%;">
        <img id="farid" class="character" src="https://i.ibb.co/RpjBQkJV/SP-Studio.png" style="right:2%; top:40%;">
        <img id="heart" src="https://upload.wikimedia.org/wikipedia/commons/thumb/f/f1/Heart_coraz%C3%B3n.svg/64px-Heart_coraz%C3%B3n.svg.png" style="left:47%; top:45%;">
    </div>

    <div id="win-screen">
        <h2 id="final-score-text" style="font-size: 60px; color: #590d22; margin-bottom: 10px;">10 : 10</h2>
        <div class="char-select-container">
             <img src="https://i.ibb.co/pjqQtqwC/SP-Studio-1.png" style="width: 110px;">
             <img src="https://i.ibb.co/RpjBQkJV/SP-Studio.png" style="width: 110px;">
        </div>
        <p style="font-size: 28px; color: #ff4d6d; font-weight: bold; margin: 25px;">...а они всё равно вместе!</p>
        <button class="btn-restart" onclick="location.reload()">Играть снова</button>
    </div>
</div>

<script>
    var lennyY = 40, faridY = 40, heartX = 47, heartY = 45;
    var heartVX = 0, heartVY = 0;
    var scoreLenny = 0, scoreFarid = 0;
    var player = null, ai = null, aiTargetY = 40;
    var keys = {}, timerId = null;

    const phrasesLenny = ["сам себя люби", "надоел", "заебал", "пф-пф-пф", "не пялься", "отвали", "фу!", "не сегодня", "варю зелье", "личные границы!", "бесишь!", "ой, всё..."];
    const phrasesFarid = ["ты звездочка", "люблю тебя", "какой ты красивый", "вижу тебя во снах", "мур", "солнышко", "люблю до луны!", "свет моих глаз", "лети ко мне!", "ты — чудо"];

    window.addEventListener("keydown", e => { keys[e.key] = true; if(e.key.includes("Arrow")) e.preventDefault(); });
    window.addEventListener("keyup", e => { keys[e.key] = false; });

    function createBubble(id) {
        const arena = document.getElementById("arena"), char = document.getElementById(id), bubble = document.createElement("div");
        bubble.className = "bubble";
        bubble.innerText = (id === "lenny" ? phrasesLenny : phrasesFarid)[Math.floor(Math.random() * (id === "lenny" ? phrasesLenny : phrasesFarid).length)];
        let top = parseFloat(char.style.top);
        if (top < 15) { bubble.style.top = (top + 15) + "%"; bubble.classList.add("down-anim"); }
        else { bubble.style.top = (top - 8) + "%"; bubble.classList.add("up-anim"); }
        bubble.style.left = id === "lenny" ? "14%" : "65%";
        arena.appendChild(bubble);
        setTimeout(() => bubble.remove(), 1500);
    }

    function spawnFallingHearts() {
        const container = document.getElementById("game-wrapper");
        setInterval(() => {
            const h = document.createElement("div");
            h.className = "falling-heart";
            h.innerHTML = "❤"; //  классическое сердце
            h.style.left = Math.random() * 100 + "%";
            h.style.top = "-50px";
            h.style.fontSize = (Math.random() * 20 + 20) + "px";
            h.style.animationDuration = (Math.random() * 2 + 2) + "s";
            h.style.opacity = Math.random();
            container.appendChild(h);
            setTimeout(() => h.remove(), 4000);
        }, 150);
    }

    function resetHeart(side) {
        heartX = 47; heartY = 45;
        heartVX = (side === 'lenny' ? -0.85 : 0.85);
        heartVY = (Math.random() > 0.5 ? 0.5 : -0.5);
    }

    function startGame(sel) {
        document.getElementById("menu-screen").style.display = "none";
        document.getElementById("arena").style.display = "block";
        document.getElementById("score-board").style.display = "block";
        player = sel; ai = (sel === "lenny" ? "farid" : "lenny");
        resetHeart('farid');
        gameLoop();
    }

    function gameLoop() {
        if (scoreLenny >= 10 || scoreFarid >= 10) {
            document.getElementById("win-screen").style.display = "flex";
            document.getElementById("final-score-text").innerText = scoreLenny + " : " + scoreFarid;
            spawnFallingHearts();
            return;
        }

        if (player === "lenny") { if (keys["ArrowUp"]) lennyY -= 1.8; if (keys["ArrowDown"]) lennyY += 1.8; }
        else { if (keys["ArrowUp"]) faridY -= 1.8; if (keys["ArrowDown"]) faridY += 1.8; }

        if (Math.random() < 0.12) aiTargetY = heartY - 6;
        if (ai === "lenny") lennyY += (aiTargetY - lennyY) * 0.08;
        else faridY += (aiTargetY - faridY) * 0.08;

        lennyY = Math.max(0, Math.min(75, lennyY));
        faridY = Math.max(0, Math.min(75, faridY));
        heartX += heartVX; heartY += heartVY;

        if (heartY <= 0 || heartY >= 92) heartVY *= -1;

        if (heartX <= 14 && heartX >= 8 && heartY > lennyY - 5 && heartY < lennyY + 18 && heartVX < 0) {
            heartVX = Math.abs(heartVX) * 1.03; heartVY *= 1.03; createBubble("lenny");
            heartX = 14.1;
        }
        if (heartX >= 80 && heartX <= 86 && heartY > faridY - 5 && heartY < faridY + 18 && heartVX > 0) {
            heartVX = -Math.abs(heartVX) * 1.03; heartVY *= 1.03; createBubble("farid");
            heartX = 79.9;
        }

        if (heartX < -5) { scoreFarid++; updateScore(); resetHeart('farid'); }
        else if (heartX > 100) { scoreLenny++; updateScore(); resetHeart('lenny'); }

        document.getElementById("lenny").style.top = lennyY + "%";
        document.getElementById("farid").style.top = faridY + "%";
        document.getElementById("heart").style.left = heartX + "%";
        document.getElementById("heart").style.top = heartY + "%";
        timerId = requestAnimationFrame(gameLoop);
    }

    function updateScore() {
        document.getElementById("s_lenny").innerText = scoreLenny;
        document.getElementById("s_farid").innerText = scoreFarid;
    }
</script>
</body>
</html>[/html]

0

7

Свернутый текст

0

8

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

#lenni-wrap { font-family: 'EB Garamond', Georgia, serif; max-width: 640px; margin: 0 auto; }

/* ===== ОБЛОЖКА ===== */
#lenni-cover {
  position: relative;
  width: 100%;
  height: 480px;
  background: linear-gradient(160deg, #1a1a2e 0%, #16213e 50%, #0f0e17 100%);
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: flex-end;
  cursor: pointer;
  overflow: hidden;
  transition: opacity 0.7s ease, height 0.7s ease;
}

#lenni-cover.hidden {
  opacity: 0;
  pointer-events: none;
  height: 0;
}

#lenni-cover::after {
  content: '';
  position: absolute;
  bottom: 0; left: 0; right: 0;
  height: 60%;
  background: linear-gradient(to top, rgba(10,8,20,0.95), transparent);
  z-index: 1;
  pointer-events: none;
}

/* ===== СЛЁЗЫ ===== */
.lenni-tears {
  position: absolute;
  top: 0; left: 0;
  width: 100%; height: 100%;
  pointer-events: none;
  overflow: hidden;
}

.lenni-tear {
  position: absolute;
  top: -40px;
  width: 2px;
  border-radius: 0 0 2px 2px;
  background: linear-gradient(to bottom, transparent, rgba(190,210,255,0.35), transparent);
  animation: lenni-fall linear infinite;
}

.lenni-tear::after {
  content: '';
  position: absolute;
  bottom: -3px;
  left: -1px;
  width: 4px;
  height: 4px;
  border-radius: 50%;
  background: rgba(200,220,255,0.25);
}

.lenni-tear:nth-child(1)  { left: 4%;  height: 28px; animation-duration: 3.1s; animation-delay: 0s; }
.lenni-tear:nth-child(2)  { left: 10%; height: 22px; animation-duration: 2.5s; animation-delay: 0.4s; opacity: 0.7; }
.lenni-tear:nth-child(3)  { left: 17%; height: 32px; animation-duration: 3.6s; animation-delay: 1.1s; }
.lenni-tear:nth-child(4)  { left: 24%; height: 20px; animation-duration: 2.8s; animation-delay: 0.7s; opacity: 0.5; }
.lenni-tear:nth-child(5)  { left: 31%; height: 26px; animation-duration: 3.3s; animation-delay: 1.8s; }
.lenni-tear:nth-child(6)  { left: 38%; height: 34px; animation-duration: 2.6s; animation-delay: 0.2s; opacity: 0.8; }
.lenni-tear:nth-child(7)  { left: 45%; height: 24px; animation-duration: 3.8s; animation-delay: 1.4s; }
.lenni-tear:nth-child(8)  { left: 52%; height: 30px; animation-duration: 2.9s; animation-delay: 0.9s; opacity: 0.6; }
.lenni-tear:nth-child(9)  { left: 59%; height: 22px; animation-duration: 3.4s; animation-delay: 2.1s; }
.lenni-tear:nth-child(10) { left: 66%; height: 28px; animation-duration: 2.7s; animation-delay: 0.5s; opacity: 0.75; }
.lenni-tear:nth-child(11) { left: 72%; height: 36px; animation-duration: 3.2s; animation-delay: 1.6s; }
.lenni-tear:nth-child(12) { left: 79%; height: 20px; animation-duration: 2.4s; animation-delay: 0.3s; opacity: 0.55; }
.lenni-tear:nth-child(13) { left: 85%; height: 26px; animation-duration: 3.7s; animation-delay: 1.0s; }
.lenni-tear:nth-child(14) { left: 91%; height: 30px; animation-duration: 3.0s; animation-delay: 2.3s; opacity: 0.7; }
.lenni-tear:nth-child(15) { left: 97%; height: 24px; animation-duration: 2.6s; animation-delay: 0.8s; }
.lenni-tear:nth-child(16) { left: 7%;  height: 18px; animation-duration: 3.5s; animation-delay: 1.9s; opacity: 0.45; }
.lenni-tear:nth-child(17) { left: 20%; height: 32px; animation-duration: 2.3s; animation-delay: 0.6s; }
.lenni-tear:nth-child(18) { left: 35%; height: 22px; animation-duration: 3.9s; animation-delay: 1.3s; opacity: 0.6; }
.lenni-tear:nth-child(19) { left: 55%; height: 28px; animation-duration: 2.8s; animation-delay: 2.5s; }
.lenni-tear:nth-child(20) { left: 75%; height: 20px; animation-duration: 3.1s; animation-delay: 0.1s; opacity: 0.5; }

@keyframes lenni-fall {
  0%   { transform: translateY(0); opacity: 0; }
  10%  { opacity: 1; }
  90%  { opacity: 0.6; }
  100% { transform: translateY(520px); opacity: 0; }
}

/* ===== ТЕКСТ ОБЛОЖКИ ===== */
.lenni-cover-text {
  position: relative;
  z-index: 2;
  text-align: center;
  padding: 0 32px 48px;
}

.lenni-cover-label {
  font-family: 'Cormorant Garamond', serif;
  font-size: 11px;
  letter-spacing: 4px;
  text-transform: uppercase;
  color: rgba(200,190,220,0.45);
  margin-bottom: 10px;
}

.lenni-cover-title {
  font-family: 'Cormorant Garamond', serif;
  font-weight: 300;
  font-size: 42px;
  line-height: 1.05;
  margin-bottom: 28px;
  color: rgba(230,220,245,0.9);
}

.lenni-cover-title em {
  font-style: italic;
  color: rgba(180,160,210,0.7);
}

.lenni-hint {
  font-family: 'Cormorant Garamond', serif;
  font-style: italic;
  font-size: 13px;
  color: rgba(200,190,220,0.4);
  letter-spacing: 2px;
  animation: lenni-pulse 3s ease-in-out infinite;
}

@keyframes lenni-pulse {
  0%, 100% { opacity: 0.4; }
  50% { opacity: 0.85; }
}

/* ===== ТЕКСТ ===== */
#lenni-story {
  display: none;
  opacity: 0;
  transition: opacity 0.7s ease;
}

#lenni-story.visible { opacity: 1; }

.lenni-inner { padding: 48px 16px 80px; }

.lenni-back {
  font-family: 'Cormorant Garamond', serif;
  font-size: 11px;
  letter-spacing: 3px;
  text-transform: uppercase;
  color: #8a7b6a;
  cursor: pointer;
  margin-bottom: 36px;
  display: inline-block;
  background: none;
  border: none;
  padding: 0;
}

.lenni-back:hover { color: #5c3d2e; }

.lenni-img {
  width: 100%;
  max-height: 380px;
  object-fit: contain;
  margin-bottom: 40px;
  opacity: 0;
  transform: translateY(12px);
  transition: opacity 0.8s ease, transform 0.8s ease;
}

.lenni-img.show { opacity: 1; transform: translateY(0); }

.lenni-day {
  font-family: 'Cormorant Garamond', serif;
  font-size: 11px;
  letter-spacing: 4px;
  text-transform: uppercase;
  color: #8a7b6a;
  margin-bottom: 10px;
}

.lenni-h1 {
  font-family: 'Cormorant Garamond', serif;
  font-weight: 300;
  font-size: 40px;
  line-height: 1.1;
  color: #1a1510;
  margin-bottom: 20px;
}

.lenni-h1 em { font-style: italic; color: #5c3d2e; }

.lenni-divider {
  width: 40px;
  height: 1px;
  background: #8a7b6a;
  opacity: 0.4;
  margin-bottom: 36px;
}

.lenni-p {
  font-size: 17px;
  line-height: 1.9;
  color: #1a1510;
  margin-bottom: 1.5em;
  text-align: justify;
}

.lenni-p.drop::first-letter {
  font-family: 'Cormorant Garamond', serif;
  font-size: 3.2em;
  line-height: 0.8;
  float: left;
  margin-right: 0.08em;
  margin-top: 0.05em;
  color: #5c3d2e;
  font-weight: 300;
}

.lenni-footer {
  margin-top: 56px;
  text-align: center;
  font-family: 'Cormorant Garamond', serif;
  font-size: 12px;
  letter-spacing: 4px;
  color: #8a7b6a;
}

.fi {
  opacity: 0;
  transform: translateY(12px);
  transition: opacity 0.6s ease, transform 0.6s ease;
}

.fi.show { opacity: 1; transform: translateY(0); }
</style>

<div id="lenni-wrap">

  <div id="lenni-cover" onclick="lenniOpen()">
    <div class="lenni-tears">
      <div class="lenni-tear"></div>
      <div class="lenni-tear"></div>
      <div class="lenni-tear"></div>
      <div class="lenni-tear"></div>
      <div class="lenni-tear"></div>
      <div class="lenni-tear"></div>
      <div class="lenni-tear"></div>
      <div class="lenni-tear"></div>
      <div class="lenni-tear"></div>
      <div class="lenni-tear"></div>
      <div class="lenni-tear"></div>
      <div class="lenni-tear"></div>
      <div class="lenni-tear"></div>
      <div class="lenni-tear"></div>
      <div class="lenni-tear"></div>
      <div class="lenni-tear"></div>
      <div class="lenni-tear"></div>
      <div class="lenni-tear"></div>
      <div class="lenni-tear"></div>
      <div class="lenni-tear"></div>
    </div>
    <div class="lenni-cover-text">
      <p class="lenni-cover-label">День второй</p>
      <h2 class="lenni-cover-title">Хрупкая<br><em>пустота</em></h2>
      <p class="lenni-hint">нажмите, чтобы читать</p>
    </div>
  </div>

  <div id="lenni-story">
    <div class="lenni-inner">

      <span class="lenni-back" onclick="lenniClose()">← Обложка</span>

      <img class="lenni-img" id="lenni-pic" src="https://upforme.ru/uploads/001c/82/f2/10/19375.jpg" alt="">

      <div class="fi" id="lfi0">
        <p class="lenni-day">День второй</p>
        <h1 class="lenni-h1">Хрупкая<br><em>пустота</em></h1>
        <div class="lenni-divider"></div>
      </div>

      <p class="lenni-p drop fi" id="lfi1">Всего второй день, а в голове хрупкая пустота. Ленни сидит над книгой, перечитывает раз за разом один и тот же абзац, затем прикрывает глаза и с омерзением разворачивает книгу другой стороной. Он разрешил Фариду заниматься своими танцульками, раз уж тому так хочется, но разве Фарид имел право улетать? Разве фамильяр не обязан быть рядом, прикрывая ведьмака от невзгод, буллинга, от взглядов и тревог, которые без него густым дёгтем варятся. Пальцы скользнули под оправу и сжали веки. Ленни смахнул очки с носа, отложил их в сторону и перевёл взгляд за окно.</p>

      <p class="lenni-p fi" id="lfi2">«Моё разрешение не твоя блажь.»</p>

      <p class="lenni-p fi" id="lfi3">Волны бьются о скалы и почти летний солёный воздух лезет в ноздри, пощипывая где-то в переносице. Ленни кажется, что во всём виноват океан, но по правде говоря, всё дело в слезах, которые незаметно сочатся по внутренней складке глаза и проникают в нос, сдавливая там тяжестью и болью. Сглотнув комок в горле, Ленни снова подтягивает карандаш и пишет на другом листке для записок: «Если ты не развернёшь самолёт, если не сядешь на обратный, я...» Он не дописывает. Комкает бумажку и бросает в небольшую коробку. Фарид хотел в неё собирать мысли Ленни, пока они будут в разлуке, но все мысли сводились к одной болезненной.</p>

      <p class="lenni-p fi" id="lfi4">«Если ты умрёшь, умру и я. Но я тебя уже хоронил и привычен. Что если я не доживу? Что если моё сердце остановится от тоски? Что если я...» Листочек небольшой, для всех мыслей места не хватает, и Ленни снова его комкает и кидает в коробку.</p>

      <p class="lenni-p fi" id="lfi5">«Самый большой страх для меня, что тебе не нужно будет возвращаться.»</p>

      <p class="lenni-p fi" id="lfi6">Ленни смотрит на экран телефона, видит набегающие цифры сообщений рядом с его именем и не хочет читать. Не хочет радовать своим согласием на эту ситуацию. Да, он сам сказал: катись, если это так важно. Но сам же думал, что нет ничего важнее их силы. Неужели Фариду это так трудно понять? Он пытается завоевать весь мир, львиной лапой отметить подмостки, а что остаётся Ленни? Учебники, лаборатория и ощущение песка на зубах. Ни капли ценности в глазах своего фамильяра. Удобная игрушка для постели и только.</p>

      <p class="lenni-p fi" id="lfi7">Ленни смахивает со стола карандаш и блок бумаги, дышит тяжело и прерывисто, а затем поднимает всё, что уронил, и кладёт на место. Поправляет, чтобы карандаш лежал строго параллельно полоске учебника, трогает бутылочки в подставке, выравнивает их по этикеткам, смахивает пылинку и косится на экран телефона. Не хочет читать, не хочет видеть и прощать тоже не хочет. Танцы — это здорово, это призвание Фарида, его мечта, то, что выдернуло его из дома и дало смысл жизни. Однако всё это относится и к Ленни — почему он не чувствует того же? Откуда такая жестокость.</p>

      <p class="lenni-p fi" id="lfi8">Очки отодвигаются к краю стола. Намеренным движением Ленни роняет их на пол и хочет растоптать, как уважение к себе. Никакой ценности, ничего не осталось — что было, всё растерял. Не удивительно, что столько фамильяров было, а истинный уехал работать: с ним же скучно, с ним трудно, он неудобный камень в мочеточнике. Только когда выдавишь струёй — наступит облегчение. Фарид там наверняка счастлив.</p>

      <p class="lenni-p fi" id="lfi9">— Козлина, — трёт Ленни нос и срывается дописать записку.</p>

      <p class="lenni-p fi" id="lfi10">«Я больше, чем просто человек. Я ведьмак и я приказываю. Вернись ко мне.»</p>

      <div class="lenni-footer fi" id="lfi11">✦ &nbsp; &nbsp; ✦ &nbsp; &nbsp; ✦</div>

    </div>
  </div>

</div>

<script>
function lenniOpen() {
  var cover = document.getElementById('lenni-cover');
  var story = document.getElementById('lenni-story');
  cover.classList.add('hidden');
  story.style.display = 'block';
  setTimeout(function() { story.classList.add('visible'); }, 50);
  setTimeout(function() { document.getElementById('lenni-pic').classList.add('show'); }, 200);
  var els = story.querySelectorAll('.fi');
  for (var i = 0; i < els.length; i++) {
    (function(el, idx) {
      setTimeout(function() { el.classList.add('show'); }, 350 + idx * 120);
    })(els[i], i);
  }
}

function lenniClose() {
  var cover = document.getElementById('lenni-cover');
  var story = document.getElementById('lenni-story');
  story.classList.remove('visible');
  cover.classList.remove('hidden');
  setTimeout(function() {
    story.style.display = 'none';
    document.getElementById('lenni-pic').classList.remove('show');
    var els = story.querySelectorAll('.fi');
    for (var i = 0; i < els.length; i++) els[i].classList.remove('show');
  }, 750);
}
</script>

[/html]

0

9

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

#lenni-main-container {
  font-family: 'EB Garamond', Georgia, serif;
  max-width: 640px;
  margin: 0 auto;
  position: relative;
  background: #f4f5f7;
}

/* ===== ОБЛОЖКА ===== */
#lenni-cover {
  width: 100%;
  height: 480px;
  background: linear-gradient(160deg, #1a1a2e 0%, #16213e 50%, #0f0e17 100%);
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: flex-end;
  cursor: pointer;
  position: relative;
  transition: all 0.6s ease;
  z-index: 10;
}

#lenni-cover.hidden {
  opacity: 0;
  height: 0;
  pointer-events: none;
}

/* ===== СЛЁЗЫ ===== */
.lenni-tears-box {
  position: absolute;
  top: 0; left: 0; width: 100%; height: 100%;
  pointer-events: none;
  overflow: hidden;
}

.lenni-drop {
  position: absolute;
  top: -20px;
  width: 7px; height: 12px;
  background: rgba(200, 225, 255, 0.18);
  border-radius: 80% 0 55% 50% / 55% 0 80% 50%;
  transform: rotate(-45deg);
  animation: tear-fall linear infinite;
}

.lenni-drop::after {
  content: '';
  position: absolute;
  top: 15%; left: 15%;
  width: 2px; height: 3px;
  background: rgba(255, 255, 255, 0.3);
  border-radius: 50%;
}

@keyframes tear-fall {
  0% { transform: translateY(0) rotate(-45deg); opacity: 0; }
  15% { opacity: 0.6; }
  100% { transform: translateY(500px) rotate(-45deg); opacity: 0; }
}

.lenni-drop:nth-child(1) { left: 10%; animation-duration: 7.2s; }
.lenni-drop:nth-child(2) { left: 30%; animation-duration: 9.5s; animation-delay: 1.5s; }
.lenni-drop:nth-child(3) { left: 50%; animation-duration: 8.1s; animation-delay: 4.2s; }
.lenni-drop:nth-child(4) { left: 70%; animation-duration: 10.3s; animation-delay: 0.8s; }
.lenni-drop:nth-child(5) { left: 90%; animation-duration: 7.8s; animation-delay: 3.1s; }

/* ===== КОНТЕНТ ===== */
#lenni-content {
  display: none;
  opacity: 0;
  background: #fff;
  transition: opacity 0.8s ease;
}

#lenni-content.visible {
  display: block;
  opacity: 1;
}

.lenni-inner-padd { padding: 40px 25px 80px; }

.lenni-p { font-size: 17px; line-height: 1.9; color: #1a1510; margin-bottom: 1.5em; text-align: justify; }

.lenni-p.drop::first-letter {
  font-family: 'Cormorant Garamond', serif;
  font-size: 3.5em;
  line-height: 0.8;
  float: left;
  margin: 0.15em 0.12em 0 0;
  color: #5c3d2e;
}

.lenni-back-btn {
  font-family: 'Cormorant Garamond', serif;
  font-size: 11px;
  letter-spacing: 3px;
  text-transform: uppercase;
  color: #8a7b6a;
  cursor: pointer;
  margin-bottom: 30px;
  display: inline-block;
}

.f-item { opacity: 0; transform: translateY(15px); transition: 0.7s ease; }
.f-item.show { opacity: 1; transform: translateY(0); }
</style>

<div id="lenni-main-container">
  <div id="lenni-cover" onclick="lenniShowStory()">
    <div class="lenni-tears-box">
      <div class="lenni-drop"></div><div class="lenni-drop"></div><div class="lenni-drop"></div><div class="lenni-drop"></div><div class="lenni-drop"></div>
    </div>
    <div style="text-align: center; padding-bottom: 50px; color: white; z-index: 5;">
      <p style="font-size: 11px; letter-spacing: 4px; opacity: 0.5;">ДЕНЬ ВТОРОЙ</p>
      <h2 style="font-family: 'Cormorant Garamond'; font-size: 44px; font-weight: 300; margin: 10px 0 25px;">Козлина</h2>
      <p style="font-style: italic; font-size: 13px; opacity: 0.35;">нажмите, чтобы читать</p>
    </div>
  </div>

  <div id="lenni-content">
    <div class="lenni-inner-padd">
      <span class="lenni-back-btn" onclick="lenniHideStory()">← Вернуться</span>
     
      <img src="https://upforme.ru/uploads/001c/82/f2/10/19375.jpg" style="width:100%; margin-bottom:40px;">

      <div class="f-item">
        <p style="font-size:11px; letter-spacing:4px; color:#8a7b6a; text-transform:uppercase;">День второй</p>
        <h1 style="font-family:'Cormorant Garamond'; font-size:42px; font-weight:300; margin:10px 0 25px;">Козлина</h1>
        <div style="width:40px; height:1px; background:#8a7b6a; margin-bottom:35px; opacity:0.3;"></div>
      </div>

      <p class="lenni-p drop f-item">Всего второй день, а в голове хрупкая пустота. Ленни сидит над книгой, перечитывает раз за разом один и тот же абзац, затем прикрывает глаза и с омерзением разворачивает книгу другой стороной. Он разрешил Фариду заниматься своими танцульками, раз уж тому так хочется, но разве Фарид имел право улетать? Разве фамильяр не обязан быть рядом, прикрывая ведьмака от невзгод, буллинга, от взглядов и тревог, которые без него густым дёгтем варятся. Пальцы скользнули под оправу и сжали веки. Ленни смахнул очки с носа, отложил их в сторону и перевёл взгляд за окно.</p>

      <p class="lenni-p f-item">«Моё разрешение не твоя блажь.»</p>

      <p class="lenni-p drop f-item">Волны бьются о скалы и почти летний солёный воздух лезет в ноздри, пощипывая где-то в переносице. Ленни кажется, что во всём виноват океан, но по правде говоря, всё дело в слезах, которые незаметно сочатся по внутренней складке глаза и проникают в нос, сдавливая там тяжестью и болью. Сглотнув комок в горле, Ленни снова подтягивает карандаш и пишет на другом листке для записок: «Если ты не развернёшь самолёт, если не сядешь на обратный, я...» Он не дописывает. Комкает бумажку и бросает в небольшую коробку. Фарид хотел в неё собирать мысли Ленни, пока они будут в разлуке, но все мысли сводились к одной болезненной.</p>

      <p class="lenni-p f-item">«Если ты умрёшь, умру и я. Но я тебя уже хоронил и привычен. Что если я не доживу? Что если моё сердце остановится от тоски? Что если я...» Листочек небольшой, для всех мыслей места не хватает, и Ленни снова его комкает и кидает в коробку.</p>

      <p class="lenni-p f-item">«Самый большой страх для меня, что тебе не нужно будет возвращаться.»</p>

      <p class="lenni-p f-item">Ленни смотрит на экран телефона, видит набегающие цифры сообщений рядом с его именем и не хочет читать. Не хочет радовать своим согласием на эту ситуацию. Да, он сам сказал: катись, если это так важно. Но сам же думал, что нет ничего важнее их силы. Неужели Фариду это так трудно понять? Он пытается завоевать весь мир, львиной лапой отметить подмостки, а что остаётся Ленни? Учебники, лаборатория и ощущение песка на зубах. Ни капли ценности в глазах своего фамильяра. Удобная игрушка для постели и только.</p>

      <p class="lenni-p drop f-item">Ленни смахивает со стола карандаш и блок бумаги, дышит тяжело и прерывисто, а затем поднимает всё, что уронил, и кладёт на место. Поправляет, чтобы карандаш лежал строго параллельно полоске учебника, трогает бутылочки в подставке, выравнивает их по этикеткам, смахивает пылинку и косится на экран телефона. Не хочет читать, не хочет видеть и прощать тоже не хочет. Танцы — это здорово, это призвание Фарида, его мечта, то, что выдернуло его из дома и дало смысл жизни. Однако всё это относится и к Ленни — почему он не чувствует того же? Откуда такая жестокость.</p>

      <p class="lenni-p drop f-item">Очки отодвигаются к краю стола. Намеренным движением Ленни роняет их на пол и хочет растоптать, как уважение к себе. Никакой ценности, ничего не осталось — что было, всё растерял. Не удивительно, что столько фамильяров было, а истинный уехал работать: с ним же скучно, с ним трудно, он неудобный камень в мочеточнике. Только когда выдавишь струёй — наступит облегчение. Фарид там наверняка счастлив.</p>

      <p class="lenni-p f-item">— Козлина, — трёт Ленни нос и срывается дописать записку.</p>

      <p class="lenni-p f-item">«Я больше, чем просто человек. Я ведьмак и я приказываю. Вернись ко мне.»</p>

      <div style="text-align:center; padding-top:40px; color:#8a7b6a; opacity:0.4;">✦ &nbsp; &nbsp; ✦ &nbsp; &nbsp; ✦</div>
    </div>
  </div>
</div>

<script>
function lenniShowStory() {
  document.getElementById('lenni-cover').classList.add('hidden');
  const content = document.getElementById('lenni-content');
  setTimeout(() => {
    content.classList.add('visible');
    content.querySelectorAll('.f-item').forEach((item, i) => {
      setTimeout(() => item.classList.add('show'), i * 150);
    });
  }, 450);
}

function lenniHideStory() {
  document.getElementById('lenni-content').classList.remove('visible');
  setTimeout(() => {
    document.getElementById('lenni-cover').classList.remove('hidden');
    document.querySelectorAll('.f-item').forEach(item => item.classList.remove('show'));
  }, 300);
}
</script>
[/html]

0


Вы здесь » Нефритовая пыль » Флуд и игры » Флуд


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