npx claudepluginhub maragudk/fabrik --plugin fabrikThis skill uses the workspace's default tool permissions.
gomponents is a pure Go HTML component library that treats HTML elements as composable Go values. Everything is built on the `Node` interface, making HTML construction type-safe and composable.
Guides Next.js Cache Components and Partial Prerendering (PPR): 'use cache' directives, cacheLife(), cacheTag(), revalidateTag() for caching, invalidation, static/dynamic optimization. Auto-activates on cacheComponents: true.
Processes PDFs: extracts text/tables/images, merges/splits/rotates pages, adds watermarks, creates/fills forms, encrypts/decrypts, OCRs scans. Activates on PDF mentions or output requests.
Share bugs, ideas, or general feedback.
gomponents is a pure Go HTML component library that treats HTML elements as composable Go values. Everything is built on the Node interface, making HTML construction type-safe and composable.
Use this skill when:
Everything in gomponents implements the Node interface:
type Node interface {
Render(w io.Writer) error
}
El(name string, children ...Node) - Create custom HTML elementsAttr(name string, value ...string) - Create custom attributesMost standard HTML5 elements and attributes are available as functions in the html package:
Div(), Span(), P(), A(), etc.Class(), ID(), Href(), Src(), etc.Note: nil Nodes are ignored during rendering, so it's safe to pass nil nodes to elements.
Text(string) - HTML-escaped text contentTextf(format string, args...) - Formatted, escaped textRaw(string) - Unescaped HTMLRawf(format string, args...) - Formatted, unescaped contentGroup([]Node) - Combine multiple nodesMap[T]([]T, func(T) Node) - Transform slices into node sequencesIf(condition bool, node Node) - Conditional renderingIff(condition bool, func() Node) - Lazy conditional rendering (deferred evaluation)Contrary to common Go idioms, dot imports are recommended for gomponents to achieve DSL-like syntax:
import (
. "maragu.dev/gomponents"
. "maragu.dev/gomponents/html"
. "maragu.dev/gomponents/components"
)
This allows writing clean, HTML-like code:
Div(Class("container"),
H1(Text("Hello World")),
P(Text("Welcome to gomponents")),
)
maragu.dev/gomponents - Core interface and helper functionsmaragu.dev/gomponents/html - All HTML5 elements and attributesmaragu.dev/gomponents/http - HTTP helpers for rendering components as responsesmaragu.dev/gomponents/components - Higher-level utilities (HTML5 document structure, dynamic classes)func UserCard(name, email string) Node {
return Div(Class("user-card"),
H2(Text(name)),
P(Text(email)),
)
}
func Alert(message string, isError bool) Node {
return Div(
If(isError, Class("error")),
If(!isError, Class("info")),
P(Text(message)),
)
}
Use If when the node is always safe to evaluate. Use Iff when the node might be nil and shouldn't be evaluated unless the condition is true.
func UserProfile(user *User) Node {
return Div(
H1(Text(user.Name)),
// Use Iff to avoid nil pointer dereference when user.Avatar is nil
Iff(user.Avatar != nil, func() Node {
return Img(Src(user.Avatar.URL))
}),
)
}
Use Group to group multiple nodes without wrapping them in a parent element:
func FormFields(required bool) Node {
return Group{
Label(For("email"), Text("Email")),
Input(Type("email"), ID("email")),
If(required, Span(Class("required"), Text("*"))),
}
}
func TodoList(todos []Todo) Node {
return Ul(Class("todo-list"),
Map(todos, func(t Todo) Node {
return Li(Text(t.Title))
}),
)
}
func Page(title string, body Node) Node {
return HTML5(HTML5Props{
Title: title,
Language: "en",
Head: []Node{
Link(Rel("stylesheet"), Href("/styles.css")),
},
Body: []Node{body},
})
}
import ghttp "maragu.dev/gomponents/http"
func HomeHandler(w http.ResponseWriter, r *http.Request) (Node, error) {
return Page("My App",
Div(Class("container"),
H1(Text("Hello, World!")),
),
), nil
}
// In main:
http.HandleFunc("/", ghttp.Adapt(HomeHandler))
The http package provides:
Handler type - function signature that returns (Node, error)Adapt(Handler) - converts Handler to http.HandlerFuncStatusCode() int interface