package main import ( "context" "git.dev.alexdunmow.com/block/core/templates/bn" ) // PageData holds the values lifted out of the render `doc` map for the // four Sci-Fi Clean page templates. type PageData struct { Title string Slots map[string]string ThemeMode string ThemeCSS string SiteSettings bn.SiteSettingsData PageMeta bn.PageMeta StructuredData string CSSHash string PageviewNonce string EngagementConfig bn.EngagementConfig } // parseScifiPageData lifts the well-known keys out of the inbound doc map. // Unknown keys (e.g. block content) are ignored by the page renderers. func parseScifiPageData(doc map[string]any) PageData { title := "Untitled" if t, ok := doc["title"].(string); ok { title = t } slots := make(map[string]string) if s, ok := doc["slots"].(map[string]string); ok { slots = s } themeCSS := "" if tc, ok := doc["theme_css"].(string); ok { themeCSS = tc } structuredData := "" if sd, ok := doc["structured_data"].(string); ok { structuredData = sd } cssHash := "" if ch, ok := doc["css_hash"].(string); ok { cssHash = ch } pageviewNonce := "" if pn, ok := doc["pageview_nonce"].(string); ok { pageviewNonce = pn } themeMode := "light" if tm, ok := doc["theme_mode"].(string); ok && tm != "" { themeMode = tm } siteSettings := bn.ParseSiteSettings(doc) pageMeta := bn.ParsePageMeta(doc) engagementConfig := bn.ParseEngagementConfig(doc) return PageData{ Title: title, Slots: slots, ThemeMode: themeMode, ThemeCSS: themeCSS, SiteSettings: siteSettings, PageMeta: pageMeta, StructuredData: structuredData, CSSHash: cssHash, PageviewNonce: pageviewNonce, EngagementConfig: engagementConfig, } } // htmlClassForMode returns the root class for the current theme mode. func htmlClassForMode(mode string) string { if mode == "dark" { return "dark" } return "" } // ===== Default template (header / main / footer) ===== templ ScifiClean(data PageData) { @bn.Head(bn.HeadData{ Title: data.Title, Settings: data.SiteSettings, PageMeta: data.PageMeta, ThemeMode: data.ThemeMode, ThemeCSS: data.ThemeCSS, PluginStyles: []string{}, StructuredData: data.StructuredData, CSSHash: data.CSSHash, PageviewNonce: data.PageviewNonce, EngagementConfig: data.EngagementConfig, }) @bn.AdminBypassBanner(data.SiteSettings)
@templ.Raw(data.Slots["header"])
if main, ok := data.Slots["main"]; ok && main != "" { @templ.Raw(main) } else {
No content blocks assigned to this page.
}
@bn.BodyEnd(data.SiteSettings) } // ===== Landing template (hero / specs / main / cta / footer) ===== templ ScifiCleanLanding(data PageData) { @bn.Head(bn.HeadData{ Title: data.Title, Settings: data.SiteSettings, PageMeta: data.PageMeta, ThemeMode: data.ThemeMode, ThemeCSS: data.ThemeCSS, PluginStyles: []string{}, StructuredData: data.StructuredData, CSSHash: data.CSSHash, PageviewNonce: data.PageviewNonce, EngagementConfig: data.EngagementConfig, }) @bn.AdminBypassBanner(data.SiteSettings)
@templ.Raw(data.Slots["hero"])
if specs, ok := data.Slots["specs"]; ok && specs != "" {
@templ.Raw(specs)
}
if main, ok := data.Slots["main"]; ok && main != "" {
@templ.Raw(main)
}
if cta, ok := data.Slots["cta"]; ok && cta != "" {
@templ.Raw(cta)
} @bn.BodyEnd(data.SiteSettings) } // ===== Article template (header / rail / main / footer) ===== templ ScifiCleanArticle(data PageData) { @bn.Head(bn.HeadData{ Title: data.Title, Settings: data.SiteSettings, PageMeta: data.PageMeta, ThemeMode: data.ThemeMode, ThemeCSS: data.ThemeCSS, PluginStyles: []string{}, StructuredData: data.StructuredData, CSSHash: data.CSSHash, PageviewNonce: data.PageviewNonce, EngagementConfig: data.EngagementConfig, }) @bn.AdminBypassBanner(data.SiteSettings)
@templ.Raw(data.Slots["header"])
if rail, ok := data.Slots["rail"]; ok && rail != "" { }
if main, ok := data.Slots["main"]; ok && main != "" { @templ.Raw(main) } else {

No article body.

}
@bn.BodyEnd(data.SiteSettings) } // ===== Full-width template (header / main / footer) ===== templ ScifiCleanFullWidth(data PageData) { @bn.Head(bn.HeadData{ Title: data.Title, Settings: data.SiteSettings, PageMeta: data.PageMeta, ThemeMode: data.ThemeMode, ThemeCSS: data.ThemeCSS, PluginStyles: []string{}, StructuredData: data.StructuredData, CSSHash: data.CSSHash, PageviewNonce: data.PageviewNonce, EngagementConfig: data.EngagementConfig, }) @bn.AdminBypassBanner(data.SiteSettings)
@templ.Raw(data.Slots["header"])
if main, ok := data.Slots["main"]; ok && main != "" { @templ.Raw(main) } else {
No content blocks assigned to this page.
}
@bn.BodyEnd(data.SiteSettings) } // ===== Render entry points (adapted by wrap() in register.go) ===== func RenderScifiClean(ctx context.Context, doc map[string]any) templ.Component { return ScifiClean(parseScifiPageData(doc)) } func RenderScifiCleanLanding(ctx context.Context, doc map[string]any) templ.Component { return ScifiCleanLanding(parseScifiPageData(doc)) } func RenderScifiCleanArticle(ctx context.Context, doc map[string]any) templ.Component { return ScifiCleanArticle(parseScifiPageData(doc)) } func RenderScifiCleanFullWidth(ctx context.Context, doc map[string]any) templ.Component { return ScifiCleanFullWidth(parseScifiPageData(doc)) }