Skip to content

Latest commit

History

182 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

GoGPU Logo

gogpu/ui

Enterprise-Grade GUI Toolkit for Go
Modern widgets, reactive state, GPU-accelerated rendering — zero CGO

CICoverageGo Report CardGo ReferenceVersionGo VersionLicenseStarsDiscussions


Join the Discussion: Help shape the future of Go GUI! Share your ideas, report issues, and discuss features at our GitHub Discussions.


Overview

gogpu/ui is an enterprise-grade GUI toolkit for Go, designed for building:

  • IDEs (GoLand, VS Code class)
  • Design Tools (Photoshop, Figma class)
  • CAD Applications
  • Professional Dashboards
  • Chrome/Electron Replacement Apps

Key Differentiators

Featuregogpu/uiFyneGio
CGO-freeYesNoYes
WebGPU renderingYes (Vulkan/DX12/Metal/GLES/Software)OpenGLDirect GPU
Reactive stateSignals (push-pull, zero glitch)BindingEvents
Gesture recognitionArena-based (Flutter pattern)NoNo
Layout engineFlexbox + Grid + per-widget cacheCustomFlex
AccessibilityDay 1 (35+ ARIA roles)LimitedLimited
Design systems4 (M3, DevTools, Fluent, Cupertino)11
Widgets27 interactive + primitives~20~15
Plugin systemYes (deps, assets, fonts)NoNo
AndroidIn review (wgpu#268)YesYes

Screenshot

gogpu/ui Widget Demo

examples/hello — Checkboxes, Radio Buttons, ListView (1000 items), Material Design 3


Quick Start

Important: The gogpu ecosystem is pure Go with zero CGO. You must set CGO_ENABLED=0 (the Go default) — do not enable CGO.

The fastest way to get started is to clone and run one of the included examples:

git clone https://github.com/gogpu/ui.git
cd ui/examples/hello
go run .

Here is a minimal example using desktop.Run (recommended):

package main
import (
"log"
_ "github.com/gogpu/gg/gpu""github.com/gogpu/gogpu""github.com/gogpu/ui/app""github.com/gogpu/ui/desktop""github.com/gogpu/ui/primitives""github.com/gogpu/ui/widget"
)
funcmain() {
gogpuApp:=gogpu.NewApp(gogpu.DefaultConfig().
WithTitle("My App").
WithSize(800, 600))
uiApp:=app.New(
app.WithWindowProvider(gogpuApp),
app.WithPlatformProvider(gogpuApp),
app.WithEventSource(gogpuApp.EventSource()),
)
uiApp.SetRoot(
primitives.Box(
primitives.Text("Hello gogpu/ui!").
FontSize(24).Bold().
Color(widget.RGBA8(33, 33, 33, 255)),
primitives.Text("Enterprise-grade GUI for Go").
FontSize(16).
Color(widget.RGBA8(100, 100, 100, 255)),
).Padding(24).Gap(12).Background(widget.RGBA8(255, 255, 255, 255)),
)
iferr:=desktop.Run(gogpuApp, uiApp); err!=nil {
log.Fatal(err)
}
}

Packages

Core (Phase 0)

PackageDescriptionCoverage
geometryPoint, Size, Rect, Constraints, Insets98.8%
eventMouseEvent, KeyEvent, WheelEvent, FocusEvent, Modifiers100%
widgetWidget, WidgetBase, Context, Canvas, Lifecycle (mount/unmount), SchedulerRef100%
internal/renderCanvas, SceneCanvas, IconCache (2-level LRU), DPI-aware SVG96.5%
internal/layoutFlex, Stack, Grid layout engines89.9%

MVP (Phase 1)

PackageDescriptionCoverage
a11yAccessibility: 35+ ARIA roles, Accessible interface, Tree, Announcer99.1%
stateReactive signals, Binding, Scheduler with push-based invalidation100%
primitivesBox, Text, Image widgets with fluent builder API94.4%
appWindow integration via gpucontext interfaces (dependency inversion)98.6%

Extensibility (Phase 1.5)

PackageDescriptionCoverage
layoutPublic layout API with custom algorithms89.5%
registryWidget factory registration for third-party widgets100%
themeTheme system with Extensions and Registry100%
pluginPlugin bundling with dependency resolution99.4%

Interactive Widgets (Phase 2 — Complete)

PackageDescriptionCoverage
cdkComponent Development Kit — Content[C] polymorphic pattern100%
core/buttonGeneric button with pluggable Painter, 4 variants, 3 sizes, signal bindings96%+
core/checkboxToggleable checkbox with checked/unchecked/indeterminate states, signal bindings96%+
core/radioMutually exclusive radio group with vertical/horizontal layout, signal bindings96%+
core/textfieldText input with cursor, selection, clipboard, validation, signal bindings96%+
core/sliderSlider: continuous/discrete, horizontal/vertical, drag+keyboard, signal bindings94.6%
core/dialogModal dialog: backdrop overlay, action buttons, focus trapping, Alert/Confirm96.9%
core/dropdownDropdown/select with overlay menu, keyboard navigation, signal bindings96%+
overlayOverlay/popup stack, container, position helper95%+
primitivesBox, Text, Image, RepaintBoundary (GPU texture caching via Layer Tree compositor)94.4%
theme/material3Material Design 3 — theme (HCT color science) + 24 component painters97%+
focusKeyboard focus management with Tab/Shift+Tab navigation95.2%
internal/focusInternal focus manager implementation15.2%

Phase 3 (Complete)

PackageDescriptionCoverage
animationAnimation engine: tween, spring, M3 presets, orchestration (Stagger/Chain/Repeat/Reverse)92.3%
transitionWidget enter/exit animations: Fade, Slide, Scale effects, Show/Hide wrapper98.7%
core/scrollviewScrollable container: vertical/horizontal/both, wheel+keyboard+drag, PushClip/PushTransform, signal bindings96.5%
core/tabviewTabbed navigation: lazy content switching, closeable tabs, keyboard nav, Top/Bottom position, signal bindings92.1%
core/listviewVirtualized list: fixed-height items, recycling, single/multi selection, keyboard nav, M3 painter96%+
core/gridviewVirtualized 2D grid: fixed cell size, auto-fit columns, cell recycling, selection, keyboard nav92.1%
core/linechartReal-time line chart: multiple series, rolling window, grid, Y-axis labels, thread-safe PushValue98.8%
core/progressbarLinear progress bar: 0-100%, rounded corners, label, signal binding, PushClipRoundRect99.3%
core/collapsibleExpandable section: animated expand/collapse, keyboard focus, arrow indicator, Tween animation98.2%
primitivesBox (HBox/VBox direction), Text, Image, ThemeScope, RepaintBoundary94%+

Phase 4 (In Progress)

PackageDescriptionCoverage
core/progressCircular progress: determinate arc + indeterminate spinner, polyline approximation97.4%
core/popoverPopover (click) + Tooltip (hover): 12 placements, auto-flip, overlay integration97.1%
core/splitviewResizable split panels: draggable divider, min constraints, collapse, handle dots96.8%
core/treeviewHierarchical tree: expand/collapse, virtualized rendering, connector lines, keyboard nav96%+
core/datatableSortable column table: fixed header, virtualized rows, zebra striping, sort indicators96%+
core/toolbarHorizontal action bar: icon buttons, separators, spacers, custom widget items96%+
core/menuMenuBar + ContextMenu: submenus, separators, disabled items, shortcut display96%+
core/dockingIDE-style dockable panels: border layout, tabbed groups, Dock/Undock API95.3%
core/badgeNotification badge: count mode (pill, "99+" overflow), dot mode, signal bindings with dedup99.3%
core/chipAction/filter chip (M3 spec): toggleable selection, two-way signal write-back, state layers99.0%
theme/material324 component painters (all widgets covered)97%+
theme/devtoolsJetBrains DevTools: 24 painters, Int UI gray scale, dark/light, IDE-style96%+
theme/fluentMicrosoft Fluent Design: 11 painters, accent colors, inner focus ring, light/dark96%+
theme/cupertinoApple HIG: 11 painters, iOS toggle switch, segmented control, pill buttons96%+
theme/fontFont Registry: CSS weight matching (W3C spec), Weight 100-900, Style, Family/Face97.7%
iconSVG icons (JetBrains expui), 2-level cache, DPI-aware rasterization, gg/svg renderer97%+
i18nInternationalization: Locale, Bundle, Translator, CLDR plural rules, RTL, LocaleSignal97.9%
dndDrag and drop: DragSource/DropTarget interfaces, Manager, 5px threshold, Escape cancel99.3%
offscreenHeadless widget rendering: CPU-only *image.RGBA output, no GPU/window/app required100%
uitestTesting utilities: MockCanvas, MockContext, event factories, widget helpers, assertions93.1%
internal/dirtyDirty region tracking: Collector, Tracker, merge algorithm, partial repaints100%

| core/stripe | Vertical sidebar strip: tool window buttons, top/bottom items, icon buttons | 96%+ | | core/titlebar | Window title bar: CSD, drag, minimize/maximize/close, WindowChrome interface | 96%+ | | gesture | Gesture recognition: Arena, ClickRecognizer, DragRecognizer, LongPressRecognizer, TapAndDragRecognizer, VelocityTracker, Team | 96.0% | | compositor | Layer Tree compositor: OffsetLayer, PictureLayer, ClipRectLayer, OpacityLayer — production render pipeline | 95%+ | | desktop | Production render loop: Layer Tree → GPU textures → damage-aware blit | — |

Total: ~220,000+ lines of code | 70 packages | ~7,800+ tests | 97%+ average coverage

Backend Selection

gogpu/ui renders through any GPU backend via the gogpu ecosystem — no code changes needed:

GOGPU_GRAPHICS_API=vulkan go run ./examples/hello/ # Vulkan (default on Linux)
GOGPU_GRAPHICS_API=dx12 go run ./examples/hello/ # DirectX 12 (Windows)
GOGPU_GRAPHICS_API=metal go run ./examples/hello/ # Metal (macOS)
GOGPU_GRAPHICS_API=gles go run ./examples/hello/ # OpenGL ES
GOGPU_GRAPHICS_API=software go run ./examples/hello/ # CPU software renderer

The software backend runs on any machine without GPU drivers. It uses the same unified render pipeline (Layer Tree compositor, offscreen boundary textures, damage-aware blit) as GPU backends. Performance is significantly slower than GPU — optimization via naga Go+SIMD backend (NAGA-FEAT-004) is planned.

Android support is in review (wgpu#268) — Vulkan on arm64, contributed by @besmpl for Hearth game engine.


Architecture

┌─────────────────────────────────────────────────────────────┐
│ User Application │
├─────────────────────────────────────────────────────────────┤
│ theme/material3/ │ theme/devtools/ │ theme/fluent/ │
│ 24 Painters │ 24 Painters │ 11 Painters │
│ theme/cupertino/ │ │ │
│ 11 Painters │ 70 painters total across 4 systems │
├─────────────────────────────────────────────────────────────┤
│ 27 Interactive Widgets (core/) │
│ button, checkbox, radio, textfield, dropdown, slider, │
│ dialog, scrollview, tabview, listview, gridview, linechart,│
│ progressbar, progress, collapsible, popover, splitview, │
│ treeview, datatable, toolbar, menu, docking, badge, chip, │
│ stripe, titlebar, gpuview │
├──────────────┬──────────────────────────────────────────────┤
│ cdk/ │ Content[C] polymorphic pattern │
├──────────────┴──────────────────────────────────────────────┤
│ primitives/ │ animation/ │ transition/ │
│ Box (HBox/VBox), │ Tween, Spring │ Fade, Slide, Scale │
│ Text, Image, │ M3 Presets, │ Enter/Exit │
│ RepaintBoundary │ Orchestration │ │
├─────────────────────────────────────────────────────────────┤
│ icon/ │ i18n/ │ dnd/ │ uitest/ │ theme/font/ │
├─────────────────────────────────────────────────────────────┤
│ gesture/ (Arena, Click, Drag, LongPress, Team) │
├─────────────────────────────────────────────────────────────┤
│ app/ + FocusManager │ focus/ │ overlay/ │ render/ │
├─────────────────────────────────────────────────────────────┤
│ desktop/ (Layer Tree Compositor + Damage-Aware Blit) │
│ compositor/ (Production: OffsetLayer, PictureLayer, Opacity)│
│ offscreen/ (headless widget → *image.RGBA) │
├─────────────────────────────────────────────────────────────┤
│ layout/ │ state/ │ a11y/ │
│ Flex, Stack, Grid │ Signals, Bind │ ARIA Roles, Tree │
├─────────────────────────────────────────────────────────────┤
│ registry/ │ plugin/ │ theme/ │
├─────────────────────────────────────────────────────────────┤
│ widget/ │ event/ │ geometry/ │
│ Widget, Context │ Mouse, Key │ Point, Rect │
│ Canvas, Lifecycle │ Wheel, Focus │ Constraints │
├─────────────────────────────────────────────────────────────┤
│ internal/render │ internal/layout│ internal/focus │
│ Canvas, Scene, │ Flex, Grid │ Manager, Ring │
│ IconCache (LRU) │ internal/dirty │ Tracker, Collector │
├─────────────────────────────────────────────────────────────┤
│ gogpu/gg │ gpucontext │ coregx/signals │
│ 2D Graphics │ Shared Ifaces │ State Management │
└─────────────────────────────────────────────────────────────┘

Dependency Principle

ui → gpucontext (interfaces) ← dependency inversion
ui → gg (2D rendering)
ui → coregx/signals (reactive)
gogpu → gpucontext (implements) ← concrete implementation
gg → wgpu → naga ← internal to gg

ui never imports gogpu, wgpu, or naga directly.

Render Pipeline

Enterprise-grade retained-mode rendering (ADR-007) with unified draw queue (ADR-051/052):

  1. O(1) frame skip — flat dirty boundary set, no tree walks when idle (0% GPU)
  2. Layer Tree composition — OffsetLayer, PictureLayer, OpacityLayer, ClipRectLayer
  3. Per-boundary GPU textures — dirty boundaries re-render to MSAA offscreen texture, clean reuse cached
  4. Damage-aware blit — LoadOpLoad + multi-rect scissor, only dirty pixels touch the GPU
  5. Persistent tree — layer objects reused across frames (97.9% fewer allocations)
  6. Unified draw queue — backend-agnostic command dispatch (shapes, text, GPU textures through single pipeline). GPU backends batch into render passes; software dispatches through CPU rasterizer.

Validated by enterprise research: Flutter, Chrome, Qt6, Android, Skia patterns. Works on all backends: Vulkan, DX12, Metal, GLES, Software, Browser (WASM).


Examples

ExampleDescription
examples/helloWidget demo: checkbox, radio, ListView (1000 items), M3 theme, event-driven GPU rendering
examples/signalsReactive signals: TextSignal, ContentSignal, CheckedSignal, SelectedSignal, DisabledSignal
examples/taskmanagerFull task manager: charts, tables, animations, real-time data
examples/galleryWidget gallery: all 26 widgets, 4 design systems (M3/DevTools/Fluent/Cupertino), theme switching
examples/ideGoLand-inspired IDE layout: DevTools theme, toolbar, tree, tabs, terminal, SVG icons
examples/filedropOS file drag-and-drop: drop files from file manager, reactive path display
examples/gpuviewGPU view widget: offscreen texture compositing (Flutter Texture pattern)
examples/modular-compositorMulti-module offscreen rendering: clock + notification compositor (#75)

Run any example:

cd examples/gallery
go run .

API Examples

Primitives

// Box — universal containerprimitives.Box(children...).
Padding(16).
PaddingXY(24, 8).
Background(theme.Surface).
Rounded(8).
BorderStyle(1, theme.Outline).
ShadowLevel(2).
Gap(8)
// Text — staticprimitives.Text("Hello World").
FontSize(24).
Bold().
Color(theme.OnSurface).
Align(primitives.TextAlignCenter).
MaxLines(2).
Ellipsis()
// Text — reactive (auto-updates when signal changes)primitives.TextFn(func() string {
returnfmt.Sprintf("Count: %d", count.Get())
}).FontSize(18)
// Text — signal binding (auto-updates when signal changes)title:=state.NewSignal("Hello World")
primitives.NewText("").ContentSignal(title).FontSize(24)
// Imageprimitives.Image(mySource).
Size(48, 48).
Cover().
Rounded(24).
Alt("User avatar")

Slider

// Basic sliders:=slider.New(
slider.Min(0),
slider.Max(100),
slider.Value(50),
slider.OnChange(func(vfloat32) { fmt.Println("Value:", v) }),
)
// Discrete slider with step snapping and markss:=slider.New(
slider.Min(0), slider.Max(100), slider.Step(10),
slider.Marks([]slider.Mark{{Value: 0}, {Value: 50}, {Value: 100}}),
slider.PainterOpt(material3.SliderPainter{Theme: m3}),
)
// Two-way signal bindingvolume:= state.NewSignal[float32](75)
s:=slider.New(
slider.Min(0), slider.Max(100),
slider.ValueSignal(volume), // reads AND writes back on drag
)

