NO FANDOM

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

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


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


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

Сообщений 61 страница 70 из 135

61

[html]
<!-- Подключаем шрифт прямо через head -->
<head>
  <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=Crimson+Text:ital,wght@0,400;0,600;0,700;1,400;1,600;1,700&display=swap" rel="stylesheet">
</head>

<div class="diary-wrapper">

  <div class="arrow prev"></div>
  <div class="book">

    <!-- СТРАНИЦА 1 -->
    <div class="page character-one active">
      <div class="page-inner">

        <div class="date-plate">12 октября</div>

       <div class="entry-bubble">
<div class="entry">
      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.
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. 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.
        </div>
</div>
      </div>
    </div>

    <!-- СТРАНИЦА 2 -->
    <div class="page character-two">
      <div class="page-inner">

        <div class="date-plate">13 октября</div>

        <div class="entry-bubble">
         <div class="entry">
          Сегодня ночью спал просто отвратительно. По ощущениям будто кто-то подкинул мне в голову взрывчатку - подкрался, пока я дремал, открыл черепную крышку, сбросил туда всякой дряни, закрыл и убежал со всех ног. Ментальный подкидыш, взрывоопасная бредятина. Причем сон начинался просто чудесно - я, кажется, был на задании или просто развлекался славной "охотой", я отчетливо помню, как пролезал в чье-то тело, подслушивал чужой пульс, окунался в чужие крики, но потом.. потом я полностью потерял контроль над своим телом. Нет, я продолжил начатое, но будто бы уже не по своей воле, я наносил своей жертве увечья, но не там, где хотел их нанести, и пытал ее не теми способами, которыми всегда предпочитал.. Из дирижёра я превратился в обычного зрителя, пусть и посаженного в первых рядах. Очень гадкое ощущение, когда ты, вроде бы, делаешь все то, что хотел сделать изначально, но по чьей-то указке, по чьему-то велению, в совершенно ином, не согласованном с тобой, виде. Я потратил три тысячелетия на то, чтобы двинуть хотя бы пальцем, чтобы сделать хоть что-то самостоятельно, а не лицезреть парализованным истуканом, как льются реки крови из вспоротых глоток. Творить нечто настолько упоительно сладкое и грешное, но не по доброй воле - самое мерзкое, самое унизительное и святотатственное, что можно придумать. Грешить нужно осознанно. По велению своего выбора, своего решения, своей тяги, иначе это просто кукольная постановка, где ты болтаешься на невидимых ниточках, где ты и не убийца даже, а лишь инструмент того, кто в действительности является убийцей. Заснуть снова я так и не смог, однако днем был весьма бодр. Подумаешь, скверный сон. И не такое случалось.
        </div>
</div>
      </div>
    </div>

  <!-- СТРАНИЦА 1 -->
    <div class="page character-one">
      <div class="page-inner">

        <div class="date-plate">12 октября</div>

       <div class="entry-bubble">
<div class="entry">
          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.
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. 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.
        </div>
</div>
      </div>
    </div>

  </div>
  <div class="arrow next"></div>
</div>

<style>

/* =========================
   ОБЁРТКА
========================= */

.diary-wrapper{
  position:relative;
  width:100%;
  max-width:780px;
  margin:80px auto;
  background:transparent;
}

/* =========================
   КНИГА
========================= */

.book{
  position:relative;
  height:660px;
  border-radius:36px;
  overflow:hidden;
  background:#e9dcc6;
}

/* =========================
   СТРАНИЦЫ
========================= */

.page{
  position:absolute;
  inset:0;
  transform-origin:left;
  transform:rotateY(90deg);
  opacity:0;
  transition:0.8s ease;
  backface-visibility:hidden;
}

.page.active{
  transform:rotateY(0deg);
  opacity:1;
}

/* =========================
   ВНУТРЕННОСТЬ
========================= */

.page-inner{
  height:100%;
  padding:80px 90px 80px 90px;
  box-sizing:border-box;
  display:flex;
  flex-direction:column;
  position:relative;
}

/* =========================
   ПУЗЫРЬ
========================= */

.entry-bubble {
  flex: 1 1 auto;          /* растягиваем, но не “ломаем” высоту */
  margin-top: 20px;
  border-radius: 26px;
  padding: 25px 40px 35px 45px; /* top right bottom left */
  overflow-y: auto;
  position: relative;
  box-sizing: border-box;  /* padding включен в высоту */

  scrollbar-width: thin;
  scrollbar-color: rgba(0,0,0,0.35) transparent;
}

.entry-bubble::-webkit-scrollbar {
  width: 6px;
}

.entry-bubble::-webkit-scrollbar-thumb {
  background: rgba(0,0,0,0.35);
  border-radius: 20px;
}

.entry-bubble::-webkit-scrollbar-track {
  background: transparent;
}

/* =========================
   ПЕРСОНАЖ 1 — МУЖСКОЙ ДНЕВНИК
========================= */

.character-one{
  background:
    radial-gradient(circle at 25% 25%, rgba(50,80,50,0.4), transparent 60%),
    linear-gradient(160deg, #3b2f25, #1f3a2a); /* коричнево-хвойный */
  font-family:"Georgia", serif;
  color:#e4dbc6; /* читаемый контрастный текст */
}

.character-one .date-plate{
  font-size:18px;
  padding:12px 36px;
  border:2px solid rgba(100,120,80,0.8); /* темно-зеленый */
  display:inline-block;
  letter-spacing:2px;
  text-transform:uppercase;
  background:rgba(50,70,40,0.5);
  color:#f1f0e6;
  backdrop-filter:blur(2px);
  box-shadow:0 6px 18px rgba(0,0,0,0.12);
  transition:.3s ease;
}

.character-one .date-plate:hover{
  transform:translateY(-2px);
  box-shadow:0 10px 25px rgba(0,0,0,0.18);
}

/* Вертикальная линия — коричнево-зеленая */

.character-one .page-inner::before{
  content:"";
  position:absolute;
  left:75px;
  top:150px;
  bottom:80px;
  width:2px;
  background:linear-gradient(to bottom,
    rgba(80,90,60,0.2),
    rgba(50,70,40,0.6),
    rgba(80,90,60,0.2));
}

/* Пузырь — тёплый, закрашенный */

.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; /* текст читаемый */
  padding-left:40px;
  border:none;
}

.character-one .entry{
  line-height:2.05;
  font-size:17px;
  letter-spacing:0.2px;
}

/* =========================
   ПЕРСОНАЖ 2
========================= */

.character-two{
  background:
    radial-gradient(circle at 70% 30%, rgba(120,0,0,0.25), transparent 60%),
    linear-gradient(#130c0c,#0b0505);
  font-family:"Cormorant Garamond", serif;
  color:#f1e7e7;
}

.character-two .date-plate{
  font-size:17px;
  padding:10px 28px;
  background:linear-gradient(90deg,#6e0f0f,#9b1c1c);
  color:#fff;
  letter-spacing:4px;
  display:inline-block;
  text-transform:uppercase;
  box-shadow:
    0 0 20px rgba(180,0,0,0.4),
    0 10px 30px rgba(0,0,0,0.6);
  transition:.3s ease;
}

.character-two .date-plate:hover{
  transform:scale(1.05);
  box-shadow:
    0 0 30px rgba(220,0,0,0.6),
    0 15px 40px rgba(0,0,0,0.8);
}

.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);
  padding:20px 40px;
}

