The carried commits keep the reason and drop the speaker
Thirteen lines arriving in this landing named or quoted the Driver: the packet renderer and its two gates, and the desktop build. check:no-new-driver-references fails on each of them, so they are reworded here the same way as the sweep: the date and the requirement stay, the speaker and the quote go.
This commit is contained in:
parent
d314c44043
commit
46a53f0b4e
4 changed files with 16 additions and 16 deletions
|
|
@ -101,7 +101,7 @@ const box = (html) => {
|
|||
if (b) ok(Math.abs(b.x + 34 * b.s - M) < 1 && b.y + 34 * b.s >= M - 1,
|
||||
`the map-only sheet's names start ${(b.x + 34 * b.s).toFixed(1)}px from the edge; every packet page keeps ${M}px`,
|
||||
`its names land on the same ${M}px margin as every other page (scale ${b.s})`)
|
||||
// ★ A POSTER FILLS THE PAGE inside the white margin M (Driver 2026-09-29: page 1 is the map alone).
|
||||
// ★ A POSTER FILLS THE PAGE inside the white margin M (2026-09-29: page 1 is the map alone).
|
||||
const p = box(R.liftMap(POSTER_SHEET))
|
||||
ok(p && p.kind === 'poster' && p.x >= M - 0.5 && p.y >= M - 0.5 && p.x + p.w <= W - M + 0.5 && p.y + p.h <= H - M + 0.5
|
||||
&& (Math.abs(p.w - (W - 2 * M)) < 1 || Math.abs(p.h - (H - 2 * M)) < 1),
|
||||
|
|
|
|||
|
|
@ -85,7 +85,7 @@ ok(count(light, /sheet-christian/g) === 0, 'lightweight still carries the %-evan
|
|||
ok(count(light, /funnel-title/g) === count(full, /funnel-title/g), 'lightweight lost the funnel (the narrowing triangle)')
|
||||
// …and the SETS page, which is back matter a reader sits with rather than carries — the same
|
||||
// reason the life calendar and the %-evangelical grid are dropped.
|
||||
// ★ ONE SETS PAGE CARRYING BOTH CHARTS (Driver 2026-09-29: two square panels side by side), asserted
|
||||
// ★ ONE SETS PAGE CARRYING BOTH CHARTS (2026-09-29: two square panels side by side), asserted
|
||||
// by each chart's own class, so losing EITHER chart fails by name rather than inside a total.
|
||||
ok(count(full, /<div class="sheet [^"]*sheet-sets\b/g) === 1, 'the full packet should have exactly ONE sets page')
|
||||
ok(count(full, /sheet-sets-bounded/g) === 1, 'the full packet has no bounded-set chart')
|
||||
|
|
@ -135,7 +135,7 @@ ok(count(light, /sheet-sets-(bounded|centered)/g) === 0, 'lightweight still carr
|
|||
'Same language family, different culture', 'Nearby only']
|
||||
want.forEach((w, i) => ok(((all[i] || {}).name || '') === w,
|
||||
`ring ${i + 1} should read ${JSON.stringify(w)}, got ${JSON.stringify(all[i])}`))
|
||||
// ★ EVERY RING IS EXPLAINED (Driver 2026-09-29: "a legend to explain each ring"), and each row
|
||||
// ★ EVERY RING IS EXPLAINED (2026-09-29: a legend explains each ring), and each row
|
||||
// states its own count. Two-sided: a populated ring shows its number, an empty ring shows a dash.
|
||||
const sparse = only([1, 1, 3, 7, 7, 7])
|
||||
ok(sparse.length === 10, `every ring should be explained even when empty, got ${sparse.length} rows`)
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ const TAURI_DIR = join(ROOT, 'deployment', 'src-tauri')
|
|||
const plugin = process.argv[2]
|
||||
const die = (m) => { console.error('desktop:build: ' + m); process.exit(1) }
|
||||
// ★ THE BUILD YIELDS THE CPU TO LIVE TRANSCRIPTION. Rudder's speech model runs on the CPU
|
||||
// (backend/rudder-engine starts it with --device cpu), and the Driver measured dictation falling
|
||||
// (backend/rudder-engine starts it with --device cpu), and dictation was measured falling
|
||||
// behind WHILE THIS BUILD RAN. A Rust build saturates every core, so at equal priority it starves
|
||||
// the one process whose latency a person can feel.
|
||||
//
|
||||
|
|
|
|||
|
|
@ -229,7 +229,7 @@ export function createPacketRenderer({ strings, lang = 'en', fontData = null, de
|
|||
column through the viewBox, which is what keeps gospel's boundary gap intact:
|
||||
the gap lives in the LAYOUT's coordinates and scaling the viewBox cannot
|
||||
compress it, whereas nudging r or spread would. */
|
||||
/* ★ ONE PAGE, TWO SQUARE PANELS SIDE BY SIDE (Driver 2026-09-29, after the Module 1 "list of 100"
|
||||
/* ★ ONE PAGE, TWO SQUARE PANELS SIDE BY SIDE (2026-09-29, after the Module 1 "list of 100"
|
||||
sheet, which closes on BOUNDED SET | CENTERED SET as two squares). Each panel is a framed square
|
||||
with its heading on top; the ring legend runs under both at full width. */
|
||||
.set-row{display:flex;gap:40px;justify-content:center;align-items:stretch;margin-top:30px}
|
||||
|
|
@ -515,7 +515,7 @@ export function createPacketRenderer({ strings, lang = 'en', fontData = null, de
|
|||
}
|
||||
|
||||
function mapPage(zone, groups, mapSvg, funnel = null) {
|
||||
// ★ A POSTER IS PAGE 1 BY ITSELF (Driver 2026-09-29): the map fills the page inside a white margin,
|
||||
// ★ A POSTER IS PAGE 1 BY ITSELF (2026-09-29): the map fills the page inside a white margin,
|
||||
// under its own title only. Drawing the packet's title over it as well printed TWO headers and
|
||||
// shrank the map to fit beneath them. The set it belongs to is the triangle page's job.
|
||||
if (mapSvg && /data-map-kind="poster"/.test(mapSvg)) {
|
||||
|
|
@ -856,15 +856,15 @@ export function createPacketRenderer({ strings, lang = 'en', fontData = null, de
|
|||
// ★ 5,200 IS NOT ROUNDED OR CHOSEN FOR LAYOUT: 100 years x 52 weeks, a 100-year life in weeks.
|
||||
// Everything else here is derived from it, so the two pages cannot
|
||||
// drift apart into two grids that merely look alike.
|
||||
// ★ LAID OUT LIKE THE PRINTED LIFE CALENDAR (the Module 1 "Life Calendar in Weeks" sheet, which the
|
||||
// Driver asked this page to imitate): square boxes, week numbers across the top, the year down the
|
||||
// ★ LAID OUT LIKE THE PRINTED LIFE CALENDAR (the Module 1 "Life Calendar in Weeks" sheet, which this
|
||||
// page is asked to imitate): square boxes, week numbers across the top, the year down the
|
||||
// side, a thin rule between decades, the whole grid framed and centred on the page. The earlier grid
|
||||
// stretched 52 columns across the full width, so its boxes were flattened rectangles with no axes.
|
||||
//
|
||||
// ★ SHADED FROM THE TOP, IN READING ORDER (Driver 2026-09-29: "show the highlighted dots started from
|
||||
// the top"). This grid used to SCATTER the shaded boxes, a choice made from a contact sheet in which a
|
||||
// contiguous run looked like a bar; the Driver has now asked for the opposite, and the grid is the
|
||||
// Driver's picture. Filling from the top also makes the two pages read the same way: Jesus' 33 years
|
||||
// ★ SHADED FROM THE TOP, IN READING ORDER (2026-09-29: the highlighted boxes start from
|
||||
// the top). This grid used to SCATTER the shaded boxes, a choice made from a contact sheet in which a
|
||||
// contiguous run looked like a bar; the opposite has now been asked for, and the grid is the
|
||||
// product's picture. Filling from the top also makes the two pages read the same way: Jesus' 33 years
|
||||
// are the first rows of a life, and the evangelical share is the first boxes of the same life.
|
||||
function lifeGrid({ shaded = 0, shadeClass = 'lc-on' } = {}) {
|
||||
const YEARS = 100, WEEKS = 52, TOTAL = YEARS * WEEKS;
|
||||
|
|
@ -891,8 +891,8 @@ export function createPacketRenderer({ strings, lang = 'en', fontData = null, de
|
|||
// No age is supplied today: the packet is printed for a reader we do not know, so shading their life
|
||||
// would be a guess presented as a fact. The empty grid is the honest version and still lands the
|
||||
// point — 5,200 boxes is a whole life on one page.
|
||||
// ★ THE FIRST 33 YEARS ARE JESUS' LIFE (Driver 2026-09-29: "the boxes highlighted need to show 33
|
||||
// years representing Jesus' life"). Still no reader's age: shading the reader's own weeks would be a
|
||||
// ★ THE FIRST 33 YEARS ARE JESUS' LIFE (2026-09-29: the highlighted boxes show the 33
|
||||
// years of Jesus' life). Still no reader's age: shading the reader's own weeks would be a
|
||||
// guess presented as a fact, while 33 x 52 is the same for every reader.
|
||||
const JESUS_YEARS = 33;
|
||||
function lifePage(zone) {
|
||||
|
|
@ -1049,7 +1049,7 @@ export function createPacketRenderer({ strings, lang = 'en', fontData = null, de
|
|||
}
|
||||
|
||||
// ── THE LIGHTWEIGHT LIST: a worksheet, not a profile book ───────────────────
|
||||
// Driver 2026-09-29: the lightweight packet is less about fitting information in and more a
|
||||
// 2026-09-29: the lightweight packet is less about fitting information in and more a
|
||||
// printable, instructive sheet — every people group, less text, a kind rather than commanding
|
||||
// voice, and type and spacing sized for paper. Modelled on the Module 1 list-of-100 worksheet: a
|
||||
// short note on the first page, one column header per page, numbered rows with room to tick. No
|
||||
|
|
@ -1281,7 +1281,7 @@ export function createPacketRenderer({ strings, lang = 'en', fontData = null, de
|
|||
if (rows) legend = `<div class="set-legend"><div class="set-legend-h">${esc(t('sets_rings_head'))}</div>${rows}</div>`;
|
||||
}
|
||||
|
||||
// ★ ONE PAGE (Driver 2026-09-29), superseding the one-chart-per-page split: the two figures are a
|
||||
// ★ ONE PAGE (2026-09-29), superseding the one-chart-per-page split: the two figures are a
|
||||
// PAIR and read as one, square panels side by side in the middle of the page, the legend under both.
|
||||
// The page key stays 'sets', so the lightweight variant still drops it whole.
|
||||
return sheet(`
|
||||
|
|
|
|||
Loading…
Reference in a new issue