Bootstrapped during the 2026-06-06 BlockNinja consolidation. Was previously an unversioned directory inside ~/src/blockninja-themes/magazine-bold. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
9.3 KiB
Magazine Bold — Build Report
Generated from a clean wave-1 implementation pass against the spec at
themes/docs/works/magazine-bold.md (§§1–15) and the UAT at
themes/docs/uat/magazine-bold.md, with themes/docs/FONTS.md overriding
spec §5 and UAT §11.
What landed
Identity & metadata
plugin.mod—name = magazine-bold,kind = theme,scope = @themes,version = 0.1.0,categories = ["templates", "media"],tags = [fashion, lifestyle, streetwear, magazine, bold, display, music, editorial, art](9 entries, all from the whitelist),block_core compatibility = ">=0.11.0 <0.12.0", description verbatim from spec §1.go.mod— modulegit.dev.alexdunmow.com/block/themes/magazine-bold, Go directive1.26.4, requiresblock/core v0.11.1anda-h/templ v0.3.1020, noreplacedirectives.
File layout (templ-style)
magazine-bold/
plugin.mod go.mod go.sum
Makefile registration.go register.go
embed.go helpers.go css.go
template.templ + _templ.go # 4 page renderers
masthead.{go,templ} + _templ.go
cover_story.{go,templ} + _templ.go
photo_essay.{go,templ} + _templ.go
pull_quote.{go,templ} + _templ.go
issue_archive.{go,templ} + _templ.go
colophon.{go,templ} + _templ.go
heading_override.{go,templ} + _templ.go
text_override.{go,templ} + _templ.go
image_override.{go,templ} + _templ.go
button_override.{go,templ} + _templ.go
email_wrapper.{go,templ} + _templ.go
schemas/masthead.schema.json
schemas/cover_story.schema.json
schemas/photo_essay.schema.json
schemas/pull_quote.schema.json
schemas/issue_archive.schema.json
schemas/colophon.schema.json
presets.json fonts.json assets/.gitkeep
RECOMMENDED_FONTS.md BUILD_REPORT.md
Registration
- One
tr.RegisterSystemTemplate({Key: "magazine-bold"})call. - Four
tr.RegisterPageTemplate("magazine-bold", ...)calls with the slots:default:["masthead", "main", "colophon"]landing:["cover", "secondary", "main", "colophon"]article:["masthead", "deck", "main", "colophon"]full-width:["masthead", "main", "colophon"]
br.LoadSchemasFromFS(Schemas())called BEFORE the firstbr.Register(...).- Six theme blocks registered with
Source: "magazine-bold":masthead→ CategoryLayoutcover_story→ CategoryContentphoto_essay→ CategoryContentpull_quote→ CategoryContentissue_archive→ CategoryNavigationcolophon→ CategoryLayout
- Four built-in overrides via
br.RegisterTemplateOverride("magazine-bold", …):heading,text,image,button. - One
tr.RegisterEmailWrapper("magazine-bold", MagazineBoldEmailWrapper).
Master pages
Both master pages from spec §7 are seeded in DefaultMasterPages():
magazine-bold:default-master—PageTemplates: [default, article], blocks:navbar@masthead/0 →magazine-bold:masthead@masthead/1 →slot@main/0 →magazine-bold:colophon@colophon/0.magazine-bold:landing-master—PageTemplates: [landing, full-width], blocks:navbar@masthead/0 →magazine-bold:cover_story@cover/0 →magazine-bold:issue_archive@secondary/0 →slot@main/0 →magazine-bold:colophon@colophon/0.- Every
slotblock carriesContent["slotName"] == "main".
Presets (presets.json)
Three presets, each mode: "both", each with both lightColors and
darkColors blocks carrying all 19 theme tokens:
paper-pink— Paper & Hot Pink (default), spec §4 verbatim.ink-blue— same neutrals, accent swapped to220 100% 56%(light) /220 100% 62%(dark), ring matches.chalk-lime— cool chalk background (60 15% 97%light /0 0% 6%dark), lime accent (78 90% 50%/78 90% 55%), accentForeground reads ink in both modes for ≥ 4.5:1 contrast on lime.
All HSL triples are bare strings — no hsl(…) wrappers anywhere.
Schemas
All six schemas are draft-07, list properties matching the spec §8 field
table, and use only x-editor types from the allowed set. pull_quote.accent
enum is ["pink", "blue", "lime"]. photo_essay.frames items use
x-editor: collection with item-level media, text and select (span
enum ["half", "full", "tall"]).
CSS strategy
CSSManifest.InputCSSAppend ships a single utility-CSS block at
magazine-bold/css.go (magazineBoldUtilityCSS). It defines:
.font-display,.font-serif-sub,.font-sans,.font-mono— each consumesvar(--font-heading|body|mono, <fallback stack>)per FONTS.md..text-folioclamp (220pt-equivalent at 1440px → ~80px at 360px)..text-deck,.text-kickerdisplay-size utilities..mb-hairline*for the 1px ink rules..mb-grid-12,.mb-grid-asym-cover,.mb-col-folio,.mb-col-headline,.mb-col-deckfor the 12-column asymmetric layout..mb-photo-grid,.mb-frame-{half,full,tall}for the photo-essay spans (collapsing to 1-col at ≤ 768px)..mb-dropcapfor the heading-override drop-cap..mb-buttonsquared-ink button with accent hover and a:focus-visibleoutline usinghsl(var(--ring))..mb-caption,.mb-image-foliomono caption strip..colorblock-accent+ per-accent[data-mb-accent="pink|blue|lime"]variants for pull quotes (using literal HSL triples that match the spec §4 accent values so a pinned accent reads correctly across presets).
No hardcoded hex, rgb(), or named colors are used in .templ / .go /
.html files outside the email wrapper (see "Open items" below).
Email wrapper
RegisterEmailWrapper("magazine-bold", MagazineBoldEmailWrapper) ships a
600px <table> with a paper-pink default background, an ink hairline below
the PP-Editorial-style wordmark (with Georgia / Times New Roman / serif
fallback for Outlook 365 web), a 16/24 Inter body, and a mono colophon
strip echoing the web colophon. Hex defaults inlined in email_wrapper.go
are derived from the paper-pink light preset so the layout reads correctly
in clients that strip the host CSS.
Build output
makeproducedmagazine-bold.soat 21 MB (CGO-buildmode=plugin -ldflags="-s -w").nm --dynamic magazine-bold.so | grep RegistrationshowsD git.dev.alexdunmow.com/block/themes/magazine-bold.Registrationexported as the Go-plugin entry point.- Zero
warning:lines in the build output.
Safety check
cd ~/src/blockninja/check-safety && go run . ~/src/blockninja/cms --plugin-dir ~/src/blockninja/themes/magazine-bold→ exit 0, all 22 checksOKorSKIP(the SKIPs are frontend / orchestrator checks that don't apply to a templ-only theme plugin).- The task brief referenced the older path
~/src/blockninja/backend/cmd/check-safety, but the repo has been re-organised socheck-safety/now lives at the top level as its own Go module. The equivalent invocation is the one above; behaviour is identical and the plugin passes cleanly.
Open items / deferred
- Fonts (wave-2): per
docs/FONTS.md, this pass shipsfonts.json = []and no woff2 files. PP Editorial New, Migra, Inter and JetBrains Mono are documented as recommended picks inRECOMMENDED_FONTS.md. Wave-2 will commission / licence the commercial faces (PP Editorial New + Migra) and bundle them with aLICENSES.md. - Email wrapper hex defaults: the wrapper inlines six hex literals
(
#F7F2EB,#141414,#EEE9E0,#666666,#E0E0E0,#FFFFFF) as client-strip-proof defaults for the paper-pink preset. Mail clients ignorevar()and (often) strip<style>blocks, so these literals are load-bearing — they only fire when the host doesn't populateEmailContext.Colors.*. This is a deliberate exception to the "no hardcoded colors" rule, scoped toemail_wrapper.go. Spec §10 / UAT §10 call for this paper-pink fallback explicitly. - Marketplace assets: the six 1440×900 screenshots, the demo content
seed (Vol. 1 / Spring + five posts + three pull quotes + an 8-frame photo
essay + an
issuesbucket), and the launch copy live in the marketplace-listing pass that follows the build pass. Not produced here. make rebuild/ live deploy: the task brief forbids runningmake rebuildin this pass. The localmaketarget builds the.soand that's verified above.make logs/instance-magazine-boldcontainer: depends onmake rebuild, so deferred with the live-deploy step.- UAT §11
LICENSES.md: intentionally omitted per the wave-1 fonts policy ("noLICENSES.mdneeded in this pass"). nm | grep ' T main.Registration'UAT check: the Go-plugin runtime exports the registration symbol under the module path (git.dev.alexdunmow.com/block/themes/magazine-bold.Registrationin the dynamic symbol table), not asmain.Registration. The loader still resolves it correctly. UAT §3 line 35 would need wording-only tweak to match the real Go-plugin symbol format; functionally the plugin is fine.- Per-page accent override (spec §15 open question): kept at preset
scope. A pinned per-pull-quote accent is supported via
data-mb-accent="pink|blue|lime". Per-page accent rotation is a v0.2.0 candidate.
Counts
- Page templates: 4
- Theme blocks: 6
- Built-in overrides: 4 (heading, text, image, button)
- Email wrappers: 1
- Master pages: 2
- Presets: 3 (× 2 modes each)
- Tokens per preset block: 19