انتقل إلى المحتوى
TopClass UI

درج

مربع حوار ينزلق من حافة منطقية، فينعكس في العربية دون أي تعديل في الشيفرة. يُغلق بالسحب أو بزر الإغلاق.

client - الحجم لم يُقَس بعد

درج

client - الحجم لم يُقَس بعد

مربع حوار ينزلق من حافة منطقية، فينعكس في العربية دون أي تعديل في الشيفرة. يُغلق بالسحب أو بزر الإغلاق.

تثبيت

جرّبه

placement
size

الشيفرة

drawer.tsx
import { Button } from 'topclassui/button'
import {

<DrawerRoot>
  <DrawerTrigger render={<Button variant="outline">Filters</Button>} />
  <DrawerPopup>
    <DrawerHeader>
      <DrawerTitle>Filters</DrawerTitle>
      <DrawerDescription>Narrow the list of projects.</DrawerDescription>
    </DrawerHeader>
    <DrawerBody className="grid content-start gap-2.5">
      <p>Status</p>
      <p>Owner</p>
      <p>Updated</p>
    </DrawerBody>
    <DrawerFooter>
      <DrawerClose render={<Button variant="outline">Reset</Button>} />
      <DrawerClose render={<Button>Apply</Button>} />
    </DrawerFooter>
  </DrawerPopup>
</DrawerRoot>

placement منطقي: start يفتح من اليسار في الإنجليزية ومن اليمين في العربية. لا left ولا right أبدًا.

كل الحالات، بدون تمرير الفأرة

5 حالات

أو استورده من الحزمة

topclassui/drawer
import { DrawerRoot, DrawerBody, DrawerClose, DrawerDescription, DrawerFooter, DrawerHeader, DrawerPopup, DrawerTitle, DrawerTrigger } from 'topclassui/drawer'

ثبّت مرة واحدة:npm i topclassui@beta zod

أمثلة

  • للوحة تنزلق من حافة الشاشة: عوامل التصفية، التنقّل، قائمة للاختيار منها على الهاتف.
  • placement على DrawerRoot: end (الافتراضي) أو start أو top أو bottom.
  • size على DrawerRoot هو أقصى عرض يبلغه درج start أو end: 256 أو 288 أو 320 أو 384 أو 480 بكسل. درجا الأعلى والأسفل يمتدان بعرض الشاشة ويبلغان تسعة أعشار ارتفاعها.
  • السحب نحو حافة الدرج يغلقه متى تجاوز نصفه. الإصبع يبدأ من أي مكان في الدرج، والفأرة تبدأ من الرأس.
  • DrawerBody يتمرّر ويبقى الرأس والتذييل في مكانهما. ابدأ بـ DrawerHeader، فهو يُبعد العنوان عن زر الإغلاق.
  • على الهاتف يترك الدرج مساحة للنتوء ولمؤشر الشاشة الرئيسية، إن كان وسم viewport يحمل viewport-fit=cover.
end
start
bottom
top
sizes
with-form
long-body
long-content
non-modal
trap-focus
بالعربية، من اليمين إلى اليسار

الخصائص

DrawerRoot

خصائص DrawerRoot
الخاصيةالنوعالافتراضيالحدودالوصف
childrenReactNode--The trigger and the popup. With no trigger, hold open in a client file.
placementstart | end | top | bottom"end"-DrawerRoot: the edge the sheet slides from; start and end follow the direction.
sizexs | sm | md | lg | xl | custom"md"-DrawerRoot: the widest a start or an end sheet grows, 256 to 480 px; custom sets no width.

DrawerBody

لا خصائص خاصة به: يأخذ سمات العنصر الذي يعرضه.

DrawerClose

لا خصائص خاصة به: يأخذ سمات العنصر الذي يعرضه.

DrawerDescription

لا خصائص خاصة به: يأخذ سمات العنصر الذي يعرضه.

DrawerFooter

لا خصائص خاصة به: يأخذ سمات العنصر الذي يعرضه.

DrawerHeader

لا خصائص خاصة به: يأخذ سمات العنصر الذي يعرضه.

DrawerPopup

لا خصائص خاصة به: يأخذ سمات العنصر الذي يعرضه.

DrawerTitle

لا خصائص خاصة به: يأخذ سمات العنصر الذي يعرضه.

DrawerTrigger

لا خصائص خاصة به: يأخذ سمات العنصر الذي يعرضه.

لوحة المفاتيح وإمكانية الوصول

لوحة مفاتيح Drawer
المفاتيحما يفعله
EnterSpaceعلى المشغّل، يفتح الدرج. ينتقل التركيز إلى الدرج نفسه، ثم ينقله Tab إلى أول عنصر تحكم.
TabShift+Tabيتنقّلان داخل الدرج. يبقى التركيز داخله.
Escapeيغلق أولًا تلميحًا مفتوحًا داخله، ثم الدرج. يعود التركيز إلى المشغّل.
  • كل درج ينتهي بزر إغلاق لا يمكن إزالته: السحب حركة جرّ، والجرّ يحتاج طريقة ثانية (WCAG 2.5.7).
  • DrawerTitle يسمّي الدرج. إن لم يكن له عنوان، مرّر aria-label إلى DrawerPopup.
  • ما دام DrawerBody يتمرّر فهو محطة Tab، فتصل لوحة المفاتيح إلى نص طويل لا عنصر تحكم فيه.

من اليمين إلى اليسار

start يفتح من اليمين وend من اليسار، ويُغلق كل منهما بالسحب نحو حافته. ركّب TopClassProvider: من دونه يتبع السحب اتجاه اليسار إلى اليمين.

الخادم والمتصفح

مكوّن متصفح: يُعرض على الخادم ثم يُرطَّب في المتصفح.

الملفات: index.tsx, client.tsx.

على الشارة: client - الحجم لم يُقَس بعد.