Не подглядывайте, ёпта!

тёмный лорд одержал победу во второй магической войне, установив тоталитарный режим. волшебное общество оказалось разделено на касты по чистоте крови, границы закрыты, а репрессии и дискриминация стали нормой. надежда на перемены теперь связана с сопротивлением, которое по масштабу превзошло сам орден феникса.
best episode
best post
ronald weasley:— Ничего, — его голос сиплый и едва слышный. Голубые глаза расширены. — Не чувствую ничего, — повторяет он. Отчего-то Рональд не решается повернуть голову и посмотреть в лицо Тео. Все его тело вновь парализовано, дыхание сбито. Волосы на затылке встают дыбом от осознания своей совершенной беспомощности...

Squirrel test

Объявление

тебе сюда
итоги экспедиции
выберись из неё
новый расклад
сыграй в маджонг

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

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


    Вы здесь » Squirrel test » — мироустройство » лето 2026


    лето 2026

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

    1

    Рыбатекст используется дизайнерами, проектировщиками и фронтендерами, когда нужно быстро заполнить макеты или прототипы содержимым. Это тестовый контент, который не должен нести никакого смысла, лишь показать наличие самого текста или продемонстрировать типографику в деле.

    Рыбатекст используется дизайнерами, проектировщиками и фронтендерами, когда нужно быстро заполнить макеты или прототипы содержимым. Это тестовый контент, который не должен нести никакого смысла, лишь показать наличие самого текста или продемонстрировать типографику в деле.

    Код:
    Рыбатекст используется дизайнерами, проектировщиками и фронтендерами, когда нужно быстро заполнить макеты или прототипы содержимым. Это тестовый контент, который не должен нести никакого смысла, лишь показать наличие самого текста или продемонстрировать типографику в деле.
    спойлер

    Рыбатекст используется дизайнерами, проектировщиками и фронтендерами, когда нужно быстро заполнить макеты или прототипы содержимым. Это тестовый контент, который не должен нести никакого смысла, лишь показать наличие самого текста или продемонстрировать типографику в деле.

    0

    2

    [html]
    <style>
    :root {
      --monster-img: url('https://forumstatic.ru/files/0014/d2/5e/23060.png');
      --shit-img: url('https://forumstatic.ru/files/0014/d2/5e/77318.png');
      --hat-img: url('https://forumstatic.ru/files/0014/d2/5e/46467.png');
    }

    .dark {
      --shit-img: url('https://forumstatic.ru/files/0014/d2/5e/34632.png');
      --hat-img: url('https://forumstatic.ru/files/0014/d2/5e/41096.png');
    }

    .guestbook-main {
      width: 100%;
      box-sizing: border-box;
      background: var(--footer);
      border-radius: 20px;
      min-height: 400px;
      padding: 20px;
    position: relative;
    overflow: visible;
    }

    .inner {background: rgba(214, 214, 214, 0.7);
    padding: 20px;
      border-radius: 20px;
    position: relative;
    z-index: 2;}

    .guestbook-decor {
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      pointer-events: none;
    overflow: visible;
    }

    .monster,
    .shit,
    .hat {
      background-size: contain;
      background-repeat: no-repeat;
      background-position: center;
    }

    .monster { background-image: var(--monster-img);
    position: absolute;
      bottom: 0;
      left: -15px;
      width: 109px;
      height: 185px;
      z-index: 3;
      top: -36px;
      background-image: var(--monster-img);
      background-size: contain;
      background-repeat: no-repeat;
      background-position: center; }
    .shit   {  position: absolute;
      top: -7px;
      left: 297px;
      width: 52px;
      height: 31px;
      z-index: 1;
      background-image: var(--shit-img);
      background-size: contain;
      background-repeat: no-repeat;
      background-position: center;}
    .hat    {  position: absolute;
      top: 32px;
      right: 4px;
      width: 60px;
      height: 53px;
      z-index: 2;
      background-image: var(--hat-img);
      background-size: contain;
      background-repeat: no-repeat;
      background-position: center; }

    .tooltip {
      position: relative;
      display: inline-block;
      cursor: pointer;
    }

    .tooltip .tooltiptext {
      visibility: hidden;
      height: auto;
      background-color: var(--sec-bg);
      color: var(--textcolor);
      text-align: center;
      border-radius: 6px;
      position: absolute;
      z-index: 999;
      transform: translateX(-50%);
      opacity: 0;
      transition: opacity 0.5s;
      font-size: 9px;
      box-shadow: 2px 2px 6px rgba(0, 0, 0, 0.7);
      line-height: 1.4;
      overflow: hidden;
      top: 10px;
      padding: 5px;
      min-width: 100px;
    }

    .tooltip:hover .tooltiptext {
      visibility: visible;
      opacity: 1;
    }

    .guest-header {
    font-family: var(--news-font);
        font-size: 120px;
        line-height: 100%;
        color: var(--dark-accent);
        margin-top: -53px;
        z-index: 2;
        text-align: center;
        text-transform: uppercase;
        position: relative;
    }

    .guest-about {
      position: relative;
      width: 100%;       
      box-sizing: border-box;
      background: var(--light-accent);
      color: var(--textcolor);
      border-radius: 3px;
      text-align: center;
      padding: 3px;
      margin-bottom: 10px;
    }

    .deadlist {
      position: relative; 
      width: 100%;   
      box-sizing: border-box;
      font-style: normal;
      font-weight: 400;
      font-size: 10px;
      line-height: 1.4;   
      text-transform: lowercase;
      margin-top: 10px;
      text-align: left;
    }

    .guest-table {
      display: flex;
      flex-direction: row;
      gap: 10px;
    margin-top: -10px;
    }

    .column1 {
    flex: 4;
        font-style: normal;
        font-weight: 400;
        font-size: 10px;
        line-height: 100%;
        text-align: justify;
        text-transform: lowercase;
        box-sizing: border-box;
        z-index: 10;
        min-width: 25%;
    }

    .column1 span {
      display: block;
      font-style: normal;
      font-weight: 700;
      font-size: 11px;
      line-height: 11px;
      text-align: center;
      text-transform: lowercase;
      color: var(--profilelight);
      box-sizing: border-box;
      background: var(--body-bg);
      border-radius: 3px;
      padding: 2px;
      margin-bottom: 5px;
    color: var(--white)
    }

    .column1 a {
      color: var(--white);
    }

    .dark .column1 span {color: var(--textcolor);
    background: var(--sec-bg)}
    .dark .column1 span a {color: var(--textcolor);}
    .dark .column1 span a:hover {color: var(--footer);}

    .dark .guest-links a {color: var(--textcolor);
    background: var(--link-hover)}

    .column1 a:hover {
      color: var(--link);
    }

    .dark .guest-links a:hover {
      color: var(--footer);
    }

    .dark .guidelines {background: var(--sec-bg);
    color: var(--textcolor)}
    .dark .guest-about {background: var(--link-hover)}

    .column2 {
      width: 54%;
      box-sizing: border-box;
    }

    .column3 {
      box-sizing: border-box;
      text-align: center;
      display: flex;
      flex-direction: column;
      width: 240px;   
      flex-shrink: 0; 
    }

    .faces-roles-container {
      display: flex;
      flex-direction: row;
      gap: 5px;
    }

    .faces, .roles {
      flex: 1;
    }

    .faces-title, .roles-title {
      font-family: var(--extra-font);
      color: var(--link);
      text-align: center;
      font-size: 18px;
      line-height: 88%;
    }

    .faces-body, .roles-body {
    border-radius: 5px;
        padding: 5px;
        margin-top: 10px;
        background: var(--guest-overlay);
        color: var(--sec-bg);
        text-align: center;
        min-height: 300px;
        text-transform: lowercase;
    }

    .faces-body a, .roles-body a {
      position: relative;
      z-index: 10;
      color: var(--textcolor);
    }

    .faces-body a:hover, .roles-body a:hover {
      color: var(--link);
    }

    .guidelines {
      width: 100%;
      padding: 3px;
      font-weight: 400;
      font-size: 10px;
      line-height: 88%;
      text-align: center;
      text-transform: lowercase;
      color: var(--white);
      background: var(--body-bg);
      border-radius: 3px;
      margin-bottom: 10px;
      box-sizing: border-box;
    font-weight: bold;
    }

    .guest-links {
      display: flex;
      flex-wrap: wrap;
      gap: 5px;
      z-index: 10;
      padding-top: 10px;
      justify-content: center;
    }

    .guest-links a:hover {
      background: var(--dark-accent);
    }

    .guest-links a {
      color: var(--footer);
      background: var(--light-accent);
      padding: 2px 5px;
      border-radius: 3px;
    }

    .guest-links a:hover {background: var(--body-bg);}

    .guest-ams {
      display: grid;
      grid-template-columns: repeat(3, 65px);
      gap: 5px;
      justify-content: center;
      margin: 0 auto;
    }

    .guest-ams .tooltip:nth-child(4) {
      grid-column: 2 / 3;
    }

    .guest-ams img {
      width: 65px;
      height: 30px;
      background: var(--light-accent);
      object-fit: cover;
      object-position: top center;
      border-radius: 5px;
      position: relative;
    }

    .ams-2 {display: flex;
        align-items: center;
        justify-content: center;
        margin-left: 100px;
        gap: 5px;}

    .image-container {
      position: relative;
      width: 65px;
      height: 30px;
      border-radius: 5px;
      overflow: hidden;
    }

    .image-container img {
      width: 100%;
      height: 100%;
      object-fit: cover;
      object-position: top center;
      background: var(--light-accent);
      border-radius: inherit;
    }

    .overlay {
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      background: var(--topic-overlay);
      border-radius: inherit;
      pointer-events: none;
    }

    </style>

    <div class="guestbook-main">
    <div class="inner">
    <div class="guestbook-decor">
      <div class="monster"></div>
      <div class="shit"></div>
      <div class="hat"></div>
    </div>

    <div class="guest-header">Malleus Maleficarum</div>

      <div class="guest-table">
        <div class="column1">
          <span><a href="https://mmaleficarum.rusff.me/viewtopic.php?id=5#p5">faq</a> ✦ <a href="https://mmaleficarum.rusff.me/viewtopic.php?id=10">правила</a> ✦ <a href="https://mmaleficarum.rusff.me/viewtopic.php?id=20#p1679">сюжет и хронология</a></span>
          <div class="guest-links">
            <a href="https://mmaleficarum.rusff.me/viewtopic.php?id=33#p4607">внешности</a>
            <a href="https://mmaleficarum.rusff.me/viewtopic.php?id=64#p5558">должности</a>
            <a href="https://mmaleficarum.rusff.me/viewtopic.php?id=844#p101443">сюжетные персонажи</a>
            <a href="https://mmaleficarum.rusff.me/viewtopic.php?id=3">нужные</a>
            <a href="https://mmaleficarum.rusff.me/viewtopic.php?id=9#p9">шаблон анкеты</a>
            <a href="https://mmaleficarum.rusff.me/viewtopic.php?id=4">хочу к вам</a>
          </div>
          <p>победа тёмного лорда во второй магической войне погрузила великобританию в мрак и хаос. внезапной силой, давшей решительный отпор, стали магглы в кооперации с остатками оф. инициация тайного протокола «молот ведьм» («malleus maleficarum») привела к разрушениям и гибели самого волдеморта. но успех оказался временным. вскоре волшебный мир ждало новое возвращение тёмного лорда, на этот раз — долгосрочное. за минувшие годы магическое общество великобритании в полной мере ощутило на себе тоталитаризм нового режима, репрессии и дискриминацию. население разделено на касты по чистоте крови, а границы закрыты. вся надежды на сопротивление — мятежную сеть, масштабу которой позавидовал бы сам орден феникса.</p>
        </div>

        <div class="column2">
          <div class="guidelines">внешности и роли за гостями придерживаем на сутки; <br>для зарегистрированного профиля - на три дня с возможностью продления до трёх раз</div>
          <div class="faces-roles-container">
            <div class="faces">
              <div class="faces-title">внешности</div>
              <div class="faces-body">
                <b>3.03</b><br>
                Oscar isaac - <a href="https://mmaleficarum.rusff.me/profile.php?id=350">richard avery</a><br>
                <b>30.03</b><br>
                margot robbie - <a href="https://mmaleficarum.rusff.me/profile.php?id=215">ronald weasley</a><br>
                jacob elordi - <a href="https://mmaleficarum.rusff.me/profile.php?id=215">ronald weasley</a>
              </div>
            </div>
            <div class="roles">
              <div class="roles-title">роли</div>
              <div class="roles-body">
                <b>3.03</b><br>
                richard avery - <a href="https://mmaleficarum.rusff.me/viewtopic.php?id=3&p=2#p115402">richard avery</a><br>
                <b>30.03</b><br>
                gwenog jones - <a href="https://mmaleficarum.rusff.me/profile.php?id=215">ronald weasley</a><br>
                ernie macmillan - <a href="https://mmaleficarum.rusff.me/profile.php?id=215">ronald weasley</a><br>
              </div>
            </div>
          </div>
        </div>

        <div class="column3">
          <div class="guest-about"><b>hp: dark au // 2nd generation — 2008 рейтинг: NC-21 // мастеринг: смешанный</b><br>
          победа темного лорда, антиутопия, кастовое общество, конфликт с магглами и активное сопротивление</div>

          <div class="guest-ams">
            <div class="tooltip">
              <a href="https://mmaleficarum.rusff.me/profile.php?id=5">
                <div class="image-container">
                  <img src="https://upforme.ru/uploads/001c/3b/dd/226/593755.gif">
                  <div class="overlay"></div>
                </div>
              </a>
              <span class="tooltiptext">куратор сопротивления и наших сердечек, сюжетник</span>
            </div>

            <div class="tooltip">
              <a href="https://mmaleficarum.rusff.me/profile.php?id=27">
                <div class="image-container">
                  <img src="https://upforme.ru/uploads/001c/3b/dd/226/445813.gif">
                  <div class="overlay"></div>
                </div>
              </a>
              <span class="tooltiptext">куратор мунго и подрывник наших мозгов</span>
            </div>

            <div class="tooltip">
              <a href="https://mmaleficarum.rusff.me/profile.php?id=161">
                <div class="image-container">
                  <img src="https://upforme.ru/uploads/001c/3b/dd/226/43499.gif">
                  <div class="overlay"></div>
                </div>
              </a>
              <span class="tooltiptext">куратор пожирателей и азартный мотиватор</span>
            </div>

          <div class="ams-2">  <div class="tooltip">
              <a href="https://mmaleficarum.rusff.me/profile.php?id=215">
                <div class="image-container">
                  <img src="https://upforme.ru/uploads/001c/3b/dd/226/274665.gif">
                  <div class="overlay"></div>
                </div>
              </a>
              <span class="tooltiptext">куратор домп и нашего чувства прекрасного</span>
            </div>

        <div class="tooltip">
              <a href="https://mmaleficarum.rusff.me/profile.php?id=215">
                <div class="image-container">
                  <img src="https://upforme.ru/uploads/001c/3b/dd/226/274665.gif">
                  <div class="overlay"></div>
                </div>
              </a>
              <span class="tooltiptext">куратор домп и нашего чувства прекрасного</span>
            </div>
          </div></div>

          <div class="deadlist"><b>список убитых:</b> remus lupin, sirius black, arthur weasley, molly weasley, minerva mcgonagall, rubeus hagrid, bellatrix lestrange, dean thomas, xenophilius lovegood, rodolphus lestrange, arabella figg, vernon dursley, emmeline vance, lucius malfoy, nott sr., corban yaxley, augustus rookwood, walden mcnair, pyrites, travers sr., antonin dolohov, amycus carrow, jugson, avery sr., rosier sr., wilkesj, ludo bagman, sky parkin, cormac mclaggen, orion amari, jasper nottley, maura kettleback, alias gampthorn, corvin thisleby, basil horton, garold dingle, alban filch, verena hope, henry tonks, alastor moody, tbc.</div>
        </div>
      </div>
    </div>
    </div>
    [/html]
    занять роль и/или внешность

    Код:
    внешность — <a href="ссылка">ник</a><br>
    Код:
    роль — <a href="ссылка">ник</a><br>

    [hideprofile]

    0

    3

    [html]
    <div class="news-main">
      <div class="news-zagolovok">BREAKING NEWS</div>

      <div class="news-podlozhka">
        <div class="news-date">01/02/2026</div>

    <p>
      <span class="news-author-inline">
        <img src="https://64.media.tumblr.com/cd87a8914c1ac6d6c81537d9506e40f4/b52989049bb715e4-f6/s540x810/3c6969cad1db438a2f0fd9188aa860f174cfc133.gif">
      </span>
    Халлоу эгейн, я захватил новостную темку и больше никого сюда не пущу, муахаха.
    </p>

    <p>А бокал на гифке поднимаю в честь главной новости: сегодня родилась та, без кого мы все тут бы не собрались, создательница малефики и наша идейная вдохновительница, замечательная Джинни-какая-то-там-куча-лишних-фамилий-Уизли. срочно бегите <a href="https://mmaleficarum.rusff.me/viewtopic.php?id=182&p=4">поздравлять</a>, если вы ещё не. Ну или просто ловите именинницу в любом удобном месте и обнимайте, я сегодня даже ревновать не буду <s>но это не точно</s>. </p>

    <p>Ну да, ну да, я немного увлёкся, сами понимаете, сердечки в глазах мешают нажимать на тормоза... но вообще-то на дворе февраль, так что сам Мерлин велел. Или это был не он, а Валентин? Ай, главное, что love is in the air и вот это вот всё. Мы ещё к вам вернёмся с дополнительным розовым безумием, а пока что к нам залетел первый шальной Купидончик и принёс <a href="https://mmaleficarum.rusff.me/viewtopic.php?id=998#p116508">валентиновское бинго</a>. Причём был так добр, что разрешил заполнять карточку со всех профилей разом. И вы это, не бойтесь, даже если ненавидите праздник всеми фибрами души, или просто ещё не отыскали свою половинку, четвертинку или квадратный корень, вам всё равно найдётся, чем разнообразить посты, узнать получше собственных персонажей и, конечно же, пополнить копилочку баллов противостояния за любимую команду.</p>

    <p>Ну а если это всё вот прям совсем мимо кассы, то спрятаться от вездесущей романтики можно в <a href="https://mmaleficarum.rusff.me/viewtopic.php?id=999#p116509">бункере</a>, записывайтесь, это весело, а ещё надеюсь будет в хорошем смысле трэшово!</p>

        <p>Отдохнули и с новыми (вот прям совсем новыми) силами готовы бросаться в игру? Тогда для вас наша новая постоянная акция - <a href="https://mmaleficarum.rusff.me/viewtopic.php?id=997#p116507">wanted: alive</a>. В этой теме мы будем объявлять месячник персонажей, за регистрацию которых полагаются дополнительные плюшки. И в феврале очень ждём... <s>щас, подождите, на меня наложат Империо, чтоб я мог продолжить</s> всех скользких друзей мне-цензура-запрещает-писать-кого, Пожирателей Смерти то бишь!</p>

    <p>Но, наверное, мы неправильно расставили приоритеты, и февраль надо было объявлять месяцем рыжих. Ведь они потихоньку захватывают мир, а начали с нашей шапки. Поздравляем звёздочек этих двух недель, которые радовали нас постами, скакали на скакалочках , рассказывали увлекательные истории и флудили напропалую: <a href="https://mmaleficarum.rusff.me/profile.php?id=5">Джинни</a>, <a href="https://mmaleficarum.rusff.me/profile.php?id=199">Перси</a>, <a href="https://mmaleficarum.rusff.me/profile.php?id=153">Сьюзен</a>, гордимся вами и хотим быть как вы!</p>
    <p>Хотя есть у нас и другие ролевые модели. Участники квеста <a href="https://mmaleficarum.rusff.me/viewtopic.php?id=828&p=2#p99144">Trumpets before Jericho</a>, например, умеют и отдохнуть, и подраться, и вообще на вторую страницу темы перевалили. Бегите скорее читать и делать ставки, переживёт ли яхта господина Веларде такой накал страстей.</p>
    <p>А я ведь говорил, да, что любовь разлита в воздухе? И мы на самом деле знаем, почему так рано. Просто очаровательная <a href="https://mmaleficarum.rusff.me/profile.php?id=260">Лавандушка</a> очень ответственно начала готовиться к грядущему празднику заранее и <a href="https://mmaleficarum.rusff.me/viewtopic.php?id=983#p115718">окунула</a> нас в ностальгию по первой детской влюблённости, даже моё циничное сердечко проняло.</p>

    <p>Пойду тоже чего-нибудь напишу, и вам того же желаю. <i>Зажжём</i> в феврале, а?.</p>
    <p></p>
      </div>
    </div>
    [/html]
    [hideprofile]

    0

    4

    [html]
    <div class="news-main">
        <div class="news-zagolovok">OUR DARLINGS</div>

      <div class="news-podlozhka">
      <div class="news-date">15/12/2025</div>   <p>Гутен таг, мейне либен фрокенбок! С вами Рональд Уизли и уроки занимательного немецкого. Просто спешу напомнить, что малефика не только замечательная, чудесная и игровая, но еще и образовательная! А поскольку остальные админы так и не планируют доверять мне что-то опаснее зубочистки и сложнее определения, где право, а где лево, давайте же перейдем к тому, что приятно и мне и вам (и нет, это не немецкий).</p>
    <p>Лучшим эпизодом минувших двух недель становится эпизод <a href='https://mmaleficarum.rusff.me/profile.php?id=329'>Альбы</a> и <a href='https://mmaleficarum.rusff.me/profile.php?id=327'>Аларика</a>, в котором наши юные будущие молодожены выясняют, что станет фундаментом их приближающегося союза (спойлер - это не "Пацанки" по вечерам и гамбургеры, так что в такую любовь я не верю). Привычно восхититься слогом и скоростью можно по ссылке:
    <div class="news-episode"><a href='https://mmaleficarum.rusff.me/viewtopic.php?id=912'>fallen star</a></div>
    <p>Властью, данной мне мной (шучу, на самом деле, Джинни, конечно) лучшим постом нарекаю <a href='https://mmaleficarum.rusff.me/viewtopic.php?id=941#p111408'>пост</a> господина красивого, который целует одну, а думает о другой. Я был бы не я, если бы не обратил внимания на душевные терзания <a href="https://mmaleficarum.rusff.me/profile.php?id=265">Райли</a>, и вы не отставайте - бегите читать скорее!<br> <div class="news-quote"> Целуя Лексу, Райли думал о другой женщине, и его безразличие не осталось незамеченным. Тогда он отмахнулся, сказал, что просто устал, ведь не так давно его знатно отметелили в клубе настолько, что пришлось обращаться в госпиталь, и на тот вечер такого оправдания оказалось достаточно. Его хватило ещё на пару дней, а потом... Потом Донован между делом заявил, что уезжает на задание, сроков окончания которого не знает.
    Но когда завершилась одна миссия, тут же началась следующая - и по просьбе самого Райли, квартировали его как можно дальше от магического Лондона. Туда, где ему не придётся встречаться взглядом с той, кому он задолжал много объяснений.</center></div>
    <p>Что дальше, спросите вы? А дальше наши активисты, отличившиеся или постами, или флудом, или обложкой магического журнальчика под названиям "Самые сладкие магвочки и маги" (нет, я не перепутал фандом). Итак, мистером "шелковистые лобковые волосы" становится <a href="https://mmaleficarum.rusff.me/profile.php?id=337">Гилдерой</a>, чьего возвращения мы все с трепетом ждали и знали, что этот златокудрый обаяшка нас не бросит и не подведет! Компанию в таблице ему составил <a href="https://mmaleficarum.rusff.me/profile.php?id=97">Джон</a>, у которого вторым именем является "суровость", а третьим "невозмутимость". И наконец, <a href="https://mmaleficarum.rusff.me/profile.php?id=151">Норман</a>, который устроил истерику и сказал, что порежет себе вены скальпелем, если я его не отмечу. Ну а я человек подневольный, как вы все знаете. Сказали отметить - я отметил, и сделал это с большой любовью и восхищением, между прочим!</p><br>
    <div class="news-activists"><div class="img-wrap"><img src="https://forumstatic.ru/files/0019/84/0e/31326.webp"></div><div class="img-wrap"><img src="https://forumstatic.ru/files/0019/84/0e/85528.webp"></div><div class="img-wrap"><img src="https://64.media.tumblr.com/2ce9529a1b40c056d31387e1f112ad89/tumblr_oljm8ij3YG1ui45hlo1_400.gif"></div></div>
      </div>
    </div>
    [/html]

    0

    5

    [html]
    <div id="malefica-tetris">
    <style>
    #malefica-tetris{
      --dark:#343232;--gray:#838382;--light:#c8c8c8;--white:#eeeeee;
      --powder:#ead5d2;--rose:#d0a1a6;--deep:#ad656d;--coral:#ff737e;
      max-width:520px;margin:20px auto;padding:18px;
      color:var(--white);font-family:Georgia,"Times New Roman",serif;
      border:2px solid var(--gray);box-sizing:border-box;
      touch-action:manipulation;
      overscroll-behavior:contain;
      background:
        linear-gradient(rgba(52,50,50,.10),rgba(52,50,50,.10)),
        url('https://upforme.ru/uploads/001c/3b/dd/5/766741.jpg');
      background-size:cover;
      background-position:center center;
      background-repeat:no-repeat;
    }

    #malefica-tetris *{
      box-sizing:border-box;
      user-select:none;
      -webkit-user-select:none;
      -webkit-tap-highlight-color:transparent;
    }

    .mt-title{
      text-align:center;
      font-size:28px;
      letter-spacing:4px;
      color:var(--powder);
      margin-bottom:14px;
      text-transform:uppercase;
      font-family:"Alter Biom", Courier, monospace;
      font-weight:bold;
    }

    .mt-subtitle{
      text-align:center;
      margin-top:-12px;
      margin-bottom:14px;
      color:var(--powder);
      font-size:12px;
      font-family:"Lucida Console","Courier New",monospace;
      letter-spacing:1px;
      opacity:.9;
    }

    .mt-wrap{display:flex;gap:14px;justify-content:center;align-items:flex-start}

    #mt-board{
      background:#1d1c1c;
      border:3px solid var(--light);
      width:250px;
      height:500px;
      min-width:250px;
      max-width:250px;
      min-height:500px;
      max-height:500px;
      flex:0 0 250px;
      display:block;
      touch-action:none;
    }

    .mt-panel{
      width:170px;
      min-width:170px;
      max-width:170px;
      background:rgba(63,61,61,.88);
      border:1px solid var(--gray);
      padding:12px;
    }

    .mt-stat{
      display:flex;
      justify-content:space-between;
      padding:6px 0;
      border-bottom:1px solid rgba(238,238,238,.18);
      font-size:15px;
    }

    .mt-next-title{
      margin:14px 0 8px;
      text-align:center;
      color:var(--rose);
      font-size:15px;
      text-transform:uppercase;
    }

    #mt-next{
      display:block;
      margin:0 auto 12px;
      width:100px;
      height:100px;
      background:#252424;
      border:1px solid var(--gray);
    }

    .mt-status{
      height:42px;
      min-height:42px;
      max-height:42px;
      overflow:hidden;
      display:flex;
      align-items:center;
      justify-content:center;
      text-align:center;
      color:var(--coral);
      font-size:15px;
    }

    .mt-controls{
      margin-top:14px;
      display:grid;
      grid-template-columns:repeat(3,1fr);
      gap:8px;
    }

    .mt-controls button,
    .mt-wide-buttons button{
      min-height:56px;
      border:1px solid var(--deep);
      background:var(--rose);
      color:#261f20;
      font-family:Georgia,"Times New Roman",serif;
      font-size:18px;
      cursor:pointer;
      font-weight:bold;
      touch-action:manipulation;
    }

    .mt-controls button:active,
    .mt-wide-buttons button:active{
      background:var(--coral);
      transform:translateY(1px);
    }

    .mt-down{grid-column:1/4}

    .mt-wide-buttons{
      display:grid;
      grid-template-columns:1fr 1fr;
      gap:8px;
      margin-top:8px;
    }

    .mt-wide-buttons button{
      font-size:14px;
      text-transform:uppercase;
    }

    .mt-help{
      font-size:12px;
      line-height:1.45;
      color:var(--powder);
      margin-top:10px;
      text-align:center;
    }

    @media(max-width:560px){
      #malefica-tetris{
        width:100%;
        max-width:100%;
        margin:0 auto;
        padding:10px;
      }

      .mt-title{
        font-size:22px;
        letter-spacing:2px;
        margin-bottom:10px;
      }

      .mt-subtitle{
        font-size:10px;
        margin-top:-8px;
        margin-bottom:10px;
      }

      .mt-wrap{
        flex-direction:column;
        align-items:center;
        gap:10px;
      }

      #mt-board{
        width:220px;
        height:440px;
        min-width:220px;
        max-width:220px;
        min-height:440px;
        max-height:440px;
        flex:0 0 220px;
      }

      .mt-panel{
        width:220px;
        min-width:220px;
        max-width:220px;
        padding:10px;
      }

      .mt-stat{
        font-size:14px;
        padding:4px 0;
      }

      .mt-next-title{
        margin:10px 0 6px;
        font-size:13px;
      }

      #mt-next{
        width:80px;
        height:80px;
        margin-bottom:8px;
      }

      .mt-status{
        height:34px;
        min-height:34px;
        max-height:34px;
        font-size:13px;
      }

      .mt-controls{
        position:sticky;
        bottom:0;
        background:rgba(52,50,50,.96);
        padding-top:8px;
        padding-bottom:6px;
        z-index:5;
      }

      .mt-controls button,
      .mt-wide-buttons button{
        min-height:54px;
        font-size:18px;
      }

      .mt-wide-buttons button{
        font-size:12px;
      }

      .mt-help{
        display:none;
      }
    }
    </style>

    <div class="mt-title">маггловский артефакт</div>
    <div class="mt-subtitle">(из ящика Тонкса)</div>

    <div class="mt-wrap">
      <canvas id="mt-board" width="250" height="500"></canvas>

      <div class="mt-panel">
        <div class="mt-stat"><span>Время</span><b id="mt-time">00:00</b></div>
        <div class="mt-stat"><span>Очки</span><b id="mt-score">0</b></div>
        <div class="mt-stat"><span>Линии</span><b id="mt-lines">0</b></div>
        <div class="mt-stat"><span>Уровень</span><b id="mt-level">1</b></div>

        <div class="mt-next-title">Следующая</div>
        <canvas id="mt-next" width="100" height="100"></canvas>

        <div class="mt-status" id="mt-status">Нажмите стрелку, чтобы начать</div>

        <div class="mt-controls">
          <button id="mt-left" type="button">←</button>
          <button id="mt-rotate" type="button">⟳</button>
          <button id="mt-right" type="button">→</button>
          <button id="mt-down" class="mt-down" type="button">↓ быстрее</button>
        </div>

        <div class="mt-wide-buttons">
          <button id="mt-pause" type="button">Пауза</button>
          <button id="mt-new" type="button">Новый раунд</button>
        </div>

        <div class="mt-help">
          ← → движение<br>
          ↑ переворот<br>
          ↓ быстрее<br>
          пробел — пауза
        </div>
      </div>
    </div>

    <script>
    (function(){
      var canvas=document.getElementById("mt-board");
      var ctx=canvas.getContext("2d");
      var nextCanvas=document.getElementById("mt-next");
      var nextCtx=nextCanvas.getContext("2d");

      var scoreEl=document.getElementById("mt-score");
      var linesEl=document.getElementById("mt-lines");
      var levelEl=document.getElementById("mt-level");
      var timeEl=document.getElementById("mt-time");
      var statusEl=document.getElementById("mt-status");

      var COLS=10, ROWS=20, BLOCK=25;
      var board=[], current=null, nextPiece=null;
      var score=0, lines=0, level=1, seconds=0;
      var paused=false, over=false, started=false;
      var dropTimer=null, clockTimer=null;
      var bag=[];

      var colors={I:"#64c7d0",O:"#e4c95d",T:"#a884c9",S:"#83bd75",Z:"#df6f7b",J:"#6f8fcf",L:"#e0a15d"};

      var shapes={
        I:[[1,1,1,1]],
        O:[[1,1],[1,1]],
        T:[[0,1,0],[1,1,1]],
        S:[[0,1,1],[1,1,0]],
        Z:[[1,1,0],[0,1,1]],
        J:[[1,0,0],[1,1,1]],
        L:[[0,0,1],[1,1,1]]
      };

      function resizeCanvases(){
        if(window.innerWidth<=560){
          canvas.width=220;
          canvas.height=440;
          BLOCK=22;
          nextCanvas.width=80;
          nextCanvas.height=80;
        } else {
          canvas.width=250;
          canvas.height=500;
          BLOCK=25;
          nextCanvas.width=100;
          nextCanvas.height=100;
        }
        draw();
        drawNext();
      }

      function refillBag(){
        bag=["I","O","T","S","Z","J","L"];
        for(var i=bag.length-1;i>0;i--){
          var j=Math.floor(Math.random()*(i+1));
          var t=bag[i];
          bag[i]=bag[j];
          bag[j]=t;
        }
      }

      function getFromBag(){
        if(bag.length===0) refillBag();
        return bag.pop();
      }

      function makeBoard(){
        board=[];
        for(var y=0;y<ROWS;y++){
          board[y]=[];
          for(var x=0;x<COLS;x++) board[y][x]="";
        }
      }

      function copyShape(shape){
        return shape.map(function(row){return row.slice();});
      }

      function randomPiece(){
        var type=getFromBag();
        return {
          type:type,
          shape:copyShape(shapes[type]),
          color:colors[type],
          x:3,
          y:0
        };
      }

      function startIfNeeded(){
        if(started || over) return;
        started=true;
        paused=false;
        statusEl.innerHTML="Игра идет";
        restartDropTimer();
        clockTimer=setInterval(updateTime,1000);
      }

      function collide(piece,dx,dy,shape){
        shape=shape||piece.shape;

        for(var y=0;y<shape.length;y++){
          for(var x=0;x<shape[y].length;x++){
            if(!shape[y][x]) continue;

            var nx=piece.x+x+dx;
            var ny=piece.y+y+dy;

            if(nx<0 || nx>=COLS || ny>=ROWS) return true;
            if(ny>=0 && board[ny][nx]) return true;
          }
        }

        return false;
      }

      function merge(){
        for(var y=0;y<current.shape.length;y++){
          for(var x=0;x<current.shape[y].length;x++){
            if(current.shape[y][x] && board[current.y+y]){
              board[current.y+y][current.x+x]=current.color;
            }
          }
        }
      }

      function clearLines(){
        var count=0;
        var oldLevel=level;

        for(var y=ROWS-1;y>=0;y--){
          var full=true;

          for(var x=0;x<COLS;x++){
            if(!board[y][x]){
              full=false;
              break;
            }
          }

          if(full){
            board.splice(y,1);
            board.unshift(Array(COLS).fill(""));
            count++;
            y++;
          }
        }

        if(count){
          score+=[0,100,300,500,800][count]*level;
          lines+=count;
          level=Math.floor(lines/10)+1;
          updateInfo();
          restartDropTimer();

          if(level>oldLevel){
            statusEl.innerHTML="Уровень "+level;
          } else {
            if(count===1) statusEl.innerHTML="Линия стерта";
            if(count===2) statusEl.innerHTML="Бонус: две линии";
            if(count===3) statusEl.innerHTML="Бонус: три линии";
            if(count===4) statusEl.innerHTML="Тетрис!";
          }
        }
      }

      function spawn(){
        current=nextPiece||randomPiece();
        nextPiece=randomPiece();

        current.x=Math.floor(COLS/2)-Math.ceil(current.shape[0].length/2);
        current.y=0;

        if(collide(current,0,0)){
          over=true;
          statusEl.innerHTML="Конец игры";
          stopTimers();
        }

        drawNext();
      }

      function rotateShape(shape){
        var result=[];
        var h=shape.length;
        var w=shape[0].length;

        for(var x=0;x<w;x++){
          result[x]=[];
          for(var y=h-1;y>=0;y--){
            result[x].push(shape[y][x]);
          }
        }

        return result;
      }

      function rotate(){
        startIfNeeded();
        if(paused || over) return;

        var rotated=rotateShape(current.shape);

        if(!collide(current,0,0,rotated)){
          current.shape=rotated;
        } else if(!collide(current,-1,0,rotated)){
          current.x--;
          current.shape=rotated;
        } else if(!collide(current,1,0,rotated)){
          current.x++;
          current.shape=rotated;
        } else if(!collide(current,-2,0,rotated)){
          current.x-=2;
          current.shape=rotated;
        } else if(!collide(current,2,0,rotated)){
          current.x+=2;
          current.shape=rotated;
        }

        draw();
      }

      function move(dx){
        startIfNeeded();
        if(paused || over) return;

        if(!collide(current,dx,0)){
          current.x+=dx;
          draw();
        }
      }

      function drop(){
        if(paused || over || !started) return;

        if(!collide(current,0,1)){
          current.y++;
        } else {
          merge();
          clearLines();
          spawn();
        }

        draw();
      }

      function softDrop(){
        startIfNeeded();
        if(paused || over) return;

        if(!collide(current,0,1)){
          score++;
          current.y++;
          updateInfo();
        } else {
          merge();
          clearLines();
          spawn();
        }

        draw();
      }

      function drawBlock(context,x,y,color,size){
        context.fillStyle=color;
        context.fillRect(x*size,y*size,size,size);

        context.strokeStyle="rgba(255,255,255,.28)";
        context.strokeRect(x*size+1,y*size+1,size-2,size-2);

        context.strokeStyle="rgba(0,0,0,.38)";
        context.strokeRect(x*size,y*size,size,size);
      }

      function drawGrid(){
        ctx.strokeStyle="rgba(238,238,238,.07)";

        for(var x=0;x<=COLS;x++){
          ctx.beginPath();
          ctx.moveTo(x*BLOCK,0);
          ctx.lineTo(x*BLOCK,ROWS*BLOCK);
          ctx.stroke();
        }

        for(var y=0;y<=ROWS;y++){
          ctx.beginPath();
          ctx.moveTo(0,y*BLOCK);
          ctx.lineTo(COLS*BLOCK,y*BLOCK);
          ctx.stroke();
        }
      }

      function draw(){
        if(!ctx) return;

        ctx.clearRect(0,0,canvas.width,canvas.height);
        ctx.fillStyle="#1d1c1c";
        ctx.fillRect(0,0,canvas.width,canvas.height);

        drawGrid();

        for(var y=0;y<ROWS;y++){
          for(var x=0;x<COLS;x++){
            if(board[y] && board[y][x]){
              drawBlock(ctx,x,y,board[y][x],BLOCK);
            }
          }
        }

        if(current){
          for(var py=0;py<current.shape.length;py++){
            for(var px=0;px<current.shape[py].length;px++){
              if(current.shape[py][px]){
                drawBlock(ctx,current.x+px,current.y+py,current.color,BLOCK);
              }
            }
          }
        }
      }

      function drawNext(){
        if(!nextCtx || !nextPiece) return;

        var nextSize=nextCanvas.width;
        nextCtx.clearRect(0,0,nextSize,nextSize);
        nextCtx.fillStyle="#252424";
        nextCtx.fillRect(0,0,nextSize,nextSize);

        var size=nextSize===80 ? 16 : 20;
        var shape=nextPiece.shape;
        var ox=Math.floor((5-shape[0].length)/2);
        var oy=Math.floor((5-shape.length)/2);

        for(var y=0;y<shape.length;y++){
          for(var x=0;x<shape[y].length;x++){
            if(shape[y][x]){
              drawBlock(nextCtx,x+ox,y+oy,nextPiece.color,size);
            }
          }
        }
      }

      function updateInfo(){
        scoreEl.innerHTML=score;
        linesEl.innerHTML=lines;
        levelEl.innerHTML=level;
      }

      function updateTime(){
        if(paused || over || !started) return;

        seconds++;

        var m=Math.floor(seconds/60);
        var s=seconds%60;

        timeEl.innerHTML=(m<10?"0"+m:m)+":"+(s<10?"0"+s:s);
      }

      function speed(){
        if(level===1) return 800;
        if(level===2) return 680;
        if(level===3) return 560;
        if(level===4) return 430;
        if(level===5) return 300;

        return Math.max(120,300-((level-5)*30));
      }

      function restartDropTimer(){
        if(dropTimer) clearInterval(dropTimer);

        if(started && !over){
          dropTimer=setInterval(drop,speed());
        }
      }

      function stopTimers(){
        if(dropTimer) clearInterval(dropTimer);
        if(clockTimer) clearInterval(clockTimer);

        dropTimer=null;
        clockTimer=null;
      }

      function togglePause(){
        if(over) return;

        if(!started){
          startIfNeeded();
        }

        paused=!paused;
        statusEl.innerHTML=paused ? "Пауза" : "Игра идет";
      }

      function newGame(){
        stopTimers();

        bag=[];
        refillBag();
        makeBoard();

        score=0;
        lines=0;
        level=1;
        seconds=0;

        paused=false;
        over=false;
        started=false;

        timeEl.innerHTML="00:00";
        statusEl.innerHTML="Нажмите стрелку, чтобы начать";

        nextPiece=randomPiece();
        spawn();

        updateInfo();
        resizeCanvases();
        draw();
      }

      function bindTap(id,fn){
        var el=document.getElementById(id);
        if(!el) return;

        var touched=false;

        el.addEventListener("touchstart",function(e){
          touched=true;
          e.preventDefault();
          fn();

          setTimeout(function(){
            touched=false;
          },400);
        },{passive:false});

        el.onclick=function(e){
          if(e) e.preventDefault();

          if(touched) return false;

          fn();
          return false;
        };
      }

      bindTap("mt-left",function(){move(-1);});
      bindTap("mt-right",function(){move(1);});
      bindTap("mt-rotate",rotate);
      bindTap("mt-down",softDrop);
      bindTap("mt-pause",togglePause);
      bindTap("mt-new",newGame);

      document.addEventListener("keydown",function(e){
        var key=e.key || e.keyCode;

        if(key==="ArrowLeft" || key==="ArrowRight" || key==="ArrowDown" || key==="ArrowUp" || key===" "){
          e.preventDefault();
        }

        if(key==="ArrowLeft" || key===37) move(-1);
        if(key==="ArrowRight" || key===39) move(1);
        if(key==="ArrowDown" || key===40) softDrop();
        if(key==="ArrowUp" || key===38) rotate();
        if(key===" " || key===32) togglePause();
      });

      window.addEventListener("resize",function(){
        resizeCanvases();
      });

      newGame();
    })();
    </script>
    </div>
    [/html]

    0

    6

    Код:
    <!-- HTML в постах с допуском по группам © Alex_63 -->
    <script type="text/javascript" src="https://forumstatic.ru/files/0015/c4/3f/52361.js"></script>
    <script type="text/javascript">
    HTMLinPost.groups = [1,2, 3, 4, 8]; // Группы, допущенные к вставке HTML в посты
    HTMLinPost.noAccess = ['user','newTst2']; // Пользователи с запретом вставки HTML в посты
    HTMLinPost.parseHTMLinPosts()
    </script>

    0

    7

    неактуально

    [html]<style>
       
        * {
            box-sizing: border-box;
            text-transform: lowercase;
        }
       
        .generator-box {
            background: var(--sec-bg);
            border-radius: 16px;
            padding: 20px;
            max-width: 1200px;
            margin: 0 auto;
            font-family: 'Segoe UI', Arial, sans-serif;
        }
       
        .generator-box h2 {
            color: var(--textcolor);
            margin: 0 0 20px 0;
            font-size: 22px;
            padding-left: 15px;
        }
       
        .tab-buttons {
            display: flex;
            gap: 10px;
            margin-bottom: 20px;
            flex-wrap: wrap;
        }
       
        .tab-btn {
            background: var(--post-bg);
            border: none;
            padding: 8px 20px;
            border-radius: 20px;
            cursor: pointer;
            font-weight: bold;
        }
       
        .tab-btn.active {
            background: var(--textcolor);
            color: var(--white);
        }
       
        .tab-content {
            display: none;
        }
       
        .tab-content.active {
            display: block;
        }
       
        .gen-row {
            display: flex;
            gap: 40px;
            flex-wrap: wrap;
            margin-bottom: 20px;
        }
       
        .gen-col {
            flex: 1;
            max-width: 380px;
        }
       
        .gen-form-group {
            margin-bottom: 15px;
        }
       
        .gen-form-group label {
            display: block;
            font-weight: bold;
            margin-bottom: 5px;
            color: var(--textcolor);
        }
       
        .gen-form-group input,
        .gen-form-group textarea {
            width: 100%;
            padding: 8px 12px;
            border: 1px solid var(--textcolor) !important;
            border-radius: 8px;
            background: var(--post-bg) !important;
            font-family: inherit;
        }
       
        .gen-form-group textarea {
            resize: vertical;
            min-height: 80px;
        }
       
        .gen-btn {
            background: var(--link);
            color: white;
            border: none;
            padding: 8px 16px;
            border-radius: 8px;
            cursor: pointer;
            margin-right: 10px;
            margin-bottom: 10px;
            font-size: 14px;
            transition: all 0.2s;
        }
       
        .gen-btn:hover {
            opacity: 0.85;
            transform: scale(0.98);
        }
       
        .gen-btn-green {
            background: var(--link);
        }
       
        .gen-btn-blue {
            background: var(--body-bg);
        }
       
        .gen-btn-red {
            background: var(--link-hover);
        }
       
        .gen-btn-copied {
            background: var(--body-bg) !important;
        }
       
        .twink-item,
        .coupon-item {
            background: var(--post-bg);
            padding: 10px;
            margin-bottom: 10px;
            border-radius: 8px;
            border-left: 4px solid var(--textcolor);
        }
       
        .inline-row {
            display: flex;
            gap: 10px;
            flex-wrap: wrap;
            margin-bottom: 8px;
        }
       
        .inline-row input {
            flex: 1;
        }
       
        .remove-btn {
            background: #aa3e1c;
            color: white;
            border: none;
            padding: 6px 12px;
            border-radius: 6px;
            cursor: pointer;
        }
       
        .gen-note,
        .note {
            font-size: 12px;
            background: var(--post-bg);
            padding: 10px;
            border-radius: 8px;
            margin-top: 10px;
            margin-bottom: 10px;
            color: var(--textcolor);
        }
       
        .gen-output,
        .output {
            background: var(--textcolor);
            border-radius: 16px;
            padding: 20px;
            margin-top: 20px;
        }
       
        .gen-output h3,
        .output h3 {
            color: var(--sec-bg);
            margin: 0 0 10px 0;
            font-size: 16px;
        }
       
        .gen-code-block,
        .code-block {
            background: var(--post-bg);
            color: var(--textcolor);
            font-family: 'Courier New', monospace;
            padding: 12px;
            border-radius: 8px;
            font-size: 12px;
            overflow-x: auto;
            white-space: pre-wrap;
            word-break: break-all;
            max-height: 300px;
        }
       
        .badge {
            background: var(--textcolor);
            color: white;
            font-size: 11px;
            padding: 2px 8px;
            border-radius: 20px;
            margin-left: 8px;
        }
       
        .button-group {
            text-align: center;
            margin: 20px 0;
        }
       
        .tab-header {
            display: flex;
            justify-content: space-between;
            align-items: center;
            flex-wrap: wrap;
            margin-bottom: 15px;
        }
       
        .tab-header h3 {
            margin: 0;
            color: var(--textcolor);
        }
    </style>

    <div class="generator-box">
        <h2>Генератор страницы персонажа</h2>
       
        <div class="tab-buttons">
            <button class="tab-btn active" data-tab="main">Основное</button>
            <button class="tab-btn" data-tab="twinks">Твинки</button>
            <button class="tab-btn" data-tab="coupons">Купоны</button>
            <button class="tab-btn" data-tab="gallery">Галереи</button>
        </div>
       
        <!-- ========== ВКЛАДКА 1: ОСНОВНОЕ ========== -->
        <div id="tab-main" class="tab-content active">
            <div class="tab-header">
                <h3>Основная информация</h3>
                <div>
                    <button class="gen-btn gen-btn-green" id="generateMainBtn">Сгенерировать код</button>
                    <button class="gen-btn gen-btn-blue" id="copyMainBtn">Копировать</button>
                </div>
            </div>
            <div class="gen-row">
                <div class="gen-col">
                    <div class="gen-form-group">
                        <label>URL гифки/аватара</label>
                        <input type="text" id="g_avatar" placeholder="https://example.com/avatar.gif">
                    </div>
                    <div class="gen-form-group">
                        <label>Имя персонажа</label>
                        <input type="text" id="g_name" placeholder="Имя персонажа">
                    </div>
                </div>
                <div class="gen-col">
                    <div class="gen-form-group">
                        <label>Фракция, для сопротивленцев ячейка (если известна) и позывной</label>
                        <input type="text" id="g_fraction" placeholder="Фракция | позывной">
                    </div>
                    <div class="gen-form-group">
                        <label>Род занятий</label>
                        <textarea id="g_occupation" rows="4" placeholder="Род занятий"></textarea>
                    </div>
                </div>
            </div>
            <div class="gen-output">
                <h3>Код блока .general (внутренность левой колонки)</h3>
                <div class="gen-code-block" id="mainCode">Заполните данные и нажмите "Сгенерировать код"</div>
            </div>
        </div>
       
        <!-- ========== ВКЛАДКА 2: ТВИНКИ ========== -->
        <div id="tab-twinks" class="tab-content">
            <div class="tab-header">
                <h3>Твинки <span class="badge">можно добавлять</span></h3>
                <div>
                    <button class="gen-btn gen-btn-green" id="generateTwinksBtn">Сгенерировать код</button>
                    <button class="gen-btn gen-btn-blue" id="copyTwinksBtn">Копировать</button>
                </div>
            </div>
            <div id="g_twinks_container"></div>
            <button class="gen-btn" id="g_add_twink">+ Добавить твинка</button>
            <button class="gen-btn gen-btn-red" id="g_clear_twinks">🗑 Очистить все</button>
            <div class="gen-output" style="margin-top: 15px;">
                <h3>Код только для блока твинков (внутренность #sm1)</h3>
                <div class="gen-code-block" id="twinksCode">Добавьте твинков и нажмите "Сгенерировать код"</div>
            </div>
        </div>
       
        <!-- ========== ВКЛАДКА 3: КУПОНЫ ========== -->
        <div id="tab-coupons" class="tab-content">
            <div class="tab-header">
                <h3>Купоны <span class="badge">можно добавлять</span></h3>
                <div>
                    <button class="gen-btn gen-btn-green" id="generateCouponsBtn">Сгенерировать код</button>
                    <button class="gen-btn gen-btn-blue" id="copyCouponsBtn">Копировать</button>
                </div>
            </div>
            <div id="g_coupons_container"></div>
            <button class="gen-btn" id="g_add_coupon">+ Добавить купон</button>
            <button class="gen-btn gen-btn-red" id="g_clear_coupons">🗑 Очистить все</button>
            <div class="gen-output" style="margin-top: 15px;">
                <h3>Код только для купонов (внутренность .coupon-list)</h3>
                <div class="gen-code-block" id="couponsCode">Добавьте купоны и нажмите "Сгенерировать код"</div>
            </div>
        </div>
       
        <!-- ========== ВКЛАДКА 4: ГАЛЕРЕИ ========== -->
        <div id="tab-gallery" class="tab-content">
            <div class="tab-header">
                <h3>Галереи</h3>
                <div>
                    <button class="gen-btn gen-btn-green" id="generateGalleryBtn">Сгенерировать код</button>
                    <button class="gen-btn gen-btn-blue" id="copyGalleryBtn">Копировать</button>
                </div>
            </div>
            <div class="gen-form-group">
                <label>Текст для плашки</label>
                <input type="text" id="g_fonText" placeholder="Текст на плашке">
            </div>
            <div class="gen-form-group">
                <label>Плашки (URL, каждый с новой строки)</label>
                <textarea id="g_plashki" rows="4" placeholder="https://example.com/plashka1.gif
    https://example.com/plashka2.png"& … xtarea>
            </div>
            <div class="gen-form-group">
                <label>Фоны (URL, каждый с новой строки)</label>
                <textarea id="g_foni" rows="4" placeholder="https://example.com/fon1.png
    https://example.com/fon2.png"></textarea>
            </div>
            <div class="gen-form-group">
                <label>Иконки (URL, каждый с новой строки)</label>
                <textarea id="g_icons" rows="4" placeholder="https://example.com/icon1.png
    https://example.com/icon2.png"> … xtarea>
            </div>
            <div class="gen-output" style="margin-top: 15px;">
                <h3>Код для галерей (с подсказками)</h3>
                <div class="gen-code-block" id="galleryCode">Введите данные и нажмите "Сгенерировать код"</div>
            </div>
        </div>
       
        <div class="button-group">
            <button class="gen-btn gen-btn-green" id="g_full_page_btn">Собрать ВСЁ и скопировать полную страницу</button>
            <button class="gen-btn gen-btn-red" id="g_clear_btn">🗑 Очистить всё</button>
        </div>
       
        <div class="gen-note" style="text-align: center;">
            💡 Каждая вкладка генерирует ТОЛЬКО внутреннее наполнение своего блока.<br>
            Кнопка внизу собирает всё вместе в готовую страницу pages/
        </div>
    </div>

    <script>
    (function() {
        let twinks = [];
        let coupons = [];
       
        const tabs = document.querySelectorAll('.tab-btn');
        const contents = document.querySelectorAll('.tab-content');
       
        tabs.forEach(tab => {
            tab.addEventListener('click', function() {
                const tabId = this.getAttribute('data-tab');
                tabs.forEach(t => t.classList.remove('active'));
                contents.forEach(c => c.classList.remove('active'));
                this.classList.add('active');
                document.getElementById(`tab-${tabId}`).classList.add('active');
            });
        });
       
        function escapeHtml(str) {
            if (!str) return '';
            return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
        }
       
        function copyToClipboard(text, btn, successMsg = 'Скопировано!') {
            const ta = document.createElement('textarea');
            ta.value = text;
            ta.style.cssText = 'position:fixed;top:-9999px;left:-9999px';
            document.body.appendChild(ta);
            ta.select();
            let ok = false;
            try { ok = document.execCommand('copy'); } catch(e) { ok = false; }
            document.body.removeChild(ta);
           
            if (ok) {
                const orig = btn.innerHTML;
                btn.innerHTML = successMsg;
                btn.classList.add('gen-btn-copied');
                setTimeout(() => { btn.innerHTML = orig; btn.classList.remove('gen-btn-copied'); }, 2000);
            } else {
                btn.innerHTML = 'Ошибка!';
                setTimeout(() => btn.innerHTML = btn.getAttribute('data-original') || 'Копировать', 2000);
            }
        }
       
        // ========== ОСНОВНОЕ ==========
        function generateMainHTML() {
            const avatar = document.getElementById('g_avatar').value;
            const name = document.getElementById('g_name').value;
            const fraction = document.getElementById('g_fraction').value;
            const occupation = document.getElementById('g_occupation').value;
           
            return `<div class="general"><img src="${avatar}" />
    <h2>${escapeHtml(name)}</h2>
    <div class="fraction">${escapeHtml(fraction)}</div>
    <div class="occupation">${escapeHtml(occupation).replace(/\n/g, '<br />')}</div>
    </div>`;
        }
       
        function generateMainAndDisplay() {
            const html = generateMainHTML();
            const escaped = html.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
            document.getElementById('mainCode').innerHTML = escaped;
            return html;
        }
       
        function copyMain() {
            const html = generateMainHTML();
            const btn = document.getElementById('copyMainBtn');
            copyToClipboard(html, btn);
        }
       
        // ========== ТВИНКИ ==========
        function generateTwinksHTML() {
            let html = '';
            for (let t of twinks) {
                html += `<!-- начало твинка -->
    <div class="twink"><div class="twink-text">`;
                if (t.link && t.link.trim()) {
                    html += `<a href="${t.link}"><strong>${escapeHtml(t.name) || 'ссылка на профиль'}</strong></a><br />${escapeHtml(t.description)}`;
                } else {
                    html += `<strong>${escapeHtml(t.name) || '—'}</strong><br />${escapeHtml(t.description)}`;
                }
                html += `</div>
    </div>
    <!-- конец твинка -->
    `;
            }
            return html;
        }
       
        function generateTwinksAndDisplay() {
            const html = generateTwinksHTML();
            const escaped = html.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
            document.getElementById('twinksCode').innerHTML = escaped;
            return html;
        }
       
        function copyTwinks() {
            const html = generateTwinksHTML();
            const btn = document.getElementById('copyTwinksBtn');
            copyToClipboard(html, btn);
        }
       
        // ========== КУПОНЫ ==========
        function generateCouponsHTML() {
            let html = '';
            for (let c of coupons) {
                html += `<!-- начало купона -->
    <div class="coupon">
        <div class="coupon-img"><img src="${c.img}" alt="" /></div>
        <div class="coupon-content">
            <div class="coupon-title">${escapeHtml(c.title)}</div>
            <div class="coupon-desc">${escapeHtml(c.desc)}</div>
            <div class="coupon-meta">${escapeHtml(c.meta)}</div>
        </div>
    </div>
    <!-- конец купона -->
    `;
            }
            return html;
        }
       
        function generateCouponsAndDisplay() {
            const html = generateCouponsHTML();
            const escaped = html.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
            document.getElementById('couponsCode').innerHTML = escaped;
            return html;
        }
       
        function copyCoupons() {
            const html = generateCouponsHTML();
            const btn = document.getElementById('copyCouponsBtn');
            copyToClipboard(html, btn);
        }
       
        // ========== ГАЛЕРЕИ ==========
        function generateGalleryHTML() {
            const fonText = document.getElementById('g_fonText').value;
            let plashki = document.getElementById('g_plashki').value.split('\n').filter(u => u.trim());
            let foni = document.getElementById('g_foni').value.split('\n').filter(u => u.trim());
            let icons = document.getElementById('g_icons').value.split('\n').filter(u => u.trim());
           
            let result = '';
           
            // Плашки
            if (plashki.length > 0) {
                result += `<!-- начало плашки -->
    <div class="plashki-container">
    `;
                for (let url of plashki) {
                    result += `    <div class="plashka-item">
            <img src="${url}" />
            <div class="fon-text">${escapeHtml(fonText)}</div>
        </div>
    `;
                }
                result += `</div>
    <!-- конец плашки -->
    `;
            }
           
            // Фоны
            if (foni.length > 0) {
                result += `<!-- начало фонов -->
    <div class="foni-container">
    ${foni.map(url => `<img src="${url}" />`).join(' ')}
    </div>
    <!-- конец фонов -->
    `;
            }
           
            // Иконки
            if (icons.length > 0) {
                result += `<!-- начало иконок -->
    <div class="icons-container">
    ${icons.map(url => `<img src="${url}" />`).join(' ')}
    </div>
    <!-- конец иконок -->`;
            }
           
            if (!result) {
                result = '<!-- нет галерей -->';
            }
           
            return result.trim();
        }
       
        function generateGalleryAndDisplay() {
            const html = generateGalleryHTML();
            const escaped = html.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
            document.getElementById('galleryCode').innerHTML = escaped;
            return html;
        }
       
        function copyGallery() {
            const html = generateGalleryHTML();
            const btn = document.getElementById('copyGalleryBtn');
            copyToClipboard(html, btn);
        }
       
        // ========== ПОЛНАЯ СТРАНИЦА ==========
        function generateFullPageHTML() {
            const avatar = document.getElementById('g_avatar').value;
            const name = document.getElementById('g_name').value;
            const fraction = document.getElementById('g_fraction').value;
            const occupation = document.getElementById('g_occupation').value;
            const fonText = document.getElementById('g_fonText').value;
           
            let plashki = document.getElementById('g_plashki').value.split('\n').filter(u => u.trim());
            let foni = document.getElementById('g_foni').value.split('\n').filter(u => u.trim());
            let icons = document.getElementById('g_icons').value.split('\n').filter(u => u.trim());
           
            // Твинки с подсказками
            let twinksHtml = '';
            for (let t of twinks) {
                twinksHtml += `<!-- начало твинка -->
    <div class="twink"><div class="twink-text">`;
                if (t.link && t.link.trim()) {
                    twinksHtml += `<a href="${t.link}"><strong>${escapeHtml(t.name) || 'ссылка на профиль'}</strong></a><br />${escapeHtml(t.description)}`;
                } else {
                    twinksHtml += `<strong>${escapeHtml(t.name) || '—'}</strong><br />${escapeHtml(t.description)}`;
                }
                twinksHtml += `</div>
    </div>
    <!-- конец твинка -->
    `;
            }
           
            // Купоны с подсказками
            let couponsHtml = '';
            for (let c of coupons) {
                couponsHtml += `<!-- начало купона -->
    <div class="coupon">
        <div class="coupon-img"><img src="${c.img}" alt="" /></div>
        <div class="coupon-content">
            <div class="coupon-title">${escapeHtml(c.title)}</div>
            <div class="coupon-desc">${escapeHtml(c.desc)}</div>
            <div class="coupon-meta">${escapeHtml(c.meta)}</div>
        </div>
    </div>
    <!-- конец купона -->
    `;
            }
           
            // Галереи
            let profileContent = '';
           
            if (plashki.length > 0) {
                profileContent += `<!-- начало плашки -->
    <div class="plashki-gallery">
    <div class="gallery-title">плашки</div>
    <div class="plashki-container">
    `;
                for (let url of plashki) {
                    profileContent += `    <div class="plashka-item">
            <img src="${url}" />
            <div class="fon-text">${escapeHtml(fonText)}</div>
        </div>
    `;
                }
                profileContent += `</div>
    </div>
    <!-- конец плашки -->
    `;
            }
           
            if (foni.length > 0) {
                profileContent += `<!-- начало фонов -->
    <div class="phoni-gallery">
    <div class="gallery-title">фоны</div>
    ${foni.map(url => `<img src="${url}" />`).join(' ')}
    </div>
    <!-- конец фонов -->
    `;
            }
           
            if (icons.length > 0) {
                profileContent += `<!-- начало иконок -->
    <div class="icons-gallery">
    <div class="gallery-title">иконки</div>
    ${icons.map(url => `<img src="${url}" />`).join(' ')}
    </div>
    <!-- конец иконок -->
    `;
            }
           
            if (!profileContent) {
                profileContent = '<div class="gallery-title">нет данных</div>';
            }
           
            return `<div class="character">
    <div class="modal-content">
    <div class="left-column">
    <div class="general"><img src="${avatar}" />
    <h2>${escapeHtml(name)}</h2>
    <div class="fraction">${escapeHtml(fraction)}</div>
    <div class="occupation">${escapeHtml(occupation).replace(/\n/g, '<br />')}</div>
    </div>
    </div>
    <div class="right-column">
    <div class="menu">
    <div class="menu-links"> <span alt="#sm1" onclick='showTab(this);'>твинки</span> <span alt="#sm2" onclick='showTab(this);'>купоны</span> <span alt="#sm3" onclick='showTab(this);'>профиль</span>
    </div>
    <div id="submenu">
    <div id="sm1" class="submenutext">
    <!-- твинки-->
    ${twinksHtml || ' '}
    </div>
    <div id="sm2" class="submenutext" style="display:none;">
    <div class="coupon-list">
    <!-- купоны-->
    ${couponsHtml || '<div class="coupon">нет купонов</div>'}
    </div>
    </div>
    <div id="sm3" class="submenutext" style="display:none;">
    ${profileContent}
    </div>
    </div>
    <a class="close-reveal-modal">&times;</a>
    </div>
    </div>
    </div>`;
        }
       
        function copyFullPage() {
            const html = generateFullPageHTML();
            const btn = document.getElementById('g_full_page_btn');
            copyToClipboard(html, btn, 'Всё скопировано!');
        }
       
        // Очистка всего
        function clearAll() {
            document.getElementById('g_avatar').value = '';
            document.getElementById('g_name').value = '';
            document.getElementById('g_fraction').value = '';
            document.getElementById('g_occupation').value = '';
            document.getElementById('g_fonText').value = '';
            document.getElementById('g_plashki').value = '';
            document.getElementById('g_foni').value = '';
            document.getElementById('g_icons').value = '';
            twinks = [];
            coupons = [];
            renderTwinks();
            renderCoupons();
            document.getElementById('mainCode').innerHTML = 'Форма очищена';
            document.getElementById('twinksCode').innerHTML = 'Форма очищена';
            document.getElementById('couponsCode').innerHTML = 'Форма очищена';
            document.getElementById('galleryCode').innerHTML = 'Форма очищена';
        }
       
        // Твинки
        function renderTwinks() {
            const container = document.getElementById('g_twinks_container');
            if (!container) return;
            if (twinks.length === 0) {
                container.innerHTML = '<div class="gen-note">Нет твинков. Нажмите "+ Добавить твинка"</div>';
                return;
            }
            container.innerHTML = twinks.map((t, idx) => `
                <div class="twink-item">
                    <div class="inline-row">
                        <input type="text" placeholder="Имя" value="${escapeHtml(t.name)}" onchange="window.updateTwink(${idx}, 'name', this.value)">
                        <input type="text" placeholder="URL ссылки на профиль" value="${escapeHtml(t.link)}" onchange="window.updateTwink(${idx}, 'link', this.value)">
                        <button class="remove-btn" onclick="window.removeTwink(${idx})">✕</button>
                    </div>
                    <input type="text" placeholder="чистота крови, фракция, занятость" value="${escapeHtml(t.description)}" onchange="window.updateTwink(${idx}, 'description', this.value)" style="width:100%; margin-top:5px;">
                </div>
            `).join('');
        }
       
        function addTwink() { twinks.push({ name: "", link: "", description: "" }); renderTwinks(); }
        function removeTwink(i) { twinks.splice(i, 1); renderTwinks(); }
        function updateTwink(i, f, v) { if (twinks[i]) twinks[i][f] = v; }
        function clearTwinks() { twinks = []; renderTwinks(); generateTwinksAndDisplay(); }
       
        // Купоны
        function renderCoupons() {
            const container = document.getElementById('g_coupons_container');
            if (!container) return;
            if (coupons.length === 0) {
                container.innerHTML = '<div class="gen-note">Нет купонов. Нажмите "+ Добавить купон"</div>';
                return;
            }
            container.innerHTML = coupons.map((c, idx) => `
                <div class="coupon-item">
                    <div class="inline-row">
                        <input type="text" placeholder="URL картинки" value="${escapeHtml(c.img)}" onchange="window.updateCoupon(${idx}, 'img', this.value)">
                        <input type="text" placeholder="Заголовок" value="${escapeHtml(c.title)}" onchange="window.updateCoupon(${idx}, 'title', this.value)">
                        <button class="remove-btn" onclick="window.removeCoupon(${idx})">✕</button>
                    </div>
                    <div class="inline-row" style="margin-top:5px;">
                        <input type="text" placeholder="Описание" value="${escapeHtml(c.desc)}" onchange="window.updateCoupon(${idx}, 'desc', this.value)" style="flex:2;">
                        <input type="text" placeholder="Действует до" value="${escapeHtml(c.meta)}" onchange="window.updateCoupon(${idx}, 'meta', this.value)" style="flex:1;">
                    </div>
                </div>
            `).join('');
        }
       
        function addCoupon() { coupons.push({ img: "", title: "", desc: "", meta: "" }); renderCoupons(); }
        function removeCoupon(i) { coupons.splice(i, 1); renderCoupons(); }
        function updateCoupon(i, f, v) { if (coupons[i]) coupons[i][f] = v; }
        function clearCoupons() { coupons = []; renderCoupons(); generateCouponsAndDisplay(); }
       
        window.updateTwink = updateTwink;
        window.removeTwink = removeTwink;
        window.updateCoupon = updateCoupon;
        window.removeCoupon = removeCoupon;
       
        document.getElementById('generateMainBtn').onclick = generateMainAndDisplay;
        document.getElementById('copyMainBtn').onclick = copyMain;
        document.getElementById('generateTwinksBtn').onclick = generateTwinksAndDisplay;
        document.getElementById('copyTwinksBtn').onclick = copyTwinks;
        document.getElementById('generateCouponsBtn').onclick = generateCouponsAndDisplay;
        document.getElementById('copyCouponsBtn').onclick = copyCoupons;
        document.getElementById('generateGalleryBtn').onclick = generateGalleryAndDisplay;
        document.getElementById('copyGalleryBtn').onclick = copyGallery;
        document.getElementById('g_full_page_btn').onclick = copyFullPage;
        document.getElementById('g_clear_btn').onclick = clearAll;
        document.getElementById('g_add_twink').onclick = addTwink;
        document.getElementById('g_clear_twinks').onclick = clearTwinks;
        document.getElementById('g_add_coupon').onclick = addCoupon;
        document.getElementById('g_clear_coupons').onclick = clearCoupons;
       
        renderTwinks();
        renderCoupons();
    })();
    </script>[/html]

    0

    8

    неактуально

    [html]    <style>
            * {
                box-sizing: border-box;
            }

            .card {
                background: var(--sec-bg);
                border-radius: 16px;
                padding: 25px;
                margin-bottom: 25px;
                border-left: 8px solid var(--textcolor);
            }
            .card h2 {
                margin: 0 0 20px 0;
                font-size: 22px;
            }
            .row {
                display: flex;
                gap: 20px;
                flex-wrap: wrap;
            }
            .col {
                flex: 1;
                min-width: 280px;
            }
            .form-group {
                margin-bottom: 15px;
            }
            label {
                display: block;
                font-weight: bold;
                margin-bottom: 5px;
                color: var(--textcolor);
            }
            input, textarea {
                width: 100%;
                padding: 8px 12px;
                border: 1px solid var(--textcolor)!important;
                border-radius: 8px;
                background: var(--post-bg)!important;
                font-family: inherit;
            }
            textarea {
                resize: vertical;
                min-height: 80px;
            }
            .btn {
                background: var(--link);
                color: white;
                border: none;
                padding: 10px 20px;
                border-radius: 8px;
                cursor: pointer;
                margin-right: 10px;
                margin-bottom: 10px;
                font-size: 14px;
                transition: all 0.2s;
            }
            .btn:hover {
                opacity: 0.85;
                transform: scale(0.98);
            }
            .btn-green {
                background: var(--link);
            }
            .btn-blue {
                background: var(--body-bg);
            }
            .btn-red {
                background: var(--link-hover);
            }
            .btn-copied {
                background: var(--body-bg)!important;
            }
            .twink-item {
                background: white;
                padding: 12px;
                margin-bottom: 10px;
                border-radius: 8px;
                border-left: 4px solid var(--textcolor);
            }
            .inline-row {
                display: flex;
                gap: 10px;
                flex-wrap: wrap;
                margin-bottom: 8px;
            }
            .inline-row input {
                flex: 1;
            }
            .remove-btn {
                background: #aa3e1c;
                color: white;
                border: none;
                padding: 6px 12px;
                border-radius: 6px;
                cursor: pointer;
            }
            .note {
                font-size: 12px;
                           background: var(--post-bg);
                padding: 10px;
                border-radius: 8px;
                margin-top: 10px;
    margin-bottom: 10px;
            }
            .output {
                background: var(--textcolor);
                border-radius: 16px;
                padding: 20px;
            }
            .output h3 {
                color: var(--sec-bg);
                margin-top: 0;
                margin-bottom: 15px;
            }
            .code-block {
                background: var(--post-bg);
                color: var(--textcolor);
                font-family: 'Courier New', monospace;
                padding: 15px;
                border-radius: 8px;
                font-size: 12px;
                overflow-x: auto;
                white-space: pre-wrap;
                word-break: break-all;
                max-height: 500px;
            }
            .badge {
                display: inline-block;
                background: #8b5a2b;
                color: white;
                font-size: 12px;
                padding: 4px 10px;
                border-radius: 20px;
                margin-left: 10px;
            }
            .button-group {
                text-align: center;
                margin-bottom: 25px;
            }
        </style>
    </head>
    <body>

    <h1 style="font-weight: bold; text-align: center;">Личная страница персонажа</h1>
    <p style="text-align: center; margin-bottom: 25px;">
        Заполните данные — получите готовый код страницы. Не забудьте вставить его в тег code
    </p>

    <!-- ОСНОВНАЯ ИНФОРМАЦИЯ -->
    <div class="card">
        <h2> Основная информация</h2>
        <div class="row">
            <div class="col">
                <div class="form-group">
                    <label>URL картинки</label>
                    <input type="text" id="avatarUrl" placeholder="https://example.com/avatar.gif">
                </div>
                <div class="form-group">
                    <label> Имя персонажа</label>
                    <input type="text" id="charName" placeholder="Имя персонажа">
                </div>
            </div>
            <div class="col">
                <div class="form-group">
                    <label> Фракция + для сопротивленцев ячейка (если есть) и позывной</label>
                    <input type="text" id="fraction" placeholder="Фракция | позывной">
                </div>
                <div class="form-group">
                    <label>Род занятий</label>
                    <textarea id="occupation" rows="3" placeholder="Род занятий"></textarea>
                </div>
            </div>
        </div>
    </div>

    <!-- ТВИНКИ -->
    <div class="card">
        <h2> Твинки</h2>
        <div id="twinksContainer"></div>
        <button class="btn" onclick="addTwink()">добавить твинка</button>
        <button class="btn btn-red" onclick="clearAllTwinks()">очистить все</button>
    </div>

    <!-- КНОПКИ ДЕЙСТВИЙ -->
    <div class="button-group">
        <button class="btn btn-green" id="generateBtn">cгенерировать и скопировать</button>
        <button class="btn btn-red" id="clearBtn">очистить всё</button>
    </div>

    <!-- РЕЗУЛЬТАТ -->
    <div class="output">
        <h3>Готовый код</h3>
        <div class="code-block" id="codeBlock">
            Заполните данные и нажмите "Сгенерировать"
        </div>
    </div>

    <script>
        // Данные
        let twinks = [];

        function escapeHtml(str) {
            if (!str) return '';
            return str.replace(/&/g, '&amp;')
                      .replace(/</g, '&lt;')
                      .replace(/>/g, '&gt;')
                      .replace(/"/g, '&quot;');
        }

        // Генерация полного HTML
        function generateFullHTML() {
            const avatar = document.getElementById('avatarUrl').value;
            const charName = document.getElementById('charName').value;
            const fraction = document.getElementById('fraction').value;
            const occupation = document.getElementById('occupation').value;

            // Твинки
            let twinksHtml = '';
            for (let t of twinks) {
                if (t.name || t.link || t.description) {
                    if (t.link && t.link.trim()) {
                        twinksHtml += `<div class="twink"><div class="twink-text"><a href="${t.link}"><strong>${escapeHtml(t.name) || 'ссылка на профиль'}</strong></a><br />${escapeHtml(t.description)}</div></div>`;
                    } else {
                        twinksHtml += `<div class="twink"><div class="twink-text"><strong>${escapeHtml(t.name) || '—'}</strong><br />${escapeHtml(t.description)}</div></div>`;
                    }
                }
            }
            if (!twinksHtml) twinksHtml = '<div class="twink"><div class="twink-text">Нет данных</div></div>';

            // Пустые блоки
            const emptyPlashki = '—';
            const emptyFoni = '—';
            const emptyIcons = '—';
            const emptyCoupons = '<div class="coupon">Нет купонов</div>';
            const emptyFonText = '';

            return `<div class="character">
    <div class="modal-content">
    <div class="left-column">
    <div class="general"><img src="${avatar}" />
    <h2>${escapeHtml(charName)}</h2>
    <div class="fraction">${escapeHtml(fraction)}</div>
    <div class="occupation">${escapeHtml(occupation).replace(/\n/g, '<br />')}</div>
    </div>
    </div>
    <div class="right-column">
    <div class="menu">
    <div class="menu-links"> <span alt="#sm1" onclick='showTab(this);'>твинки</span> <span alt="#sm2" onclick='showTab(this);'>купоны</span> <span alt="#sm3" onclick='showTab(this);'>профиль</span>
    </div>
    <div id="submenu">
    <div id="sm1" class="submenutext"><!-- твинки-->
    ${twinksHtml}
    </div>
    <div id="sm2" class="submenutext" style="display:none;">
    <div class="coupon-list"><!-- купоны-->
    ${emptyCoupons}
    </div>
    </div>
    <div id="sm3" class="submenutext" style="display:none;">
    <div class="profile-grid">
    <div class="profile-left">
    <div class="plashki-gallery">
    <div class="gallery-title">плашки</div>
    ${emptyPlashki}
    </div>
    </div>
    <div class="profile-right">
    <div class="phoni-gallery">
    <div class="gallery-title">фоны</div>
    ${emptyFoni}
    </div>
    <div class="icons-gallery">
    <div class="gallery-title">иконки</div>
    ${emptyIcons}
    </div>
    </div>
    </div>
    </div>
    </div>
    <a class="close-reveal-modal">&times;</a>
    </div>
    </div>
    </div>`;
        }

        // Функция копирования в буфер (рабочий способ)
        function copyToClipboard(text, btn) {
            // Создаём временное текстовое поле
            const textarea = document.createElement('textarea');
            textarea.value = text;
            textarea.style.position = 'fixed';
            textarea.style.top = '-9999px';
            textarea.style.left = '-9999px';
            document.body.appendChild(textarea);
           
            // Выделяем и копируем
            textarea.select();
            textarea.setSelectionRange(0, text.length);
           
            let success = false;
            try {
                success = document.execCommand('copy');
            } catch (err) {
                success = false;
            }
           
            // Удаляем временное поле
            document.body.removeChild(textarea);
           
            // Визуальная обратная связь
            if (success) {
                const originalText = btn.innerHTML;
                btn.innerHTML = 'Скопировано!';
                btn.classList.add('btn-copied');
                setTimeout(() => {
                    btn.innerHTML = originalText;
                    btn.classList.remove('btn-copied');
                }, 2000);
            } else {
                btn.innerHTML = ' Ошибка!';
                setTimeout(() => {
                    btn.innerHTML = 'Сгенерировать и скопировать';
                    btn.classList.remove('btn-copied');
                }, 2000);
            }
           
            return success;
        }

        // Функция для отображения кода в блоке
        function displayCode() {
            const html = generateFullHTML();
            const escaped = html.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
            document.getElementById('codeBlock').innerHTML = escaped;
            return html;
        }

        // Генерация и копирование
        function generateAndCopy() {
            const html = displayCode();
            const btn = document.getElementById('generateBtn');
            copyToClipboard(html, btn);
        }

       
        // Очистка всего
        function clearAllForm() {
            document.getElementById('avatarUrl').value = '';
            document.getElementById('charName').value = '';
            document.getElementById('fraction').value = '';
            document.getElementById('occupation').value = '';
            clearAllTwinks();
            document.getElementById('codeBlock').innerHTML = 'Форма очищена. Введите новые данные.';
        }

        // ========== УПРАВЛЕНИЕ ТВИНКАМИ ==========
        function addTwink() {
            twinks.push({ name: "", link: "", description: "" });
            renderTwinks();
        }

        function removeTwink(index) {
            twinks.splice(index, 1);
            renderTwinks();
        }

        function clearAllTwinks() {
            twinks = [];
            renderTwinks();
        }

        function updateTwink(index, field, value) {
            twinks[index][field] = value;
        }

        function renderTwinks() {
            const container = document.getElementById('twinksContainer');
            if (twinks.length === 0) {
                container.innerHTML = '<div class="note">Нет твинков. Нажмите "Добавить твинка"</div>';
                return;
            }
            container.innerHTML = twinks.map((t, idx) => `
                <div class="twink-item">
                    <div class="inline-row">
                        <input type="text" placeholder="Имя" value="${escapeHtml(t.name)}"
                               onchange="updateTwink(${idx}, 'name', this.value)">
                        <input type="text" placeholder="URL ссылки на профиль" value="${escapeHtml(t.link)}"
                               onchange="updateTwink(${idx}, 'link', this.value)">
                        <button class="remove-btn" onclick="removeTwink(${idx})">✕</button>
                    </div>
                    <input type="text" placeholder="чистота крови, фракция, занятость" value="${escapeHtml(t.description)}"
                           onchange="updateTwink(${idx}, 'description', this.value)" style="width:100%; margin-top:5px;">
                </div>
            `).join('');
        }

        // Привязываем обработчики к кнопкам
        document.getElementById('generateBtn').onclick = generateAndCopy;
        document.getElementById('clearBtn').onclick = clearAllForm;

        // Инициализация
        renderTwinks();
    </script>
    [/html]

    0

    9

    варианты фонов

    https://upforme.ru/uploads/0014/d2/5e/14/137161.png https://upforme.ru/uploads/0014/d2/5e/14/708576.png
    https://upforme.ru/uploads/0014/d2/5e/14/881601.png https://upforme.ru/uploads/0014/d2/5e/14/853816.png
    https://upforme.ru/uploads/0014/d2/5e/14/538796.png https://upforme.ru/uploads/0014/d2/5e/14/151242.png
    https://upforme.ru/uploads/0014/d2/5e/14/156677.png https://upforme.ru/uploads/0014/d2/5e/14/39243.png
    https://upforme.ru/uploads/0014/d2/5e/14/824530.png https://upforme.ru/uploads/0014/d2/5e/14/126156.png
    https://upforme.ru/uploads/0014/d2/5e/14/223367.png https://upforme.ru/uploads/0014/d2/5e/14/256641.png
    https://upforme.ru/uploads/0014/d2/5e/14/93502.png https://upforme.ru/uploads/0014/d2/5e/14/747981.png
    https://upforme.ru/uploads/0014/d2/5e/14/636749.png https://upforme.ru/uploads/0014/d2/5e/14/194896.png
    https://upforme.ru/uploads/0014/d2/5e/14/714512.png https://upforme.ru/uploads/0014/d2/5e/14/965457.png
    https://upforme.ru/uploads/0014/d2/5e/14/684364.png https://upforme.ru/uploads/0014/d2/5e/14/367383.png
    https://upforme.ru/uploads/0014/d2/5e/14/725814.png https://upforme.ru/uploads/0014/d2/5e/14/263506.png
    https://upforme.ru/uploads/0014/d2/5e/14/954004.png https://upforme.ru/uploads/0014/d2/5e/14/548507.png
    https://upforme.ru/uploads/0014/d2/5e/14/819273.png https://upforme.ru/uploads/0014/d2/5e/14/901545.png
    https://upforme.ru/uploads/0014/d2/5e/14/126949.png

    0

    10

    https://forumstatic.ru/files/0014/d2/5e/30793.png https://forumstatic.ru/files/0014/d2/5e/57456.png https://forumstatic.ru/files/0014/d2/5e/53594.png
    https://forumstatic.ru/files/0014/d2/5e/62348.png
    https://forumstatic.ru/files/0014/d2/5e/74173.png
    https://forumstatic.ru/files/0014/d2/5e/80140.png

    0

    11

    https://forumstatic.ru/files/0014/d2/5e/14321.png https://forumstatic.ru/files/0014/d2/5e/45043.png https://forumstatic.ru/files/0014/d2/5e/62865.png https://forumstatic.ru/files/0014/d2/5e/86679.png

    0

    12

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

    прайс-лист
    - плашка (картинка + надпись) из готового набора - 100 галеонов
    - фон профиля из готового набора - 100 галеонов
    - плашка (картинка + надпись) на заказ - 200 галеонов
    - смена фразы в плашке - бесплатно!
    - фон профиля на заказ - 200 галеонов
    - эмодзи из готового набора - 25 галеонов за штуку (максимум 2 для профиля)
    - эмодзи по своему выбору - 50 галеонов

    ЛЕТНЯЯ КОЛЛЕКЦИЯ

    фразы для плашек:

    это просто летний дождь

    волны шепчут твое имя

    вино, жара и никаких сов

    мозг плавится, и я вместе с ним

    таю как мороженое
    иди оближи

    загадки солнца
    на твоей коже

    ветер шепчет
    ты слышишь?

    талия растворилась
    вместе со снегом


    иконки в профиль:

    https://upforme.ru/uploads/0014/d2/5e/14/687699.png https://upforme.ru/uploads/0014/d2/5e/14/128446.png https://upforme.ru/uploads/0014/d2/5e/14/327680.png https://upforme.ru/uploads/0014/d2/5e/14/402725.png https://upforme.ru/uploads/0014/d2/5e/14/380625.png https://upforme.ru/uploads/0014/d2/5e/14/515177.png https://upforme.ru/uploads/0014/d2/5e/14/837872.png  https://upforme.ru/uploads/0014/d2/5e/14/307145.png https://upforme.ru/uploads/0014/d2/5e/14/956370.png

    плашки

    https://upforme.ru/uploads/0014/d2/5e/14/251629.png

    https://upforme.ru/uploads/0014/d2/5e/14/794836.png

    https://upforme.ru/uploads/0014/d2/5e/14/119708.png

    https://upforme.ru/uploads/0014/d2/5e/14/203491.png

    https://upforme.ru/uploads/0014/d2/5e/14/988358.png

    https://upforme.ru/uploads/0014/d2/5e/14/16670.png

    фоны

    https://upforme.ru/uploads/0014/d2/5e/14/137161.png

    https://upforme.ru/uploads/0014/d2/5e/14/708576.png

    https://upforme.ru/uploads/0014/d2/5e/14/881601.png

    https://upforme.ru/uploads/0014/d2/5e/14/853816.png

    https://upforme.ru/uploads/0014/d2/5e/14/538796.png

    https://upforme.ru/uploads/0014/d2/5e/14/151242.png

    https://upforme.ru/uploads/0014/d2/5e/14/156677.png

    https://upforme.ru/uploads/0014/d2/5e/14/126949.png

    https://upforme.ru/uploads/0014/d2/5e/14/824530.png

    https://upforme.ru/uploads/0014/d2/5e/14/126156.png

    https://upforme.ru/uploads/0014/d2/5e/14/223367.png

    https://upforme.ru/uploads/0014/d2/5e/14/256641.png

    https://upforme.ru/uploads/0014/d2/5e/14/93502.png

    https://upforme.ru/uploads/0014/d2/5e/14/747981.png

    https://upforme.ru/uploads/0014/d2/5e/14/636749.png

    https://upforme.ru/uploads/0014/d2/5e/14/194896.png

    https://upforme.ru/uploads/0014/d2/5e/14/714512.png

    https://upforme.ru/uploads/0014/d2/5e/14/965457.png

    https://upforme.ru/uploads/0014/d2/5e/14/263506.png

    https://upforme.ru/uploads/0014/d2/5e/14/954004.png

    https://upforme.ru/uploads/0014/d2/5e/14/548507.png

    https://upforme.ru/uploads/0014/d2/5e/14/725814.png

    https://upforme.ru/uploads/0014/d2/5e/14/684364.png

    https://upforme.ru/uploads/0014/d2/5e/14/367383.png

    весенняя коллекция

    фразы для плашек:

    да гори оно все
    драконьим пламенем

    да, потеплело.
    нет, я не стану добрее.

    открываю сезон
    прикрытых глаз

    весной хочется жить
    или поджечь что-нибудь

    почки распустились
    я — тоже

    хотел романтики
    получил повестку

    весной даже совесть
    снимает мантию

    дракон не спит
    и я тоже


    иконки в профиль:

    https://upforme.ru/uploads/0014/d2/5e/14/278962.png https://upforme.ru/uploads/0014/d2/5e/14/926957.png https://upforme.ru/uploads/0014/d2/5e/14/671863.png https://upforme.ru/uploads/0014/d2/5e/14/432999.png https://upforme.ru/uploads/0014/d2/5e/14/161584.png https://upforme.ru/uploads/0014/d2/5e/14/578266.png

    плашки

    https://upforme.ru/uploads/001c/3b/dd/161/222786.png

    https://upforme.ru/uploads/001c/3b/dd/161/41964.png

    https://upforme.ru/uploads/001c/3b/dd/161/799538.png

    https://upforme.ru/uploads/001c/3b/dd/161/950123.gif

    https://upforme.ru/uploads/001c/3b/dd/161/349743.gif

    https://upforme.ru/uploads/001c/3b/dd/161/81954.gif

    фоны

    https://upforme.ru/uploads/001b/d8/2e/2/343127.png

    https://upforme.ru/uploads/001b/d8/2e/2/262826.png

    https://upforme.ru/uploads/001b/d8/2e/2/551295.png

    https://upforme.ru/uploads/001b/d8/2e/2/902185.png

    https://upforme.ru/uploads/001b/d8/2e/2/202667.png

    https://upforme.ru/uploads/001b/d8/2e/2/746796.png

    https://upforme.ru/uploads/001b/d8/2e/2/350079.png

    https://upforme.ru/uploads/001b/d8/2e/2/347542.png

    зимняя коллекция

    [html]<style>
    .gallery {
        display: flex;
        gap: 20px;
    }

    /* две колонки */
    .col {
        display: flex;
        flex-direction: column;
        gap: 15px;
    }

    .col:nth-child(3) {
        width: 250px;
        word-wrap: break-word;
    }

    .fon-light, .fon-dark {
        position: relative;
        display: inline-block;
    }

    .fon-light img, .fon-dark img {
        display: block;
        width: 250px; 
        height: auto;
    }

    /* LIGHT */
    .fon-light::after {
        content: "";
        position: absolute;
        inset: 0;
        background: linear-gradient(
            rgba(152, 171, 177, 0.5) 10%,
            #AEBCBF 100%
        );
        pointer-events: none;
    }

    /* DARK */
    .fon-dark::after {
        content: "";
        position: absolute;
        inset: 0;
        background: linear-gradient(
            rgba(146, 141, 138, 0.5) 10%,
            #A09895 100%
        );
        pointer-events: none;
    }

    .emoji img{width: 34px;
    heith: 34px}
    </style>

    <div class="gallery">

        <!-- левая колонка -->
        <div class="col">
            <div class="fon-light"><img src="https://upforme.ru/uploads/0014/d2/5e/14/627593.png"></div>
            <div class="fon-light"><img src="https://upforme.ru/uploads/0014/d2/5e/14/311256.png"></div>
            <div class="fon-light"><img src="https://upforme.ru/uploads/0014/d2/5e/14/439232.png"></div>
            <div class="fon-light"><img src="https://upforme.ru/uploads/0014/d2/5e/14/964389.png"></div>
            <div class="fon-light"><img src="https://upforme.ru/uploads/0014/d2/5e/14/469935.png"></div>
            <div class="fon-light"><img src="https://upforme.ru/uploads/0014/d2/5e/14/509345.png"></div>
        </div>

        <!-- правая колонка -->
        <div class="col">
            <div class="fon-dark"><img src="https://upforme.ru/uploads/0014/d2/5e/14/627593.png"></div>
            <div class="fon-dark"><img src="https://upforme.ru/uploads/0014/d2/5e/14/311256.png"></div>
            <div class="fon-dark"><img src="https://upforme.ru/uploads/0014/d2/5e/14/439232.png"></div>
            <div class="fon-dark"><img src="https://upforme.ru/uploads/0014/d2/5e/14/964389.png"></div>
            <div class="fon-dark"><img src="https://upforme.ru/uploads/0014/d2/5e/14/469935.png"></div>
            <div class="fon-dark"><img src="https://upforme.ru/uploads/0014/d2/5e/14/509345.png"></div>
        </div>

        <div class="col"><b>фразы для плашек <br>(можно выбрать любую или заказать свою)</b>
    министерским указом<br>
    уют разрешен
    <br><br>
    теплые зелья<br>
    в холодных руках
    <br><br>
    хочу мандаринов<br>
    жую мандрагору
    <br><br>
    сопротивление спряталось так,<br>
    что праздник его не нашел
    <br><br>
    это не праздничный террор<br>
    это корпоратив в министерстве
    <br><br>
    подвожу итоги года<br>
    стараюсь не заплакать
    <br><br>
    планы на зиму: выжить<br>
    и красиво смотреться под ёлочкой
    <br><br>
    маг декоративный:<br>
    максимум чар, минимум пользы
    <br><br>
    я не подарок,<br>
    но красиво упакован
    <div class="fon-light"><img src="https://upforme.ru/uploads/0014/d2/5e/14/720260.gif"></div>
    <div class="fon-dark"><img src="https://upforme.ru/uploads/0014/d2/5e/14/720260.gif"></div>
    <div class="fon-light"><img src="https://upforme.ru/uploads/0014/d2/5e/14/312259.gif"></div>
    <div class="fon-dark"><img src="https://upforme.ru/uploads/0014/d2/5e/14/312259.gif"></div>
    <div class="fon-light"><img src="https://upforme.ru/uploads/0014/d2/5e/14/152050.gif"></div>
    <div class="fon-dark"><img src="https://upforme.ru/uploads/0014/d2/5e/14/152050.gif"></div>
    <div class="fon-light"><img src="https://upforme.ru/uploads/0014/d2/5e/14/387641.gif"></div>
    <div class="fon-dark"><img src="https://upforme.ru/uploads/0014/d2/5e/14/387641.gif"></div>
    <div class="fon-light"><img src="https://upforme.ru/uploads/0014/d2/5e/14/10479.gif"></div>
    <div class="fon-dark"><img src="https://upforme.ru/uploads/0014/d2/5e/14/10479.gif"></div>
    <div class="fon-light"><img src="https://upforme.ru/uploads/0014/d2/5e/14/921236.gif"></div>
    <div class="fon-dark"><img src="https://upforme.ru/uploads/0014/d2/5e/14/921236.gif"></div>
    <div class="fon-light"><img src="https://upforme.ru/uploads/0014/d2/5e/14/611461.gif"></div>
    <div class="fon-dark"><img src="https://upforme.ru/uploads/0014/d2/5e/14/611461.gif"></div>
    <div class="fon-light"><img src="https://upforme.ru/uploads/0014/d2/5e/14/902512.gif"></div>
    <div class="fon-dark"><img src="https://upforme.ru/uploads/0014/d2/5e/14/902512.gif"></div>
    <div class="fon-light"><img src="https://upforme.ru/uploads/0014/d2/5e/14/217440.gif"></div>
    <div class="fon-dark"><img src="https://upforme.ru/uploads/0014/d2/5e/14/217440.gif"></div>
    <b>эмодзи внизу профиля <br>(можно выбрать одну или две - для светлой и тёмной темы)</b>
    <div class="emoji"><img src="https://img.icons8.com/?size=100&id=O8qZGG8hWatE&format=png&color=000000">
    <img src="https://img.icons8.com/?size=100&id=mPImfkDBTQn1&format=png&color=000000">
    <img src="https://img.icons8.com/?size=100&id=bHYIhAtlIzqD&format=png&color=000000">
    <img src="https://img.icons8.com/?size=100&id=wgC4n5niQXU_&format=png&color=000000">
    <img src="https://img.icons8.com/?size=100&id=jmk54CulFVxP&format=png&color=000000">
    <img src="https://img.icons8.com/?size=100&id=AHWkIE_i5sGn&format=png&color=000000">
    <img src="https://img.icons8.com/?size=100&id=PLB1KgUEZ7e7&format=png&color=000000">
    <img src="https://img.icons8.com/?size=100&id=lpwIPuQcu1fD&format=png&color=000000">
    <img src="https://img.icons8.com/?size=100&id=i8it7UTnefS1&format=png&color=000000">
    <img src="https://img.icons8.com/?size=100&id=vAKWxxEbQ6Fq&format=png&color=000000">
    <img src="https://img.icons8.com/?size=100&id=v4AIFGxhL1lB&format=png&color=000000">
    <img src="https://img.icons8.com/?size=100&id=bWSF9BaSORCP&format=png&color=000000">
    </div>
    </div></div>

    </div>

    [/html]

    шаблон заказа:

    Код:
    [b]— позиция из прайс листа:[/b] фон/плашка/эмодзи из набора/своя
    [b]— ссылка на картинку: [/b] из каталога или ваша, можно не указывать, тогда амс подберут сами
    [b]— сумма траты:[/b] общая сумма по всем операциям 
    [b]— общая сумма в профиле:[/b] итоговая сумма с учетом всех операций

    [hideprofile]

    0

    13

    https://forumstatic.ru/files/0014/d2/5e/45043.png


    MILLICENT BULSTRODE
    28 лет ♦ трейсер службы границ и безопасности ♦ феминистка ♦ martina carridi

    Миллс поняла слишком рано: в мире чистокровных недостаточно просто родиться в "правильной" семье. Если ты женщина, то еще должна быть красивой, удобной, молчаливой и желательно не слишком умной. И поскорее стать приложением к мужчине, род которого нужно сохранить. Миллисента смотрела на список привилегий “сильного пола” и злилась. Оказалось, можно любить систему, но ненавидеть ее патриархальные установки.

    Она карабкалась вверх, пока остальная Британия захлебывалась войной. Исполнительная, жесткая, амбициозная — Миллс справлялась быстрее и лучше многих мужчин, став идеальным винтиком министерской машины. Но когда дело доходило до дележа настоящей власти — ей всегда предпочитали парней. Она была готова на все, чтобы пробиться. Охотно приняла метку, а увидев статью о трейсере, получившем признание за поимку Поттера, сразу же подала заявление в отдел контроля границ. Сейчас Миллисента лучшая в своей группе, но это не мешает начальству отклонить ее прошение стать руководителем этой группы. Должность отдают мужчине, и Миллс кипит от бешенства. Она болеет за "Гарпий", завидует Каллисто Эйвери, получившей место в кабинете министра, даже придумывает название для своего — исключительно женского — трейсерского отряда. У нее есть амбиции — магглолюбец Уизли, предатель крови, стал начальником сектора в 30 лет. И она мечтает его превзойти, доказав, что способна.

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

    Миллс не знает, как поступить. Но чем больше ей пытаются навязать чужое мнение и напомнить о "женском предназначении", тем сильнее Миллисента упирается и мечтает о своей собственной революции с девичьим лицом. Масла в огонь подливает ее старший брат Арчибальд Булстроуд — продюсер звезд магической эстрады и один из людей, помогающих режиму формировать красивую картинку для общества. Миллисента слишком хорошо видит, как именно Министерство использует женские лица в пропаганде: как легко превращает ведьм в символы, плакаты и украшения системы, не собираясь воспринимать их всерьез. И если Арчи считает подобные компромиссы нормальной частью игры, то Миллисента — нет. Даже если сама остается частью этой системы.


    GARETH FAWLEY
    27 лет ♦ аврор ♦ отчаявшийся ♦ damian hardung

    Раньше ему казалось, что жизнь устроена довольно просто — мир чистокровных редко оставляет пространство для неожиданностей. Он с детства слушал разговоры о своем "долге" и не сомневался, что все сделает правильно. Вот только Гарету не повезло совершить ошибку. Всего одну, но самую банальную: по-настоящему влюбиться. В Цереру Лестрейндж.

    Гарет никогда не был человеком, склонным к драмам. И, возможно, именно поэтому он так долго верил, что однажды все как-нибудь сложится само собой. Что Церера заметит его чувства, и их семьи договорятся. Что у них еще будет шанс. Он ведь любил ее всегда: и когда от нее отворачивались, как от дочери преступника, и когда ее превозносили, как дочь Министра магии. А потом ее помолвили со стариком Кэрроу, потому что так было выгодно.

    Он пережил это молча, как и положено человеку его круга. Не устраивал сцен, не спорил с решениями старших, не пытался разрушить чужую помолвку. Но впервые по-настоящему понял, насколько мало в этом мире значат личные желания, особенно если ты привык быть "удобным". А потом Цереру убило сопротивление.

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

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

    https://forumstatic.ru/files/0014/d2/5e/14321.png

    https://forumstatic.ru/files/0014/d2/5e/62865.png


    SYBILLA BLACK
    35-45 лет ♦ артефактолог службы границ и безопасности ♦ жаждет мести ♦ hande ercel

    Еще совсем недавно жизнь Сибиллы Блэк выглядела совсем иначе. Она работала артефактором в СГИБе, потому что с юности проявляла интерес ко всему, связанному с заколдованными предметами, да и усидчивости ей было не занимать, что ее родители сочли достаточным основанием для блестящей карьеры. Да Сиби и не возражала. Она хотела быть полезной и оставаться непредвзятой, даже когда к власти пришел темный Лорд. Но даже не разделяя категоричной позиции Пожирателей, Сибилла не собиралась бунтовать против системы. Ей хотелось спокойной, счастливой жизни, и она уверенно шла к ней, убежденная в том, что если работать на систему, система непременно защитит тебя.

    Так она вышла замуж за Чарли Блэка, четвороюродного племянника знаменитых сестер Блэк, а через год родила от него прекрасного темноволосого мальчика. Ее супруг работал в отделе поиска пропавших волшебников, в том же департаменте, что и она сама, и их история казалась настоящим примером для нового мира. Вот только этот мир не знал, что Чарли тайно сочувствует Сопротивлению. Со временем сочувствие перешло в реальную помощь, даже слив информации. Сиби не одобряла, но и запретить не могла, ведь пламенные речи, что вечерами лились из уст ее супруга, не могли совсем не трогать ее сердца. В какой-то момент она даже подумала, что и сама могла бы быть полезной. А потом их с супругом пригласили на свадьбу Министра Магии и дальней родственницы Чарли Андромеды Блэк.

    Со свадьбы Сибилла вернулась одна, проведя двое суток в Мунго с переломанными ногами. Чарли же повезло куда меньше. Стараясь держаться хотя бы во время его похорон, вдова Блэк не могла перестать думать лишь об одном: им наплевать. Тем, ради кого он рисковал жизнью и свободой, тем, в чьи призывы он так отчаянно верил, было на него совершенно наплевать. Они не оплакивали его ухода, они даже не знали о том, что он погиб, он был лишь сторонним ущербом, случайной жертвой, до которой великомученикам из Сопротивления не было никакого дела. В ушах набатом звучали слова Чарли: «их борьба невозможна без смертей, но эти смерти не будут напрасными». Она никогда в это не верила.

    В тот день жизнь Сибиллы Блэк изменилась навсегда. Все то, что она старалась не замечать, все то, что ее супруг хранил в самых секретных местах, она принялась выворачивать наизнанку. Все его связи, заметки, записки — все, что удавалось отыскать, она несла в Министерство, отдавая тем, кому доверяла. Она больше не собиралась быть артефактором, отсиживающимся в кабинете в окружении амулетов и тотемов. Нет, теперь она рвалась в бой, она жаждала возмездия, и готова была идти за ним до конца. Даже если для этого придется принять черную метку на свое предплечье.


    KYLE MACFUSTY
    39 лет ♦ драконолог ♦ готов на всё ♦ matt smith

    Кайл не привык задавать вопросы. Здесь, среди живописных холмов Шотландии, они были не просто чьими-то детьми и чьими-то мужьями. Они делили свои жизни и свои судьбы с драконами - самыми могущественными и непредсказуемыми существами магического мира. Их учили уважать силу, но не бояться ее, учили не поддаваться эмоциям и быть жесткими, но не жестокими, сохраняя достоинство. С самого детства любой Макфасти понимал: в этом мире выживают сильнейшие.

    Кайл получил метку пожирателя смерти вместе с братом, без лишних вопросов. Он никогда не ставил под сомнение правильность тех идеалов, которые преследовал Волдеморт, ведь после прочтения первой же книги о драконах осознал: только самая чистая кровь способна дать самое сильное и выносливое потомство. И пока его старший брат, наследник, а после глава клана, занимался вопросами политики и финансов, Кайл полностью погрузился в драконологию. Он с юности демонстрировал истинный врожденный талант к этому делу, чувствовуя этих огромных огнедышащих тварей, будто понимал, как они думают, и это понимание позволяло ему делать то, чего ни один другой драконолог не мог себе и представить.

    Он завел семью, потому что должен был, даже время от времени покидал Шотландию, посещая приемы и встречи ради привлечения финансирования. Он откликался на зов Лорда без раздумий и колебаний, если где-то требовалось его участие, однако его истинной страстью всегда оставались драконы. Он мечтал однажды совершить революцию в мире драконологии и заткнуть всех, кто сомневался в полезности этого дела.
    Впрочем после прихода Волдеморта к власти финансирование внезапно увеличилось, будто революция уже свершилась. Клан был в восторге, но Кайл понимал, что это совсем не то, чем кажется. Просто в какой-то момент в драконах увидели ресурс, который мог быть крайне полезен в возможной войне. Макфасти был против. Он даже хотел бросить все и уйти, лишь бы его не заставили превращать драконов в машины для убийств. Но потом к нему пришло осознание: его уход ничего не изменит. Драконов все равно будут использовать, их пустят на убой при любом раскладе, вопрос лишь в том, скольким из них придется погибнуть не в своей войне.

    И он остался. И продолжает свою работу в надежде, что когда придет время, он сможет что-то изменить. Когда кто-то из сотрудников называет драконов “живым оружием”, он морщится, спорит, злится… а потом все равно продолжает работу. Потому что никто, кроме него, не сделает ее правильно. Потому что если этим займутся чиновники или военные, драконов начнут калечить и ломать без понимания, как с ними обращаться. Потому что он слишком долго ждал возможности заниматься любимым делом, чтобы теперь отказаться от нее из-за чужой политики. Иногда ему кажется, что любить драконов куда проще, чем людей..

    https://forumstatic.ru/files/0014/d2/5e/86679.png

    0

    14

    https://upforme.ru/uploads/0014/d2/5e/2/547512.png
    имя, добро пожаловать в реальный мир.
    не забудь прихватить с собой волшебную палочку, стратегический запас огненного виски и немного безоара. заполни коды ниже для завершения регистрации в системе и начинай свою историю. но помни: «когда-то нам придётся решать, на чьей мы стороне» (с) а. дамблдор

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

    #1 список персонажей. укажи касту - pb (чистокровный), hb (полукровный), mb (магглорождённый), ph (получеловек), sq (сквиб), ol (вне закона), mg (маггл); лояльность - rs (resistance — сопротивление), de (death eaters — пс), nt (neutral — нейтрал). обратите внимание - сначала идёт фамилия, через запятую имя.

    Код:
    [url=ссылка на профиль][b]фамилия, имя (англ)[/b][/url] [sup]год рождения[/sup] - каста, лояльность.

    #2 внешность.

    Код:
    имя актрисы/актера (англ) - [url=ссылка на профиль]имя персонажа (англ)[/url]

    #3 занятость.
    указать отдельно от кода организацию и должность или вид деятельности

    Код:
    [url=ссылка на профиль]имя персонажа[/url]

    #4 личное звание.

    Код:
    имя фамилия, возраст цифрой
    Код:
    ссылка на анкету
    Код:
    свободное описание с указанием <a href="ССЫЛКА НА ПАРУ">пары</a>, ну если есть.

    каста:

    Код:
    pure-blood / half-blood / muggle-blood / outlaw / part-human (оставить нужное)

    #5 плашка
    просто копируем и вставляем без изменений

    Код:
    <div class="plashka">
      <img alt="">
    <a class="modal-link" id="ИМЯ СТРАНИЦЫ" data-reveal-id="character" href="ССЫЛКА НА СТРАНИЦУ"> 
        <span>maleficas et earum haeresim</span>
      </a>
    </div>
    

    #6 личная страница

    Код:
    ссылки на твинов, если есть
    (опционально) другая информация

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

    0

    15

    [html]
    <div class="news-main">
      <div class="news-zagolovok">BREAKING NEWS</div>

      <div class="news-podlozhka">
        <div class="news-date">01/06/2026</div>

    <p>
      <span class="news-author-inline">
        <img src="https://64.media.tumblr.com/0725f750c8ab2eb67f2043fa8744fbec/ad09b9c8aac26aaa-c4/s540x810/13c84985f0dffc79a5661bbcbb15ad2a329882af.gif">
      </span>
    Ребята, на связи Кассик, и я пришел сюда сегодня в первую очередь для того, чтобы сказать вам, как я вами всеми горжусь! Вы сделали это, вы дожили до лета, вы писали посты, вы активничали где только могли, вы помогли нам закрыть еще одну увлекательную сюжетную арку, и это невероятно ценно как для меня лично, так и для всего нашего админ-состава в целом! Вы большие умнички, спасибо вам что вы у нас есть :3 а сейчас усаживайтесь поудобнее, потому что новостей в этот раз будет оооочень много, но не стоит волноваться, ведь все они максимально приятные и положительные! <s>прямо как я хд</s>
    </p>

    <p>Начнем, пожалуй, с события самого грандиозного - завершения третьей сюжетной арки! Это было непросто, иногда волнительно, иногда почти невозможно, и все-таки мы с вами это сделали! Все сюжеты подошли к своему логичекому концу, а это значит, что и командная гонка наконец завершилась, и мы можем <a href="https://mmaleficarum.rusff.me/viewtopic.php?id=812#p133251">смело объявить итоги!</a> На этот раз, как вы возможно догадались, увидев здесь мою довольную рожу, победа достается <b>ПОЖИРАТЕЛЯМ СМЕРТИ!</b> Безмерно горжусь, от всей души поздравляю, вы огромные молодцы, надеюсь что в следующих гонках отрыв будет еще внушительнее, и мы наконец покажем этим грязнулькам из Сопротивления, где их место! На этом заканчиваю свои радостные крики, а то меня выгонят из админки, и перехожу к другим важностям! Естественно, мы не можем не выделить тех ребят, которые принесли своим командам наибольшее количество баллов! В этот раз лидерами стали <a href="https://mmaleficarum.rusff.me/profile.php?id=267">Драко Малфой</a> и <a href="https://mmaleficarum.rusff.me/profile.php?id=27">Шеймус Финниган</a>, и их старания не останутся незамеченными! В награду каждый из них получит возможость повлиять на сюжет в грядущей сюжетной арке, о чем подробнее мы расскажем, когда ребята определятся со своими пожеланиями.</p>

    <p>Ну а пока я с радостью объявляю каникулы! Мы прекрасно понимаем, что летом у многих совсем нет времени активно просиживать штанишки на форумах, да и давайте откровенно, после такой насыщенной арки всем хочется немного передохнуть! Потому со следующей аркой и набором игроков в сюжет мы вернемся к вам позже, а пока, если кто-то не хочет отказывать себе в удовольствии потрогать сюжет даже в этот период, мы подготовили для вас несколько фоновых событий, которые можно будет использовать в своей игре. Тему с ними мы совсем скоро выложим на форум, там же вы сможете ознакомиться с итогами прошедшей арки и глобальными последствиями, которые неизбежны после произошедшего в ней. Возможно, что-то коснется непосредственно вас или ваших близких? </p>

    <p>На этом с сюжетом закончим, и перейдем к слону, что стоит прямо посреди комнаты - новому дизайну! Он классный, правда?!?! Мы уже поцеловали в пупочки наших неизменных графистов и кодеров Ронни и Финни, но вы в любое время можете к нам присоединиться, они будут только рады! Несколько важных моментов: <b>во 1-ых</b>, мы в этот раз убрали кастомизацию профиля, однако оставили возможность переключаться между светлой и темной темой, потому надеемся, что каждый сможет выбрать для себя то, что ему по вкусу! <b>Во 2-ых</b>, в шапке снова появилось место для нужных, которое можно будет выиграть в активностях или просто купить в банке, а это отличная возможность заняться поиском тех, кто вам жизненно необходим! <b>В 3-их</b>, мы заменили название подфорумов на более интуитивно понятные, <s>ну, нам так кажется хд</s> надеемся, что вы с нами согласитесь, и вам тоже понравится. а если не понравится, то вы привыкните хд а если не понравится и не привыкните - дайте нам знать, мы что-нибудь обязательно придумаем!</p>

    <p><b>В 4-ых</b>, у нас появилась <a href="https://mmaleficarum.rusff.me/viewtopic.php?id=1118#p133248">примерочная фонов и плашек,</a> с возможностью не только примерить имеющиеся варианты, но и самостоятельно загружать понравившиеся картинки и настраивать профиль полностью под свой вкус! А самое приятное в этом то, что механизм сам посчитает вам стоимость вашего заказа и заполнит код, который вам останется просто вставить в форму ответа. Ну не шикарно ли? Ну и <b>в 5-ых</b>, по многочисленным просьбам (и благодаря нашему с Эрни нытью) наша кодовая фея Финниган замутила для нас личную страницу! Теперь все ваши твинки, фоны и плашки, а вместе с ними и полученные во всяких ивентах награды, будут храниться в одном месте, и вы точно ничего не забудете и не потеряете. Естественно, заставлять вас что-то заполнять мы не будем, и все сделаем сами, однако если есть среди вас те, кто хочет <s>выбрать себе красивую гифочку</s> помочь амс и заполнить свою страничку - милости просим <a href="https://mmaleficarum.rusff.me/viewtopic.php?id=1119#p133250">в генератор,</a> там все максимально просто и понятно! А в долгу мы, конечно же, не останемся, и всем, кто заполнит свою страничку, будет автоматически загружен купон на одноразовое спасение от чистки!</p>

        <p>Фуууух, ну и новостей набралось! Кажется, половину перешагнули. Но мы ведь с вами не ссыкло, и идем дальше, правда? Следущий пункт на повестке дня - <a href="https://mmaleficarum.rusff.me/viewtopic.php?id=844">новые акционные заявки!</a> Да, их не много, но мы решили брать не количеством, а качеством! На этот раз привлекаем ребят, на которых максимально влияют события нашего сюжета, готовых активно ввязаться в любую потасовку без лишних вопросов! Так что если вы давно думаете о твинке <s>и у вас их еще не 85, как у нас с Ронни</s>, или у вас есть знакомые, которых вы давно хотели позвать, но не знали, в какой роли - вот вам отличная возможность! Мы будем несказанно рады видеть этих шикарных ребят!</p>

      <p>А пока вы пускаете слюнки на наших сюжетных звездочек, я расскажу вам о развлекушка. Тех, что уже были и тех, что только будут! Лот номер один - полюбившийся всем нам <a href="https://mmaleficarum.rusff.me/viewtopic.php?id=1092">переполох на факультетах</a> подошел к концу! Итоги будут подведены в ближайшее время, полученные баллы пойдут уже в новое противостояние (в старом они бы ничего не изменили, так что нет причин для волнения!). Но если вы думали, что на этом с мини-играми покончено, то вы сильно ошибались! Потому что наша Джинничка подготовила для вас лот номер два - <a href="https://mmaleficarum.rusff.me/viewtopic.php?id=1116#p133243">тетрис!</a> Не ожидали, правда? А никто не ожидал. Но я уверен, что вам понравится! А тем временем лот номер три - <a href="https://mmaleficarum.rusff.me/viewtopic.php?id=1117#p133245">Чемпионат Малефики по квиддичу!</a> Давайте признаем, в магическом мире квиддич так или иначе касается каждого! Потому не стесняемся, записываемся, участвуем и веселимся, а если участвовать не хочется, всегда можно просто посмотреть и поболеть за любимый факультет! Но помните: квиддич - игра командная, и побеждает здесь тот, кто знает разницу между "я" и "мы". Ну и лот номер четыре, для полного релакса - <a href="https://mmaleficarum.rusff.me/viewtopic.php?id=1115#p133242">летняя угадайка.</a> Три этапа разного уровня сложности и упоротости, 2 недели на выполнение заданий, понятные и приятные награды, одним словом никакого напряга, как и положено в начале июня. </p>

    <p>Ну и конечно же, ласт бат нот зе лист, наши достигаторы! Активные по всем фронтам мужчины <a href="https://mmaleficarum.rusff.me/profile.php?id=350">Риччи</a>, <a href="https://mmaleficarum.rusff.me/profile.php?id=378">Аларик</a> и <a href="https://mmaleficarum.rusff.me/profile.php?id=372">Кайрос</a>, мы гордимся вами почти так же сильно, как Каллисто! Продолжайте в том же духе, мы с удовольствием читаем вас и во флуде, и в игре!</p>
    <p>Тем временем у сопротивленцев все стабильно. Эпизод с говорящим названием <a href="https://mmaleficarum.rusff.me/viewtopic.php?id=1071">does Potter really stink?</a> рекомендуется к прочтению всем, кто уже давно задается тем же вопросом, но не решается озвучить его. А если серьезно, флешбеки из 1994, когда школьники Хогвартса собираются за сливочным пивом, чтобы обсудить предстоящий турнир, читаются очень приятно, и погружают в атмосферу того самого уюта, ради которого многие из нас каждый год раз за разом пересматривают все части Гарри Поттера под новый год! И хотя на улице уже совсем не снег и не метель, не отказывайте себе в удовольствии почитать эти очаровательные посиделки.  </p>
    <p>Что же до поста, признаюсь, мне очень приятно, что в нашей шапке будет висеть именно он. Прекрасная <a href="https://mmaleficarum.rusff.me/profile.php?id=202">Рианнон</a> во время своего медового месяца с тем самым рыжим из <s>Иванушек </s>Уизли, который копил целый год, чтобы <a href="https://mmaleficarum.rusff.me/viewtopic.php?id=986#p132398">отвезти малую на море</a>, выглядит просто безупречно! Непременно сходите и полюбуйтесь!</p>

    <p>Ну а на этом пока все, наслаждайтесь летом, отдыхайте, развлекайтесь с нами и без нас, и возвращайтесь, чтобы дальше радовать нас своими постами! Всех люблю-целую-обнимаю, ваш Кассик ♥ </p>
    <p></p>
      </div>
    </div>
    [/html]
    [hideprofile]

    0

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

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



    Вы здесь » Squirrel test » — мироустройство » лето 2026


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