جعبه جهتدار (DirectionalBox)
کانتینر RTL/LTR-aware — content-switch بسته به جهت document، یا override صریح
معرفی
DirectionalBox کانتینر کوچکی است که محتوا را بسته به جهت صفحه (RTL/LTR) سوییچ میکند. مثال غالب: لوگو/برند که در RTL باید چپ-تراز و در LTR راست-تراز باشد، یا متن کوتاهی که با ترتیب عناصر در دو جهت باید عوض شود.
سوییچ بر اساس جهت document
اول این، بعد آن
جزیرهی LTR در صفحه RTL
git commit -m "init"جزیرهی RTL با dir صریح
این متن مستقل از جهت document همیشه RTL است.
زمین بازی
با تغییر dir میتوانید سوییچ بین محتوای RTL/LTR را بهصورت زنده ببینید.
زمین بازی
اول این، بعد آن
تنظیمات
چیدمان
کد این نمونه بهصورت خودکار قابل تولید نیست — برای کد آمادهی copy/paste به بخش «استفاده» در بالای صفحه مراجعه کنید.
چه زمانی استفاده کنیم:
- جایگذاری المانهایی که logical properties Tailwind برای آنها کافی نیست (مثل ترتیب در یک flex یا یک متن hardcoded که جای کلمات عوض میشود)
- وقتی نیاز است یک کامپوننت "جزیرهی LTR" در یک صفحهی RTL باشد (مثلاً پیشنمایش instagram post که برند خود instagram LTR است)
- override موقت جهت برای تست بصری
چه زمانی استفاده نکنیم:
- 95٪ موارد فقط با logical properties (
ms-,me-,inset-inline-start-) حل میشود — این کامپوننت برای 5٪ باقیمانده است
استفاده
import { DirectionalBox } from '@parto-system-design/ui'
// Content-switch بر اساس جهت document
<DirectionalBox
rtl={<>اول این، بعد آن</>}
ltr={<>This first, then that</>}
/>
// همان children در هر دو جهت ولی با dir="rtl" قطعی (جزیرهی RTL در صفحهی LTR)
<DirectionalBox dir="rtl">
<p>این متن همیشه RTL است</p>
</DirectionalBox>
// همان children با تشخیص خودکار جهت document
<DirectionalBox>
<p>این فقط dir document را میگیرد</p>
</DirectionalBox>راهنمای استفاده
بکنید
- برای جزیرهی LTR در صفحهی RTL از
dir="ltr"صریح استفاده کنید (مثلاً preview Instagram یا code block) - وقتی محتوا واقعاً بسته به جهت متفاوت است (نه فقط جایگذاری)، propهایrtlوltrرا پاس بدهید — این کامپوننت برای همان use-case طراحی شده است - برای layoutی که با logical properties حل میشود (ms-*,me-*,inset-inline-start-*) از Tailwind utilities استفاده کنید نه از این کامپوننت
نکنید
- این کامپوننت را برای 95٪ موارد لایهبندی استفاده نکنید — logical properties کافی است -
dirصریح را بدون دلیل override نکنید — اگر document RTL است، اکثر محتواها هم باید RTL بمانند - کل صفحه را داخل DirectionalBox نپوشانید — جهت document از<html dir>خوانده میشود و این کار redundant است
دسترسیپذیری
- کامپوننت یک
<div>ساده با attributedir={resolvedDir}رندر میکند — مرورگر و screen reader جهت متن را بهدرستی تفسیر میکنند. - هیچ semantic role یا ARIA اضافهای اعمال نمیشود؛ صرفاً یک wrapper جهتسنج است که
data-slot="directional-box"دارد. - اگر داخل DirectionalBox عناصر تعاملی قرار دادید، مسئولیت accessibility آنها (focus order, aria-label) با خود آن عناصر است.
- تشخیص جهت در client-side انجام میشود (از
useDocumentDirection)؛ در SSR fallback بهdir="rtl"میشود — برای جلوگیری از hydration flicker،dirصریح بدهید.
نکتهی فنی
تشخیص جهت از useDocumentDirection میآید که dir attribute روی <html> را watch میکند. اگر prop dir پاس بدهید، آن detection را override میکند.
جدول ویژگیها
کامپوننتهای مرتبط
- مستقیماً جهتسنج →
useDocumentDirectionhook - اگر فقط ترتیب logical میخواهید → utilities Tailwind (
ms-*,me-*,inset-inline-start-*)