A single field driven by its kind. It knows no domain — the option set and the translations both come from the caller.
kind: "options" and only that screen knows the option set — supply it through renderOptions.IngotForm adds the labels and hints and saves you copying them.IngotFieldSpec has a closed set of kind values; a new one is added there, not by working around the primitive.IngotField, which carries its own label, hint and error. This primitive is deliberately label-less, because IngotForm composes the label above it.field: IngotFieldSpec — The field descriptor; kind decides what is rendered.value: unknown — The current value. The field is controlled.onChange: (next: unknown) => void — The new value, already coerced according to kind.testId: string — data-testid of the input. Required — the end-to-end tests hang off it.disabled: boolean — Locks the input, typically while a mutation is in flight.className: string — Class applied to the input.renderOptions: (args) => ReactNode — Picker over a named set. Without it an options field renders as a disabled select holding only the current value.secretPlaceholder: (field: IngotFieldSpec) => string — Custom secret-field text instead of the IngotProvider dictionary.