Skip to content

Learn gsx ​

These seven patterns cover the normal authoring model.

1. A component is Go plus markup ​

Declare a component in a .gsx file, then write its HTML directly in the body.

gsx
package views

component Greeting(name string) {
	<p>Hello, {name}</p>
}

Code inside { ... } is an ordinary Go expression. Its output is escaped for the surrounding HTML context; see Escaping.

2. Inputs are typed ​

Declare inputs as Go parameters and pass them as component attributes. The authored parameter list is also the generated Go function signature.

gsx
component Meter(value int) {
	<meter min={0} max={100} value={value}>{value}%</meter>
}

component Dashboard() {
	<Meter value={72} />
}

Go reports invalid input names or values at build time.

3. Components compose with children ​

Declare children gsx.Node, then use {children} where a component should render its nested content.

gsx
import "github.com/gsxhq/gsx"

component Panel(title string, children gsx.Node) {
	<section class="panel">
		<h2>{title}</h2>
		<div>{children}</div>
	</section>
}

component Home() {
	<Panel title="Dashboard">
		<p>Welcome back.</p>
	</Panel>
}

See Composition for slots, generics, and forwarding.

4. Attributes are explicit ​

Write static values like HTML and dynamic values as Go expressions.

gsx
component SaveButton(label string, disabled bool) {
	<button type="submit" disabled={disabled}>{label}</button>
}

Boolean attributes are omitted when their value is false. See Attributes for conditionals, spreads, and merge order.

5. Style and script stay close to HTML ​

Put component-specific CSS and JavaScript beside the markup that uses them.

gsx
component Notice(message string) {
	<p class="notice">{message}</p>
	<style>
		.notice { padding: 0.75rem; border: 1px solid #ccc; }
	</style>
	<script>
		console.log("notice mounted")
	</script>
}

See Styling and JavaScript for their interpolation rules.

6. Markup can be a value ​

Bind markup to a package-level var and it infers as gsx.Node — reuse it across components without a wrapper. A fragment (<>…</>) groups sibling nodes with no surrounding element.

gsx
package views

var footer = <><hr/><small>Built with gsx</small></>

component Page(children gsx.Node) {
	<main>{children}</main>
	{footer}
}

See Fragments for more.

7. Save and reload ​

Run the development server once:

sh
gsx dev

In the starter, npm run dev wraps the same command and also starts Vite.

Save a .gsx file and gsx regenerates it, rebuilds the server, and reloads the browser. Errors appear in the browser while you fix them.

Next steps ​