پرتوپرتو

دیالوگ (Dialog)

کامپوننت نمایش پنجره‌های مودال

معرفی

کامپوننت Dialog برای نمایش محتوا در یک پنجره مودال که روی صفحه اصلی قرار می‌گیرد استفاده می‌شود.

استفاده

import {
  Dialog,
  DialogTrigger,
  DialogContent,
  DialogHeader,
  DialogTitle,
  DialogDescription,
  DialogFooter,
  Button,
  Input,
} from '@parto/ui';

<Dialog>
  <DialogTrigger asChild>
    <Button>باز کردن دیالوگ</Button>
  </DialogTrigger>
  <DialogContent>
    <DialogHeader>
      <DialogTitle>ویرایش پروفایل</DialogTitle>
      <DialogDescription>اطلاعات خود را ویرایش کرده و ذخیره کنید.</DialogDescription>
    </DialogHeader>
    <div className="space-y-3">
      <Input placeholder="نام کامل" defaultValue="مریم محمدی" />
      <Input placeholder="ایمیل" type="email" defaultValue="maryam@example.com" />
    </div>
    <DialogFooter>
      <Button variant="outline">لغو</Button>
      <Button>ذخیره</Button>
    </DialogFooter>
  </DialogContent>
</Dialog>

مثال فرم

<Dialog>
  <DialogTrigger asChild>
    <Button variant="outline">ویرایش پروفایل</Button>
  </DialogTrigger>
  <DialogContent className="sm:max-w-[425px]">
    <DialogHeader>
      <DialogTitle>ویرایش پروفایل</DialogTitle>
      <DialogDescription>
        تغییرات خود را اعمال کنید و سپس ذخیره کنید.
      </DialogDescription>
    </DialogHeader>
    <div className="grid gap-4 py-4">
      <div className="grid grid-cols-4 items-center gap-4">
        <label htmlFor="name" className="text-end">
          نام
        </label>
        <Input
          id="name"
          defaultValue="علی احمدی"
          className="col-span-3"
        />
      </div>
      <div className="grid grid-cols-4 items-center gap-4">
        <label htmlFor="username" className="text-end">
          نام کاربری
        </label>
        <Input
          id="username"
          defaultValue="@ali_ahmadi"
          className="col-span-3"
        />
      </div>
    </div>
    <DialogFooter>
      <Button type="submit">ذخیره تغییرات</Button>
    </DialogFooter>
  </DialogContent>
</Dialog>

کنترل Programmatic

const [open, setOpen] = React.useState(false);

<Dialog open={open} onOpenChange={setOpen}>
  <DialogContent>
    {/* محتوا */}
    <Button onClick={() => setOpen(false)}>بستن</Button>
  </DialogContent>
</Dialog>

ترکیب کامپوننت‌ها

Dialog از اجزای زیر تشکیل شده است:

  • Dialog: کانتینر اصلی و مدیریت state
  • DialogTrigger: المنت trigger کننده dialog
  • DialogContent: محتوای اصلی dialog
  • DialogHeader: هدر dialog
  • DialogTitle: عنوان dialog
  • DialogDescription: توضیحات dialog
  • DialogFooter: فوتر با دکمه‌های عملیاتی

Props

Dialog

PropTypeDefaultDescription
openboolean-کنترل وضعیت باز/بسته
onOpenChange(open: boolean) => void-callback تغییر وضعیت
defaultOpenbooleanfalseوضعیت پیش‌فرض

DialogContent

PropTypeDefaultDescription
classNamestring-کلاس‌های CSS اضافی
onEscapeKeyDown(event) => void-رویداد فشردن Escape
onInteractOutside(event) => void-رویداد کلیک خارج dialog

دسترسی‌پذیری

  • Focus به‌طور خودکار به داخل dialog منتقل می‌شود
  • با فشردن Escape بسته می‌شود
  • Focus trap برای پیمایش کیبورد
  • از role="dialog" و aria-modal استفاده می‌شود
  • aria-labelledby برای عنوان
  • aria-describedby برای توضیحات

ملاحظات RTL

  • محتوا به‌صورت خودکار راست‌چین می‌شود
  • دکمه بستن در سمت راست بالا قرار می‌گیرد
  • ترتیب دکمه‌ها در DialogFooter از راست به چپ است