feat: add working prototype for via

This commit is contained in:
Joao Goncalves
2025-10-31 00:58:53 -01:00
parent d15af60a1d
commit eb20a2a0a9
13 changed files with 1330 additions and 0 deletions

32
h/attributes.go Normal file
View File

@@ -0,0 +1,32 @@
package h
import gh "maragu.dev/gomponents/html"
func Href(v string) H {
return gh.Href(v)
}
func Type(v string) H {
return gh.Type(v)
}
func Src(v string) H {
return gh.Src(v)
}
func ID(v string) H {
return gh.ID(v)
}
func Value(v string) H {
return gh.Value(v)
}
func Placeholder(v string) H {
return gh.Placeholder(v)
}
// Data attributes automatically have their name prefixed with "data-".
func Data(name, v string) H {
return gh.Data(name, v)
}

9
h/datastar.go Normal file
View File

@@ -0,0 +1,9 @@
package h
import "fmt"
type OnClickOpts string
func OnClick(actionid string, opt ...OnClickOpts) H {
return Data("on:click", fmt.Sprintf("@get('/_action/%s')", actionid))
}

401
h/elements.go Normal file
View File

@@ -0,0 +1,401 @@
package h
import (
gh "maragu.dev/gomponents/html"
)
func A(children ...H) H {
return gh.A(retype(children)...)
}
func Abbr(children ...H) H {
return gh.Abbr(retype(children)...)
}
func Address(children ...H) H {
return gh.Address(retype(children)...)
}
func Area(children ...H) H {
return gh.Area(retype(children)...)
}
func Article(children ...H) H {
return gh.Article(retype(children)...)
}
func Aside(children ...H) H {
return gh.Aside(retype(children)...)
}
func Audio(children ...H) H {
return gh.Audio(retype(children)...)
}
func B(children ...H) H {
return gh.B(retype(children)...)
}
func Base(children ...H) H {
return gh.Base(retype(children)...)
}
func BlockQuote(children ...H) H {
return gh.BlockQuote(retype(children)...)
}
func Body(children ...H) H {
return gh.Body(retype(children)...)
}
func Br(children ...H) H {
return gh.Br(retype(children)...)
}
func Button(children ...H) H {
return gh.Button(retype(children)...)
}
func Canvas(children ...H) H {
return gh.Canvas(retype(children)...)
}
func Caption(children ...H) H {
return gh.Caption(retype(children)...)
}
func Cite(children ...H) H {
return gh.Cite(retype(children)...)
}
func Code(children ...H) H {
return gh.Code(retype(children)...)
}
func Col(children ...H) H {
return gh.Col(retype(children)...)
}
func ColGroup(children ...H) H {
return gh.ColGroup(retype(children)...)
}
func DataList(children ...H) H {
return gh.DataList(retype(children)...)
}
func Dd(children ...H) H {
return gh.Dd(retype(children)...)
}
func Del(children ...H) H {
return gh.Del(retype(children)...)
}
func Details(children ...H) H {
return gh.Details(retype(children)...)
}
func Dfn(children ...H) H {
return gh.Dfn(retype(children)...)
}
func Dialog(children ...H) H {
return gh.Dialog(retype(children)...)
}
func Div(children ...H) H {
return gh.Div(retype(children)...)
}
func Dl(children ...H) H {
return gh.Dl(retype(children)...)
}
func Dt(children ...H) H {
return gh.Dt(retype(children)...)
}
func Em(children ...H) H {
return gh.Em(retype(children)...)
}
func Embed(children ...H) H {
return gh.Embed(retype(children)...)
}
func FieldSet(children ...H) H {
return gh.FieldSet(retype(children)...)
}
func FigCaption(children ...H) H {
return gh.FigCaption(retype(children)...)
}
func Figure(children ...H) H {
return gh.Figure(retype(children)...)
}
func Footer(children ...H) H {
return gh.Footer(retype(children)...)
}
func Form(children ...H) H {
return gh.Form(retype(children)...)
}
func H1(children ...H) H {
return gh.H1(retype(children)...)
}
func H2(children ...H) H {
return gh.H2(retype(children)...)
}
func H3(children ...H) H {
return gh.H3(retype(children)...)
}
func H4(children ...H) H {
return gh.H4(retype(children)...)
}
func H5(children ...H) H {
return gh.H5(retype(children)...)
}
func H6(children ...H) H {
return gh.H6(retype(children)...)
}
func Head(children ...H) H {
return gh.Head(retype(children)...)
}
func Header(children ...H) H {
return gh.Header(retype(children)...)
}
func Hr(children ...H) H {
return gh.Hr(retype(children)...)
}
func HTML(children ...H) H {
return gh.HTML(retype(children)...)
}
func I(children ...H) H {
return gh.I(retype(children)...)
}
func IFrame(children ...H) H {
return gh.IFrame(retype(children)...)
}
func Img(children ...H) H {
return gh.Img(retype(children)...)
}
func Input(children ...H) H {
return gh.Input(retype(children)...)
}
func Ins(children ...H) H {
return gh.Ins(retype(children)...)
}
func Kbd(children ...H) H {
return gh.Kbd(retype(children)...)
}
func Label(children ...H) H {
return gh.Label(retype(children)...)
}
func Legend(children ...H) H {
return gh.Legend(retype(children)...)
}
func Li(children ...H) H {
return gh.Li(retype(children)...)
}
func Link(children ...H) H {
return gh.Link(retype(children)...)
}
func Main(children ...H) H {
return gh.Main(retype(children)...)
}
func Mark(children ...H) H {
return gh.Mark(retype(children)...)
}
func Meta(children ...H) H {
return gh.Meta(retype(children)...)
}
func Meter(children ...H) H {
return gh.Meter(retype(children)...)
}
func Nav(children ...H) H {
return gh.Nav(retype(children)...)
}
func NoScript(children ...H) H {
return gh.NoScript(retype(children)...)
}
func Object(children ...H) H {
return gh.Object(retype(children)...)
}
func Ol(children ...H) H {
return gh.Ol(retype(children)...)
}
func OptGroup(children ...H) H {
return gh.OptGroup(retype(children)...)
}
func Option(children ...H) H {
return gh.Option(retype(children)...)
}
func P(children ...H) H {
return gh.P(retype(children)...)
}
func Picture(children ...H) H {
return gh.Picture(retype(children)...)
}
func Pre(children ...H) H {
return gh.Pre(retype(children)...)
}
func Progress(children ...H) H {
return gh.Progress(retype(children)...)
}
func Q(children ...H) H {
return gh.Q(retype(children)...)
}
func S(children ...H) H {
return gh.S(retype(children)...)
}
func Samp(children ...H) H {
return gh.Samp(retype(children)...)
}
func Script(children ...H) H {
return gh.Script(retype(children)...)
}
func Section(children ...H) H {
return gh.Section(retype(children)...)
}
func Select(children ...H) H {
return gh.Select(retype(children)...)
}
func Small(children ...H) H {
return gh.Small(retype(children)...)
}
func Source(children ...H) H {
return gh.Source(retype(children)...)
}
func Span(children ...H) H {
return gh.Span(retype(children)...)
}
func Strong(children ...H) H {
return gh.Strong(retype(children)...)
}
func Style(v string) H {
return gh.Style(v)
}
func Sub(children ...H) H {
return gh.Sub(retype(children)...)
}
func Summary(children ...H) H {
return gh.Summary(retype(children)...)
}
func Sup(children ...H) H {
return gh.Sup(retype(children)...)
}
func Table(children ...H) H {
return gh.Table(retype(children)...)
}
func TBody(children ...H) H {
return gh.TBody(retype(children)...)
}
func Td(children ...H) H {
return gh.Td(retype(children)...)
}
func Template(children ...H) H {
return gh.Template(retype(children)...)
}
func Textarea(children ...H) H {
return gh.Textarea(retype(children)...)
}
func TFoot(children ...H) H {
return gh.TFoot(retype(children)...)
}
func Th(children ...H) H {
return gh.Th(retype(children)...)
}
func THead(children ...H) H {
return gh.THead(retype(children)...)
}
func Time(children ...H) H {
return gh.Time(retype(children)...)
}
func Title(v string) H {
return gh.Title(v)
}
func Tr(children ...H) H {
return gh.Tr(retype(children)...)
}
func U(children ...H) H {
return gh.U(retype(children)...)
}
func Ul(children ...H) H {
return gh.Ul(retype(children)...)
}
func Var(children ...H) H {
return gh.Var(retype(children)...)
}
func Video(children ...H) H {
return gh.Video(retype(children)...)
}
func Wbr(children ...H) H {
return gh.Wbr(retype(children)...)
}