Dialog

// Simple alert dialogd:=dialog.Alert("Error", "File not found.", func() { log.Println("dismissed") })
d.Show(ctx)
// Confirmation dialogd:=dialog.Confirm("Delete?", "This cannot be undone.",
func() { log.Println("canceled") },
func() { deleteItem() },
)
d.Show(ctx)
// Custom dialog with M3 painterd:=dialog.New(
dialog.Title("Settings"),
dialog.Content(settingsWidget),
dialog.Actions(
dialog.Action{Label: "Cancel", Variant: dialog.VariantTextOnly},
dialog.Action{Label: "Save", Variant: dialog.VariantFilled, Default: true,
OnClick: func() { saveSettings() }},
),
dialog.PainterOpt(material3.DialogPainter{Theme: m3}),
)
d.Show(ctx)

Animation

// Tween animation with M3 easingctrl:=animation.NewController()
opacity:= state.NewSignal[float32](0)
animation.To(opacity, 1.0).
Duration(animation.DurationMedium2).
Ease(animation.M3Standard).
Start(ctrl)
// Spring physics (critically damped)position:= state.NewSignal[float32](0)
animation.SpringTo(position, 200).
Stiffness(animation.StiffnessMedium).
DampingRatio(animation.DampingNoBouncy).
Start(ctrl)
// Color tween (Flutter pattern: float32 engine + Tween[T])progress:= state.NewSignal[float32](0)
animation.To(progress, 1.0).Duration(300*time.Millisecond).Start(ctrl)
colorTween:=animation.NewColorTween(startColor, endColor)
// in Draw: canvas.DrawRect(bounds, colorTween.At(progress.Get()))// Parallel compositionanimation.Parallel(
animation.To(opacity, 1.0).Duration(200*time.Millisecond),
animation.To(translateY, 0).Duration(300*time.Millisecond),
).Start(ctrl)

