# Notificación

> Notificaciones apiladas en la esquina inferior derecha. Un componente nativo de Pyzed para GUIs de escritorio en Python, con vista previa, ejemplos y su API.

Source: https://albakore.github.io/pyzed/es/library/toast/

:::tip[En pocas palabras]
Una notificación pequeña que aparece en una esquina y se va sola.
:::

`ui.toast` dibuja una notificación con título, mensaje, acciones y botón de cerrar; `kind` es `"info"`, `"success"`, `"warning"` o `"error"`. `ui.toasts(base, items)` las apila en la esquina inferior derecha encima de tu vista.

`ui.toast` · Categoría: [Capas flotantes](https://albakore.github.io/pyzed/es/library/#capas-flotantes) · [Referencia completa →](https://albakore.github.io/pyzed/es/reference/ui/#toast)

**Código:**

```python
pz.column([
    ui.toast("Saved", "main.py was saved.", kind="success", on_dismiss=on_dismiss),
    ui.toast("Update available", "Pyzed 0.4 is on PyPI.", kind="info",
             actions=[ui.button("What's new", on_open, size="sm")], on_dismiss=on_dismiss),
    ui.toast("Could not connect", kind="error", on_dismiss=on_dismiss),
], spacing=8)
```

## Cuándo usarlo

- Para confirmar algo que pasó en segundo plano (guardado, copiado, conectado).
- Los mensajes que necesitan respuesta van en un [Diálogo](https://albakore.github.io/pyzed/es/library/confirm/).

## Uso

```python
import pyzed as pz
from pyzed import ui

import threading

class Notes(pz.App):
    def __init__(self):
        self.messages = []

    def notify(self, title):
        self.messages.append(title)
        threading.Timer(3, pz.post, args=(("expire", title),)).start()  # hide it after 3 s

    def update(self, message):
        if message[0] == "expire":
            self.messages.remove(message[1])

    def view(self):
        items = [ui.toast(m, kind="success", on_dismiss=lambda m=m: self.messages.remove(m))
                 for m in self.messages]
        return ui.toasts(self.main_view(), items)
```

## Variantes

:::note[Sobre estas capturas]
Cada captura la graba pyzed mismo, fuera de pantalla a 2x, en One Dark o One Light según el tema de este sitio, y recortada al componente para que se vea a su tamaño real. El puntero pasa por encima, pulsa o escribe en él; un componente que no reacciona al puntero recorre algunos temas. Con movimiento reducido ves el primer fotograma. Abre **Código** bajo una captura para ver el fragmento que la dibuja; los nombres libres como `on_save` son tus propios callbacks.
:::

### Tipo

```python
ui.toast("Update available", "Pyzed 0.5 is on PyPI.")
```

```python
ui.toast("Saved", "main.py was saved.", kind="success")
```

```python
ui.toast("Low disk space", "2 GB left.", kind="warning")
```

```python
ui.toast("Could not connect", "Check your network.", kind="error")
```

### Contenido

```python
ui.toast("Copied to clipboard", kind="success")
```

```python
ui.toast("Update available", "Restart to install it.",
         actions=[ui.button("Restart", on_restart, size="sm")], on_dismiss=on_dismiss)
```

```python
ui.toast("Now playing", "Lo-fi beats", icon="music", width=280)
```

### Estados y eventos

```python
ui.toast("Uploading", "notes.md", kind="info", progress=0.6, on_dismiss=on_close)
```

```python
ui.toast("Build failed", "Click to see the log", kind="error", on_press=on_press)
```

## Eventos

Notificación tiene **2 eventos propios**, en la tabla de abajo. Como todo widget, también tiene los **18 eventos comunes** (`click`, `double_click`, `right_click`, `mouse_enter`, `drag`, `key_down`, `resize`…), que se conectan con `.on(...)`: mira [Eventos](https://albakore.github.io/pyzed/es/guides/events/) y [Eventos de cada componente](https://albakore.github.io/pyzed/es/library/events/).

| Evento | El handler recibe | Cuándo |
| --- | --- | --- |
| `on_dismiss` | `()` | Mensaje o callable que se envía al cerrar. |
| `on_press` | `()` | Hace pulsable la tarjeta. |

**El handler recibe** es lo que Pyzed le pasa a tu función: `()` es nada. Cualquier handler también puede ser un mensaje (un valor que no se puede llamar), que va a `update()`.

### Manejar los eventos

Los mismos eventos escritos de tres formas. **Imperativa**: métodos de la app que cambian `self`. **Declarativa**: los handlers producen mensajes y un único `update()` decide. **Funcional**: una función pura dibuja un estado inmutable y pide cambios con `set_state(...)`. Mira [Imperativo, declarativo y funcional](https://albakore.github.io/pyzed/es/guides/code-styles/).

**Imperativo:**

```python
class Notes(pz.App):
    def __init__(self):
        self.messages = ["Saved"]
        self.opened = 0

    def view(self):
        items = [ui.toast(m, kind="success",
                          on_dismiss=lambda m=m: self.messages.remove(m),           # its ✕
                          on_press=lambda: setattr(self, "opened", self.opened + 1))  # the card
                 for m in self.messages]
        return ui.toasts(main_view(), items)
```

**Declarativo:**

```python
from dataclasses import dataclass

@dataclass
class Dismiss:
    text: str

class Notes(pz.App):
    messages = ["Saved"]

    def update(self, message):
        match message:
            case Dismiss(text):
                self.messages = [m for m in self.messages if m != text]

    def view(self):
        return ui.toasts(main_view(), [ui.toast(m, kind="success", on_dismiss=Dismiss(m))
                                       for m in self.messages])
```

**Funcional:**

```python
from dataclasses import dataclass

@dataclass(frozen=True)
class State:
    messages: tuple = ("Saved",)

def view(state, set_state):
    close = lambda m: set_state(messages=tuple(x for x in state.messages if x != m))
    return ui.toasts(main_view(), [ui.toast(m, kind="success", on_dismiss=lambda m=m: close(m))
                                   for m in state.messages])
```

## Propiedades y API

### `ui.toast`

```python
toast(
    title,
    message=None,
    *,
    kind='info',
    icon=None,
    on_dismiss=None,
    actions=(),
    width=340,
    progress=None,
    on_press=None,
    theme=None,
)
```

Una notificación.

| Propiedad | Por defecto | Descripción |
| --- | --- | --- |
| `title` | *obligatorio* | Título. |
| `message` | `None` | Texto secundario. |
| `kind` | `"info"` | `"info"`, `"success"`, `"warning"` o `"error"`. |
| `icon` | `None` | Nombre de un icono de Lucide (`pyzed icons` los lista). |
| `actions` | `()` | Widgets extra (normalmente botones) que se muestran como acciones. |
| `width` | `340` | Ancho: píxeles, `"fill"`, `"shrink"` o `"fill:N"` (proporción). |
| `progress` | `None` | De 0 a 1: una barra fina abajo (tiempo restante, una descarga). |
| `theme` | `None` | Tema a usar en lugar del actual (`pyzed.theme.current()`). |

Eventos: `on_dismiss`, `on_press` ([eventos](#eventos)).

[Referencia completa →](https://albakore.github.io/pyzed/es/reference/ui/#toast)

### `ui.toasts`

```python
toasts(base, items, *, spacing=8)
```

Muestra `items` (normalmente `toast(...)`) apilados en la esquina inferior derecha sobre `base`.

| Propiedad | Por defecto | Descripción |
| --- | --- | --- |
| `base` | *obligatorio* | La interfaz de debajo. |
| `items` | *obligatorio* | Lista de toasts. |
| `spacing` | `8` | Separación entre hijos, en píxeles. |

[Referencia completa →](https://albakore.github.io/pyzed/es/reference/ui/#toasts)

## Relacionados

- [Aviso](https://albakore.github.io/pyzed/es/library/callout/): Un aviso en línea con título, texto y acciones.
- [Capa](https://albakore.github.io/pyzed/es/library/layer/): Dibuja una capa encima de tu vista; al pulsar fuera se cierra.
- [Alerta](https://albakore.github.io/pyzed/es/library/alert/): Un mensaje con un botón.
