/
sav_bpm
/
Con
Обзор
Документация
Войти
/
sav_bpm
/
Con
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Confession.html
853 строки
33 KB
sav_bpm
upload files
28 янв 2026, 11:55
Верифицирован
28 янв 2026, 11:55
53e89e0
Код
Авторство
О чём код?
<!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Духовный Дневник - Отслеживание Грехов</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Helvetica Neue', sans-serif; background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%); color: #e0e0e0; line-height: 1.6; min-height: 100vh; padding: 20px; } .container { max-width: 1200px; margin: 0 auto; } header { text-align: center; margin-bottom: 40px; border-bottom: 2px solid #c9a961; padding-bottom: 20px; } header h1 { font-size: 2.5em; color: #c9a961; margin-bottom: 10px; font-weight: 600; } header p { font-size: 0.95em; color: #a0a0a0; font-style: italic; } .main-content { display: grid; grid-template-columns: 1fr 2fr; gap: 30px; margin-bottom: 30px; } @media (max-width: 1024px) { .main-content { grid-template-columns: 1fr; } } .panel { background: rgba(255, 255, 255, 0.05); border: 1px solid rgba(201, 169, 97, 0.3); border-radius: 8px; padding: 25px; backdrop-filter: blur(10px); } .panel h2 { color: #c9a961; margin-bottom: 20px; font-size: 1.4em; border-bottom: 1px solid rgba(201, 169, 97, 0.2); padding-bottom: 15px; } .category-list { list-style: none; } .category-item { padding: 12px; margin-bottom: 10px; background: rgba(201, 169, 97, 0.1); border-left: 3px solid #c9a961; border-radius: 4px; cursor: pointer; transition: all 0.3s ease; } .category-item:hover { background: rgba(201, 169, 97, 0.2); transform: translateX(5px); } .category-item.active { background: rgba(201, 169, 97, 0.25); box-shadow: 0 0 10px rgba(201, 169, 97, 0.3); } .category-item span { font-size: 0.85em; color: #a0a0a0; display: block; margin-top: 5px; } .dialog-panel { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; } @media (max-width: 768px) { .dialog-panel { grid-template-columns: 1fr; } } .sin-selector { background: rgba(255, 255, 255, 0.03); border: 1px solid rgba(201, 169, 97, 0.2); border-radius: 6px; padding: 20px; } .sin-selector h3 { color: #c9a961; margin-bottom: 15px; font-size: 1.1em; } .sin-list { list-style: none; max-height: 400px; overflow-y: auto; } .sin-item { padding: 10px; margin-bottom: 8px; background: rgba(200, 200, 200, 0.05); border-radius: 4px; cursor: pointer; transition: all 0.2s ease; display: flex; align-items: center; gap: 10px; font-size: 0.95em; } .sin-item:hover { background: rgba(201, 169, 97, 0.15); } .sin-item input[type="checkbox"] { cursor: pointer; accent-color: #c9a961; } .confession-area { background: rgba(255, 255, 255, 0.03); border: 1px solid rgba(201, 169, 97, 0.2); border-radius: 6px; padding: 20px; } .confession-area h3 { color: #c9a961; margin-bottom: 15px; font-size: 1.1em; } textarea { width: 100%; height: 350px; padding: 15px; background: rgba(255, 255, 255, 0.05); border: 1px solid rgba(201, 169, 97, 0.3); border-radius: 4px; color: #e0e0e0; font-family: inherit; font-size: 0.95em; resize: vertical; } textarea::placeholder { color: #606060; } textarea:focus { outline: none; border-color: #c9a961; box-shadow: 0 0 10px rgba(201, 169, 97, 0.3); } .button-group { display: flex; gap: 15px; margin-top: 20px; flex-wrap: wrap; } button { padding: 12px 24px; border: none; border-radius: 4px; font-size: 0.95em; cursor: pointer; transition: all 0.3s ease; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; } .btn-primary { background: #c9a961; color: #1a1a2e; flex: 1; min-width: 150px; } .btn-primary:hover { background: #e0bc7a; box-shadow: 0 4px 15px rgba(201, 169, 97, 0.4); } .btn-secondary { background: rgba(201, 169, 97, 0.2); color: #c9a961; border: 1px solid #c9a961; flex: 1; min-width: 150px; } .btn-secondary:hover { background: rgba(201, 169, 97, 0.3); } .btn-danger { background: rgba(220, 100, 100, 0.3); color: #ff6b6b; border: 1px solid #ff6b6b; } .btn-danger:hover { background: rgba(220, 100, 100, 0.5); } .btn-summary { background: linear-gradient(to right, #2c3e50, #4ca1af); color: #fff; width: 100%; margin-top: 15px; border: 1px solid rgba(255, 255, 255, 0.1); } .btn-summary:hover { background: linear-gradient(to right, #34495e, #5daebc); box-shadow: 0 4px 15px rgba(76, 161, 175, 0.3); } .entries-list { max-height: 500px; overflow-y: auto; } .entry { background: rgba(201, 169, 97, 0.08); border-left: 3px solid #c9a961; padding: 15px; margin-bottom: 15px; border-radius: 4px; } .entry-date { font-size: 0.85em; color: #c9a961; margin-bottom: 8px; font-weight: 600; } .entry-category { font-size: 0.9em; color: #a0a0a0; margin-bottom: 8px; } .entry-sins { font-size: 0.95em; color: #e0e0e0; margin-bottom: 10px; line-height: 1.5; } .entry-text { font-size: 0.95em; color: #d0d0d0; font-style: italic; line-height: 1.5; } .delete-entry { margin-top: 10px; } .stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 15px; margin-bottom: 30px; } .stat-card { background: rgba(201, 169, 97, 0.1); border: 1px solid rgba(201, 169, 97, 0.3); border-radius: 6px; padding: 20px; text-align: center; } .stat-card h3 { color: #c9a961; font-size: 2em; margin-bottom: 5px; } .stat-card p { color: #a0a0a0; font-size: 0.9em; } .info-section { background: rgba(200, 150, 100, 0.08); border-left: 4px solid #c9a961; padding: 20px; border-radius: 4px; margin-bottom: 20px; } .info-section h3 { color: #c9a961; margin-bottom: 10px; } .info-section p { color: #b0b0b0; line-height: 1.6; } .tabs { display: flex; gap: 0; margin-bottom: 20px; border-bottom: 2px solid rgba(201, 169, 97, 0.2); } .tab-btn { padding: 12px 20px; background: none; border: none; color: #a0a0a0; cursor: pointer; border-bottom: 3px solid transparent; transition: all 0.3s ease; font-size: 0.95em; font-weight: 600; text-transform: uppercase; } .tab-btn:hover { color: #c9a961; } .tab-btn.active { color: #c9a961; border-bottom-color: #c9a961; } .tab-content { display: none; } .tab-content.active { display: block; } .modal-overlay { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.85); z-index: 1000; justify-content: center; align-items: center; backdrop-filter: blur(5px); } .modal-content { background: #1a1a2e; border: 2px solid #c9a961; border-radius: 8px; width: 90%; max-width: 700px; max-height: 85vh; overflow-y: auto; padding: 30px; position: relative; box-shadow: 0 0 30px rgba(201, 169, 97, 0.2); } .modal-close { position: absolute; top: 15px; right: 20px; background: none; border: none; color: #a0a0a0; font-size: 1.5em; cursor: pointer; } .modal-close:hover { color: #c9a961; } .daily-sins-list { list-style: none; margin: 20px 0; border-left: 2px solid #c9a961; padding-left: 20px; } .daily-sins-list li { margin-bottom: 8px; color: #e0e0e0; font-size: 1.05em; } .prayer-text { background: rgba(201, 169, 97, 0.05); padding: 20px; border-radius: 6px; margin-top: 20px; font-family: 'Times New Roman', serif; font-size: 1.1em; line-height: 1.7; color: #dcdcdc; white-space: pre-wrap; } ::-webkit-scrollbar { width: 8px; } ::-webkit-scrollbar-track { background: rgba(201, 169, 97, 0.1); } ::-webkit-scrollbar-thumb { background: rgba(201, 169, 97, 0.3); border-radius: 4px; } ::-webkit-scrollbar-thumb:hover { background: rgba(201, 169, 97, 0.5); } </style> </head> <body> <div class="container"> <header> <h1>✦ Духовный Дневник ✦</h1> <p>Путь к духовному очищению и самопознанию</p> <p style="font-size: 0.85em; color: #888; margin-top: 15px; padding-top: 15px; border-top: 1px solid rgba(201,169,97,0.2);"> <strong>📋 Как открыть этот файл:</strong><br> 1. Сохраните этот HTML-файл на компьютер (правая кнопка → "Сохранить как" с расширением .html)<br> 2. <strong>На iPhone:</strong> Загрузите файл через iCloud Drive или почту → откройте в Safari → нажмите "Поделиться" (квадрат со стрелкой) → "На экран «Домой»"<br> 3. <strong>На компьютере:</strong> Откройте сохранённый файл двойным щелчком или через браузер </p> </header> <div class="tabs"> <button class="tab-btn active" onclick="showTab('diary')">Дневник</button> <button class="tab-btn" onclick="showTab('guide')">Руководство</button> <button class="tab-btn" onclick="showTab('entries')">История</button> </div> <div id="diary" class="tab-content active"> <div id="stats-container"> <div class="stats" id="stats"></div> <button class="btn-summary" onclick="showDailySummary()">🙏 Сводка за день для вечерней молитвы</button> </div> <br> <div class="main-content"> <div class="panel"> <h2>Категории Грехов</h2> <ul class="category-list" id="categoryList"></ul> </div> <div class="panel"> <div class="dialog-panel"> <div class="sin-selector"> <h3 id="selectedCategory">Выберите категорию</h3> <ul class="sin-list" id="sinList"></ul> </div> <div class="confession-area"> <h3>Ваше Покаяние</h3> <textarea id="confessionText" placeholder="Напишите о вашем осознании греха, раскаянии и намерении исправиться. Будьте искренни перед Богом..."></textarea> <div class="button-group"> <button class="btn-primary" onclick="saveEntry()">Сохранить Запись</button> <button class="btn-secondary" onclick="clearForm()">Очистить</button> </div> </div> </div> </div> </div> </div> <div id="guide" class="tab-content"> <div class="panel" style="max-width: 100%;"> <h2>Руководство по Исповеди</h2> <div class="info-section"> <h3>О Таинстве Покаяния</h3> <p>Исповедь - это Таинство Церкви, в котором исповедующий свои грехи при видимом прощении от священника невидимо разрешается от грехов Самим Богом. Это не просто признание ошибок, но глубокое духовное преобразование.</p> </div> <div class="info-section"> <h3>Три Этапа Покаяния</h3> <p><strong>1. Испытание совести:</strong> Вспомните все грехи, совершённые в течение жизни. Проанализируйте каждый день, примеряя к себе Божьи заповеди.</p> <p><strong>2. Искреннее раскаяние:</strong> Ощутите сокрушение о своих грехах и твёрдое намерение больше не грешить. Это не просто формальный акт.</p> <p><strong>3. Словесное исповедание:</strong> Назовите свои грехи перед священником. Говорите точно, не затемняя неприглядности греха общими выражениями.</p> </div> <div class="info-section"> <h3>Условия Действительной Исповеди</h3> <p>✦ Испытание совести - честный анализ своих поступков<br> ✦ Искреннее раскаяние в грехах перед Богом<br> ✦ Твёрдое намерение больше не грешить и исправиться<br> ✦ Готовность исполнить наложенную епитимью<br> ✦ Посильное возмещение ущерба, причинённого людям</p> </div> <div class="info-section"> <h3>О Грехе и Страстях</h3> <p>Святые отцы учат, что грехи - это плоды на злом дереве греховной жизни. Важно не только покаяться в совершённом грехе, но покаяться в страсти, которая его произвела. Если оставить корень греховный, плоды появятся вновь.</p> <p>Главные страсти: гордость, чревоугодие, блуд, корыстолюбие, гнев, зависть, уныние.</p> </div> <div class="info-section"> <h3>Частая Исповедь</h3> <p>Не только исповедь перед Причастием. Исповедь помогает нам ежедневно возвращаться к Богу, очищаться от грехов, которые отягчают совесть, развивать духовное внимание и чувствительность. Частая исповедь - путь к духовному возрастанию.</p> </div> </div> </div> <div id="entries" class="tab-content"> <div class="panel"> <h2>История Записей</h2> <div class="entries-list" id="entriesList"> <p style="color: #a0a0a0; text-align: center;">Нет записей. Начните вести дневник.</p> </div> </div> </div> </div> <div id="summaryModal" class="modal-overlay"> <div class="modal-content"> <button class="modal-close" onclick="closeSummary()">×</button> <h2 style="color: #c9a961; border-bottom: 1px solid rgba(201,169,97,0.3); padding-bottom: 10px; margin-bottom: 20px;">Вечернее Исповедание</h2> <p style="color: #a0a0a0; margin-bottom: 10px;">Грехи, отмеченные сегодня:</p> <ul id="dailySinsList" class="daily-sins-list"></ul> <h3 style="color: #c9a961; font-size: 1.1em; margin-top: 25px;">Молитва повседневного исповедания грехов</h3> <div class="prayer-text" id="prayerContainer">Испове́даю Тебе́ Го́споду Бо́гу моему́ и Творцу́, во Святе́й Тро́ице Еди́ному, сла́вимому и поклоня́емому, Отцу́ и Сы́ну и Свято́му Ду́ху, вся моя́ грехи́, я́же соде́ях во вся дни живота́ моего́, и на вся́кий час, и в настоя́щее вре́мя, и в преше́дшия дни и но́щи, де́лом, сло́вом, помышле́нием, <span id="inlineSins" style="color: #ff6b6b; font-weight: 600;"></span>объяде́нием, пия́нством, тайнояде́нием, праздносло́вием, уны́нием, ле́ностию, прекосло́вием, непослуша́нием, оклевета́нием, осужде́нием, небреже́нием, самолю́бием, многостяжа́нием, хище́нием, неправдоглаго́ланием, скверноприбы́тчеством, мшелои́мством, ревнова́нием, за́вистию, гне́вом, памятозло́бием, не́навистию, лихои́мством и все́ми мои́ми чу́вствами: зре́нием, слу́хом, обоня́нием, вку́сом, осяза́нием и про́чими мои́ми грехи́, душе́вными вку́пе и теле́сными, и́миже Тебе́ Бо́га моего́ и Творца́ прогне́вах, и бли́жняго моего́ онепра́вдовах: о сих жале́я, ви́нна себе́ Тебе́ Бо́гу моему́ представля́ю, и име́ю во́лю ка́ятися: то́чию, Го́споди Бо́же мой, помози́ ми, со слеза́ми смире́нно молю́ Тя: преше́дшая же согреше́ния моя́ милосе́рдием Твои́м прости́ ми, и разреши́ от всех сих, я́же изглаго́лах пред Тобо́ю, я́ко Благ и Человеколю́бец. Ами́нь.</div> </div> </div> <script> const categories = { 'Грехи против Бога': [ 'Неверие, маловерие и суеверие', 'Нарушение Божьих заповедей', 'Отсутствие молитвы и невнимание при молитве', 'Пропуск богослужений в храме', 'Кощунство и хула на Бога', 'Клятвы и божба', 'Произнесение имени Божия всуе', 'Нарушение постов и постных дней', 'Неблагодарность Богу за благодеяния' ], 'Грехи против ближних': [ 'Отсутствие любви и сострадания', 'Непрощение обид и ненависть', 'Осуждение и злословие', 'Лживость и обман', 'Зависть и ревность', 'Гнев и вражда', 'Оскорбления и унижение', 'Воровство и присвоение чужого', 'Сплетни и разглашение чужих грехов', 'Непочтение к родителям и старшим' ], 'Грехи против себя': [ 'Гордыня и тщеславие', 'Чревоугодие и пьянство', 'Блуд и нечистые помыслы', 'Лень и праздность', 'Саморазрушающие привычки', 'Уныние и отчаяние', 'Мысли о самоубийстве', 'Употребление наркотиков', 'Азартные игры и пристрастия', 'Скупость и стяжательство', 'Излишествование и разврат' ], 'Грехи в семье': [ 'Неверность супруга', 'Жестокость к семье', 'Невнимание к детям', 'Плохой пример детям', 'Раздоры и скандалы в семье', 'Абортивные грехи', 'Невнимание к болеющим членам семьи' ], 'Грехи в общении': [ 'Сквернословие', 'Пересуды и сплетни', 'Неискренность и лицемерие', 'Дерзость и наглость', 'Прекословие и неуступчивость', 'Подозрение и недоверие', 'Спорливость и упрямство' ] }; let entries = JSON.parse(localStorage.getItem('confessionEntries')) || []; function initializePage() { displayCategories(); updateStats(); displayEntries(); } function displayCategories() { const list = document.getElementById('categoryList'); list.innerHTML = ''; for (const category in categories) { const li = document.createElement('li'); li.className = 'category-item'; li.innerHTML = `<strong>${category}</strong><span>${categories[category].length} пунктов</span>`; li.onclick = () => selectCategory(category, li); list.appendChild(li); } } function selectCategory(category, element) { document.querySelectorAll('.category-item').forEach(el => el.classList.remove('active')); element.classList.add('active'); displaySins(category); } function displaySins(category) { const sinList = document.getElementById('sinList'); const categoryTitle = document.getElementById('selectedCategory'); categoryTitle.textContent = category; sinList.innerHTML = ''; categories[category].forEach(sin => { const li = document.createElement('li'); li.className = 'sin-item'; li.innerHTML = `<input type="checkbox"> ${sin}`; li.onclick = (e) => { if (e.target.tagName !== 'INPUT') { e.currentTarget.querySelector('input').checked = !e.currentTarget.querySelector('input').checked; } }; sinList.appendChild(li); }); } function saveEntry() { const sinList = document.getElementById('sinList'); const confessionText = document.getElementById('confessionText').value.trim(); const categoryTitle = document.getElementById('selectedCategory').textContent; const selectedSins = Array.from(sinList.querySelectorAll('.sin-item')) .filter(item => item.querySelector('input').checked) .map(item => item.textContent.trim()); if (selectedSins.length === 0 || !confessionText) { alert('Выберите грехи и напишите о вашем раскаянии.'); return; } const entry = { id: Date.now(), date: new Date().toLocaleDateString('ru-RU', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric', hour: '2-digit', minute: '2-digit' }), category: categoryTitle, sins: selectedSins, text: confessionText }; entries.unshift(entry); localStorage.setItem('confessionEntries', JSON.stringify(entries)); clearForm(); updateStats(); displayEntries(); alert('Ваша запись сохранена. Молитесь за укрепление духа!'); } function clearForm() { document.getElementById('confessionText').value = ''; document.querySelectorAll('.sin-item input').forEach(cb => cb.checked = false); } function deleteEntry(id) { if (confirm('Вы уверены? Эта запись будет удалена.')) { entries = entries.filter(entry => entry.id !== id); localStorage.setItem('confessionEntries', JSON.stringify(entries)); updateStats(); displayEntries(); } } function isToday(timestamp) { const date = new Date(timestamp); const today = new Date(); return date.getDate() === today.getDate() && date.getMonth() === today.getMonth() && date.getFullYear() === today.getFullYear(); } function updateStats() { const stats = document.getElementById('stats'); const totalEntries = entries.length; const todayEntries = entries.filter(e => isToday(e.id)).length; let categoryCount = {}; entries.forEach(e => { categoryCount[e.category] = (categoryCount[e.category] || 0) + 1; }); const topCategory = Object.keys(categoryCount).length > 0 ? Object.entries(categoryCount).sort((a, b) => b[1] - a[1])[0] : null; stats.innerHTML = ` <div class="stat-card"> <h3>${totalEntries}</h3> <p>Всего Записей</p> </div> <div class="stat-card"> <h3>${todayEntries}</h3> <p>Сегодня</p> </div> <div class="stat-card"> <h3>${topCategory ? topCategory[1] : 0}</h3> <p>Частая Категория</p> </div> `; } function displayEntries() { const list = document.getElementById('entriesList'); if (entries.length === 0) { list.innerHTML = '<p style="color: #a0a0a0; text-align: center;">Нет записей. Начните вести дневник.</p>'; return; } list.innerHTML = entries.map(entry => ` <div class="entry"> <div class="entry-date">📅 ${entry.date}</div> <div class="entry-category">📖 ${entry.category}</div> <div class="entry-sins"><strong>Осознанные грехи:</strong><br>${entry.sins.map(s => '• ' + s).join('<br>')}</div> <div class="entry-text">"${entry.text}"</div> <button class="btn-danger delete-entry" onclick="deleteEntry(${entry.id})">Удалить</button> </div> `).join(''); } function showDailySummary() { const modal = document.getElementById('summaryModal'); const list = document.getElementById('dailySinsList'); const inlineSinsSpan = document.getElementById('inlineSins'); const todayEntries = entries.filter(e => isToday(e.id)); let allSins = new Set(); todayEntries.forEach(entry => { entry.sins.forEach(sin => allSins.add(sin)); }); list.innerHTML = ''; // Generate inline text for prayer let inlineText = ''; if (allSins.size === 0) { inlineText = ''; list.innerHTML = '<li style="font-style: italic; color: #888;">Сегодня вы не отметили грехов. Если совесть чиста — слава Богу. Если забыли — испытайте сердце.</li>'; } else { const sinsArray = Array.from(allSins); inlineText = sinsArray.join(', ') + ' '; sinsArray.forEach(sin => { const li = document.createElement('li'); li.textContent = '• ' + sin; list.appendChild(li); }); } inlineSinsSpan.textContent = inlineText; modal.style.display = 'flex'; } function closeSummary() { document.getElementById('summaryModal').style.display = 'none'; } window.onclick = function(event) { const modal = document.getElementById('summaryModal'); if (event.target == modal) { modal.style.display = "none"; } } function showTab(tabName) { document.querySelectorAll('.tab-content').forEach(tab => tab.classList.remove('active')); document.querySelectorAll('.tab-btn').forEach(btn => btn.classList.remove('active')); document.getElementById(tabName).classList.add('active'); event.target.classList.add('active'); } initializePage(); </script> </body> </html>