11

MortisMorsMors

Объявление

лучший пост от лорда

Уж к чему, а к беснующимся рядом со Стоунхенджем магглам Лорд относился весьма спокойно, хотя едва ли стал бы транслировать это свое отношение в окружающую действительность, особенно здесь и сейчас. Его отношения с древней магией были сложными, в каких-то моментах даже напряженными, но малопонятными даже ему самому. То, что чистокровному волшебнику полагалось впитывать с молоком матери для Лорда была зоной, плотно укрытой туманом войны, который трудно было рассеять. И все же, он прекрасно в этом тумане ориентировался.

новости #185 от профессионального умирателя ЗАПИСЬ В СЮЖЕТпоиск желающих в 6.2 ПАЗЛЫс куличамиМЕМОнайди пару

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

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


Вы здесь » MortisMorsMors » админка » Селин


Селин

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

Перевести1

https://i.ibb.co/0tScjW8/25.webp

0

2

<!----------------- хтмл в постах с допуском по группам  --------------->

<!-- HTML в постах -->
<script type="text/javascript" src="http://forumstatic.ru/files/0018/25/96/94151.js"></script>
<script type="text/javascript">
HTMLinPost.groups = [1,2,3,4,5,6,7,8]; // Группы, допущенные к вставке HTML в посты
HTMLinPost.noAccess = []; // Пользователи с запретом вставки HTML в посты
HTMLinPost.parseHTMLinPosts()
</script>

0

3

