FS.GG.UI.Scene
0.30.0
Prefix Reserved
dotnet add package FS.GG.UI.Scene --version 0.30.0
NuGet\Install-Package FS.GG.UI.Scene -Version 0.30.0
<PackageReference Include="FS.GG.UI.Scene" Version="0.30.0" />
<PackageVersion Include="FS.GG.UI.Scene" Version="0.30.0" />
<PackageReference Include="FS.GG.UI.Scene" />
paket add FS.GG.UI.Scene --version 0.30.0
#r "nuget: FS.GG.UI.Scene, 0.30.0"
#:package FS.GG.UI.Scene@0.30.0
#addin nuget:?package=FS.GG.UI.Scene&version=0.30.0
#tool nuget:?package=FS.GG.UI.Scene&version=0.30.0
FS.GG.UI.Scene
Dependency-light scene vocabulary for FS.GG.UI V3 products.
FS.GG.UI.Scene 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.Scene
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.Scene
// Build a small immutable scene from typed constructors.
let scene =
Scene.group
[ Scene.filledRectangle
{ X = 0.0; Y = 0.0; Width = 320.0; Height = 240.0 }
(Colors.rgb 30uy 30uy 40uy)
Scene.circle { X = 160.0; Y = 120.0 } 48.0 (Colors.rgb 200uy 60uy 60uy)
Scene.line
{ X = 0.0; Y = 0.0 }
{ X = 320.0; Y = 240.0 }
(Paint.stroke Colors.white 2.0)
Scene.textAt { X = 12.0; Y = 24.0 } "Hello, Skia" Colors.white ]
// Inspect the element kinds without touching a GPU.
let kinds = Scene.describe scene
// Export a deterministic portable package and inspect it before any renderer runs.
let package = SceneCodec.export scene
let report = SceneCodec.inspect package.CanonicalBytes
// Produce deterministic render-readback evidence for a fixed output size.
let evidence =
Scene.renderReadbackEvidence { Width = 320; Height = 240 } scene
// Build dependency-light structured inspection facts without depending on Controls or Testing.
let finding =
VisualInspection.finding
"text-contained-in-owner"
VisualInspectionSeverity.Blocking
[ "title" ]
[]
"title text exceeds its owner"
"text inside owner bounds"
"overflow"
// Import only the inert supported SVG subset. Source ids become asset-local.
let imported =
SvgImport.importXml
{ AssetNamespace = "icons/menu"; DocumentId = "menu-icon"; Limits = SvgDocument.defaultLimits }
"<svg viewBox=\"0 0 16 16\"><path id=\"outline\" d=\"M 1 2 L 15 2 Z\"/></svg>"
// Group edits into one validated revision and one undo entry.
let committed =
match imported with
| Error issues -> Error(SvgAuthoringError.InvalidTransaction issues)
| Ok document ->
SvgAuthoring.tryCreate 0 document { Schema = SvgAsset.catalogSchema; Assets = [] } []
|> Result.bind (fun state ->
SvgAuthoring.commit
0
{ Schema = SvgAuthoring.transactionSchema
Id = "move"
Operations =
[ SvgAuthoringOperation.TransformElements(
[ "icons-menu--outline" ], SvgAffine.translate 2.0 0.0) ] }
state)
API at a glance
Scenemodule — immutable scene constructors (empty,group,filledRectangle,circle,filledEllipse,line,path,textAt,image,clipped,picture,chart) plus inspection helpers (describe,diagnostics,measureText).Colorsmodule —Colorconstructors and presets (rgba,rgb,black,white,transparent).Paintmodule — builds and refinesPaintvalues: start fromfill/stroke, then layerwithOpacity,withBlendMode,withShader, and the filter/effectwith*combinators.Pathmodule — assemblesPathSpecgeometry (moveTo,lineTo,quadTo,cubicTo,create) and queries it (bounds,measure,segment,combine).Scene/SceneNodetypes — the core record and discriminated-union scene-graph vocabulary that every constructor produces.SceneCodecmodule — exports/imports deterministic portable scene packages, computes package identities, inspects protocol/capability/resource compatibility, and compares imported scenes.SceneEvidencemodule — renders aSceneEvidenceRequestto deterministic evidence, returningResult(render,renderHash,renderPng).LayoutEvidencemodule — derives andclassifysLayoutEvidenceReportHUD/gameplay layout proofs from render-readback evidence.VisualInspectionmodule and records — dependency-light structured inspection vocabulary for scopes, nodes, regions, text runs, paint coverage, clipping, unsupported facts, findings, artifacts, summaries, stable status tokens, finding ids, and deterministic artifact diagnostics.SvgImport— bounded parsing for the inert rectangle/path (M/L/Q/C/Z)/gradient/clip/mask/symbol SVG subset. It namespaces ids and rejects DTD/entity, script/event,foreignObject, CSS/filter, external URL, malformed, compressed, and over-budget input before returning a validatedSvgDocument.SvgAssetandSvgAssetCatalog— versioned documents with canonical SHA-256, rights metadata, dependency validation, cycle refusal, accepted prefab revisions, typed overrides, and conflicts.SvgAuthoring— revision-guarded atomic transactions, grouped previews/cancellation, whole-group undo/redo, explicit shared-instance revision updates, immutable asset revisions, and immutable play snapshots.SvgArt— pure primitive/path creation and editing, transforms, grouping, alignment, ordering, presentation, gradients, document-space snapping, and guides.SvgAuthoringremains the sole history owner.SvgGeometry— bounded adaptive curve flattening and identity-bound worker/result transactions for optional presentation-authoring Boolean geometry. It is not collision authority.SvgResourceInterchange— the narrow generated embedded-WOFF2 profile. It verifies approved Noto Sans Latin 400 bytes and returns resources detached from the normal typed document; ordinarySvgImportstill rejects CSS and data URLs.SvgScene— the boundedfsgg.svg-scene/1interchange envelope for one typed document, immutable asset catalog, pinned instances, generic entity properties, optional grid and verified resource references.SvgScenePlacementsupplies explicit-origin grid snapping and fraction-preserving freeform placement.SvgWorkspace— portable Create/Arrange/Play/Review mode, panel preference, responsive placement, focus and overlay state. Its boundedfsgg.svg-workspace-layout/1codec preserves accepted dock preferences while narrow viewports collapse only the effective side-panel projection.
The curated Fable package includes SvgDocument, SvgAuthoring, SvgScene, SvgArt, SvgGeometry, SvgWorkspace, and resource-aware interchange; it has no Game, Skia, native, browser-DOM, or Controls dependency. fsgg.svg-document/1 remains the canonical typed document format inside the additive scene envelope.
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
- FSharp.Core (>= 10.1.302)
NuGet packages (12)
Showing the top 5 NuGet packages that depend on FS.GG.UI.Scene:
| Package | Downloads |
|---|---|
|
FS.GG.UI.KeyboardInput
Package-owned keyboard input runtime, reducer, effect, diagnostics, and state display contracts for FS.GG.UI products. |
|
|
FS.GG.UI.SkiaViewer
Skia viewer host workflow contracts for FS.GG.UI V3 products. |
|
|
FS.GG.UI.DesignSystem
Design-system primitives: token model, Theme record, ResolvedStyle, style variants/classes, visual/validation state, and the pure Style.resolve resolver. Depends only on the scene vocabulary. |
|
|
FS.GG.UI.Layout
Pure layout and graph scene builders for FS.GG.UI. |
|
|
FS.GG.UI.Canvas
Dependency-light pure element library and Persistence request surface for FS.GG.UI canvas products. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.30.0 | 0 | 9/13/2026 |
| 0.29.0 | 518 | 9/12/2026 |
| 0.28.0 | 1,130 | 8/24/2026 |
| 0.27.0 | 459 | 8/22/2026 |
| 0.26.0 | 1,039 | 8/3/2026 |
| 0.21.1 | 1,620 | 7/26/2026 |
| 0.21.0 | 318 | 7/26/2026 |
| 0.20.0 | 318 | 7/26/2026 |
| 0.19.0 | 453 | 7/23/2026 |
| 0.18.6 | 311 | 7/23/2026 |
| 0.18.5 | 301 | 7/22/2026 |
| 0.18.4 | 297 | 7/22/2026 |
| 0.18.0 | 389 | 7/22/2026 |
| 0.15.0 | 461 | 7/20/2026 |
| 0.14.0 | 317 | 7/19/2026 |
| 0.13.0 | 342 | 7/18/2026 |
| 0.12.0 | 468 | 7/17/2026 |
| 0.11.0 | 534 | 7/16/2026 |
| 0.10.0 | 6,735 | 7/14/2026 |
| 0.9.2 | 936 | 7/13/2026 |