<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
    <channel>
        <title>Маргарита - Блог 4</title>
        <link>http://margo.mozello.shop/blog-4-1/</link>
        <description>Маргарита - Блог 4</description>
                    <item>
                <title>Вітання</title>
                <link>http://margo.mozello.shop/blog-4-1/params/post/5237596/vtannja</link>
                <pubDate>Sun, 12 Apr 2026 08:40:00 +0000</pubDate>
                <description>ооооооооооооооооооо&lt;hr class=&quot;moze-more-divider&quot;&gt;&lt;p&gt;1&lt;/p&gt;


&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
&lt;title&gt;З Днем Народження!&lt;/title&gt;

&lt;script src=&quot;https://cdn.jsdelivr.net/npm/canvas-confetti@1.6.0/dist/confetti.browser.min.js&quot;&gt;&lt;/script&gt;

&lt;style&gt;
:root {
    --primary: #ff6fa5;
    --accent: #ffd166;
    --bg: #fff5f8;
}

body {
    font-family: &#039;Segoe UI&#039;, sans-serif;
    background-color: var(--bg);
    margin: 0;
    padding: 40px 20px;
    display: flex;
    flex-direction: column;
    align-items: center;
}

.container {
    max-width: 1200px;
    width: 100%;
}

header {
    text-align: center;
    margin-bottom: 50px;
}

header h1 {
    font-size: 2.2rem;
    color: var(--primary);
    border-bottom: 5px solid var(--accent);
    display: inline-block;
    padding-bottom: 10px;
}

.news-grid {
    display: flex;
    flex-wrap: wrap;
    gap: 30px;
    justify-content: center;
}

.card {
    background: #fff;
    flex: 1 1 320px;
    max-width: 380px;
    border-radius: 15px;
    overflow: hidden;
    box-shadow: 0 10px 25px rgba(0,0,0,0.1);
    transition: transform 0.3s;
}

.card:hover {
    transform: translateY(-8px);
}

.card-image {
    width: 100%;
    height: 210px;
    object-fit: cover;
    border-bottom: 4px solid var(--accent);
}

.card-content {
    padding: 20px;
}

.card-content h2 {
    color: var(--primary);
}

.card-content p {
    color: #555;
}

summary {
    background: var(--primary);
    color: white;
    padding: 14px;
    text-align: center;
    font-weight: bold;
    cursor: pointer;
}

.expanded-content {
    padding: 15px;
    background: #fff;
}

.user-comment {
    background: #fff3c4;
    padding: 10px;
    border-left: 5px solid var(--accent);
    margin-top: 10px;
    font-weight: bold;
}

.btn-container {
    text-align: center;
    margin-top: 50px;
}

.surprise-btn {
    background-color: var(--primary);
    color: white;
    border: none;
    padding: 15px 30px;
    font-size: 1.2rem;
    border-radius: 50px;
    cursor: pointer;
}

.surprise-btn:hover {
    background-color: var(--accent);
    color: var(--primary);
}
&lt;/style&gt;




&lt;div class=&quot;container&quot;&gt;

&lt;header&gt;
    &lt;h1&gt;🎀 З Днем Народження, Маргарита! 🎉&lt;/h1&gt;
    &lt;p&gt;Нашій принцесі вже 4 роки 👑&lt;/p&gt;
&lt;/header&gt;

&lt;main class=&quot;news-grid&quot;&gt;

&lt;!-- Карточка 1 --&gt;
&lt;div class=&quot;card&quot;&gt;
    &lt;img src=&quot;https://images.unsplash.com/photo-1519681393784-d120267933ba?q=80&amp;amp;w=600&quot; class=&quot;card-image&quot;&gt;
    &lt;div class=&quot;card-content&quot;&gt;
        &lt;h2&gt;Ачівка: Маленька принцеса 👑&lt;/h2&gt;
        &lt;p&gt;Відкрито новий рівень — 4 роки веселощів 🎉&lt;/p&gt;
    &lt;/div&gt;
    &lt;details&gt;
        &lt;summary&gt;▶ ЧАРІВНІ ВМІННЯ&lt;/summary&gt;
        &lt;div class=&quot;expanded-content&quot;&gt;
            Обіймашки 🤗&lt;br&gt;
            Сміх 😊&lt;br&gt;
            Любов до казок ✨
            &lt;div class=&quot;user-comment&quot;&gt;СТАТУС: СУПЕРЗІРОЧКА 🌟&lt;/div&gt;
        &lt;/div&gt;
    &lt;/details&gt;
&lt;/div&gt;

&lt;!-- Карточка 2 --&gt;
&lt;div class=&quot;card&quot;&gt;
    &lt;img src=&quot;https://images.unsplash.com/photo-1503454537195-1dcabb73ffb9?q=80&amp;amp;w=600&quot; class=&quot;card-image&quot;&gt;
    &lt;div class=&quot;card-content&quot;&gt;
        &lt;h2&gt;Суперсила: Гарний настрій 😊&lt;/h2&gt;
        &lt;p&gt;Робить щасливими всіх навколо&lt;/p&gt;
    &lt;/div&gt;
    &lt;details&gt;
        &lt;summary&gt;▶ СЕКРЕТ&lt;/summary&gt;
        &lt;div class=&quot;expanded-content&quot;&gt;
            Твоя усмішка робить світ яскравішим 💖
            &lt;div class=&quot;user-comment&quot;&gt;СТАТУС: ГЕНЕРАТОР РАДОСТІ 🎈&lt;/div&gt;
        &lt;/div&gt;
    &lt;/details&gt;
&lt;/div&gt;

&lt;!-- Карточка 3 --&gt;
&lt;div class=&quot;card&quot;&gt;
    &lt;img src=&quot;https://images.unsplash.com/photo-1517849845537-4d257902454a?q=80&amp;amp;w=600&quot; class=&quot;card-image&quot;&gt;
    &lt;div class=&quot;card-content&quot;&gt;
        &lt;h2&gt;Талант: Маленька чарівниця 🎨&lt;/h2&gt;
        &lt;p&gt;Створює власні казки&lt;/p&gt;
    &lt;/div&gt;
    &lt;details&gt;
        &lt;summary&gt;▶ МАГІЯ&lt;/summary&gt;
        &lt;div class=&quot;expanded-content&quot;&gt;
            Твоя уява — справжнє диво ✨
            &lt;div class=&quot;user-comment&quot;&gt;СТАТУС: ФЕЯ ФАНТАЗІЇ 🧚‍♀️&lt;/div&gt;
        &lt;/div&gt;
    &lt;/details&gt;
&lt;/div&gt;

&lt;!-- Карточка 4 --&gt;
&lt;div class=&quot;card&quot;&gt;
    &lt;img src=&quot;https://images.unsplash.com/photo-1464349153735-7db50ed83c84?q=80&amp;amp;w=600&quot; class=&quot;card-image&quot;&gt;
    &lt;div class=&quot;card-content&quot;&gt;
        &lt;h2&gt;Новий рівень: 4 роки 🎂&lt;/h2&gt;
        &lt;p&gt;Особливе привітання 💕&lt;/p&gt;
    &lt;/div&gt;
    &lt;details&gt;
        &lt;summary&gt;▶ ВІДКРИТИ ПОБАЖАННЯ&lt;/summary&gt;
        &lt;div class=&quot;expanded-content&quot;&gt;
            Бажаємо тобі радості, іграшок та щасливих днів 🌈
            &lt;div class=&quot;user-comment&quot;&gt;LEVEL: 4 🎉&lt;/div&gt;
        &lt;/div&gt;
    &lt;/details&gt;
&lt;/div&gt;

&lt;!-- Карточка для батьків --&gt;
&lt;div class=&quot;card&quot;&gt;
    &lt;img src=&quot;https://images.unsplash.com/photo-1511895426328-dc8714191300?q=80&amp;amp;w=600&quot; class=&quot;card-image&quot;&gt;
    &lt;div class=&quot;card-content&quot;&gt;
        &lt;h2&gt;Для батьків 💐&lt;/h2&gt;
        &lt;p&gt;Теплі слова для вас&lt;/p&gt;
    &lt;/div&gt;
    &lt;details&gt;
        &lt;summary&gt;▶ ВІДКРИТИ&lt;/summary&gt;
        &lt;div class=&quot;expanded-content&quot;&gt;
            Нехай у вашій родині завжди буде любов і щастя ❤️
            &lt;div class=&quot;user-comment&quot;&gt;СТАТУС: НАЙКРАЩА РОДИНА 💖&lt;/div&gt;
        &lt;/div&gt;
    &lt;/details&gt;
&lt;/div&gt;

&lt;/main&gt;

&lt;div class=&quot;btn-container&quot;&gt;
    &lt;button id=&quot;gift-btn&quot; class=&quot;surprise-btn&quot; fdprocessedid=&quot;g6l99v&quot;&gt;Відкрити магію 🎁✨&lt;/button&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;script&gt;
document.getElementById(&#039;gift-btn&#039;).addEventListener(&#039;click&#039;, function() {

    var duration = 3000;
    var end = Date.now() + duration;

    var interval = setInterval(function() {
        if (Date.now() &gt; end) return clearInterval(interval);

        confetti({
            particleCount: 50,
            spread: 360,
            origin: { x: Math.random(), y: Math.random() - 0.2 }
        });
    }, 250);

    this.innerText = &quot;🎉 Урааа! 🎉&quot;;
});
&lt;/script&gt;</description>
            </item>
                    <item>
                <title>Як кішка грала в Робінзона Крузо</title>
                <link>http://margo.mozello.shop/blog-4-1/params/post/5207453/page</link>
                <pubDate>Tue, 10 Feb 2026 12:57:00 +0000</pubDate>
                <description>остаточний варіант без молюнків&lt;hr class=&quot;moze-more-divider&quot;&gt;&lt;p&gt;5&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;


  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
  &lt;meta name=&quot;description&quot; content=&quot;Чарльз Ґ. Д. Робертс. Як кішка грала в Робінзона Крузо. Повний український літературний переклад.&quot;&gt;
  &lt;meta name=&quot;author&quot; content=&quot;Charles G. D. Roberts; переклад українською&quot;&gt;
  &lt;title&gt;Як кішка грала в Робінзона Крузо — повний текст&lt;/title&gt;



&lt;section id=&quot;preface&quot; aria-labelledby=&quot;h-preface&quot;&gt;
  &lt;h2 id=&quot;h-preface&quot;&gt;Передмова&lt;/h2&gt;
  &lt;p&gt;Це оповідання належить до класичної традиції так званих «оповідей про тварин», що сформувалася наприкінці XIX — на початку XX століття в англомовній літературі Північної Америки. Її характерною рисою є уважне, серйозне ставлення до тварини як до самостійної істоти зі своїм досвідом, страхами й способом мислення.&lt;/p&gt;
  &lt;p&gt;На відміну від байок або казок, у таких творах тварини не «олюднюються» повністю. Їхня поведінка пояснюється інстинктами, пам’яттю тіла, пристосуванням до середовища. Саме тому історія кішки, залишеної на безлюдному острові, читається як розповідь про виживання — стримана, напружена і водночас глибоко людяна.&lt;/p&gt;
  &lt;p&gt;Український текст подано як літературний переклад‑переказ за мотивами оповідання Чарльза Ґ. Д. Робертса. Його мета — зберегти дух оригіналу, водночас надавши мові природного українського звучання та цілісного художнього ритму.&lt;/p&gt;
&lt;/section&gt;


&lt;nav aria-label=&quot;Навігація по розділах&quot;&gt;
  &lt;h1 id=&quot;title&quot;&gt;Як кішка грала в Робінзона Крузо&lt;/h1&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;#part1&quot;&gt;Частина 1. Забута&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#part2&quot;&gt;Частина 2. Перші уроки&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#part3&quot;&gt;Частина 3. Нічний ворог&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#part4&quot;&gt;Частина 4. Зима на безлюдному острові&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#part5&quot;&gt;Частина 5. Повернення&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/nav&gt;

&lt;main&gt;

&lt;section id=&quot;part1&quot; aria-labelledby=&quot;h-part1&quot;&gt;
  &lt;h2 id=&quot;h-part1&quot;&gt;Частина 1. Забута&lt;/h2&gt;
  &lt;p&gt;Коли човен відштовхнувся від берега, кішка спала. Вона згорнулася клубочком на старій вовняній ковдрі в кутку літнього будиночка, де завжди було трохи тепліше, і не чула ні поспішних кроків, ні збуджених голосів, ні скрипу весел, що врізалися у воду.&lt;/p&gt;
  &lt;p&gt;Їй снився дім — великий, зимовий, сповнений запахів печі, людей і спокою. Вона ледь ворушила вусами, ніби й уві сні прислухалася до знайомих звуків. Тому коли різкий дзенькіт скла й подих холодного повітря порушили тишу, кішка прокинулася не одразу, а з лінивим подивом.&lt;/p&gt;
  &lt;p&gt;Будинок був порожній. Двері зачинені, але не на засув — так, ніби люди вийшли лише на хвилину. У кімнатах ще тримався їхній запах: дерева, тютюну, людських рук. Та він швидко холонув, утрачаючи живе тепло.&lt;/p&gt;
  &lt;p&gt;Кішка повільно обійшла будиночок, обнюхуючи кожен куток. Зазирнула під стіл, під ліжка, торкнула лапою покинуту чашку. Людей не було. І це почало її тривожити.&lt;/p&gt;
  &lt;p&gt;Вийшовши надвір, вона побачила човен. Він уже віддалявся, лишаючи за собою темну, розірвану смугу на спокійній воді. Люди були в човні. Вони не оберталися.&lt;/p&gt;
  &lt;p&gt;Кішка нявкнула — спершу коротко, з упевненістю. Потім голосніше, настирливіше. Вона побігла вздовж берега, але човен лише зменшувався, танув у сонячному мареві.&lt;/p&gt;
  &lt;p&gt;Море проковтнуло її голос.&lt;/p&gt;
  &lt;p&gt;Коли кішка зупинилася, в ній уперше ворухнулося щось нове — не страх, а розгубленість. Вона сіла на піску, підгорнувши лапи, й довго дивилася туди, де зник човен.&lt;/p&gt;
  &lt;p&gt;Так кішка залишилася сама на острові.&lt;/p&gt;
&lt;/section&gt;

