UNPKG

@grafana/ui

Version:
92 lines (87 loc) 2.98 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 }) } ), /* @__PURE__ */ jsxRuntime.jsxs("div", { className: styles.scrollContent, children: [ /* @__PURE__ */ jsxRuntime.jsx("div", { ref: scrollTopMarker }), children, /* @__PURE__ */ jsxRuntime.jsx("div", { ref: scrollBottomMarker }) ] }), /* @__PURE__ */ jsxRuntime.jsx( "div", { className: css.cx(styles.scrollIndicator, styles.scrollBottomIndicator, { [styles.scrollIndicatorVisible]: showScrollBottomIndicator }) } ) ] }); }; const getStyles = (theme) => { return { scrollContent: css.css({ flex: 1, position: "relative" }), scrollIndicator: css.css({ height: theme.spacing(6), 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, ${theme.colors.background.canvas})`, top: 0 }), scrollBottomIndicator: css.css({ background: `linear-gradient(180deg, transparent, ${theme.colors.background.canvas})`, bottom: 0 }), scrollIndicatorVisible: css.css({ opacity: 1 }) }; }; exports.ScrollIndicators = ScrollIndicators; //# sourceMappingURL=ScrollIndicators.cjs.map