# Alert

> शीर्षक, संदेश और एक्शन बटनों वाला मोडल डायलॉग बॉक्स।

Source: https://crossfly.dev/hi/docs/ui/widgets/alert — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# Alert

`Alert` CrossFly का मोडल डायलॉग बॉक्स है — `MessageBox`/`AlertDialog` का समतुल्य। यह एक **शीर्षक**, एक **संदेश** (स्वचालित वर्ड-रैप के साथ) और एक या अधिक **एक्शन बटन** दिखाता है जो पंक्तियों में व्यवस्थित होते हैं। प्रत्येक बटन का अपना कॉलबैक हो सकता है; कॉलबैक के बिना, बटन केवल डायलॉग बंद करता है। दिखावट (रंग, फ़ॉन्ट, बटनों का लेआउट) सक्रिय `Skin` से आती है।

> 🟢 · **पैकेज:** `dev.crossfly.ui` · **विस्तार करता है:** `Window` · **शैली:** `AlertStyle` + `WindowStyle`

## कब उपयोग करें
- ऐसी पुष्टियाँ जिनमें उपयोगकर्ता की स्वीकृति आवश्यक हो (हटाएँ? सहेजें? त्यागें?)।
- सरल हाँ/नहीं चयन या ऐसा संदेश जिसके लिए एक "OK" चाहिए।

## कब उपयोग न करें
- निष्क्रिय और क्षणिक फीडबैक (सफलता/त्रुटि/स्थिति) → [`Hint`](/docs/ui/widgets/hint) का उपयोग करें।
- किसी आइटम पर संदर्भ-आधारित क्रियाओं की सूची (शेयर करें/संपादित करें/हटाएँ) → [`ActionSheet`](/docs/ui/widgets/actionsheet) का उपयोग करें।

## दिखावट
केंद्रित कार्ड जिसमें ऊपर शीर्षक, बीच में संदेश और आधार पर बटनों की एक पंक्ति होती है। डिफ़ॉल्ट रूप से पृष्ठभूमि गहरी **नहीं** होती — शास्त्रीय मोडल प्रभाव के लिए `WindowStyle.fadeBackground` समायोजित करें।

## संपूर्ण उदाहरण (कॉपी करें, पेस्ट करें और चलाएँ)
```java
package com.exemplo;

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

/** चलाने योग्य मुख्य स्क्रीन। launcher (classname) की ओर संकेत करें और चलाएँ: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      Button abrir = new Button("Abrir alerta");
      abrir.onAction(c ->
      {
         Alert a = new Alert("Excluir item",
            "Tem certeza que deseja excluir este item? Esta ação não pode ser desfeita.",
            "Excluir", "Cancelar");
         // मॉडलिटी को मजबूत करने के लिए गहरा बैकग्राउंड (alpha 0..255)
         WindowStyle ws = a.getStyle();
         ws.fadeBackground(150);
         // Botão 0 = Excluir -> निष्पादित करता है, बंद करता है और फीडबैक देता है
         a.buttonAction(0, origin ->
         {
            a.hide();
            Hint.show("Item excluído", 2000);
         });
         // Botão 1 = Cancelar: बिना callback -> default पहले से ही hide() कॉल करता है
         a.show();
      });
      add(LAY_AUTO, abrir);
   }
}
```

> नीचे दिए गए स्निपेट **केवल मूल भाग** दिखाते हैं (जो `onShow()` के अंदर जाता है)। चलाने के लिए, इन्हें ऊपर दिए `MainWindow` कंकाल में रखें।

## बुनियादी उपयोग
```java
// buttonTexts वैकल्पिक varargs है — यदि खाली/null हो, तो {"OK"} बन जाता है
Alert a = new Alert("Aviso", "Operação concluída com sucesso.", "OK");
a.show();
```

## कंस्ट्रक्टर
| कंस्ट्रक्टर | विवरण |
|---|---|
| `Alert(String title, String message, String... buttonTexts)` | `title` `""` हो सकता है (शीर्षक को दृश्य रूप से छिपा देता है)। `buttonTexts` वैकल्पिक; खाली/`null` → `{"OK"}`। |

> ⚠️ **कोई स्थैतिक `Alert.show(...)` नहीं है और न ही कोई कंस्ट्रक्टर जो कॉलबैक ट्रिगर करे।** हमेशा `new Alert(...)` से इंस्टेंस बनाएँ, प्रति-बटन कॉलबैक पंजीकृत करें और `show()` कॉल करें।

