package main import ( "context" "git.dev.alexdunmow.com/block/core/templates/bn" ) // PageData carries the rendered slots and assorted page chrome data passed // from the CMS into a Cyberpunk page template. 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 } // parseCyberpunkPageData converts the loose doc map the renderer is handed into a typed PageData. func parseCyberpunkPageData(doc map[string]any) PageData { title := "Untitled" if t, ok := doc["title"].(string); ok && t != "" { title = t } slots := map[string]string{} if s, ok := doc["slots"].(map[string]string); ok { slots = s } themeCSS, _ := doc["theme_css"].(string) structuredData, _ := doc["structured_data"].(string) cssHash, _ := doc["css_hash"].(string) pageviewNonce, _ := doc["pageview_nonce"].(string) themeMode := "dark" if tm, ok := doc["theme_mode"].(string); ok && tm != "" { themeMode = tm } return PageData{ Title: title, Slots: slots, ThemeMode: themeMode, ThemeCSS: themeCSS, SiteSettings: bn.ParseSiteSettings(doc), PageMeta: bn.ParsePageMeta(doc), StructuredData: structuredData, CSSHash: cssHash, PageviewNonce: pageviewNonce, EngagementConfig: bn.ParseEngagementConfig(doc), } } // scanlineOverlay renders the global scanline overlay element (fixed, pointer-events: none). templ scanlineOverlay() { } // Cyberpunk renders the default page template. templ Cyberpunk(data PageData) { @bn.Head(bn.HeadData{ Title: data.Title, Settings: data.SiteSettings, PageMeta: data.PageMeta, ThemeMode: data.ThemeMode, ThemeCSS: data.ThemeCSS, PluginStyles: []string{"/templates/cyberpunk/css/cyberpunk.css"}, StructuredData: data.StructuredData, CSSHash: data.CSSHash, PageviewNonce: data.PageviewNonce, EngagementConfig: data.EngagementConfig, }) @bn.AdminBypassBanner(data.SiteSettings) @scanlineOverlay()
@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) } // CyberpunkLanding renders the marketing landing template with hero/features/cta/footer slots. templ CyberpunkLanding(data PageData) { @bn.Head(bn.HeadData{ Title: data.Title, Settings: data.SiteSettings, PageMeta: data.PageMeta, ThemeMode: data.ThemeMode, ThemeCSS: data.ThemeCSS, PluginStyles: []string{"/templates/cyberpunk/css/cyberpunk.css"}, StructuredData: data.StructuredData, CSSHash: data.CSSHash, PageviewNonce: data.PageviewNonce, EngagementConfig: data.EngagementConfig, }) @bn.AdminBypassBanner(data.SiteSettings) @scanlineOverlay()
@templ.Raw(data.Slots["hero"])
@templ.Raw(data.Slots["features"])
@templ.Raw(data.Slots["cta"])
@bn.BodyEnd(data.SiteSettings) } // CyberpunkArticle renders the article template with mono-metadata header and a code-friendly aside. templ CyberpunkArticle(data PageData) { @bn.Head(bn.HeadData{ Title: data.Title, Settings: data.SiteSettings, PageMeta: data.PageMeta, ThemeMode: data.ThemeMode, ThemeCSS: data.ThemeCSS, PluginStyles: []string{"/templates/cyberpunk/css/cyberpunk.css"}, StructuredData: data.StructuredData, CSSHash: data.CSSHash, PageviewNonce: data.PageviewNonce, EngagementConfig: data.EngagementConfig, }) @bn.AdminBypassBanner(data.SiteSettings) @scanlineOverlay()
@templ.Raw(data.Slots["header"])
@templ.Raw(data.Slots["main"])
@bn.BodyEnd(data.SiteSettings) } // CyberpunkFullWidth renders the edge-to-edge template (no max-width clamping on main). templ CyberpunkFullWidth(data PageData) { @bn.Head(bn.HeadData{ Title: data.Title, Settings: data.SiteSettings, PageMeta: data.PageMeta, ThemeMode: data.ThemeMode, ThemeCSS: data.ThemeCSS, PluginStyles: []string{"/templates/cyberpunk/css/cyberpunk.css"}, StructuredData: data.StructuredData, CSSHash: data.CSSHash, PageviewNonce: data.PageviewNonce, EngagementConfig: data.EngagementConfig, }) @bn.AdminBypassBanner(data.SiteSettings) @scanlineOverlay()
@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) } // RenderCyberpunk renders the default Cyberpunk page template. func RenderCyberpunk(ctx context.Context, doc map[string]any) templ.Component { return Cyberpunk(parseCyberpunkPageData(doc)) } // RenderCyberpunkLanding renders the Cyberpunk landing page template. func RenderCyberpunkLanding(ctx context.Context, doc map[string]any) templ.Component { return CyberpunkLanding(parseCyberpunkPageData(doc)) } // RenderCyberpunkArticle renders the Cyberpunk article page template. func RenderCyberpunkArticle(ctx context.Context, doc map[string]any) templ.Component { return CyberpunkArticle(parseCyberpunkPageData(doc)) } // RenderCyberpunkFullWidth renders the Cyberpunk full-width page template. func RenderCyberpunkFullWidth(ctx context.Context, doc map[string]any) templ.Component { return CyberpunkFullWidth(parseCyberpunkPageData(doc)) }