Skip to content

Custom Renderers

Use a primitive registry when you intentionally opt into the advanced path and return a custom component value from a low-level definition.

For most custom kinds, prefer defineFieldKind, defineReportKind, or defineExplanationKind from mlform/engine. Those helpers use built-in declarative renderers and do not require primitive registry wiring.

import { createBuiltinPrimitiveRegistry } from "mlform/primitives";
customElements.define("risk-band-field", RiskBandFieldElement);
const primitiveRegistry = createBuiltinPrimitiveRegistry().registerField(
"risk-band-field",
"risk-band-field",
);
mountForm(container, {
transport: createJsonTransport({ endpoint: "/api/predict" }),
schema,
primitiveRegistry,
});
MethodPurpose
registerField(component, tagName)Map a field descriptor component to an element.
registerReport(component, tagName)Map a report descriptor component to an element.
resolveField(component)Resolve a field tag.
resolveReport(component)Resolve a report tag.
clone()Copy a registry for isolated mutation.

Custom report elements receive controller, descriptor, context, transport, and request properties. Use transport.submit(request) to fetch post-submit content, or extend PrimitiveAsyncReportElement from mlform/primitives to reuse that lifecycle.