Skip to content
Псалми 4:1-2

Благання про праведне виправдання

Псалми 4:1-2
1
Для дириґе́нта хору. На струнних знаря́ддях. Псало́м Давидів. </div> </div><div class="verse-block" id="v2"> <a href="/psalms/4-2" class="verse-num" title="Share/Study Verse 2">2</a> <div class="verse-content">Коли кли́чу, — озвися до мене, Боже правди моєї, Ти про́стір для мене робив у тісноті́ ... Помилуй мене, і почу́й молитву мою! </div> </div> </div> <div class="reader-placeholder passage-reader-placeholder"> <a href="/chapter/uk/psalms/4#v1" class="read-chapter-cta"> Читати повний розділ 4 <i class="fas fa-arrow-right" aria-hidden="true"></i> </a> </div> <nav class="notable-passage-nav" aria-label="Відомі уривки"> <div class="notable-steps"> <a href="/passage/uk/psalms/3/7-8" class="notable-step notable-prev" title="Псалми 3:7-8"> <i class="fas fa-chevron-left" aria-hidden="true"></i> <span class="step-word">Попередній уривок</span><span class="step-ref">Псалми 3:7-8</span> </a> <button type="button" id="trv-random-dice" class="trv-roll" title="Roll a random passage" aria-label="Roll a random passage"> <i class="fas fa-shuffle" aria-hidden="true"></i><span class="trv-roll-label">Roll a random passage</span> </button> <a href="/passage/uk/psalms/4/3-5" class="notable-step notable-next" title="Псалми 4:3-5"> <span class="step-word">Наступний уривок</span><span class="step-ref">Псалми 4:3-5</span> <i class="fas fa-chevron-right" aria-hidden="true"></i> </a> </div> </nav> </div> <!-- Settings Drawer (shared partial: templates/reader_settings_drawer.php) --> <div id="drawer-settings" class="settings-drawer"> <div class="drawer-header"> <span class="drawer-title">Settings</span> <button type="button" class="btn-icon" id="btn-close-drawer" aria-label="Close settings"><i class="fas fa-xmark"></i></button> </div> <div class="setting-group"> <h4>Reading style</h4> <div class="btn-group" id="view-mode-control"> <button type="button" data-val="mode-list"><i class="fas fa-list"></i> List</button> <button type="button" data-val="mode-reader"><i class="fas fa-align-left"></i> Reader</button> </div> </div> <div class="setting-group"> <h4>Typeface</h4> <div class="btn-group" id="font-family-control"> <button type="button" data-val="var(--font-merri)">Merriweather</button> <button type="button" data-val="var(--font-crimson)">Crimson Pro</button> <button type="button" data-val="var(--font-garamond)">EB Garamond</button> <button type="button" data-val="var(--font-libre)">Libre Baskerville</button> <button type="button" data-val="var(--font-playfair)">Playfair Display</button> <button type="button" data-val="var(--font-imfell)">IM Fell English</button> <button type="button" data-val="var(--font-georgia)">Georgia</button> <button type="button" data-val="var(--font-atkinson)">Atkinson Hyperlegible</button> <button type="button" data-val="var(--font-inter)">Inter</button> </div> </div> <div class="setting-group"> <h4>Font size <output id="font-size-display">19</output>px</h4> <div class="font-size-preview" id="font-size-preview" aria-hidden="true"><span class="verse-num" style="pointer-events:none;">19</span>And he saith unto them, <span class="red-letter">Follow me, and I will make you fishers of men.</span></div> <input type="range" id="font-size-slider" min="14" max="28" step="1" value="19" aria-label="Font size"> </div> <div class="setting-group setting-group--measure"> <h4>Reading width <output id="reading-width-display">75</output> chars</h4> <input type="range" id="reading-width-slider" min="35" max="130" step="1" value="75" aria-label="Reading width in characters per line"> </div> <div class="setting-group"> <h4>Options</h4> <div class="btn-group" id="options-control"> <button type="button" id="toggle-justify">Justify</button> <button type="button" id="toggle-red-letter">Red letter</button> <button type="button" id="toggle-verse-nums">Verse numbers</button> <button type="button" id="toggle-sticky-nav">Sticky toolbar</button> </div> </div> <div class="drawer-reset"> <button type="button" class="btn-icon" id="btn-reset-settings">Reset to defaults</button> </div> </div> <div id="strongs-def-tooltip" class="trv-pop" role="tooltip" aria-hidden="true"> <button type="button" id="strongs-def-close" class="trv-pop-close" aria-label="Close"></button> <div id="strongs-def-content"></div> </div> <!-- Version Selector Modal — a .trv-modal payload: scrim, Escape, backdrop-dismiss, scroll lock and inert come from trvModal. --> <div id="version-modal" class="trv-modal" role="dialog" aria-modal="true" aria-label="Bible version" aria-hidden="true"> <div class="trv-modal-backdrop"></div> <div class="trv-modal-dialog version-modal-dialog"> <button type="button" class="trv-modal-close" data-modal-close aria-label="Close"></button> <div class="version-modal-header"> <span class="version-modal-title">Bible version</span> </div> <div class="version-modal-list" id="version-modal-list"> <button type="button" class="version-modal-item" data-ver="kjv" > <span class="version-abbr">KJV</span> <span class="version-name">King James Version</span> </button> <button type="button" class="version-modal-item" data-ver="kjv_strongs" > <span class="version-abbr">KJV w/Str</span> <span class="version-name">King James Version with Strong's</span> </button> <button type="button" class="version-modal-item" data-ver="cjb" > <span class="version-abbr">CJB</span> <span class="version-name">Complete Jewish Bible</span> </button> <button type="button" class="version-modal-item" data-ver="webm" > <span class="version-abbr">WEBM</span> <span class="version-name">World English Bible</span> </button> <button type="button" class="version-modal-item" data-ver="bsb" > <span class="version-abbr">BSB</span> <span class="version-name">Berean Standard Bible</span> </button> <button type="button" class="version-modal-item" data-ver="asv" > <span class="version-abbr">ASV</span> <span class="version-name">American Standard Version</span> </button> <button type="button" class="version-modal-item" data-ver="geneva" > <span class="version-abbr">GNV</span> <span class="version-name">Geneva Bible (1599)</span> </button> <button type="button" class="version-modal-item" data-ver="ylt" > <span class="version-abbr">YLT</span> <span class="version-name">Young's Literal Translation</span> </button> <button type="button" class="version-modal-item" data-ver="drc" > <span class="version-abbr">DRC</span> <span class="version-name">Douay-Rheims Bible</span> </button> <button type="button" class="version-modal-item" data-ver="sq" > <span class="version-abbr">ALB</span> <span class="version-name">Shqip · Diodati i Ri</span> </button> <button type="button" class="version-modal-item" data-ver="ar" > <span class="version-abbr">SVD</span> <span class="version-name">العربية · SVD</span> </button> <button type="button" class="version-modal-item" data-ver="bn" > <span class="version-abbr">BN-IRV</span> <span class="version-name">বাংলা · IRV</span> </button> <button type="button" class="version-modal-item" data-ver="my" > <span class="version-abbr">Judson</span> <span class="version-name">မြန်မာ · Judson</span> </button> <button type="button" class="version-modal-item" data-ver="zh_hans" > <span class="version-abbr">CUV-S</span> <span class="version-name">简体中文 · CUV</span> </button> <button type="button" class="version-modal-item" data-ver="zh_hant" > <span class="version-abbr">CUV-T</span> <span class="version-name">繁體中文 · CUV</span> </button> <button type="button" class="version-modal-item" data-ver="cs" > <span class="version-abbr">BKR</span> <span class="version-name">Čeština · BKR</span> </button> <button type="button" class="version-modal-item" data-ver="nl" > <span class="version-abbr">STVE</span> <span class="version-name">Nederlands · STVE</span> </button> <button type="button" class="version-modal-item" data-ver="fr" > <span class="version-abbr">LSG</span> <span class="version-name">Français · Segond</span> </button> <button type="button" class="version-modal-item" data-ver="de" > <span class="version-abbr">SCH</span> <span class="version-name">Deutsch · Schlachter</span> </button> <button type="button" class="version-modal-item" data-ver="el" > <span class="version-abbr">Vamvas</span> <span class="version-name">Ελληνικά · Vamvas</span> </button> <button type="button" class="version-modal-item" data-ver="gu" > <span class="version-abbr">GU-IRV</span> <span class="version-name">ગુજરાતી · IRV</span> </button> <button type="button" class="version-modal-item" data-ver="ha" > <span class="version-abbr">HCB</span> <span class="version-name">Hausa · HCB</span> </button> <button type="button" class="version-modal-item" data-ver="he" > <span class="version-abbr">Hebrew</span> <span class="version-name">עברית · Modern</span> </button> <button type="button" class="version-modal-item" data-ver="hi" > <span class="version-abbr">HCV</span> <span class="version-name">हिन्दी · HCV</span> </button> <button type="button" class="version-modal-item" data-ver="hu" > <span class="version-abbr">KAROLI</span> <span class="version-name">Magyar · Károli</span> </button> <button type="button" class="version-modal-item" data-ver="id" > <span class="version-abbr">INDO-TB</span> <span class="version-name">Bahasa Indonesia · TB</span> </button> <button type="button" class="version-modal-item" data-ver="it" > <span class="version-abbr">Diodati</span> <span class="version-name">Italiano · Diodati</span> </button> <button type="button" class="version-modal-item" data-ver="ja" > <span class="version-abbr">Kougo</span> <span class="version-name">日本語 · 口語訳</span> </button> <button type="button" class="version-modal-item" data-ver="ko" > <span class="version-abbr">Korean</span> <span class="version-name">한국어 · 개역한글</span> </button> <button type="button" class="version-modal-item" data-ver="ml" > <span class="version-abbr">MAL</span> <span class="version-name">മലയാളം · SV</span> </button> <button type="button" class="version-modal-item" data-ver="mr" > <span class="version-abbr">MRCV</span> <span class="version-name">मराठी · MRCV</span> </button> <button type="button" class="version-modal-item" data-ver="nb" > <span class="version-abbr">DNB</span> <span class="version-name">Norsk · DNB</span> </button> <button type="button" class="version-modal-item" data-ver="fa" > <span class="version-abbr">OPV</span> <span class="version-name">فارسی · OPV</span> </button> <button type="button" class="version-modal-item" data-ver="pl" > <span class="version-abbr">BG</span> <span class="version-name">Polski · Gdańska</span> </button> <button type="button" class="version-modal-item" data-ver="pt" > <span class="version-abbr">Almeida</span> <span class="version-name">Português · Almeida</span> </button> <button type="button" class="version-modal-item" data-ver="ro" > <span class="version-abbr">Cornilescu</span> <span class="version-name">Română · Cornilescu</span> </button> <button type="button" class="version-modal-item" data-ver="ru" > <span class="version-abbr">Synodal</span> <span class="version-name">Русский · Synodal</span> </button> <button type="button" class="version-modal-item" data-ver="es" > <span class="version-abbr">RVG</span> <span class="version-name">Español · RVG</span> </button> <button type="button" class="version-modal-item" data-ver="sw" > <span class="version-abbr">Neno</span> <span class="version-name">Kiswahili · Neno</span> </button> <button type="button" class="version-modal-item" data-ver="sv" > <span class="version-abbr">SV1917</span> <span class="version-name">Svenska · 1917</span> </button> <button type="button" class="version-modal-item" data-ver="tl" > <span class="version-abbr">TAG-ADB</span> <span class="version-name">Tagalog · ADB</span> </button> <button type="button" class="version-modal-item" data-ver="ta" > <span class="version-abbr">TCV</span> <span class="version-name">தமிழ் · TCV</span> </button> <button type="button" class="version-modal-item" data-ver="te" > <span class="version-abbr">TSA</span> <span class="version-name">తెలుగు · TSA</span> </button> <button type="button" class="version-modal-item" data-ver="th" > <span class="version-abbr">THAI-KJV</span> <span class="version-name">ภาษาไทย · ThaiKJV</span> </button> <button type="button" class="version-modal-item is-active" data-ver="uk" > <span class="version-abbr">Ohienko</span> <span class="version-name">Українська · Огієнко</span> </button> <button type="button" class="version-modal-item" data-ver="vi" > <span class="version-abbr">CADMAN</span> <span class="version-name">Tiếng Việt · Cadman</span> </button> <button type="button" class="version-modal-item" data-ver="yo" > <span class="version-abbr">YCB</span> <span class="version-name">Yorùbá · YCB</span> </button> </div> </div> </div> </div> </div> </main> <script src="/js/reader-settings.min.js?v=4.0.898"></script> <script> document.addEventListener('DOMContentLoaded', function() { // --- Data --- const appData = { verses: [{"verse":1,"text":"<title canonical=\"true\" type=\"psalm\">\u0414\u043b\u044f \u0434\u0438\u0440\u0438\u0491\u0435\u0301\u043d\u0442\u0430 \u0445\u043e\u0440\u0443. \u041d\u0430 \u0441\u0442\u0440\u0443\u043d\u043d\u0438\u0445 \u0437\u043d\u0430\u0440\u044f\u0301\u0434\u0434\u044f\u0445. \u041f\u0441\u0430\u043b\u043e\u0301\u043c \u0414\u0430\u0432\u0438\u0434\u0456\u0432. "},{"verse":2,"text":"\u041a\u043e\u043b\u0438 \u043a\u043b\u0438\u0301\u0447\u0443, \u2014 \u043e\u0437\u0432\u0438\u0441\u044f \u0434\u043e \u043c\u0435\u043d\u0435, \u0411\u043e\u0436\u0435 \u043f\u0440\u0430\u0432\u0434\u0438 \u043c\u043e\u0454\u0456\u0308, \u0422\u0438 \u043f\u0440\u043e\u0301\u0441\u0442\u0456\u0440 \u0434\u043b\u044f \u043c\u0435\u043d\u0435 \u0440\u043e\u0431\u0438\u0432 \u0443 \u0442\u0456\u0441\u043d\u043e\u0442\u0456\u0301 ... \u041f\u043e\u043c\u0438\u043b\u0443\u0438\u0306 \u043c\u0435\u043d\u0435, \u0456 \u043f\u043e\u0447\u0443\u0301\u0438\u0306 \u043c\u043e\u043b\u0438\u0442\u0432\u0443 \u043c\u043e\u044e! "}], slug: "psalms", bookName: "\u041f\u0441\u0430\u043b\u043c\u0438", bookId: 19, chapter: 4, start: 1, end: 2, context: false, version: "uk", versionAbbr: "Ohienko" }; // --- 1. Settings --- // One implementation for all three readers: /js/reader-settings.js. // The drawer, the store, apply and sync all live there; this page only // says which elements it owns. window.TRVReaderSettings.attach({ surface: 'passage', app: document.getElementById('bible-reader-app'), container: document.getElementById('bible-text-container'), toolbar: document.getElementById('main-toolbar') }); // --- 2. Version Modal --- // trvModal owns open/close, Escape, backdrop-dismiss, scroll lock and inert. document.getElementById('passage-ver-trigger')?.addEventListener('click', () => trvModal.open('version-modal')); document.querySelectorAll('#version-modal-list .version-modal-item').forEach(btn => { btn.addEventListener('click', () => { const newVersion = btn.dataset.ver; // No availability check here any more: the server renders an edition // that cannot serve this book as `disabled`, so an unusable option is // never clickable. What stood here asked only whether the target // edition had *any* deuterocanon — which let a Douay-Rheims Wisdom // reader pick Swedish and land on a 404, because the two number their // deuterocanonical books differently — and "recovered" from the case // it did catch by navigating to John 3:16-21. const isSingleVerse = (appData.start === appData.end); const range = isSingleVerse ? `${appData.start}-${appData.start}` : `${appData.start}-${appData.end}`; const ctx = appData.context ? '?context=1' : ''; window.location.href = `/passage/${newVersion}/${appData.slug}/${appData.chapter}/${range}${ctx}`; }); }); function copyPassageToClipboard() { // Walk the rendered DOM (not appData.verses JSON) so red-letter / verse-num / // paragraph-marker formatting follows the same rules as the on-screen text. // Strong's refs are stripped so the clipboard reads as plain Scripture. const ref = (document.querySelector('.toolbar-title')?.textContent.trim() ?? '') + ` (${appData.versionAbbr})`; const container = document.getElementById('bible-text-container'); if (!container) return; const clone = container.cloneNode(true); clone.querySelectorAll('.strongs-ref').forEach(el => el.remove()); const lines = []; clone.querySelectorAll('.verse-block').forEach(block => { const num = block.querySelector('.verse-num')?.textContent.trim() ?? ''; const content = block.querySelector('.verse-content')?.textContent.trim() ?? ''; if (content) lines.push(`${num} ${content}`); }); window.trvCopy(ref + '\n\n' + lines.join('\n'), 'Passage copied'); } document.getElementById('image-btn')?.addEventListener('click', function() { // appData.verses carries ±3 context rows on context views, red-letter // spans as HTML, and raw {H0000} braces on kjv_strongs — the card needs // the requested range only, with red letters as ‹…› markers. const extractWithRedLetters = (el) => { let result = ''; el.childNodes.forEach(node => { if (node.nodeType === Node.TEXT_NODE) { result += node.textContent; } else if (node.nodeType === Node.ELEMENT_NODE) { const inner = extractWithRedLetters(node); result += node.classList.contains('red-letter') ? `‹${inner}›` : inner; } }); return result; }; const text = appData.verses .filter(v => v.verse >= appData.start && v.verse <= appData.end) .map(v => { const t = document.createElement('div'); t.innerHTML = v.text; return extractWithRedLetters(t).replace(/\{[^}]*\}/g, '').trim(); }).join(' '); const range = appData.start === appData.end ? appData.start : `${appData.start}-${appData.end}`; window.trvQuickCard.open({ text, ref: `${appData.bookName} ${appData.chapter}:${range} (${appData.versionAbbr})` }); }); document.getElementById('btn-copy-passage')?.addEventListener('click', copyPassageToClipboard); // Strong's tooltip handled by /js/strongs-tooltip.js // The settings drawer — open/close, Escape, outside-click, focus return — // is owned by /js/reader-settings.js. }); </script> <script src="/js/strongs-tooltip.min.js?v=4.0.898"></script> <script> (function() { // Delegated, not bound to one element: an in-flow control may live inside // markup a page re-renders without a reload (the verse page's AJAX // prev/next), and a listener on the old node would die with it. const SEL = '#trv-random-dice, [data-trv-roll]'; // Fix spinner stuck after browser back button (bfcache restores page with loading class) window.addEventListener('pageshow', function(e) { if (e.persisted) document.querySelectorAll(SEL).forEach(function(b) { b.classList.remove('loading'); }); }); document.addEventListener('click', function(e) { const btn = e.target.closest ? e.target.closest(SEL) : null; if (!btn || btn.classList.contains('loading')) return; btn.classList.add('loading'); // Parse version from current URL (always up-to-date after pushState AJAX navigation) const currentVersion = (() => { const match = window.location.pathname.match(/^\/(chapter|passage)\/([^/]+)\//); return match ? match[2] : 'uk'; })(); const versionParam = currentVersion ? '&version=' + currentVersion : ''; const xhr = new XMLHttpRequest(); xhr.open('GET', '/api/random.php?type=passage' + versionParam + '&_=' + Date.now(), true); xhr.onreadystatechange = function() { if (xhr.readyState !== 4) return; if (xhr.status === 200) { try { const data = JSON.parse(xhr.responseText); if (data.success && data.url) { let url = data.url; // Verse pages carry the translation as ?v= (not a path // segment), so the shuffle must re-append it or the next // verse silently reverts to KJV. if ('passage' === 'verse') { const v = new URLSearchParams(window.location.search).get('v'); if (v) url += (url.includes('?') ? '&' : '?') + 'v=' + encodeURIComponent(v); } window.location.href = url; return; // keep loading state — page is navigating away } } catch (e) { /* fall through to error handling */ } } // Error: briefly dim the button btn.classList.remove('loading'); btn.style.opacity = '0.5'; setTimeout(function() { btn.style.opacity = ''; }, 400); }; xhr.send(); }); })(); </script> <footer class="site-footer"> <div class="footer-wrapper"> <div class="footer-grid"> <div class="footer-brand"> <a href="/" class="footer-brand-emblem" aria-label="TrulyRandomVerse home"> <img src="/images/brand/mark.svg?v=4.0.898" alt="" width="248" height="320"> <span class="footer-brand-wordmark" aria-hidden="true"></span> </a> <p class="footer-brand-verse" dir="auto"> “For of Him, and through Him, and to Him, are all things: to whom be glory for ever. Amen.” <span class="footer-brand-verse-ref">Romans 11:36</span> </p> <a href="/donation" class="footer-support-link"> <i class="fas fa-heart" aria-hidden="true"></i> <span>Support</span> </a> </div> <div class="footer-col footer-col--read"> <strong class="footer-col-heading">Read</strong> <ul class="footer-links"> <li><a href="/chapter/uk/john/1">Read the Bible</a></li> <li><a href="/apocrypha">Apocrypha</a></li> <li><a href="/devotional">Daily Devotional</a></li> <li><a href="/ten-lists">The Ten Lists</a></li> </ul> </div> <div class="footer-col footer-col--study"> <strong class="footer-col-heading">Study</strong> <ul class="footer-links"> <li><a href="/study">Study Hub</a></li> <li><a href="/strongs">Strong’s Concordance</a></li> <li><a href="/fathers">Church Fathers</a></li> <li><a href="/articles">Topical Articles</a></li> <li><a href="/tags">Verses by tags</a></li> <li><a href="/revelation-chiasm">Revelation Chiasm</a></li> <li><a href="/calendar">Liturgical Calendar</a></li> <li><a href="/search">Search</a></li> </ul> </div> <div class="footer-col footer-col--tools"> <strong class="footer-col-heading">Tools</strong> <ul class="footer-links"> <li><a href="/ai">Ask AI</a></li> <li><a href="/background-generator">Image Generator</a></li> <li><a href="/gallery">Community Gallery</a></li> <li><a href="/trivia">Bible Trivia</a></li> <li><a href="/crossword">Bible Crossword</a></li> <li><a href="/extension">Browser Extension</a></li> <li><a href="/install-app">Install app</a></li> <li><a href="/favorites">Favorites</a></li> </ul> </div> <div class="footer-col footer-col--about"> <strong class="footer-col-heading">About</strong> <ul class="footer-links"> <li><a href="/about">About</a></li> <li><a href="/how-to-use">How to use</a></li> <li><a href="/contact">Contact</a></li> <li><a href="/randomness-archive">Randomness Data</a></li> </ul> </div> </div> <p class="footer-ai-disclosure" dir="auto"> Some content and features on this website are AI-generated or AI-assisted and may contain inaccuracies. Verify important claims against the cited sources. <button type="button" class="footer-ai-about" data-trv-ai-about aria-haspopup="dialog" aria-controls="ai-about-modal"> About our use of AI </button> </p> <div class="footer-bottom"> <div class="footer-copyright" dir="auto"> © 2026 TrulyRandomVerse </div> <div class="footer-legal-line"> <a href="/privacy">Privacy</a> <a href="/terms">Terms</a> <a href="/beta-terms">AI Terms</a> <a href="#" class="footer-signin-link" data-trv-footer-signin>Sign in</a> </div> <div class="footer-socials"> <a href="https://x.com/TRVBibleVerses" target="_blank" rel="noopener" class="footer-social-icon" aria-label="Follow TrulyRandomVerse on X (formerly Twitter)"> <span class="footer-social-glyph footer-social-glyph--x" aria-hidden="true"></span> </a> <a href="https://www.facebook.com/groups/trulyrandomverse" target="_blank" rel="noopener" class="footer-social-icon" aria-label="Join our Facebook group"> <span class="footer-social-glyph footer-social-glyph--fb" aria-hidden="true"></span> </a> </div> </div> </div> </footer> <div id="ai-about-modal" class="trv-modal" role="dialog" aria-modal="true" aria-labelledby="ai-about-title" aria-hidden="true" lang="en" dir="ltr"> <div class="trv-modal-backdrop"></div> <div class="trv-modal-dialog ai-about-dialog"> <button type="button" class="trv-modal-close" data-modal-close aria-label="Close">×</button> <h2 id="ai-about-title">How we use AI</h2> <p>AI helps create and support some of this website’s content and features, including study commentary, articles, translations, and interactive answers. Its role varies: some material is AI-assisted, while other material is AI-generated.</p> <p>We have invested substantial care in developing, checking, and refining this material, with particular attention to scriptural accuracy, faithful quotation, clarity, and consistency. These efforts improve quality, but they cannot guarantee that every statement, interpretation, or translation is correct.</p> <p>Use these resources as aids to study. Read passages in context, consult the cited sources where available, and weigh interpretations carefully.</p> </div> </div> </div> <nav id="pwa-nav-bar" class="trv-dock-bar pwa-nav-bar" aria-label="Mobile navigation"> <button type="button" id="pwa-btn-back" class="pwa-nav-button" aria-label="Go back"> <i class="fas fa-chevron-left"></i> </button> <button type="button" id="pwa-btn-share" class="pwa-nav-button" aria-label="Share verse"> <i class="fas fa-share-alt"></i> </button> <button type="button" id="pwa-btn-reload" class="pwa-nav-button" aria-label="Reload page"> <i class="fas fa-rotate"></i> </button> <button type="button" id="pwa-btn-history" class="pwa-nav-button" aria-label="View history"> <i class="fas fa-clock-rotate-left"></i> </button> </nav> <button type="button" id="pwa-scroll-top" class="scroll-top-btn" aria-label="Back to top"> <i class="fas fa-arrow-up"></i> </button> <div id="pwa-history-menu" class="pwa-history-menu" hidden> <div class="pwa-history-header"> <span class="pwa-history-title">Recent history</span> <button type="button" id="pwa-history-close">Close</button> </div> <ul id="pwa-history-list"></ul> <div class="pwa-history-footer"> <span class="pwa-history-limit-msg">Only the last 50 pages are stored locally.</span> </div> </div> <div id="pwa-install-banner" class="pwa-banner" role="dialog" aria-label="Install app" hidden> <div class="pwa-banner-inner"> <div class="pwa-banner-icon"> <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg> </div> <div class="pwa-banner-content"> <p class="pwa-banner-title">Get the app</p> <p class="pwa-banner-subtitle">Add TrulyRandomVerse to your Home Screen for quick access!</p> </div> <div class="pwa-banner-actions"> <button id="pwa-install-button" class="pwa-banner-btn-install">Install</button> <button id="pwa-dismiss-button" class="pwa-banner-btn-dismiss" aria-label="Later"> <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg> </button> </div> </div> </div> <div class="trv-modal search-modal" id="search-modal" role="dialog" aria-labelledby="search-modal-title" aria-modal="true" aria-hidden="true"> <div class="trv-modal-backdrop"></div> <div class="trv-modal-dialog search-modal-dialog"> <button class="trv-modal-close" data-modal-close aria-label="Close search">×</button> <h2 id="search-modal-title">Search the site</h2> <form id="passage-search-form-mobile" class="passage-search-form" action="/search" method="GET"> <div class="passage-search-input-wrapper"> <input type="text" name="q" id="passage-search-input-mobile" class="passage-search-input" placeholder="Search (e.g., John 3:16)" autocomplete="off" role="combobox" aria-label="Search the Bible" aria-autocomplete="list" aria-expanded="false" aria-controls="autocomplete-container-mobile"> </div> <button type="submit" class="passage-search-submit" aria-label="Search"> <i class="fas fa-search" aria-hidden="true"></i> </button> </form> <div id="autocomplete-container-mobile" class="search-autocomplete nav-autocomplete" role="listbox"></div> <p id="passage-search-error-mobile" class="passage-search-error" role="alert"></p> <div id="mobile-recent-searches" class="mobile-recent-searches"></div> </div> </div> <script>window.TRV_AUTH = {"client_id":"1092156319046-58lhjvl2slrup55p41mueju81qrg0n51.apps.googleusercontent.com","user":null,"t":{"account_menu":"Account menu","my_conversations":"My conversations","sign_out":"Sign out","close":"Close","signin_title":"Keep your study in one place","signin_lede":"Sign in with Google to keep your AI Bible-study conversations together and pick them up on any device. Sign-in required; we never send marketing email.","signin_fine":"Your account holds your conversations, history and usage limits — nothing else.","signin_stay":"Keep reading without an account","signing_in":"Signing you in…","carry_head":"In this browser right now","carry_verses_singular":"%s saved verse","carry_verses_plural":"%s saved verses","carry_recent_singular":"%s recently read","carry_recent_plural":"%s recently read","carry_plan":"Ten Lists — %s","carry_plan_day":"day %s","carry_plan_open":"in progress","err_not_configured":"Sign-in is not configured. Please contact support.","err_start":"Sign-in failed to start. Try again in a moment.","err_load":"Could not load Google Sign-In. Check your connection.","err_failed":"Sign-in failed. Please try again.","err_network":"Network error during sign-in.","cancelled":"Sign-in was cancelled.","pwa_pending":"Thanks for signing up. Your account is awaiting approval — we’ll be in touch within 24 hours.","pwa_error":"Sign-in didn’t complete. Please try again.","pwa_blocked":"This account is not currently active. Contact support if you believe this is an error.","pending_aria":"Account pending approval","pending_title":"You’re on the list","pending_body":"Your account is awaiting approval — we’ll be in touch within 24 hours.","pending_ok":"Got it"}};</script> <script>window.TRV_CHROME_T = {"save_page":"Save to Favorites","saved_page":"Saved to Favorites","save_page_title":"Save this page to your Favorites","remove_page_title":"Remove from Favorites","removed_page":"Removed from Favorites","save_failed":"Could not save — storage unavailable","offline":"You are offline. Check your connection.","recent":"Recent","clear":"Clear","remove_search":"Remove this search from history","recent_searches":"Your recent searches"};</script> <script>window.TRV_BOOK_SLUGS = ["song_of_solomon","1_thessalonians","2_thessalonians","1_corinthians","2_corinthians","1_chronicles","2_chronicles","ecclesiastes","lamentations","deuteronomy","philippians","colossians","revelation","leviticus","zephaniah","zechariah","galatians","ephesians","1_timothy","2_timothy","1_samuel","2_samuel","nehemiah","proverbs","jeremiah","habakkuk","philemon","genesis","numbers","1_kings","2_kings","ezekiel","obadiah","malachi","matthew","hebrews","1_peter","2_peter","exodus","joshua","judges","esther","psalms","isaiah","daniel","haggai","romans","1_john","2_john","3_john","hosea","jonah","micah","nahum","titus","james","ruth","ezra","joel","amos","mark","luke","john","acts","jude","job"];</script> <script src="/js/scripture-preview.min.js?v=4.0.898" defer></script> <script src="/js/search-history.min.js?v=4.0.898" defer></script> <script src="/js/autocomplete.min.js?v=4.0.898" defer></script> <script src="/js/auth.min.js?v=4.0.898" defer></script> <script src="/js/nav.min.js?v=4.0.898" defer></script> <script src="/js/site.min.js?v=4.0.898" defer></script> <script> var _paq = window._paq = window._paq || []; _paq.push(['enableHeartBeatTimer', 15]); _paq.push(['trackPageView']); _paq.push(['enableLinkTracking']); // Not while Chrome is PRERENDERING the page. Matomo 5.14 only checks the old // visibilityState === 'prerender', so a page Chrome prerenders (Google // Search can do this for top results) and nobody opens would count as a // 0-second visit. The _paq queue waits; the visit starts when the reader // actually opens the page. Same rule as the speculation-rules note in // helpers.php. (Measured 2026-09-30: Chrome's 0-s share from Google is no // higher than Safari's or Firefox's, so the effect was not material.) (function() { var boot = function() { var u="//trulyrandomverse.com/matomo/"; _paq.push(['setTrackerUrl', u+'matomo.php']); _paq.push(['setSiteId', '1']); var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s); }; if (document.prerendering) { document.addEventListener('prerenderingchange', boot, { once: true }); } else { boot(); } })(); // Fallback bot trap — catches any bot that somehow bypassed the early <head> // redirect (e.g. a cached page). MUST stay byte-identical in signals to the // copy in PageRenderer.php (~line 1758); this one had drifted and was missing // BOTH of its guards, so on every page it ran it would trap a browser the head // check had deliberately spared: an auditing tool (Lighthouse, GTmetrix, PTST, // Google's inspection bot) got a blocking cookie the moment it reached the // footer, and a reader who had already passed verification was re-trapped by // the beacon that was supposed to notice they were fine. If you edit one copy, // edit the other in the same commit. (function(){if((document.cookie||'').indexOf('trv_trap_ok=1')!==-1)return;var u=navigator.userAgent||'';if(/Chrome-Lighthouse|Google-InspectionTool|GTmetrix|PTST\//.test(u))return;if(navigator.webdriver||(/Linux aarch64/.test(u)&&/Chrome\//.test(u))){navigator.sendBeacon('/api/bot-trap');return;}var w=screen.width,h=screen.height;if((w===800&&h===600)||(w===h&&w>=1024)){navigator.sendBeacon('/api/bot-trap');}})(); </script> <!-- Cookie Consent Banner --> <div id="cookie-consent" class="cookie-consent" role="dialog" aria-label="Cookie Consent" hidden> <div class="cookie-consent-inner"> <p class="cookie-consent-text"> This site uses cookies. <a href="/privacy" class="cookie-consent-link">Privacy Policy</a> </p> <div class="cookie-consent-actions"> <button id="cookie-accept-all" class="cookie-consent-btn cookie-consent-accept">Accept all</button> <button id="cookie-essential-only" class="cookie-consent-btn cookie-consent-decline">Essential only</button> </div> </div> </div> <script> (function() { 'use strict'; var CONSENT_KEY = 'trv_cookie_consent'; var consent; try { consent = localStorage.getItem(CONSENT_KEY); } catch(e) {} // If user already made a choice, apply it silently and don't show banner if (consent === 'all') { if (typeof gtag === 'function') { gtag('consent', 'update', { 'analytics_storage': 'granted', 'ad_storage': 'granted', 'ad_user_data': 'granted', 'ad_personalization': 'granted' }); } if (typeof clarity === 'function') { clarity('consentv2', { ad_Storage: 'granted', analytics_Storage: 'granted' }); } return; } if (consent === 'essential') return; // No choice yet — show the banner var banner = document.getElementById('cookie-consent'); if (!banner) return; banner.hidden = false; // Publish the banner's real height so docked chrome and in-flow content can // clear it (see .trv-consent-open in components.css). Measured, not // hardcoded: the card is 62px on desktop and 98px when it stacks on mobile, // and it reflows with translated copy. var release = function () { document.body.classList.remove('trv-consent-open'); document.documentElement.style.removeProperty('--consent-h'); }; var reserve = function () { var h = Math.round(banner.getBoundingClientRect().height); if (!h) { return; } document.documentElement.style.setProperty('--consent-h', h + 'px'); document.body.classList.add('trv-consent-open'); }; reserve(); if (typeof ResizeObserver === 'function') { new ResizeObserver(reserve).observe(banner); } else { window.addEventListener('resize', reserve); } document.getElementById('cookie-accept-all').addEventListener('click', function() { try { localStorage.setItem(CONSENT_KEY, 'all'); } catch(e) {} if (typeof gtag === 'function') { gtag('consent', 'update', { 'analytics_storage': 'granted', 'ad_storage': 'granted', 'ad_user_data': 'granted', 'ad_personalization': 'granted' }); } if (typeof clarity === 'function') { clarity('consentv2', { ad_Storage: 'granted', analytics_Storage: 'granted' }); } banner.hidden = true; release(); }); document.getElementById('cookie-essential-only').addEventListener('click', function() { try { localStorage.setItem(CONSENT_KEY, 'essential'); } catch(e) {} banner.hidden = true; release(); }); })(); </script> </body> </html>