FS.GG.UI.Controls
0.13.0
Prefix Reserved
See the version list below for details.
dotnet add package FS.GG.UI.Controls --version 0.13.0
NuGet\Install-Package FS.GG.UI.Controls -Version 0.13.0
<PackageReference Include="FS.GG.UI.Controls" Version="0.13.0" />
<PackageVersion Include="FS.GG.UI.Controls" Version="0.13.0" />
<PackageReference Include="FS.GG.UI.Controls" />
paket add FS.GG.UI.Controls --version 0.13.0
#r "nuget: FS.GG.UI.Controls, 0.13.0"
#:package FS.GG.UI.Controls@0.13.0
#addin nuget:?package=FS.GG.UI.Controls&version=0.13.0
#tool nuget:?package=FS.GG.UI.Controls&version=0.13.0
FS.GG.UI.Controls
Declarative Skia controls, rich rendering, chart controls, graph controls, DataGrid, and product-owned control runtime contracts.
FS.GG.UI.Controls is one of the FS.GG.UI distribution packages — an F# / Elmish UI and 2D
scene-graph framework for .NET 10 desktop, rendered through OpenGL + SkiaSharp.
Install
dotnet add package FS.GG.UI.Controls
Or scaffold a full governed project that wires the FS.GG.UI packages together:
dotnet new install FS.GG.UI.Template
dotnet new fs-gg-ui -o MyApp
Usage
open FS.GG.UI.Controls
type Msg =
| Increment
| RangeChanged of string
// Declare controls; each `create` takes an `Attr<'msg> list`.
let view =
Stack.create
[ Stack.children
[ Label.create [ Label.text "Quarterly revenue" ]
Button.create [ Button.text "Add"; Button.onClick Increment ]
LineChart.create
[ LineChart.series
[ { Name = "EU"
Points = [ { X = 0.0; Y = 12.0; Label = None }
{ X = 1.0; Y = 18.0; Label = None } ] } ] ]
GraphView.create [ GraphView.nodes [ "ingest"; "transform"; "emit" ] ] ] ]
// Render against a built-in theme to get a Scene + layout + diagnostics.
let result : ControlRenderResult<Msg> = Control.render Theme.dark view
// Inspect the same renderTree path as structured layout/text/paint metadata.
let inspection =
ControlInspection.inspect
{ Scope = { ScopeId = "dashboard"; Title = "Dashboard"; Required = true }
Theme = Theme.dark
OutputSize = { Width = 1280; Height = 800 }
Control = view
Presentation = "dark"
RunId = Some "local-run"
RelatedVisualEvidence = [] }
API at a glance
Control— core lifecycle:create/standard/customControlbuild nodes,renderproduces aControlRenderResult(scene, layout, diagnostics, event bindings), anddispatch/diagnosticsinspect aControl<'msg>. Rendering also clips every container's children to its bounds (no spill), paintsOverlay-built transient surfaces last (z-top, escaping ancestor clips —isOverlaySurface), and makesscroll-viewera real clipping viewport.scrollViewportreads backScrollViewportgeometry with content width/height, horizontal/vertical max offsets, extent source, and diagnostics derived from the Layout intrinsic protocol. Seedocs/bridge/feature-137-render-blockers.md.ControlInspection— additive structured inspection overControl.renderTree, emitting stable node ids, final bounds, ownership, visual order, text-fit facts, clip facts, paint coverage, surface roles, diagnostics, and explicit unsupported facts without changing rendered output or event bindings.- Declarative control modules —
Button,Label,TextBlock,CheckBox,Slider,TextBox,Stack,Grid,Border,Tabs,Dialog, and more, each withcreateplus content/event attributes liketext,onClick, andchildren. Charts—LineChart,BarChart,PieChart,ScatterPlot, andGraphView, fed byChartSeries/ChartPointrecords.DataGrid— virtualized grid with an Elmishinit/updateoverDataGridModel,DataGridMsg, andDataGridEffect, plus a declarativecreateusingDataGridColumn/DataGridRow.TextInput— stateful editor (init/update) overTextInputModel,TextInputMsg, andTextInputEffect, covering selection, clipboard, composition, and validation.Theme— built-inlight/darkpalettes pluswithDensity,withAccent, andresolvefor theThemerecord consumed byControl.render.Attr— low-level attribute builders (text,value,children,theme,validation,on/onWith) for composingAttr<'msg>values directly. Layout builders includepadding,margin,gap,alignItems,alignSelf,justifyContent,flexGrow,flexShrink,flexBasis,minWidth,minHeight,maxWidth, andmaxHeight; omitted padding/gap keep the Controls compatibility defaults, explicit zero overrides them, and the legacyspacingname is treated as a gap alias.Catalog— the governed control registry:supportedControls,standardSchema, andvalidatedescribe and check the standard control surface.
Compositor diagnostics
Feature147 adds deterministic retained-render policy helpers for damage-union accounting, proof-gated fallback classification, promotion eligibility, placement movement damage, and snapshot-budget verdicts. Feature148 extends the readiness evidence around those helpers: localized/overlap/edge damage, movement old/new regions, content-vs-placement reuse, churn/no-benefit demotion, bounded snapshot eligibility, and timing thresholds are all recorded as reviewable evidence before a compositor tier can claim readiness. The public Controls package keeps the mechanics internal; consumers should inspect the derived CompositorFrameDiagnostics helper from FS.GG.UI.Controls.Elmish when reviewing proof readiness, damage area, fallback reason, reuse counters, demotions, and snapshot byte estimates.
ScrollViewer Extent
Feature150 changes ScrollViewer extent readback to use FS.GG.UI.Layout.Layout.contentExtent.
Small content reports the viewport as the extent and zero max offsets. Overflowing content reports
the natural intrinsic extent while the viewport bounds remain fixed. ContentHeight and Offset
remain available as vertical compatibility aliases; new code should prefer
ContentWidth, MaxHorizontalOffset, MaxVerticalOffset, ExtentSource, and Diagnostics.
Feature151 broadens that acceptance to the full ScrollViewer corpus: empty, small, exact-fit,
overflowing, nested, clipped/layered parent, text-natural-size, dynamic content, and invalid fallback
cases. The accepted path remains Layout.contentExtent; no descendant-bounds walk or public
ScrollViewport shape change is introduced.
Versioning
All FS.GG.UI.* libraries share one version and move together. In a generated project a
single <FsGgUiVersion> in Directory.Packages.props pins every package — upgrading is one
edit; see docs/UPGRADING.md. Pre-release versions use a -preview.N suffix.
Links
- Repository & issues: https://github.com/FS-Skia-UI/FS-Skia-UI
- License: MIT
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- FS.GG.UI.DesignSystem (>= 0.13.0)
- FS.GG.UI.Diagnostics (>= 0.13.0)
- FS.GG.UI.KeyboardInput (>= 0.13.0)
- FS.GG.UI.Layout (>= 0.13.0)
- FS.GG.UI.Scene (>= 0.13.0)
- FSharp.Core (>= 10.1.302)
- Yoga.Net (>= 3.2.3)
NuGet packages (2)
Showing the top 2 NuGet packages that depend on FS.GG.UI.Controls:
| Package | Downloads |
|---|---|
|
FS.GG.UI.Controls.Elmish
Elmish command, subscription, and program adapters for Controls and KeyboardInput runtime effects. |
|
|
FS.GG.UI
Optional BOM / metapackage for the FS.GG.UI framework. Reference this single package at one version to pin the entire coherent FS.GG.UI.* set to that version; any attempt to mix a member at a different version fails loudly at restore/build. Ships no assembly — dependencies only. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.18.0 | 0 | 7/22/2026 |
| 0.15.0 | 131 | 7/20/2026 |
| 0.14.0 | 112 | 7/19/2026 |
| 0.13.0 | 143 | 7/18/2026 |
| 0.12.0 | 275 | 7/17/2026 |
| 0.11.0 | 359 | 7/16/2026 |
| 0.10.0 | 674 | 7/14/2026 |
| 0.9.2 | 571 | 7/13/2026 |
| 0.9.0 | 714 | 7/11/2026 |
| 0.8.0 | 238 | 7/11/2026 |
| 0.7.0 | 186 | 7/11/2026 |
| 0.6.0 | 159 | 7/10/2026 |
| 0.5.0 | 212 | 7/10/2026 |
| 0.4.0 | 311 | 7/9/2026 |
| 0.4.0-preview.1 | 70 | 7/9/2026 |
| 0.3.0-preview.1 | 79 | 7/7/2026 |
| 0.2.0-preview.1 | 66 | 7/6/2026 |
| 0.1.64-preview.1 | 87 | 7/5/2026 |
| 0.1.63-preview.1 | 86 | 7/4/2026 |
| 0.1.62-preview.1 | 69 | 7/4/2026 |