Try HTML components in pure Go.
gomponents are HTML components written in pure Go. They render to HTML 5, and make it easy for you to build reusable components. So you can focus on building your app instead of learning yet another templating language.
go get maragu.dev/gomponentsMade with ✨sparkles✨ by maragu.
Does your company depend on this project? Contact me at markus@maragu.dk to discuss options for a one-time or recurring invoice to ensure its continued thriving.
Check out www.gomponents.com for an introduction.
- Build reusable HTML components
- Write declarative HTML 5 in Go without all the strings, so you get
- Type safety from the compiler
- Auto-completion from the IDE
- Easy debugging with the standard Go debugger
- Automatic formatting with
gofmt/goimports
- Simple API that's easy to learn and use (you know most already if you know HTML)
- Useful helpers like
TextandTextfthat insert HTML-escaped text,RawandRawffor inserting raw strings,Mapfor mapping data to components andGroupfor grouping components,- and
If/Ifffor conditional rendering.
- No external dependencies
- Mature and stable, no breaking changes
go get maragu.dev/gomponentspackage main
import (
. "maragu.dev/gomponents"
. "maragu.dev/gomponents/components"
. "maragu.dev/gomponents/html"
)
func Navbar(authenticated bool, currentPath string) Node {
return Nav(
NavbarLink("/", "Home", currentPath),
NavbarLink("/about", "About", currentPath),
If(authenticated, NavbarLink("/profile", "Profile", currentPath)),
)
}
func NavbarLink(href, name, currentPath string) Node {
return A(Href(href), Classes{"is-active": currentPath == href}, g.Text(name))
}(Some people don't like dot-imports, and luckily it's completely optional.)
For a more complete example, see the examples directory. There's also the gomponents-starter-kit for a full application template.
Unfortunately, there are some name clashes in HTML elements and attributes, so they need an El or Attr suffix,
to be able to co-exist in the same package in Go.
I've chosen one or the other based on what I think is the common usage. In either case, the less-used variant also exists in the codebase:
cite(Cite/CiteAttr,CiteElalso exists)data(DataEl/Data,DataAttralso exists)form(Form/FormAttr,FormElalso exists)label(Label/LabelAttr,LabelElalso exists)style(StyleEl/Style,StyleAttralso exists)title(TitleEl/Title,TitleAttralso exists)
