# डायलॉग और मोडल

> Alert, ActionSheet और Hint — कैसे खोलें, जवाब पाएँ और दिखावट कॉन्फ़िगर करें।

Source: https://crossfly.dev/hi/docs/ui/navigation/dialogs-and-modals — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# डायलॉग और मोडल

डायलॉग वर्तमान स्क्रीन के ऊपर ढेर की गई **पॉपअप विंडो** हैं। CrossFly में तीन मुख्य हैं
`Alert` (पुष्टि), `ActionSheet` (क्रियाओं की सूची) और `Hint` (क्षणिक सूचना, पुराना "Toast")।

## ⚠️ `Alert`/`ActionSheet` **बटनों** से जवाब देते हैं, `onAnswer` से नहीं
ये `Window` को विस्तारित करते हैं (`Picker` को नहीं), इसलिए **`show(callback)` कोई मान नहीं लौटाता**। उपयोगकर्ता की
पसंद **बटन के कॉलबैक** (`buttonAction`) से आती है। (देखें [मान लौटाना](/docs/ui/navigation/returning-results)।)

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

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

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

      // Alert — कंस्ट्रक्टर में बटन (0 = Cancelar, 1 = Excluir); क्रिया इंडेक्स द्वारा।
      Button excluir = new Button("Excluir item");
      excluir.onAction(c -> {
         Alert a = new Alert("Excluir", "Confirma a exclusão deste item?", "Cancelar", "Excluir");
         a.buttonAction(1, x -> Hint.show("Item excluído", 2000));   // Cancelar (0) सिर्फ बंद करता है
         // popup: WindowStyle फ़्लुएंट द्वारा आकार देता और पृष्ठभूमि गहरी करता है
         a.getStyle().widthRatio(0.85f).fadeBackground(128).transition(UIConstants.Transition.FADE);
         a.show();
      });
      add(LAY_AUTO, excluir);

      // ActionSheet — पहला तर्क रद्द करने का टेक्स्ट है।
      Button compartilhar = new Button("Compartilhar");
      compartilhar.onAction(c -> {
         ActionSheet sheet = new ActionSheet("Cancelar", "E-mail", "Mensagem");
         sheet.buttonAction(0, x -> Hint.show("Enviado por e-mail", 2000));   // इंडेक्स 0 = E-mail
         sheet.buttonAction(1, x -> Hint.show("Enviado por SMS", 2000));      // इंडेक्स 1 = Mensagem
         sheet.show();
      });
      add(LAY_AUTO, compartilhar);

      // Hint — क्षणिक सूचना (delay ms में)।
      Button avisar = new Button("Mostrar aviso");
      avisar.onAction(c -> Hint.show("Salvo com sucesso", 2000));
      add(LAY_AUTO, avisar);
   }
}
```
> नीचे दिए गए स्निपेट **केवल मुख्य भाग** दिखाते हैं (जो `onShow()` के अंदर जाता है)। चलाने के लिए, उन्हें ऊपर दिए गए `MainWindow` ढाँचे में रखें।

## Alert (पुष्टि करना / सूचित करना)
बटनों के टेक्स्ट **कंस्ट्रक्टर** में जाते हैं; प्रत्येक की क्रिया `buttonAction` के साथ **इंडेक्स** द्वारा जोड़ी जाती है:
```java
// बटन: इंडेक्स 0 = "Cancelar", इंडेक्स 1 = "Excluir"
Alert a = new Alert("Excluir", "Confirma a exclusão deste item?", "Cancelar", "Excluir");
a.buttonAction(1, c -> excluirItem());   // क्रिया यहां से आती है, show(cb) से नहीं; Cancelar सिर्फ बंद करता है
a.show();
```

## ActionSheet (एक क्रिया चुनना)
यह भी टेक्स्ट कंस्ट्रक्टर में लेता है (**पहला** आर्गुमेंट कैंसल का टेक्स्ट है):
```java
ActionSheet sheet = new ActionSheet("Cancelar", "E-mail", "Mensagem");
sheet.buttonAction(0, c -> enviarPorEmail());   // इंडेक्स 0 = "E-mail"
sheet.buttonAction(1, c -> enviarPorSMS());     // इंडेक्स 1 = "Mensagem"
sheet.cancelAction(c -> {});                     // वैकल्पिक: रद्द करने पर क्रिया
sheet.show();
```

## Hint (क्षणिक सूचना — Toast/ToolTip की जगह)
```java
Hint.show("Salvo com sucesso", 2000);     // खुद गायब हो जाता है
```

## पॉपअप की दिखावट कॉन्फ़िगर करना — `WindowStyle`
पॉपअप का आकार/स्थिति विंडो के `WindowStyle` द्वारा तय होती है। उपयोगी फ़ील्ड:

| फ़ील्ड | प्रभाव |
|---|---|
| `widthRatio` / `heightRatio` | स्क्रीन के अंश के रूप में आकार |
| `yRatio` / `xAbs` / `yAbs` | स्थिति |
| `fadeBackground` | पॉपअप के पीछे की पृष्ठभूमि को गहरा करता है |
| `canHide` | बाहर छूने पर पॉपअप बंद हो जाता है |
| `canMove` | उपयोगकर्ता खींच सकता है |
| `transition` / `transitionDuration` | प्रवेश/निकास एनिमेशन (डिफ़ॉल्ट `NONE`, `0.5s`) |

```java
getStyle().widthRatio = 0.85f;                       // चौड़ाई का 85%
getStyle().fadeBackground = true;                     // गहरी पृष्ठभूमि
getStyle().transition = UIConstants.Transition.FADE;  // fade के साथ प्रकट होता है
```

## अच्छे तौर-तरीके
- स्पष्ट बटन लेबल ("OK" के बजाय "हटाएँ"); विनाशकारी क्रिया सबसे अंत में।
- गैर-अवरोधक पुष्टियों के लिए `Alert` की जगह `Hint` को प्राथमिकता दें।

## आम गलतियाँ
- **`alert.show(cb)` से `cb` के चलने की उम्मीद करना** — यह नहीं चलता; क्रिया को `buttonAction(i, callback)` से जोड़ें।
- `addButton(...)`/`addOption(...)` को कॉल करना — वे मौजूद नहीं हैं; टेक्स्ट **कंस्ट्रक्टर** में जाते हैं और क्रियाएँ **इंडेक्स** द्वारा।
- एक ही घटना पर कई पॉपअप ढेर करना।

## यह भी देखें
- [मान लौटाना](/docs/ui/navigation/returning-results) · [विंडो स्टैक](/docs/ui/navigation/the-window-stack)
- कैटलॉग: [Alert](/docs/ui/widgets/alert) · [ActionSheet](/docs/ui/widgets/actionsheet) · [Hint](/docs/ui/widgets/hint)
