Dialog

Odaklı bir iş için modal pencere. Açıkken focus içeride tutulur, kapanınca tetikleyiciye geri döner.

Import

tsx
import { Dialog } from "@merid/react";

Anatomi

tsx
<Dialog.Root>
  <Dialog.Trigger />
  <Dialog.Content>
    <Dialog.Title />
    <Dialog.Description />
    <Dialog.Footer>
      <Dialog.Close>Vazgeç</Dialog.Close>
    </Dialog.Footer>
  </Dialog.Content>
</Dialog.Root>
  • Root açık/kapalı state'ini tutar. Kendisi bir eleman render'lamaz.
  • Trigger, dialog'u açıp kapatan bir <button>'dır. Onun yerine kendi elemanını (örneğin bir Button) render'lamak için asChild ver.
  • Content modal yüzeydir; arka planla (backdrop) birlikte document.body'ye portal'lanır. Maksimum genişliğini size belirler.
  • Title dialog'u etiketler (aria-labelledby). Her zaman bir tane ekle.
  • Description varsa aria-describedby ile bağlanır.
  • Footer aksiyonları sağa hizalı dizer.
  • Close metin içerikle kullanıldığında secondary bir Button render'lar; farklı bir eleman (örneğin primary bir Button) vermek için asChild kullan. Content sağ üstteki ikonlu kapatma butonunu kendiliğinden ekler (showClose, varsayılan olarak açık). İçeriksiz bir Close render'larsan o ikon butonu sen yerleştirmiş olursun, otomatik olan kenara çekilir.
  • Content içinde açılan popover, menü, select ve tooltip'ler dialog'un üstünde katmanlanır; dialog içindeki bir formda Select ek ayar gerektirmeden çalışır.

Örnekler

Boyutlar

size maksimum genişliği belirler: sm 440px, md 560px (varsayılan), lg 720px, full ise kenarlarda 16px boşluk bırakarak viewport'un tamamı. 640px ve altında her boyut alttan açılan bir sheet'e dönüşür.

Controlled

State'i kendi component'inde tutmak için open ve onOpenChange ver. Örneğin dialog'u bir Trigger dışında bir yerden açman gerektiğinde.

İlk focus

Focus önce initialFocus ile verilen elemana, yoksa data-autofocus taşıyan elemana, o da yoksa ilk tab'lanabilir elemana gider.

tsx
<Dialog.Content>
  <Dialog.Title>Yeniden adlandır</Dialog.Title>
  <Input data-autofocus defaultValue="Northwind" />
</Dialog.Content>

Kapatmayı engellemek

Kaydedilmemiş işin kaybolması pahalıya patlayacaksa closeOnOutsidePress={false} ya da closeOnEscape={false} ver. Onaylar için AlertDialog'u tercih et.

API referansı

Dialog.Root

PropTipVarsayılanAçıklama
openboolean–Controlled açık/kapalı state'i.
defaultOpenbooleanfalseUncontrolled kullanımda başlangıç state'i.
onOpenChange(open: boolean) => void–Açık/kapalı state'i değişmesi gerektiğinde çağrılır.
childrenReactNode–Trigger, Content ve bu dialog'un state'ini paylaşan diğer her şey.

Dialog.Trigger

Tüm <button> attribute'larını kabul eder. type varsayılan olarak "button"'dır (asChild kullanıldığında atanmaz).

