Alert
Mensajes en línea para estado y comentarios, con una superficie neutra, un icono de color y un descarte que se colapsa con suavidad.
pnpm dlx shadcn@latest add https://hextaui.com/r/alert.jsonAñade el componente, los tokens del tema de HextaUI y los componentes de HextaUI de los que depende.
Añade los tokens del tema a tu CSS global, si aún no lo has hecho.
Instala las dependencias.
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cnCopia y pega el siguiente código en tu proyecto.
components/ui/alert.tsx components/ui/button.tsx lib/motion.ts Actualiza las rutas de importación para que coincidan con la configuración de tu proyecto.
Variantes
variant colorea solo el icono, así que la superficie permanece neutra y el estado se lee de un vistazo sin gritar.
Soft
appearance="soft" quita el borde y tiñe toda la superficie con el color de la variante.
Contenido parcial
Solo título, solo descripción y sin icono se alinean sin clases adicionales. La cuadrícula coloca cada parte en su propia columna.
Acciones
Coloca botones en <AlertAction />. Se alinean con la primera línea del título, incluso cuando este se ajusta a varias líneas.
Descartable
Añade <AlertClose /> para que se pueda descartar. La alerta se colapsa suavemente y el contenido de debajo sube. Descártala con el teclado y el foco pasa al siguiente control, aquí “Reset”.
Controlado
Pasa open y onOpenChange para controlarlo desde tu propio estado. Se anima tanto al entrar como al salir.
Cancelar un descarte
Llama a event.preventDefault() en el onClick del botón de cierre para mantener la alerta abierta, por ejemplo para pedir confirmación antes.
Insertada tras la carga
Las alertas que se montan después de cargar la página aparecen con un fundido y un deslizamiento, y los lectores de pantalla las anuncian. Las alertas que ya están en el HTML del servidor aparecen sin movimiento.
Contenido enriquecido
Los iconos y enlaces en línea dentro de la descripción conservan su propio estilo. Usa render para dar al título un nivel de encabezado.
De derecha a izquierda
El icono, el contenido y el botón de cierre se reflejan según la dirección de lectura.
| Key | Acción |
|---|---|
| Tab | Mueve el foco a los enlaces, acciones y al botón de cierre dentro de la alerta. |
| EnterSpace | Activa el botón de cierre con foco. Una vez colapsada la alerta, el foco pasa al siguiente elemento enfocable, o al anterior si no hay ninguno después. |
- Las alertas
destructiveywarningrecibenrole="alert"y se anuncian de inmediato. Las demás variantes recibenrole="status"y esperan una pausa. - El botón de cierre tiene la etiqueta “Dismiss”. Pasa
aria-labelpara traducirla. - El foco nunca se pierde cuando se cierra una alerta que lo tiene.
- Con movimiento reducido, las alertas aparecen y desaparecen al instante.
Cada parte acepta los atributos del elemento que renderiza. Las variantes se exportan como alertVariants para dar estilo a otros elementos de la misma manera.
| Prop | Tipo | Predeterminado |
|---|---|---|
variantColorea el icono. destructive y warning se anuncian de forma asertiva. | "default" | "destructive" | "success" | "info" | "warning" | "default" |
appearance | "outline" | "soft" | "outline" |
open | boolean | – |
defaultOpen | boolean | true |
onOpenChangeSe llama cuando se pulsa el botón de cierre. | (open: boolean) => void | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descripción |
|---|---|
data-slot="alert" | Selecciona la alerta en CSS. |
data-variant | La variante actual. |
data-appearance | La apariencia actual. |
data-ending-style | Presente mientras la alerta se colapsa tras un descarte. |
| Prop | Tipo | Predeterminado |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descripción |
|---|---|
data-slot="alert-title" | Selecciona los títulos en CSS. |
| Prop | Tipo | Predeterminado |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descripción |
|---|---|
data-slot="alert-description" | Selecciona las descripciones en CSS. Los enlaces simples dentro se subrayan por ti. |
| Prop | Tipo | Predeterminado |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descripción |
|---|---|
data-slot="alert-action" | Selecciona el área de acciones en CSS. |
Un <Button /> ghost que cierra la alerta más cercana. Acepta todas las props de Button y debe usarse dentro de <Alert />.
| Prop | Tipo | Predeterminado |
|---|---|---|
aria-label | string | "Dismiss" |
children | ReactNode | <IconX /> |
onClickLlama a event.preventDefault() para mantener la alerta abierta. | (event: MouseEvent) => void | – |
| Atributo | Descripción |
|---|---|
data-slot="alert-close" | Selecciona el botón de cierre en CSS. |
- ButtonBotones en todas las variantes y tamaños, con un flujo integrado de carga, éxito y error que omite el spinner en las peticiones rápidas.
- 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.
- EmptyUn marcador de posición para pantallas que aún no tienen nada que mostrar, con un icono, un mensaje y la siguiente acción.
- ProgressUna barra o anillo que muestra cuánto ha avanzado una tarea, se suaviza entre actualizaciones y se desliza mientras el total es desconocido.
- SkeletonMarcadores de posición que esperan 150ms antes de mostrarse, toman el tamaño exacto del contenido que envuelven y lo hacen aparecer con un fundido sin mover nada.
- SpinnerUn indicador de carga con marcas al estilo Apple o un anillo que respira, que puede esperar antes de mostrarse y permanecer el tiempo suficiente para no parpadear.
Usado en bloques
Bloques que se construyen sobre Alert.
- BillingPlan y uso para un producto de IA, al estilo de Cursor, Claude y Vercel. Un medidor de uso dividido por modelo que proyecta el final del ciclo y avisa antes de que se agoten los créditos, un gráfico diario por el que puedes desplazarte, un límite de gasto con alertas que puedes previsualizar en el medidor, cambios de plan con prorrateo exacto, un formulario de tarjeta con validación real y facturas descargables en PDF.
- MarkdownMarkdown hecho para respuestas de IA. Se transmite con fluidez y nunca muestra sintaxis a medio escribir, con encabezados enlazables, tablas que puedes copiar como Markdown o CSV, callouts de GitHub, listas de tareas, notas al pie, imágenes, citas en línea y bloques de código completos.