一键导入
fs-skia-ui-widgets
Generated product guidance for Skia-rendered FS.Skia.UI Controls, rich text, chart controls, graph controls, DataGrid, and custom wrappers.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Generated product guidance for Skia-rendered FS.Skia.UI Controls, rich text, chart controls, graph controls, DataGrid, and custom wrappers.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Consumer-facing guide to hosting an interactive FS.Skia.UI app — the keyboard/pointer input surface, the preview-vs-tree render distinction, and the windowed-fullscreen blur caveat.
Build Skia-rendered FS.Skia.UI Controls, rich text, chart controls, graph controls, DataGrid, custom wrappers, and generated product examples.
Wire a generated FS.Skia.UI product to the desktop viewer host.
Understand and work with the internal keyed VDOM diff over the lowered Control<'msg> IR (feature 067) — its key-first-then-positional matching, the NodePatch/ChildOp operation set, the totality/determinism/identity-at-rest/round-trip invariants, and the module's disposition (internal, property-tested, wired onto the live render path via RetainedRender in feature 091 and current through feature 103 — layout/bounds cache, injected-delta animation clock, visual-state cross-fade). Use when reading the diff invariants, extending the property tests, or working on the wired retained render path.
Maintainer-facing guide to the FS.Skia.UI.Controls.Elmish interactive-host seam — how runInteractiveApp drives the retained render structure each frame (RetainedRender.step over the keyed diff), advances per-identity animation clocks from an injected Tick delta, stamps runtime visual state pre-reconcile, routes keys focus-first through routeFocusedKey, and resolves pointer hits to a stable identity via retainedHitTest. Use when reading or extending the live controls host loop, the per-frame retained-state/clock/visual-state wiring, or the key/pointer routing seam.
Generated product guidance for Skia-rendered FS.Skia.UI Controls, rich text, chart controls, graph controls, DataGrid, and custom wrappers.
| name | fs-skia-ui-widgets |
| description | Generated product guidance for Skia-rendered FS.Skia.UI Controls, rich text, chart controls, graph controls, DataGrid, and custom wrappers. |
Use this skill for generated product screens that compose controls in an Elmish-style view function. Controls is the generated authoring path for ordinary controls, rich text, chart controls, graph controls, DataGrid, and custom wrappers.
Reference FS.Skia.UI.Controls and build Control<'msg> values with
module-per-control create functions and declarative attributes.
DataGrid is a data control with product-owned rows, columns, selection, focus,
and viewport state.
Use typed standard front doors for known controls, events, attributes, chart
data, and DataGrid data. Only use Control.customControl,
Attr.customAttribute, or Attr.customEvent for deliberate product-owned or
vendor extension points; custom usage must be visibly named as custom rather
than masquerading as a misspelled standard control.
CustomControl does NOT rasterize its contentControl.renderTree (the production paint path the live host and every screenshot/preview
use) paints a labeled placeholder for a custom-control — it does not invoke the
CustomControlDefinition Render/Draw/Layout fields, so authored Skia geometry does
not appear in the window or in evidence. The catalog calls it a "product-owned wrapper",
which is for routing custom events/attributes, not for drawing.
So: when geometry must actually show in the rasterized/screenshot path, build it from
primitive controls (Border + TextBlock + Stack), not from one big CustomControl.
A reusable recipe is a fixed-cell grid composed of framed cells/rows that renderTree paints
reliably. Reserve CustomControl for non-visual extension seams.
When the product test project ships no FsCheck reference and the governance decision is "no dependency change," you can still get property-style coverage: drive a deterministic generative loop (a fixed-seed sequence of inputs) through the real engine/function and assert the invariant each iteration. Disclose the pattern in the test file header so it reads as intentional, not as a missing dependency.
Keep product state and messages in the generated product:
type Msg =
| NameChanged of string
| SaveRequested
| GridSelectionChanged of string
type Model =
{ Name: string
Revenue: ChartSeries list
Columns: DataGridColumn list
Rows: DataGridRow list }
let view model : Control<Msg> =
Stack.create [
Stack.children [
TextBox.create [
TextBox.value model.Name
TextBox.onChanged NameChanged
]
Button.create [
Button.text "Save"
Button.onClick SaveRequested
]
LineChart.create [ LineChart.series model.Revenue ]
GraphView.create [ GraphView.nodes [ "form"; "chart"; "grid" ] ]
DataGrid.create model.Columns [
DataGrid.rows model.Rows
DataGrid.visibleRange {
FirstIndex = 0
Count = model.Rows.Length
Total = model.Rows.Length
}
]
]
]
Use GraphView.create, BarChart.create, PieChart.create, and
ScatterPlot.create from the same Controls package when the product needs
graph or chart variants.
When the generated product also selects Elmish program integration, use the
FS.Skia.UI.Controls.Elmish adapter at the product edge for commands and
subscriptions.
Run ./fake.sh build -t Dev and ./fake.sh build -t Verify in the generated
product.
Run ./fake.sh build -t Test for product-owned control examples.
Product evidence belongs in the generated product readiness folder. Do not copy framework readiness reports.
Controls owns ordinary controls, rich text, chart controls, graph controls, DataGrid, and custom wrappers. Layout remains a runtime package dependency; generated control authoring stays in Controls.
Keep examples small and product-owned. Do not copy framework galleries, framework samples, framework readiness evidence, historical specs, framework docs, or framework implementation projects.
Users moving from the legacy Charts package should replace chart declarations
with Controls LineChart, BarChart, PieChart, ScatterPlot, GraphView,
and DataGrid declarations. There is no compatibility shim; generated
products should use FS.Skia.UI.Controls directly.
When a problem outlasts reasonable in-repo attempts, extensive external research is
mandatory — consult official online docs first (the F#/.NET docs and the driven
library's own documentation/API reference), then community sources (forums, Reddit, Q&A
sites, issue trackers and changelogs). Record the findings and resolving links in the
feature's specs/<feature>/feedback/ folder and, for durable lessons, in this skill's
Sources line. Offline, the mandate degrades to recording "research blocked — "
rather than hard-failing the phase.