[html]<div style="max-width:700px; margin:30px auto; border:2px solid #555; border-radius:12px; padding:24px; background:#6f3531; color:#fff; box-shadow:0 8px 25px rgba(0,0,0,0.6);">

    <div style="font-size:24px; text-align:center; margin-bottom:22px; font-weight:bold; color:#ffd700;">
        Калькулятор постов
    </div>

    <!-— Монеты на профиле -->
    <div style="margin-bottom:20px; max-width:260px;">
        <input type="number" id="start" placeholder="Монеты на профиле" style="width:100%; padding:11px; background:#3f1f1d; color:#fff; border:1px solid #777; border-radius:8px;">
    </div>

    <!-— Бонусы -->
    <div style="margin-bottom:20px; background:#3f1f1d; padding:14px; border-radius:8px;">
        <label style="display:block; margin-bottom:6px;"><input type="checkbox" id="epComplete"> Завершённый эпизод (+300)</label>
        <label style="display:block; margin-bottom:6px;"><input type="checkbox" id="epigraph"> Эпиграф (+15)</label>
        <label style="display:block;"><input type="checkbox" id="openEp"> Открытие эпизода (+15)</label>
    </div>

    <!-— Посты -->
    <div style="margin-bottom:20px;">
        <div style="background:#3f1f1d; padding:14px; border-radius:8px; margin-bottom:12px;">
            <b>Пост 1</b><br>
            <textarea id="p1" rows="3" style="width:100%; margin:8px 0; background:#2c1614; color:white; border:1px solid #666; border-radius:6px; resize:vertical;"></textarea>
            <input type="text" id="l1" placeholder="Ссылка на пост" style="width:100%; padding:8px; background:#2c1614; color:#fff; border:1px solid #666; border-radius:6px;">
            <div style="margin-top:8px; font-size:14px;">
                <label><input type="checkbox" id="d1"> x2 (в сутки)</label>
                <label style="margin-left:15px;"><input type="checkbox" id="t1"> x2 (10-й пост)</label>
            </div>
        </div>

        <div style="background:#3f1f1d; padding:14px; border-radius:8px; margin-bottom:12px;">
            <b>Пост 2</b><br>
            <textarea id="p2" rows="3" style="width:100%; margin:8px 0; background:#2c1614; color:white; border:1px solid #666; border-radius:6px; resize:vertical;"></textarea>
            <input type="text" id="l2" placeholder="Ссылка на пост" style="width:100%; padding:8px; background:#2c1614; color:#fff; border:1px solid #666; border-radius:6px;">
            <div style="margin-top:8px; font-size:14px;">
                <label><input type="checkbox" id="d2"> x2 (в сутки)</label>
                <label style="margin-left:15px;"><input type="checkbox" id="t2"> x2 (10-й пост)</label>
            </div>
        </div>

        <div style="background:#3f1f1d; padding:14px; border-radius:8px; margin-bottom:12px;">
            <b>Пост 3</b><br>
            <textarea id="p3" rows="3" style="width:100%; margin:8px 0; background:#2c1614; color:white; border:1px solid #666; border-radius:6px; resize:vertical;"></textarea>
            <input type="text" id="l3" placeholder="Ссылка на пост" style="width:100%; padding:8px; background:#2c1614; color:#fff; border:1px solid #666; border-radius:6px;">
            <div style="margin-top:8px; font-size:14px;">
                <label><input type="checkbox" id="d3"> x2 (в сутки)</label>
                <label style="margin-left:15px;"><input type="checkbox" id="t3"> x2 (10-й пост)</label>
            </div>
        </div>

        <div style="background:#3f1f1d; padding:14px; border-radius:8px;">
            <b>Пост 4</b><br>
            <textarea id="p4" rows="3" style="width:100%; margin:8px 0; background:#2c1614; color:white; border:1px solid #666; border-radius:6px; resize:vertical;"></textarea>
            <input type="text" id="l4" placeholder="Ссылка на пост" style="width:100%; padding:8px; background:#2c1614; color:#fff; border:1px solid #666; border-radius:6px;">
            <div style="margin-top:8px; font-size:14px;">
                <label><input type="checkbox" id="d4"> x2 (в сутки)</label>
                <label style="margin-left:15px;"><input type="checkbox" id="t4"> x2 (10-й пост)</label>
            </div>
        </div>
    </div>

    <button onclick="let s=parseInt(document.getElementById('start').value)||0; let epC=document.getElementById('epComplete').checked?300:0; let epG=document.getElementById('epigraph').checked?15:0; let openE=document.getElementById('openEp').checked?15:0; let t=0; let o=`Монет в профиле: ${s}\nЭпиграф: ${epG?'+15':'нет'}\nОткрытие эпизода: ${openE?'+15':'нет'}\nЗавершённый эпизод: ${epC?'+300':'нет'}\n\nПОСТЫ:\n`; for(let i=1;i<=4;i++){ let len=document.getElementById('p'+i).value.trim().length; let pl=document.getElementById('l'+i).value.trim(); let day=document.getElementById('d'+i).checked; let ten=document.getElementById('t'+i).checked; let c=0; if(len>0){ c=50; if(len>4000)c+=Math.floor((len-4000)/1000)*15; if(day)c*=2; if(ten)c*=2; } t+=c; o+=`Пост ${i} (${len} симв.)`; if(pl)o+=' — '+pl; if(day)o+=' • x2 сутки'; if(ten)o+=' • x2 10-й'; o+=` → ${c}\n`; } o+=`\n━━━━━━━━ ИТОГО ━━━━━━━━\nС постов: ${t}\nБонусы: +${epC+epG+openE}\nВсего: ${s+t+epC+epG+openE} монет`; document.getElementById('result').innerText=o; document.getElementById('result').style.display='block';"
        style="width:100%; padding:16px; background:#8b4a46; color:white; font-weight:bold; border:none; border-radius:8px; font-size:17px; cursor:pointer;">
        Посчитать всё
    </button>

    <div id="result" style="display:none; margin-top:24px; padding:20px; background:#3f1f1d; border-radius:8px; white-space:pre-wrap; line-height:1.6; font-size:15.2px; border:1px solid #664444;"></div>
</div>[/html]

0

4

