diff --git a/README.md b/README.md index d168e8a..032a235 100644 --- a/README.md +++ b/README.md @@ -142,7 +142,7 @@ completeness. - **Flow page gap:** Settings → Reading lets each user keep the normal separator between Flow pages or remove it for continuous webtoon artwork and text that crosses image edges. - **Page tone:** the reader's **Tone** button cycles Original → Inverted → Sepia → Dim → Extra dim in Flow, Page and Book. It changes only the artwork, never the controls or site theme. The choice is saved per user; it can also be selected in Settings → User → Reading. - **Active Reading Clock:** opt in under Settings → User → Reading time & privacy. No scrolling-speed limit; a visit counts at 60% viewed-page coverage and saves on exit. Pauses in the background or after 30 seconds without reader activity. Tap the clock for this visit's time, coverage, qualification and loading wait. -- **Continue where you left off:** the library opens with one row of the five manga you read most recently and have not finished (same tiles as the grid; they stay in the grid too). The row ignores the search and filters and hides while the library is sorted by *Recently read*. Turn it off under Settings → User → Reading → *Library page*. +- **Continue where you left off:** the first line of the library content (below the search, filters and tags) is one row of the five manga you read most recently and have not finished (same tiles as the grid; they stay in the grid too). It hides while a search is typed, a status filter is set, or the library is sorted by *Recently read*; tags and collection grouping do not affect it. Turn it off under Settings → User → Reading → *Library page*. - **Your Reading Story:** private active-time summaries appear on the library and manga pages when history exists. Chapter rows show the last timed read (60%-coverage visit), rereads remain visible as lifetime time, and Settings lets each user hide, export, or delete their own history. No leaderboards or speed ranking are used. - **Tap / click zones:** - Tapping **beside the pages** always shows or hides the controls. diff --git a/public/library.js b/public/library.js index db408a5..e1c0985 100644 --- a/public/library.js +++ b/public/library.js @@ -55,14 +55,12 @@ h('option', { value: 'grouped' }, 'Group collections'), h('option', { value: 'expanded' }, 'Expand collections'), h('option', { value: 'individual' }, 'Individual manga')); grouping.value = ['grouped', 'expanded', 'individual'].includes(store.get('grouping')) ? store.get('grouping') : 'grouped'; grouping.onchange = render; - // Started but unfinished manga, most recently read first. Ignores the filters below on purpose, - // and the same manga still appears in the grid. + // Started but unfinished manga, most recently read first; the same manga still appear in the grid. const continueItems = data.mangas.filter(m => m.lastRead && m.read < m.chapters) .sort((a, b) => b.lastRead - a.lastRead).slice(0, 5); const continueRow = h('section', { class: 'continue-row', 'aria-label': 'Continue where you left off', hidden: true }, h('div', { class: 'continue-banner' }, h('span', { 'aria-hidden': 'true' }, '▶'), 'Continue where you left off'), h('div', { class: 'continue-tiles' }, continueItems.map(m => tile(m)))); - main.append(continueRow); if (storyAvailable) { const most = data.mangas.find(manga => manga.id === data.reading.mostTimeMangaId); const latest = data.mangas.find(manga => manga.id === data.reading.lastMangaId); @@ -84,7 +82,7 @@ h('div', { class: 'filter-heading' }, h('b', {}, 'Tags'), h('span', { class: 'muted small' }, 'Manga must match every selected tag')), tagBar) : null, resultCount), - grid); + continueRow, grid); function syncTags() { store.set('tags', JSON.stringify([...selectedTags])); @@ -117,8 +115,10 @@ function render() { store.set('filter', filter.value); store.set('sort', sort.value); store.set('status', status.value); store.set('grouping', grouping.value); - // "Recently read" already puts these first, so the row would only repeat them. - continueRow.hidden = !me.settings.continueRow || sort.value === 'read' || !continueItems.length; + // Only on the plain overview: a search or status filter means the reader is looking for something else, + // and "Recently read" already puts these first. Tags and grouping keep it. + continueRow.hidden = !me.settings.continueRow || !continueItems.length || sort.value === 'read' + || !!filter.value.trim() || !!status.value; const q = filter.value.trim().toLowerCase(); const groups = (data.collections || []).filter(c => c.grouped); const membership = new Set(groups.flatMap(c => c.members.map(m => m.id))); diff --git a/public/settings.js b/public/settings.js index 15076d0..35f2160 100644 --- a/public/settings.js +++ b/public/settings.js @@ -93,7 +93,7 @@ section('user/reading').append(h('section', { class: 'card' }, h('h2', {}, 'Library page'), check('continueRow', 'Show "Continue where you left off" at the top', - 'One row with the five manga you read most recently and have not finished. It hides itself while the library is sorted by "Recently read".'))); + 'One row with the five manga you read most recently and have not finished. It hides itself while you search, filter by status, or sort by "Recently read".'))); section('user/reading').append(h('section', { class: 'card' }, h('h2', {}, 'Chapter list dates'),