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
20 changes: 20 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,26 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.1.54] — 2026-08-13

### Added

- **Gesture recognition system** (ADR-049) — Flutter-inspired arena-based gesture disambiguation. New `gesture/` package: `Arena`, `ClickRecognizer`, `DragRecognizer`, `LongPressRecognizer`, `TapAndDragRecognizer`, `VelocityTracker`, `Team` cooperative groups. `GestureAware` interface for widget opt-in. Per-device thresholds (mouse 1px, touch 18px). Signals integration via functional options. 124 tests, 96.0% coverage, ~5K LOC.
- **Unified pointer pipeline** — `PointerEvent` as single source of all pointer input. Replaces legacy mouse event callbacks with a structured pointer event type that carries device kind, pointer ID, button state, and coordinates. Foundation for future touch/pen/stylus input.
- **TextField drag selection** ([#225](https://github.com/gogpu/ui/issues/225)) — mouse drag to select text, double-click to select word, triple-click to select all.
- **OS clipboard** — `widget.ClipboardProvider` DI pattern (same as `SoundPlayer`), wired to platform clipboard (Win32, macOS, Linux) via `widget.RegisterClipboardProvider()`. `widget.ClipboardRead()` / `widget.ClipboardWrite()` for widget-level clipboard access.

### Changed

- All 20+ interactive widgets implement `gesture.GestureAware` — button, checkbox, radio, textfield, dropdown, slider, dialog, scrollview, tabview, listview, gridview, collapsible, popover, splitview, treeview, datatable, toolbar, menu, docking, chip, stripe, titlebar.
- Event bridge: unified pointer pipeline (ADR-049 Phase 3) — pointer events flow through gesture arena before widget dispatch.
- **deps:** gg v0.52.2 → v0.52.3, gogpu v0.52.1 → v0.53.0, gpucontext v0.27.0 → v0.28.0, wgpu v0.31.2 → v0.31.4

### Fixed

- **fix(desktop): retain unchanged boundaries on resize** ([#176](https://github.com/gogpu/ui/issues/176), @besmpl) — unchanged boundaries preserved during window resize.
- **fix(app): keep pointer events within window bounds** ([#179](https://github.com/gogpu/ui/issues/179), @besmpl) — pointer coordinates clamped to window dimensions.

## [0.1.53] — 2026-08-11

### Added
Expand Down
3 changes: 2 additions & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -209,9 +209,10 @@ Look for issues labeled `good first issue`:
### Larger Contributions

For significant changes, **open an issue first** to discuss:
- New widgets
- New widgets (must implement `gesture.GestureAware` for pointer interaction)
- Layout algorithms
- Theme implementations
- Custom gesture recognizers (implement `gesture.Recognizer` interface)
- Accessibility features

---
Expand Down
10 changes: 9 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
| **CGO-free** | Yes | No | Yes |
| **WebGPU rendering** | Yes (Vulkan/DX12/Metal/GLES/Software) | OpenGL | Direct GPU |
| **Reactive state** | Signals (push-pull, zero glitch) | Binding | Events |
| **Gesture recognition** | Arena-based (Flutter pattern) | No | No |
| **Layout engine** | Flexbox + Grid + per-widget cache | Custom | Flex |
| **Accessibility** | Day 1 (35+ ARIA roles) | Limited | Limited |
| **Design systems** | 4 (M3, DevTools, Fluent, Cupertino) | 1 | 1 |
Expand Down Expand Up @@ -212,10 +213,11 @@ func main() {

| `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: ~207,000+ lines of code | 56+ packages | ~7,500+ tests | 97%+ average coverage**
**Total: ~220,000+ lines of code | 70 packages | ~7,800+ tests | 97%+ average coverage**

### Backend Selection

Expand Down Expand Up @@ -262,6 +264,8 @@ The **software backend** runs on any machine without GPU drivers. It uses the sa
├─────────────────────────────────────────────────────────────┤
│ icon/ │ i18n/ │ dnd/ │ uitest/ │ theme/font/ │
├─────────────────────────────────────────────────────────────┤
│ gesture/ (Arena, Click, Drag, LongPress, Team) │
├─────────────────────────────────────────────────────────────┤
│ app/ + FocusManager │ focus/ │ overlay/ │ render/ │
├─────────────────────────────────────────────────────────────┤
│ desktop/ (Layer Tree Compositor + Damage-Aware Blit) │
Expand Down Expand Up @@ -708,6 +712,10 @@ testApp.Window().Frame() // processes layout + draw
- [x] OS file drag-and-drop bridge (KindFile, DropExternal)
- [x] Vector icon rendering (SVG → scene geometry, no bitmap)
- [x] JetBrains SVG window controls (pixel-perfect filled rects)
- [x] Gesture recognition system (ADR-049, arena-based, Flutter pattern)
- [x] Unified pointer pipeline (PointerEvent as single source of pointer input)
- [x] OS clipboard (ClipboardProvider DI, Win32/macOS/Linux)
- [x] 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)
Expand Down
30 changes: 17 additions & 13 deletions ROADMAP.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# gogpu/ui Roadmap

> **Version:** 0.1.52
> **Version:** 0.1.54
> **Updated:** August 2026
> **Go Version:** 1.25+

Expand All @@ -23,6 +23,7 @@ Go has waited 17 years for a professional graphics ecosystem. We're building it:
- Pure Go by default (zero CGO), Rust backend optional via `-tags rust` (ADR-038 triple-backend)
- WebGPU-first rendering via gogpu/wgpu (Vulkan/Metal/DX12/GLES/Software/Browser)
- Signals-based reactive state (coregx/signals — hybrid push-pull, zero glitch)
- Arena-based gesture recognition (Flutter GestureArena protocol, ADR-049)
- Layer Tree compositor with damage-aware blit (Flutter/Chrome patterns)
- Four design systems: Material 3, DevTools (JetBrains), Fluent, Cupertino
- Polymorphic Content[C] pattern (CDK — inspired by taiga-family/polymorpheus)
Expand All @@ -35,14 +36,15 @@ Go has waited 17 years for a professional graphics ecosystem. We're building it:

| Metric | Value |
|--------|-------|
| Packages | 56+ |
| Total LOC (scc) | ~207,000+ |
| Test Functions | ~7,500+ |
| Packages | 70 |
| Total LOC (scc) | ~220,000+ |
| Test Functions | ~7,800+ |
| Test Coverage | 97%+ |
| Linter Issues | 0 |
| Interactive Widgets | 27 |
| Design Systems | 4 (M3, DevTools, Fluent, Cupertino) |
| Painters | 70 (24 + 24 + 11 + 11) |
| Gesture Recognition | Arena-based (ADR-049), 4 recognizers, Flutter pattern |
| Layout Cache | Per-widget (ADR-032), O(affected subtree) |
| Render Pipeline | Unified draw queue (ADR-051/052), backend-agnostic |

Expand Down Expand Up @@ -140,6 +142,10 @@ Slider, Dialog, Animation engine (Tween, Spring, M3 motion), ScrollView, TabView
| Overlay boundary pipeline | Dropdown/dialog via Layer Tree |
| Custom font pipeline | FontRegistry, StyledTextDrawer |
| PointerCapturer | ADR-031, widget-level mouse capture |
| Gesture recognition (ADR-049) | Arena-based disambiguation, 4 recognizers, Team groups, VelocityTracker |
| 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 |
| 34 integration tests | Multi-frame lifecycle, visibility matrix |
| Badge widget | Notification badge (dot/count), signal bindings |
| Chip widget | Action/filter chip (M3 spec), toggleable, two-way signal |
Expand Down Expand Up @@ -215,7 +221,7 @@ Platform-specific features for native feel.
| **Native file dialogs** | Open/Save/Folder via system dialogs | P1 |
| **Clipboard rich content** | HTML/RTF clipboard support | P2 |
| **IME support** | Input method for CJK languages | P2 |
| **Touch/gesture input** | Pinch, swipe, long press | P2 |
| **Touch/gesture input** | Pinch, swipe (gesture/ infrastructure in place — ADR-049) | P2 |

### Phase 9: API Freeze & Stabilization (v0.9.x — Q2-Q3 2027)

Expand Down Expand Up @@ -343,6 +349,7 @@ All releases must follow this cascade. Breaking changes in lower layers require
| Layer Tree compositor | Flutter, Chrome, Qt6, Android | `compositor/` package |
| Pluggable Painters | All design systems (Swing L&F, Qt styles) | Painter interfaces per widget |
| Polymorphic Content[C] | taiga-family/polymorpheus | `cdk/` package |
| Arena gesture disambiguation | Flutter GestureArena | `gesture/` package |
| Signal-driven reactivity | Angular Signals, SolidJS, Preact | `state/` + coregx/signals |
| Functional Options | Go community best practice | All widget constructors |
| RepaintBoundary | Flutter RenderObject.isRepaintBoundary | `widget.WidgetBase` property |
Expand All @@ -363,13 +370,13 @@ All releases must follow this cascade. Breaking changes in lower layers require

| Dependency | Version | Purpose |
|------------|---------|---------|
| gogpu/gg | v0.50.6 | 2D rendering + unified draw queue (ADR-051/052) |
| gogpu/gogpu | v0.44.8 | Windowing, input (examples) |
| gogpu/gpucontext | v0.21.1 | Shared interfaces (opaque struct tokens) |
| gogpu/gg | v0.52.2 | 2D rendering + unified draw queue (ADR-051/052) |
| gogpu/gogpu | v0.52.1 | Windowing, input (examples) |
| gogpu/gpucontext | v0.27.0 | Shared interfaces (opaque struct tokens) |
| coregx/signals | v0.1.1 | Reactive state management |
| golang.org/x/image | v0.44.0 | Inter font (standard) |

**Indirect:** gogpu/wgpu v0.30.21, gogpu/naga v0.17.15, gogpu/gputypes v0.5.1, go-text/typesetting v0.3.4
**Indirect:** gogpu/wgpu v0.31.2, gogpu/naga v0.18.0, gogpu/gputypes v0.5.2, go-text/typesetting v0.3.4

---

Expand Down Expand Up @@ -403,10 +410,7 @@ All releases must follow this cascade. Breaking changes in lower layers require
| UI Repository | https://github.com/gogpu/ui |
| Discussions | https://github.com/orgs/gogpu/discussions/18 |
| awesome-go listing | https://github.com/avelino/awesome-go |
| Kanban Tasks | `docs/dev/kanban/` |
| Research | `docs/dev/research/` |
| ADRs | `docs/dev/architecture/` |

---

*This roadmap evolves with the project. Last updated: July 2026.*
*This roadmap evolves with the project. Last updated: August 2026.*
Loading
Loading