[html]<!-- === MEMO 8×6 (48 карточек), серый, American Typewriter, хороший рандом === -->
<style>
.memo{
  --tile:96px; --gap:12px; --radius:14px; --cols:8;      /* кол-во колонок и размер ячейки */
  --front:#1d1d1f; --back:#2a2a2c; --accent:#9aa0a6;
  --ok:#9b9b9b; --text:#e6e6e6; --muted:#b5b5b5; --blank:#242426;
  font-family:"American Typewriter","Georgia","Times New Roman",serif;
  max-width:950px; margin:16px auto; padding:14px;
  background:linear-gradient(180deg,#151516,#1c1c1e);
  border-radius:20px; box-shadow:10 10px 28px rgba(0,0,0,.45); color:var(--text)
}
.memo h3{margin:0 0 .5rem;font-size:20px}
.memo .memo__controls{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:10px}
.memo .memo__btn{appearance:none;border:1px solid #3a3a3c;background:#171718;color:var(--text);padding:6px 10px;border-radius:10px;cursor:pointer;font-size:13px}
.memo .memo__btn:hover{border-color:var(--accent);box-shadow:0 0 0 2px rgba(154,160,166,.15) inset}
.memo .memo__status{font-size:13px;color:var(--muted)}
.memo .grid{display:grid;grid-template-columns:repeat(var(--cols),var(--tile));gap:var(--gap);justify-content:center}

@media (max-width:880px){.memo{--tile:86px}}
@media (max-width:760px){.memo{--cols:7;--tile:78px}}
@media (max-width:620px){.memo{--cols:6;--tile:70px}}
@media (max-width:520px){.memo{--cols:5;--tile:64px}}

.memo input[type=checkbox]{position:absolute;opacity:0;pointer-events:none}
.memo .memo-card{width:var(--tile);height:var(--tile);border-radius:var(--radius);position:relative;perspective:900px}
.memo .memo-face{position:absolute;inset:0;display:grid;place-items:center;border-radius:var(--radius);
  transition:transform .5s,box-shadow .2s;backface-visibility:hidden;user-select:none}
.memo .memo-front{background:var(--front);border:1px solid #2c2c2e;box-shadow:inset 0 0 0 1px rgba(255,255,255,.03)}
.memo .memo-back{background:var(--back);border:1px dashed rgba(255,255,255,.12);transform:rotateY(180deg);
  font-size:28px; letter-spacing:.6px}
.memo input:checked + label .memo-front{transform:rotateY(180deg)}
.memo input:checked + label .memo-back{transform:rotateY(360deg)}
.memo label{display:block;width:100%;height:100%;cursor:pointer;outline:none}
.memo label:focus-visible .memo-front{box-shadow:0 0 0 3px rgba(154,160,166,.35)}
.memo label:hover .memo-front{box-shadow:0 0 0 2px rgba(154,160,166,.18) inset}

/* Цифры/иконки на обороте из data-symbol */
.memo label .memo-back::before{content:attr(data-symbol); transform:translateY(-1px)}

/* Зафиксированная пара */
.memo label[data-locked]{pointer-events:none}
.memo label[data-locked] .memo-back{
  box-shadow:0 0 0 2px rgba(155,155,155,.35) inset, 0 6px 14px rgba(0,0,0,.25);
  border-color:rgba(200,200,200,.4)
}
</style>

<div class="memo" id="memo48">
  <form>
    <h3>MEMO — найди пары</h3>
    <div class="memo__controls">
      <small>Открывай по две карточки</small>
      <div class="memo__status">Найдено: <b class="memo__found">0</b> / 24</div>
      <button class="memo__btn" type="reset">СБРОС</button>
    </div>

    <div class="grid" id="memo-grid"></div>
  </form>
</div>

<script>
(() => {
  const root = document.getElementById('memo48');
  if (!root) return;

  const grid = root.querySelector('#memo-grid');
  const form = root.querySelector('form');
  const foundEl = root.querySelector('.memo__found');
  const TOTAL = 24;                       // число пар
  const symbols = Array.from({length: TOTAL}, (_,i) => String(i+1).padStart(2,'0'));

  let opened = [];
  let lock = false;
  let found = 0;

  // криптографически стойкий (при наличии) Фишер–Йетс
  function rndInt(max){
    if (window.crypto && crypto.getRandomValues){
      const buf = new Uint32Array(1);
      crypto.getRandomValues(buf);
      return buf[0] % max;
    }
    return Math.floor(Math.random() * max);
  }
  function shuffle(arr){
    for (let m = arr.length; m; ){
      const i = rndInt(m--);
      [arr[m], arr[i]] = [arr[i], arr[m]];
    }
    return arr;
  }

  function buildDeck(){
    grid.innerHTML = '';
    const deck = shuffle(symbols.concat(symbols)); // дублируем и мешаем

    deck.forEach((sym, idx) => {
      const card  = document.createElement('div');  card.className = 'memo-card';
      const input = document.createElement('input'); input.type='checkbox'; input.id = `mc${idx}`;
      const label = document.createElement('label'); label.setAttribute('for', input.id);
      const front = document.createElement('span');  front.className = 'memo-face memo-front';
      const back  = document.createElement('span');  back.className  = 'memo-face memo-back'; back.dataset.symbol = sym;
      label.append(front, back); card.append(input, label); grid.append(card);
    });

    // сброс внутренних состояний
    opened = [];
    lock = false;
    found = 0;
    foundEl.textContent = '0';
  }

  function getSymbol(input){
    return input.nextElementSibling.querySelector('.memo-back').dataset.symbol;
  }
  function lockPair(a,b){
    a.nextElementSibling.dataset.locked = '1';
    b.nextElementSibling.dataset.locked = '1';
  }

  root.addEventListener('change', (e) => {
    const input = e.target;
    if (input.tagName !== 'INPUT') return;

    if (input.nextElementSibling.dataset.locked){ input.checked = true; return; }
    if (lock && input.checked){ input.checked = false; return; }

    if (input.checked){
      opened.push(input);
      if (opened.length === 2){
        lock = true;
        const [a,b] = opened;
        const sa = getSymbol(a), sb = getSymbol(b);
        if (sa === sb){
          lockPair(a,b);
          found++;
          foundEl.textContent = String(found);
          opened = [];
          lock = false;
        } else {
          const toClose = opened.slice();
          opened = [];
          setTimeout(() => {
            toClose.forEach(inp => inp.checked = false);
            lock = false;
          }, 700);
        }
      }
    } else {
      opened = opened.filter(x => x !== input);
    }
  });

  form.addEventListener('reset', () => {
    setTimeout(buildDeck, 0); // при сбросе — новая случайная раскладка
  });

  buildDeck(); // старт
})();
</script>[/html]

[hideprofile]

0

5

— СТО ВОСЕМЬДЕСЯТ ШЕСТАЯ НЕДЕЛЯ —
❛❛ 

Сто восемьдесят шестая неделя нашей телестройки, друзья, мы еще живы, веселы и готовы к новому!

Начать хочу с восхищения @Atticus Goyle, @Abraxas Malfoy и @Thomas Miller: свидетели Мерлина дописаны и выложены для глаз публики! Они (свидетели) ждут, когда их будут активно играть, вообще-то! Матчасть получилась подробной, интересной и заслуживающей внимания. В самом деле, сколько ее ждали!

На проекте ряд новшеств, которые никто не просил, но получите: облегчили поход в банк, теперь у нас есть свой калькулятор, который сам считает ваши символы и конвертирует их в монеты, более того, подтягивает ссылки, вам остается только скопировать bb-код нажав на кнопку revelio. Важное замечание: система не считает х2 за отпись поста в течении суток, каждый 10й пост, открытие/закрытие эпизода, эпиграф, это вы можете посчитать в ручную, но так как я об этом пишу, значит вопрос уже взят в работу)

Так же на главной странице появилась легкая мини-игра с письмами! Нажимайте на конвертик в правом нижнем углу экрана, ловите письма и на каждом 20 письме получайте предсказание, а так же устанавливайте рекорд по форуму, пока рекорд принадлежит @ Charlotte Bott! Она собрала больше ЧЕТЫРЕХ ТЫСЯЧ писем, с ума сойти. Остановить игру можно просто обновив страницу) Продолжаем собирать пазлы и получать монеты. Так же готовится ивент для постописцев, разминаем пальцы и готовимся писать!

В последнее время на форуме упало количество пользователей в сутки, мы видим это, стараемся делать всем составом амс все, что от нас зависит, поэтому надеемся, что вы тоже отнесетесь лояльно: будете писать во флуд, посты, а так же не будете забывать выгуливать своих твинков. Было бы еще чудеснее, если бы вы приглашали своих игроков к нам, мы всем рады) Особенно прошу зайти в "омут памяти" и посмотреть свои эпизоды, которые больше играться не будут. Можете написать мне в лс о переносе, можете в вопросы и предложения, как пожелаете) Если у вас есть идеи, чтобы вы хотели видеть на форуме, на что стоит обратить внимание, вы можете так же прийти в лс ко мне, к @Atticus Goyle или написать в тему