.character-two .entry {
  font-family: "Crimson Text", serif;
  font-weight: 400;
  font-style: normal;
  font-size: 18px;
  line-height: 1.8;
  letter-spacing: 0.5px;
}

/* =========================
   СТРЕЛКИ
========================= */

.arrow{
  position:absolute;
  top:50%;
  transform:translateY(-50%);
  width:60px;
  height:60px;
  border-radius:50%;
  cursor:pointer;
  opacity:0;
  transition:.3s ease;
  z-index:5;
}

.book:hover .arrow{
  opacity:1;
}

.prev{
  left:25px;
}

.next{
  right:25px;
}

.character-one ~ .arrow{
  background:#2e452e; /* глубокий зеленый */
  box-shadow:0 10px 25px rgba(0,0,0,0.2);
}

.character-two ~ .arrow{
  background:#4a0c0c;
}

.arrow:hover{
  transform:translateY(-50%) scale(1.1);
}

.arrow::before{
  content:"";
  position:absolute;
  top:50%;
  left:50%;
  width:16px;
  height:16px;
  border-top:2px solid #e4dbc6;
  border-right:2px solid #e4dbc6;
}

.next::before{
  transform:translate(-50%,-50%) rotate(45deg);
}

.prev::before{
  transform:translate(-50%,-50%) rotate(-135deg);
}

.arrow.visible{
  opacity:1;
}

/* =========================
   📱 МОБИЛЬНАЯ ВЕРСИЯ
========================= */

@media (max-width: 600px) {

  .book {
    height: auto;        /* убираем 660px */
    min-height: auto;    /* убираем 100vh */
    border-radius: 0;
  }

  .page {
    position: relative;        /* убираем абсолютное позиционирование */
    transform: none !important;
    opacity: 1 !important;
  }

  .page-inner {
    padding: 25px 20px;        /* уменьшаем внешние отступы */
  }

  .entry-bubble {
    padding: 15px 15px 20px 15px; /* убираем огромные внутренние поля */
    margin-top: 15px;
    border-radius: 18px;
    overflow: visible;   /* чтобы не было странного обрезания */
  }

  .character-one .entry-bubble {
    padding-left: 15px; /* убираем декоративный отступ */
  }

   .character-two .entry-bubble {
    padding: 15px !important;
  }

  .date-plate {
    font-size: 14px;           /* уменьшаем дату */
    padding: 6px 16px;
    letter-spacing: 1px;
  }

  .entry {
    font-size: 16px;           /* текст чуть компактнее */
    line-height: 1.6;
  }

  .arrow {
    display: none;             /* на телефоне стрелки не нужны */
  }

}

</style>

<script>

let pages=document.querySelectorAll('.page');
let current=0;
let prev=document.querySelector('.prev');
let next=document.querySelector('.next');

function updateNav(){
  prev.classList.toggle('visible',current>0);
  next.classList.toggle('visible',current<pages.length-1);
}

updateNav();

next.onclick=function(){
  if(current<pages.length-1){
    pages[current].classList.remove('active');
    current++;
    pages[current].classList.add('active');
    updateNav();
  }
};

prev.onclick=function(){
  if(current>0){
    pages[current].classList.remove('active');
    current--;
    pages[current].classList.add('active');
    updateNav();
  }
};

</script>

[/html]

62

фигня

63

