Fuaran.UI.VisualBasic
0.71.0
Prefix Reserved
dotnet add package Fuaran.UI.VisualBasic --version 0.71.0
NuGet\Install-Package Fuaran.UI.VisualBasic -Version 0.71.0
<PackageReference Include="Fuaran.UI.VisualBasic" Version="0.71.0" />
<PackageVersion Include="Fuaran.UI.VisualBasic" Version="0.71.0" />
<PackageReference Include="Fuaran.UI.VisualBasic" />
paket add Fuaran.UI.VisualBasic --version 0.71.0
#r "nuget: Fuaran.UI.VisualBasic, 0.71.0"
#:package Fuaran.UI.VisualBasic@0.71.0
#addin nuget:?package=Fuaran.UI.VisualBasic&version=0.71.0
#tool nuget:?package=Fuaran.UI.VisualBasic&version=0.71.0
Fuaran.UI.VisualBasic
Author Fuaran UI trees in VB via first-class XML literals — the notation the design brief calls the strongest argument for VB tier-1 parity (it is closer to the VBA mental model than fluent builders).
Imports Fuaran.UI.VisualBasic
Dim tree = <Dashboard id="root">
<Heading id="title" text="Channel performance"/>
<Markdown id="note" text="**Hello** from a Fuaran tree."/>
</Dashboard>
Dim wireJson As String = FuaranXml.Encode(tree)
This is the first tree of the VB get-started track — the same example, rendered live from its canonical wire JSON on the site.
FuaranXml.Translate walks the runtime XElement and drives the shared C# factory
surface, so a VB-authored tree inherits per-component ARIA and encodes through the
same F# codec every host uses — there is no VB codec, and no FSharp.Core type appears
on the surface you touch.
Conventions
- An attribute is a literal; a
"$name"value is a bound query (value="$revenue"). - A
"$state.name"value is a writable state slot (open="$state.panelOpen"). See "The two binding prefixes" below — the difference is direction, and it decides whether a control is live. format-currency/format-number/format-percent/format-datemap to the bounded cell-format vocabulary.- Nested elements become the parent's children.
dispatch="…"is author-side metadata — the wire carries no message type (§4g).
The two binding prefixes
Both start with $, and they differ in direction:
| Spelling | Binding | Direction |
|---|---|---|
value="$revenue" |
Binding.Query |
the host feeds it; the tree reads it |
open="$state.panelOpen" |
Binding.State |
reactive state the tree reads and writes |
Only the second makes a control live on its own. When a control's value binding is a state slot and you author no handler, the renderer writes the changed value straight back to that slot and every reader of the key re-renders — no host code, and it survives serialisation because there is no closure in it to lose:
<Disclosure id="details" heading="Advanced" open="$state.advancedOpen">
<Markdown id="body" text="Toggling this writes `advancedOpen` and re-renders every reader."/>
</Disclosure>
<DataGrid id="plan" source="$state.planRows" editable="true" edit-state-key="planRows">
<Column type="text" field="month" label="Month"/>
<Column type="numeric" field="revenue" label="Revenue"/>
</DataGrid>
A query-bound control with no handler is inert — the write-back has nowhere to write —
which is what the FUARAN069 pre-emit check reports.
Three details worth knowing:
$state.namebinds the slot; it declares no initial value. Where a control has an initial state it has its own attribute for it (default-openon aDisclosure), which keeps one fact in one place. A state binding that carries a default is a different wire document, and it is authorable from the C# factory surface (Binding.State(key, value)) rather than from a second XML spelling.$stateand$state.are errors, not queries namedstate— the prefix must carry a key. The analyzer reports it asFUARAN117at compile time.$statefulis still a query namedstateful. The discriminator is the$state.prefix, not the letters.
Pair with Fuaran.UI.Analyzers for compile-time checking of element/attribute
names (an unmapped element is otherwise a runtime error). See docs/vbnet-authoring.md.
Prefer fluent builders? The C# factory surface (Fuaran.UI.CSharp) is plain .NET and
callable from VB directly, byte-identical on the wire — see the authoring guide's
"Prefer fluent?" section.
| 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.Core (>= 5.0.0)
- FSharp.Core (>= 10.1.300)
- Fuaran.Core.Column (>= 0.18.0)
- Fuaran.Core.DataFrame (>= 0.18.0)
- Fuaran.Core.Function (>= 0.18.0)
- Fuaran.Core.Ops (>= 0.18.0)
- Fuaran.Core.OpStream (>= 0.18.0)
- Fuaran.Core.Tree (>= 0.18.0)
- Fuaran.Core.Validator (>= 0.18.0)
- Fuaran.Core.Wire (>= 0.18.0)
- Fuaran.UI.CSharp (>= 0.71.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.71.0 | 0 | 9/4/2026 |
| 0.70.0 | 0 | 9/4/2026 |
| 0.46.0 | 78 | 8/28/2026 |
| 0.39.0 | 83 | 8/27/2026 |
| 0.35.0 | 92 | 8/24/2026 |
| 0.32.0 | 89 | 8/23/2026 |
| 0.31.0 | 88 | 8/21/2026 |
| 0.30.0 | 90 | 8/21/2026 |
| 0.29.0 | 91 | 8/19/2026 |
| 0.28.0 | 91 | 8/18/2026 |
| 0.27.0 | 90 | 8/18/2026 |
| 0.26.0 | 90 | 8/18/2026 |
| 0.18.0 | 95 | 8/10/2026 |
| 0.15.0 | 96 | 8/9/2026 |
| 0.12.0 | 112 | 7/31/2026 |
| 0.11.0 | 102 | 7/30/2026 |
| 0.10.0 | 107 | 7/29/2026 |
| 0.6.0 | 101 | 7/27/2026 |
| 0.4.0 | 108 | 7/26/2026 |
| 0.3.0 | 115 | 7/24/2026 |