useInvalidShake
Sacude un control de formulario cuando un intento de envío lo encuentra inválido, y nunca mientras alguien aún está escribiendo.
pnpm dlx shadcn@latest add https://hextaui.com/r/use-invalid-shake.jsonAñade el hook y todo lo que necesita a tu proyecto.
Copia y pega el siguiente código en tu proyecto.
hooks/use-invalid-shake.ts Actualiza las rutas de importación para que coincidan con la configuración de tu proyecto.
El hook solo define un atributo data-shake. El movimiento viene del animate-button-shake del tema, que se adjunta con data-shake:motion-safe:animate-button-shake. Input, Textarea, Native select e Input group de HextaUI ya incluyen esa clase y llaman al hook. Úsalo directamente para tus propios controles.
Una vibración responde a una pregunta: ¿por qué no funcionó mi envío? Por eso el hook solo vibra justo después de que alguien intente enviar, y nunca mientras sigue rellenando el formulario.
| Evento | Descripción |
|---|---|
Submit attempt | Hacer clic en un botón de envío, pulsar Enter en un input del formulario, o el evento submit del formulario. |
Invalid within 600ms | El control dispara invalid, o tiene aria-invalid="true", data-invalid o :user-invalid. Eso cubre la validación nativa, los fields de Base UI y los errores del servidor definidos justo después de enviar. |
Shake | data-shake se define durante 400ms. Vibra una vez por intento, lleguen cuantas señales lleguen. |
- Dentro de un
InputGroup, vibra todo el grupo, no solo el control interior. - Con movimiento reducido, no se define nada. Acompaña siempre la vibración con un mensaje de error visible, ya que la vibración es una señal, no el mensaje.
- El hook necesita que el control pertenezca a un
<form>. Sin uno, no hace nada.
- Desactívalo por control con el argumento
enabled, o conshake={false}en los inputs de HextaUI. - Reiniciar el atributo reinicia la animación, así que un segundo intento fallido vibra de nuevo aunque el primero siga en marcha.
- La validación nativa enfoca el primer control no válido al enviar. La vibración solo añade movimiento encima y nunca mueve el foco.
| Prop | Tipo | Predeterminado |
|---|---|---|
refEl control de formulario que se va a observar. | RefObject<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | null> | – |
enabledSi debe vibrar. | boolean | true |
| Atributo | Descripción |
|---|---|
data-shake | Presente durante 400ms tras un intento de envío fallido, en el control o en su InputGroup. |
Input, Textarea, NativeSelect e InputGroup.
- MotionLas curvas de easing, duraciones y la comprobación de movimiento reducido con las que se anima cada componente, además de hooks para transformaciones de tamaño y resaltados deslizantes.
- InputUn campo de texto con tres tamaños, estados inválido y de solo lectura, estilos de validación nativos y una fuente táctil de 16px para que los móviles nunca hagan zoom.
- Input groupUn input con iconos, texto, botones o una pista de teclado acoplados, que comparten un solo borde y anillo de foco.
- Native selectEl select propio del navegador, con el estilo de Input, un marcador discreto, compatibilidad con Field y el selector del sistema operativo en cada dispositivo.
- TextareaTexto de varias líneas que crece con suavidad según lo que escribes entre un mínimo y un máximo de filas, con contadores, validación y un atajo para enviar.