[html]<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Книга с перелистыванием · 9 страниц</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            user-select: none; /* предотвращаем выделение при кликах */
        }

        body {
            min-height: 100vh;
            background: #8b7a66; /* фон под дерево/старую кожу */
            display: flex;
            align-items: center;
            justify-content: center;
            font-family: 'Caveat', 'Segoe Script', cursive;
            padding: 20px;
            perspective: 2500px; /* для 3D эффекта переворота */
        }

        @import url('https://fonts.googleapis.com/css2?family=Caveat:wght@400;600;700&display=swap');

        /* контейнер книги */
        .book-wrapper {
            width: 100%;
            max-width: 750px;
            box-shadow: 0 30px 45px -15px rgba(0,0,0,0.6);
            border-radius: 6px 20px 20px 6px;
            background: #5a4a38; /* корешок */
            padding: 12px 12px 12px 8px;
        }

        .book-interior {
            background: #cfbea8;
            border-radius: 4px 18px 18px 4px;
            padding: 18px 18px 18px 12px;
            box-shadow: inset 0 0 10px #3f2e1b;
        }

        /* сцена для 3D страниц */
        .flip-scene {
            position: relative;
            width: 100%;
            min-height: 520px;
            display: flex;
            align-items: center;
            justify-content: center;
            background: transparent;
            transform-style: preserve-3d;
        }

        /* базовая страница (все общие стили) */
        .page {
            position: absolute;
            width: 90%;
            max-width: 580px;
            min-height: 500px;
            background-color: #fbf2e2;
            background-image:
                linear-gradient(165deg, rgba(190,165,130,0.2) 0%, transparent 45%),
                repeating-linear-gradient(45deg, rgba(140,115,80,0.1) 0px, rgba(140,115,80,0.1) 3px, transparent 3px, transparent 9px);
            border-radius: 0 6px 6px 0;
            box-shadow:
                0 5px 15px rgba(0,0,0,0.25),
                -6px 4px 10px rgba(0,0,0,0.2),
                inset 0 -2px 5px rgba(0,0,0,0.1),
                inset 4px 0 15px rgba(255, 245, 225, 0.8);
            padding: 35px 30px 30px 40px;
            border-left: 3px solid #b7a48c;
            border-right: 1px solid #d6c3ab;
            color: #2c241b;
            font-weight: 400;
            font-size: 1.3rem;
            line-height: 1.6;
            word-break: break-word;
            background-blend-mode: overlay;
            backface-visibility: hidden;   /* для 3D переворота скрываем заднюю сторону */
            transform-style: preserve-3d;
            transition: transform 0.9s cubic-bezier(0.45, 0.05, 0.2, 0.95);  /* плавный переворот */
            cursor: default;                /* не редактируется */
            transform-origin: left center;  /* перелистывание от левого края */
            box-shadow:
                0 8px 18px rgba(0,0,0,0.3),
                -8px 4px 12px rgba(0,0,0,0.2),
                inset 0 0 20px rgba(255,240,210,0.6);
        }

        /* текстурный слой поверх (шум/кракелюр) */
        .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="120" height="120" viewBox="0 0 120 120"><filter id="fuzzy"><feTurbulence baseFrequency="0.6 0.7" numOctaves="1" /><feColorMatrix values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0.18 0"/></filter><rect width="120" height="120" filter="url(%23fuzzy)" opacity="0.12"/></svg>');
            opacity: 0.2;
            pointer-events: none;
            border-radius: inherit;
        }

        /* линованные линии */
        .page-lines {
            position: absolute;
            top: 0; left: 0; width: 100%; height: 100%;
            background-image: repeating-linear-gradient(transparent 0px, transparent 30px, #bfaa8f 30px, #bfaa8f 31px);
            opacity: 0.25;
            pointer-events: none;
            z-index: 2;
        }

        /* блок с текстом (статичный) */
        .page-text {
            position: relative;
            z-index: 5;
            width: 100%;
            min-height: 430px;
            white-space: pre-wrap;
            overflow-y: auto;
            font-size: 1.5rem;
            color: #2d241b;
            text-shadow: 1px 1px 0 rgba(255,245,225,0.6);
        }

        /* номер страницы внизу */
        .page-num {
            position: absolute;
            bottom: 18px;
            right: 30px;
            font-size: 1.4rem;
            color: #a38767;
            background: rgba(245, 235, 215, 0.7);
            padding: 2px 15px 0 15px;
            border-radius: 40px;
            backdrop-filter: blur(2px);
            font-family: 'Caveat', cursive;
            z-index: 10;
            pointer-events: none;
            border: 1px solid #c7af8b;
        }

        /* Эффект загнутых уголков (декоративно) */
        .page::after {
            content: '';
            position: absolute;
            bottom: 5px; right: 5px;
            width: 35px; height: 35px;
            background: radial-gradient(circle at 100% 100%, rgba(150,120,80,0.4) 0%, transparent 70%);
            border-radius: 0 0 12px 0;
            pointer-events: none;
            z-index: 8;
        }

        /* КОГДА СТРАНИЦА ПЕРЕВЕРНУТА (слева) */
        .page.flipped-left {
            transform: rotateY(-170deg) translateZ(10px);  /* уходит влево, как перелистнутая */
            box-shadow: -15px 5px 25px rgba(0,0,0,0.4);
            filter: brightness(0.95) sepia(0.1);
            z-index: 5;  /* ниже активных */
        }

        /* текущая правая страница (открытая) */
        .page.front-right {
            transform: rotateY(0deg) translateZ(25px);  /* выдаётся вперёд */
            z-index: 30;
            box-shadow: 0 12px 25px rgba(0,0,0,0.5), -8px 6px 12px rgba(0,0,0,0.3);
        }

        /* страницы, которые ещё не открыты (лежат слева стопкой) - они скрыты за левой стороной */
        .page.stack-left {
            transform: rotateY(0deg) translateX(-100%) translateZ(1px);  /* убраны влево (за корешок) */
            opacity: 0;  /* полностью скрыты, но можно сделать полупрозрачными для теста */
            pointer-events: none;
            transition: none;  /* не анимируются, просто ждут */
            box-shadow: none;
        }

        /* центральная линия/корешок */
        .gutter {
            position: absolute;
            width: 12px;
            height: 100%;
            left: 45%;
            top: 0;
            background: radial-gradient(ellipse at center, #5b4633 0%, #392f22 90%);
            border-radius: 30%;
            transform: translateX(-50%) rotateY(20deg);
            box-shadow: -2px 0 8px #1f160e;
            z-index: 50;
            pointer-events: none;
        }

        /* кнопки навигации (стилизованные) */
        .nav-panel {
            display: flex;
            align-items: center;
            justify-content: center;
            gap: 35px;
            margin-top: 30px;
            margin-bottom: 10px;
        }

        .nav-btn {
            background: #ddcfbc;
            border: 3px solid #7c654b;
            font-size: 2rem;
            font-weight: bold;
            width: 65px;
            height: 65px;
            border-radius: 50%;
            cursor: pointer;
            box-shadow: 0 7px 0 #5f4a34;
            transition: 0.07s linear;
            color: #3f2e1b;
            display: inline-flex;
            align-items: center;
            justify-content: center;
            font-family: 'Caveat', monospace;
        }

        .nav-btn:active {
            transform: translateY(6px);
            box-shadow: 0 1px 0 #5f4a34;
        }

        .nav-btn.disabled {
            opacity: 0.3;
            pointer-events: none;
            box-shadow: 0 4px 0 #5f4a34;
            transform: translateY(3px);
        }

        .page-indicator {
            background: #eadbc9;
            padding: 12px 30px;
            border-radius: 60px;
            font-size: 1.9rem;
            font-weight: bold;
            color: #402f1e;
            box-shadow: inset 0 3px 8px #af957b, 0 7px 0 #705b44;
            font-family: 'Caveat', cursive;
            border: 1px solid #a08462;
            min-width: 150px;
            text-align: center;
        }
    </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 / 9</span>
                <button class="nav-btn" id="nextPageBtn" aria-label="следующая страница">▶</button>
            </div>
            <div style="text-align: center; color: #e7d7c0; margin-top: 8px; font-family: 'Caveat'; font-size: 1.3rem;">✎ рукописные заметки ✎</div>
        </div>
    </div>

    <script>
        (function() {
            // ================== ТЕКСТ СТРАНИЦ (ЗАДАЁТСЯ ЗДЕСЬ) ==================
            const pageTexts = [
                "ПЕРВАЯ СТРАНИЦА\n\nЭто текст, который задан прямо в коде. Можно написать здесь всё что угодно — стихи, рецепты, списки.\n\n• Пункт первый\n• Пункт второй\n\nИ так далее.",
               
                "Вторая страница блокнота.\n\nСегодня 20 февраля.\n\nПогода за окном прекрасная. Вспомнить, что нужно купить:\n— молоко\n— хлеб\n— тетрадь\n— карандаш.",
               
                "Третья страница.\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ут enim ad minim veniam, quis nostrud exercitation.\n\nРукописный шрифт приятно ложится на линию.",
               
                "ЧЕТВЁРТАЯ.\n\nИдеи для проекта:\n1. Набросать структуру\n2. Подобрать текстуры\n3. Сделать прототип\n4. Показать друзьям\n\nЗаметка: использовать тёплую цветовую гамму.",
               
                "Пятая страница — середина книги.\n\n✎ Здесь можно рисовать небольшие схемы.\n\n• Важный момент\n• Комментарий\n• Дата: 2026-02-20",
               
                "Шестая.\n\nЦитата дня:\n\"Воображение важнее знания\" (Эйнштейн).\n\nИ ещё немного текста для заполнения. У страниц есть лёгкая зернистость и линовка.",
               
                "Седьмая страница.\n\nСписок дел на неделю:\n-- Встреча с командой\n-- Забрать заказ\n-- Полить цветы\n-- Купить конверт\n-- Написать письмо",
               
                "ВОСЬМАЯ.\n\nРецепт любимого печенья:\nМука, масло, сахар, яйцо, ваниль. Перемешать, выпекать 15 минут при 180°.\n\nПометить: добавить орехи!",
               
                "ДЕВЯТАЯ СТРАНИЦА — финальная.\n\nПоследние мысли:\nКнига получилась уютной. Можно перелистывать кнопками, текст не редактируется, но полностью задан заранее.\n\nКонец."
            ];
            // ====================================================================

            const totalPages = 9;
            let currentPageIndex = 0;  // индекс открытой правой страницы (0 .. 8)

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

            // Функция: отрисовать все страницы с нуля
            function buildPages() {
                scene.innerHTML = ''; // очищаем

                // Добавим декоративный корешок (уже есть в HTML, но добавим программно для порядка)
                const gutterDiv = document.createElement('div');
                gutterDiv.className = 'gutter';
                scene.appendChild(gutterDiv);

                // Создаём страницы (от 0 до 8)
                for (let i = 0; i < totalPages; i++) {
                    const pageDiv = document.createElement('div');
                    pageDiv.className = 'page';
                    pageDiv.setAttribute('data-index', i);

                    // линовка (декоративный слой)
                    const lines = document.createElement('div');
                    lines.className = 'page-lines';
                   
                    // текстовая область со статичным содержимым
                    const textDiv = document.createElement('div');
                    textDiv.className = 'page-text';
                    textDiv.innerText = pageTexts[i] || `Страница ${i+1}\n[текст не задан]`;

                    // номер страницы
                    const numSpan = document.createElement('span');
                    numSpan.className = 'page-num';
                    numSpan.innerText = (i + 1).toString();

                    pageDiv.appendChild(lines);
                    pageDiv.appendChild(textDiv);
                    pageDiv.appendChild(numSpan);

                    scene.appendChild(pageDiv);
                }

                // Начальное состояние: все страницы сложены справа, кроме первой открытой.
                // currentPageIndex = 0 — открыта страница 1 (индекс 0).
                updatePagesState();
            }

            // Обновление позиций/классов страниц на основе currentPageIndex
            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 { // idx > currentPageIndex
                        // страницы, которые ещё не открыты — скрыты слева (за корешком)
                        // нам надо сделать их невидимыми, но не участвующими в анимации.
                        page.classList.add('stack-left');
                    }
                });

                // Обновить индикатор (показываем текущую страницу: currentPageIndex + 1)
                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;

                // Берём текущую страницу и страницу, которая станет новой правой (currentPageIndex+1)
                const currentPage = document.querySelector(`.page[data-index="${currentPageIndex}"]`);
                const nextPageElem = document.querySelector(`.page[data-index="${currentPageIndex + 1}"]`);

                if (!currentPage || !nextPageElem) return;

                // Подготовка: убираем stack-left у следующей страницы, чтобы она появилась, но пока закроется текущей
                nextPageElem.classList.remove('stack-left');
                // Принудительно ставим небольшую задержку reflow для анимации
                void currentPage.offsetWidth;

                // Начинаем переворот текущей страницы влево
                currentPage.classList.remove('front-right');
                currentPage.classList.add('flipped-left');

                // Следующая страница становится новой правой
                nextPageElem.classList.remove('stack-left');
                nextPageElem.classList.add('front-right');

                // Увеличиваем индекс
                currentPageIndex++;

                // Для всех страниц, которые меньше нового currentPageIndex, они должны быть flipped-left (уже были, ок)
                // А для страниц > currentPageIndex — stack-left
                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 { // 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);
            }

            // Перелистывание назад (уменьшаем индекс)
            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 (индекс меньше) должна выйти из flipped-left и стать front-right.
                // А текущая страница должна уйти в stack-left.
               
                // Подготовка: убираем у предыдущей страницы flipped-left и делаем её готовой стать правой
                prevPageElem.classList.remove('flipped-left', 'stack-left');
                // Небольшой reflow
                void currentPage.offsetWidth;

                // Текущая страница уходит направо? Нет, она уходит в стопку справа (stack-left)
                // но сначала нужно анимировать возврат? Для плавности мы сделаем так:
                // Быстро переключим классы, но для анимации нам нужно, чтобы prevPage появилась справа.
               
                // Устанавливаем prevPage как правую, а currentPage становится перевёрнутой?
                // Но при листании назад текущая страница переворачивается обратно направо?
                // упростим: резко обновим состояние, но с анимацией через классы.
                // Самая понятная реализация: мы меняем состояние мгновенно, но браузер сам анимирует transform.
               
                // Однако для красоты сделаем плавный переход:
                // 1. текущая страница получает класс flipped-left и теряет front-right
                // 2. предыдущая страница теряет flipped-left и получает front-right.
                // Но порядок важен: сначала запускаем анимацию на текущей, потом меняем предыдущую.
               
                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 (prevPageElem)
                    } 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);

            // Отключаем возможность редактирования: contenteditable не используется, текст статичен.
            // Дополнительная защита: запрещаем выделение через CSS (user-select: none уже стоит),
            // но если хочется разрешить копирование, можно убрать в .page-text user-select: text? оставим как есть.
            // Чтобы можно было копировать текст, но не редактировать:
            const style = document.createElement('style');
            style.innerHTML = '.page-text { user-select: text; }';
            document.head.appendChild(style);
            // Теперь текст можно выделить и скопировать, но нельзя изменить.
        })();
    </script>
    <!-- пояснение: текст можно копировать, но не редактировать. Перелистывание по кнопкам -->
    <div style="position: fixed; bottom: 12px; right: 20px; background: #dccfbb; padding: 6px 16px; border-radius: 40px; color: #3a2e1f; font-family: 'Caveat'; font-size: 1.2rem; box-shadow: 0 3px 8px #634f38;">📖 страницы перелистываются</div>
