# Como pedir confirmação antes de uma ação destrutiva

> Exibir um Alert de confirmação com buttonAction, escurecer o fundo e dar feedback com Hint.

Source: https://crossfly.dev/pt/docs/cookbook/nav/dialogo-confirmacao — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# Como pedir confirmação antes de uma ação destrutiva

**Propósito.** Antes de excluir/descartar algo, mostre um `Alert` com dois botões (ex.: "Cancelar" e "Excluir"). Só execute a ação destrutiva no callback do botão de confirmação.

## APIs usadas
- `new Alert(String title, String message, String... buttonTexts)` — cria o diálogo. `Alert` **é uma `Window`**; os botões seguem o `Skin` ativo.
- `Alert.buttonAction(int index, Component.Action action)` — define a ação de um botão (índice 0-based). Sem ação, o botão apenas fecha (`hide()`).
- `Alert.show()` — empilha o diálogo (push modal).
- `WindowStyle.fadeBackground(int alpha)` — escurece as janelas abaixo (0–255). Obtenha o style via `getStyle()`.
- `Hint.show(String message, int delayMs)` — mostra um toast breve de feedback.

## Exemplo completo (copiar, colar e rodar)
```java
package com.exemplo;

import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;

/** Tela principal executável: um botão dispara o Alert de confirmação. */
public class MainWindow extends Window
{
   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      add(new Label("Pedido #1234"));
      add(new Button("Excluir pedido").onAction(e -> confirmarExclusao()));
   }

   private void confirmarExclusao()
   {
      Alert alert = new Alert("Excluir pedido", "Esta ação não pode ser desfeita.", "Cancelar", "Excluir");

      // Escurece o fundo (0..255). getStyle() do Alert é um WindowStyle.
      ((WindowStyle) alert.getStyle()).fadeBackground(150);

      // Índice 0 = "Cancelar": sem buttonAction, o botão já fecha o Alert sozinho.
      // Índice 1 = "Excluir": ação destrutiva + feedback.
      alert.buttonAction(1, e ->
      {
         excluirPedido();                 // ação destrutiva
         alert.hide();                    // fecha o diálogo
         Hint.show("Pedido excluído", 1500);
      });

      alert.show();
   }

   private void excluirPedido()
   {
      // ... sua lógica de exclusão ...
   }
}
```

> O trecho abaixo mostra **só o miolo**. Para rodar, coloque-o no esqueleto `MainWindow` acima.

## Trecho mínimo
```java
// verificado na fonte: Alert.buttonAction(idx, Action); WindowStyle.fadeBackground(int 0-255); Hint.show(msg, ms)
Alert alert = new Alert("Excluir pedido", "Esta ação não pode ser desfeita.", "Cancelar", "Excluir");

// Escurece o fundo (0..255). getStyle() do Alert é um WindowStyle.
((WindowStyle) alert.getStyle()).fadeBackground(150);

// Índice 0 = "Cancelar": sem buttonAction, o botão já fecha o Alert sozinho.
// Índice 1 = "Excluir": ação destrutiva + feedback.
alert.buttonAction(1, e ->
{
   excluirPedido();                 // ação destrutiva
   alert.hide();                    // fecha o diálogo
   Hint.show("Pedido excluído", 1500);
});

alert.show();
```

Detalhes que evitam surpresa:

- Se você **não** definir `buttonAction` para um botão, o Alert associa `onAction(e -> hide())` — o botão fecha o diálogo sem mais nada. Por isso "Cancelar" normalmente dispensa `buttonAction`.
- Coloque a ação destrutiva **sempre** no botão de confirmação (aqui, índice 1), nunca como comportamento padrão.
- `fadeBackground` recebe alpha 0–255 (não 0xAARRGGBB). 150 dá um escurecimento perceptível sem apagar o conteúdo.

## Aprofunde-se
- [Diálogos e modais](/docs/ui/navigation/dialogs-and-modals)
- Receita irmã: [Abrir e fechar uma tela](/docs/cookbook/nav/abrir-tela)
