/** * 🔴 **La categoría y la vertical, en un solo objeto.** Es la pieza de F3 en el kit, y el motivo por * el que el Constructor dejó de preguntar la vertical. * * ## El defecto que esto cierra * * Hasta el 2026-09-14 el asistente pedía **dos veces lo mismo**: la categoría en *Apariencia* y la * vertical en *Permisos*. En el host de Comercial las dos están declaradas **en la misma línea** y son * 1:1 — y aun así nada impedía archivar un indicador en «Ventas» y marcarlo de «compras». Como los dos * campos «funcionaban», la divergencia no producía ningún error: solo un indicador guardado en un * cajón que no se corresponde con quién lo ve. * * ## Por qué el mapeo lo pone el HOST * * El kit **no puede** deducir la vertical de una categoría: son vocabulario de dominio, y el kit lo * consumen Comercial, Financiero y Nómina. Cablearlo aquí sería exactamente el defecto que * `DEFAULT_AVAILABLE_ROLES` existe para no repetir —segmentar los widgets de un host con los módulos * de otro, sin error y con una interfaz de aspecto normal—. Así que el host publica la **pareja**, y * el kit solo la lee. */ export interface DashboardCategoryOption { /** Lo que se guarda en la columna `categoria` del widget. */ id: string; /** Lo que ve la persona. Ya traducido por el host: el kit no traduce vocabulario que no conoce. */ label: string; /** * 🔴 **La vertical que esta categoría determina** — lo que el Builder escribe en * `roles_permitidos` sin volver a preguntarlo. * * Opcional a propósito: un host anterior a F3 publica sus categorías sin vertical, y en ese caso el * Constructor **lo dice** en vez de inventarse una. Ver `Step5Permissions`. */ role?: string; } /** * Lo que el Builder acepta como vocabulario de categorías. * * ⚠️ **La forma `string` se conserva a propósito**, y no por cortesía con hosts viejos: es lo que hace * que 3.a se pueda desplegar antes que 3.b —la dependencia dura del plan— sin dejar una ventana en la * que el Constructor no funcione. */ export type DashboardCategoryInput = string | DashboardCategoryOption; /** * Normaliza el vocabulario a la forma rica. * * 🔴 **Y arregla una avería real de pantalla.** Antes esta prop estaba tipada `string[]` y el `select` * pintaba `{categoria}` directo. El host de Comercial lleva desde el 2026-09-10 mandando objetos * `{id, label}` — así que el `