@grafana/ui
Version:
Grafana Components Library
92 lines (87 loc) • 2.98 kB
JavaScript
;
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');
;
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