FS.GG.UI.Controls.Elmish
0.14.0
Prefix Reserved
See the version list below for details.
dotnet add package FS.GG.UI.Controls.Elmish --version 0.14.0
NuGet\Install-Package FS.GG.UI.Controls.Elmish -Version 0.14.0
<PackageReference Include="FS.GG.UI.Controls.Elmish" Version="0.14.0" />
<PackageVersion Include="FS.GG.UI.Controls.Elmish" Version="0.14.0" />
<PackageReference Include="FS.GG.UI.Controls.Elmish" />
paket add FS.GG.UI.Controls.Elmish --version 0.14.0
#r "nuget: FS.GG.UI.Controls.Elmish, 0.14.0"
#:package FS.GG.UI.Controls.Elmish@0.14.0
#addin nuget:?package=FS.GG.UI.Controls.Elmish&version=0.14.0
#tool nuget:?package=FS.GG.UI.Controls.Elmish&version=0.14.0
FS.GG.UI.Controls.Elmish
Elmish command, subscription, and program adapters for Controls and KeyboardInput runtime effects.
FS.GG.UI.Controls.Elmish is one of the FS.GG.UI distribution packages — an F# / Elmish UI and 2D
scene-graph framework for .NET 10 desktop, rendered through Vulkan + SkiaSharp.
Use this package for products built on the semantic control set — buttons, text boxes, grids — driven by an interactive host (
runInteractiveApp/program, Cmd/subscriptions). Every FS.GG.UI sample uses it. Its siblingFS.GG.UI.Elmishis the lower-level pure scene adapter (aSceneNodeview, no control tree); pick by what your view produces.
Install
dotnet add package FS.GG.UI.Controls.Elmish
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
open FS.GG.UI.KeyboardInput
open FS.GG.UI.Controls.Elmish
// Lift a fired keyboard command into your own message type.
type Msg =
| Activate of CommandId
| Runtime of ControlRuntimeMsg
let init () : Model * AdapterCommand<Msg> = initialModel, []
let update (msg: Msg) (model: Model) : Model * AdapterCommand<Msg> =
match msg with
| Activate cmd -> model, [ ReportAdapterDiagnostic(ControlsElmish.diagnostic "update" "activated" (string cmd)) ]
| Runtime _ -> model, []
let subscribe (_: Model) =
// Interpret keyboard effects into adapter commands, then expose them as subscriptions.
let keyboardSubs = [ { Id = "keyboard"; Subscribe = fun () -> ControlsElmish.interpretKeyboardEffect Activate keyboardEffect } ]
ControlsElmish.subscriptions keyboardSubs []
// Build the adapter program that drives Controls + keyboard runtime effects.
let app : AdapterProgram<Model, Msg> =
ControlsElmish.program init update view subscribe
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.
API at a glance
ControlsElmish.program— assembles anAdapterProgram<'model,'msg>frominit,update,view, andsubscriptionsfunctions, the entry point for wiring an Elmish loop.ControlsElmish.interpretKeyboardEffect— turns aKeyboardEffectinto anAdapterCommand<'msg>, mapping each firedCommandIdthrough yourmapCommandfunction.ControlsElmish.interpretControlEffect— turns aControlRuntimeEffectinto anAdapterCommand<'msg>, mappingControlRuntimeMsgvalues through yourmapRuntimefunction.ControlsElmish.subscriptions— merges keyboard and controlAdapterSubscription<'msg>lists into one subscription list for the program.ControlsElmish.diagnostic— builds anAdapterDiagnostic(source, code, message) for reporting adapter-level issues.ControlsElmish.responsivenessTimingContribution— projects existingFrameMetricsinto the adapter-owned timing fields used by SkiaViewer responsiveness records: routing, update, retained step, layout/text, product message count, and no-visible-response reason.ControlsElmish.diagnosticsDisabledCompatibility— verifies that diagnostics-disabled deterministicPerf.runScriptmetrics stay clock-free and unchanged, with no responsiveness records written.AdapterEffect<'msg>— the effect union (DispatchProductMessage,DispatchControlRuntimeMessage,DispatchKeyboardMessage,DispatchHostCommand,ReportAdapterDiagnostic); anAdapterCommand<'msg>is a list of these.AdapterProgram<'model,'msg>/AdapterSubscription<'msg>— the program and subscription records that carryInit/Update/View/SubscriptionsandId/Subscriberespectively.
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
- Fable.Elmish (>= 5.0.2)
- FS.GG.Audio.Core (>= 0.1.0)
- FS.GG.UI.Controls (>= 0.14.0)
- FS.GG.UI.Diagnostics (>= 0.14.0)
- FS.GG.UI.KeyboardInput (>= 0.14.0)
- FS.GG.UI.SkiaViewer (>= 0.14.0)
- FSharp.Core (>= 10.1.302)
- HarfBuzzSharp.NativeAssets.Linux (>= 14.2.1)
- HarfBuzzSharp.NativeAssets.Win32 (>= 14.2.1)
- Silk.NET.GLFW (>= 2.23.0)
- Silk.NET.Input (>= 2.23.0)
- Silk.NET.OpenGL (>= 2.23.0)
- Silk.NET.Windowing (>= 2.23.0)
- Silk.NET.Windowing.Extensions (>= 2.23.0)
- Silk.NET.Windowing.Glfw (>= 2.23.0)
- SkiaSharp (>= 4.150.0)
- SkiaSharp.HarfBuzz (>= 4.150.0)
- SkiaSharp.NativeAssets.Linux (>= 4.150.0)
- SkiaSharp.NativeAssets.Win32 (>= 4.150.0)
- Yoga.Net (>= 3.2.3)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on FS.GG.UI.Controls.Elmish:
| Package | Downloads |
|---|---|
|
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 | 111 | 7/20/2026 |
| 0.14.0 | 89 | 7/19/2026 |
| 0.13.0 | 117 | 7/18/2026 |
| 0.12.0 | 241 | 7/17/2026 |
| 0.11.0 | 348 | 7/16/2026 |
| 0.10.0 | 681 | 7/14/2026 |
| 0.9.2 | 558 | 7/13/2026 |
| 0.9.0 | 704 | 7/11/2026 |
| 0.8.0 | 222 | 7/11/2026 |
| 0.7.0 | 167 | 7/11/2026 |
| 0.6.0 | 146 | 7/10/2026 |
| 0.5.0 | 205 | 7/10/2026 |
| 0.4.0 | 294 | 7/9/2026 |
| 0.4.0-preview.1 | 61 | 7/9/2026 |
| 0.3.0-preview.1 | 71 | 7/7/2026 |
| 0.2.0-preview.1 | 63 | 7/6/2026 |
| 0.1.64-preview.1 | 77 | 7/5/2026 |
| 0.1.63-preview.1 | 83 | 7/4/2026 |
| 0.1.62-preview.1 | 61 | 7/4/2026 |