From 3bd85dd9c77e044bf8de9d43975688c064e3e11a Mon Sep 17 00:00:00 2001 From: slaguru666 <111923774+slaguru666@users.noreply.github.com> Date: Tue, 21 Jul 2026 13:14:33 +0100 Subject: [PATCH] fix: generate the missing seed art images (broken thumbnails) The art manifest referenced /art/*.png files that never existed; the SPA fallback returned index.html for them, so the library thumbnails rendered as broken images. Generate 5 atmospheric B&W placeholder scenes (tools/gen-art-placeholders.mjs, npm run gen:art) into public/art/. tests/tools/art-assets.test.js ties every manifest entry to a real PNG. Co-Authored-By: Claude Opus 4.8 --- package.json | 1 + public/art/detective-alley.png | Bin 0 -> 28855 bytes public/art/doorway-figure.png | Bin 0 -> 5061 bytes public/art/neon-street.png | Bin 0 -> 6261 bytes public/art/rain-pier.png | Bin 0 -> 21436 bytes public/art/worn-portrait.png | Bin 0 -> 28387 bytes tests/tools/art-assets.test.js | 18 ++++++ tools/gen-art-placeholders.mjs | 109 +++++++++++++++++++++++++++++++++ 8 files changed, 128 insertions(+) create mode 100644 public/art/detective-alley.png create mode 100644 public/art/doorway-figure.png create mode 100644 public/art/neon-street.png create mode 100644 public/art/rain-pier.png create mode 100644 public/art/worn-portrait.png create mode 100644 tests/tools/art-assets.test.js create mode 100644 tools/gen-art-placeholders.mjs diff --git a/package.json b/package.json index 161d3a8..a9862b5 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "test:watch": "vitest", "gen:scenario": "node tools/md-to-scenario.mjs", "gen:icons": "node tools/gen-icons.mjs", + "gen:art": "node tools/gen-art-placeholders.mjs", "ios:add": "npm run build && cap add ios", "ios:sync": "npm run build && cap sync ios", "ios:open": "cap open ios", diff --git a/public/art/detective-alley.png b/public/art/detective-alley.png new file mode 100644 index 0000000000000000000000000000000000000000..f3af5cfcb2e35d5d9d5465fda1059a0da07d75a4 GIT binary patch literal 28855 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 literal 0 HcmV?d00001 diff --git a/public/art/rain-pier.png b/public/art/rain-pier.png new file mode 100644 index 0000000000000000000000000000000000000000..a14650d547534af6bf4b3e22482e7fc100ca98bb GIT binary patch literal 21436 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 ZoYwx7pU0{j{PQ}P))n2$`D#{y{{tu6;=TX? literal 0 HcmV?d00001 diff --git a/tests/tools/art-assets.test.js b/tests/tools/art-assets.test.js new file mode 100644 index 0000000..0e37016 --- /dev/null +++ b/tests/tools/art-assets.test.js @@ -0,0 +1,18 @@ +import { describe, it, expect } from 'vitest'; +import { readFileSync } from 'node:fs'; +import manifest from '../../src/art/manifest.js'; + +// Guards the bug we hit: the seed art manifest referenced /art/*.png files that +// did not exist, so the SPA fallback served index.html and thumbnails broke. +describe('seed art library assets', () => { + it('every manifest image exists as a real PNG (not a broken reference)', () => { + expect(manifest.length).toBeGreaterThan(0); + for (const asset of manifest) { + expect(asset.src.startsWith('/art/'), asset.id).toBe(true); + const b = readFileSync('public' + asset.src); // /art/x.png → public/art/x.png + const isPng = b[0] === 0x89 && b[1] === 0x50 && b[2] === 0x4e && b[3] === 0x47; + expect(isPng, asset.src + ' is a PNG').toBe(true); + expect(b.length, asset.src + ' non-empty').toBeGreaterThan(500); + } + }); +}); diff --git a/tools/gen-art-placeholders.mjs b/tools/gen-art-placeholders.mjs new file mode 100644 index 0000000..cc53fae --- /dev/null +++ b/tools/gen-art-placeholders.mjs @@ -0,0 +1,109 @@ +// Reproducible B&W placeholder art for the seed library (the 5 entries in +// src/art/manifest.js). Pure Node — hand-rolled PNG encoder + analytic AA, +// atmospheric charcoal motifs. Swap for real pencil art anytime. +// node tools/gen-art-placeholders.mjs +import { deflateSync } from 'node:zlib'; +import { mkdirSync, writeFileSync } from 'node:fs'; + +const W = 480, H = 640; + +// ---- PNG encoder ---- +const CRC = (() => { const t = new Uint32Array(256); for (let n = 0; n < 256; n++) { let c = n; for (let k = 0; k < 8; k++) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1; t[n] = c >>> 0; } return t; })(); +const crc32 = (b) => { let c = 0xffffffff; for (let i = 0; i < b.length; i++) c = CRC[(c ^ b[i]) & 0xff] ^ (c >>> 8); return (c ^ 0xffffffff) >>> 0; }; +function chunk(type, data) { const len = Buffer.alloc(4); len.writeUInt32BE(data.length, 0); const t = Buffer.from(type, 'ascii'); const crc = Buffer.alloc(4); crc.writeUInt32BE(crc32(Buffer.concat([t, data])), 0); return Buffer.concat([len, t, data, crc]); } +function encodePNG(w, h, rgba) { + const ihdr = Buffer.alloc(13); ihdr.writeUInt32BE(w, 0); ihdr.writeUInt32BE(h, 4); ihdr[8] = 8; ihdr[9] = 6; + const stride = w * 4, raw = Buffer.alloc(h * (stride + 1)); + for (let y = 0; y < h; y++) rgba.copy(raw, y * (stride + 1) + 1, y * stride, y * stride + stride); + return Buffer.concat([Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]), chunk('IHDR', ihdr), chunk('IDAT', deflateSync(raw, { level: 9 })), chunk('IEND', Buffer.alloc(0))]); +} + +// ---- drawing ---- +const lerp = (a, b, t) => a + (b - a) * t; +const clamp = (x, a, b) => Math.max(a, Math.min(b, x)); +const ss = (e0, e1, x) => { const t = clamp((x - e0) / (e1 - e0), 0, 1); return t * t * (3 - 2 * t); }; +function rng(seed) { let s = seed >>> 0; return () => { s = (s * 1664525 + 1013904223) >>> 0; return s / 4294967296; }; } +function distSeg(px, py, ax, ay, bx, by) { const dx = bx - ax, dy = by - ay, l2 = dx * dx + dy * dy; let t = l2 ? ((px - ax) * dx + (py - ay) * dy) / l2 : 0; t = clamp(t, 0, 1); return Math.hypot(px - (ax + t * dx), py - (ay + t * dy)); } + +const AA = 1.1; +const LIGHT = [206, 214, 222], DIM = [150, 160, 172], BRIGHT = [232, 238, 244], AMBER = [232, 200, 150]; + +function canvas() { + const buf = Buffer.alloc(W * H * 4); + const api = { + buf, + bg(topRGB, botRGB) { for (let y = 0; y < H; y++) { const t = y / (H - 1); const c = [lerp(topRGB[0], botRGB[0], t), lerp(topRGB[1], botRGB[1], t), lerp(topRGB[2], botRGB[2], t)]; for (let x = 0; x < W; x++) { const i = (y * W + x) * 4; buf[i] = c[0]; buf[i + 1] = c[1]; buf[i + 2] = c[2]; buf[i + 3] = 255; } } }, + each(fn) { for (let y = 0; y < H; y++) for (let x = 0; x < W; x++) { const i = (y * W + x) * 4; const a = fn(x + 0.5, y + 0.5); if (!a) continue; const [col, alpha] = a; if (alpha <= 0) continue; buf[i] = lerp(buf[i], col[0], alpha); buf[i + 1] = lerp(buf[i + 1], col[1], alpha); buf[i + 2] = lerp(buf[i + 2], col[2], alpha); } }, + }; + return api; +} +const segCov = (px, py, a, hw) => (col, alpha) => [col, (1 - ss(hw - AA, hw + AA, distSeg(px, py, a[0], a[1], a[2], a[3]))) * alpha]; +const discCov = (px, py, cx, cy, r) => 1 - ss(r - AA, r + AA, Math.hypot(px - cx, py - cy)); + +const scenes = { + // Detective in alley — converging walls, backlit figure. + 'detective-alley'(c) { + c.bg([24, 27, 32], [12, 15, 20]); + c.each((x, y) => { + let a = 0, col = LIGHT; + const halo = Math.max(0, 1 - Math.hypot(x - 240, y - 500) / 150) * 0.4; // backlight + a = halo; col = [90, 96, 104]; + return [col, a]; + }); + c.each((x, y) => segCov(x, y, [40, H, 232, 175], 2)(DIM, 0.6)); // left perspective edge + c.each((x, y) => segCov(x, y, [440, H, 248, 175], 2)(DIM, 0.6)); // right perspective edge + c.each((x, y) => segCov(x, y, [90, 560, 390, 560], 2)(DIM, 0.5)); // ground + c.each((x, y) => { // figure silhouette: head + tapered body + const head = discCov(x, y, 240, 452, 16); + const halfW = lerp(20, 30, ss(470, 560, y)); // shoulders widen downward + const body = (1 - ss(halfW - AA, halfW + AA, Math.abs(x - 240))) * ss(468, 472, y) * (1 - ss(556, 560, y)); + return [[8, 9, 12], Math.max(head, body)]; + }); + }, + // Neon street — vertical light bars + reflections. + 'neon-street'(c) { + c.bg([20, 22, 30], [10, 12, 18]); + const bars = [[80, 70, 300, LIGHT], [150, 110, 330, AMBER], [300, 60, 280, BRIGHT], [372, 130, 340, LIGHT], [420, 90, 300, AMBER]]; + for (const [bx, y0, y1, col] of bars) { + c.each((x, y) => segCov(x, y, [bx, y0, bx, y1], 4)(col, 0.9)); + c.each((x, y) => segCov(x, y, [bx, 380, bx, 470], 5)(col, 0.18)); // reflection + } + c.each((x, y) => segCov(x, y, [0, 360, W, 360], 1.5)(DIM, 0.5)); // horizon + }, + // Worn portrait — head outline + shoulders + eyes. + 'worn-portrait'(c) { + c.bg([26, 24, 26], [12, 11, 14]); + c.each((x, y) => { const d = Math.hypot((x - 240) / 118, (y - 300) / 150); return [LIGHT, (1 - ss(0.97, 1.0, d)) * ss(0.9, 0.95, d) * 0.9]; }); // head ring (oval) + c.each((x, y) => segCov(x, y, [110, 600, 205, 455], 3)(DIM, 0.7)); + c.each((x, y) => segCov(x, y, [370, 600, 275, 455], 3)(DIM, 0.7)); + c.each((x, y) => [DIM, Math.max(discCov(x, y, 205, 300, 9), discCov(x, y, 275, 300, 9)) * 0.8]); // eyes + c.each((x, y) => segCov(x, y, [240, 300, 240, 350], 2)(DIM, 0.5)); // nose + }, + // Figure in a doorway — lit rectangle, dark silhouette. + 'doorway-figure'(c) { + c.bg([16, 18, 24], [9, 11, 16]); + c.each((x, y) => { const rx = 1 - ss(69, 71, Math.abs(x - 240)); const ry = ss(118, 120, y) * (1 - ss(598, 600, y)); return [[64, 70, 80], rx * ry * 0.85]; }); // lit doorway fill + c.each((x, y) => segCov(x, y, [170, 120, 170, 600], 2.5)(LIGHT, 0.6)); + c.each((x, y) => segCov(x, y, [310, 120, 310, 600], 2.5)(LIGHT, 0.6)); + c.each((x, y) => segCov(x, y, [170, 120, 310, 120], 2.5)(LIGHT, 0.6)); + c.each((x, y) => { const body = (1 - ss(24, 26, Math.abs(x - 240))) * (1 - ss(560, 562, y)) * ss(300, 302, y); return [[10, 12, 16], Math.max(body, discCov(x, y, 240, 300, 24))]; }); // silhouette + }, + // Pier in the rain — planks, rails, rain streaks. + 'rain-pier'(c) { + c.bg([22, 26, 32], [14, 18, 24]); + c.each((x, y) => segCov(x, y, [0, 300, W, 300], 1.5)(DIM, 0.4)); // horizon + for (const py of [345, 378, 414, 452]) c.each((x, y) => segCov(x, y, [140, py, 340, py], 2)(DIM, 0.55)); // planks + c.each((x, y) => segCov(x, y, [150, 300, 120, 470], 2)(DIM, 0.5)); // rails converging + c.each((x, y) => segCov(x, y, [330, 300, 360, 470], 2)(DIM, 0.5)); + const r = rng(7); + for (let i = 0; i < 60; i++) { const x0 = r() * W, y0 = r() * H, len = 22 + r() * 26; c.each((x, y) => segCov(x, y, [x0, y0, x0 - len * 0.32, y0 + len], 0.8)(LIGHT, 0.22)); } + }, +}; + +mkdirSync('public/art', { recursive: true }); +for (const [id, draw] of Object.entries(scenes)) { + const c = canvas(); + draw(c); + writeFileSync(`public/art/${id}.png`, encodePNG(W, H, c.buf)); + console.log(`wrote public/art/${id}.png`); +}