117 lines
3.8 KiB
Go
117 lines
3.8 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/a-h/templ"
|
|
|
|
"git.dev.alexdunmow.com/block/core/blocks"
|
|
"git.dev.alexdunmow.com/block/core/plugin"
|
|
"git.dev.alexdunmow.com/block/core/templates"
|
|
)
|
|
|
|
// wrap adapts a templ-returning render function to templates.TemplateFunc.
|
|
// templ.Component already implements templates.HTMLComponent via Render.
|
|
func wrap(f func(ctx context.Context, doc map[string]any) templ.Component) templates.TemplateFunc {
|
|
return func(ctx context.Context, doc map[string]any) templates.HTMLComponent {
|
|
return f(ctx, doc)
|
|
}
|
|
}
|
|
|
|
// Register is the plugin entry point that registers the Gotham template and blocks.
|
|
// Returns an error if template registration fails (e.g., validation failure).
|
|
func Register(tr templates.TemplateRegistry, br blocks.BlockRegistry) error {
|
|
// Register the Gotham system template with metadata
|
|
tr.RegisterSystemTemplate(templates.SystemTemplateMeta{
|
|
Key: "gotham",
|
|
Title: "Gotham",
|
|
Description: "Dark, modern theme with bold typography",
|
|
})
|
|
|
|
// Register page templates for the Gotham system template
|
|
if err := tr.RegisterPageTemplate("gotham", templates.PageTemplateMeta{
|
|
Key: "default",
|
|
Title: "Default",
|
|
Description: "Standard dark page layout with header, main content, and footer",
|
|
Slots: []string{"header", "main", "footer"},
|
|
}, wrap(RenderGotham)); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := tr.RegisterPageTemplate("gotham", templates.PageTemplateMeta{
|
|
Key: "landing",
|
|
Title: "Landing Page",
|
|
Description: "Full-width hero sections, ideal for marketing pages",
|
|
Slots: []string{"hero", "main", "cta", "footer"},
|
|
}, wrap(RenderGothamLanding)); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := tr.RegisterPageTemplate("gotham", templates.PageTemplateMeta{
|
|
Key: "full-width",
|
|
Title: "Full Width",
|
|
Description: "Edge-to-edge content without max-width constraints",
|
|
Slots: []string{"header", "main", "footer"},
|
|
}, wrap(RenderGothamFullWidth)); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := tr.RegisterPageTemplate("gotham", templates.PageTemplateMeta{
|
|
Key: "centered",
|
|
Title: "Centered Content",
|
|
Description: "Narrow, centered content for articles and documentation",
|
|
Slots: []string{"header", "main", "footer"},
|
|
}, wrap(RenderGothamCentered)); err != nil {
|
|
return err
|
|
}
|
|
|
|
// Register Gotham-specific blocks
|
|
br.Register(StatsBlockMeta, StatsBlock)
|
|
br.Register(FeaturesBlockMeta, FeaturesBlock)
|
|
br.Register(FooterBlockMeta, FooterBlock)
|
|
|
|
// Register overrides for built-in blocks when using Gotham template
|
|
br.RegisterTemplateOverride("gotham", "heading", GothamHeadingBlock)
|
|
br.RegisterTemplateOverride("gotham", "text", GothamTextBlock)
|
|
|
|
// Register email wrapper for branded communications
|
|
tr.RegisterEmailWrapper("gotham", GothamEmailWrapper)
|
|
|
|
return nil
|
|
}
|
|
|
|
// DefaultMasterPages returns the default master pages that Gotham provides.
|
|
// These are created automatically when the plugin is first loaded.
|
|
func DefaultMasterPages() []plugin.MasterPageDefinition {
|
|
return []plugin.MasterPageDefinition{
|
|
{
|
|
Key: "gotham:default-master",
|
|
Title: "Gotham Default Master",
|
|
PageTemplates: []string{"default", "centered"},
|
|
Blocks: []plugin.MasterPageBlock{
|
|
{
|
|
BlockKey: "navbar",
|
|
Title: "Main Navigation",
|
|
Content: map[string]any{"menuName": "main"},
|
|
Slot: "header",
|
|
SortOrder: 0,
|
|
},
|
|
{
|
|
BlockKey: "slot",
|
|
Title: "Main Content Slot",
|
|
Content: map[string]any{"slotName": "main", "placeholder": "Page content will appear here"},
|
|
Slot: "main",
|
|
SortOrder: 0,
|
|
},
|
|
{
|
|
BlockKey: "gotham:footer",
|
|
Title: "Site Footer",
|
|
Content: map[string]any{"showSignup": true},
|
|
Slot: "footer",
|
|
SortOrder: 0,
|
|
},
|
|
},
|
|
},
|
|
}
|
|
}
|