v0.9.0 — 8 new widgets, +15% surface (Wave 3 finishing pass)
Additive-only bump: 54 → 62 widgets. Every existing consumer keeps working unchanged.
Wave 3 (finishing pass) of the GTK / DaisyUI gap-closure campaign. Same recipe as v0.7.0 / v0.8.0: Base embedding, Draw(painter.Painter, *Theme), existing fillRect/strokeRect/DrawText helpers, theme.Extra["OnAccent"] fallback pattern.
Buttons
- SplitButton — primary action button with an attached arrow slot; independent
OnClick(main) andOnArrow(menu) callbacks,SplitButtonArrowW = 20visual separator;Arrow = falsecollapses to a wide accent button. - IconButton — compact single-glyph button for toolbars. Distinct from
Button(has text) andToggleButton(has toggle state). Rendered subtly ontheme.Surfacewith aBorderstroke, not onAccent— the toolbar-icon convention.
Data display
- Stat — DaisyUI-style KPI card: dim
Titleon top, bigValuein the middle (double-stroked to fake bold weight — a testable visible signal),Changeat the bottom with color derived fromStatTrend(StatFlat/StatUp/StatDown, fixed RGB per trend). - Timeline — vertical event log: rail line in
theme.Border, per-event colored marker (TimelineDefault/TimelineSuccess/TimelineWarning/TimelineError— mirrorsAlert's fixed RGBs),Titlenext to the marker, optional dimDetailline below.
Interactive
- DropZone — inline "drag files here" target with a dashed border (rendered as a series of short filled rects along each edge — the same abstraction level as the rest of the toolkit) +
Hoverstate that recolors border inAccenton drag-over.OnDropfires with[]string{ev.Code}on syntheticEventCharwithHover = true(host convention). - Chip — removable tag:
Text+ optional close-xaffordance.Closable = truereserves a right-side hit slot;EventMouseDownin that slot firesOnClose. Sibling toBadge(which is a counter/status pill with no close).
Composables
- FormField —
Labelabove aChildwidget, with mutually-exclusiveHelp(dim caption intheme.Border) orError(fixed red) below.Errortakes precedence overHelpwhen both are set. Events forward toChildwhen(X, Y)falls in its rect. - ProgressCircle — approximated circular progress: outer ring in
theme.SurfaceAlt("track"), inner square intheme.Surface("hole"), fill band scaled byFractionintheme.Accent,\"XX%\"centered in the hole intheme.OnSurface. Fraction clamps to[0, 1].
Development note
Built in parallel by 4 sub-agents in worktree isolation (/tmp/tk-w3-{a,b,c,d}). Each agent worked in its own fresh clone of v0.8.0; the 4 batches merged verbatim with no naming conflicts across the ~25 new package-level constants and enums, and 100.0% cov end-to-end. Third consecutive wave delivered by this pattern.
Verified
go vet ./...cleango test -cover ./...→ 100.0% of statements- Cross-compile smoke:
js/wasm,linux/arm64,darwin/arm64all clean - CI green
Compatibility
Additive only. No new theme fields, no new external deps beyond github.com/go-widgets/painter. No existing files touched.
To pin:
```go
require github.com/go-widgets/toolkit v0.9.0
```
Coverage now
DaisyUI 4 + libadwaita gap closure is materially complete. Remaining specialized widgets (Split view / DualPane variants, WindowControls, Aboutdialog, Snackbar-with-action) are either already covered by adjacent widgets or fall outside a pure-Go pixel-blitting library's scope.
License
BSD-3-Clause.