diff --git a/internal/check-packet-render.mjs b/internal/check-packet-render.mjs index ad43cf9cf..3932ff89a 100644 --- a/internal/check-packet-render.mjs +++ b/internal/check-packet-render.mjs @@ -279,7 +279,7 @@ const r = await page.evaluate(() => { return Math.round(Math.max(0, ...[...b.children].map((k) => k.getBoundingClientRect().bottom + parseFloat(getComputedStyle(k).marginBottom))) - top - b.clientHeight) })(), // The points page is ONE sheet by design and fits only because its sizes were tuned to the longest locale; // measure its content against its box (studio's ask), as fdTopOver does for the list's first page. - // The points flow over TWO sheets (2026-10-02); each sheet's body is measured, the worst one reported. + // Each points sheet's body is measured, the worst one reported (one sheet today). pointsOver: (() => { const bs = [...document.querySelectorAll('.points-body')]; if (!bs.length) return null return Math.max(...bs.map((b) => { const top = b.getBoundingClientRect().top return Math.round(Math.max(b.scrollHeight - b.clientHeight, ...[...b.children].map((k) => k.getBoundingClientRect().bottom - top - b.clientHeight))) })) })(), @@ -786,9 +786,9 @@ if (r.fdTopOver > 0) fails.push(`the Full detail's explanation block outgrows it if (r.wsRows && r.wsSheets !== wsPages(r.wsRows)) fails.push(`${r.wsRows} worksheet rows should take ${wsPages(r.wsRows)} page(s) but the packet has ${r.wsSheets}`) // + 2 again (2026-09-30, the second revision): point 4's Mark 5:18-20 and the Father's-heart list are back ON the // points page, so the back matter is the wheel and the points. -// + 3 (2026-10-02): the wheel, and the points on TWO sheets (themes + points 1–6, then 7–12), read at print size. -if (r.pointsSheets !== 2) fails.push(`the prayer points should flow over 2 sheets, found ${r.pointsSheets}`) -const expectedSheets = 1 + lifeSheets + funnelSheets + listSheets + setsSheets + 3 +// + 2: the wheel and the points, the twelve points and the themes on ONE sheet (2026-10-02, at the demo). +if (r.pointsSheets !== 1) fails.push(`the twelve prayer points and the themes should fit ONE sheet, found ${r.pointsSheets}`) +const expectedSheets = 1 + lifeSheets + funnelSheets + listSheets + setsSheets + 2 // ── THE LIFE-CALENDAR PAGES, asserted rather than merely counted ────────────────────────────────── // A page that EXISTS is not a page that is RIGHT: an empty grid, a grid of the wrong size, or a // christian page whose shading silently fell to zero would all still be one sheet. 5,200 is the diff --git a/library/packet/packet-render.js b/library/packet/packet-render.js index 34b900f26..803a0e2a5 100644 --- a/library/packet/packet-render.js +++ b/library/packet/packet-render.js @@ -287,12 +287,12 @@ export function createPacketRenderer({ strings, lang = 'en', fontData = null, de .xb-ex-note{margin-top:4px;font-size:14px;color:#6f6a5c} /* The prayer themes and scenes above the twelve points: a thin numbered list, ruled off below. */ .pt-themes{margin:0 0 10px;padding:0 0 6px;border-bottom:1.5px solid #c9bfa4} - .pt-th-h{font:400 21px/1.3 Georgia,serif;color:#413d35} - .pt-th-h b,.pt-sc-h b{font:700 22px Georgia,serif;color:#1b1a17;letter-spacing:.02em} + .pt-th-h{font:400 19px/1.3 Georgia,serif;color:#413d35} + .pt-th-h b,.pt-sc-h b{font:700 20px Georgia,serif;color:#1b1a17;letter-spacing:.02em} .pt-th-i{font-style:italic;color:#6d766e} - .pt-th-list{display:flex;flex-wrap:wrap;gap:1px 20px;margin:2px 0 0;padding:0;list-style:none;font:400 21px/1.3 Georgia,serif;color:#3b3226} + .pt-th-list{display:flex;flex-wrap:wrap;gap:1px 20px;margin:2px 0 0;padding:0;list-style:none;font:400 19px/1.3 Georgia,serif;color:#3b3226} .pt-n{display:inline-block;min-width:1.3em;font-weight:700;color:#7a3b2e} - .pt-sc-r{font:600 19px Georgia,serif;color:#7a3b2e} + .pt-sc-r{font:600 18px Georgia,serif;color:#7a3b2e} .ws-cols{margin:0;padding:0;list-style:none} .ws-cols li{margin:0 0 6px;font:400 19px/1.45 Georgia,serif;color:#413d35} .ws-cols li b{color:#1b1a17} @@ -1352,13 +1352,11 @@ export function createPacketRenderer({ strings, lang = 'en', fontData = null, de // Mark 5:18-20 and the Father's-heart list share this ONE sheet, in every locale: the sizes below are the // largest that fit the longest locale. class="points-body" is a TEST HOOK: the page must fit ONE sheet in // every locale (its scrollHeight within its clientHeight). - // ★ READABLE ON PAPER, ON TWO SHEETS (2026-10-02): the point text at 22.5px (~9.2pt on letter), the themes at - // 21px (~8.6pt), the Mark 5 passage at 20px; that no longer fits one sheet, so the points FLOW onto a second: the - // themes and points 1–6 (point 4 carries its passage and the Father's-heart list) on the first, 7–12 on the - // second, which carries the credit line. Measured in all 11 locales: the fullest first sheet (fr, de) keeps - // ~350px; check:packet-render fails either sheet's overflow (pointsOver). - const PT = { head: 25, sub: 21, text: 22.5, refs: 18.5, gap: 18, passage: 20 }; - const POINTS_FIRST = 6; + // ★ ONE SHEET AGAIN (2026-10-02): the twelve points and the themes fit ONE page, as large as one page allows: + // the point text 18.5px (~7.5pt on letter), the themes 19px, 5px between points, the Mark 5 passage 16px; the + // credit line stays 0.28in above the edge. Measured in all 11 locales: the tightest (fr 75px, hi 79px) keep + // that much under the last point; check:packet-render fails overflow (pointsOver). + const PT = { head: 22, sub: 19, text: 18.5, refs: 16, gap: 5, passage: 16, top: 82 }; // ⚠ ISOLATE EACH REFERENCE FOR BIDI. Scripture references stay in English // (a reader looks them up in their own Bible), so on an RTL page they are // LTR runs inside an RTL paragraph. Without isolation the Unicode bidi @@ -1408,16 +1406,12 @@ export function createPacketRenderer({ strings, lang = 'en', fontData = null, de ${p.print_passage ? passageBlock() + heartBlock() : ''} `; }); - // Each sheet names its range (1–5, 6–12) beside the title, in the language's digits. - const head = (from, to, intro) => ` + return sheet(`