ScrollView

// Basic vertical scrollviewsv:=scrollview.New(longContentWidget,
scrollview.DirectionOpt(scrollview.Vertical),
scrollview.ScrollbarOpt(scrollview.ScrollbarAuto),
scrollview.OnScroll(func(x, yfloat32) { fmt.Printf("scroll: %.0f\n", y) }),
)
// 2D scrollview with signal bindingscrollY:= state.NewSignal[float32](0)
sv:=scrollview.New(largeCanvas,
scrollview.DirectionOpt(scrollview.Both),
scrollview.ScrollYSignal(scrollY), // two-way bindingscrollview.PainterOpt(material3.ScrollbarPainter{Theme: m3}),
)

TabView

// Basic tab viewtv:=tabview.New([]tabview.Tab{
{Label: "Profile", Content: profileWidget},
{Label: "Settings", Content: settingsWidget},
{Label: "About", Content: aboutWidget},
}, tabview.OnSelect(func(idxint) { fmt.Println("Tab:", idx) }))
// Closeable tabs with M3 painter and signal bindingselected:= state.NewSignal[int](0)
tv:=tabview.New(tabs,
tabview.Closeable(true),
tabview.SelectedSignalOpt(selected),
tabview.PainterOpt(material3.TabViewPainter{Theme: m3}),
tabview.OnClose(func(idxint) { removeDynamicTab(idx) }),
)

