پرش به مطلب اصلی

Drawer

کامپوننت Drawer یک پنل کشویی است که از کنار صفحه باز می‌شود؛ مثل منوی موبایل، سبد خرید یا فیلترهای جستجو. مشابه Modal روی document.body رندر می‌شود و هنگام باز بودن اسکرول صفحه قفل می‌شود.

Import​

import { Drawer } from "fara-ui";

اگر هنوز FaraUI را نصب و راه‌اندازی نکرده‌ای، ابتدا صفحه‌ی شروع به کار را ببین.

Basic Usage​

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

<Button onClick={() => setOpen(true)}>نمایش Drawer</Button>
<Drawer open={open} onClose={() => setOpen(false)} title="سبد خرید">
<p>محتوای کشو اینجاست.</p>
</Drawer>;

Playground​

<Drawer open={open} onClose={() => setOpen(false)} title="عنوان کشو" side="end">
محتوا
</Drawer>

Side​

در صفحه‌ی RTL (که هدف اصلی FaraUI است):

  • "end" (پیش‌فرض) — سمت چپ صفحه
  • "start" — سمت راست صفحه

Closing Behavior​

  • کلیک روی دکمه‌ی ✕ در هدر
  • کلیک روی پس‌زمینه‌ی تیره (overlay)
  • فشردن کلید Escape

Behavior​

  • قفل اسکرول: هنگام باز بودن، اسکرول صفحه‌ی اصلی قفل می‌شود و عرض اسکرول‌بار جبران می‌شود.
  • انیمیشن: پنل با انیمیشن slide باز و بسته می‌شود و بعد از پایان انیمیشن خروج از DOM حذف می‌شود.
  • بدنه‌ی کشو (children) اسکرول عمودی خودش را دارد، پس محتوای بلند مشکل‌ساز نیست.

className روی پنل اصلی Drawer اعمال می‌شود، نه روی overlay. برای تغییر عرض یا ظاهر پنل از همین prop استفاده کن:

<Drawer open={open} onClose={() => setOpen(false)} className="cart-drawer" title="سبد خرید">
{/* محتوا */}
</Drawer>

Accessibility​

  • بستن با کلید Escape پشتیبانی می‌شود.
  • دکمه‌ی بستن دارای aria-label="بستن" است.
  • برای عنوان‌های معنادار از title استفاده کن و داخل children یک ساختار منطقی برای navigation یا فرم قرار بده.
  • پیاده‌سازی فعلی role="dialog"، aria-modal و focus trap خودکار ندارد؛ اگر Drawer برای جریان‌های حساس یا keyboard navigation کامل استفاده می‌شود، این ویژگی‌ها را در wrapper خودت اضافه کن یا کامپوننت را بهبود بده.

Data Attributes and Customize CSS​

Drawer hookهای زیر را ارائه می‌کند:

Attributeکاربرد
data-fara-drawer-overlayoverlay تمام‌صفحه
data-openروی overlay و پنل فقط هنگام visible بودن
data-fara-drawerپنل اصلی
data-sideسمت پنل: start یا end
data-fara-drawer-headerheader پنل
data-fara-drawer-titleheading عنوان
data-fara-drawer-closeدکمه‌ی بستن
data-fara-drawer-bodyبدنه‌ی قابل اسکرول
[data-fara-drawer][data-side="end"] {
width: min(420px, 90vw);
}

[data-fara-drawer-overlay][data-open] {
background: rgb(15 23 42 / 45%);
}

[data-fara-drawer-body] {
padding: 20px;
}

چون Drawer با Portal در document.body رندر می‌شود، selectorهای پنل و overlay را به container والد وابسته نکن.

Props​

PropTypeDefaultDescription
openboolean-باز یا بسته بودن کشو (الزامی)
onClose() => void-هنگام بسته شدن صدا زده می‌شود (الزامی)
childrenReactNode-محتوای بدنه‌ی کشو (الزامی)
titlestring-عنوان هدر کشو
side"start" | "end""end"سمت باز شدن کشو
classNamestring-کلاس CSS اضافی روی پنل کشو