@mantine/core
Version:
React components library focused on usability, accessibility and developer experience
218 lines (217 loc) • 9.8 kB
JavaScript
"use client";
require("../../_virtual/_rolldown/runtime.cjs");
const require_rem = require("../../core/utils/units-converters/rem.cjs");
const require_create_vars_resolver = require("../../core/styles-api/create-vars-resolver/create-vars-resolver.cjs");
const require_use_props = require("../../core/MantineProvider/use-props/use-props.cjs");
const require_use_styles = require("../../core/styles-api/use-styles/use-styles.cjs");
const require_factory = require("../../core/factory/factory.cjs");
const require_Box = require("../../core/Box/Box.cjs");
const require_use_resize_observer = require("./use-resize-observer.cjs");
const require_ScrollAreaCorner = require("./ScrollAreaCorner/ScrollAreaCorner.cjs");
const require_ScrollAreaRoot = require("./ScrollAreaRoot/ScrollAreaRoot.cjs");
const require_ScrollAreaScrollbar = require("./ScrollAreaScrollbar/ScrollAreaScrollbar.cjs");
const require_ScrollAreaThumb = require("./ScrollAreaThumb/ScrollAreaThumb.cjs");
const require_ScrollAreaViewport = require("./ScrollAreaViewport/ScrollAreaViewport.cjs");
const require_ScrollArea_module = require("./ScrollArea.module.cjs");
let react = require("react");
let _mantine_hooks = require("@mantine/hooks");
let react_jsx_runtime = require("react/jsx-runtime");
let _floating_ui_react = require("@floating-ui/react");
//#region packages/@mantine/core/src/components/ScrollArea/ScrollArea.tsx
const defaultProps = {
scrollHideDelay: 1e3,
type: "hover",
scrollbars: "xy"
};
const varsResolver = require_create_vars_resolver.createVarsResolver((_, { scrollbarSize, overscrollBehavior, scrollbars }) => {
let overrideOverscrollBehavior = overscrollBehavior;
if (overscrollBehavior && scrollbars) {
if (scrollbars === "x") overrideOverscrollBehavior = `${overscrollBehavior} auto`;
else if (scrollbars === "y") overrideOverscrollBehavior = `auto ${overscrollBehavior}`;
}
return { root: {
"--scrollarea-scrollbar-size": require_rem.rem(scrollbarSize),
"--scrollarea-over-scroll-behavior": overrideOverscrollBehavior
} };
});
const ScrollArea = require_factory.factory((_props) => {
const props = require_use_props.useProps("ScrollArea", defaultProps, _props);
const { classNames, className, style, styles, unstyled, scrollbarSize, vars, type, scrollHideDelay, viewportProps, viewportRef, onScrollPositionChange, children, offsetScrollbars, scrollbars, onBottomReached, onTopReached, onLeftReached, onRightReached, overscrollBehavior, startScrollPosition, attributes, ...others } = props;
const [scrollbarHovered, setScrollbarHovered] = (0, react.useState)(false);
const [verticalThumbVisible, setVerticalThumbVisible] = (0, react.useState)(false);
const [horizontalThumbVisible, setHorizontalThumbVisible] = (0, react.useState)(false);
const prevAtTopRef = (0, react.useRef)(true);
const prevAtBottomRef = (0, react.useRef)(false);
const prevAtLeftRef = (0, react.useRef)(true);
const prevAtRightRef = (0, react.useRef)(false);
const getStyles = require_use_styles.useStyles({
name: "ScrollArea",
props,
classes: require_ScrollArea_module.default,
className,
style,
classNames,
styles,
unstyled,
attributes,
vars,
varsResolver
});
const localViewportRef = (0, react.useRef)(null);
const combinedViewportRef = (0, _floating_ui_react.useMergeRefs)([viewportRef, localViewportRef]);
(0, _mantine_hooks.useIsomorphicEffect)(() => {
if (startScrollPosition && localViewportRef.current) localViewportRef.current.scrollTo({
left: startScrollPosition.x ?? 0,
top: startScrollPosition.y ?? 0
});
}, []);
require_use_resize_observer.useResizeObserver(offsetScrollbars === "present" ? localViewportRef.current : null, () => {
const element = localViewportRef.current;
if (element) {
setVerticalThumbVisible(element.scrollHeight > element.clientHeight);
setHorizontalThumbVisible(element.scrollWidth > element.clientWidth);
}
});
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_ScrollAreaRoot.ScrollAreaRoot, {
getStyles,
type: type === "never" ? "always" : type,
scrollHideDelay,
scrollbars,
...getStyles("root"),
...others,
children: [
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_ScrollAreaViewport.ScrollAreaViewport, {
...viewportProps,
...getStyles("viewport", { style: viewportProps?.style }),
ref: combinedViewportRef,
"data-offset-scrollbars": offsetScrollbars === true ? "xy" : offsetScrollbars || void 0,
"data-scrollbars": scrollbars || void 0,
"data-horizontal-hidden": offsetScrollbars === "present" && !horizontalThumbVisible ? "true" : void 0,
"data-vertical-hidden": offsetScrollbars === "present" && !verticalThumbVisible ? "true" : void 0,
onScroll: (e) => {
viewportProps?.onScroll?.(e);
onScrollPositionChange?.({
x: e.currentTarget.scrollLeft,
y: e.currentTarget.scrollTop
});
const { scrollTop, scrollHeight, clientHeight, scrollLeft, scrollWidth, clientWidth } = e.currentTarget;
const isAtBottom = scrollTop - (scrollHeight - clientHeight) >= -.8;
const isAtTop = scrollTop === 0;
if (isAtBottom && !prevAtBottomRef.current) onBottomReached?.();
if (isAtTop && !prevAtTopRef.current) onTopReached?.();
prevAtBottomRef.current = isAtBottom;
prevAtTopRef.current = isAtTop;
const isAtRight = scrollLeft - (scrollWidth - clientWidth) >= -.8;
const isAtLeft = scrollLeft === 0;
if (isAtRight && !prevAtRightRef.current) onRightReached?.();
if (isAtLeft && !prevAtLeftRef.current) onLeftReached?.();
prevAtRightRef.current = isAtRight;
prevAtLeftRef.current = isAtLeft;
},
children
}),
(scrollbars === "xy" || scrollbars === "x") && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_ScrollAreaScrollbar.ScrollAreaScrollbar, {
...getStyles("scrollbar"),
orientation: "horizontal",
"data-hidden": type === "never" || offsetScrollbars === "present" && !horizontalThumbVisible ? true : void 0,
forceMount: true,
onMouseEnter: () => setScrollbarHovered(true),
onMouseLeave: () => setScrollbarHovered(false),
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_ScrollAreaThumb.ScrollAreaThumb, { ...getStyles("thumb") })
}),
(scrollbars === "xy" || scrollbars === "y") && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_ScrollAreaScrollbar.ScrollAreaScrollbar, {
...getStyles("scrollbar"),
orientation: "vertical",
"data-hidden": type === "never" || offsetScrollbars === "present" && !verticalThumbVisible ? true : void 0,
forceMount: true,
onMouseEnter: () => setScrollbarHovered(true),
onMouseLeave: () => setScrollbarHovered(false),
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_ScrollAreaThumb.ScrollAreaThumb, { ...getStyles("thumb") })
}),
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_ScrollAreaCorner.ScrollAreaCorner, {
...getStyles("corner"),
"data-hovered": scrollbarHovered || void 0,
"data-hidden": type === "never" || void 0
})
]
});
});
ScrollArea.displayName = "@mantine/core/ScrollArea";
const ScrollAreaAutosize = require_factory.factory((props) => {
const { children, classNames, styles, scrollbarSize, scrollHideDelay, type, dir, offsetScrollbars, overscrollBehavior, viewportRef, onScrollPositionChange, unstyled, variant, viewportProps, scrollbars, style, vars, onBottomReached, onTopReached, startScrollPosition, onOverflowChange, ...others } = require_use_props.useProps("ScrollAreaAutosize", defaultProps, props);
const viewportObserverRef = (0, react.useRef)(null);
const combinedViewportRef = (0, _floating_ui_react.useMergeRefs)([viewportRef, viewportObserverRef]);
const overflowingRef = (0, react.useRef)(false);
const didMountRef = (0, react.useRef)(false);
const handleOverflowCheck = (0, react.useEffectEvent)(() => {
const el = viewportObserverRef.current;
if (!el || !onOverflowChange) return;
const isOverflowing = el.scrollHeight > el.clientHeight;
if (isOverflowing !== overflowingRef.current) {
if (didMountRef.current) onOverflowChange(isOverflowing);
else {
didMountRef.current = true;
if (isOverflowing) onOverflowChange(true);
}
overflowingRef.current = isOverflowing;
}
});
require_use_resize_observer.useResizeObserver(onOverflowChange ? viewportObserverRef.current : null, handleOverflowCheck);
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Box.Box, {
...others,
variant,
style: [{
display: "flex",
overflow: "hidden"
}, style],
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Box.Box, {
style: {
display: "flex",
flexDirection: "column",
flex: 1,
overflow: "hidden",
...scrollbars === "y" && { minWidth: 0 },
...scrollbars === "x" && { minHeight: 0 },
...scrollbars === "xy" && {
minWidth: 0,
minHeight: 0
},
...scrollbars === false && {
minWidth: 0,
minHeight: 0
}
},
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ScrollArea, {
classNames,
styles,
scrollHideDelay,
scrollbarSize,
type,
dir,
offsetScrollbars,
overscrollBehavior,
viewportRef: combinedViewportRef,
onScrollPositionChange,
unstyled,
variant,
viewportProps,
vars,
scrollbars,
onBottomReached,
onTopReached,
startScrollPosition,
"data-autosize": "true",
children
})
})
});
});
ScrollArea.classes = require_ScrollArea_module.default;
ScrollArea.varsResolver = varsResolver;
ScrollAreaAutosize.displayName = "@mantine/core/ScrollAreaAutosize";
ScrollAreaAutosize.classes = require_ScrollArea_module.default;
ScrollArea.Autosize = ScrollAreaAutosize;
//#endregion
exports.ScrollArea = ScrollArea;
exports.ScrollAreaAutosize = ScrollAreaAutosize;
//# sourceMappingURL=ScrollArea.cjs.map