UNPKG

react-browser-scrollbar

Version:

lightweight Scrollbar for ReactJs

141 lines (116 loc) 5.12 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } var React = require('react'); var React__default = _interopDefault(React); function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } // export const uid = () => Math.random().toString(36).substring(2) var customizeStyle = function customizeStyle(_ref) { var id = _ref.id, thumbSize = _ref.thumbSize; var selector = "[data-rbs=" + id + "]"; var css = ''; if (thumbSize !== undefined) { if (thumbSize === 0) { css += "\n " + selector + "::-webkit-scrollbar{width: 0px; height: 0px}\n " + selector + "{scrollbar-width: none}\n "; } else { css += "\n " + selector + "::-webkit-scrollbar{width: " + thumbSize + "px; height: " + thumbSize + "px}\n " + selector + "{scrollbar-width: thin}\n "; } } return css; }; var loadStyle = (function () { var is = document.getElementById('rbs'); if (!is) { var style = document.createElement('style'); style.id = 'rbs'; document.head.append(style); style.innerHTML = "\n .rbs{\n width: 100%;\n height: 100%;\n overflow: auto;\n }\n \n ::-webkit-scrollbar {\n width: 6px;\n height: 6px;\n }\n\n ::-webkit-scrollbar-track {\n background: transparent\n }\n ::-webkit-scrollbar-thumb {\n border-radius: 8px;\n -webkit-border-radius: 8px;\n background-clip: content-box;\n background: rgba(11,20,26,.2);\n \n }\n ::-webkit-scrollbar-thumb:hover{\n background: rgba(11,20,26,.3)\n }\n .rbs-autohide:not(:hover, :active)::-webkit-scrollbar-thumb, .rbs-autohide:not(:hover, :active)::-webkit-scrollbar-track{\n background-color: transparent\n }\n\n * {\n scrollbar-color: rgba(11,20,26,.2) rgba(0,0,0,.05);\n scrollbar-width: thin\n }\n\n .rbs-autohide:not(:hover, :active){\n scrollbar-color: transparent transparent;\n }\n\n .rbs-dark::-webkit-scrollbar-thumb{\n background: rgba(255,255,255,.16);\n }\n\n .rbs-dark::-webkit-scrollbar-thumb:hover{\n background: rgba(255,255,255,.26);\n }\n\n .rbs-dark{\n scrollbar-color: rgba(255,255,255,.26) tranparent;\n }\n\n"; } }); var _excluded = ["children", "darkMode", "autoHide", "thumbSize", "onScroll", "onScrollEnd", "onScrollStop", "onScrollStart", "className"]; var isScrolling = null; var isStarted = false; var Scrollbar = /*#__PURE__*/React.forwardRef(function (_ref, ref) { var children = _ref.children, darkMode = _ref.darkMode, autoHide = _ref.autoHide, thumbSize = _ref.thumbSize, onScroll = _ref.onScroll, onScrollEnd = _ref.onScrollEnd, onScrollStop = _ref.onScrollStop, onScrollStart = _ref.onScrollStart, className = _ref.className, rest = _objectWithoutPropertiesLoose(_ref, _excluded); React.useEffect(function () { if (ref) { ref.scrollTo = function (pos) { ref.current.scrollTo({ top: pos, behavior: 'smooth' }); }; ref.scrollToBottom = function () { ref.scrollTo(ref.current.scrollHeight); }; ref.scrollToTop = function () { ref.scrollTo(0); }; } loadStyle(); }, []); var _uid = React.useId().replace(/:/gi, ''); var cls = "rbs " + (className ? className : ''); cls += darkMode ? ' rbs-dark' : ''; cls += autoHide ? ' rbs-autohide' : ''; var props = {}; if (onScroll || onScrollEnd || onScrollStop || onScrollStart) { props.onScroll = function (e) { if (onScrollEnd) { var ele = e.target; var scrollTop = ele.scrollTop; var scrollHeight = ele.scrollHeight; var clientHeight = ele.clientHeight; var isScrollDown = scrollHeight - scrollTop === clientHeight; isScrollDown && onScrollEnd(e); } if (onScrollStop) { clearTimeout(isScrolling); isScrolling = setTimeout(function () { return onScrollStop(e); }, 150); } if (onScrollStart && !isStarted) { onScrollStart(e); isStarted = true; setTimeout(function () { return isStarted = false; }, 500); } onScroll && onScroll(e); }; } return React__default.createElement(React__default.Fragment, null, React__default.createElement("style", null, customizeStyle({ id: _uid, thumbSize: thumbSize, autoHide: autoHide })), React__default.createElement("div", Object.assign({}, rest, { ref: ref, className: cls }, props, { "data-rbs": _uid }), children)); }); exports.default = Scrollbar; //# sourceMappingURL=react-browser-scrollbar.cjs.development.js.map