@grafana/ui
Version:
Grafana Components Library
110 lines (105 loc) • 3.55 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
}),
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