</body>
</html>[/html]

64

[html]<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Мрачный блокнот · перелистывание</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            user-select: none;
        }

        body {
            min-height: 100vh;
            background: #1c1410;  /* очень тёмный фон, почти чёрный с оттенком кожи */
            display: flex;
            align-items: center;
            justify-content: center;
            font-family: 'Caveat', 'Segoe Script', cursive;
            padding: 20px;
            perspective: 2600px;
        }

        @import url('https://fonts.googleapis.com/css2?family=Caveat:wght@400;600;700&display=swap');

        /* главная обложка — тёмный корешок с красным отливом */
        .book-wrapper {
            width: 100%;
            max-width: 750px;
            box-shadow: 0 30px 50px -15px rgba(0, 0, 0, 0.9), 0 0 0 1px #3e2b1d inset;
            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%;
            min-height: 520px;
            display: flex;
            align-items: center;
            justify-content: center;
            background: transparent;
            transform-style: preserve-3d;
        }

        /* страница — тёмная, старая бумага с текстурой */
        .page {
            position: absolute;
            width: 90%;
            max-width: 580px;
            min-height: 500px;
            background-color: #2e241b;  /* тёмная основа */
            background-image:
                linear-gradient(165deg, rgba(80, 55, 35, 0.5) 0%, transparent 50%),
                repeating-linear-gradient(45deg, rgba(70, 45, 25, 0.3) 0px, rgba(70, 45, 25, 0.3) 4px, transparent 4px, transparent 10px),
                radial-gradient(circle at 30% 40%, rgba(140, 80, 40, 0.2) 0%, transparent 40%);
            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),
                inset 4px 0 15px rgba(120, 70, 30, 0.4);
            padding: 35px 30px 30px 40px;
            border-left: 4px solid #4f3824;  /* более тёмный корешок */
            border-right: 1px solid #4d3621;
            color: #d9c6ad;  /* светлый текст для контраста */
            font-weight: 400;
            font-size: 1.3rem;
            line-height: 1.6;
            word-break: break-word;
            background-blend-mode: overlay, normal, normal;
            backface-visibility: hidden;
            transform-style: preserve-3d;
            transition: transform 0.9s cubic-bezier(0.45, 0.05, 0.2, 0.95);
            cursor: default;
            transform-origin: left center;
            text-shadow: 1px 1px 2px #0f0905;
        }

        /* усиленная текстура шума/кракелюра */
        .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.3;
            pointer-events: none;
            border-radius: inherit;
            mix-blend-mode: multiply;
        }

        /* линии — тёмные, но заметные */
        .page-lines {
            position: absolute;
            top: 0; left: 0; width: 100%; height: 100%;
            background-image: repeating-linear-gradient(transparent 0px, transparent 30px, #7f6242 30px, #7f6242 31px);
            opacity: 0.35;
            pointer-events: none;
            z-index: 2;
        }

        /* текст светлый, хорошо читается */
        .page-text {
            position: relative;
            z-index: 5;
            width: 100%;
            min-height: 430px;
            white-space: pre-wrap;
            overflow-y: auto;
            font-size: 1.5rem;
            color: #e2cfb5;
            text-shadow: 1px 1px 3px #1c130b;
            font-weight: 400;
        }

        /* номер страницы в стиле тёмного золота */
        .page-num {
            position: absolute;
            bottom: 18px;
            right: 30px;
            font-size: 1.4rem;
            color: #b48c5c;
            background: rgba(30, 20, 12, 0.8);
            padding: 2px 15px 0 15px;
            border-radius: 40px;
            backdrop-filter: blur(2px);
            font-family: 'Caveat', cursive;
            z-index: 10;
            pointer-events: none;
            border: 1px solid #6f4f30;
            box-shadow: inset 0 0 8px #221508;
        }

        /* уголки с тёмным отливом */
        .page::after {
            content: '';
            position: absolute;
            bottom: 5px; right: 5px;
            width: 35px; height: 35px;
            background: radial-gradient(circle at 100% 100%, rgba(80, 40, 15, 0.7) 0%, transparent 80%);
            border-radius: 0 0 12px 0;
            pointer-events: none;
            z-index: 8;
        }

        /* перелистнутая страница (ушла влево) */
        .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), inset 0 0 20px #3b2718;
        }

        /* страницы ещё не открытые — скрыты слева */
        .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;
        }

        /* нижний текст */
        .book-interior > div:last-child {
            text-align: center;
            color: #ac8a67;
            margin-top: 12px;
            font-family: 'Caveat';
            font-size: 1.4rem;
            letter-spacing: 2px;
            text-shadow: 0 0 8px #3b1c0c;
        }
    </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 / 9</span>
                <button class="nav-btn" id="nextPageBtn" aria-label="следующая страница">▶</button>
            </div>
            <div>✦  memento mori  ✦</div>
        </div>
    </div>

    <script>
        (function() {
            // Текст страниц (можно заменить на свой)
            const pageTexts = [
                "СТРАНИЦА ПЕРВАЯ\n\nВ тени старой библиотеки...\n\nПыль веков на переплётах.\n\n• вспомнить ритуал\n• зажечь свечу\n• записать сны",
               
                "ВТОРАЯ\n\nСегодня — 20 февраля.\n\nЗа окном туман. В комнате пахнет воском и старыми бумагами.\n\nНужно не забыть:\n— чёрный кофе\n— пергамент\n— сургуч",
               
                "ТРЕТЬЯ.\n\nQuod me nutrit me destruit.\n\nЧто питает меня, то и разрушает.\n\nМысли о времени, которое ускользает.",
               
                "ЧЕТВЁРТАЯ.\n\nИмена:\n• Элспет\n• Морвен\n• Исбрандт\n\nЗачем они здесь? Записная книжка хранит тайны.",
               
                "ПЯТАЯ.\n\nРецепт тёмного эликсира:\n— корень дягиля\n— полынь\n— железный купорос (щепотка)\nНастаивать на луне.",
               
                "ШЕСТАЯ.\n\nЦитата:\n\"Мы сами создаём тени, которые нас пугают.\"\n\nИ ещё несколько строк просто для ритма.",
               
                "СЕДЬМАЯ.\n\nСписок дел на тёмную неделю:\n-- перебрать гербарий\n-- наточить перья\n-- написать три письма\n-- молчать три дня",
               
                "ВОСЬМАЯ.\n\nЗдесь был рисунок углём.\n\nНо время стёрло его.\n\nОстался только отпечаток.",
               
                "ДЕВЯТАЯ — финал.\n\nПоследняя страница.\n\nКнига закрывается, но истории остаются.\n\nПомни о свете даже в темноте."
            ];

            const totalPages = 9;
            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);

                for (let i = 0; i < totalPages; i++) {
                    const pageDiv = document.createElement('div');
                    pageDiv.className = 'page';
                    pageDiv.setAttribute('data-index', i);

                    const lines = document.createElement('div');
                    lines.className = 'page-lines';
                   
                    const textDiv = document.createElement('div');
                    textDiv.className = 'page-text';
                    textDiv.innerText = pageTexts[i] || `Страница ${i+1}\n[пусто]`;

                    const numSpan = document.createElement('span');
                    numSpan.className = 'page-num';
                    numSpan.innerText = (i + 1).toString();

                    pageDiv.appendChild(lines);
                    pageDiv.appendChild(textDiv);
                    pageDiv.appendChild(numSpan);

                    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);

            // разрешаем копирование текста
            const style = document.createElement('style');
            style.innerHTML = '.page-text { user-select: text; }';
            document.head.appendChild(style);
        })();
    </script>
    <!-- маленькая подпись в стиле "memento" -->
    <div style="position: fixed; bottom: 12px; right: 20px; background: #281c14; padding: 6px 18px; border-radius: 40px; color: #bc987a; font-family: 'Caveat'; font-size: 1.2rem; box-shadow: 0 3px 8px #0a0502; border: 1px solid #5d3e28;">🕯️  tenebris  🕯️</div>
