PostDetailsDrawer (پنل جزئیات)
پنل کناری راست برای بررسی عمیق یک پست — Surface canonical جزئیات با ناوبری j/k بین پستهای فید.
معرفی
<PostDetailsDrawer> Surface canonical برای نمایش جزئیات کامل یک پست در دسکتاپ است. الگوی Linear inbox / Brandwatch / Gmail — کاربر میتواند بدون بستن پنل، با j و k به پست بعدی/قبلی در فید برود.
- چه زمانی استفاده کنیم: برای نمایش پست انتخابشده در
<PostList>. در موبایل بهطور خودکار بهصورت full-screen bottom sheet دیده میشود. - چه زمانی استفاده نکنیم: برای modalهای موقت اطلاعرسانی — از
<Dialog>استفاده کنید.
زمین بازی
با تغییر کنترلهای زیر، حالتهای مختلف پنل جزئیات را زنده ببینید — از نبود تحلیل هوشمند تا متنهای طولانی، انواع رسانه، حالت بحرانی و پنل بدون نظرات.
پنل جزئیات پست — برای مشاهدهی حالتهای مختلف از کنترلهای بالا استفاده کنید.
استفاده
import { PostDetailsDrawer } from '@partodata/ui'
;<PostDetailsDrawer
open={Boolean(detailsPost)}
onOpenChange={(o) => !o && setDetailsPost(null)}
post={detailsPost}
details={detailsByPostId[detailsPost.id]}
bookmarked={bookmarkedIds.has(detailsPost.id)}
onBookmark={handleBookmark}
onNext={() => navigate(1)}
onPrevious={() => navigate(-1)}
/>Tabs
post— متن، رسانه، URL preview، نقلقول، سیگنالها (sentiment/emotion/flow/severity/cluster/language)، گرید متریکها. درcontext="detail"و url قابل پخش، video به HTML5<video controls>تبدیل میشود.comments— نظرات تودرتو با enrichment کامل (replyCount, edited, badge, authorReply, hiddenByModerator, toxicityScore, translatedText toggle). تو در تو با depth.analysis— surface غنی شامل:- خلاصه پست
- کارت سهگانه: نیت پیام + اطمینان مدل + تأثیرگذاری نویسنده
- توزیع احساسات (نمودار میلهای ۹-کلاسه)
- موضوعات، موجودیتهای شناساییشده (شخص/برند/مکان/…)
- ریسکهای شناساییشده
- اطلاعات پلتفرم (
platformMeta) به صورت key-value list — متفاوت برای هر منبع (Instagram saves/location، Twitter retweet/quote، YouTube subscribers، Press AVE، …) - تاریخ تولید تحلیل
transcript— رونوشت ویدیو/صوت + OCR.
کیبورد
j/↓→ پست بعدیk/↑→ پست قبلیEsc→ بستن
RTL
درآور در پنلهای افکارسنجی همیشه روی لبهی بصری راست ظاهر میشود (جایی که چشم RTL در آنجا anchor شده). پیادهسازی: ترکیب dir="rtl" صریح روی SheetContent + override فیزیکی (!start-auto !end-auto !right-0 !left-auto) تا از سناریوهای portal-context که dir را به ارث نمیبرند هم امن باشد.
راهنمای استفاده
بکنید
detailsرا بهصورت lazy واکشی کنید و در طول واکشیisLoadingDetailsراtrueبدهید — تبهای وابسته (نظرات، تحلیل، متن استخراجی) حالت بارگذاری استاندارد را باrole="status"نمایش میدهند.onNextوonPreviousرا همیشه با هم تنظیم کنید تا ناوبریj/kکامل باشد و کاربر بتواند بدون بستن پنل، کل فید را مرور کند — مثلاً بررسی پستهای یک کمپین تخفیف فصلی پشتسرهم.- اکشنهای اختصاصی محصول (مانند «افزودن به بولتن») را از طریق
extraActionsبه هدر تزریق کنید — این prop دقیقاً برای همین کنار اکشنهای پیشفرض رندر میشود. - وضعیت باز/بسته را در والد نگه دارید (
open/onOpenChange) — کامپوننت controlled است و معمولاًPostListباonOpenDetailsآن را باز میکند.
نکنید
- دکمه بستن دستی اضافه نکنید — primitive
Sheetخودش دکمه بستن (X) را با متنsr-onlyدر گوشه بالا رندر میکند و دکمه تکراری کاربران صفحهخوان را سردرگم میکند. - تبهای بدون داده را دستی مخفی یا شرطی نکنید — کامپوننت خودش تبهای فاقد داده را
disabledمیکند و اگرdefaultTabبه تب غیرفعال اشاره کند، بهطور خودکار بهpostبرمیگردد. - نتیجه
onTranslateرا خودتان درpost.bodyننویسید — کامپوننت toggle «نمایش متن اصلی / نمایش ترجمه» و کش ترجمه را داخلی مدیریت میکند و با تغییرpost.idآن را ریست میکند. - برای تأیید عملیات مخرب (مانند حذف پست از آرشیو) از این پنل استفاده نکنید — از
AlertDialogاستفاده کنید؛ این پنل Surface مرور و تحلیل است، نه تصمیمگیری بازگشتناپذیر.
جدول ویژگیها
PostDetails
دسترسیپذیری
- پنل روی primitive
Sheet(Radix Dialog) ساخته شده است: هنگام باز شدنrole="dialog"وaria-modalدارد، فوکوس داخل پنل trap میشود و هنگام بستن به عنصر قبلی برمیگردد. - عنوان دیالوگ با
SheetTitleمخفی (sr-only) بهصورت «جزئیات پست از (نام نویسنده)» رندر میشود — صفحهخوان نام دیالوگ را با هویت پست اعلام میکند، بدون تکرار بصری هدر. - دکمه بستن داخلی
Sheetمتنsr-only«بستن» دارد؛ همه اکشنهای آیکنی هدرaria-labelدارند: «نشانهگذاری / حذف از نشانشدهها»، «کپی لینک» و «مشاهده در مبدأ». پس از کپی موفق،aria-labelدکمه کپی به «کپی شد» تغییر میکند. - تبها Radix Tabs هستند (
role="tablist"/tab/tabpanel) با ناوبری Arrow بین triggerها؛ تبهای فاقد دادهdisabledمیشوند و از ترتیب فوکوس خارجاند. - میانبرهای
j/k/↓/↑فقط وقتی پنل باز است فعالاند و اگر فوکوس داخلinputیاtextareaباشد، غیرفعال میشوند تا تایپ کاربر ربوده نشود.Escرا خودSheetمدیریت میکند (بخش «کیبورد» بالا). - حالت بارگذاری هر تب با
role="status"وaria-busy="true"رندر میشود تا صفحهخوان در جریان واکشیdetailsقرار بگیرد. - در نمودار «توزیع احساسات»، هر میله
role="progressbar"باaria-valuenow/aria-valuemin/aria-valuemaxوaria-labelشامل نام احساس و درصد آن است.
کامپوننتهای مرتبط
- برای فید خود پستها →
<PostList>(که باonOpenDetailsخودش drawer را باز میکند) - برای quoted/embedded posts درون drawer →
<PostQuotedEmbed>(رندر میشود وقتیpost.quotedست شده) - برای اکشنهای گروهی روی پستهای انتخابشده →
<PostBulkActionBar>