List.js 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
  3. var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
  4. Object.defineProperty(exports, "__esModule", {
  5. value: true
  6. });
  7. exports.RawList = RawList;
  8. exports.default = void 0;
  9. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  10. var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
  11. var _objectSpread3 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  12. var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
  13. var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
  14. var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
  15. var _classnames = _interopRequireDefault(require("classnames"));
  16. var _rcResizeObserver = _interopRequireDefault(require("rc-resize-observer"));
  17. var _rcUtil = require("rc-util");
  18. var _useLayoutEffect = _interopRequireDefault(require("rc-util/lib/hooks/useLayoutEffect"));
  19. var _react = _interopRequireWildcard(require("react"));
  20. var React = _react;
  21. var _reactDom = require("react-dom");
  22. var _Filler = _interopRequireDefault(require("./Filler"));
  23. var _useChildren = _interopRequireDefault(require("./hooks/useChildren"));
  24. var _useDiffItem3 = _interopRequireDefault(require("./hooks/useDiffItem"));
  25. var _useFrameWheel3 = _interopRequireDefault(require("./hooks/useFrameWheel"));
  26. var _useGetSize = require("./hooks/useGetSize");
  27. var _useHeights3 = _interopRequireDefault(require("./hooks/useHeights"));
  28. var _useMobileTouchMove = _interopRequireDefault(require("./hooks/useMobileTouchMove"));
  29. var _useOriginScroll = _interopRequireDefault(require("./hooks/useOriginScroll"));
  30. var _useScrollDrag = _interopRequireDefault(require("./hooks/useScrollDrag"));
  31. var _useScrollTo = _interopRequireDefault(require("./hooks/useScrollTo"));
  32. var _ScrollBar = _interopRequireDefault(require("./ScrollBar"));
  33. var _scrollbarUtil = require("./utils/scrollbarUtil");
  34. var _excluded = ["prefixCls", "className", "height", "itemHeight", "fullHeight", "style", "data", "children", "itemKey", "virtual", "direction", "scrollWidth", "component", "onScroll", "onVirtualScroll", "onVisibleChange", "innerProps", "extraRender", "styles", "showScrollBar"];
  35. var EMPTY_DATA = [];
  36. var ScrollStyle = {
  37. overflowY: 'auto',
  38. overflowAnchor: 'none'
  39. };
  40. function RawList(props, ref) {
  41. var _props$prefixCls = props.prefixCls,
  42. prefixCls = _props$prefixCls === void 0 ? 'rc-virtual-list' : _props$prefixCls,
  43. className = props.className,
  44. height = props.height,
  45. itemHeight = props.itemHeight,
  46. _props$fullHeight = props.fullHeight,
  47. fullHeight = _props$fullHeight === void 0 ? true : _props$fullHeight,
  48. style = props.style,
  49. data = props.data,
  50. children = props.children,
  51. itemKey = props.itemKey,
  52. virtual = props.virtual,
  53. direction = props.direction,
  54. scrollWidth = props.scrollWidth,
  55. _props$component = props.component,
  56. Component = _props$component === void 0 ? 'div' : _props$component,
  57. onScroll = props.onScroll,
  58. onVirtualScroll = props.onVirtualScroll,
  59. onVisibleChange = props.onVisibleChange,
  60. innerProps = props.innerProps,
  61. extraRender = props.extraRender,
  62. styles = props.styles,
  63. _props$showScrollBar = props.showScrollBar,
  64. showScrollBar = _props$showScrollBar === void 0 ? 'optional' : _props$showScrollBar,
  65. restProps = (0, _objectWithoutProperties2.default)(props, _excluded);
  66. // =============================== Item Key ===============================
  67. var getKey = React.useCallback(function (item) {
  68. if (typeof itemKey === 'function') {
  69. return itemKey(item);
  70. }
  71. return item === null || item === void 0 ? void 0 : item[itemKey];
  72. }, [itemKey]);
  73. // ================================ Height ================================
  74. var _useHeights = (0, _useHeights3.default)(getKey, null, null),
  75. _useHeights2 = (0, _slicedToArray2.default)(_useHeights, 4),
  76. setInstanceRef = _useHeights2[0],
  77. collectHeight = _useHeights2[1],
  78. heights = _useHeights2[2],
  79. heightUpdatedMark = _useHeights2[3];
  80. // ================================= MISC =================================
  81. var useVirtual = !!(virtual !== false && height && itemHeight);
  82. var containerHeight = React.useMemo(function () {
  83. return Object.values(heights.maps).reduce(function (total, curr) {
  84. return total + curr;
  85. }, 0);
  86. }, [heights.id, heights.maps]);
  87. var inVirtual = useVirtual && data && (Math.max(itemHeight * data.length, containerHeight) > height || !!scrollWidth);
  88. var isRTL = direction === 'rtl';
  89. var mergedClassName = (0, _classnames.default)(prefixCls, (0, _defineProperty2.default)({}, "".concat(prefixCls, "-rtl"), isRTL), className);
  90. var mergedData = data || EMPTY_DATA;
  91. var componentRef = (0, _react.useRef)();
  92. var fillerInnerRef = (0, _react.useRef)();
  93. var containerRef = (0, _react.useRef)();
  94. // =============================== Item Key ===============================
  95. var _useState = (0, _react.useState)(0),
  96. _useState2 = (0, _slicedToArray2.default)(_useState, 2),
  97. offsetTop = _useState2[0],
  98. setOffsetTop = _useState2[1];
  99. var _useState3 = (0, _react.useState)(0),
  100. _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
  101. offsetLeft = _useState4[0],
  102. setOffsetLeft = _useState4[1];
  103. var _useState5 = (0, _react.useState)(false),
  104. _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
  105. scrollMoving = _useState6[0],
  106. setScrollMoving = _useState6[1];
  107. var onScrollbarStartMove = function onScrollbarStartMove() {
  108. setScrollMoving(true);
  109. };
  110. var onScrollbarStopMove = function onScrollbarStopMove() {
  111. setScrollMoving(false);
  112. };
  113. var sharedConfig = {
  114. getKey: getKey
  115. };
  116. // ================================ Scroll ================================
  117. function syncScrollTop(newTop) {
  118. setOffsetTop(function (origin) {
  119. var value;
  120. if (typeof newTop === 'function') {
  121. value = newTop(origin);
  122. } else {
  123. value = newTop;
  124. }
  125. var alignedTop = keepInRange(value);
  126. componentRef.current.scrollTop = alignedTop;
  127. return alignedTop;
  128. });
  129. }
  130. // ================================ Legacy ================================
  131. // Put ref here since the range is generate by follow
  132. var rangeRef = (0, _react.useRef)({
  133. start: 0,
  134. end: mergedData.length
  135. });
  136. var diffItemRef = (0, _react.useRef)();
  137. var _useDiffItem = (0, _useDiffItem3.default)(mergedData, getKey),
  138. _useDiffItem2 = (0, _slicedToArray2.default)(_useDiffItem, 1),
  139. diffItem = _useDiffItem2[0];
  140. diffItemRef.current = diffItem;
  141. // ========================== Visible Calculation =========================
  142. var _React$useMemo = React.useMemo(function () {
  143. if (!useVirtual) {
  144. return {
  145. scrollHeight: undefined,
  146. start: 0,
  147. end: mergedData.length - 1,
  148. offset: undefined
  149. };
  150. }
  151. // Always use virtual scroll bar in avoid shaking
  152. if (!inVirtual) {
  153. var _fillerInnerRef$curre;
  154. return {
  155. scrollHeight: ((_fillerInnerRef$curre = fillerInnerRef.current) === null || _fillerInnerRef$curre === void 0 ? void 0 : _fillerInnerRef$curre.offsetHeight) || 0,
  156. start: 0,
  157. end: mergedData.length - 1,
  158. offset: undefined
  159. };
  160. }
  161. var itemTop = 0;
  162. var startIndex;
  163. var startOffset;
  164. var endIndex;
  165. var dataLen = mergedData.length;
  166. for (var i = 0; i < dataLen; i += 1) {
  167. var _item = mergedData[i];
  168. var key = getKey(_item);
  169. var cacheHeight = heights.get(key);
  170. var currentItemBottom = itemTop + (cacheHeight === undefined ? itemHeight : cacheHeight);
  171. // Check item top in the range
  172. if (currentItemBottom >= offsetTop && startIndex === undefined) {
  173. startIndex = i;
  174. startOffset = itemTop;
  175. }
  176. // Check item bottom in the range. We will render additional one item for motion usage
  177. if (currentItemBottom > offsetTop + height && endIndex === undefined) {
  178. endIndex = i;
  179. }
  180. itemTop = currentItemBottom;
  181. }
  182. // When scrollTop at the end but data cut to small count will reach this
  183. if (startIndex === undefined) {
  184. startIndex = 0;
  185. startOffset = 0;
  186. endIndex = Math.ceil(height / itemHeight);
  187. }
  188. if (endIndex === undefined) {
  189. endIndex = mergedData.length - 1;
  190. }
  191. // Give cache to improve scroll experience
  192. endIndex = Math.min(endIndex + 1, mergedData.length - 1);
  193. return {
  194. scrollHeight: itemTop,
  195. start: startIndex,
  196. end: endIndex,
  197. offset: startOffset
  198. };
  199. }, [inVirtual, useVirtual, offsetTop, mergedData, heightUpdatedMark, height]),
  200. scrollHeight = _React$useMemo.scrollHeight,
  201. start = _React$useMemo.start,
  202. end = _React$useMemo.end,
  203. fillerOffset = _React$useMemo.offset;
  204. rangeRef.current.start = start;
  205. rangeRef.current.end = end;
  206. // When scroll up, first visible item get real height may not same as `itemHeight`,
  207. // Which will make scroll jump.
  208. // Let's sync scroll top to avoid jump
  209. React.useLayoutEffect(function () {
  210. var changedRecord = heights.getRecord();
  211. if (changedRecord.size === 1) {
  212. var recordKey = Array.from(changedRecord.keys())[0];
  213. var prevCacheHeight = changedRecord.get(recordKey);
  214. // Quick switch data may cause `start` not in `mergedData` anymore
  215. var startItem = mergedData[start];
  216. if (startItem && prevCacheHeight === undefined) {
  217. var startIndexKey = getKey(startItem);
  218. if (startIndexKey === recordKey) {
  219. var realStartHeight = heights.get(recordKey);
  220. var diffHeight = realStartHeight - itemHeight;
  221. syncScrollTop(function (ori) {
  222. return ori + diffHeight;
  223. });
  224. }
  225. }
  226. }
  227. heights.resetRecord();
  228. }, [scrollHeight]);
  229. // ================================= Size =================================
  230. var _React$useState = React.useState({
  231. width: 0,
  232. height: height
  233. }),
  234. _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2),
  235. size = _React$useState2[0],
  236. setSize = _React$useState2[1];
  237. var onHolderResize = function onHolderResize(sizeInfo) {
  238. setSize({
  239. width: sizeInfo.offsetWidth,
  240. height: sizeInfo.offsetHeight
  241. });
  242. };
  243. // Hack on scrollbar to enable flash call
  244. var verticalScrollBarRef = (0, _react.useRef)();
  245. var horizontalScrollBarRef = (0, _react.useRef)();
  246. var horizontalScrollBarSpinSize = React.useMemo(function () {
  247. return (0, _scrollbarUtil.getSpinSize)(size.width, scrollWidth);
  248. }, [size.width, scrollWidth]);
  249. var verticalScrollBarSpinSize = React.useMemo(function () {
  250. return (0, _scrollbarUtil.getSpinSize)(size.height, scrollHeight);
  251. }, [size.height, scrollHeight]);
  252. // =============================== In Range ===============================
  253. var maxScrollHeight = scrollHeight - height;
  254. var maxScrollHeightRef = (0, _react.useRef)(maxScrollHeight);
  255. maxScrollHeightRef.current = maxScrollHeight;
  256. function keepInRange(newScrollTop) {
  257. var newTop = newScrollTop;
  258. if (!Number.isNaN(maxScrollHeightRef.current)) {
  259. newTop = Math.min(newTop, maxScrollHeightRef.current);
  260. }
  261. newTop = Math.max(newTop, 0);
  262. return newTop;
  263. }
  264. var isScrollAtTop = offsetTop <= 0;
  265. var isScrollAtBottom = offsetTop >= maxScrollHeight;
  266. var isScrollAtLeft = offsetLeft <= 0;
  267. var isScrollAtRight = offsetLeft >= scrollWidth;
  268. var originScroll = (0, _useOriginScroll.default)(isScrollAtTop, isScrollAtBottom, isScrollAtLeft, isScrollAtRight);
  269. // ================================ Scroll ================================
  270. var getVirtualScrollInfo = function getVirtualScrollInfo() {
  271. return {
  272. x: isRTL ? -offsetLeft : offsetLeft,
  273. y: offsetTop
  274. };
  275. };
  276. var lastVirtualScrollInfoRef = (0, _react.useRef)(getVirtualScrollInfo());
  277. var triggerScroll = (0, _rcUtil.useEvent)(function (params) {
  278. if (onVirtualScroll) {
  279. var nextInfo = (0, _objectSpread3.default)((0, _objectSpread3.default)({}, getVirtualScrollInfo()), params);
  280. // Trigger when offset changed
  281. if (lastVirtualScrollInfoRef.current.x !== nextInfo.x || lastVirtualScrollInfoRef.current.y !== nextInfo.y) {
  282. onVirtualScroll(nextInfo);
  283. lastVirtualScrollInfoRef.current = nextInfo;
  284. }
  285. }
  286. });
  287. function onScrollBar(newScrollOffset, horizontal) {
  288. var newOffset = newScrollOffset;
  289. if (horizontal) {
  290. (0, _reactDom.flushSync)(function () {
  291. setOffsetLeft(newOffset);
  292. });
  293. triggerScroll();
  294. } else {
  295. syncScrollTop(newOffset);
  296. }
  297. }
  298. // When data size reduce. It may trigger native scroll event back to fit scroll position
  299. function onFallbackScroll(e) {
  300. var newScrollTop = e.currentTarget.scrollTop;
  301. if (newScrollTop !== offsetTop) {
  302. syncScrollTop(newScrollTop);
  303. }
  304. // Trigger origin onScroll
  305. onScroll === null || onScroll === void 0 || onScroll(e);
  306. triggerScroll();
  307. }
  308. var keepInHorizontalRange = function keepInHorizontalRange(nextOffsetLeft) {
  309. var tmpOffsetLeft = nextOffsetLeft;
  310. var max = !!scrollWidth ? scrollWidth - size.width : 0;
  311. tmpOffsetLeft = Math.max(tmpOffsetLeft, 0);
  312. tmpOffsetLeft = Math.min(tmpOffsetLeft, max);
  313. return tmpOffsetLeft;
  314. };
  315. var onWheelDelta = (0, _rcUtil.useEvent)(function (offsetXY, fromHorizontal) {
  316. if (fromHorizontal) {
  317. (0, _reactDom.flushSync)(function () {
  318. setOffsetLeft(function (left) {
  319. var nextOffsetLeft = left + (isRTL ? -offsetXY : offsetXY);
  320. return keepInHorizontalRange(nextOffsetLeft);
  321. });
  322. });
  323. triggerScroll();
  324. } else {
  325. syncScrollTop(function (top) {
  326. var newTop = top + offsetXY;
  327. return newTop;
  328. });
  329. }
  330. });
  331. // Since this added in global,should use ref to keep update
  332. var _useFrameWheel = (0, _useFrameWheel3.default)(useVirtual, isScrollAtTop, isScrollAtBottom, isScrollAtLeft, isScrollAtRight, !!scrollWidth, onWheelDelta),
  333. _useFrameWheel2 = (0, _slicedToArray2.default)(_useFrameWheel, 2),
  334. onRawWheel = _useFrameWheel2[0],
  335. onFireFoxScroll = _useFrameWheel2[1];
  336. // Mobile touch move
  337. (0, _useMobileTouchMove.default)(useVirtual, componentRef, function (isHorizontal, delta, smoothOffset, e) {
  338. var event = e;
  339. if (originScroll(isHorizontal, delta, smoothOffset)) {
  340. return false;
  341. }
  342. // Fix nest List trigger TouchMove event
  343. if (!event || !event._virtualHandled) {
  344. if (event) {
  345. event._virtualHandled = true;
  346. }
  347. onRawWheel({
  348. preventDefault: function preventDefault() {},
  349. deltaX: isHorizontal ? delta : 0,
  350. deltaY: isHorizontal ? 0 : delta
  351. });
  352. return true;
  353. }
  354. return false;
  355. });
  356. // MouseDown drag for scroll
  357. (0, _useScrollDrag.default)(inVirtual, componentRef, function (offset) {
  358. syncScrollTop(function (top) {
  359. return top + offset;
  360. });
  361. });
  362. (0, _useLayoutEffect.default)(function () {
  363. // Firefox only
  364. function onMozMousePixelScroll(e) {
  365. // scrolling at top/bottom limit
  366. var scrollingUpAtTop = isScrollAtTop && e.detail < 0;
  367. var scrollingDownAtBottom = isScrollAtBottom && e.detail > 0;
  368. if (useVirtual && !scrollingUpAtTop && !scrollingDownAtBottom) {
  369. e.preventDefault();
  370. }
  371. }
  372. var componentEle = componentRef.current;
  373. componentEle.addEventListener('wheel', onRawWheel, {
  374. passive: false
  375. });
  376. componentEle.addEventListener('DOMMouseScroll', onFireFoxScroll, {
  377. passive: true
  378. });
  379. componentEle.addEventListener('MozMousePixelScroll', onMozMousePixelScroll, {
  380. passive: false
  381. });
  382. return function () {
  383. componentEle.removeEventListener('wheel', onRawWheel);
  384. componentEle.removeEventListener('DOMMouseScroll', onFireFoxScroll);
  385. componentEle.removeEventListener('MozMousePixelScroll', onMozMousePixelScroll);
  386. };
  387. }, [useVirtual, isScrollAtTop, isScrollAtBottom]);
  388. // Sync scroll left
  389. (0, _useLayoutEffect.default)(function () {
  390. if (scrollWidth) {
  391. var newOffsetLeft = keepInHorizontalRange(offsetLeft);
  392. setOffsetLeft(newOffsetLeft);
  393. triggerScroll({
  394. x: newOffsetLeft
  395. });
  396. }
  397. }, [size.width, scrollWidth]);
  398. // ================================= Ref ==================================
  399. var delayHideScrollBar = function delayHideScrollBar() {
  400. var _verticalScrollBarRef, _horizontalScrollBarR;
  401. (_verticalScrollBarRef = verticalScrollBarRef.current) === null || _verticalScrollBarRef === void 0 || _verticalScrollBarRef.delayHidden();
  402. (_horizontalScrollBarR = horizontalScrollBarRef.current) === null || _horizontalScrollBarR === void 0 || _horizontalScrollBarR.delayHidden();
  403. };
  404. var _scrollTo = (0, _useScrollTo.default)(componentRef, mergedData, heights, itemHeight, getKey, function () {
  405. return collectHeight(true);
  406. }, syncScrollTop, delayHideScrollBar);
  407. React.useImperativeHandle(ref, function () {
  408. return {
  409. nativeElement: containerRef.current,
  410. getScrollInfo: getVirtualScrollInfo,
  411. scrollTo: function scrollTo(config) {
  412. function isPosScroll(arg) {
  413. return arg && (0, _typeof2.default)(arg) === 'object' && ('left' in arg || 'top' in arg);
  414. }
  415. if (isPosScroll(config)) {
  416. // Scroll X
  417. if (config.left !== undefined) {
  418. setOffsetLeft(keepInHorizontalRange(config.left));
  419. }
  420. // Scroll Y
  421. _scrollTo(config.top);
  422. } else {
  423. _scrollTo(config);
  424. }
  425. }
  426. };
  427. });
  428. // ================================ Effect ================================
  429. /** We need told outside that some list not rendered */
  430. (0, _useLayoutEffect.default)(function () {
  431. if (onVisibleChange) {
  432. var renderList = mergedData.slice(start, end + 1);
  433. onVisibleChange(renderList, mergedData);
  434. }
  435. }, [start, end, mergedData]);
  436. // ================================ Extra =================================
  437. var getSize = (0, _useGetSize.useGetSize)(mergedData, getKey, heights, itemHeight);
  438. var extraContent = extraRender === null || extraRender === void 0 ? void 0 : extraRender({
  439. start: start,
  440. end: end,
  441. virtual: inVirtual,
  442. offsetX: offsetLeft,
  443. offsetY: fillerOffset,
  444. rtl: isRTL,
  445. getSize: getSize
  446. });
  447. // ================================ Render ================================
  448. var listChildren = (0, _useChildren.default)(mergedData, start, end, scrollWidth, offsetLeft, setInstanceRef, children, sharedConfig);
  449. var componentStyle = null;
  450. if (height) {
  451. componentStyle = (0, _objectSpread3.default)((0, _defineProperty2.default)({}, fullHeight ? 'height' : 'maxHeight', height), ScrollStyle);
  452. if (useVirtual) {
  453. componentStyle.overflowY = 'hidden';
  454. if (scrollWidth) {
  455. componentStyle.overflowX = 'hidden';
  456. }
  457. if (scrollMoving) {
  458. componentStyle.pointerEvents = 'none';
  459. }
  460. }
  461. }
  462. var containerProps = {};
  463. if (isRTL) {
  464. containerProps.dir = 'rtl';
  465. }
  466. return /*#__PURE__*/React.createElement("div", (0, _extends2.default)({
  467. ref: containerRef,
  468. style: (0, _objectSpread3.default)((0, _objectSpread3.default)({}, style), {}, {
  469. position: 'relative'
  470. }),
  471. className: mergedClassName
  472. }, containerProps, restProps), /*#__PURE__*/React.createElement(_rcResizeObserver.default, {
  473. onResize: onHolderResize
  474. }, /*#__PURE__*/React.createElement(Component, {
  475. className: "".concat(prefixCls, "-holder"),
  476. style: componentStyle,
  477. ref: componentRef,
  478. onScroll: onFallbackScroll,
  479. onMouseEnter: delayHideScrollBar
  480. }, /*#__PURE__*/React.createElement(_Filler.default, {
  481. prefixCls: prefixCls,
  482. height: scrollHeight,
  483. offsetX: offsetLeft,
  484. offsetY: fillerOffset,
  485. scrollWidth: scrollWidth,
  486. onInnerResize: collectHeight,
  487. ref: fillerInnerRef,
  488. innerProps: innerProps,
  489. rtl: isRTL,
  490. extra: extraContent
  491. }, listChildren))), inVirtual && scrollHeight > height && /*#__PURE__*/React.createElement(_ScrollBar.default, {
  492. ref: verticalScrollBarRef,
  493. prefixCls: prefixCls,
  494. scrollOffset: offsetTop,
  495. scrollRange: scrollHeight,
  496. rtl: isRTL,
  497. onScroll: onScrollBar,
  498. onStartMove: onScrollbarStartMove,
  499. onStopMove: onScrollbarStopMove,
  500. spinSize: verticalScrollBarSpinSize,
  501. containerSize: size.height,
  502. style: styles === null || styles === void 0 ? void 0 : styles.verticalScrollBar,
  503. thumbStyle: styles === null || styles === void 0 ? void 0 : styles.verticalScrollBarThumb,
  504. showScrollBar: showScrollBar
  505. }), inVirtual && scrollWidth > size.width && /*#__PURE__*/React.createElement(_ScrollBar.default, {
  506. ref: horizontalScrollBarRef,
  507. prefixCls: prefixCls,
  508. scrollOffset: offsetLeft,
  509. scrollRange: scrollWidth,
  510. rtl: isRTL,
  511. onScroll: onScrollBar,
  512. onStartMove: onScrollbarStartMove,
  513. onStopMove: onScrollbarStopMove,
  514. spinSize: horizontalScrollBarSpinSize,
  515. containerSize: size.width,
  516. horizontal: true,
  517. style: styles === null || styles === void 0 ? void 0 : styles.horizontalScrollBar,
  518. thumbStyle: styles === null || styles === void 0 ? void 0 : styles.horizontalScrollBarThumb,
  519. showScrollBar: showScrollBar
  520. }));
  521. }
  522. var List = /*#__PURE__*/React.forwardRef(RawList);
  523. List.displayName = 'List';
  524. var _default = exports.default = List;