&lt;section id=&quot;part2&quot; aria-labelledby=&quot;h-part2&quot;&gt;
  &lt;h2 id=&quot;h-part2&quot;&gt;Частина 2. Перші уроки&lt;/h2&gt;
  &lt;p&gt;Перші дні минули легко й майже безтурботно. Літній будиночок давав надійний притулок: суху підлогу, дах над головою й затишні закутки, де можна було спати, не остерігаючись вітру. Навколо вирувало життя. У стінах і під підлогою шаруділи миші, в траві снували полівки, а іноді просто на ґанок вибігав необережний бурундук.&lt;/p&gt;
  &lt;p&gt;Кішка полювала без поспіху, ніби граючись. Вона ще не знала справжньої небезпеки й не відчувала голоду. Рухи були ліниво-точні, а успіх здавався чимось само собою зрозумілим. Піймавши здобич, вона часто з’їдала лише частину, решту залишаючи — як це роблять ситі істоти.&lt;/p&gt;
  &lt;p&gt;Та з кожним днем вона відходила від будинку все далі. Інстинкт, старший за будь-який досвід, кликав досліджувати острів. Вона обходила берег, заглядала в чагарники, пробиралася між камінням і корінням. Острів відкривався їй поступово — не як місце гри, а як простір, у якому треба жити.&lt;/p&gt;
  &lt;p&gt;Кішка навчилася читати запахи. Вона відрізняла свіжий слід від старого, запах страху — від байдужості, нічні сліди — від денних. Вітер став для неї мовою: з моря він приносив холод і порожнечу, з лісу — життя й приховані загрози.&lt;/p&gt;
  &lt;p&gt;Вона зрозуміла, що острів має свої години. Вдень він здавався безпечним і навіть дружнім. У сутінках усе змінювалося: тіні видовжувалися, звуки глухли, а трава більше не шаруділа без причини.&lt;/p&gt;
  &lt;p&gt;Одного разу на відкритій галявині сонце раптом згасло. Над нею ковзнула тінь — велика й повільна, мов хмара. Кішка інстинктивно припала до землі, притиснувши вуха й затамувавши подих.&lt;/p&gt;
  &lt;p&gt;Тінь зникла так само безшумно, як і з’явилася. Кішка ще довго лежала нерухомо, відчуваючи, як шалено б’ється серце. Вона не бачила ворога, але вже знала: на острові є хтось, для кого вона — лише здобич.&lt;/p&gt;
  &lt;p&gt;Це був її перший справжній урок. І острів почав навчати її серйозно.&lt;/p&gt;
&lt;/section&gt;

&lt;section id=&quot;part3&quot; aria-labelledby=&quot;h-part3&quot;&gt;
  &lt;h2 id=&quot;h-part3&quot;&gt;Частина 3. Нічний ворог&lt;/h2&gt;
  &lt;p&gt;Ніч на острові була не схожою на день. З темрявою простір стискався, знайомі місця втрачали обриси, а кожен звук здавався гучнішим і загрозливішим. Кішка швидко зрозуміла: ніч — не час для безтурботних мандрів.&lt;/p&gt;
  &lt;p&gt;Пугач з’явився не одразу. Спершу були лише непрямі ознаки: раптова тиша, коли замовкали дрібні птахи, напруження повітря, ледь помітний рух тіні на межі зору. Кішка насторожувалася, притискала вуха й завмирала, ще не знаючи, чого саме боїться.&lt;/p&gt;
  &lt;p&gt;Уперше вона побачила його чітко в місячному світлі. Великий птах повільно ковзав над галявиною, майже не рухаючи крилами. Його очі світилися холодним, нерухомим блиском. У цю мить кішка відчула себе дивно маленькою.&lt;/p&gt;
  &lt;p&gt;Вона розпласталася серед трави. Інстинкт наказував не тікати й не дивитися вгору. Пугач кружляв, оцінюючи, чекаючи руху. Лише коли він відлетів, кішка наважилася поворухнутися.&lt;/p&gt;
  &lt;p&gt;Після тієї ночі вона змінила звички. Перестала виходити далеко після заходу сонця, навчилася триматися тіней, рухатися вздовж стін і під навислими дошками. Кожне укриття стало важливим, кожен виступ — можливим порятунком.&lt;/p&gt;
  &lt;p&gt;Та одного разу уникнути зустрічі не вдалося. Пугач напав раптово, стрімко падаючи з темряви. Повітря розсік різкий подих крил. В останню мить кішка стрибнула вбік, відчувши, як щось важке ковзнуло зовсім поруч.&lt;/p&gt;
  &lt;p&gt;Вона мчала, не розбираючи дороги, інстинктивно тримаючись тіні. Серце калатало так, що, здавалося, його чути на весь острів. Лише сховавшись між корінням старого дерева, кішка дозволила собі зупинитися.&lt;/p&gt;
  &lt;p&gt;Відтоді страх перестав бути панікою. Він став уважністю. І в цій обережності почала народжуватися її сила.&lt;/p&gt;
&lt;/section&gt;

&lt;section id=&quot;part4&quot; aria-labelledby=&quot;h-part4&quot;&gt;
  &lt;h2 id=&quot;h-part4&quot;&gt;Частина 4. Зима на безлюдному острові&lt;/h2&gt;
  &lt;p&gt;Зима прийшла не раптово, але невблаганно. Спершу змінився вітер: утратив літню м’якість і став різким, колючим, просякнутим холодною вологою. Потім небо дедалі частіше затягували низькі сірі хмари, а дощі тривали днями.&lt;/p&gt;
  &lt;p&gt;Кішка відчула зміни раніше за сніг. Полівки ховалися в глибокі нори, миші ставали обережнішими, а берег дедалі рідше дарував випадкову поживу. Голод уже не був коротким неприємним відчуттям — він оселився поруч.&lt;/p&gt;
  &lt;p&gt;Коли випав перший сніг, острів змінився до невпізнання. Трави зникли під білою ковдрою, знайомі стежки стерлися, а простір став чужим і ворожим. Кішка ходила обережно, ставлячи лапи в старі сліди, щоб не марнувати сил.&lt;/p&gt;
  &lt;p&gt;Будинок став її єдиним справжнім прихистком. Вона оселилася в найменшій кімнаті, де вітер майже не проникав, і навчилася згортатися так, щоб берегти тепло. Назовні виходила лише тоді, коли голод уже не давав спокою.&lt;/p&gt;
  &lt;p&gt;Бурі тривали днями. Вітер вив у щілинах, море глухо гупало в берег, а будинок здригався, ніби живий. У такі ночі кішка сиділа нерухомо в темряві й чекала. Вона не знала, скільки це триватиме, але знала одне: треба витримати.&lt;/p&gt;
  &lt;p&gt;Іноді їй щастило. Після бурі море викидало на берег мертву рибу чи птаха, і тоді кішка їла жадібно, не лишаючи ані крихти. Інколи ж дні минали без жодної здобичі, і вона лише пила холодну воду, щоб притлумити голод.&lt;/p&gt;
  &lt;p&gt;Вона худла, шерсть тьмяніла, рухи ставали повільними. Та в очах з’явилася нова зосередженість. Кішка більше не марнувала сил і не ризикувала без потреби. Вона жила не за бажанням — за необхідністю.&lt;/p&gt;
  &lt;p&gt;Коли зима почала слабшати, кішка вже не була тією, що колись гралася з легкою здобиччю. Острів випробував її до межі — і вона витримала.&lt;/p&gt;
&lt;/section&gt;

&lt;section id=&quot;part5&quot; aria-labelledby=&quot;h-part5&quot;&gt;
  &lt;h2 id=&quot;h-part5&quot;&gt;Частина 5. Повернення&lt;/h2&gt;
  &lt;p&gt;Весна не прийшла раптово — вона прокрадалася на острів обережно, майже непомітно. Сніг осідав і темнів, з-під нього проступала земля, а повітря втрачало крижану гостроту. Кішка відчувала ці зміни тілом раніше, ніж могла їх побачити.&lt;/p&gt;
  &lt;p&gt;Голод ще тримався поруч, але вже не був безжальним. У талих місцях з’являлися перші сліди дрібних тварин, і полювання знову ставало можливим. Кішка рухалася повільно, ощаджуючи кожен крок, та в ній зростало відчуття, що найгірше минуло.&lt;/p&gt;
  &lt;p&gt;Одного ранку, коли туман стелився над водою, вона почула звук, якого не було тут багато місяців. Рівномірний плескіт весел. Не вітер і не хвиля — щось знайоме, давно забуте.&lt;/p&gt;
  &lt;p&gt;Вона підвела голову й завмерла, прислухаючись, ніби боялася помилитися. Коли звук повторився, кішка рушила до берега — спершу повільно, а потім швидше, забувши про втому.&lt;/p&gt;
  &lt;p&gt;Човен виринав із туману поступово. У ньому були люди — ті самі запахи, що колись наповнювали будиночок теплом. Кішка зупинилася на піску. Вона більше не була довірливою домашньою улюбленкою: острів навчив її обережності.&lt;/p&gt;
  &lt;p&gt;Коли човен торкнувся берега, один із людей побачив її першим. Він скрикнув і нахилився вперед. Кішка не відступила, але й не підійшла. Лише на знайомий тихий поклик вона зробила кілька кроків.&lt;/p&gt;
  &lt;p&gt;Її підняли на руки. Долоні були теплі, але чужі. Кішка напружилася, готова вирватися, та запах і ритм дихання були тими самими. Вона здригнулася й повільно розслабилася, вперше за довгий час дозволивши собі не пильнувати світ.&lt;/p&gt;
  &lt;p&gt;У човні вона згорнулася клубочком біля борту. Хвилі гойдали її, і цей рух не мав нічого спільного із зимовими бурями. Сон прийшов швидко — глибокий і спокійний.&lt;/p&gt;
  &lt;p&gt;Коли човен відпливав, кішка прокинулася й востаннє подивилася на острів. Він більше не здавався ворожим. Це було місце випробування — і місце, де вона навчилася виживати.&lt;/p&gt;
  &lt;p&gt;Вона поверталася не тією, якою її залишили. Домашня кішка стала дикішою, мовчазнішою, сильнішою. І хоча попереду знову чекало життя поруч із людьми, в ній назавжди лишився острів — пам’ять про зиму, самотність і власну витривалість.&lt;/p&gt;
&lt;/section&gt;

&lt;/main&gt;

&lt;section id=&quot;author-note&quot; aria-labelledby=&quot;h-author-note&quot;&gt;
  &lt;h2 id=&quot;h-author-note&quot;&gt;Про автора&lt;/h2&gt;
  &lt;p&gt;&lt;b&gt;Чарльз Ґ. Дуглас Робертс&lt;/b&gt; (1860–1943) — канадський поет, прозаїк і натураліст, один із засновників жанру реалістичних оповідань про тварин. Народився в провінції Нью-Брансуїк, у регіоні з дикими лісами, річками та узбережжям, що згодом стали основним тлом його творів.&lt;/p&gt;
  &lt;p&gt;Разом з Ернестом Сетоном-Томпсоном Робертс сформував напрям, який у Канаді вважають національним внеском у світову літературу. Його оповідання вирізняються точністю спостережень, повагою до природи та відмовою від сентименталізації тваринного світу.&lt;/p&gt;
  &lt;p&gt;Твори Робертса широко перекладалися в Європі та видавалися для дитячого й підліткового читання, зокрема в перекладах 1930–1950‑х років. Оповідання про кішку, залишену на острові, належить до його найвідоміших «острівних» сюжетів, у яких природа постає не декорацією, а головною силою випробування.&lt;/p&gt;
&lt;/section&gt;</description>
            </item>
                    <item>
                <title>Як кішка грала в Робінзона Крузо</title>
                <link>http://margo.mozello.shop/blog-4-1/params/post/5206390/jak-kshka-grala-v-robnzona-kruzo</link>
                <pubDate>Mon, 09 Feb 2026 00:58:00 +0000</pubDate>
                <description>Короткий переказ оповідання Робертса&lt;hr class=&quot;moze-more-divider&quot;&gt;&lt;p&gt;1&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;


  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
  &lt;meta name=&quot;description&quot; content=&quot;Чарльз Ґ. Д. Робертс. Як кішка грала в Робінзона Крузо. Повний український літературний переклад.&quot;&gt;
  &lt;meta name=&quot;author&quot; content=&quot;Charles G. D. Roberts; переклад українською&quot;&gt;
  &lt;title&gt;Як кішка грала в Робінзона Крузо — повний текст&lt;/title&gt;



&lt;nav aria-label=&quot;Навігація по розділах&quot;&gt;
  &lt;h1 id=&quot;title&quot;&gt;Як кішка грала в Робінзона Крузо&lt;/h1&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;#part1&quot;&gt;Частина 1. Забута&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#part2&quot;&gt;Частина 2. Перші уроки&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#part3&quot;&gt;Частина 3. Нічний ворог&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#part4&quot;&gt;Частина 4. Зима на безлюдному острові&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#part5&quot;&gt;Частина 5. Повернення&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/nav&gt;

&lt;main&gt;

&lt;section id=&quot;part1&quot; aria-labelledby=&quot;h-part1&quot;&gt;
  &lt;h2 id=&quot;h-part1&quot;&gt;Частина 1. Забута&lt;/h2&gt;
  &lt;p&gt;Коли човен відштовхнувся від берега, кішка спала. Вона згорнулася клубочком на старій ковдрі в кутку літнього будиночка й не чула ані поспішних кроків, ані голосів, ані скрипу весел.&lt;/p&gt;
  &lt;p&gt;Лише коли дзенькіт скла й різкий порух повітря порушили тишу, вона прокинулася. Будинок був порожній. Двері зачинені. Людей не було.&lt;/p&gt;
  &lt;p&gt;Кішка пройшлася кімнатами, обнюхуючи кожен куток. Запахи були знайомі — але холодні, покинуті. Вона вийшла надвір і побачила, як човен уже віддалявся, залишаючи за собою темну смугу на воді.&lt;/p&gt;
  &lt;p&gt;Вона нявкнула — спершу коротко, потім голосніше. Море проковтнуло її голос.&lt;/p&gt;
  &lt;p&gt;Так кішка залишилася сама на острові.&lt;/p&gt;
&lt;/section&gt;

&lt;section id=&quot;part2&quot; aria-labelledby=&quot;h-part2&quot;&gt;
  &lt;h2 id=&quot;h-part2&quot;&gt;Частина 2. Перші уроки&lt;/h2&gt;
  &lt;p&gt;Перші дні були легкими. Будинок давав притулок, навколо бігали миші, у траві шаруділи полівки. Кішка полювала, не напружуючись, ніби це була гра.&lt;/p&gt;
  &lt;p&gt;Та з кожним днем вона все частіше виходила далі від дому. Інстинкт кликав її досліджувати острів. Вона навчилася відрізняти небезпечні запахи від безпечних, слухати вітер і читати сліди на піску.&lt;/p&gt;
  &lt;p&gt;Одного разу вона побачила тінь у небі — велику, мов хмара. Кішка припала до землі. Так вона вперше дізналася, що на острові є хтось сильніший за неї.&lt;/p&gt;
