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

тёмный лорд одержал победу во второй магической войне, установив тоталитарный режим. волшебное общество оказалось разделено на касты по чистоте крови, границы закрыты, а репрессии и дискриминация стали нормой. надежда на перемены теперь связана с сопротивлением, которое по масштабу превзошло сам орден феникса.
malleus maleficarum
hp: dark au
2nd gen, 2008
best post
harry potter: К сожалению, ни один праздник не мог гарантировать, что ничего плохого вновь не случится. Однако кое-что он проявлял наверняка: люди знали обо всех возможных последствиях, и все равно приходили. И впервые за много лет Гарри вдруг подумал, что тридцать первое июля все же может быть днем, когда не обязательно прятаться.
тебе сюда
итоги экспедиции
выберись из неё
новый расклад
сыграй в маджонг

Squirrel test

Объявление

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

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


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


    осень 2026

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

    1

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

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

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

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

    0

    2

    [html]

    <div id="dressingRoomApp" class="dressing-room">
    <div class="hint" style="margin: 15px; text-align: center; text-transform: lowercase; font-size: 13px">
                    в этой теме вы можете приобрести обновочки для профиля. теперь можно выбрать из уже готовых вариантов (целуем золотые ручки наших мастеров), а можно, как обычно, заказать что-то лично для себя, но чуть дороже. <b>коллекция будет периодически обновляться</b>, так что рекомендуем оформить подписку на наш каталог!<br>
    Настройки сохраняются автоматически |  При генерации копируется весь код вместе с итоговой суммой за ваши покупки
                </div>
        <div class="two-columns">
            <div class="left-column-shop">
                <div class="preview-label">↓ ваш профиль будет выглядеть так ↓</div>
                <div id="previewContainer" class="demo-profile"></div>
               
                <button id="resetBtn" class="reset-btn">Сбросить всё</button>
               
                <div class="result-block">
                    <div class="total-cost-block" id="totalCostBlock">
                        <div class="total-cost-label">ИТОГО К ОПЛАТЕ:</div>
                        <span id="totalCost">0</span>
                        <div class="total-cost-label">(галеонов)</div>
                    </div>

    <div class="balance-block">
        <label> Галеонов в профиле:</label>
        <input type="number" id="userBalance" class="balance-input" placeholder="Введите количество" value="0" min="0">
        <div class="remaining-block">
            <span class="remaining-label">Остаток после покупки:</span>
            <span id="remainingCost" class="remaining-value">0</span>
            <span class="remaining-currency">галеонов</span>
        </div>
    </div>
                   
                    <div class="code-container">
                        <code id="generatedCode">нажмите кнопку "сгенерировать код"</code>
                    </div>
                    <button id="generateBtn" class="generate-btn">Сгенерировать код</button>
                </div>
            </div>
           
            <div class="right-column">
                <!-- ФОНЫ -->
                <h3> Фоны профиля
                    <div class="category-controls">
                        <label class="gift-checkbox"><input type="checkbox" id="giftBg"> Подарок</label>
                        <button class="clear-category-btn" data-clear="bg">Очистить</button>
                    </div>
                </h3>
               
                <div class="shop-container">
                    <div class="shop-content">
                        <div class="collection-title">летняя коллекция <span class="collection-badge">NEW</span></div>
                        <div id="shop-bg-new" class="shop-grid"></div>
                       
                        <div class="collection-title">весенняя коллекция</div>
                        <div id="shop-bg-old" class="shop-grid"></div>
                    </div>
                </div>
               
                <div class="url-row">
                    <label>🔗 Своя ссылка на фон (200 галеонов):</label>
                    <div class="url-input-group">
                        <input type="text" id="customBgUrl" placeholder="https://example.com/background.png">
                    </div>
                </div>
               
                <!-- ПЛАШКИ -->
                <h3>Плашки
                    <div class="category-controls">
                        <label class="gift-checkbox"><input type="checkbox" id="giftPlashka"> Подарок</label>
                        <button class="clear-category-btn" data-clear="plashka">Очистить</button>
                    </div>
                </h3>
               
                <div class="shop-container">
                    <div class="shop-content shop-content-plashka">
                        <div class="collection-title">летняя коллекция <span class="collection-badge">NEW</span></div>
                        <div id="shop-plashka-new" class="shop-grid"></div>
                       
                        <div class="collection-title">весенняя коллекция</div>
                        <div id="shop-plashka-old" class="shop-grid"></div>
                    </div>
                </div>
               
                <div class="url-row">
                    <label>🔗 Своя ссылка на плашку (200 галеонов):</label>
                    <div class="url-input-group">
                        <input type="text" id="customPlashkaUrl" placeholder="https://example.com/plashka.png">
                    </div>
                </div>
               
                <!-- ТЕКСТ НА ПЛАШКЕ -->
                <div class="text-controls">
                    <label>Текст на плашке (бесплатно!):</label>
                    <div class="text-input-group">
                        <input type="text" id="plashkaTextInput" placeholder="Введите текст для плашки" value="maleficas et earum haeresim">
                    </div>
                   
                    <details class="phrases-spoiler">
                        <summary>показать готовые фразы</summary>
                       
                        <div class="collection-title">Новые фразы</div>
                        <div id="phrases-new" class="phrases-grid"></div>
                       
                        <div class="collection-title">Старые фразы</div>
                        <div id="phrases-old" class="phrases-grid"></div>
                    </details>
                   
                    <div class="color-controls">
                        <label> Цвет текста:</label>
                        <input type="color" id="textColorPicker" class="color-picker" value="#FF818A">
                    </div>
                   
                    <div class="grayscale-controls">
                        <span>Ч/Б фильтр для плашки:</span>
                        <button id="grayscaleFullBtn" class="grayscale-btn">100% ч/б</button>
                        <button id="grayscaleHalfBtn" class="grayscale-btn">50% ч/б</button>
                        <button id="grayscaleOffBtn" class="grayscale-btn">Отменить</button>
                    </div>
                </div>
               
                <!-- ИКОНКИ -->
                <h3>Иконки
                    <div class="category-controls">
                        <label class="gift-checkbox"><input type="checkbox" id="giftEmoji">Подарок</label>
                        <button class="clear-category-btn" data-clear="emoji">Очистить</button>
                    </div>
                </h3>
               
                <div class="shop-container">
                    <div class="shop-content">
                        <div class="collection-title">летняя коллекция <span class="collection-badge">NEW</span></div>
                        <div id="shop-emoji-new" class="shop-grid"></div>
                       
                        <div class="collection-title">весенняя  коллекция</div>
                        <div id="shop-emoji-old" class="shop-grid"></div>
                    </div>
                </div>
               
                <div class="url-row">
                    <label>🔗 Своя ссылка на иконку (50 галеонов):</label>
                    <div class="url-input-group">
                        <input type="text" id="customEmojiUrl" placeholder="https://example.com/emoji.png">
                    </div>
                </div>
               
               
            </div>
        </div>
    </div>

    <script src="https://forumstatic.ru/files/001c/3b/dd/64804.js"></script>
    [/html]
    [hideprofile]

    0

    3

    [html]
    <style>
    body {
        background: none !important;
        position: relative !important;
        overflow: visible !important;
        width: 100%;
        padding-top: 35px !important;
    min-height: 520px;
    }

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

    .inner {background: var(--pun-bg);
    padding: 10px;
      border-radius: 20px;
    position: relative;
    z-index: 2;}

    .shit {
    position: absolute;
        top: -53px;
        left: 217px;
        z-index: -1;
    }

    .decor-left {position: absolute;
    top: -19px;
    left: -25px;}
    .decor-right {position: absolute;
    left: 98%;
    top: -19px}
    .decor-left img, .decor-right img {width: 40px;
    height: 139px;
    object-fit: contain}

    .shit img {
        display: block;
        object-fit: fill;
    width: 424px;
    height: 501px;
    }

    .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 {
    width: 211px;
        font-family: var(--extra-font);
        font-size: 23px;
        line-height: 19px;
        color: var(--textcolor);
        z-index: 2;
        text-align: center;
        text-transform: lowercase;
        position: relative;
        letter-spacing: 0.05em;
        margin: 0 auto;
    }

    .guest-about {
    position: relative;
        width: 100%;
        box-sizing: border-box;
        background: var(--dark-accent);
        color: var(--link-hover);
        border-radius: 10px;
        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: justify;
    }

    .guest-table {
      display: flex;
      flex-direction: row;
      gap: 20px;
    }

    .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: 24%;
    color: var(--link-hover);
    }

    .column1 span {
      display: block;
      font-style: normal;
      font-weight: 700;
      font-size: 11px;
      line-height: 11px;
      text-align: center;
      text-transform: lowercase;
      box-sizing: border-box;
      background: var(--dark-accent);
      border-radius: 8px;
      padding: 2px 4px;
      margin-bottom: 5px;
    color: var(--link-hover);
    }

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

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

    .column2 {
      width: 54%;
      box-sizing: border-box;
    display: flex;
    flex-direction: column;
    gap: 10px;
    margin-top: 25px;}

    .column3 {
      box-sizing: border-box;
      text-align: center;
      display: flex;
      flex-direction: column;
      width: 200px;   
      flex-shrink: 0; 
    padding-right: 5px;
    color: var(--link-hover);
    }

    .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%;
    border-bottom: 1px dashed var(--link);
    margin-bottom: 5px;
    padding-bottom: 5px;
    }

    .faces-body, .roles-body {
    border-radius: 20px;
        padding: 5px;
        background: var(--sec-bg);
        color: var(--textcolor);
        text-align: center;
        min-height: 300px;
    width: 175px;
        text-transform: lowercase;
    }

    .faces-body {margin-left: 11px}
    .roles-body {margin-right: 15px}

    .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: 80%;
        padding: 3px;
        font-size: 9px;
        line-height: 88%;
        text-align: center;
        text-transform: lowercase;
        color: var(--light-accent);
        background: var(--podforum);
        border-radius: 8px;
        box-sizing: border-box;
    margin-left: 42px;
    }

    .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(--light-accent);
      background: var(--podforum);
      padding: 2px 5px;
      border-radius: 8px;
    }

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

    .guest-ams {
        display: flex;
        flex-direction: row;
        justify-content: center;
        align-items: center;
        gap: 3px;
        width: 100%;
        margin: 0 auto;
    flex-wrap: nowrap;
    }

    .image-container {
      position: relative;
      width: 40px;
      height: 40px;
      overflow: hidden;
    background: var(--acts-fon-img) center / contain no-repeat;

    }

    .image-container img {
      width: 32px;
      height: 32px;
      object-fit: cover;
      object-position: top center;
      background: var(--light-accent);
      border-radius: 50%;
    margin-top: 5px;
    }

    .overlay {
      position: absolute;
      top: 5px;
      left: 4px;
      width: 32px;
      height: 32px;
      background: var(--light-accent);
      border-radius: 50%;
      pointer-events: none;
    opacity: .5;
    }

    </style>

    <div class="guestbook-main">
    <div class="inner">

      <div class="decor-left"><img src="https://forumstatic.ru/files/0014/d2/5e/82955.png"></div>
      <div class="decor-right"><img src="https://forumstatic.ru/files/0014/d2/5e/34834.png"></div>
      <div class="shit"><img src="https://upforme.ru/uploads/0014/d2/5e/2/413873.png"></div>
      <div class="hat"></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="guest-header">Malleus Maleficarum</div>
          <div class="guidelines">внешности и роли за гостями придерживаем на сутки; <br>для зарегистрированного профиля - на три дня с возможностью продления до трёх раз</div>
          <div class="faces-roles-container">
            <div class="faces">

              <div class="faces-body">
             <div class="faces-title">внешности</div>
    <b> 25.08 </b><br>
    Belmont Cameli — <a href="https://mmaleficarum.rusff.me/profile.php?id=351">ernie macmillan</a><br>
    Matt Smith — <a href="https://mmaleficarum.rusff.me/profile.php?id=161">cassius warrington</a><br>
    Kelly Reilly — <a href="https://mmaleficarum.rusff.me/profile.php?id=161">cassius warrington</a><br>
    Sarah Pidgeon — <a href="https://mmaleficarum.rusff.me/profile.php?id=351">ernie macmillan</a><br>
              </div>
            </div>
            <div class="roles">
              <div class="roles-body">          <div class="roles-title">роли</div>
    <b> 25.08 </b><br>
    <a href="">daphne greengrass</a> — <a href="https://mmaleficarum.rusff.me/profile.php?id=351">ernie macmillan</a><br>
    <a href="https://mmaleficarum.rusff.me/viewtopic.php?id=844">kyle macfusty — <a href="https://mmaleficarum.rusff.me/profile.php?id=161">cassius warrington</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/161/481676.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 class="tooltip">
              <a href="https://mmaleficarum.rusff.me/profile.php?id=351">
                <div class="image-container">
                  <img src="https://upforme.ru/uploads/001c/3b/dd/161/926744.gif">
                  <div class="overlay"></div>
                </div>
              </a>
              <span class="tooltiptext">следит чтобы в админке все не переругались</span>
            </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, mayveline warrington, blaise zabini, ceres lestrange, nymphadora tonks, tbc.</div>
        </div>
      </div>
    </div>
    </div>
    [/html]
    занять роль и/или внешность

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

    [hideprofile]

    0

    4

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

      <div class="news-podlozhka">
        <div class="news-date">15/08/2026</div>

          <div class="news-author-wrap"><div class="news-author-name">с вами эрни</div>
    <div class="news-author-inline">
            <img src="https://upforme.ru/uploads/001c/3b/dd/351/317774.gif">
          </div>  </div>
        <p>Внимание-внимание: до конца лета осталось две недели! А теперь к хорошим новостям...
        </p>
        <p>
    Во-первых, август пока еще не успел окончательно нас разочаровать! А значит еще можно успеть насладиться теплыми летними постами... ой, то есть я хотел сказать деньками! Теплыми летними деньками и всеми теми вещами, которые мы обычно откладываем на потом, потому что "впереди же еще целое лето".
        </p>
        <p>
    Так вот: "целого лета впереди" больше нет. И если среди отложенных на потом вещей у вас случайно затесался <a href="https://mmaleficarum.rusff.me/viewtopic.php?id=1183#p141959">наш ивент</a>, то самое время вспомнить и о нем. Особенно тем, кто уже успел забронировать себе игры и теперь, подобно людям зачем-то оформившим предзаказ за полгода до релиза, связан собственными необдуманными решениями. Напомню, что участвовать можно даже если вы ничего не бронировали - просто хватайте понравившееся задание и зарабатывайте баллы сопро... ой, я хотел сказать "баллы своей фракции". И галлеоны. И мое личное уважение, которое, как вы понимаете, особенно ценно, потому что обычно я выдаю его исключительно по большим праздникам.
        </p>
        <p>Во-вторых, пора раздать немного заслуженной славы тем, кто в последнее время особенно старательно доказывал, что лето и активная форумная жизнь все-таки совместимы!</p>
        <p>Так что начну с аплодисментов, цветов и благодарности администрации в адрес наших августовских активистов: <a href="https://mmaleficarum.rusff.me/profile.php?id=399">Луны</a>, <a href="https://mmaleficarum.rusff.me/profile.php?id=97">Джона</a> и <a href="https://mmaleficarum.rusff.me/profile.php?id=79">Сайласа</a>. Вы только видели триумфальное возвращение этой девчули? А горячий эпизодик этих парней? </p>
        <p>Кстати, о горячих эпизодиках: звание самой яркой игры за эти две недели достается эпизоду <a href="https://mmaleficarum.rusff.me/viewtopic.php?id=476#p60820">sweet revenge</a> за авторством этой хорошо вам известной парочки! И можете сколько угодно шутить, что все куплено, раз в двух номинациях победители совпадают - но сначала пойдите и почитайте. Нет, серьезно, добавьте этот пункт в список летних дел. Да-да, сейчас.</p>
        <p><div class="news-quote">«- Я не жду, что ты сразу скажешь "ничего страшного". Потому что это не "ничего страшного". Я просто хочу, чтобы ты знал правду целиком, а не только самую отвратительную ее часть» </div></p>
    <p>Узнали цитату? Если нет, то наливайте кружечку холодного лимонада, берите пачку бумажных платочков (сами решайте для какой цели) и идите читать как наша <a href="https://mmaleficarum.rusff.me/viewtopic.php?id=925#p142544">Тео Помфри</a> выясняет отношения с нашим любимым мальчишкой в кепке. Вся админка торжественно подписывается под сертификатом соответствия поста на звание "лучшего", и утирает скупые слезы умиления.  </p>

        <p>Вот, пожалуй, и все новости.  <br><br>
    Мы отправляемся ломать копья и мозг, продумывая сюжетные квесты, а вам советуем насладиться последними августовскими деньками и успеть сделать все запланированное. Я бы сказал, что времени еще полно, но мы с вами слишком давно знакомы, чтобы я настолько нагло врал.
        </p>
      </div>
    </div>
    [/html][hideprofile]

    0

    5

    [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]

    [hideprofile]

    0

    6

    [hideprofile][html]
      <style>
            .bank-container {
          max-width: 880px;
          width: 100%;
        }
        h1 {
          text-align: center;
          font-weight: 300;
          letter-spacing: 2px;
          color: var(--textcolor);
          margin-top: 0;
          font-size: 2rem;
          font-family: var(--extra-font);
        }
        .subhead {
          text-align: center;
          border-bottom: 1px solid var(--link-hover);
          padding-bottom: 8px;
          margin-bottom: 8px;
          font-size: 1rem;
          font-family: var(--main-font);
        }
        .columns-wrapper {
          display: flex;
          gap: 10px;
          flex-wrap: nowrap;
        }
        .col {
          background: var(--pun-bg);
          border-radius: 10px;
          padding: 0px 8px 10px;
          border: 1px solid var(--link-hover);
          width: 50%;
        }
        .col h2 {
          display: flex;
          align-items: center;
            color: var(--textcolor);
          font-weight: 400;
          border-bottom: 2px solid var(--link-hover)!important;
          margin-top: 0;
          margin-bottom: 10px;
          font-size: 1.7rem;
          font-family: var(--extra-font);
        }
        .col h2 span {
          background: var(--sec-bg);
          padding: 0 4px;
          border-radius: 10px;
          font-size: 1rem;
          color: var(--textcolor);
        }
        .income-col h2,   .expense-col h2 { border-bottom-color: var(--link-hover); }

        .item-group {
          display: flex;
          flex-direction: column;
          gap: 4px;
        }
        .item-group::-webkit-scrollbar {
          width: 6px;
        }
        .item-group::-webkit-scrollbar-track {
          background: var(--sec-bg);
          border-radius: 10px;
        }
        .item-group::-webkit-scrollbar-thumb {
          background: var(--link-hover);
          border-radius: 10px;
        }

        .item {
          background: var(--sec-bg);
          border-radius: 10px;
          border: 1px solid var(--pun-bg);
          transition: 0.15s;
          padding: 5px 5px;
        }
        .item:hover {
          background: var(--podforum);
          border-color: var(--pun-bg);
        }
        .item-header {
          display: flex;
          align-items: center;
        }
        .item-label {
          flex: 1;
          color: var(--textcolor);
          font-size: 1rem;
          padding: 4px 0;
          display: flex;
          flex-wrap: wrap;
          align-items: baseline;
          gap: 4px 6px;
          font-family: var(--main-font);
        }
        .item .price-badge {
          background: var(--podforum);
          border-radius: 10px;
          padding: 0 12px;
          font-size: 0.8rem;
          font-weight: 600;
          color: var(--textcolor);
          margin-left: auto;
          white-space: nowrap;
        }
        .income-col .price-badge, .expense-col .price-badge { color: var(--textcolor)!important; }

        .item-controls {
          display: flex;
          align-items: center;
          gap: 8px;
          margin-left: auto;
          flex-shrink: 0;
        }
        .btn-count {
          background: var(--podforum)!important;
          border: none;
          color: var(--textcolor);
          width: 28px;
          height: 28px;
          border-radius: 50%;
          cursor: pointer;
          font-size: 1.2rem;
          display: flex;
          align-items: center;
          justify-content: center;
          transition: 0.15s;
          border: 1px solid var(--link-hover)!important;
        }
        .btn-count:hover {
          background: var(--sec-bg);
          transform: scale(1.05);
          color: var(--textcolor);
        }
        .btn-count.income-btn {
          background: var(--pun-bg);
          border-color: var(--link-hover);
        }
        .btn-count.income-btn:hover {
          background: var(--podforum);
          color: var(--textcolor);
        }
        .btn-count.expense-btn {
          background: var(--pun-bg);
          border-color: var(--link-hover);
        }
        .btn-count.expense-btn:hover {
          background: var(--podforum);
          color: var(--textcolor);
        }
        .btn-count:active {
          transform: scale(0.9);
        }
        .btn-count.disabled {
          opacity: 0.3;
          cursor: not-allowed;
          pointer-events: none;
        }
        .item-count {
          min-width: 30px;
          text-align: center;
          color: var(--textcolor);
          font-weight: 600;
          font-size: 1rem;
        }

        .item-subtotal {
          min-width: 70px;
          text-align: right;
          color: var(--textcolor);
          font-size: 0.85rem;
        }

        .proof-section {
          margin-top: 8px;
          padding-left: 10px;
          display: flex;
          flex-direction: column;
          gap: 6px;
          border-left: 2px solid var(--link-hover);
          padding-left: 14px;
        }
        .proof-row {
          display: flex;
          gap: 8px;
          align-items: center;
        }
        .proof-row input {
          flex: 1;
          background: var(--sec-bg);
          border: 1px solid var(--link-hover);
          border-radius: 10px;
          padding: 6px 14px;
          color: var(--textcolor);
          font-size: 0.85rem;
          outline: none;
          min-width: 0;
          font-family: var(--main-font);
        }
        .proof-row input:focus {
          border-color: var(--link-hover);
          background: var(--sec-bg);
        }
        .proof-row .btn-add-proof {
          background: var(--podforum);
          border: none;
          color: var(--textcolor);
          padding: 4px 14px;
          border-radius: 30px;
          cursor: pointer;
          font-size: 0.8rem;
          transition: 0.15s;
          white-space: nowrap;
          border: 1px solid var(--link-hover);
        }
        .proof-row .btn-add-proof:hover {
          background: var(--sec-bg);
          color: var(--textcolor);
        }
        .proof-list {
          display: flex;
          flex-direction: column;
          gap: 4px;
          padding-left: 4px;
        }
        .proof-list .proof-item {
          display: flex;
          align-items: center;
          gap: 8px;
          font-size: 0.82rem;
          color: var(--textcolor);
          background: var(--sec-bg);
          padding: 3px 10px 3px 14px;
          border-radius: 10px;
          border-left: 2px solid var(--link-hover);
        }
        .proof-list .proof-item .proof-text {
          flex: 1;
          word-break: break-all;
          font-family: 'Consolas', monospace;
          font-size: 0.78rem;
          color: var(--textcolor);
        }
        .proof-list .proof-item .btn-del-proof {
          background: transparent;
          border: none;
          color: var(--textcolor);
          cursor: pointer;
          font-size: 1rem;
          padding: 0 4px;
        }
        .proof-list .proof-item .btn-del-proof:hover {
          color: var(--textcolor);
        }

        .divider {
          margin: 10px 0 8px;
          border-top: 1px dashed var(--link-hover);
          opacity: 0.5;
        }

        .custom-price-input {
          display: flex;
          align-items: center;
          gap: 8px;
          margin-top: 4px;
          padding-left: 10px;
        }
        .custom-price-input label {
          color: var(--textcolor);
          font-size: 0.8rem;
          font-family: var(--main-font);
        }
        .custom-price-input input {
          width: 100px;
          background: var(--sec-bg);
          border: 1px solid var(--link-hover);
          border-radius: 10px;
          padding: 4px 12px;
          color: var(--textcolor);
          font-size: 0.9rem;
          outline: none;
        }
        .custom-price-input input:focus {
          border-color: var(--link-hover);
          background: var(--sec-bg);
        }

        .preview {
          margin-top: 15px;
          padding: 12px 16px;
          background: var(--link-hover);
          border-radius: 12px;
          border: 1px solid var(--link-hover);
          display: flex;
          justify-content: space-between;
          align-items: center;
          flex-wrap: wrap;
          gap: 10px;
        }
        .preview .label {
          color: var(--textcolor);
          font-size: 0.9rem;
          font-family: var(--main-font);
        }
        .preview .value {
          color: var(--textcolor);
          font-size: 1.3rem;
          font-weight: 600;
        }

        .balance-row {
          margin-top: 10px;
          display: flex;
          flex-wrap: wrap;
          align-items: center;
          gap: 10px;
          background: var(--sec-bg);
          padding: 18px 22px;
          border-radius: 10px;
          border: 1px solid var(--link-hover);
        }
        .balance-row label {
          color: var(--textcolor);
          font-weight: 400;
          display: flex;
          align-items: center;
          gap: 8px;
          font-family: var(--main-font);
        }
        .balance-row input {
          background: var(--podforum);
          border: 1px solid var(--link-hover);
          border-radius: 10px;
          padding: 10px 20px;
          width: 160px;
          color: var(--textcolor);
          font-size: 1rem;
          text-align: center;
        }
        .balance-row input:focus {
          border-color: var(--link-hover);
          background: var(--sec-bg);
        }

        .final-preview {
          margin-top: 5px;
          padding: 10px 22px;
          background: var(--link-hover);
          border-radius: 10px;
          border: 2px solid var(--link-hover);
          display: flex;
          justify-content: space-between;
          align-items: center;
          flex-wrap: wrap;
          gap: 15px;
        }
        .final-preview .label {
          color: var(--textcolor);
          font-size: 1.1rem;
          font-weight: 400;
          font-family: var(--extra-font);
        }
        .final-preview .value {
          color: var(--textcolor);
          font-size: 1.8rem;
          font-weight: 700;
        }

        .actions {
          display: flex;
          flex-wrap: wrap;
          align-items: center;
          justify-content: center;
          gap: 20px;
          margin-top: 10px;
        }
        .btn {
          background: var(--dark-accent);
          border: none;
          padding: 14px 38px;
          border-radius: 10px;
          font-weight: 600;
          font-size: 1.2rem;
          color: var(--link-hover)!important;
          cursor: pointer;
          transition: 0.3s;
          box-shadow: 0 4px 0 var(--body-bg);
          border: 1px solid var(--link-hover)!important;
          letter-spacing: 0.8px;
          display: inline-flex;
          align-items: center;
          gap: 10px;
          font-family: var(--main-font);
        }
        .btn-primary {
          background: var(--pun-bg);
          border-color: var(--textcolor);
          color: var(--textcolor);
        }
        .btn-primary:hover {
          background: var(--podforum);
          transform: scale(1.02);
          color: var(--textcolor)!important;
        }
        .btn-success {
          background: var(--sec-bg);
          border-color: var(--link-hover);
          box-shadow: 0 4px 0 var(--link-hover);
          color: var(--textcolor);
        }
        .btn-success:hover {
          background: var(--sec-bg);
          transform: scale(1.02);
        }
        .btn-secondary {
          background: var(--link-hover);
          border-color: var(--textcolor);
          box-shadow: 0 4px 0 var(--body-bg);
          color: var(--body-bg)!important;
        }
        .btn-secondary:hover {
          background: var(--podforum);
          color: var(--textcolor)!important;
        }
        .btn:active {
          transform: translateY(3px);
          box-shadow: 0 1px 0 var(--link-hover);
        }
        .output-area {
          margin-top: 10px;
          background: var(--pun-bg);
          border-radius: 10px;
          padding: 18px 22px;
          border: 1px solid var(--link-hover);
        }
        .output-area textarea {
          width: 97%;
          background: var(--sec-bg);
          border: 1px solid var(--link-hover);
          border-radius: 10px;
          padding: 16px;
          color: var(--textcolor)!important;
          font-size: 0.95rem;
          min-height: 150px;
          resize: vertical;
        }
        .copy-hint {
          color: var(--textcolor);
          font-size: 0.85rem;
          margin-top: 8px;
          text-align: right;
          font-family: var(--main-font);
        }
    </style>
    <div class="bank-container">
      <h1>Добро пожаловать в "Гринготтс"!</h1>
      <div class="subhead">ʛ В этой теме вы можете забрать старательно заработанные галлеоны или потратить их на какие-нибудь приятные плюшки.<br>
    ʛ Выберите нужную категорию и нажмите +, чтобы добавить нужное количество позиций. Для получения монет добавьте также ссылку на подтверждение заработка - ссылку на сообщение или на скриншот, например, вашего профиля<br>
    ʛ Обратите внимание, некоторые позиции в "потратить" выдаются по одной штуке, приходите за ними снова, когда понадобятся.<br>
    ʛ Не забудьте написать, сколько монет в профиле сейчас, чтобы гоблины начислили вам правильную сумму в профиль.<br>
    ʛ Когда нажмёте кнопку "подсчитать всё", детализация счёта скопируется в буфер обмена, вам останется только вставить её в форму ответа, чтобы работники банка смогли провести транзакцию.</div>

      <div class="columns-wrapper">
        <!-- КОЛОНКА "ПОЛУЧИТЬ" -->
        <div class="col income-col">
          <h2>ПОЛУЧИТЬ <span></span></h2>
          <div id="incomeItems" class="item-group"></div>
          <div class="preview">
            <span class="label">сумма:</span>
            <span class="value income-total" id="incomePreview">0 монет</span>
          </div>
        </div>

        <!-- КОЛОНКА "ПОТРАТИТЬ" -->
        <div class="col expense-col">
          <h2>ПОТРАТИТЬ <span></span></h2>
          <div id="expenseItems" class="item-group"></div>
          <div class="preview">
            <span class="label">сумма:</span>
            <span class="value expense-total" id="expensePreview">0 монет</span>
          </div>
        </div>
      </div>

      <!-- РУЧНОЙ ВВОД ТЕКУЩЕГО БАЛАНСА -->
      <div class="balance-row">
        <label for="currentBalance">Сколько сейчас на счету:</label>
        <input type="number" id="currentBalance" value="0" step="1" min="0">
        <span style="color:var(--textcolor); font-size:0.9rem;">(прибавится к итогу)</span>
      </div>

      <!-- ПРЕДПРОСМОТР ИТОГА -->
      <div class="final-preview">
        <span class="label">ИТОГОВЫЙ БАЛАНС:</span>
        <span class="value" id="finalPreview">0 монет</span>
      </div>

      <!-- КНОПКИ -->
      <div class="actions">
        <button class="btn btn-primary" id="calcBtn">Подсчитать всё</button>
        <button class="btn btn-secondary" id="clearBtn">Сбросить всё</button>
      </div>

      <!-- ВЫВОД РЕЗУЛЬТАТА -->
      <div class="output-area">
        <textarea id="resultOutput" readonly placeholder="Здесь появится итоговый отчёт для вставки на форум..."></textarea>
        <div class="copy-hint">После подсчёта результат автоматически копируется в буфер обмена</div>
      </div>
    </div>

    <script>
      (function() {
        // ПРАЙС
        const incomeData = [
          { label: 'Регистрация персонажа', price: 200 },
          { label: 'Регистрация персонажа по акции', price: 400 },
          { label: 'Заявка в "нужные"', price: 50 },
          { label: 'Заявка в "хочу видеть"', price: 20 },
          { label: 'Привёл(а) друга на форум', price: 500 },
          { divider: true },
          { label: 'Пост в квесте', price: 100 },
          { label: 'Пост в личной игре', price: 50 },
          { label: 'Ответил(а) на пост в течение суток', price: 200 },
          { label: 'Написал(а) 2 поста за день', price: 200 },
          { label: 'Написал(а) >3 постов за день', price: 300 },
          { label: 'Завершённый квест (начисляется каждому участнику)', price: 300 },
          { label: 'Завершённый эпизод', price: 100 },
          { label: 'Упоминание сюжетных событий в посте', price: 50 },
          { label: 'Помощь амс в в написании/генерирование идеи для сюжетного квеста', price: 300 },
          { divider: true },
          { label: 'Оставил(а) 5 рекламных листовок', price: 20 },
          { label: 'Оставил(а) 20 рекламных листовок', price: 300 },
          { label: 'Оставил(а) 50 рекламных листовок', price: 1500 },
          { label: 'Поставил(а) баннер форума в подпись на каталоге', price: 300 },
          { divider: true },
          { label: 'Попал(а) в таблицу активистов', price: 100 },
          { label: 'Набрал(а) первые 100 сообщений', price: 30 },
          { label: 'Набрал(а) очередные 500 сообщений', price: 100 },
          { label: 'Каждый месяц на форуме', price: 100 },
          { label: 'Фото своего животного в теме «животные», с передачей привета любому игроку', price: 25 },
          { divider: true },
          { label: 'Другое (помощь амс/победа в конкурсах и т.п.)', price: 'custom' }
        ];

        const expenseData = [
             { label: 'Отсрочка по посту в квесте (3 дня, нельзя воспользоваться 2 раза подряд)', price: 500, maxCount: 1 },
          { label: 'Перебросить кубик в квесте (нельзя воспользоваться 2 раза подряд, при любом результате учитывается второй бросок)', price: 300, maxCount: 1 },
          { label: 'Мини-квест с мастером', price: 15000 },   
          { divider: true },
               { label: 'Поменять картинку/факты на личной странице (твинки добавляются бесплатно по запросу)', price: 200 },
    { label: 'Вытащить из чистки (нельзя воспользоваться 2 чистки подряд)', price: 1000, maxCount: 1 },
    { label: 'Смена внешности (второй раз после начала игры)', price: 1000 },     
    { label: 'Регистрация твинка (третий и все последующие персонажи; монеты можно заменить на 1 пост за прошедший месяц от каждого предыдущего персонажа, поправьте вручную)', price: 3000 },
          { divider: true },
          { label: 'Графика в профиль (аватар)', price: 300 },
                { label: 'Реклама нужного с оформлением на месяц', price: 1000 },
    { label: 'Оформление личного эпизода', price: 1000 },
          { divider: true },
          { label: 'Выкуп роли/внешности на неделю', price: 500 },
          { label: 'Выкуп роли/внешности на месяц', price: 1000 },
          { label: 'Картинка нужного в шапке (неделя)', price: 300 },
          { label: 'Картинка нужного в шапке (месяц)', price: 700 },
    { label: 'Выбрать лучших недели (одна покупка - одно место в таблице)', price: 500 },
          { label: 'Фото питомца вместо лучшего', price: 1000 },
                { divider: true },
          { label: 'Выбрать, кого поставить в шапку нового флуда', price: 500 },
          { label: 'Запрет ставить себя в шапку флуда', price: 800 },
          { label: 'Видео-привет от администраторов', price: 5000 },
          { label: 'Почтовая открытка от АМС', price: 10000 }
        ];

        // Хранилище количества для всех позиций
        const countStore = new Map();
        // Хранилище ссылок для доходов
        const proofsStore = new Map();
        // Хранилище кастомных цен
        const customPriceStore = new Map();

        const incomeContainer = document.getElementById('incomeItems');
        const expenseContainer = document.getElementById('expenseItems');
        const incomePreview = document.getElementById('incomePreview');
        const expensePreview = document.getElementById('expensePreview');
        const finalPreview = document.getElementById('finalPreview');
        const currentBalanceInput = document.getElementById('currentBalance');

        function generateItemId(type, index) {
          return type + '-' + index;
        }

        function getCount(itemId) {
          return countStore.get(itemId) || 0;
        }

        function getMaxCount(itemId) {
          const container = document.querySelector('[data-itemid="' + itemId + '"]');
          if (container) {
            const maxAttr = container.dataset.maxcount;
            if (maxAttr) {
              return parseInt(maxAttr);
            }
          }
          return null;
        }

        function setCount(itemId, value) {
          const maxCount = getMaxCount(itemId);
          let num = parseInt(value) || 0;
          if (maxCount !== null && num > maxCount) {
            num = maxCount;
          }
          if (num < 0) {
            num = 0;
          }
          countStore.set(itemId, num);
          updateCountUI(itemId);
          updatePreviews();
        }

        function incrementCount(itemId) {
          const current = getCount(itemId);
          const maxCount = getMaxCount(itemId);
          if (maxCount !== null && current >= maxCount) {
            return;
          }
          setCount(itemId, current + 1);
        }

        function decrementCount(itemId) {
          const current = getCount(itemId);
          if (current > 0) {
            setCount(itemId, current - 1);
          }
        }

        function updateCountUI(itemId) {
          const container = document.querySelector('[data-itemid="' + itemId + '"]');
          if (container) {
            const countSpan = container.querySelector('.item-count');
            const subtotalSpan = container.querySelector('.item-subtotal');
            const btnPlus = container.querySelector('.btn-plus');
            const count = getCount(itemId);
            const maxCount = getMaxCount(itemId);
           
            if (countSpan) countSpan.textContent = count;
           
            if (btnPlus && maxCount !== null) {
              if (count >= maxCount) {
                btnPlus.classList.add('disabled');
              } else {
                btnPlus.classList.remove('disabled');
              }
            }
           
            if (subtotalSpan) {
              const price = getItemPrice(itemId);
              if (price !== null) {
                subtotalSpan.textContent = (count * price) + ' монет';
              }
            }
          }
        }

        function getItemPrice(itemId) {
          const container = document.querySelector('[data-itemid="' + itemId + '"]');
          if (!container) return null;
         
          if (customPriceStore.has(itemId)) {
            return customPriceStore.get(itemId);
          }
         
          const priceAttr = container.dataset.price;
          if (priceAttr && priceAttr !== 'custom') {
            return parseFloat(priceAttr);
          }
          return null;
        }

        // ---------- РАБОТА СО ССЫЛКАМИ (только для доходов) ----------
        function renderProofs(container, itemId) {
          const proofs = proofsStore.get(itemId) || [];
          const proofContainer = container.querySelector('.proof-list');
          if (!proofContainer) return;

          proofContainer.innerHTML = '';
          proofs.forEach((proof, idx) => {
            const div = document.createElement('div');
            div.className = 'proof-item';
            div.innerHTML = `
              <span class="proof-text">${escapeHtml(proof)}</span>
              <button class="btn-del-proof" data-itemid="${itemId}" data-idx="${idx}" title="Удалить ссылку">x</button>
            `;
            proofContainer.appendChild(div);
          });

          proofContainer.querySelectorAll('.btn-del-proof').forEach(btn => {
            btn.addEventListener('click', function(e) {
              e.stopPropagation();
              const id = this.dataset.itemid;
              const idx = parseInt(this.dataset.idx);
              removeProof(id, idx);
            });
          });
        }

        function escapeHtml(text) {
          const div = document.createElement('div');
          div.textContent = text;
          return div.innerHTML;
        }

        function addProof(itemId, proofText) {
          if (!proofText.trim()) return;
          if (!proofsStore.has(itemId)) {
            proofsStore.set(itemId, []);
          }
          proofsStore.get(itemId).push(proofText.trim());
          updateProofUI(itemId);
        }

        function removeProof(itemId, idx) {
          if (!proofsStore.has(itemId)) return;
          const proofs = proofsStore.get(itemId);
          if (idx >= 0 && idx < proofs.length) {
            proofs.splice(idx, 1);
            if (proofs.length === 0) {
              proofsStore.delete(itemId);
            }
            updateProofUI(itemId);
          }
        }

        function updateProofUI(itemId) {
          const container = document.querySelector('[data-itemid="' + itemId + '"]');
          if (container) {
            renderProofs(container, itemId);
          }
        }

        // ---------- ОБЩИЕ ФУНКЦИИ ----------
        function getIncomeTotal() {
          let total = 0;
          incomeContainer.querySelectorAll('.item').forEach(item => {
            const itemId = item.dataset.itemid;
            const count = getCount(itemId);
            if (count > 0) {
              const price = getItemPrice(itemId);
              if (price !== null) {
                total += price * count;
              }
            }
          });
          return total;
        }

        function getExpenseTotal() {
          let total = 0;
          expenseContainer.querySelectorAll('.item').forEach(item => {
            const itemId = item.dataset.itemid;
            const count = getCount(itemId);
            if (count > 0) {
              const price = getItemPrice(itemId);
              if (price !== null) {
                total += price * count;
              }
            }
          });
          return total;
        }

        function updatePreviews() {
          const incomeTotal = getIncomeTotal();
          const expenseTotal = getExpenseTotal();
          const currentBal = parseFloat(currentBalanceInput.value) || 0;
          const finalTotal = currentBal + incomeTotal - expenseTotal;

          incomePreview.textContent = incomeTotal + ' монет';
          expensePreview.textContent = expenseTotal + ' монет';
          finalPreview.textContent = finalTotal + ' монет';
        }

        // ---------- РЕНДЕР СПИСКОВ ----------
        function renderItems(container, items, type) {
          container.innerHTML = '';
          items.forEach((item, index) => {
            if (item.divider) {
              const div = document.createElement('div');
              div.className = 'divider';
              container.appendChild(div);
              return;
            }

            const itemId = generateItemId(type, index);
            const wrapper = document.createElement('div');
            wrapper.className = 'item';
            wrapper.dataset.itemid = itemId;
            wrapper.dataset.price = item.price;
            if (item.maxCount) {
              wrapper.dataset.maxcount = item.maxCount;
            }

            const header = document.createElement('div');
            header.className = 'item-header';

            const label = document.createElement('span');
            label.className = 'item-label';
            const priceStr = item.price === 'custom' ? ' (на усмотрение амс)' : item.price + ' монет';
            const priceColor = type === 'income' ? '#9bcfb0' : '#e6a0a0';
            let maxLabel = '';
            if (item.maxCount) {
              maxLabel = ' <span style="color:var(-textcolor);font-size:0.7rem;">(макс. ' + item.maxCount + ')</span>';
            }
            label.innerHTML = item.label + ' <span class="price-badge" style="color:' + priceColor + '">' + priceStr + '</span>' + maxLabel;

            const controls = document.createElement('div');
            controls.className = 'item-controls';

            const btnMinus = document.createElement('button');
            btnMinus.className = 'btn-count ' + (type === 'income' ? 'income-btn' : 'expense-btn');
            btnMinus.textContent = '-';
            btnMinus.type = 'button';

            const countSpan = document.createElement('span');
            countSpan.className = 'item-count ' + (type === 'income' ? 'income-count' : 'expense-count');
            countSpan.textContent = '0';

            const btnPlus = document.createElement('button');
            btnPlus.className = 'btn-count ' + (type === 'income' ? 'income-btn' : 'expense-btn') + ' btn-plus';
            btnPlus.textContent = '+';
            btnPlus.type = 'button';

            const subtotalSpan = document.createElement('span');
            subtotalSpan.className = 'item-subtotal ' + (type === 'income' ? 'income-subtotal' : 'expense-subtotal');
            subtotalSpan.textContent = '0 монет';

            controls.appendChild(btnMinus);
            controls.appendChild(countSpan);
            controls.appendChild(btnPlus);
            controls.appendChild(subtotalSpan);

            header.appendChild(label);
            header.appendChild(controls);
            wrapper.appendChild(header);

            // Кастомная цена для "помощь в отладке"
            if (item.price === 'custom') {
              const customDiv = document.createElement('div');
              customDiv.className = 'custom-price-input';
              customDiv.innerHTML = `
                <label>Цена за 1:</label>
                <input type="number" class="custom-price" value="100" min="1" step="1">
              `;
              wrapper.appendChild(customDiv);
             
              const customInput = customDiv.querySelector('.custom-price');
              customInput.addEventListener('input', function() {
                const val = parseFloat(this.value) || 0;
                if (val > 0) {
                  customPriceStore.set(itemId, val);
                } else {
                  customPriceStore.delete(itemId);
                }
                updateCountUI(itemId);
                updatePreviews();
              });
              customPriceStore.set(itemId, 100);
            }

            // Секция для ссылок (только для доходов)
            if (type === 'income') {
              const proofSection = document.createElement('div');
              proofSection.className = 'proof-section';

              const proofList = document.createElement('div');
              proofList.className = 'proof-list';
              proofSection.appendChild(proofList);

              const row = document.createElement('div');
              row.className = 'proof-row';
              const input = document.createElement('input');
              input.type = 'text';
              input.placeholder = 'Вставьте ссылку на пост или скриншот...';
              input.className = 'proof-input';
              const addBtn = document.createElement('button');
              addBtn.className = 'btn-add-proof';
              addBtn.textContent = 'Добавить ссылку';
              addBtn.type = 'button';

              row.appendChild(input);
              row.appendChild(addBtn);
              proofSection.appendChild(row);

              wrapper.appendChild(proofSection);

              addBtn.addEventListener('click', function(e) {
                e.stopPropagation();
                const inp = this.parentElement.querySelector('.proof-input');
                if (inp && inp.value.trim()) {
                  addProof(itemId, inp.value.trim());
                  inp.value = '';
                  inp.focus();
                }
              });

              input.addEventListener('keypress', function(e) {
                if (e.key === 'Enter') {
                  e.preventDefault();
                  const addBtn = this.parentElement.querySelector('.btn-add-proof');
                  if (addBtn) addBtn.click();
                }
              });

              if (!proofsStore.has(itemId)) {
                proofsStore.set(itemId, []);
              }
              renderProofs(wrapper, itemId);
             
              proofSection.style.display = 'none';
             
              const updateProofVisibility = function() {
                const count = getCount(itemId);
                proofSection.style.display = count > 0 ? 'block' : 'none';
              };
             
              const originalSetCount = setCount;
              setCount = function(id, value) {
                originalSetCount(id, value);
                if (id === itemId) {
                  updateProofVisibility();
                }
              };
            }

            // Обработчики кнопок
            btnPlus.addEventListener('click', function(e) {
              e.stopPropagation();
              incrementCount(itemId);
            });

            btnMinus.addEventListener('click', function(e) {
              e.stopPropagation();
              decrementCount(itemId);
            });

            container.appendChild(wrapper);
           
            countStore.set(itemId, 0);
            updateCountUI(itemId);
          });
        }

        renderItems(incomeContainer, incomeData, 'income');
        renderItems(expenseContainer, expenseData, 'expense');

        // ---------- ЛОГИКА ПОДСЧЁТА ----------
        const calcBtn = document.getElementById('calcBtn');
        const clearBtn = document.getElementById('clearBtn');
        const resultOutput = document.getElementById('resultOutput');

        function getSelectedIncome() {
          let total = 0;
          let items = [];
          incomeContainer.querySelectorAll('.item').forEach(item => {
            const itemId = item.dataset.itemid;
            const count = getCount(itemId);
            if (count > 0) {
              const price = getItemPrice(itemId);
              if (price !== null) {
                const subtotal = price * count;
                total += subtotal;
                const label = item.querySelector('.item-label').textContent.trim();
                const proofs = proofsStore.get(itemId) || [];
                items.push({
                  label: label,
                  price: price,
                  count: count,
                  subtotal: subtotal,
                  proofs: proofs.slice()
                });
              }
            }
          });
          return { total, items };
        }

        function getSelectedExpense() {
          let total = 0;
          let items = [];
          expenseContainer.querySelectorAll('.item').forEach(item => {
            const itemId = item.dataset.itemid;
            const count = getCount(itemId);
            if (count > 0) {
              const price = getItemPrice(itemId);
              if (price !== null) {
                const subtotal = price * count;
                total += subtotal;
                const label = item.querySelector('.item-label').textContent.trim();
                items.push({
                  label: label,
                  price: price,
                  count: count,
                  subtotal: subtotal
                });
              }
            }
          });
          return { total, items };
        }

        function generateReport() {
          const income = getSelectedIncome();
          const expense = getSelectedExpense();
          const currentBal = parseFloat(currentBalanceInput.value) || 0;
          const finalBalance = currentBal + income.total - expense.total;

          let report = '========================================\n';
          report += '       ДЕТАЛИЗАЦИЯ СЧЁТА\n';
          report += '========================================\n\n';

          if (income.items.length > 0) {
            report += 'Получить:\n';
            income.items.forEach(item => {
              const countStr = item.count > 1 ? ' (x' + item.count + ')' : '';
              report += '  - ' + item.label + countStr + ' — ' + item.subtotal + ' монет\n';
              if (item.proofs.length) {
                item.proofs.forEach(p => {
                  report += '      Ссылка: ' + p + '\n';
                });
              }
            });
            report += '  СУММА: ' + income.total + ' монет\n\n';
          }

          if (expense.items.length > 0) {
            report += 'Потратить:\n';
            expense.items.forEach(item => {
              const countStr = item.count > 1 ? ' (x' + item.count + ')' : '';
              report += '  - ' + item.label + countStr + ' — ' + item.subtotal + ' монет\n';
            });
            report += '  СУММА: ' + expense.total + ' монет\n\n';
          }

          report += 'Текущий баланс: ' + currentBal + ' монет\n';
          report += 'ИТОГОВЫЙ БАЛАНС: ' + finalBalance + ' монет\n';
         
          return report;
        }

        function copyToClipboard(text) {
          if (navigator.clipboard && navigator.clipboard.writeText) {
            navigator.clipboard.writeText(text).catch(() => fallbackCopy(text));
          } else {
            fallbackCopy(text);
          }
        }

        function fallbackCopy(text) {
          const textarea = document.createElement('textarea');
          textarea.value = text;
          document.body.appendChild(textarea);
          textarea.select();
          try {
            document.execCommand('copy');
          } catch (e) {
            alert('Не удалось скопировать, скопируйте вручную.');
          }
          document.body.removeChild(textarea);
        }

        let timeoutId = null;

        function handleCalculate() {
          const report = generateReport();
          resultOutput.value = report;
          copyToClipboard(report);
         
          calcBtn.textContent = 'Подсчитано и скопировано!';
          calcBtn.className = 'btn btn-success';
         
          if (timeoutId) clearTimeout(timeoutId);
          timeoutId = setTimeout(() => {
            calcBtn.textContent = 'Подсчитать всё';
            calcBtn.className = 'btn btn-primary';
            timeoutId = null;
          }, 3000);
        }

        function handleClear() {
          countStore.clear();
          document.querySelectorAll('.item').forEach(item => {
            const id = item.dataset.itemid;
            if (id) {
              countStore.set(id, 0);
              updateCountUI(id);
              const proofSection = item.querySelector('.proof-section');
              if (proofSection) proofSection.style.display = 'none';
            }
          });
         
          proofsStore.clear();
          document.querySelectorAll('.proof-list').forEach(list => {
            list.innerHTML = '';
          });
         
          customPriceStore.clear();
          document.querySelectorAll('.custom-price').forEach(input => {
            input.value = 100;
            const item = input.closest('.item');
            if (item) {
              const id = item.dataset.itemid;
              if (id) {
                customPriceStore.set(id, 100);
                updateCountUI(id);
              }
            }
          });
         
          currentBalanceInput.value = '0000';
          resultOutput.value = '';
          updatePreviews();
         
          if (timeoutId) clearTimeout(timeoutId);
          calcBtn.textContent = 'Подсчитать всё';
          calcBtn.className = 'btn btn-primary';
        }

        currentBalanceInput.addEventListener('input', updatePreviews);

        calcBtn.addEventListener('click', handleCalculate);
        clearBtn.addEventListener('click', handleClear);

        document.addEventListener('keydown', (e) => {
          if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') {
            e.preventDefault();
            handleCalculate();
          }
        });

        window.addEventListener('load', function() {
          updatePreviews();
        });

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

    0

    7

    https://forumstatic.ru/files/0014/d2/5e/80468.png
    https://forumstatic.ru/files/0014/d2/5e/60730.png
    https://forumstatic.ru/files/0014/d2/5e/42769.png  https://forumstatic.ru/files/0014/d2/5e/94266.png  https://forumstatic.ru/files/0014/d2/5e/39546.png

    0

    8

    Happy QUIZday!

    Представляете, нам целых два годика, офигеть как круто, правда ведь? За это время мы успели сыграть огромное количество восхитительных, весёлых, трогательных, драматичных, экшеновых и каких только не постов, нафлудить тонну локальных мемов и почти подраться из-за шапки, поучаствовать в миньёне разных конкурсов... И к слову о последних. Кажется, давно я не заставлял вас страдать так, чтобы вам понравилось, да? Поэтому в честь праздника я решил вспомнить молодость и провести викторину в формате, с которым впервые залетел в число малефикарских затейников.

    Что происходит?
    Как вы, наверное, уже догадались, мы играем в квиз. На этот раз задания задания разных форматов и сложности будут выходить каждый день в течение недели, все необходимые объяснения и подсказки я буду выдавать тогда же. Это могут быть картинки, аудио, загадки, задачки на логику и что угодно ещё, что придёт в голову автору вопросов, то есть мне. За каждый правильный ответ игрок получает определённое количество очков, в конце игры мы их подсчитываем и раздаём всяческие плюшки.

    Что делать-то надо?
    Итак, вас ждёт пять раундов по шесть вопросов в каждом. Все ответы так или иначе связаны с форумом, участниками (как нынешними, так и, возможно, уже покинувшими малефику) и эпизодами. На выполнение заданий у вас будут сутки (отсчёт начинается с момента публикации заданий). Чтобы в игре могли поучаствовать все, в том числе амс, свои ответы присылайте мне в лс, один раунд - одно сообщение. Если возникают какие-то вопросы - шлите сов туда же.

    А что мне за это будет?
    ♦ Все участники получат 10 баллов противостояния за каждый раунд (либо 20 галлеонов на счёт, если вы не участвуете в гонке).
    ♦ Если не успеваете выполнять задания каждый день, вы всё равно можете поучаствовать! После того, как будут опубликованы все раунды, у вас будет ещё два дня на то, чтобы докинуть свои ответы, но за награду в полцены, т.е. 5 баллов или 10 галлеонов за раунд.
    ♦ Ну а три игрока, набравшие больше всех очков, получат ещё и отдельные плюшки:
    1 место: 100 баллов, памятная плашка, бесплатное оформление профиля в лавке и купон на любую позицию до 1000 галлеонов в банке бесплатно.
    2 место: 50 баллов, памятная плашка и бесплатное оформление профиля в лавке.
    3 место: 50 баллов, памятная плашка.

    Удачи, надеюсь на вашу азартность, и помните, никакого Феликс Фелициса!

    0

    9

    принятие в игру
    https://forumstatic.ru/files/0014/d2/5e/67679.png
    первый пост: https://forumstatic.ru/files/0014/d2/5e/62725.png 5 постов:https://forumstatic.ru/files/0014/d2/5e/28087.png 20 постов: https://forumstatic.ru/files/0014/d2/5e/61439.png50 постов:https://forumstatic.ru/files/0014/d2/5e/35206.png 100 постов: https://forumstatic.ru/files/0014/d2/5e/50296.png
    не попасть в чистку пять раз подряд 
    https://forumstatic.ru/files/0014/d2/5e/44842.png
    завершить личный эпизод на четырёх игроков и более:
    https://forumstatic.ru/files/0014/d2/5e/19736.png
    сыграть квест, ни разу не воспользовавшись продлением очереди:
    https://forumstatic.ru/files/0014/d2/5e/55343.png
    провести форумную активность:
    https://forumstatic.ru/files/0014/d2/5e/55658.png
    завершить квест/три/пять/10/квестовый гигант:
    https://forumstatic.ru/files/0014/d2/5e/68272.png https://forumstatic.ru/files/0014/d2/5e/72508.png https://forumstatic.ru/files/0014/d2/5e/77881.png https://forumstatic.ru/files/0014/d2/5e/33239.png https://forumstatic.ru/files/0014/d2/5e/23572.png
    победить в мафии/бункере
    https://forumstatic.ru/files/0014/d2/5e/70509.png
    форумный стаж
    https://forumstatic.ru/files/0014/d2/5e/48988.png  https://forumstatic.ru/files/0014/d2/5e/81732.png https://forumstatic.ru/files/0014/d2/5e/13815.png https://forumstatic.ru/files/0014/d2/5e/59284.png https://forumstatic.ru/files/0014/d2/5e/73428.png
    использовать непростительное заклинание
    https://forumstatic.ru/files/0014/d2/5e/13375.png  https://forumstatic.ru/files/0014/d2/5e/33572.png https://forumstatic.ru/files/0014/d2/5e/80933.png  https://forumstatic.ru/files/0014/d2/5e/42530.png
    использовать лечебную магию (заклинание или лекарственное зелье)
    https://forumstatic.ru/files/0014/d2/5e/51599.png https://forumstatic.ru/files/0014/d2/5e/75178.png https://forumstatic.ru/files/0014/d2/5e/21435.png https://forumstatic.ru/files/0014/d2/5e/65765.png
    сыграть в питейном заведении
    https://forumstatic.ru/files/0014/d2/5e/93628.png https://forumstatic.ru/files/0014/d2/5e/51770.png https://forumstatic.ru/files/0014/d2/5e/19225.png https://forumstatic.ru/files/0014/d2/5e/26595.png https://forumstatic.ru/files/0014/d2/5e/29533.png https://forumstatic.ru/files/0014/d2/5e/53031.png
    фанат квиддича
    https://forumstatic.ru/files/0014/d2/5e/75236.png https://forumstatic.ru/files/0014/d2/5e/38744.png https://forumstatic.ru/files/0014/d2/5e/18895.pnghttps://forumstatic.ru/files/0014/d2/5e/63766.png
    сыграть школьный флэшбэк
    https://forumstatic.ru/files/0014/d2/5e/42899.png
    умереть
    https://forumstatic.ru/files/0014/d2/5e/79049.png
    убить персонажа другого игрока
    https://forumstatic.ru/files/0014/d2/5e/33966.png
    использовать легилименцию/сыворотку правды
    https://forumstatic.ru/files/0014/d2/5e/96714.png
    использовать окклюменцию
    https://forumstatic.ru/files/0014/d2/5e/67925.png
    подраться в личном эпизоде
    https://forumstatic.ru/files/0014/d2/5e/17478.png
    описать в посте свой секс
    https://forumstatic.ru/files/0014/d2/5e/47475.png
    описать в посте чужой секс
    https://forumstatic.ru/files/0014/d2/5e/37142.png
    описать в посте пьянку
    https://forumstatic.ru/files/0014/d2/5e/18585.png
    оказать услугу представителю фракции-соперника
    https://forumstatic.ru/files/0014/d2/5e/35490.png
    воспользоваться маггловским оружием
    https://forumstatic.ru/files/0014/d2/5e/23860.png

    0

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

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



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


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