import { forwardRef, type ComponentPropsWithoutRef, type ElementRef } from 'react'; import { type ElementProps } from '../../types'; import { cn } from '../../utils/cn'; import { Dialog, DialogClose, DialogContent, DialogFooter, DialogHeader, DialogTrigger, type DialogHeaderProps, type DialogOverlayProps, } from './dialog.styles'; const ModalTrigger = DialogTrigger; const ModalClose = DialogClose; export interface ModalHeaderProps extends DialogHeaderProps { align?: 'left' | 'center' | 'baseline'; icon?: React.ReactNode; title?: React.ReactNode; description?: React.ReactNode; } const ModalHeader = forwardRef, ModalHeaderProps>((props, ref) => { const { title, children, icon, description, align = 'left', ...etc } = props; return (
{icon ?
{icon}
: null}
{title}
{description}
{children}
); }); export interface ModalBodyProps extends DialogHeaderProps {} const ModalBody = forwardRef, ModalBodyProps>((props, ref) => { const { children, className, ...etc } = props; return (
{children}
); }); export interface ModalActionProps extends React.HTMLAttributes { separator?: boolean; } const ModalAction = forwardRef, ModalActionProps>(({ className, ...props }, ref) => ( )); export interface ModalProps extends ComponentPropsWithoutRef { trigger?: React.ReactNode; className?: string; fitContent?: boolean; fullScreen?: boolean; modalContentProps?: ElementProps; overlayProps?: DialogOverlayProps; scrollBehavior?: 'default' | 'inside' | 'outside'; placement?: 'default' | 'top' | 'bottom' | 'center' | 'top-center' | 'bottom-center'; } const ModalRoot = forwardRef, ModalProps>((props, ref) => { const { children, className, fitContent, scrollBehavior = 'inside', placement = 'default', fullScreen, modalContentProps, overlayProps, trigger, ...etc } = props; return ( {trigger} {children} ); }); ModalRoot.displayName = 'Modal'; export const Modal = Object.assign(ModalRoot, { Header: ModalHeader, Body: ModalBody, Action: ModalAction, Trigger: ModalTrigger, Close: ModalClose, });