From be2a2f0c627a44dd08094c65e935df93d3f5fe40 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Sun, 30 Nov 2025 01:51:58 -0500 Subject: [PATCH] Add collapsible URL list with keyboard navigation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Collapsible category sections for cached pages - Categories: Main Pages, Bible Chapters, Verse Commentary, Interlinear, Stories, Topics, Study Guides, etc. - Clean URL display: %20 replaced with spaces, paths cleaned up - Keyboard navigation: j/k to navigate, Enter/Space to expand, h/l for left/right, Esc to back out, u to enter URL nav mode - Increased download concurrency from 50 to 100 workers - Progress notifications every 250 completions (was 100) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- kjvstudy_org/static/sw.js | 4 +- kjvstudy_org/templates/offline.html | 366 ++++++++++++++++++++++++++-- 2 files changed, 354 insertions(+), 16 deletions(-) diff --git a/kjvstudy_org/static/sw.js b/kjvstudy_org/static/sw.js index da31beb..370b5f4 100644 --- a/kjvstudy_org/static/sw.js +++ b/kjvstudy_org/static/sw.js @@ -169,8 +169,8 @@ async function startBackgroundCaching() { }); // Concurrent pool - keep N requests in flight at all times - const CONCURRENCY = 50; // Number of concurrent requests - const PROGRESS_INTERVAL = 100; // Notify every N completions + const CONCURRENCY = 100; // Number of concurrent requests + const PROGRESS_INTERVAL = 250; // Notify every N completions let nextIndex = 0; let lastNotified = 0; diff --git a/kjvstudy_org/templates/offline.html b/kjvstudy_org/templates/offline.html index 71d1c30..c2bda7a 100644 --- a/kjvstudy_org/templates/offline.html +++ b/kjvstudy_org/templates/offline.html @@ -330,6 +330,77 @@ font-size: 1rem; color: var(--text-secondary); } + /* Collapsible URL sections */ + .url-categories { + margin: 1rem 0; + } + .url-category { + margin-bottom: 0.5rem; + border: 1px solid var(--border-color); + border-radius: 6px; + overflow: hidden; + } + .url-category-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0.75rem 1rem; + background: var(--border-color); + cursor: pointer; + user-select: none; + font-weight: 500; + } + .url-category-header:hover { + background: var(--text-secondary); + color: var(--bg-color); + } + .url-category.selected .url-category-header { + outline: 2px solid var(--success-color); + outline-offset: -2px; + } + .url-category-toggle { + font-size: 0.8rem; + transition: transform 0.2s; + } + .url-category.expanded .url-category-toggle { + transform: rotate(90deg); + } + .url-category-content { + display: none; + max-height: 400px; + overflow-y: auto; + padding: 0.5rem; + background: var(--bg-color); + } + .url-category.expanded .url-category-content { + display: block; + } + .url-item { + display: block; + padding: 0.4rem 0.75rem; + color: var(--link-color); + text-decoration: none; + font-size: 0.9rem; + border-radius: 4px; + } + .url-item:hover { + background: var(--border-color); + } + .url-item.selected { + background: var(--success-color); + color: white; + } + .url-count { + font-size: 0.8rem; + color: var(--text-secondary); + font-weight: normal; + } + .url-nav-hint { + font-size: 0.8rem; + color: var(--text-secondary); + margin-top: 0.5rem; + font-style: italic; + } @@ -407,7 +478,8 @@

Cached Pages 0

-