Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 16 additions & 16 deletions hugo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ disableKinds = ["taxonomy", "term", "RSS", "sitemap", "404"]
[[params.modules]]
name = "painter"
layer = "rendering"
tag = "v0.15.0"
tag = "v0.16.0"
docs = "rendering/painter/"
blurb = "The seam every widget draws through: seven primitives, optional capabilities (clip, paths, images, masks, faces), a **pixel** painter and a **cell** painter."
[[params.modules]]
Expand All @@ -59,7 +59,7 @@ disableKinds = ["taxonomy", "term", "RSS", "sitemap", "404"]
[[params.modules]]
name = "skin"
layer = "rendering"
tag = "v0.2.0"
tag = "v0.3.0"
docs = "rendering/skin/"
blurb = "A widget's parts, states and transitions in a `.skin.json` file. The toolkit's button, check, switch, chip and card, rewritten as skins, render **pixel for pixel** the same."
[[params.modules]]
Expand All @@ -71,43 +71,43 @@ disableKinds = ["taxonomy", "term", "RSS", "sitemap", "404"]
[[params.modules]]
name = "mvvm"
layer = "state"
tag = "v0.13.0"
tag = "v0.15.0"
docs = "state/mvvm/"
blurb = "`Observable`, `Command`, `ObservableList`, binders, and an undo stack. Generics, no reflection; the core imports **no widget package**, so one view-model drives pixels and cells."
[[params.modules]]
name = "mvvmtk"
layer = "state"
tag = "v0.14.1"
tag = "v0.15.0"
docs = "state/mvvm/#mvvmtk-one-call-per-widget"
blurb = "One call binds a toolkit widget to a view-model, with the widget's real field and callback names filled in. Every binder returns an `unbind`."
[[params.modules]]
name = "data"
layer = "state"
tag = "v0.3.0"
tag = "v0.4.0"
docs = "state/data/"
blurb = "Typed records, a pure query engine, and a store whose in-process and gRPC proxies return **byte-identical** views — natively and in wasm."
[[params.modules]]
name = "window"
layer = "surface"
tag = "v0.86.1"
tag = "v0.89.0"
docs = "surfaces/native-window/"
blurb = "One `Open`/`Run` over **X11, Wayland, Cocoa, Win32, GTK4, Android and wasmbox**. X11 is the core protocol written from scratch over the socket; macOS and Windows are reached without cgo."
blurb = "One `Open`/`Run` over **X11, Wayland, GTK4, Cocoa, Win32, Android, wasmbox and a browser tab**. X11 is the core protocol written from scratch over the socket; macOS and Windows are reached without cgo."
[[params.modules]]
name = "application"
layer = "surface"
tag = "v0.7.0"
tag = "v0.8.0"
docs = "surfaces/application/"
blurb = "The lifecycle above a window: the run loop, a tray icon attached once the first frame is up, the live system appearance, the accessibility tree, a ready hook."
[[params.modules]]
name = "tray"
layer = "surface"
tag = "v0.14.0"
tag = "v0.15.0"
docs = "surfaces/application/#the-tray"
blurb = "A menu-bar or notification-area icon with menus, submenus and checkboxes: `NSStatusItem`, `Shell_NotifyIcon`, `StatusNotifierItem` over DBus. No build tag; `ErrNoBackend` where there is none."
[[params.modules]]
name = "webcanvas"
layer = "surface"
tag = "v0.2.0"
tag = "v0.4.1"
docs = "surfaces/browser/"
blurb = "A scene in a plain browser `<canvas>`: no compositor, no `SharedArrayBuffer`, no cross-origin isolation. Any static host serves it."
[[params.modules]]
Expand All @@ -119,31 +119,31 @@ disableKinds = ["taxonomy", "term", "RSS", "sitemap", "404"]
[[params.modules]]
name = "android"
layer = "surface"
tag = "v0.15.0"
tag = "v0.16.0"
docs = "surfaces/android/"
blurb = "An installable APK whose whole interface is painted by a `CGO_ENABLED=0` Go process; a thin Java host blits a shared memfd and owns nothing else."
[[params.modules]]
name = "svg"
layer = "surface"
tag = "v0.6.0"
tag = "v0.7.0"
docs = "surfaces/snapshots/"
blurb = "Any RGBA render as a self-contained, bit-exact SVG, or as a PNG. The widget catalogue rendered this way: [go-widgets.github.io/svg](https://go-widgets.github.io/svg/)."
[[params.modules]]
name = "mvvmlint"
layer = "rules"
tag = "v0.4.0"
tag = "v0.4.1"
docs = "guard-rails/mvvmlint/"
blurb = "A `go vet` check that fails a pull request assigning a widget's state field by hand, or shipping widgets with no view-model."
[[params.modules]]
name = "bricolint"
layer = "rules"
tag = "v0.4.0"
tag = "v0.4.1"
docs = "guard-rails/bricolint/"
blurb = "A `go vet` check against hand-drawn UI: no painter primitives in application code, no widget rebuilt on every frame. An exemption must give its reason."
[[params.modules]]
name = "app-template"
layer = "app"
tag = "v0.4.0"
tag = "v0.5.0"
docs = "getting-started/"
blurb = "The starting point: a browser app with its state in a view-model, a 100% coverage gate and the MVVM gate, green from the first commit."
[[params.modules]]
Expand Down Expand Up @@ -172,7 +172,7 @@ disableKinds = ["taxonomy", "term", "RSS", "sitemap", "404"]
how = "A Win32 window through the process's own DLLs and a Go window procedure; `Shell_NotifyIcon` for the tray."
[[params.surfaces]]
name = "Browser"
how = "A plain `<canvas>` with **webcanvas**, or a window of the **wasmdesk** compositor over a `MessagePort` and a shared buffer."
how = "A plain `<canvas>`, through **webcanvas** or `window.Open` itself, or a window of the **wasmdesk** compositor over a `MessagePort` and a shared buffer."
[[params.surfaces]]
name = "Terminal"
how = "The cell painter, serialised as 24-bit ANSI; an interactive runner with raw mode and the alternate screen."
Expand Down
14 changes: 8 additions & 6 deletions layouts/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ <h1 class="head">One widget tree,<br><span class="accent">every surface.</span><
<a class="btn btn-primary" href="https://go-widgets.github.io/docs/">{{ partial "icons/book.html" . }}Read the documentation →</a>
<a class="btn btn-ghost" href="https://go-widgets.github.io/gallery/">{{ partial "icons/play.html" . }}Try it in the browser</a>
</div>
<div class="trust"><span><b>160</b> widget types</span><span><b>7</b> window back-ends, one <code>Open</code></span><span><b>CGO=0</b> on every target</span></div>
<div class="trust"><span><b>160</b> widget types</span><span><b>8</b> window back-ends, one <code>Open</code></span><span><b>CGO=0</b> on every target</span></div>
</div>
<div class="term">
<div class="bar"><i style="background:#ff5f57"></i><i style="background:#febc2e"></i><i style="background:#28c840"></i><span class="t">go-widgets/window — zsh</span></div>
Expand Down Expand Up @@ -94,12 +94,14 @@ <h2>{{ len .Site.Params.surfaces }} surfaces, <i>one widget tree</i>.</h2>
<section id="stats" style="padding-top:10px"><div class="wrap">
<div class="stats">
<div><div class="n">160</div><div class="l">widget types in <code>toolkit</code> v0.328.0, counted at that tag</div></div>
<div><div class="n">7</div><div class="l">window back-ends behind one <code>window.Open</code></div></div>
<div><div class="n">8</div><div class="l">window back-ends behind one <code>window.Open</code></div></div>
<div><div class="n">{{ len .Site.Params.modules }}</div><div class="l">modules, each <code>CGO_ENABLED=0</code></div></div>
{{/* Not "100% everywhere": mvvmtk has no coverage gate, and the docs'
status page says so. Eighteen do, and the number is what CI
enforces, not what was measured on somebody's laptop. */}}
<div><div class="n">18</div><div class="l">of them gated at 100% statement coverage in CI</div></div>
{{/* What CI enforces, not what was measured on somebody's laptop. It was
18 until 2026-10-10, when mvvmtk, the one module without a gate,
got one (go-widgets/mvvmtk#34). A literal, measured on that date, on
purpose: derived from the module list it would claim the gate for any
module added later, gated or not. */}}
<div><div class="n">19</div><div class="l">of them gated at 100% statement coverage in CI</div></div>
</div>
</div></section>

Expand Down
Loading