Reactive State

// Create a signalname:=state.NewSignal("World")
// Computed value (auto-updates)greeting:=state.NewComputed(func() string {
return"Hello, "+name.Get() +"!"
})
// Bind signal to widget invalidationbinding:=state.Bind(name, ctx)
deferbinding.Unbind()
// Batch multiple changes (single re-render)scheduler.Batch(func() {
firstName.Set("Alice")
lastName.Set("Smith")
age.Set(30)
})

Widget Signal Bindings

// Bind signals directly to widget propertieslabel:=state.NewSignal("Submit")
disabled:=state.NewSignal(false)
btn:=button.New(
button.TextSignal(label),
button.DisabledSignal(disabled),
button.OnClick(func() {
label.Set("Processing...")
disabled.Set(true)
}),
)
// Two-way binding: checkbox state synced with signalagreed:=state.NewSignal(false)
cb:=checkbox.New(
checkbox.CheckedSignal(agreed),
checkbox.LabelOpt("I agree to terms"),
)

Accessibility

// Every widget implements a11y.Accessiblefunc (b*MyButton) AccessibilityRole() a11y.Role { returna11y.RoleButton }
func (b*MyButton) AccessibilityLabel() string { returnb.text }
func (b*MyButton) AccessibilityActions() []a11y.Action {
return []a11y.Action{a11y.ActionClick}
}
// Accessibility tree with stable node IDsroot:=a11y.NewNode(a11y.RoleWindow, "My Application")
tree:=a11y.NewMemoryTree(root)
button:=a11y.NewNode(a11y.RoleButton, "Save") // stable uint64 IDtree.Insert(root, button)

