nili/ui
همه‌ی کامپوننت‌ها

Modal

نمای کلی
۱۳ اکسپورت۵ محور واریانت۲۵ پراپ۴ فایل
import { Modal, StatusModal } from '@nili/ui';

این همان صفحه‌ی نمای کلیِ خود کتابخانه است که زنده رندر می‌شود. زبان یا تم را از هدر عوض کنید، همراهش می‌آید.

پایه

با open و onOpenChange کنترل می‌شود. به body پرتال می‌شود، تا وقتی باز است فوکوس را نگه می‌دارد، و هنگام بسته‌شدن فوکوس را به تریگر برمی‌گرداند.

import { Modal, Button } from "@nili/ui"

export function Example() {
  const [open, setOpen] = useState(false)

  return (
    <>
      <Button onClick={() => setOpen(true)}>Open</Button>

      <Modal
        open={open}
        onOpenChange={setOpen}
        title="Invite a teammate"
        description="They will get an email with a link to join."
        closeLabel="Close"
        footer={
          <>
            <Button appearance="stroke" onClick={() => setOpen(false)}>Cancel</Button>
            <Button onClick={() => setOpen(false)}>Send invite</Button>
          </>
        }
      >
        <TextInput label={t('invite.email')} placeholder="hello@nili.design" />
      </Modal>
    </>
  )
}

اندازه‌ها

چهار عرض پنل. headerSize جداست — سربرگ Medium (۸۰) و Small (۵۶) فیگما.

import { Modal } from "@nili/ui"

export function Example() {
  return (
    <>
      <Modal size="sm" … />
      <Modal size="md" … />
      <Modal size="lg" … />
      <Modal size="xl" … />
    </>
  )
}

سربرگ و تراز

icon یک اسلات پیشروی آزاد است و بر status مقدم می‌شود. alignment عمودی آیکون، عنوان و متن را وسط می‌چیند — شکلی که یک تأیید می‌خواهد.

import { Modal, Icon } from "@nili/ui"
import { RiDeleteBinLine } from "@remixicon/react"

export function Example() {
  return (
    <Modal
      open={open}
      onOpenChange={setOpen}
      alignment="vertical"
      status="error"
      icon={<Icon icon={RiDeleteBinLine} />}
      title="Delete this project?"
      description="This cannot be undone. Everything in it will be removed."
      stretchFooter
      footer={
        <>
          <Button appearance="stroke" onClick={close}>Cancel</Button>
          <Button color="error" onClick={close}>Delete</Button>
        </>
      }
    />
  )
}

مودال وضعیت

همان مودال با وضعیت ثابت: خودش KeyIcon و رنگش را برمی‌دارد، پس یک دیالوگ «success» قرمز از آب درنمی‌آید.

وضعیت‌ها
import { StatusModal, Button } from "@nili/ui"

export function Example() {
  return (
    <StatusModal
      open={open}
      onOpenChange={setOpen}
      status="success"
      alignment="vertical"
      title="Payment received"
      description="We have emailed you a receipt."
      stretchFooter
      footer={<Button onClick={close}>Done</Button>}
    />
  )
}

کنترل بسته‌شدن

closeOnOutsideClick و closeOnEscape پیش‌فرض روشن‌اند. برای دیالوگی که کار ذخیره‌نشده دارد خاموششان کنید — ولی آن‌وقت دکمهٔ بستن را بگذارید، وگرنه راه خروجی نمی‌ماند.

import { Modal } from "@nili/ui"

export function Example() {
  return (
    <Modal
      open={open}
      onOpenChange={setOpen}
      closeOnOutsideClick={false}
      closeOnEscape={false}
      showClose
      closeLabel="Close"
      title="Unsaved changes"
      …
    />
  )
}