دیالوگ واکنشگرا — ResponsiveDialog
ResponsiveDialog یک API برای محتوای مودال است که بر اساس عرض صفحه نمایش خود را انتخاب میکند. در دسکتاپ کپی کد نمایش داده میشود، در تبلت و موبایل کپی کد یا کپی کد بر اساس کپی کد و کپی کد، و در عرض ۳۶۰px و کمتر یک دیالوگ تمامصفحه. وضعیت باز یا بسته در همین کامپوننت میماند و با تغییر نمایش، محتوای داخلی دوباره سوار میشود. این کامپوننت ترکیبی از کپی کد و کپی کد است و ظاهر هر نمایش را از همانها میگیرد.
وضعیت: beta · لایه: ۳ (کپی کد) · کد: کپی کد
import { ResponsiveDialog } from '@tokapps/tuk';نمونهٔ زنده
کد قابل کپی
پایه: فرم در همهٔ اندازهها
import { Button, ResponsiveDialog } from '@tokapps/tuk';export function NewIdeaDialog({ onSubmit }: { onSubmit: () => void }) { return ( <ResponsiveDialog trigger={<Button>ثبت ایده</Button>} title="ثبت ایدهٔ جدید" description="روی دسکتاپ دیالوگ، روی موبایل برگهٔ پایینی." footer={({ close }) => ( <> <Button variant="secondary" onClick={close}>انصراف</Button> <Button onClick={() => { onSubmit(); close(); }}>ثبت</Button> </> )} > <p>محتوای فرم اینجا میآید.</p> </ResponsiveDialog> );}حالت پیشرفته: کشو در تبلت و موبایل
import { Button, ResponsiveDialog } from '@tokapps/tuk';export function IdeaFilters() { return ( <ResponsiveDialog mobileMode="drawer" tabletMode="drawer" drawerSide="start" trigger={<Button variant="secondary">فیلترها</Button>} title="فیلتر ایدهها" description="نتایج با هر تغییر بهروز میشود." > <p>گزینههای فیلتر اینجا میآید.</p> </ResponsiveDialog> );}حالت کنترلشده و غیرقابل بستن با پسزمینه
import { Button, ResponsiveDialog } from '@tokapps/tuk';import { useState } from 'react';export function UnsavedChangesDialog({ dirty }: { dirty: boolean }) { const [open, setOpen] = useState(false); return ( <ResponsiveDialog open={open} onOpenChange={setOpen} dismissable={false} title="تغییرات ذخیره نشده" footer={({ close }) => <Button onClick={close}>متوجه شدم</Button>} > {dirty ? <p>تغییراتی ذخیره نشده است.</p> : <p>همهچیز ذخیره شده است.</p>} </ResponsiveDialog> );}همهٔ پیکربندیها
| پراپ | نوع | پیشفرض | توضیح |
|---|---|---|---|
| کپی کد | کپی کد یا کپی کد | کپی کد | نمایش در موبایل (≤ ۶۴۰px). در ≤ ۳۶۰px همین حالت تمامصفحه میشود. |
| کپی کد | کپی کد یا کپی کد | کپی کد | نمایش در تبلت (≤ ۱۰۲۴px). |
| کپی کد | کپی کد · کپی کد · کپی کد · کپی کد | کپی کد | اندازهٔ دیالوگ در دسکتاپ و در تبلت وقتی کپی کد است. در کپی کد نادیده گرفته میشود. |
| کپی کد | کپی کد یا کپی کد | کپی کد | لبهٔ کشو وقتی کپی کد انتخاب شده است. |
| کپی کد | کپی کد · کپی کد · کپی کد · کپی کد | خودکار | نقطهٔ شکست اجباری برای داستانها و تست. در کد اختیاری است؛ بدون آن از کپی کد استفاده میشود. |
| کپی کد | کپی کد | — | محرک باز کردن؛ بدون آن با کپی کد کنترل کنید. |
| کپی کد | کپی کد | — | حالت کنترلشده. |
| کپی کد | کپی کد | کپی کد | حالت اولیه. |
| کپی کد | کپی کد | — | با هر تغییر باز/بسته. |
| کپی کد | کپی کد | — (الزامی) | عنوان؛ نام دسترسی دیالوگ از آن گرفته میشود. |
| کپی کد | کپی کد | — | توضیح زیر عنوان. |
| کپی کد | کپی کد یا کپی کد | — | ناحیهٔ کنشها؛ تابع کپی کد پوشش را میبندد. |
| کپی کد | کپی کد یا کپی کد | — | محتوای بدنه. |
| کپی کد | کپی کد | کپی کد | کلیک روی پرده بسته شود؟ کپی کد یعنی فقط دکمهها و Escape. |
| کپی کد | کپی کد | کپی کد | دکمهٔ بستن مرئی. |
| کپی کد | کپی کد | کپی کد | برچسب دکمهٔ بستن. |
| کپی کد | کپی کد | — | نام دسترسی وقتی عنوان مرئی نیست. |
| کپی کد | کپی کد | — | مقصد صدای نمایش جاری؛ بدون آن، مقصد سراسری (در صورت ثبت) استفاده میشود. |
| کپی کد | کپی کد (کپی کد یا کپی کد) | کپی کد | رفتار چاپ (ر.ک. بخش چاپ). |
| کپی کد | کپی کد | — | جهت صریح؛ بدون مقدار، جهت از ساختار صفحه میآید. |
| کپی کد | کپی کد | — | کلاس روی نمایش جاری. |
ساختار و اسلاتها
ریشهٔ ResponsiveDialog یکی از دو کامپوننت کپی کد (کپی کد) یا کپی کد (کپی کد) است؛ کپی کد روی همان ریشه مینشیند. داخل آن ترتیب اجزا: کپی کد · کپی کد (شامل کپی کد با کپی کد و کپی کد) · کپی کد · کپی کد.
- بنیان ثابت: کپی کد · کپی کد · کپی کد · کپی کد · کپی کد · کپی کد · کپی کد · کپی کد · کپی کد (از کپی کد) و کپی کد.
- قابلتغییر: کپی کد، کپی کد (در دیالوگ)، کپی کد (در کشو)، و توکنهای کپی کد.
همهٔ حالتها
| حالت | نشانه (data-attribute یا prop) | نمایش |
|---|---|---|
| بسته | پوشش در DOM نمایش داده نمیشود | فقط محرک دیده میشود. |
| باز (دیالوگ) | کپی کد · کپی کد · کپی کد | دیالوگ مرکزی با حرکت کپی کد. |
| باز (کشو) | کپی کد · کپی کد · کپی کد | کشو از لبهٔ کپی کد با حرکت اسلاید. |
| تمامصفحه (≤ ۳۶۰px) | کپی کد یا کپی کد · کپی کد | پوشش کل صفحه با فاصلهٔ ناحیهٔ امن. |
| بستن | کپی کد | پوشش محو میشود. |
| close hover | کپی کد | پسزمینهٔ کپی کد. |
| close pressed | کپی کد | پسزمینهٔ کپی کد. |
| close focus-visible | کپی کد | حلقهٔ کپی کد. |
| غیرقابل بستن با پرده | prop کپی کد | فقط دکمهها و Escape میبندند. |
| بدون دکمهٔ بستن | prop کپی کد | فقط Escape یا کنشهای footer میبندند. |
| کاهش حرکت | کپی کد یا کپی کد | بدون انیمیشن ورود و خروج. |
نمایش بر اساس نقطهٔ شکست
| نقطهٔ شکست | عرض | کپی کد | نتیجه |
|---|---|---|---|
| کپی کد | بیش از ۱۰۲۴px | کپی کد | کپی کد با کپی کد. |
| کپی کد | ≤ ۱۰۲۴px | کپی کد یا کپی کد (طبق کپی کد) | کپی کد یا کپی کد. |
| کپی کد | ≤ ۶۴۰px | کپی کد یا کپی کد (طبق کپی کد) | کپی کد یا کپی کد. |
| کپی کد | ≤ ۳۶۰px | کپی کد یا کپی کد (طبق کپی کد) | تمامصفحه؛ کپی کد همیشه کپی کد. |
الگوریتم انتخاب (کپی کد): دسکتاپ → کپی کد؛ تبلت → کپی کد؛ موبایل و موبایل کوچک → کپی کد، با تمامصفحهشدن در ≤ ۳۶۰px. ترتیب بررسی: کپی کد، کپی کد، کپی کد، سپس کپی کد.
قرارداد پوشش (Overlay Contract)
- دام فوکوس: فوکوس درون پوشش حبس میشود (FocusScope با contain)؛ با باز شدن به پوشش میرود و با بسته شدن به محرک برمیگردد.
- Escape: پوشش بالایی را میبندد و کپی کد صدا زده میشود.
- پسزمینه (backdrop): کلیک روی پرده میبندد (پیشفرض)؛ با کپی کد فقط دکمهها و Escape میبندند.
- قفل اسکرول: اسکرول صفحهٔ زیرین قفل میشود (usePreventScroll)؛ فقط بدنهٔ پوشش اسکرول میخورد و کپی کد دارد.
- کشیدن برای بستن: ندارد؛ بستن همیشه با دکمهٔ بستن مرئی، Escape یا کنشهای footer ممکن است.
- تودرتو: پوشش تودرتو پشتیبانی میشود؛ فقط بالاترین پوشش تعاملی است و بقیه کپی کد میشوند.
تغییرات مجاز برای توسعهدهنده
- variant: کپی کد (با کپی کد یا کپی کد) یا کپی کد (با همان پراپها).
- size: کپی کد، کپی کد، کپی کد و کپی کد در دیالوگ (در کپی کد فقط کپی کد یا کپی کد بهکار میرود).
- لبهٔ کشو: کپی کد با کپی کد یا کپی کد، منطقی و در RTL خودکار برمیگردد.
- نقطهٔ شکست: کپی کد برای داستانها و تست.
- نقاط توسعه: کپی کد، کپی کد، کپی کد، کپی کد و کپی کد با تابع کپی کد، کپی کد، کپی کد، کپی کد، کپی کد، کپی کد، کپی کد و توکنهای کپی کد.
تغییرات ممنوع (بنیان ثابت)
- ساختار اسلاتها و ترتیب DOM (کپی کد، کپی کد، کپی کد، کپی کد).
- جایگزینی یا تغییر نقش کپی کد؛ برای تأیید کنش مخرب از AlertDialog استفاده کنید، نه این کامپوننت.
- حذف دکمهٔ بستن در حالت عادی؛ کپی کد فقط برای موارد توجیهشده.
- دام فوکوس، Escape، قفل اسکرول و بازگرداندن فوکوس به محرک.
- کشیدن برای بستن: در این کامپوننت وجود ندارد و نباید اضافه شود.
- هدف لمسی ۴۴px برای دکمهٔ بستن.
- کاهش حرکت: حذف انیمیشن در هر نمایش.
RTL، کیبورد و صفحهخوان
- RTL: همهٔ نمایشها RTL-first هستند. کشو با کپی کد منطقی (کپی کد و کپی کد) انتخاب میشود و در RTL جهت آن برمیگردد؛ دکمهٔ بستن با ویژگیهای منطقی جای میگیرد.
- کیبورد: کپی کد بالاترین پوشش را میبندد؛ کپی کد و کپی کد فوکوس را درون پوشش میچرخانند؛ کپی کد کنترل فوکوسدار را فعال میکند.
- صفحهخوان: نقش کپی کد با کپی کد از عنوان و کپی کد از توضیح. با باز شدن، فوکوس منتقل میشود و صفحهخوان باز شدن را اعلام میکند. بقیهٔ صفحه کپی کد میشود.
- تغییر نمایش: با تغییر نقطهٔ شکست (مثلاً چرخش دستگاه) محتوای داخلی دوباره سوار میشود؛ وضعیت داخلی فرزندها (مثل مقدار فیلد نیمهکاره) ممکن است از دست برود. وضعیت را بیرون از پوشش نگه دارید.
صدا، حرکت، چاپ و کاهش حرکت
- صدا: opt-in است. رویدادهای کپی کد و کپی کد (کپی کد) بهعنوان نیت پوشش به کپی کد میرسند؛ کپی کد روی همین نمونه، یا مقصد سراسری با کپی کد، و بدون هیچکدام بیصداست. معادل بصری: حرکت پنل.
- حرکت: نام معنایی کپی کد با حرکت هر نمایش: کپی کد برای دیالوگ، کپی کد برای کشوی کناری و کپی کد برای کشوی پایینی. با کپی کد یا کپی کد بدون انیمیشن است.
- چاپ: پیشفرض کپی کد و در چاپ پنهان است. با کپی کد پوشش در چاپ بهصورت بلوک ایستا و بدون پرده و دکمهٔ بستن نمایش داده میشود (قاعدهٔ کپی کد در کپی کد).
توکنها
- فایل توکنهای کامپوننتی: کپی کد (گروه overlays؛ این کامپوننت توکن کپی کد اختصاصی ندارد و از Dialog و Drawer ارث میبرد).
- توکنهای سطح کامپوننت مصرفی: کپی کد، کپی کد، کپی کد، کپی کد، کپی کد، کپی کد، کپی کد، کپی کد، کپی کد، کپی کد، کپی کد، کپی کد، کپی کد، کپی کد، کپی کد، کپی کد، کپی کد و سایر موارد در کپی کد.
- توکنهای معنایی مصرفی: کپی کد، کپی کد، کپی کد، کپی کد، کپی کد، کپی کد، کپی کد.
- فهرست کامل: کپی کد.
قرارداد ARCH
- آیکون دکمهٔ بستن و کشو فقط با کپی کد و نام معنایی تعیین میشود؛ مسیر asset در کد نمیآید.
- تم فقط حرکت و توکنهای مجاز را تغییر میدهد؛ انتخاب نمایش و ARIA ثابتاند.
- این کامپوننت gesture ندارد؛ کشیدن برای بستن وجود ندارد و Escape و دکمهٔ بستن جایگزین آن هستند.
نکات
- برای نمایش ثابت و همیشه مرکزی از Dialog استفاده کنید؛ برای کشوی همیشه کناری از Drawer.
- برای تأیید کنش مخرب از AlertDialog استفاده کنید.
- برای جستجو و اجرای سریع کنش از CommandMenu استفاده کنید.
- در حالت کپی کد روی موبایل، اولین رندر در نقطهٔ شکست کپی کد انجام میشود و سپس نمایش اصلاح میشود؛ برای جلوگیری از پرش، از کپی کد کنترلشده با مقدار مشخص استفاده کنید.