## गुण और अनुकूलन
| गुण / मेथड | प्रकार | डिफ़ॉल्ट | क्या करता है |
|---|---|---|---|
| `style()` | `AlertStyle` | skin | वर्तमान `AlertStyle` लौटाता है। |
| `style(AlertStyle)` | fluente | — | एक कस्टम `AlertStyle` परिभाषित करता है। |
| `style().buttonLayout(...)` | `IOS`/`FLUTTER`/`MATERIAL` | `MATERIAL` | बटनों की व्यवस्था की शैली। |
| `style().maxButtonsPerRow(int)` | `int` | skin | प्रति पंक्ति बटन; अतिरिक्त नई पंक्तियों में टूट जाते हैं। |
| `skin(Skin)` | fluente | — | skin बदलता है और `AlertStyle` को फिर से अपडेट करता है। |
| `getButton(int index)` | `Button` | — | `show()` के बाद का बटन (उससे पहले, `null`)। |
| `getAutoWidth()` / `getAutoHeight()` | `int` | — | परिकलित आयाम। |

## कॉलबैक और इवेंट
| कॉलबैक | कब ट्रिगर होता है |
|---|---|
| `buttonAction(int index, Component.Action action)` | इंडेक्स `index` (0-आधारित) वाला बटन टैप करने पर। |

> ⚠️ **प्रतिक्रिया `show(onAnswer)` से नहीं आती।** `Alert` `Window` का विस्तार करता है, `Picker` का नहीं — और `Window.hide()` `onAnswer` तभी देता है जब `this instanceof Picker` हो। इसलिए, प्रत्येक बटन पर प्रतिक्रिया देने के लिए `buttonAction(index, action)` का उपयोग करें। `Alert` में कोई `getAnswer()` नहीं है।

कॉलबैक का प्रकार `Component.Action` है, जिसका मेथड `void run(Component origin)` है — लैम्ब्डा का मुख्य भाग **कोई मान नहीं लौटाता** (कोई `return null;` नहीं)।

## अवस्थाएँ
- पंजीकृत कॉलबैक रहित बटन → डिफ़ॉल्ट क्रिया `hide()` प्राप्त करता है (डायलॉग बंद कर देता है)।
- कॉलबैक सहित बटन → कॉलबैक चलाता है; यदि कॉलबैक बंद नहीं करता, तो डायलॉग खुला रहता है (आप स्वयं `a.hide()` कॉल करें)।
- "वापस"/back इशारा → यदि `WindowStyle.canHide` (डिफ़ॉल्ट `true`) है, तो सम्मानित किया जाता है।

### गहरी पृष्ठभूमि के साथ पुष्टि
```java
Alert confirm = new Alert("Excluir item",
   "Tem certeza que deseja excluir este item? Esta ação não pode ser desfeita.",
   "Excluir", "Cancelar");

// बैकग्राउंड को गहरा करके मॉडलिटी को मजबूत करता है (alpha 0..255)
WindowStyle ws = confirm.getStyle();
ws.fadeBackground(150);

// Botão 0 = Excluir -> निष्पादित करता है, बंद करता है और फीडबैक देता है
confirm.buttonAction(0, origin ->
{
   excluirItem();
   confirm.hide();
   Hint.show("Item excluído", 2000);
});
// Botão 1 = Cancelar: बिना callback -> default पहले से ही hide() कॉल करता है

confirm.show();
```

### बटनों का लेआउट चुनना
```java
Alert a = new Alert("Salvar", "Deseja salvar as alterações?", "Salvar", "Descartar");
a.style().buttonLayout(AlertStyle.ButtonLayout.IOS)  // IOS / FLUTTER / MATERIAL
         .maxButtonsPerRow(2);
a.show();
```

## अच्छे तरीके
- ऐसे निर्णयों के लिए उपयोग करें जिनमें स्वीकृति आवश्यक हो। निष्क्रिय फीडबैक के लिए [`Hint`](/docs/ui/widgets/hint) को प्राथमिकता दें।
- कम बटन रखें — बहुत सारे बटन पंक्तियों में टूट जाते हैं और डायलॉग को ऊँचा बना देते हैं।
- जब भी शास्त्रीय मोडल प्रभाव चाहें, `fadeBackground` के साथ जोड़ें।

## सामान्य गलतियाँ
- **`show(onAnswer)` के माध्यम से प्रतिक्रिया की अपेक्षा करना** — यह केवल `Picker` के लिए है। `buttonAction(...)` पंजीकृत करें।
- **`show()` से पहले `getButton(i)` एक्सेस करना** — बटन `onAdd` में बनते हैं और उससे पहले `null` लौटाते हैं।
- **`buttonAction` के लैम्ब्डा को मान लौटाना** — `Action.run(...)` `void` है।

## यह भी देखें
- क्षेत्र गाइड: [`ui/`](/docs/ui) · रेसिपी: [`cookbook/`](/docs/cookbook)
- संबंधित घटक: [`ActionSheet`](/docs/ui/widgets/actionsheet) · [`Hint`](/docs/ui/widgets/hint)
