NO FANDOM

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

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


Вы здесь » NO FANDOM » Болталка » Флуд во имя Флуда


Флуд во имя Флуда

Сообщений 71 страница 80 из 135

71

[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=yes">
    <title>Дневник · два лица</title>
    <!-- Подключаем шрифты -->
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Caveat:wght@400;600;700&family=Marck+Script&family=Bad+Script&display=swap" rel="stylesheet">
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            user-select: none;
        }

        body {
            min-height: 100vh;
            background: #1c1410;
            display: flex;
            align-items: center;
            justify-content: center;
            padding: 15px;
            perspective: 2600px;
        }

        .book-wrapper {
            width: 100%;
            max-width: 800px;
            border-radius: 8px 24px 24px 8px;
            background: #2b1b12;
            padding: 14px 14px 14px 10px;
            background-image: linear-gradient(145deg, #3f2a1b 0%, #1f130b 80%);
        }

        .book-interior {
            background: #2b1d13;
            border-radius: 6px 20px 20px 6px;
            padding: 20px 20px 20px 14px;
            box-shadow: inset 0 0 15px #0a0603, inset 0 0 0 1px #63482e;
        }

        .flip-scene {
            position: relative;
            width: 100%;
            height: 650px;
            display: flex;
            align-items: center;
            justify-content: center;
            background: transparent;
            transform-style: preserve-3d;
        }

        .page {
            position: absolute;
            width: 90%;
            max-width: 620px;
            height: 620px;
            border-radius: 0 8px 8px 0;
            box-shadow:
                0 10px 20px rgba(0,0,0,0.7),
                -10px 6px 18px rgba(0,0,0,0.8),
                inset 0 -3px 8px rgba(0,0,0,0.6);
            padding: 35px 30px 30px 40px;
            border-left: 4px solid #4f3824;
            border-right: 1px solid #4d3621;
            font-weight: 400;
            line-height: 1.8;
            word-break: break-word;
            backface-visibility: hidden;
            transform-style: preserve-3d;
            transition: transform 0.8s cubic-bezier(0.45, 0.05, 0.2, 0.95);
            cursor: default;
            transform-origin: left center;
            display: flex;
            flex-direction: column;
        }

        /* Тип первый (зелёный) — Marck Script */
        .page.character-one {
            background:
                radial-gradient(circle at 25% 25%, rgba(50, 80, 50, 0.4), transparent 60%),
                linear-gradient(160deg, #3b2f25, #1f3a2a);
            color: #e4dbc6;
            font-family: 'Marck Script', cursive;
            border-left-color: #5b6e4b;
        }

        .page.character-one .page-lines {
            background-image: repeating-linear-gradient(transparent 0px, transparent 30px, #9b8a6b 30px, #9b8a6b 31px);
            opacity: 0.2;
        }

        /* Тип второй (красный) — Bad Script */
        .page.character-two {
            background:
                radial-gradient(circle at 70% 30%, rgba(120, 0, 0, 0.25), transparent 60%),
                linear-gradient(#130c0c, #0b0505);
            color: #f1e7e7;
            font-family: 'Bad Script', cursive;
            border-left-color: #7a3a3a;
        }

        .page.character-two .page-lines {
            background-image: repeating-linear-gradient(transparent 0px, transparent 30px, #a55a5a 30px, #a55a5a 31px);
            opacity: 0.2;
        }

        .page-content {
            position: relative;
            z-index: 5;
            width: 100%;
            flex: 1;
            display: flex;
            flex-direction: column;
            min-height: 0;
            height: 100%;
        }

        .date-plate {
            font-size: 28px;
            padding: 8px 24px;
            margin-bottom: 15px;
            display: inline-block;
            letter-spacing: 2px;
            text-transform: uppercase;
            background: rgba(0,0,0,0.3);
            backdrop-filter: blur(2px);
            border: 1px solid currentColor;
            align-self: flex-start;
            font-family: 'Caveat', cursive;
            flex-shrink: 0;
        }

        .character-one .date-plate {
            background: rgba(50,70,40,0.5);
            border-color: rgba(100,120,80,0.8);
            color: #f1f0e6;
            box-shadow: 0 6px 18px rgba(0,0,0,0.12);
        }

        .character-two .date-plate {
            background: linear-gradient(90deg, #6e0f0f, #9b1c1c);
            border: none;
            color: #fff;
            box-shadow: 0 0 20px rgba(180,0,0,0.4), 0 10px 30px rgba(0,0,0,0.6);
        }

        .entry-bubble {
            flex: 1 1 auto;
            min-height: 0;
            border-radius: 26px;
            padding: 25px 30px;
            overflow-y: auto;
            scrollbar-width: thin;
            box-sizing: border-box;
           
            &::-webkit-scrollbar {
                width: 8px;
            }
           
            &::-webkit-scrollbar-track {
                background: rgba(0, 0, 0, 0.2);
                border-radius: 10px;
            }
           
            &::-webkit-scrollbar-thumb {
                background: rgba(200, 180, 150, 0.3);
                border-radius: 10px;
                border: 2px solid rgba(0, 0, 0, 0.2);
            }
           
            &::-webkit-scrollbar-thumb:hover {
                background: rgba(200, 180, 150, 0.5);
            }
        }

        .character-one .entry-bubble {
            background: #3a4a36;
            box-shadow: 0 12px 28px rgba(0,0,0,0.2), inset 0 0 35px rgba(0,0,0,0.08);
            color: #e4dbc6;
            scrollbar-color: #9b8a6b #2a3a26;
        }

        .character-two .entry-bubble {
            background: rgba(15,0,0,0.6);
            border: 1px solid rgba(255,255,255,0.08);
            box-shadow: 0 20px 50px rgba(0,0,0,0.8), inset 0 0 50px rgba(150,0,0,0.15);
            color: #f1e7e7;
            scrollbar-color: #a55a5a #2a0a0a;
        }

        .entry {
            font-size: 22px;
            line-height: 1.7;
            white-space: pre-wrap;
            user-select: text;
            padding-right: 5px;
        }

        /* Специфичные настройки для каждого рукописного шрифта */
        .character-one .entry {
            font-size: 24px;
            letter-spacing: 0.5px;
            word-spacing: 2px;
        }

        .character-two .entry {
            font-size: 22px;
            line-height: 1.9;
            font-weight: 400;
            font-style: normal;
        }

        /* текстурный слой */
        .page::before {
            content: '';
            position: absolute;
            top: 0; left: 0; width: 100%; height: 100%;
            background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="160" height="160" viewBox="0 0 160 160"><filter id="noise2"><feTurbulence baseFrequency="0.9 1.2" numOctaves="2" /><feColorMatrix values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0.25 0"/></filter><rect width="160" height="160" filter="url(%23noise2)" opacity="0.25"/></svg>');
            opacity: 0.2;
            pointer-events: none;
            border-radius: inherit;
            mix-blend-mode: multiply;
        }

        .page-lines {
            position: absolute;
            top: 0; left: 0; width: 100%; height: 100%;
            pointer-events: none;
            z-index: 2;
        }

        /* Убираем номер страницы и уголок */
        .page-num, .page::after {
            display: none;
        }

        .page.flipped-left {
            transform: rotateY(-170deg) translateZ(8px);
            box-shadow: -20px 8px 30px rgba(0,0,0,0.9);
            filter: brightness(0.75) sepia(0.3);
            z-index: 5;
        }

        .page.front-right {
            transform: rotateY(0deg) translateZ(30px);
            z-index: 30;
            box-shadow: 0 15px 35px rgba(0,0,0,0.9), -10px 10px 25px rgba(0,0,0,0.8);
        }

        .page.stack-left {
            transform: rotateY(0deg) translateX(-100%) translateZ(1px);
            opacity: 0;
            pointer-events: none;
            transition: none;
            box-shadow: none;
        }

        .gutter {
            position: absolute;
            width: 14px;
            height: 100%;
            left: 45%;
            top: 0;
            background: radial-gradient(ellipse at center, #3a281c 0%, #1b110a 100%);
            transform: translateX(-50%) rotateY(20deg);
            box-shadow: -3px 0 12px #0f0803, inset 0 0 6px #634b33;
            z-index: 50;
            pointer-events: none;
            border-radius: 20%;
        }

        .nav-panel {
            display: flex;
            align-items: center;
            justify-content: center;
            gap: 40px;
            margin-top: 30px;
            margin-bottom: 10px;
        }

        .nav-btn {
            background: #6b1e1e;
            border: 3px solid #2f140e;
            font-size: 2.1rem;
            font-weight: bold;
            width: 70px;
            height: 70px;
            border-radius: 50%;
            cursor: pointer;
            box-shadow: 0 8px 0 #2e110b, 0 0 15px #520000;
            transition: 0.08s linear;
            color: #f0cfb0;
            display: inline-flex;
            align-items: center;
            justify-content: center;
            font-family: 'Caveat', monospace;
            text-shadow: 0 0 5px #ffb273;
        }

        .nav-btn:active {
            transform: translateY(6px);
            box-shadow: 0 2px 0 #2e110b, 0 0 20px #a13030;
        }

        .nav-btn.disabled {
            opacity: 0.3;
            pointer-events: none;
            box-shadow: 0 4px 0 #2e110b;
            transform: translateY(4px);
            filter: grayscale(0.7);
        }

        .page-indicator {
            background: #281e16;
            padding: 12px 32px;
            border-radius: 60px;
            font-size: 2rem;
            font-weight: bold;
            color: #dbbc96;
            box-shadow: inset 0 3px 10px #0e0804, 0 8px 0 #3e261b, 0 0 15px #4d1f1f;
            font-family: 'Caveat', cursive;
            border: 1px solid #7b4f31;
            min-width: 170px;
            text-align: center;
            text-shadow: 0 0 8px #ab5f2c;
        }

        .footer-note {
            text-align: center;
            color: #ac8a67;
            margin-top: 12px;
            font-family: 'Caveat';
            font-size: 1.4rem;
            letter-spacing: 2px;
            text-shadow: 0 0 8px #3b1c0c;
        }

        /* Адаптация под мобилки */
        @media (max-width: 600px) {
            .book-wrapper {
                padding: 8px;
                border-radius: 4px 16px 16px 4px;
            }
           
            .flip-scene {
                height: 550px;
            }
           
            .page {
                height: 520px;
                padding: 20px 20px 20px 25px;
            }
           
            .entry-bubble {
                padding: 15px;
            }
           
            .nav-btn {
                width: 55px;
                height: 55px;
                font-size: 1.8rem;
            }
           
            .page-indicator {
                padding: 8px 16px;
                font-size: 1.5rem;
                min-width: 130px;
            }
           
            .date-plate {
                font-size: 22px;
                padding: 5px 18px;
            }
           
            .character-one .entry {
                font-size: 20px;
            }
           
            .character-two .entry {
                font-size: 18px;
            }
        }

        @media (max-width: 400px) {
            .flip-scene {
                height: 500px;
            }
           
            .page {
                height: 470px;
                padding: 15px;
            }
           
            .entry-bubble {
                padding: 12px;
            }
           
            .character-one .entry {
                font-size: 18px;
            }
           
            .character-two .entry {
                font-size: 16px;
            }
        }
    </style>
</head>
<body>
    <div class="book-wrapper">
        <div class="book-interior">
            <div class="flip-scene" id="flipScene">
                <div class="gutter"></div>
            </div>
            <div class="nav-panel">
                <button class="nav-btn" id="prevPageBtn" aria-label="предыдущая страница">◀</button>
                <span class="page-indicator" id="indicator">стр. 1 / 10</span>
                <button class="nav-btn" id="nextPageBtn" aria-label="следующая страница">▶</button>
            </div>
            <div class="footer-note">✦  memento mori  ✦</div>
        </div>
    </div>

    <script>
        (function() {
            const pagesData = [
                {
                    type: 'character-one',
                    date: '12 октября',
                    text: 'Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae pellentesque sem placerat. In id cursus mi pretium tellus duis convallis. Tempus leo eu aenean sed diam urna tempor. Pulvinar vivamus fringilla lacus nec metus bibendum egestas. Iaculis massa nisl malesuada lacinia integer nunc posuere. Ut hendrerit semper vel class aptent taciti sociosqu. Ad litora torquent per conubia nostra inceptos himenaeos.\n\nLorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae pellentesque sem placerat. In id cursus mi pretium tellus duis convallis. Tempus leo eu aenean sed diam urna tempor.\n\nЗарегистрирован: 2013-12-25\nПриглашений: 0\nСообщений: 63\nУважение: +1\nПозитив: +0\n\nПровел на форуме:\n21 час 23 минуты\nIP: 159.148.58.10\n\nАктивен 2 часа 17 минут'
                },
               
                {
                    type: 'character-two',
                    date: '13 октября',
                    text: 'Сегодня ночью спал просто отвратительно. По ощущениям будто кто-то подкинул мне в голову взрывчатку - подкрался, пока я дремал, открыл черепную крышку, сбросил туда всякой дряни, закрыл и убежал со всех ног. Ментальный подкидыш, взрывоопасная бредятина. Причем сон начинался просто чудесно - я, кажется, был на задании или просто развлекался славной "охотой", я отчетливо помню, как пролезал в чье-то тело, подслушивал чужой пульс, окунался в чужие крики, но потом.. потом я полностью потерял контроль над своим телом. Нет, я продолжил начатое, но будто бы уже не по своей воле, я наносил своей жертве увечья, но не там, где хотел их нанести, и пытал ее не теми способами, которыми всегда предпочитал.. Из дирижёра я превратился в обычного зрителя, пусть и посаженного в первых рядах. Очень гадкое ощущение, когда ты, вроде бы, делаешь все то, что хотел сделать изначально, но по чьей-то указке, по чьему-то велению, в совершенно ином, не согласованном с тобой, виде. Я потратил три тысячелетия на то, чтобы двинуть хотя бы пальцем, чтобы сделать хоть что-то самостоятельно, а не лицезреть парализованным истуканом, как льются реки крови из вспоротых глоток. Творить нечто настолько упоительно сладкое и грешное, но не по доброй воле - самое мерзкое, самое унизительное и святотатственное, что можно придумать. Грешить нужно осознанно. По велению своего выбора, своего решения, своей тяги, иначе это просто кукольная постановка, где ты болтаешься на невидимых ниточках, где ты и не убийца даже, а лишь инструмент того, кто в действительности является убийцей. Заснуть снова я так и не смог, однако днем был весьма бодр. Подумаешь, скверный сон. И не такое случалось.'
                },
               
                { type: 'character-one', date: '14 октября', text: 'Сегодня был продуктивный день. Удалось закончить старые дела и даже немного поразмышлять о будущем. Кажется, я на верном пути. Нужно записать несколько идей:\n\n- создать новый ритуал\n- пересмотреть старые записи\n- подготовить ингредиенты' },
               
                { type: 'character-two', date: '15 октября', text: 'Опять этот кошмар. Я снова видел себя со стороны, будто марионетку. Невыносимо чувствовать, что твоими руками кто-то управляет. Три тысячелетия борьбы за свободу воли — и такие сны. Грешить нужно осознанно, иначе это просто кукольный театр. Надо будет завтра поискать способ защитить разум.' },
               
                { type: 'character-one', date: '16 октября', text: 'Список дел:\n• собрать травы\n• наточить перья\n• написать письмо\n• зажечь свечи\n\nПогода сегодня под стать настроению — туман и лёгкий дождь. Самое время для размышлений.' },
               
                { type: 'character-two', date: '17 октября', text: 'Вспомнил один старый рецепт эликсира:\n— корень дягиля\n— полынь\n— железный купорос (щепотка)\nНастаивать всю ночь на растущей луне.\n\nНадо будет проверить, работает ли. И заодно записать ощущения.' },
               
                { type: 'character-one', date: '18 октября', text: 'Сегодня листал старые записи. Интересно, как меняется почерк и мысли со временем. Некоторые идеи кажутся сейчас наивными, но в них есть своя прелесть. Цитата на сегодня: "Мы сами создаём тени, которые нас пугают".' },
               
                { type: 'character-two', date: '19 октября', text: 'Ночь выдалась беспокойной. Снова эти видения. Но на этот раз я смог чуть дольше удержать контроль. Прогресс. Возможно, если тренироваться, смогу полностью управлять снами. Надо записывать каждую деталь.' },
               
                { type: 'character-one', date: '20 февраля', text: 'За окном туман. В комнате пахнет воском и старыми бумагами. Сегодня особенный день. Нужно вспомнить все ритуалы и ничего не упустить. Время течёт так быстро.' },
               
                { type: 'character-two', date: '21 октября', text: 'Последняя запись в этом блокноте. Книга закрывается, но истории остаются. Помни о свете даже в темноте. И помни: твоя воля принадлежит только тебе.' }
            ];

            const totalPages = pagesData.length;
            let currentPageIndex = 0;

            const scene = document.getElementById('flipScene');
            const indicator = document.getElementById('indicator');
            const prevBtn = document.getElementById('prevPageBtn');
            const nextBtn = document.getElementById('nextPageBtn');

            function buildPages() {
                scene.innerHTML = '';
                const gutterDiv = document.createElement('div');
                gutterDiv.className = 'gutter';
                scene.appendChild(gutterDiv);

                pagesData.forEach((data, index) => {
                    const pageDiv = document.createElement('div');
                    pageDiv.className = `page ${data.type}`;
                    pageDiv.setAttribute('data-index', index);

                    const lines = document.createElement('div');
                    lines.className = 'page-lines';
                   
                    const contentDiv = document.createElement('div');
                    contentDiv.className = 'page-content';
                   
                    const datePlate = document.createElement('div');
                    datePlate.className = 'date-plate';
                    datePlate.innerText = data.date;
                   
                    const bubbleDiv = document.createElement('div');
                    bubbleDiv.className = 'entry-bubble';
                   
                    const textDiv = document.createElement('div');
                    textDiv.className = 'entry';
                    textDiv.innerText = data.text;

                    bubbleDiv.appendChild(textDiv);
                    contentDiv.appendChild(datePlate);
                    contentDiv.appendChild(bubbleDiv);

                    pageDiv.appendChild(lines);
                    pageDiv.appendChild(contentDiv);

                    scene.appendChild(pageDiv);
                });

                updatePagesState();
            }

            function updatePagesState() {
                const pages = document.querySelectorAll('.page');
                pages.forEach((page, idx) => {
                    page.classList.remove('front-right', 'flipped-left', 'stack-left');

                    if (idx === currentPageIndex) {
                        page.classList.add('front-right');
                    } else if (idx < currentPageIndex) {
                        page.classList.add('flipped-left');
                    } else {
                        page.classList.add('stack-left');
                    }
                });
                indicator.innerText = `стр. ${currentPageIndex + 1} / ${totalPages}`;
                prevBtn.classList.toggle('disabled', currentPageIndex === 0);
                nextBtn.classList.toggle('disabled', currentPageIndex === totalPages - 1);
            }

            function nextPage() {
                if (currentPageIndex >= totalPages - 1) return;

                const currentPage = document.querySelector(`.page[data-index="${currentPageIndex}"]`);
                const nextPageElem = document.querySelector(`.page[data-index="${currentPageIndex + 1}"]`);

                if (!currentPage || !nextPageElem) return;

                nextPageElem.classList.remove('stack-left');
                void currentPage.offsetWidth;

                currentPage.classList.remove('front-right');
                currentPage.classList.add('flipped-left');

                nextPageElem.classList.remove('stack-left');
                nextPageElem.classList.add('front-right');

                currentPageIndex++;

                const pages = document.querySelectorAll('.page');
                pages.forEach((page, idx) => {
                    if (idx < currentPageIndex) {
                        page.classList.remove('front-right', 'stack-left');
                        page.classList.add('flipped-left');
                    } else if (idx === currentPageIndex) {
                        // уже обработано
                    } else {
                        page.classList.remove('front-right', 'flipped-left');
                        page.classList.add('stack-left');
                    }
                });

                indicator.innerText = `стр. ${currentPageIndex + 1} / ${totalPages}`;
                prevBtn.classList.toggle('disabled', currentPageIndex === 0);
                nextBtn.classList.toggle('disabled', currentPageIndex === totalPages - 1);
            }

            function prevPage() {
                if (currentPageIndex <= 0) return;

                const currentPage = document.querySelector(`.page[data-index="${currentPageIndex}"]`);
                const prevPageElem = document.querySelector(`.page[data-index="${currentPageIndex - 1}"]`);

                if (!currentPage || !prevPageElem) return;

                prevPageElem.classList.remove('flipped-left', 'stack-left');
                void currentPage.offsetWidth;

                currentPage.classList.remove('front-right');
                currentPage.classList.add('flipped-left');

                prevPageElem.classList.remove('flipped-left', 'stack-left');
                prevPageElem.classList.add('front-right');

                currentPageIndex--;

                const pages = document.querySelectorAll('.page');
                pages.forEach((page, idx) => {
                    if (idx < currentPageIndex) {
                        page.classList.remove('front-right', 'stack-left');
                        page.classList.add('flipped-left');
                    } else if (idx === currentPageIndex) {
                        // front-right
                    } else if (idx > currentPageIndex) {
                        page.classList.remove('front-right', 'flipped-left');
                        page.classList.add('stack-left');
                    }
                });

                indicator.innerText = `стр. ${currentPageIndex + 1} / ${totalPages}`;
                prevBtn.classList.toggle('disabled', currentPageIndex === 0);
                nextBtn.classList.toggle('disabled', currentPageIndex === totalPages - 1);
            }

            buildPages();

            prevBtn.addEventListener('click', prevPage);
            nextBtn.addEventListener('click', nextPage);
        })();
    </script>
</body>
</html>[/html]

72

[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=yes">
    <title>Дневник · два лица</title>
    <!-- Подключаем шрифты -->
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Caveat:wght@400;600;700&family=Literata:opsz,wght@7..72,400;7..72,500;7..72,600;7..72,700&family=Cormorant+SC:wght@400;500;600;700&display=swap" rel="stylesheet">
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            user-select: none;
        }

        body {
            min-height: 100vh;
            background: #1c1410;
            display: flex;
            align-items: center;
            justify-content: center;
            padding: 15px;
            perspective: 2600px;
        }

        .book-wrapper {
            width: 100%;
            max-width: 800px;
            border-radius: 8px 24px 24px 8px;
            background: #2b1b12;
            padding: 14px 14px 14px 10px;
            background-image: linear-gradient(145deg, #3f2a1b 0%, #1f130b 80%);
        }

        .book-interior {
            background: #2b1d13;
            border-radius: 6px 20px 20px 6px;
            padding: 20px 20px 20px 14px;
            box-shadow: inset 0 0 15px #0a0603, inset 0 0 0 1px #63482e;
        }

        .flip-scene {
            position: relative;
            width: 100%;
            height: 650px;
            display: flex;
            align-items: center;
            justify-content: center;
            background: transparent;
            transform-style: preserve-3d;
        }

        .page {
            position: absolute;
            width: 90%;
            max-width: 620px;
            height: 620px;
            border-radius: 0 8px 8px 0;
            box-shadow:
                0 10px 20px rgba(0,0,0,0.7),
                -10px 6px 18px rgba(0,0,0,0.8),
                inset 0 -3px 8px rgba(0,0,0,0.6);
            padding: 35px 30px 30px 40px;
            border-left: 4px solid #4f3824;
            border-right: 1px solid #4d3621;
            font-weight: 400;
            line-height: 1.7;
            word-break: break-word;
            backface-visibility: hidden;
            transform-style: preserve-3d;
            transition: transform 0.8s cubic-bezier(0.45, 0.05, 0.2, 0.95);
            cursor: default;
            transform-origin: left center;
            display: flex;
            flex-direction: column;
        }

        /* Тип первый (зелёный) — Literata */
        .page.character-one {
            background:
                radial-gradient(circle at 25% 25%, rgba(50, 80, 50, 0.4), transparent 60%),
                linear-gradient(160deg, #3b2f25, #1f3a2a);
            color: #e4dbc6;
            font-family: 'Literata', serif;
            border-left-color: #5b6e4b;
        }

        .page.character-one .page-lines {
            background-image: repeating-linear-gradient(transparent 0px, transparent 30px, #9b8a6b 30px, #9b8a6b 31px);
            opacity: 0.2;
        }

        /* Тип второй (красный) — Cormorant SC */
        .page.character-two {
            background:
                radial-gradient(circle at 70% 30%, rgba(120, 0, 0, 0.25), transparent 60%),
                linear-gradient(#130c0c, #0b0505);
            color: #f1e7e7;
            font-family: 'Cormorant SC', serif;
            border-left-color: #7a3a3a;
        }

        .page.character-two .page-lines {
            background-image: repeating-linear-gradient(transparent 0px, transparent 30px, #a55a5a 30px, #a55a5a 31px);
            opacity: 0.2;
        }

        .page-content {
            position: relative;
            z-index: 5;
            width: 100%;
            flex: 1;
            display: flex;
            flex-direction: column;
            min-height: 0;
            height: 100%;
        }

        .date-plate {
            font-size: 25px;
            padding: 8px 24px;
            margin-bottom: 15px;
            display: inline-block;
            letter-spacing: 2px;
            text-transform: uppercase;
            background: rgba(0,0,0,0.3);
            backdrop-filter: blur(2px);
            border: 1px solid currentColor;
            align-self: flex-start;
            font-family: 'Caveat', cursive;
            flex-shrink: 0;
        }

        .character-one .date-plate {
            background: rgba(50,70,40,0.5);
            border-color: rgba(100,120,80,0.8);
            color: #f1f0e6;
            box-shadow: 0 6px 18px rgba(0,0,0,0.12);
        }

        .character-two .date-plate {
            background: linear-gradient(90deg, #6e0f0f, #9b1c1c);
            border: none;
            color: #fff;
            box-shadow: 0 0 20px rgba(180,0,0,0.4), 0 10px 30px rgba(0,0,0,0.6);
        }

        .entry-bubble {
            flex: 1 1 auto;
            min-height: 0;
            border-radius: 26px;
            padding: 25px 30px;
            overflow-y: auto;
            scrollbar-width: thin;
            box-sizing: border-box;
           
            &::-webkit-scrollbar {
                width: 8px;
            }
           
            &::-webkit-scrollbar-track {
                background: rgba(0, 0, 0, 0.2);
                border-radius: 10px;
            }
           
            &::-webkit-scrollbar-thumb {
                background: rgba(200, 180, 150, 0.3);
                border-radius: 10px;
                border: 2px solid rgba(0, 0, 0, 0.2);
            }
           
            &::-webkit-scrollbar-thumb:hover {
                background: rgba(200, 180, 150, 0.5);
            }
        }

        .character-one .entry-bubble {
            background: #3a4a36;
            box-shadow: 0 12px 28px rgba(0,0,0,0.2), inset 0 0 35px rgba(0,0,0,0.08);
            color: #e4dbc6;
            scrollbar-color: #9b8a6b #2a3a26;
        }

        .character-two .entry-bubble {
            background: rgba(15,0,0,0.6);
            border: 1px solid rgba(255,255,255,0.08);
            box-shadow: 0 20px 50px rgba(0,0,0,0.8), inset 0 0 50px rgba(150,0,0,0.15);
            color: #f1e7e7;
            scrollbar-color: #a55a5a #2a0a0a;
        }

        .entry {
            font-size: 18px;
            line-height: 1.7;
            white-space: pre-wrap;
            user-select: text;
            padding-right: 5px;
        }

        /* Специфичные настройки для каждого шрифта */
        .character-one .entry {
            font-weight: 400;
            font-size: 18px;
            font-feature-settings: "lnum"; /* красивые цифры */
        }

        .character-two .entry {
            font-weight: 500;
            font-size: 17px;
            letter-spacing: 0.3px; /* капитель требует чуть больше воздуха */
            text-transform: uppercase; /* для Cormorant SC это работает особенно красиво */
        }

        /* текстурный слой */
        .page::before {
            content: '';
            position: absolute;
            top: 0; left: 0; width: 100%; height: 100%;
            background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="160" height="160" viewBox="0 0 160 160"><filter id="noise2"><feTurbulence baseFrequency="0.9 1.2" numOctaves="2" /><feColorMatrix values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0.25 0"/></filter><rect width="160" height="160" filter="url(%23noise2)" opacity="0.25"/></svg>');
            opacity: 0.2;
            pointer-events: none;
            border-radius: inherit;
            mix-blend-mode: multiply;
        }

        .page-lines {
            position: absolute;
            top: 0; left: 0; width: 100%; height: 100%;
            pointer-events: none;
            z-index: 2;
        }

        .page-num, .page::after {
            display: none;
        }

        .page.flipped-left {
            transform: rotateY(-170deg) translateZ(8px);
            box-shadow: -20px 8px 30px rgba(0,0,0,0.9);
            filter: brightness(0.75) sepia(0.3);
            z-index: 5;
        }

        .page.front-right {
            transform: rotateY(0deg) translateZ(30px);
            z-index: 30;
            box-shadow: 0 15px 35px rgba(0,0,0,0.9), -10px 10px 25px rgba(0,0,0,0.8);
        }

        .page.stack-left {
            transform: rotateY(0deg) translateX(-100%) translateZ(1px);
            opacity: 0;
            pointer-events: none;
            transition: none;
            box-shadow: none;
        }

        .gutter {
            position: absolute;
            width: 14px;
            height: 100%;
            left: 45%;
            top: 0;
            background: radial-gradient(ellipse at center, #3a281c 0%, #1b110a 100%);
            transform: translateX(-50%) rotateY(20deg);
            box-shadow: -3px 0 12px #0f0803, inset 0 0 6px #634b33;
            z-index: 50;
            pointer-events: none;
            border-radius: 20%;
        }

        .nav-panel {
            display: flex;
            align-items: center;
            justify-content: center;
            gap: 40px;
            margin-top: 30px;
            margin-bottom: 10px;
        }

        .nav-btn {
            background: #6b1e1e;
            border: 3px solid #2f140e;
            font-size: 2.1rem;
            font-weight: bold;
            width: 70px;
            height: 70px;
            border-radius: 50%;
            cursor: pointer;
            box-shadow: 0 8px 0 #2e110b, 0 0 15px #520000;
            transition: 0.08s linear;
            color: #f0cfb0;
            display: inline-flex;
            align-items: center;
            justify-content: center;
            font-family: 'Caveat', monospace;
            text-shadow: 0 0 5px #ffb273;
        }

        .nav-btn:active {
            transform: translateY(6px);
            box-shadow: 0 2px 0 #2e110b, 0 0 20px #a13030;
        }

        .nav-btn.disabled {
            opacity: 0.3;
            pointer-events: none;
            box-shadow: 0 4px 0 #2e110b;
            transform: translateY(4px);
            filter: grayscale(0.7);
        }

        .page-indicator {
            background: #281e16;
            padding: 12px 32px;
            border-radius: 60px;
            font-size: 2rem;
            font-weight: bold;
            color: #dbbc96;
            box-shadow: inset 0 3px 10px #0e0804, 0 8px 0 #3e261b, 0 0 15px #4d1f1f;
            font-family: 'Caveat', cursive;
            border: 1px solid #7b4f31;
            min-width: 170px;
            text-align: center;
            text-shadow: 0 0 8px #ab5f2c;
        }

        .footer-note {
            text-align: center;
            color: #ac8a67;
            margin-top: 12px;
            font-family: 'Caveat';
            font-size: 1.4rem;
            letter-spacing: 2px;
            text-shadow: 0 0 8px #3b1c0c;
        }

        @media (max-width: 600px) {
            .book-wrapper {
                padding: 8px;
                border-radius: 4px 16px 16px 4px;
            }
           
            .flip-scene {
                height: 550px;
            }
           
            .page {
                height: 520px;
                padding: 20px 20px 20px 25px;
            }
           
            .entry-bubble {
                padding: 15px;
            }
           
            .nav-btn {
                width: 55px;
                height: 55px;
                font-size: 1.8rem;
            }
           
            .page-indicator {
                padding: 8px 16px;
                font-size: 1.5rem;
                min-width: 130px;
            }
           
            .date-plate {
                font-size: 22px;
                padding: 5px 18px;
            }
           
            .character-one .entry {
                font-size: 16px;
            }
           
            .character-two .entry {
                font-size: 15px;
            }
        }

        @media (max-width: 400px) {
            .flip-scene {
                height: 500px;
            }
           
            .page {
                height: 470px;
                padding: 15px;
            }
           
            .entry-bubble {
                padding: 12px;
            }
           
            .character-one .entry {
                font-size: 15px;
            }
           
            .character-two .entry {
                font-size: 14px;
            }
        }
    </style>
</head>
<body>
    <div class="book-wrapper">
        <div class="book-interior">
            <div class="flip-scene" id="flipScene">
                <div class="gutter"></div>
            </div>
            <div class="nav-panel">
                <button class="nav-btn" id="prevPageBtn" aria-label="предыдущая страница">◀</button>
                <span class="page-indicator" id="indicator">стр. 1 / 10</span>
                <button class="nav-btn" id="nextPageBtn" aria-label="следующая страница">▶</button>
            </div>
            <div class="footer-note">✦  memento mori  ✦</div>
        </div>
    </div>

    <script>
        (function() {
            const pagesData = [
                {
                    type: 'character-one',
                    date: '12 октября',
                    text: 'Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae pellentesque sem placerat. In id cursus mi pretium tellus duis convallis. Tempus leo eu aenean sed diam urna tempor. Pulvinar vivamus fringilla lacus nec metus bibendum egestas. Iaculis massa nisl malesuada lacinia integer nunc posuere. Ut hendrerit semper vel class aptent taciti sociosqu. Ad litora torquent per conubia nostra inceptos himenaeos.\n\nLorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae pellentesque sem placerat. In id cursus mi pretium tellus duis convallis. Tempus leo eu aenean sed diam urna tempor.\n\nЗарегистрирован: 2013-12-25\nПриглашений: 0\nСообщений: 63\nУважение: +1\nПозитив: +0\n\nПровел на форуме:\n21 час 23 минуты\nIP: 159.148.58.10\n\nАктивен 2 часа 17 минут'
                },
               
                {
                    type: 'character-two',
                    date: '13 октября',
                    text: 'Сегодня ночью спал просто отвратительно. По ощущениям будто кто-то подкинул мне в голову взрывчатку - подкрался, пока я дремал, открыл черепную крышку, сбросил туда всякой дряни, закрыл и убежал со всех ног. Ментальный подкидыш, взрывоопасная бредятина. Причем сон начинался просто чудесно - я, кажется, был на задании или просто развлекался славной "охотой", я отчетливо помню, как пролезал в чье-то тело, подслушивал чужой пульс, окунался в чужие крики, но потом.. потом я полностью потерял контроль над своим телом. Нет, я продолжил начатое, но будто бы уже не по своей воле, я наносил своей жертве увечья, но не там, где хотел их нанести, и пытал ее не теми способами, которыми всегда предпочитал.. Из дирижёра я превратился в обычного зрителя, пусть и посаженного в первых рядах. Очень гадкое ощущение, когда ты, вроде бы, делаешь все то, что хотел сделать изначально, но по чьей-то указке, по чьему-то велению, в совершенно ином, не согласованном с тобой, виде. Я потратил три тысячелетия на то, чтобы двинуть хотя бы пальцем, чтобы сделать хоть что-то самостоятельно, а не лицезреть парализованным истуканом, как льются реки крови из вспоротых глоток. Творить нечто настолько упоительно сладкое и грешное, но не по доброй воле - самое мерзкое, самое унизительное и святотатственное, что можно придумать. Грешить нужно осознанно. По велению своего выбора, своего решения, своей тяги, иначе это просто кукольная постановка, где ты болтаешься на невидимых ниточках, где ты и не убийца даже, а лишь инструмент того, кто в действительности является убийцей. Заснуть снова я так и не смог, однако днем был весьма бодр. Подумаешь, скверный сон. И не такое случалось.'
                },
               
                { type: 'character-one', date: '14 октября', text: 'Сегодня был продуктивный день. Удалось закончить старые дела и даже немного поразмышлять о будущем. Кажется, я на верном пути. Нужно записать несколько идей:\n\n- создать новый ритуал\n- пересмотреть старые записи\n- подготовить ингредиенты' },
               
                { type: 'character-two', date: '15 октября', text: 'ОПЯТЬ ЭТОТ КОШМАР. Я СНОВА ВИДЕЛ СЕБЯ СО СТОРОНЫ, БУДТО МАРИОНЕТКУ. НЕВЫНОСИМО ЧУВСТВОВАТЬ, ЧТО ТВОИМИ РУКАМИ КТО-ТО УПРАВЛЯЕТ. ТРИ ТЫСЯЧЕЛЕТИЯ БОРЬБЫ ЗА СВОБОДУ ВОЛИ — И ТАКИЕ СНЫ. ГРЕШИТЬ НУЖНО ОСОЗНАННО, ИНАЧЕ ЭТО ПРОСТО КУКОЛЬНЫЙ ТЕАТР. НАДО БУДЕТ ЗАВТРА ПОИСКАТЬ СПОСОБ ЗАЩИТИТЬ РАЗУМ.' },
               
                { type: 'character-one', date: '16 октября', text: 'Список дел:\n• собрать травы\n• наточить перья\n• написать письмо\n• зажечь свечи\n\nПогода сегодня под стать настроению — туман и лёгкий дождь. Самое время для размышлений.' },
               
                { type: 'character-two', date: '17 октября', text: 'ВСПОМНИЛ ОДИН СТАРЫЙ РЕЦЕПТ ЭЛИКСИРА:\n— КОРЕНЬ ДЯГИЛЯ\n— ПОЛЫНЬ\n— ЖЕЛЕЗНЫЙ КУПОРОС (ЩЕПОТКА)\nНАСТАИВАТЬ ВСЮ НОЧЬ НА РАСТУЩЕЙ ЛУНЕ.\n\nНАДО БУДЕТ ПРОВЕРИТЬ, РАБОТАЕТ ЛИ. И ЗАОДНО ЗАПИСАТЬ ОЩУЩЕНИЯ.' },
               
                { type: 'character-one', date: '18 октября', text: 'Сегодня листал старые записи. Интересно, как меняется почерк и мысли со временем. Некоторые идеи кажутся сейчас наивными, но в них есть своя прелесть. Цитата на сегодня: "Мы сами создаём тени, которые нас пугают".' },
               
                { type: 'character-two', date: '19 октября', text: 'НОЧЬ ВЫДАЛАСЬ БЕСПОКОЙНОЙ. СНОВА ЭТИ ВИДЕНИЯ. НО НА ЭТОТ РАЗ Я СМОГ ЧУТЬ ДОЛЬШЕ УДЕРЖАТЬ КОНТРОЛЬ. ПРОГРЕСС. ВОЗМОЖНО, ЕСЛИ ТРЕНИРОВАТЬСЯ, СМОГУ ПОЛНОСТЬЮ УПРАВЛЯТЬ СНАМИ. НАДО ЗАПИСЫВАТЬ КАЖДУЮ ДЕТАЛЬ.' },
               
                { type: 'character-one', date: '20 февраля', text: 'За окном туман. В комнате пахнет воском и старыми бумагами. Сегодня особенный день. Нужно вспомнить все ритуалы и ничего не упустить. Время течёт так быстро.' },
               
                { type: 'character-two', date: '21 октября', text: 'ПОСЛЕДНЯЯ ЗАПИСЬ В ЭТОМ БЛОКНОТЕ. КНИГА ЗАКРЫВАЕТСЯ, НО ИСТОРИИ ОСТАЮТСЯ. ПОМНИ О СВЕТЕ ДАЖЕ В ТЕМНОТЕ. И ПОМНИ: ТВОЯ ВОЛЯ ПРИНАДЛЕЖИТ ТОЛЬКО ТЕБЕ.' }
            ];

            const totalPages = pagesData.length;
            let currentPageIndex = 0;

            const scene = document.getElementById('flipScene');
            const indicator = document.getElementById('indicator');
            const prevBtn = document.getElementById('prevPageBtn');
            const nextBtn = document.getElementById('nextPageBtn');

            function buildPages() {
                scene.innerHTML = '';
                const gutterDiv = document.createElement('div');
                gutterDiv.className = 'gutter';
                scene.appendChild(gutterDiv);

                pagesData.forEach((data, index) => {
                    const pageDiv = document.createElement('div');
                    pageDiv.className = `page ${data.type}`;
                    pageDiv.setAttribute('data-index', index);

                    const lines = document.createElement('div');
                    lines.className = 'page-lines';
                   
                    const contentDiv = document.createElement('div');
                    contentDiv.className = 'page-content';
                   
                    const datePlate = document.createElement('div');
                    datePlate.className = 'date-plate';
                    datePlate.innerText = data.date;
                   
                    const bubbleDiv = document.createElement('div');
                    bubbleDiv.className = 'entry-bubble';
                   
                    const textDiv = document.createElement('div');
                    textDiv.className = 'entry';
                    textDiv.innerText = data.text;

                    bubbleDiv.appendChild(textDiv);
                    contentDiv.appendChild(datePlate);
                    contentDiv.appendChild(bubbleDiv);

                    pageDiv.appendChild(lines);
                    pageDiv.appendChild(contentDiv);

                    scene.appendChild(pageDiv);
                });

                updatePagesState();
            }

            function updatePagesState() {
                const pages = document.querySelectorAll('.page');
                pages.forEach((page, idx) => {
                    page.classList.remove('front-right', 'flipped-left', 'stack-left');

                    if (idx === currentPageIndex) {
                        page.classList.add('front-right');
                    } else if (idx < currentPageIndex) {
                        page.classList.add('flipped-left');
                    } else {
                        page.classList.add('stack-left');
                    }
                });
                indicator.innerText = `стр. ${currentPageIndex + 1} / ${totalPages}`;
                prevBtn.classList.toggle('disabled', currentPageIndex === 0);
                nextBtn.classList.toggle('disabled', currentPageIndex === totalPages - 1);
            }

            function nextPage() {
                if (currentPageIndex >= totalPages - 1) return;

                const currentPage = document.querySelector(`.page[data-index="${currentPageIndex}"]`);
                const nextPageElem = document.querySelector(`.page[data-index="${currentPageIndex + 1}"]`);

                if (!currentPage || !nextPageElem) return;

                nextPageElem.classList.remove('stack-left');
                void currentPage.offsetWidth;

                currentPage.classList.remove('front-right');
                currentPage.classList.add('flipped-left');

                nextPageElem.classList.remove('stack-left');
                nextPageElem.classList.add('front-right');

                currentPageIndex++;

                const pages = document.querySelectorAll('.page');
                pages.forEach((page, idx) => {
                    if (idx < currentPageIndex) {
                        page.classList.remove('front-right', 'stack-left');
                        page.classList.add('flipped-left');
                    } else if (idx === currentPageIndex) {
                        // уже обработано
                    } else {
                        page.classList.remove('front-right', 'flipped-left');
                        page.classList.add('stack-left');
                    }
                });

                indicator.innerText = `стр. ${currentPageIndex + 1} / ${totalPages}`;
                prevBtn.classList.toggle('disabled', currentPageIndex === 0);
                nextBtn.classList.toggle('disabled', currentPageIndex === totalPages - 1);
            }

            function prevPage() {
                if (currentPageIndex <= 0) return;

                const currentPage = document.querySelector(`.page[data-index="${currentPageIndex}"]`);
                const prevPageElem = document.querySelector(`.page[data-index="${currentPageIndex - 1}"]`);

                if (!currentPage || !prevPageElem) return;

                prevPageElem.classList.remove('flipped-left', 'stack-left');
                void currentPage.offsetWidth;

                currentPage.classList.remove('front-right');
                currentPage.classList.add('flipped-left');

                prevPageElem.classList.remove('flipped-left', 'stack-left');
                prevPageElem.classList.add('front-right');

                currentPageIndex--;

                const pages = document.querySelectorAll('.page');
                pages.forEach((page, idx) => {
                    if (idx < currentPageIndex) {
                        page.classList.remove('front-right', 'stack-left');
                        page.classList.add('flipped-left');
                    } else if (idx === currentPageIndex) {
                        // front-right
                    } else if (idx > currentPageIndex) {
                        page.classList.remove('front-right', 'flipped-left');
                        page.classList.add('stack-left');
                    }
                });

                indicator.innerText = `стр. ${currentPageIndex + 1} / ${totalPages}`;
                prevBtn.classList.toggle('disabled', currentPageIndex === 0);
                nextBtn.classList.toggle('disabled', currentPageIndex === totalPages - 1);
            }

            buildPages();

            prevBtn.addEventListener('click', prevPage);
            nextBtn.addEventListener('click', nextPage);
        })();
    </script>
</body>
</html>[/html]

73

[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=yes">
    <title>Дневник · два лица</title>
    <!-- Подключаем шрифты -->
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Caveat:wght@400;600;700&family=Literata:opsz,wght@7..72,400;7..72,500;7..72,600;7..72,700&family=Cormorant:ital,wght@0,400;0,500;0,600;0,700;1,400;1,500;1,600;1,700&display=swap" rel="stylesheet">
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            user-select: none;
        }

        body {
            min-height: 100vh;
            background: #1c1410;
            display: flex;
            align-items: center;
            justify-content: center;
            padding: 15px;
            perspective: 2600px;
        }

        .book-wrapper {
            width: 100%;
            max-width: 800px;
            border-radius: 8px 24px 24px 8px;
            background: #2b1b12;
            padding: 14px 14px 14px 10px;
            background-image: linear-gradient(145deg, #3f2a1b 0%, #1f130b 80%);
        }

        .book-interior {
            background: #2b1d13;
            border-radius: 6px 20px 20px 6px;
            padding: 20px 20px 20px 14px;
            box-shadow: inset 0 0 15px #0a0603, inset 0 0 0 1px #63482e;
        }

        .flip-scene {
            position: relative;
            width: 100%;
            height: 650px;
            display: flex;
            align-items: center;
            justify-content: center;
            background: transparent;
            transform-style: preserve-3d;
        }

        .page {
            position: absolute;
            width: 90%;
            max-width: 620px;
            height: 620px;
            border-radius: 0 8px 8px 0;
            box-shadow:
                0 10px 20px rgba(0,0,0,0.7),
                -10px 6px 18px rgba(0,0,0,0.8),
                inset 0 -3px 8px rgba(0,0,0,0.6);
            padding: 35px 30px 30px 40px;
            border-left: 4px solid #4f3824;
            border-right: 1px solid #4d3621;
            font-weight: 400;
            line-height: 1.7;
            word-break: break-word;
            backface-visibility: hidden;
            transform-style: preserve-3d;
            transition: transform 0.8s cubic-bezier(0.45, 0.05, 0.2, 0.95);
            cursor: default;
            transform-origin: left center;
            display: flex;
            flex-direction: column;
        }

        /* Тип первый (зелёный) — Literata */
        .page.character-one {
            background:
                radial-gradient(circle at 25% 25%, rgba(50, 80, 50, 0.4), transparent 60%),
                linear-gradient(160deg, #3b2f25, #1f3a2a);
            color: #e4dbc6;
            font-family: 'Literata', serif;
            border-left-color: #5b6e4b;
        }

        .page.character-one .page-lines {
            background-image: repeating-linear-gradient(transparent 0px, transparent 30px, #9b8a6b 30px, #9b8a6b 31px);
            opacity: 0.2;
        }

        /* Тип второй (красный) — Cormorant (обычный) */
        .page.character-two {
            background:
                radial-gradient(circle at 70% 30%, rgba(120, 0, 0, 0.25), transparent 60%),
                linear-gradient(#130c0c, #0b0505);
            color: #f1e7e7;
            font-family: 'Cormorant', serif;
            border-left-color: #7a3a3a;
        }

        .page.character-two .page-lines {
            background-image: repeating-linear-gradient(transparent 0px, transparent 30px, #a55a5a 30px, #a55a5a 31px);
            opacity: 0.2;
        }

        .page-content {
            position: relative;
            z-index: 5;
            width: 100%;
            flex: 1;
            display: flex;
            flex-direction: column;
            min-height: 0;
            height: 100%;
        }

        .date-plate {
            font-size: 25px;
            padding: 8px 24px;
            margin-bottom: 15px;
            display: inline-block;
            letter-spacing: 2px;
            text-transform: uppercase;
            background: rgba(0,0,0,0.3);
            backdrop-filter: blur(2px);
            border: 1px solid currentColor;
            align-self: flex-start;
            font-family: 'Caveat', cursive;
            flex-shrink: 0;
        }

        .character-one .date-plate {
            background: rgba(50,70,40,0.5);
            border-color: rgba(100,120,80,0.8);
            color: #f1f0e6;
            box-shadow: 0 6px 18px rgba(0,0,0,0.12);
        }

        .character-two .date-plate {
            background: linear-gradient(90deg, #6e0f0f, #9b1c1c);
            border: none;
            color: #fff;
            box-shadow: 0 0 20px rgba(180,0,0,0.4), 0 10px 30px rgba(0,0,0,0.6);
        }

        .entry-bubble {
            flex: 1 1 auto;
            min-height: 0;
            border-radius: 26px;
            padding: 25px 30px;
            overflow-y: auto;
            scrollbar-width: thin;
            box-sizing: border-box;
           
            &::-webkit-scrollbar {
                width: 8px;
            }
           
            &::-webkit-scrollbar-track {
                background: rgba(0, 0, 0, 0.2);
                border-radius: 10px;
            }
           
            &::-webkit-scrollbar-thumb {
                background: rgba(200, 180, 150, 0.3);
                border-radius: 10px;
                border: 2px solid rgba(0, 0, 0, 0.2);
            }
           
            &::-webkit-scrollbar-thumb:hover {
                background: rgba(200, 180, 150, 0.5);
            }
        }

        .character-one .entry-bubble {
            background: #3a4a36;
            box-shadow: 0 12px 28px rgba(0,0,0,0.2), inset 0 0 35px rgba(0,0,0,0.08);
            color: #e4dbc6;
            scrollbar-color: #9b8a6b #2a3a26;
        }

        .character-two .entry-bubble {
            background: rgba(15,0,0,0.6);
            border: 1px solid rgba(255,255,255,0.08);
            box-shadow: 0 20px 50px rgba(0,0,0,0.8), inset 0 0 50px rgba(150,0,0,0.15);
            color: #f1e7e7;
            scrollbar-color: #a55a5a #2a0a0a;
        }

        .entry {
            font-size: 18px;
            line-height: 1.7;
            white-space: pre-wrap;
            user-select: text;
            padding-right: 5px;
        }

        /* Специфичные настройки для каждого шрифта */
        .character-one .entry {
            font-weight: 400;
            font-size: 18px;
        }

        .character-two .entry {
            font-weight: 500;
            font-size: 22px; /* Чуть крупнее для Cormorant */
            letter-spacing: 0.2px;
        }

        /* текстурный слой */
        .page::before {
            content: '';
            position: absolute;
            top: 0; left: 0; width: 100%; height: 100%;
            background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="160" height="160" viewBox="0 0 160 160"><filter id="noise2"><feTurbulence baseFrequency="0.9 1.2" numOctaves="2" /><feColorMatrix values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0.25 0"/></filter><rect width="160" height="160" filter="url(%23noise2)" opacity="0.25"/></svg>');
            opacity: 0.2;
            pointer-events: none;
            border-radius: inherit;
            mix-blend-mode: multiply;
        }

        .page-lines {
            position: absolute;
            top: 0; left: 0; width: 100%; height: 100%;
            pointer-events: none;
            z-index: 2;
        }

        .page-num, .page::after {
            display: none;
        }

        .page.flipped-left {
            transform: rotateY(-170deg) translateZ(8px);
            box-shadow: -20px 8px 30px rgba(0,0,0,0.9);
            filter: brightness(0.75) sepia(0.3);
            z-index: 5;
        }

        .page.front-right {
            transform: rotateY(0deg) translateZ(30px);
            z-index: 30;
            box-shadow: 0 15px 35px rgba(0,0,0,0.9), -10px 10px 25px rgba(0,0,0,0.8);
        }

        .page.stack-left {
            transform: rotateY(0deg) translateX(-100%) translateZ(1px);
            opacity: 0;
            pointer-events: none;
            transition: none;
            box-shadow: none;
        }

        .gutter {
            position: absolute;
            width: 14px;
            height: 100%;
            left: 45%;
            top: 0;
            background: radial-gradient(ellipse at center, #3a281c 0%, #1b110a 100%);
            transform: translateX(-50%) rotateY(20deg);
            box-shadow: -3px 0 12px #0f0803, inset 0 0 6px #634b33;
            z-index: 50;
            pointer-events: none;
            border-radius: 20%;
        }

        .nav-panel {
            display: flex;
            align-items: center;
            justify-content: center;
            gap: 40px;
            margin-top: 30px;
            margin-bottom: 10px;
        }

        .nav-btn {
            background: #6b1e1e;
            border: 3px solid #2f140e;
            font-size: 2.1rem;
            font-weight: bold;
            width: 70px;
            height: 70px;
            border-radius: 50%;
            cursor: pointer;
            box-shadow: 0 8px 0 #2e110b, 0 0 15px #520000;
            transition: 0.08s linear;
            color: #f0cfb0;
            display: inline-flex;
            align-items: center;
            justify-content: center;
            font-family: 'Caveat', monospace;
            text-shadow: 0 0 5px #ffb273;
        }

        .nav-btn:active {
            transform: translateY(6px);
            box-shadow: 0 2px 0 #2e110b, 0 0 20px #a13030;
        }

        .nav-btn.disabled {
            opacity: 0.3;
            pointer-events: none;
            box-shadow: 0 4px 0 #2e110b;
            transform: translateY(4px);
            filter: grayscale(0.7);
        }

        .page-indicator {
            background: #281e16;
            padding: 12px 32px;
            border-radius: 60px;
            font-size: 2rem;
            font-weight: bold;
            color: #dbbc96;
            box-shadow: inset 0 3px 10px #0e0804, 0 8px 0 #3e261b, 0 0 15px #4d1f1f;
            font-family: 'Caveat', cursive;
            border: 1px solid #7b4f31;
            min-width: 170px;
            text-align: center;
            text-shadow: 0 0 8px #ab5f2c;
        }

        .footer-note {
            text-align: center;
            color: #ac8a67;
            margin-top: 12px;
            font-family: 'Caveat';
            font-size: 1.4rem;
            letter-spacing: 2px;
            text-shadow: 0 0 8px #3b1c0c;
        }

        @media (max-width: 600px) {
            .book-wrapper {
                padding: 8px;
                border-radius: 4px 16px 16px 4px;
            }
           
            .flip-scene {
                height: 550px;
            }
           
            .page {
                height: 520px;
                padding: 20px 20px 20px 25px;
            }
           
            .entry-bubble {
                padding: 15px;
            }
           
            .nav-btn {
                width: 55px;
                height: 55px;
                font-size: 1.8rem;
            }
           
            .page-indicator {
                padding: 8px 16px;
                font-size: 1.5rem;
                min-width: 130px;
            }
           
            .date-plate {
                font-size: 22px;
                padding: 5px 18px;
            }
           
            .character-one .entry {
                font-size: 16px;
            }
           
            .character-two .entry {
                font-size: 17px;
            }
        }

        @media (max-width: 400px) {
            .flip-scene {
                height: 500px;
            }
           
            .page {
                height: 470px;
                padding: 15px;
            }
           
            .entry-bubble {
                padding: 12px;
            }
           
            .character-one .entry {
                font-size: 15px;
            }
           
            .character-two .entry {
                font-size: 16px;
            }
        }
    </style>
</head>
<body>
    <div class="book-wrapper">
        <div class="book-interior">
            <div class="flip-scene" id="flipScene">
                <div class="gutter"></div>
            </div>
            <div class="nav-panel">
                <button class="nav-btn" id="prevPageBtn" aria-label="предыдущая страница">◀</button>
                <span class="page-indicator" id="indicator">стр. 1 / 10</span>
                <button class="nav-btn" id="nextPageBtn" aria-label="следующая страница">▶</button>
            </div>
            <div class="footer-note">✦  memento mori  ✦</div>
        </div>
    </div>

    <script>
        (function() {
            const pagesData = [
                {
                    type: 'character-one',
                    date: '12 октября',
                    text: 'Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae pellentesque sem placerat. In id cursus mi pretium tellus duis convallis. Tempus leo eu aenean sed diam urna tempor. Pulvinar vivamus fringilla lacus nec metus bibendum egestas. Iaculis massa nisl malesuada lacinia integer nunc posuere. Ut hendrerit semper vel class aptent taciti sociosqu. Ad litora torquent per conubia nostra inceptos himenaeos.\n\nLorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae pellentesque sem placerat. In id cursus mi pretium tellus duis convallis. Tempus leo eu aenean sed diam urna tempor.\n\nЗарегистрирован: 2013-12-25\nПриглашений: 0\nСообщений: 63\nУважение: +1\nПозитив: +0\n\nПровел на форуме:\n21 час 23 минуты\nIP: 159.148.58.10\n\nАктивен 2 часа 17 минут'
                },
               
                {
                    type: 'character-two',
                    date: '13 октября',
                    text: 'Сегодня ночью спал просто отвратительно. По ощущениям будто кто-то подкинул мне в голову взрывчатку - подкрался, пока я дремал, открыл черепную крышку, сбросил туда всякой дряни, закрыл и убежал со всех ног. Ментальный подкидыш, взрывоопасная бредятина. Причем сон начинался просто чудесно - я, кажется, был на задании или просто развлекался славной "охотой", я отчетливо помню, как пролезал в чье-то тело, подслушивал чужой пульс, окунался в чужие крики, но потом.. потом я полностью потерял контроль над своим телом. Нет, я продолжил начатое, но будто бы уже не по своей воле, я наносил своей жертве увечья, но не там, где хотел их нанести, и пытал ее не теми способами, которыми всегда предпочитал.. Из дирижёра я превратился в обычного зрителя, пусть и посаженного в первых рядах. Очень гадкое ощущение, когда ты, вроде бы, делаешь все то, что хотел сделать изначально, но по чьей-то указке, по чьему-то велению, в совершенно ином, не согласованном с тобой, виде. Я потратил три тысячелетия на то, чтобы двинуть хотя бы пальцем, чтобы сделать хоть что-то самостоятельно, а не лицезреть парализованным истуканом, как льются реки крови из вспоротых глоток. Творить нечто настолько упоительно сладкое и грешное, но не по доброй воле - самое мерзкое, самое унизительное и святотатственное, что можно придумать. Грешить нужно осознанно. По велению своего выбора, своего решения, своей тяги, иначе это просто кукольная постановка, где ты болтаешься на невидимых ниточках, где ты и не убийца даже, а лишь инструмент того, кто в действительности является убийцей. Заснуть снова я так и не смог, однако днем был весьма бодр. Подумаешь, скверный сон. И не такое случалось.'
                },
               
                { type: 'character-one', date: '14 октября', text: 'Сегодня был продуктивный день. Удалось закончить старые дела и даже немного поразмышлять о будущем. Кажется, я на верном пути. Нужно записать несколько идей:\n\n- создать новый ритуал\n- пересмотреть старые записи\n- подготовить ингредиенты' },
               
                { type: 'character-two', date: '15 октября', text: 'Опять этот кошмар. Я снова видел себя со стороны, будто марионетку. Невыносимо чувствовать, что твоими руками кто-то управляет. Три тысячелетия борьбы за свободу воли — и такие сны. Грешить нужно осознанно, иначе это просто кукольный театр. Надо будет завтра поискать способ защитить разум.' },
               
                { type: 'character-one', date: '16 октября', text: 'Список дел:\n• собрать травы\n• наточить перья\n• написать письмо\n• зажечь свечи\n\nПогода сегодня под стать настроению — туман и лёгкий дождь. Самое время для размышлений.' },
               
                { type: 'character-two', date: '17 октября', text: 'Вспомнил один старый рецепт эликсира:\n— корень дягиля\n— полынь\n— железный купорос (щепотка)\nНастаивать всю ночь на растущей луне.\n\nНадо будет проверить, работает ли. И заодно записать ощущения.' },
               
                { type: 'character-one', date: '18 октября', text: 'Сегодня листал старые записи. Интересно, как меняется почерк и мысли со временем. Некоторые идеи кажутся сейчас наивными, но в них есть своя прелесть. Цитата на сегодня: "Мы сами создаём тени, которые нас пугают".' },
               
                { type: 'character-two', date: '19 октября', text: 'Ночь выдалась беспокойной. Снова эти видения. Но на этот раз я смог чуть дольше удержать контроль. Прогресс. Возможно, если тренироваться, смогу полностью управлять снами. Надо записывать каждую деталь.' },
               
                { type: 'character-one', date: '20 февраля', text: 'За окном туман. В комнате пахнет воском и старыми бумагами. Сегодня особенный день. Нужно вспомнить все ритуалы и ничего не упустить. Время течёт так быстро.' },
               
                { type: 'character-two', date: '21 октября', text: 'Последняя запись в этом блокноте. Книга закрывается, но истории остаются. Помни о свете даже в темноте. И помни: твоя воля принадлежит только тебе.' }
            ];

            const totalPages = pagesData.length;
            let currentPageIndex = 0;

            const scene = document.getElementById('flipScene');
            const indicator = document.getElementById('indicator');
            const prevBtn = document.getElementById('prevPageBtn');
            const nextBtn = document.getElementById('nextPageBtn');

            function buildPages() {
                scene.innerHTML = '';
                const gutterDiv = document.createElement('div');
                gutterDiv.className = 'gutter';
                scene.appendChild(gutterDiv);

                pagesData.forEach((data, index) => {
                    const pageDiv = document.createElement('div');
                    pageDiv.className = `page ${data.type}`;
                    pageDiv.setAttribute('data-index', index);

                    const lines = document.createElement('div');
                    lines.className = 'page-lines';
                   
                    const contentDiv = document.createElement('div');
                    contentDiv.className = 'page-content';
                   
                    const datePlate = document.createElement('div');
                    datePlate.className = 'date-plate';
                    datePlate.innerText = data.date;
                   
                    const bubbleDiv = document.createElement('div');
                    bubbleDiv.className = 'entry-bubble';
                   
                    const textDiv = document.createElement('div');
                    textDiv.className = 'entry';
                    textDiv.innerText = data.text;

                    bubbleDiv.appendChild(textDiv);
                    contentDiv.appendChild(datePlate);
                    contentDiv.appendChild(bubbleDiv);

                    pageDiv.appendChild(lines);
                    pageDiv.appendChild(contentDiv);

                    scene.appendChild(pageDiv);
                });

                updatePagesState();
            }

            function updatePagesState() {
                const pages = document.querySelectorAll('.page');
                pages.forEach((page, idx) => {
                    page.classList.remove('front-right', 'flipped-left', 'stack-left');

                    if (idx === currentPageIndex) {
                        page.classList.add('front-right');
                    } else if (idx < currentPageIndex) {
                        page.classList.add('flipped-left');
                    } else {
                        page.classList.add('stack-left');
                    }
                });
                indicator.innerText = `стр. ${currentPageIndex + 1} / ${totalPages}`;
                prevBtn.classList.toggle('disabled', currentPageIndex === 0);
                nextBtn.classList.toggle('disabled', currentPageIndex === totalPages - 1);
            }

            function nextPage() {
                if (currentPageIndex >= totalPages - 1) return;

                const currentPage = document.querySelector(`.page[data-index="${currentPageIndex}"]`);
                const nextPageElem = document.querySelector(`.page[data-index="${currentPageIndex + 1}"]`);

                if (!currentPage || !nextPageElem) return;

                nextPageElem.classList.remove('stack-left');
                void currentPage.offsetWidth;

                currentPage.classList.remove('front-right');
                currentPage.classList.add('flipped-left');

                nextPageElem.classList.remove('stack-left');
                nextPageElem.classList.add('front-right');

                currentPageIndex++;

                const pages = document.querySelectorAll('.page');
                pages.forEach((page, idx) => {
                    if (idx < currentPageIndex) {
                        page.classList.remove('front-right', 'stack-left');
                        page.classList.add('flipped-left');
                    } else if (idx === currentPageIndex) {
                        // уже обработано
                    } else {
                        page.classList.remove('front-right', 'flipped-left');
                        page.classList.add('stack-left');
                    }
                });

                indicator.innerText = `стр. ${currentPageIndex + 1} / ${totalPages}`;
                prevBtn.classList.toggle('disabled', currentPageIndex === 0);
                nextBtn.classList.toggle('disabled', currentPageIndex === totalPages - 1);
            }

            function prevPage() {
                if (currentPageIndex <= 0) return;

                const currentPage = document.querySelector(`.page[data-index="${currentPageIndex}"]`);
                const prevPageElem = document.querySelector(`.page[data-index="${currentPageIndex - 1}"]`);

                if (!currentPage || !prevPageElem) return;

                prevPageElem.classList.remove('flipped-left', 'stack-left');
                void currentPage.offsetWidth;

                currentPage.classList.remove('front-right');
                currentPage.classList.add('flipped-left');

                prevPageElem.classList.remove('flipped-left', 'stack-left');
                prevPageElem.classList.add('front-right');

                currentPageIndex--;

                const pages = document.querySelectorAll('.page');
                pages.forEach((page, idx) => {
                    if (idx < currentPageIndex) {
                        page.classList.remove('front-right', 'stack-left');
                        page.classList.add('flipped-left');
                    } else if (idx === currentPageIndex) {
                        // front-right
                    } else if (idx > currentPageIndex) {
                        page.classList.remove('front-right', 'flipped-left');
                        page.classList.add('stack-left');
                    }
                });

                indicator.innerText = `стр. ${currentPageIndex + 1} / ${totalPages}`;
                prevBtn.classList.toggle('disabled', currentPageIndex === 0);
                nextBtn.classList.toggle('disabled', currentPageIndex === totalPages - 1);
            }

            buildPages();

            prevBtn.addEventListener('click', prevPage);
            nextBtn.addEventListener('click', nextPage);
        })();
    </script>
</body>
</html>[/html]

74

[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=yes">
    <title>Дневник · Шон и Клайд</title>
    <!-- Подключаем шрифты -->
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Caveat:wght@400;600;700&family=Literata:opsz,wght@7..72,400;7..72,500;7..72,600;7..72,700&family=Cormorant:ital,wght@0,400;0,500;0,600;0,700;1,400;1,500;1,600;1,700&display=swap" rel="stylesheet">
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            user-select: none;
        }

        body {
            min-height: 100vh;
            background: #1c1410;
            display: flex;
            align-items: center;
            justify-content: center;
            padding: 15px;
            perspective: 2600px;
        }

        .book-wrapper {
            width: 100%;
            max-width: 800px;
            border-radius: 8px 24px 24px 8px;
            background: #2b1b12;
            padding: 14px 14px 14px 10px;
            background-image: linear-gradient(145deg, #3f2a1b 0%, #1f130b 80%);
        }

        .book-interior {
            background: #2b1d13;
            border-radius: 6px 20px 20px 6px;
            padding: 20px 20px 20px 14px;
            box-shadow: inset 0 0 15px #0a0603, inset 0 0 0 1px #63482e;
        }

        .flip-scene {
            position: relative;
            width: 100%;
            height: 650px;
            display: flex;
            align-items: center;
            justify-content: center;
            background: transparent;
            transform-style: preserve-3d;
        }

        .page {
            position: absolute;
            width: 90%;
            max-width: 620px;
            height: 620px;
            border-radius: 0 8px 8px 0;
            box-shadow:
                0 10px 20px rgba(0,0,0,0.7),
                -10px 6px 18px rgba(0,0,0,0.8),
                inset 0 -3px 8px rgba(0,0,0,0.6);
            padding: 35px 30px 30px 40px;
            border-left: 4px solid #4f3824;
            border-right: 1px solid #4d3621;
            font-weight: 400;
            line-height: 1.7;
            word-break: break-word;
            backface-visibility: hidden;
            transform-style: preserve-3d;
            transition: transform 0.8s cubic-bezier(0.45, 0.05, 0.2, 0.95);
            cursor: default;
            transform-origin: left center;
            display: flex;
            flex-direction: column;
        }

        /* Тип первый (Шон — зелёный) — Literata + клетка */
        .page.character-one {
            background:
                radial-gradient(circle at 25% 25%, rgba(50, 80, 50, 0.4), transparent 60%),
                linear-gradient(160deg, #3b2f25, #1f3a2a);
            color: #e4dbc6;
            font-family: 'Literata', serif;
            border-left-color: #5b6e4b;
        }

        .page.character-one .page-lines {
            background-image:
                repeating-linear-gradient(transparent 0px, transparent 29px, #9b8a6b 29px, #9b8a6b 30px),
                repeating-linear-gradient(90deg, transparent 0px, transparent 29px, #9b8a6b 29px, #9b8a6b 30px);
            background-size: 30px 30px;
            opacity: 0.25;
        }

        /* Тип второй (Клайд — красный) — Cormorant */
        .page.character-two {
            background:
                radial-gradient(circle at 70% 30%, rgba(120, 0, 0, 0.25), transparent 60%),
                linear-gradient(#130c0c, #0b0505);
            color: #f1e7e7;
            font-family: 'Cormorant', serif;
            border-left-color: #7a3a3a;
        }

        .page.character-two .page-lines {
            background-image: repeating-linear-gradient(transparent 0px, transparent 30px, #a55a5a 30px, #a55a5a 31px);
            opacity: 0.2;
        }

        .page-content {
            position: relative;
            z-index: 5;
            width: 100%;
            flex: 1;
            display: flex;
            flex-direction: column;
            min-height: 0;
            height: 100%;
        }

        /* Верхняя плашка с датой и именем */
        .page-header {
            display: flex;
            align-items: center;
            justify-content: space-between;
            margin-bottom: 15px;
            flex-shrink: 0;
        }

        .date-plate {
            font-size: 25px;
            padding: 8px 24px;
            display: inline-block;
            letter-spacing: 2px;
            text-transform: uppercase;
            background: rgba(0,0,0,0.3);
            backdrop-filter: blur(2px);
            border: 1px solid currentColor;
            font-family: 'Caveat', cursive;
        }

        .character-one .date-plate {
            background: rgba(50,70,40,0.5);
            border-color: rgba(100,120,80,0.8);
            color: #f1f0e6;
            box-shadow: 0 6px 18px rgba(0,0,0,0.12);
        }

        .character-two .date-plate {
            background: linear-gradient(90deg, #6e0f0f, #9b1c1c);
            border: none;
            color: #fff;
            box-shadow: 0 0 20px rgba(180,0,0,0.4), 0 10px 30px rgba(0,0,0,0.6);
        }

        .character-name {
            font-size: 30px;
            padding: 8px 24px;
            font-family: 'Caveat', cursive;
            text-transform: uppercase;
            letter-spacing: 3px;
            background: rgba(0,0,0,0.2);
            backdrop-filter: blur(2px);
            border-radius: 40px;
        }

        .character-one .character-name {
            color: #d4c5a6;
            text-shadow: 0 0 10px rgba(100, 150, 100, 0.5);
            border: 1px solid #8b9a6b;
        }

        .character-two .character-name {
            color: #ffd7d7;
            text-shadow: 0 0 15px rgba(180, 0, 0, 0.5);
            border: 1px solid #9b4a4a;
        }

        .entry-bubble {
            flex: 1 1 auto;
            min-height: 0;
            border-radius: 26px;
            padding: 25px 30px;
            overflow-y: auto;
            scrollbar-width: thin;
            box-sizing: border-box;
           
            &::-webkit-scrollbar {
                width: 8px;
            }
           
            &::-webkit-scrollbar-track {
                background: rgba(0, 0, 0, 0.2);
                border-radius: 10px;
            }
           
            &::-webkit-scrollbar-thumb {
                background: rgba(200, 180, 150, 0.3);
                border-radius: 10px;
                border: 2px solid rgba(0, 0, 0, 0.2);
            }
           
            &::-webkit-scrollbar-thumb:hover {
                background: rgba(200, 180, 150, 0.5);
            }
        }

        .character-one .entry-bubble {
            background: #3a4a36;
            box-shadow: 0 12px 28px rgba(0,0,0,0.2), inset 0 0 35px rgba(0,0,0,0.08);
            color: #e4dbc6;
            scrollbar-color: #9b8a6b #2a3a26;
        }

        .character-two .entry-bubble {
            background: rgba(15,0,0,0.6);
            border: 1px solid rgba(255,255,255,0.08);
            box-shadow: 0 20px 50px rgba(0,0,0,0.8), inset 0 0 50px rgba(150,0,0,0.15);
            color: #f1e7e7;
            scrollbar-color: #a55a5a #2a0a0a;
        }

        .entry {
            font-size: 18px;
            line-height: 1.7;
            white-space: pre-wrap;
            user-select: text;
            padding-right: 5px;
        }

        .character-one .entry {
            font-weight: 400;
            font-size: 18px;
        }

        .character-two .entry {
            font-weight: 500;
            font-size: 22px;
            letter-spacing: 0.2px;
        }

        /* текстурный слой */
        .page::before {
            content: '';
            position: absolute;
            top: 0; left: 0; width: 100%; height: 100%;
            background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="160" height="160" viewBox="0 0 160 160"><filter id="noise2"><feTurbulence baseFrequency="0.9 1.2" numOctaves="2" /><feColorMatrix values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0.25 0"/></filter><rect width="160" height="160" filter="url(%23noise2)" opacity="0.25"/></svg>');
            opacity: 0.2;
            pointer-events: none;
            border-radius: inherit;
            mix-blend-mode: multiply;
        }

        .page-lines {
            position: absolute;
            top: 0; left: 0; width: 100%; height: 100%;
            pointer-events: none;
            z-index: 2;
        }

        .page-num, .page::after {
            display: none;
        }

        .page.flipped-left {
            transform: rotateY(-170deg) translateZ(8px);
            box-shadow: -20px 8px 30px rgba(0,0,0,0.9);
            filter: brightness(0.75) sepia(0.3);
            z-index: 5;
        }

        .page.front-right {
            transform: rotateY(0deg) translateZ(30px);
            z-index: 30;
            box-shadow: 0 15px 35px rgba(0,0,0,0.9), -10px 10px 25px rgba(0,0,0,0.8);
        }

        .page.stack-left {
            transform: rotateY(0deg) translateX(-100%) translateZ(1px);
            opacity: 0;
            pointer-events: none;
            transition: none;
            box-shadow: none;
        }

        .gutter {
            position: absolute;
            width: 14px;
            height: 100%;
            left: 45%;
            top: 0;
            background: radial-gradient(ellipse at center, #3a281c 0%, #1b110a 100%);
            transform: translateX(-50%) rotateY(20deg);
            box-shadow: -3px 0 12px #0f0803, inset 0 0 6px #634b33;
            z-index: 50;
            pointer-events: none;
            border-radius: 20%;
        }

        .nav-panel {
            display: flex;
            align-items: center;
            justify-content: center;
            gap: 40px;
            margin-top: 30px;
            margin-bottom: 10px;
        }

        .nav-btn {
            background: #6b1e1e;
            border: 3px solid #2f140e;
            font-size: 2.1rem;
            font-weight: bold;
            width: 70px;
            height: 70px;
            border-radius: 50%;
            cursor: pointer;
            box-shadow: 0 8px 0 #2e110b, 0 0 15px #520000;
            transition: 0.08s linear;
            color: #f0cfb0;
            display: inline-flex;
            align-items: center;
            justify-content: center;
            font-family: 'Caveat', monospace;
            text-shadow: 0 0 5px #ffb273;
        }

        .nav-btn:active {
            transform: translateY(6px);
            box-shadow: 0 2px 0 #2e110b, 0 0 20px #a13030;
        }

        .nav-btn.disabled {
            opacity: 0.3;
            pointer-events: none;
            box-shadow: 0 4px 0 #2e110b;
            transform: translateY(4px);
            filter: grayscale(0.7);
        }

        .page-indicator {
            background: #281e16;
            padding: 12px 32px;
            border-radius: 60px;
            font-size: 2rem;
            font-weight: bold;
            color: #dbbc96;
            box-shadow: inset 0 3px 10px #0e0804, 0 8px 0 #3e261b, 0 0 15px #4d1f1f;
            font-family: 'Caveat', cursive;
            border: 1px solid #7b4f31;
            min-width: 170px;
            text-align: center;
            text-shadow: 0 0 8px #ab5f2c;
        }

        .footer-note {
            text-align: center;
            color: #ac8a67;
            margin-top: 12px;
            font-family: 'Caveat';
            font-size: 1.4rem;
            letter-spacing: 2px;
            text-shadow: 0 0 8px #3b1c0c;
        }

        @media (max-width: 600px) {
            .book-wrapper {
                padding: 8px;
                border-radius: 4px 16px 16px 4px;
            }
           
            .flip-scene {
                height: 550px;
            }
           
            .page {
                height: 520px;
                padding: 20px 20px 20px 25px;
            }
           
            .page-header {
                flex-direction: column;
                gap: 10px;
                align-items: flex-start;
            }
           
            .entry-bubble {
                padding: 15px;
            }
           
            .nav-btn {
                width: 55px;
                height: 55px;
                font-size: 1.8rem;
            }
           
            .page-indicator {
                padding: 8px 16px;
                font-size: 1.5rem;
                min-width: 130px;
            }
           
            .date-plate {
                font-size: 20px;
                padding: 5px 18px;
            }
           
            .character-name {
                font-size: 24px;
                padding: 5px 18px;
            }
           
            .character-one .entry {
                font-size: 16px;
            }
           
            .character-two .entry {
                font-size: 18px;
            }
        }

        @media (max-width: 400px) {
            .flip-scene {
                height: 500px;
            }
           
            .page {
                height: 470px;
                padding: 15px;
            }
           
            .entry-bubble {
                padding: 12px;
            }
           
            .character-one .entry {
                font-size: 15px;
            }
           
            .character-two .entry {
                font-size: 16px;
            }
        }
    </style>
</head>
<body>
    <div class="book-wrapper">
        <div class="book-interior">
            <div class="flip-scene" id="flipScene">
                <div class="gutter"></div>
            </div>
            <div class="nav-panel">
                <button class="nav-btn" id="prevPageBtn" aria-label="предыдущая страница">◀</button>
                <span class="page-indicator" id="indicator">стр. 1 / 10</span>
                <button class="nav-btn" id="nextPageBtn" aria-label="следующая страница">▶</button>
            </div>
            <div class="footer-note">✦  memento mori  ✦</div>
        </div>
    </div>

    <script>
        (function() {
            const pagesData = [
                {
                    type: 'character-one',
                    name: 'ШОН',
                    date: '12 октября',
                    text: 'Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae pellentesque sem placerat. In id cursus mi pretium tellus duis convallis. Tempus leo eu aenean sed diam urna tempor. Pulvinar vivamus fringilla lacus nec metus bibendum egestas. Iaculis massa nisl malesuada lacinia integer nunc posuere. Ut hendrerit semper vel class aptent taciti sociosqu. Ad litora torquent per conubia nostra inceptos himenaeos.\n\nLorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae pellentesque sem placerat. In id cursus mi pretium tellus duis convallis. Tempus leo eu aenean sed diam urna tempor.\n\nЗарегистрирован: 2013-12-25\nПриглашений: 0\nСообщений: 63\nУважение: +1\nПозитив: +0\n\nПровел на форуме:\n21 час 23 минуты\nIP: 159.148.58.10\n\nАктивен 2 часа 17 минут'
                },
               
                {
                    type: 'character-two',
                    name: 'КЛАЙД',
                    date: '13 октября',
                    text: 'Сегодня ночью спал просто отвратительно. По ощущениям будто кто-то подкинул мне в голову взрывчатку - подкрался, пока я дремал, открыл черепную крышку, сбросил туда всякой дряни, закрыл и убежал со всех ног. Ментальный подкидыш, взрывоопасная бредятина. Причем сон начинался просто чудесно - я, кажется, был на задании или просто развлекался славной "охотой", я отчетливо помню, как пролезал в чье-то тело, подслушивал чужой пульс, окунался в чужие крики, но потом.. потом я полностью потерял контроль над своим телом. Нет, я продолжил начатое, но будто бы уже не по своей воле, я наносил своей жертве увечья, но не там, где хотел их нанести, и пытал ее не теми способами, которыми всегда предпочитал.. Из дирижёра я превратился в обычного зрителя, пусть и посаженного в первых рядах. Очень гадкое ощущение, когда ты, вроде бы, делаешь все то, что хотел сделать изначально, но по чьей-то указке, по чьему-то велению, в совершенно ином, не согласованном с тобой, виде. Я потратил три тысячелетия на то, чтобы двинуть хотя бы пальцем, чтобы сделать хоть что-то самостоятельно, а не лицезреть парализованным истуканом, как льются реки крови из вспоротых глоток. Творить нечто настолько упоительно сладкое и грешное, но не по доброй воле - самое мерзкое, самое унизительное и святотатственное, что можно придумать. Грешить нужно осознанно. По велению своего выбора, своего решения, своей тяги, иначе это просто кукольная постановка, где ты болтаешься на невидимых ниточках, где ты и не убийца даже, а лишь инструмент того, кто в действительности является убийцей. Заснуть снова я так и не смог, однако днем был весьма бодр. Подумаешь, скверный сон. И не такое случалось.'
                },
               
                { type: 'character-one', name: 'ШОН', date: '14 октября', text: 'Сегодня был продуктивный день. Удалось закончить старые дела и даже немного поразмышлять о будущем. Кажется, я на верном пути. Нужно записать несколько идей:\n\n- создать новый ритуал\n- пересмотреть старые записи\n- подготовить ингредиенты' },
               
                { type: 'character-two', name: 'КЛАЙД', date: '15 октября', text: 'Опять этот кошмар. Я снова видел себя со стороны, будто марионетку. Невыносимо чувствовать, что твоими руками кто-то управляет. Три тысячелетия борьбы за свободу воли — и такие сны. Грешить нужно осознанно, иначе это просто кукольный театр. Надо будет завтра поискать способ защитить разум.' },
               
                { type: 'character-one', name: 'ШОН', date: '16 октября', text: 'Список дел:\n• собрать травы\n• наточить перья\n• написать письмо\n• зажечь свечи\n\nПогода сегодня под стать настроению — туман и лёгкий дождь. Самое время для размышлений.' },
               
                { type: 'character-two', name: 'КЛАЙД', date: '17 октября', text: 'Вспомнил один старый рецепт эликсира:\n— корень дягиля\n— полынь\n— железный купорос (щепотка)\nНастаивать всю ночь на растущей луне.\n\nНадо будет проверить, работает ли. И заодно записать ощущения.' },
               
                { type: 'character-one', name: 'ШОН', date: '18 октября', text: 'Сегодня листал старые записи. Интересно, как меняется почерк и мысли со временем. Некоторые идеи кажутся сейчас наивными, но в них есть своя прелесть. Цитата на сегодня: "Мы сами создаём тени, которые нас пугают".' },
               
                { type: 'character-two', name: 'КЛАЙД', date: '19 октября', text: 'Ночь выдалась беспокойной. Снова эти видения. Но на этот раз я смог чуть дольше удержать контроль. Прогресс. Возможно, если тренироваться, смогу полностью управлять снами. Надо записывать каждую деталь.' },
               
                { type: 'character-one', name: 'ШОН', date: '20 февраля', text: 'За окном туман. В комнате пахнет воском и старыми бумагами. Сегодня особенный день. Нужно вспомнить все ритуалы и ничего не упустить. Время течёт так быстро.' },
               
                { type: 'character-two', name: 'КЛАЙД', date: '21 октября', text: 'Последняя запись в этом блокноте. Книга закрывается, но истории остаются. Помни о свете даже в темноте. И помни: твоя воля принадлежит только тебе.' }
            ];

            const totalPages = pagesData.length;
            let currentPageIndex = 0;

            const scene = document.getElementById('flipScene');
            const indicator = document.getElementById('indicator');
            const prevBtn = document.getElementById('prevPageBtn');
            const nextBtn = document.getElementById('nextPageBtn');

            function buildPages() {
                scene.innerHTML = '';
                const gutterDiv = document.createElement('div');
                gutterDiv.className = 'gutter';
                scene.appendChild(gutterDiv);

                pagesData.forEach((data, index) => {
                    const pageDiv = document.createElement('div');
                    pageDiv.className = `page ${data.type}`;
                    pageDiv.setAttribute('data-index', index);

                    const lines = document.createElement('div');
                    lines.className = 'page-lines';
                   
                    const contentDiv = document.createElement('div');
                    contentDiv.className = 'page-content';
                   
                    // Создаём верхнюю плашку с датой и именем
                    const headerDiv = document.createElement('div');
                    headerDiv.className = 'page-header';
                   
                    const datePlate = document.createElement('div');
                    datePlate.className = 'date-plate';
                    datePlate.innerText = data.date;
                   
                    const namePlate = document.createElement('div');
                    namePlate.className = 'character-name';
                    namePlate.innerText = data.name;
                   
                    headerDiv.appendChild(datePlate);
                    headerDiv.appendChild(namePlate);
                   
                    const bubbleDiv = document.createElement('div');
                    bubbleDiv.className = 'entry-bubble';
                   
                    const textDiv = document.createElement('div');
                    textDiv.className = 'entry';
                    textDiv.innerText = data.text;

                    bubbleDiv.appendChild(textDiv);
                    contentDiv.appendChild(headerDiv);
                    contentDiv.appendChild(bubbleDiv);

                    pageDiv.appendChild(lines);
                    pageDiv.appendChild(contentDiv);

                    scene.appendChild(pageDiv);
                });

                updatePagesState();
            }

            function updatePagesState() {
                const pages = document.querySelectorAll('.page');
                pages.forEach((page, idx) => {
                    page.classList.remove('front-right', 'flipped-left', 'stack-left');

                    if (idx === currentPageIndex) {
                        page.classList.add('front-right');
                    } else if (idx < currentPageIndex) {
                        page.classList.add('flipped-left');
                    } else {
                        page.classList.add('stack-left');
                    }
                });
                indicator.innerText = `стр. ${currentPageIndex + 1} / ${totalPages}`;
                prevBtn.classList.toggle('disabled', currentPageIndex === 0);
                nextBtn.classList.toggle('disabled', currentPageIndex === totalPages - 1);
            }

            function nextPage() {
                if (currentPageIndex >= totalPages - 1) return;

                const currentPage = document.querySelector(`.page[data-index="${currentPageIndex}"]`);
                const nextPageElem = document.querySelector(`.page[data-index="${currentPageIndex + 1}"]`);

                if (!currentPage || !nextPageElem) return;

                nextPageElem.classList.remove('stack-left');
                void currentPage.offsetWidth;

                currentPage.classList.remove('front-right');
                currentPage.classList.add('flipped-left');

                nextPageElem.classList.remove('stack-left');
                nextPageElem.classList.add('front-right');

                currentPageIndex++;

                const pages = document.querySelectorAll('.page');
                pages.forEach((page, idx) => {
                    if (idx < currentPageIndex) {
                        page.classList.remove('front-right', 'stack-left');
                        page.classList.add('flipped-left');
                    } else if (idx === currentPageIndex) {
                        // уже обработано
                    } else {
                        page.classList.remove('front-right', 'flipped-left');
                        page.classList.add('stack-left');
                    }
                });

                indicator.innerText = `стр. ${currentPageIndex + 1} / ${totalPages}`;
                prevBtn.classList.toggle('disabled', currentPageIndex === 0);
                nextBtn.classList.toggle('disabled', currentPageIndex === totalPages - 1);
            }

            function prevPage() {
                if (currentPageIndex <= 0) return;

                const currentPage = document.querySelector(`.page[data-index="${currentPageIndex}"]`);
                const prevPageElem = document.querySelector(`.page[data-index="${currentPageIndex - 1}"]`);

                if (!currentPage || !prevPageElem) return;

                prevPageElem.classList.remove('flipped-left', 'stack-left');
                void currentPage.offsetWidth;

                currentPage.classList.remove('front-right');
                currentPage.classList.add('flipped-left');

                prevPageElem.classList.remove('flipped-left', 'stack-left');
                prevPageElem.classList.add('front-right');

                currentPageIndex--;

                const pages = document.querySelectorAll('.page');
                pages.forEach((page, idx) => {
                    if (idx < currentPageIndex) {
                        page.classList.remove('front-right', 'stack-left');
                        page.classList.add('flipped-left');
                    } else if (idx === currentPageIndex) {
                        // front-right
                    } else if (idx > currentPageIndex) {
                        page.classList.remove('front-right', 'flipped-left');
                        page.classList.add('stack-left');
                    }
                });

                indicator.innerText = `стр. ${currentPageIndex + 1} / ${totalPages}`;
                prevBtn.classList.toggle('disabled', currentPageIndex === 0);
                nextBtn.classList.toggle('disabled', currentPageIndex === totalPages - 1);
            }

            buildPages();

            prevBtn.addEventListener('click', prevPage);
            nextBtn.addEventListener('click', nextPage);
        })();
    </script>
</body>
</html>[/html]

75

[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=yes">
    <title>Дневник · Шон и Клайд</title>
    <!-- Подключаем шрифты -->
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Caveat:wght@400;600;700&family=Literata:opsz,wght@7..72,400;7..72,500;7..72,600;7..72,700&family=Cormorant:ital,wght@0,400;0,500;0,600;0,700;1,400;1,500;1,600;1,700&display=swap" rel="stylesheet">
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            user-select: none;
        }

        body {
            min-height: 100vh;
            background: #1c1410;
            display: flex;
            align-items: center;
            justify-content: center;
            padding: 15px;
            perspective: 2600px;
        }

        .book-wrapper {
            width: 100%;
            max-width: 800px;
            border-radius: 8px 24px 24px 8px;
            background: #2b1b12;
            padding: 14px 14px 14px 10px;
            background-image: linear-gradient(145deg, #3f2a1b 0%, #1f130b 80%);
        }

        .book-interior {
            background: #2b1d13;
            border-radius: 6px 20px 20px 6px;
            padding: 20px 20px 20px 14px;
            box-shadow: inset 0 0 15px #0a0603, inset 0 0 0 1px #63482e;
        }

        .flip-scene {
            position: relative;
            width: 100%;
            height: 650px;
            display: flex;
            align-items: center;
            justify-content: center;
            background: transparent;
            transform-style: preserve-3d;
        }

        .page {
            position: absolute;
            width: 90%;
            max-width: 620px;
            height: 620px;
            border-radius: 0 8px 8px 0;
            box-shadow:
                0 10px 20px rgba(0,0,0,0.7),
                -10px 6px 18px rgba(0,0,0,0.8),
                inset 0 -3px 8px rgba(0,0,0,0.6);
            padding: 35px 30px 30px 40px;
            border-left: 4px solid #4f3824;
            border-right: 1px solid #4d3621;
            font-weight: 400;
            line-height: 1.7;
            word-break: break-word;
            backface-visibility: hidden;
            transform-style: preserve-3d;
            transition: transform 0.8s cubic-bezier(0.45, 0.05, 0.2, 0.95);
            cursor: default;
            transform-origin: left center;
            display: flex;
            flex-direction: column;
        }

        /* Тип первый (Шон — зелёный) — Literata + клетка */
        .page.character-one {
            background:
                radial-gradient(circle at 25% 25%, rgba(50, 80, 50, 0.4), transparent 60%),
                linear-gradient(160deg, #3b2f25, #1f3a2a);
            color: #e4dbc6;
            font-family: 'Literata', serif;
            border-left-color: #5b6e4b;
        }

        .page.character-one .page-lines {
            background-image:
                repeating-linear-gradient(transparent 0px, transparent 29px, #9b8a6b 29px, #9b8a6b 30px),
                repeating-linear-gradient(90deg, transparent 0px, transparent 29px, #9b8a6b 29px, #9b8a6b 30px);
            background-size: 30px 30px;
            opacity: 0.25;
        }

        /* Тип второй (Клайд — красный) — Cormorant */
        .page.character-two {
            background:
                radial-gradient(circle at 70% 30%, rgba(120, 0, 0, 0.25), transparent 60%),
                linear-gradient(#130c0c, #0b0505);
            color: #f1e7e7;
            font-family: 'Cormorant', serif;
            border-left-color: #7a3a3a;
        }

        .page.character-two .page-lines {
            background-image: repeating-linear-gradient(transparent 0px, transparent 30px, #a55a5a 30px, #a55a5a 31px);
            opacity: 0.2;
        }

        .page-content {
            position: relative;
            z-index: 5;
            width: 100%;
            flex: 1;
            display: flex;
            flex-direction: column;
            min-height: 0;
            height: 100%;
        }

        /* Верхняя плашка с датой и именем */
        .page-header {
            display: flex;
            align-items: center;
            justify-content: space-between;
            margin-bottom: 15px;
            flex-shrink: 0;
        }

        .date-plate {
            font-size: 25px;
            padding: 8px 24px;
            display: inline-block;
            letter-spacing: 2px;
            text-transform: uppercase;
            background: rgba(0,0,0,0.3);
            backdrop-filter: blur(2px);
            border: 1px solid currentColor;
            font-family: 'Caveat', cursive;
        }

        .character-one .date-plate {
            background: rgba(50,70,40,0.5);
            border-color: rgba(100,120,80,0.8);
            color: #f1f0e6;
            box-shadow: 0 6px 18px rgba(0,0,0,0.12);
        }

        .character-two .date-plate {
            background: linear-gradient(90deg, #6e0f0f, #9b1c1c);
            border: none;
            color: #fff;
            box-shadow: 0 0 20px rgba(180,0,0,0.4), 0 10px 30px rgba(0,0,0,0.6);
        }

        /* Имена персонажей — теперь своими шрифтами */
        .character-name {
            font-size: 32px;
            padding: 8px 24px;
            text-transform: uppercase;
            letter-spacing: 3px;
            background: rgba(0,0,0,0.2);
            backdrop-filter: blur(2px);
            border-radius: 40px;
        }

        .character-one .character-name {
            font-family: 'Literata', serif;
            color: #d4c5a6;
            text-shadow: 0 0 10px rgba(100, 150, 100, 0.5);
            border: 1px solid #8b9a6b;
            font-weight: 600;
        }

        .character-two .character-name {
            font-family: 'Cormorant', serif;
            color: #ffd7d7;
            text-shadow: 0 0 15px rgba(180, 0, 0, 0.5);
            border: 1px solid #9b4a4a;
            font-weight: 700;
            font-style: italic; /* Лёгкий курсив для драматичности */
        }

        .entry-bubble {
            flex: 1 1 auto;
            min-height: 0;
            border-radius: 26px;
            padding: 25px 30px;
            overflow-y: auto;
            scrollbar-width: thin;
            box-sizing: border-box;
           
            &::-webkit-scrollbar {
                width: 8px;
            }
           
            &::-webkit-scrollbar-track {
                background: rgba(0, 0, 0, 0.2);
                border-radius: 10px;
            }
           
            &::-webkit-scrollbar-thumb {
                background: rgba(200, 180, 150, 0.3);
                border-radius: 10px;
                border: 2px solid rgba(0, 0, 0, 0.2);
            }
           
            &::-webkit-scrollbar-thumb:hover {
                background: rgba(200, 180, 150, 0.5);
            }
        }

        .character-one .entry-bubble {
            background: #3a4a36;
            box-shadow: 0 12px 28px rgba(0,0,0,0.2), inset 0 0 35px rgba(0,0,0,0.08);
            color: #e4dbc6;
            scrollbar-color: #9b8a6b #2a3a26;
        }

        .character-two .entry-bubble {
            background: rgba(15,0,0,0.6);
            border: 1px solid rgba(255,255,255,0.08);
            box-shadow: 0 20px 50px rgba(0,0,0,0.8), inset 0 0 50px rgba(150,0,0,0.15);
            color: #f1e7e7;
            scrollbar-color: #a55a5a #2a0a0a;
        }

        .entry {
            font-size: 18px;
            line-height: 1.7;
            white-space: pre-wrap;
            user-select: text;
            padding-right: 5px;
        }

        .character-one .entry {
            font-weight: 400;
            font-size: 18px;
        }

        .character-two .entry {
            font-weight: 500;
            font-size: 22px;
            letter-spacing: 0.2px;
        }

        /* текстурный слой */
        .page::before {
            content: '';
            position: absolute;
            top: 0; left: 0; width: 100%; height: 100%;
            background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="160" height="160" viewBox="0 0 160 160"><filter id="noise2"><feTurbulence baseFrequency="0.9 1.2" numOctaves="2" /><feColorMatrix values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0.25 0"/></filter><rect width="160" height="160" filter="url(%23noise2)" opacity="0.25"/></svg>');
            opacity: 0.2;
            pointer-events: none;
            border-radius: inherit;
            mix-blend-mode: multiply;
        }

        .page-lines {
            position: absolute;
            top: 0; left: 0; width: 100%; height: 100%;
            pointer-events: none;
            z-index: 2;
        }

        .page-num, .page::after {
            display: none;
        }

        .page.flipped-left {
            transform: rotateY(-170deg) translateZ(8px);
            box-shadow: -20px 8px 30px rgba(0,0,0,0.9);
            filter: brightness(0.75) sepia(0.3);
            z-index: 5;
        }

        .page.front-right {
            transform: rotateY(0deg) translateZ(30px);
            z-index: 30;
            box-shadow: 0 15px 35px rgba(0,0,0,0.9), -10px 10px 25px rgba(0,0,0,0.8);
        }

        .page.stack-left {
            transform: rotateY(0deg) translateX(-100%) translateZ(1px);
            opacity: 0;
            pointer-events: none;
            transition: none;
            box-shadow: none;
        }

        .gutter {
            position: absolute;
            width: 14px;
            height: 100%;
            left: 45%;
            top: 0;
            background: radial-gradient(ellipse at center, #3a281c 0%, #1b110a 100%);
            transform: translateX(-50%) rotateY(20deg);
            box-shadow: -3px 0 12px #0f0803, inset 0 0 6px #634b33;
            z-index: 50;
            pointer-events: none;
            border-radius: 20%;
        }

        .nav-panel {
            display: flex;
            align-items: center;
            justify-content: center;
            gap: 40px;
            margin-top: 30px;
            margin-bottom: 10px;
        }

        .nav-btn {
            background: #6b1e1e;
            border: 3px solid #2f140e;
            font-size: 2.1rem;
            font-weight: bold;
            width: 70px;
            height: 70px;
            border-radius: 50%;
            cursor: pointer;
            box-shadow: 0 8px 0 #2e110b, 0 0 15px #520000;
            transition: 0.08s linear;
            color: #f0cfb0;
            display: inline-flex;
            align-items: center;
            justify-content: center;
            font-family: 'Caveat', monospace;
            text-shadow: 0 0 5px #ffb273;
        }

        .nav-btn:active {
            transform: translateY(6px);
            box-shadow: 0 2px 0 #2e110b, 0 0 20px #a13030;
        }

        .nav-btn.disabled {
            opacity: 0.3;
            pointer-events: none;
            box-shadow: 0 4px 0 #2e110b;
            transform: translateY(4px);
            filter: grayscale(0.7);
        }

        .page-indicator {
            background: #281e16;
            padding: 12px 32px;
            border-radius: 60px;
            font-size: 2rem;
            font-weight: bold;
            color: #dbbc96;
            box-shadow: inset 0 3px 10px #0e0804, 0 8px 0 #3e261b, 0 0 15px #4d1f1f;
            font-family: 'Caveat', cursive;
            border: 1px solid #7b4f31;
            min-width: 170px;
            text-align: center;
            text-shadow: 0 0 8px #ab5f2c;
        }

        .footer-note {
            text-align: center;
            color: #ac8a67;
            margin-top: 12px;
            font-family: 'Caveat';
            font-size: 1.4rem;
            letter-spacing: 2px;
            text-shadow: 0 0 8px #3b1c0c;
        }

        @media (max-width: 600px) {
            .book-wrapper {
                padding: 8px;
                border-radius: 4px 16px 16px 4px;
            }
           
            .flip-scene {
                height: 550px;
            }
           
            .page {
                height: 520px;
                padding: 20px 20px 20px 25px;
            }
           
            .page-header {
                flex-direction: column;
                gap: 10px;
                align-items: flex-start;
            }
           
            .entry-bubble {
                padding: 15px;
            }
           
            .nav-btn {
                width: 55px;
                height: 55px;
                font-size: 1.8rem;
            }
           
            .page-indicator {
                padding: 8px 16px;
                font-size: 1.5rem;
                min-width: 130px;
            }
           
            .date-plate {
                font-size: 20px;
                padding: 5px 18px;
            }
           
            .character-name {
                font-size: 24px;
                padding: 5px 18px;
            }
           
            .character-one .entry {
                font-size: 16px;
            }
           
            .character-two .entry {
                font-size: 18px;
            }
        }

        @media (max-width: 400px) {
            .flip-scene {
                height: 500px;
            }
           
            .page {
                height: 470px;
                padding: 15px;
            }
           
            .entry-bubble {
                padding: 12px;
            }
           
            .character-one .entry {
                font-size: 15px;
            }
           
            .character-two .entry {
                font-size: 16px;
            }
        }
    </style>
</head>
<body>
    <div class="book-wrapper">
        <div class="book-interior">
            <div class="flip-scene" id="flipScene">
                <div class="gutter"></div>
            </div>
            <div class="nav-panel">
                <button class="nav-btn" id="prevPageBtn" aria-label="предыдущая страница">◀</button>
                <span class="page-indicator" id="indicator">стр. 1 / 10</span>
                <button class="nav-btn" id="nextPageBtn" aria-label="следующая страница">▶</button>
            </div>
            <div class="footer-note">✦  memento mori  ✦</div>
        </div>
    </div>

    <script>
        (function() {
            const pagesData = [
                {
                    type: 'character-one',
                    name: 'ШОН',
                    date: '12 октября',
                    text: 'Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae pellentesque sem placerat. In id cursus mi pretium tellus duis convallis. Tempus leo eu aenean sed diam urna tempor. Pulvinar vivamus fringilla lacus nec metus bibendum egestas. Iaculis massa nisl malesuada lacinia integer nunc posuere. Ut hendrerit semper vel class aptent taciti sociosqu. Ad litora torquent per conubia nostra inceptos himenaeos.\n\nLorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae pellentesque sem placerat. In id cursus mi pretium tellus duis convallis. Tempus leo eu aenean sed diam urna tempor.\n\nЗарегистрирован: 2013-12-25\nПриглашений: 0\nСообщений: 63\nУважение: +1\nПозитив: +0\n\nПровел на форуме:\n21 час 23 минуты\nIP: 159.148.58.10\n\nАктивен 2 часа 17 минут'
                },
               
                {
                    type: 'character-two',
                    name: 'КЛАЙД',
                    date: '13 октября',
                    text: 'Сегодня ночью спал просто отвратительно. По ощущениям будто кто-то подкинул мне в голову взрывчатку - подкрался, пока я дремал, открыл черепную крышку, сбросил туда всякой дряни, закрыл и убежал со всех ног. Ментальный подкидыш, взрывоопасная бредятина. Причем сон начинался просто чудесно - я, кажется, был на задании или просто развлекался славной "охотой", я отчетливо помню, как пролезал в чье-то тело, подслушивал чужой пульс, окунался в чужие крики, но потом.. потом я полностью потерял контроль над своим телом. Нет, я продолжил начатое, но будто бы уже не по своей воле, я наносил своей жертве увечья, но не там, где хотел их нанести, и пытал ее не теми способами, которыми всегда предпочитал.. Из дирижёра я превратился в обычного зрителя, пусть и посаженного в первых рядах. Очень гадкое ощущение, когда ты, вроде бы, делаешь все то, что хотел сделать изначально, но по чьей-то указке, по чьему-то велению, в совершенно ином, не согласованном с тобой, виде. Я потратил три тысячелетия на то, чтобы двинуть хотя бы пальцем, чтобы сделать хоть что-то самостоятельно, а не лицезреть парализованным истуканом, как льются реки крови из вспоротых глоток. Творить нечто настолько упоительно сладкое и грешное, но не по доброй воле - самое мерзкое, самое унизительное и святотатственное, что можно придумать. Грешить нужно осознанно. По велению своего выбора, своего решения, своей тяги, иначе это просто кукольная постановка, где ты болтаешься на невидимых ниточках, где ты и не убийца даже, а лишь инструмент того, кто в действительности является убийцей. Заснуть снова я так и не смог, однако днем был весьма бодр. Подумаешь, скверный сон. И не такое случалось.'
                },
               
                { type: 'character-one', name: 'ШОН', date: '14 октября', text: 'Сегодня был продуктивный день. Удалось закончить старые дела и даже немного поразмышлять о будущем. Кажется, я на верном пути. Нужно записать несколько идей:\n\n- создать новый ритуал\n- пересмотреть старые записи\n- подготовить ингредиенты' },
               
                { type: 'character-two', name: 'КЛАЙД', date: '15 октября', text: 'Опять этот кошмар. Я снова видел себя со стороны, будто марионетку. Невыносимо чувствовать, что твоими руками кто-то управляет. Три тысячелетия борьбы за свободу воли — и такие сны. Грешить нужно осознанно, иначе это просто кукольный театр. Надо будет завтра поискать способ защитить разум.' },
               
                { type: 'character-one', name: 'ШОН', date: '16 октября', text: 'Список дел:\n• собрать травы\n• наточить перья\n• написать письмо\n• зажечь свечи\n\nПогода сегодня под стать настроению — туман и лёгкий дождь. Самое время для размышлений.' },
               
                { type: 'character-two', name: 'КЛАЙД', date: '17 октября', text: 'Вспомнил один старый рецепт эликсира:\n— корень дягиля\n— полынь\n— железный купорос (щепотка)\nНастаивать всю ночь на растущей луне.\n\nНадо будет проверить, работает ли. И заодно записать ощущения.' },
               
                { type: 'character-one', name: 'ШОН', date: '18 октября', text: 'Сегодня листал старые записи. Интересно, как меняется почерк и мысли со временем. Некоторые идеи кажутся сейчас наивными, но в них есть своя прелесть. Цитата на сегодня: "Мы сами создаём тени, которые нас пугают".' },
               
                { type: 'character-two', name: 'КЛАЙД', date: '19 октября', text: 'Ночь выдалась беспокойной. Снова эти видения. Но на этот раз я смог чуть дольше удержать контроль. Прогресс. Возможно, если тренироваться, смогу полностью управлять снами. Надо записывать каждую деталь.' },
               
                { type: 'character-one', name: 'ШОН', date: '20 февраля', text: 'За окном туман. В комнате пахнет воском и старыми бумагами. Сегодня особенный день. Нужно вспомнить все ритуалы и ничего не упустить. Время течёт так быстро.' },
               
                { type: 'character-two', name: 'КЛАЙД', date: '21 октября', text: 'Последняя запись в этом блокноте. Книга закрывается, но истории остаются. Помни о свете даже в темноте. И помни: твоя воля принадлежит только тебе.' }
            ];

            const totalPages = pagesData.length;
            let currentPageIndex = 0;

            const scene = document.getElementById('flipScene');
            const indicator = document.getElementById('indicator');
            const prevBtn = document.getElementById('prevPageBtn');
            const nextBtn = document.getElementById('nextPageBtn');

            function buildPages() {
                scene.innerHTML = '';
                const gutterDiv = document.createElement('div');
                gutterDiv.className = 'gutter';
                scene.appendChild(gutterDiv);

                pagesData.forEach((data, index) => {
                    const pageDiv = document.createElement('div');
                    pageDiv.className = `page ${data.type}`;
                    pageDiv.setAttribute('data-index', index);

                    const lines = document.createElement('div');
                    lines.className = 'page-lines';
                   
                    const contentDiv = document.createElement('div');
                    contentDiv.className = 'page-content';
                   
                    // Создаём верхнюю плашку с датой и именем
                    const headerDiv = document.createElement('div');
                    headerDiv.className = 'page-header';
                   
                    const datePlate = document.createElement('div');
                    datePlate.className = 'date-plate';
                    datePlate.innerText = data.date;
                   
                    const namePlate = document.createElement('div');
                    namePlate.className = 'character-name';
                    namePlate.innerText = data.name;
                   
                    headerDiv.appendChild(datePlate);
                    headerDiv.appendChild(namePlate);
                   
                    const bubbleDiv = document.createElement('div');
                    bubbleDiv.className = 'entry-bubble';
                   
                    const textDiv = document.createElement('div');
                    textDiv.className = 'entry';
                    textDiv.innerText = data.text;

                    bubbleDiv.appendChild(textDiv);
                    contentDiv.appendChild(headerDiv);
                    contentDiv.appendChild(bubbleDiv);

                    pageDiv.appendChild(lines);
                    pageDiv.appendChild(contentDiv);

                    scene.appendChild(pageDiv);
                });

                updatePagesState();
            }

            function updatePagesState() {
                const pages = document.querySelectorAll('.page');
                pages.forEach((page, idx) => {
                    page.classList.remove('front-right', 'flipped-left', 'stack-left');

                    if (idx === currentPageIndex) {
                        page.classList.add('front-right');
                    } else if (idx < currentPageIndex) {
                        page.classList.add('flipped-left');
                    } else {
                        page.classList.add('stack-left');
                    }
                });
                indicator.innerText = `стр. ${currentPageIndex + 1} / ${totalPages}`;
                prevBtn.classList.toggle('disabled', currentPageIndex === 0);
                nextBtn.classList.toggle('disabled', currentPageIndex === totalPages - 1);
            }

            function nextPage() {
                if (currentPageIndex >= totalPages - 1) return;

                const currentPage = document.querySelector(`.page[data-index="${currentPageIndex}"]`);
                const nextPageElem = document.querySelector(`.page[data-index="${currentPageIndex + 1}"]`);

                if (!currentPage || !nextPageElem) return;

                nextPageElem.classList.remove('stack-left');
                void currentPage.offsetWidth;

                currentPage.classList.remove('front-right');
                currentPage.classList.add('flipped-left');

                nextPageElem.classList.remove('stack-left');
                nextPageElem.classList.add('front-right');

                currentPageIndex++;

                const pages = document.querySelectorAll('.page');
                pages.forEach((page, idx) => {
                    if (idx < currentPageIndex) {
                        page.classList.remove('front-right', 'stack-left');
                        page.classList.add('flipped-left');
                    } else if (idx === currentPageIndex) {
                        // уже обработано
                    } else {
                        page.classList.remove('front-right', 'flipped-left');
                        page.classList.add('stack-left');
                    }
                });

                indicator.innerText = `стр. ${currentPageIndex + 1} / ${totalPages}`;
                prevBtn.classList.toggle('disabled', currentPageIndex === 0);
                nextBtn.classList.toggle('disabled', currentPageIndex === totalPages - 1);
            }

            function prevPage() {
                if (currentPageIndex <= 0) return;

                const currentPage = document.querySelector(`.page[data-index="${currentPageIndex}"]`);
                const prevPageElem = document.querySelector(`.page[data-index="${currentPageIndex - 1}"]`);

                if (!currentPage || !prevPageElem) return;

                prevPageElem.classList.remove('flipped-left', 'stack-left');
                void currentPage.offsetWidth;

                currentPage.classList.remove('front-right');
                currentPage.classList.add('flipped-left');

                prevPageElem.classList.remove('flipped-left', 'stack-left');
                prevPageElem.classList.add('front-right');

                currentPageIndex--;

                const pages = document.querySelectorAll('.page');
                pages.forEach((page, idx) => {
                    if (idx < currentPageIndex) {
                        page.classList.remove('front-right', 'stack-left');
                        page.classList.add('flipped-left');
                    } else if (idx === currentPageIndex) {
                        // front-right
                    } else if (idx > currentPageIndex) {
                        page.classList.remove('front-right', 'flipped-left');
                        page.classList.add('stack-left');
                    }
                });

                indicator.innerText = `стр. ${currentPageIndex + 1} / ${totalPages}`;
                prevBtn.classList.toggle('disabled', currentPageIndex === 0);
                nextBtn.classList.toggle('disabled', currentPageIndex === totalPages - 1);
            }

            buildPages();

            prevBtn.addEventListener('click', prevPage);
            nextBtn.addEventListener('click', nextPage);
        })();
    </script>
</body>
</html>[/html]

76

[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=yes">
    <title>Дневник · Шон и Клайд</title>
    <!-- Подключаем шрифты -->
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Caveat:wght@400;500;600;700&family=Literata:opsz,wght@7..72,300;7..72,400;7..72,500;7..72,600&family=Cormorant:ital,wght@0,300;0,400;0,500;0,600;1,300;1,400;1,500;1,600&display=swap" rel="stylesheet">
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            user-select: none;
        }

        body {
            min-height: 100vh;
            background: #1c1410;
            display: flex;
            align-items: center;
            justify-content: center;
            padding: 15px;
            perspective: 2600px;
        }

        .book-wrapper {
            width: 100%;
            max-width: 800px;
            border-radius: 8px 24px 24px 8px;
            background: #2b1b12;
            padding: 14px 14px 14px 10px;
            background-image: linear-gradient(145deg, #3f2a1b 0%, #1f130b 80%);
        }

        .book-interior {
            background: #2b1d13;
            border-radius: 6px 20px 20px 6px;
            padding: 20px 20px 20px 14px;
            box-shadow: inset 0 0 15px #0a0603, inset 0 0 0 1px #63482e;
        }

        .flip-scene {
            position: relative;
            width: 100%;
            height: 650px;
            display: flex;
            align-items: center;
            justify-content: center;
            background: transparent;
            transform-style: preserve-3d;
        }

        .page {
            position: absolute;
            width: 90%;
            max-width: 620px;
            height: 620px;
            border-radius: 0 8px 8px 0;
            box-shadow:
                0 10px 20px rgba(0,0,0,0.7),
                -10px 6px 18px rgba(0,0,0,0.8),
                inset 0 -3px 8px rgba(0,0,0,0.6);
            padding: 30px 30px 25px 35px;
            border-left: 4px solid #4f3824;
            border-right: 1px solid #4d3621;
            font-weight: 400;
            line-height: 1.6;
            word-break: break-word;
            backface-visibility: hidden;
            transform-style: preserve-3d;
            transition: transform 0.8s cubic-bezier(0.45, 0.05, 0.2, 0.95);
            cursor: default;
            transform-origin: left center;
            display: flex;
            flex-direction: column;
        }

        /* Тип первый (Шон — зелёный) — Literata + клетка */
        .page.character-one {
            background:
                radial-gradient(circle at 25% 25%, rgba(50, 80, 50, 0.3), transparent 60%),
                linear-gradient(160deg, #3b2f25, #1f3a2a);
            color: #e4dbc6;
            font-family: 'Literata', serif;
            border-left-color: #5b6e4b;
        }

        .page.character-one .page-lines {
            background-image:
                repeating-linear-gradient(transparent 0px, transparent 24px, #9b8a6b 24px, #9b8a6b 25px),
                repeating-linear-gradient(90deg, transparent 0px, transparent 24px, #9b8a6b 24px, #9b8a6b 25px);
            background-size: 25px 25px;
            opacity: 0.2;
        }

        /* Тип второй (Клайд — красный) — Cormorant */
        .page.character-two {
            background:
                radial-gradient(circle at 70% 30%, rgba(120, 0, 0, 0.2), transparent 60%),
                linear-gradient(#130c0c, #0b0505);
            color: #f1e7e7;
            font-family: 'Cormorant', serif;
            border-left-color: #7a3a3a;
        }

        .page.character-two .page-lines {
            background-image: repeating-linear-gradient(transparent 0px, transparent 24px, #a55a5a 24px, #a55a5a 25px);
            opacity: 0.15;
        }

        .page-content {
            position: relative;
            z-index: 5;
            width: 100%;
            flex: 1;
            display: flex;
            flex-direction: column;
            min-height: 0;
            height: 100%;
        }

        /* Верхняя плашка с датой и именем — более изящно */
        .page-header {
            display: flex;
            align-items: baseline;
            justify-content: space-between;
            margin-bottom: 20px;
            flex-shrink: 0;
            border-bottom: 1px dashed rgba(200, 180, 150, 0.3);
            padding-bottom: 12px;
        }

        .date-plate {
            font-size: 20px;
            padding: 4px 0;
            letter-spacing: 1px;
            text-transform: uppercase;
            font-family: 'Caveat', cursive;
            font-weight: 500;
            opacity: 0.9;
        }

        .character-one .date-plate {
            color: #c5b69a;
        }

        .character-two .date-plate {
            color: #e0b6b6;
        }

        /* Имена персонажей — своими шрифтами, но тоньше */
        .character-name {
            font-size: 24px;
            text-transform: uppercase;
            letter-spacing: 2px;
            font-weight: 400;
            opacity: 0.95;
        }

        .character-one .character-name {
            font-family: 'Literata', serif;
            color: #d4c5a6;
            font-weight: 400;
            font-style: normal;
            text-shadow: 0 0 8px rgba(80, 120, 80, 0.3);
        }

        .character-two .character-name {
            font-family: 'Cormorant', serif;
            color: #f0c6c6;
            font-weight: 400;
            font-style: italic;
            text-shadow: 0 0 8px rgba(140, 40, 40, 0.3);
        }

        .entry-bubble {
            flex: 1 1 auto;
            min-height: 0;
            border-radius: 16px;
            padding: 18px 22px;
            overflow-y: auto;
            scrollbar-width: thin;
            box-sizing: border-box;
           
            &::-webkit-scrollbar {
                width: 6px;
            }
           
            &::-webkit-scrollbar-track {
                background: rgba(0, 0, 0, 0.15);
                border-radius: 10px;
            }
           
            &::-webkit-scrollbar-thumb {
                background: rgba(200, 180, 150, 0.25);
                border-radius: 10px;
                border: 1px solid rgba(0, 0, 0, 0.2);
            }
           
            &::-webkit-scrollbar-thumb:hover {
                background: rgba(200, 180, 150, 0.4);
            }
        }

        .character-one .entry-bubble {
            background: rgba(58, 74, 54, 0.7);
            backdrop-filter: blur(2px);
            box-shadow: 0 8px 20px rgba(0,0,0,0.2), inset 0 0 25px rgba(0,0,0,0.1);
            color: #e4dbc6;
            scrollbar-color: #8a7a5a #2a3a26;
        }

        .character-two .entry-bubble {
            background: rgba(25, 5, 5, 0.7);
            backdrop-filter: blur(2px);
            border: 1px solid rgba(180, 100, 100, 0.15);
            box-shadow: 0 15px 30px rgba(0,0,0,0.5), inset 0 0 30px rgba(100, 0, 0, 0.1);
            color: #f1e7e7;
            scrollbar-color: #a07070 #2a0a0a;
        }

        .entry {
            line-height: 1.6;
            white-space: pre-wrap;
            user-select: text;
            padding-right: 3px;
        }

        .character-one .entry {
            font-weight: 300;
            font-size: 16px;
        }

        .character-two .entry {
            font-weight: 400;
            font-size: 18px;
            letter-spacing: 0.1px;
        }

        /* текстурный слой */
        .page::before {
            content: '';
            position: absolute;
            top: 0; left: 0; width: 100%; height: 100%;
            background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="160" height="160" viewBox="0 0 160 160"><filter id="noise2"><feTurbulence baseFrequency="0.9 1.2" numOctaves="2" /><feColorMatrix values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0.2 0"/></filter><rect width="160" height="160" filter="url(%23noise2)" opacity="0.2"/></svg>');
            opacity: 0.15;
            pointer-events: none;
            border-radius: inherit;
            mix-blend-mode: multiply;
        }

        .page-lines {
            position: absolute;
            top: 0; left: 0; width: 100%; height: 100%;
            pointer-events: none;
            z-index: 2;
        }

        .page-num, .page::after {
            display: none;
        }

        .page.flipped-left {
            transform: rotateY(-170deg) translateZ(8px);
            box-shadow: -20px 8px 30px rgba(0,0,0,0.9);
            filter: brightness(0.75) sepia(0.3);
            z-index: 5;
        }

        .page.front-right {
            transform: rotateY(0deg) translateZ(30px);
            z-index: 30;
            box-shadow: 0 15px 35px rgba(0,0,0,0.9), -10px 10px 25px rgba(0,0,0,0.8);
        }

        .page.stack-left {
            transform: rotateY(0deg) translateX(-100%) translateZ(1px);
            opacity: 0;
            pointer-events: none;
            transition: none;
            box-shadow: none;
        }

        .gutter {
            position: absolute;
            width: 14px;
            height: 100%;
            left: 45%;
            top: 0;
            background: radial-gradient(ellipse at center, #3a281c 0%, #1b110a 100%);
            transform: translateX(-50%) rotateY(20deg);
            box-shadow: -3px 0 12px #0f0803, inset 0 0 6px #634b33;
            z-index: 50;
            pointer-events: none;
            border-radius: 20%;
        }

        .nav-panel {
            display: flex;
            align-items: center;
            justify-content: center;
            gap: 40px;
            margin-top: 25px;
            margin-bottom: 8px;
        }

        .nav-btn {
            background: #6b1e1e;
            border: 3px solid #2f140e;
            font-size: 1.8rem;
            font-weight: bold;
            width: 60px;
            height: 60px;
            border-radius: 50%;
            cursor: pointer;
            box-shadow: 0 6px 0 #2e110b, 0 0 12px #520000;
            transition: 0.08s linear;
            color: #f0cfb0;
            display: inline-flex;
            align-items: center;
            justify-content: center;
            font-family: 'Caveat', monospace;
            text-shadow: 0 0 5px #ffb273;
        }

        .nav-btn:active {
            transform: translateY(4px);
            box-shadow: 0 2px 0 #2e110b, 0 0 15px #a13030;
        }

        .nav-btn.disabled {
            opacity: 0.3;
            pointer-events: none;
            box-shadow: 0 3px 0 #2e110b;
            transform: translateY(3px);
            filter: grayscale(0.7);
        }

        .page-indicator {
            background: #281e16;
            padding: 10px 28px;
            border-radius: 50px;
            font-size: 1.6rem;
            font-weight: bold;
            color: #dbbc96;
            box-shadow: inset 0 3px 8px #0e0804, 0 6px 0 #3e261b, 0 0 12px #4d1f1f;
            font-family: 'Caveat', cursive;
            border: 1px solid #7b4f31;
            min-width: 150px;
            text-align: center;
            text-shadow: 0 0 6px #ab5f2c;
        }

        .footer-note {
            text-align: center;
            color: #ac8a67;
            margin-top: 10px;
            font-family: 'Caveat';
            font-size: 1.2rem;
            letter-spacing: 2px;
            text-shadow: 0 0 6px #3b1c0c;
        }

        @media (max-width: 600px) {
            .book-wrapper {
                padding: 8px;
                border-radius: 4px 16px 16px 4px;
            }
           
            .flip-scene {
                height: 550px;
            }
           
            .page {
                height: 520px;
                padding: 20px 20px 20px 25px;
            }
           
            .page-header {
                flex-direction: column;
                gap: 5px;
                align-items: flex-start;
                margin-bottom: 15px;
            }
           
            .entry-bubble {
                padding: 12px 15px;
            }
           
            .nav-btn {
                width: 50px;
                height: 50px;
                font-size: 1.6rem;
            }
           
            .page-indicator {
                padding: 6px 14px;
                font-size: 1.4rem;
                min-width: 120px;
            }
           
            .date-plate {
                font-size: 18px;
            }
           
            .character-name {
                font-size: 20px;
            }
           
            .character-one .entry {
                font-size: 15px;
            }
           
            .character-two .entry {
                font-size: 16px;
            }
        }

        @media (max-width: 400px) {
            .flip-scene {
                height: 500px;
            }
           
            .page {
                height: 470px;
                padding: 15px;
            }
           
            .entry-bubble {
                padding: 10px 12px;
            }
           
            .character-one .entry {
                font-size: 14px;
            }
           
            .character-two .entry {
                font-size: 15px;
            }
        }
    </style>
</head>
<body>
    <div class="book-wrapper">
        <div class="book-interior">
            <div class="flip-scene" id="flipScene">
                <div class="gutter"></div>
            </div>
            <div class="nav-panel">
                <button class="nav-btn" id="prevPageBtn" aria-label="предыдущая страница">◀</button>
                <span class="page-indicator" id="indicator">стр. 1 / 10</span>
                <button class="nav-btn" id="nextPageBtn" aria-label="следующая страница">▶</button>
            </div>
            <div class="footer-note">✦ memento mori ✦</div>
        </div>
    </div>

    <script>
        (function() {
            const pagesData = [
                {
                    type: 'character-one',
                    name: 'ШОН',
                    date: '12 октября',
                    text: 'Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae pellentesque sem placerat. In id cursus mi pretium tellus duis convallis. Tempus leo eu aenean sed diam urna tempor. Pulvinar vivamus fringilla lacus nec metus bibendum egestas. Iaculis massa nisl malesuada lacinia integer nunc posuere. Ut hendrerit semper vel class aptent taciti sociosqu. Ad litora torquent per conubia nostra inceptos himenaeos.\n\nLorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae pellentesque sem placerat. In id cursus mi pretium tellus duis convallis. Tempus leo eu aenean sed diam urna tempor.\n\nЗарегистрирован: 2013-12-25\nПриглашений: 0\nСообщений: 63\nУважение: +1\nПозитив: +0\n\nПровел на форуме:\n21 час 23 минуты\nIP: 159.148.58.10\n\nАктивен 2 часа 17 минут'
                },
               
                {
                    type: 'character-two',
                    name: 'КЛАЙД',
                    date: '13 октября',
                    text: 'Сегодня ночью спал просто отвратительно. По ощущениям будто кто-то подкинул мне в голову взрывчатку - подкрался, пока я дремал, открыл черепную крышку, сбросил туда всякой дряни, закрыл и убежал со всех ног. Ментальный подкидыш, взрывоопасная бредятина. Причем сон начинался просто чудесно - я, кажется, был на задании или просто развлекался славной "охотой", я отчетливо помню, как пролезал в чье-то тело, подслушивал чужой пульс, окунался в чужие крики, но потом.. потом я полностью потерял контроль над своим телом. Нет, я продолжил начатое, но будто бы уже не по своей воле, я наносил своей жертве увечья, но не там, где хотел их нанести, и пытал ее не теми способами, которыми всегда предпочитал.. Из дирижёра я превратился в обычного зрителя, пусть и посаженного в первых рядах. Очень гадкое ощущение, когда ты, вроде бы, делаешь все то, что хотел сделать изначально, но по чьей-то указке, по чьему-то велению, в совершенно ином, не согласованном с тобой, виде. Я потратил три тысячелетия на то, чтобы двинуть хотя бы пальцем, чтобы сделать хоть что-то самостоятельно, а не лицезреть парализованным истуканом, как льются реки крови из вспоротых глоток. Творить нечто настолько упоительно сладкое и грешное, но не по доброй воле - самое мерзкое, самое унизительное и святотатственное, что можно придумать. Грешить нужно осознанно. По велению своего выбора, своего решения, своей тяги, иначе это просто кукольная постановка, где ты болтаешься на невидимых ниточках, где ты и не убийца даже, а лишь инструмент того, кто в действительности является убийцей. Заснуть снова я так и не смог, однако днем был весьма бодр. Подумаешь, скверный сон. И не такое случалось.'
                },
               
                { type: 'character-one', name: 'ШОН', date: '14 октября', text: 'Сегодня был продуктивный день. Удалось закончить старые дела и даже немного поразмышлять о будущем. Кажется, я на верном пути. Нужно записать несколько идей:\n\n- создать новый ритуал\n- пересмотреть старые записи\n- подготовить ингредиенты' },
               
                { type: 'character-two', name: 'КЛАЙД', date: '15 октября', text: 'Опять этот кошмар. Я снова видел себя со стороны, будто марионетку. Невыносимо чувствовать, что твоими руками кто-то управляет. Три тысячелетия борьбы за свободу воли — и такие сны. Грешить нужно осознанно, иначе это просто кукольный театр. Надо будет завтра поискать способ защитить разум.' },
               
                { type: 'character-one', name: 'ШОН', date: '16 октября', text: 'Список дел:\n• собрать травы\n• наточить перья\n• написать письмо\n• зажечь свечи\n\nПогода сегодня под стать настроению — туман и лёгкий дождь. Самое время для размышлений.' },
               
                { type: 'character-two', name: 'КЛАЙД', date: '17 октября', text: 'Вспомнил один старый рецепт эликсира:\n— корень дягиля\n— полынь\n— железный купорос (щепотка)\nНастаивать всю ночь на растущей луне.\n\nНадо будет проверить, работает ли. И заодно записать ощущения.' },
               
                { type: 'character-one', name: 'ШОН', date: '18 октября', text: 'Сегодня листал старые записи. Интересно, как меняется почерк и мысли со временем. Некоторые идеи кажутся сейчас наивными, но в них есть своя прелесть. Цитата на сегодня: "Мы сами создаём тени, которые нас пугают".' },
               
                { type: 'character-two', name: 'КЛАЙД', date: '19 октября', text: 'Ночь выдалась беспокойной. Снова эти видения. Но на этот раз я смог чуть дольше удержать контроль. Прогресс. Возможно, если тренироваться, смогу полностью управлять снами. Надо записывать каждую деталь.' },
               
                { type: 'character-one', name: 'ШОН', date: '20 февраля', text: 'За окном туман. В комнате пахнет воском и старыми бумагами. Сегодня особенный день. Нужно вспомнить все ритуалы и ничего не упустить. Время течёт так быстро.' },
               
                { type: 'character-two', name: 'КЛАЙД', date: '21 октября', text: 'Последняя запись в этом блокноте. Книга закрывается, но истории остаются. Помни о свете даже в темноте. И помни: твоя воля принадлежит только тебе.' }
            ];

            const totalPages = pagesData.length;
            let currentPageIndex = 0;

            const scene = document.getElementById('flipScene');
            const indicator = document.getElementById('indicator');
            const prevBtn = document.getElementById('prevPageBtn');
            const nextBtn = document.getElementById('nextPageBtn');

            function buildPages() {
                scene.innerHTML = '';
                const gutterDiv = document.createElement('div');
                gutterDiv.className = 'gutter';
                scene.appendChild(gutterDiv);

                pagesData.forEach((data, index) => {
                    const pageDiv = document.createElement('div');
                    pageDiv.className = `page ${data.type}`;
                    pageDiv.setAttribute('data-index', index);

                    const lines = document.createElement('div');
                    lines.className = 'page-lines';
                   
                    const contentDiv = document.createElement('div');
                    contentDiv.className = 'page-content';
                   
                    const headerDiv = document.createElement('div');
                    headerDiv.className = 'page-header';
                   
                    const datePlate = document.createElement('div');
                    datePlate.className = 'date-plate';
                    datePlate.innerText = data.date;
                   
                    const namePlate = document.createElement('div');
                    namePlate.className = 'character-name';
                    namePlate.innerText = data.name;
                   
                    headerDiv.appendChild(datePlate);
                    headerDiv.appendChild(namePlate);
                   
                    const bubbleDiv = document.createElement('div');
                    bubbleDiv.className = 'entry-bubble';
                   
                    const textDiv = document.createElement('div');
                    textDiv.className = 'entry';
                    textDiv.innerText = data.text;

                    bubbleDiv.appendChild(textDiv);
                    contentDiv.appendChild(headerDiv);
                    contentDiv.appendChild(bubbleDiv);

                    pageDiv.appendChild(lines);
                    pageDiv.appendChild(contentDiv);

                    scene.appendChild(pageDiv);
                });

                updatePagesState();
            }

            function updatePagesState() {
                const pages = document.querySelectorAll('.page');
                pages.forEach((page, idx) => {
                    page.classList.remove('front-right', 'flipped-left', 'stack-left');

                    if (idx === currentPageIndex) {
                        page.classList.add('front-right');
                    } else if (idx < currentPageIndex) {
                        page.classList.add('flipped-left');
                    } else {
                        page.classList.add('stack-left');
                    }
                });
                indicator.innerText = `стр. ${currentPageIndex + 1} / ${totalPages}`;
                prevBtn.classList.toggle('disabled', currentPageIndex === 0);
                nextBtn.classList.toggle('disabled', currentPageIndex === totalPages - 1);
            }

            function nextPage() {
                if (currentPageIndex >= totalPages - 1) return;

                const currentPage = document.querySelector(`.page[data-index="${currentPageIndex}"]`);
                const nextPageElem = document.querySelector(`.page[data-index="${currentPageIndex + 1}"]`);

                if (!currentPage || !nextPageElem) return;

                nextPageElem.classList.remove('stack-left');
                void currentPage.offsetWidth;

                currentPage.classList.remove('front-right');
                currentPage.classList.add('flipped-left');

                nextPageElem.classList.remove('stack-left');
                nextPageElem.classList.add('front-right');

                currentPageIndex++;

                const pages = document.querySelectorAll('.page');
                pages.forEach((page, idx) => {
                    if (idx < currentPageIndex) {
                        page.classList.remove('front-right', 'stack-left');
                        page.classList.add('flipped-left');
                    } else if (idx === currentPageIndex) {
                        // уже обработано
                    } else {
                        page.classList.remove('front-right', 'flipped-left');
                        page.classList.add('stack-left');
                    }
                });

                indicator.innerText = `стр. ${currentPageIndex + 1} / ${totalPages}`;
                prevBtn.classList.toggle('disabled', currentPageIndex === 0);
                nextBtn.classList.toggle('disabled', currentPageIndex === totalPages - 1);
            }

            function prevPage() {
                if (currentPageIndex <= 0) return;

                const currentPage = document.querySelector(`.page[data-index="${currentPageIndex}"]`);
                const prevPageElem = document.querySelector(`.page[data-index="${currentPageIndex - 1}"]`);

                if (!currentPage || !prevPageElem) return;

                prevPageElem.classList.remove('flipped-left', 'stack-left');
                void currentPage.offsetWidth;

                currentPage.classList.remove('front-right');
                currentPage.classList.add('flipped-left');

                prevPageElem.classList.remove('flipped-left', 'stack-left');
                prevPageElem.classList.add('front-right');

                currentPageIndex--;

                const pages = document.querySelectorAll('.page');
                pages.forEach((page, idx) => {
                    if (idx < currentPageIndex) {
                        page.classList.remove('front-right', 'stack-left');
                        page.classList.add('flipped-left');
                    } else if (idx === currentPageIndex) {
                        // front-right
                    } else if (idx > currentPageIndex) {
                        page.classList.remove('front-right', 'flipped-left');
                        page.classList.add('stack-left');
                    }
                });

                indicator.innerText = `стр. ${currentPageIndex + 1} / ${totalPages}`;
                prevBtn.classList.toggle('disabled', currentPageIndex === 0);
                nextBtn.classList.toggle('disabled', currentPageIndex === totalPages - 1);
            }

            buildPages();

            prevBtn.addEventListener('click', prevPage);
            nextBtn.addEventListener('click', nextPage);
        })();
    </script>
</body>
</html>[/html]

77

[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=yes">
    <title>Дневник · два лица</title>
    <!-- Подключаем шрифты -->
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Caveat:wght@400;500;600;700&family=Literata:opsz,wght@7..72,300;7..72,400;7..72,500;7..72,600&family=Cormorant:ital,wght@0,300;0,400;0,500;0,600;1,300;1,400;1,500;1,600&display=swap" rel="stylesheet">
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            user-select: none;
        }

        body {
            min-height: 100vh;
            background: #1c1410;
            display: flex;
            align-items: center;
            justify-content: center;
            padding: 15px;
            perspective: 2600px;
        }

        .book-wrapper {
            width: 100%;
            max-width: 800px;
            border-radius: 8px 24px 24px 8px;
            background: #2b1b12;
            padding: 14px 14px 14px 10px;
            background-image: linear-gradient(145deg, #3f2a1b 0%, #1f130b 80%);
        }

        .book-interior {
            background: #2b1d13;
            border-radius: 6px 20px 20px 6px;
            padding: 20px 20px 20px 14px;
            box-shadow: inset 0 0 15px #0a0603, inset 0 0 0 1px #63482e;
        }

        .flip-scene {
            position: relative;
            width: 100%;
            height: 650px;
            display: flex;
            align-items: center;
            justify-content: center;
            background: transparent;
            transform-style: preserve-3d;
        }

        .page {
            position: absolute;
            width: 90%;
            max-width: 620px;
            height: 620px;
            border-radius: 0 8px 8px 0;
            box-shadow:
                0 10px 20px rgba(0,0,0,0.7),
                -10px 6px 18px rgba(0,0,0,0.8),
                inset 0 -3px 8px rgba(0,0,0,0.6);
            padding: 35px 30px 30px 40px;
            border-left: 4px solid #4f3824;
            border-right: 1px solid #4d3621;
            font-weight: 400;
            line-height: 1.6;
            word-break: break-word;
            backface-visibility: hidden;
            transform-style: preserve-3d;
            transition: transform 0.8s cubic-bezier(0.45, 0.05, 0.2, 0.95);
            cursor: default;
            transform-origin: left center;
            display: flex;
            flex-direction: column;
        }

        /* Тип первый (Шон — зелёный) — Literata + клетка */
        .page.character-one {
            background:
                radial-gradient(circle at 25% 25%, rgba(50, 80, 50, 0.4), transparent 60%),
                linear-gradient(160deg, #3b2f25, #1f3a2a);
            color: #e4dbc6;
            font-family: 'Literata', serif;
            border-left-color: #5b6e4b;
        }

        .page.character-one .page-lines {
            background-image:
                repeating-linear-gradient(transparent 0px, transparent 29px, #9b8a6b 29px, #9b8a6b 30px),
                repeating-linear-gradient(90deg, transparent 0px, transparent 29px, #9b8a6b 29px, #9b8a6b 30px);
            background-size: 30px 30px;
            opacity: 0.2;
        }

        /* Тип второй (Клайд — красный) — Cormorant */
        .page.character-two {
            background:
                radial-gradient(circle at 70% 30%, rgba(120, 0, 0, 0.25), transparent 60%),
                linear-gradient(#130c0c, #0b0505);
            color: #f1e7e7;
            font-family: 'Cormorant', serif;
            border-left-color: #7a3a3a;
        }

        .page.character-two .page-lines {
            background-image: repeating-linear-gradient(transparent 0px, transparent 30px, #a55a5a 30px, #a55a5a 31px);
            opacity: 0.15;
        }

        .page-content {
            position: relative;
            z-index: 5;
            width: 100%;
            flex: 1;
            display: flex;
            flex-direction: column;
            min-height: 0;
            height: 100%;
        }

        /* Большая красивая дата как была */
        .date-plate {
            font-size: 28px;
            padding: 8px 24px;
            margin-bottom: 15px;
            display: inline-block;
            letter-spacing: 2px;
            text-transform: uppercase;
            background: rgba(0,0,0,0.3);
            backdrop-filter: blur(2px);
            border: 1px solid currentColor;
            align-self: flex-start;
            font-family: 'Caveat', cursive;
            flex-shrink: 0;
        }

        .character-one .date-plate {
            background: rgba(50,70,40,0.5);
            border-color: rgba(100,120,80,0.8);
            color: #f1f0e6;
            box-shadow: 0 6px 18px rgba(0,0,0,0.12);
        }

        .character-two .date-plate {
            background: linear-gradient(90deg, #6e0f0f, #9b1c1c);
            border: none;
            color: #fff;
            box-shadow: 0 0 20px rgba(180,0,0,0.4), 0 10px 30px rgba(0,0,0,0.6);
        }

        .entry-bubble {
            flex: 1 1 auto;
            min-height: 0;
            border-radius: 26px;
            padding: 25px 30px;
            overflow-y: auto;
            scrollbar-width: thin;
            box-sizing: border-box;
           
            &::-webkit-scrollbar {
                width: 6px;
            }
           
            &::-webkit-scrollbar-track {
                background: rgba(0, 0, 0, 0.15);
                border-radius: 10px;
            }
           
            &::-webkit-scrollbar-thumb {
                background: rgba(200, 180, 150, 0.25);
                border-radius: 10px;
                border: 1px solid rgba(0, 0, 0, 0.2);
            }
           
            &::-webkit-scrollbar-thumb:hover {
                background: rgba(200, 180, 150, 0.4);
            }
        }

        .character-one .entry-bubble {
            background: #3a4a36;
            box-shadow: 0 12px 28px rgba(0,0,0,0.2), inset 0 0 35px rgba(0,0,0,0.08);
            color: #e4dbc6;
            scrollbar-color: #9b8a6b #2a3a26;
        }

        .character-two .entry-bubble {
            background: rgba(15,0,0,0.6);
            border: 1px solid rgba(255,255,255,0.08);
            box-shadow: 0 20px 50px rgba(0,0,0,0.8), inset 0 0 50px rgba(150,0,0,0.15);
            color: #f1e7e7;
            scrollbar-color: #a55a5a #2a0a0a;
        }

        .entry {
            line-height: 1.7;
            white-space: pre-wrap;
            user-select: text;
            padding-right: 5px;
        }

        .character-one .entry {
            font-weight: 300;
            font-size: 16px;
        }

        .character-two .entry {
            font-weight: 400;
            font-size: 18px;
            letter-spacing: 0.2px;
        }

        /* текстурный слой */
        .page::before {
            content: '';
            position: absolute;
            top: 0; left: 0; width: 100%; height: 100%;
            background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="160" height="160" viewBox="0 0 160 160"><filter id="noise2"><feTurbulence baseFrequency="0.9 1.2" numOctaves="2" /><feColorMatrix values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0.2 0"/></filter><rect width="160" height="160" filter="url(%23noise2)" opacity="0.2"/></svg>');
            opacity: 0.15;
            pointer-events: none;
            border-radius: inherit;
            mix-blend-mode: multiply;
        }

        .page-lines {
            position: absolute;
            top: 0; left: 0; width: 100%; height: 100%;
            pointer-events: none;
            z-index: 2;
        }

        .page-num, .page::after {
            display: none;
        }

        .page.flipped-left {
            transform: rotateY(-170deg) translateZ(8px);
            box-shadow: -20px 8px 30px rgba(0,0,0,0.9);
            filter: brightness(0.75) sepia(0.3);
            z-index: 5;
        }

        .page.front-right {
            transform: rotateY(0deg) translateZ(30px);
            z-index: 30;
            box-shadow: 0 15px 35px rgba(0,0,0,0.9), -10px 10px 25px rgba(0,0,0,0.8);
        }

        .page.stack-left {
            transform: rotateY(0deg) translateX(-100%) translateZ(1px);
            opacity: 0;
            pointer-events: none;
            transition: none;
            box-shadow: none;
        }

        .gutter {
            position: absolute;
            width: 14px;
            height: 100%;
            left: 45%;
            top: 0;
            background: radial-gradient(ellipse at center, #3a281c 0%, #1b110a 100%);
            transform: translateX(-50%) rotateY(20deg);
            box-shadow: -3px 0 12px #0f0803, inset 0 0 6px #634b33;
            z-index: 50;
            pointer-events: none;
            border-radius: 20%;
        }

        .nav-panel {
            display: flex;
            align-items: center;
            justify-content: center;
            gap: 40px;
            margin-top: 30px;
            margin-bottom: 10px;
        }

        .nav-btn {
            background: #6b1e1e;
            border: 3px solid #2f140e;
            font-size: 2rem;
            font-weight: bold;
            width: 65px;
            height: 65px;
            border-radius: 50%;
            cursor: pointer;
            box-shadow: 0 7px 0 #2e110b, 0 0 15px #520000;
            transition: 0.08s linear;
            color: #f0cfb0;
            display: inline-flex;
            align-items: center;
            justify-content: center;
            font-family: 'Caveat', monospace;
            text-shadow: 0 0 5px #ffb273;
        }

        .nav-btn:active {
            transform: translateY(5px);
            box-shadow: 0 2px 0 #2e110b, 0 0 18px #a13030;
        }

        .nav-btn.disabled {
            opacity: 0.3;
            pointer-events: none;
            box-shadow: 0 4px 0 #2e110b;
            transform: translateY(3px);
            filter: grayscale(0.7);
        }

        .page-indicator {
            background: #281e16;
            padding: 10px 28px;
            border-radius: 60px;
            font-size: 1.8rem;
            font-weight: bold;
            color: #dbbc96;
            box-shadow: inset 0 3px 10px #0e0804, 0 6px 0 #3e261b, 0 0 15px #4d1f1f;
            font-family: 'Caveat', cursive;
            border: 1px solid #7b4f31;
            min-width: 160px;
            text-align: center;
            text-shadow: 0 0 8px #ab5f2c;
        }

        .footer-note {
            text-align: center;
            color: #ac8a67;
            margin-top: 12px;
            font-family: 'Caveat';
            font-size: 1.3rem;
            letter-spacing: 2px;
            text-shadow: 0 0 6px #3b1c0c;
        }

        @media (max-width: 600px) {
            .book-wrapper {
                padding: 8px;
                border-radius: 4px 16px 16px 4px;
            }
           
            .flip-scene {
                height: 550px;
            }
           
            .page {
                height: 520px;
                padding: 20px 20px 20px 25px;
            }
           
            .entry-bubble {
                padding: 15px;
            }
           
            .nav-btn {
                width: 55px;
                height: 55px;
                font-size: 1.8rem;
            }
           
            .page-indicator {
                padding: 8px 18px;
                font-size: 1.5rem;
                min-width: 140px;
            }
           
            .date-plate {
                font-size: 24px;
                padding: 6px 20px;
            }
           
            .character-one .entry {
                font-size: 15px;
            }
           
            .character-two .entry {
                font-size: 16px;
            }
        }

        @media (max-width: 400px) {
            .flip-scene {
                height: 500px;
            }
           
            .page {
                height: 470px;
                padding: 15px;
            }
           
            .entry-bubble {
                padding: 12px;
            }
           
            .character-one .entry {
                font-size: 14px;
            }
           
            .character-two .entry {
                font-size: 15px;
            }
        }
    </style>
</head>
<body>
    <div class="book-wrapper">
        <div class="book-interior">
            <div class="flip-scene" id="flipScene">
                <div class="gutter"></div>
            </div>
            <div class="nav-panel">
                <button class="nav-btn" id="prevPageBtn" aria-label="предыдущая страница">◀</button>
                <span class="page-indicator" id="indicator">стр. 1 / 10</span>
                <button class="nav-btn" id="nextPageBtn" aria-label="следующая страница">▶</button>
            </div>
            <div class="footer-note">✦ memento mori ✦</div>
        </div>
    </div>

    <script>
        (function() {
            const pagesData = [
                {
                    type: 'character-one',
                    date: '12 октября',
                    text: 'Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae pellentesque sem placerat. In id cursus mi pretium tellus duis convallis. Tempus leo eu aenean sed diam urna tempor. Pulvinar vivamus fringilla lacus nec metus bibendum egestas. Iaculis massa nisl malesuada lacinia integer nunc posuere. Ut hendrerit semper vel class aptent taciti sociosqu. Ad litora torquent per conubia nostra inceptos himenaeos.\n\nLorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae pellentesque sem placerat. In id cursus mi pretium tellus duis convallis. Tempus leo eu aenean sed diam urna tempor.\n\nЗарегистрирован: 2013-12-25\nПриглашений: 0\nСообщений: 63\nУважение: +1\nПозитив: +0\n\nПровел на форуме:\n21 час 23 минуты\nIP: 159.148.58.10\n\nАктивен 2 часа 17 минут'
                },
               
                {
                    type: 'character-two',
                    date: '13 октября',
                    text: 'Сегодня ночью спал просто отвратительно. По ощущениям будто кто-то подкинул мне в голову взрывчатку - подкрался, пока я дремал, открыл черепную крышку, сбросил туда всякой дряни, закрыл и убежал со всех ног. Ментальный подкидыш, взрывоопасная бредятина. Причем сон начинался просто чудесно - я, кажется, был на задании или просто развлекался славной "охотой", я отчетливо помню, как пролезал в чье-то тело, подслушивал чужой пульс, окунался в чужие крики, но потом.. потом я полностью потерял контроль над своим телом. Нет, я продолжил начатое, но будто бы уже не по своей воле, я наносил своей жертве увечья, но не там, где хотел их нанести, и пытал ее не теми способами, которыми всегда предпочитал.. Из дирижёра я превратился в обычного зрителя, пусть и посаженного в первых рядах. Очень гадкое ощущение, когда ты, вроде бы, делаешь все то, что хотел сделать изначально, но по чьей-то указке, по чьему-то велению, в совершенно ином, не согласованном с тобой, виде. Я потратил три тысячелетия на то, чтобы двинуть хотя бы пальцем, чтобы сделать хоть что-то самостоятельно, а не лицезреть парализованным истуканом, как льются реки крови из вспоротых глоток. Творить нечто настолько упоительно сладкое и грешное, но не по доброй воле - самое мерзкое, самое унизительное и святотатственное, что можно придумать. Грешить нужно осознанно. По велению своего выбора, своего решения, своей тяги, иначе это просто кукольная постановка, где ты болтаешься на невидимых ниточках, где ты и не убийца даже, а лишь инструмент того, кто в действительности является убийцей. Заснуть снова я так и не смог, однако днем был весьма бодр. Подумаешь, скверный сон. И не такое случалось.'
                },
               
                { type: 'character-one', date: '14 октября', text: 'Сегодня был продуктивный день. Удалось закончить старые дела и даже немного поразмышлять о будущем. Кажется, я на верном пути. Нужно записать несколько идей:\n\n- создать новый ритуал\n- пересмотреть старые записи\n- подготовить ингредиенты' },
               
                { type: 'character-two', date: '15 октября', text: 'Опять этот кошмар. Я снова видел себя со стороны, будто марионетку. Невыносимо чувствовать, что твоими руками кто-то управляет. Три тысячелетия борьбы за свободу воли — и такие сны. Грешить нужно осознанно, иначе это просто кукольный театр. Надо будет завтра поискать способ защитить разум.' },
               
                { type: 'character-one', date: '16 октября', text: 'Список дел:\n• собрать травы\n• наточить перья\n• написать письмо\n• зажечь свечи\n\nПогода сегодня под стать настроению — туман и лёгкий дождь. Самое время для размышлений.' },
               
                { type: 'character-two', date: '17 октября', text: 'Вспомнил один старый рецепт эликсира:\n— корень дягиля\n— полынь\n— железный купорос (щепотка)\nНастаивать всю ночь на растущей луне.\n\nНадо будет проверить, работает ли. И заодно записать ощущения.' },
               
                { type: 'character-one', date: '18 октября', text: 'Сегодня листал старые записи. Интересно, как меняется почерк и мысли со временем. Некоторые идеи кажутся сейчас наивными, но в них есть своя прелесть. Цитата на сегодня: "Мы сами создаём тени, которые нас пугают".' },
               
                { type: 'character-two', date: '19 октября', text: 'Ночь выдалась беспокойной. Снова эти видения. Но на этот раз я смог чуть дольше удержать контроль. Прогресс. Возможно, если тренироваться, смогу полностью управлять снами. Надо записывать каждую деталь.' },
               
                { type: 'character-one', date: '20 февраля', text: 'За окном туман. В комнате пахнет воском и старыми бумагами. Сегодня особенный день. Нужно вспомнить все ритуалы и ничего не упустить. Время течёт так быстро.' },
               
                { type: 'character-two', date: '21 октября', text: 'Последняя запись в этом блокноте. Книга закрывается, но истории остаются. Помни о свете даже в темноте. И помни: твоя воля принадлежит только тебе.' }
            ];

            const totalPages = pagesData.length;
            let currentPageIndex = 0;

            const scene = document.getElementById('flipScene');
            const indicator = document.getElementById('indicator');
            const prevBtn = document.getElementById('prevPageBtn');
            const nextBtn = document.getElementById('nextPageBtn');

            function buildPages() {
                scene.innerHTML = '';
                const gutterDiv = document.createElement('div');
                gutterDiv.className = 'gutter';
                scene.appendChild(gutterDiv);

                pagesData.forEach((data, index) => {
                    const pageDiv = document.createElement('div');
                    pageDiv.className = `page ${data.type}`;
                    pageDiv.setAttribute('data-index', index);

                    const lines = document.createElement('div');
                    lines.className = 'page-lines';
                   
                    const contentDiv = document.createElement('div');
                    contentDiv.className = 'page-content';
                   
                    const datePlate = document.createElement('div');
                    datePlate.className = 'date-plate';
                    datePlate.innerText = data.date;
                   
                    const bubbleDiv = document.createElement('div');
                    bubbleDiv.className = 'entry-bubble';
                   
                    const textDiv = document.createElement('div');
                    textDiv.className = 'entry';
                    textDiv.innerText = data.text;

                    bubbleDiv.appendChild(textDiv);
                    contentDiv.appendChild(datePlate);
                    contentDiv.appendChild(bubbleDiv);

                    pageDiv.appendChild(lines);
                    pageDiv.appendChild(contentDiv);

                    scene.appendChild(pageDiv);
                });

                updatePagesState();
            }

            function updatePagesState() {
                const pages = document.querySelectorAll('.page');
                pages.forEach((page, idx) => {
                    page.classList.remove('front-right', 'flipped-left', 'stack-left');

                    if (idx === currentPageIndex) {
                        page.classList.add('front-right');
                    } else if (idx < currentPageIndex) {
                        page.classList.add('flipped-left');
                    } else {
                        page.classList.add('stack-left');
                    }
                });
                indicator.innerText = `стр. ${currentPageIndex + 1} / ${totalPages}`;
                prevBtn.classList.toggle('disabled', currentPageIndex === 0);
                nextBtn.classList.toggle('disabled', currentPageIndex === totalPages - 1);
            }

            function nextPage() {
                if (currentPageIndex >= totalPages - 1) return;

                const currentPage = document.querySelector(`.page[data-index="${currentPageIndex}"]`);
                const nextPageElem = document.querySelector(`.page[data-index="${currentPageIndex + 1}"]`);

                if (!currentPage || !nextPageElem) return;

                nextPageElem.classList.remove('stack-left');
                void currentPage.offsetWidth;

                currentPage.classList.remove('front-right');
                currentPage.classList.add('flipped-left');

                nextPageElem.classList.remove('stack-left');
                nextPageElem.classList.add('front-right');

                currentPageIndex++;

                const pages = document.querySelectorAll('.page');
                pages.forEach((page, idx) => {
                    if (idx < currentPageIndex) {
                        page.classList.remove('front-right', 'stack-left');
                        page.classList.add('flipped-left');
                    } else if (idx === currentPageIndex) {
                        // уже обработано
                    } else {
                        page.classList.remove('front-right', 'flipped-left');
                        page.classList.add('stack-left');
                    }
                });

                indicator.innerText = `стр. ${currentPageIndex + 1} / ${totalPages}`;
                prevBtn.classList.toggle('disabled', currentPageIndex === 0);
                nextBtn.classList.toggle('disabled', currentPageIndex === totalPages - 1);
            }

            function prevPage() {
                if (currentPageIndex <= 0) return;

                const currentPage = document.querySelector(`.page[data-index="${currentPageIndex}"]`);
                const prevPageElem = document.querySelector(`.page[data-index="${currentPageIndex - 1}"]`);

                if (!currentPage || !prevPageElem) return;

                prevPageElem.classList.remove('flipped-left', 'stack-left');
                void currentPage.offsetWidth;

                currentPage.classList.remove('front-right');
                currentPage.classList.add('flipped-left');

                prevPageElem.classList.remove('flipped-left', 'stack-left');
                prevPageElem.classList.add('front-right');

                currentPageIndex--;

                const pages = document.querySelectorAll('.page');
                pages.forEach((page, idx) => {
                    if (idx < currentPageIndex) {
                        page.classList.remove('front-right', 'stack-left');
                        page.classList.add('flipped-left');
                    } else if (idx === currentPageIndex) {
                        // front-right
                    } else if (idx > currentPageIndex) {
                        page.classList.remove('front-right', 'flipped-left');
                        page.classList.add('stack-left');
                    }
                });

                indicator.innerText = `стр. ${currentPageIndex + 1} / ${totalPages}`;
                prevBtn.classList.toggle('disabled', currentPageIndex === 0);
                nextBtn.classList.toggle('disabled', currentPageIndex === totalPages - 1);
            }

            buildPages();

            prevBtn.addEventListener('click', prevPage);
            nextBtn.addEventListener('click', nextPage);
        })();
    </script>
</body>
</html>[/html]

78

[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=yes">
    <title>Дневник · Шон и Клайд</title>
    <!-- Подключаем шрифты -->
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Caveat:wght@400;500;600;700&family=Literata:opsz,wght@7..72,300;7..72,400;7..72,500;7..72,600&family=Cormorant:ital,wght@0,300;0,400;0,500;0,600;1,300;1,400;1,500;1,600&display=swap" rel="stylesheet">
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            user-select: none;
        }

        body {
            min-height: 100vh;
            background: #1c1410;
            display: flex;
            align-items: center;
            justify-content: center;
            padding: 15px;
            perspective: 2600px;
        }

        .book-wrapper {
            width: 100%;
            max-width: 800px;
            border-radius: 8px 24px 24px 8px;
            background: #2b1b12;
            padding: 14px 14px 14px 10px;
            background-image: linear-gradient(145deg, #3f2a1b 0%, #1f130b 80%);
        }

        .book-interior {
            background: #2b1d13;
            border-radius: 6px 20px 20px 6px;
            padding: 20px 20px 20px 14px;
            box-shadow: inset 0 0 15px #0a0603, inset 0 0 0 1px #63482e;
        }

        .flip-scene {
            position: relative;
            width: 100%;
            height: 650px;
            display: flex;
            align-items: center;
            justify-content: center;
            background: transparent;
            transform-style: preserve-3d;
        }

        .page {
            position: absolute;
            width: 90%;
            max-width: 620px;
            height: 620px;
            border-radius: 0 8px 8px 0;
            box-shadow:
                0 10px 20px rgba(0,0,0,0.7),
                -10px 6px 18px rgba(0,0,0,0.8),
                inset 0 -3px 8px rgba(0,0,0,0.6);
            padding: 35px 30px 30px 40px;
            border-left: 4px solid #4f3824;
            border-right: 1px solid #4d3621;
            font-weight: 400;
            line-height: 1.6;
            word-break: break-word;
            backface-visibility: hidden;
            transform-style: preserve-3d;
            transition: transform 0.8s cubic-bezier(0.45, 0.05, 0.2, 0.95);
            cursor: default;
            transform-origin: left center;
            display: flex;
            flex-direction: column;
        }

        /* Тип первый (Шон — зелёный) — Literata + клетка */
        .page.character-one {
            background:
                radial-gradient(circle at 25% 25%, rgba(50, 80, 50, 0.4), transparent 60%),
                linear-gradient(160deg, #3b2f25, #1f3a2a);
            color: #e4dbc6;
            font-family: 'Literata', serif;
            border-left-color: #5b6e4b;
        }

        .page.character-one .page-lines {
            background-image:
                repeating-linear-gradient(transparent 0px, transparent 29px, #9b8a6b 29px, #9b8a6b 30px),
                repeating-linear-gradient(90deg, transparent 0px, transparent 29px, #9b8a6b 29px, #9b8a6b 30px);
            background-size: 30px 30px;
            opacity: 0.2;
        }

        /* Тип второй (Клайд — красный) — Cormorant */
        .page.character-two {
            background:
                radial-gradient(circle at 70% 30%, rgba(120, 0, 0, 0.25), transparent 60%),
                linear-gradient(#130c0c, #0b0505);
            color: #f1e7e7;
            font-family: 'Cormorant', serif;
            border-left-color: #7a3a3a;
        }

        .page.character-two .page-lines {
            background-image: repeating-linear-gradient(transparent 0px, transparent 30px, #a55a5a 30px, #a55a5a 31px);
            opacity: 0.15;
        }

        .page-content {
            position: relative;
            z-index: 5;
            width: 100%;
            flex: 1;
            display: flex;
            flex-direction: column;
            min-height: 0;
            height: 100%;
        }

        /* Верхняя плашка с датой и именем — без пузырей */
        .page-header {
            display: flex;
            align-items: baseline;
            justify-content: space-between;
            margin-bottom: 20px;
            flex-shrink: 0;
            border-bottom: 1px dashed rgba(200, 180, 150, 0.2);
            padding-bottom: 10px;
        }

        .date-plate {
            font-size: 28px;
            padding: 0;
            letter-spacing: 2px;
            text-transform: uppercase;
            font-family: 'Caveat', cursive;
            font-weight: 600;
            background: none;
            backdrop-filter: none;
            border: none;
            box-shadow: none;
            align-self: flex-start;
        }

        .character-one .date-plate {
            color: #d4c5a6;
            text-shadow: 0 2px 5px rgba(0,0,0,0.3);
        }

        .character-two .date-plate {
            color: #f0c6c6;
            text-shadow: 0 2px 5px rgba(0,0,0,0.5);
        }

        /* Имена персонажей — своими шрифтами, без пузырей */
        .character-name {
            font-size: 32px;
            text-transform: uppercase;
            letter-spacing: 3px;
            font-weight: 400;
            background: none;
            backdrop-filter: none;
            border: none;
            box-shadow: none;
            padding: 0;
        }

        .character-one .character-name {
            font-family: 'Literata', serif;
            color: #d4c5a6;
            font-weight: 300;
            font-style: normal;
            text-shadow: 0 2px 5px rgba(0,0,0,0.3);
        }

        .character-two .character-name {
            font-family: 'Cormorant', serif;
            color: #f0c6c6;
            font-weight: 400;
            font-style: italic;
            text-shadow: 0 2px 5px rgba(0,0,0,0.5);
        }

        .entry-bubble {
            flex: 1 1 auto;
            min-height: 0;
            border-radius: 26px;
            padding: 25px 30px;
            overflow-y: auto;
            scrollbar-width: thin;
            box-sizing: border-box;
           
            &::-webkit-scrollbar {
                width: 6px;
            }
           
            &::-webkit-scrollbar-track {
                background: rgba(0, 0, 0, 0.15);
                border-radius: 10px;
            }
           
            &::-webkit-scrollbar-thumb {
                background: rgba(200, 180, 150, 0.25);
                border-radius: 10px;
                border: 1px solid rgba(0, 0, 0, 0.2);
            }
           
            &::-webkit-scrollbar-thumb:hover {
                background: rgba(200, 180, 150, 0.4);
            }
        }

        .character-one .entry-bubble {
            background: #3a4a36;
            box-shadow: 0 12px 28px rgba(0,0,0,0.2), inset 0 0 35px rgba(0,0,0,0.08);
            color: #e4dbc6;
            scrollbar-color: #9b8a6b #2a3a26;
        }

        .character-two .entry-bubble {
            background: rgba(15,0,0,0.6);
            border: 1px solid rgba(255,255,255,0.08);
            box-shadow: 0 20px 50px rgba(0,0,0,0.8), inset 0 0 50px rgba(150,0,0,0.15);
            color: #f1e7e7;
            scrollbar-color: #a55a5a #2a0a0a;
        }

        .entry {
            line-height: 1.7;
            white-space: pre-wrap;
            user-select: text;
            padding-right: 5px;
        }

        .character-one .entry {
            font-weight: 300;
            font-size: 16px;
        }

        .character-two .entry {
            font-weight: 400;
            font-size: 18px;
            letter-spacing: 0.2px;
        }

        /* текстурный слой */
        .page::before {
            content: '';
            position: absolute;
            top: 0; left: 0; width: 100%; height: 100%;
            background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="160" height="160" viewBox="0 0 160 160"><filter id="noise2"><feTurbulence baseFrequency="0.9 1.2" numOctaves="2" /><feColorMatrix values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0.2 0"/></filter><rect width="160" height="160" filter="url(%23noise2)" opacity="0.2"/></svg>');
            opacity: 0.15;
            pointer-events: none;
            border-radius: inherit;
            mix-blend-mode: multiply;
        }

        .page-lines {
            position: absolute;
            top: 0; left: 0; width: 100%; height: 100%;
            pointer-events: none;
            z-index: 2;
        }

        .page-num, .page::after {
            display: none;
        }

        .page.flipped-left {
            transform: rotateY(-170deg) translateZ(8px);
            box-shadow: -20px 8px 30px rgba(0,0,0,0.9);
            filter: brightness(0.75) sepia(0.3);
            z-index: 5;
        }

        .page.front-right {
            transform: rotateY(0deg) translateZ(30px);
            z-index: 30;
            box-shadow: 0 15px 35px rgba(0,0,0,0.9), -10px 10px 25px rgba(0,0,0,0.8);
        }

        .page.stack-left {
            transform: rotateY(0deg) translateX(-100%) translateZ(1px);
            opacity: 0;
            pointer-events: none;
            transition: none;
            box-shadow: none;
        }

        .gutter {
            position: absolute;
            width: 14px;
            height: 100%;
            left: 45%;
            top: 0;
            background: radial-gradient(ellipse at center, #3a281c 0%, #1b110a 100%);
            transform: translateX(-50%) rotateY(20deg);
            box-shadow: -3px 0 12px #0f0803, inset 0 0 6px #634b33;
            z-index: 50;
            pointer-events: none;
            border-radius: 20%;
        }

        .nav-panel {
            display: flex;
            align-items: center;
            justify-content: center;
            gap: 40px;
            margin-top: 30px;
            margin-bottom: 10px;
        }

        .nav-btn {
            background: #6b1e1e;
            border: 3px solid #2f140e;
            font-size: 2rem;
            font-weight: bold;
            width: 65px;
            height: 65px;
            border-radius: 50%;
            cursor: pointer;
            box-shadow: 0 7px 0 #2e110b, 0 0 15px #520000;
            transition: 0.08s linear;
            color: #f0cfb0;
            display: inline-flex;
            align-items: center;
            justify-content: center;
            font-family: 'Caveat', monospace;
            text-shadow: 0 0 5px #ffb273;
        }

        .nav-btn:active {
            transform: translateY(5px);
            box-shadow: 0 2px 0 #2e110b, 0 0 18px #a13030;
        }

        .nav-btn.disabled {
            opacity: 0.3;
            pointer-events: none;
            box-shadow: 0 4px 0 #2e110b;
            transform: translateY(3px);
            filter: grayscale(0.7);
        }

        .page-indicator {
            background: #281e16;
            padding: 10px 28px;
            border-radius: 60px;
            font-size: 1.8rem;
            font-weight: bold;
            color: #dbbc96;
            box-shadow: inset 0 3px 10px #0e0804, 0 6px 0 #3e261b, 0 0 15px #4d1f1f;
            font-family: 'Caveat', cursive;
            border: 1px solid #7b4f31;
            min-width: 160px;
            text-align: center;
            text-shadow: 0 0 8px #ab5f2c;
        }

        .footer-note {
            text-align: center;
            color: #ac8a67;
            margin-top: 12px;
            font-family: 'Caveat';
            font-size: 1.3rem;
            letter-spacing: 2px;
            text-shadow: 0 0 6px #3b1c0c;
        }

        @media (max-width: 600px) {
            .book-wrapper {
                padding: 8px;
                border-radius: 4px 16px 16px 4px;
            }
           
            .flip-scene {
                height: 550px;
            }
           
            .page {
                height: 520px;
                padding: 20px 20px 20px 25px;
            }
           
            .page-header {
                flex-direction: column;
                gap: 5px;
                align-items: flex-start;
                margin-bottom: 15px;
            }
           
            .date-plate {
                font-size: 24px;
            }
           
            .character-name {
                font-size: 28px;
            }
           
            .entry-bubble {
                padding: 15px;
            }
           
            .nav-btn {
                width: 55px;
                height: 55px;
                font-size: 1.8rem;
            }
           
            .page-indicator {
                padding: 8px 18px;
                font-size: 1.5rem;
                min-width: 140px;
            }
           
            .character-one .entry {
                font-size: 15px;
            }
           
            .character-two .entry {
                font-size: 16px;
            }
        }

        @media (max-width: 400px) {
            .flip-scene {
                height: 500px;
            }
           
            .page {
                height: 470px;
                padding: 15px;
            }
           
            .entry-bubble {
                padding: 12px;
            }
           
            .character-one .entry {
                font-size: 14px;
            }
           
            .character-two .entry {
                font-size: 15px;
            }
        }
    </style>
</head>
<body>
    <div class="book-wrapper">
        <div class="book-interior">
            <div class="flip-scene" id="flipScene">
                <div class="gutter"></div>
            </div>
            <div class="nav-panel">
                <button class="nav-btn" id="prevPageBtn" aria-label="предыдущая страница">◀</button>
                <span class="page-indicator" id="indicator">стр. 1 / 10</span>
                <button class="nav-btn" id="nextPageBtn" aria-label="следующая страница">▶</button>
            </div>
            <div class="footer-note">✦ memento mori ✦</div>
        </div>
    </div>

    <script>
        (function() {
            const pagesData = [
                {
                    type: 'character-one',
                    name: 'ШОН',
                    date: '12 октября',
                    text: 'Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae pellentesque sem placerat. In id cursus mi pretium tellus duis convallis. Tempus leo eu aenean sed diam urna tempor. Pulvinar vivamus fringilla lacus nec metus bibendum egestas. Iaculis massa nisl malesuada lacinia integer nunc posuere. Ut hendrerit semper vel class aptent taciti sociosqu. Ad litora torquent per conubia nostra inceptos himenaeos.\n\nLorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae pellentesque sem placerat. In id cursus mi pretium tellus duis convallis. Tempus leo eu aenean sed diam urna tempor.\n\nЗарегистрирован: 2013-12-25\nПриглашений: 0\nСообщений: 63\nУважение: +1\nПозитив: +0\n\nПровел на форуме:\n21 час 23 минуты\nIP: 159.148.58.10\n\nАктивен 2 часа 17 минут'
                },
               
                {
                    type: 'character-two',
                    name: 'КЛАЙД',
                    date: '13 октября',
                    text: 'Сегодня ночью спал просто отвратительно. По ощущениям будто кто-то подкинул мне в голову взрывчатку - подкрался, пока я дремал, открыл черепную крышку, сбросил туда всякой дряни, закрыл и убежал со всех ног. Ментальный подкидыш, взрывоопасная бредятина. Причем сон начинался просто чудесно - я, кажется, был на задании или просто развлекался славной "охотой", я отчетливо помню, как пролезал в чье-то тело, подслушивал чужой пульс, окунался в чужие крики, но потом.. потом я полностью потерял контроль над своим телом. Нет, я продолжил начатое, но будто бы уже не по своей воле, я наносил своей жертве увечья, но не там, где хотел их нанести, и пытал ее не теми способами, которыми всегда предпочитал.. Из дирижёра я превратился в обычного зрителя, пусть и посаженного в первых рядах. Очень гадкое ощущение, когда ты, вроде бы, делаешь все то, что хотел сделать изначально, но по чьей-то указке, по чьему-то велению, в совершенно ином, не согласованном с тобой, виде. Я потратил три тысячелетия на то, чтобы двинуть хотя бы пальцем, чтобы сделать хоть что-то самостоятельно, а не лицезреть парализованным истуканом, как льются реки крови из вспоротых глоток. Творить нечто настолько упоительно сладкое и грешное, но не по доброй воле - самое мерзкое, самое унизительное и святотатственное, что можно придумать. Грешить нужно осознанно. По велению своего выбора, своего решения, своей тяги, иначе это просто кукольная постановка, где ты болтаешься на невидимых ниточках, где ты и не убийца даже, а лишь инструмент того, кто в действительности является убийцей. Заснуть снова я так и не смог, однако днем был весьма бодр. Подумаешь, скверный сон. И не такое случалось.'
                },
               
                { type: 'character-one', name: 'ШОН', date: '14 октября', text: 'Сегодня был продуктивный день. Удалось закончить старые дела и даже немного поразмышлять о будущем. Кажется, я на верном пути. Нужно записать несколько идей:\n\n- создать новый ритуал\n- пересмотреть старые записи\n- подготовить ингредиенты' },
               
                { type: 'character-two', name: 'КЛАЙД', date: '15 октября', text: 'Опять этот кошмар. Я снова видел себя со стороны, будто марионетку. Невыносимо чувствовать, что твоими руками кто-то управляет. Три тысячелетия борьбы за свободу воли — и такие сны. Грешить нужно осознанно, иначе это просто кукольный театр. Надо будет завтра поискать способ защитить разум.' },
               
                { type: 'character-one', name: 'ШОН', date: '16 октября', text: 'Список дел:\n• собрать травы\n• наточить перья\n• написать письмо\n• зажечь свечи\n\nПогода сегодня под стать настроению — туман и лёгкий дождь. Самое время для размышлений.' },
               
                { type: 'character-two', name: 'КЛАЙД', date: '17 октября', text: 'Вспомнил один старый рецепт эликсира:\n— корень дягиля\n— полынь\n— железный купорос (щепотка)\nНастаивать всю ночь на растущей луне.\n\nНадо будет проверить, работает ли. И заодно записать ощущения.' },
               
                { type: 'character-one', name: 'ШОН', date: '18 октября', text: 'Сегодня листал старые записи. Интересно, как меняется почерк и мысли со временем. Некоторые идеи кажутся сейчас наивными, но в них есть своя прелесть. Цитата на сегодня: "Мы сами создаём тени, которые нас пугают".' },
               
                { type: 'character-two', name: 'КЛАЙД', date: '19 октября', text: 'Ночь выдалась беспокойной. Снова эти видения. Но на этот раз я смог чуть дольше удержать контроль. Прогресс. Возможно, если тренироваться, смогу полностью управлять снами. Надо записывать каждую деталь.' },
               
                { type: 'character-one', name: 'ШОН', date: '20 февраля', text: 'За окном туман. В комнате пахнет воском и старыми бумагами. Сегодня особенный день. Нужно вспомнить все ритуалы и ничего не упустить. Время течёт так быстро.' },
               
                { type: 'character-two', name: 'КЛАЙД', date: '21 октября', text: 'Последняя запись в этом блокноте. Книга закрывается, но истории остаются. Помни о свете даже в темноте. И помни: твоя воля принадлежит только тебе.' }
            ];

            const totalPages = pagesData.length;
            let currentPageIndex = 0;

            const scene = document.getElementById('flipScene');
            const indicator = document.getElementById('indicator');
            const prevBtn = document.getElementById('prevPageBtn');
            const nextBtn = document.getElementById('nextPageBtn');

            function buildPages() {
                scene.innerHTML = '';
                const gutterDiv = document.createElement('div');
                gutterDiv.className = 'gutter';
                scene.appendChild(gutterDiv);

                pagesData.forEach((data, index) => {
                    const pageDiv = document.createElement('div');
                    pageDiv.className = `page ${data.type}`;
                    pageDiv.setAttribute('data-index', index);

                    const lines = document.createElement('div');
                    lines.className = 'page-lines';
                   
                    const contentDiv = document.createElement('div');
                    contentDiv.className = 'page-content';
                   
                    // Создаём верхнюю плашку с датой и именем
                    const headerDiv = document.createElement('div');
                    headerDiv.className = 'page-header';
                   
                    const datePlate = document.createElement('div');
                    datePlate.className = 'date-plate';
                    datePlate.innerText = data.date;
                   
                    const namePlate = document.createElement('div');
                    namePlate.className = 'character-name';
                    namePlate.innerText = data.name;
                   
                    headerDiv.appendChild(datePlate);
                    headerDiv.appendChild(namePlate);
                   
                    const bubbleDiv = document.createElement('div');
                    bubbleDiv.className = 'entry-bubble';
                   
                    const textDiv = document.createElement('div');
                    textDiv.className = 'entry';
                    textDiv.innerText = data.text;

                    bubbleDiv.appendChild(textDiv);
                    contentDiv.appendChild(headerDiv);
                    contentDiv.appendChild(bubbleDiv);

                    pageDiv.appendChild(lines);
                    pageDiv.appendChild(contentDiv);

                    scene.appendChild(pageDiv);
                });

                updatePagesState();
            }

            function updatePagesState() {
                const pages = document.querySelectorAll('.page');
                pages.forEach((page, idx) => {
                    page.classList.remove('front-right', 'flipped-left', 'stack-left');

                    if (idx === currentPageIndex) {
                        page.classList.add('front-right');
                    } else if (idx < currentPageIndex) {
                        page.classList.add('flipped-left');
                    } else {
                        page.classList.add('stack-left');
                    }
                });
                indicator.innerText = `стр. ${currentPageIndex + 1} / ${totalPages}`;
                prevBtn.classList.toggle('disabled', currentPageIndex === 0);
                nextBtn.classList.toggle('disabled', currentPageIndex === totalPages - 1);
            }

            function nextPage() {
                if (currentPageIndex >= totalPages - 1) return;

                const currentPage = document.querySelector(`.page[data-index="${currentPageIndex}"]`);
                const nextPageElem = document.querySelector(`.page[data-index="${currentPageIndex + 1}"]`);

                if (!currentPage || !nextPageElem) return;

                nextPageElem.classList.remove('stack-left');
                void currentPage.offsetWidth;

                currentPage.classList.remove('front-right');
                currentPage.classList.add('flipped-left');

                nextPageElem.classList.remove('stack-left');
                nextPageElem.classList.add('front-right');

                currentPageIndex++;

                const pages = document.querySelectorAll('.page');
                pages.forEach((page, idx) => {
                    if (idx < currentPageIndex) {
                        page.classList.remove('front-right', 'stack-left');
                        page.classList.add('flipped-left');
                    } else if (idx === currentPageIndex) {
                        // уже обработано
                    } else {
                        page.classList.remove('front-right', 'flipped-left');
                        page.classList.add('stack-left');
                    }
                });

                indicator.innerText = `стр. ${currentPageIndex + 1} / ${totalPages}`;
                prevBtn.classList.toggle('disabled', currentPageIndex === 0);
                nextBtn.classList.toggle('disabled', currentPageIndex === totalPages - 1);
            }

            function prevPage() {
                if (currentPageIndex <= 0) return;

                const currentPage = document.querySelector(`.page[data-index="${currentPageIndex}"]`);
                const prevPageElem = document.querySelector(`.page[data-index="${currentPageIndex - 1}"]`);

                if (!currentPage || !prevPageElem) return;

                prevPageElem.classList.remove('flipped-left', 'stack-left');
                void currentPage.offsetWidth;

                currentPage.classList.remove('front-right');
                currentPage.classList.add('flipped-left');

                prevPageElem.classList.remove('flipped-left', 'stack-left');
                prevPageElem.classList.add('front-right');

                currentPageIndex--;

                const pages = document.querySelectorAll('.page');
                pages.forEach((page, idx) => {
                    if (idx < currentPageIndex) {
                        page.classList.remove('front-right', 'stack-left');
                        page.classList.add('flipped-left');
                    } else if (idx === currentPageIndex) {
                        // front-right
                    } else if (idx > currentPageIndex) {
                        page.classList.remove('front-right', 'flipped-left');
                        page.classList.add('stack-left');
                    }
                });

                indicator.innerText = `стр. ${currentPageIndex + 1} / ${totalPages}`;
                prevBtn.classList.toggle('disabled', currentPageIndex === 0);
                nextBtn.classList.toggle('disabled', currentPageIndex === totalPages - 1);
            }

            buildPages();

            prevBtn.addEventListener('click', prevPage);
            nextBtn.addEventListener('click', nextPage);
        })();
    </script>
</body>
</html>[/html]

79

[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=yes">
    <title>Дневник · Шон и Клайд</title>
    <!-- Подключаем шрифты -->
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Caveat:wght@400;600;700&family=Literata:opsz,wght@7..72,400;7..72,500;7..72,600;7..72,700&family=Cormorant:ital,wght@0,400;0,500;0,600;0,700;1,400;1,500;1,600;1,700&display=swap" rel="stylesheet">
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            user-select: none;
        }

        body {
            min-height: 100vh;
            background: #1c1410;
            display: flex;
            align-items: center;
            justify-content: center;
            padding: 15px;
            perspective: 2600px;
        }

        .book-wrapper {
            width: 100%;
            max-width: 800px;
            border-radius: 8px 24px 24px 8px;
            background: #2b1b12;
            padding: 14px 14px 14px 10px;
            background-image: linear-gradient(145deg, #3f2a1b 0%, #1f130b 80%);
        }

        .book-interior {
            background: #2b1d13;
            border-radius: 6px 20px 20px 6px;
            padding: 20px 20px 20px 14px;
            box-shadow: inset 0 0 15px #0a0603, inset 0 0 0 1px #63482e;
        }

        .flip-scene {
            position: relative;
            width: 100%;
            height: 650px;
            display: flex;
            align-items: center;
            justify-content: center;
            background: transparent;
            transform-style: preserve-3d;
        }

        .page {
            position: absolute;
            width: 90%;
            max-width: 620px;
            height: 620px;
            border-radius: 0 8px 8px 0;
            box-shadow:
                0 10px 20px rgba(0,0,0,0.7),
                -10px 6px 18px rgba(0,0,0,0.8),
                inset 0 -3px 8px rgba(0,0,0,0.6);
            padding: 35px 30px 30px 40px;
            border-left: 4px solid #4f3824;
            border-right: 1px solid #4d3621;
            font-weight: 400;
            line-height: 1.7;
            word-break: break-word;
            backface-visibility: hidden;
            transform-style: preserve-3d;
            transition: transform 0.8s cubic-bezier(0.45, 0.05, 0.2, 0.95);
            cursor: default;
            transform-origin: left center;
            display: flex;
            flex-direction: column;
        }

        /* Тип первый (Шон — зелёный) — Literata + клетка */
        .page.character-one {
            background:
                radial-gradient(circle at 25% 25%, rgba(50, 80, 50, 0.4), transparent 60%),
                linear-gradient(160deg, #3b2f25, #1f3a2a);
            color: #e4dbc6;
            font-family: 'Literata', serif;
            border-left-color: #5b6e4b;
        }

        .page.character-one .page-lines {
            background-image:
                repeating-linear-gradient(transparent 0px, transparent 29px, #9b8a6b 29px, #9b8a6b 30px),
                repeating-linear-gradient(90deg, transparent 0px, transparent 29px, #9b8a6b 29px, #9b8a6b 30px);
            background-size: 30px 30px;
            opacity: 0.25;
        }

        /* Тип второй (Клайд — красный) — Cormorant */
        .page.character-two {
            background:
                radial-gradient(circle at 70% 30%, rgba(120, 0, 0, 0.25), transparent 60%),
                linear-gradient(#130c0c, #0b0505);
            color: #f1e7e7;
            font-family: 'Cormorant', serif;
            border-left-color: #7a3a3a;
        }

        .page.character-two .page-lines {
            background-image: repeating-linear-gradient(transparent 0px, transparent 30px, #a55a5a 30px, #a55a5a 31px);
            opacity: 0.2;
        }

        .page-content {
            position: relative;
            z-index: 5;
            width: 100%;
            flex: 1;
            display: flex;
            flex-direction: column;
            min-height: 0;
            height: 100%;
        }

        /* Верхняя плашка с датой и именем */
        .page-header {
            display: flex;
            align-items: center;
            justify-content: space-between;
            margin-bottom: 15px;
            flex-shrink: 0;
        }

        /* Дата — с бабблом, как было */
        .date-plate {
            font-size: 25px;
            padding: 8px 24px;
            display: inline-block;
            letter-spacing: 2px;
            text-transform: uppercase;
            background: rgba(0,0,0,0.3);
            backdrop-filter: blur(2px);
            border: 1px solid currentColor;
            font-family: 'Caveat', cursive;
        }

        .character-one .date-plate {
            background: rgba(50,70,40,0.5);
            border-color: rgba(100,120,80,0.8);
            color: #f1f0e6;
            box-shadow: 0 6px 18px rgba(0,0,0,0.12);
        }

        .character-two .date-plate {
            background: linear-gradient(90deg, #6e0f0f, #9b1c1c);
            border: none;
            color: #fff;
            box-shadow: 0 0 20px rgba(180,0,0,0.4), 0 10px 30px rgba(0,0,0,0.6);
        }

        /* Имена — без бабблов */
        .character-name {
            font-size: 30px;
            padding: 8px 24px;
            font-family: 'Caveat', cursive;
            text-transform: uppercase;
            letter-spacing: 3px;
            /* Убираем все стили баббла */
            background: none;
            backdrop-filter: none;
            border: none;
            box-shadow: none;
            border-radius: 0;
        }

        .character-one .character-name {
            color: #d4c5a6;
            text-shadow: 0 0 10px rgba(100, 150, 100, 0.5);
        }

        .character-two .character-name {
            color: #ffd7d7;
            text-shadow: 0 0 15px rgba(180, 0, 0, 0.5);
        }

        .entry-bubble {
            flex: 1 1 auto;
            min-height: 0;
            border-radius: 26px;
            padding: 25px 30px;
            overflow-y: auto;
            scrollbar-width: thin;
            box-sizing: border-box;
           
            &::-webkit-scrollbar {
                width: 8px;
            }
           
            &::-webkit-scrollbar-track {
                background: rgba(0, 0, 0, 0.2);
                border-radius: 10px;
            }
           
            &::-webkit-scrollbar-thumb {
                background: rgba(200, 180, 150, 0.3);
                border-radius: 10px;
                border: 2px solid rgba(0, 0, 0, 0.2);
            }
           
            &::-webkit-scrollbar-thumb:hover {
                background: rgba(200, 180, 150, 0.5);
            }
        }

        .character-one .entry-bubble {
            background: #3a4a36;
            box-shadow: 0 12px 28px rgba(0,0,0,0.2), inset 0 0 35px rgba(0,0,0,0.08);
            color: #e4dbc6;
            scrollbar-color: #9b8a6b #2a3a26;
        }

        .character-two .entry-bubble {
            background: rgba(15,0,0,0.6);
            border: 1px solid rgba(255,255,255,0.08);
            box-shadow: 0 20px 50px rgba(0,0,0,0.8), inset 0 0 50px rgba(150,0,0,0.15);
            color: #f1e7e7;
            scrollbar-color: #a55a5a #2a0a0a;
        }

        .entry {
            font-size: 18px;
            line-height: 1.7;
            white-space: pre-wrap;
            user-select: text;
            padding-right: 5px;
        }

        .character-one .entry {
            font-weight: 400;
            font-size: 18px;
        }

        .character-two .entry {
            font-weight: 500;
            font-size: 22px;
            letter-spacing: 0.2px;
        }

        /* текстурный слой */
        .page::before {
            content: '';
            position: absolute;
            top: 0; left: 0; width: 100%; height: 100%;
            background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="160" height="160" viewBox="0 0 160 160"><filter id="noise2"><feTurbulence baseFrequency="0.9 1.2" numOctaves="2" /><feColorMatrix values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0.25 0"/></filter><rect width="160" height="160" filter="url(%23noise2)" opacity="0.25"/></svg>');
            opacity: 0.2;
            pointer-events: none;
            border-radius: inherit;
            mix-blend-mode: multiply;
        }

        .page-lines {
            position: absolute;
            top: 0; left: 0; width: 100%; height: 100%;
            pointer-events: none;
            z-index: 2;
        }

        .page-num, .page::after {
            display: none;
        }

        .page.flipped-left {
            transform: rotateY(-170deg) translateZ(8px);
            box-shadow: -20px 8px 30px rgba(0,0,0,0.9);
            filter: brightness(0.75) sepia(0.3);
            z-index: 5;
        }

        .page.front-right {
            transform: rotateY(0deg) translateZ(30px);
            z-index: 30;
            box-shadow: 0 15px 35px rgba(0,0,0,0.9), -10px 10px 25px rgba(0,0,0,0.8);
        }

        .page.stack-left {
            transform: rotateY(0deg) translateX(-100%) translateZ(1px);
            opacity: 0;
            pointer-events: none;
            transition: none;
            box-shadow: none;
        }

        .gutter {
            position: absolute;
            width: 14px;
            height: 100%;
            left: 45%;
            top: 0;
            background: radial-gradient(ellipse at center, #3a281c 0%, #1b110a 100%);
            transform: translateX(-50%) rotateY(20deg);
            box-shadow: -3px 0 12px #0f0803, inset 0 0 6px #634b33;
            z-index: 50;
            pointer-events: none;
            border-radius: 20%;
        }

        .nav-panel {
            display: flex;
            align-items: center;
            justify-content: center;
            gap: 40px;
            margin-top: 30px;
            margin-bottom: 10px;
        }

        .nav-btn {
            background: #6b1e1e;
            border: 3px solid #2f140e;
            font-size: 2.1rem;
            font-weight: bold;
            width: 70px;
            height: 70px;
            border-radius: 50%;
            cursor: pointer;
            box-shadow: 0 8px 0 #2e110b, 0 0 15px #520000;
            transition: 0.08s linear;
            color: #f0cfb0;
            display: inline-flex;
            align-items: center;
            justify-content: center;
            font-family: 'Caveat', monospace;
            text-shadow: 0 0 5px #ffb273;
        }

        .nav-btn:active {
            transform: translateY(6px);
            box-shadow: 0 2px 0 #2e110b, 0 0 20px #a13030;
        }

        .nav-btn.disabled {
            opacity: 0.3;
            pointer-events: none;
            box-shadow: 0 4px 0 #2e110b;
            transform: translateY(4px);
            filter: grayscale(0.7);
        }

        .page-indicator {
            background: #281e16;
            padding: 12px 32px;
            border-radius: 60px;
            font-size: 2rem;
            font-weight: bold;
            color: #dbbc96;
            box-shadow: inset 0 3px 10px #0e0804, 0 8px 0 #3e261b, 0 0 15px #4d1f1f;
            font-family: 'Caveat', cursive;
            border: 1px solid #7b4f31;
            min-width: 170px;
            text-align: center;
            text-shadow: 0 0 8px #ab5f2c;
        }

        .footer-note {
            text-align: center;
            color: #ac8a67;
            margin-top: 12px;
            font-family: 'Caveat';
            font-size: 1.4rem;
            letter-spacing: 2px;
            text-shadow: 0 0 8px #3b1c0c;
        }

        @media (max-width: 600px) {
            .book-wrapper {
                padding: 8px;
                border-radius: 4px 16px 16px 4px;
            }
           
            .flip-scene {
                height: 550px;
            }
           
            .page {
                height: 520px;
                padding: 20px 20px 20px 25px;
            }
           
            .page-header {
                flex-direction: column;
                gap: 10px;
                align-items: flex-start;
            }
           
            .entry-bubble {
                padding: 15px;
            }
           
            .nav-btn {
                width: 55px;
                height: 55px;
                font-size: 1.8rem;
            }
           
            .page-indicator {
                padding: 8px 16px;
                font-size: 1.5rem;
                min-width: 130px;
            }
           
            .date-plate {
                font-size: 20px;
                padding: 5px 18px;
            }
           
            .character-name {
                font-size: 24px;
                padding: 5px 18px;
            }
           
            .character-one .entry {
                font-size: 16px;
            }
           
            .character-two .entry {
                font-size: 18px;
            }
        }

        @media (max-width: 400px) {
            .flip-scene {
                height: 500px;
            }
           
            .page {
                height: 470px;
                padding: 15px;
            }
           
            .entry-bubble {
                padding: 12px;
            }
           
            .character-one .entry {
                font-size: 15px;
            }
           
            .character-two .entry {
                font-size: 16px;
            }
        }
    </style>
</head>
<body>
    <div class="book-wrapper">
        <div class="book-interior">
            <div class="flip-scene" id="flipScene">
                <div class="gutter"></div>
            </div>
            <div class="nav-panel">
                <button class="nav-btn" id="prevPageBtn" aria-label="предыдущая страница">◀</button>
                <span class="page-indicator" id="indicator">стр. 1 / 10</span>
                <button class="nav-btn" id="nextPageBtn" aria-label="следующая страница">▶</button>
            </div>
            <div class="footer-note">✦  memento mori  ✦</div>
        </div>
    </div>

    <script>
        (function() {
            const pagesData = [
                               
                {
                    type: 'character-two',
                    name: 'КЛАЙД',
                    date: '13 октября',
                    text: `Сегодня ночью спал просто отвратительно. По ощущениям будто кто-то подкинул мне в голову взрывчатку - подкрался, пока я дремал, открыл черепную крышку, сбросил туда всякой дряни, закрыл и убежал со всех ног. Какой-то ментальный подкидыш. Взрывоопасная бредятина. <br>
Причем сон начинался просто чудесно - я, кажется, был на задании или просто развлекался славной "охотой", я отчетливо помню, как пролезал в чье-то тело, подслушивал чужой пульс, окунался в чужие крики, но потом.. потом я полностью потерял контроль над собой. Нет, я продолжил начатое, но будто бы уже не по своей воле, я наносил своей жертве увечья, но не там, где хотел их нанести, и пытал ее не теми способами, которыми предпочитал. Из дирижёра я превратился в обычного зрителя, пусть и посаженного в первых рядах. Очень гадкое ощущение, когда ты, вроде бы, делаешь все то, что хотел изначально, но по чьей-то указке, по чьему-то велению, в совершенно ином, не согласованном с тобой, виде. <br>
Я потратил три тысячелетия на то, чтобы двинуть хотя бы пальцем, чтобы сделать хоть что-то самостоятельно, а не лицезреть парализованным истуканом, как льются реки крови из вспоротых глоток. Творить нечто настолько живодерское и безжалостное, но не по доброй воле - самое мерзкое, самое унизительное и святотатственное, что можно придумать. Грешить нужно осознанно. По велению своего выбора, своего решения, своей тяги, иначе это просто кукольная постановка, где ты нелепо болтаешься на невидимых ниточках, где ты и не убийца даже, а лишь инструмент того, кто в действительности убийцей является. Заснуть снова я так и не смог, однако днем был весьма бодр. <br>
Подумаешь, скверный сон. И не такое случалось.`
                },
               
                {
                   type: 'character-one',
                   name: 'ШОН',
                   date: '16 октября',
                   text: `Дни сейчас – какая-то сплошная суета. Ни секунды присесть и ни единого  дельного воспоминания чтобы записать. Вроде работал, вроде был в зале, даже кого-то видел и с кем-то переговаривался. На обеде вчера снова общался с присланным из Инквизиции работником. <br>
После последнего нашего дела, вызывают на разговоры снова и снова, что-то уточняют, расспрашивают каждый раз как в первый. И я раз за разом им повторяю всю ту же череду событий, будто могу сказать что-то новое. Они, кажется, даже надеются, что скажу. У них, у всех этих вежливых клерков, записывающих в свои блокнотики все те же слова, взгляды хищные, скучно-дотошные до деталей, бесчувственные бусинки вместо зрачков. “Мистер Боунс, 12 числа вы сказали, что закрыли дверь и потом проверили оружие, а сейчас говорите, что проверили оружие, закрыли дверь… так что же правда? Хорошо… старайтесь больше не сбиваться в показаниях и очередности событий”. <br>
Господи, какой же бред. Клайда они опросили всего раз или два, меня донимают уже в четвертый. Что-то у них там не сходится, а я спокойно им отвечу, в отличии от соула, способного вывести своей улыбкой и наглостью даже самых непрошибаемых зануд. Вот и вызывают меня к ним опять и опять. Надеюсь, этот раз был последним.<br>
Впрочем, Клайд вчера тоже был куда менее самоуверенным, чем обычно. Даже усталым. На вопросы послал к черту, но выглядел так, что хоть тут ему чай с валерьяной выдавай под колыбельную. Сегодня ему, кажется, еще хуже, но в каждую попытку заговорить об этом я будто сталкиваюсь со стеной, за которую меня не пускают дальше. Видел, как он клюет носом, пока думает, что никто не смотрит. Он явно херово спит.` },
               
                {
                   type: 'character-two',
                   name: 'КЛАЙД',
                   date: '18 октября',
                   text: `Ебаные кошмары.<br>
Ебаные кошмары изводят и истачивают мой мозг уже третью ночь подряд. Затравливают меня, словно зверя, загоняют в угол, тычут копьями, заставляя злобно скалиться, тянуть улыбку наперекор неотступным нападкам. Каждая попытка уснуть - все равно что выход на поле боя, где у меня с порога отбирают все оружие, крепко связывают и бросают под ноги врага. Что-то не так. Что-то выходит из-под контроля, допиливает меня, досверливает, пытается продырявить мой череп, чтобы я вытек наружу. <br>
Вычитал в интернете про сонный паралич, и это правда нечто схожее - во сне я начисто теряю возможность двигаться самостоятельно, однако я шевелюсь, я делаю очень много вещей, но притом не имею к ним никакого отношения. Мои руки движутся сами собой, мои ноги делают шаг за шагом - сами собой, я дышу, слизываю кровь, вгрызаюсь в чье-то мясо, рву кого-то на части, но все удовольствие от процесса переводится на чей-то чужой счет, пополняет чью-то чужую казну. Совершать столько упоительных злодейств и притом не являться их автором - что за ебаное гадство? И голос.. Я слышу чей-то голос, отдаленный и размытый эхом, который наговаривает мне - учись, как надо.. учись у скверны как надо.. Неужели она снова пытается пробраться в мою башку? Устроиться в ней непрошенной квартиранткой? Хоо, какая же ты наглая сучка, приходишь во снах, чтобы учить меня, как следует обходиться с чужой уязвимой плотью? Тупая ты мразь, мне не нужны твои уроки, я не стремлюсь стать твоим преданным подданным, это тебя волнует насколько темен мрак и насколько низок грех, я же ношу жертвы к алтарю своего стояка, и в рот я ебал, чему ты хочешь меня научить. Появись передо мной в реальности, блядская ты подстилка, подступись ко мне вне снов, преподай мне урок с глазу на глаз.<br>
Раздражение копится вместе с продуктами распада моего терпения. То, что ранее меня ничуть не напрягало, теперь становится вполне объективной причиной для линчевания. Еще и Шон внезапно решил изобразить мистера заботу, уже который раз делает в мой адрес очаровательные комплименты, подмечая темные круги под моими глазами и помятый внешний вид. "Ты выглядишь просто кошмарно. Что с тобой? Дрочишь ночами напролет и потому не высыпаешься?". Я улыбаюсь ему, почти щерюсь, обороняюсь от его вопросов стиснутыми в оскале зубами, цедя сквозь них, что все в порядке. Настаивая: "Отъебись)))". Ох уж эти его ебаные игры в участие и сострадание. Ну разумеется все должно идти по твоему сценарию, тигренок, разумеется мы должны сесть за чашечкой кофе и обсудить, как хуево я сплю в последнее время. Чтобы ты посмотрел на меня своими щенячьими глазками, сказал что-то типа "очень плохо" или "жаль" или "тебе нужно обратиться ко врачу, сходить с тобой?", а я конечно же отвечу тебе "да, пупсик, своди меня к дяде доктору, пусть он пропишет мне таблеточки, а потом мы вернемся в спаленку и я отсосу у тебя за то, какой ты у меня заботливый", ну да, ага, все ведь так и должно быть, ебаная ты паскудина с ебаными твоими "с тобой что-то не так", пошел нахуй, Шон, пошли нахуй, кошмары, и скверна - тебе персональное ПОШЛА НАХУЙ.<br>
Я слышу как смеюсь. Но я уже не уверен, что делаю это сам.` },
               
                {
                   type: 'character-one',
                   name: 'ШОН',
                   date: '19 октября',
                   text: `Если бы я мог сдавать пространство, принадлежащее моему соулу, то в мешках под глазами Клайда поселил бы несколько квартирантов. Жить там можно на широкую ногу, большой семьей, помешает разве что не очень удачное соседство с его ртом, из которого круглосуточно извергаются всякие гадости.<br>
А кроме шуток, это начинает серьезно беспокоить. Рядом со мной не соул, а его тень, и надо сказать, что я уже просчитываю пути насильного причинения добра на пару с врачом. Я слежу за его мимикой, движениями, и они все более нервные, порой он медлителен как человек в полусне, порой – куда ярче реагирует, резко подкидывается. И неизменно посылает меня нахуй, стоит указать на проблему и ее симптомы. Складываю даты и когда примерно это все могло с ним начаться, и, кажется, начинаю догадываться о причинах происходящего.<br>
Какое удивительное чувство находить уязвимости психики в том, в ком, казалось бы, их и не могло быть ввиду изначально покореженной ментальности. Чем дольше об этом думаю, чем больше смотрю, тем больше понимаю, что Клайду нужна помощь и это почти физически больно – сталкиваться с тем, что я эту помощь оказать нормально не могу. Видно же, как ему хреново, и мне его все более и более жалко. Ловлю себя на том, что хочу его порой просто обнять, но отлично знаю как далеко и как весело пойду с такими желаниями.<br>
Вместо этого заживо варю себя в чувстве вины. Потому что, кажется, мог предотвратить все, что он сейчас испытывает, еще в зачатке, но просто и очень тупо не успел. А потом уже был зациклен на своих собственных страхах.<br>
Забил, забыл, не подумал. И хуя с два теперь проберусь через все эти защиты и его панцири, чтобы успокоить то, что мог бы просто не допустить.<br>
Клайд клюет носом даже на обходе. По сути провел его один, с плетущимся сзади ведьмаком. В полутьме ночных коридоров он просто порой свешивает подбородок к груди, позволяя длинным волосам закрыть лицо и я слышу, как меняется его дыхание, как оно замирает, пытается замедлится. Внутри что-то древнее говорит, что надо его окружить собой, согреть и защитить в уязвимой фазе сна. На деле только замедляюсь в такт его шагам, иногда чуть придерживаю, позволяю ему очнуться самому и так до следующего поворота, где все повторяется. Обычный обход занимает на час больше, а во мне сжимается сердце из-за волнения за него.` },
               
                {
                   type: 'character-two',
                   name: 'КЛАЙД',
                   date: '19 октября',
                   text: `Из-за недосыпа в моем теле становится все меньше места для меня. Нет, я пытаюсь с этим совладать, пытаюсь просто расслабиться, отпустить ситуацию, вроде как - подумаешь, я вижу сон, в котором кто-то управляет моим телом и делает всякие безбожные вещи. Почему мне так принципиально чинить вред самому? Ведь тело во сне двигается, боль причиняется, я вижу, как страдают люди, множество людей, но почему-то меня это совсем не радует, не возбуждает, не приводит в экстаз. Не я их мучитель. Не я их палач. Не я их возлюбленный. Это как наблюдать чужой пир со стороны, видеть, как кто-то лакомится вкуснейшей амброзией, сидя при этом так близко, что видишь текстуру еды, чуешь ее запах, но сам угоститься не можешь, как и пришить все увиденное к себе, сделать происходящее частью себя. Я не знаю, как долго это будет продолжаться. Нужно что-то делать. Нужно как-то это решать.<br>
Получил от врача таблетки. Они проходят мое тело транзитом, ничего не привнося, ничего не меняя и не вправляя на место. Мое внутричерепное страдание не поддается никаким химическим соединениям, никакому фармакологическому волшебству. Проверка на заражение скверной тоже ничего не дала - я не нуждаюсь ни в каком очистительном ритуале, я даже не проклят, черт возьми. Тогда что это? Я устал листать интернет. В нем сотни тысяч незнакомых мне людей в сотнях тысячах непонятных мне статей твердят в один голос, что мне пизда. Или, как вариант, острая непереносимость лактозы.<br>
Сегодня, обойдя периметр Академии, мы заскочили с Шоном в общий кабинет, чтобы заполнить отчеты и разойтись по делам. Если первые дни Шон меня раздражал, то сейчас у меня нет сил даже отталкивать его, когда он спешит меня поддержать и подставить свое стальное плечо. Касаюсь пальцами прохладного металла, мягко стучу по нему ногтями, медленно моргаю, чувствуя его дыхание на щеке. Глупый, безнадежный Шон, сладенький ты сучоныш, знал бы ты, как я хочу оторвать тебе и вторую руку, и ноги, и член, оставить от тебя только голову и туловище, превратить тебя в идеальный инструмент для восприятия той боли, которую я для тебя приготовил. Я бы сделал это с тобой, я бы услаждался этим, я бы смеялся, смотря на твое изумительное лицо, а ты, даже зная об этом, все равно обнимаешь меня, придерживаешь за талию, как только замечаешь шаткость в моей походке. Ты безумен, Шон.. Безумен... Шон...<br>
Сидя за письменным столом, я медленно закрываю глаза. Я знаю, что, стоит мне отключиться, как я снова глотну этой отравы, но выбора у меня нет, я слишком измотан. Придется снова испить этой пытки - так же, как умирающему от обезвоживания приходится пить свою мочу, чтобы не сойти с ума от жажды. Я просто хочу спать. Я снова смеюсь. Мне почему-то не жалко себя. Мне почему-то.. никогда по-настоящему.. не жалко себя..` },
               
                {
                   type: 'character-one',
                   name: 'ШОН',
                   date: '19 октября',
                   text: `Он засыпает прямо в кабинете, за столом, после очередной моей безуспешной попытки поговорить обо всем, что с ним происходит. И первые секунды я даже радуюсь, что он спит наконец-то, потому что могу ненадолго отпустить свое за него беспокойство, подумать, что, может, сейчас все наладится и ему станет лучше. Почти довольный заполняю отчет до конца, вытаскиваю из под его щеки лист, и поглядываю на чуть дрожащие черные ресницы, кажется, что его глазные яблоки мечутся из стороны в сторону под плотно сомкнутыми веками, но дыхание пока спокойно. <br>
В его бланке полная билиберда сонного мозга, путающего буквы и слова, поэтому беру новый лист и пишу все заново, имитирую его почерк и подпись, когда рядом что-то странно чавкает, а потом резко бьет в стену. Вскидываюсь разом, только чтобы увидеть, как мой ведьмак расползается на щупы и отростки, которые дергаются, пытаются сквозь сон, кажется, поразить невидимые цели. Его фигура чуть оплывает, а на лице удивительно непривычное мне выражение искреннего противления, муки и беспомощности. Я видел лишь ноты похожей гримасы, однажды, совсем недавно. Меня снова заполоняет чувство вины.<br>
Осторожно подхожу к нему, хотя уворачиваться от атак его щупов не сложно. То что во сне мощный удар, на деле всегда лишь легкое подергивание рукой. Так и тут способность бьет, но сражается с чем-то там, внутри своего сознания, и я вижу в движениях силы лишь слабое эхо той битвы, тревожной, неприятной и явно делающей моего ведьмака несчастным. Когда поднимаю его на руки, между бровей Клайда хмурая складка и я чую запах его злости и недовольства. Надо унести его в безопасность, подальше от случайных свидетелей.` },
               
                {
                   type: 'character-two',
                   name: 'КЛАЙД',
                   date: '19 октября',
                   text: `Из сна меня снова вытурили, как оборзевшего пьянчугу из бара. Вход в здоровый сон теперь платный, судя по всему, и меня в нем не ждут. Открыв глаза, я далеко не сразу вкурил, где нахожусь, но физиономия Шона, сидевшего на стуле перед кроватью, быстро подкинула пару идей - я, вероятно, в его комнате. Я, вероятно.. отключился где-то в кабинете и сам не заметил, как меня перетащили сюда. <i>Он</i> перетащил. "Ты отключился и начал.. превращаться" - заметив, что я прочухался, тут же известил меня Шон. "Ты даже способность свою теперь не контролируешь, не то, что разум". Ох Шон, ты всегда смотришь на меня именно так - упрямо и немного тоскливо одновременно. Не выпускаешь меня из вида. Так навязчиво. Так вызывающе. Сколько наглости и бесстрашия нужно иметь, чтобы смотреть на меня с таким отчаянным беспокойством? Чтобы так настойчиво превращать мою проблему в нашу общую? Ты даже сам не представляешь, как оскорбляешь меня своей абсурдной заботой. Как унижаешь меня своей потребностью ее мне всучить. Не потому, что я в своих глазах слишком сильный, чтобы нуждаться в поддержке, а потому что ты в самом деле хочешь ее оказать, а ведь ты - часть меня, МЕНЯ, откуда вообще это в тебе взялось? Это вариант твоей похоти? Ты ловишь с этого кайф, да? У тебя стояк на то, чтобы печься о тех, кто хочет тебя обглодать? <br>
"Я посплю у себя))" - пытаюсь подняться, но Шон тут же оказывается рядом, чтобы уложить меня обратно на простыни. "Ты не поспишь у себя. Ты нигде не поспишь, Клайд. Сколько ты уже толком не спал? Неделю?". Отвечаю, улыбаясь через силу: "Да, был слишком занят тем, что ебал твою мамашу))". Шутка тупая. Я знаю. Но оттого она и кажется мне максимально уместной и даже жизненно необходимой сейчас. Шону ожидаемо не смешно. "Мне кажется я знаю, почему ты не спишь". <br>
"Хоо, да ты ж мой Эркюль Пуаро. Распутал это дело наконец-то))Давай закажем шлюх и пиццы, и отметим это как следует)))".<br>
"После того задания, да? Когда оскверненный использовал против тебя магию контроля. А я не успел вовремя..".<br>
"Шон, тшшшш, если ты будешь много говорить, то пропустишь важный момент, когда тебе будет пора пойти нахуй))".<br>
"Клайд, хватит улыбаться, хватит шутить и посылать меня! Это не скверна, а психосоматика. Ты же сам понимаешь, что все это связано с тем заданием. Оскверненный мертв, мы убили его, но твоим телом управляли какое-то время, и теперь ты не можешь уснуть из-за того, что потерял над собой контроль. Все ведь так??".<br>
"Ну конечно же, я ведь такой впечатлительный))"<br>
"Дело не в этом. Ты легко переносишь боль и поражение, но.. даже у тебя есть то, что способно тебя задеть. Что тебе снится, Клайд?".<br>
Я ощущаю, как слипается каждая клетка моего тела. Как мембраны залипают, точно клавиши, и превращают сигналы моей нервной системы в полнейший хаос. Я сдаюсь.<br>
Я признаюсь: "Мне снится.. что я убиваю людей. Но не по своей воле".<br>
"Разве ты не хотел бы их убивать?"<br>
"Ахаха.. хотел бы, конечно, но не по чужой указке. Во снах.. я убиваю лучше и слаще, но при этом.. Это не я. Я там вообще не при чем".<br>
"Лучше и слаще?"<br>
"Именно))Ощущение такое, будто кто-то умудряется.. быть мной, но притом быть мной лучше, чем я сам могу собой быть.. Короче, полная параша".<br>
"Хм.. но ведь, если это снится тебе, точнее.. если ты сам это снишь, значит, это все тоже ты сам. Лучше и слаще - это ведь не кто-то другой, потому что внутри тебя не может быть кто-то, кроме тебя"<br>
"Ахахаххахаах!"<br>
"Клайд)"<br>
"Ну да, блядь, не может))Только если будет оооочень настойчив)))"` },
               
                {
                   type: 'character-one',
                   name: 'ШОН',
                   date: '19 февраля',
                   text: `Я впервые в ситуации, когда не знаю, что милосерднее – дать человеку поспать или разбудить от терзающих его кошмаров. Клайд беспокойно мечется на кровати, расплескивая по подушке черноту волос, его тело – изломанные углы, пока он не замирает и вмиг разрешает мою дилемму, проснувшись сам.
Настаиваю, чтобы он остался, пробиваюсь сквозь его попытки послать меня и отшутиться, и, наконец, действительно с ним говорю. Впрочем, озвучить причину, понять её и овеществлить – одно, но внятного решения проблемы так и нет, и я нажимаю на его плечо, гася новую попытку встать. <br>
“Все, попиздели и хватит, я к себе))” <br>
“Слушай, у себя ты спать уже пытался, не сработало. Ты там один на один” Смотрю на его лицо в полумраке и удивленно отмечаю, что он действительно позволяет мне удержать его на кровати, и снова ложится. Насколько же тебя покинули силы, если ты не противишься этому жесту, как минимум, из принципов? Не отпускаю ладонь, как-то интуитивно оставляя эффект своего присутствия с ним рядом, чутко вслушиваюсь в его дыхание и подмечаю темп выдохов, и глубину вдохов. И мне кажется, что он чуть успокаивается. Внутренности сжимаются неуместной здесь, да и вообще по отношению к Клайду, нежностью. Но я позволяю чувству быть и надеюсь создать из него что-то, что сможет ему помочь.<br>
“Оскверненный правда мертв, я его убил, помнишь? Перекусил ему нахер глотку, он сдох и все закончилось.”<br>
“Не поверишь, но помню)) Надо было отрезать сученышу его конечности, взбить их в блендере и влить это “смузи” ему в очко))) Ты как всегда милосерден))”<br>
“Прости, на скоростях не доработал. Надо как-то… как-то убедить твой разум, что все прошло, понимаешь? Твой мозг все еще там, воспроизводит это ощущение снова и снова, пытаясь придумать решение, сценарий, как справится с таким страхом. А в итоге только изматывает тебя раз за разом. Это жутко – терять контроль над своим “Я”” <br>
Устраиваюсь удобнее на краю кровати, не убирая ладони, и чувствую как в мою кожу толкается его беспокойный пульс. Сердце Клайда еще там, в ошметках беспокойного сна, но он сам, кажется, снова начинает проваливаться в новую бездну кошмара. Речь его становится медленнее.<br>
“Раз отдаешь свою кровать, пиздуй тогда))”<br>
Со стола на пол спрыгивает Коф, и я смотрю на белую шерстку во тьме. Думаю об успокаивающем кошачьем мурлыканье, но кот не переносит Клайда, кажется, чувствуя, что тот не прочь бы его прикончить. И едва ли согласился бы лечь с ним рядом, чтобы согреть и успокоить. Впрочем, в этой комнате есть и кот побольше.
“Давай вместе ляжем? Ты будешь там не один. Я прикончил его в жизни, прикончу и у тебя во сне. Все закончится”<br>
“Или я испотрошу тебя чернью, пока сплю)))”<br>
“Или так” легко соглашаюсь, но придвигаюсь ближе.<br>
“Даже не знаю, мы так редко с тобой спим)))”<br>
Улыбаюсь снова, подмечая очередную двусмысленность фразы. И действительно задумываюсь, почему мне так понравилась идея. Из-за уже потихоньку хронического беспокойства за него, или из-за редкой возможности побыть с ним так близко и до странности не опасно, мать его… доверительно? Думаю о том, что, может, это я эгоист, и хочу видеть способ помощи в том, что, скорее, просто приятно мне самому.<br>
“Во всех смыслах)))”<br>
Он медленно моргает, потом с явным усилием возвращает осмысленность взгляду, и я задумываюсь, обнимал ли кто-то его когда-то во сне вообще. Тепло и любяще. В детстве? После?<br>
“Слушай, в крайнем случае, ты просто поспишь в обнимку с теплой мохнатой грелкой”<br>
Легко залезаю в кровать, чувствуя боком его тепло и уже там оборачиваюсь зверем, приваливаясь ближе к нему. На кровати маловато места для взрослого мужика и тигра, и я надеюсь, что он сам догадается использовать меня как большую подушку. Улыбаюсь про себя и выдыхаю с клекотом невысказанного довольства в легких, когда он закидывает на меня руку и чуть сжимает в пальцах шерсть.` },
               
                {
                   type: 'character-two',
                   name: 'КЛАЙД',
                   date: '19 октября',
                   text: `Мы лежим на его кровати. Шон обратился тигром - видимо, чтобы, засыпая, я чувствовал под пальцами его плотную и утешающе теплую шкуру. Как же тяжело признать, что мой враг - не болезнь и не скверна, а я сам, мой долбанный разум, которому, оказывается, крепко досталось от магии контроля. Шон назвал это психосоматикой. Я бы назвал это "ебаной психосоматикой". Мне тяжело признать, что подсознание способно так сильно влиять на мое тело. Что мысли и чувства, которых я не вижу, которые я не могу осязать, все эти призрачные импульсы в моем сером веществе горазды поставить меня и мое здоровье на колени, заставить меня не спать и толком не есть целую неделю. <br>
Мой разум для меня - зашифрованный черный ящик, в который я сам предпочитаю не соваться, не распутывать кабели и провода, чтобы не ударило током, не заклинило еще сильнее, не погасло. Пусть работает, как работает, лучше не трогать и не вносить изменения. Почему Шон не боится совать туда руку? Почему так бесстрашно перебирает нейронные петли моего межполушарного хаоса, даже получая в ответ лучевые ожоги? "Я буду спать с тобой, а завтра отведу тебя к психологу, понял?". Я ничего не ответил, даже не улыбнулся. <br>
Какой психолог, Шон? Ты - единственный, перед кем я бы порезал свой мозг на тонкие ломтики и кому показал бы срез каждой извилины. Я не могу дать себе права довериться кому-либо добровольно, но к близости с тобой меня принудила сама природа, сделав тебя моим соулом, и спасибо ей, что принудила, слава ей, что заставила, что дала достойное оправдание тому доверию, что я испытываю к тебе, сучоныш.. О каком психологе ты говоришь.. <br>
Сжимаю полосатую шкуру, проваливаюсь в заросли черно-рыжей шерсти, впускаю в себя низкочастотный тигриный клекот, это мерное шершавое дыхание, эту сильную и неукротимую жизнь. В моей голове не может быть кого-то еще, кроме меня самого. Все, что я делаю во снах, я делаю сам и никто другой. Ты ведь напомнишь мне это там, во сне, Шон? <br>
Ты ведь не опоздаешь..?` }
            ];

            const totalPages = pagesData.length;
            let currentPageIndex = 0;

            const scene = document.getElementById('flipScene');
            const indicator = document.getElementById('indicator');
            const prevBtn = document.getElementById('prevPageBtn');
            const nextBtn = document.getElementById('nextPageBtn');

            function buildPages() {
                scene.innerHTML = '';
                const gutterDiv = document.createElement('div');
                gutterDiv.className = 'gutter';
                scene.appendChild(gutterDiv);

                pagesData.forEach((data, index) => {
                    const pageDiv = document.createElement('div');
                    pageDiv.className = `page ${data.type}`;
                    pageDiv.setAttribute('data-index', index);

                    const lines = document.createElement('div');
                    lines.className = 'page-lines';
                   
                    const contentDiv = document.createElement('div');
                    contentDiv.className = 'page-content';
                   
                    // Создаём верхнюю плашку с датой и именем
                    const headerDiv = document.createElement('div');
                    headerDiv.className = 'page-header';
                   
                    const datePlate = document.createElement('div');
                    datePlate.className = 'date-plate';
                    datePlate.innerText = data.date;
                   
                    const namePlate = document.createElement('div');
                    namePlate.className = 'character-name';
                    namePlate.innerText = data.name;
                   
                    headerDiv.appendChild(datePlate);
                    headerDiv.appendChild(namePlate);
                   
                    const bubbleDiv = document.createElement('div');
                    bubbleDiv.className = 'entry-bubble';
                   
                    const textDiv = document.createElement('div');
                    textDiv.className = 'entry';
                    textDiv.innerHTML = data.text;

                    bubbleDiv.appendChild(textDiv);
                    contentDiv.appendChild(headerDiv);
                    contentDiv.appendChild(bubbleDiv);

                    pageDiv.appendChild(lines);
                    pageDiv.appendChild(contentDiv);

                    scene.appendChild(pageDiv);
                });

                updatePagesState();
            }

            function updatePagesState() {
                const pages = document.querySelectorAll('.page');
                pages.forEach((page, idx) => {
                    page.classList.remove('front-right', 'flipped-left', 'stack-left');

                    if (idx === currentPageIndex) {
                        page.classList.add('front-right');
                    } else if (idx < currentPageIndex) {
                        page.classList.add('flipped-left');
                    } else {
                        page.classList.add('stack-left');
                    }
                });
                indicator.innerText = `стр. ${currentPageIndex + 1} / ${totalPages}`;
                prevBtn.classList.toggle('disabled', currentPageIndex === 0);
                nextBtn.classList.toggle('disabled', currentPageIndex === totalPages - 1);
            }

            function nextPage() {
                if (currentPageIndex >= totalPages - 1) return;

                const currentPage = document.querySelector(`.page[data-index="${currentPageIndex}"]`);
                const nextPageElem = document.querySelector(`.page[data-index="${currentPageIndex + 1}"]`);

                if (!currentPage || !nextPageElem) return;

                nextPageElem.classList.remove('stack-left');
                void currentPage.offsetWidth;

                currentPage.classList.remove('front-right');
                currentPage.classList.add('flipped-left');

                nextPageElem.classList.remove('stack-left');
                nextPageElem.classList.add('front-right');

                currentPageIndex++;

                const pages = document.querySelectorAll('.page');
                pages.forEach((page, idx) => {
                    if (idx < currentPageIndex) {
                        page.classList.remove('front-right', 'stack-left');
                        page.classList.add('flipped-left');
                    } else if (idx === currentPageIndex) {
                        // уже обработано
                    } else {
                        page.classList.remove('front-right', 'flipped-left');
                        page.classList.add('stack-left');
                    }
                });

                indicator.innerText = `стр. ${currentPageIndex + 1} / ${totalPages}`;
                prevBtn.classList.toggle('disabled', currentPageIndex === 0);
                nextBtn.classList.toggle('disabled', currentPageIndex === totalPages - 1);
            }

            function prevPage() {
                if (currentPageIndex <= 0) return;

                const currentPage = document.querySelector(`.page[data-index="${currentPageIndex}"]`);
                const prevPageElem = document.querySelector(`.page[data-index="${currentPageIndex - 1}"]`);

                if (!currentPage || !prevPageElem) return;

                prevPageElem.classList.remove('flipped-left', 'stack-left');
                void currentPage.offsetWidth;

                currentPage.classList.remove('front-right');
                currentPage.classList.add('flipped-left');

                prevPageElem.classList.remove('flipped-left', 'stack-left');
                prevPageElem.classList.add('front-right');

                currentPageIndex--;

                const pages = document.querySelectorAll('.page');
                pages.forEach((page, idx) => {
                    if (idx < currentPageIndex) {
                        page.classList.remove('front-right', 'stack-left');
                        page.classList.add('flipped-left');
                    } else if (idx === currentPageIndex) {
                        // front-right
                    } else if (idx > currentPageIndex) {
                        page.classList.remove('front-right', 'flipped-left');
                        page.classList.add('stack-left');
                    }
                });

                indicator.innerText = `стр. ${currentPageIndex + 1} / ${totalPages}`;
                prevBtn.classList.toggle('disabled', currentPageIndex === 0);
                nextBtn.classList.toggle('disabled', currentPageIndex === totalPages - 1);
            }

            buildPages();

            prevBtn.addEventListener('click', prevPage);
            nextBtn.addEventListener('click', nextPage);
        })();
    </script>
</body>
</html>[/html]

80

[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>
        * {
            box-sizing: border-box;
            margin: 0;
            padding: 0;
        }

        body {
            background: linear-gradient(145deg, #4d3e2e 0%, #6b4f38 100%);
            min-height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
            font-family: 'Courier New', Courier, monospace;
            padding: 20px;
        }

        /* Контейнер — одна страница в раскрытом виде (как блокнот) */
        .page-single {
            max-width: 800px;
            width: 100%;
            background: #fef7e9;
            background-image: repeating-linear-gradient(transparent, transparent 29px, #cdb99b 30px);
            background-size: 100% 30px;
            border-radius: 25px 8px 25px 8px;
            box-shadow:
                0 20px 30px rgba(0, 0, 0, 0.6),
                0 0 0 4px #bfa07e inset,
                0 0 0 10px #ecdcc5 inset;
            padding: 45px 40px 60px 40px;
            position: relative;
            min-height: 700px;
            line-height: 30px;
            font-size: 20px;
            color: #2c241a;
        }

        /* Дополнительная имитация старой бумаги */
        .page-single::after {
            content: '';
            position: absolute;
            top: 20px; left: 30px; right: 30px; bottom: 20px;
            background: rgba(210, 180, 140, 0.08);
            pointer-events: none;
            border-radius: 10px;
        }

        /* Контентная область с текстом (можно редактировать прямо в HTML) */
        .notebook-text {
            white-space: pre-wrap;
            word-break: break-word;
            position: relative;
            z-index: 5;
            min-height: 500px;
            margin-bottom: 40px;
        }

        /* Общий контейнер для двух фото — флекс внизу страницы */
        .photos-container {
            display: flex;
            justify-content: space-between;
            align-items: flex-end;
            gap: 30px;
            margin-top: 30px;
            flex-wrap: wrap;
            position: relative;
            z-index: 20;
        }

        /* Каждая фото-зона */
        .photo-item {
            flex: 1 1 200px;
            min-width: 200px;
            display: flex;
            flex-direction: column;
            align-items: center;
            position: relative;
        }

        /* Рамка фотографии (стала больше) */
        .photo-frame {
            width: 220px;
            height: 260px;
            background: #e6d7c2;
            border: 6px solid #c8aa82;
            outline: 2px solid #9e7f60;
            outline-offset: 4px;
            box-shadow: 0 12px 18px -6px rgba(0, 0, 0, 0.5);
            overflow: hidden;
            display: flex;
            align-items: center;
            justify-content: center;
            transition: transform 0.25s ease, box-shadow 0.3s;
            position: relative;
            cursor: default;
        }

        /* Само изображение */
        .photo-frame img {
            width: 100%;
            height: 100%;
            object-fit: cover;
            display: block;
            transition: transform 0.2s;
        }

        /* Эффект при наведении курсором (курсор — любой, но срабатывает на всю рамку) */
        .photo-item:hover .photo-frame {
            transform: scale(1.03) translateY(-6px);
            box-shadow: 0 22px 28px -10px #1f1a14;
        }

        /* Дополнительное движение внутри фото (чуть приближается картинка) */
        .photo-item:hover .photo-frame img {
            transform: scale(1.02);
        }

        /* Скрепка — стильный элемент */
        .paperclip {
            position: absolute;
            top: -22px;
            font-size: 58px;
            line-height: 1;
            z-index: 30;
            filter: drop-shadow(2px 6px 4px rgba(0,0,0,0.3));
            transition: transform 0.2s ease;
            pointer-events: none; /* чтобы наведение работало через родителя */
            transform-origin: top center;
        }

        /* Левая скрепка чуть повёрнута */
        .photo-item.left .paperclip {
            left: 10px;
            transform: rotate(-18deg);
        }

        /* Правая скрепка повёрнута в другую сторону */
        .photo-item.right .paperclip {
            right: 10px;
            transform: rotate(12deg) scaleX(-1);
        }

        /* При наведении на фото скрепка тоже оживает */
        .photo-item:hover .paperclip {
            transform: rotate(-10deg) scale(1.1);
            filter: drop-shadow(4px 8px 6px black);
        }

        .photo-item.right:hover .paperclip {
            transform: rotate(18deg) scaleX(-1) scale(1.1);
        }

        /* Подпись (необязательно) */
        .photo-caption {
            margin-top: 15px;
            font-size: 14px;
            color: #4f3f2e;
            background: #f1e5d3;
            padding: 5px 12px;
            border-radius: 40px;
            border: 1px solid #b28d64;
            letter-spacing: 0.5px;
            opacity: 0.8;
        }

        /* Чтобы текст не налезал на фото на узких экранах */
        @media (max-width: 650px) {
            .page-single {
                padding: 25px;
            }
            .photos-container {
                justify-content: center;
            }
        }
    </style>
</head>
<body>
    <div class="page-single">
        <!-- Текст записной книжки — меняй прямо здесь -->
        <div class="notebook-text">
            ✦ 16 марта, воскресенье ✦<br>
            ▸ Закончить эскиз для выставки<br>
            ▸ Купить зелёный чай и мёд<br>
            ▸ Позвонить в мастерскую<br>
            ▸ Забрать плёнку из лаборатории<br>
            <br>
            ────<br>
            Идея: две Polaroid-фотографии прикреплены скрепками. <br>
            Если навести курсор — снимки приподнимаются.<br>
            ────<br>
            «Память — это фотоальбом без подписей»<br>
        </div>

        <!-- Контейнер для двух фото -->
        <div class="photos-container">
            <!-- Левая фотография -->
            <div class="photo-item left">
                <!-- Скрепка (эмоджи + стилизация) -->
                <div class="paperclip">📎</div>
                <!-- Фоторамка. ССЫЛКУ НА СВОЁ ИЗОБРАЖЕНИЕ ВСТАВЛЯЙ СЮДА (атрибут src у img) -->
                <div class="photo-frame">
                    <img src="https://placecats.com/300/200?random=1"
                         alt="левое фото, замени ссылку"
                         id="leftImg">
                </div>
                <!-- Небольшой текст под фото (можешь удалить) -->
                <div class="photo-caption">побережье, 2023</div>
            </div>

            <!-- Правая фотография -->
            <div class="photo-item right">
                <div class="paperclip">📎</div>
                <div class="photo-frame">
                    <!-- ВОТ ССЫЛКА ДЛЯ ПРАВОГО ФОТО — ЗАМЕНИ НА СВОЮ -->
                    <img src="https://placekitten.com/320/240?random=2"
                         alt="правое фото, замени ссылку"
                         id="rightImg">
                </div>
                <div class="photo-caption">утренний свет</div>
            </div>
        </div>
    </div>

    <!-- Комментарий:
        - чтобы поменять картинки, измени атрибут src у каждого img.
        - Размеры рамок теперь 220x260 (больше, чем были).
        - При наведении на любую область фото (даже на скрепку) срабатывает эффект поднятия.
        - Если нужны совсем другие ссылки — просто вставь адрес (локальный или url) в src.
    -->
</body>
</html>[/html]

Быстрый ответ

Напишите ваше сообщение и нажмите «Отправить»



Вы здесь » NO FANDOM » Болталка » Флуд во имя Флуда