//go:build js && wasm // Command wasm is the client entry point: it wires client capabilities into the // (generated) routes, then hydrates the server-rendered DOM or renders fresh. package main import ( "kjolweb/app" "kjol/vdom" "kjol/wasmruntime" ) func main() { // (The client transport for httputil.FetchGob / FetchJSON needs no wiring — // importing wasmruntime installs it. On the server it stays nil, so those // fetches no-op during SSR and the page ships its loading state.) // // Collect the signals created during setup so their values can be preserved // across an in-place hot swap. On a normal load RestoreState is nil (fresh // state); after a dev hot-reload it carries the previous instance's values, // which NewSignal restores by creation order. collector := vdom.BeginCollect(wasmruntime.RestoreState()) router := wasmruntime.NewRouter() deps := app.Deps{Path: router.Path, Navigate: router.Navigate} routes := app.Routes(deps) vdom.EndCollect() // signals created later (during renders) aren't preserved wasmruntime.PreserveState(collector) render := func() *vdom.VNode { return app.Shell(deps, routes) } if wasmruntime.HasServerContent() { wasmruntime.Hydrate(render) // static route: adopt the server-rendered DOM } else { wasmruntime.Run(render) // client-rendered route } // Adopt the theme AFTER mounting. The class is already on — the document's // boot script put it there before the first paint — so this is not what makes the // page dark; it is what makes the SWITCH know which way it is pointing, and what // keeps the page following the OS if the user never touched the switch. // // The server rendered this button not knowing the theme (it cannot: the preference is // in localStorage), so it drew the wrong icon. Init's signal write re-renders it, and // the reconciler patches the one button. That mismatch is inherent, not a bug — it is // the same reason the boot script has to exist at all. // // This line used to be unreachable: Hydrate ended in a `select {}` and never returned. // See wasmruntime.Wait. app.Theme.Init() // Last line, always: a Go/wasm main that returns is a dead program, and every event // handler on the page dies with it. wasmruntime.Wait() }