Host BundledFonts is inert, so declare the two fonts.json families as
@font-face against /templates/earthen/fonts/*.woff2 and point every preset's
typography.fontHeading/fontBody at template:earthen:<Family> so --font-heading
and --font-body resolve to the bundled faces.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The figure was a flex ROW (flex justify-*), so a figcaption became a second
flex item sitting to the right of the frame. flex-col + items-* keeps the
alignment semantics and puts the caption underneath.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- seed: real Rootline Trust content — no 'example figures' placeholder copy;
home composed as split hero (hands-soil image) + stats + feature-grid +
botanical divider + field note + newsletter; About gap filled with fern
image + impact report between story and pull-quote; first article expanded
to ~10 field-notes paragraphs with inline forest image; 6 Pixabay images
seeded via seed/media (id+file+alt)
- article.ninjatpl: header slot now full-bleed (was max-w-3xl wrapped — the
boxed-header artifact bracketing the nav with vertical rules)
- landing.ninjatpl: main slot full-bleed so composed sections span the page
- SVG geometry guard: every <use>-icon svg now carries explicit width/height
matching its size class (18 files)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Hero blank-band bug (root cause):
- The hero override read styled-text fields as `field.text|default:field`
(eyebrow/headline/subheadline/description). The ninjatpl engine hard-errors
on attribute-access-against-a-bare-string, and the demo seed passes these
fields as bare strings, so the whole hero errored and rendered as an empty
~75vh band on the landing page. Switched to `field|get:"text"|default:field`
— the process-global `get` filter degrades gracefully on a bare string
(returns nothing, so `|default:` falls back to the string) and still reads
`.text` from the admin/editor `{text,color}` object form. Matches the fixed
sibling lanes (terminal, scifi-clean). navbar `cta.text` left as-is: that
field is always a link object, never a bare string (terminal did the same).
Whitespace pass:
- Trimmed oversized marketing section padding py-16 md:py-24 -> py-12 md:py-20
across 15 blocks (cta, feature-grid, pricing, stats, team, testimonial,
timeline, faq, countdown, rich-section, contact-card, contact-form,
event-list, menu-list, hours-location) to remove dead inter-section bands.
Tailwind classes only — the host Tailwind build now scans theme .ninjatpl,
so responsive utilities compile; no duplicate hand-rolled media-query CSS
added.
No new CSS (earthen's manifest CSS is all bespoke aesthetic — nothing
duplicated a utility). No scroll-reveal system exists to harden; the stats
count-up already no-ops under reduced-motion / no-JS and renders final values.
Codeless build OK (earthen@0.2.1). check-safety: 32 checks 19 ok 13 skip -> OK.
No version bump.
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/earthen.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>