Offscreen Rendering

// Render widgets to image without GPU, window, or appr:=offscreen.NewRenderer(400, 120)
r.Render(primitives.Text("Hello, World!").FontSize(24))
img:=r.Image() // *image.RGBA — ready for png.Encode, testing, compositing// HiDPI with dark theme and white backgrounddark:=material3.NewDark(widget.Hex(0x00BFA5))
r:=offscreen.NewRenderer(800, 240,
offscreen.WithTheme(dark),
offscreen.WithScale(2.0),
offscreen.WithBackground(widget.ColorWhite),
)
r.Render(myWidgetTree)

Window Integration

// ui connects to windowing via interfaces (not concrete types)uiApp:=app.New(
app.WithWindowProvider(gogpuApp), // gpucontext.WindowProviderapp.WithPlatformProvider(gogpuApp), // gpucontext.PlatformProviderapp.WithTheme(myTheme),
)
uiApp.SetRoot(rootWidget)
// Headless mode for testing (no window needed)testApp:=app.New() // works without any providerstestApp.SetRoot(rootWidget)
testApp.Window().Frame() // processes layout + draw

Implementation Progress

Phase 0: Foundation ✅

  • Geometry types (Point, Size, Rect, Constraints, Insets)
  • Event system (Mouse, Keyboard, Wheel, Focus, Modifiers)
  • Widget interface, WidgetBase, Context, Canvas
  • Layout engines (Flexbox, Stack, Grid)
  • Canvas implementation (gogpu/gg)