Что у нас в квестах?

Родные, я сидела в кустах двое суток, чтобы собрать комментарии наших волшебников и колдунов о событиях в Малфой-Мэноре

Первый мне попался молодой аврор по имени Джеймс Поттер. Нашу программу интересовало нравится ли молодому поколению работать в Аврорате? Конечно, мы не пальцем деланы, друзья, и спросили о событиях в меноре. Вот что говорит @James Potter  :

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

Что имел ввиду Джеймс говоря о своей жене, мы не знаем, но похоже ему не поможет даже самая скоростная метла, чтобы уклониться от этих вопросов!

Так же под внимание моего взгляда и моего микрофона попал несравненный красавчик (Он буквально Ален Делон, ок?) консультант-судмедэксперт Герхард Тодд. И несмотря на то как он уклонялся от тысячи вопросов, ускорял шаг, я все равно добилась от него ответа, жалко, что не адреса для совы. Так вот @Gerhard Todd сообщает про обыск:

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

Глава департамента обеспечения магической безопасности - @Renard R. Rosier, наследник богатейшего рода @Lucius Malfoy и юный стажер @Sirius Black отказались давать комментарии.

И последний, но не по значимости, Абраксас Малфой! Выловить такую крупную рыбу, знаете непросто, но у меня свои наживки, иногда родство помогает, так вот, его мнение по теме:

