MorfoFocus = MorfoFocusTrap | MorfoFocusRoving (discriminada por `kind`).
La forma única antigua ({initial, trap, return, restore}) solo sabía hablar
de overlays y no tenía ejecutor: el censo midió 21+ componentes con foco
contra 9 declaraciones, con la familia roving (14) estructuralmente muda.
- trap: familia overlay; la declaración es el DEFAULT DE ESPECIE y la prop
per-instancia gana (patrón dir).
- roving: composite WAI-ARIA (un solo tab-stop; parts es LISTA porque
toolbar rueda por varias); `orientation:'grid'` EXIGE executor.custom
firmado (esquema lanza) — el primitivo compartido es 1D y forzar 2D a 1D
sería mentir.
- schema.ts: invariantes nuevos (partRefs del trap; parts ⊆ kebabs y no
vacío; custom sin razón lanza).
- index.ts exporta MorfoFocusTrap (lo consume FocusScope); el export de
errores viaja colapsado por prettier (contenido idéntico).
Eje focus-first (docs/process/PLAN-focus-first.md), nacido de la inversión
del autor: el error no era el campo sin lectores, era la flota sin declarar.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>