Bootstrapped during the 2026-06-06 BlockNinja consolidation. Was previously an unversioned directory inside ~/src/blockninja-themes/kindergarten. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
7.3 KiB
7.3 KiB
Kindergarten — BUILD_REPORT
Build pass: wave-1 implementation against spec
themes/docs/works/kindergarten.md and gating UAT
themes/docs/uat/kindergarten.md, with fonts policy overridden by
themes/docs/FONTS.md.
What landed
Plugin metadata
plugin.modmirrors spec §2 verbatim (kind=theme,scope=@themes,categories=["templates"], 9 tags including the literal-requiredkids,education,playful,family,school, compatibility pinblock_core=">=0.11.0 <0.12.0",version=0.1.0).go.modpinsgit.dev.alexdunmow.com/block/core v0.11.1and Go 1.26.4; noreplacedirectives; matches the SDK pin used bycms/backend/go.mod.
Registration surface
var Registration plugin.PluginRegistrationexported inregistration.go.Register(tr, br):tr.RegisterSystemTemplate("kindergarten", ...)- 4 page templates:
default,landing,article,full-widthwith the exact slot tuples from spec §6. br.LoadSchemasFromFS(Schemas())called before anybr.Register(...).- 8 theme blocks registered:
mascot_hero,alphabet_strip,schedule,gallery_of_art,numbers_counter,storybook_quote,big_cta,footer(all withSource: "kindergarten"). - 4 built-in overrides (
heading,text,button,card) registered against template key"kindergarten". - Email wrapper registered via
tr.RegisterEmailWrapper("kindergarten", ...).
DefaultMasterPages()ships bothkindergarten:default-master(used bydefault+article) andkindergarten:landing-master(used bylanding+full-width), with the block ordering from spec §7.
Schemas
- All 8 schemas live under
schemas/and declare"$schema": "http://json-schema.org/draft-07/schema#". Every JSON property matches the correspondingcontent[...]key in the Go renderers; allx-editorvalues come from the allowed set (text, richtext, media, color, select, number, slug, textarea, array, collection, link).
Presets
presets.jsonis a JSON array of length 3, orderedrecess,chalkboard,crayon-box. Every token value matches^[0-9]+ [0-9]+% [0-9]+%$(HSL triple, nohsl()wrappers). All 19 tokens present per preset:recess→ modelight, exposeslightColorsonly.chalkboard→ modedark, exposesdarkColorsonly.crayon-box→ modeboth, exposes bothlightColorsanddarkColors.
Fonts
fonts.json = []per the wave-1 fonts policy (themes/docs/FONTS.md).- No woff2 bundled.
RECOMMENDED_FONTS.mdat the theme root lists Quicksand (heading), Nunito (body), Fira Code (mono), and Sniglet (alt display) as Google Fonts picker recommendations.- Theme CSS goes through
var(--font-heading | --font-body | --font-mono)with explicit fallback stacks so the type system stays close to the intended aesthetic until the admin makes a choice.
CSS strategy
assets/style.cssis registered into the host Tailwind input viaCSSManifest.InputCSSAppend(seeembed.go::ThemeCSSManifest).- Custom utilities cover crayon underline (
.kg-crayon-underline), the dotted-paper background layer (.kg-dotted-paper), the sticker drop-shadow on pills (box-shadow: 0 4px 0 0 …), polaroid frames for the gallery, the numeral badge (.kg-numeral { border-radius: 50%; aspect-ratio: 1 / 1; }), and the schedule time-pill. - No hardcoded hex /
rgb()/ named colors in any.templor.go; all color references arehsl(var(--<token>))against the 19-token CSS variables. (Check 6 incheck-safetyconfirms this.)
Build output
$ cd /home/alex/src/blockninja/themes/kindergarten
$ /home/alex/go/bin/templ generate
(✓) Complete [ updates=14 ]
$ make
CGO_ENABLED=1 go build -buildmode=plugin -ldflags="-s -w" -o kindergarten.so .
$ ls -lh kindergarten.so
-rw-rw-r-- 1 alex alex 21M Jun 6 13:24 kindergarten.so
Build succeeded; no warning: / WARN lines on stdout.
Safety check
$ cd /home/alex/src/blockninja/check-safety
$ go run . /home/alex/src/blockninja/themes/kindergarten
... 22 checks ...
exit 0
Notes:
- The task brief referenced
cd /home/alex/src/blockninja/backend && go run ./cmd/check-safety . --plugin-dir ../themes/kindergarten. That path layout does not match this workspace;check-safetylives in/home/alex/src/blockninja/check-safetyas a standalone module. The invocation above is the actual run that exits 0. - Check 2e ("warn on
any") flags 32 informational warnings onmap[string]anyparameters in block render functions. The plugin SDK'sBlockFuncsignature isfunc(ctx, content map[string]any) string— theseanys are mandated by the SDK contract; warnings are not failures and gotham trips the same ones.
Open items / deferred
| Item | Status | Notes |
|---|---|---|
| Bundled woff2 fonts | Deferred | Wave-1 policy: ship fonts.json = [] and rely on admin Google Fonts picker. RECOMMENDED_FONTS.md lists the four recommended families. |
| LICENSES.md | Deferred | Only required when bundling woff2s. Wave-2 follow-up. |
| Real mascot SVG (Pip) | Deferred | The mascot renderer ships four primitive SVG variants (pip, blocks, star, balloon). Replace with illustrated Pip in v0.2 per spec §15. |
make rebuild (live-container deploy) |
Out of scope | Explicitly disabled in the brief. The Makefile only carries all (build .so), clean, and templ. |
| Marketplace screenshots (1440×900 × 6) | Deferred | No live container available in this pass; capture during v0.1.0 launch sprint. |
| Seed demo content | Deferred | Mascot image + sample posts to be staged when a dev container is available. |
| Email-client smoke testing (Gmail / Apple Mail / Outlook 365) | Deferred | Wrapper code shipped; visual verification needs Litmus/Mailbox access. |
| Accessibility contrast audit | Deferred | Theme tokens follow spec §4 values; an automated audit needs a running site. |
wave-2 Sniglet/Fira Code Rounded bundling |
Deferred | See themes/docs/FONTS.md, last section. |
Files produced
kindergarten/
BUILD_REPORT.md ← this file
Makefile ← local-only build helpers
README.md (not created — not requested)
RECOMMENDED_FONTS.md
assets/style.css ← injected via CSSManifest.InputCSSAppend
embed.go
fonts.json ← literal "[]"
go.mod / go.sum
plugin.mod
presets.json ← 3 presets, 19 tokens each
register.go ← system template + 4 page templates + 8 blocks + 4 overrides + email wrapper
registration.go ← var Registration plugin.PluginRegistration
schemas/{8 block schemas}.schema.json
helpers.go
template.templ + template_templ.go (4 page templates)
email_wrapper.{go,templ,_templ.go}
mascot_hero.{go,templ,_templ.go}
alphabet_strip.{go,templ,_templ.go}
schedule.{go,templ,_templ.go}
gallery_of_art.{go,templ,_templ.go}
numbers_counter.{go,templ,_templ.go}
storybook_quote.{go,templ,_templ.go}
big_cta.{go,templ,_templ.go}
footer.{go,templ,_templ.go}
heading_override.{go,templ,_templ.go} (built-in override)
text_override.{go,templ,_templ.go} (built-in override)
button_override.{go,templ,_templ.go} (built-in override)
card_override.{go,templ,_templ.go} (built-in override)
kindergarten.so ← compiled output (21 MB)