PropTipVarsayılanAçıklama
asChildbooleanfalse`<button>` yerine tek child elemanı (örneğin kendi `Button`'ını) render'lar; props, ref ve handler'ları birleştirir.
refRef<HTMLButtonElement>–Butona iletilen ref.

Dialog.Content

role dışındaki tüm <div> attribute'larını kabul eder.

PropTipVarsayılanAçıklama
sizeDialogSize"md"Maksimum genişlik: `sm` 440px, `md` 560px, `lg` 720px, `full` kenarlarda 16px boşlukla viewport'un tamamı. `DialogSize` tipi `"sm" | "md" | "lg" | "full"`.
closeOnOutsidePressbooleantrueArka plana basıldığında kapanır.
closeOnEscapebooleantrueEscape ile kapanır.
initialFocusRefObject<HTMLElement | null>–Açılınca focus alacak eleman. Verilmezse önce [data-autofocus], sonra ilk tab'lanabilir eleman.
containerElement | nulldocument.bodyPortal hedefi. `undefined` verilirse `document.body` kullanılır; `null` verilirse hedef oluşana kadar hiçbir şey render'lanmaz.
showClosebooleantrueSağ üstteki standart ikonlu kapatma butonunu otomatik render'lar. Kendi ikonlu `Close`'unu render'ladığında atlanır.
closeLabelstring"Close"Otomatik kapatma butonunun erişilebilir adı. Türkçe arayüzde `"Kapat"` ver.
refRef<HTMLDivElement>–Dialog elemanına iletilen ref.

Dialog.Title

Bir <h2> render'lar. Tüm başlık attribute'larını kabul eder.

PropTipVarsayılanAçıklama
refRef<HTMLHeadingElement>–Başlığa iletilen ref.

Dialog.Description

Bir <p> render'lar. Tüm paragraf attribute'larını kabul eder.

PropTipVarsayılanAçıklama
refRef<HTMLParagraphElement>–Paragrafa iletilen ref.

Dialog.Close

Tüm <button> attribute'larını kabul eder.

PropTipVarsayılanAçıklama
iconbooleaniçerik yoksa trueSağ üstteki standart ikon butonunu render'lar. false olduğunda (içerik verildiyse varsayılan budur) içeriği secondary bir Button olarak render'lar.
asChildbooleanfalse`<button>` yerine tek child elemanı (örneğin kendi `Button`'ını) render'lar; props, ref ve handler'ları birleştirir.
refRef<HTMLButtonElement>–Butona iletilen ref.

Bir <div> render'lar ve tüm <div> attribute'larını kabul eder; ek prop'u yoktur.

Stil verme

SınıfEleman
.mrd-dialog__backdropSabit arka plan, var(--mrd-backdrop)
.mrd-dialogYüzey: maksimum genişlik data-size'dan gelir (440 / 560 / 720px / full), --mrd-radius-card, --mrd-shadow-2xl
.mrd-dialog__titleBaşlık
.mrd-dialog__descriptionAçıklama metni
.mrd-dialog__footerAksiyon satırı
.mrd-dialog__closeİkonlu kapatma butonu

Content data-size taşır; content ve backdrop DOM'dayken data-state="open" taşır; tetikleyici data-state="open" | "closed" taşır. 640px ve altında dialog alttan açılan bir sheet'e dönüşür, footer'daki aksiyonlar alt alta dizilir. Kullanılan token'lar: --mrd-backdrop, --mrd-surface, --mrd-z-overlay, --mrd-duration-enter. Dialog içinde açılan popover, menü, select ve tooltip'ler onun üstünde katmanlanır (--mrd-z-popover, --mrd-z-tooltip). Metin içerikli bir Close, data-variant="secondary" ile .mrd-button olarak render'lanır. Trigger'a ya da farklı varyantta bir Close'a stil vermek için asChild ile bir Button ver.

Erişilebilirlik

WAI-ARIA Dialog (Modal) desenini izler. Content role="dialog" ve aria-modal="true" taşır; Trigger aria-haspopup="dialog" ve aria-expanded taşır. Açıkken sayfanın scroll'u kilitlenir.

TuşNe yapar
SpaceEnterTetikleyicideyken dialog'u açar.
TabFocus'u dialog içindeki bir sonraki elemana taşır; sona gelince başa döner.
ShiftTabFocus'u bir önceki elemana taşır; başa gelince sona döner.
EscDialog'u kapatır ve focus'u tetikleyiciye döndürür.

Kullanım ilkeleri

Yap

Dialog'u, kullanıcının istediği kısa ve odaklı bir iş için kullan; örneğin tek bir kaydı düzenlemek.

Kaçın

Kullanıcı istemeden dialog açmak ya da bir dialog'un içinde başka bir dialog açmak.

Yap

Primary aksiyonu ne olacağını söyleyen bir fiille adlandır: Kaydet, Davet et, Yeniden adlandır.

Kaçın

Primary aksiyon için Tamam ya da Evet gibi belirsiz etiketler kullanmak.

İlgili sayfalar

  • AlertDialog: yanıt bekleyen onaylar için.
  • Drawer: sayfanın yanında duran uzun içerik için.
  • Popover: modal olmayan, bir tetikleyiciye bağlı içerik için.