Files
upstream-mirror 1416db152c
All checks were successful
Release / Create Version PR or Publish Stable Release (push) Has been skipped
Release / Publish Prerelease to NPM (push) Has been skipped
Monitor Registries / Monitor registry health (push) Has been skipped
snapshot of https://github.com/shadcn-ui/ui.git (main, 2026-09-15; blobs > 131072B omitted)
2026-09-15 22:44:43 +05:00

183 lines
4.1 KiB
TypeScript

"use client"
import * as React from "react"
import { cn } from "cn"
import {
Dialog as DialogPrimitive,
DialogTrigger as DialogTriggerPrimitive,
Heading,
ModalOverlay as ModalOverlayPrimitive,
Modal as ModalPrimitive,
type DialogProps as DialogPrimitiveProps,
type DialogTriggerProps as DialogTriggerPrimitiveProps,
type ModalOverlayProps as ModalOverlayPrimitiveProps,
} from "react-aria-components"
import { Button } from "@/registry/bases/aria/ui/button"
import { IconPlaceholder } from "@/app/(create)/components/icon-placeholder"
function DialogTrigger({ ...props }: DialogTriggerPrimitiveProps) {
return <DialogTriggerPrimitive data-slot="dialog-trigger" {...props} />
}
function DialogClose({
className,
variant = "outline",
size = "default",
...props
}: React.ComponentProps<typeof Button>) {
return (
<Button
slot="close"
data-slot="dialog-close"
variant={variant}
size={size}
className={cn(className)}
{...props}
/>
)
}
function DialogOverlay({
className,
children,
...props
}: Omit<ModalOverlayPrimitiveProps, "className" | "children"> & {
className?: string
children: React.ReactNode
}) {
return (
<ModalOverlayPrimitive
data-slot="dialog-overlay"
className={cn(
"cn-dialog-overlay-aria fixed inset-0 isolate z-50",
className
)}
{...props}
>
{children}
</ModalOverlayPrimitive>
)
}
function Dialog({
className,
children,
showCloseButton = true,
isDismissable = true,
...props
}: Omit<ModalOverlayPrimitiveProps, "className" | "children"> &
Pick<React.ComponentProps<typeof ModalPrimitive>, "isDismissable"> & {
className?: string
children: React.ReactNode
showCloseButton?: boolean
}) {
return (
<DialogOverlay isDismissable={isDismissable} {...props}>
<ModalPrimitive
data-slot="dialog-content"
className={cn(
"cn-dialog-content-aria fixed top-1/2 left-1/2 z-50 w-full -translate-x-1/2 -translate-y-1/2 outline-none",
className
)}
>
<DialogPrimitive
data-slot="dialog"
className="[display:inherit] [gap:inherit] outline-none"
>
{children}
{showCloseButton && (
<DialogClose
variant="ghost"
className="cn-dialog-close"
size="icon-sm"
>
<IconPlaceholder
lucide="XIcon"
tabler="IconX"
hugeicons="Cancel01Icon"
phosphor="XIcon"
remixicon="RiCloseLine"
/>
<span className="sr-only">Close</span>
</DialogClose>
)}
</DialogPrimitive>
</ModalPrimitive>
</DialogOverlay>
)
}
function DialogHeader({ className, ...props }: React.ComponentProps<"div">) {
return (
<div
data-slot="dialog-header"
className={cn("cn-dialog-header flex flex-col", className)}
{...props}
/>
)
}
function DialogFooter({
className,
showCloseButton = false,
children,
...props
}: React.ComponentProps<"div"> & {
showCloseButton?: boolean
}) {
return (
<div
data-slot="dialog-footer"
className={cn(
"cn-dialog-footer flex flex-col-reverse gap-2 sm:flex-row sm:justify-end",
className
)}
{...props}
>
{children}
{showCloseButton && <DialogClose variant="outline">Close</DialogClose>}
</div>
)
}
function DialogTitle({
className,
...props
}: Omit<React.ComponentProps<typeof Heading>, "slot">) {
return (
<Heading
slot="title"
data-slot="dialog-title"
className={cn("cn-dialog-title cn-font-heading", className)}
{...props}
/>
)
}
function DialogDescription({
className,
...props
}: Omit<React.ComponentProps<"div">, "slot">) {
return (
<div
data-slot="dialog-description"
className={cn("cn-dialog-description", className)}
{...props}
/>
)
}
export {
type DialogPrimitiveProps,
type DialogTriggerPrimitiveProps,
Dialog,
DialogClose,
DialogDescription,
DialogFooter,
DialogHeader,
DialogOverlay,
DialogTitle,
DialogTrigger,
}