UNPKG

@grafana/ui

Version:
110 lines (105 loc) 3.55 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var jsxRuntime = require('react/jsx-runtime'); var css = require('@emotion/css'); var React = require('react'); var ThemeContext = require('../../themes/ThemeContext.cjs'); "use strict"; const ScrollIndicators = ({ children }) => { const [showScrollTopIndicator, setShowTopScrollIndicator] = React.useState(false); const [showScrollBottomIndicator, setShowBottomScrollIndicator] = React.useState(false); const scrollTopMarker = React.useRef(null); const scrollBottomMarker = React.useRef(null); const styles = ThemeContext.useStyles2(getStyles); React.useEffect(() => { const intersectionObserver = new IntersectionObserver((entries) => { entries.forEach((entry) => { if (entry.target === scrollTopMarker.current) { setShowTopScrollIndicator(!entry.isIntersecting); } else if (entry.target === scrollBottomMarker.current) { setShowBottomScrollIndicator(!entry.isIntersecting); } }); }); [scrollTopMarker, scrollBottomMarker].forEach((ref) => { if (ref.current) { intersectionObserver.observe(ref.current); } }); return () => intersectionObserver.disconnect(); }, []); return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [ /* @__PURE__ */ jsxRuntime.jsx( "div", { className: css.cx(styles.scrollIndicator, styles.scrollTopIndicator, { [styles.scrollIndicatorVisible]: showScrollTopIndicator }), role: "presentation" } ), /* @__PURE__ */ jsxRuntime.jsxs("div", { className: styles.scrollContent, children: [ /* @__PURE__ */ jsxRuntime.jsx("div", { ref: scrollTopMarker, className: css.cx(styles.scrollMarker, styles.scrollTopMarker) }), children, /* @__PURE__ */ jsxRuntime.jsx("div", { ref: scrollBottomMarker, className: css.cx(styles.scrollMarker, styles.scrollBottomMarker) }) ] }), /* @__PURE__ */ jsxRuntime.jsx( "div", { className: css.cx(styles.scrollIndicator, styles.scrollBottomIndicator, { [styles.scrollIndicatorVisible]: showScrollBottomIndicator }), role: "presentation" } ) ] }); }; const getStyles = (theme) => { const scrollGradientColor = `rgba(0, 0, 0, ${theme.isDark ? 0.25 : 0.08})`; return { scrollContent: css.css({ display: "flex", flexDirection: "column", flexGrow: 1, position: "relative" }), scrollIndicator: css.css({ height: `max(5%, ${theme.spacing(3)})`, left: 0, opacity: 0, pointerEvents: "none", position: "absolute", right: 0, [theme.transitions.handleMotion("no-preference", "reduce")]: { transition: theme.transitions.create("opacity") }, zIndex: 1 }), scrollTopIndicator: css.css({ background: `linear-gradient(0deg, transparent, ${scrollGradientColor})`, top: 0 }), scrollBottomIndicator: css.css({ background: `linear-gradient(180deg, transparent, ${scrollGradientColor})`, bottom: 0 }), scrollIndicatorVisible: css.css({ opacity: 1 }), scrollMarker: css.css({ height: "1px", left: 0, pointerEvents: "none", position: "absolute", right: 0 }), scrollTopMarker: css.css({ top: 0 }), scrollBottomMarker: css.css({ bottom: 0 }) }; }; exports.ScrollIndicators = ScrollIndicators; //# sourceMappingURL=ScrollIndicators.cjs.map