</body>
</html>[/html]

65

[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=Crimson+Text:ital,wght@0,400;0,600;0,700;1,400;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;
            font-family: 'Crimson Text', serif;
            padding: 15px;
            perspective: 2600px;
        }

        /* главная обложка — тёмный корешок с красным отливом (из первого) */
        .book-wrapper {
            width: 100%;
            max-width: 800px;
            box-shadow: 0 30px 50px -15px rgba(0, 0, 0, 0.9), 0 0 0 1px #3e2b1d inset;
            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%;
            min-height: 620px; /* чуть выше для комфорта */
            display: flex;
            align-items: center;
            justify-content: center;
            background: transparent;
            transform-style: preserve-3d;
        }

        /* СТРАНИЦА — общие стили, но с двумя вариантами оформления */
        .page {
            position: absolute;
            width: 90%;
            max-width: 620px;
            min-height: 580px;
            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;
        }

        /* ===== ТИП ПЕРВЫЙ (МУЖСКОЙ/ЗЕЛЁНЫЙ) ===== */
        .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: 'Crimson Text', 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;
        }

        /* ===== ТИП ВТОРОЙ (КРАСНЫЙ/ТЁМНЫЙ) ===== */
        .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: 'Crimson Text', 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;
        }

        /* дата */
        .date-plate {
            font-size: 1.2rem;
            padding: 8px 24px;
            margin-bottom: 20px;
            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;
        }

        .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;
            border-radius: 26px;
            padding: 25px 30px;
            overflow-y: auto;
            scrollbar-width: thin;
            margin-top: 5px;
            box-sizing: border-box;
            max-height: 380px; /* чтобы помещалось в страницу */
        }

        .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;
        }

        .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;
        }

        .entry {
            font-size: 1.1rem;
            line-height: 1.7;
            white-space: pre-wrap;
        }

        .character-two .entry {
            font-family: 'Crimson Text', serif;
        }

        /* текстурный слой (как в первом коде) */
        .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 {
            position: absolute;
            bottom: 18px;
            right: 30px;
            font-size: 1.4rem;
            color: #b48c5c;
            background: rgba(30, 20, 12, 0.8);
            padding: 2px 15px 0 15px;
            border-radius: 40px;
            backdrop-filter: blur(2px);
            font-family: 'Caveat', cursive;
            z-index: 10;
            pointer-events: none;
            border: 1px solid #6f4f30;
        }

        .page::after {
            content: '';
            position: absolute;
            bottom: 5px; right: 5px;
            width: 35px; height: 35px;
            background: radial-gradient(circle at 100% 100%, rgba(80, 40, 15, 0.7) 0%, transparent 80%);
            border-radius: 0 0 12px 0;
            pointer-events: none;
            z-index: 8;
        }

        /* состояния перелистывания */
        .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 {
                min-height: 520px;
            }
           
            .page {
                min-height: 480px;
                padding: 20px 20px 20px 25px;
                width: 95%;
            }
           
            .entry-bubble {
                padding: 15px;
                max-height: 300px;
            }
           
            .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: 1rem;
                padding: 5px 18px;
            }
           
            .entry {
                font-size: 1rem;
            }
        }

        /* разрешаем выделение текста внутри */
        .entry {
            user-select: text;
        }
    </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>
   
    <!-- крошечная подпись -->
    <div style="position: fixed; bottom: 12px; right: 20px; background: #281c14; padding: 6px 18px; border-radius: 40px; color: #bc987a; font-family: 'Caveat'; font-size: 1.2rem; box-shadow: 0 3px 8px #0a0502; border: 1px solid #5d3e28;">🕯️ tenebris 🕯️</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.' },
               
                { type: 'character-two', date: '13 октября', text: 'Сегодня ночью спал просто отвратительно. По ощущениям будто кто-то подкинул мне в голову взрывчатку - подкрался, пока я дремал, открыл черепную крышку, сбросил туда всякой дряни, закрыл и убежал со всех ног. Ментальный подкидыш, взрывоопасная бредятина. Причем сон начинался просто чудесно - я, кажется, был на задании или просто развлекался славной "охотой", я отчетливо помню, как пролезал в чье-то тело, подслушивал чужой пульс, окунался в чужие крики, но потом.. потом я полностью потерял контроль над своим телом.' },
               
                { type: 'character-one', date: '14 октября', text: 'Сегодня был продуктивный день. Удалось закончить старые дела и даже немного поразмышлять о будущем. Кажется, я на верном пути. Нужно записать несколько идей:\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);
                   
                    const numSpan = document.createElement('span');
                    numSpan.className = 'page-num';
                    numSpan.innerText = (index + 1).toString();

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

                    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; // форсируем reflow

                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]