78
h/h.go Normal file
View File

@@ -0,0 +1,78 @@
// Package h provides a Go-native DSL for HTML composition.
// Every element, attribute, and text node is constructed as a function that returns a [h.H] DOM node.
//
// Example:
//
// h.Div(
// h.H1(h.Text("Hello, Via")),
// h.P(h.Text("Pure Go. No tmplates.")),
// )
package h
import (
"io"
g "maragu.dev/gomponents"
gc "maragu.dev/gomponents/components"
)
// H represents a DOM node.
type H interface {
Render(w io.Writer) error
}
// Text creates a text DOM node that Renders the escaped string t.
func Text(t string) H {
return g.Text(t)
}
// Textf creates a text DOM node that Renders the interpolated and escaped string format.
func Textf(format string, a ...any) H {
return g.Textf(format, a...)
}
// / Raw creates a text DOM [Node] that just Renders the unescaped string t.
func Raw(s string) H {
return g.Raw(s)
}
// Attr creates an attribute DOM [Node] with a name and optional value.
// If only a name is passed, it's a name-only (boolean) attribute (like "required").
// If a name and value are passed, it's a name-value attribute (like `class="header"`).
// More than one value make [Attr] panic.
// Use this if no convenience creator exists in the h package.
func Attr(name string, value ...string) H {
return g.Attr(name, value...)
}
// HTML5Props defines properties for HTML5 pages. Title is set always set, Description
// and Language elements only if the strings are non-empty.
type HTML5Props struct {
Title string
Description string
Language string
Head []H
Body []H
HTMLAttrs []H
}
// HTML5 document template.
func HTML5(p HTML5Props) H {
gp := gc.HTML5Props{
Title: p.Title,
Description: p.Description,
Language: p.Language,
Head: retype(p.Head),
Body: retype(p.Body),
HTMLAttrs: retype(p.HTMLAttrs),
}
gp.Head = append(gp.Head, Script(Type("module"), Src("/_datastar.js")))
return gc.HTML5(gp)
}
// JoinAttrs with the given name only on the first level of the given nodes. This means that
// attributes on non-direct descendants are ignored. Attribute values are joined by spaces.
//
// Note that this renders all first-level attributes to check whether they should be processed.
func JoinAttrs(name string, children ...H) H {
return gc.JoinAttrs(name, retype(children)...)
}

13
h/util.go Normal file
View File

@@ -0,0 +1,13 @@
package h
import (
g "maragu.dev/gomponents"
)
func retype(nodes []H) []g.Node {
list := make([]g.Node, len(nodes))
for i, node := range nodes {
list[i] = node.(g.Node)
}
return list
}