This commit is contained in:
parent
2ba4daa742
commit
ab5fce10bf
13
CHANGELOG.md
13
CHANGELOG.md
@ -9,6 +9,16 @@ Follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) · versioned wi
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## [1.52.1] — 2026-09-22
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- **Magazine: the page-grid column slider only changed card width, not thumbnail size.** A fixed thumbnail height meant fewer columns just left more empty space around the same small image instead of showing it bigger. The thumbnail now sizes by aspect ratio instead of a fixed height, so the slider is a real zoom.
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
- **Magazine: the page-coverage gap banner.** Redundant now that the "All pages" view's own per-card "no article" tag already says the same thing in context — it was a second warning repeating information already on screen.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## [1.52.0] — 2026-09-22
|
## [1.52.0] — 2026-09-22
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
@ -4409,7 +4419,8 @@ Initial feature-complete release.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
[Unreleased]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.52.0...HEAD
|
[Unreleased]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.52.1...HEAD
|
||||||
|
[1.52.1]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.52.0...v1.52.1
|
||||||
[1.52.0]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.51.0...v1.52.0
|
[1.52.0]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.51.0...v1.52.0
|
||||||
[1.51.0]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.50.0...v1.51.0
|
[1.51.0]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.50.0...v1.51.0
|
||||||
[1.50.0]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.49.0...v1.50.0
|
[1.50.0]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.49.0...v1.50.0
|
||||||
|
|||||||
@ -10,7 +10,7 @@
|
|||||||
<meta name="format-detection" content="telephone=no">
|
<meta name="format-detection" content="telephone=no">
|
||||||
<meta name="color-scheme" content="light dark">
|
<meta name="color-scheme" content="light dark">
|
||||||
<meta name="theme-color" content="#2563EB">
|
<meta name="theme-color" content="#2563EB">
|
||||||
<meta name="app-version" content="1.52.0">
|
<meta name="app-version" content="1.52.1">
|
||||||
<link rel="manifest" href="/manifest.webmanifest">
|
<link rel="manifest" href="/manifest.webmanifest">
|
||||||
<link rel="icon" href="/static/icon.svg" type="image/svg+xml">
|
<link rel="icon" href="/static/icon.svg" type="image/svg+xml">
|
||||||
<link rel="apple-touch-icon" href="/static/icon.svg">
|
<link rel="apple-touch-icon" href="/static/icon.svg">
|
||||||
@ -27,12 +27,12 @@
|
|||||||
|
|
||||||
<!-- ── Core styles (local — no CDN dependency for first paint) ────────── -->
|
<!-- ── Core styles (local — no CDN dependency for first paint) ────────── -->
|
||||||
<link rel="stylesheet" href="/static/vendor/mdi/materialdesignicons.min.css">
|
<link rel="stylesheet" href="/static/vendor/mdi/materialdesignicons.min.css">
|
||||||
<link rel="stylesheet" href="/static/style.css?v=1.52.0">
|
<link rel="stylesheet" href="/static/style.css?v=1.52.1">
|
||||||
<link rel="stylesheet" href="/static/css/resource-diagnostics.css?v=1.52.0">
|
<link rel="stylesheet" href="/static/css/resource-diagnostics.css?v=1.52.1">
|
||||||
<link rel="stylesheet" href="/static/css/background-jobs.css?v=1.52.0">
|
<link rel="stylesheet" href="/static/css/background-jobs.css?v=1.52.1">
|
||||||
<link rel="stylesheet" href="/static/css/voice-design.css?v=1.52.0">
|
<link rel="stylesheet" href="/static/css/voice-design.css?v=1.52.1">
|
||||||
<link rel="stylesheet" href="/static/css/rehearser.css?v=1.52.0">
|
<link rel="stylesheet" href="/static/css/rehearser.css?v=1.52.1">
|
||||||
<link rel="stylesheet" href="/static/css/audiobook.css?v=1.52.0">
|
<link rel="stylesheet" href="/static/css/audiobook.css?v=1.52.1">
|
||||||
|
|
||||||
|
|
||||||
<!-- ── Flag icons — non-blocking (loaded async, icons appear after JS) ── -->
|
<!-- ── Flag icons — non-blocking (loaded async, icons appear after JS) ── -->
|
||||||
@ -403,7 +403,7 @@ window.toggleNavTree = function(treeId, chevronId) {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<!-- loader.js: fetches sections → loads JS modules → removes skeleton -->
|
<!-- loader.js: fetches sections → loads JS modules → removes skeleton -->
|
||||||
<script src="/static/loader.js?v=1.52.0"></script>
|
<script src="/static/loader.js?v=1.52.1"></script>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@ -621,28 +621,14 @@ function confidenceLabel(c) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ── Page coverage ────────────────────────────────────────────────────────
|
// ── Page coverage ────────────────────────────────────────────────────────
|
||||||
// "Approve" only ever advances to the next ARTICLE, so a page that never
|
// "Approve" only ever advanced to the next ARTICLE, so a page that never
|
||||||
// got grouped into any article -- an ad, a missed piece, a page the
|
// got grouped into any article -- an ad, a missed piece, a page the
|
||||||
// detection pass just skipped -- is never surfaced by that workflow at all.
|
// detection pass just skipped -- was never surfaced by that workflow at
|
||||||
// Confirmed live: 73 of 204 pages (36%) in one real issue belonged to no
|
// all. Confirmed live: 73 of 204 pages (36%) in one real issue belonged to
|
||||||
// article whatsoever. This finds those gaps and gives a one-click way into
|
// no article whatsoever. A banner listing every such gap used to live here
|
||||||
// Review at an arbitrary page, which the review UI already supports
|
// too, but the "All pages" view's own per-card "no article" tag already
|
||||||
// (magReviewGoMagazinePage is not bounded to the anchor article's own
|
// says the same thing in context, so it was just a second, redundant
|
||||||
// pages) -- the missing piece was purely that nothing pointed there.
|
// warning -- removed.
|
||||||
function magUncoveredPageRanges() {
|
|
||||||
const total = state.doc?.pageCount || 0;
|
|
||||||
if (!total) return [];
|
|
||||||
const covered = new Set();
|
|
||||||
state.articles.forEach((a) => (a.pages || []).forEach((p) => covered.add(p)));
|
|
||||||
const gaps = [];
|
|
||||||
let start = null;
|
|
||||||
for (let p = 1; p <= total; p++) {
|
|
||||||
if (!covered.has(p)) { if (start === null) start = p; }
|
|
||||||
else if (start !== null) { gaps.push([start, p - 1]); start = null; }
|
|
||||||
}
|
|
||||||
if (start !== null) gaps.push([start, total]);
|
|
||||||
return gaps;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The next page after `afterPage` that still needs a human decision -- no
|
// The next page after `afterPage` that still needs a human decision -- no
|
||||||
// article covers it at all, or one does but is still sitting at its
|
// article covers it at all, or one does but is still sitting at its
|
||||||
@ -662,23 +648,6 @@ function magNextUnresolvedPage(afterPage) {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderCoverageBanner() {
|
|
||||||
const el = $('mag-coverage-banner');
|
|
||||||
if (!el) return;
|
|
||||||
const gaps = magUncoveredPageRanges();
|
|
||||||
if (!gaps.length) { el.hidden = true; el.innerHTML = ''; return; }
|
|
||||||
const pageCount = gaps.reduce((n, [a, b]) => n + (b - a + 1), 0);
|
|
||||||
el.hidden = false;
|
|
||||||
el.innerHTML =
|
|
||||||
'<span class="mdi mdi-alert-outline" aria-hidden="true"></span> ' +
|
|
||||||
'<span>' + pageCount + ' page' + (pageCount === 1 ? '' : 's') + ' (' + gaps.length + ' gap' + (gaps.length === 1 ? '' : 's') +
|
|
||||||
') ' + (pageCount === 1 ? "isn't" : "aren't") + ' part of any detected article, and will never come up just by approving articles one by one:</span>' +
|
|
||||||
'<span class="mag-coverage-ranges">' +
|
|
||||||
gaps.map(([a, b]) => '<button type="button" class="btn-sm" onclick="magReviewPage(' + a + ')">' +
|
|
||||||
(a === b ? 'p. ' + a : 'pp. ' + a + '–' + b) + '</button>').join('') +
|
|
||||||
'</span>';
|
|
||||||
}
|
|
||||||
|
|
||||||
// Opens Review at a specific page even when no article covers it, by
|
// Opens Review at a specific page even when no article covers it, by
|
||||||
// anchoring on whichever approved-or-not article is nearest that page (the
|
// anchoring on whichever approved-or-not article is nearest that page (the
|
||||||
// review UI needs *an* article as context, but its own page navigation is
|
// review UI needs *an* article as context, but its own page navigation is
|
||||||
@ -717,7 +686,6 @@ function renderContents() {
|
|||||||
host.innerHTML = '<p class="muted">No articles yet. Run ingestion to detect them.</p>';
|
host.innerHTML = '<p class="muted">No articles yet. Run ingestion to detect them.</p>';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
renderCoverageBanner();
|
|
||||||
const bySection = new Map();
|
const bySection = new Map();
|
||||||
state.articles.forEach((a) => {
|
state.articles.forEach((a) => {
|
||||||
const key = a.section || 'Articles';
|
const key = a.section || 'Articles';
|
||||||
|
|||||||
@ -84,7 +84,6 @@
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="mag-coverage-banner" class="mag-coverage-banner" hidden></div>
|
|
||||||
<div id="mag-contents-bulkbar" class="mag-bulkbar" hidden></div>
|
<div id="mag-contents-bulkbar" class="mag-bulkbar" hidden></div>
|
||||||
<div class="mag-audio-export">
|
<div class="mag-audio-export">
|
||||||
<label for="mag-audio-voice">Narrator for exported MP3s</label>
|
<label for="mag-audio-voice">Narrator for exported MP3s</label>
|
||||||
|
|||||||
@ -4930,13 +4930,16 @@ input[list="lang-codes"] {
|
|||||||
.mag-bulkbar-progress { flex: 1; min-width: 0; }
|
.mag-bulkbar-progress { flex: 1; min-width: 0; }
|
||||||
.mag-bulkbar-actions { display: flex; gap: 6px; margin-left: auto; }
|
.mag-bulkbar-actions { display: flex; gap: 6px; margin-left: auto; }
|
||||||
|
|
||||||
.mag-coverage-banner { display: flex; align-items: flex-start; gap: 10px; flex-wrap: wrap;
|
|
||||||
padding: 10px 14px; margin-bottom: 12px; border: 1px solid var(--yellow, #d97706); border-radius: var(--radius);
|
|
||||||
background: color-mix(in srgb, var(--yellow, #d97706) 10%, var(--surface)); }
|
|
||||||
.mag-coverage-banner .mdi { color: var(--yellow, #d97706); flex-shrink: 0; margin-top: 2px; }
|
|
||||||
.mag-coverage-ranges { display: flex; flex-wrap: wrap; gap: 6px; }
|
|
||||||
.mag-pages-grid { display: grid; grid-template-columns: repeat(var(--cols, 8), 1fr); gap: 12px; }
|
.mag-pages-grid { display: grid; grid-template-columns: repeat(var(--cols, 8), 1fr); gap: 12px; }
|
||||||
.mag-pages-grid .mag-card-thumb { height: 120px; }
|
/* A fixed thumbnail height (the article-thumbnail default) meant the column
|
||||||
|
slider only ever changed each card's WIDTH -- the page image itself sat
|
||||||
|
at the same small fixed size regardless, floating in a mostly-empty
|
||||||
|
card. aspect-ratio lets height follow width instead, so fewer columns
|
||||||
|
(wider cards) genuinely means bigger thumbnails, matching what "zoom"
|
||||||
|
should do. ~0.707 is ISO A4's width:height ratio -- close enough for a
|
||||||
|
real scanned page and much better than a guess when it's slightly off,
|
||||||
|
since object-fit: contain still letterboxes any mismatch cleanly. */
|
||||||
|
.mag-pages-grid .mag-card-thumb { height: auto; aspect-ratio: 0.707 / 1; }
|
||||||
.mag-cols-control { display: flex; align-items: center; gap: 6px; font-size: 13px; color: var(--subtext); }
|
.mag-cols-control { display: flex; align-items: center; gap: 6px; font-size: 13px; color: var(--subtext); }
|
||||||
.mag-cols-control input[type="range"] { width: 90px; accent-color: var(--accent); }
|
.mag-cols-control input[type="range"] { width: 90px; accent-color: var(--accent); }
|
||||||
#mag-cols-value { min-width: 16px; text-align: right; }
|
#mag-cols-value { min-width: 16px; text-align: right; }
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user