66

[html]<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Мрачный блокнот · текст в HTML</title>
    <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;
            font-family: 'Caveat', 'Segoe Script', cursive;
            padding: 20px;
            perspective: 2600px;
        }

        @import url('https://fonts.googleapis.com/css2?family=Caveat:wght@400;600;700&display=swap');

        .book-wrapper {
            width: 100%;
            max-width: 750px;
            box-shadow: 0 30px 50px -15px rgba(0, 0, 0, 0.9), 0 0 0 1px #3e2b1d inset;
            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%;
            min-height: 520px;
            display: flex;
            align-items: center;
            justify-content: center;
            background: transparent;
            transform-style: preserve-3d;
        }

        /* страница — тёмная основа */
        .page {
            position: absolute;
            width: 90%;
            max-width: 580px;
            min-height: 500px;
            background-color: #2e241b;
            background-image:
                linear-gradient(165deg, rgba(80, 55, 35, 0.5) 0%, transparent 50%),
                repeating-linear-gradient(45deg, rgba(70, 45, 25, 0.3) 0px, rgba(70, 45, 25, 0.3) 4px, transparent 4px, transparent 10px),
                radial-gradient(circle at 30% 40%, rgba(140, 80, 40, 0.2) 0%, transparent 40%);
            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),
                inset 4px 0 15px rgba(120, 70, 30, 0.4);
            padding: 35px 30px 30px 40px;
            border-left: 4px solid #4f3824;
            border-right: 1px solid #4d3621;
            color: #d9c6ad;
            font-weight: 400;
            font-size: 1.3rem;
            line-height: 1.6;
            word-break: break-word;
            background-blend-mode: overlay, normal, normal;
            backface-visibility: hidden;
            transform-style: preserve-3d;
            transition: transform 0.9s cubic-bezier(0.45, 0.05, 0.2, 0.95);
            cursor: default;
            transform-origin: left center;
            text-shadow: 1px 1px 2px #0f0905;
        }

        /* текстура шума */
        .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.3;
            pointer-events: none;
            border-radius: inherit;
            mix-blend-mode: multiply;
        }

        /* линии */
        .page-lines {
            position: absolute;
            top: 0; left: 0; width: 100%; height: 100%;
            background-image: repeating-linear-gradient(transparent 0px, transparent 30px, #7f6242 30px, #7f6242 31px);
            opacity: 0.35;
            pointer-events: none;
            z-index: 2;
        }

        /* текстовая область */
        .page-text {
            position: relative;
            z-index: 5;
            width: 100%;
            min-height: 430px;
            white-space: pre-wrap;
            overflow-y: auto;
            font-size: 1.5rem;
            color: #e2cfb5;
            text-shadow: 1px 1px 3px #1c130b;
            font-weight: 400;
        }

        /* номер страницы */
        .page-num {
            position: absolute;
            bottom: 18px;
            right: 30px;
            font-size: 1.4rem;
            color: #b48c5c;
            background: rgba(30, 20, 12, 0.8);
            padding: 2px 15px 0 15px;
            border-radius: 40px;
            backdrop-filter: blur(2px);
            font-family: 'Caveat', cursive;
            z-index: 10;
            pointer-events: none;
            border: 1px solid #6f4f30;
            box-shadow: inset 0 0 8px #221508;
        }

        /* уголки */
        .page::after {
            content: '';
            position: absolute;
            bottom: 5px; right: 5px;
            width: 35px; height: 35px;
            background: radial-gradient(circle at 100% 100%, rgba(80, 40, 15, 0.7) 0%, transparent 80%);
            border-radius: 0 0 12px 0;
            pointer-events: none;
            z-index: 8;
        }

        .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), inset 0 0 20px #3b2718;
        }

        .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;
        }

        .book-interior > div:last-child {
            text-align: center;
            color: #ac8a67;
            margin-top: 12px;
            font-family: 'Caveat';
            font-size: 1.4rem;
            letter-spacing: 2px;
            text-shadow: 0 0 8px #3b1c0c;
        }
    </style>
