Release v1.52.1
Some checks are pending
Test and SonarQube / quality (push) Waiting to run

This commit is contained in:
mARTin-B78 2026-09-22 23:53:34 +02:00
parent 2ba4daa742
commit ab5fce10bf
6 changed files with 37 additions and 56 deletions

View File

@ -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
### 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.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

View File

@ -1 +1 @@
1.52.0
1.52.1

View File

@ -10,7 +10,7 @@
<meta name="format-detection" content="telephone=no">
<meta name="color-scheme" content="light dark">
<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="icon" href="/static/icon.svg" type="image/svg+xml">
<link rel="apple-touch-icon" href="/static/icon.svg">
@ -27,12 +27,12 @@
<!-- ── Core styles (local — no CDN dependency for first paint) ────────── -->
<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/css/resource-diagnostics.css?v=1.52.0">
<link rel="stylesheet" href="/static/css/background-jobs.css?v=1.52.0">
<link rel="stylesheet" href="/static/css/voice-design.css?v=1.52.0">
<link rel="stylesheet" href="/static/css/rehearser.css?v=1.52.0">
<link rel="stylesheet" href="/static/css/audiobook.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.1">
<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.1">
<link rel="stylesheet" href="/static/css/rehearser.css?v=1.52.1">
<link rel="stylesheet" href="/static/css/audiobook.css?v=1.52.1">
<!-- ── Flag icons — non-blocking (loaded async, icons appear after JS) ── -->
@ -403,7 +403,7 @@ window.toggleNavTree = function(treeId, chevronId) {
</script>
<!-- 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>
</html>

View File

@ -621,28 +621,14 @@ function confidenceLabel(c) {
}
// ── 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
// detection pass just skipped -- is never surfaced by that workflow at all.
// Confirmed live: 73 of 204 pages (36%) in one real issue belonged to no
// article whatsoever. This finds those gaps and gives a one-click way into
// Review at an arbitrary page, which the review UI already supports
// (magReviewGoMagazinePage is not bounded to the anchor article's own
// pages) -- the missing piece was purely that nothing pointed there.
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;
}
// detection pass just skipped -- was never surfaced by that workflow at
// all. Confirmed live: 73 of 204 pages (36%) in one real issue belonged to
// no article whatsoever. A banner listing every such gap used to live here
// too, but the "All pages" view's own per-card "no article" tag already
// says the same thing in context, so it was just a second, redundant
// warning -- removed.
// 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
@ -662,23 +648,6 @@ function magNextUnresolvedPage(afterPage) {
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
// 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
@ -717,7 +686,6 @@ function renderContents() {
host.innerHTML = '<p class="muted">No articles yet. Run ingestion to detect them.</p>';
return;
}
renderCoverageBanner();
const bySection = new Map();
state.articles.forEach((a) => {
const key = a.section || 'Articles';

View File

@ -84,7 +84,6 @@
</button>
</div>
</div>
<div id="mag-coverage-banner" class="mag-coverage-banner" hidden></div>
<div id="mag-contents-bulkbar" class="mag-bulkbar" hidden></div>
<div class="mag-audio-export">
<label for="mag-audio-voice">Narrator for exported MP3s</label>

View File

@ -4930,13 +4930,16 @@ input[list="lang-codes"] {
.mag-bulkbar-progress { flex: 1; min-width: 0; }
.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 .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 input[type="range"] { width: 90px; accent-color: var(--accent); }
#mag-cols-value { min-width: 16px; text-align: right; }