Phase 1: MVP ✅

  • Accessibility foundation (35+ ARIA roles, Accessible interface, Tree)
  • Reactive signals integration (coregx/signals, Binding, Scheduler)
  • Basic primitives (Box, Text, Image with fluent API)
  • Window integration (app package via gpucontext interfaces)

Phase 1.5: Extensibility ✅

  • Widget Registry (third-party registration)
  • Public Layout API (custom algorithms)
  • Theme System + Extensions + Registry
  • Plugin System (bundling, dependency resolution)

Phase 2: Beta ✅

  • Button widget (4 variants, 3 sizes, keyboard activation)
  • Checkbox widget (checked/unchecked/indeterminate, pluggable Painter)
  • Radio group widget (vertical/horizontal, arrow key navigation)
  • TextField widget (cursor, selection, clipboard, validation)
  • Dropdown/Select widget (overlay menu, keyboard nav, scroll)
  • Overlay infrastructure (stack, container, position)
  • Material Design 3 theme (HCT color science, 24 painters)
  • Keyboard navigation (focus management, Tab/Shift+Tab, shortcuts)
  • ThemeScope (theme override for widget subtrees)
  • Event-driven rendering (0% CPU when idle)
  • Reactive signal bindings for all widgets (TextSignal, CheckedSignal, SelectedSignal, DisabledSignal, ContentSignal)