@Abraxas Malfoy

В бытии собой нет ничего сложного, благодарю вас за заботу! Того же я бы порекомендовал и всем юным сотрудникам и сотрудницам всех ведомств: быть на своём месте и не надевать то, что не можете снять. Я имею ввиду - стресс. Знаете, я и моя семья находимся в интересном положении,  но я уверен, что компетентные органы разберутся в ситуации: не зря же обучение на аврора длится целых 3 года!

https://i.ibb.co/5k25j3D/48.webp[html]<audio controls src="https://videotourl.com/audio/1778759825174-453b8e9a-ea04-4186-9163-df77790254c5.ogg" preload="none">Загруженное mp3</audio>[/html]

[indent]   
❜❜

— АКТИВИСТЫ —
https://upforme.ru/uploads/001b/b9/c5/603/476273.png https://upforme.ru/uploads/001b/b9/c5/603/515635.png https://upforme.ru/uploads/001b/b9/c5/603/728787.png  https://upforme.ru/uploads/001b/b9/c5/603/278585.png
@Abraxas Malfoy  & @Adelaide Yaxley  & @Walburga Black   & @Sirius Black 

— ПОСТОПИСЦЫ —
https://upforme.ru/uploads/001b/b9/c5/603/333033.png https://upforme.ru/uploads/001b/b9/c5/603/332159.png https://upforme.ru/uploads/001b/b9/c5/99/403150.png https://upforme.ru/uploads/001b/b9/c5/603/617622.png
@Celine Rowley & @Tybalt Yaxley & @Sandrine Yaxley & @Fabian Prewett

