GH GambleHub

Validación integrada y errores UX

1) Principios

1. Ayuda predictiva, no castigo. Mostramos cómo introducir correctamente, antes del error.
2. No perder datos. Cualquier error no destruye lo introducido; mantenemos «Cancelar «/» Repetir ».
3. El momento de la exhibición.

Antes de escribir: helper text (reglas y ejemplos).
Durante: hints blandos/máscara/sustitución automática.
Después (blur/submit): error claro con la instrucción «cómo corregir».
4. Ahorro de atención. Un mensaje es una causa y una acción.
5. Disponibilidad. Texto + icono/color, comunicación con el campo a través de ARIA, enfoque al primer campo erróneo.


2) Capas de validación

Sincronizado del cliente: formato, longitud, obligatoriedad, máscara. Rápido y barato.
Asincrónico del cliente: unicidad de inicio de sesión, comprobación de BIN/IBAN, API-sugerencia. Con debouns.
Servidor: reglas de negocio, límites, puntuación de riesgo, autorización/derechos. La verdad de última instancia.
Regla: incluso con una comprobación de cliente perfecta, el servidor confirma y forma el texto final.


3) Timings y debouns

Validación en blur → fidback instantáneo ≤ 100 ms.
Verificación asíncrona - Debauns 250-400 ms después de detener la entrada.
La confirmación de éxito es concisa («Ok») o un icono verde; sin «saludos».
En 'submit' mostramos una lista de errores y llevamos el foco a la primera.

js const debounce = (fn, ms=300)=>{let t;return (...a)=>{clearTimeout(t);t=setTimeout(()=>fn(...a),ms)}}

4) Redacción de errores

Plantilla: la razón → cómo corregir → alternativa (si la hay).

Bueno: "La contraseña es más corta que 8 caracteres. Agregue más caracteres o utilice la frase".
Bien: "IBAN se ve incorrecto. Compruebe la longitud y los caracteres: A-Z, 0-9".
Mal: «Entrada incorrecta».
No culpe al usuario; evite la jerga y los códigos.
En las zonas sensibles (pagos/CUS) evitamos los detalles que revelan la seguridad.


5) Patrones de presentación de mensajes

5. 1 En campo (inline)

`aria-invalid="true"`, текст в `aria-describedby`.
Brevemente, específicamente; sin párrafos largos.
Color + icono, pero el significado está en el texto.

5. 2 Debajo del formulario (resumen)

Lista de todos los errores con anclajes a los campos.
El botón Ir a error/clic en el elemento transfiere el enfoque.

5. 3 Durante el proceso de envío

Bloqueamos la pulsación repetida (state 'busy').
Con un tiempo de espera de 3-5 s - «Esperamos confirmación»... con una repetición segura.


6) Máscaras, consejos automáticos y correctores

Las máscaras no deben interferir con la inserción/edición. Permita la entrada libre, normalice bajo el capó.
Consejos automáticos: muestre ejemplos de formatos, placeholder como sugerencia y no como parte «obligatoria».
Normalización: trimming de espacios, unificación de registros, formato automático (por ejemplo, '+ 1 (___) ___ - ____') - pero en los datos originales, guarde la versión «limpia».


7) Accesibilidad (A11y)

Comunicación: 'label' ↔ 'input', errores en 'aria-describedby'.
Los críticos son 'role =' alert ', los informativos son' role = 'status'.
Volvemos el foco al campo erróneo, ': focus-visible' ver.
Contraste de texto/iconos ≥ AA; el significado no depende sólo del color.

html
<label for="email">Email</label>
<input id="email" name="email" aria-describedby="email-help email-err">
<small id="email-help">Например: user@domain.tld</small>
<p id="email-err" class="field-error" role="alert" hidden>Проверьте формат email</p>

8) Formatos y localización internacionales

Nombres/direcciones: permite diferentes alfabetos, longitudes, apóstrofos, guiones.
Fechas/monedas/números: utilice formatos de entrada locales y estructuras de almacenamiento internas estrictas (ISO/número de centavos).
Teléfono: entrada en formato internacional '+ CC', pista de coche por país.
El lenguaje de los mensajes: corto, culturalmente neutro; marcando el + 20-30% de la longitud de la fila.


9) Seguridad y privacidad

No muestre que la cuenta existe/no existe - texto general: «Si el correo electrónico está registrado, enviaremos un correo electrónico».
Enmascarar datos sensibles (PAN, pasaporte).
En pasos críticos (tasa/pago), use idempotencia y «repeticiones seguras».
Registros - con el ID de correlación sin PII en los mensajes.


10) Mantener el progreso

Autocompletar el borrador (local/en el servidor).
Si se produce un error de envío: el formulario permanece lleno; se ofrece una repetición más tarde.
Con procesos de pasos múltiples (KYC): guarde los pasos completados.


11) Validación asíncrona

Debowns 250-400 ms; mostramos «verificamos»... cerca del campo, sin bloquear toda la pantalla.
Una clara indicación de éxito/fracaso sin «tirones» de la maqueta.
Tiempo de espera de la red → "No se pudo verificar. ¿Continuar con el riesgo?" (si es admisible) o'Repetir ".