Phase 3: Release Candidate ✅

  • Retained-mode rendering: dirty tracking, DrawTree, DrawStats (SP1)
  • RepaintBoundary: per-widget pixel caching (SP2)
  • scene.Scene integration: tile-parallel rendering via SceneCanvas (SP3)
  • Slider widget (continuous/discrete, horizontal/vertical, M3 painter)
  • Dialog/Modal widget (backdrop, actions, focus trapping, M3 painter)
  • Animation engine (Tween, Spring, CubicBezier, M3 motion tokens)
  • Animation presets (M3 motion tokens) + orchestration (Stagger, Chain, Repeat)
  • Transitions: enter/exit animations (Fade, Slide, Scale)
  • ScrollView widget (vertical/horizontal/both, wheel+keyboard+drag)
  • TabView widget (lazy content, closeable tabs, keyboard nav)
  • ListView widget (virtualized list, recycling, single/multi selection, M3 painter)
  • GridView widget (virtualized 2D grid, auto-fit columns, cell recycling)
  • LineChart widget (real-time, multiple series, rolling window)
  • ProgressBar widget (linear, rounded corners, signal binding)
  • Collapsible section widget (animated expand/collapse)
  • Box HBox/VBox direction support
  • Dirty region tracking (internal/dirty)
  • Performance benchmarks (36 across 5 packages)

