@grafana/ui
Version:
Grafana Components Library
1 lines • 5.03 kB
Source Map (JSON)
{"version":3,"file":"ModalBase.cjs","sources":["../../../../src/components/Modal/ModalBase.tsx"],"sourcesContent":["import { cx } from '@emotion/css';\nimport { FloatingFocusManager, useDismiss, useFloating, useInteractions, useRole } from '@floating-ui/react';\nimport { OverlayContainer } from '@react-aria/overlays';\nimport { type PropsWithChildren, useRef } from 'react';\n\nimport { useStyles2 } from '../../themes/ThemeContext';\nimport { getPortalContainer } from '../Portal/Portal';\n\nimport { getModalStyles } from './getModalStyles';\n\nexport interface ModalBaseProps {\n className?: string;\n closeOnEscape?: boolean;\n closeOnBackdropClick?: boolean;\n trapFocus?: boolean;\n isOpen?: boolean;\n onDismiss?: () => void;\n onClickBackdrop?: () => void;\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n}\n\nexport function ModalBase({\n children,\n className,\n isOpen = false,\n closeOnEscape = true,\n closeOnBackdropClick = false,\n trapFocus = true,\n onDismiss,\n onClickBackdrop,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n}: PropsWithChildren<ModalBaseProps>) {\n const styles = useStyles2(getModalStyles);\n\n const { context, refs } = useFloating({\n open: isOpen,\n onOpenChange: (open) => {\n if (!open) {\n onDismiss?.();\n }\n },\n });\n\n const backdropRef = useRef<HTMLDivElement>(null);\n\n const dismiss = useDismiss(context, {\n escapeKey: closeOnEscape,\n outsidePress: (event) => {\n // The portal container is \"inside\" the modal (see getInsideElements below), so presses\n // there must not dismiss it — except on the backdrop, which also renders there.\n const target = event.target instanceof Node ? event.target : null;\n const portalContainer = getPortalContainer();\n if (\n target &&\n portalContainer !== document.body &&\n portalContainer.contains(target) &&\n !backdropRef.current?.contains(target)\n ) {\n return false;\n }\n if (onClickBackdrop) {\n onClickBackdrop();\n return false;\n }\n return closeOnBackdropClick;\n },\n });\n\n const role = useRole(context, {\n role: 'dialog',\n });\n\n const { getFloatingProps } = useInteractions([dismiss, role]);\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <OverlayContainer>\n <div role=\"presentation\" ref={backdropRef} className={styles.modalBackdrop} />\n <FloatingFocusManager context={context} modal={trapFocus} getInsideElements={() => [getPortalContainer()]}>\n <div\n className={cx(styles.modal, className)}\n ref={refs.setFloating}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n {...getFloatingProps()}\n >\n {children}\n </div>\n </FloatingFocusManager>\n </OverlayContainer>\n );\n}\n"],"names":["useStyles2","getModalStyles","useFloating","useRef","useDismiss","getPortalContainer","useRole","useInteractions","OverlayContainer","jsx","FloatingFocusManager","cx"],"mappings":";;;;;;;;;;;;;;AAsBO,SAAS,SAAA,CAAU;AAAA,EACxB,QAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA,GAAS,KAAA;AAAA,EACT,aAAA,GAAgB,IAAA;AAAA,EAChB,oBAAA,GAAuB,KAAA;AAAA,EACvB,SAAA,GAAY,IAAA;AAAA,EACZ,SAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA,EAAc,SAAA;AAAA,EACd,iBAAA,EAAmB;AACrB,CAAA,EAAsC;AACpC,EAAA,MAAM,MAAA,GAASA,wBAAWC,6BAAc,CAAA;AAExC,EAAA,MAAM,EAAE,OAAA,EAAS,IAAA,EAAK,GAAIC,iBAAA,CAAY;AAAA,IACpC,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc,CAAC,IAAA,KAAS;AACtB,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,SAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,SAAA,EAAA;AAAA,MACF;AAAA,IACF;AAAA,GACD,CAAA;AAED,EAAA,MAAM,WAAA,GAAcC,aAAuB,IAAI,CAAA;AAE/C,EAAA,MAAM,OAAA,GAAUC,iBAAW,OAAA,EAAS;AAAA,IAClC,SAAA,EAAW,aAAA;AAAA,IACX,YAAA,EAAc,CAAC,KAAA,KAAU;AAjD7B,MAAA,IAAA,EAAA;AAoDM,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,YAAkB,IAAA,GAAO,MAAM,MAAA,GAAS,IAAA;AAC7D,MAAA,MAAM,kBAAkBC,yBAAA,EAAmB;AAC3C,MAAA,IACE,MAAA,IACA,eAAA,KAAoB,QAAA,CAAS,IAAA,IAC7B,eAAA,CAAgB,QAAA,CAAS,MAAM,CAAA,IAC/B,EAAA,CAAC,EAAA,GAAA,WAAA,CAAY,OAAA,KAAZ,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAqB,SAAS,MAAA,CAAA,CAAA,EAC/B;AACA,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,eAAA,EAAgB;AAChB,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,OAAO,oBAAA;AAAA,IACT;AAAA,GACD,CAAA;AAED,EAAA,MAAM,IAAA,GAAOC,cAAQ,OAAA,EAAS;AAAA,IAC5B,IAAA,EAAM;AAAA,GACP,CAAA;AAED,EAAA,MAAM,EAAE,gBAAA,EAAiB,GAAIC,sBAAgB,CAAC,OAAA,EAAS,IAAI,CAAC,CAAA;AAE5D,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uCACGC,yBAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAC,cAAA,CAAC,SAAI,IAAA,EAAK,cAAA,EAAe,KAAK,WAAA,EAAa,SAAA,EAAW,OAAO,aAAA,EAAe,CAAA;AAAA,oBAC5EA,cAAA,CAACC,0BAAA,EAAA,EAAqB,OAAA,EAAkB,KAAA,EAAO,SAAA,EAAW,mBAAmB,MAAM,CAACL,yBAAA,EAAoB,CAAA,EACtG,QAAA,kBAAAI,cAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWE,MAAA,CAAG,MAAA,CAAO,KAAA,EAAO,SAAS,CAAA;AAAA,QACrC,KAAK,IAAA,CAAK,WAAA;AAAA,QACV,YAAA,EAAY,SAAA;AAAA,QACZ,iBAAA,EAAiB,cAAA;AAAA,QAChB,GAAG,gBAAA,EAAiB;AAAA,QAEpB;AAAA;AAAA,KACH,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}