Esta plantilla utiliza Valibot para una validación ligera y segura de tipos tanto en el cliente como en el servidor. Hemos diseñado un enfoque híbrido que le proporciona:
- Retroalimentación instantánea en la interfaz de usuario: Utilizando un script del lado del cliente muy pequeño.
- Seguridad del lado del servidor: Usando el mismo esquema en Astro Actions (opcional pero recomendado).
Inicio rápido
Para agregar un nuevo formulario validado:
-
Definir reglas específicas (Opcional)
Si necesita reglas personalizadas más allá del esquema compartido
ContactSchema, cree un nuevo esquema ensrc/lib/schemas/. -
Agregar el formulario a su componente
Copie este patrón. La clave es el nombre estricto de las entradas y el manejo de la clase
.input-error.Component.astro ---import { createContactSchema } from '../../lib/schemas/contact';// ... importaciones---<form class="my-form" novalidate><div class="form-control"><input type="email" name="email" required /></div><button type="submit">Enviar</button></form><script>import { safeParse } from 'valibot';import { createContactSchema } from '../../lib/schemas/contact';const form = document.querySelector('.my-form');// Pase la función de traducción (o el identificador) y las opcionesconst schema = createContactSchema(key => key, { companyRequired: true });form.addEventListener('submit', (e) => {e.preventDefault();const formData = new FormData(form);const data = Object.fromEntries(formData);// Analizar usando el esquemaconst result = safeParse(schema, data);if (!result.success) {// Manejar errores (p. ej., mostrar bordes rojos)console.log(result.issues);}});</script>
Estilos adaptados al tema
Hemos construido un sistema CSS que adapta automáticamente los estilos de validación a su tema activo (Liquid, Glass, Minimal, etc.).
Solo necesita alternar las clases input-error o input-success en sus entradas.
| Clase | Efecto |
|---|---|
input-error | Agrega un borde/resplandor Rojo (color --er). |
input-success | Agrega un borde Verde (color --su). |
error-message | Un pequeño texto de ayuda estilizado que se desliza. |
Ejemplo de uso
// Agregar estado de errorinput.classList.add('input-error');
// Eliminar estado de errorinput.classList.remove('input-error');Personalización de reglas de validación
Edite src/lib/schemas/contact.ts para cambiar las reglas del formulario de contacto predeterminado.
// Sintaxis moderna de Valibot v1 usando pipe()export const createContactSchema = (t, options = {}) => object({ name: pipe( string(), minLength(2, t('validation.nameShort')) ), message: pipe( string(), minLength(10, t('validation.messageShort')), maxLength(1000) ), // Validación condicional company: options.companyRequired ? pipe(string(), minLength(1)) : optional(string())});Internacionalización (i18n)
Los mensajes de validación están completamente traducidos. Las claves se encuentran en:
src/locales/en/contact.json(bajo el objetovalidation)src/locales/ru/contact.json
Al inicializar el esquema en el cliente, debe pasar una función de traducción t o un mapa de búsqueda, como se ve en ContactGlass.astro.