@grafana/ui
Version:
Grafana Components Library
1 lines • 21.2 kB
Source Map (JSON)
{"version":3,"file":"Drawer.cjs","sources":["../../../../src/components/Drawer/Drawer.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { FloatingFocusManager, useFloating } from '@floating-ui/react';\nimport RcDrawer from '@rc-component/drawer';\nimport { type ReactNode, useCallback, useEffect, useId, useState } from 'react';\nimport * as React from 'react';\n\nimport { type GrafanaTheme2 } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { t } from '@grafana/i18n';\n\nimport { useStyles2 } from '../../themes/ThemeContext';\nimport { getDragStyles } from '../DragHandle/DragHandle';\nimport { IconButton } from '../IconButton/IconButton';\nimport { Stack } from '../Layout/Stack/Stack';\nimport { getPortalContainer } from '../Portal/Portal';\nimport { ScrollContainer } from '../ScrollContainer/ScrollContainer';\nimport { Text } from '../Text/Text';\n\nexport interface Props {\n children: ReactNode;\n /** Title shown at the top of the drawer */\n title?: ReactNode;\n /** Subtitle shown below the title */\n subtitle?: ReactNode;\n /** Should the Drawer be closable by clicking on the mask, defaults to true */\n closeOnMaskClick?: boolean;\n /** @deprecated */\n inline?: boolean;\n /**\n * @deprecated use the size property instead\n **/\n width?: number | string;\n /**\n * @deprecated use a large size instead if high width is needed\n **/\n expandable?: boolean;\n /**\n * Specifies the width and min-width.\n * sm = width 25vw & min-width 384px\n * md = width 50vw & min-width 568px\n * lg = width 75vw & min-width 744px\n **/\n size?: 'sm' | 'md' | 'lg';\n /** Tabs */\n tabs?: React.ReactNode;\n /**\n * Whether the content should be wrapped in a ScrollContainer\n * Only change this if you intend to manage scroll behaviour yourself\n * (e.g. having a split pane with independent scrolling)\n **/\n scrollableContent?: boolean;\n /** Callback for closing the drawer */\n onClose: () => void;\n}\n\nconst drawerSizes = {\n sm: { width: '25vw', minWidth: 384 },\n md: { width: '50vw', minWidth: 568 },\n lg: { width: '75vw', minWidth: 744 },\n};\n\n/**\n * Drawer is a slide in overlay that can be used to display additional information without hiding the main page content. It can be anchored to the left or right edge of the screen.\n *\n * https://developers.grafana.com/ui/latest/index.html?path=/docs/overlays-drawer--docs\n */\nexport function Drawer({\n children,\n onClose,\n closeOnMaskClick = true,\n scrollableContent = true,\n title,\n subtitle,\n width,\n size = 'md',\n tabs,\n}: Props) {\n const [drawerWidth, onMouseDown, onTouchStart] = useResizebleDrawer();\n\n const styles = useStyles2(getStyles);\n const wrapperStyles = useStyles2(getWrapperStyles, size);\n const dragStyles = useStyles2(getDragStyles);\n const titleId = useId();\n\n const { context, refs } = useFloating({\n open: true,\n onOpenChange: (open) => {\n if (!open) {\n onClose?.();\n }\n },\n });\n\n // Adds body class while open so the toolbar nav can hide some actions while drawer is open\n useBodyClassWhileOpen();\n\n const content = <div className={styles.content}>{children}</div>;\n const overrideWidth = drawerWidth ?? width ?? drawerSizes[size].width;\n const minWidth = drawerSizes[size].minWidth;\n\n return (\n <RcDrawer\n open={true}\n onClose={onClose}\n placement=\"right\"\n getContainer={'.main-view'}\n className={styles.drawerContent}\n rootClassName={styles.drawer}\n classNames={{\n wrapper: wrapperStyles,\n }}\n styles={{\n wrapper: {\n width: overrideWidth,\n minWidth,\n },\n }}\n aria-label={typeof title === 'string' ? selectors.components.Drawer.General.title(title) : undefined}\n aria-labelledby={title ? titleId : undefined}\n width={''}\n motion={{\n motionAppear: true,\n motionName: styles.drawerMotion,\n }}\n maskClassName={styles.mask}\n maskClosable={closeOnMaskClick}\n maskMotion={{\n motionAppear: true,\n motionName: styles.maskMotion,\n }}\n // this is handled by floating-ui\n autoFocus={false}\n >\n <FloatingFocusManager context={context} modal getInsideElements={() => [getPortalContainer()]}>\n <div className={styles.container} ref={refs.setFloating}>\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions */}\n <div\n className={cx(dragStyles.dragHandleVertical, styles.resizer)}\n onMouseDown={onMouseDown}\n onTouchStart={onTouchStart}\n />\n <div className={cx(styles.header, Boolean(tabs) && styles.headerWithTabs)}>\n <div className={styles.actions}>\n <IconButton\n name=\"times\"\n variant=\"secondary\"\n onClick={onClose}\n data-testid={selectors.components.Drawer.General.close}\n tooltip={t(`grafana-ui.drawer.close`, 'Close')}\n />\n </div>\n {typeof title === 'string' ? (\n <Stack direction=\"column\">\n <Text element=\"h3\" id={titleId} truncate>\n {title}\n </Text>\n {subtitle && (\n <div className={styles.subtitle} data-testid={selectors.components.Drawer.General.subtitle}>\n {subtitle}\n </div>\n )}\n </Stack>\n ) : (\n <div id={titleId}>{title}</div>\n )}\n {tabs && <div className={styles.tabsWrapper}>{tabs}</div>}\n </div>\n {!scrollableContent ? content : <ScrollContainer showScrollIndicators>{content}</ScrollContainer>}\n </div>\n </FloatingFocusManager>\n </RcDrawer>\n );\n}\n\nfunction useResizebleDrawer(): [\n string | undefined,\n React.EventHandler<React.MouseEvent>,\n React.EventHandler<React.TouchEvent>,\n] {\n const [drawerWidth, setDrawerWidth] = useState<string | undefined>(undefined);\n\n const onMouseMove = useCallback((e: MouseEvent) => {\n setDrawerWidth(getCustomDrawerWidth(e.clientX));\n }, []);\n\n const onTouchMove = useCallback((e: TouchEvent) => {\n const touch = e.touches[0];\n setDrawerWidth(getCustomDrawerWidth(touch.clientX));\n }, []);\n\n const onMouseUp = useCallback(\n (e: MouseEvent) => {\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n },\n [onMouseMove]\n );\n\n const onTouchEnd = useCallback(\n (e: TouchEvent) => {\n document.removeEventListener('touchmove', onTouchMove);\n document.removeEventListener('touchend', onTouchEnd);\n },\n [onTouchMove]\n );\n\n function onMouseDown(e: React.MouseEvent<HTMLDivElement>) {\n e.stopPropagation();\n e.preventDefault();\n // we will only add listeners when needed, and remove them afterward\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n }\n\n function onTouchStart(e: React.TouchEvent<HTMLDivElement>) {\n e.stopPropagation();\n e.preventDefault();\n // we will only add listeners when needed, and remove them afterward\n document.addEventListener('touchmove', onTouchMove);\n document.addEventListener('touchend', onTouchEnd);\n }\n\n return [drawerWidth, onMouseDown, onTouchStart];\n}\n\nfunction getCustomDrawerWidth(clientX: number) {\n let offsetRight = document.body.offsetWidth - (clientX - document.body.offsetLeft);\n let widthPercent = Math.min((offsetRight / document.body.clientWidth) * 100, 98).toFixed(2);\n return `${widthPercent}vw`;\n}\n\nfunction useBodyClassWhileOpen() {\n useEffect(() => {\n if (!document.body) {\n return;\n }\n\n document.body.classList.add('body-drawer-open');\n\n return () => {\n document.body.classList.remove('body-drawer-open');\n };\n }, []);\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n container: css({\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n flex: '1 1 0',\n minHeight: '100%',\n position: 'relative',\n }),\n drawer: css({\n inset: 0,\n position: 'fixed',\n zIndex: theme.zIndex.modalBackdrop,\n pointerEvents: 'none',\n\n '.rc-drawer-content-wrapper': {\n boxShadow: theme.shadows.z3,\n },\n }),\n drawerContent: css({\n backgroundColor: theme.colors.background.primary,\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n pointerEvents: 'auto',\n width: '100%',\n }),\n drawerMotion: css({\n '&-appear': {\n [theme.transitions.handleMotion('no-preference')]: {\n transform: 'translateX(100%)',\n transition: 'none',\n },\n [theme.transitions.handleMotion('reduce')]: {\n opacity: 0,\n },\n '&-active': {\n [theme.transitions.handleMotion('no-preference')]: {\n transform: 'translateX(0)',\n transition: theme.transitions.create('transform'),\n },\n [theme.transitions.handleMotion('reduce')]: {\n transition: `opacity 0.2s ease-in-out`,\n opacity: 1,\n },\n },\n },\n }),\n // we want the mask itself to span the whole page including the top bar\n // this ensures trying to click something in the top bar will close the drawer correctly\n // but we don't want the backdrop styling to apply over the top bar as it looks weird\n // instead have a child pseudo element to apply the backdrop styling below the top bar\n mask: css({\n inset: 0,\n pointerEvents: 'auto',\n position: 'fixed',\n zIndex: theme.zIndex.modalBackdrop,\n\n '&:before': {\n backgroundColor: theme.components.overlay.background,\n bottom: 0,\n content: '\"\"',\n left: 0,\n position: 'fixed',\n right: 0,\n top: 0,\n },\n }),\n maskMotion: css({\n '&-appear': {\n opacity: 0,\n\n '&-active': {\n opacity: 1,\n [theme.transitions.handleMotion('no-preference', 'reduce')]: {\n transition: theme.transitions.create('opacity'),\n },\n },\n },\n }),\n header: css({\n label: 'drawer-header',\n flexGrow: 0,\n padding: theme.spacing(2, 2, 3),\n borderBottom: `1px solid ${theme.colors.border.weak}`,\n }),\n headerWithTabs: css({\n borderBottom: 'none',\n }),\n actions: css({\n position: 'absolute',\n right: theme.spacing(1),\n top: theme.spacing(1),\n }),\n subtitle: css({\n label: 'drawer-subtitle',\n color: theme.colors.text.secondary,\n }),\n content: css({\n padding: theme.spacing(theme.components.drawer?.padding ?? 2),\n height: '100%',\n flexGrow: 1,\n minHeight: 0,\n }),\n tabsWrapper: css({\n label: 'drawer-tabs',\n paddingLeft: theme.spacing(2),\n margin: theme.spacing(1, -1, -3, -3),\n }),\n resizer: css({\n top: 0,\n left: theme.spacing(-1),\n bottom: 0,\n position: 'absolute',\n zIndex: theme.zIndex.modal,\n }),\n };\n};\n\nfunction getWrapperStyles(theme: GrafanaTheme2, size: 'sm' | 'md' | 'lg') {\n return css({\n bottom: 0,\n label: `drawer-content-wrapper-${size}`,\n position: 'absolute',\n right: 0,\n top: 0,\n zIndex: theme.zIndex.modalBackdrop,\n\n [theme.breakpoints.down('md')]: {\n width: `calc(100% - ${theme.spacing(2)}) !important`,\n minWidth: '0 !important',\n },\n });\n}\n"],"names":["useStyles2","getDragStyles","useId","useFloating","jsx","RcDrawer","selectors","FloatingFocusManager","getPortalContainer","cx","jsxs","IconButton","t","Stack","Text","ScrollContainer","useState","useCallback","useEffect","css"],"mappings":"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"}