Avisos
Estado: EstablePila de avisos
Los avisos se apilan como en Sonner: el más nuevo al frente y los anteriores asomando detrás. Al pasar el cursor se despliegan en lista y el tiempo se detiene; se van solos, con la ✕ o arrastrándolos de lado. Un aviso puede llevar su acción (Deshacer) y llegar desde JS, desde un botón o desde el servidor con un Turbo Stream.
- Resorte
- Arrastre
- Turbo Streams
Clase reservada
Reformer · martes 8:00
Clase reservada
Reformer · martes 8:00
app/views/… (la demo de arriba)
<%= render Ui::ToasterComponent.new(position: :inline, id: "toaster-demo", class: "flex flex-wrap items-center justify-center gap-2.5",
toasts: [ { title: "Clase reservada", description: "Reformer · martes 8:00", tone: :success, duration: 0 } ]) do %>
<%= render Ui::ButtonComponent.new(variant: :secondary, size: :sm, data: {
action: "toaster#show",
toaster_title_param: "Reserva cancelada",
toaster_description_param: "Vinyasa Flow · lunes 7:00. Te devolvimos 1 crédito.",
toaster_action_label_param: "Deshacer",
toaster_action_name_param: "deshacer-cancelacion",
toaster_action_done_param: "Reserva restaurada"
}) do %>Cancelar reserva<% end %>
<%= render Ui::ButtonComponent.new(size: :sm, data: {
action: "toaster#show",
toaster_title_param: "Cambios guardados",
toaster_description_param: "Tu perfil y tus preferencias de aviso.",
toaster_tone_param: "success"
}) do %>Guardar cambios<% end %>
<% end %>Qué hace
- JS: window.dispatchEvent(new CustomEvent("eui:toast", { detail: { title, description, tone, action: { label, name, done } } })).
- Botones: data-action="toaster#show" con data-toaster-title-param, -tone-param, -action-label-param…
- Servidor: turbo_stream.append "eui-toasts", Ui::ToasterComponent::Toast.new(title: …, tone: :success).
- La acción dispara toaster:action con su nombre; con action.done el aviso confirma (✓) antes de irse.
- Arrastre de lado con resorte; se descarta pasado el 40% del ancho o con un tirón.
- El tiempo se pausa al pasar el cursor, al enfocar, al arrastrar y con la pestaña oculta.
Props
| Nombre | Tipo | Default | Descripción |
|---|---|---|---|
| position | :fixed | :inline | :fixed | Fijo abajo a la derecha (en móvil abajo y a lo ancho) o anclado al contenedor posicionado más cercano. |
| id | String | "eui-toasts" | Id de la lista: destino de turbo_stream.append. |
| toasts | Array<Hash> | [] | Avisos del servidor al renderizar (title, description, tone, action, duration). |
| duration | Integer (ms) | 4000 | Tiempo en pantalla; con acción, 1.5×. Por aviso: duration (0 = se queda). |
| max | Integer | 3 | Cuántos se ven en la pila. |
| global | Boolean | true si es :fixed | Escucha window eui:toast. |
| label | String | "Avisos" | Nombre de la región. |
Accesibilidad
- La pila es una región "Avisos" que anuncia lo nuevo; cada aviso es role="status".
- Cada aviso tiene botón "Cerrar aviso"; Escape cierra el aviso enfocado y el foco pasa al vecino.
- Al enfocar se despliegan y el tiempo se detiene, así hay tiempo de leer y actuar.
- Con movimiento reducido no hay deslizamientos ni cuenta regresiva animada.