</head>
<body>
    <div class="book-wrapper">
        <div class="book-interior">
            <div class="flip-scene" id="flipScene">
                <div class="gutter"></div>

                <!-- ========== СТРАНИЦЫ С ТЕКСТОМ В HTML ========== -->
                <!-- Страница 1 -->
                <div class="page" data-index="0">
                    <div class="page-lines"></div>
                    <div class="page-text">
                        СТРАНИЦА ПЕРВАЯ<br><br>
                        В тени старой библиотеки...<br><br>
                        Пыль веков на переплётах.<br><br>
                        • вспомнить ритуал<br>
                        • зажечь свечу<br>
                        • записать сны
                    </div>
                    <span class="page-num">1</span>
                </div>

                <!-- Страница 2 -->
                <div class="page" data-index="1">
                    <div class="page-lines"></div>
                    <div class="page-text">
                        ВТОРАЯ<br><br>
                        Сегодня — 20 февраля.<br><br>
                        За окном туман. В комнате пахнет воском и старыми бумагами.<br><br>
                        Нужно не забыть:<br>
                        — чёрный кофе<br>
                        — пергамент<br>
                        — сургуч
                    </div>
                    <span class="page-num">2</span>
                </div>

                <!-- Страница 3 -->
                <div class="page" data-index="2">
                    <div class="page-lines"></div>
                    <div class="page-text">
                        ТРЕТЬЯ.<br><br>
                        Quod me nutrit me destruit.<br><br>
                        Что питает меня, то и разрушает.<br><br>
                        Мысли о времени, которое ускользает.
                    </div>
                    <span class="page-num">3</span>
                </div>

                <!-- Страница 4 -->
                <div class="page" data-index="3">
                    <div class="page-lines"></div>
                    <div class="page-text">
                        ЧЕТВЁРТАЯ.<br><br>
                        Имена:<br>
                        • Элспет<br>
                        • Морвен<br>
                        • Исбрандт<br><br>
                        Зачем они здесь? Записная книжка хранит тайны.
                    </div>
                    <span class="page-num">4</span>
                </div>

                <!-- Страница 5 -->
                <div class="page" data-index="4">
                    <div class="page-lines"></div>
                    <div class="page-text">
                        ПЯТАЯ.<br><br>
                        Рецепт тёмного эликсира:<br>
                        — корень дягиля<br>
                        — полынь<br>
                        — железный купорос (щепотка)<br>
                        Настаивать на луне.
                    </div>
                    <span class="page-num">5</span>
                </div>

                <!-- Страница 6 -->
                <div class="page" data-index="5">
                    <div class="page-lines"></div>
                    <div class="page-text">
                        ШЕСТАЯ.<br><br>
                        Цитата:<br>
                        "Мы сами создаём тени, которые нас пугают."<br><br>
                        И ещё несколько строк просто для ритма.
                    </div>
                    <span class="page-num">6</span>
                </div>

                <!-- Страница 7 -->
                <div class="page" data-index="6">
                    <div class="page-lines"></div>
                    <div class="page-text">
                        СЕДЬМАЯ.<br><br>
                        Список дел на тёмную неделю:<br>
                        -- перебрать гербарий<br>
                        -- наточить перья<br>
                        -- написать три письма<br>
                        -- молчать три дня
                    </div>
                    <span class="page-num">7</span>
                </div>

                <!-- Страница 8 -->
                <div class="page" data-index="7">
                    <div class="page-lines"></div>
                    <div class="page-text">
                        ВОСЬМАЯ.<br><br>
                        Здесь был рисунок углём.<br><br>
                        Но время стёрло его.<br><br>
                        Остался только отпечаток.
                    </div>
                    <span class="page-num">8</span>
                </div>

                <!-- Страница 9 -->
                <div class="page" data-index="8">
                    <div class="page-lines"></div>
                    <div class="page-text">
                        ДЕВЯТАЯ — финал.<br><br>
                        Последняя страница.<br><br>
                        Книга закрывается, но истории остаются.<br><br>
                        Помни о свете даже в темноте.
                    </div>
                    <span class="page-num">9</span>
                </div>
                <!-- ========== КОНЕЦ СТРАНИЦ ========== -->
            </div>

            <div class="nav-panel">
                <button class="nav-btn" id="prevPageBtn" aria-label="предыдущая страница">◀</button>
                <span class="page-indicator" id="indicator">стр. 1 / 9</span>
                <button class="nav-btn" id="nextPageBtn" aria-label="следующая страница">▶</button>
            </div>
            <div>✦  memento mori  ✦</div>
        </div>
    </div>

    <!-- Небольшой декоративный элемент -->
    <div style="position: fixed; bottom: 12px; right: 20px; background: #281c14; padding: 6px 18px; border-radius: 40px; color: #bc987a; font-family: 'Caveat'; font-size: 1.2rem; box-shadow: 0 3px 8px #0a0502; border: 1px solid #5d3e28;">🕯️  tenebris  🕯️</div>

    <script>
        (function() {
            // ========== ТОЛЬКО ЛОГИКА ПЕРЕЛИСТЫВАНИЯ, ТЕКСТ В HTML ==========
            const totalPages = 9;
            let currentPageIndex = 0;

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

            // Функция обновления классов страниц
            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; // форсируем reflow

                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);
            }

            // Инициализация начального состояния
            updatePagesState();

            // Назначаем обработчики
            prevBtn.addEventListener('click', prevPage);
            nextBtn.addEventListener('click', nextPage);

            // Разрешаем копирование текста
            const style = document.createElement('style');
            style.innerHTML = '.page-text { user-select: text; }';
            document.head.appendChild(style);
        })();
    </script>
</body>
</html>[/html]

67

[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=Crimson+Text:ital,wght@0,400;0,600;0,700;1,400;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;
            font-family: 'Crimson Text', serif;
            padding: 15px;
            perspective: 2600px;
        }

        .book-wrapper {
            width: 100%;
            max-width: 800px;
            box-shadow: 0 30px 50px -15px rgba(0, 0, 0, 0.9), 0 0 0 1px #3e2b1d inset;
            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%;
            min-height: 650px; /* Увеличил минимальную высоту */
            display: flex;
            align-items: center;
            justify-content: center;
            background: transparent;
            transform-style: preserve-3d;
        }

        .page {
            position: absolute;
            width: 90%;
            max-width: 620px;
            min-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;
        }

        /* Тип первый (зелёный) */
        .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: 'Crimson Text', 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;
        }

        /* Тип второй (красный) */
        .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: 'Crimson Text', 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; /* Важно для flex-контейнера */
            height: 100%;
        }

        .date-plate {
            font-size: 25px;
            padding: 8px 24px;
            margin-bottom: 20px;
            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;
            border-radius: 26px;
            padding: 25px 30px;
            overflow-y: auto;
            scrollbar-width: thin;
            min-height: 0; /* Важно для flex */
            height: auto;
            max-height: none; /* Убираем ограничение */
            box-sizing: border-box;
        }

        .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;
        }

        .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;
        }

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

        .character-two .entry {
            font-family: 'Crimson Text', serif;
        }

        /* текстурный слой */
        .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 {
            position: absolute;
            bottom: 18px;
            right: 30px;
            font-size: 1.4rem;
            color: #b48c5c;
            background: rgba(30, 20, 12, 0.8);
            padding: 2px 15px 0 15px;
            border-radius: 40px;
            backdrop-filter: blur(2px);
            font-family: 'Caveat', cursive;
            z-index: 10;
            pointer-events: none;
            border: 1px solid #6f4f30;
        }

        .page::after {
            content: '';
            position: absolute;
            bottom: 5px; right: 5px;
            width: 35px; height: 35px;
            background: radial-gradient(circle at 100% 100%, rgba(80, 40, 15, 0.7) 0%, transparent 80%);
            border-radius: 0 0 12px 0;
            pointer-events: none;
            z-index: 8;
        }

        .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 {
                min-height: 550px;
            }
           
            .page {
                min-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: 1rem;
                padding: 5px 18px;
            }
           
            .entry {
                font-size: 1rem;
            }
        }

        /* Ещё более мелкие экраны */
        @media (max-width: 400px) {
            .flip-scene {
                min-height: 500px;
            }
           
            .page {
                min-height: 470px;
                padding: 15px;
            }
           
            .entry-bubble {
                padding: 12px;
            }
        }
    </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>
   
    <div style="position: fixed; bottom: 12px; right: 20px; background: #281c14; padding: 6px 18px; border-radius: 40px; color: #bc987a; font-family: 'Caveat'; font-size: 1.2rem; box-shadow: 0 3px 8px #0a0502; border: 1px solid #5d3e28;">🕯️ tenebris 🕯️</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— подготовить ингредиенты' },
               
                { 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);
                   
                    const numSpan = document.createElement('span');
                    numSpan.className = 'page-num';
                    numSpan.innerText = (index + 1).toString();

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

                    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]

