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

مربع حوار

مربع حوار يحجب الصفحة، يتمرّر متنه بين رأس وتذييل ثابتين، بينما تبقى الصفحة خلفه ساكنة.

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

مربع حوار

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

مربع حوار يحجب الصفحة، يتمرّر متنه بين رأس وتذييل ثابتين، بينما تبقى الصفحة خلفه ساكنة.

تثبيت

جرّبه

size
closeButton

الشيفرة

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

<DialogRoot>
  <DialogTrigger render={<Button>Publish</Button>} />
  <DialogPopup>
    <DialogHeader>
      <DialogTitle>Publish changes</DialogTitle>
      <DialogDescription>Your changes go live right away.</DialogDescription>
    </DialogHeader>
    <DialogBody>11 files changed since the last publish.</DialogBody>
    <DialogFooter>
      <DialogClose render={<Button variant="outline">Cancel</Button>} />
      <DialogClose render={<Button>Publish now</Button>} />
    </DialogFooter>
  </DialogPopup>
</DialogRoot>

غلّف الأجزاء بنموذج يحمل الصنف contents، فيُرسَل إجراء الخادم من التذييل دون أي معالج في المتصفح.

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

5 حالات

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

topclassui/dialog
import { DialogRoot, DialogBody, DialogClose, DialogDescription, DialogFooter, DialogHeader, DialogPopup, DialogTitle, DialogTrigger } from 'topclassui/dialog'

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

أمثلة

  • لمهمة أو سؤال تنتظره الصفحة: نموذج، تأكيد، نص للموافقة عليه.
  • تسعة أجزاء بأسماء مسطّحة ولا يوجد Dialog وحده: DialogRoot وDialogTrigger وDialogPopup وDialogHeader وDialogTitle وDialogDescription وDialogBody وDialogFooter وDialogClose.
  • DialogBody يتمرّر ويبقى الرأس والتذييل في مكانهما. على شاشة قصيرة جدًا يتمرّر المربع كله بدلًا من ذلك.
  • size على DialogPopup هو أقصى عرض يبلغه: 320 أو 360 أو 400 أو 512 أو 640 بكسل. custom لا يضبط عرضًا.
  • للتأكيد، ضع disablePointerDismissal على DialogRoot: الضغط خارجه لم يعد يغلقه.
  • من صفحة خادم مرّر نصوصًا وقيمًا منطقية وعناصر وإجراء خادم. onOpenChange وأي دالة أخرى تحتاج ملفًا فيه 'use client'.
basic
confirm
with-form
close-on-success
long-body
long-content
sizes
no-close-button
non-modal
trap-focus
with-tooltip
بالعربية، من اليمين إلى اليسار

الخصائص

DialogRoot

خصائص DialogRoot
الخاصيةالنوعالافتراضيالحدودالوصف
childrenReactNode--The trigger and the popup. With no trigger, hold open in a client file.

DialogBody

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

DialogClose

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

DialogDescription

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

DialogFooter

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

DialogHeader

خصائص DialogHeader
الخاصيةالنوعالافتراضيالحدودالوصف
closeButtonbooleantrue-DialogHeader: whether it ends with the built-in close button.

DialogPopup

خصائص DialogPopup
الخاصيةالنوعالافتراضيالحدودالوصف
sizexs | sm | md | lg | xl | custom"md"-DialogPopup: the widest it grows, 320 to 640 px; custom sets no width.

DialogTitle

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

DialogTrigger

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

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

لوحة مفاتيح Dialog
المفاتيحما يفعله
EnterSpaceعلى المشغّل، يفتح مربع الحوار. ينتقل التركيز إلى زر الإغلاق.
TabShift+Tabيتنقّلان داخل مربع الحوار. يبقى التركيز داخله.
Escapeيغلق أولًا تلميحًا مفتوحًا داخله، ثم مربع الحوار. يعود التركيز إلى المشغّل.
  • DialogTitle يسمّي مربع الحوار. إن لم يكن له عنوان، مرّر aria-label إلى DialogPopup.
  • لا تُزل زر الإغلاق بـ closeButton={false} إلا إذا وُضع DialogClose في التذييل: قارئ الشاشة على شاشة لمس لا يملك مفتاح Escape.
  • ما دام DialogBody يتمرّر فهو محطة Tab، فتصل لوحة المفاتيح إلى نص طويل لا عنصر تحكم فيه.

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

ينتقل زر الإغلاق إلى اليسار، ويُحاذى النص إلى اليمين، وتنتهي الإجراءات عند اليسار. يأخذ المربع اتجاهه من أقرب TopClassProvider.

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

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

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

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