Page blocks assigned to the landing template's hero/cta slots had no
corresponding slot placeholder in the case master, so they rendered appended
after </html>. Master-page change: needs a fresh instance (or restart).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Seed: home hero -> landing 'hero' slot (full-bleed) and cta -> 'cta' slot;
reconcile_blocks on home + harbour-light so demo re-install rewrites them.
- Hero: remove noir-spotlight from the image wrapper and the landing hero-slot
wrapper — its radial vignette fades the photo to --background (cream in light
mode) exactly where the onImg white text sits. Image + black scrim now carry
legibility in both modes.
- Image override: figure is column-flex so the typed caption sits under the
evidence frame (was landing beside it); frames render grayscale to match the
dossier persona.
- Harbour Light article extended to 9 paragraphs (case-file voice) per the
seed length gate.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The CMS never consumes LoadedPlugin.BundledFonts, so fonts.json alone renders
fallback sans. Declare @font-face against the served artifact paths
(/templates/noir/fonts/*.woff2) in the appended CSS and set
typography.fontHeading/body/mono = template:noir:<Family> in all five presets
so --font-heading/--font-body/--font-mono resolve to the bundled faces
(IBM Plex Mono / Source Serif 4). gotham@1.2.0 precedent.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Reveal: shorten scroll-reveal safety timeout below the capture settle and
reveal-all when viewport height is unknown (headless), so main content is no
longer stranded mid-fade at ~0.25 opacity in both modes; give the article
template the robust reveal script it was missing. Fixes the washed-out
light-mode body/quote copy AND the H1-over-first-line overlap (the translateY
mid-transition was dropping the heading onto the body).
- Headings: add bottom margin per level so H1 no longer butts the first paragraph.
- Article: collapse the aside rail (and its divider border) when empty; populate
each case article's aside with case-file marginalia.
- Light mode: bump muted-foreground contrast across all five presets (~L38->L30)
for comfortable AA on secondary text; dark palettes untouched.
- Media: wire 6 licensed noir stock shots as seed media — harbour-night hero
(with readable light-on-scrim hero text in both modes), per-article lead
photos, typewriter on About.
- SVG geometry guard: explicit width/height on 26 <use> icon SVGs; replace 15
unsized ::icon:: shortcodes with sized <svg><use> markup.
- Declare required_icon_packs (lucide, simple-icons).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Third remediation pass, superseding the hand-rolled-CSS approach of 0b3013c
now that the host Tailwind build scans theme .ninjatpl files.
Hero blank-on-bare-string fix:
- The four styled-text fields read field.text|default:field, which
HARD-ERRORS when the seed passes a bare string (no .text attribute) and
blanks the whole hero. Switch to field|get:"text"|default:field so the
process-global get filter degrades gracefully on strings.
Layout back to Tailwind (Alex rule: don't reimplement standard utilities):
- Revert the .noir-cols*/.noir-cols-2up*/.noir-split/.noir-gap-*/.noir-hero-pad
class swaps in 15 override templates back to plain grid/gap/padding
utilities (grid-cols-*, gap-*, sm:/md:/lg: variants, py-*), and delete the
matching hand-rolled media-query block from manifest css.input_css_append.
- Hero split now uses grid grid-cols-1 lg:grid-cols-2 with a Tailwind
min-h-80 media frame (guarded so empty seed media does not balloon); the
centered hero uses py-16 md:py-20 lg:py-24 instead of min-h-[75vh], keeping
the dead-vertical-band trim.
Kept from the prior pass: robust .noir-reveal (instant reveal when already in
view + load/1600ms safety nets + no-JS/reduced-motion visible), tightened
section padding, and the genuinely bespoke safety CSS (empty-media img guards,
overflow-wrap, block max-width) — none of which are Tailwind-utility duplicates.
No version bump. make + check-safety both exit 0.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Host Tailwind JIT does not scan theme templates, so responsive grid/hero
utilities (sm:/md:/lg:grid-cols-*, min-h-screen, arbitrary values) are
dropped and multi-column layouts collapse to one column. Ship the
load-bearing responsive layout as compiled theme CSS and point the
override templates at it. Layout only — colours stay on semantic tokens.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Replace the retired .so Makefile with the wasm/.bnp convention (build /
verify / archive-check / publish via ninja plugin build), gitignore *.so
and *.bnp artifacts, and refresh the stale [compatibility] block_core
constraint to the v0.15 era.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Add wasmguest.Serve(Registration) boilerplate and bump block/core to v0.15.2
for the .so->wasm migration. Built + published as .bnp to the dev registry.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Bootstrapped during the 2026-06-06 BlockNinja consolidation. Was previously
an unversioned directory inside ~/src/blockninja-themes/noir.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>