Continue row: first line of the content, only on the plain overview
The row now sits below the search, filters and tags, directly above the grid. It hides while a search is typed or a status filter is set (as well as on "Recently read"); tags and collection grouping keep it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
1ddefaa7ac
commit
41e7ed063e
3 files changed
+8
-8
No files matched your search
@@ -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.
|
- **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.
|
- **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.
|
- **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.
|
- **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:**
|
- **Tap / click zones:**
|
||||||
- Tapping **beside the pages** always shows or hides the controls.
|
- Tapping **beside the pages** always shows or hides the controls.
|
||||||
|
|||||||
+6
-6
@@ -55,14 +55,12 @@
|
|||||||
h('option', { value: 'grouped' }, 'Group collections'), h('option', { value: 'expanded' }, 'Expand collections'), h('option', { value: 'individual' }, 'Individual manga'));
|
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.value = ['grouped', 'expanded', 'individual'].includes(store.get('grouping')) ? store.get('grouping') : 'grouped';
|
||||||
grouping.onchange = render;
|
grouping.onchange = render;
|
||||||
// Started but unfinished manga, most recently read first. Ignores the filters below on purpose,
|
// Started but unfinished manga, most recently read first; the same manga still appear in the grid.
|
||||||
// and the same manga still appears in the grid.
|
|
||||||
const continueItems = data.mangas.filter(m => m.lastRead && m.read < m.chapters)
|
const continueItems = data.mangas.filter(m => m.lastRead && m.read < m.chapters)
|
||||||
.sort((a, b) => b.lastRead - a.lastRead).slice(0, 5);
|
.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 },
|
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-banner' }, h('span', { 'aria-hidden': 'true' }, '▶'), 'Continue where you left off'),
|
||||||
h('div', { class: 'continue-tiles' }, continueItems.map(m => tile(m))));
|
h('div', { class: 'continue-tiles' }, continueItems.map(m => tile(m))));
|
||||||
main.append(continueRow);
|
|
||||||
if (storyAvailable) {
|
if (storyAvailable) {
|
||||||
const most = data.mangas.find(manga => manga.id === data.reading.mostTimeMangaId);
|
const most = data.mangas.find(manga => manga.id === data.reading.mostTimeMangaId);
|
||||||
const latest = data.mangas.find(manga => manga.id === data.reading.lastMangaId);
|
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')),
|
h('div', { class: 'filter-heading' }, h('b', {}, 'Tags'), h('span', { class: 'muted small' }, 'Manga must match every selected tag')),
|
||||||
tagBar) : null,
|
tagBar) : null,
|
||||||
resultCount),
|
resultCount),
|
||||||
grid);
|
continueRow, grid);
|
||||||
|
|
||||||
function syncTags() {
|
function syncTags() {
|
||||||
store.set('tags', JSON.stringify([...selectedTags]));
|
store.set('tags', JSON.stringify([...selectedTags]));
|
||||||
@@ -117,8 +115,10 @@
|
|||||||
|
|
||||||
function render() {
|
function render() {
|
||||||
store.set('filter', filter.value); store.set('sort', sort.value); store.set('status', status.value); store.set('grouping', grouping.value);
|
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.
|
// Only on the plain overview: a search or status filter means the reader is looking for something else,
|
||||||
continueRow.hidden = !me.settings.continueRow || sort.value === 'read' || !continueItems.length;
|
// 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 q = filter.value.trim().toLowerCase();
|
||||||
const groups = (data.collections || []).filter(c => c.grouped);
|
const groups = (data.collections || []).filter(c => c.grouped);
|
||||||
const membership = new Set(groups.flatMap(c => c.members.map(m => m.id)));
|
const membership = new Set(groups.flatMap(c => c.members.map(m => m.id)));
|
||||||
|
|||||||
+1
-1
@@ -93,7 +93,7 @@
|
|||||||
section('user/reading').append(h('section', { class: 'card' },
|
section('user/reading').append(h('section', { class: 'card' },
|
||||||
h('h2', {}, 'Library page'),
|
h('h2', {}, 'Library page'),
|
||||||
check('continueRow', 'Show "Continue where you left off" at the top',
|
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' },
|
section('user/reading').append(h('section', { class: 'card' },
|
||||||
h('h2', {}, 'Chapter list dates'),
|
h('h2', {}, 'Chapter list dates'),
|
||||||
|
|||||||
Reference in new issue
Block a user