import { forwardRef } from 'react'; import { Container, ContainerRef } from '@cleartrip/ct-design-container'; import { makeStyles, useStyles } from '@cleartrip/ct-design-style-manager'; import { Cross, ModalBack } from '@cleartrip/ct-design-icons'; import Modal from '../Modal'; import { ModalVariant } from '../constants'; import { ModalWithCloseOverlayProps } from './type'; const staticStyles = makeStyles(() => ({ root: { position: 'relative', }, modalCard: { overflowY: 'visible', }, })); /** * Returns the close icon for the modal — a back arrow when `isBack` is true, * otherwise a cross whose stroke matches the modal variant. */ const getCloseIcon = (isBack = false, variant: `${ModalVariant}` = ModalVariant.NEUTRAL) => { if (isBack) { return ; } return variant === ModalVariant.DARK ? ( ) : ( ); }; /** * Modal variant that renders a floating close/back button above (or below) the * modal content. Useful for dialogs where the close affordance should sit * outside the content card. */ const ModalWithCloseOverlay = forwardRef((props, forwardedRef) => { const { isBack = false, isCenter, isTop = true, variant = ModalVariant.NEUTRAL, children, styleConfig, wrapperStyles, ...rest } = props || {}; const { onClose } = rest; const closeButtonStyles = useStyles( (theme) => ({ root: { position: 'absolute', right: (isCenter ? '50%' : isBack ? 'unset' : 0) as unknown as number, transform: isCenter ? 'translateX(50%)' : 'none', backgroundColor: variant === ModalVariant.DARK ? theme.color.background.defaultDarkest : theme.color.background.neutral, height: 32, width: 32, display: 'flex', alignItems: 'center', padding: theme.spacing[1], borderRadius: 40, cursor: 'pointer', ...(isTop ? { top: -42 } : { bottom: -42 }), }, }), [isBack, variant, isCenter, isTop], ); const CloseIcon = getCloseIcon(isBack, variant); return ( onClose?.()} > {CloseIcon} {children} ); }); ModalWithCloseOverlay.displayName = 'ModalWithCloseOverlay'; export default ModalWithCloseOverlay;