One row of a generated form, whatever schema it came from. The presentation fields come from the input: activeWhen and visibleWhen are re-read on every change, and consecutive controls sharing inline share one row. A colorPair, a custom body and a multiline box always take a row of their own, whatever inline they carry.

interface FormControl {
    activeWhen?: IndicatorInputCondition;
    custom?: string;
    group?: string;
    inline?: string;
    key: string;
    kind: FormKind;
    label: string;
    max?: number;
    min?: number;
    options?: readonly { label: string; value: string }[];
    pair?: {
        down: { key: string; label: string };
        enabled?: { key: string };
        up: { key: string; label: string };
    };
    step?: number;
    tooltip?: string;
    visibleWhen?: IndicatorInputCondition;
}

Hierarchy (View Summary)

Properties

The input can be edited only while this holds; otherwise the form shows it disabled, with its value readable and a reason naming what it depends on. Also inactive while an input the condition reads is hidden or inactive, because a setting nobody can change cannot be what enables another.

custom?: string

custom only: what the dialog renders in the control column.

group?: string

Sub-heading the row sits under; consecutive rows with one group share a header.

inline?: string

Consecutive inputs sharing this id sit on one row, the first one's label leading it: a length beside its source, a switch beside the value and colour it turns on. A multi-line text input always takes a row of its own.

key: string

The flat key onChange reports. A colorPair reports its halves' keys instead.

kind: FormKind
label: string
max?: number
min?: number
options?: readonly { label: string; value: string }[]

select only. Absent means free-form: the control becomes a text box.

pair?: {
    down: { key: string; label: string };
    enabled?: { key: string };
    up: { key: string; label: string };
}

colorPair only: the switch (optional) and the two swatches.

step?: number
tooltip?: string

Help text; rendered as a hover affordance beside the label.

The input is shown only while this holds; otherwise it leaves the form and the tab order, and any draft in it is kept for when it returns. Also hidden while an input the condition reads is hidden.