diff --git a/kjvstudy_org/templates/base.html b/kjvstudy_org/templates/base.html index 8141aab..b1e7998 100644 --- a/kjvstudy_org/templates/base.html +++ b/kjvstudy_org/templates/base.html @@ -1613,6 +1613,26 @@ }); })(); + // Global viewport helpers for keyboard navigation + window.KJVNav = { + isInViewport: function(el) { + if (!el) return false; + var rect = el.getBoundingClientRect(); + return rect.top < window.innerHeight && rect.bottom > 0; + }, + findFirstVisibleIndex: function(elements) { + for (var i = 0; i < elements.length; i++) { + if (this.isInViewport(elements[i])) return i; + } + return 0; + }, + isSelectionOffScreen: function(elements, selectedIndex) { + if (selectedIndex < 0) return true; + if (selectedIndex >= elements.length) return true; + return !this.isInViewport(elements[selectedIndex]); + } + }; + // Keyboard shortcuts document.addEventListener('keydown', function(e) { // Don't trigger if user is typing in an input field diff --git a/kjvstudy_org/templates/biblical_angels.html b/kjvstudy_org/templates/biblical_angels.html index b0ba770..2cc4319 100644 --- a/kjvstudy_org/templates/biblical_angels.html +++ b/kjvstudy_org/templates/biblical_angels.html @@ -323,11 +323,20 @@ document.addEventListener('DOMContentLoaded', function() { if (e.key === 'ArrowDown' || e.key === 'j') { e.preventDefault(); - selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1); + if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) { + selectEntry(KJVNav.findFirstVisibleIndex(entries)); + } else { + selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1); + } } else if (e.key === 'ArrowUp' || e.key === 'k') { e.preventDefault(); - if (selectedIndex <= 0) selectEntry(0); - else selectEntry(selectedIndex - 1); + if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) { + selectEntry(KJVNav.findFirstVisibleIndex(entries)); + } else if (selectedIndex <= 0) { + selectEntry(0); + } else { + selectEntry(selectedIndex - 1); + } } else if (e.key === 'ArrowLeft' || e.key === 'h') { e.preventDefault(); history.back(); diff --git a/kjvstudy_org/templates/biblical_covenants.html b/kjvstudy_org/templates/biblical_covenants.html index 7478b77..405b4c8 100644 --- a/kjvstudy_org/templates/biblical_covenants.html +++ b/kjvstudy_org/templates/biblical_covenants.html @@ -321,11 +321,20 @@ document.addEventListener('DOMContentLoaded', function() { if (e.key === 'ArrowDown' || e.key === 'j') { e.preventDefault(); - selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1); + if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) { + selectEntry(KJVNav.findFirstVisibleIndex(entries)); + } else { + selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1); + } } else if (e.key === 'ArrowUp' || e.key === 'k') { e.preventDefault(); - if (selectedIndex <= 0) selectEntry(0); - else selectEntry(selectedIndex - 1); + if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) { + selectEntry(KJVNav.findFirstVisibleIndex(entries)); + } else if (selectedIndex <= 0) { + selectEntry(0); + } else { + selectEntry(selectedIndex - 1); + } } else if (e.key === 'ArrowLeft' || e.key === 'h') { e.preventDefault(); history.back(); diff --git a/kjvstudy_org/templates/biblical_festivals.html b/kjvstudy_org/templates/biblical_festivals.html index 25ddf5d..18cdf92 100644 --- a/kjvstudy_org/templates/biblical_festivals.html +++ b/kjvstudy_org/templates/biblical_festivals.html @@ -321,11 +321,20 @@ document.addEventListener('DOMContentLoaded', function() { if (e.key === 'ArrowDown' || e.key === 'j') { e.preventDefault(); - selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1); + if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) { + selectEntry(KJVNav.findFirstVisibleIndex(entries)); + } else { + selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1); + } } else if (e.key === 'ArrowUp' || e.key === 'k') { e.preventDefault(); - if (selectedIndex <= 0) selectEntry(0); - else selectEntry(selectedIndex - 1); + if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) { + selectEntry(KJVNav.findFirstVisibleIndex(entries)); + } else if (selectedIndex <= 0) { + selectEntry(0); + } else { + selectEntry(selectedIndex - 1); + } } else if (e.key === 'ArrowLeft' || e.key === 'h') { e.preventDefault(); history.back(); diff --git a/kjvstudy_org/templates/biblical_maps.html b/kjvstudy_org/templates/biblical_maps.html index b82ced7..6eefab9 100644 --- a/kjvstudy_org/templates/biblical_maps.html +++ b/kjvstudy_org/templates/biblical_maps.html @@ -372,11 +372,20 @@ if (e.key === 'ArrowDown' || e.key === 'j') { e.preventDefault(); - selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1); + if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) { + selectEntry(KJVNav.findFirstVisibleIndex(entries)); + } else { + selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1); + } } else if (e.key === 'ArrowUp' || e.key === 'k') { e.preventDefault(); - if (selectedIndex <= 0) selectEntry(0); - else selectEntry(selectedIndex - 1); + if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) { + selectEntry(KJVNav.findFirstVisibleIndex(entries)); + } else if (selectedIndex <= 0) { + selectEntry(0); + } else { + selectEntry(selectedIndex - 1); + } } else if (e.key === 'ArrowLeft' || e.key === 'h') { e.preventDefault(); history.back(); diff --git a/kjvstudy_org/templates/biblical_prophets.html b/kjvstudy_org/templates/biblical_prophets.html index 26d1691..1b52150 100644 --- a/kjvstudy_org/templates/biblical_prophets.html +++ b/kjvstudy_org/templates/biblical_prophets.html @@ -319,11 +319,20 @@ document.addEventListener('DOMContentLoaded', function() { if (e.key === 'ArrowDown' || e.key === 'j') { e.preventDefault(); - selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1); + if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) { + selectEntry(KJVNav.findFirstVisibleIndex(entries)); + } else { + selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1); + } } else if (e.key === 'ArrowUp' || e.key === 'k') { e.preventDefault(); - if (selectedIndex <= 0) selectEntry(0); - else selectEntry(selectedIndex - 1); + if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) { + selectEntry(KJVNav.findFirstVisibleIndex(entries)); + } else if (selectedIndex <= 0) { + selectEntry(0); + } else { + selectEntry(selectedIndex - 1); + } } else if (e.key === 'ArrowLeft' || e.key === 'h') { e.preventDefault(); history.back(); diff --git a/kjvstudy_org/templates/book.html b/kjvstudy_org/templates/book.html index b893861..187ca86 100644 --- a/kjvstudy_org/templates/book.html +++ b/kjvstudy_org/templates/book.html @@ -403,13 +403,21 @@ document.addEventListener('DOMContentLoaded', function() { // Up arrow or k: Previous chapter if (e.key === 'ArrowUp' || e.key === 'k') { e.preventDefault(); - selectChapter(selectedChapterIndex - 1); + if (KJVNav.isSelectionOffScreen(chapterLinks, selectedChapterIndex)) { + selectChapter(KJVNav.findFirstVisibleIndex(chapterLinks)); + } else { + selectChapter(selectedChapterIndex - 1); + } } // Down arrow or j: Next chapter if (e.key === 'ArrowDown' || e.key === 'j') { e.preventDefault(); - selectChapter(selectedChapterIndex + 1); + if (KJVNav.isSelectionOffScreen(chapterLinks, selectedChapterIndex)) { + selectChapter(KJVNav.findFirstVisibleIndex(chapterLinks)); + } else { + selectChapter(selectedChapterIndex + 1); + } } // Enter: Go to selected chapter diff --git a/kjvstudy_org/templates/chapter.html b/kjvstudy_org/templates/chapter.html index 0a1bb95..a947d73 100644 --- a/kjvstudy_org/templates/chapter.html +++ b/kjvstudy_org/templates/chapter.html @@ -464,13 +464,21 @@ document.addEventListener('DOMContentLoaded', function() { // Up arrow or k: Previous verse if (e.key === 'ArrowUp' || e.key === 'k') { e.preventDefault(); - selectVerse(selectedVerseIndex - 1); + if (KJVNav.isSelectionOffScreen(verses, selectedVerseIndex)) { + selectVerse(KJVNav.findFirstVisibleIndex(verses)); + } else { + selectVerse(selectedVerseIndex - 1); + } } // Down arrow or j: Next verse if (e.key === 'ArrowDown' || e.key === 'j') { e.preventDefault(); - selectVerse(selectedVerseIndex + 1); + if (KJVNav.isSelectionOffScreen(verses, selectedVerseIndex)) { + selectVerse(KJVNav.findFirstVisibleIndex(verses)); + } else { + selectVerse(selectedVerseIndex + 1); + } } // Enter: Go to selected verse page diff --git a/kjvstudy_org/templates/commentary.html b/kjvstudy_org/templates/commentary.html index 878652e..bbe4a33 100644 --- a/kjvstudy_org/templates/commentary.html +++ b/kjvstudy_org/templates/commentary.html @@ -532,11 +532,20 @@ document.addEventListener('DOMContentLoaded', function() { if (e.key === 'ArrowDown' || e.key === 'j') { e.preventDefault(); - selectCard(selectedIndex < 0 ? 0 : selectedIndex + 1); + if (KJVNav.isSelectionOffScreen(verseCards, selectedIndex)) { + selectCard(KJVNav.findFirstVisibleIndex(verseCards)); + } else { + selectCard(selectedIndex < 0 ? 0 : selectedIndex + 1); + } } else if (e.key === 'ArrowUp' || e.key === 'k') { e.preventDefault(); - if (selectedIndex <= 0) selectCard(0); - else selectCard(selectedIndex - 1); + if (KJVNav.isSelectionOffScreen(verseCards, selectedIndex)) { + selectCard(KJVNav.findFirstVisibleIndex(verseCards)); + } else if (selectedIndex <= 0) { + selectCard(0); + } else { + selectCard(selectedIndex - 1); + } } else if (e.key === 'ArrowLeft' || e.key === 'h') { e.preventDefault(); history.back(); diff --git a/kjvstudy_org/templates/family_tree_ancestors.html b/kjvstudy_org/templates/family_tree_ancestors.html index e4d611e..c955db3 100644 --- a/kjvstudy_org/templates/family_tree_ancestors.html +++ b/kjvstudy_org/templates/family_tree_ancestors.html @@ -171,11 +171,20 @@ if (e.key === 'ArrowDown' || e.key === 'j') { e.preventDefault(); - selectNode(selectedIndex < 0 ? 0 : selectedIndex + 1); + if (KJVNav.isSelectionOffScreen(nodes, selectedIndex)) { + selectNode(KJVNav.findFirstVisibleIndex(nodes)); + } else { + selectNode(selectedIndex < 0 ? 0 : selectedIndex + 1); + } } else if (e.key === 'ArrowUp' || e.key === 'k') { e.preventDefault(); - if (selectedIndex <= 0) selectNode(0); - else selectNode(selectedIndex - 1); + if (KJVNav.isSelectionOffScreen(nodes, selectedIndex)) { + selectNode(KJVNav.findFirstVisibleIndex(nodes)); + } else if (selectedIndex <= 0) { + selectNode(0); + } else { + selectNode(selectedIndex - 1); + } } else if (e.key === 'ArrowLeft' || e.key === 'h') { e.preventDefault(); history.back(); diff --git a/kjvstudy_org/templates/family_tree_descendants.html b/kjvstudy_org/templates/family_tree_descendants.html index d7001cb..98e2059 100644 --- a/kjvstudy_org/templates/family_tree_descendants.html +++ b/kjvstudy_org/templates/family_tree_descendants.html @@ -173,11 +173,20 @@ if (e.key === 'ArrowDown' || e.key === 'j') { e.preventDefault(); - selectNode(selectedIndex < 0 ? 0 : selectedIndex + 1); + if (KJVNav.isSelectionOffScreen(nodes, selectedIndex)) { + selectNode(KJVNav.findFirstVisibleIndex(nodes)); + } else { + selectNode(selectedIndex < 0 ? 0 : selectedIndex + 1); + } } else if (e.key === 'ArrowUp' || e.key === 'k') { e.preventDefault(); - if (selectedIndex <= 0) selectNode(0); - else selectNode(selectedIndex - 1); + if (KJVNav.isSelectionOffScreen(nodes, selectedIndex)) { + selectNode(KJVNav.findFirstVisibleIndex(nodes)); + } else if (selectedIndex <= 0) { + selectNode(0); + } else { + selectNode(selectedIndex - 1); + } } else if (e.key === 'ArrowLeft' || e.key === 'h') { e.preventDefault(); history.back(); diff --git a/kjvstudy_org/templates/family_tree_generation.html b/kjvstudy_org/templates/family_tree_generation.html index 97f6b9c..36f3183 100644 --- a/kjvstudy_org/templates/family_tree_generation.html +++ b/kjvstudy_org/templates/family_tree_generation.html @@ -444,11 +444,20 @@ if (e.key === 'ArrowDown' || e.key === 'j') { e.preventDefault(); - selectCard(selectedIndex < 0 ? 0 : selectedIndex + 1); + if (KJVNav.isSelectionOffScreen(cards, selectedIndex)) { + selectCard(KJVNav.findFirstVisibleIndex(cards)); + } else { + selectCard(selectedIndex < 0 ? 0 : selectedIndex + 1); + } } else if (e.key === 'ArrowUp' || e.key === 'k') { e.preventDefault(); - if (selectedIndex <= 0) selectCard(0); - else selectCard(selectedIndex - 1); + if (KJVNav.isSelectionOffScreen(cards, selectedIndex)) { + selectCard(KJVNav.findFirstVisibleIndex(cards)); + } else if (selectedIndex <= 0) { + selectCard(0); + } else { + selectCard(selectedIndex - 1); + } } else if (e.key === 'ArrowLeft' || e.key === 'h') { e.preventDefault(); // Go to previous generation or back diff --git a/kjvstudy_org/templates/family_tree_person.html b/kjvstudy_org/templates/family_tree_person.html index e07b0cf..94eb4e0 100644 --- a/kjvstudy_org/templates/family_tree_person.html +++ b/kjvstudy_org/templates/family_tree_person.html @@ -704,11 +704,20 @@ if (e.key === 'ArrowDown' || e.key === 'j') { e.preventDefault(); - selectSection(selectedIndex < 0 ? 0 : selectedIndex + 1); + if (KJVNav.isSelectionOffScreen(sections, selectedIndex)) { + selectSection(KJVNav.findFirstVisibleIndex(sections)); + } else { + selectSection(selectedIndex < 0 ? 0 : selectedIndex + 1); + } } else if (e.key === 'ArrowUp' || e.key === 'k') { e.preventDefault(); - if (selectedIndex <= 0) selectSection(0); - else selectSection(selectedIndex - 1); + if (KJVNav.isSelectionOffScreen(sections, selectedIndex)) { + selectSection(KJVNav.findFirstVisibleIndex(sections)); + } else if (selectedIndex <= 0) { + selectSection(0); + } else { + selectSection(selectedIndex - 1); + } } else if (e.key === 'ArrowLeft' || e.key === 'h') { e.preventDefault(); history.back(); diff --git a/kjvstudy_org/templates/family_tree_search.html b/kjvstudy_org/templates/family_tree_search.html index 80a1c3e..f30a112 100644 --- a/kjvstudy_org/templates/family_tree_search.html +++ b/kjvstudy_org/templates/family_tree_search.html @@ -75,11 +75,20 @@ if (e.key === 'ArrowDown' || e.key === 'j') { e.preventDefault(); - selectResult(selectedIndex < 0 ? 0 : selectedIndex + 1); + if (KJVNav.isSelectionOffScreen(results, selectedIndex)) { + selectResult(KJVNav.findFirstVisibleIndex(results)); + } else { + selectResult(selectedIndex < 0 ? 0 : selectedIndex + 1); + } } else if (e.key === 'ArrowUp' || e.key === 'k') { e.preventDefault(); - if (selectedIndex <= 0) selectResult(0); - else selectResult(selectedIndex - 1); + if (KJVNav.isSelectionOffScreen(results, selectedIndex)) { + selectResult(KJVNav.findFirstVisibleIndex(results)); + } else if (selectedIndex <= 0) { + selectResult(0); + } else { + selectResult(selectedIndex - 1); + } } else if (e.key === 'ArrowLeft' || e.key === 'h') { e.preventDefault(); history.back(); diff --git a/kjvstudy_org/templates/fruits_of_spirit.html b/kjvstudy_org/templates/fruits_of_spirit.html index 1e6c494..18bc777 100644 --- a/kjvstudy_org/templates/fruits_of_spirit.html +++ b/kjvstudy_org/templates/fruits_of_spirit.html @@ -325,11 +325,20 @@ document.addEventListener('DOMContentLoaded', function() { if (e.key === 'ArrowDown' || e.key === 'j') { e.preventDefault(); - selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1); + if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) { + selectEntry(KJVNav.findFirstVisibleIndex(entries)); + } else { + selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1); + } } else if (e.key === 'ArrowUp' || e.key === 'k') { e.preventDefault(); - if (selectedIndex <= 0) selectEntry(0); - else selectEntry(selectedIndex - 1); + if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) { + selectEntry(KJVNav.findFirstVisibleIndex(entries)); + } else if (selectedIndex <= 0) { + selectEntry(0); + } else { + selectEntry(selectedIndex - 1); + } } else if (e.key === 'ArrowLeft' || e.key === 'h') { e.preventDefault(); history.back(); diff --git a/kjvstudy_org/templates/names_of_god.html b/kjvstudy_org/templates/names_of_god.html index 5ba05c2..740ef0a 100644 --- a/kjvstudy_org/templates/names_of_god.html +++ b/kjvstudy_org/templates/names_of_god.html @@ -319,11 +319,20 @@ document.addEventListener('DOMContentLoaded', function() { if (e.key === 'ArrowDown' || e.key === 'j') { e.preventDefault(); - selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1); + if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) { + selectEntry(KJVNav.findFirstVisibleIndex(entries)); + } else { + selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1); + } } else if (e.key === 'ArrowUp' || e.key === 'k') { e.preventDefault(); - if (selectedIndex <= 0) selectEntry(0); - else selectEntry(selectedIndex - 1); + if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) { + selectEntry(KJVNav.findFirstVisibleIndex(entries)); + } else if (selectedIndex <= 0) { + selectEntry(0); + } else { + selectEntry(selectedIndex - 1); + } } else if (e.key === 'ArrowLeft' || e.key === 'h') { e.preventDefault(); history.back(); diff --git a/kjvstudy_org/templates/parable_detail.html b/kjvstudy_org/templates/parable_detail.html index cd9af65..c7e2ece 100644 --- a/kjvstudy_org/templates/parable_detail.html +++ b/kjvstudy_org/templates/parable_detail.html @@ -140,11 +140,20 @@ if (e.key === 'ArrowDown' || e.key === 'j') { e.preventDefault(); - selectElement(selectedIndex < 0 ? 0 : selectedIndex + 1); + if (KJVNav.isSelectionOffScreen(elements, selectedIndex)) { + selectElement(KJVNav.findFirstVisibleIndex(elements)); + } else { + selectElement(selectedIndex < 0 ? 0 : selectedIndex + 1); + } } else if (e.key === 'ArrowUp' || e.key === 'k') { e.preventDefault(); - if (selectedIndex <= 0) selectElement(0); - else selectElement(selectedIndex - 1); + if (KJVNav.isSelectionOffScreen(elements, selectedIndex)) { + selectElement(KJVNav.findFirstVisibleIndex(elements)); + } else if (selectedIndex <= 0) { + selectElement(0); + } else { + selectElement(selectedIndex - 1); + } } else if (e.key === 'ArrowLeft' || e.key === 'h') { e.preventDefault(); history.back(); diff --git a/kjvstudy_org/templates/parables.html b/kjvstudy_org/templates/parables.html index 9aa255f..ad7cd98 100644 --- a/kjvstudy_org/templates/parables.html +++ b/kjvstudy_org/templates/parables.html @@ -333,11 +333,20 @@ document.addEventListener('DOMContentLoaded', function() { if (e.key === 'ArrowDown' || e.key === 'j') { e.preventDefault(); - selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1); + if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) { + selectEntry(KJVNav.findFirstVisibleIndex(entries)); + } else { + selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1); + } } else if (e.key === 'ArrowUp' || e.key === 'k') { e.preventDefault(); - if (selectedIndex <= 0) selectEntry(0); - else selectEntry(selectedIndex - 1); + if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) { + selectEntry(KJVNav.findFirstVisibleIndex(entries)); + } else if (selectedIndex <= 0) { + selectEntry(0); + } else { + selectEntry(selectedIndex - 1); + } } else if (e.key === 'ArrowLeft' || e.key === 'h') { e.preventDefault(); history.back(); diff --git a/kjvstudy_org/templates/reading_plan_detail.html b/kjvstudy_org/templates/reading_plan_detail.html index e98b669..aa73b42 100644 --- a/kjvstudy_org/templates/reading_plan_detail.html +++ b/kjvstudy_org/templates/reading_plan_detail.html @@ -244,11 +244,20 @@ if (e.key === 'ArrowDown' || e.key === 'j') { e.preventDefault(); - selectElement(selectedIndex < 0 ? 0 : selectedIndex + 1); + if (KJVNav.isSelectionOffScreen(elements, selectedIndex)) { + selectElement(KJVNav.findFirstVisibleIndex(elements)); + } else { + selectElement(selectedIndex < 0 ? 0 : selectedIndex + 1); + } } else if (e.key === 'ArrowUp' || e.key === 'k') { e.preventDefault(); - if (selectedIndex <= 0) selectElement(0); - else selectElement(selectedIndex - 1); + if (KJVNav.isSelectionOffScreen(elements, selectedIndex)) { + selectElement(KJVNav.findFirstVisibleIndex(elements)); + } else if (selectedIndex <= 0) { + selectElement(0); + } else { + selectElement(selectedIndex - 1); + } } else if (e.key === 'ArrowLeft' || e.key === 'h') { e.preventDefault(); history.back(); diff --git a/kjvstudy_org/templates/resource_detail.html b/kjvstudy_org/templates/resource_detail.html index 4c1cafa..062c2ca 100644 --- a/kjvstudy_org/templates/resource_detail.html +++ b/kjvstudy_org/templates/resource_detail.html @@ -194,11 +194,20 @@ if (e.key === 'ArrowDown' || e.key === 'j') { e.preventDefault(); - selectElement(selectedIndex < 0 ? 0 : selectedIndex + 1); + if (KJVNav.isSelectionOffScreen(elements, selectedIndex)) { + selectElement(KJVNav.findFirstVisibleIndex(elements)); + } else { + selectElement(selectedIndex < 0 ? 0 : selectedIndex + 1); + } } else if (e.key === 'ArrowUp' || e.key === 'k') { e.preventDefault(); - if (selectedIndex <= 0) selectElement(0); - else selectElement(selectedIndex - 1); + if (KJVNav.isSelectionOffScreen(elements, selectedIndex)) { + selectElement(KJVNav.findFirstVisibleIndex(elements)); + } else if (selectedIndex <= 0) { + selectElement(0); + } else { + selectElement(selectedIndex - 1); + } } else if (e.key === 'ArrowLeft' || e.key === 'h') { e.preventDefault(); history.back(); diff --git a/kjvstudy_org/templates/story_detail.html b/kjvstudy_org/templates/story_detail.html index 798ef6e..44f602f 100644 --- a/kjvstudy_org/templates/story_detail.html +++ b/kjvstudy_org/templates/story_detail.html @@ -376,12 +376,21 @@ hr.story-divider::before { if (e.key === 'ArrowDown' || e.key === 'j') { e.preventDefault(); - // Start at first paragraph, not metadata - selectElement(selectedIndex < 0 ? firstParagraphIndex : selectedIndex + 1); + if (KJVNav.isSelectionOffScreen(elements, selectedIndex)) { + selectElement(KJVNav.findFirstVisibleIndex(elements)); + } else { + // Start at first paragraph, not metadata + selectElement(selectedIndex < 0 ? firstParagraphIndex : selectedIndex + 1); + } } else if (e.key === 'ArrowUp' || e.key === 'k') { e.preventDefault(); - if (selectedIndex <= 0) selectElement(0); - else selectElement(selectedIndex - 1); + if (KJVNav.isSelectionOffScreen(elements, selectedIndex)) { + selectElement(KJVNav.findFirstVisibleIndex(elements)); + } else if (selectedIndex <= 0) { + selectElement(0); + } else { + selectElement(selectedIndex - 1); + } } else if (e.key === 'ArrowLeft' || e.key === 'h') { e.preventDefault(); history.back(); diff --git a/kjvstudy_org/templates/story_kids.html b/kjvstudy_org/templates/story_kids.html index 02bb1e8..126d9b0 100644 --- a/kjvstudy_org/templates/story_kids.html +++ b/kjvstudy_org/templates/story_kids.html @@ -397,12 +397,21 @@ hr.story-divider::before { if (e.key === 'ArrowDown' || e.key === 'j') { e.preventDefault(); - // Start at first paragraph, not metadata - selectElement(selectedIndex < 0 ? firstParagraphIndex : selectedIndex + 1); + if (KJVNav.isSelectionOffScreen(elements, selectedIndex)) { + selectElement(KJVNav.findFirstVisibleIndex(elements)); + } else { + // Start at first paragraph, not metadata + selectElement(selectedIndex < 0 ? firstParagraphIndex : selectedIndex + 1); + } } else if (e.key === 'ArrowUp' || e.key === 'k') { e.preventDefault(); - if (selectedIndex <= 0) selectElement(0); - else selectElement(selectedIndex - 1); + if (KJVNav.isSelectionOffScreen(elements, selectedIndex)) { + selectElement(KJVNav.findFirstVisibleIndex(elements)); + } else if (selectedIndex <= 0) { + selectElement(0); + } else { + selectElement(selectedIndex - 1); + } } else if (e.key === 'ArrowLeft' || e.key === 'h') { e.preventDefault(); history.back(); diff --git a/kjvstudy_org/templates/strongs_index.html b/kjvstudy_org/templates/strongs_index.html index c7a41e7..1fec72a 100644 --- a/kjvstudy_org/templates/strongs_index.html +++ b/kjvstudy_org/templates/strongs_index.html @@ -354,11 +354,20 @@ if (e.key === 'ArrowDown' || e.key === 'j') { e.preventDefault(); - selectItem(selectedIndex < 0 ? 0 : selectedIndex + 1); + if (KJVNav.isSelectionOffScreen(allItems, selectedIndex)) { + selectItem(KJVNav.findFirstVisibleIndex(allItems)); + } else { + selectItem(selectedIndex < 0 ? 0 : selectedIndex + 1); + } } else if (e.key === 'ArrowUp' || e.key === 'k') { e.preventDefault(); - if (selectedIndex <= 0) selectItem(0); - else selectItem(selectedIndex - 1); + if (KJVNav.isSelectionOffScreen(allItems, selectedIndex)) { + selectItem(KJVNav.findFirstVisibleIndex(allItems)); + } else if (selectedIndex <= 0) { + selectItem(0); + } else { + selectItem(selectedIndex - 1); + } } else if (e.key === 'ArrowLeft' || e.key === 'h') { e.preventDefault(); history.back(); diff --git a/kjvstudy_org/templates/strongs_language_index.html b/kjvstudy_org/templates/strongs_language_index.html index 170f126..59530c1 100644 --- a/kjvstudy_org/templates/strongs_language_index.html +++ b/kjvstudy_org/templates/strongs_language_index.html @@ -322,11 +322,20 @@ if (e.key === 'ArrowDown' || e.key === 'j') { e.preventDefault(); - selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1); + if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) { + selectEntry(KJVNav.findFirstVisibleIndex(entries)); + } else { + selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1); + } } else if (e.key === 'ArrowUp' || e.key === 'k') { e.preventDefault(); - if (selectedIndex <= 0) selectEntry(0); - else selectEntry(selectedIndex - 1); + if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) { + selectEntry(KJVNav.findFirstVisibleIndex(entries)); + } else if (selectedIndex <= 0) { + selectEntry(0); + } else { + selectEntry(selectedIndex - 1); + } } else if (e.key === 'ArrowLeft' || e.key === 'h') { e.preventDefault(); history.back(); diff --git a/kjvstudy_org/templates/study_guide_detail.html b/kjvstudy_org/templates/study_guide_detail.html index 0cd3b36..03452f1 100644 --- a/kjvstudy_org/templates/study_guide_detail.html +++ b/kjvstudy_org/templates/study_guide_detail.html @@ -245,11 +245,20 @@ document.addEventListener('DOMContentLoaded', function() { if (e.key === 'ArrowDown' || e.key === 'j') { e.preventDefault(); - selectSection(selectedIndex < 0 ? 0 : selectedIndex + 1); + if (KJVNav.isSelectionOffScreen(sections, selectedIndex)) { + selectSection(KJVNav.findFirstVisibleIndex(sections)); + } else { + selectSection(selectedIndex < 0 ? 0 : selectedIndex + 1); + } } else if (e.key === 'ArrowUp' || e.key === 'k') { e.preventDefault(); - if (selectedIndex <= 0) selectSection(0); - else selectSection(selectedIndex - 1); + if (KJVNav.isSelectionOffScreen(sections, selectedIndex)) { + selectSection(KJVNav.findFirstVisibleIndex(sections)); + } else if (selectedIndex <= 0) { + selectSection(0); + } else { + selectSection(selectedIndex - 1); + } } else if (e.key === 'ArrowLeft' || e.key === 'h') { e.preventDefault(); history.back(); diff --git a/kjvstudy_org/templates/study_guides.html b/kjvstudy_org/templates/study_guides.html index 5d15d40..56d75a5 100644 --- a/kjvstudy_org/templates/study_guides.html +++ b/kjvstudy_org/templates/study_guides.html @@ -64,11 +64,20 @@ if (e.key === 'ArrowDown' || e.key === 'j') { e.preventDefault(); - selectLink(selectedIndex < 0 ? 0 : selectedIndex + 1); + if (KJVNav.isSelectionOffScreen(links, selectedIndex)) { + selectLink(KJVNav.findFirstVisibleIndex(links)); + } else { + selectLink(selectedIndex < 0 ? 0 : selectedIndex + 1); + } } else if (e.key === 'ArrowUp' || e.key === 'k') { e.preventDefault(); - if (selectedIndex <= 0) selectLink(0); - else selectLink(selectedIndex - 1); + if (KJVNav.isSelectionOffScreen(links, selectedIndex)) { + selectLink(KJVNav.findFirstVisibleIndex(links)); + } else if (selectedIndex <= 0) { + selectLink(0); + } else { + selectLink(selectedIndex - 1); + } } else if (e.key === 'ArrowLeft' || e.key === 'h') { e.preventDefault(); history.back(); diff --git a/kjvstudy_org/templates/tetragrammaton.html b/kjvstudy_org/templates/tetragrammaton.html index e586d6f..68f9508 100644 --- a/kjvstudy_org/templates/tetragrammaton.html +++ b/kjvstudy_org/templates/tetragrammaton.html @@ -196,11 +196,20 @@ document.addEventListener('DOMContentLoaded', function() { if (e.key === 'ArrowDown' || e.key === 'j') { e.preventDefault(); - selectSection(selectedIndex < 0 ? 0 : selectedIndex + 1); + if (KJVNav.isSelectionOffScreen(sections, selectedIndex)) { + selectSection(KJVNav.findFirstVisibleIndex(sections)); + } else { + selectSection(selectedIndex < 0 ? 0 : selectedIndex + 1); + } } else if (e.key === 'ArrowUp' || e.key === 'k') { e.preventDefault(); - if (selectedIndex <= 0) selectSection(0); - else selectSection(selectedIndex - 1); + if (KJVNav.isSelectionOffScreen(sections, selectedIndex)) { + selectSection(KJVNav.findFirstVisibleIndex(sections)); + } else if (selectedIndex <= 0) { + selectSection(0); + } else { + selectSection(selectedIndex - 1); + } } else if (e.key === 'ArrowLeft' || e.key === 'h') { e.preventDefault(); history.back(); diff --git a/kjvstudy_org/templates/topic_detail.html b/kjvstudy_org/templates/topic_detail.html index 5675aa4..432c69f 100644 --- a/kjvstudy_org/templates/topic_detail.html +++ b/kjvstudy_org/templates/topic_detail.html @@ -222,11 +222,20 @@ if (e.key === 'ArrowDown' || e.key === 'j') { e.preventDefault(); - selectElement(selectedIndex < 0 ? 0 : selectedIndex + 1); + if (KJVNav.isSelectionOffScreen(elements, selectedIndex)) { + selectElement(KJVNav.findFirstVisibleIndex(elements)); + } else { + selectElement(selectedIndex < 0 ? 0 : selectedIndex + 1); + } } else if (e.key === 'ArrowUp' || e.key === 'k') { e.preventDefault(); - if (selectedIndex <= 0) selectElement(0); - else selectElement(selectedIndex - 1); + if (KJVNav.isSelectionOffScreen(elements, selectedIndex)) { + selectElement(KJVNav.findFirstVisibleIndex(elements)); + } else if (selectedIndex <= 0) { + selectElement(0); + } else { + selectElement(selectedIndex - 1); + } } else if (e.key === 'ArrowLeft' || e.key === 'h') { e.preventDefault(); history.back(); diff --git a/kjvstudy_org/templates/twelve_apostles.html b/kjvstudy_org/templates/twelve_apostles.html index 679b105..f733476 100644 --- a/kjvstudy_org/templates/twelve_apostles.html +++ b/kjvstudy_org/templates/twelve_apostles.html @@ -321,11 +321,20 @@ document.addEventListener('DOMContentLoaded', function() { if (e.key === 'ArrowDown' || e.key === 'j') { e.preventDefault(); - selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1); + if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) { + selectEntry(KJVNav.findFirstVisibleIndex(entries)); + } else { + selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1); + } } else if (e.key === 'ArrowUp' || e.key === 'k') { e.preventDefault(); - if (selectedIndex <= 0) selectEntry(0); - else selectEntry(selectedIndex - 1); + if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) { + selectEntry(KJVNav.findFirstVisibleIndex(entries)); + } else if (selectedIndex <= 0) { + selectEntry(0); + } else { + selectEntry(selectedIndex - 1); + } } else if (e.key === 'ArrowLeft' || e.key === 'h') { e.preventDefault(); history.back(); diff --git a/kjvstudy_org/templates/verse.html b/kjvstudy_org/templates/verse.html index 171aae7..7c185ae 100644 --- a/kjvstudy_org/templates/verse.html +++ b/kjvstudy_org/templates/verse.html @@ -982,11 +982,20 @@ // Normal navigation mode if (e.key === 'ArrowDown' || e.key === 'j') { e.preventDefault(); - selectElement(selectedIndex < 0 ? 0 : selectedIndex + 1); + if (KJVNav.isSelectionOffScreen(elements, selectedIndex)) { + selectElement(KJVNav.findFirstVisibleIndex(elements)); + } else { + selectElement(selectedIndex < 0 ? 0 : selectedIndex + 1); + } } else if (e.key === 'ArrowUp' || e.key === 'k') { e.preventDefault(); - if (selectedIndex <= 0) selectElement(0); - else selectElement(selectedIndex - 1); + if (KJVNav.isSelectionOffScreen(elements, selectedIndex)) { + selectElement(KJVNav.findFirstVisibleIndex(elements)); + } else if (selectedIndex <= 0) { + selectElement(0); + } else { + selectElement(selectedIndex - 1); + } } else if (e.key === 'Enter') { e.preventDefault(); // If on interlinear, enter word mode diff --git a/kjvstudy_org/templates/verse_of_the_day.html b/kjvstudy_org/templates/verse_of_the_day.html index 0f0b631..6a28b57 100644 --- a/kjvstudy_org/templates/verse_of_the_day.html +++ b/kjvstudy_org/templates/verse_of_the_day.html @@ -70,11 +70,20 @@ if (e.key === 'ArrowDown' || e.key === 'j') { e.preventDefault(); - selectRow(selectedIndex < 0 ? 0 : selectedIndex + 1); + if (KJVNav.isSelectionOffScreen(rows, selectedIndex)) { + selectRow(KJVNav.findFirstVisibleIndex(rows)); + } else { + selectRow(selectedIndex < 0 ? 0 : selectedIndex + 1); + } } else if (e.key === 'ArrowUp' || e.key === 'k') { e.preventDefault(); - if (selectedIndex <= 0) selectRow(0); - else selectRow(selectedIndex - 1); + if (KJVNav.isSelectionOffScreen(rows, selectedIndex)) { + selectRow(KJVNav.findFirstVisibleIndex(rows)); + } else if (selectedIndex <= 0) { + selectRow(0); + } else { + selectRow(selectedIndex - 1); + } } else if (e.key === 'ArrowLeft' || e.key === 'h') { e.preventDefault(); history.back(); diff --git a/kjvstudy_org/templates/women_of_the_bible.html b/kjvstudy_org/templates/women_of_the_bible.html index 4ce2c22..773824e 100644 --- a/kjvstudy_org/templates/women_of_the_bible.html +++ b/kjvstudy_org/templates/women_of_the_bible.html @@ -321,11 +321,20 @@ document.addEventListener('DOMContentLoaded', function() { if (e.key === 'ArrowDown' || e.key === 'j') { e.preventDefault(); - selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1); + if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) { + selectEntry(KJVNav.findFirstVisibleIndex(entries)); + } else { + selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1); + } } else if (e.key === 'ArrowUp' || e.key === 'k') { e.preventDefault(); - if (selectedIndex <= 0) selectEntry(0); - else selectEntry(selectedIndex - 1); + if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) { + selectEntry(KJVNav.findFirstVisibleIndex(entries)); + } else if (selectedIndex <= 0) { + selectEntry(0); + } else { + selectEntry(selectedIndex - 1); + } } else if (e.key === 'ArrowLeft' || e.key === 'h') { e.preventDefault(); history.back();