&lt;/section&gt;

&lt;section id=&quot;part3&quot; aria-labelledby=&quot;h-part3&quot;&gt;
  &lt;h2 id=&quot;h-part3&quot;&gt;Частина 3. Нічний ворог&lt;/h2&gt;
  &lt;p&gt;Пугач прилітав уночі. Його крила не шуміли, а очі світилися холодним світлом. Він кружляв над будинком, чекаючи помилки.&lt;/p&gt;
  &lt;p&gt;Кішка навчилася не дивитися вгору. Вона ховалася під навислими дошками, між корінням, у тіні. Одного разу пугач напав, і лише блискавичний стрибок урятував їй життя.&lt;/p&gt;
  &lt;p&gt;Після цього страх став обережністю. А обережність — силою.&lt;/p&gt;
&lt;/section&gt;

&lt;section id=&quot;part4&quot; aria-labelledby=&quot;h-part4&quot;&gt;
  &lt;h2 id=&quot;h-part4&quot;&gt;Частина 4. Зима на безлюдному острові&lt;/h2&gt;
  &lt;p&gt;Зима прийшла різко. Сніг засипав острів, вітер з моря рвав і бив у стіни будинку. Миші зникли, полювання стало важким.&lt;/p&gt;
  &lt;p&gt;Кішка жила в порожньому будинку, грілася у вузьких закутках і виходила лише тоді, коли голод змушував. Вона худла, але не здавалась.&lt;/p&gt;
  &lt;p&gt;Бурі тривали днями. Та щоразу, коли вітер стишався, кішка все ще була жива.&lt;/p&gt;
&lt;/section&gt;

&lt;section id=&quot;part5&quot; aria-labelledby=&quot;h-part5&quot;&gt;
  &lt;h2 id=&quot;h-part5&quot;&gt;Частина 5. Повернення&lt;/h2&gt;
  &lt;p&gt;Весна принесла запахи. Тепліші вітри, рух води, нові звуки. І одного ранку — звук весел.&lt;/p&gt;
  &lt;p&gt;Кішка вибігла до берега. Люди повернулися. Вона була худою, обвітреною, дикою — і все ж своєю.&lt;/p&gt;
  &lt;p&gt;Її взяли на руки, і вона вперше за багато місяців заснула без страху. Коли човен відпливав, кішка дивилася на острів, що зробив її сильною.&lt;/p&gt;
  &lt;p&gt;Вона більше не була просто домашньою кішкою. Вона була тією, що вижила.&lt;/p&gt;
&lt;/section&gt;

&lt;/main&gt;</description>
            </item>
                    <item>
                <title>Як кішка грала в Робінзона Крузо</title>
                <link>http://margo.mozello.shop/blog-4-1/params/post/5206279/jak-kshka-grala-v-robnzona-kruzo</link>
                <pubDate>Sun, 08 Feb 2026 15:53:00 +0000</pubDate>
                <description>&lt;div&gt;пппппппппппппппппп&lt;hr class=&quot;moze-more-divider&quot;&gt;&lt;p&gt;1&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;/div&gt;


