ERBFirsts.com Version Log v5.5.28
ERBFirsts.com Version Log
================================================================================
VERSION v5.5.28 — 2026-07-14 [Web Stats, shared menu bundle, home-screen icons]
================================================================================
NOTE: Consolidated entry covering 2026-06-28 → 2026-07-14. SITE_VER held at
v5.5.27 through this range; all shipped work is logged here under v5.5.28.
FIXED — the deploy BAT had not run the generator in weeks (T21):
- DeployERBFirsts_T20 read GEN_VER with `findstr /B /C:"GEN_VER"` and took the
FIRST match, which was the line in global-generator.py's module DOCSTRING
(GEN_VER = v0.92), not the real constant below it. The BAT therefore read a
frozen v0.92 forever, it always matched last-gen-ver.txt, RUNGEN stayed 0,
and full regen never fired — so book pages kept stamping gen v0.96 while
site/verification (which reads the Python constant) said v0.98. T21 drops the
early exit so the LAST match wins, and the docstring lines are indented so
they no longer sit at column 0. Both belts, one pair of braces.
ADDED — first-party visitor stats (no Google Analytics):
- GA4 was rejected: ad blockers drop google-analytics.com outright, losing
10–30% of traffic. A first-party endpoint on our own domain misses ~1–3%.
- Cloud Function syncSession (5th CF) behind a Hosting rewrite at /api/v1/sync.
Deliberately bland naming — uBlock has generic rules for URLs containing
track/analytics/collect/stats/hit. Plain fetch/sendBeacon, no Firebase SDK
(gstatic/firebaseio are blocklisted). No IP stored; country comes from the
edge header, OS/browser from a small UA regex, bots filtered server-side.
- Beacon in both generator head templates: enter ping on load (presence only,
no counters) + exit beacon on pagehide/visibilitychange (the real pageview).
Visitor id = localStorage UUID, session id = sessionStorage w/ 30-min idle.
- Firestore writes, one atomic set-merge per view, no reads:
stats/daily/days/{YYYY-MM-DD} public counters + maps
stats/daily/days-admin/{YYYY-MM-DD} admin's own traffic, same shape
stats/visitors/vis-ids/{vid} per-browser visits/sessions/days
stats/installed/vis-ids/{vid} distinct standalone (installed) users
stats/sessions/sess/{date}_{sid} per-session journey, TTL 2 days
stats/recent ~200-hit ring buffer
- Admin traffic goes to a PARALLEL daily collection rather than a flag inside
the main doc: the daily doc is an aggregate, so there would be nothing to
subtract. "Include my visits" adds days-admin; default shows public only.
- Firestore rules: stats/{document=**} → read if isAdmin, write never (the CF
writes via Admin SDK, bypassing rules).
ADDED — Web Stats admin page (erb-stats.html, Admin ▸ Web Stats):
- Opens on Live Stats / Total Stats choice; if nobody is on (admin excluded) it
goes straight to Total Stats. Live Stats = Currently On + Earlier Visits,
one row per session with page, time on site, pages, country/referrer,
device/browser; click a row for the full journey with per-page dwell.
- Total Stats: today/range cards, daily views chart (7/30/90/365), top pages
(resolved to book titles), referrers, devices, countries, OS, browsers,
new vs returning, installed/standalone, returning-visitor table.
- Presence = a session whose last hit is within 5 minutes. iOS gives no install
event, so "installed" counts distinct visitors ever seen in standalone mode.
ADDED — home-screen icons / manifest:
- apple-touch-icon (180), icon-192/512/32, favicon.ico, site.webmanifest in
public\ root; head block in both generator templates + erb-feast.html.
White tile, green serif ERB, gold rule, black FIRSTS. Metadata only —
nothing renders differently. Site logo unchanged.
ADDED — shared menu bundle, public/erb-menu.js:
- The 84 generated pages inline the menu via nav_html(). The other 14 pages
hand-COPIED it, so a menu change meant fourteen edits and they drifted:
erb-claude-chats.html had a dead "#" link for the Page Layout Editor, forum
topic/category/search had NO mobile menu at all, casing differed, and none
of them had a Web Stats item.
- menu_bundle_js() serialises nav_html()'s own output to a runtime bundle. There
is no second implementation to drift. Links are site-absolute so the same
file works from /, /forum/, and /tarzan/. Converted pages carry two lines:
<div id="erb-menu-mount"></div><script src="/erb-menu.js"></script>
- Converted: erb-feast, erb-tarzan/mpv/other-covers, erb-versionlog,
erb-claude-chats, erb-stats, forum index/admin/members/login/topic/
category/search. Generated pages keep the inline menu — crawlers and no-JS
clients need real markup. PLE keeps its own menu by design.
- Mobile gained a collapsed Admin ▸ section mirroring the desktop dropdown.
erb-feast's sticky header moved from an inline style attribute to page CSS.
CHANGED — version stamp scope:
- Book pages no longer carry the <!-- ERBFirsts ... --> provenance stamp.
render_book rewrites content between the PLE markers without touching the
head, so a book's stamp reported the last full regen, not the page in front
of you. The stamp now lives only on pages/{slug}, which rebuild in full on
every deploy. erb-claude-chats.html reads gen version from index.html
accordingly (it already fetched it) instead of tarzan/erb-t3.html.
- Footer: copyright year now derives from build time (build_year) — no more
hardcoded year. pages/{slug} footers also show SITE_VER; book footers do
not, for the same staleness reason as the stamp.
FIXED — renderer, centred/block images ignored margins:
- The centred branch hardcoded margin-bottom:0.5rem and ignored marginTop /
marginBottom entirely, so a centred image could not be spaced from what
followed. Now honours both, defaulting to 0.5rem when unset — matching the
inline and float branches.
FIXED — Web Stats needed a composite index:
- The daily-doc query used orderBy('__name__','desc'), which is not served by
the automatic single-field index. Replaced with an ascending __name__ range
from a cutoff date; day docs are named YYYY-MM-DD, so a string range is a
date range. No index required.
DEPLOY BAT — T21, T22, T23:
- T21: routes firebase.json / .firebaserc / firestore.rules to the project root
by EXACT filename (a blanket *.json rule would catch the service account);
firestore.rules routed → firebase deploy --only firestore; config backed up
to backups\backup-*\_config (stripped on Recover so it can't reach public\);
GEN_VER read fixed (see above).
- T22: routes the six icon/manifest files to public\ root by exact filename (a
blanket *.png would collide with the Photo Bin flow that owns
public\images\{series}\). Stale "T1-T5 scope" comments removed — the BAT has
handled all 77 books for a long time.
- T23: routes firestore.indexes.json; the firestore step widened to
`--only firestore` so rules, indexes AND TTL policies deploy together.
TTL on sess.expireAt is config now, not a console click.
GENERATOR: global-generator.py v1.05
PLE: v5.7.72
================================================================================
VERSION v5.5.27 — 2026-06-26 [Book pn-nav keeps scroll position between books]
================================================================================
CHANGED — detail-page prev/next (pn-bar) scroll retention:
- global-generator.py per-page script: clicking the pn-left / pn-right book
arrows now saves window.scrollY to sessionStorage; the destination book page
restores that Y on load (clamped to the page's max scroll if the next book is
shorter, so it lands at the end rather than in blank space). Lets you flip
through books at a fixed scroll depth (e.g. comparing dust jackets) without
re-scrolling each time. pn-bar arrows only — nav-bar, book-nav grid, and
fresh visits still land at top. Applies to desktop + mobile.
ADDED — Sync Images indicator (PLE v5.7.58):
- Top-bar "Sync Images" button driven by a live onSnapshot listener on
site/imageSync. Slow-blinks gold with a count when pending[] is non-empty
(placed images await local pull); dim when empty. Clears live the moment the
Deploy BAT pull drains pending[] — no reload. Click shows a non-destructive
reminder to run the Deploy BAT; a "✓ Images synced" toast fires on the
non-empty→empty transition.
FIXED — per-block image Upload now works (PLE v5.7.59):
- uploadImageFile rewritten to route through the uploadImage + placeBinImage
callables (Storage → Hosting, server-side) instead of calling
upload-firebasehosting.googleapis.com directly from the browser, which was
CORS-blocked ("Failed to fetch"). Picks a local file, EXIF-safe downscales,
uploads, places to /images/{folder}/ (reprint-zone aware), reads dims, and
records to imageSync.pending[] (Sync light lights). _uploadClick no longer
gates on a GIS token (dead path removed) so the file picker opens immediately.
GENERATOR: global-generator.py v0.95
PLE: v5.7.59
================================================================================
VERSION v5.5.26 — 2026-06-26 [Photo Bin mgmt — delete + EXIF-safe upload; picker UX; T19 auto-pull]
================================================================================
ADDED — Photo Bin per-photo delete:
- functions/index.js deleteBinImage: admin-gated callable. Deletes Storage
photo-bin/{file} (tolerates already-gone) and removes the matching
site/photoBin.items[] entry (read-fresh transaction filter).
- PLE Browse Photo Bin: red × button top-right of each thumbnail. Confirm
dialog, then removes Storage object + bin entry and drops the cell from the
grid (empty-state restored when last photo deleted).
FIXED — EXIF-safe image downscale (blank/sideways phone uploads):
- _downscaleFileB64 now decodes via createImageBitmap(file,
{imageOrientation:'from-image'}) so EXIF-rotated phone photos bake to
correctly-oriented pixels instead of drawing blank. Falls back to
HTMLImageElement on older engines.
- Added blank-canvas backstop: samples the drawn canvas; if flat/empty, rejects
with a clear message rather than uploading a tiny blank JPEG (was producing
~6KB blank files that passed every byte guard).
CHANGED — picker UX (v5.7.56):
- Image-block filename row: gold "Web Page" label stacked above the white
erb-{fid}.html page name (more room than the prior inline "Page:" span).
- Photo Bin thumb buttons: text "Rotate" (was glyph) and "Use" (was "Save / Use").
- Block ID row: Upload + Photo Bin buttons grouped together, spaced away from
the Block ID input.
DEPLOY — BAT T19 + pull-images rename:
- migrate-gen29-pullimages.py renamed pull-images.py (keeps erbfirsts-d5f0b id).
- DeployERBFirsts_T19.bat (from T18): auto-runs pull-images.py BEFORE the backup
step (Step 3b) so Photo-Bin-placed images are pulled local + backed up + not
wiped by the deploy. .py allowlist FINDSTR patterns (name-gate + routing)
add ^pull-images so pull-images.py routes to project root.
KNOWN-DEFERRED:
- Per-block 📁 Upload (uploadImageFile) is CORS-blocked: it calls
upload-firebasehosting.googleapis.com directly from the browser, which sends
no Access-Control-Allow-Origin for the erbfirsts.com origin. Future fix:
reroute through the uploadImage + placeBinImage callables (server-side,
CORS-clean; also records to imageSync.pending[]).
GENERATOR: global-generator.py v0.95
PLE: v5.7.57
================================================================================
VERSION v5.5.25 — 2026-06-26 [Photo Bin, image-src normalization, zone removal, renderer absolute-URL support]
================================================================================
NOTE: This is a consolidated entry. SITE_VER was bumped v5.5.18→v5.5.25 across a
single long session; per-version boundaries were not individually recorded, so
all shipped work for that range is logged here under v5.5.25.
ADDED — Photo Bin (phone/desktop image upload via Firebase Storage):
- functions/index.js uploadImage: writes uploads to Firebase STORAGE
photo-bin/{file} (NOT Hosting — Hosting deploys wipe non-local files),
makePublic, tracks each in Firestore site/photoBin. Admin-gated.
- PLE "Upload Photos" button (top bar) — multi-file picker; client downscales
each image to ≤1440px long edge, re-encodes JPEG 0.85 before upload.
- PLE "Browse Photo Bin" (image-block button) — thumbnail grid from Storage
public URLs; per-thumb Rotate (preview-only) + Save/Use buttons.
- functions/index.js placeBinImage: copies a bin image from Storage to Hosting
/images/{folder}/{destName} (folder = tarzan/mpv/other/reprints, reprint-zone
aware), deletes the Storage bin copy + its site/photoBin entry, and records
the placed path in site/imageSync.pending[] (needsPull flag).
- On place, PLE reads the placed image's natural size, sets origWidth/Height +
a capped display width (750 desktop / 330 mobile) so click-to-enlarge
auto-enables. _bustSrcs cache-busts the preview for same-filename replacements.
- Auto-name on place: {fid}_ext{N} (or {fid}_rep{N} in reprint zone); defaults to
the existing block filename when replacing an image in place; always editable.
- migrate-gen29-pullimages.py: reads site/imageSync.pending[], downloads each
placed image from Hosting into local public/, clears the flag (keeps placed
images local + deploy-safe).
- Firestore rules: site/inbox, site/photoBin, site/imageSync read:true write:admin.
- Storage rules: photo-bin/{f} read:true write:auth!=null; all else false.
- Storage bucket CORS (Cloud Shell gsutil) allows canvas pixel reads for rotate.
CHANGED — image src normalization + zone removal:
- All 77 books normalized to site-relative /images/{series}/ and
/images/reprints/ paths (562 src rewrites across 32 books) so reprint images
no longer depend on the renderer zone fallback.
- erb-renderer.js: removed the reprint "zone" tracking entirely; imgBase now
always = imgp. resolveSrc passes absolute http(s):// and leading-/ srcs
through unchanged (enables Storage URLs + clean site-relative paths).
- PLE commitEdits _normSrc(): bare image filenames normalized to
/images/{series}/ (or /images/reprints/ in reprint zone) on save.
CHANGED — renderer/PLE layout fixes (this session range):
- fillColor text blocks honor paddingTop/paddingBottom (was overwritten by
padding shorthand).
- Text + inline/float image blocks honor marginTop/marginBottom; PLE panels
gained the matching margin inputs.
- Divider outer divs get clear:both (fixes Photographs/Reprint dividers
encompassing floated images).
- MPV nav table rewritten to 4-column format (MARS 1-6 | MARS 7-11 |
PELLUCIDAR | VENUS) matching the cover page.
- Landscape-mobile d-pad in PLE for horizontal editor + panel scrolling.
- Reprint button auto-injection: generator emits RPB-D/RPB-M markers; Cloud
Function deployBook swaps the reprint button in/out on Deploy Live.
- WYSIWYG real-render is now the PLE default.
- PLE image block shows "Page: erb-{fid}.html" reminder by the filename field
(disambiguates fid vs catalog number).
GENERATOR: global-generator.py v0.95
PLE: v5.7.55
================================================================================
VERSION v5.5.17 — 2026-06-08 [Unified image render — single emit path all zones]
================================================================================
FIXED:
- erb-renderer.js: removed reprint-zone special image emit (max-height/width:auto
with no width/height attrs, border:1px, margin:3px). All image blocks now
render through the same inline/float emit regardless of zone. Block-level
width/height/displayMode/inlineAlign/float/aspect controls drive output
consistently. Resolves T20-style spine height drift between PLE schematic,
WYSIWYG, and live deploy.
- erb-renderer.js: removed reprint-zone special text emit (<p class="reprint-text">
that ignored every text-panel property). All text blocks render through the
unified text emit honoring font/size/color/align/margins/padding/box-width.
- erb-renderer.js: zone-aware fallback added for legacy bare-filename images —
imgBase = (zone === "reprint") ? "../images/reprints" : imgp. Preserves
backward compat for 184 existing reprint-thumbnail srcs across T1–T27 until
site-relative migration (Chunk B) runs.
- global-generator.py: deleted .reprint-text CSS rule (now orphaned).
- Reprint-zone text blocks in ~6-7 books will need manual per-block fontSize/
textColor settings to approximate the previous small/light/spaced look.
GENERATOR: global-generator.py v0.76
PLE: v5.7.13 (unchanged from v5.5.16)
--
================================================================================
VERSION v5.5.16 — 2026-06-08 [Site-relative image URL support — Chunk A]
================================================================================
FIXED:
- erb-renderer.js: resolveSrc(src, base) helper. If src starts with '/' return
as-is (site-relative); else prepend base (legacy bare filename). Applied to
8 img-emit sites across inline/float/center/fallback branches plus the
reprint-zone emit. Block srcs can now carry full paths independent of
position — "/images/tarzan/foo.jpg" renders correctly whether the block
sits in Photographs or Reprint section.
- erb-layout-editor.html: _resolveImgUrl(src, fallbackBase) helper. Handles
http(s):// (absolute), '/' (site-relative — prepends origin), and bare
filename (prepends fallback). Applied to image preview panel, _loadOrigDims,
resetImgRatio, and loadDims (createFromLive). PLE v5.7.13.
- global-generator.py: resolve_img_src(src, fallback_base) helper. Same logic
in Python. Applied to book header cover/dj img emit. Added SITE_URL constant
("https://www.erbfirsts.com") for future external-facing emit (OG tags,
RSS, sitemap, email).
- 100% backwards compatible — all existing bare-filename srcs continue to
resolve correctly. Migration of stored srcs to site-relative form deferred
to Chunk B.
GENERATOR: global-generator.py v0.75
PLE: v5.7.13
--
================================================================================
VERSION v5.5.15 — 2026-06-08 [Mobile cover/DJ toggle fix + UX polish]
================================================================================
FIXED:
- global-generator.py CSS: wrapped .book-cover-wrap:hover rules in
@media (hover: hover) so touch devices use only the .show-dj class toggle.
Previously sticky :hover on touch fought against the class-toggle JS,
blocking the cover ↔ DJ ↔ cover cycle. Tap now toggles cleanly on mobile.
- global-generator.py: SITE_URL = "https://www.erbfirsts.com" constant added
near GEN_VER/SITE_VER for future site-relative-aware external emit.
- PLE v5.7.6: text panel UI redesign. New "Text Display Options" green-header
section above textarea. Row 1: Font Type + Style (I/B) + Text Color. Row 2:
Font Size + Text Align. Box Movement section reordered: Box Width + margins
first (under green header), Fill Color second.
- PLE v5.7.7: "Reset to Original / Max Size" button highlights gold when
current width is not at max size (clicking would change something).
- PLE v5.7.8: Reset-button highlight refined — missing height/origHeight on
legacy blocks correctly triggers highlight (T17 ES1 case).
- PLE v5.7.9–v5.7.12: Deploy status messages iterated to single status area
showing book title. "Deploying <Title>..." → "✓ <Title> deploy complete
(XKB)" → on error "⚠ <Title> deploy error: <brief msg>". Removed
duplicate general-status-bar message and separate error banner.
GENERATOR: global-generator.py v0.74
PLE: v5.7.5 → v5.7.12
--
================================================================================
VERSION v5.5.0 — 2026-05-27 [Architecture 3+Cloud — single canonical deploy path]
================================================================================
FIXED:
- PLE v5.2.2 → v5.5.0: deployBook() reduced from 117 lines to 23 lines, calls
Cloud Function via httpsCallable. Removed _injectSections regex (legacy
section/h2/pricing-section pattern). Removed Google Login (auth deferred
to upload click). Added Copy to Mobile / Copy to Desktop per-block buttons
(replaces broken "add to both" feature). CORS uses window.location.origin.
- PLE v5.5.0: unified version display. Removed bottom-right ver-badge. Top-left
topbar-ver enlarged 10px → 13px, brightened var(--text-faint) → #e8e8e8,
weight 500. Single version display location going forward.
- Cloud Function deployBook deployed (us-west1, Node 22, 540s timeout). Loads
erb-renderer.js via Node VM sandbox, renders blocks_desktop + blocks_mobile,
marker-based injection between PLE-CONTENT-START/END, uploads via Firebase
Hosting REST API (versions:clone LRO + populateFiles + finalize + release).
Auth: Firebase callable + admin role check from Firestore users/{uid}.role.
- BAT T15 → T16: erb-renderer.js routes to public/ only (single source of truth
for the renderer at project level). Existence check looks in public/.
- global-generator.py: RENDERER_JS = SCRIPT_DIR / "public" / "erb-renderer.js"
(was project root). Generator subprocess: node public/erb-renderer.js.
- T2 mobile FEI Row Divider verified working. T3 desktop FEI text added
(mobile blocks still missing — pending Copy to Mobile pass).
- Version unification: site_ver = PLE_ver = single version going forward.
Future bumps to either component bump the unified version.
GENERATOR: global-generator.py v0.62 (unchanged)
PLE: v5.5.0
CLOUD FUNCTION: deployBook v1.0
--
================================================================================
VERSION v5.4.0 — 2026-05-13 [PLE v5.2.0–v5.2.2 — renderer unification preparation]
================================================================================
FIXED:
- PLE v5.2.0: removed _jsRenderAll (~258 lines, legacy duplicate renderer).
Wired window.ErbRenderer via <script src="erb-renderer.js"> import.
deployBook now uses window.ErbRenderer.renderBlocks() — eliminates drift
between PLE preview and deployed page output.
- PLE v5.2.0: removed Google Login topbar button (auth deferred to upload
click via _uploadClick). Removed _promptAddTarget and _addBlockToOtherMode
(broken "add to both" feature).
- PLE v5.2.1: CORS origin fix — hardcoded "https://erbfirsts.com" replaced
with window.location.origin (4 sites). Read blocks_desktop instead of
legacy blocks field in deployBook. Copy/Delete buttons relocated to top
of divider/feast editor.
- erb-renderer.js: canonical single-source JS renderer. Used by browser PLE
(<script src>) and Node CLI generator subprocess. Same renderBlocks API
in both contexts → byte-identical output. Lives at public/erb-renderer.js.
- Architecture 3 finalization: Firestore as single source of truth. T1-T5
fully migrated. T6-T77 remain on frozen gen29 output (not blocking).
GENERATOR: global-generator.py v0.62
PLE: v5.2.0–v5.2.1
--
================================================================================
VERSION v5.0.0 — 2026-05-07 [PLE slim conversion v4.36.10 → v5.1.1 — major cleanup]
================================================================================
FIXED:
- PLE v5.0.0: slim conversion. Surgical removal of dead code (SEEDS,
reinitFromSeed, fallback branches). File size 11,871 → 4,824 lines
(59.4% reduction). Architecture 3 means Firestore is source of truth,
no need for hardcoded SEEDS in PLE. Approach: convert in place, not rewrite.
- PLE v5.1.0: schema migration. PLE reads/writes blocks_desktop instead of
legacy "blocks" field. Replaces layout_modified/layout_timestamp flags
with ple_dirty:true. Parser writes blocks_desktop on save.
- PLE v5.1.1: mode-switch bug fix — desktop mode was still reading legacy
"blocks" field. Fixed: _layoutMode==='mobile'?(d.blocks_mobile||[])
:(d.blocks_desktop||[]).
- T1/T2 Firestore migration via repair-t1-t2-blocks-desktop.py: 45 blocks
copied for T1, 33 blocks for T2 from legacy "blocks" array into
blocks_desktop. Schema upgrade preserves all PLE work.
- All 5 in-scope books (T1-T5) have blocks_desktop populated and ple_dirty
set after Cloud Function deploys.
- Architecture 3: Firestore "books/{fid}" docs contain title, publisher,
image filenames, blocks_desktop, blocks_mobile, feast data — everything.
Generator reads from Firestore, calls Node renderer subprocess. No more
dual maintenance between dicts and Firestore.
GENERATOR: global-generator.py v0.62 (replaced rebuild_generator29.py)
PLE: v5.0.0–v5.1.1
--
================================================================================
VERSION v0.97 — 2026-04-22 [rebuild_generator29.py — Row Divider + unified renderer]
================================================================================
FIXED:
- PLE v4.30–v4.30.5: Row Divider block fully implemented. Invisible mode forces
new row of inline images (clear:both). Visible mode renders SVG line/shape
with 7 styles (solid, dashed, dotted, pointed-filled, pointed-outline,
round-filled, round-outline). Text Header option: text, font, size, color,
italic, align. Reprint Anchor toggle outputs jump target.
- PLE v4.30–v4.30.5: _jsRenderAll() — unified renderer replaces _jsRenderIdent,
_jsRenderPhotos, _jsRenderReprints. Single pass handles ident, photos, and
reprint zones with all block types and Row Divider features throughout.
- PLE v4.30–v4.30.5: _injectSections() simplified to single-pattern injection —
replaces ident, photos, and reprint injections with one unified block.
- PLE v4.30.5: caption italic toggle — [Italic] button on all image blocks.
captionItalic field added to image block data model.
- ERBfirstsSyncFirebase.ps1: updated to single $pleRx pattern replacing three
legacy separate patterns ($identRx, $photosRx, $reprintRx removed).
- Generator v0.58: SEEDS updated for all 77 books with Row Divider block fields.
GENERATOR: rebuild_generator29.py
--
================================================================================
VERSION v0.96d — 2026-04-21 [rebuild_generator28.py — block type unification]
================================================================================
FIXED:
- PLE v4.27–v4.28: Block type simplification — 11 types reduced to 5 (text,
image, divider, reprint, feast). image block gains subtype: null=float/
inline, spine, full, dj. Legacy types (label_image, photo, dj,
reprint_group, reprint_image, reprint_spacer) auto-migrate on loadBook().
- PLE v4.27: Row Divider panel initial build — Invisible / Visible toggle,
Reprint Anchor, height/color/style fields added to block data model.
- PLE v4.28–v4.29.4: Row Divider panel redesign — 16-color swatches, font
selector, italic toggle, align buttons (L/C/R), height threshold for text.
- Generator v0.57: All 77 book SEEDS updated to new unified block types.
- Generator v0.57: "Log Out" corrected to "Sign Out" in mobile nav.
GENERATOR: rebuild_generator28.py
--
================================================================================
VERSION v0.96c — 2026-04-19 [Layout Editor v4.20–v4.26 — no generator]
================================================================================
FIXED:
- PLE v4.20–v4.21: setFloat() and setTextPlacement() sync linkedTextSide when
image has a linked text block.
- PLE v4.22–v4.24: Mobile layout support — separate blocks_mobile array, Save
Mobile Layout / Clear Mobile Layout / Copy Desktop to Mobile buttons.
setDisplayMode() and _reloadBlocksForMode() for desktop/mobile toggle.
- PLE v4.25: Display mode controls — inline vs float selector on image blocks.
Position lock (positionLocked) prevents block from being moved in preview.
- PLE v4.26: Inline align (left/center/right) and inline vAlign (top/middle/
bottom) controls for inline image blocks. setInlineAlign, setInlineVAlign.
--
================================================================================
VERSION v0.96b — 2026-04-17 [Layout Editor v4.15–v4.19 — no generator]
================================================================================
FIXED:
- PLE v4.15: Text mode / Graphics mode topbar toggle. Text mode: text blocks
get left/right edge drag handles for width + up/down/left/right arrows.
Graphics mode: image/photo/dj/divider blocks get arrows. Off-mode dims.
- PLE v4.16: Ratio lock defaults corrected for all graphic block subtypes.
label_image blocks included in graphics mode interactions.
- PLE v4.17–v4.18: Preview refinements — pvGetDropIdx fixed for inline reprint
blocks using horizontal position rather than vertical midpoint.
- PLE v4.19: toggleImgFloat exposed to window scope. pvMoveBlock moves linked
image+text pair as a unit when adjacent.
--
================================================================================
VERSION v0.96a — 2026-04-15 [Layout Editor v4.6–v4.14 — no generator]
================================================================================
FIXED:
- PLE v4.6: Linked blocks — image block can link to a text block. Linked text
flows alongside the image using CSS float. unlinkBlocks to break link.
convertToImage() migrates label_image legacy type.
- PLE v4.7: Text formatting controls — Font Size, Text Align, Text Box Align
button groups. Clear Float / Add Float buttons.
- PLE v4.8–v4.11: Three-panel layout (block list / properties / preview).
Undo/redo. Link repair (_repairLinks). Preview drag-to-reorder and
drag-to-float. Corner/edge resize handles on image blocks.
- PLE v4.12: Float section with integrated px spinners, drag-to-float in
preview, preview overflow-x:auto.
- PLE v4.13: Reinitialize from Seed button. 77-book SEEDS injected into editor
by generator covering all block types with correct linked field values.
- PLE v4.14: select dropdown commit fix, window.unlinkBlocks exposed,
Remove Text Box styled as button.
--
================================================================================
VERSION v0.96 — 2026-04-15 [rebuild_pass26.py — mobile auth Sign In/Sign Out fix]
================================================================================
RESULTS FROM v0.95:
- Firestore block rendering working correctly on generated pages.
- Forum index deployed with working search, online counts, title bar.
FIXED:
- Item 1: Mobile hamburger menu now shows "Sign In" (not logged in),
"Sign Out" (member), "Admin" + "Sign Out" (admin). Fixed double-brace
bug in auth_script_html() that produced invalid JS on all generated
pages. Fixed text on all 11 static/forum pages. Removed duplicate
mob_admin block from static pages.
- Item 2: Forum index magnifying glass 🔍 now far-right on Total members
line. Moved button outside inner div to be direct flex child of
forum-online-bar (justify-content:space-between).
- Item 3: Forum index mobile title bar: "Sign In" button right-aligned on
same line as "ERBfirsts Forum". JS updates to "Sign Out" when logged in.
- Item 6: Layout Editor v4.4 → v4.5. Save button is now gray when clean,
gold when dirty (unsaved changes). dirty class added/removed at
markDirty(), saveBook() success, loadBook(), and _reloadBlocksForMode().
- Item 7: Version log updated. Entries added for pass24, pass25, pass26.
GENERATOR: rebuild_pass26.py
--
================================================================================
VERSION v0.95b — 2026-04-14 [rebuild_pass25.py — static page auth updates]
================================================================================
RESULTS FROM v0.95:
- Firestore block rendering working on generated pages.
FIXED:
- All 11 static/forum pages updated with mobile hamburger menu Admin and
Log Out auth logic (sessionStorage-cached role check).
- Forum index deployed with corrected layout and auth.
GENERATOR: rebuild_pass25.py
--
================================================================================
VERSION v0.95a — 2026-04-13 [rebuild_pass24.py — hamburger on static pages]
================================================================================
RESULTS FROM v0.94:
- Auth/login working correctly on generated book pages.
FIXED:
- Mobile hamburger menu added to all static and forum pages
(erb-dj, erb-feast, erb-signatures, erb-sell, erb-erblinks, erb-misc,
erb-inscription, forum-index, forum-members, forum-admin, forum-login).
- Mobile menu positioned outside erb-header (position:fixed) per
architecture requirement.
GENERATOR: rebuild_pass24.py
--
================================================================================
VERSION v0.95 — 2026-04-13 [rebuild_pass23.py — Firestore block rendering]
================================================================================
RESULTS FROM v0.94:
- All auth/login fixes working: Google sign-in completes, redirects to
originating page, nav switches to Admin after login.
FIXED:
- Generator now reads block layout data from Firestore books/{bookId} at
build time. Books with saved editor data render identifier and photos
sections from Firestore blocks. All other books fall back to hardcoded
data unchanged. Phase 1: text, image, label_image, photo, dj block types.
- Layout Editor v2.6: added Copy Blocks button (copies blocks JSON to
clipboard for debugging and data inspection).
- Firestore rules: books collection read access changed to public (allows
generator to fetch without credentials).
GENERATOR: rebuild_pass23.py
--
================================================================================
VERSION v0.94 — 2026-04-12 [rebuild_pass23.py — auth domain + returnUrl nav fix]
================================================================================
RESULTS FROM v0.93:
- Google sign-in redirect not completing: getRedirectResult returning null
due to cross-origin storage issue between erbfirsts.com and
erbfirsts-d5f0b.firebaseapp.com. Auth session never established after
Google redirect, onAuthStateChanged fired with null user. Nav stayed on
My Account instead of switching to Admin.
- Generated pages missing returnUrl onclick on My Account nav link, so
returnUrl always defaulted to https://erbfirsts.com regardless of
originating page.
- DeployERBFirsts BAT closing on Step 2 when filename had Windows duplicate
suffix e.g. (4) — parentheses in filename broke cmd pipe parsing.
FIXED:
- authDomain changed from erbfirsts-d5f0b.firebaseapp.com to erbfirsts.com
on all pages (15 static/forum + all 80 generated). Auth redirect now
stays on erbfirsts.com domain via Firebase Hosting /__/auth/handler,
resolving cross-origin storage issue. Sign-in completes correctly,
Admin nav updates after login.
- returnUrl onclick added to nav-account-link on all generated pages
(cover pages + detail pages) in nav_html(). returnUrl now correctly
encodes originating page URL.
- DeployERBFirsts v22: strip (N) duplicate suffix and -vX.Y version suffix
moved to top of ROUTEFILE before any echo/pipe commands.
- erb-forum-login.html footer changed from forum category links to
standard site footer (Home / Tarzan / MPV / Other)
GENERATOR: rebuild_pass23.py
--
================================================================================
VERSION v0.93 — 2026-04-12 [rebuild_pass22.py — nav layout editor link]
================================================================================
RESULTS FROM v0.92:
- Page Layout Editor nav link had href="#" (placeholder) on all pages
FIXED:
- nav_html() updated: Page Layout Editor now links to erb-layout-editor.html
target="_blank" on all generator-produced pages (covers + detail pages)
- Full regeneration of all 80 cover/detail pages
================================================================================
================================================================================
================================================================================
VERSION v0.92 — 2026-04-11 [erb-rebuild_pass22.py — generator renamed]
================================================================================
FIXED:
- Generator renamed to erb-rebuild_pass22.py so BAT can accept it as a
single file deploy or in a zip. BAT strips erb- prefix when saving to
project root. All unnecessary BAT complexity reverted.
================================================================================
================================================================================
VERSION v0.91 — 2026-04-11 [rebuild_pass22.py — auto-run verification on expand]
================================================================================
FIXED:
- erb-claude-chats.html: clicking New Chat Verification auto-runs check
immediately on expand — no separate Run button needed
================================================================================
================================================================================
VERSION v0.90 — 2026-04-11 [rebuild_pass22.py — embed verification in Claude Chats]
================================================================================
FIXED:
- erb-claude-chats.html: New Chat Verification now expands inline on same
page (like Chat Registry) instead of linking to separate erb-verify.html
- erb-verify.html kept for direct URL access but no longer in nav
================================================================================
================================================================================
VERSION v0.89 — 2026-04-11 [rebuild_pass22.py — session persistence fix]
================================================================================
FIXED:
- erb-forum-login.html: set browserSessionPersistence so login session clears
when browser tab/window is closed — prevents next user seeing prior
user's account and posting under their identity
================================================================================
================================================================================
VERSION v0.88 — 2026-04-11 [rebuild_pass22.py — nav visibility + returnUrl]
================================================================================
FIXED:
- erb-forum-index.html: sessionStorage script wrapped in DOMContentLoaded
so nav-last-item visibility is set correctly after element exists in DOM
- erb-forum-login.html: after login redirects to returnUrl parameter if
present, otherwise falls back to forum index
- All pages: My Account link passes current page URL as returnUrl so user
returns to originating page after login
================================================================================
================================================================================
VERSION v0.87 — 2026-04-11 [rebuild_pass22.py — fix login redirect]
================================================================================
FIXED:
- erb-forum-login.html: after Google login, redirect now uses absolute URL
https://erbfirsts.com/forum/erb-forum-index.html instead of relative URL
which was keeping users on erbfirsts-d5f0b.web.app (old cached version)
================================================================================
================================================================================
VERSION v0.86 — 2026-04-11 [rebuild_pass22.py — Claude Chats page redesign]
================================================================================
FIXED:
- erb-claude-chats.html: two stacked buttons (Chat Registry, New Chat
Verification) each with blurb to the right; Chat Registry expands to
show table with Add Chat button below
================================================================================
================================================================================
VERSION v0.85 — 2026-04-11 [rebuild_pass22.py — nav cleanup]
================================================================================
FIXED:
- All pages: Removed "New Chat Verification" from Admin dropdown — it's now
accessible via the Claude Chats page only
- Admin dropdown order: FORUM, WEB label, Claude Chats, Page Layout Editor,
Version Log, My Account
================================================================================
================================================================================
VERSION v0.84 — 2026-04-11 [rebuild_pass22.py — Claude Chats page]
================================================================================
FIXED:
- erb-claude-chats.html: new standalone page with Chat Registry (compat SDK,
no db.collection error) and New Chat Verification button
- Admin nav: "Claude Chats" added to Web submenu on all pages
- erb-forum-admin.html: Site Verification and Chat Registry sections removed
================================================================================
================================================================================
VERSION v0.83 — 2026-04-11 [rebuild_pass22.py — Chat Registry]
================================================================================
FIXED:
- erb-forum-admin.html: Chat Registry section added (section 8) — track
Claude chat sessions by name and conversation ID with add/edit/delete/
reorder. Stored in Firestore site/chats document.
- Rule 11 updated: new chat detection, verification, chat registration flow
================================================================================
================================================================================
VERSION v0.82 — 2026-04-10 [rebuild_pass22.py — fix EXPECTED variable name]
================================================================================
FIXED:
- erb-verify.html: column header rename had incorrectly renamed JS variable
EXPECTED to "FIREBASE VALUE" (with space) — invalid identifier, crashed
script silently. Restored JS variable to EXPECTED; HTML header stays
"Firebase Value"
================================================================================
================================================================================
VERSION v0.81 — 2026-04-10 [rebuild_pass22.py — verify fix + BAT Firestore update]
================================================================================
FIXED:
- erb-verify.html: fixed snap.exists() -> snap.exists (compat SDK property,
not function) — was crashing script silently on load, causing button to
do nothing
- DeployERBFirsts_17.bat: now automatically updates Firestore site/verification
document after every successful deploy via REST API
================================================================================
================================================================================
VERSION v0.80 — 2026-04-10 [rebuild_pass22.py — fix Admin blink on Forum Index]
================================================================================
FIXED:
- erb-forum-index.html: removed duplicate nav-last-item visibility line from
onAuthStateChanged callback — was causing Admin to blink on page load
================================================================================
================================================================================
VERSION v0.79 — 2026-04-10 [rebuild_pass22.py — verify compat + Forum dropdown]
================================================================================
FIXED:
- erb-verify.html: converted to Firebase compat SDK (no type=module) so
Run Verification button works correctly
- All pages: Forum nav item now shows arrow and hover dropdown (Forum Index,
Members) matching all other nav items
- Forum pages: removed onclick="return false;" so Forum dropdown works on hover
================================================================================
================================================================================
VERSION v0.78 — 2026-04-10 [rebuild_pass22.py — verify UI fixes]
================================================================================
FIXED:
- erb-verify.html + erb-forum-admin.html: column headers renamed —
"Current Value" -> "Live Site Count", "Expected" -> "Firebase Value"
- Both files: version regex fixed to match text-muted span correctly
================================================================================
================================================================================
VERSION v0.77 — 2026-04-10 [rebuild_pass22.py — fix onclick in module scripts]
================================================================================
FIXED:
- erb-verify.html: exposed runVerification to window scope so onclick works
with type="module" script
- erb-forum-admin.html: exposed runVerification and saveVerificationToFirestore
to window scope for same reason
================================================================================
================================================================================
VERSION v0.76 — 2026-04-10 [rebuild_pass22.py — Firestore verification]
================================================================================
FIXED:
- erb-verify.html: now reads expected values from Firestore site/verification
document; falls back to hardcoded defaults if unavailable; fixed version
regex that was returning "not found"
- erb-forum-admin.html: Verification section now has "Save as New Expected
Values" button that writes current values to Firestore so erb-verify.html
always compares against the latest deployed state
================================================================================
================================================================================
VERSION v0.75 — 2026-04-10 [rebuild_pass22.py — nav closing div fix]
================================================================================
FIXED:
- All static pages: missing closing </div> tags after </nav> causing page
content to render inside header. Affected all 10 static pages.
================================================================================
================================================================================
VERSION v0.74 — 2026-04-09 [rebuild_pass22.py — Admin nav flat list]
================================================================================
FIXED:
- All pages: Admin dropdown now flat list — FORUM (clickable), WEB label
(non-clickable), New Chat Verification / Page Layout Editor / Version Log
(indented), My Account at bottom
- Applied to all static, forum, generated pages
================================================================================
================================================================================
VERSION v0.73 — 2026-04-09 [rebuild_pass22.py — Admin nav restructure + Verification page]
================================================================================
FIXED:
- All pages: Admin dropdown restructured — Web submenu (Version Log,
New Chat Verification, Page Layout Editor) + Forum submenu (Forum Admin)
- erb-verify.html: new standalone verification page with Run button showing
version #, generator, CSS lines, index.html lines, page counts by series
- Submenu CSS added to erb-style.css
- All static pages, forum pages, and generated pages nav updated
================================================================================
================================================================================
VERSION v0.72 — 2026-04-09 [rebuild_pass22.py — Admin Verification tab]
================================================================================
FIXED:
- erb-forum-admin.html: Verification section added — click Run Verification
to check version #, generator, CSS lines, index.html lines, page counts
by series. Compare against Claude's start-of-chat verification report.
================================================================================
================================================================================
VERSION v0.71 — 2026-04-08 [rebuild_pass22.py — o28 float fix]
================================================================================
FIXED:
- erb-o28.html: removed display:flex from float outer div (was overriding float)
Images now 550px height, no clear:both — text flows left of float correctly
================================================================================
================================================================================
VERSION v0.70 — 2026-04-08 [rebuild_pass22.py — o28 final layout fix]
================================================================================
FIXED:
- erb-o28.html: o28-custom moved to first ident_paras item so all 3 text
paragraphs flow LEFT alongside right-floated images
- erb-o28.html: both images now height:400px;width:auto — same height
================================================================================
================================================================================
VERSION v0.69 — 2026-04-08 [rebuild_pass22.py — o28 layout fix]
================================================================================
FIXED:
- erb-o28.html: images (o20_ext + o20_ext1) side by side in flex row at top
of right float column (50% width); ERBville text paragraph below images
inside same float column; left text flows alongside
================================================================================
================================================================================
VERSION v0.68 — 2026-04-08 [rebuild_pass22.py — o19/o28 fixes]
================================================================================
FIXED:
- erb-o19.html: dj_cap now renders correctly in photos section
- erb-o28.html: o20_ext + o20_ext1 float right at 50% width alongside
ERBville text paragraph; fixed from grid layout that wasn't working
================================================================================
================================================================================
VERSION v0.67 — 2026-04-08 [rebuild_pass22.py — o19/o23/o26 fixes]
================================================================================
FIXED:
- erb-o19.html: dj_cap added — Fine laminated jacket
- erb-o23.html: "Above book is the Trade Version." caption now centered
- erb-o26.html: 4-paragraph text, o21_ext.jpg at 50% width floated right
with centered caption "Above is the 1966 House of Greystoke edition."
================================================================================
================================================================================
VERSION v0.92 — 2026-04-11 [erb-rebuild_pass22.py — generator renamed]
================================================================================
FIXED:
- Generator renamed to erb-rebuild_pass22.py so BAT can accept it as a
single file deploy or in a zip. BAT strips erb- prefix when saving to
project root. All unnecessary BAT complexity reverted.
================================================================================
================================================================================
VERSION v0.91 — 2026-04-11 [rebuild_pass22.py — auto-run verification on expand]
================================================================================
FIXED:
- erb-claude-chats.html: clicking New Chat Verification auto-runs check
immediately on expand — no separate Run button needed
================================================================================
================================================================================
VERSION v0.90 — 2026-04-11 [rebuild_pass22.py — embed verification in Claude Chats]
================================================================================
FIXED:
- erb-claude-chats.html: New Chat Verification now expands inline on same
page (like Chat Registry) instead of linking to separate erb-verify.html
- erb-verify.html kept for direct URL access but no longer in nav
================================================================================
================================================================================
VERSION v0.89 — 2026-04-11 [rebuild_pass22.py — session persistence fix]
================================================================================
FIXED:
- erb-forum-login.html: set browserSessionPersistence so login session clears
when browser tab/window is closed — prevents next user seeing prior
user's account and posting under their identity
================================================================================
================================================================================
VERSION v0.88 — 2026-04-11 [rebuild_pass22.py — nav visibility + returnUrl]
================================================================================
FIXED:
- erb-forum-index.html: sessionStorage script wrapped in DOMContentLoaded
so nav-last-item visibility is set correctly after element exists in DOM
- erb-forum-login.html: after login redirects to returnUrl parameter if
present, otherwise falls back to forum index
- All pages: My Account link passes current page URL as returnUrl so user
returns to originating page after login
================================================================================
================================================================================
VERSION v0.87 — 2026-04-11 [rebuild_pass22.py — fix login redirect]
================================================================================
FIXED:
- erb-forum-login.html: after Google login, redirect now uses absolute URL
https://erbfirsts.com/forum/erb-forum-index.html instead of relative URL
which was keeping users on erbfirsts-d5f0b.web.app (old cached version)
================================================================================
================================================================================
VERSION v0.86 — 2026-04-11 [rebuild_pass22.py — Claude Chats page redesign]
================================================================================
FIXED:
- erb-claude-chats.html: two stacked buttons (Chat Registry, New Chat
Verification) each with blurb to the right; Chat Registry expands to
show table with Add Chat button below
================================================================================
================================================================================
VERSION v0.85 — 2026-04-11 [rebuild_pass22.py — nav cleanup]
================================================================================
FIXED:
- All pages: Removed "New Chat Verification" from Admin dropdown — it's now
accessible via the Claude Chats page only
- Admin dropdown order: FORUM, WEB label, Claude Chats, Page Layout Editor,
Version Log, My Account
================================================================================
================================================================================
VERSION v0.84 — 2026-04-11 [rebuild_pass22.py — Claude Chats page]
================================================================================
FIXED:
- erb-claude-chats.html: new standalone page with Chat Registry (compat SDK,
no db.collection error) and New Chat Verification button
- Admin nav: "Claude Chats" added to Web submenu on all pages
- erb-forum-admin.html: Site Verification and Chat Registry sections removed
================================================================================
================================================================================
VERSION v0.83 — 2026-04-11 [rebuild_pass22.py — Chat Registry]
================================================================================
FIXED:
- erb-forum-admin.html: Chat Registry section added (section 8) — track
Claude chat sessions by name and conversation ID with add/edit/delete/
reorder. Stored in Firestore site/chats document.
- Rule 11 updated: new chat detection, verification, chat registration flow
================================================================================
================================================================================
VERSION v0.82 — 2026-04-10 [rebuild_pass22.py — fix EXPECTED variable name]
================================================================================
FIXED:
- erb-verify.html: column header rename had incorrectly renamed JS variable
EXPECTED to "FIREBASE VALUE" (with space) — invalid identifier, crashed
script silently. Restored JS variable to EXPECTED; HTML header stays
"Firebase Value"
================================================================================
================================================================================
VERSION v0.81 — 2026-04-10 [rebuild_pass22.py — verify fix + BAT Firestore update]
================================================================================
FIXED:
- erb-verify.html: fixed snap.exists() -> snap.exists (compat SDK property,
not function) — was crashing script silently on load, causing button to
do nothing
- DeployERBFirsts_17.bat: now automatically updates Firestore site/verification
document after every successful deploy via REST API
================================================================================
================================================================================
VERSION v0.80 — 2026-04-10 [rebuild_pass22.py — fix Admin blink on Forum Index]
================================================================================
FIXED:
- erb-forum-index.html: removed duplicate nav-last-item visibility line from
onAuthStateChanged callback — was causing Admin to blink on page load
================================================================================
================================================================================
VERSION v0.79 — 2026-04-10 [rebuild_pass22.py — verify compat + Forum dropdown]
================================================================================
FIXED:
- erb-verify.html: converted to Firebase compat SDK (no type=module) so
Run Verification button works correctly
- All pages: Forum nav item now shows arrow and hover dropdown (Forum Index,
Members) matching all other nav items
- Forum pages: removed onclick="return false;" so Forum dropdown works on hover
================================================================================
================================================================================
VERSION v0.78 — 2026-04-10 [rebuild_pass22.py — verify UI fixes]
================================================================================
FIXED:
- erb-verify.html + erb-forum-admin.html: column headers renamed —
"Current Value" -> "Live Site Count", "Expected" -> "Firebase Value"
- Both files: version regex fixed to match text-muted span correctly
================================================================================
================================================================================
VERSION v0.77 — 2026-04-10 [rebuild_pass22.py — fix onclick in module scripts]
================================================================================
FIXED:
- erb-verify.html: exposed runVerification to window scope so onclick works
with type="module" script
- erb-forum-admin.html: exposed runVerification and saveVerificationToFirestore
to window scope for same reason
================================================================================
================================================================================
VERSION v0.76 — 2026-04-10 [rebuild_pass22.py — Firestore verification]
================================================================================
FIXED:
- erb-verify.html: now reads expected values from Firestore site/verification
document; falls back to hardcoded defaults if unavailable; fixed version
regex that was returning "not found"
- erb-forum-admin.html: Verification section now has "Save as New Expected
Values" button that writes current values to Firestore so erb-verify.html
always compares against the latest deployed state
================================================================================
================================================================================
VERSION v0.75 — 2026-04-10 [rebuild_pass22.py — nav closing div fix]
================================================================================
FIXED:
- All static pages: missing closing </div> tags after </nav> causing page
content to render inside header. Affected all 10 static pages.
================================================================================
================================================================================
VERSION v0.74 — 2026-04-09 [rebuild_pass22.py — Admin nav flat list]
================================================================================
FIXED:
- All pages: Admin dropdown now flat list — FORUM (clickable), WEB label
(non-clickable), New Chat Verification / Page Layout Editor / Version Log
(indented), My Account at bottom
- Applied to all static, forum, generated pages
================================================================================
================================================================================
VERSION v0.73 — 2026-04-09 [rebuild_pass22.py — Admin nav restructure + Verification page]
================================================================================
FIXED:
- All pages: Admin dropdown restructured — Web submenu (Version Log,
New Chat Verification, Page Layout Editor) + Forum submenu (Forum Admin)
- erb-verify.html: new standalone verification page with Run button showing
version #, generator, CSS lines, index.html lines, page counts by series
- Submenu CSS added to erb-style.css
- All static pages, forum pages, and generated pages nav updated
================================================================================
================================================================================
VERSION v0.72 — 2026-04-09 [rebuild_pass22.py — Admin Verification tab]
================================================================================
FIXED:
- erb-forum-admin.html: Verification section added — click Run Verification
to check version #, generator, CSS lines, index.html lines, page counts
by series. Compare against Claude's start-of-chat verification report.
================================================================================
================================================================================
VERSION v0.71 — 2026-04-08 [rebuild_pass22.py — o28 float fix]
================================================================================
FIXED:
- erb-o28.html: removed display:flex from float outer div (was overriding float)
Images now 550px height, no clear:both — text flows left of float correctly
================================================================================
================================================================================
VERSION v0.70 — 2026-04-08 [rebuild_pass22.py — o28 final layout fix]
================================================================================
FIXED:
- erb-o28.html: o28-custom moved to first ident_paras item so all 3 text
paragraphs flow LEFT alongside right-floated images
- erb-o28.html: both images now height:400px;width:auto — same height
================================================================================
================================================================================
VERSION v0.69 — 2026-04-08 [rebuild_pass22.py — o28 layout fix]
================================================================================
FIXED:
- erb-o28.html: images (o20_ext + o20_ext1) side by side in flex row at top
of right float column (50% width); ERBville text paragraph below images
inside same float column; left text flows alongside
================================================================================
================================================================================
VERSION v0.68 — 2026-04-08 [rebuild_pass22.py — o19/o28 fixes]
================================================================================
FIXED:
- erb-o19.html: dj_cap now renders correctly in photos section
- erb-o28.html: o20_ext + o20_ext1 float right at 50% width alongside
ERBville text paragraph; fixed from grid layout that wasn't working
================================================================================
================================================================================
VERSION v0.67 — 2026-04-08 [rebuild_pass22.py — o23/o27/o28 fixes]
================================================================================
FIXED:
- erb-o23.html: "Slip case" caption now shows below o22b.jpg; Trade Version
caption centered under right group
- erb-o27.html: full identifier text with all 11 story titles + illustrator
- erb-o28.html: two-col layout — text LEFT, o20_ext+o20_ext1 RIGHT at ~50%
ERBville blurb in text column; two-col-imgs caption support added
================================================================================
================================================================================
VERSION v0.66 — 2026-04-08 [rebuild_pass22.py — o18/o19/o20 fixes]
================================================================================
FIXED:
- erb-o18.html: images now stacked vertically (o26_ext2 top, o26_ext below)
- erb-o19.html: identifier text updated — 22 headpieces, laminated/unlaminated DJ
- erb-o20.html: 4-paragraph text, o18_ext.jpg floated right at 33% width
================================================================================
================================================================================
VERSION v0.65 — 2026-04-08 [rebuild_pass22.py — o16/o18 fixes]
================================================================================
FIXED:
- erb-o16.html: dj_cap added — original non-laminated FINE condition
- erb-o18.html: identifier text updated with Aug 1974 BB#40 reprint info
- erb-o18.html: image order swapped — o26_ext2 (magazine) now first
================================================================================
================================================================================
VERSION v0.64 — 2026-04-08 [rebuild_pass22.py — o15 update]
================================================================================
FIXED:
- erb-o15.html: 4-paragraph identifier text updated with G&D spine/title page
correction and 1938 reprint description
- erb-o15.html: dj_cap added — Very Good + grade, spine fade and edge tears
- erb-o15.html: photo_extras — o14_ext1 + o14_ext at 400px height side by side
LEFT, yellow hl-box with G&D reprint description RIGHT
================================================================================
================================================================================
VERSION v0.63 — 2026-04-08 [rebuild_pass22.py — o3/o13/o14 fixes]
================================================================================
FIXED:
- erb-o3.html: o7_ext3.jpg increased to height:550px;width:auto
- erb-o13.html: identifier text updated with print-run note; dj_cap added
- erb-o14.html: dj_cap added — "Very Good +" grade with edge chips note
================================================================================
================================================================================
VERSION v0.62 — 2026-04-08 [rebuild_pass22.py — o3/o9/o12 fixes]
================================================================================
FIXED:
- erb-o3.html: o7_ext3.jpg natural size 346x420px (was width:100% stretching)
- erb-o9.html: "The book below..." text now above both hr and Photographs heading
- erb-o12.html: Identifier text corrected — dark green lettering, J. Allen
St. John title page illustration, removed incorrect frontispiece reference
================================================================================
================================================================================
VERSION v0.61 — 2026-04-08 [rebuild_pass22.py — o9/o10 fixes]
================================================================================
FIXED:
- erb-o9.html: "The book below..." text now appears ABOVE Photographs heading
- erb-o10.html: Full identifier text restored — 3 paragraphs including
Grosset & Dunlap reprint info and corrected printing details
================================================================================
================================================================================
VERSION v0.60 — 2026-04-08 [rebuild_pass22.py — o9 text moved]
================================================================================
FIXED:
- erb-o9.html: "The book below is of the second state..." moved from
identifier section to just below Photographs heading, after date photos
================================================================================
================================================================================
VERSION v0.59 — 2026-04-08 [rebuild_pass22.py — o1/o3 fixes]
================================================================================
FIXED:
- erb-o1.html: ERBzine link now opens in new tab (target="_blank")
- erb-o3.html: 3rd/4th section — yellow box centered at 50% width above
paragraph text in LEFT column, o7_ext3.jpg in RIGHT column
================================================================================
================================================================================
VERSION v0.58 — 2026-04-08 [rebuild_pass22.py — o1 ERBzine link added]
================================================================================
FIXED:
- erb-o1.html: Added ERBzine link before "The photo below..." —
"This story is available to read on another great ERB site,
Click here if you'd like to read it."
Links to https://www.erbzine.com/mag0/0030.html
================================================================================
================================================================================
VERSION v0.57 — 2026-04-08 [rebuild_pass22.py — o23 image size fix]
================================================================================
FIXED:
- erb-o23.html: all three identifier images (o22b, o22, o22s) now at exact
height:391px;width:auto matching their natural pixel dimensions
================================================================================
================================================================================
VERSION v0.56 — 2026-04-08 [rebuild_pass22.py — o3/o24 layout fixes]
================================================================================
FIXED:
- erb-o3.html: 5th/6th/7th section o7_ext.jpg + o7_ext1.jpg now side by side
in flex row on LEFT, text on RIGHT
- erb-o24.html: o23_ext3.jpg + o23_exts.jpg side by side, yellow caption
below spine image only (nested flex column for spine+caption)
================================================================================
================================================================================
VERSION v0.55 — 2026-04-08 [rebuild_pass22.py — o24 image layout fix]
================================================================================
FIXED:
- erb-o24.html: o23_ext3.jpg and o23_exts.jpg now side by side in flex row
at height:528px;width:auto — float div widened to 55% with flex layout
Yellow caption below both images
================================================================================
================================================================================
VERSION v0.54 — 2026-04-08 [rebuild_pass22.py — o24 image size fix]
================================================================================
FIXED:
- erb-o24.html: o23_ext3.jpg and o23_exts.jpg now display at height:528px
with width:auto for proportionate scaling
================================================================================
================================================================================
VERSION v0.53 — 2026-04-08 [rebuild_pass22.py — o3 image fixes]
================================================================================
RESULTS FROM v0.52: o3 had wrong images in photo_extras sections, ext_side
image too small, ext-side CSS max-width overriding inline width.
FIXED:
- erb-o3.html: o7_ext2.jpg now displays at exact 352px width (from original HTML)
- erb-o3.html: 3rd/4th printing section now uses o7_ext3.jpg (correct image)
- erb-o3.html: 5th/6th/7th section now uses o7_ext.jpg + o7_ext1.jpg side by side
- DETAIL_STYLE: .ext-side max-width removed so inline width is honored
================================================================================
================================================================================
VERSION v0.52 — 2026-04-08 [rebuild_pass22.py — o3/o23/o24 image fixes]
================================================================================
RESULTS FROM v0.51: o23 wrong images used (o22a/o22 swapped), o24 images
side by side instead of stacked, o3 two images in 5th/6th/7th instead of one.
FIXED:
- erb-o23.html: o22b (slip case) LEFT, o22 (trade cover) + o22s (spine) RIGHT
in identifier; o22c horizontal spine + o22a (leather cover) in Photos
- erb-o24.html: o23_ext3 (signature) stacked above o23_exts (trade spine)
floated right with yellow caption box below spine image
- erb-o3.html: 5th/6th/7th section uses only o7_ext1.jpg (not two images)
================================================================================
================================================================================
VERSION v0.51 — 2026-04-08 [rebuild_pass22.py — o3/o9/o23/o24 layout fixes]
================================================================================
RESULTS FROM v0.50: o3 comparison sections in wrong place. o9 missing images
and wrong layout. o23 missing third image and wrong spine. o24 wrong image
arrangement. Spine images not matching cover width.
FIXED:
- All pages: spine-wrap img now width:100% matching cover width
- erb-o3.html: comparison printing sections moved to Photos section after
spine/cover via new photo_extras field. Frontispiece floated right.
- erb-o9.html: o8ext floated right para 1, o8ext1 floated right para 2,
o8ext3/o8ext4/o8ext5 three equal columns with yellow caption boxes
- erb-o23.html: three images side by side (o22b, o22a, o22s) with captions,
o22c horizontal spine strip in Photos section
- erb-o24.html: o23_ext3 + o23_exts side by side floated right alongside
text with caption under spine image. o23s + o23 in Photos section.
- New layout types: three-col-hl, two-col-float, photo_extras field
================================================================================
================================================================================
VERSION v0.50 — 2026-04-08 [rebuild_pass22.py — o3 layout + new layout system]
================================================================================
RESULTS FROM v0.49: o3/o9/o23/o24 text updated but o3 layout still didn't
match old site — images below paragraphs instead of beside them.
FIXED:
- DETAIL_STYLE: 3 new layout CSS classes added:
.hl-box / .hl-box-center — yellow highlight box (inline or centered)
.two-col-hl — yellow box one side, large image other side (grid)
.two-col-imgs — image group one side, text other side (grid)
- ident_paras renderer: 3 new layout types supported:
layout:"two-col-hl" — highlight box + image two-column
layout:"hl-center" — centered yellow highlight box
layout:"two-col-imgs" — images + text two-column
- erb-o3.html: rebuilt to match old site layout exactly:
Frontispiece photo (o7_ext2.jpg) floated right alongside main text
Two-col: yellow box LEFT + o7_ext.jpg large RIGHT (3rd/4th printing)
Full-width text (2nd/3rd/4th printing detail)
Centered yellow box (5th/6th/7th heading)
Two-col: o7_ext1.jpg + o7_ext3.jpg LEFT + text RIGHT
================================================================================
================================================================================
VERSION v0.49 — 2026-04-07 [rebuild_pass22.py — layout fixes o3/o9/o23/o24]
================================================================================
RESULTS FROM v0.48: Four Other series pages had incorrect/truncated identifier
text and wrong image layouts compared to original site.
FIXED:
- erb-o3.html (The Girl from Hollywood): expanded to full 7-printing detail
matching original site — bold headings for 3rd/4th and 5th/6th/7th
printing groups, full "he said" frontispiece research, DJ variations
- erb-o9.html (The Mad King): expanded to 3-state detail matching original
site — page 92 tipped-in photo with caption, date comparison photos
(Cave Girl / Mad King / Outlaw of Torn) with individual captions
- erb-o23.html (Minidoka): slip case + trade version shown side-by-side
with captions in identifier section; "Below book is leather bound"
text; spine + large cover in photos section
- erb-o24.html (Marcia of the Doorstep): signature page floated right
alongside text; spine shown with "Above Spine is of Trade Edition"
caption; large black cover full width
- Other series builder: ext_side_maxw now applied correctly
================================================================================
================================================================================
VERSION v0.48 — 2026-04-07 [rebuild_pass22.py — footer + spine image fixes]
================================================================================
RESULTS FROM v0.47: Footer green bar full viewport width on all main site
pages. Spine images on detail pages stretched to full content width.
FIXED:
- erb-style.css: footer restored to padding:4px with max-width:var(--content-width)
and margin:0 auto — green bar now constrained to content width, matching
forum pages (same fix as v0.26 which was incorrectly reverted)
- rebuild_pass22.py: spine images now use spine-wrap class instead of
full-img-wrap — .spine-wrap img uses width:auto;max-height:500px so
spine images display at natural proportions, not stretched to full width
- All generated pages rebuilt with both fixes
================================================================================
================================================================================
VERSION v0.47 — 2026-04-07 [index.html exact rebuild]
================================================================================
RESULTS FROM v0.46: Bookshelf still at bottom — extra </div> in sig section
was breaking home-layout grid.
FIXED:
- index.html: rebuilt from live source with exactly 2 changes only:
1. visibility:hidden on nav-last-item (matches all other pages)
2. sessionStorage auth script appended before </body>
All other content byte-for-byte identical to working v0.23 source
================================================================================
================================================================================
VERSION v0.46 — 2026-04-07 [footer CSS fix — bookshelf layout restored]
================================================================================
RESULTS FROM v0.45: Bookshelf on Home page appearing large at bottom of page
instead of in right column. Caused by footer CSS change during forum build.
FIXED:
- erb-style.css: footer padding restored to 2rem 1.5rem, max-width and
margin:0 auto removed — these were causing the home-layout grid to
render incorrectly, pushing the aside/bookshelf out of position
- Forum pages have their own inline footer style so unaffected
================================================================================
================================================================================
VERSION v0.45 — 2026-04-07 [index.html properly rebuilt]
================================================================================
RESULTS FROM v0.44: index.html bookshelf/aside/footnote/wip sections still
missing due to Cloudflare email truncation in source file.
FIXED:
- index.html: rebuilt from live site source — all sections restored:
bookshelf, aside, footnote, wip, correct footer, sessionStorage auth
================================================================================
================================================================================
VERSION v0.44 — 2026-04-07 [index.html rebuild + nav final fixes]
================================================================================
RESULTS FROM v0.43: index.html bookshelf missing (truncated by Cloudflare).
Login page showing Patrick instead of Admin. Forum Admin dropdown missing
Version Log. Home page not keeping Admin state.
FIXED:
- index.html: rebuilt from scratch — bookshelf restored, correct nav,
sessionStorage auth, clean footer
- erb-forum-login.html: removed navLink.textContent = name
Nav now handled entirely by sessionStorage — stays on Admin
- All 6 forum pages: Version Log added to Admin dropdown
================================================================================
================================================================================
VERSION v0.43 — 2026-04-07 [rebuild_pass21.py — nav flicker + shift final fix]
================================================================================
RESULTS FROM v0.42: Nav redrew on every page click. html overflow-y:scroll
missing from deployed CSS (overwritten by generator). Version Log page had
old nav without nav-last-item or Admin/My Account.
FIXED:
- rebuild_pass21.py: html{overflow-y:scroll} added to CSS — permanent
- Auth script: sessionStorage caching added to all pages
On load: reads sessionStorage instantly — no Firebase wait, no flicker
Firebase confirms in background — only updates DOM if role changed
Sign-out: clears sessionStorage so My Account shows correctly
- erb-versionlog.html: nav rebuilt to current correct structure
- All static + forum pages: new sessionStorage auth applied
================================================================================
================================================================================
VERSION v0.42 — 2026-04-07 [rebuild_pass20.py — nav flicker fix]
================================================================================
RESULTS FROM v0.41: "My Account" briefly visible before switching to "Admin"
on every page load. Some main site pages still missing auth script.
FIXED:
- rebuild_pass20.py: nav-last-item hidden initially (visibility:hidden)
Revealed after auth resolves — either as My Account or Admin
Eliminates flash/flicker on every page load
- All generated pages regenerated with hidden+reveal pattern
- All static pages updated with same hidden+reveal
- All forum pages: hidden+reveal added to auth blocks
- erb-versionlog.html: auth script added
================================================================================
================================================================================
VERSION v0.41 — 2026-04-07 [rebuild_pass20.py — auth baked into generator]
================================================================================
RESULTS FROM v0.40: Main site pages (Home, First Editions, book detail pages)
missing Firebase auth script entirely — always showed My Account even when
admin logged in. Forum Members page still showed person's name.
FIXED:
- rebuild_pass20.py: auth_script_html() function added to generator
Auth script now baked into ALL generated pages (covers + detail pages)
Single onAuthStateChanged: only switches to Admin for admin role, never name
- index.html: auth script added
- forum/erb-forum-members.html: name reference removed, admin nav fixed
================================================================================
================================================================================
VERSION v0.40 — 2026-04-07 [auth nav final fix]
================================================================================
RESULTS FROM v0.39: Forum pages still showing person's name (Patrick) in nav
due to old auth code that set textContent = name still present. Admin
nav block was empty on forum index. Multiple auth patterns conflicting.
FIXED:
- All 7 forum pages: auth blocks audited and corrected
Single onAuthStateChanged per page
Never sets person's name in nav
Correctly switches My Account to Admin dropdown for admin role
Admin page: switches nav before showing admin content
================================================================================
================================================================================
VERSION v0.39 — 2026-04-07 [forum nav click fix + auth consolidation]
================================================================================
RESULTS FROM v0.38: Clicking Forum ▾ on forum pages caused page reload,
redrawing all icons and cycling My Account/Admin. Duplicate auth listeners
on forum pages caused flickering.
FIXED:
- All 7 forum pages: Forum ▾ link changed to href="#" onclick="return false;"
Clicking Forum label or arrow opens dropdown only, no navigation/reload
- All 7 forum pages: duplicate onAuthStateChanged listener removed
Each page now has exactly one auth listener — no more cycling
================================================================================
================================================================================
VERSION v0.38 — 2026-04-07 [nav fixes + login centering]
================================================================================
RESULTS FROM v0.37: Auth script showed person's name causing nav width shift.
Login page not centered. Misc dropdown still had Version Log on feast/misc.
index.html and versionlog missing auth script. Nav shift on dropdown open.
FIXED:
- erb-style.css: html { overflow-y:scroll } — prevents scrollbar shift
- erb-style.css: #nav-last-item { min-width:90px } — prevents text-change shift
- All pages: auth script simplified — only switches to Admin for admin role,
never shows person's name — My Account stays until admin detected
- erb-forum-login.html: login box centered with flexbox
- erb-feast.html, erb-misc.html: Version Log removed from Misc dropdown
- index.html, erb-versionlog.html: auth script added
================================================================================
================================================================================
VERSION v0.37 — 2026-04-07 [rebuild_pass19.py + nav last item]
================================================================================
RESULTS FROM v0.36: Nav layout shifted when Forum Index loaded because
hidden Admin nav item appeared, changing nav width. Two nav items
(My Account button + Login nav) duplicated same function.
FIXED:
- rebuild_pass19.py: last nav slot always visible
Logged out / regular member: shows "My Account" linking to login page
Admin logged in: switches to "Admin ▾" dropdown in place (no layout shift)
Admin dropdown (main site): Version Log + My Account
Admin dropdown (forum pages): Forum Admin + Moderation Queue + My Account
- All static pages: same last nav slot + Firebase auth script added
- All 7 forum pages: same last nav slot, old forum nav cleanup
- All generated pages: Firebase auth script added for nav admin detection
================================================================================
================================================================================
VERSION v0.36 — 2026-04-07 [rebuild_pass18.py + forum nav restructure]
================================================================================
RESULTS FROM v0.35: Forum pages had separate green nav bar inconsistent
with main site. Admin nav had no dropdown. Search was a nav item
taking up space in the forum nav.
FIXED:
- rebuild_pass18.py: Forum nav = plain link on non-forum pages
Admin nav = dropdown with Version Log (web context)
- All static pages: same Forum + Admin nav updates
- All 7 forum pages: forum-specific nav bar removed entirely
Replaced with main site nav (Home/First Editions/Research/Misc/Forum/Admin)
Forum nav item = dropdown with Forum Index + Members (forum context)
Admin nav item = dropdown with Forum Admin + Moderation Queue (forum context)
Both use ../ prefix correctly for forum subfolder
- erb-forum-index.html: search moved from nav to online bar
Search icon (magnifying glass) on right side of online bar
Clicking reveals inline search input that redirects to search page
================================================================================
================================================================================
VERSION v0.35 — 2026-04-07 [no generator — forum alerts + search + members]
================================================================================
RESULTS FROM v0.34: All forum pages still using browser alert() dialogs
for errors, warnings and notifications. Search and Members pages
not yet built.
FIXED:
- erb-forum-category.html: all alert() replaced with inline notify bar
Styled by type: error (red), warn (yellow), success (green), pending (blue)
Auto-dismisses after 5 seconds except pending messages
- erb-forum-topic.html: same inline notify bar for all alerts
- erb-forum-search.html: new search page
Keyword search across topic titles
Filter by category dropdown (loaded from Firestore)
Results show title with highlighted match, author, date, reply/view counts
Supports ?q= URL parameter for direct search links
- erb-forum-members.html: new members page
Lists all non-banned members from Firestore users collection
Shows avatar, name, role badge, join date, post count
Search by name, sort by join date / post count / name
Column headers clickable to sort
================================================================================
================================================================================
VERSION v0.34 — 2026-04-07 [no generator — forum admin fixes]
================================================================================
RESULTS FROM v0.33: Admin panel delete used browser confirm() dialog.
Admin nav item missing on admin page itself.
FIXED:
- erb-forum-admin.html: delete category replaced with inline confirmation row
Shows "Delete [name]? This cannot be undone" with Yes/Cancel buttons
in the categories table — no browser dialogs
- erb-forum-admin.html: reject post replaced with inline confirmation
in the moderation queue card — no browser dialogs
- erb-forum-admin.html: Admin nav always visible and marked active
on the admin page itself
================================================================================
================================================================================
VERSION v0.33 — 2026-04-07 [no generator — forum dynamic categories]
================================================================================
RESULTS FROM v0.32: Forum categories hardcoded in HTML — adding/removing
categories in admin panel didn't update forum index or footer links.
Categories collection in Firestore empty on first load.
FIXED:
- erb-forum-index.html: categories loaded dynamically from Firestore
On first load: if categories collection empty, auto-seeds 6 default
categories to Firestore (ERB First Editions, Dust Jackets, Reprint
Editions, General ERB Discussion, For Sale / Wanted, Site Feedback)
Category table rows built from Firestore data — topic/post counts live
Footer links built dynamically from Firestore categories
- erb-forum-category.html: footer links load dynamically from Firestore
- erb-forum-topic.html: footer links load dynamically from Firestore
- erb-forum-login.html: footer links load dynamically from Firestore
- erb-forum-admin.html: footer links load dynamically from Firestore
================================================================================
================================================================================
VERSION v0.32 — 2026-04-06 [no generator — forum New Topic form]
================================================================================
RESULTS FROM v0.31: New Topic used browser prompt() dialog — ugly and
inconsistent with site styling.
FIXED:
- erb-forum-category.html: replaced prompt() dialogs with inline form
Form slides open below category header when + New Topic clicked
Fields: Topic Title (text input) + First Post (textarea)
Post Topic and Cancel buttons styled to match site
All existing checks retained: rate limit, link restriction,
banned/viewOnly block, newUser pending flag
On success: redirects to new topic page
On pending: shows message and closes form
================================================================================
================================================================================
VERSION v0.31 — 2026-04-06 [no generator — forum build Pass 7]
================================================================================
RESULTS FROM v0.30: No rate limiting on posts. External links allowed from
any user regardless of post count. Admin panel missing rate limit settings.
FIXED:
- erb-forum-topic.html: rate limiting added
Checks lastPostAt timestamp before allowing post
If within cooldown window: blocks with wait time message
External link check: blocks links if postCount < minPostsForLinks
Updates lastPostAt on user record after each post
- erb-forum-category.html: same rate limit + link checks added to New Topic
Also updates lastPostAt after topic created
- erb-forum-admin.html: two new Forum Settings fields
Posts per hour limit (default 10)
Min posts before external links allowed (default 5)
Both fields saved to Firestore settings/forum and loaded on page open
Firebase Storage Rules (apply manually in Firebase Console):
forum/posts/** — read:true, write: authenticated users only
all other paths — read:true, write: false
================================================================================
================================================================================
VERSION v0.30 — 2026-04-06 [no generator — forum build Pass 6]
================================================================================
RESULTS FROM v0.29: Post Reply button non-functional. Category page showed
no topics. New Topic button non-functional. Moderation queue wiring
incomplete.
FIXED:
- erb-forum-topic.html: fully wired to Firestore
Posts load from Firestore posts collection (pending=false only)
Topic title, reply count, view count loaded from topics collection
View count increments on each visit
Post Reply submits to Firestore with: content, author info, attachments,
pending flag (true for newUser), reactions map, createdAt timestamp
File attachments upload to Firebase Storage, URLs stored with post
Banned/view-only users blocked with clear message
New users: post saved as pending=true, user shown review message
Reactions write reaction counts to Firestore
Lightbox for image attachments
- erb-forum-category.html: fully wired to Firestore
Topics load from Firestore topics collection ordered by date desc
New Topic creates topic + first post in Firestore
Same banned/viewOnly/newUser checks apply
Topic links correctly pass cat and id params to topic page
================================================================================
================================================================================
VERSION v0.29 — 2026-04-06 [rebuild_pass17.py + forum nav updates]
================================================================================
RESULTS FROM v0.28: Version Log still in Misc dropdown on all pages.
Admin panel had no nav link — no way to reach it while browsing.
Admin nav item not visible to admin users.
FIXED:
- rebuild_pass17.py: Version Log removed from Misc dropdown on all
generator-built pages (cover pages + all detail pages)
- All static pages: Version Log removed from Misc dropdown
- All static pages: Admin nav item added (hidden by default)
- index.html: auth script added — Admin nav shows for admin users
- All forum pages: Admin nav item added to forum nav
- All forum pages: auth scripts updated — Admin nav shows for admin users
- erb-forum-admin.html: Admin nav item added to its own nav
================================================================================
================================================================================
VERSION v0.28 — 2026-04-06 [no generator — forum Pass 5 + email fix]
================================================================================
RESULTS FROM v0.27: Admin panel not yet built. Home page email showing as
[email protected] due to Cloudflare obfuscation not working on Firebase hosting.
FIXED:
- erb-forum-admin.html: new admin panel with 6 sections:
Forum Settings (max file size, max attachments, allowed types) → Firestore
Custom ERB Reactions (4 slots, GIF upload, label, enable/disable) → Firestore
Categories (add, edit, lock/unlock, delete) → Firestore
Users (search, ban, view-only, promote/demote moderator) → Firestore
Moderation Queue (approve/reject pending first posts) → Firestore
Storage Usage (guidance to check Firebase Console)
Access control: redirects to login if not authenticated,
shows Access Denied if not admin role
- index.html: fixed email obfuscation — replaced broken Cloudflare cdn-cgi
encoding with JavaScript character array decode (works on any static host)
Both sig email and footer email fixed
- index.html: version comment bumped to v0.27
================================================================================
================================================================================
VERSION v0.27 — 2026-04-06 [no generator — forum build Pass 4]
================================================================================
RESULTS FROM v0.26: Forum pages had no login functionality. Login, reply
composer, reactions, and New Topic button all static/disabled.
FIXED:
- erb-forum-login.html: new Google Sign-In page
Google OAuth via Firebase Auth (popup flow)
On first login: user record created in Firestore users collection
(uid, displayName, email, photoURL, joinDate, postCount, role,
banned, viewOnly, newUser flag for moderation queue)
Already-logged-in state shows user name/avatar + Sign Out button
Redirects to forum index after successful login
- erb-forum-auth.js: shared Firebase init module
- erb-forum-index.html: nav Login link updates to first name when logged in
- erb-forum-category.html: New Topic button enables when logged in
- erb-forum-topic.html: reply composer and reactions enable when logged in
================================================================================
================================================================================
VERSION v0.26 — 2026-04-06 [rebuild_pass16.py]
================================================================================
RESULTS FROM v0.25: Footer green bar too wide (full viewport width) and too
much padding (2rem top/bottom) on all pages. Forum page footer also had
wrong color and excess padding.
FIXED:
- erb-style.css: footer padding reduced from 2rem to 4px
- erb-style.css: footer max-width set to var(--content-width) with margin auto
— green bar now constrained to content width, not full viewport
- erb-forum-index.html: footer inline style updated to match global footer
(same dark green #2d4a2d, 4px padding, content-width constrained)
- All generated pages rebuilt with updated CSS
================================================================================
================================================================================
VERSION v0.25 — 2026-04-06 [rebuild_pass16.py]
================================================================================
RESULTS FROM v0.24: Forum nav link on all generator-built pages still pointed
to old phpbb2 forum. Misc dropdown in generator had old items (ERB Interview,
Tour of Ekstrom Library) not matching live site. erb-forum-index.html logo
shifted left due to wrong header structure (erb-title vs logo-nav-wrap).
FIXED:
- rebuild_pass16.py: Forum nav link updated from phpbb2 to
{prefix}/forum/erb-forum-index.html — works correctly for both
root-level cover pages (.) and subfolder detail pages (..)
- rebuild_pass16.py: Misc dropdown corrected to match live site:
For Sale, Links - ERB Related, Media Files, Mystery Inscription, Version Log
- rebuild_pass16.py: pre-existing bug fixed in build_other_detail —
prev_lk_pn_bot / next_lk_pn_bot variables were missing (NameError)
- erb-forum-index.html: header fixed — logo-nav-wrap replaces erb-title,
forum-nav-wrap moved inside logo-nav-wrap, <a> wrapper removed from logo
================================================================================
================================================================================
VERSION v0.24 — 2026-04-06 [no generator — forum build Pass 1]
================================================================================
RESULTS FROM v0.23: Forum nav item still linked to old phpBB2 forum at
erbfirsts.com/phpbb2/. New forum build not yet started.
FIXED:
- Forum Pass 1: static shell pages created for new Firebase-based forum
erb-forum-index.html — forum index with 6 categories, stats bar,
who's-online strip, Login to Post prompt, responsive layout
erb-forum.css — forum-specific styles extending erb-style.css
Both files use erb-forum-* naming convention for BAT routing
- DeployERBFirsts_17.bat: two additions for forum support
Added: if not exist "%PUBDIR%orum" mkdir "%PUBDIR%orum"
Added: erb-forum routing rule — ^erb-forum prefix routes to publicorum\
STILL TO DO:
- Update main site nav Forum link from phpbb2 to forum/erb-forum-index.html
(deferred until forum is fully built and live)
- Forum Pass 2: category/topics listing page
- Forum Pass 3: topic/post page with reply composer + file attachments
- Forum Pass 4: Google login (Firebase Auth)
- Forum Pass 5: Admin panel + configurable settings
- Forum Pass 6: Moderation queue + ban/view-only controls
- Forum Pass 7: Rate limiting + Firestore security rules
================================================================================
================================================================================
VERSION v0.23 — 2026-04-05 PST [no generator changes — static pages only]
================================================================================
RESULTS FROM v0.22: F.E.A.S.T. pages updated. No media page existed.
Buy/Sell box still on home page. Old ERB Interview and Library Tour pages
separate with no modern styling.
FIXED:
- erb-misc.html rebuilt as "Media Files" page with:
HTML5 video player for ERB_library_visit.mp4 (960x720 display)
HTML5 audio player for ERBfirsts_interview.mp3
Both set to preload=auto for immediate playback on click
Description text from original pages preserved
- index.html: removed For Sale / Buy ERB box from sidebar
- All modern static pages: Misc dropdown updated —
removed "ERB Interview" and "Tour of Ekstrom Library"
added "Media Files" after "Links — ERB Related"
- DeployERBFirsts.bat: added public/media/ folder creation
added .mp3/.mp4/.wmv routing to public/media/
retained ROUTING debug lines and rename try/catch fix
================================================================================
================================================================================
VERSION v0.97 — 2026-04-28 [rebuild_generator29.py v0.59 / PLE v4.31.5]
================================================================================
RESULTS FROM v0.96: float:center images rendering full-width on mobile.
Text box widths not capped at mobile viewport. Image panel labels outdated.
Ratio lock not applied on manual width/height input.
FIXED — Layout Editor v4.31.5:
- Text panel: Break/Paragraph buttons match Split Box styling (gold border/text)
- Text panel: Old duplicate Delete button removed from bottom for text/image blocks
- Image panel: ALIGN + IN ROW VERTICAL buttons fixed width (flex:0 0 auto)
- Image panel: LINK TEXT BOX dropdown fixed width
- Image panel: ASPECT RATIO row redesigned — PERCENT CHANGE read-only display
(green, updates live during drag), RESET TO SIZE on same line
- Image panel: RESET TO SIZE — desktop uses origWidth/origHeight; mobile
"Reset to Max Size" sets 330px wide with proportional height
- Image panel: Actual image preview shown in lower panel at current dimensions;
scales down with message if too large; placeholder if no src/load fails
- Image panel: File picker + direct Firebase Hosting upload button —
select local image, uploads to Firebase without needing BAT deploy
- Image blocks: origWidth/origHeight stored from naturalWidth/naturalHeight
on resetImgRatio; also loaded lazily when image panel first opens
- Image blocks: Ratio lock now applies on manual CURRENT WIDTH/HEIGHT input —
changing one dimension auto-adjusts the other proportionally
- Tab auto-switch: clicking a text block auto-switches to Text tab;
clicking an image block auto-switches to Graphics tab
- Tab auto-select: clicking Text/Graphics tab jumps to nearest block of that type;
clears panel if no blocks of that type exist
- Mobile image cap: _jsRenderAll caps image width to 330px on mobile deploy,
scales height proportionally for float:center and float:left/right
- float:center rendering verified correct in _jsRenderAll
FIXED — Generator v0.59:
- T12 (Tarzan and the Lost Empire): publisher "Metropolitan Books, Inc." →
"Metropolitan, Inc."
- T13 (Tarzan at the Earth's Core): same publisher fix
================================================================================
================================================================================
VERSION v0.22 — 2026-04-05 [no generator changes — static pages only]
================================================================================
RESULTS FROM v0.21: F.E.A.S.T. report pages were old Word-exported HTML with
no site styling. Monthly prior report links broken (wrong extensions).
erb-feast.html section order wrong. No sort functionality.
FIXED:
- All 12 x 2005 monthly FEAST reports rebuilt as clean modern HTML with:
site fonts (Playfair Display + Source Serif 4), mustard header color (#eec400),
sticky column header, N/A for Auto-Biography date, $0 values → blank,
typo fixed (City ofGold → City of Gold)
- All 19 x 2003/2004 monthly FEAST reports rebuilt with same styling
- erb-feast.html section reorder: title → subtitle → meta line → table →
Prior Reports box → intro paragraph → footnotes → footer
- erb-feast.html: "below" → "above" in intro paragraph
- erb-feast.html: all 2005 monthly links fixed from .htm → .html
- erb-feast.html: all 2004 monthly links fixed from .htm → .html
- erb-feast.html: Prior Reports links open in new tab (target=_blank)
- erb-feast.html: compact meta line — Total left, FINAL REPORT center,
REPORT DATE right, all on one line
- erb-feast.html: sticky logo/nav (position:sticky on .erb-header)
- erb-feast.html: sticky table header rows offset by nav height via window.load
- erb-feast.html: sortable columns — click to sort asc/desc/default series order;
# column always shows sequential row number; ▲/▼ sort indicators
- erb-feast.html: sort click scrolls page to table header position below nav
- DeployERBFirsts.bat: rename fix — try/catch suppresses red error when
ERBFirsts-*.zip already exists in Downloads
- DeployERBFirsts.bat: ROUTING/EXT-CHECK/AFTER-CLEAN debug lines added to
diagnose why erb-feast.html was not being deployed from zip
================================================================================
================================================================================
VERSION v0.21 — 2026-04-02 [rebuild_pass15.py]
================================================================================
RESULTS FROM v0.20: Research pages (erb-dj, erb-feast, erb-signatures) still had
old nav missing Version Log in Misc dropdown.
FIXED:
- Nav updated on all 3 Research pages with correct Misc dropdown
================================================================================
================================================================================
VERSION v0.20 — 2026-04-02 [rebuild_pass15.py]
================================================================================
RESULTS FROM v0.19: Version number still showing on home page. Static pages
(erb-misc, erb-sell, erb-erblinks, erb-inscription, home) had outdated nav
missing Version Log in Misc dropdown.
FIXED:
- Version number removed from home page footer
- All static pages nav updated with correct Misc dropdown including Version Log
- Consistent nav across all page types (home, covers, detail, static)
================================================================================
================================================================================
VERSION v0.19 — 2026-04-02 [rebuild_pass15.py]
================================================================================
RESULTS FROM v0.18: Version number showing on cover pages and home; home showing
stale version. Version number should only appear on Version Log page.
FIXED:
- Removed version number from all cover pages (Tarzan, MPV, Other)
- Removed version number from all static pages except home and version log
- Version log page now shows current version number next to heading
- Home page updated to v0.19
================================================================================
================================================================================
VERSION v0.18 — 2026-04-02 [rebuild_pass15.py]
================================================================================
RESULTS FROM v0.17: Reprint anchor working but landing slightly too high (194px).
FIXED:
- scroll-margin-top reduced from 194px to 150px on reprints anchor
================================================================================
================================================================================
VERSION v0.17 — 2026-04-02 [rebuild_pass15.py]
================================================================================
RESULTS FROM v0.16: Reprint anchor landing 1/3 into Burt covers (consistent across
all books). Bottom nav scroll working. Anchor structure correct but insufficient
upward offset.
FIXED:
- Reprint anchor: added scroll-margin-top:194px to <a id="reprints"> element
(calculated from h2+h3+hr+spacing+1/3 image height = ~194px total offset)
- Version number and log updated
================================================================================
================================================================================
VERSION v0.16 — 2026-04-02 [rebuild_pass15.py]
================================================================================
RESULTS FROM v0.15: Reprint button scroll approach wrong. Version log inaccurate.
FIXED:
- Reprint anchor: replaced scroll-margin approach with classic invisible offset
anchor: <a id="reprints" style="display:block;height:0;visibility:hidden;"></a>
placed immediately before <h2>Reprint Editions</h2>. Bulletproof HTML.
- Version log: completely rewritten with accurate entries for every version,
correct version numbers, generator script filename for each version,
what was fixed and what remained broken
================================================================================
================================================================================
VERSION v0.15 — 2026-04-01 [rebuild_pass14.py — modified]
================================================================================
RESULTS FROM v0.14: Reprint button now lower than before (80px too much).
Version log had all entries incorrectly renamed to v0.11.
FIXED:
- scroll-margin-top reduced to 8px (nav scrolls away so minimal offset needed)
- Version log txt and HTML files updated (though log entries were still inaccurate)
STILL BROKEN:
- Reprint button still unreliable — scroll-margin-top approach fundamentally wrong
for this use case
- Version log entries were all labeled v0.11 (corrupted by blanket regex replacement
in an earlier session)
================================================================================
================================================================================
VERSION v0.14 — 2026-04-01 [rebuild_pass14.py]
================================================================================
RESULTS FROM v0.13: Reprint button barely showing bottom of A.L. Burt text —
scroll-margin-top:10px not enough offset. Bottom nav landing in middle of page.
FIXED:
- scroll-margin-top on h2#reprints increased to 80px
- Bottom nav scroll: investigated — issue was scroll saving 'bottom' but
scrollHeight not reached due to timing; confirmed pn-bottom class working
and JS saving/restoring correctly
STILL BROKEN:
- Reprint button still not landing at "Reprint Editions" heading — scroll-margin-top
unreliable across browsers (80px overshoots because nav is not fixed/sticky)
================================================================================
================================================================================
VERSION v0.13 — 2026-04-01 [rebuild_pass13.py]
================================================================================
RESULTS FROM v0.12: Acorn caption still below wrong photo. Reprint button still
not landing at "Reprint Editions" heading. Scroll position not working for
bottom nav arrows.
FIXED:
- ext_side_cap support added to Tarzan renderer: renders styled italic caption
in text box below ext_side image
- t1: ext_side_cap set with acorn caption text; ext_side_maxw reduced to 200px;
caption key removed from ident_paras copyright page item (was wrong location)
- Reprint section: id="reprints" moved from wrapper div to <h2> element directly;
scroll-margin-top:10px added — clicking button now scrolls to heading
- Scroll position save/restore: clicking top pn-left/pn-right saves window.scrollY
to sessionStorage; restored on page load
- Bottom nav: pn-bottom class added to bottom bar links; JS saves 'bottom' string;
on load restores to document.body.scrollHeight
STILL BROKEN:
- Reprint button landing just below "Reprint Editions" heading — scroll-margin-top
value needs adjustment
- Bottom nav scroll: landing in middle of page not at true bottom
================================================================================
================================================================================
VERSION v0.12 — 2026-04-01 [rebuild_pass12.py]
================================================================================
RESULTS FROM v0.11: Reprint button img path wrong depth. OLD ENGLISH text still
above image. Acorn caption still wrong photo. t1_ext3 appearing twice.
FIXED:
- Reprint button img path corrected: ../images/ for Tarzan (not ../../images/)
- layout:row renderer updated: text and image now in single flex div together;
standalone <p> suppressed when layout=row active
- t1 ident_imgs=None: cleared old ident_imgs entry that was causing t1_ext3 duplicate
- caption key added to ident_paras renderer: renders styled italic box below image
- t1: Acorn caption moved to caption key on the ext_side item (t1ext2.jpg);
removed from ident_paras copyright page item where it was wrongly placed
STILL BROKEN:
- Acorn caption still appearing below copyright page photo not below acorn spine photo
(ext_side and ident_paras are different rendering paths — caption key was added
to ident_paras renderer but ext_side doesn't use that path)
- Reprint button scrolling to middle of A.L. Burt text not to "Reprint Editions" heading
================================================================================
================================================================================
VERSION v0.11 — 2026-04-01 [rebuild_pass11.py]
================================================================================
RESULTS FROM v0.10: Version stale on home/covers. Reprint button no hover.
OLD ENGLISH/GOTHIC text/photo still separate lines. Acorn caption wrong location.
t24 duplicate caption. erb-o28 photo distortion.
FIXED:
- Version strings updated to v0.11 on all generated pages (VERSION_COMMENT)
- Static files (erb-index, erb-shelf, erb-misc, etc.) version updated directly
- Reprint button replaced with reprint_button.jpg image; data-hover attribute
for swap to reprint_button_2.jpg on mouseover; placed right of book title
in header for all books with reprint data; JS hover script added
- layout:row support added to ident_paras renderer — text and image in same flex div
- t1 OLD ENGLISH/GOTHIC: layout:row applied — each label now beside its photo
- t1: Acorn caption moved to caption key on copyright page photo item
- t24: extra= field cleared (removed duplicate label caption)
- erb-o28: converted to ident_paras with both photos (cover + spine) inline
STILL BROKEN:
- Reprint button img path using ../../ (wrong depth for Tarzan pages)
- OLD ENGLISH text appearing above image not beside it (separate <p> tag issue)
- Acorn caption still below wrong photo (copyright page not spine photo)
- t1 ident_imgs still set causing t1_ext3 to render twice
================================================================================
================================================================================
VERSION v0.10 — 2026-04-01 [rebuild_pass10.py]
================================================================================
RESULTS FROM v0.9: Reprint DJs now showing. Several book-specific layout issues.
FIXED:
- Reprint button: green "↓ Reprint Editions" jump button added to identifier section
for all books with reprint data (t1-t5); id="reprints" anchor on reprint div
- t1: OLD ENGLISH/GOTHIC split into separate ident_paras items with own images
- t5: t5_ext1.jpg enlarged to 320px
- t26: Converted to ident_paras; ASP note text corrected; t26_ext.jpg inline
- t27: Duplicate spine image removed from photos section
- t24: Copyright page variant photos (ext7/1/6/8) moved inline in ident section;
label photos (ext4/ext3) with individual captions side by side
- erb-o28 (Girl from Farris): Both photos now display side by side inline;
Other renderer ident_paras support added
- t27: Full Whitman invoice attribution text added (Brian J. Bohnett Dec 2007);
Canaveral 1963 paragraph added with t26_ext.jpg photo
STILL BROKEN:
- Home showing v0.6, Tarzan covers showing v0.3 (static files not regenerated)
- Reprint button hover animation not working
- OLD ENGLISH/GOTHIC text and photo still on separate lines
- Acorn caption in wrong place (below wrong photo)
================================================================================
================================================================================
VERSION v0.9 — 2026-04-01 [rebuild_pass9.py]
================================================================================
RESULTS FROM v0.8: Reprint DJ images not displaying. t2/t4 photos stacking.
FIXED:
- All 21 reprint DJ filenames corrected to match exact Firebase names:
Rule confirmed: underscore immediately before "dj" removed everywhere
e.g. a_toa_g&ddj.jpg, a_bot_burtdj.jpg, a_rot_burt_reprodj.jpg, etc.
- display:inline-block;vertical-align:top added to ident_paras and ident_imgs
image renderers — photos now display side by side
STILL BROKEN:
- Various layout/content issues across t24/t26/t27/t1/t5/erb-o28 reported next session
================================================================================
================================================================================
VERSION v0.8 — 2026-04-01 [rebuild_pass8.py]
================================================================================
RESULTS FROM v0.7: t27 missing extra photo. t24 missing t24_ext1. t1 copyright
page too small. t2 Canadian photos duplicating enlarged below content.
t4 title/copyright photos broken. t5 five-books photo too small + duplicate.
FIXED:
- t27: t27_ext.jpg added as ext_side (main spine photo, 320px float right);
t27_ext1.jpg in photos section
- t24: ext_pairs corrected — t24_ext1.jpg added, pair order fixed
- t1: Copyright page (t1_ext2.jpg) enlarged to 350px; ext_side enlarged to 340px;
duplicate copyright page entry removed from ident_imgs
- t2: Canadian photos moved inline in ident_paras at 200px; full-width duplicates
removed from photos section
- t4: Title/copyright photos moved inline in ident_paras at 320px; removed from
photos section (ext_pairs cleared)
- t5: Five-books photo (t5ext.jpg) ext_side enlarged to 360px; duplicate ext_pairs
entry removed
- ext_side_maxw and imgs_maxh support added to renderer
STILL BROKEN:
- Reprint DJ images not showing (wrong filenames in generator)
- t2/t4 photos still stacking vertically instead of side by side
================================================================================
================================================================================
VERSION v0.7 — 2026-04-01 [rebuild_pass7.py]
================================================================================
RESULTS FROM v0.6: DJ captions missing/wrong for most books. t1 DJ filename wrong.
Reprint G&D images not displaying (& encoding bug in HTML src attribute).
FIXED:
- All 27 Tarzan DJ captions assigned correctly from ASP source:
12 reproduction DJs (standard caption), 14 original DJs (unique captions),
t27 confirmed no DJ exists
- t1 DJ filename corrected: t1_dj.jpg → t1dj.jpg
- Reprint src encoding fixed: & literal in src= URL, & only in alt= text
- t6/t7/t8/t10/t11/t13/t26/t28 DJ images added (were None)
- t9/t12/t14/t15/t16/t17/t18/t19/t20/t21/t22/t23/t24 unique DJ captions set
STILL BROKEN:
- t27 missing extra photo; t24 missing t24_ext1.jpg
- t1 copyright page photo too small; t2/t4/t5 photo layout issues
================================================================================
================================================================================
VERSION v0.6 — 2026-03-31 [rebuild_pass6.py]
================================================================================
RESULTS FROM v0.5: Reprint images all same size, not distinguishing covers vs DJs.
FIXED:
- Reprint covers: max-height 130px portrait; spines max-width 45px narrow
- Reprint DJs: max-width 270px landscape, separate row from covers
- Identifier ext-row images: max-height 160px with auto width (proper proportions)
- All applies to t1-t5 reprint sections
================================================================================
================================================================================
VERSION v0.5 — 2026-03-31 [rebuild_pass5.py]
================================================================================
RESULTS FROM v0.4: Ext images still wrong sections on t1/t2/t4/t5.
FIXED:
- t1: OLD ENGLISH and GOTHIC images now inline with correct identifier paragraphs
using ident_paras; copyright page photo (t1_ext2.jpg) inline
- t2: Canadian edition photos (t2_ext1/2/3) now inline below Canadian paragraph
- t4: Title page and dedication photos (t4ext/t4ext1) inline beside identifier text
- t5: Joe Lukes comparison photo (t5_ext1) now below Joe Lukes paragraph
STILL BROKEN:
- Reprint section image sizing — covers/DJs/spines all same size
================================================================================
================================================================================
VERSION v0.4 — 2026-03-31 [rebuild_pass4.py]
================================================================================
RESULTS FROM v0.3: Shelf links wrong. Index bookshelf link broken. FEAST/ext issues.
FIXED:
- Shelf: Added dynamic JS scaling so image map coordinates scale with image width
- Shelf: Fixed bookshelf image on index.html linking to erb-shelf.html
- t1: FEAST moved after reprint section; OLD ENGLISH/GOTHIC identifier text added;
t1dj.jpg added; G&D missing images added (a_toa_g&d_2dj, a_toa_g&d_3dj);
G&D text corrected (1927-1973, artwork change detail)
- t2: FEAST moved after reprint; t2dj.jpg added; Shaun Hoadley credit added
- t3, t4: FEAST moved after reprint
- t5: FEAST moved after reprint; Joe Lukes credit added; DJ caption fixed
- Version log added (this file)
STILL BROKEN:
- t1-t5 ext images still rendering in wrong section or wrong size
================================================================================
================================================================================
VERSION v0.3 — 2026-03-29 [rebuild_pass3.py]
================================================================================
FIRST WORKING BUILD. Basic structure in place.
KNOWN ISSUES:
- Shelf links going to wrong book (image map not scaling with image width)
- Bookshelf image on index.html not linking to shelf page
- t1-t5 FEAST tables in wrong position (should appear after reprint section)
- t1-t5 identifier ext images in wrong section (photos vs identifiers)
- Reprint sections incomplete/missing on some books
================================================================================