# Architecture `go-html` is an HLCRF DOM compositor with grammar pipeline integration. It provides a pure-Go, type-safe HTML rendering library designed for server-side generation with an optional lightweight WASM client module. Module path: `forge.lthn.ai/core/go-html` ## Node Interface All renderable units implement a single interface: ```go type Node interface { Render(ctx *Context) string } ``` Every node type is a private struct with a public constructor. The API surface is intentionally small: nine public constructors plus `Attr()` and `Render()` helpers. | Constructor | Description | |-------------|-------------| | `El(tag, ...Node)` | HTML element with children | | `Attr(Node, key, value)` | Set attribute on an El node; chainable | | `Text(key, ...any)` | Translated, HTML-escaped text via go-i18n | | `Raw(content)` | Unescaped trusted content | | `If(cond, Node)` | Conditional render | | `Unless(cond, Node)` | Inverse conditional render | | `Each[T](items, fn)` | Type-safe iteration with generics | | `Switch(selector, cases)` | Runtime dispatch to named cases | | `Entitled(feature, Node)` | Entitlement-gated render; deny-by-default | ### Safety guarantees - `Text` nodes are always HTML-escaped. XSS via user-supplied strings fed through `Text()` is not possible. - `Raw` is an explicit escape hatch for trusted content only. Its name signals intent. - `Entitled` returns an empty string when no entitlement function is set on the context. Access is denied by default, not granted. - `El` attributes are sorted alphabetically before output, producing deterministic HTML regardless of insertion order. - Void elements (`br`, `img`, `input`, etc.) never emit a closing tag. ## HLCRF Layout The `Layout` type is a compositor for five named slots: **H**eader, **L**eft, **C**ontent, **R**ight, **F**ooter. Each slot maps to a specific semantic HTML element and ARIA role: | Slot | Element | ARIA role | |------|---------|-----------| | H | `
` | `banner` | | L | `