68

[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=Crimson+Text:ital,wght@0,400;0,600;0,700;1,400;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;
            font-family: 'Crimson Text', serif;
            padding: 15px;
            perspective: 2600px;
        }

        .book-wrapper {
            width: 100%;
            max-width: 800px;
            box-shadow: 0 30px 50px -15px rgba(0, 0, 0, 0.9), 0 0 0 1px #3e2b1d inset;
            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; /* Фиксированная высота вместо min-height */
            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;
        }

        /* Тип первый (зелёный) */
        .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: 'Crimson Text', 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;
        }

        /* Тип второй (красный) */
        .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: 'Crimson Text', 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; /* Критично для flex-контейнера с прокруткой */
            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 (Chrome, Safari) */
            &::-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);
            }
        }

        /* Стили для Firefox */
        .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-two .entry {
            font-family: 'Crimson Text', serif;
        }

        /* текстурный слой */
        .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 {
            position: absolute;
            bottom: 18px;
            right: 30px;
            font-size: 1.4rem;
            color: #b48c5c;
            background: rgba(30, 20, 12, 0.8);
            padding: 2px 15px 0 15px;
            border-radius: 40px;
            backdrop-filter: blur(2px);
            font-family: 'Caveat', cursive;
            z-index: 10;
            pointer-events: none;
            border: 1px solid #6f4f30;
        }

        .page::after {
            content: '';
            position: absolute;
            bottom: 5px; right: 5px;
            width: 35px; height: 35px;
            background: radial-gradient(circle at 100% 100%, rgba(80, 40, 15, 0.7) 0%, transparent 80%);
            border-radius: 0 0 12px 0;
            pointer-events: none;
            z-index: 8;
        }

        .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: 20px;
                padding: 5px 18px;
            }
           
            .entry {
                font-size: 16px;
            }
        }

        /* Ещё более мелкие экраны */
        @media (max-width: 400px) {
            .flip-scene {
                height: 500px;
            }
           
            .page {
                height: 470px;
                padding: 15px;
            }
           
            .entry-bubble {
                padding: 12px;
            }
           
            .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>
   
    <div style="position: fixed; bottom: 12px; right: 20px; background: #281c14; padding: 6px 18px; border-radius: 40px; color: #bc987a; font-family: 'Caveat'; font-size: 1.2rem; box-shadow: 0 3px 8px #0a0502; border: 1px solid #5d3e28;">🕯️ tenebris 🕯️</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: 'Сегодня ночью спал просто отвратительно. По ощущениям будто кто-то подкинул мне в голову взрывчатку - подкрался, пока я дремал, открыл черепную крышку, сбросил туда всякой дряни, закрыл и убежал со всех ног. Ментальный подкидыш, взрывоопасная бредятина. Причем сон начинался просто чудесно - я, кажется, был на задании или просто развлекался славной "охотой", я отчетливо помню, как пролезал в чье-то тело, подслушивал чужой пульс, окунался в чужие крики, но потом.. потом я полностью потерял контроль над своим телом. Нет, я продолжил начатое, но будто бы уже не по своей воле, я наносил своей жертве увечья, но не там, где хотел их нанести, и пытал ее не теми способами, которыми всегда предпочитал.. Из дирижёра я превратился в обычного зрителя, пусть и посаженного в первых рядах. Очень гадкое ощущение, когда ты, вроде бы, делаешь все то, что хотел сделать изначально, но по чьей-то указке, по чьему-то велению, в совершенно ином, не согласованном с тобой, виде. Я потратил три тысячелетия на то, чтобы двинуть хотя бы пальцем, чтобы сделать хоть что-то самостоятельно, а не лицезреть парализованным истуканом, как льются реки крови из вспоротых глоток. Творить нечто настолько упоительно сладкое и грешное, но не по доброй воле - самое мерзкое, самое унизительное и святотатственное, что можно придумать. Грешить нужно осознанно. По велению своего выбора, своего решения, своей тяги, иначе это просто кукольная постановка, где ты болтаешься на невидимых ниточках, где ты и не убийца даже, а лишь инструмент того, кто в действительности является убийцей. Заснуть снова я так и не смог, однако днем был весьма бодр. Подумаешь, скверный сон. И не такое случалось.' },
               
                { 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);
                   
                    const numSpan = document.createElement('span');
                    numSpan.className = 'page-num';
                    numSpan.innerText = (index + 1).toString();

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

                    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]

69

[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=Crimson+Text:ital,wght@0,400;0,600;0,700;1,400;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;
            font-family: 'Crimson Text', serif;
            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;
        }

        /* Тип первый (зелёный) */
        .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: 'Crimson Text', 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;
        }

        /* Тип второй (красный) */
        .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: 'Crimson Text', 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-two .entry {
            font-family: 'Crimson Text', serif;
        }

        /* текстурный слой */
        .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 {
            display: none;
        }

        /* Убираем декоративный уголок */
        .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: 20px;
                padding: 5px 18px;
            }
           
            .entry {
                font-size: 16px;
            }
        }

        @media (max-width: 400px) {
            .flip-scene {
                height: 500px;
            }
           
            .page {
                height: 470px;
                padding: 15px;
            }
           
            .entry-bubble {
                padding: 12px;
            }
           
            .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]

70

[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=Cormorant+Garamond:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&family=JetBrains+Mono:ital,wght@0,100..800;1,100..800&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;
        }

        /* Тип первый (зелёный) — шрифт Cormorant Garamond */
        .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: 'Cormorant Garamond', 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;
        }

        /* Тип второй (красный) — шрифт JetBrains Mono */
        .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: 'JetBrains Mono', monospace;
            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: 19px; /* Чуть крупнее для Garamond */
            letter-spacing: 0.3px;
        }

        .character-two .entry {
            font-weight: 350; /* Light version для лучшей читаемости */
            font-size: 17px; /* Моноширинные обычно лучше смотрятся чуть мельче */
            line-height: 1.8; /* Чуть больше интервал для моноширинного */
        }

        /* текстурный слой */
        .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: 20px;
                padding: 5px 18px;
            }
           
            .character-one .entry {
                font-size: 17px;
            }
           
            .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: 16px;
            }
           
            .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]

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

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



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