// // Copyright 2023 DXOS.org // import { createContext } from '@radix-ui/react-context'; import { type DialogProps as DialogRootPrimitiveProps, Root as DialogRootPrimitive, DialogTrigger as DialogTriggerPrimitive, type DialogTriggerProps as DialogTriggerPrimitiveProps, DialogPortal as DialogPortalPrimitive, type DialogPortalProps as DialogPortalPrimitiveProps, DialogOverlay as DialogOverlayPrimitive, type DialogOverlayProps as DialogOverlayPrimitiveProps, DialogTitle as DialogTitlePrimitive, type DialogTitleProps as DialogTitlePrimitiveProps, DialogDescription as DialogDescriptionPrimitive, type DialogDescriptionProps as DialogDescriptionPrimitiveProps, DialogClose as DialogClosePrimitive, type DialogCloseProps as DialogClosePrimitiveProps, DialogContent as DialogContentPrimitive, type DialogContentProps as DialogContentPrimitiveProps, } from '@radix-ui/react-dialog'; import React, { forwardRef, type ForwardRefExoticComponent, type FunctionComponent } from 'react'; import { useThemeContext } from '../../hooks'; import { type ThemedClassName } from '../../util'; import { ElevationProvider } from '../ElevationProvider'; type DialogRootProps = DialogRootPrimitiveProps; const DialogRoot: FunctionComponent = (props) => ( ); type DialogTriggerProps = DialogTriggerPrimitiveProps; const DialogTrigger: FunctionComponent = DialogTriggerPrimitive; type DialogPortalProps = DialogPortalPrimitiveProps; const DialogPortal: FunctionComponent = DialogPortalPrimitive; type DialogTitleProps = ThemedClassName & { srOnly?: boolean }; const DialogTitle: ForwardRefExoticComponent = forwardRef( ({ classNames, srOnly, ...props }, forwardedRef) => { const { tx } = useThemeContext(); return ( ); }, ); type DialogDescriptionProps = ThemedClassName & { srOnly?: boolean }; const DialogDescription: ForwardRefExoticComponent = forwardRef< HTMLParagraphElement, DialogDescriptionProps >(({ classNames, srOnly, ...props }, forwardedRef) => { const { tx } = useThemeContext(); return ( ); }); type DialogCloseProps = DialogClosePrimitiveProps; const DialogClose: FunctionComponent = DialogClosePrimitive; type OverlayLayoutContextValue = { inOverlayLayout?: boolean }; const DIALOG_OVERLAY_NAME = 'DialogOverlay'; const DIALOG_CONTENT_NAME = 'DialogContent'; const [OverlayLayoutProvider, useOverlayLayoutContext] = createContext( DIALOG_OVERLAY_NAME, {}, ); type DialogOverlayProps = ThemedClassName; const DialogOverlay: ForwardRefExoticComponent = forwardRef( ({ classNames, children, blockAlign, ...props }, forwardedRef) => { const { tx } = useThemeContext(); return ( {children} ); }, ); DialogOverlay.displayName = DIALOG_OVERLAY_NAME; type DialogContentProps = ThemedClassName & { inOverlayLayout?: boolean }; const DialogContent: ForwardRefExoticComponent = forwardRef( ({ classNames, children, inOverlayLayout: propsInOverlayLayout, ...props }, forwardedRef) => { const { tx } = useThemeContext(); const { inOverlayLayout } = useOverlayLayoutContext(DIALOG_CONTENT_NAME); return ( {children} ); }, ); DialogContent.displayName = DIALOG_CONTENT_NAME; export const Dialog = { Root: DialogRoot, Trigger: DialogTrigger, Portal: DialogPortal, Overlay: DialogOverlay, Content: DialogContent, Title: DialogTitle, Description: DialogDescription, Close: DialogClose, }; export type { DialogRootProps, DialogTriggerProps, DialogPortalProps, DialogOverlayProps, DialogContentProps, DialogTitleProps, DialogDescriptionProps, DialogCloseProps, };