— П О С Т   Н Е Д Е Л И —
@Abraxas Malfoy :Перестав пачкать всё кровавыми чернилами, Дневник заговорил почерком Лорда, но каким-то более круглым и аккуратным. Лорд писал ровно и легко, быстрыми, почти прямыми буквами, эти же были, как по школьной норме, чуть наклонены вправо. Абраксасу стало вдвойне неприятно от прошедшего сна — мало того, что от него несло черномагической тухлятиной, так и его артефактный собеседник и на лицо, которое он смутно помнил, и на манеру письма был подростком, считай ребёнком. С другой стороны, применима ли человеческая возрастная градация к искусственно созданной сущности, и каким уровнем любви к себе нужно обладать, чтобы дать ей своё детское лицо? Абраксас решил не думать в этом направлении, потому что Лорд, на протяжении всего их знакомства, порождал у Малфоя многие вопросы, на часть из которых он получал ответы, которые, на деле, знать не хотел. Абраксас всю жизнь совершал одну и ту же ошибку — недооценивал то, насколько ему нужно что-то знать, и хочет ли он этого на самом деле.
...

— Э П И З О Д   Н Е Д Е Л И —
@Tybalt Yaxley & @Sandrine Yaxley
https://upforme.ru/uploads/001b/b9/c5/603/11197.jpg
THE WARMEST WELCOME

[sign] [/sign]

0

6

[html]<style>
/* Красивый фон для всех аудиоплееров */
audio {
    background: #dcdcd2 !important;
    border: 2px solid #b8b8b0 !important;
    border-radius: 10px !important;
    width: 100% !important;
    max-width: 520px !important;
    margin: 8px 0 !important;
    padding: 2px !important;
}

audio::-webkit-media-controls-panel,
.mejs-container .mejs-controls {
    background: #dcdcd2 !important;
}

audio::-webkit-media-controls-timeline {
    background: #c4c4bc !important;
}
</style>[/html]

0

7

https://i.ibb.co/5k25j3D/48.webp

<div style="background:#dcdcd2; padding:12px; border-radius:12px; display:inline-block; max-width:520px; border:2px solid #b8b8b0;">
    <audio controls src="https://videotourl.com/audio/1778759825174-453b8e9a-ea04-4186-9163-df77790254c5.ogg" preload="none" style="width:100%; min-width:380px;">
        Загруженное mp3
    </audio>
</div>

0

8

[html]https://i.ibb.co/5k25j3D/48.webp

<div style="background:#dcdcd2; padding:12px; border-radius:12px; display:inline-block; max-width:520px; border:2px solid #b8b8b0;">
    <audio controls src="https://videotourl.com/audio/1778759825174-453b8e9a-ea04-4186-9163-df77790254c5.ogg" preload="none" style="width:100%; min-width:380px;">
        Загруженное mp3
    </audio>
</div>

[/html]

0

9

