UNPKG

@grafana/ui

Version:
1 lines 6.64 kB
{"version":3,"file":"ScrollIndicators.mjs","sources":["../../../../src/components/ScrollContainer/ScrollIndicators.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { useEffect, useRef, useState } from 'react';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes/ThemeContext';\n\nexport const ScrollIndicators = ({ children }: React.PropsWithChildren<{}>) => {\n const [showScrollTopIndicator, setShowTopScrollIndicator] = useState(false);\n const [showScrollBottomIndicator, setShowBottomScrollIndicator] = useState(false);\n const scrollTopMarker = useRef<HTMLDivElement>(null);\n const scrollBottomMarker = useRef<HTMLDivElement>(null);\n const styles = useStyles2(getStyles);\n\n // Here we observe the top and bottom markers to determine if we should show the scroll indicators\n useEffect(() => {\n const intersectionObserver = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.target === scrollTopMarker.current) {\n setShowTopScrollIndicator(!entry.isIntersecting);\n } else if (entry.target === scrollBottomMarker.current) {\n setShowBottomScrollIndicator(!entry.isIntersecting);\n }\n });\n });\n [scrollTopMarker, scrollBottomMarker].forEach((ref) => {\n if (ref.current) {\n intersectionObserver.observe(ref.current);\n }\n });\n return () => intersectionObserver.disconnect();\n }, []);\n\n return (\n <>\n <div\n className={cx(styles.scrollIndicator, styles.scrollTopIndicator, {\n [styles.scrollIndicatorVisible]: showScrollTopIndicator,\n })}\n role=\"presentation\"\n />\n <div className={styles.scrollContent}>\n <div ref={scrollTopMarker} className={cx(styles.scrollMarker, styles.scrollTopMarker)} />\n {children}\n <div ref={scrollBottomMarker} className={cx(styles.scrollMarker, styles.scrollBottomMarker)} />\n </div>\n <div\n className={cx(styles.scrollIndicator, styles.scrollBottomIndicator, {\n [styles.scrollIndicatorVisible]: showScrollBottomIndicator,\n })}\n role=\"presentation\"\n />\n </>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n // we specifically don't want a theme color here\n // this gradient is more like a shadow\n const scrollGradientColor = `rgba(0, 0, 0, ${theme.isDark ? 0.25 : 0.08})`;\n return {\n scrollContent: css({\n display: 'flex',\n flexDirection: 'column',\n flexGrow: 1,\n position: 'relative',\n }),\n scrollIndicator: css({\n height: `max(5%, ${theme.spacing(3)})`,\n left: 0,\n opacity: 0,\n pointerEvents: 'none',\n position: 'absolute',\n right: 0,\n [theme.transitions.handleMotion('no-preference', 'reduce')]: {\n transition: theme.transitions.create('opacity'),\n },\n zIndex: 1,\n }),\n scrollTopIndicator: css({\n background: `linear-gradient(0deg, transparent, ${scrollGradientColor})`,\n top: 0,\n }),\n scrollBottomIndicator: css({\n background: `linear-gradient(180deg, transparent, ${scrollGradientColor})`,\n bottom: 0,\n }),\n scrollIndicatorVisible: css({\n opacity: 1,\n }),\n scrollMarker: css({\n height: '1px',\n left: 0,\n pointerEvents: 'none',\n position: 'absolute',\n right: 0,\n }),\n scrollTopMarker: css({\n top: 0,\n }),\n scrollBottomMarker: css({\n bottom: 0,\n }),\n };\n};\n"],"names":[],"mappings":"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"}