&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Як кішка грала в Робінзона Крузо&lt;/title&gt;
&lt;meta name=&quot;description&quot; content=&quot;Повний український переклад оповідання Чарльза Ґ. Д. Робертса &#039;Як кішка грала в Робінзона Крузо&#039;. Дитяча історія про виживання кішки на безлюдному острові.&quot;&gt;
&lt;meta name=&quot;author&quot; content=&quot;Чарльз Ґ. Д. Робертс, переклад українською&quot;&gt;
&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
&lt;style&gt;
  body { font-family: &#039;Georgia&#039;, serif; line-height: 1.6; margin: 40px; background-color: #fdf6e3; color: #333; }
  h1, h2 { color: #2a4d69; }
  nav { margin-bottom: 20px; }
  nav a { margin-right: 15px; text-decoration: none; color: #d94f3d; }
  nav a:hover { text-decoration: underline; }
  section { margin-top: 50px; }
  img { max-width: 100%; display: block; margin: 20px 0; }
&lt;/style&gt;



&lt;h1&gt;Як кішка грала в Робінзона Крузо&lt;/h1&gt;
&lt;p&gt;&lt;i&gt;Чарльз Ґ. Д. Робертс — переклад українською&lt;/i&gt;&lt;/p&gt;

&lt;nav&gt;
  &lt;a href=&quot;#part1&quot;&gt;Частина 1&lt;/a&gt;
  &lt;a href=&quot;#part2&quot;&gt;Частина 2&lt;/a&gt;
  &lt;a href=&quot;#part3&quot;&gt;Частина 3&lt;/a&gt;
  &lt;a href=&quot;#part4&quot;&gt;Частина 4&lt;/a&gt;
  &lt;a href=&quot;#part5&quot;&gt;Частина 5&lt;/a&gt;
&lt;/nav&gt;

&lt;section id=&quot;part1&quot; aria-labelledby=&quot;heading1&quot;&gt;
&lt;h2 id=&quot;heading1&quot;&gt;Частина 1. Острів і забута кішка&lt;/h2&gt;
&lt;p lang=&quot;uk&quot;&gt;Острів був лише піщаною мілиною неподалік від низького, рівного узбережжя. Жодне дерево не порушувало його похмурої рівнини — не було навіть куща. Проте довгі, рідкі, шорсткі стебла болотної трави вкривали його всюди вище лінії припливу, а тоненький струмок прісної води, що витікав із джерела в центрі острова, тягнув зелену стрічку м’якшої, соковитішої рослинності через суворий, тьмяно-жовто-сірий простір трав.&lt;/p&gt;
&lt;p&gt;Ніхто не назвав би цей острів привабливим місцем для життя, однак на його морському краї, там, де припливи й відпливи ніколи не знали спокою, стояв просторий одноповерховий будинок із широкою верандою, а за ним — низький сарай. Єдиною чеснотою цього самотнього клаптя піску, викинутого морем, була прохолода. Коли сусідній материк задихався вдень і вночі від безвітряної спеки, тут, на острові, завжди дув свіжий, прохолодний вітер. Саме тому розсудливий міський мешканець привласнив цей морський уламок і збудував тут літній будинок, де цілюще повітря могло повернути рум’янець на бліді щоки його дітей.&lt;/p&gt;
&lt;p&gt;Сім’я приїхала на острів наприкінці червня. А вже в перший тиждень вересня вони поїхали. Проте діти залишали острів із заплаканими обличчями. Вони покидали тут свого домашнього улюбленця — незмінного супутника всіх їхніх переїздів, гарну круглолицю кішку, смугасту, мов тигр.&lt;/p&gt;
&lt;p&gt;Батько вважав, що кішка давно повернулася до будинку. Діти ж були певні, що вона спить десь у човні або під верандою. Ніхто не перевірив. І коли човен відштовхнувся від берега, кішка залишилася на острові сама.&lt;/p&gt;
&lt;p&gt;Тим часом вона перебувала в справжній пастці на іншому кінці острова — схована під напівзасипаною піском старою бочкою, яку хвиля викинула сюди під час останнього шторму. Вона залізла туди, рятуючись від настирливих дитячих обіймів, і заснула глибоким сном. Коли ж прокинулася й вибралася назовні, острів був порожній, а будинок — тихий і замкнений.&lt;/p&gt;
&lt;p&gt;Кішка одразу зрозуміла, що сталося. Вона обійшла весь острів, нявкаючи, принюхуючись, досліджуючи кожен куток, але ніде не знайшла своїх людей. Коли настала ніч, вона вмостилася під верандою й терпляче чекала. Та човен не повернувся.&lt;/p&gt;
&lt;p&gt;Наступного дня вона знову чекала. І ще наступного. А потім до кішки поступово дійшло, що цього разу її справді залишили саму — як на безлюдному острові.&lt;/p&gt;
&lt;/section&gt;

&lt;section id=&quot;part2&quot; aria-labelledby=&quot;heading2&quot;&gt;
&lt;h2 id=&quot;heading2&quot;&gt;Частина 2. Перші уроки самотності&lt;/h2&gt;
&lt;p lang=&quot;uk&quot;&gt;Коли настала третя ніч і човен так і не з’явився, кішка перестала чекати. Її терпіння, таке ж глибоке, як і котяча прихильність, вичерпалося. Вона зрозуміла, що тепер мусить покладатися лише на себе.&lt;/p&gt;
&lt;p&gt;Спершу життя здавалося не надто важким. У коморі біля будинку вона знайшла кілька мишей, які давно оселилися там, користаючись людською недбалістю. Вони стали її першою здобиччю — легкою і звичною. Кішка почувалася майже як удома. Вдень вона грілася на сонці під стіною будинку, вночі спала під верандою, а коли хотілося, заходила всередину через відчинене вікно.&lt;/p&gt;
&lt;p&gt;Але з кожним днем острів ставав тихішим. Запаси мишей швидко танули, і кішка дедалі частіше вирушала за межі будинку, туди, де починалися зарості болотної трави. Там мешкали полівки — обережні, швидкі, значно хитріші за домашніх мишей. Полювання на них вимагало терпіння, уважності й справжньої майстерності.&lt;/p&gt;
&lt;p&gt;Кішка вчилася. Вона годинами лежала нерухомо, злившись із жовто-сірою травою, і лише кінчик її хвоста ледь здригався. Коли ж наставала мить — стрибок був блискавичним. Не завжди вдалим, але достатньо часто, щоб не померти з голоду.&lt;/p&gt;
&lt;p&gt;Згодом вона відкрила для себе й інші дари острова. У припливних калюжах залишалися дрібні краби та рибки. Їх було важко впіймати, але сама спроба збуджувала мисливський азарт. Інколи море викидало на берег мертвих чайок або рибу — і тоді кішка влаштовувала справжній бенкет.&lt;/p&gt;
&lt;p&gt;Та острів був не лише щедрим — він був і небезпечним.&lt;/p&gt;
&lt;p&gt;Одного вечора, коли сонце вже сховалося, а над травами здіймався холодний туман, кішка раптом відчула на собі чийсь погляд. Вона припала до землі, шерсть на її спині стала дибки. Над нею, майже беззвучно, ширяв великий пугач. Його очі світилися в сутінках, а тінь ковзала по землі, мов жива.&lt;/p&gt;
&lt;p&gt;Кішка кинулася до будинку і зникла під верандою в ту ж мить, коли пазурі хижака зімкнулися в порожнечі. Відтоді вона знала: ніч — не її союзник. Вночі вона ховалася, слухала й чекала світанку.&lt;/p&gt;
&lt;p&gt;Так минав час. Дні ставали коротшими, ночі — холоднішими. Вітер уже не був літнім і лагідним. Він приносив із собою запах далекої зими.&lt;/p&gt;
&lt;p&gt;Кішка жила. Вона більше не була домашньою улюбленицею. Вона ставала господинею острова.&lt;/p&gt;
&lt;/section&gt;</description>
            </item>
                    <item>
                <title>Дитяча колонка на блютуз-мишка</title>
                <link>http://margo.mozello.shop/blog-4-1/params/post/5203155/ditjacha-kologka-na-bljutuz-mishka</link>
                <pubDate>Sun, 01 Feb 2026 17:41:00 +0000</pubDate>
                <description>&amp;nbsp; &amp;nbsp;&lt;img src=&quot;https://site-2669532.mozfiles.com/files/2669532/IKEA-Grejsimojs-Bluetooth-speaker.jpg&quot; style=&quot;width: 121px;&quot;&gt;IKEA випустила дитячу Bluetooth-колонку Grejsimojs

&lt;hr class=&quot;moze-more-divider&quot;&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;



    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;IKEA випустила дитячу Bluetooth-колонку Grejsimojs&lt;/title&gt;
    &lt;style&gt;
        :root {
            --yellow: #FFEB3B;
            --blue: #03A9F4;
            --green: #4CAF50;
            --dark: #111;
            --light: #fdfdfd;
            --bg-accent: #f0f4f8;
            --light-blue: #E3F2FD;
            --light-green: #E8F5E9;
        }

        * { box-sizing: border-box; }

        body {
            font-family: &#039;Inter&#039;, -apple-system, sans-serif;
            line-height: 1.7;
            color: var(--dark);
            background-color: var(--light);
            margin: 0;
            padding: 0;
            overflow-x: hidden;
        }

        .container {
            max-width: 1900px;
            margin: 60px auto;
            padding: 0 20px;
        }

        h1 {
            font-size: 3rem;
            color: var(--dark);
            text-align: center;
            margin-bottom: 40px;
        }

        .article-meta {
            text-align: center;
            font-size: 0.9rem;
            color: gray;
            margin-bottom: 30px;
        }

        .article-body p {
            margin-bottom: 20px;
        }

        .gallery {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
            gap: 20px;
            margin: 40px 0;
        }

        .gallery img {
            width: 100%;
            height: auto;
            border-radius: 12px;
            box-shadow: 0 8px 20px rgba(0,0,0,0.1);
            display: block; /* Ensure images are visible */
        }

        .source, .related {
            margin-top: 40px;
            padding: 20px;
            background: var(--bg-accent);
            border-radius: 8px;
        }

        footer {
            text-align: center;
            padding: 40px;
            background: var(--bg-accent);
            margin-top: 80px;
        }

        /* Split-Screen */
        .split-container {
            position: relative;
            width: 100%;
            height: auto;
        }

        .bottom-layer,
        .top-layer {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: auto;
            background: white;
            color: var(--dark);
            transition: clip-path 0.1s ease;
            z-index: 1;
        }

        .top-layer {
            clip-path: inset(0 50% 0 0);
            filter: invert(100%) hue-rotate(180deg);
            z-index: 2;
            pointer-events: none;
        }

        .handle {
            position: absolute;
            top: 0;
            left: 50%;
            width: 4px;
            height: 100%;
            background-color: var(--yellow);
            cursor: ew-resize;
            transform: translateX(-50%);
            z-index: 10;
            display: flex;
            align-items: center;
            justify-content: center;
        }

        .handle::before {
            content: &#039;&lt; &gt;&#039;;
            font-size: 1.5rem;
            color: var(--dark);
            background: var(--yellow);
            padding: 12px 16px;
            border-radius: 50%;
        }

        @media (max-width: 768px) {
            .handle { width: 24px; }
            .handle::before { font-size: 1.3rem; padding: 10px; }
            h1 { font-size: 2.2rem; }
        }

        .theme-buttons {
            position: fixed;
            top: 20px;
            right: 20px;
            z-index: 20;
            display: flex;
            gap: 10px;
        }

        .theme-buttons button {
            padding: 10px 14px;
            background: white;
            border: 2px solid var(--yellow);
            border-radius: 8px;
            cursor: pointer;
            font-weight: bold;
        }

        .hero {
            height: 80vh;
            display: flex;
            align-items: center;
            justify-content: center;
            background: linear-gradient(to bottom, #f0eafb, white);
            border-bottom: 8px solid var(--yellow);
            text-align: center;
            font-size: 5vw;
            font-weight: 900;
            text-transform: uppercase;
        }
    &lt;/style&gt;


    &lt;div class=&quot;split-container&quot;&gt;
        &lt;div class=&quot;bottom-layer&quot;&gt;
            &lt;div class=&quot;hero&quot;&gt;IKEA Grejsimojs&lt;/div&gt;
            &lt;div class=&quot;container&quot;&gt;
                &lt;h1&gt;IKEA випустила дитячу Bluetooth-колонку Grejsimojs&lt;/h1&gt;
                &lt;div class=&quot;article-meta&quot;&gt;01 лютого 2026, 13:07&lt;/div&gt;

                &lt;div class=&quot;article-body&quot;&gt;
                    &lt;p&gt;IKEA представила в Європі нову портативну колонку Grejsimojs Portable Bluetooth Speaker, орієнтовану на дитячу аудиторію. Модель вирізняється грайливим дизайном у вигляді фіолетової мишки та компактними розмірами.&lt;/p&gt;

                    &lt;div class=&quot;gallery&quot;&gt;
                        &lt;img src=&quot;https://www.gizmochina.com/wp-content/uploads/2026/01/grejsimojs-portable-bluetooth-sp-1-1-e1769895404668.jpg&quot; alt=&quot;IKEA Grejsimojs – вид спереду&quot;&gt;
                        &lt;img src=&quot;https://www.notebookcheck.net/fileadmin/Notebooks/News/_nc5/IKEA-Grejsimojs-Bluetooth-speaker.jpg&quot; alt=&quot;IKEA Grejsimojs – вид збоку&quot;&gt;
                        &lt;img src=&quot;https://www.gizmochina.com/wp-content/uploads/2026/01/grejsimojs-portable-bluetooth-sp-2.jpg&quot; alt=&quot;IKEA Grejsimojs – деталі&quot;&gt;
                        &lt;img src=&quot;https://www.gizmochina.com/wp-content/uploads/2026/01/grejsimojs-portable-bluetooth-sp-3.jpg&quot; alt=&quot;IKEA Grejsimojs – хвіст-ремінець&quot;&gt;
                    &lt;/div&gt;

                    &lt;p&gt;Колонка оснащена одним широкосмуговим динаміком діаметром 1,6 дюйма. Загальна вихідна потужність — 2 Вт, частотний діапазон — 150–19 000 Гц, максимальний рівень звукового тиску — 73,8 дБ. Передача звуку — через Bluetooth.&lt;/p&gt;
                    &lt;p&gt;В IKEA описують пристрій як «музичну мишку»: корпус з ABS-пластику, чотири силіконові ніжки, два вушка, звук виходить через «мордочку». Ззаду — плетений ремінець-поліестер у вигляді хвоста.&lt;/p&gt;
                    &lt;p&gt;Grejsimojs підтримує одночасне відтворення на кількох колонках (до 10 м між ними). Стереорежиму немає, Spotify Tap теж відсутній. Автономність — до 24 годин на 50 % гучності. Заряджання через USB-C (кабель і адаптер окремо). Є обмеження максимальної гучності для захисту дитячого слуху. Захист IP44.&lt;/p&gt;
                    &lt;p&gt;Ціна: £12 / €14,99 / 179 SEK. Поки що доступна у Великобританії, Німеччині, Швеції та деяких інших країнах Європи.&lt;/p&gt;
                &lt;/div&gt;

                &lt;div class=&quot;source&quot;&gt;
                    &lt;b&gt;Джерело:&lt;/b&gt; &lt;a href=&quot;https://www.gizmochina.com/2026/01/31/ikea-grejsimojs-mouse-bluetooth-speakers-launched/&quot;&gt;gizmochina.com&lt;/a&gt;
                &lt;/div&gt;

                &lt;footer&gt;© 2026 ilenta.com&lt;/footer&gt;
            &lt;/div&gt;
        &lt;/div&gt;

        &lt;div class=&quot;top-layer&quot;&gt;
            &lt;div class=&quot;hero&quot;&gt;IKEA Grejsimojs&lt;/div&gt;
            &lt;div class=&quot;container&quot;&gt;
                &lt;h1&gt;IKEA випустила дитячу Bluetooth-колонку Grejsimojs&lt;/h1&gt;
                &lt;div class=&quot;article-meta&quot;&gt;01 лютого 2026, 13:07&lt;/div&gt;

                &lt;div class=&quot;article-body&quot;&gt;
                    &lt;p&gt;IKEA представила в Європі нову портативну колонку Grejsimojs Portable Bluetooth Speaker, орієнтовану на дитячу аудиторію. Модель вирізняється грайливим дизайном у вигляді фіолетової мишки та компактними розмірами.&lt;/p&gt;

                    &lt;div class=&quot;gallery&quot;&gt;
                        &lt;img src=&quot;https://www.gizmochina.com/wp-content/uploads/2026/01/grejsimojs-portable-bluetooth-sp-1-1-e1769895404668.jpg&quot; alt=&quot;IKEA Grejsimojs – вид спереду&quot;&gt;
                        &lt;img src=&quot;https://www.notebookcheck.net/fileadmin/Notebooks/News/_nc5/IKEA-Grejsimojs-Bluetooth-speaker.jpg&quot; alt=&quot;IKEA Grejsimojs – вид збоку&quot;&gt;
                        &lt;img src=&quot;https://www.gizmochina.com/wp-content/uploads/2026/01/grejsimojs-portable-bluetooth-sp-2.jpg&quot; alt=&quot;IKEA Grejsimojs – деталі&quot;&gt;
                        &lt;img src=&quot;https://www.gizmochina.com/wp-content/uploads/2026/01/grejsimojs-portable-bluetooth-sp-3.jpg&quot; alt=&quot;IKEA Grejsimojs – хвіст-ремінець&quot;&gt;
                    &lt;/div&gt;

                    &lt;p&gt;Колонка оснащена одним широкосмуговим динаміком діаметром 1,6 дюйма. Загальна вихідна потужність — 2 Вт, частотний діапазон — 150–19 000 Гц, максимальний рівень звукового тиску — 73,8 дБ. Передача звуку — через Bluetooth.&lt;/p&gt;
                    &lt;p&gt;В IKEA описують пристрій як «музичну мишку»: корпус з ABS-пластику, чотири силіконові ніжки, два вушка, звук виходить через «мордочку». Ззаду — плетений ремінець-поліестер у вигляді хвоста.&lt;/p&gt;
                    &lt;p&gt;Grejsimojs підтримує одночасне відтворення на кількох колонках (до 10 м між ними). Стереорежиму немає, Spotify Tap теж відсутній. Автономність — до 24 годин на 50 % гучності. Заряджання через USB-C (кабель і адаптер окремо). Є обмеження максимальної гучності для захисту дитячого слуху. Захист IP44.&lt;/p&gt;
                    &lt;p&gt;Ціна: £12 / €14,99 / 179 SEK. Поки що доступна у Великобританії, Німеччині, Швеції та деяких інших країнах Європи.&lt;/p&gt;
                &lt;/div&gt;

                &lt;div class=&quot;source&quot;&gt;
                    &lt;b&gt;Джерело:&lt;/b&gt; &lt;a href=&quot;https://www.gizmochina.com/2026/01/31/ikea-grejsimojs-mouse-bluetooth-speakers-launched/&quot;&gt;gizmochina.com&lt;/a&gt;
                &lt;/div&gt;

                &lt;footer&gt;© 2026 ilenta.com&lt;/footer&gt;
            &lt;/div&gt;
        &lt;/div&gt;

        &lt;div class=&quot;handle&quot;&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&quot;theme-buttons&quot;&gt;
        &lt;button onclick=&quot;setTheme(&#039;black-white&#039;)&quot; fdprocessedid=&quot;b3il6&quot;&gt;Чорно-білий&lt;/button&gt;
        &lt;button onclick=&quot;setTheme(&#039;gradient&#039;)&quot; fdprocessedid=&quot;00qu3a&quot;&gt;Градієнт&lt;/button&gt;
        &lt;button onclick=&quot;setTheme(&#039;colored&#039;)&quot; fdprocessedid=&quot;y5hlql&quot;&gt;Кольоровий&lt;/button&gt;
    &lt;/div&gt;

    &lt;script&gt;
        const container = document.querySelector(&#039;.split-container&#039;);
        const bottomLayer = document.querySelector(&#039;.bottom-layer&#039;);
        const topLayer = document.querySelector(&#039;.top-layer&#039;);
        const handle = document.querySelector(&#039;.handle&#039;);
        let isDragging = false;
        let startX = 0;
        let currentPosition = 50;

        function clampPosition(pos) {
            return Math.max(10, Math.min(90, pos));
        }

        function updatePosition(pos) {
            currentPosition = clampPosition(pos);
            topLayer.style.clipPath = `inset(0 ${100 - currentPosition}% 0 0)`;
            handle.style.left = `${currentPosition}%`;
        }

        function startDrag(e) {
            isDragging = true;
            startX = e.type.includes(&#039;touch&#039;) ? e.touches[0].clientX : e.clientX;
            document.body.style.cursor = &#039;ew-resize&#039;;
        }

        function drag(e) {
            if (!isDragging) return;
            const clientX = e.type.includes(&#039;touch&#039;) ? e.touches[0].clientX : e.clientX;
            const delta = ((clientX - startX) / container.offsetWidth) * 100;
            updatePosition(currentPosition + delta);
            startX = clientX;
        }

        function endDrag() {
            isDragging = false;
            document.body.style.cursor = &#039;default&#039;;
        }

        handle.addEventListener(&#039;mousedown&#039;, startDrag);
        handle.addEventListener(&#039;touchstart&#039;, startDrag, { passive: true });
        window.addEventListener(&#039;mousemove&#039;, drag);
        window.addEventListener(&#039;touchmove&#039;, drag, { passive: false });
        window.addEventListener(&#039;mouseup&#039;, endDrag);
        window.addEventListener(&#039;touchend&#039;, endDrag);

        function updateHeights() {
            const maxHeight = Math.max(bottomLayer.offsetHeight, topLayer.offsetHeight);
            container.style.height = `${maxHeight}px`;
            handle.style.height = `${maxHeight}px`;
        }

        window.addEventListener(&#039;load&#039;, updateHeights);
        window.addEventListener(&#039;resize&#039;, updateHeights);

        // Fix image loading
        document.querySelectorAll(&#039;img&#039;).forEach(img =&gt; {
            img.addEventListener(&#039;load&#039;, updateHeights);
            img.addEventListener(&#039;error&#039;, () =&gt; console.log(&#039;Image load error: &#039; + img.src)); // For debugging
        });

        function setTheme(theme) {
            document.querySelectorAll(&#039;.bottom-layer, .top-layer&#039;).forEach(layer =&gt; {
                let bg;
                if (theme === &#039;black-white&#039;) {
                    bg = &#039;#000&#039;;
                } else if (theme === &#039;gradient&#039;) {
                    bg = &#039;linear-gradient(to right, #000, #333)&#039;;
                } else if (theme === &#039;colored&#039;) {
                    bg = &#039;#1a237e&#039;;
                }
                layer.style.background = bg;
                // Apply readability rule: dark bg -&gt; light text
                layer.style.color = &#039;#fff&#039;; // Light text for all dark themes
            });
            updateHeights();
        }

        updatePosition(50);
    &lt;/script&gt;</description>
            </item>
                    <item>
                <title>Реверсі 3</title>
                <link>http://margo.mozello.shop/blog-4-1/params/post/5144267/pevers-3</link>
                <pubDate>Sat, 04 Oct 2025 20:08:00 +0000</pubDate>
                <description>У світі настільних ігор є одна, яка поєднує простоту правил і глибину стратегії — це Реверсі. Вона не потребує складного обладнання, але здатна захопити на години. 

&lt;hr class=&quot;moze-more-divider&quot;&gt;&lt;p&gt;3&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;


  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;title&gt;Реверсі: Гравець vs Комп&#039;ютер&lt;/title&gt;
  &lt;style&gt;
    canvas { background: #0a0; display: block; margin: 20px auto; }
    body { text-align: center; font-family: sans-serif; }
    button { margin: 10px; padding: 8px 16px; font-size: 16px; }
    details { margin: 20px auto; width: 80%; text-align: left; }
    summary { font-weight: bold; cursor: pointer; }
  &lt;/style&gt;


  &lt;h1&gt;Гра Реверсі&lt;/h1&gt;
  &lt;canvas id=&quot;board&quot; width=&quot;320&quot; height=&quot;320&quot;&gt;&lt;/canvas&gt;
  &lt;p&gt;Поточний гравець: &lt;span id=&quot;player&quot;&gt;Гравець (Чорний)&lt;/span&gt;&lt;/p&gt;
  &lt;button onclick=&quot;startNewGame()&quot; fdprocessedid=&quot;6jfd0n&quot;&gt;🔄 Нова гра&lt;/button&gt;

  &lt;details&gt;
    &lt;summary&gt;📘 Правила гри та інструкція&lt;/summary&gt;
    &lt;p&gt;&lt;b&gt;Мета гри:&lt;/b&gt; захопити більше клітинок, ніж суперник, перетворюючи його фішки на свої.&lt;/p&gt;
    &lt;p&gt;&lt;b&gt;Початок:&lt;/b&gt; гра починається з 4 фішками в центрі дошки. Гравець — чорний, комп’ютер — білий.&lt;/p&gt;
    &lt;p&gt;&lt;b&gt;Хід:&lt;/b&gt; фішка ставиться так, щоб між новою фішкою і вже наявною була хоча б одна фішка суперника. Всі такі фішки перевертаються.&lt;/p&gt;
    &lt;p&gt;&lt;b&gt;Коли немає ходів:&lt;/b&gt; якщо гравець не має допустимих ходів — хід переходить супернику.&lt;/p&gt;
    &lt;p&gt;&lt;b&gt;Завершення гри:&lt;/b&gt; коли дошка заповнена або жоден гравець не має ходів. Перемагає той, у кого більше фішок.&lt;/p&gt;
  &lt;/details&gt;

  &lt;script&gt;
    const canvas = document.getElementById(&quot;board&quot;);
    const ctx = canvas.getContext(&quot;2d&quot;);
    const size = 8;
    const cell = canvas.width / size;
    let board, current;
    let gameOver = false;

    function startNewGame() {
      board = Array(size).fill().map(() =&gt; Array(size).fill(null));
      board[3][3] = board[4][4] = &quot;W&quot;;
      board[3][4] = board[4][3] = &quot;B&quot;;
      current = &quot;B&quot;;
      gameOver = false;
      document.getElementById(&quot;player&quot;).textContent = &quot;Гравець (Чорний)&quot;;
      drawBoard();
    }

    function drawBoard() {
      ctx.clearRect(0, 0, canvas.width, canvas.height);
      for (let x = 0; x &lt; size; x++) {
        for (let y = 0; y &lt; size; y++) {
          ctx.strokeRect(x * cell, y * cell, cell, cell);
          if (board[x][y]) {
            ctx.beginPath();
            ctx.arc(x * cell + cell / 2, y * cell + cell / 2, cell / 2 - 4, 0, Math.PI * 2);
            ctx.fillStyle = board[x][y] === &quot;B&quot; ? &quot;black&quot; : &quot;white&quot;;
            ctx.fill();
          }
        }
      }
    }

    function isValid(x, y, player) {
      if (board[x][y]) return false;
      const opp = player === &quot;B&quot; ? &quot;W&quot; : &quot;B&quot;;
      const dirs = [[-1,-1],[-1,0],[-1,1],[0,-1],[0,1],[1,-1],[1,0],[1,1]];
      for (let [dx, dy] of dirs) {
        let nx = x + dx, ny = y + dy, found = false;
        while (nx &gt;= 0 &amp;&amp; ny &gt;= 0 &amp;&amp; nx &lt; size &amp;&amp; ny &lt; size) {
          if (board[nx][ny] === opp) found = true;
          else if (board[nx][ny] === player &amp;&amp; found) return true;
          else break;
          nx += dx; ny += dy;
        }
      }
      return false;
    }

    function flip(x, y, player) {
      board[x][y] = player;
      const opp = player === &quot;B&quot; ? &quot;W&quot; : &quot;B&quot;;
      const dirs = [[-1,-1],[-1,0],[-1,1],[0,-1],[0,1],[1,-1],[1,0],[1,1]];
      for (let [dx, dy] of dirs) {
        let nx = x + dx, ny = y + dy, path = [];
        while (nx &gt;= 0 &amp;&amp; ny &gt;= 0 &amp;&amp; nx &lt; size &amp;&amp; ny &lt; size) {
          if (board[nx][ny] === opp) path.push([nx, ny]);
          else if (board[nx][ny] === player) {
            for (let [px, py] of path) board[px][py] = player;
            break;
          } else break;
          nx += dx; ny += dy;
        }
      }
    }

    function getValidMoves(player) {
      let moves = [];
      for (let x = 0; x &lt; size; x++) {
        for (let y = 0; y &lt; size; y++) {
          if (isValid(x, y, player)) moves.push([x, y]);
        }
      }
      return moves;
    }

    function countDiscs() {
      let black = 0, white = 0;
      for (let row of board) {
        for (let cell of row) {
          if (cell === &quot;B&quot;) black++;
          if (cell === &quot;W&quot;) white++;
        }
      }
      return { black, white };
    }

    function checkEndGame() {
      const movesB = getValidMoves(&quot;B&quot;);
      const movesW = getValidMoves(&quot;W&quot;);
      const full = board.flat().every(cell =&gt; cell !== null);
      if ((movesB.length === 0 &amp;&amp; movesW.length === 0) || full) {
        const { black, white } = countDiscs();
        let result = &quot;&quot;;
        if (black &gt; white) result = &quot;Ви перемогли!&quot;;
        else if (white &gt; black) result = &quot;Комп’ютер переміг!&quot;;
        else result = &quot;Нічия!&quot;;
        alert(`${result}\nЧорних: ${black}\nБілих: ${white}`);
        gameOver = true;
      }
    }

    function checkTurn() {
      if (gameOver) return;
      let moves = getValidMoves(current);
      if (moves.length === 0) {
        current = current === &quot;B&quot; ? &quot;W&quot; : &quot;B&quot;;
        document.getElementById(&quot;player&quot;).textContent =
          current === &quot;B&quot; ? &quot;Гравець (Чорний)&quot; : &quot;Комп&#039;ютер (Білий)&quot;;
        drawBoard();
        if (current === &quot;W&quot;) {
          setTimeout(computerMove, 500);
        }
      }
    }

    function computerMove() {
      if (gameOver) return;
      let moves = getValidMoves(&quot;W&quot;);
      if (moves.length &gt; 0) {
        let [x, y] = moves[0];
        flip(x, y, &quot;W&quot;);
        current = &quot;B&quot;;
        document.getElementById(&quot;player&quot;).textContent = &quot;Гравець (Чорний)&quot;;
        drawBoard();
        checkEndGame();
        checkTurn();
      } else {
        current = &quot;B&quot;;
        document.getElementById(&quot;player&quot;).textContent = &quot;Гравець (Чорний)&quot;;
        drawBoard();
        checkEndGame();
        checkTurn();
      }
    }

    canvas.addEventListener(&quot;click&quot;, e =&gt; {
      if (gameOver || current !== &quot;B&quot;) return;
      const x = Math.floor(e.offsetX / cell);
      const y = Math.floor(e.offsetY / cell);
      if (isValid(x, y, &quot;B&quot;)) {
        flip(x, y, &quot;B&quot;);
        current = &quot;W&quot;;
        document.getElementById(&quot;player&quot;).textContent = &quot;Комп&#039;ютер (Білий)&quot;;
        drawBoard();
        checkEndGame();
        setTimeout(computerMove, 500);
      } else {
        checkTurn();
      }
    });

    startNewGame();
  &lt;/script&gt;</description>
            </item>
                    <item>
                <title>реверсі 2</title>
                <link>http://margo.mozello.shop/blog-4-1/params/post/5144236/revers-2</link>
                <pubDate>Sat, 04 Oct 2025 19:29:00 +0000</pubDate>
                <description>шшшшшшшшшшшшшшшшшшшшшшш&lt;hr class=&quot;moze-more-divider&quot;&gt;&lt;p&gt;2&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;


  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;title&gt;Реверсі: Гравець vs Комп&#039;ютер&lt;/title&gt;
  &lt;style&gt;
    canvas { background: #0a0; display: block; margin: 20px auto; }
    body { text-align: center; font-family: sans-serif; }
  &lt;/style&gt;


  &lt;h1&gt;Гра Реверсі&lt;/h1&gt;
  &lt;canvas id=&quot;board&quot; width=&quot;320&quot; height=&quot;320&quot;&gt;&lt;/canvas&gt;
  &lt;p&gt;Поточний гравець: &lt;span id=&quot;player&quot;&gt;Гравець (Чорний)&lt;/span&gt;&lt;/p&gt;

  &lt;script&gt;
    const canvas = document.getElementById(&quot;board&quot;);
    const ctx = canvas.getContext(&quot;2d&quot;);
    const size = 8;
    const cell = canvas.width / size;
    let board = Array(size).fill().map(() =&gt; Array(size).fill(null));
    board[3][3] = board[4][4] = &quot;W&quot;;
    board[3][4] = board[4][3] = &quot;B&quot;;
    let current = &quot;B&quot;; // Гравець — чорний

    function drawBoard() {
      ctx.clearRect(0, 0, canvas.width, canvas.height);
      for (let x = 0; x &lt; size; x++) {
        for (let y = 0; y &lt; size; y++) {
          ctx.strokeRect(x * cell, y * cell, cell, cell);
          if (board[x][y]) {
            ctx.beginPath();
            ctx.arc(x * cell + cell / 2, y * cell + cell / 2, cell / 2 - 4, 0, Math.PI * 2);
            ctx.fillStyle = board[x][y] === &quot;B&quot; ? &quot;black&quot; : &quot;white&quot;;
            ctx.fill();
          }
        }
      }
    }

    function isValid(x, y, player) {
      if (board[x][y]) return false;
      const opp = player === &quot;B&quot; ? &quot;W&quot; : &quot;B&quot;;
      const dirs = [[-1,-1],[-1,0],[-1,1],[0,-1],[0,1],[1,-1],[1,0],[1,1]];
      for (let [dx, dy] of dirs) {
        let nx = x + dx, ny = y + dy, found = false;
        while (nx &gt;= 0 &amp;&amp; ny &gt;= 0 &amp;&amp; nx &lt; size &amp;&amp; ny &lt; size) {
          if (board[nx][ny] === opp) found = true;
          else if (board[nx][ny] === player &amp;&amp; found) return true;
          else break;
          nx += dx; ny += dy;
        }
      }
      return false;
    }

    function flip(x, y, player) {
      board[x][y] = player;
      const opp = player === &quot;B&quot; ? &quot;W&quot; : &quot;B&quot;;
      const dirs = [[-1,-1],[-1,0],[-1,1],[0,-1],[0,1],[1,-1],[1,0],[1,1]];
      for (let [dx, dy] of dirs) {
        let nx = x + dx, ny = y + dy, path = [];
        while (nx &gt;= 0 &amp;&amp; ny &gt;= 0 &amp;&amp; nx &lt; size &amp;&amp; ny &lt; size) {
          if (board[nx][ny] === opp) path.push([nx, ny]);
          else if (board[nx][ny] === player) {
            for (let [px, py] of path) board[px][py] = player;
            break;
          } else break;
          nx += dx; ny += dy;
        }
      }
    }

    function getValidMoves(player) {
      let moves = [];
      for (let x = 0; x &lt; size; x++) {
        for (let y = 0; y &lt; size; y++) {
          if (isValid(x, y, player)) moves.push([x, y]);
        }
      }
      return moves;
    }

    function computerMove() {
      let moves = getValidMoves(&quot;W&quot;);
      if (moves.length &gt; 0) {
        let [x, y] = moves[0]; // Проста стратегія: перший доступний хід
        flip(x, y, &quot;W&quot;);
        current = &quot;B&quot;;
        document.getElementById(&quot;player&quot;).textContent = &quot;Гравець (Чорний)&quot;;
        drawBoard();
      }
    }

    canvas.addEventListener(&quot;click&quot;, e =&gt; {
      if (current !== &quot;B&quot;) return;
      const x = Math.floor(e.offsetX / cell);
      const y = Math.floor(e.offsetY / cell);
      if (isValid(x, y, &quot;B&quot;)) {
        flip(x, y, &quot;B&quot;);
        current = &quot;W&quot;;
        document.getElementById(&quot;player&quot;).textContent = &quot;Комп&#039;ютер (Білий)&quot;;
        drawBoard();
        setTimeout(computerMove, 500); // Затримка для імітації роздумів
      }
    });

    drawBoard();
  &lt;/script&gt;</description>
            </item>
                    <item>
                <title>реверсі</title>
                <link>http://margo.mozello.shop/blog-4-1/params/post/5144232/revers</link>
                <pubDate>Sat, 04 Oct 2025 19:25:00 +0000</pubDate>
                <description>ооооооооооооооооооооооо&lt;hr class=&quot;moze-more-divider&quot;&gt;&lt;p&gt;1&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;


  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;title&gt;Гра Реверсі&lt;/title&gt;
  &lt;style&gt;
    canvas { background: #0a0; display: block; margin: 20px auto; }
    body { text-align: center; font-family: sans-serif; }
  &lt;/style&gt;


  &lt;h1&gt;Гра Реверсі&lt;/h1&gt;
  &lt;canvas id=&quot;board&quot; width=&quot;320&quot; height=&quot;320&quot;&gt;&lt;/canvas&gt;
  &lt;p&gt;Поточний гравець: &lt;span id=&quot;player&quot;&gt;Чорний&lt;/span&gt;&lt;/p&gt;

  &lt;script&gt;
    const canvas = document.getElementById(&quot;board&quot;);
    const ctx = canvas.getContext(&quot;2d&quot;);
    const size = 8;
    const cell = canvas.width / size;
    let board = Array(size).fill().map(() =&gt; Array(size).fill(null));
    board[3][3] = board[4][4] = &quot;W&quot;;
    board[3][4] = board[4][3] = &quot;B&quot;;
    let current = &quot;B&quot;;

    function drawBoard() {
      ctx.clearRect(0, 0, canvas.width, canvas.height);
      for (let x = 0; x &lt; size; x++) {
        for (let y = 0; y &lt; size; y++) {
          ctx.strokeRect(x * cell, y * cell, cell, cell);
          if (board[x][y]) {
            ctx.beginPath();
            ctx.arc(x * cell + cell / 2, y * cell + cell / 2, cell / 2 - 4, 0, Math.PI * 2);
            ctx.fillStyle = board[x][y] === &quot;B&quot; ? &quot;black&quot; : &quot;white&quot;;
            ctx.fill();
          }
        }
      }
    }

    function isValid(x, y, player) {
      if (board[x][y]) return false;
      const opp = player === &quot;B&quot; ? &quot;W&quot; : &quot;B&quot;;
      const dirs = [[-1,-1],[-1,0],[-1,1],[0,-1],[0,1],[1,-1],[1,0],[1,1]];
      for (let [dx, dy] of dirs) {
        let nx = x + dx, ny = y + dy, found = false;
        while (nx &gt;= 0 &amp;&amp; ny &gt;= 0 &amp;&amp; nx &lt; size &amp;&amp; ny &lt; size) {
          if (board[nx][ny] === opp) found = true;
          else if (board[nx][ny] === player &amp;&amp; found) return true;
          else break;
          nx += dx; ny += dy;
        }
      }
      return false;
    }

    function flip(x, y, player) {
      board[x][y] = player;
      const opp = player === &quot;B&quot; ? &quot;W&quot; : &quot;B&quot;;
      const dirs = [[-1,-1],[-1,0],[-1,1],[0,-1],[0,1],[1,-1],[1,0],[1,1]];
      for (let [dx, dy] of dirs) {
        let nx = x + dx, ny = y + dy, path = [];
        while (nx &gt;= 0 &amp;&amp; ny &gt;= 0 &amp;&amp; nx &lt; size &amp;&amp; ny &lt; size) {
          if (board[nx][ny] === opp) path.push([nx, ny]);
          else if (board[nx][ny] === player) {
            for (let [px, py] of path) board[px][py] = player;
            break;
          } else break;
          nx += dx; ny += dy;
        }
      }
    }

    canvas.addEventListener(&quot;click&quot;, e =&gt; {
      const x = Math.floor(e.offsetX / cell);
      const y = Math.floor(e.offsetY / cell);
      if (isValid(x, y, current)) {
        flip(x, y, current);
        current = current === &quot;B&quot; ? &quot;W&quot; : &quot;B&quot;;
        document.getElementById(&quot;player&quot;).textContent = current === &quot;B&quot; ? &quot;Чорний&quot; : &quot;Білий&quot;;
        drawBoard();
      }
    });

    drawBoard();
  &lt;/script&gt;</description>
            </item>
                    <item>
                <title>Перша новина</title>
                <link>http://margo.mozello.shop/blog-4-1/params/post/5141477/persha-novina</link>
                <pubDate>Thu, 02 Oct 2025 12:19:00 +0000</pubDate>
                <description>&lt;p&gt;Це демо-текст, щоб продемонструвати як буде виглядати повідомлення в блозі. Видаліть
  цей пост і додайте свої власні повідомлення.&lt;/p&gt;
&lt;hr class=&quot;moze-more-divider&quot;&gt;
&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh
  euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim
  ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl
  ut aliquip ex ea commodo consequat.&lt;/p&gt;
&lt;p&gt;7&lt;/p&gt;




  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no&quot;&gt;
  &lt;title&gt;Мозаїка Майстрів — Версія 1.9 (Планшетна адаптація)&lt;/title&gt;
  &lt;style&gt;
    body {
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: flex-start;
            min-height: 100vh;
            margin: 0;
            padding: 10px;
            background-color: #f0f0f0;
            font-family: Arial, sans-serif;
            overflow-x: hidden;
        }
        #gameContainer {
            position: relative;
            display: flex;
            justify-content: center;
            align-items: flex-start;
            width: 100%;
            max-width: 800px;
        }
        #gameCanvas {
            border: 2px solid #333;
            background-color: #e3f1c6;
            width: 250px;
            height: 250px;
            margin: 10px;
        }
        #nextBlocks {
            display: flex;
            flex-direction: column;
            align-items: center;
            margin: 10px;
            gap: 5px;
        }
        .blockCanvas {
            border: 1px solid #ccc;
            cursor: grab;
            width: 60px;
            height: 60px;
        }
        .blockCanvas.dragging {
            opacity: 0.5;
            cursor: grabbing;
        }
        #score, #highScore {
            font-size: 20px;
            margin: 10px;
        }
        #bonusMessage {
            display: none;
            position: fixed;
            top: 20%;
            left: 50%;
            transform: translateX(-50%);
            background-color: rgba(0, 128, 0, 0.8);
            color: white;
            padding: 10px 20px;
            border-radius: 5px;
            z-index: 1000;
            font-size: 18px;
        }
        #gameOver, #pauseOverlay {
            display: none;
            position: fixed;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            background-color: rgba(0, 0, 0, 0.8);
            color: white;
            padding: 15px;
            border-radius: 10px;
            text-align: center;
            z-index: 1000;
        }
        button {
            margin: 5px;
            padding: 8px 16px;
            font-size: 14px;
            cursor: pointer;
            background-color: #4CAF50;
            color: white;
            border: none;
            border-radius: 5px;
        }
        #controlPanel {
            position: absolute;
            right: 10px;
            top: 50%;
            transform: translateY(-50%);
            display: flex;
            flex-direction: column;
            gap: 5px;
        }
        #rotateButtons {
            display: flex;
            flex-direction: column;
            gap: 5px;
        }
        #rotateButtons button {
            padding: 5px 10px;
            font-size: 12px;
        }
        h2 {
            margin: 10px 0;
            font-size: 24px;
        }
        p {
            margin: 5px 0;
            font-size: 16px;
        }
        .accordion {
            width: 100%;
            max-width: 500px;
            margin-top: 20px;
        }
        .accordion-item {
            border: 1px solid #333;
            margin-bottom: 5px;
            border-radius: 5px;
        }
        .accordion-header {
            background-color: #ddd;
            padding: 10px;
            cursor: pointer;
            font-size: 18px;
            font-weight: bold;
            display: flex;
            justify-content: space-between;
            align-items: center;
        }
        .accordion-header::after {
            content: &#039;▼&#039;;
            font-size: 14px;
        }
        .accordion-header.active::after {
            content: &#039;▲&#039;;
        }
        .accordion-content {
            display: none;
            padding: 10px;
            background-color: #fff;
        }
        .accordion-content.active {
            display: block;
        }
        .accordion-content table {
            width: 100%;
            border-collapse: collapse;
            margin-bottom: 15px;
        }
        .accordion-content th, .accordion-content td {
            border: 1px solid #333;
            padding: 8px;
            text-align: center;
        }
        .accordion-content th {
            background-color: #ddd;
        }
        .accordion-content pre {
            margin: 0;
            font-size: 12px;
        }
        .accordion-content canvas {
            border: 1px solid #ccc;
        }
        @media (min-width: 600px) {
            #gameCanvas {
                width: 300px;
                height: 300px;
            }
            .blockCanvas {
                width: 70px;
                height: 70px;
            }
            #controlPanel {
                right: 20px;
            }
            #rotateButtons button {
                font-size: 14px;
            }
        }
  &lt;/style&gt;



  &lt;h2&gt;Мозаїка Майстрів — Версія 1.9 (Планшетна адаптація)&lt;/h2&gt;
  &lt;p&gt;Права кнопка миші — поворот блоку на 90°, Жест двома пальцями — поворот на кут,
    Кнопка &quot;Скасувати&quot; — скасування ходу&lt;/p&gt;
  &lt;div id=&quot;gameContainer&quot;&gt;
    &lt;canvas id=&quot;gameCanvas&quot; width=&quot;250&quot; height=&quot;250&quot;&gt;&lt;/canvas&gt;
    &lt;div id=&quot;controlPanel&quot;&gt;
      &lt;button id=&quot;pauseButton&quot; fdprocessedid=&quot;imgj4r&quot;&gt;Пауза&lt;/button&gt;
      &lt;button id=&quot;undoButton&quot; disabled=&quot;&quot;&gt;Скасувати&lt;/button&gt;
      &lt;div id=&quot;rotateButtons&quot;&gt;
        &lt;button onclick=&quot;rotateSelectedBlock(90)&quot;&gt;90°&lt;/button&gt;
        &lt;button onclick=&quot;rotateSelectedBlock(180)&quot;&gt;180°&lt;/button&gt;
        &lt;button onclick=&quot;rotateSelectedBlock(270)&quot;&gt;270°&lt;/button&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div id=&quot;nextBlocks&quot;&gt;
    &lt;canvas id=&quot;block1&quot; class=&quot;blockCanvas&quot; width=&quot;60&quot; height=&quot;60&quot; draggable=&quot;true&quot;&gt;&lt;/canvas&gt;
    &lt;canvas id=&quot;block2&quot; class=&quot;blockCanvas&quot; width=&quot;60&quot; height=&quot;60&quot; draggable=&quot;true&quot;&gt;&lt;/canvas&gt;
    &lt;canvas id=&quot;block3&quot; class=&quot;blockCanvas&quot; width=&quot;60&quot; height=&quot;60&quot; draggable=&quot;true&quot;&gt;&lt;/canvas&gt;
  &lt;/div&gt;
  &lt;div id=&quot;score&quot;&gt;Очки: 0&lt;/div&gt;
  &lt;div id=&quot;highScore&quot;&gt;Рекорд: 0&lt;/div&gt;
  &lt;div id=&quot;bonusMessage&quot;&gt;&lt;/div&gt;
  &lt;div id=&quot;gameOver&quot;&gt;
    &lt;h2&gt;Гра закінчена!&lt;/h2&gt;
    &lt;p id=&quot;finalScore&quot;&gt;&lt;/p&gt;
    &lt;button onclick=&quot;restartGame()&quot;&gt;Грати знову&lt;/button&gt;
  &lt;/div&gt;
  &lt;div id=&quot;pauseOverlay&quot;&gt;
    &lt;h2&gt;Гра на паузі&lt;/h2&gt;
    &lt;button onclick=&quot;togglePause()&quot;&gt;Відновити&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&quot;accordion&quot;&gt;
    &lt;div class=&quot;accordion-item&quot;&gt;
      &lt;div class=&quot;accordion-header&quot; onclick=&quot;toggleAccordion(this)&quot;&gt;Таблиця блоків&lt;/div&gt;
      &lt;div class=&quot;accordion-content&quot;&gt;
        &lt;table&gt;
          &lt;thead&gt;
            &lt;tr&gt;
              &lt;th&gt;Назва&lt;/th&gt;
              &lt;th&gt;Зображення&lt;/th&gt;
              &lt;th&gt;Структура&lt;/th&gt;
              &lt;th&gt;Використання&lt;/th&gt;
            &lt;/tr&gt;
          &lt;/thead&gt;
          &lt;tbody&gt;
            &lt;tr&gt;
              &lt;td&gt;Одинарний&lt;/td&gt;
              &lt;td&gt;
                &lt;canvas id=&quot;shapeSingle&quot; width=&quot;60&quot; height=&quot;60&quot;&gt;&lt;/canvas&gt;
              &lt;/td&gt;
              &lt;td&gt;
                &lt;pre&gt;[[1]]&lt;/pre&gt;
              &lt;/td&gt;
              &lt;td&gt;Для заповнення окремих клітинок&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
              &lt;td&gt;L-форма&lt;/td&gt;
              &lt;td&gt;
                &lt;canvas id=&quot;shapeL&quot; width=&quot;60&quot; height=&quot;60&quot;&gt;&lt;/canvas&gt;
              &lt;/td&gt;
              &lt;td&gt;
                &lt;pre&gt;[[1, 1],
                  &lt;br&gt;[1, 0]]&lt;/pre&gt;
              &lt;/td&gt;
              &lt;td&gt;Для кутів або вузьких просторів&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
              &lt;td&gt;T-форма&lt;/td&gt;
              &lt;td&gt;
                &lt;canvas id=&quot;shapeT&quot; width=&quot;60&quot; height=&quot;60&quot;&gt;&lt;/canvas&gt;
              &lt;/td&gt;
              &lt;td&gt;
                &lt;pre&gt;[[1, 1, 1],
                  &lt;br&gt;[0, 1, 0]]&lt;/pre&gt;
              &lt;/td&gt;
              &lt;td&gt;Для горизонтальних ліній з виступом&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
              &lt;td&gt;I-форма (4)&lt;/td&gt;
              &lt;td&gt;
                &lt;canvas id=&quot;shapeI4&quot; width=&quot;60&quot; height=&quot;60&quot;&gt;&lt;/canvas&gt;
              &lt;/td&gt;
              &lt;td&gt;
                &lt;pre&gt;[[1, 1, 1, 1]]&lt;/pre&gt;
              &lt;/td&gt;
              &lt;td&gt;Для заповнення рядків/стовпців&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
              &lt;td&gt;Квадрат&lt;/td&gt;
              &lt;td&gt;
                &lt;canvas id=&quot;shapeSquare&quot; width=&quot;60&quot; height=&quot;60&quot;&gt;&lt;/canvas&gt;
              &lt;/td&gt;
              &lt;td&gt;
                &lt;pre&gt;[[1, 1],
                  &lt;br&gt;[1, 1]]&lt;/pre&gt;
              &lt;/td&gt;
              &lt;td&gt;Для компактних квадратних просторів&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
              &lt;td&gt;Z-форма&lt;/td&gt;
              &lt;td&gt;
                &lt;canvas id=&quot;shapeZ&quot; width=&quot;60&quot; height=&quot;60&quot;&gt;&lt;/canvas&gt;
              &lt;/td&gt;
              &lt;td&gt;
                &lt;pre&gt;[[1, 1, 0],
                  &lt;br&gt;[0, 1, 1]]&lt;/pre&gt;
              &lt;/td&gt;
              &lt;td&gt;Для зміщених &quot;змійок&quot;&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
              &lt;td&gt;I-форма (5)&lt;/td&gt;
              &lt;td&gt;
                &lt;canvas id=&quot;shapeI5&quot; width=&quot;60&quot; height=&quot;60&quot;&gt;&lt;/canvas&gt;
              &lt;/td&gt;
              &lt;td&gt;
                &lt;pre&gt;[[1, 1, 1, 1, 1]]&lt;/pre&gt;
              &lt;/td&gt;
              &lt;td&gt;Для довгих рядків/стовпців&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
              &lt;td&gt;I-форма (3)&lt;/td&gt;
              &lt;td&gt;
                &lt;canvas id=&quot;shapeI3&quot; width=&quot;60&quot; height=&quot;60&quot;&gt;&lt;/canvas&gt;
              &lt;/td&gt;
              &lt;td&gt;
                &lt;pre&gt;[[1, 1, 1]]&lt;/pre&gt;
              &lt;/td&gt;
              &lt;td&gt;Для середніх рядків/стовпців&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
              &lt;td&gt;I-форма (2)&lt;/td&gt;
              &lt;td&gt;
                &lt;canvas id=&quot;shapeI2&quot; width=&quot;60&quot; height=&quot;60&quot;&gt;&lt;/canvas&gt;
              &lt;/td&gt;
              &lt;td&gt;
                &lt;pre&gt;[[1, 1]]&lt;/pre&gt;
              &lt;/td&gt;
              &lt;td&gt;Для коротких рядків/стовпців&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
              &lt;td&gt;Діагональ 2x2&lt;/td&gt;
              &lt;td&gt;
                &lt;canvas id=&quot;shapeDiagonal2&quot; width=&quot;60&quot; height=&quot;60&quot;&gt;&lt;/canvas&gt;
              &lt;/td&gt;
              &lt;td&gt;
                &lt;pre&gt;[[1, 0],
                  &lt;br&gt;[0, 1]]&lt;/pre&gt;
              &lt;/td&gt;
              &lt;td&gt;Для заповнення діагональних просторів&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
              &lt;td&gt;Діагональ 3x3&lt;/td&gt;
              &lt;td&gt;
                &lt;canvas id=&quot;shapeDiagonal3&quot; width=&quot;60&quot; height=&quot;60&quot;&gt;&lt;/canvas&gt;
              &lt;/td&gt;
              &lt;td&gt;
                &lt;pre&gt;[[1, 0, 0],
                  &lt;br&gt;[0, 1, 0],
                  &lt;br&gt;[0, 0, 1]]&lt;/pre&gt;
              &lt;/td&gt;
              &lt;td&gt;Для довгих діагональних ліній&lt;/td&gt;
            &lt;/tr&gt;
          &lt;/tbody&gt;
        &lt;/table&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class=&quot;accordion-item&quot;&gt;
      &lt;div class=&quot;accordion-header&quot; onclick=&quot;toggleAccordion(this)&quot;&gt;Інструкція&lt;/div&gt;
      &lt;div class=&quot;accordion-content&quot;&gt;
        &lt;h3&gt;Мета гри&lt;/h3&gt;
        &lt;p&gt;&quot;Мозаїка Майстрів&quot; — це головоломка, де гравець розміщує блоки на сітці
          10x10, щоб очищати цілі рядки або стовпці. Мета — набрати якомога більше
          очок і встановити рекорд. Гра закінчується, коли жоден блок не можна
          розмістити.&lt;/p&gt;

        &lt;h3&gt;Правила гри&lt;/h3&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;b&gt;Ігрове поле&lt;/b&gt;: Сітка 10x10, де клітинки можуть бути порожніми або
            заповненими.&lt;/li&gt;
          &lt;li&gt;&lt;b&gt;Черга блоків&lt;/b&gt;: До трьох блоків відображаються знизу для розміщення.&lt;/li&gt;
          &lt;li&gt;&lt;b&gt;Розміщення&lt;/b&gt;: Перетягуйте блоки на сітку. Розміщення можливе лише
            у вільних місцях.&lt;/li&gt;
          &lt;li&gt;&lt;b&gt;Очищення ліній&lt;/b&gt;:
            &lt;ul&gt;
              &lt;li&gt;Повний рядок або стовпець очищається.&lt;/li&gt;
              &lt;li&gt;1 лінія: 100 очок.&lt;/li&gt;
              &lt;li&gt;2+ ліній: 100 + 50 за кожну додаткову (наприклад, 2 лінії = 150 очок).&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;&lt;b&gt;Бонус за очищення поля&lt;/b&gt;: 25% від суми очок, якщо поле порожнє.&lt;/li&gt;
          &lt;li&gt;&lt;b&gt;Рекорд&lt;/b&gt;: Зберігається у браузері, відображається під час гри та
            після завершення.&lt;/li&gt;
          &lt;li&gt;&lt;b&gt;Кінець гри&lt;/b&gt;: Гра закінчується, якщо блоки неможливо розмістити.&lt;/li&gt;
        &lt;/ul&gt;

        &lt;h3&gt;Дії гравця&lt;/h3&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;b&gt;Перетягування&lt;/b&gt;:
            &lt;ul&gt;
              &lt;li&gt;Сенсорні пристрої: Торкніться та перетягніть.&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;&lt;b&gt;Поворот&lt;/b&gt;: Кнопки 90°/180°/270° або жест двома пальцями.&lt;/li&gt;
          &lt;li&gt;&lt;b&gt;Скасування ходу&lt;/b&gt;: Кнопка &quot;Скасувати&quot; для останнього ходу.&lt;/li&gt;
          &lt;li&gt;&lt;b&gt;Пауза&lt;/b&gt;: Кнопка &quot;Пауза&quot;/&quot;Відновити&quot;.&lt;/li&gt;
          &lt;li&gt;&lt;b&gt;Перезапуск&lt;/b&gt;: Кнопка &quot;Грати знову&quot; на екрані &quot;Гра закінчена&quot;.&lt;/li&gt;
        &lt;/ul&gt;

        &lt;h3&gt;Поради&lt;/h3&gt;
        &lt;ul&gt;
          &lt;li&gt;Плануйте ходи, щоб створювати повні лінії.&lt;/li&gt;
          &lt;li&gt;Використовуйте одинарний блок для прогалин.&lt;/li&gt;
          &lt;li&gt;Скасовуйте невдалі ходи.&lt;/li&gt;
          &lt;li&gt;Намагайтеся очищати кілька ліній для бонусів.&lt;/li&gt;
          &lt;li&gt;Експериментуйте з діагональними блоками для унікальних комбінацій.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;script&gt;
    // Акордеон-меню
        function toggleAccordion(header) {
            const content = header.nextElementSibling;
            const isActive = content.classList.contains(&#039;active&#039;);
            document.querySelectorAll(&#039;.accordion-content&#039;).forEach(item =&gt; {
                item.classList.remove(&#039;active&#039;);
                item.previousElementSibling.classList.remove(&#039;active&#039;);
            });
            if (!isActive) {
                content.classList.add(&#039;active&#039;);
                header.classList.add(&#039;active&#039;);
            }
        }

        // Ігрова логіка
        const gameCanvas = document.getElementById(&#039;gameCanvas&#039;);
        const ctx = gameCanvas.getContext(&#039;2d&#039;);
        const gridSize = 10;
        const cellSize = gameCanvas.width / gridSize; // 25px або 30px на планшеті
        const scoreElement = document.getElementById(&#039;score&#039;);
        const highScoreElement = document.getElementById(&#039;highScore&#039;);
        const bonusMessageElement = document.getElementById(&#039;bonusMessage&#039;);
        const gameOverElement = document.getElementById(&#039;gameOver&#039;);
        const finalScoreElement = document.getElementById(&#039;finalScore&#039;);
        const pauseButton = document.getElementById(&#039;pauseButton&#039;);
        const undoButton = document.getElementById(&#039;undoButton&#039;);
        const pauseOverlay = document.getElementById(&#039;pauseOverlay&#039;);

        let grid = Array(gridSize).fill().map(() =&gt; Array(gridSize).fill(null));
        let score = 0;
        let highScore = parseInt(localStorage.getItem(&#039;blockLegendHighScore&#039;)) || 0;
        let currentBlocks = [];
        let selectedBlock = null;
        let selectedBlockIndex = -1;
        let gameActive = true;
        let gamePaused = false;
        let lastMove = null;

        highScoreElement.textContent = `Рекорд: ${highScore}`;
        console.log(&#039;Завантажено рекорд:&#039;, highScore);

        const blockShapes = [
            [[1]], // Одинарний
            [[1, 1], [1, 0]], // L-форма
            [[1, 1, 1], [0, 1, 0]], // T-форма
            [[1, 1, 1, 1]], // I-форма (4)
            [[1, 1], [1, 1]], // Квадрат
            [[1, 1, 0], [0, 1, 1]], // Z-форма
            [[1, 1, 1, 1, 1]], // I-форма (5)
            [[1, 1, 1]], // I-форма (3)
            [[1, 1]], // I-форма (2)
            [[1, 0], [0, 1]], // Діагональ 2x2
            [[1, 0, 0], [0, 1, 0], [0, 0, 1]] // Діагональ 3x3
        ];

        const colors = [&#039;#FF0000&#039;, &#039;#00FF00&#039;, &#039;#0000FF&#039;, &#039;#FFFF00&#039;, &#039;#FF00FF&#039;, &#039;#FFA500&#039;, &#039;#800080&#039;, &#039;#00FFFF&#039;, &#039;#FF4500&#039;, &#039;#2E8B57&#039;, &#039;#DAA520&#039;, &#039;#8A2BE2&#039;];

        // Малювання блоків у таблиці
        function drawTableBlock(canvasId, shape, color) {
            const canvas = document.getElementById(canvasId);
            const ctx = canvas.getContext(&#039;2d&#039;);
            ctx.clearRect(0, 0, canvas.width, canvas.height);
            const maxSize = Math.max(shape.length, shape[0].length);
            const blockCellSize = canvas.width / maxSize;
            shape.forEach((row, y) =&gt; {
                row.forEach((cell, x) =&gt; {
                    if (cell) {
                        ctx.fillStyle = color;
                        ctx.fillRect(x * blockCellSize + 2, y * blockCellSize + 2, blockCellSize - 4, blockCellSize - 4);
                        ctx.strokeStyle = &#039;#000&#039;;
                        ctx.strokeRect(x * blockCellSize + 2, y * blockCellSize + 2, blockCellSize - 4, blockCellSize - 4);
                    }
                });
            });
        }

        // Ініціалізація малюнків у таблиці
        drawTableBlock(&#039;shapeSingle&#039;, blockShapes[0], colors[0]);
        drawTableBlock(&#039;shapeL&#039;, blockShapes[1], colors[1]);
        drawTableBlock(&#039;shapeT&#039;, blockShapes[2], colors[2]);
        drawTableBlock(&#039;shapeI4&#039;, blockShapes[3], colors[3]);
        drawTableBlock(&#039;shapeSquare&#039;, blockShapes[4], colors[4]);
        drawTableBlock(&#039;shapeZ&#039;, blockShapes[5], colors[0]);
        drawTableBlock(&#039;shapeI5&#039;, blockShapes[6], colors[5]);
        drawTableBlock(&#039;shapeI3&#039;, blockShapes[7], colors[6]);
        drawTableBlock(&#039;shapeI2&#039;, blockShapes[8], colors[1]);
        drawTableBlock(&#039;shapeDiagonal2&#039;, blockShapes[9], colors[10]);
        drawTableBlock(&#039;shapeDiagonal3&#039;, blockShapes[10], colors[11]);

        function showBonusMessage(message) {
            bonusMessageElement.textContent = message;
            bonusMessageElement.style.display = &#039;block&#039;;
            setTimeout(() =&gt; bonusMessageElement.style.display = &#039;none&#039;, 2000);
        }

        function drawGrid() {
            ctx.clearRect(0, 0, gameCanvas.width, gameCanvas.height);
            for (let y = 0; y &lt; gridSize; y++) {
                for (let x = 0; x &lt; gridSize; x++) {
                    ctx.strokeStyle = &#039;#000&#039;;
                    ctx.strokeRect(x * cellSize, y * cellSize, cellSize, cellSize);
                    if (grid[y][x]) {
                        ctx.fillStyle = grid[y][x];
                        ctx.fillRect(x * cellSize + 2, y * cellSize + 2, cellSize - 4, cellSize - 4);
                    }
                }
            }
        }

        function drawPreview(shape, x, y, valid) {
            drawGrid();
            if (shape &amp;&amp; x &gt;= 0 &amp;&amp; y &gt;= 0) {
                ctx.globalAlpha = 0.5;
                for (let sy = 0; sy &lt; shape.length; sy++) {
                    for (let sx = 0; sx &lt; shape[sy].length; sx++) {
                        if (shape[sy][sx]) {
                            ctx.fillStyle = valid ? selectedBlock.color : &#039;#FF0000&#039;;
                            ctx.fillRect((x + sx) * cellSize + 2, (y + sy) * cellSize + 2, cellSize - 4, cellSize - 4);
                            ctx.strokeStyle = &#039;#000&#039;;
                            ctx.strokeRect((x + sx) * cellSize + 2, (y + sy) * cellSize + 2, cellSize - 4, cellSize - 4);
                        }
                    }
                }
                ctx.globalAlpha = 1.0;
            }
        }

        function canPlaceBlock(shape, x, y) {
            for (let sy = 0; sy &lt; shape.length; sy++) {
                for (let sx = 0; sx &lt; shape[sy].length; sx++) {
                    if (shape[sy][sx]) {
                        const gridX = x + sx;
                        const gridY = y + sy;
                        if (gridX &lt; 0 || gridX &gt;= gridSize || gridY &lt; 0 || gridY &gt;= gridSize || grid[gridY][gridX]) {
                            return false;
                        }
                    }
                }
            }
            return true;
        }

        function placeBlock(shape, color, x, y, blockIndex) {
            console.log(`Розміщення блоку на позиції (${x}, ${y}), індекс: ${blockIndex}, форма:`, JSON.stringify(shape));
            lastMove = {
                grid: grid.map(row =&gt; [...row]),
                score,
                block: { shape, color },
                blockIndex
            };
            undoButton.disabled = false;
            for (let sy = 0; sy &lt; shape.length; sy++) {
                for (let sx = 0; sx &lt; shape[sy].length; sx++) {
                    if (shape[sy][sx]) {
                        grid[y + sy][x + sx] = color;
                    }
                }
            }
            console.log(&#039;Блок розміщено, викликаємо checkLines&#039;);
            checkLines();
            console.log(&#039;checkLines завершено, викликаємо checkGameOver&#039;);
            checkGameOver();
            drawGrid();
            console.log(&#039;Розміщення завершено, поточна черга:&#039;, JSON.stringify(currentBlocks.map(b =&gt; ({ shape: b.shape, color: b.color }))));
        }

        function checkLines() {
            let linesCleared = 0;
            for (let y = gridSize - 1; y &gt;= 0; y--) {
                if (grid[y].every(cell =&gt; cell)) {
                    grid.splice(y, 1);
                    grid.unshift(Array(gridSize).fill(null));
                    linesCleared++;
                    y++;
                }
            }
            for (let x = gridSize - 1; x &gt;= 0; x--) {
                let isFull = true;
                for (let y = 0; y &lt; gridSize; y++) {
                    if (!grid[y][x]) {
                        isFull = false;
                        break;
                    }
                }
                if (isFull) {
                    for (let y = 0; y &lt; gridSize; y++) {
                        grid[y].splice(x, 1);
                        grid[y].push(null);
                    }
                    linesCleared++;
                    x++;
                }
            }
            if (linesCleared &gt; 0) {
                let lineBonus = linesCleared === 1 ? 100 : 100 + (linesCleared - 1) * 50;
                score += lineBonus;
                if (linesCleared &gt; 1) {
                    showBonusMessage(`Бонус за ${linesCleared} лінії: +${lineBonus} очок`);
                    console.log(`Бонус за очищення ${linesCleared} ліній: +${lineBonus} очок`);
                }
                const isGridEmpty = grid.every(row =&gt; row.every(cell =&gt; !cell));
                if (isGridEmpty &amp;&amp; score &gt; 0) {
                    const clearBonus = Math.floor(score * 0.25);
                    score += clearBonus;
                    showBonusMessage(`Бонус за повне очищення поля: +${clearBonus} очок`);
                    console.log(`Бонус за повне очищення поля: +${clearBonus} очок`);
                }
                scoreElement.textContent = `Очки: ${score}`;
                if (score &gt; highScore) {
                    highScore = score;
                    localStorage.setItem(&#039;blockLegendHighScore&#039;, highScore);
                    highScoreElement.textContent = `Рекорд: ${highScore}`;
                    console.log(&#039;Новий рекорд:&#039;, highScore);
                }
            }
            console.log(&#039;Очищено ліній:&#039;, linesCleared, &#039;Очки:&#039;, score, &#039;Рекорд:&#039;, highScore);
        }

        function checkGameOver() {
            console.log(&#039;Перевірка стану гри. Кількість блоків:&#039;, currentBlocks.length, &#039;Блоки:&#039;, JSON.stringify(currentBlocks.map(b =&gt; ({ shape: b.shape, color: b.color }))));
            if (currentBlocks.length === 0) {
                console.log(&#039;Черга порожня, генеруємо нові блоки&#039;);
                setTimeout(() =&gt; {
                    generateBlocks();
                    console.log(&#039;Нові блоки згенеровано, нова черга:&#039;, JSON.stringify(currentBlocks.map(b =&gt; ({ shape: b.shape, color: b.color }))));
                }, 0);
                return;
            }
            let canPlaceAny = false;
            for (let block of currentBlocks) {
                for (let y = 0; y &lt; gridSize; y++) {
                    for (let x = 0; x &lt; gridSize; x++) {
                        if (canPlaceBlock(block.shape, x, y)) {
                            canPlaceAny = true;
                            break;
                        }
                    }
                    if (canPlaceAny) break;
                }
                if (canPlaceAny) break;
            }
            console.log(&#039;Чи можна розмістити блок:&#039;, canPlaceAny);
            if (!canPlaceAny) {
                gameActive = false;
                if (score &gt; highScore) {
                    highScore = score;
                    localStorage.setItem(&#039;blockLegendHighScore&#039;, highScore);
                    console.log(&#039;Новий рекорд на кінці гри:&#039;, highScore);
                }
                finalScoreElement.textContent = `Ваш рахунок: ${score}\nРекорд: ${highScore}`;
                gameOverElement.style.display = &#039;block&#039;;
                console.log(&#039;Гра закінчена. Рахунок:&#039;, score, &#039;Рекорд:&#039;, highScore);
            }
        }

        function restartGame() {
            grid = Array(gridSize).fill().map(() =&gt; Array(gridSize).fill(null));
            score = 0;
            scoreElement.textContent = `Очки: ${score}`;
            highScoreElement.textContent = `Рекорд: ${highScore}`;
            gameOverElement.style.display = &#039;none&#039;;
            gamePaused = false;
            pauseButton.textContent = &#039;Пауза&#039;;
            pauseOverlay.style.display = &#039;none&#039;;
            undoButton.disabled = true;
            lastMove = null;
            gameActive = true;
            currentBlocks = [];
            generateBlocks();
            drawGrid();
            console.log(&#039;Гра перезапущена. Рахунок:&#039;, score, &#039;Рекорд:&#039;, highScore);
        }

        function togglePause() {
            if (!gameActive) return;
            gamePaused = !gamePaused;
            pauseButton.textContent = gamePaused ? &#039;Відновити&#039; : &#039;Пауза&#039;;
            pauseOverlay.style.display = gamePaused ? &#039;block&#039; : &#039;none&#039;;
            console.log(&#039;Гра на паузі:&#039;, gamePaused);
        }

        pauseButton.addEventListener(&#039;click&#039;, togglePause);
        undoButton.addEventListener(&#039;click&#039;, undoMove);

        const blockCanvases = document.querySelectorAll(&#039;.blockCanvas&#039;);
        let touchStart = { x1: 0, y1: 0, x2: 0, y2: 0, time: 0 };

        blockCanvases.forEach(canvas =&gt; {
            canvas.addEventListener(&#039;dragstart&#039;, (e) =&gt; {
                if (!gameActive || gamePaused) return;
                const index = parseInt(canvas.id.replace(&#039;block&#039;, &#039;&#039;)) - 1;
                selectedBlock = currentBlocks[index];
                selectedBlockIndex = index;
                canvas.classList.add(&#039;dragging&#039;);
                e.dataTransfer.setData(&#039;text/plain&#039;, index);
                console.log(&#039;Початок перетягування блоку:&#039;, index, &#039;Блок:&#039;, JSON.stringify(selectedBlock));
            });

            canvas.addEventListener(&#039;dragend&#039;, (e) =&gt; {
                canvas.classList.remove(&#039;dragging&#039;);
                selectedBlock = null;
                selectedBlockIndex = -1;
                drawGrid();
                console.log(&#039;Кінець перетягування&#039;);
            });

            canvas.addEventListener(&#039;contextmenu&#039;, (e) =&gt; {
                e.preventDefault();
                if (!gameActive || gamePaused) return;
                const index = parseInt(canvas.id.replace(&#039;block&#039;, &#039;&#039;)) - 1;
                rotateSelectedBlock(90, index);
                drawBlock(index, currentBlocks[index].shape, currentBlocks[index].color);
                console.log(&#039;Блок повернуто на 90°:&#039;, index, &#039;Нова форма:&#039;, JSON.stringify(currentBlocks[index].shape));
            });

            canvas.addEventListener(&#039;touchstart&#039;, (e) =&gt; {
                if (!gameActive || gamePaused || e.touches.length &lt; 1) return;
                const index = parseInt(canvas.id.replace(&#039;block&#039;, &#039;&#039;)) - 1;
                selectedBlock = currentBlocks[index];
                selectedBlockIndex = index;
                canvas.classList.add(&#039;dragging&#039;);
                if (e.touches.length === 1) {
                    touchStart = { x1: e.touches[0].clientX, y1: e.touches[0].clientY, time: Date.now() };
                } else if (e.touches.length === 2) {
                    touchStart = { x1: e.touches[0].clientX, y1: e.touches[0].clientY, x2: e.touches[1].clientX, y2: e.touches[1].clientY, time: Date.now() };
                }
                console.log(&#039;Початок сенсорного перетягування/ротації блоку:&#039;, index, &#039;Блок:&#039;, JSON.stringify(selectedBlock));
            });

            canvas.addEventListener(&#039;touchmove&#039;, (e) =&gt; {
                e.preventDefault();
                if (!gameActive || gamePaused || e.touches.length !== 2 || selectedBlockIndex === -1) return;
                const touch1 = e.touches[0];
                const touch2 = e.touches[1];
                const dx = touch2.clientX - touch1.clientX;
                const dy = touch2.clientY - touch1.clientY;
                const startDx = touchStart.x2 - touchStart.x1;
                const startDy = touchStart.y2 - touchStart.y1;
                let angle = Math.atan2(dy, dx) - Math.atan2(startDy, startDy);
                angle = Math.round(degrees(angle) / 90) * 90; // Округлення до найближчих 90°
                rotateSelectedBlock(angle, selectedBlockIndex);
                drawBlock(selectedBlockIndex, currentBlocks[selectedBlockIndex].shape, currentBlocks[selectedBlockIndex].color);
                touchStart = { x1: touch1.clientX, y1: touch1.clientY, x2: touch2.clientX, y2: touch2.clientY, time: Date.now() };
            });

            canvas.addEventListener(&#039;touchend&#039;, (e) =&gt; {
                if (!gameActive || !selectedBlock || gamePaused) return;
                const touch = e.changedTouches[0];
                const rect = gameCanvas.getBoundingClientRect();
                const x = Math.floor((touch.clientX - rect.left) / cellSize);
                const y = Math.floor((touch.clientY - rect.top) / cellSize);
                console.log(`Сенсорне розміщення: координати (${x}, ${y}), індекс: ${selectedBlockIndex}, блок:`, JSON.stringify(selectedBlock));
                if (selectedBlockIndex &gt;= 0 &amp;&amp; selectedBlockIndex &lt; currentBlocks.length) {
                    if (canPlaceBlock(selectedBlock.shape, x, y)) {
                        placeBlock(selectedBlock.shape, selectedBlock.color, x, y, selectedBlockIndex);
                        currentBlocks.splice(selectedBlockIndex, 1);
                        console.log(&#039;Блок видалено з черги. Залишилося:&#039;, currentBlocks.length);
                        for (let i = 0; i &lt; 3; i++) {
                            const blockCanvas = document.getElementById(`block${i + 1}`);
                            blockCanvas.getContext(&#039;2d&#039;).clearRect(0, 0, blockCanvas.width, blockCanvas.height);
                            if (i &lt; currentBlocks.length) {
                                drawBlock(i, currentBlocks[i].shape, currentBlocks[i].color);
                            }
                        }
                        checkGameOver();
                        selectedBlock = null;
                        selectedBlockIndex = -1;
                    } else {
                        console.log(&#039;Неможливо розмістити блок на позиції:&#039;, x, y);
                    }
                }
                canvas.classList.remove(&#039;dragging&#039;);
                drawGrid();
                console.log(&#039;Сенсорне розміщення завершено&#039;);
                touchStart = null;
            });

            canvas.addEventListener(&#039;mousedown&#039;, (e) =&gt; {
                if (e.button === 1) {
                    e.preventDefault();
                    if (!gameActive || gamePaused) return;
                    const index = parseInt(canvas.id.replace(&#039;block&#039;, &#039;&#039;)) - 1;
                    currentBlocks[index].shape = flipShape(currentBlocks[index].shape);
                    drawBlock(index, currentBlocks[index].shape, currentBlocks[index].color);
                    console.log(&#039;Блок перевернуто (середня кнопка):&#039;, index, &#039;Нова форма:&#039;, JSON.stringify(currentBlocks[index].shape));
                }
            });
        });

        gameCanvas.addEventListener(&#039;dragover&#039;, (e) =&gt; {
            e.preventDefault();
            if (!gameActive || !selectedBlock || gamePaused) return;
            const rect = gameCanvas.getBoundingClientRect();
            const x = Math.floor((e.clientX - rect.left) / cellSize);
            const y = Math.floor((e.clientY - rect.top) / cellSize);
            const valid = canPlaceBlock(selectedBlock.shape, x, y);
            drawPreview(selectedBlock.shape, x, y, valid);
        });

        gameCanvas.addEventListener(&#039;drop&#039;, (e) =&gt; {
            e.preventDefault();
            if (!gameActive || !selectedBlock || gamePaused) return;
            const rect = gameCanvas.getBoundingClientRect();
            const x = Math.floor((e.clientX - rect.left) / cellSize);
            const y = Math.floor((e.clientY - rect.top) / cellSize);
            const index = parseInt(e.dataTransfer.getData(&#039;text/plain&#039;));
            console.log(`Розміщення через drag: координати (${x}, ${y}), індекс: ${index}, блок:`, JSON.stringify(selectedBlock));
            if (index &gt;= 0 &amp;&amp; index &lt; currentBlocks.length) {
                if (canPlaceBlock(selectedBlock.shape, x, y)) {
                    placeBlock(selectedBlock.shape, selectedBlock.color, x, y, index);
                    currentBlocks.splice(index, 1);
                    console.log(&#039;Блок видалено з черги. Залишилося:&#039;, currentBlocks.length);
                    for (let i = 0; i &lt; 3; i++) {
                        const blockCanvas = document.getElementById(`block${i + 1}`);
                        blockCanvas.getContext(&#039;2d&#039;).clearRect(0, 0, blockCanvas.width, blockCanvas.height);
                        if (i &lt; currentBlocks.length) {
                            drawBlock(i, currentBlocks[i].shape, currentBlocks[i].color);
                        }
                    }
                    checkGameOver();
                    selectedBlock = null;
                    selectedBlockIndex = -1;
                } else {
                    console.log(&#039;Неможливо розмістити блок на позиції:&#039;, x, y);
                }
            } else {
                console.error(&#039;Помилка: невалідний індекс блоку на drop&#039;, index);
            }
        });

        function generateBlocks() {
            currentBlocks = [];
            for (let i = 0; i &lt; 3; i++) {
                const shapeIndex = Math.floor(Math.random() * blockShapes.length);
                const colorIndex = Math.floor(Math.random() * colors.length);
                currentBlocks.push({ shape: blockShapes[shapeIndex], color: colors[colorIndex] });
                drawBlock(i, currentBlocks[i].shape, currentBlocks[i].color);
            }
        }

        function drawBlock(index, shape, color) {
            const canvas = document.getElementById(`block${index + 1}`);
            const blockCtx = canvas.getContext(&#039;2d&#039;);
            blockCtx.clearRect(0, 0, canvas.width, canvas.height);
            const maxSize = Math.max(shape.length, shape[0].length);
            const blockCellSize = canvas.width / maxSize;
            const offsetX = (canvas.width - maxSize * blockCellSize) / 2;
            const offsetY = (canvas.height - maxSize * blockCellSize) / 2;
            for (let y = 0; y &lt; shape.length; y++) {
                for (let x = 0; x &lt; shape[y].length; x++) {
                    if (shape[y][x]) {
                        blockCtx.fillStyle = color;
                        blockCtx.fillRect(offsetX + x * blockCellSize + 2, offsetY + y * blockCellSize + 2, blockCellSize - 4, blockCellSize - 4);
                        blockCtx.strokeStyle = &#039;#000&#039;;
                        blockCtx.strokeRect(offsetX + x * blockCellSize + 2, offsetY + y * blockCellSize + 2, blockCellSize - 4, blockCellSize - 4);
                    }
                }
            }
        }

        function rotateSelectedBlock(angle, index) {
            if (index === undefined || index &lt; 0 || index &gt;= currentBlocks.length) {
                console.error(&#039;Невірний індекс блоку для ротації:&#039;, index);
                return;
            }
            let shape = currentBlocks[index].shape;
            let newShape = Array(shape[0].length).fill().map(() =&gt; Array(shape.length).fill(0));
            for (let y = 0; y &lt; shape.length; y++) {
                for (let x = 0; x &lt; shape[y].length; x++) {
                    let newX, newY;
                    if (angle === 90) {
                        newX = shape.length - 1 - y;
                        newY = x;
                    } else if (angle === 180) {
                        newX = shape[y].length - 1 - x;
                        newY = shape.length - 1 - y;
                    } else if (angle === 270) {
                        newX = y;
                        newY = shape[0].length - 1 - x;
                    } else {
                        return; // Нічого не робимо для інших кутів
                    }
                    newShape[newY][newX] = shape[y][x];
                }
            }
            currentBlocks[index].shape = newShape;
            drawBlock(index, currentBlocks[index].shape, currentBlocks[index].color);
            console.log(`Блок повернуто на ${angle}°:`, index, &#039;Нова форма:&#039;, JSON.stringify(currentBlocks[index].shape));
        }

        function flipShape(shape) {
            return shape[0].map((_, col) =&gt; shape.map(row =&gt; row[col]).reverse());
        }

        function undoMove() {
            if (lastMove) {
                grid = lastMove.grid;
                score = lastMove.score;
                currentBlocks[lastMove.blockIndex] = lastMove.block;
                scoreElement.textContent = `Очки: ${score}`;
                drawGrid();
                drawBlock(lastMove.blockIndex, currentBlocks[lastMove.blockIndex].shape, currentBlocks[lastMove.blockIndex].color);
                lastMove = null;
                undoButton.disabled = true;
                console.log(&#039;Хід скасовано&#039;);
            }
        }

        generateBlocks();
        drawGrid();
        console.log(&#039;Гра ініціалізована — Мозаїка Майстрів Версія 1.9&#039;);
  &lt;/script&gt;</description>
            </item>
            </channel>
</rss>