[removeprofile]
[html]
<style>
.memo{
  --tile:98px;
  --gap:14px;
  --radius:16px;
  --cols:8;
 

  --main: #763c38;
  --secondary: #918f82;
  --front: #5c2f2a;     
  --back: #918f82;
  --accent: #763c38;
  --ok: #c4a38a;
  --text: #f5e9d8;
  --muted: #d4c4b0;

  font-family: "American Typewriter", "Georgia", "Times New Roman", serif;
  max-width: 1000px;
  margin: 20px auto;
  padding: 18px;
  background: linear-gradient(180deg, #3f2a26, #52423d);
  border-radius: 24px;
  box-shadow: 0 12px 32px rgba(0,0,0,.55);
  color: var(--text);
}

.memo h3{margin:0 0 .6rem; font-size:22px; color:var(--text)}
.memo .memo__controls{display:flex;justify-content:space-between;align-items:center;gap:10px;margin-bottom:12px;flex-wrap:wrap}
.memo .memo__btn{
  appearance:none;
  border:1px solid #a16e64;
  background:#3f2a26;
  color:var(--text);
  padding:7px 12px;
  border-radius:12px;
  cursor:pointer;
  font-size:13.5px;
}
.memo .memo__btn:hover{
  border-color:var(--accent);
  box-shadow:0 0 0 3px rgba(118,60,56,.3) inset;
}
.memo .memo__status{font-size:14px;color:var(--muted)}

.memo .grid{
  display:grid;
  grid-template-columns:repeat(var(--cols),var(--tile));
  gap:var(--gap);
  justify-content:center;
}

/* Адаптив */
@media (max-width:920px){.memo{--tile:88px}}
@media (max-width:780px){.memo{--cols:7;--tile:82px}}
@media (max-width:680px){.memo{--cols:6;--tile:76px}}
@media (max-width:560px){.memo{--cols:5;--tile:68px}}

.memo input[type=checkbox]{position:absolute;opacity:0;pointer-events:none}
.memo .memo-card{width:var(--tile);height:var(--tile);border-radius:var(--radius);position:relative;perspective:1000px}

.memo .memo-face{
  position:absolute; inset:0; border-radius:var(--radius);
  transition:transform .55s cubic-bezier(0.23,1,0.32,1);
  backface-visibility:hidden;
  display:grid; place-items:center;
  user-select:none;
  box-shadow: inset 0 0 0 1px rgba(0,0,0,.4);
}
.memo .memo-front{
  background:var(--front);
  border:2px solid #8a5a52;
}
.memo .memo-back{
  background:var(--back);
  border:2px solid var(--main);
  transform:rotateY(180deg);
  overflow:hidden;
}
.memo .memo-back img{
  width:100%; height:100%; object-fit:cover;
}

.memo input:checked + label .memo-front{transform:rotateY(180deg)}
.memo input:checked + label .memo-back{transform:rotateY(360deg)}

.memo label{display:block;width:100%;height:100%;cursor:pointer}
.memo label:focus-visible .memo-front{box-shadow:0 0 0 4px rgba(118,60,56,.6)}
.memo label:hover .memo-front{box-shadow:0 0 0 3px rgba(118,60,56,.35) inset}

.memo label[data-locked]{pointer-events:none}
.memo label[data-locked] .memo-back{
  box-shadow:0 0 0 3px rgba(196,163,138,.7) inset;
  filter: brightness(1.1);
}
</style>

<div class="memo" id="memo40">
  <form>
    <h3>MEMO — найди пары</h3>
    <div class="memo__controls">
      <small>Открывай по две карточки</small>
      <div class="memo__status">Найдено: <b class="memo__found">0</b> / 20</div>
      <button class="memo__btn" type="reset">НОВАЯ ИГРА</button>
    </div>
    <div class="grid" id="memo-grid"></div>
  </form>
</div>

<script>
(() => {
  const root = document.getElementById('memo40');
  if (!root) return;

  const grid = root.querySelector('#memo-grid');
  const foundEl = root.querySelector('.memo__found');

 
  const imageUrls = [
    "https://upforme.ru/uploads/001c/a5/42/2/928103.jpg",
    "https://upforme.ru/uploads/001c/a5/42/2/796942.jpg",
    "https://upforme.ru/uploads/001c/a5/42/2/920791.jpg",
    "https://upforme.ru/uploads/001c/a5/42/2/210253.jpg",
    "https://upforme.ru/uploads/001c/a5/42/2/539522.jpg",
    "https://upforme.ru/uploads/001c/a5/42/2/570476.jpg",
    "https://upforme.ru/uploads/001c/a5/42/2/142848.jpg",
    "https://upforme.ru/uploads/001c/a5/42/2/792870.jpg",
    "https://upforme.ru/uploads/001c/a5/42/2/364056.jpg",
    "https://upforme.ru/uploads/001c/a5/42/2/940122.jpg",
    "https://upforme.ru/uploads/001c/a5/42/2/216561.jpg",
    "https://upforme.ru/uploads/001c/a5/42/2/193804.jpg",
    "https://upforme.ru/uploads/001c/a5/42/2/313646.jpg",
    "https://upforme.ru/uploads/001c/a5/42/2/539420.jpg",
    "https://upforme.ru/uploads/001c/a5/42/2/498050.jpg",
    "https://upforme.ru/uploads/001c/a5/42/2/805098.jpg",
    "https://upforme.ru/uploads/001c/a5/42/2/84622.jpg",
    "https://upforme.ru/uploads/001c/a5/42/2/958212.jpg",
    "https://upforme.ru/uploads/001c/a5/42/2/592960.jpg",
    "https://upforme.ru/uploads/001c/a5/42/2/387049.jpg"
  ];
 
  let opened = [];
  let lock = false;
  let found = 0;

  function rndInt(max) {
    if (window.crypto?.getRandomValues) {
      const buf = new Uint32Array(1);
      crypto.getRandomValues(buf);
      return buf[0] % max;
    }
    return Math.floor(Math.random() * max);
  }

  function shuffle(arr) {
    for (let m = arr.length; m; ) {
      const i = rndInt(m--);
      [arr[m], arr[i]] = [arr[i], arr[m]];
    }
    return arr;
  }

  function buildDeck() {
    grid.innerHTML = '';
    const deck = shuffle([...imageUrls, ...imageUrls]);

    deck.forEach((imgUrl, idx) => {
      const card = document.createElement('div'); card.className = 'memo-card';
      const input = document.createElement('input'); input.type='checkbox'; input.id = `mc${idx}`;
      const label = document.createElement('label'); label.setAttribute('for', input.id);

      const front = document.createElement('span'); front.className = 'memo-face memo-front';
      const back = document.createElement('span'); back.className = 'memo-face memo-back';
     
      const img = document.createElement('img');
      img.src = imgUrl;
      img.alt = '';
      back.appendChild(img);

      label.append(front, back);
      card.append(input, label);
      grid.appendChild(card);
    });

    opened = []; lock = false; found = 0;
    foundEl.textContent = '0';
  }

  root.addEventListener('change', (e) => {
    const input = e.target;
    if (input.tagName !== 'INPUT') return;
    if (input.nextElementSibling.dataset.locked) { input.checked = true; return; }
    if (lock && input.checked) { input.checked = false; return; }

    if (input.checked) {
      opened.push(input);
      if (opened.length === 2) {
        lock = true;
        const [a, b] = opened;
        const imgA = a.nextElementSibling.querySelector('img').src;
        const imgB = b.nextElementSibling.querySelector('img').src;

        if (imgA === imgB) {
          a.nextElementSibling.dataset.locked = '1';
          b.nextElementSibling.dataset.locked = '1';
          found++;
          foundEl.textContent = found;
          opened = [];
          lock = false;
        } else {
          const toClose = opened.slice();
          opened = [];
          setTimeout(() => {
            toClose.forEach(inp => inp.checked = false);
            lock = false;
          }, 800);
        }
      }
    } else {
      opened = opened.filter(x => x !== input);
    }
  });

  root.querySelector('form').addEventListener('reset', () => setTimeout(buildDeck, 10));

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

0


Вы здесь » MortisMorsMors » админка » Селин


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