Campos personalizados
Usa defineFieldKind para el camino normal. Registra el resultado en el schema registry y en el presentation registry del pack.
import { z } from "zod";import { createMlRegistryPack } from "mlform/builtins-ml";import { defineFieldKind, registerDefinedFieldKind } from "mlform/presentation";
const scoreField = defineFieldKind({ kind: "score", schema: z.object({ id: z.string().optional(), kind: z.literal("score"), label: z.string(), min: z.number().default(0), max: z.number().default(100), }), value: { default: () => 0, normalize: (value) => Number(value ?? 0), serialize: (value) => value, }, validate: ({ value, config }) => value < config.min || value > config.max ? ["Score fuera de rango."] : [], render: { widget: "number", hints: ({ config }) => ({ min: config.min, max: config.max, unit: "%" }), },});
const pack = createMlRegistryPack();registerDefinedFieldKind(pack.registry, pack.presentationRegistry, scoreField);Usa defineFieldDefinition solo cuando necesites separar por completo schema, presenter o renderer primitivo.