کشو (Drawer)

یک پنل کشویی که از کنار صفحه نمایش داده می‌شود

معرفی

کامپوننت Drawer یک پنل کشویی است که معمولاً برای نمایش منوها، فرم‌ها یا محتوای اضافی استفاده می‌شود.

چه زمانی استفاده کنیم:

  • برای پنل‌های موبایل که از پایین صفحه باز می‌شوند (bottom sheet)
  • برای منوهای ناوبری در موبایل
  • وقتی کاربر باید بتواند با swipe پنل را ببندد

چه زمانی استفاده نکنیم:

  • برای dialog های کوچک روی desktop — از Dialog استفاده کنید
  • برای فرم‌های با تعامل کمپلکس — از Dialog استفاده کنید
  • برای محتوایی که باید در overlay کامل باشد — از Dialog استفاده کنید

زمین بازی

با تغییر تنظیمات زیر، پیش‌نمایش زنده را مشاهده کنید.

زمین بازی
تنظیمات
محتوا
import { Drawer, DrawerTrigger, DrawerContent, DrawerHeader, DrawerTitle, Button, DrawerDescription, DrawerFooter } from '@partodata/ui'

<Drawer>
  <DrawerTrigger asChild>
    <Button type="default" size="sm">باز کردن کشو</Button>
  </DrawerTrigger>
  <DrawerContent>
    <DrawerHeader>
      <DrawerTitle>عنوان کشو</DrawerTitle>
      <DrawerDescription>توضیحات کوتاه درباره محتوا.</DrawerDescription>
    </DrawerHeader>
    <DrawerFooter>
      <Button type="primary" size="sm">تأیید</Button>
    </DrawerFooter>
  </DrawerContent>
</Drawer>

استفاده

import {
  Drawer,
  DrawerClose,
  DrawerContent,
  DrawerDescription,
  DrawerFooter,
  DrawerHeader,
  DrawerTitle,
  DrawerTrigger,
} from '@partodata/ui'

export default function MyComponent() {
  return (
    <Drawer>
      <DrawerTrigger>باز کردن</DrawerTrigger>
      <DrawerContent>
        <DrawerHeader>
          <DrawerTitle>عنوان</DrawerTitle>
          <DrawerDescription>توضیحات در اینجا</DrawerDescription>
        </DrawerHeader>
        <div className="p-4">محتوای اصلی</div>
        <DrawerFooter>
          <DrawerClose>بستن</DrawerClose>
        </DrawerFooter>
      </DrawerContent>
    </Drawer>
  )
}

حالت‌ها و انواع

پیش‌فرض

ساختار کامپوننت‌ها

<Drawer>
  <DrawerTrigger asChild>
    <Button>باز کردن</Button>
  </DrawerTrigger>
  <DrawerContent>
    <DrawerHeader>
      <DrawerTitle>عنوان</DrawerTitle>
      <DrawerDescription>توضیحات</DrawerDescription>
    </DrawerHeader>
    {/* محتوا */}
    <DrawerFooter>
      <Button variant="primary">تأیید</Button>
      <DrawerClose asChild>
        <Button variant="outline">لغو</Button>
      </DrawerClose>
    </DrawerFooter>
  </DrawerContent>
</Drawer>

جهت‌های مختلف

از prop منطقی side استفاده کنید: end لبه‌ی انتهای جهت خواندن است (در RTL سمت چپ و در LTR سمت راست) و start لبه‌ی ابتدای آن. top و bottom روی محور عمودی‌اند و با جهت صفحه تغییر نمی‌کنند.

از پایین (پیش‌فرض)

<Drawer side="bottom">{/* محتوا */}</Drawer>

از لبه‌ی ابتدایی (در RTL: راست)

<Drawer side="start">{/* محتوا */}</Drawer>

از لبه‌ی انتهایی (در RTL: چپ)

<Drawer side="end">{/* محتوا */}</Drawer>

از بالا

<Drawer side="top">{/* محتوا */}</Drawer>

prop فیزیکی direction هنوز کار می‌کند، اما side را ترجیح دهید

direction همان prop کتابخانه‌ی vaul است و همیشه فیزیکی می‌ماند (left واقعاً یعنی چپ صفحه). تا نسخه‌ی 3.0.0 کلاس‌های موقعیت‌دهی کامپوننت منطقی بودند در حالی که انیمیشن، نوار سرریز و محاسبات کشیدن در vaul فیزیکی‌اند؛ نتیجه این بود که در یک صفحه‌ی RTL، direction="right" پنل را روی لبه‌ی چپ می‌کشید ولی آن را از سمت راست وارد می‌کرد و برای بستن هم به سمت اشتباه کشیده می‌شد. حالا direction دقیقاً همان لبه‌ی فیزیکی را می‌دهد و side معادل منطقی آن است.

کنترل شده

const [open, setOpen] = useState(false)

;<Drawer open={open} onOpenChange={setOpen}>
  {/* محتوا */}
</Drawer>

راهنمای استفاده

بکنید

  • از Drawer برای تجربه موبایل استفاده کنید و در desktop از Sheet یا Dialog استفاده کنید - همیشه DrawerTitle و DrawerDescription را برای دسترسی‌پذیری ارائه دهید - از side مناسب بر اساس نوع محتوا استفاده کنید (bottom برای منو، start/end برای پنل کناری)

نکنید

  • Drawer را در desktop به‌عنوان جایگزین Dialog استفاده نکنید - محتوای بسیار بلند را بدون اسکرول داخلی در Drawer قرار ندهید - از Drawer برای تأیید اعمال مخرب استفاده نکنید — از AlertDialog استفاده کنید

جدول ویژگی‌ها

Drawer

Prop

Type

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

  • قابل کشیدن (swipe/drag) برای بستن
  • اسکرول صفحه در هنگام باز بودن قفل می‌شود
  • از role="dialog" و aria-modal استفاده می‌شود
  • با Escape بسته می‌شود
  • focus trap برای پیمایش کیبورد

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

  • Sheet — وقتی در desktop نیاز به پنل کناری دارید (Drawer برای موبایل، Sheet برای desktop)
  • Dialog — وقتی محتوا کوتاه است و نیاز به overlay کامل ندارید