код блога

 

<!DOCTYPE html>

<html lang=»uk»>

<head>

    <meta charset=»UTF-8″>

    <meta name=»viewport» content=»width=device-width, initial-scale=1.0, viewport-fit=cover, user-scalable=yes»>

    <title>Літо 2026 · Повне меню з усіма рецептами</title>

    <script src=»https://cdn.jsdelivr.net/npm/html2pdf.js@0.10.1/dist/html2pdf.bundle.min.js»></script>

    <style>

        * { margin: 0; padding: 0; box-sizing: border-box; }

        :root {

            —bg-paper: #fdfcf8; —ink-black: #1a1a1a; —marker-yellow: #ffde59;

            —marker-green: #c1ff00; —marker-blue: #38b6ff; —marker-red: #ff5757;

            —border-sketch: 2px solid var(—ink-black); —shadow-sketch: 3px 3px 0px var(—ink-black);

            —transition: 0.2s cubic-bezier(0.34, 1.56, 0.64, 1);

            —font-main: Georgia, ‘Times New Roman’, Times, serif;

        }

        @media (min-width: 1024px) { :root { —border-sketch: 3px solid var(—ink-black); —shadow-sketch: 5px 5px 0px var(—ink-black); } }

        body, html { background: var(—bg-paper); overflow: hidden; width: 100vw; height: 100dvh; display: flex; align-items: center; justify-content: center; font-family: var(—font-main) !important; position: fixed; top: 0; left: 0; font-size: 18px; }

        @media (max-width: 768px) { body, html { font-size: 15px; } }

        @media (max-width: 480px) { body, html { font-size: 14px; } }

        .comic-device { width: 100vw; height: 100dvh; background: var(—bg-paper); display: flex; flex-direction: column; overflow: hidden; position: relative; }

        .device-header { height: 60px; background: #fff; border-bottom: var(—border-sketch); display: flex; align-items: center; justify-content: space-between; padding: 0 16px; flex-shrink: 0; z-index: 1000; }

        @media (min-width: 768px) { .device-header { height: 70px; padding: 0 24px; } }

        .mac-dots { display: flex; gap: 8px; }

        .mac-dot { width: 12px; height: 12px; border-radius: 50%; border: 2px solid var(—ink-black); animation: popIn 0.4s forwards; opacity: 0; }

        @keyframes popIn { 0% { transform: scale(0); opacity: 0; } 80% { transform: scale(1.2); opacity: 1; } 100% { transform: scale(1); opacity: 1; } }

        .mac-dot.red { background: var(—marker-red); animation-delay: 0.1s; }

        .mac-dot.yellow { background: var(—marker-yellow); animation-delay: 0.2s; }

        .mac-dot.green { background: var(—marker-green); animation-delay: 0.3s; }

        .logo-text { font-weight: bold; font-size: clamp(0.9rem, 5vw, 1.2rem); background: var(—marker-yellow); padding: 4px 12px; border-radius: 40px; border: var(—border-sketch); box-shadow: 2px 2px 0 var(—ink-black); }

        .user-info { display: flex; align-items: center; gap: 8px; background: #f0e9da; border: var(—border-sketch); border-radius: 40px; padding: 4px 12px; font-size: 0.8rem; cursor: pointer; transition: var(—transition); }

        .user-info:hover { background: #e3d8c2; transform: translateY(-2px); }

        .user-info span { font-weight: bold; }

        .tab-buttons { display: flex; flex-wrap: wrap; justify-content: center; gap: 8px; padding: 12px 12px 0; background: #fefaf0; border-bottom: 2px dashed #e3cfb5; flex-shrink: 0; }

        .tab-btn { background: #fff; border: var(—border-sketch); padding: 8px 16px; font-weight: bold; font-size: clamp(0.7rem, 4vw, 1rem); border-radius: 60px; cursor: pointer; font-family: var(—font-main); box-shadow: 2px 2px 0 var(—ink-black); transition: var(—transition); white-space: nowrap; }

        .tab-btn.active { background: var(—marker-green); transform: translateY(-2px); box-shadow: 4px 4px 0 var(—ink-black); }

        .tab-pane { display: none; flex: 1; overflow-y: auto; padding: 16px; animation: fade 0.25s; }

        .tab-pane.active-pane { display: block; }

        @keyframes fade { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } }

        .baskets-container { display: flex; flex-direction: column; gap: 1.5rem; }

        .basket-week { background: #fffcf6; border: var(—border-sketch); border-radius: 28px; overflow: hidden; box-shadow: var(—shadow-sketch); }

        .basket-header { background: #f2e8dd; padding: 1rem; display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 10px; cursor: pointer; font-weight: 800; font-size: clamp(1rem, 5vw, 1.3rem); border-bottom: var(—border-sketch); }

        .basket-actions { display: flex; gap: 12px; align-items: center; }

        .send-icon, .pdf-icon { background: white; border: var(—border-sketch); border-radius: 40px; padding: 6px 14px; font-size: clamp(0.7rem, 4vw, 0.9rem); font-weight: bold; cursor: pointer; display: inline-flex; gap: 6px; box-shadow: 2px 2px 0 var(—ink-black); }

        .basket-cats { display: none; grid-template-columns: repeat(auto-fill, minmax(250px,1fr)); gap: 1rem; padding: 1rem; background: #fffef8; }

        .basket-cats.open { display: grid; }

        .cat-group { background: #fef7ef; border-radius: 20px; padding: 0.8rem; border: 1px solid #e6d5bc; }

        .cat-group h4 { font-size: clamp(0.9rem, 4vw, 1rem); margin-bottom: 10px; border-left: 5px solid var(—marker-blue); padding-left: 10px; }

        .check-item { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; font-size: clamp(0.75rem, 4vw, 0.85rem); }

        .clear-basket { margin: 0 1rem 1rem auto; background: none; border: var(—border-sketch); border-radius: 30px; padding: 5px 12px; font-weight: bold; cursor: pointer; }

        .calendar-grid { display: flex; flex-direction: column; gap: 2rem; }

        .week-card { background: white; border-radius: 32px; border: var(—border-sketch); box-shadow: var(—shadow-sketch); overflow: hidden; }

        .week-summary { background: #fef2e2; padding: 1rem 1.2rem; display: flex; justify-content: space-between; align-items: center; cursor: pointer; border-bottom: var(—border-sketch); font-weight: bold; font-size: clamp(1rem, 5vw, 1.3rem); }

        .week-arrow { font-size: 1.3rem; transition: transform 0.2s; }

        .week-card.collapsed .week-arrow { transform: rotate(-90deg); }

        .days-vertical { display: flex; flex-direction: column; width: 100%; }

        @media (min-width: 768px) { .days-vertical { display: grid; grid-template-columns: repeat(2, 1fr); } }

        @media (min-width: 1024px) { .days-vertical { grid-template-columns: repeat(3, 1fr); } }

        .week-card.collapsed .days-vertical { display: none; }

        .day-mini { padding: 1rem 1.2rem; border-bottom: 2px dotted #dccfbc; border-right: 1px solid #eedfcb; cursor: pointer; transition: 0.2s; background: #fffcf5; position: relative; }

        .day-mini:hover { background: #fff0df; }

        .day-mini.completed-day { opacity: 0.6; background: #ebf5ea !important; }

        .day-header { display: flex; align-items: center; gap: 10px; margin-bottom: 12px; }

        .day-num-icon { background: var(—marker-yellow); color: var(—ink-black); font-weight: 900; width: 32px; height: 32px; border-radius: 10px; display: flex; align-items: center; justify-content: center; border: 2px solid var(—ink-black); box-shadow: 2px 2px 0 var(—ink-black); font-size: 1rem; flex-shrink: 0; }

        .day-name-text { font-weight: 800; font-size: clamp(1rem, 5vw, 1.2rem); color: #b45f2b; }

        .day-completed-check { margin-left: auto; width: 22px; height: 22px; cursor: pointer; accent-color: var(—marker-green); }

        .day-meals-preview { font-size: clamp(0.8rem, 4vw, 1rem); line-height: 1.5; }

        .day-meals-preview div { margin-top: 6px; }

        .week-basket { border-top: 2px dashed var(—marker-blue); background: #fffdf7; }

        .basket-header-mini { background: #e9dfcf; padding: 0.8rem 1.2rem; display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 10px; cursor: pointer; font-weight: bold; border-bottom: var(—border-sketch); }

        .basket-header-mini:hover { background: #dfd4c2; }

        .basket-header-mini span:first-child { display: flex; gap: 8px; align-items: center; font-size: clamp(0.8rem, 4vw, 1rem); pointer-events: none; }

        .basket-actions-mini { display: flex; gap: 8px; }

        .mini-send, .mini-pdf { background: white; border: var(—border-sketch); border-radius: 40px; padding: 4px 12px; font-size: clamp(0.65rem, 3.5vw, 0.8rem); font-weight: bold; cursor: pointer; display: inline-flex; gap: 4px; box-shadow: 2px 2px 0 var(—ink-black); }

        .basket-content { display: none; padding: 1rem; background: #fffbf5; }

        .basket-content.open { display: block; }

        .basket-content .cat-group { margin-bottom: 1rem; }

        .basket-content .items-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 8px 12px; margin-top: 6px; }

        .note-card { background: white; border: var(—border-sketch); border-radius: 20px; padding: 16px; margin-bottom: 12px; box-shadow: 3px 3px 0 var(—ink-black); }

        .note-card h4 { margin-bottom: 8px; color: #b45f2b; display: flex; align-items: center; gap: 8px; white-space: nowrap; overflow-x: auto; text-transform: lowercase; font-size: 1rem; }

        .desserts-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px,1fr)); gap: 1rem; }

        .dessert-card { background: #fff6ec; border: var(—border-sketch); border-radius: 24px; padding: 1rem; box-shadow: var(—shadow-sketch); }

        .dessert-card h3 { font-size: clamp(1rem, 5vw, 1.2rem); margin-bottom: 0.4rem; }

        .full-modal { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(26,26,26,0.85); backdrop-filter: blur(5px); display: flex; align-items: center; justify-content: center; visibility: hidden; opacity: 0; transition: 0.2s; z-index: 2000; }

        .full-modal.active { visibility: visible; opacity: 1; }

        .modal-comic { background: #fffcf0; width: 92%; max-width: 700px; max-height: 85vh; overflow-y: auto; border-radius: 28px; border: var(—border-sketch); box-shadow: 8px 8px 0 var(—ink-black); padding: 1.5rem; position: relative; }

        .modal-comic h3 { font-size: clamp(1.2rem, 6vw, 1.6rem); background: var(—marker-yellow); display: inline-block; padding: 0 10px; margin-bottom: 1rem; border: 2px solid var(—ink-black); }

        .meal-card { background: #fff; border: 2px dashed #dccfbc; border-radius: 20px; padding: 16px; margin-bottom: 16px; }

        .meal-title { font-weight: 900; color: #b45f2b; font-size: 1.1rem; border-bottom: 1px solid #eee; padding-bottom: 6px; margin-bottom: 8px; display: flex; align-items: center; gap: 6px; }

        .notes-area { margin-top: 1rem; background: #fff8e0; padding: 1rem; border-radius: 20px; border: 1px solid #eedfcb; }

        .notes-area label { font-weight: bold; display: block; margin-bottom: 8px; }

        .notes-input-wrapper { display: flex; gap: 12px; align-items: stretch; }

        .notes-area textarea { flex: 1; font-family: var(—font-main); border: var(—border-sketch); border-radius: 16px; padding: 10px; font-size: 0.9rem; background: white; resize: none; }

        .btn-icon { background: var(—marker-green); border: var(—border-sketch); border-radius: 16px; width: 50px; display: flex; align-items: center; justify-content: center; font-size: 1.5rem; cursor: pointer; box-shadow: 3px 3px 0 var(—ink-black); }

        .btn-group { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 1rem; justify-content: center; }

        .btn-send, .btn-pdf, .btn-outline { display: flex; align-items: center; justify-content: center; gap: 8px; border: var(—border-sketch); border-radius: 40px; padding: 10px 16px; font-weight: bold; font-size: clamp(0.8rem, 4vw, 0.9rem); cursor: pointer; box-shadow: 2px 2px 0 var(—ink-black); transition: 0.1s; color: var(—ink-black); text-decoration: none; background: white; }

        .btn-send.whatsapp { background: #25d366; color: white; }

        .btn-send.telegram { background: #26A5E4; color: white; }

        .btn-pdf { background: var(—marker-red); color: white; }

        .close-modal { position: absolute; top: 12px; right: 12px; font-size: 1.6rem; cursor: pointer; background: var(—marker-red); width: 36px; height: 36px; border-radius: 50%; display: flex; align-items: center; justify-content: center; border: var(—border-sketch); color: white; line-height: 1; }

        footer { text-align: center; padding: 0.8rem; font-size: 0.7rem; border-top: 1px solid #eedfcb; background: #fefaf0; flex-shrink: 0; }

        .auth-modal { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.9); backdrop-filter: blur(8px); display: flex; align-items: center; justify-content: center; z-index: 3000; }

        .auth-card { background: #fffcf0; border: var(—border-sketch); border-radius: 40px; padding: 2rem; width: 90%; max-width: 400px; text-align: center; box-shadow: 12px 12px 0 var(—ink-black); }

        .auth-card input { width: 100%; padding: 12px; margin: 12px 0; font-family: var(—font-main); border: var(—border-sketch); border-radius: 40px; font-size: 1rem; }

        .auth-card button { background: var(—marker-green); border: var(—border-sketch); padding: 10px 20px; border-radius: 40px; font-weight: bold; cursor: pointer; font-size: 1rem; width: 100%; box-shadow: 3px 3px 0 var(—ink-black); }

        

        /* СТИЛІ ДЛЯ СІТКИ ПРОГРЕСУ */

        .progress-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 10px; max-width: 400px; margin: 0 auto; padding: 10px 0; }

        .progress-day { width: 100%; aspect-ratio: 1; display: flex; align-items: center; justify-content: center; background: #fff; border: var(—border-sketch); border-radius: 12px; font-weight: bold; cursor: pointer; box-shadow: 2px 2px 0 var(—ink-black); transition: 0.1s; font-size: 1.1rem; }

        .progress-day:active { transform: translate(2px, 2px); box-shadow: 0px 0px 0 var(—ink-black); }

        .progress-day.crossed-out { text-decoration: line-through; opacity: 0.5; background: #e0e0e0; pointer-events: none; }

        

        @media (max-width: 480px) { .basket-header { flex-direction: column; align-items: flex-start; } .basket-actions { margin-left: auto; } .tab-btn { padding: 6px 12px; } }

    </style>

</head>

<body>

<div class=»comic-device» id=»appRoot» style=»display: none;»>

    <div class=»device-header»>

        <div class=»mac-dots»><div class=»mac-dot red»></div><div class=»mac-dot yellow»></div><div class=»mac-dot green»></div></div>

        <div class=»logo-text»>Літо 2026</div>

        <div class=»user-info» id=»headerProfileBtn»><span id=»userNameDisplay»>Гість</span> (<span id=»userPhoneDisplay»></span>) 👤</div>

    </div>

    <div class=»tab-buttons»>

        <button class=»tab-btn active» data-tab=»progress»>🕒 Прогрес</button>

        <button class=»tab-btn» data-tab=»info»>📘 Інструкція</button>

        <a href=»https://drive.google.com/uc?export=download&id=1-t1M9FHeN3cZ1u7g3k5h3NaLmNxQJe_w» target=»_blank» style=»background: #fff; border: var(—border-sketch); padding: 8px 16px; font-weight: bold; font-size: clamp(0.7rem, 4vw, 1rem); border-radius: 60px; cursor: pointer; font-family: var(—font-main); box-shadow: 2px 2px 0 var(—ink-black); text-decoration: none; color: var(—ink-black); white-space: nowrap; transition: var(—transition);»>

    📄 PDF

</a>

        <button class=»tab-btn» data-tab=»checklists»>🛒 Корзини</button>

        <button class=»tab-btn» data-tab=»calendar»>📅 Календар</button>

        <button class=»tab-btn» data-tab=»desserts»>🍰 Десерти</button>

        <button class=»tab-btn» data-tab=»notes»>📝 Нотатки</button>

</div>

    <div id=»progressPane» class=»tab-pane active-pane»>

        <h2 style=»margin-bottom:16px; text-align:center;»>Мій прогрес 🕒</h2>

        <div id=»progressGridContainer»></div>

    </div>

    <div id=»infoPane» class=»tab-pane»>

        <div style=»background:#fef3e8;border-radius:28px;padding:1.2rem;border:var(—border-sketch);box-shadow:var(—shadow-sketch);»>

            <h2 style=»margin-bottom:1rem;»>📖 Інструкція до використання</h2>

            <p style=»margin-bottom:10px;»>Дане меню складене за принципом здорової тарілки, є різноманітним та збалансованим. Спрямоване на розширення ваших харчових вподобань відповідно до сезону. Воно допоможе відкрити для себе нові поєднання продуктів, способи приготування страв, рецепти чи інгредієнти.</p>

            <p style=»margin-bottom:10px;»>Меню написано і пораховано для зручності використання. Ви будете готувати відразу 2 (за бажанням більше) порції, кожної страви переважно ввечері, щоб не стояти постійно біля плити. Якщо вам зручніше готувати одразу 2 порції в обід то змініть порядок страв, або готуйте в зручний час без прив’язки до прийому їжі. Якщо ви готуєте не лише собі, то збільште кількість потрібних порцій відповідно до членів сім’ї. Кількість порцій вказана у кожному рецепті, якщо немає поміток – 1 порція.</p>

            <ul style=»list-style:disc; margin-left:20px; line-height:1.6; display:flex; flex-direction:column; gap:8px;»>

                <li><strong>Продукти пораховані у сирому/сухому вигляді</strong>, якщо не вказано протилежне. Наприклад: «Візьміть 300 г телятини і протушкуйте її …», «50 г гречки – відваріть» — означає, що продукт пораховано у сирому та сухому вигляді.</li>

                <li><strong>«Покладіть 100 г запеченого буряка на …»</strong> — вказано що потрібно взяти 100 г готового, запеченого буряку.</li>

                <li><strong>Плануйте свій раціон.</strong> Заздалегідь перегляньте меню, складіть список продуктів які вам необхідні для приготування страв і прийміть рішення що і коли ви будете їсти чи готувати. Підлаштуйте меню під свій графік життя, беріть лоточки на роботу. Меню не дасть результатів якщо ви відкриєте його вже голодними.</li>

                <li><strong>Дні з меню можна повторювати.</strong> Страви можна переставляти місцями (тобто, те що на обід можна з’їсти ввечері чи на сніданок). Кожен прийом їжі збалансований і повноцінний, тому переставляйте їх як конструктор. Таким чином ви зможете харчуватись цілий сезон повторюючи страви та додаючи свої.</li>

                <li><strong>Овочі можна замінювати іншими овочами</strong> (крім картоплі) або ж листовою зеленню, зважаючи на сезонні продукти та ваші смаки. Орієнтовно пів тарілки (21-22 см) мають складати у вас овочі. Вони можуть бути у різних формах обробки – квашені, сирі, запечені і всі у 1 тарілці, так щоб це не викликало дискомфорту зі сторони ШКТ. Можна додавати овочів та зелені в тарілку більше, ніж вказано у меню. Старайтесь щоб овочі чергувались, не лише огірок та помідор. Зараз найбагатший на овочі, фрукти та ягоди сезон – користуємось.</li>

                <li><strong>Не забувайте про ягоди та фрукти.</strong> Це може бути перекус чи фінальний акорд трапези. Фрукт – будь-який, пріоритет фрукт, а не сухофрукт. Орієнтуємось на сезонність, літо це період смаку, яскравих кольорів і ароматів. У червні ще можна насолоджуватись полуницею, з’являється черешня, шовковиця, суниця, а також дозрівають перші абрикоси, смородина, лохина та аґрус. Ближче до липня — багато сортів персиків, нектаринів, слив, з’являються малина, ожина, чорниця. У серпні до цього розмаїття додаються ранні яблука та груші, дині, кавуни, виноград.</li>

                <li><strong>Чому каші в сухому?</strong> Бо кожна господиня сама вирішує скільки додавати води до певної каші. І це не означає що ви маєте варити тільки по 50 г за 1 раз. Один раз відважили – зварили, подивились на приблизний об’єм і на нього орієнтуйтесь надалі.</li>

                <li><strong>М’ясо та риба вказана переважно в сирому вигляді</strong>, щоб легше було важити і готувати.</li>

                <li><strong>Порції зменшувати не бажано.</strong> Але якщо дана калорійність вам завелика – відмовтесь чи зменште порцію якогось компоненту, або усіх рівноцінно. Старайтесь не виключати тільки білки, вуглеводи чи жири з тарілки, це призведе до порушення балансу.</li>

                <li><strong>Не бійтесь додавати смаку в страви.</strong> Приправте за смаком у рецептах означає додайте улюблені чи нові спеції. Пам’ятайте що часто смак продуктів та страв залежить виключно від спецій що туди додали (чи не додали). Тому перш ніж відмовлятись від рецептів/продуктів/страв – спробуйте нові смачні спеції. Це не тільки пряні трави чи копчена паприка. Це могут бути будь-які готові суміші що можна знайти в супермаркеті, навіть зі сіллю чи глутаматом натрію. Це не зло, і нічого небезпечного у них немає — якщо ви не будете зловживати кількістю. Експериментуйте зі спеціями і звичайні продукти заграють новими барвами та швидше приживуться у вашому раціоні.</li>

                <li><strong>Ідеально прорахувати ми не можемо.</strong> Адже яблуко зелене і яблуко червоне має різні ккал. Стегно може бути жирніше чи менш жирне. Коренеплоди теж в залежності від сезону мають різну кількість крохмалю. Тому не женіться за прорахунками до граминочки. На цьому меню чудово можна схуднути і не бути голодним (теж важливо).</li>

                <li><strong>Кашу можна змінювати на іншу кашу.</strong> Крупи мають бути довгого приготування, цільні, а не подрібнені. Кус-кус, поленту, манку, пластівці, тощо – вживаємо інколи. Якщо ви якусь крупу не любите – змініть у тих самих грамах на іншу крупу, але рекомендую аби в раціоні було хоча б 3 види різних круп.</li>

                <li><strong>Білки також можна змінювати</strong>, наприклад ви не любите оселедець – надаєте перевагу скумбрії чи лососю – будь-ласка замінюйте на те що любите, але не лише 1 вид улюбленої риби до усіх прийомів їжі. Важливе різноманіття продуктів!</li>

                <li><strong>Якщо в меню порахований певний продукт</strong> наприклад – йогурт 1.6% жирності, сметана 30%, чи цільнозерновий хліб, а у вас інші продукти, не з таким складом, калорійністю чи жирністю – це не біда, ви спокійно можете і маєте їх змінювати відповідно до можливостей і вподобань. Можете це робити просто в тих самих кількостях, чи змінювати їх на око. Або ж – подивіться на калорійність продукту що вказаний і визначте кількість вашого продукту що відповідає такій же калорійності. Це можна дізнатись на етикетці товару, або вбити обидва продукти в додатки для обрахунку калорій. (напр. Таблиця калорійності)</li>

                <li><strong>Якщо досі ви звикли їсти менше</strong>, порції можуть здаватись великими. Їжте скільки зможете, поступово збільшуючи об’єм.</li>

                <li><strong>Ми не набираємо вагу, якщо з’їмо вуглеводи ввечері.</strong> Важливо що ми з’їмо і скільки впродовж дня!</li>

                <li><strong>Їмо по режиму</strong> – між кожним прийомом їжі має пройти 3-4 години. Не плутайте голод з апетитом. Коли хочеться чогось конкретного, навіть коли не голодні — це апетит. І навпаки коли пройшло вже 6 год і шлунок не дає про себе знати, то не значить що ви не голодні, напевно ви були зайняті і не помітили – поїжте. В проміжках між трапезами п’ємо чисту воду без додатків, чорну каву чи чай без додатків.</li>

                <li><strong>Сміливо замінюйте продукти</strong> якщо вам доступні чи звичні інші. Свіжий шпинат на заморожений, в червні ще не доступна молода кукурудза – додаємо консервовану чи морожену, не любите мед – додавайте кленовий сироп чи цукор натомість. На смак не впливає, але полегшує підбір продуктів.</li>

                <li><strong>Заморожуйте залишки продуктів чи овочі.</strong> Складно купити 50 г соленої риби чи 150 г гарбуза, але цілий гарбуз чи 200 г риби – легко нарізати порційно і заморозити. Вони не втрачають смак, не змінюють текстури. Туди ж заморожуємо хліб, тортилью, кисломолочний сир, броколі, цвітну капусту, брюссельську капусту, кабачок та цукіні, баклажани, перець, порей, усі бобові (варені чи консервовані), приготовані крупи тривалого приготування (перловка, кіноа).</li>

                <li><strong>Додавайте планування і заготовки.</strong> Готуйте відразу кілька порції овочів на шакшуку і заморожуйте сирники, ліниві вареники, котлети, запіканки, паштети та навіть каші – все в пакети і у заморозку. Якщо не пам’ятаєте вміст морозильної камери – ведіть список продуктів які кладете і викреслюйте те, що дістаєте. Так вміст завжди на виду.</li>

            </ul>

            <h3 style=»margin-top:20px; color:#b45f2b; text-align:center;»>Смачного! ❤️</h3>

        </div>

    </div>

    <div id=»checklistsPane» class=»tab-pane»></div>

    <div id=»calendarPane» class=»tab-pane»></div>

    <div id=»dessertsPane» class=»tab-pane»></div>

    <div id=»notesPane» class=»tab-pane»><h2 style=»margin-bottom:16px;»>📝 Всі мої нотатки</h2><div id=»userNotesList»></div></div>

    <footer>© Олеся Добрянська · комерційне використання заборонено · Дані синхронізуються з WordPress</footer>

</div>

 

<div id=»authModal» class=»auth-modal»>

    <div class=»auth-card»>

        <h2>🍉 Ласкаво просимо!</h2>

        <p>Введіть номер телефону та код доступу (2026)</p>

        <input type=»tel» id=»authPhone» placeholder=»+380 XX XXX XXXX»>

        <input type=»text» id=»authCode» placeholder=»****»>

        <button id=»authSubmit»>Увійти</button>

    </div>

</div>

 

<div id=»profileModal» class=»full-modal»>

    <div class=»modal-comic»><span class=»close-modal» id=»closeProfile»>&times;</span><h3>👤 Кабінет</h3>

        <label style=»display:block; margin-bottom:5px; font-weight:bold;»>Ім’я:</label>

        <input type=»text» id=»profileNameInput» style=»width:100%;padding:12px;border:var(—border-sketch);border-radius:20px;margin-bottom:16px;»>

        <label style=»display:block; margin-bottom:5px; font-weight:bold;»>Телефон:</label>

        <input type=»tel» id=»profilePhoneInput» style=»width:100%;padding:12px;border:var(—border-sketch);border-radius:20px;margin-bottom:20px;»>

        <button id=»saveProfileBtn» class=»btn-outline» style=»width:100%;background:var(—marker-yellow);»>💾 Зберегти</button>

        <hr style=»margin:24px 0;»><button id=»logoutBtn» class=»btn-pdf» style=»width:100%;»>🚪 Вийти</button>

    </div>

</div>

 

<div id=»fullRecipeModal» class=»full-modal»>

    <div class=»modal-comic»><span class=»close-modal» id=»closeRecipeModal»>&times;</span><h3 id=»modalTitle»>Рецепт</h3><div id=»modalRecipeContent»></div>

        <div class=»notes-area»><label>📝 Мої нотатки до цього дня:</label><div class=»notes-input-wrapper»><textarea id=»dayNoteText» rows=»2″ placeholder=»Зміни, враження, ідеї…»></textarea><button id=»saveDayNoteBtn» class=»btn-icon»>💾</button></div></div>

        <div class=»btn-group»><button id=»sendRecipeWhatsApp» class=»btn-send whatsapp»>📱 WhatsApp</button><button id=»sendRecipeTelegram» class=»btn-send telegram»>✈️ Telegram</button><button id=»downloadRecipePDF» class=»btn-pdf»>📄 PDF</button></div>

    </div>

</div>

 

<script>

// —————— НАЛАШТУВАННЯ ——————

const WP_API_URL = ‘https://blog.doctordobra.com/wp-json/summer-menu/v1’;

 

// —————— ПОВНІ РЕЦЕПТИ (Всі з PDF) ——————

const fullRecipes = {

    // Тиждень 1

    «Авокадо-тост з сиром та яйцем»: «Відваріть круто 2 яйця, охолодіть та розімніть виделкою. Додайте 100 г кисломолочного сиру, сіль, перець, гранульований часник, сванську сіль або інші спеції за смаком і перемішайте до однорідної текстури (якщо сир сухий, додайте 1 ст. л. йогурту). Підсушіть 2 шматочки цільнозернового хліба (80 г), намажте авокадо (80 г), трохи посоліть, викладіть зверху яєчно-сирну масу та подавайте зі 100 г свіжих овочів на вибір.»,

    «Паста з кабачками і тунцем»: «60 г макаронів твердих сортів відваріть до готовності. 1 малий цукіні або кабачок наріжте тонкими кільцями, додайте туди 1 розчавлений зубчик часнику та лимонну цедру за смаком і обсмажте на сковорідці до готовності з допомогою 1 ч. л. оливкової олії. Як кабачки приготуються вимкніть вогонь і додайте 1 банку консервованого тунця у своєму соці (185 г), свіжий базилік, 20 г свіжого шпинату чи іншої зелені на вибір, 20 г розрізаних навпіл оливок, 20 г тертого пармезану, лимонний сік та сіль і перець за смаком, за бажанням додайте ще каперси. Перемішайте, скуштуйте, має бути кисленьке і подавайте. Полуниця 200 г»,

    «Лимонні гомілки з картоплею та спаржею»: «Ретельно вимийте 400 г молодої картоплі (дрібну залиште цілою, більшу розріжте навпіл), наріжте півкільцями 1 велику цибулину і скибочками половину лимона. У формі для запікання з’єднайте картоплю, цибулю, лимон та 4 курячі гомілки. Додайте 1 ст. л. вершкового масла або оливкової олії, 2 подрібнені зубчики часнику, 1 ч. л. сушених трав (орегано або чебрець), сіль та чорний перець за смаком, після чого все добре перемішайте. Розподіліть інгредієнти так, щоб гомілки лежали зверху і запікайте у розігрітій до 180°С духовці 40–45 хвилин до готовності. Візьміть 400 г спаржі, відламайте жорсткі нижні кінці стебел. Викладіть її у сковороду, додайте 1 ч. л. вершкового масла та 1–2 розчавлені зубчики часнику, дрібку солі та чорного перцю. Смажте 3-5 хв на середньому вогні, постійно перевертаючи, щоб вона трішки потемніла, але залишалась хрумкою.»,

    «Вівсянка з песто і яйцем»: «Зваріть 50 г плющеної вівсянки з 150–180 мл молока, посоліть. Паралельно приготуйте 2 яйця: відваріть або підсмажте на 5 г вершкового масла, залишивши жовток рідким. У кашу вмішайте 1 ч. л. соусу песто та 15 г тертого пармезану. Перекладіть у тарілку, зверху викладіть яйце, додайте 100 г помідорів чері, 30 г свіжого шпинату та кілька листочків свіжого базиліку.»,

    «Тушкована тріска з креветками в соусі карі»: «80 г булгуру – відваріть до готовності. Застеліть сковороду з товстим дном двома шарами пергаментного паперу. Викладіть туди 1 середню цибулину та 2–3 зубчики часнику, нарізаних соломкою, збризніть краплею оливкової олії та додайте дрібку солі, перемішайте. Далі викладіть шарами 300 г філе тріски, розрізаної на 2 шматочки, 150 г очищених креветок та 150 г помідорів чері. У мисці змішайте 65 мл несолодких кокосових чи звичайних вершків (20%), 1 ст. л. жовтої пасти карі, ½ ч. л. концентрованого курячого бульйону та 2 ст. л. води. Вилийте цю суміш на морепродукти, зверху посипте 1 ст. л. подрібненої кінзи чи петрушки. Накрийте кришкою і поставте на середній вогонь. Як тільки рідина почне тихо кипіти, зменште вогонь до мінімуму та готуйте 15–20 хвилин до готовності риби та креветок. Перед подачею збризніть соком лайма.»,

    «Яєчний млинець з сиром і ягодами»: «Відокремте жовток 2 яєць від білка. До жовтків додайте 1 ст. л. йогурту, підсолоджувач за смаком, 1 ст. л. крохмалю або борошна і ¼ ч. л. розпушувача, перемішайте. Білки збийте до стійких піків та обережно вмішайте в масу. Випечіть млинець на сковороді під кришкою на мінімальному вогні з обох боків. Для крему змішайте 100 г кисломолочного сиру, ванілін та 1 ст. л. згущеного молока або іншого підсолоджувача, збийте до однорідності. Якщо сир сухий, додайте ще ложку йогурту. Змастіть млинець сирною масою, додайте 150 г черешні або інші ягоди і згорніть навпіл.»,

    «Локшина з яловичиною та овочами»: «Наріжте тонкими смужками 300 г яловичини, замаринуйте у 2 ст. л. соєвого соусу, 1 ч. л. меду, 1 ч. л. лимонного соку, 1 ч. л. кунжутної олії, додайте трішки гранульованого часнику та паприки. 150 г брюссельської капусти відваріть 3–4 хв у киплячій воді й перекладіть у холодну, розріжте навпіл. Окремо відваріть 80 г локшини удобн чи соба за інструкцією на упаковці. Обсмажте м’ясо на сковороді до готовності, перекладіть у тарілку. У тій же сковороді обсмажте з допомогою 1 ч. л. оливкової олії нарізані соломкою солодкий перець, невелику моркву і цибулю та 1 зубчик часнику. Поверніть м’ясо, додайте броколі й локшину. Для соусу змішайте 100 мл води, 2 ст. л. соєвого соусу, 1 ч. л. меду, 1 ч. л. вустерширського соусу (за бажанням), 1 ст. л. рисового оцту та 1 ч. л. крохмалю. Влийте соус і тушкуйте все разом 2–3 хв до загустіння. Посипте зеленою цибулею.»,

    «Яєчний салат з в’яленими томатами»: «Відваріть 2 яйця рівно 6,5 хвилин, після чого занурте їх у холодну воду. Паралельно підсушіть 80 г цільнозернового хліба. Очищені яйця покладіть на велику дошку, додайте трохи кропу, зеленої цибулі, свіжого базиліку, 30 г шпинату та 3-4 шт в’ялених помідорів. Поріжте все ножем, перетворюючи в пасту. Перекладіть у посуд і додайте 1 ст. л. йогурту, 30 г фети, сіль та перець за смаком. Ретельно перемішайте і викладіть готову масу на тости.»,

    «Медово-кунжутна курка з рисом та овочами»: «Змішайте 20 г кукурудзяного крохмалю, ½ ч. л. часникового порошку, ¼ ч. л. солі, дрібку перцю та обваляйте в цьому 400 г курячого філе, нарізаного кубиками, после чого обсмажте м’ясо на 1 ст. л. рафінованої олії та перекладіть на серветку. Далі обсмажте на 1 ч. л. олії овочі до рум’яності: 200 г горошку в стручках (попередньо прибравши хвостики), 150 г половинок брюссельської капусти та 50 г тертої моркви, приправивши їх ¼ ч. л. часникового порошку, ¼ ч. л. солі та дрібкою перцю. Паралельно зваріть 100 г рису басматі, заправивши його в кінці 0,5 ч. л. соку лайма. Для соусу з’єднайте 1 ч. л. меду, ½ ст. л. томатного соусу, 1 ст. л. соєвого соусу, 1 ч. л. кунжутної олії, ¼ ч. л. меленого імбиру, дрібку солі й 5 г насіння кунжуту. Викладіть у тарілку рису, курки та овочів, полийте соусом, прикрасьте зеленою цибулею.»,

    «Птітім з лососем та пореєм»: «100 г птітіму – відваріть у великій кількості води до готовності. Приправте 300 г філе лосося сіллю та перцем, обсмажте на 1 ч. л. оливкової олії з обох боків до золотистої скоринки, вийміть та відкладіть. У ту саму сковороду додайте 1 ст. л. масла гхі, нарізану кільцями цибулю порей і повільно обсмажуйте її до м’якості й карамелізації. Тоді додайте 150 г спаржі (нарізаної шматочками) та 2 зубчики часнику, обсмажуйте все разом 1–2 хвилини. Влийте 60 мл вершків 20% і дайте соусу злегка закипіти. Додайте птітім і ретельно перемішайте. Розділіть пасту по тарілках, додайте шматочки лосося, збризніть лимонним соком, посипте зеленою цибулею.»,

    «Сирники з черешнею»: «Візьміть 200 г кисломолочного сиру 5%, 1 жовток, 20 г манки чи цільнозернового борошна, цукрозамінник за потреби. Все змішайте, сформуйте сирники, обваляйте їх в додатковій муці та посмажте на сковороді, змащеній маслом (не більше 1 ч. л.) або запечіть в духовці при 180°С до золотистої скоринки. Додайте 100 г несолодкого йогурту 1,5-2,5% та 150 г черешні чи інші ягоди за смаком.»,

    «Тушкований язик з овочами та гречкою»: «100 г гречки – відваріть. 1 невеликий телячий язик (300г) відваріть до готовності охолодіть і почистьте. Наріжте півкільцями 1 цибулину, солодкий перець та невеликий кабачок (200 г), 1 моркву та цибулю порей (100 г) – тоненькими кільцями. Протушкуйте на 1 ст. л. олії чи масла цибулю та моркву, додайте всі інші овочі, ½ бульйонного кубика та трішки води, перемішайте і тушкуйте під кришкою 5-7 хв, поки кабачки трішки зм’якнуть, але ще будуть хрумкими, додайте порізаний соломкою язик, ще раз перемішайте і зніміть з вогню. Залиште овочі під кришкою на 10 хв. Подавайте з гречкою та свіжою зеленню.»,

    «Тортилья з омлетом та тунцем»: «Вилийте на розігріту сковороду 1 збите яйце з 20 г тертого пармезану, а коли омлет почне схоплюватися, накрийте його зверху 1 листом тортильї, притисніть, переверніть усе разом з допомогою тарілки і зніміть із вогню. Окремо змішайте велику банку консервованого тунця у власному соку (185 г) з 2 ст. л. грецького йогурту, гірчицею за смаком, додайте лимонний сік, трішки меду, сіль та перець. Викладіть на сторону омлету 30 г свіжого шпинату, нарізану півкільцями половину червоної цибулі, шматочки огірка та заправленого тунця. Щільно загорніть у рол, за бажанням злегка підсушіть на сухій сковороді до хрусткої скоринки.»,

    «Боул з нутом та спаржею»: «Відваріть 60 г кіноа. 100 г спаржі очистьте, відламайте тверду частину стебла та наріжте шматками по 2 см. Обсмажте з допомогою 5 г масла гхі – 3-5 хв до готовності (спаржа має залишатись злегка хрумкою). За бажанням додайте часник. Наріжте на четвертинки 100 г томатів чері та 60 г міні моцарели. Змішайте в глибокій тарілці половину кіноа з ½ банки консервованого нуту, спаржею, томатами, додайте 10 г кедрових горішків або насіння. Заправте боул соусом: 1 ч. л. оливкової олії змішайте з 1 ст. л. бальзамічного оцту, ½ ч. л. меду чи сиропу, ½ ч. л. гірчиці, додайте сіль на перець за смаком.»,

    

    // Тиждень 2

    «Вівсянка з беконом, фетою і перцем»: «Відваріть 50 г плющеної вівсянки в підсоленій воді до готовності. На сухій сковороді обсмажте 30 г бекону, перекладіть його на паперовий рушник. Приготуйте 1 яйце зручним способом. У тарілку викладіть вівсянку, додайте бекон, яйце, 30 г фети, порцію маринованого перцю, що залишилась, та 20 г руколи. Полийте 1 ч. л. бальзамічного оцту та оливкової олії.»,

    «Маринована скумбрія з картоплею»: «Для маринаду змішайте 500 г кип’яченої води, 35 г цукру, 30 г солі, 1 лавровий листок та 3 шт перцю горошком до повного розчинення, після чого залиште суміш охолонути повністю. Патрану й нарізану шматочками скумбрію (300 г) залийте холодним маринадом і залиште в холодильнику на добу. Після цього злийте весь маринад, додайте до риби нарізану звичайну та зелену цибулю, 1 ст. л. яблучного оцту та 1 ч. л. оливкової олії, ретельно перемішайте і залиште в холодильнику ще мінімум на 30 хвилин перед подачею. Почистьте 400 г молодої картоплі та відваріть до готовності. Злийте воду і заправте 1 ст. л. вершкового масла, зубчиком розчавленого часнику та кропом.»,

    «Скляна локшина з телятиною»: «300 г яловичого стейку чи вирізки наріжте тонкими смужками, змішайте з 1 ч. л. коричневого цукру, 1 ст. л. соєвого соусу та 3 подрібненими зубчиками часнику. Залиште маринуватися на 30 хвилин. 60 г скляної локшини (фунчоза) приготуйте згідно з інструкцією, промийте холодною водою, змішайте з 1 ч. л. кунжутної олії. 100 г шпинату бланшуйте 30 секунд в окропі, охолодіть і відтисніть зайву воду. 1 цибулю, 1 болгарський перець, 1 моркву та 3 зелені цибулини наріжте соломкою. 7-8 середніх печериць розріжте на 4 частини. На 1 ч. л. олії обсмажте цибулю, моркву, гриби, болгарський перець по 1-2 хвилини, щоб залишились аль денте, відкладіть. Додайте ще 1 ч. л. олії, обсмажте яловичину до готовності. У великій мисці змішайте вермішель, овочі, яловичину, 1 ст. л. соєвого соусу, 1 ч. л. коричневого цукру, перець і 1 ч. л. кунжуту. Перемішайте, подавайте холодним.»,

    «Томатна вівсянка з куркою»: «Дрібно наріжте ½ цибулини та 1 зубчик часнику й обсмажте на середньому вогні до золотистості на 0,5 ч. л. масла гхі. Додайте 2 невеликі томати без шкірки (або 200 г консервованих у власному соку), влийте 100 г води, накрийте кришкою і протушіть 3–5 хвилин, після чого розімніть томати виделкою до стану грубого пюре. Насипте у каструлю 50 г плющеної вівсянки, додайте 100 г води, сіль, перець та базилік за смаком. Перемішайте, накрийте кришкою і варіть на слабкому вогні 15–20 хвилин до м’якості. Паралельно приготуйте 1 яйце пашот або яєчню. Викладіть готову томатну вівсянку в тарілку, зверху додайте шматочки приготованого курячого філе (з 8 дня), яйце, 20 г пармезану, 20 г салатної зелені та 100 г маринованих овочів.»,

    «Шакшука з креветками»: «На 10 г вершкового масла обсмажте до напівготовності 120 г очищених і нарізаних шматочками сирих креветок, ½ кабачка та ½ цибулини. Додайте 40 г свіжого шпинату й 120 г консервованого нуту, вичавіть 1 зубчик часнику і готуйте все разом ще 2 хвилини. Зменште вогонь до мінімуму, обережно вбийте в овочеву суміш 2 яйця та полийте зверху 20 г вершків 20%. Приправте сванською сіллю й перцем за смаком, рівномірно посипте 10 г пармезану, накрийте кришкою і тушкуйте 3–5 хвилин до бажаної готовності яєць. Перед подачею посипте кріспі цибулею.»,

    «Сирні вафлі з тунцем та авокадо»: «Змішайте до однорідності 100 г кисломолочного сиру, 1 яєчний жовток, 30 г натертої моцарели та 1 ст. л. борошна. Добре розігрійте вафельницю чи гриль та змастіть її панелі краплею олії. Викладіть тісто і випікайте вафлі до насиченого золотисто-коричневого кольору. Тим часом, розімніть виделкою 1 невелике стигле авокадо разом із маленькою банкою консервованого тунця у своєму соці, додайте дрібно нарізану цибулю, посоліть та перемішайте. Доповніть страву жменею руколи або шпинату, кількома томатами чері та маринованою цибулею.»,

    «Курка з едамаме і арахісовим соусом»: «100 г рису басматі – відваріть до готовності. Наріжте середніми кубиками 300 г курячого філе, а 100 г печериць, 1 цибулину, 1 моркву, ½ баклажану та 100 г порею — невеликими кубиками. Обсмажте курку на сковороді з 1 ч. л. олії до золотистості (5–7 хвилин), потім додайте всі овочі та 100 г бобів едамаме, вичавіть зубчик часнику, влийте 2 ст. л. соєвого соусу й тушкуйте ще кілька хвилин до готовності. Дістаньте курку з овочами, а у сік, що залишився на дні, додайте 1 ст. л. арахісової пасти, 1 ч. л. меду та 1 ч. л. оцту. Прогрійте на мінімальному вогні 1–2 хвилини, помішуючи до густої емульсії.»,

    «Омлет з баклажанами і моцарелою»: «2-3 скибочки баклажану, нарізаного вздовж слайсами товщиною 2-3 мм, посоліть та приправте за бажанням. Викладіть на дно невеликої сковорідки в 1 шар і злегка обсмажте з 2 сторін до золотистості. Яйце, білок що залишився зі вчора та трохи молока збийте, додайте 10 г тертого пармезану, посоліть і вилийте до баклажанів. Решту моцарели, 2 шматочки в’ялених томатів та зелень поріжте довільними шматками і посипте омлет, додайте пряні трави. Накрийте кришкою і готуйте на маленькому вогні до готовності. Складіть омлет навпіл і покладіть в тарілку.»,

    «Хек у місо-масці з бататом та броколі»: «Наріжте кубиками 600 г батату, додайте сванську сіль, викладіть на деко, збризніть олією і запікайте 15 хвилин при 200°С. Тим часом змішайте 1 ст. л. розм’якшеного вершкового масла, 1 ст. л. білої пасти місо, 1 ч. л. рисового оцту та 1 ст. л. коричневого цукру до однорідності. Промокніть паперовим рушником 400 г філе хека і щедро змастіть підготовленим місо-маслом. Посуньте батат на деку, звільнивши місце для риби та 400 г розібраної на суцвіття броколі. Броколі збризніть 1 ч. л. оливкової олії, сіллю та перцем. Запікайте все разом ще 10 хвилин, после чого увімкніть режим конвекції на 3–4 хвилини до карамелізації риби. Перед подачею посипте броколі кунжутом.»,

    «Сирна галета з абрикосами і мигдалем»: «Змішайте 1 брикет кисломолочного сиру (180-200г) (або перебийте зернистий блендером), 1 яйце, 2 ст. л. цукрозамінника або цукру, дрібку солі та ваніліну, 2 ст. л. борошна з гіркою (60 г) та 1 ч. л. розпушувача до однорідності. Вийде рідке тісто консистенції сметани, викладіть його на пергамент і сформуйте тонке коло з бортиками. Всередину викладіть 300 г нарізаного дольками абрикосів, змішаних із 1 ч. л. кукурудзяного крохмалю. Притрусіть фрукти 30 г нарізаного мигдалю, полийте 1 ч. л. меду та викладіть зверху 20 г вершкового масла, нарізаного тонкими скибками. Запікайте при 180°С протягом 20–25 хвилин до золотистої скоринки.»,

    «Тофу з булгуром і битими огірками»: «Розріжте 400 г тофу навпіл уздовж, зменшуючи його товщину. Покладіть по боках шматків палички для суші (щоб не прорізати наскрізь) і зробіть часті надрізи вздовж завтовшки 2–3 мм. Викладіть тофу у форму з пергаментом. Змішайте по 1 ст. л. соусу теріякі і соку лайма а також по 1 ч. л. меду, натертого часнику, імбиру та цедри лайма. Ретельно змастіть цим соусом тофу, заходячи в усі жолобки, та запікайте 15 хвилин при 180°С у режимі конвекції. Паралельно відваріть 100 г булгуру. 4-5 огірків розріжте навпіл уздовж, покладіть у пакет і злегка відбийте. Додайте в пакет по 1 ст. л. кунжутної олії, яблучного оцту й соєвого соусу, 1 ч. л. меду та 2 розчавлені зубчики часнику. Струсіть пакет і залиште в холодильнику на 30 хвилин.»,

    «Салат-паста з куркою»: «Змішайте 500 г курячого філе, розрізаного навпіл з 1 ч. л. оливкової олії, 0,5 ч. л. середземноморських трав та ¼ ч. л. солі й перцю. Обсмажте м’ясо на сковороді або грилі по 6–7 хвилин з кожного боку до готовності, дайте відпочити та наріжте кубиками. Паралельно відваріть 100 г пасти. У велику миску викладіть пасту, 2/3 курки, 1 нарізаний кубиками огірок, 150 г помідорів чері розрізаних навпіл, 1 червону цибулю — півкільцями, 40 г оливок, 40 г подрібненої фети, 30-40 г руколи та 10 г свіжого кропу. Окремо змішайте для заправки 1 ст. л. оливкової олії, 1 ст. л. лимонного соку, по 1 ч. л. діжонської гірчиці й води та ¼ ст. л. середземноморських трав.»,

    «Йогурт-боул з нутом та яйцем»: «Промийте 120 г (½ банки) консервованого нуту, ретельно висушіть паперовим рушником, змішайте з 0,5 ч. л. оливкової олії та спеціями (сіль, часник, копчена паприка) і запікайте на деку при 200°С протягом 20–25 хвилин до золотистої скоринки. Окремо відваріть 1 яйце так, щоб жовток залишився рідким. Для бази боула змішайте 150 г густого йогурту 1,5-3% з дрібкою солі, перцю та цедрою лимона й викладіть на дно глибокої тарілки. Зверху на йогуртову подушку викладіть запечений нут, 30 г фети, 20 г руколи, 1 нарізаний шматочками огірок, жменю половинок томатів чері, мариновану цибулю та розрізане навпіл яйце.»,

    

    // Тиждень 3

    «Салат-паста з куркою та квасолею»: «Зваріть 80 г макаронів твердих сортів до стану al dente. На сковороді з 1 ч. л. оливкової олії обсмажте нарізані кубиками 1 солодкий перець і половину червоної цибулини, 300 г курячого філе й готуйте до повної готовності. Перекладіть макарони у велику миску, додайте 150 г нарізаних помідорів, 40 г свіжого шпинату, по половині банки червоної квасолі та кукурудзи, а також курку з овочами. Приправте мексиканською приправою чи сванською сіллю, додайте сіль, перець, паприку, 1 ч. л. оливкової та 50 г рікоти і ретельно перемішайте.»,

    «Боул з бататом та яйцями»: «Приготуйте 2 яйця на сковороді на ваш смак (яєчня або скрембл), приправивши сіллю та спеціями. У глибоку тарілку викладіть окремими купками жменю свіжої руколи, розігрітий запечений батат (з 13 дня), помідори чері 150 г, мариновану цибулю та нарізане слайсами авокадо. Туди ж викладіть 100 г сиру рікота та готові гарячі яйця.»,

    «Дорадо з овочами і картоплею»: «Змішайте 1 ст. л. оливкової олії з соком ½ лимона, сіллю, перцем та приправою до риби. На очищеній дорадо (500–600 г) зробіть кілька косих надрізів по боках, ретельно змастіть маринадом і залиште на 15–20 хвилин. Наріжте шматочками 400 г картоплі, 1 моркву, 1 цибулину та 1 цукіні, викладіть у форму, злегка приправте сіллю, перцем, збризніть 1 ч. л. олії і перемішайте. Зверху на овочеву подушку викладіть замариновану рибу та запікайте в розігрітій до 180°С духовці 35–40 хвилин до готовності.»,

    «Авокадо-тост з омлетом»: «Підсушіть 80 г цільнозернового хліба і намажте його м’яким авокадо (80-100 г), чи приготуйте гуакамоле. Приготуйте омлет із 2 яєць, посоліть за смаком. Викладіть на тости порізаний слайсами огірок, томат, 20 г улюбленої зелені (рукола, маш, мікс). Зверху покладіть омлет, посипте його 10 г натертого пармезану та дрібно порізаною зеленою цибулею чи кропом.»,

    «Боул з фрикадельками та запеченим перцем»: «Змішайте 300 г нежирного яловичого фаршу, 0.5 ст. л. соусу шрірача, 2 подрібнені зубчики часнику, 1.5 ст. л. нарізаної петрушки, 2 ст. л. сухарів, жовток яйця, по 0.5 ч. л. орегано та солі. Сформуйте невеликі кульки й викладіть на деко з пергаментом. Поруч викладіть 4-5 солодкі червоні перці, розрізані навпіл. Запікайте фрикадельки 15 хвилин, а перець — 25–30 хвилин до м’якості. Зваріть 80 г кіноа. Для соусу цацикі з’єднайте 200 г грецького йогурту, 1 натертий невеликий огірок, 1 вичавлений зубчик часнику, 1 ч. л. оливкової олії, 0.5 ст. л. білого оцту, сік та цедру ½ лимона, 0.5 ст. л. кропу та ¼ ч. л. солі. 4 половинки запеченого перцю очистьте від шкірок і наріжте смужками, змішайте в мисці зі 50 г подрібненої фети, 1 ч. л. оливкової олії, 0.5 ч. л. орегано та дрібкою солі.»,

    «Рол у тортильї з тунцем та норі»: «Дрібно наріжте 1 огірок та кілька пір’їн зеленої цибулі, розімніть банку тунця у власному соці. Для заправки змішайте 50 г рікоти, трохи густого йогурту, соєвого соусу та соусу теріякі за смаком. З’єднайте в мисці огірок, цибулю, тунець, кукурудзу що залишилась (½ банки) і заправку, ретельно все перемішайте. Викладіть на тортилью листки норі, зверху рівномірно розподіліть приготовану начинку, притрусіть кунжутом і щільно загорніть у рол.»,

    «Запечені ньоки з квасолею, овочами і фетою»: «½ банки консервованої квасолі, що залишилась – промийте, та відцідіть. 1 баклажан, 1 солодкий перець та 1 червону цибулю – наріжте кубиками. У формі для запікання змішайте квасолю з 200 г ньокі, цибулею і баклажаном, додайте 300 г томатів чері, 4 зубчика натертого часнику. Заправте 2 ст. л. оливкової олії, ½ ч. л. чебрецю та орегано, посоліть за смаком. Запікайте при 180°С приблизно 25 хв. Посипте 50 г фети, 20 г порізаних оливок та кількома листками базиліку.»,

    «Ліниві вареники з персиками-гриль і рікотою»: «Перетріть вилкою чи блендером 300 г сиру, додайте 1 яйце, 3 ст. л. борошна, дрібку солі (+ дрібка, щоб додати в воду при варінні) підсолоджувач за смаком, 3 г цедри лимона. Вимішайте усе, сформуйте ковбаску і поріжте або сформуйте кульки. Відваріть у злегка підсоленій воді, поки вони спливуть і дістаньте. Наріжте великий персик (150 г) скибочками, і обсмажте на розігрітій сковороді з 1 ч. л. масла по 2–3 хв з кожного боку, до рум’яності. Викладіть вареники, додайте 50 г рікоти, 1-2 ст. л йогурту і персики гриль.»,

    «Запечена картопля з куркою та фенхелем»: «Натріть сіллю 2 курячих стегна і залиште на кілька хвилин. Змішайте до однорідності 1 ст. л. місо-пасти та 1 ст. л. розм’якшеного вершкового масла. Наріжте великими шматочками ½ цибулини-порею, 400 г молодої картоплі та 1 невелику цибулину фенхелю, викладіть їх на деко разом із 5-6 зубчиками часнику, збризніть оливковою олією, посоліть і перемішайте. Промокніть курку насухо паперовим рушником, щедро змастіть підготовленим місо-маслом і викладіть зверху на овочеву подушку поруч із половиною лимона. Запікайте 1 годину при 190°С, вливши на деко 100 мл курячого бульйону на середині приготування.»,

    «Сирний омлет зі шпинатом»: «100 г кисломолочного сиру викладіть на розігріту сковорідку з невеликою кількістю вершкового масла і прогрійте 3–4 хвилини. Додайте нарізаний помідор і 50 г шпинату. 2 яйця збийте з сіллю, перцем та середземноморськими травами за смаком, вилийте до сковороди і трохи розімніть лопаткою. Посипте 20 г натертого пармезану, накрийте кришкою і готуйте до готовності. Подавайте з тостом цільнозернового хліба (40 г), та порцією маринованого перцю.»,

    «Фунчоза з креветками і грейпфрутом»: «Наріжте соломкою 1 огірок, подрібніть 1 зелену цибулю, розріжте навпіл 100 г помідорів чері, очистіть від плівок і розділіть на дольки ¼ грейпфруту та ¼ апельсину. Подрібніть ножем або в комбайні 400 г очищених креветок разом із 1 ч. л пасти том-ям, 1 ст. л. рибного соусу та 1 зубчиком часнику. Обсмажте цю масу на сковороді з 1 ч. л. олії протягом 4–5 хвилин, постійно розмішуючи лопаткою до готовності, та відставте. Для заправки змішайте 1 ч. л. пасти том-ям, 1 зубчик часнику, 1 ст. л. соєвого соусу, соком ½ лайма та 1 ч. л. цукру. Зваріть у киплячій воді 60 г фунчози за інструкцією, злийте воду та промийте холодною водою, заправте ½ ч. л. кунжутної олії. З’єднайте локшину, цитрусові, огірок, чері, цибулю, додайте обсмажені креветки, полийте заправкою і ретельно перемішайте.»,

    «Тости з фетою, яйцями і маринованим перцем»: «Підсушіть 80 г цільнозернового хліба. На пательні, розігрівши 5 г олії гхі, приготуйте 2 яйця на ваш смак (яєчню або скрембл) та приправте сіллю за смаком. Намажте тости 50 г фети, додайте шматочки маринованого перцю та мариновану цибулю. В тарілку викладіть смажені яйця і додайте 20 г руколи.»,

    «Запечений лосось з бататом і овочами»: «Наріжте свіжу моркву (300 г) економкою на довгі тонкі стрічки. Добре помніть їх руками в мисці, щоб вони пустили сік і стали м’якими. Для заправки окремо змішайте 1 ст. л. соєвого соусу, 1 ст. л. лимонного соку, 1 ч. л. меду та 0.5 ч. л. солодкої гірчиці. Полийте цим соусом морквяні стрічки та ретельно перемішайте, відставте маринуватись. Наріжте кубиками 400 г батату, збризніть оливковою олією, приправте сванською сіллю і викладіть на деко. Запікайте 15 хвилин при 180°С. Тим часом розділіть на суцвіття 200 г броколі, а 400 г філе лосося наріжте на 3 порційні частини (посоліть та поперчіть рибу). Додайте броколі та лосось на деко до батату і запікайте все разом ще 15-20 хвилин до готовності.»,

    

    // Тиждень 4

    «Запечений омлет з сиром та кабачками»: «У формі для запікання змішайте 4 яйця, 100 г кисломолочного сиру, 200 г кабачка, ½ баклажану та 200 г томату нарізного кубиками, 40 мл вершків 20%, перемішайте, посоліть та додайте спеції за смаком. Зверху посипте 100 г натертої моцарели і запечіть при 180°С 30-40 хв, до готовності. Подавайте разом зі шматком цільнозернового хліба, свіжими овочами та зеленню.»,

    «Намазка з лосося, авокадо та огірка на тостах»: «Візьміть порцію запеченого лосося (з 21 дня) та ретельно розімніть його виделкою на дрібні шматочки. Додайте 1 невелике стигле авокадо, 60 г грецького йогурту 1,5-3% жирності, нарізаний дрібними кубиками огірок та сік ½ лимона. Приправте сіллю і чорним перцем за смаком, після чого ретельно перемішайте все до стану густої, однорідної пасти. Окремо підсушіть 2 шматочки цільнозернового хліба, викладіть на них готову рибну пасту та подавайте разом з 30 г зелені на вибір.»,

    «Пюре з бефстроганов та маринованими кабачками»: «Наріжте 500 г кабачків тонкими слайсами, додайте ½ ч. л. солі, залиште на 10 хвилин і злийте сік, що виділився. Додайте до них дрібно нарізаний кріп, 1–2 вичавлені зубчики часнику, 1 ч. л. меду, 1 ст. л. оцту, 1 ч. л. оливкової олії, цедру 1 лимона, перемішайте та приберіть у холодильник на кілька годин. Відваріть 400 г очищеної картоплі в підсоленій воді, злийте воду, додайте 20 г вершкового масла, 70–100 мл теплого молока і розімніть у гладке пюре. Для бефстроганов наріжте 300 г яловичини тонкими смужками, посоліть, поперчіть і швидко обсмажте на сильному вогні з 1 ст. л. олії по 2–3 хвилини, після чого перекладіть на тарілку. На тій же сковорідці обсмажте нарізану цибулину та 200 г печериць, всипте 1 ч. л. борошна, перемішайте і додайте 80 мл вершків 20%, 1 ч. л. гірчиці, поверніть яловичину и тушкуйте під кришкою на слабкому вогні 5–7 хвилин.»,

    «Тушкований хек з томатами і булгур»: «100 г булгуру – відваріть, додайте 10 г вершкового масла. 2 шматки (400 г) філе білої риби (тріска, хек, дорадо), приправте сіллю, перцем і збризніть 1 ч. л. оливкової олії, злегка втираючи її, відставте. Сковороду змастіть олією, додайте дрібно нарізану червону цибулину, 2 грубо подрібнені зубчики часнику та дрібку солі, готуйте на середньому вогні 3 хвилини до м’якості. Додайте 1 ст. л. каперсів, 400 г помідорів чері, нарізаний смужками болгарський перець та 1 ч. л. сушеного орегано. Зменште вогонь і тушкуйте, розминаючи помідори виделкою до густого рагу, потім покладіть 20 г оливок. Викладіть рибу поверх соусу, накрийте кришкою й тушкуйте 10–12 хвилин на слабкому вогні.»,

    «Запечений батат з грибами, шпинатом та моцарелою»: «Добре помийте 2 картоплини батату (по 200 г кожна), зробіть дірочки виделкою, натріть 1 ч. л. оливкової олії та посоліть. Загорніть їх у фольгу і запікайте до м’якості при 180°С протягом 30–40 хвилин. Тим часом наріжте 300 г печериць, 1 цибулину та 2 зубчики часнику, після чого підсмажте все на 1 ст. л. оливкової олії до готовності. Наприкінці додайте до грибів 50 г шпинату, 10 г вершкового масла, приправте за смаком і тушкуйте ще 2 хвилини. Для соусу змішайте 50 г густого йогурту, цедру половини лимона, лимонний сік за смаком, 20 г дрібно порізаного кропу та сіль. Викладіть на тарілку гарячий батат, зробіть повздовжній розріз, обережно розімніть м’якоть виделкою, змастіть йогуртовим соусом, викладіть зверху гриби зі шпинатом та додайте половинку кульки моцарели.»,

    «Холодна паста з куркою та песто»: «Наріжте кубиками 400 г курячого філе та посоліть його. На пательню викладіть 40 г нарізаного бекону, додайте шматочки курки та обсмажте все разом на виділеному з бекону жирі до готовності. Відваріть 120 грамів сухої пасти в підсоленій воді до готовності, злийте воду і залиште остигати. Наріжте 50 грамів свіжого шпинату, 1 червону цибулю, 20 грамів зеленої цибулі, 2 огірки, 1 солодкий перець та 60 грамів зелених оливок. З’єднайте пасту, овочі, курку з беконом, сік ¼ лимона та 1 ст. л. червоного песто з в’ялених томатів. Посоліть, поперчіть і ретельно перемішайте. Подавайте охолодженим.»,

    «Нічна вівсянка з малиною та арахісовою пастою»: «Змішайте в банці 40 г плющеної вівсянки, 10 г чіа (1 ст. л.), 150 г молока, 100 г йогурту, 5-10 г ванільного екстракту чи цукру і 1 ч. л. меду (можна замінити на будь-який інший рідкий підсолоджувач). Струсіть все і перемішайте. Закрийте вівсянку кришкою і поставте в холодильник на ніч. Зранку вівсянка готова до споживання, перед подачею додайте 150 г ягід малини і 20 г арахісової пасти.»,

    «Боул з лососем і хрумким рисом»: «Промийте та відваріть 50 г рису басматі, змішайте його з 1 ч. л. олії чилі, ½ ст. л. соєвого соусу, викладіть на деко та запікайте в духовці при 190°С близько 30 хвилин, періодично помішуючи. Намажте 200 г сирого лосося сумішшю з ½ ч. л. солі, перцю, 1 ч. л. часникового порошку і запікайте в духовці або аерогрилі при 190°С протягом 13–16 хвилин, після чого розберіть на шматочки. Заморожені очищені боби едамаме (150 г) залийте окропом на 2–3 хвилини, після чого злийте воду і промийте холодною водою. Для заправки ретельно змішайте 100 г густого йогурту, 1 ст. л. легкого майонезу, 1 ч. л. кунжутної олії, ½ ст. л. рисового оцту, 2 ст. л. соєвого соусу, 1 ч. л. меду, по ½ ч. л. меленого імбиру й часникового порошку, сіль та перець. З’єднайте половину запеченого рису, едамаме та лосося, нарізаний огірок, ½ подрібненої червоної цибулі, 100 г нашаткованої червоної капусти, полийте все половиною соусу, перемішайте та посипте зеленою цибулею і насінням кунжуту.»,

    «Лаймова курка з салатом з квасолі»: «Замаринуйте 300 г нарізаного смужками філе курячої грудки в суміші соку ½ лимона, 1 ч. л. меду, по ½ ч. л. копченої паприки, гранульованого часнику, орегано, оливкової олії, солі та перцю на 15–20 хвилин, после чого обсмажте на пательні до готовності. Для салату збризніть лимонним соком ½ тонко нарізаної червоної цибулини, залиште на пару хвилин, потім додайте 1 банку зцідженої великої квасолі, 200 г помідорів чері, 1 нарізаний огірок, 30 г подрібненої петрушки та 40 г оливок. Збризніть оливковою олією і 1–2 ч. л. червоного винного оцту. Збийте блендером 80 г фети, 150 г грецького йогурту, 1 ч. л. меду, дрібку солі до кремового стану. Розкладіть салат у тарілку, зверху викладіть курку, додайте порцію соусу.»,

    «Яблучні вафлі»: «Перебийте блендером 100 г кисломолочного сиру, 1 яйце, 50 г йогурту, 0.5 ч. л. розпушувача та 50 г борошна до однорідності. Додайте 100 г тертих яблук, дрібку солі, цукор за потреби, ретельно перемішайте та випікайте у вафельниці (або обсмажте на сковорідці як оладки) протягом 5–7 хвилин. Подавайте готові вафлі з 50 г несолодкого йогурту та 15 г арахісової пасти.»,

    «Яєчний салат з йогуртом та авокадо»: «Зваріть круто 2 яйця. 1 пагін селери, 2-3 пагони зеленої цибулі, огірок і 1 невелике авокадо, яйця, наріжте кубиками та складіть у миску. Додайте 1 ст. л. грецького йогурту, 1 ч. л. гірчиці, сіль і перець, додайте заправку до нарізаних інгредієнтів і обережно перемішайте до кремової текстури. 80 г цільнозернового хліба підсмажте до хрумкої скоринки та подавайте з салатом.»,

    «Тако-боул з яловичиною та картоплею»: «Батат (200 г) та картоплю (200 г) наріжте кільцями, середньої товщини, додайте улюблені спеції, посоліть і збризніть 1 ч. л. оливкової олії. Перекладіть на деко, застелене пергаментним папером тонким шаром і запечіть при 180°С 15-25 хв, до готовності. 300 г нежирного яловичого фаршу обсмажте на сковорідці разом з 1 дрібно нарізаною цибулиною до готовності, додайте сванську сіль та відставте. Наріжте дрібним кубиком 1 невеликий солодкий перець, 1 томат та ½ червоної цибулі, посоліть і заправте 1 ч. л. оливкової олії, збризніть лимонним соком. Викладіть в тарілку картоплю, фарш та салат.»,

    «Салат з квасолею, куркою та кукурудзою»: «Наріжте 300 г курячого філе шматочками, приправте за смаком і обсмажте на сковорідці з 1 ч. л. олії до готовності. Попередньо відваріть 2 середні качани кукурудзи в солоній воді та зріжте з них зерна ножем. Приготуйте соус: збийте 1 ст. л. оливкової олії, 1 ст. л. яблучного оцту, 1 ст. л. соку лайма, 1 ч. л. меду, по ½ ч. л. копченої паприки та часникового порошку, ½ ч. л. солі й ¼ ч. л. чорного перцю. У велику миску викладіть 1 банку промитої та зцідженої квасолі, зрізану кукурудзу, дрібно нарізаний солодкий перець, 150 г розрізаних навпіл помідорів чері, дрібно нарізану червону цибулину, подрібнену кінзу або петрушку та шматочки готової курки. Полийте салат заправкою, ретельно перемішайте та поставте в холодильник щонайменше на 30 хвилин перед подачею.»

};

 

function getRecipeByTitle(title) { 

    return fullRecipes[title] || «Інгредієнти та спосіб приготування: свіжі продукти згідно з меню. Дотримуйтесь інструкції «здорової тарілки».»; 

}

 

// —————— ДАНІ МЕНЮ (КОРЗИНИ, КАЛЕНДАР, ДЕСЕРТИ) ——————

const basketsData = {

   1: { title: «🛒 Корзина тиждень 1», items: { 

        «🥬 Овочі»: [«160г листової зелені», «Пряні трави (цибуля, кріп, петрушка, базилік)», «2 солодких перці», «600г томатів чері», «1 огірок», «750г спаржі», «2 маленькі кабачки», «400г молодої картоплі», «2 морквини», «300г брюссельської капусти», «400г цибулі порей», «200г горошку в стручках», «1 авокадо», «300г інших овочів»], 

        «🌾 Крупи»: [«Вівсянка плющена», «Гречка», «Булгур», «Кіноа чорна», «Рис Басматі», «Птітім», «Макарони твердих сортів», «Удон або соба»],

        «🍗 М’ясо/Риба»: [«400г курячого філе», «4 курячі гомілки», «300г яловичої вирізки», «300г філе лосося», «150г креветок», «300г філе тріски», «300г яловичого язика»], 

        «🥛 Молочні»: [«400г сиру 5%», «300г йогурту», «70г фети», «180мл молока», «60-125мл вершків 20%», «55г пармезану», «1 уп. моцарели міні»], 

        «🍓 Фрукти»: [«900г лохини», «750г черешні», «600г полуниці»], 

        «🥫 Консерви»: [«2 банки тунця», «1 банка нуту», «65г кокосових вершків»], 

        «🥚 Інше»: [«11 яєць», «30г насіння», «160г хліба», «1 тортилья», «оливки», «в’ялені томати»]    } },

    2: { 

        title: «🛒 Корзина тиждень 2», 

        items: { 

            «🥬 Овочі»: [«100г зелені», «Пряні трави (цибуля, кріп)», «140г шпинату», «2 перці», «650г томатів», «9 огірків», «1 кабачок», «1 баклажан», «400г картоплі», «600г батату», «3 морквини», «1 буряк», «300г печериць», «400г броколі», «100г порею», «100г едамаме», «1 авокадо»], 

            «🌾 Крупи»: [«Вівсянка плющена», «Булгур», «Рис Басматі», «Макарони твердих сортів», «Фунчоза 60г»],

            «🍗 М’ясо/Риба»: [«800г курки», «300г яловичини», «120г креветок», «400г хека», «1 скумбрія 300г»], 

            «🥛 Молочні»: [«300г сиру», «150г йогурту», «140г фети», «300мл молока», «20мл вершків», «40г пармезану», «100г моцарели», «400г кефіру»], 

            «🍑 Фрукти»: [«150г полуниці», «600г лохини», «900г черешні», «600г абрикосів»], 

            «🥫 Консерви»: [«1 банка тунця 80г», «1 банка нуту», «400г тофу»], 

            «🥚 Інше»: [«10 яєць», «70г горіхів», «160г хліба», «10г кунжуту», «оливки»] 

        } 

    },

   3: { 

        title: «🛒 Корзина тиждень 3», 

        items: { 

            «🥬 Овочі»:[«100г салату», «Пряні трави (цибуля, кріп, петрушка)», «90г шпинату»,»7 перців»,»1000г томатів»,»5 огірків»,»1 кабачок»,»1 баклажан»,»800г картоплі»,»400г батату»,»4 морквини»,»200г броколі»,»1 порей»,»1 фенхель»,»2 авокадо»], 

            «🌾 Крупи»: [«Кіноа чорна», «Макарони твердих сортів», «Фунчоза 60г», «Ньоки 200г»],

            «🍗 М’ясо/Риба»:[«300г курки»,»2 стегна»,»300г фаршу»,»400г креветок»,»500-600г дорадо»,»400г лосося»], 

            «🥛 Молочні»:[«400г сиру»,»300г йогурту»,»200г фети»,»250г рікоти»,»30г пармезану»], 

            «🍊 Фрукти»:[«апельсин 1 шт»,»грейпфрут 1 шт»,»4 персика»,»300г лохини»,»250г малини»,»600г кавуна»], 

            «🥫 Консерви»:[«1 банка тунця 185г»,»1 банка квасолі»,»1 банка кукурудзи»], 

            «🥚 Інше»:[«10 яєць»,»10г горіхів»,»200г хліба»,»кунжут»,»оливки»,»норі 1 пачка»] 

        } 

    },

   4: { 

        title: «🛒 Корзина тиждень 4», 

        items: { 

            «🥬 Овочі»:[«100г зелені», «Пряні трави (цибуля, кріп, петрушка)», «100г шпинату»,»2 перці»,»900г томатів»,»6 огірків»,»100г редиски»,»700г кабачків»,»1 баклажан»,»700г картоплі»,»400г батату»,»1 морква»,»600г печериць»,»200г червоної капусти»,»150г едамаме»,»авокадо»], 

            «🌾 Крупи»: [«Вівсянка плющена», «Булгур», «Рис Басматі», «Макарони твердих сортів»],

            «🍗 М’ясо/Риба»:[«700г курки»,»300г індички»,»300г яловичини»,»400г хека»,»200г лосося»,»100г бекону»], 

            «🥛 Молочні»:[«100г сиру»,»600г йогурту»,»150г фети»,»200г моцарели»,»250мл молока»,»120мл вершків»,»500мл кефіру»], 

            «🍈 Фрукти»:[«4 персики»,»600г кавуна»,»600г дині»,»750г малини»], 

            «🥫 Консерви»:[«1 банка квасолі»], 

            «🥚 Інше»:[«7 яєць»,»10г горіхів»,»320г хліба»,»кунжут»,»чіа 1 ст.л.»,»оливки 140г»] 

        } 

    },

    extra: { title: «🛒 Корзина 29-31 дні», items:{ 

            «🥬 Овочі»:[«20г зелені», «Пряні трави (цибуля, петрушка, базилік)», «2 перці»,»150г томатів»,»2 огірки»,»1 стебло селери»,»1 кабачок»,»200г картоплі»,»200г батату»,»1 авокадо»], 

            «🌾 Крупи»: [«Вівсянка плющена», «Макарони твердих сортів»],

            «🍗 М’ясо/Риба»:[«300г курки»,»300г фаршу»], 

            «🥛 Молочні»:[«200г сиру»,»130г йогурту»,»200мл молока»,»20г пармезану»], 

            «🍉 Фрукти»:[«600г кавуна»,»400г дині»,»100г малини»], 

            «🥫 Консерви»:[«1 банка тунця 185г»,»1 банка квасолі»], 

            «🥚 Інше»:[«3 яйця»,»80г хліба»,»оливки»,»каперси»] 

        } }

};

const weeksCalendar = {

    1: { title: «Тиждень 1 · Освіжаючий», macro: «≈1620 ккал», days: [{dayName:»Понеділок 1″,breakfast:»Авокадо-тост з сиром та яйцем»,lunch:»Паста з кабачками і тунцем»,dinner:»Лимонні гомілки з картоплею та спаржею»},{dayName:»Вівторок 2″,breakfast:»Вівсянка з песто і яйцем»,lunch:»Лимонні гомілки з картоплею та спаржею»,dinner:»Тушкована тріска з креветками в соусі карі»},{dayName:»Середа 3″,breakfast:»Яєчний млинець з сиром і ягодами»,lunch:»Тушкована тріска з креветками в соусі карі»,dinner:»Локшина з яловичиною та овочами»},{dayName:»Четвер 4″,breakfast:»Яєчний салат з в’яленими томатами»,lunch:»Локшина з яловичиною та овочами»,dinner:»Медово-кунжутна курка з рисом та овочами»},{dayName:»П’ятниця 5″,breakfast:»Вівсянка з яйцем, фетою і томатами»,lunch:»Медово-кунжутна курка з рисом та овочами»,dinner:»Птітім з лососем та пореєм»},{dayName:»Субота 6″,breakfast:»Сирники з черешнею»,lunch:»Птітім з лососем та пореєм»,dinner:»Тушкований язик з овочами та гречкою»},{dayName:»Неділя 7″,breakfast:»Тортилья з омлетом та тунцем»,lunch:»Тушкований язик з овочами та гречкою»,dinner:»Боул з нутом та спаржею»}] },

    2: { title: «Тиждень 2 · Ягодно-пряний», macro: «≈1630 ккал», days: [{dayName:»Понеділок 8″,breakfast:»Вівсянка з беконом, фетою і перцем»,lunch:»Боул з нутом та спаржею»,dinner:»Салат-паста з куркою»},{dayName:»Вівторок 9″,breakfast:»Йогурт-боул з нутом та яйцем»,lunch:»Салат-паста з куркою»,dinner:»Маринована скумбрія з картоплею»},{dayName:»Середа 10″,breakfast:»Томатна вівсянка з куркою»,lunch:»Маринована скумбрія з картоплею»,dinner:»Скляна локшина з телятиною»},{dayName:»Четвер 11″,breakfast:»Шакшука з креветками»,lunch:»Холодник»,dinner:»Скляна локшина з телятиною»},{dayName:»П’ятниця 12″,breakfast:»Сирні вафлі з тунцем та авокадо»,lunch:»Холодник»,dinner:»Курка з едамаме і арахісовим соусом»},{dayName:»Субота 13″,breakfast:»Омлет з баклажанами і моцарелою»,lunch:»Курка з едамаме і арахісовим соусом»,dinner:»Хек у місо-масці з бататом та броколі»},{dayName:»Неділя 14″,breakfast:»Сирна галета з абрикосами і мигдалем»,lunch:»Хек у місо-масці з бататом та броколі»,dinner:»Тофу з булгуром і битими огірками»}] },

    3: { title: «Тиждень 3 · Середземномор’я», macro: «≈1635 ккал», days: [{dayName:»Понеділок 15″,breakfast:»Сирна галета з абрикосами і мигдалем»,lunch:»Тофу з булгуром і битими огірками»,dinner:»Салат-паста з куркою та квасолею»},{dayName:»Вівторок 16″,breakfast:»Боул з бататом та яйцями»,lunch:»Салат-паста з куркою та квасолею»,dinner:»Дорадо з овочами і картоплею»},{dayName:»Середа 17″,breakfast:»Авокадо-тост з омлетом»,lunch:»Дорадо з овочами і картоплею»,dinner:»Боул з фрикадельками та запеченим перцем»},{dayName:»Четвер 18″,breakfast:»Рол у тортильї з тунцем та норі»,lunch:»Боул з фрикадельками та запеченим перцем»,dinner:»Запечені ньоки з квасолею, овочами і фетою»},{dayName:»П’ятниця 19″,breakfast:»Ліниві вареники з персиками-гриль і рікотою»,lunch:»Запечені ньоки з квасолею, овочами і фетою»,dinner:»Запечена картопля з куркою та фенхелем»},{dayName:»Субота 20″,breakfast:»Сирний омлет зі шпинатом»,lunch:»Запечена картопля з куркою та фенхелем»,dinner:»Фунчоза з креветками і грейпфрутом»},{dayName:»Неділя 21″,breakfast:»Тости з фетою, яйцями і маринованим перцем»,lunch:»Фунчоза з креветками і грейпфрутом»,dinner:»Запечений лосось з бататом і овочами»}] },

    4: { title: «Тиждень 4 · Насичений», macro: «≈1640 ккал», days: [{dayName:»Понеділок 22″,breakfast:»Вівсянка з беконом, фетою і перцем»,lunch:»Запечений лосось з бататом і овочами»,dinner:»Лаймова курка з салатом з квасолі»},{dayName:»Вівторок 23″,breakfast:»Намазка з лосося, авокадо та огірка на тостах»,lunch:»Лаймова курка з салатом з квасолі»,dinner:»Пюре з бефстроганов та маринованими кабачками»},{dayName:»Середа 24″,breakfast:»Ліниві вареники з персиками-гриль і рікотою»,lunch:»Пюре з бефстроганов та маринованими кабачками»,dinner:»Тушкований хек з томатами і булгур»},{dayName:»Четвер 25″,breakfast:»Шакшука з грибами і баклажаном»,lunch:»Йогуртовий суп з індичкою»,dinner:»Тушкований хек з томатами і булгур»},{dayName:»П’ятниця 26″,breakfast:»Запечений омлет з сиром та кабачками»,lunch:»Йогуртовий суп з індичкою»,dinner:»Запечений батат з грибами, шпинатом та моцарелою»},{dayName:»Субота 27″,breakfast:»Запечений омлет з сиром та кабачками»,lunch:»Запечений батат з грибами, шпинатом та моцарелою»,dinner:»Холодна паста з куркою та песто»},{dayName:»Неділя 28″,breakfast:»Нічна вівсянка з малиною та арахісовою пастою»,lunch:»Холодна паста з куркою та песто»,dinner:»Боул з лососем і хрумким рисом»}] },

    extra: { title: «Фінал · 3 додаткові дні», macro: «≈1615 ккал», days: [{dayName:»Понеділок 29″,breakfast:»Яблучні вафлі»,lunch:»Боул з лососем і хрумким рисом»,dinner:»Салат з квасолею, куркою та кукурудзою»},{dayName:»Вівторок 30″,breakfast:»Яєчний салат з йогуртом та авокадо»,lunch:»Салат з квасолею, куркою та кукурудзою»,dinner:»Тако-боул з яловичиною та картоплею»},{dayName:»Середа 31″,breakfast:»Вівсянка з малиною та арахісовою пастою»,lunch:»Тако-боул з яловичиною та картоплею»,dinner:»Паста з кабачками і тунцем»}] }

};

const dessertsList = [

    { name:»Ліниві мочі», kcal:60, recipe:»У мисці ретельно змішайте 150 г густого йогурту 1,5-3%, 100 г рікоти, 15 г нежирного згущеного молока та ванільний екстракт до однорідного крему. Додайте в отриману масу дрібно нарізану свіжу полуницю (150 г) та обережно перемішайте. Намочіть 1 аркуш рисового паперу (всього потрібно 5 шт) теплою водою, щоб він став м’яким. Покладіть порцію полунично-кремової начинки в центр аркуша і акуратно складіть краї конвертиком. Посипте кожну порцію кукурудзяним крохмалем. Охолодіть 4 години.» },

    { name:»Мигдалеві цукерки», kcal:116, recipe:»Збийте блендером 100 г кисломолочного сиру 5% до однорідної маси. Додайте 100 г мигдалевого борошна, 60 г арахісової пасти, 20-30 г еритрітолу та дрібку солі, ретельно перемішайте. Сформуйте 10 кульок і відправте їх у морозильну камеру на 2-3 години. Розтопіть 45 г шоколаду із 1 ч.л. кокосової олії, покрийте кожну кульку глазур’ю і поверніть у холодильник на 30 хвилин.» },

    { name:»Пиріг з лохиною», kcal:125, recipe:»У великій мисці збийте 500 г густого йогурту 3%, 2 яйця, 40 г розтопленого вершкового масла, 60-80 г еритрітолу, 25 г кукурудзяного крохмалю і дрібку солі до однорідної маси. Вмішайте 150 г чорниці/лохини. Вилийте масу у форму з пергаментом і запікайте при 180°С на 40 хвилин. Залиште пиріг вистигати у вимкненій духовці. Розтопіть 45 г шоколаду із 1 ч.л. кокосової олії, полийте пиріг і поставте в холодильник.» },

    { name:»Морозиво з фініками», kcal:140, recipe:»Залийте 50 г фініків окропом на 10 хв і дістаньте кісточки. Збийте 200 г пастоподібного сиру з 50 г сметани 20% та фініками до однорідної текстури, додайте ванільний екстракт за смаком. Перекладіть у форму з кришкою і заморозьте протягом 3-4 годин. Перед подачею дайте йому трохи підтанути.» }

];

 

// —————— ЛОГІКА СИНХРОНІЗАЦІЇ ТА РЕНДЕРУ ——————

let currentUser = null, currentUserName = null, currentModalDayKey = null;

 

function getStorageKey(type) { return `summer2026_${type}_${currentUser}`; }

 

function loadCheckState() { 

    if(!currentUser) return {}; 

    const raw = localStorage.getItem(getStorageKey(‘checks’)); 

    let parsed = raw ? JSON.parse(raw) : {}; 

    return (Array.isArray(parsed) || typeof parsed !== ‘object’) ? {} : parsed; 

}

function loadCompletedState() { 

    if(!currentUser) return {}; 

    const raw = localStorage.getItem(getStorageKey(‘completed’)); 

    let parsed = raw ? JSON.parse(raw) : {}; 

    return (Array.isArray(parsed) || typeof parsed !== ‘object’) ? {} : parsed; 

}

function loadNotes() { 

    if(!currentUser) return {}; 

    const raw = localStorage.getItem(getStorageKey(‘notes’)); 

    let parsed = raw ? JSON.parse(raw) : {}; 

    return (Array.isArray(parsed) || typeof parsed !== ‘object’) ? {} : parsed; 

}

 

function saveCheckState(state) { if(!currentUser) return; localStorage.setItem(getStorageKey(‘checks’), JSON.stringify(state)); refreshAllBaskets(); syncToWordPress(); }

function saveCompletedState(state) { if(!currentUser) return; localStorage.setItem(getStorageKey(‘completed’), JSON.stringify(state)); syncToWordPress(); }

function saveNotes(notes) { if(!currentUser) return; localStorage.setItem(getStorageKey(‘notes’), JSON.stringify(notes)); renderNotesTab(); syncToWordPress(); }

 

function saveNoteForDay(dayId,text){ let n=loadNotes(); if(text.trim()===»») delete n[dayId]; else n[dayId]=text; saveNotes(n); }

function getNoteForDay(dayId){ return loadNotes()[dayId]||»»; }

 

function refreshAllBaskets(){ if(document.querySelector(‘.tab-btn.active’)?.getAttribute(‘data-tab’)===’checklists’) renderChecklists(); for(let wk in basketsData) refreshWeekBasket(wk); }

 

function refreshWeekBasket(weekKey){

    let cont=document.getElementById(`basket-content-${weekKey}`);

    if(!cont) return;

    let state=loadCheckState();

    let inner=»;

    for(let[cat,items] of Object.entries(basketsData[weekKey].items)){

        inner+=`<div class=»cat-group»><h4>${cat}</h4><div class=»items-grid»>`;

        items.forEach(it=>{

            let id=`${weekKey}_${it.replace(/[^a-zа-яії0-9]/gi,’_’)}`;

            let checked=(state[weekKey]&&state[weekKey][id])?’checked’:»;

            inner+=`<div class=»check-item»><input type=»checkbox» id=»${id}» data-week=»${weekKey}» data-item=»${it}» ${checked}> <label for=»${id}»>${it}</label></div>`;

        });

        inner+=`</div></div>`;

    }

    cont.innerHTML=inner;

    cont.querySelectorAll(‘.check-item input’).forEach(cb=>{

        cb.addEventListener(‘change’,()=>{

            let st=loadCheckState();

            if(!st[cb.dataset.week]) st[cb.dataset.week]={};

            st[cb.dataset.week][cb.id]=cb.checked;

            saveCheckState(st);

        });

    });

}

 

function getFullRecipeHTML(weekTitle, breakfast, lunch, dinner){ 

    return `<div class=»meal-card»><div class=»meal-title»>🥣 СНІДАНОК · ${breakfast}</div><div class=»meal-desc»><strong>Рецепт:</strong> ${getRecipeByTitle(breakfast)}</div></div>

            <div class=»meal-card»><div class=»meal-title»>🥗 ОБІД · ${lunch}</div><div class=»meal-desc»><strong>Рецепт:</strong> ${getRecipeByTitle(lunch)}</div></div>

            <div class=»meal-card»><div class=»meal-title»>🌙 ВЕЧЕРЯ · ${dinner}</div><div class=»meal-desc»><strong>Рецепт:</strong> ${getRecipeByTitle(dinner)}</div></div>`; 

}

 

function renderChecklists(){

    let container=document.getElementById(«checklistsPane»);

    let html='<div class=»baskets-container»>’;

    for(let wk in basketsData){

        let w=basketsData[wk];

        html+=`<div class=»basket-week» data-week=»${wk}»><div class=»basket-header»><span>🛒 ${w.title}</span><div class=»basket-actions»><span class=»send-icon» data-week=»${wk}»>📤</span><span class=»pdf-icon» data-week=»${wk}»>📄</span></div></div><div class=»basket-cats» id=»basket-${wk}»></div><button class=»clear-basket» data-week=»${wk}» style=»display:none;»>🗑️ Очистити</button></div>`;

    }

    html+='</div>’;

    container.innerHTML=html;

    for(let wk in basketsData){

        let catsDiv=document.getElementById(`basket-${wk}`);

        if(!catsDiv) continue;

        let inner=»;

        for(let[cat,items] of Object.entries(basketsData[wk].items)){

            inner+=`<div class=»cat-group»><h4>${cat}</h4>`;

            items.forEach(it=>{

                let id=`${wk}_${it.replace(/[^a-zа-яії0-9]/gi,’_’)}`;

                let checked=(loadCheckState()[wk]&&loadCheckState()[wk][id])?’checked’:»;

                inner+=`<div class=»check-item»><input type=»checkbox» id=»${id}» data-week=»${wk}» data-item=»${it}» ${checked}> <label for=»${id}»>${it}</label></div>`;

            });

            inner+=`</div>`;

        }

        catsDiv.innerHTML=inner;

    }

    document.querySelectorAll(‘.check-item input’).forEach(cb=>{

        cb.addEventListener(‘change’,()=>{

            let st=loadCheckState();

            if(!st[cb.dataset.week]) st[cb.dataset.week]={};

            st[cb.dataset.week][cb.id]=cb.checked;

            saveCheckState(st);

        });

    });

    document.querySelectorAll(‘.basket-week’).forEach(wd=>{

        let cats=wd.querySelector(‘.basket-cats’), clearBtn=wd.querySelector(‘.clear-basket’), header=wd.querySelector(‘.basket-header’);

        header.addEventListener(‘click’,(e)=>{

            if(e.target.closest(‘.send-icon’)||e.target.closest(‘.pdf-icon’)) return;

            cats.classList.toggle(‘open’);

            clearBtn.style.display=cats.classList.contains(‘open’)?’block’:’none’;

        });

        clearBtn.addEventListener(‘click’,(e)=>{

            e.stopPropagation();

            let st=loadCheckState();

            delete st[wd.dataset.week];

            saveCheckState(st);

            renderChecklists();

        });

        wd.querySelector(‘.send-icon’)?.addEventListener(‘click’,(e)=>{

            e.stopPropagation();

            sendMessageVia(`Кошик: ${basketsData[wd.dataset.week].title}`,’telegram’);

        });

        wd.querySelector(‘.pdf-icon’)?.addEventListener(‘click’,(e)=>{

            e.stopPropagation();

            generateBasketPDF(wd.dataset.week,basketsData[wd.dataset.week].title);

        });

    });

}

 

function generateBasketPDF(weekKey,title){

    if(typeof html2pdf !== ‘function’) return alert(‘Помилка генерації PDF.’);

    let content=`<div style=»font-family:Georgia;»><h1>${title}</h1>`;

    for(let[cat,items] of Object.entries(basketsData[weekKey].items)) content+=`<h2>${cat}</h2><ul>${items.map(i=>`<li>${i}</li>`).join(»)}</ul>`;

    content+=`</div>`;

    let el=document.createElement(‘div’);

    el.innerHTML=content;

    document.body.appendChild(el);

    html2pdf().from(el).set({margin:0.5,filename:`${title}.pdf`}).save().then(()=>el.remove());

}

 

function sendMessageVia(text,platform){

    let plain=text.replace(/<[^>]*>?/gm,»).substring(0,2000);

    if(platform===’whatsapp’) window.open(`https://wa.me/?text=${encodeURIComponent(plain)}`,’_blank’);

    else window.open(`https://t.me/share/url?url=${encodeURIComponent(«Меню Літо 2026»)}&text=${encodeURIComponent(plain)}`,’_blank’);

}

 

function renderProgress() {

    let container = document.getElementById(«progressGridContainer»);

    if(!container) return;

    let completed = loadCompletedState();

    let html = ‘<div class=»progress-grid»>’;

    let dayNum = 1;

    // Iterate through calendar to generate days sequentially

    for(let idx in weeksCalendar){

        let week = weeksCalendar[idx];

        week.days.forEach((d, i) => {

            let key = `${idx}_${i}`;

            let isCompleted = completed[key];

            let classes = isCompleted ? ‘progress-day crossed-out’ : ‘progress-day’;

            html += `<div class=»${classes}» onclick=»if(!this.classList.contains(‘crossed-out’)) openDayFromGrid(‘${idx}’, ${i})»>${dayNum}</div>`;

            dayNum++;

        });

    }

    html += ‘</div>’;

    container.innerHTML = html;

}

 

window.openDayFromGrid = function(weekIdx, dayIdx) {

    document.querySelector(‘.tab-btn[data-tab=»calendar»]’).click();

    let weekCard = document.querySelector(`.week-card[data-week-idx=»${weekIdx}»]`);

    if(weekCard && weekCard.classList.contains(‘collapsed’)) {

        weekCard.classList.remove(‘collapsed’);

    }

    let dayEl = document.querySelector(`.day-mini[data-week=»${weekIdx}»][data-dayidx=»${dayIdx}»]`);

    if(dayEl) {

        dayEl.scrollIntoView({behavior: ‘smooth’, block: ‘center’});

        setTimeout(() => dayEl.click(), 300); // Activate modal

    }

}

 

function renderCalendar(){

    let container=document.getElementById(«calendarPane»);

    let completed=loadCompletedState();

    let html='<div class=»calendar-grid»>’;

    for(let idx in weeksCalendar){

        let week=weeksCalendar[idx];

        let displayTitle=week.title;

        html+=`<div class=»week-card collapsed» data-week-idx=»${idx}»><div class=»week-summary»><span><strong>${displayTitle}</strong> ${week.macro}</span><span class=»week-arrow»>▼</span></div><div class=»days-vertical»>`;

        week.days.forEach((d,i)=>{

            let match=d.dayName.match(/(.+?)\s+(\d+)/);

            let dName=match?match[1]:d.dayName, dNum=match?match[2]:»📅»;

            let isCompleted=completed[`${idx}_${i}`]?’checked’:»;

            let completedClass=isCompleted?’completed-day’:»;

            html+=`<div class=»day-mini ${completedClass}» data-week=»${idx}» data-dayidx=»${i}»><div class=»day-header»><div class=»day-num-icon»>${dNum}</div><div class=»day-name-text»>${dName}</div><input type=»checkbox» class=»day-completed-check» data-week=»${idx}» data-day=»${i}» ${isCompleted}></div><div class=»day-meals-preview»><div>🍳 ${d.breakfast}</div><div>🥗 ${d.lunch}</div><div>🌙 ${d.dinner}</div></div></div>`;

        });

        html+=`</div><div class=»week-basket»><div class=»basket-header-mini» data-week=»${idx}»><span>📦 Корзина тижня (сітка)</span><div class=»basket-actions-mini»><span class=»mini-send» data-week=»${idx}»>📤</span><span class=»mini-pdf» data-week=»${idx}»>📄</span><span class=»mini-toggle»>▶</span></div></div><div class=»basket-content» id=»basket-content-${idx}»></div></div></div>`;

    }

    html+='</div>’;

    container.innerHTML=html;

    for(let idx in basketsData) refreshWeekBasket(idx);

    document.querySelectorAll(‘.week-summary’).forEach(h=>h.addEventListener(‘click’,()=>h.parentElement.classList.toggle(‘collapsed’)));

    document.querySelectorAll(‘.day-mini’).forEach(el=>{

        el.addEventListener(‘click’,(e)=>{

            if(e.target.closest(‘.day-completed-check’)) return;

            let week=el.dataset.week, dayIdx=parseInt(el.dataset.dayidx), day=weeksCalendar[week].days[dayIdx];

            let htmlRecipe=getFullRecipeHTML(weeksCalendar[week].title, day.breakfast, day.lunch, day.dinner);

            currentModalDayKey=`${weeksCalendar[week].title} · ${day.dayName}`;

            document.getElementById(«modalTitle»).innerHTML=`📅 ${currentModalDayKey}`;

            document.getElementById(«modalRecipeContent»).innerHTML=htmlRecipe;

            document.getElementById(«dayNoteText»).value=getNoteForDay(currentModalDayKey);

            document.getElementById(«fullRecipeModal»).classList.add(«active»);

        });

    });

    document.querySelectorAll(‘.day-completed-check’).forEach(chk=>{

        chk.addEventListener(‘change’,()=>{

            let week=chk.dataset.week, day=chk.dataset.day, state=loadCompletedState(), key=`${week}_${day}`;

            if(chk.checked) state[key]=true; else delete state[key];

            saveCompletedState(state);

            chk.closest(‘.day-mini’).classList.toggle(‘completed-day’, chk.checked);

            renderProgress(); // Update progress grid immediately!

        });

    });

    document.querySelectorAll(‘.basket-header-mini’).forEach(header=>{

        let weekIdx=header.dataset.week;

        let contentDiv=document.getElementById(`basket-content-${weekIdx}`);

        let toggleSpan=header.querySelector(‘.mini-toggle’);

        header.addEventListener(‘click’,(e)=>{

            if(e.target.closest(‘.mini-send’)||e.target.closest(‘.mini-pdf’)) return;

            refreshWeekBasket(weekIdx);

            contentDiv.classList.toggle(‘open’);

            toggleSpan.innerHTML=contentDiv.classList.contains(‘open’)?’▼’:’▶’;

        });

        header.querySelector(‘.mini-send’)?.addEventListener(‘click’,(e)=>{

            e.stopPropagation();

            sendMessageVia(`Кошик тижня ${weekIdx}`,’telegram’);

        });

        header.querySelector(‘.mini-pdf’)?.addEventListener(‘click’,(e)=>{

            e.stopPropagation();

            generateBasketPDF(weekIdx,basketsData[weekIdx].title);

        });

    });

}

 

function renderDesserts(){

    let container=document.getElementById(«dessertsPane»);

    let html='<div class=»desserts-grid»>’;

    dessertsList.forEach(d=>{

        html+=`<div class=»dessert-card»><h3>${d.name}</h3><div>🔥 ${d.kcal} ккал</div><button class=»btn-outline dessert-recipe-btn» data-recipe=»${d.recipe.replace(/»/g,’&quot;’)}» data-name=»${d.name}» style=»width:100%;margin-top:8px;»>📖 Рецепт</button></div>`;

    });

    html+='</div>’;

    container.innerHTML=html;

    document.querySelectorAll(‘.dessert-recipe-btn’).forEach(btn=>btn.addEventListener(‘click’,()=>{

        document.getElementById(«modalTitle»).innerHTML=`🍰 ${btn.dataset.name}`;

        document.getElementById(«modalRecipeContent»).innerHTML=`<div class=»meal-card»><div class=»meal-desc»><strong>Приготування:</strong> ${btn.dataset.recipe}</div></div>`;

        

        // Робимо нотатки для десертів активними і робочими

        currentModalDayKey = `Десерт · ${btn.dataset.name}`;

        document.getElementById(«dayNoteText»).value = getNoteForDay(currentModalDayKey);

        

        document.getElementById(«fullRecipeModal»).classList.add(«active»);

    }));

}

 

function renderNotesTab(){

    let notes=loadNotes();

    let container=document.getElementById(«userNotesList»);

    if(Object.keys(notes).length) container.innerHTML=Object.entries(notes).map(([day,txt])=>`<div class=»note-card»><h4>📅 ${day.toLowerCase()}</h4><p style=»white-space:pre-wrap;»>${txt}</p></div>`).join(»);

    else container.innerHTML=»<p>У вас поки немає збережених нотаток 📝</p>»;

}

 

function updateUI(){

    document.getElementById(«userPhoneDisplay»).innerText=currentUser;

    document.getElementById(«userNameDisplay»).innerText=currentUserName||»Гість»;

    document.getElementById(«profileNameInput»).value=currentUserName||»»;

    document.getElementById(«profilePhoneInput»).value=currentUser;

}

 

async function loadFromWordPress() {

    if (!currentUser) return;

    try {

        const response = await fetch(`${WP_API_URL}/get-user-data`, {

            method: ‘POST’,

            headers: { ‘Content-Type’: ‘application/json’ },

            body: JSON.stringify({ user_phone: currentUser })

        });

        if (!response.ok) throw new Error(‘Помилка сервера’);

        const data = await response.json();

        if (data && !data.error) {

            let inChecks = (Array.isArray(data.checks) || !data.checks) ? {} : data.checks;

            let inComp = (Array.isArray(data.completed) || !data.completed) ? {} : data.completed;

            let inNotes = (Array.isArray(data.notes) || !data.notes) ? {} : data.notes;

            localStorage.setItem(getStorageKey(‘checks’), JSON.stringify(inChecks));

            localStorage.setItem(getStorageKey(‘completed’), JSON.stringify(inComp));

            localStorage.setItem(getStorageKey(‘notes’), JSON.stringify(inNotes));

            renderChecklists();

            renderCalendar();

            renderProgress(); // Оновлюємо прогрес після синхронізації

            renderNotesTab();

        }

    } catch (e) { console.warn(‘Не вдалося завантажити дані з WP’, e); }

}

 

async function syncToWordPress() {

    if (!currentUser) return;

    const checks = loadCheckState();

    const completed = loadCompletedState();

    const notes = loadNotes();

    try {

        await fetch(`${WP_API_URL}/save-user-data`, {

            method: ‘POST’,

            headers: { ‘Content-Type’: ‘application/json’ },

            body: JSON.stringify({

                user_phone: currentUser,

                checks: checks,

                completed: completed,

                notes: notes

            })

        });

        console.log(‘✅ Дані успішно збережено в хмару WordPress’);

    } catch (e) { console.warn(‘Помилка синхронізації з базою даних WP’, e); }

}

 

function initApp() {

    currentUser = localStorage.getItem(«user_phone»);

    currentUserName = localStorage.getItem(«user_name») || «»;

    if (currentUser) {

        document.getElementById(«authModal»).style.display = «none»;

        document.getElementById(«appRoot»).style.display = «flex»;

        updateUI();

        renderChecklists();

        renderCalendar();

        renderProgress();

        renderDesserts();

        renderNotesTab();

        loadFromWordPress(); 

    } else {

        document.getElementById(«authModal»).style.display = «flex»;

        document.getElementById(«appRoot»).style.display = «none»;

    }

}

 

document.getElementById(«authSubmit»).addEventListener(«click», () => {

    let phone = document.getElementById(«authPhone»).value.trim();

    let code = document.getElementById(«authCode»).value.trim();

    

    if (phone && code === «2026») {

        localStorage.setItem(«user_phone», phone);

        if (!localStorage.getItem(«user_name»)) localStorage.setItem(«user_name», «»);

        

        currentUser = phone;

        

        // МИТТЄВА СИНХРОНІЗАЦІЯ: відправляємо профіль у WordPress відразу після входу

        syncToWordPress().then(() => {

            initApp();

        });

        

    } else {

        alert(«Невірний код або номер»);

    }

});

 

document.getElementById(«headerProfileBtn»).addEventListener(«click»,()=>document.getElementById(«profileModal»).classList.add(«active»));

document.getElementById(«closeProfile»).addEventListener(«click»,()=>document.getElementById(«profileModal»).classList.remove(«active»));

document.getElementById(«saveProfileBtn»).addEventListener(«click»,()=>{

    let newName=document.getElementById(«profileNameInput»).value.trim();

    let newPhone=document.getElementById(«profilePhoneInput»).value.trim();

    if(newPhone && newPhone!==currentUser){

        alert(«Для зміни номера вийдіть та увійдіть заново.»);

        return;

    }

    if(newName){

        localStorage.setItem(«user_name»,newName);

        currentUserName=newName;

        updateUI();

    }

    document.getElementById(«profileModal»).classList.remove(«active»);

});

document.getElementById(«logoutBtn»).addEventListener(«click»,()=>{

    localStorage.removeItem(«user_phone»);

    localStorage.removeItem(«user_name»);

    initApp();

    document.getElementById(«profileModal»).classList.remove(«active»);

});

document.getElementById(«closeRecipeModal»).addEventListener(«click»,()=>document.getElementById(«fullRecipeModal»).classList.remove(«active»));

document.getElementById(«sendRecipeWhatsApp»).addEventListener(«click»,()=>sendMessageVia(document.getElementById(«modalRecipeContent»).innerText,’whatsapp’));

document.getElementById(«sendRecipeTelegram»).addEventListener(«click»,()=>sendMessageVia(document.getElementById(«modalRecipeContent»).innerText,’telegram’));

document.getElementById(«downloadRecipePDF»).addEventListener(«click»,()=>{

    let el=document.createElement(‘div’);

    el.innerHTML=document.getElementById(«modalRecipeContent»).innerHTML;

    document.body.appendChild(el);

    if(typeof html2pdf === ‘function’) html2pdf().from(el).set({margin:0.5,filename:»recipe.pdf»}).save().then(()=>el.remove());

    else alert(‘PDF генерація тимчасово недоступна.’);

});

document.getElementById(«saveDayNoteBtn»).addEventListener(«click»,()=>{

    if(currentModalDayKey){

        saveNoteForDay(currentModalDayKey, document.getElementById(«dayNoteText»).value);

        let btn=document.getElementById(«saveDayNoteBtn»);

        btn.innerHTML=»✅»;

        setTimeout(()=>btn.innerHTML=»💾»,1500);

    }

});

document.querySelectorAll(‘.tab-btn’).forEach(btn=>{

    btn.addEventListener(‘click’,()=>{

        let tabId=btn.getAttribute(‘data-tab’);

        document.querySelectorAll(‘.tab-pane’).forEach(p=>p.classList.remove(‘active-pane’));

        document.querySelectorAll(‘.tab-btn’).forEach(b=>b.classList.remove(‘active’));

        btn.classList.add(‘active’);

        document.getElementById(tabId+’Pane’).classList.add(‘active-pane’);

        

        if(tabId===’notes’) renderNotesTab();

        if(tabId===’checklists’) renderChecklists();

        if(tabId===’calendar’) renderCalendar();

        if(tabId===’progress’) renderProgress();

    });

});

 

initApp();

</script>

</body>

</html>

«`

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *