# llimphi-widget-form Form validation on top of `llimphi-widget-field`. A form validates in three stages, and the one usually done wrong is the third: 1. **what is asked** — per-field rules (`Regla`, `CampoDef`); 2. **what is wrong** — aggregation (`Formulario::validar` → `Errores`), which collects **every** problem, not just the first; 3. **when it is said** — `EstadoForm`. A form that shouts "required" at an empty field you have not touched yet is hostile, and one that hides the error until submit makes you go back and forth. The rule: show on **blur** (`tocar`) or on **submit attempt** (`enviar`), never while typing for the first time. Pure logic plus two glue views. Values still live in the caller's `Model`: there is no `Form` holding buffers here, because that would mean keeping two sources of truth in sync. `campo_view` pulls the label, the required asterisk and the error out of the form definition, so those three stop being written twice — which is how they end up disagreeing. `resumen_errores_view` builds the navigable summary for the header: in a long form the error may be off-screen, and all you see is that the button did nothing. --- Part of **llimphi** — see [llimphi](../../README.md).