Phase 4: Production (v1.0) — In Progress

  • Circular progress indicator (determinate arc + indeterminate spinner)
  • SplitView (resizable split panels, draggable divider)
  • Popover/Tooltip (12 placements, auto-flip, overlay)
  • TreeView (hierarchical, expand/collapse, virtualized)
  • DataTable (sortable columns, fixed header, virtualized rows)
  • Toolbar (icon buttons, separators, spacers)
  • Menu system (MenuBar + ContextMenu, submenus, shortcuts)
  • IDE-style docking system (border layout, tabbed groups)
  • Drag & drop foundation (DragSource, DropTarget, Manager)
  • Fluent Design theme (11 painters, accent colors)
  • Cupertino theme (11 painters, iOS-style)
  • Badge widget (notification count/dot, signal bindings)
  • Chip widget (action/filter, toggleable, two-way signal)
  • Stripe widget (sidebar tool buttons)
  • TitleBar widget (CSD window title bar)
  • i18n (CLDR plural rules, RTL detection, LocaleSignal)
  • Icon system (vector paths, 10 Material icons, De Casteljau)
  • Font registry (CSS weight matching, W3C spec)
  • Testing utilities (MockCanvas, MockContext, assertions)
  • Dirty region tracking (merge algorithm, partial repaints)
  • Performance benchmarks (36 across 5 packages)
  • Hover tracking (W3C PointerEventSource, HoverTracker, cursor management)
  • ScreenBounds coordinate system (overlay positioning, hit-testing)
  • Event coordinate transforms (ScrollView content-space dispatch)
  • Inter font full Unicode (Cyrillic, Greek, Vietnamese)
  • MeasureText on Canvas (layout calculations without drawing)
  • FocusManager integration in Window (Tab/Shift+Tab navigation)
  • OnTextInput handler (platform character input API)
  • Task Manager example (charts, tables, animations)
  • Widget Gallery example (all widgets, 4 design systems, theme switching)
  • Incremental rendering pipeline (ADR-004): frame skip, persistent pixmap, dirty regions
  • Auto RepaintBoundary in ListView (per-item pixel caching)
  • DrawStats observability (CachedWidgets, DirtyRegionCount)
  • Tracker.Intersects() fast path in RepaintBoundary
  • Centralized ImageCache with LRU eviction (64MB, thread-safe)
  • Offscreen renderer (headless widget → *image.RGBA, no GPU/window)
  • Layout cache per-widget (ADR-032, LayoutChild, O(subtree))
  • Animation before layout (GAP-3, Flutter BeginFrame pattern)
  • Unified draw queue (ADR-051/052, backend-agnostic pipeline)
  • GPUView widget (Flutter Texture pattern, ExternalTextureLayer)
  • OS file drag-and-drop bridge (KindFile, DropExternal)
  • Vector icon rendering (SVG → scene geometry, no bitmap)
  • JetBrains SVG window controls (pixel-perfect filled rects)
  • Gesture recognition system (ADR-049, arena-based, Flutter pattern)
  • Unified pointer pipeline (PointerEvent as single source of pointer input)
  • OS clipboard (ClipboardProvider DI, Win32/macOS/Linux)
  • TextField drag selection (drag-to-select, double-click word, triple-click all)
  • Platform accessibility adapters (UIA, AT-SPI2, NSAccessibility)
  • Software backend performance optimization (naga Go+SIMD, SPIR-V SIMD)
  • Android support (wgpu#268, Vulkan arm64)

Requirements

DependencyPurposeStatus
Go 1.25+Language runtimeRequired
CGO_ENABLED=0Pure Go (no C compiler needed)Default
gogpu/gogpuWindowing, input, GPU surfaceFor examples
gogpu/gg2D graphics renderingIntegrated
gogpu/gpucontextShared interfacesIntegrated
coregx/signalsReactive state managementIntegrated

Note: The entire ecosystem is pure Go. Do not set CGO_ENABLED=1 — this will cause build errors from the goffi package which requires CGO to be disabled.


Installation

# UI toolkit (library)
go get github.com/gogpu/ui@latest
# For runnable applications you also need gogpu (windowing) and gg (rendering):
go get github.com/gogpu/gogpu@latest
go get github.com/gogpu/gg@latest

Related Projects

ProjectDescription
gogpu/gogpuGraphics framework — GPU abstraction, windowing, input
gogpu/gg2D graphics — Canvas API, GPU text
gogpu/wgpuPure Go WebGPU — Vulkan, Metal, DX12, GLES, Software, Browser
gogpu/nagaShader compiler — WGSL to SPIR-V, MSL, GLSL, HLSL, DXIL
gogpu/g3dPure Go 3D rendering — scene graph, PBR, forward renderer
gogpu/composeMulti-process composition — Unix socket, LZ4, hot-plug
gogpu/audioPure Go audio engine — WASAPI, WAV decoder, Mixer

Total ecosystem: 1.14M+ lines of Pure Go — zero CGO, Rust optional via -tags rust (ADR-038). Android/arm64 in review.


Contributing

Contributions are welcome! Please read CONTRIBUTING.md for guidelines.

Ways to contribute:

  • Test the packages, report bugs
  • API feedback and suggestions
  • Documentation improvements
  • Software backend profiling and optimization
  • Spread the word (Hacker News, Dev.to, GitHub Discussions)
  • Code contributions (see open issues)

License

MIT License — see LICENSE for details.


Star History

Star History Chart

gogpu/ui — Enterprise-grade GUI for Go
Part of the GoGPU ecosystem

About

Pure Go GUI toolkit built on GoGPU — widgets, layouts, styling

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

440 stars

Watchers

9 watching

Forks

Releases

Sponsor this project

Packages

Used by

Contributors

Languages