Popover

پنلی شناور که با کلیک باز می‌شود و برخلاف راهنمای ابزار، محتوای تعاملی می‌پذیرد: ورودی، کلید، دکمه. موقعیتش خودکار طوری تنظیم می‌شود که از لبهٔ صفحه بیرون نزند.

ری‌اکت ۱۹ و Next.js با پیاده‌سازی دسترس‌پذیری داخلی دیگویو ۳ با Composition API و Reka UISvelte ۵ با runes و Bits UIانگولار با signals و Angular CDK

این کامپوننت فعلاً برای ۱ فریم‌ورک از ۴ فریم‌ورک آماده است.

این نمونه هنوز برای Vue پورت نشده است؛ آنچه می‌بینید نسخهٔ ری‌اکت است.

این نمونه هنوز برای Svelte پورت نشده است؛ آنچه می‌بینید نسخهٔ ری‌اکت است.

این نمونه هنوز برای Angular پورت نشده است؛ آنچه می‌بینید نسخهٔ ری‌اکت است.

نصب

با CLI اختصاصی dig-ui کامپوننت را از رجیستری دیگ نصب کنید؛ وابستگی‌ها و فایل‌ها خودکار اضافه می‌شوند.

نصب سریع با لینک سخت و دیسک مشترکپکیج‌منیجر پیش‌فرض Node.jsYarn نسخهٔ ۲ به بالا (Berry)رانتایم و پکیج‌منیجر Bun
pnpm dlx dig-ui@latest add https://design-system-tau-green.vercel.app/r/popover.json
npx dig-ui@latest add https://design-system-tau-green.vercel.app/r/popover.json
yarn dlx dig-ui@latest add https://design-system-tau-green.vercel.app/r/popover.json
bunx --bun dig-ui@latest add https://design-system-tau-green.vercel.app/r/popover.json

این کامپوننت هنوز برای Vue پورت نشده است.

نسخهٔ ری‌اکت آماده است؛ پورت این فریم‌ورک روی Reka UI در دست کار است.

این کامپوننت هنوز برای Svelte پورت نشده است.

نسخهٔ ری‌اکت آماده است؛ پورت این فریم‌ورک روی Bits UI در دست کار است.

این کامپوننت هنوز برای Angular پورت نشده است.

نسخهٔ ری‌اکت آماده است؛ پورت این فریم‌ورک روی Angular CDK در دست کار است.

استفاده

import {
  Popover,
  PopoverContent,
  PopoverTrigger,
} from "@/components/ui/popover"

<Popover>
  <PopoverTrigger asChild>
    <Button variant="outline">باز کردن</Button>
  </PopoverTrigger>
  <PopoverContent>محتوای پنل</PopoverContent>
</Popover>

این کامپوننت هنوز برای Vue پورت نشده است.

نسخهٔ ری‌اکت آماده است؛ پورت این فریم‌ورک روی Reka UI در دست کار است.

این کامپوننت هنوز برای Svelte پورت نشده است.

نسخهٔ ری‌اکت آماده است؛ پورت این فریم‌ورک روی Bits UI در دست کار است.

این کامپوننت هنوز برای Angular پورت نشده است.

نسخهٔ ری‌اکت آماده است؛ پورت این فریم‌ورک روی Angular CDK در دست کار است.

ترکیب اجزا

PopoverTrigger با asChild روی دکمهٔ خودتان می‌نشیند تا دکمهٔ تودرتو ساخته نشود. PopoverContent داخل یک Portal انتهای body رندر می‌شود، پس overflow: hidden والدها آن را نمی‌بُرد. برای مواقعی که دکمهٔ باز کننده و نقطهٔ لنگر یکی نیستند (مثلاً منویی که باید نسبت به یک فیلد باز شود) PopoverAnchor را جای دیگری بگذارید؛ محاسبهٔ موقعیت روی anchor انجام می‌شود و trigger فقط باز و بسته می‌کند. PopoverClose هم هر عنصری را به دکمهٔ بستن تبدیل می‌کند.

دسترس‌پذیری

  • پنل با Escape و با کلیک بیرون بسته می‌شود و فوکوس به دکمهٔ باز کننده برمی‌گردد.
  • هنگام باز شدن، فوکوس داخل پنل می‌رود و تا زمان بسته شدن داخلش می‌ماند؛ پس ورودی‌های داخل پاپ‌اور با Tab قابل پیمایش‌اند.
  • aria-expanded و aria-controls روی تریگر خودکار ست می‌شود؛ اگر تریگر فقط آیکون است، حتماً aria-label بدهید.
  • برای متن راهنمای صرفاً توضیحی از راهنمای ابزار استفاده کنید نه پاپ‌اور؛ محتوای پاپ‌اور تا باز نشود خوانده نمی‌شود.
  • align و side منطقی نیستند بلکه فیزیکی‌اند، ولی موتور موقعیت‌دهی دیگ در حالت rtl مقدار start و end را خودش برعکس می‌کند؛ در نتیجه align="start" همیشه یعنی «هم‌تراز با ابتدای دکمه».

مرجع API

Popover

ویژگینوعپیش‌فرضتوضیح
open / onOpenChangeboolean / (open: boolean) => voidمدیریت کنترل‌شدهٔ باز و بسته بودن.
defaultOpenbooleanfalseباز بودن در اولین رندر.
modalbooleanfalseدر حالت true تعامل با بقیهٔ صفحه بسته می‌شود و اسکرول قفل می‌ماند.

PopoverTrigger

ویژگینوعپیش‌فرضتوضیح
asChildbooleanfalseرفتار تریگر را به فرزند می‌دهد؛ برای اینکه Button تودرتو نشود همیشه با Button از این استفاده کنید.

PopoverContent

ویژگینوعپیش‌فرضتوضیح
side"top" | "right" | "bottom" | "left""bottom"جهت ترجیحی باز شدن؛ اگر فضا نباشد خودکار برعکس می‌شود.
align"start" | "center" | "end""center"ترازِ پنل نسبت به تریگر. در حالت rtl مقدار start یعنی سمت راست.
sideOffsetnumber4فاصله (پیکسل) بین پنل و تریگر.
showArrowbooleanfalseنمایش فلش کوچک بین پنل و تریگر.
onOpenAutoFocus(event: Event) => voidبا preventDefault می‌توانید جلوی انتقال خودکار فوکوس به پنل را بگیرید.
collisionPaddingnumber | Padding0حاشیهٔ امن از لبه‌های صفحه هنگام محاسبهٔ موقعیت.

PopoverAnchor / PopoverClose

ویژگینوعپیش‌فرضتوضیح
PopoverAnchorComponentنقطهٔ مرجع موقعیت‌یابی، وقتی با تریگر یکی نیست. اختیاری.
PopoverCloseComponentهر عنصری را به دکمهٔ بستن تبدیل می‌کند؛ معمولاً با asChild.

این کامپوننت هنوز برای Vue پورت نشده است.

نسخهٔ ری‌اکت آماده است؛ پورت این فریم‌ورک روی Reka UI در دست کار است.

این کامپوننت هنوز برای Svelte پورت نشده است.

نسخهٔ ری‌اکت آماده است؛ پورت این فریم‌ورک روی Bits UI در دست کار است.

این کامپوننت هنوز برای Angular پورت نشده است.

نسخهٔ ری‌اکت آماده است؛ پورت این فریم‌ورک روی Angular CDK در دست کار است.