js const checkUsername = debounce(async (v)=>{
state.usernameChecking = true;
const ok = await api.unique('username', v).catch(()=>null);
state.usernameChecking = false;
state.usernameValid = ok === true;
}, 300);

12) Formularios de pago y KYC (específico)

Mapas: formato PAN, fecha límite, CVC - validación a medida que se introduce; errores - sin revelar el motivo del rechazo por parte del banco.
A2A/monederos: verificación de la admisibilidad para el país/límites, textos claros sobre comisiones/plazos.
KYC: requisitos paso a paso para fotos/documentos, vista previa, tamaño/tipo de archivo, plazos de verificación, privacidad.
Juego responsable: los mensajes son neutrales, con acciones «Establecer límite «/« Ayudar ».


13) Antipatternas

Mostrar errores «en cada símbolo» sin debauns.
Restablece el formulario en caso de error.
Mensaje de entrada incorrecto sin especificar el campo/regla.
Información crítica sólo en color/icono.
Bloquea toda la página para verificar un campo.
No hay modo offline ni repeticiones en las fallas de red.


14) Tokens del sistema de diseño (ejemplo)

json
{
"validation": {
"debounceMs": 300,
"blurFeedbackMs": 100,
"asyncTimeoutMs": 5000,
"summaryMaxItems": 6
},
"a11y": {
"useAriaDescribedby": true,
"errorRole": "alert",
"statusRole": "status"
},
"visual": {
"fieldGap": 8,
"iconSize": 16,
"borderRadius": 10
}
}

15) Snippets de implementación

Campo con validador en línea (formato + validación del servidor):
js const rules = {
email: v => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v)          "Проверьте формат email"
};
async function validateEmail(v){
const fmt = rules.email(v);
if (fmt!== true) return fmt;
try {
const r = await fetch(`/api/email/check?v=${encodeURIComponent(v)}`);
const { allowed } = await r.json();
return allowed? true: "Этот email недоступен. Выберите другой.";
} catch {
return "Не удалось проверить. Повторите позже.";
}
}
Resumen de errores de enfoque:
ts function focusFirstError() {
const err = document.querySelector('[aria-invalid="true"]');
if (err) err.focus({ preventScroll:false });
}
Guardar el borrador localmente:
js const saveDraft = debounce(form => localStorage.setItem('draft', JSON.stringify(Object.fromEntries(new FormData(form)))), 500);
form.addEventListener('input', ()=>saveDraft(form));

16) Métricas y controles

Time-to-Fix (tiempo desde el error hasta la corrección).
Error rate por campos y por razones (formato/límites/servidor).
Reenviar (retry success rate).
Proporción de formas abandonadas y profundidad del paso.
Relleno de consejos: CTR «Más información», frecuencia de ocultación de consejos.


17) Lista de comprobación de QA

A11y

  • El foco va al primer campo equivocado; 'aria-describedby '/' aria-invalid' se exponen.
  • Contraste ≥ AA; los mensajes no dependen únicamente del color.

Comportamiento

  • Validación incorporada con debouns; los errores no aparecen antes de blur (excepto las máscaras críticas).
  • En submit se forma un resumen, los campos no se borran.
  • Las comprobaciones asíncronas no bloquean la página; hay un tiempo de espera y una repetición.

Texto

  • Causa + Cómo corregir; sin código/culpa.
  • La localización no rompe el diseño; los ejemplos son relevantes.

Seguridad

  • No hay filtraciones de PII en los mensajes; no revelamos la existencia de una cuenta.
  • Idempotencia para operaciones críticas.

18) Documentación en el sistema de diseño

Componentes: 'FieldError', 'FormSummary', 'HelperText',' BusyButton '.
Mapas de reglas para campos típicos (correo electrónico, teléfono, contraseña, dirección, IBAN, fecha).
Gaids por debouns, verificación asíncrona y comportamiento fuera de línea.
Plantillas de texto para errores frecuentes y ejemplos «antes/después».


Resumen breve

La validación incorporada es sobre la ayuda predictiva, instrucciones claras y una actitud cuidadosa hacia los datos. Compruebe localmente y en el servidor, muestre errores en el momento adecuado con acciones específicas, respete la disponibilidad y privacidad, mantenga el progreso y use debouns. Así las formas se vuelven amigables, y los errores se vuelven rápidos y corregibles.

Contact

Póngase en contacto

Escríbanos ante cualquier duda o necesidad de soporte.¡Siempre estamos listos para ayudarle!

Iniciar integración

El Email es obligatorio. Telegram o WhatsApp — opcionales.

Su nombre opcional
Email opcional
Asunto opcional
Mensaje opcional
Telegram opcional
@
Si indica Telegram, también le responderemos allí además del Email.
WhatsApp opcional
Formato: +código de país y número (por ejemplo, +34XXXXXXXXX).

Al hacer clic en el botón, usted acepta el tratamiento de sus datos.