@hi-ui/table 4.3.0 → 4.3.2-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/lib/cjs/BaseTable.js +136 -189
  3. package/lib/cjs/ColGroupContent.js +5 -28
  4. package/lib/cjs/SettingDrawer.js +76 -127
  5. package/lib/cjs/Table.js +107 -171
  6. package/lib/cjs/TableAdvancedFilter.js +49 -85
  7. package/lib/cjs/TableBody.js +42 -73
  8. package/lib/cjs/TableCell.js +56 -102
  9. package/lib/cjs/TableColumnMenu.js +39 -77
  10. package/lib/cjs/TableEmbedRow.js +11 -38
  11. package/lib/cjs/TableHeader.js +8 -33
  12. package/lib/cjs/TableRow.js +48 -88
  13. package/lib/cjs/TableSettingMenu.js +48 -94
  14. package/lib/cjs/TbodyContent.js +28 -56
  15. package/lib/cjs/TheadContent.js +20 -49
  16. package/lib/cjs/_virtual/index.js +0 -3
  17. package/lib/cjs/_virtual/index2.js +0 -3
  18. package/lib/cjs/_virtual/react-is.development.js +0 -3
  19. package/lib/cjs/_virtual/react-is.production.min.js +0 -3
  20. package/lib/cjs/context.js +0 -9
  21. package/lib/cjs/hooks/use-async-switch.js +13 -51
  22. package/lib/cjs/hooks/use-check.js +47 -77
  23. package/lib/cjs/hooks/use-col-hidden.js +16 -28
  24. package/lib/cjs/hooks/use-col-set.js +5 -18
  25. package/lib/cjs/hooks/use-col-sorter.js +18 -32
  26. package/lib/cjs/hooks/use-col-width.js +21 -57
  27. package/lib/cjs/hooks/use-colgroup.js +63 -85
  28. package/lib/cjs/hooks/use-drag.js +10 -31
  29. package/lib/cjs/hooks/use-embed-expand.js +23 -68
  30. package/lib/cjs/hooks/use-expand.js +32 -64
  31. package/lib/cjs/hooks/use-pagination.js +19 -50
  32. package/lib/cjs/hooks/use-queue.js +2 -14
  33. package/lib/cjs/icons/index.js +4 -21
  34. package/lib/cjs/index.js +0 -4
  35. package/lib/cjs/node_modules/classnames/index.js +2 -11
  36. package/lib/cjs/node_modules/perfect-scrollbar/dist/perfect-scrollbar.esm.js +1090 -0
  37. package/lib/cjs/node_modules/rc-resize-observer/es/index.js +10 -68
  38. package/lib/cjs/node_modules/rc-resize-observer/node_modules/rc-util/es/Children/toArray.js +1 -17
  39. package/lib/cjs/node_modules/rc-resize-observer/node_modules/rc-util/es/Dom/findDOMNode.js +1 -14
  40. package/lib/cjs/node_modules/rc-resize-observer/node_modules/rc-util/es/ref.js +1 -25
  41. package/lib/cjs/node_modules/rc-resize-observer/node_modules/rc-util/es/warning.js +1 -5
  42. package/lib/cjs/node_modules/rc-util/es/Dom/canUseDom.js +0 -2
  43. package/lib/cjs/node_modules/rc-util/es/Dom/findDOMNode.js +1 -14
  44. package/lib/cjs/node_modules/rc-util/es/hooks/useLayoutEffect.js +2 -9
  45. package/lib/cjs/node_modules/rc-util/es/raf.js +0 -11
  46. package/lib/cjs/node_modules/rc-virtual-list/es/Filler.js +6 -25
  47. package/lib/cjs/node_modules/rc-virtual-list/es/Item.js +3 -14
  48. package/lib/cjs/node_modules/rc-virtual-list/es/List.js +103 -194
  49. package/lib/cjs/node_modules/rc-virtual-list/es/ScrollBar.js +16 -96
  50. package/lib/cjs/node_modules/rc-virtual-list/es/hooks/useChildren.js +2 -11
  51. package/lib/cjs/node_modules/rc-virtual-list/es/hooks/useDiffItem.js +8 -34
  52. package/lib/cjs/node_modules/rc-virtual-list/es/hooks/useFrameWheel.js +0 -10
  53. package/lib/cjs/node_modules/rc-virtual-list/es/hooks/useHeights.js +6 -39
  54. package/lib/cjs/node_modules/rc-virtual-list/es/hooks/useMobileTouchMove.js +0 -16
  55. package/lib/cjs/node_modules/rc-virtual-list/es/hooks/useOriginScroll.js +4 -9
  56. package/lib/cjs/node_modules/rc-virtual-list/es/hooks/useScrollTo.js +3 -28
  57. package/lib/cjs/node_modules/rc-virtual-list/es/index.js +0 -2
  58. package/lib/cjs/node_modules/rc-virtual-list/es/utils/CacheMap.js +2 -9
  59. package/lib/cjs/node_modules/rc-virtual-list/es/utils/algorithmUtil.js +0 -15
  60. package/lib/cjs/node_modules/rc-virtual-list/es/utils/isFirefox.js +0 -2
  61. package/lib/cjs/node_modules/react-is/cjs/react-is.development.js +3 -29
  62. package/lib/cjs/node_modules/react-is/cjs/react-is.production.min.js +19 -45
  63. package/lib/cjs/node_modules/react-is/index.js +0 -5
  64. package/lib/cjs/node_modules/resize-observer-polyfill/dist/ResizeObserver.es.js +83 -248
  65. package/lib/cjs/packages/hooks/use-merge-refs/lib/esm/index.js +65 -0
  66. package/lib/cjs/packages/ui/scrollbar/lib/esm/Scrollbar.js +147 -0
  67. package/lib/cjs/packages/ui/scrollbar/lib/esm/styles/index.scss.js +28 -0
  68. package/lib/cjs/packages/ui/scrollbar/lib/esm/utils/index.js +68 -0
  69. package/lib/cjs/styles/index.scss.js +1 -4
  70. package/lib/cjs/use-table.js +276 -361
  71. package/lib/cjs/utils/index.js +11 -45
  72. package/lib/esm/BaseTable.js +117 -138
  73. package/lib/esm/ColGroupContent.js +3 -9
  74. package/lib/esm/SettingDrawer.js +64 -83
  75. package/lib/esm/Table.js +97 -124
  76. package/lib/esm/TableAdvancedFilter.js +37 -47
  77. package/lib/esm/TableBody.js +37 -44
  78. package/lib/esm/TableCell.js +48 -72
  79. package/lib/esm/TableColumnMenu.js +24 -38
  80. package/lib/esm/TableEmbedRow.js +8 -15
  81. package/lib/esm/TableHeader.js +5 -11
  82. package/lib/esm/TableRow.js +36 -51
  83. package/lib/esm/TableSettingMenu.js +33 -49
  84. package/lib/esm/TbodyContent.js +20 -27
  85. package/lib/esm/TheadContent.js +14 -21
  86. package/lib/esm/context.js +0 -4
  87. package/lib/esm/hooks/use-async-switch.js +9 -28
  88. package/lib/esm/hooks/use-check.js +42 -55
  89. package/lib/esm/hooks/use-col-hidden.js +16 -21
  90. package/lib/esm/hooks/use-col-set.js +5 -13
  91. package/lib/esm/hooks/use-col-sorter.js +18 -23
  92. package/lib/esm/hooks/use-col-width.js +14 -34
  93. package/lib/esm/hooks/use-colgroup.js +60 -66
  94. package/lib/esm/hooks/use-drag.js +9 -13
  95. package/lib/esm/hooks/use-embed-expand.js +20 -42
  96. package/lib/esm/hooks/use-expand.js +32 -56
  97. package/lib/esm/hooks/use-pagination.js +13 -25
  98. package/lib/esm/hooks/use-queue.js +2 -10
  99. package/lib/esm/node_modules/classnames/index.js +2 -9
  100. package/lib/esm/node_modules/perfect-scrollbar/dist/perfect-scrollbar.esm.js +1084 -0
  101. package/lib/esm/node_modules/rc-resize-observer/es/index.js +3 -26
  102. package/lib/esm/node_modules/rc-resize-observer/node_modules/rc-util/es/Children/toArray.js +0 -3
  103. package/lib/esm/node_modules/rc-resize-observer/node_modules/rc-util/es/Dom/findDOMNode.js +1 -2
  104. package/lib/esm/node_modules/rc-resize-observer/node_modules/rc-util/es/ref.js +0 -8
  105. package/lib/esm/node_modules/rc-resize-observer/node_modules/rc-util/es/warning.js +0 -5
  106. package/lib/esm/node_modules/rc-util/es/Dom/canUseDom.js +0 -1
  107. package/lib/esm/node_modules/rc-util/es/Dom/findDOMNode.js +1 -2
  108. package/lib/esm/node_modules/rc-util/es/hooks/useLayoutEffect.js +1 -0
  109. package/lib/esm/node_modules/rc-util/es/raf.js +0 -10
  110. package/lib/esm/node_modules/rc-virtual-list/es/Filler.js +4 -15
  111. package/lib/esm/node_modules/rc-virtual-list/es/Item.js +1 -3
  112. package/lib/esm/node_modules/rc-virtual-list/es/List.js +101 -174
  113. package/lib/esm/node_modules/rc-virtual-list/es/ScrollBar.js +14 -86
  114. package/lib/esm/node_modules/rc-virtual-list/es/hooks/useChildren.js +0 -2
  115. package/lib/esm/node_modules/rc-virtual-list/es/hooks/useDiffItem.js +6 -25
  116. package/lib/esm/node_modules/rc-virtual-list/es/hooks/useFrameWheel.js +0 -6
  117. package/lib/esm/node_modules/rc-virtual-list/es/hooks/useHeights.js +4 -28
  118. package/lib/esm/node_modules/rc-virtual-list/es/hooks/useMobileTouchMove.js +0 -13
  119. package/lib/esm/node_modules/rc-virtual-list/es/hooks/useOriginScroll.js +4 -8
  120. package/lib/esm/node_modules/rc-virtual-list/es/hooks/useScrollTo.js +1 -19
  121. package/lib/esm/node_modules/rc-virtual-list/es/index.js +1 -1
  122. package/lib/esm/node_modules/rc-virtual-list/es/utils/CacheMap.js +2 -8
  123. package/lib/esm/node_modules/rc-virtual-list/es/utils/algorithmUtil.js +1 -12
  124. package/lib/esm/node_modules/rc-virtual-list/es/utils/isFirefox.js +0 -1
  125. package/lib/esm/node_modules/react-is/cjs/react-is.development.js +4 -27
  126. package/lib/esm/node_modules/react-is/cjs/react-is.production.min.js +20 -44
  127. package/lib/esm/node_modules/react-is/index.js +0 -1
  128. package/lib/esm/node_modules/resize-observer-polyfill/dist/ResizeObserver.es.js +82 -248
  129. package/lib/esm/packages/hooks/use-merge-refs/lib/esm/index.js +62 -0
  130. package/lib/esm/packages/ui/scrollbar/lib/esm/Scrollbar.js +145 -0
  131. package/lib/esm/packages/ui/scrollbar/lib/esm/styles/index.scss.js +23 -0
  132. package/lib/esm/packages/ui/scrollbar/lib/esm/utils/index.js +66 -0
  133. package/lib/esm/styles/index.scss.js +1 -3
  134. package/lib/esm/use-table.js +268 -323
  135. package/lib/esm/utils/index.js +11 -41
  136. package/lib/types/context.d.ts +2 -0
  137. package/lib/types/use-table.d.ts +8 -2
  138. package/package.json +5 -5
@@ -0,0 +1,1090 @@
1
+ /** @LICENSE
2
+ * @hi-ui/table
3
+ * https://github.com/XiaoMi/hiui/tree/master/packages/ui/table#readme
4
+ *
5
+ * Copyright (c) HiUI <mi-hiui@xiaomi.com>.
6
+ *
7
+ * This source code is licensed under the MIT license found in the
8
+ * LICENSE file in the root directory of this source tree.
9
+ */
10
+ 'use strict';
11
+
12
+ Object.defineProperty(exports, '__esModule', {
13
+ value: true
14
+ });
15
+
16
+ /*!
17
+ * perfect-scrollbar v1.5.3
18
+ * Copyright 2021 Hyunje Jun, MDBootstrap and Contributors
19
+ * Licensed under MIT
20
+ */
21
+
22
+ function get(element) {
23
+ return getComputedStyle(element);
24
+ }
25
+ function set(element, obj) {
26
+ for (var key in obj) {
27
+ var val = obj[key];
28
+ if (typeof val === 'number') {
29
+ val = val + "px";
30
+ }
31
+ element.style[key] = val;
32
+ }
33
+ return element;
34
+ }
35
+ function div(className) {
36
+ var div = document.createElement('div');
37
+ div.className = className;
38
+ return div;
39
+ }
40
+ var elMatches = typeof Element !== 'undefined' && (Element.prototype.matches || Element.prototype.webkitMatchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector);
41
+ function matches(element, query) {
42
+ if (!elMatches) {
43
+ throw new Error('No element matching method supported');
44
+ }
45
+ return elMatches.call(element, query);
46
+ }
47
+ function remove(element) {
48
+ if (element.remove) {
49
+ element.remove();
50
+ } else {
51
+ if (element.parentNode) {
52
+ element.parentNode.removeChild(element);
53
+ }
54
+ }
55
+ }
56
+ function queryChildren(element, selector) {
57
+ return Array.prototype.filter.call(element.children, function (child) {
58
+ return matches(child, selector);
59
+ });
60
+ }
61
+ var cls = {
62
+ main: 'ps',
63
+ rtl: 'ps__rtl',
64
+ element: {
65
+ thumb: function thumb(x) {
66
+ return "ps__thumb-" + x;
67
+ },
68
+ rail: function rail(x) {
69
+ return "ps__rail-" + x;
70
+ },
71
+ consuming: 'ps__child--consume'
72
+ },
73
+ state: {
74
+ focus: 'ps--focus',
75
+ clicking: 'ps--clicking',
76
+ active: function active(x) {
77
+ return "ps--active-" + x;
78
+ },
79
+ scrolling: function scrolling(x) {
80
+ return "ps--scrolling-" + x;
81
+ }
82
+ }
83
+ };
84
+
85
+ /*
86
+ * Helper methods
87
+ */
88
+ var scrollingClassTimeout = {
89
+ x: null,
90
+ y: null
91
+ };
92
+ function addScrollingClass(i, x) {
93
+ var classList = i.element.classList;
94
+ var className = cls.state.scrolling(x);
95
+ if (classList.contains(className)) {
96
+ clearTimeout(scrollingClassTimeout[x]);
97
+ } else {
98
+ classList.add(className);
99
+ }
100
+ }
101
+ function removeScrollingClass(i, x) {
102
+ scrollingClassTimeout[x] = setTimeout(function () {
103
+ return i.isAlive && i.element.classList.remove(cls.state.scrolling(x));
104
+ }, i.settings.scrollingThreshold);
105
+ }
106
+ function setScrollingClassInstantly(i, x) {
107
+ addScrollingClass(i, x);
108
+ removeScrollingClass(i, x);
109
+ }
110
+ var EventElement = function EventElement(element) {
111
+ this.element = element;
112
+ this.handlers = {};
113
+ };
114
+ var prototypeAccessors = {
115
+ isEmpty: {
116
+ configurable: true
117
+ }
118
+ };
119
+ EventElement.prototype.bind = function bind(eventName, handler) {
120
+ if (typeof this.handlers[eventName] === 'undefined') {
121
+ this.handlers[eventName] = [];
122
+ }
123
+ this.handlers[eventName].push(handler);
124
+ this.element.addEventListener(eventName, handler, false);
125
+ };
126
+ EventElement.prototype.unbind = function unbind(eventName, target) {
127
+ var this$1$1 = this;
128
+ this.handlers[eventName] = this.handlers[eventName].filter(function (handler) {
129
+ if (target && handler !== target) {
130
+ return true;
131
+ }
132
+ this$1$1.element.removeEventListener(eventName, handler, false);
133
+ return false;
134
+ });
135
+ };
136
+ EventElement.prototype.unbindAll = function unbindAll() {
137
+ for (var name in this.handlers) {
138
+ this.unbind(name);
139
+ }
140
+ };
141
+ prototypeAccessors.isEmpty.get = function () {
142
+ var this$1$1 = this;
143
+ return Object.keys(this.handlers).every(function (key) {
144
+ return this$1$1.handlers[key].length === 0;
145
+ });
146
+ };
147
+ Object.defineProperties(EventElement.prototype, prototypeAccessors);
148
+ var EventManager = function EventManager() {
149
+ this.eventElements = [];
150
+ };
151
+ EventManager.prototype.eventElement = function eventElement(element) {
152
+ var ee = this.eventElements.filter(function (ee) {
153
+ return ee.element === element;
154
+ })[0];
155
+ if (!ee) {
156
+ ee = new EventElement(element);
157
+ this.eventElements.push(ee);
158
+ }
159
+ return ee;
160
+ };
161
+ EventManager.prototype.bind = function bind(element, eventName, handler) {
162
+ this.eventElement(element).bind(eventName, handler);
163
+ };
164
+ EventManager.prototype.unbind = function unbind(element, eventName, handler) {
165
+ var ee = this.eventElement(element);
166
+ ee.unbind(eventName, handler);
167
+ if (ee.isEmpty) {
168
+ // remove
169
+ this.eventElements.splice(this.eventElements.indexOf(ee), 1);
170
+ }
171
+ };
172
+ EventManager.prototype.unbindAll = function unbindAll() {
173
+ this.eventElements.forEach(function (e) {
174
+ return e.unbindAll();
175
+ });
176
+ this.eventElements = [];
177
+ };
178
+ EventManager.prototype.once = function once(element, eventName, handler) {
179
+ var ee = this.eventElement(element);
180
+ var onceHandler = function onceHandler(evt) {
181
+ ee.unbind(eventName, onceHandler);
182
+ handler(evt);
183
+ };
184
+ ee.bind(eventName, onceHandler);
185
+ };
186
+ function createEvent(name) {
187
+ if (typeof window.CustomEvent === 'function') {
188
+ return new CustomEvent(name);
189
+ } else {
190
+ var evt = document.createEvent('CustomEvent');
191
+ evt.initCustomEvent(name, false, false, undefined);
192
+ return evt;
193
+ }
194
+ }
195
+ function processScrollDiff(i, axis, diff, useScrollingClass, forceFireReachEvent) {
196
+ if (useScrollingClass === void 0) useScrollingClass = true;
197
+ if (forceFireReachEvent === void 0) forceFireReachEvent = false;
198
+ var fields;
199
+ if (axis === 'top') {
200
+ fields = ['contentHeight', 'containerHeight', 'scrollTop', 'y', 'up', 'down'];
201
+ } else if (axis === 'left') {
202
+ fields = ['contentWidth', 'containerWidth', 'scrollLeft', 'x', 'left', 'right'];
203
+ } else {
204
+ throw new Error('A proper axis should be provided');
205
+ }
206
+ processScrollDiff$1(i, diff, fields, useScrollingClass, forceFireReachEvent);
207
+ }
208
+ function processScrollDiff$1(i, diff, ref, useScrollingClass, forceFireReachEvent) {
209
+ var contentHeight = ref[0];
210
+ var containerHeight = ref[1];
211
+ var scrollTop = ref[2];
212
+ var y = ref[3];
213
+ var up = ref[4];
214
+ var down = ref[5];
215
+ if (useScrollingClass === void 0) useScrollingClass = true;
216
+ if (forceFireReachEvent === void 0) forceFireReachEvent = false;
217
+ var element = i.element;
218
+
219
+ // reset reach
220
+ i.reach[y] = null;
221
+
222
+ // 1 for subpixel rounding
223
+ if (element[scrollTop] < 1) {
224
+ i.reach[y] = 'start';
225
+ }
226
+
227
+ // 1 for subpixel rounding
228
+ if (element[scrollTop] > i[contentHeight] - i[containerHeight] - 1) {
229
+ i.reach[y] = 'end';
230
+ }
231
+ if (diff) {
232
+ element.dispatchEvent(createEvent("ps-scroll-" + y));
233
+ if (diff < 0) {
234
+ element.dispatchEvent(createEvent("ps-scroll-" + up));
235
+ } else if (diff > 0) {
236
+ element.dispatchEvent(createEvent("ps-scroll-" + down));
237
+ }
238
+ if (useScrollingClass) {
239
+ setScrollingClassInstantly(i, y);
240
+ }
241
+ }
242
+ if (i.reach[y] && (diff || forceFireReachEvent)) {
243
+ element.dispatchEvent(createEvent("ps-" + y + "-reach-" + i.reach[y]));
244
+ }
245
+ }
246
+ function toInt(x) {
247
+ return parseInt(x, 10) || 0;
248
+ }
249
+ function isEditable(el) {
250
+ return matches(el, 'input,[contenteditable]') || matches(el, 'select,[contenteditable]') || matches(el, 'textarea,[contenteditable]') || matches(el, 'button,[contenteditable]');
251
+ }
252
+ function outerWidth(element) {
253
+ var styles = get(element);
254
+ return toInt(styles.width) + toInt(styles.paddingLeft) + toInt(styles.paddingRight) + toInt(styles.borderLeftWidth) + toInt(styles.borderRightWidth);
255
+ }
256
+ var env = {
257
+ isWebKit: typeof document !== 'undefined' && 'WebkitAppearance' in document.documentElement.style,
258
+ supportsTouch: typeof window !== 'undefined' && ('ontouchstart' in window || 'maxTouchPoints' in window.navigator && window.navigator.maxTouchPoints > 0 || window.DocumentTouch && document instanceof window.DocumentTouch),
259
+ supportsIePointer: typeof navigator !== 'undefined' && navigator.msMaxTouchPoints,
260
+ isChrome: typeof navigator !== 'undefined' && /Chrome/i.test(navigator && navigator.userAgent)
261
+ };
262
+ function updateGeometry(i) {
263
+ var element = i.element;
264
+ var roundedScrollTop = Math.floor(element.scrollTop);
265
+ var rect = element.getBoundingClientRect();
266
+ i.containerWidth = Math.round(rect.width);
267
+ i.containerHeight = Math.round(rect.height);
268
+ i.contentWidth = element.scrollWidth;
269
+ i.contentHeight = element.scrollHeight;
270
+ if (!element.contains(i.scrollbarXRail)) {
271
+ // clean up and append
272
+ queryChildren(element, cls.element.rail('x')).forEach(function (el) {
273
+ return remove(el);
274
+ });
275
+ element.appendChild(i.scrollbarXRail);
276
+ }
277
+ if (!element.contains(i.scrollbarYRail)) {
278
+ // clean up and append
279
+ queryChildren(element, cls.element.rail('y')).forEach(function (el) {
280
+ return remove(el);
281
+ });
282
+ element.appendChild(i.scrollbarYRail);
283
+ }
284
+ if (!i.settings.suppressScrollX && i.containerWidth + i.settings.scrollXMarginOffset < i.contentWidth) {
285
+ i.scrollbarXActive = true;
286
+ i.railXWidth = i.containerWidth - i.railXMarginWidth;
287
+ i.railXRatio = i.containerWidth / i.railXWidth;
288
+ i.scrollbarXWidth = getThumbSize(i, toInt(i.railXWidth * i.containerWidth / i.contentWidth));
289
+ i.scrollbarXLeft = toInt((i.negativeScrollAdjustment + element.scrollLeft) * (i.railXWidth - i.scrollbarXWidth) / (i.contentWidth - i.containerWidth));
290
+ } else {
291
+ i.scrollbarXActive = false;
292
+ }
293
+ if (!i.settings.suppressScrollY && i.containerHeight + i.settings.scrollYMarginOffset < i.contentHeight) {
294
+ i.scrollbarYActive = true;
295
+ i.railYHeight = i.containerHeight - i.railYMarginHeight;
296
+ i.railYRatio = i.containerHeight / i.railYHeight;
297
+ i.scrollbarYHeight = getThumbSize(i, toInt(i.railYHeight * i.containerHeight / i.contentHeight));
298
+ i.scrollbarYTop = toInt(roundedScrollTop * (i.railYHeight - i.scrollbarYHeight) / (i.contentHeight - i.containerHeight));
299
+ } else {
300
+ i.scrollbarYActive = false;
301
+ }
302
+ if (i.scrollbarXLeft >= i.railXWidth - i.scrollbarXWidth) {
303
+ i.scrollbarXLeft = i.railXWidth - i.scrollbarXWidth;
304
+ }
305
+ if (i.scrollbarYTop >= i.railYHeight - i.scrollbarYHeight) {
306
+ i.scrollbarYTop = i.railYHeight - i.scrollbarYHeight;
307
+ }
308
+ updateCss(element, i);
309
+ if (i.scrollbarXActive) {
310
+ element.classList.add(cls.state.active('x'));
311
+ } else {
312
+ element.classList.remove(cls.state.active('x'));
313
+ i.scrollbarXWidth = 0;
314
+ i.scrollbarXLeft = 0;
315
+ element.scrollLeft = i.isRtl === true ? i.contentWidth : 0;
316
+ }
317
+ if (i.scrollbarYActive) {
318
+ element.classList.add(cls.state.active('y'));
319
+ } else {
320
+ element.classList.remove(cls.state.active('y'));
321
+ i.scrollbarYHeight = 0;
322
+ i.scrollbarYTop = 0;
323
+ element.scrollTop = 0;
324
+ }
325
+ }
326
+ function getThumbSize(i, thumbSize) {
327
+ if (i.settings.minScrollbarLength) {
328
+ thumbSize = Math.max(thumbSize, i.settings.minScrollbarLength);
329
+ }
330
+ if (i.settings.maxScrollbarLength) {
331
+ thumbSize = Math.min(thumbSize, i.settings.maxScrollbarLength);
332
+ }
333
+ return thumbSize;
334
+ }
335
+ function updateCss(element, i) {
336
+ var xRailOffset = {
337
+ width: i.railXWidth
338
+ };
339
+ var roundedScrollTop = Math.floor(element.scrollTop);
340
+ if (i.isRtl) {
341
+ xRailOffset.left = i.negativeScrollAdjustment + element.scrollLeft + i.containerWidth - i.contentWidth;
342
+ } else {
343
+ xRailOffset.left = element.scrollLeft;
344
+ }
345
+ if (i.isScrollbarXUsingBottom) {
346
+ xRailOffset.bottom = i.scrollbarXBottom - roundedScrollTop;
347
+ } else {
348
+ xRailOffset.top = i.scrollbarXTop + roundedScrollTop;
349
+ }
350
+ set(i.scrollbarXRail, xRailOffset);
351
+ var yRailOffset = {
352
+ top: roundedScrollTop,
353
+ height: i.railYHeight
354
+ };
355
+ if (i.isScrollbarYUsingRight) {
356
+ if (i.isRtl) {
357
+ yRailOffset.right = i.contentWidth - (i.negativeScrollAdjustment + element.scrollLeft) - i.scrollbarYRight - i.scrollbarYOuterWidth - 9;
358
+ } else {
359
+ yRailOffset.right = i.scrollbarYRight - element.scrollLeft;
360
+ }
361
+ } else {
362
+ if (i.isRtl) {
363
+ yRailOffset.left = i.negativeScrollAdjustment + element.scrollLeft + i.containerWidth * 2 - i.contentWidth - i.scrollbarYLeft - i.scrollbarYOuterWidth;
364
+ } else {
365
+ yRailOffset.left = i.scrollbarYLeft + element.scrollLeft;
366
+ }
367
+ }
368
+ set(i.scrollbarYRail, yRailOffset);
369
+ set(i.scrollbarX, {
370
+ left: i.scrollbarXLeft,
371
+ width: i.scrollbarXWidth - i.railBorderXWidth
372
+ });
373
+ set(i.scrollbarY, {
374
+ top: i.scrollbarYTop,
375
+ height: i.scrollbarYHeight - i.railBorderYWidth
376
+ });
377
+ }
378
+ function clickRail(i) {
379
+ i.event.bind(i.scrollbarY, 'mousedown', function (e) {
380
+ return e.stopPropagation();
381
+ });
382
+ i.event.bind(i.scrollbarYRail, 'mousedown', function (e) {
383
+ var positionTop = e.pageY - window.pageYOffset - i.scrollbarYRail.getBoundingClientRect().top;
384
+ var direction = positionTop > i.scrollbarYTop ? 1 : -1;
385
+ i.element.scrollTop += direction * i.containerHeight;
386
+ updateGeometry(i);
387
+ e.stopPropagation();
388
+ });
389
+ i.event.bind(i.scrollbarX, 'mousedown', function (e) {
390
+ return e.stopPropagation();
391
+ });
392
+ i.event.bind(i.scrollbarXRail, 'mousedown', function (e) {
393
+ var positionLeft = e.pageX - window.pageXOffset - i.scrollbarXRail.getBoundingClientRect().left;
394
+ var direction = positionLeft > i.scrollbarXLeft ? 1 : -1;
395
+ i.element.scrollLeft += direction * i.containerWidth;
396
+ updateGeometry(i);
397
+ e.stopPropagation();
398
+ });
399
+ }
400
+ function dragThumb(i) {
401
+ bindMouseScrollHandler(i, ['containerWidth', 'contentWidth', 'pageX', 'railXWidth', 'scrollbarX', 'scrollbarXWidth', 'scrollLeft', 'x', 'scrollbarXRail']);
402
+ bindMouseScrollHandler(i, ['containerHeight', 'contentHeight', 'pageY', 'railYHeight', 'scrollbarY', 'scrollbarYHeight', 'scrollTop', 'y', 'scrollbarYRail']);
403
+ }
404
+ function bindMouseScrollHandler(i, ref) {
405
+ var containerHeight = ref[0];
406
+ var contentHeight = ref[1];
407
+ var pageY = ref[2];
408
+ var railYHeight = ref[3];
409
+ var scrollbarY = ref[4];
410
+ var scrollbarYHeight = ref[5];
411
+ var scrollTop = ref[6];
412
+ var y = ref[7];
413
+ var scrollbarYRail = ref[8];
414
+ var element = i.element;
415
+ var startingScrollTop = null;
416
+ var startingMousePageY = null;
417
+ var scrollBy = null;
418
+ function mouseMoveHandler(e) {
419
+ if (e.touches && e.touches[0]) {
420
+ e[pageY] = e.touches[0].pageY;
421
+ }
422
+ element[scrollTop] = startingScrollTop + scrollBy * (e[pageY] - startingMousePageY);
423
+ addScrollingClass(i, y);
424
+ updateGeometry(i);
425
+ e.stopPropagation();
426
+ if (e.type.startsWith('touch') && e.changedTouches.length > 1) {
427
+ e.preventDefault();
428
+ }
429
+ }
430
+ function mouseUpHandler() {
431
+ removeScrollingClass(i, y);
432
+ i[scrollbarYRail].classList.remove(cls.state.clicking);
433
+ i.event.unbind(i.ownerDocument, 'mousemove', mouseMoveHandler);
434
+ }
435
+ function bindMoves(e, touchMode) {
436
+ startingScrollTop = element[scrollTop];
437
+ if (touchMode && e.touches) {
438
+ e[pageY] = e.touches[0].pageY;
439
+ }
440
+ startingMousePageY = e[pageY];
441
+ scrollBy = (i[contentHeight] - i[containerHeight]) / (i[railYHeight] - i[scrollbarYHeight]);
442
+ if (!touchMode) {
443
+ i.event.bind(i.ownerDocument, 'mousemove', mouseMoveHandler);
444
+ i.event.once(i.ownerDocument, 'mouseup', mouseUpHandler);
445
+ e.preventDefault();
446
+ } else {
447
+ i.event.bind(i.ownerDocument, 'touchmove', mouseMoveHandler);
448
+ }
449
+ i[scrollbarYRail].classList.add(cls.state.clicking);
450
+ e.stopPropagation();
451
+ }
452
+ i.event.bind(i[scrollbarY], 'mousedown', function (e) {
453
+ bindMoves(e);
454
+ });
455
+ i.event.bind(i[scrollbarY], 'touchstart', function (e) {
456
+ bindMoves(e, true);
457
+ });
458
+ }
459
+ function keyboard(i) {
460
+ var element = i.element;
461
+ var elementHovered = function elementHovered() {
462
+ return matches(element, ':hover');
463
+ };
464
+ var scrollbarFocused = function scrollbarFocused() {
465
+ return matches(i.scrollbarX, ':focus') || matches(i.scrollbarY, ':focus');
466
+ };
467
+ function shouldPreventDefault(deltaX, deltaY) {
468
+ var scrollTop = Math.floor(element.scrollTop);
469
+ if (deltaX === 0) {
470
+ if (!i.scrollbarYActive) {
471
+ return false;
472
+ }
473
+ if (scrollTop === 0 && deltaY > 0 || scrollTop >= i.contentHeight - i.containerHeight && deltaY < 0) {
474
+ return !i.settings.wheelPropagation;
475
+ }
476
+ }
477
+ var scrollLeft = element.scrollLeft;
478
+ if (deltaY === 0) {
479
+ if (!i.scrollbarXActive) {
480
+ return false;
481
+ }
482
+ if (scrollLeft === 0 && deltaX < 0 || scrollLeft >= i.contentWidth - i.containerWidth && deltaX > 0) {
483
+ return !i.settings.wheelPropagation;
484
+ }
485
+ }
486
+ return true;
487
+ }
488
+ i.event.bind(i.ownerDocument, 'keydown', function (e) {
489
+ if (e.isDefaultPrevented && e.isDefaultPrevented() || e.defaultPrevented) {
490
+ return;
491
+ }
492
+ if (!elementHovered() && !scrollbarFocused()) {
493
+ return;
494
+ }
495
+ var activeElement = document.activeElement ? document.activeElement : i.ownerDocument.activeElement;
496
+ if (activeElement) {
497
+ if (activeElement.tagName === 'IFRAME') {
498
+ activeElement = activeElement.contentDocument.activeElement;
499
+ } else {
500
+ // go deeper if element is a webcomponent
501
+ while (activeElement.shadowRoot) {
502
+ activeElement = activeElement.shadowRoot.activeElement;
503
+ }
504
+ }
505
+ if (isEditable(activeElement)) {
506
+ return;
507
+ }
508
+ }
509
+ var deltaX = 0;
510
+ var deltaY = 0;
511
+ switch (e.which) {
512
+ case 37:
513
+ // left
514
+ if (e.metaKey) {
515
+ deltaX = -i.contentWidth;
516
+ } else if (e.altKey) {
517
+ deltaX = -i.containerWidth;
518
+ } else {
519
+ deltaX = -30;
520
+ }
521
+ break;
522
+ case 38:
523
+ // up
524
+ if (e.metaKey) {
525
+ deltaY = i.contentHeight;
526
+ } else if (e.altKey) {
527
+ deltaY = i.containerHeight;
528
+ } else {
529
+ deltaY = 30;
530
+ }
531
+ break;
532
+ case 39:
533
+ // right
534
+ if (e.metaKey) {
535
+ deltaX = i.contentWidth;
536
+ } else if (e.altKey) {
537
+ deltaX = i.containerWidth;
538
+ } else {
539
+ deltaX = 30;
540
+ }
541
+ break;
542
+ case 40:
543
+ // down
544
+ if (e.metaKey) {
545
+ deltaY = -i.contentHeight;
546
+ } else if (e.altKey) {
547
+ deltaY = -i.containerHeight;
548
+ } else {
549
+ deltaY = -30;
550
+ }
551
+ break;
552
+ case 32:
553
+ // space bar
554
+ if (e.shiftKey) {
555
+ deltaY = i.containerHeight;
556
+ } else {
557
+ deltaY = -i.containerHeight;
558
+ }
559
+ break;
560
+ case 33:
561
+ // page up
562
+ deltaY = i.containerHeight;
563
+ break;
564
+ case 34:
565
+ // page down
566
+ deltaY = -i.containerHeight;
567
+ break;
568
+ case 36:
569
+ // home
570
+ deltaY = i.contentHeight;
571
+ break;
572
+ case 35:
573
+ // end
574
+ deltaY = -i.contentHeight;
575
+ break;
576
+ default:
577
+ return;
578
+ }
579
+ if (i.settings.suppressScrollX && deltaX !== 0) {
580
+ return;
581
+ }
582
+ if (i.settings.suppressScrollY && deltaY !== 0) {
583
+ return;
584
+ }
585
+ element.scrollTop -= deltaY;
586
+ element.scrollLeft += deltaX;
587
+ updateGeometry(i);
588
+ if (shouldPreventDefault(deltaX, deltaY)) {
589
+ e.preventDefault();
590
+ }
591
+ });
592
+ }
593
+ function wheel(i) {
594
+ var element = i.element;
595
+ function shouldPreventDefault(deltaX, deltaY) {
596
+ var roundedScrollTop = Math.floor(element.scrollTop);
597
+ var isTop = element.scrollTop === 0;
598
+ var isBottom = roundedScrollTop + element.offsetHeight === element.scrollHeight;
599
+ var isLeft = element.scrollLeft === 0;
600
+ var isRight = element.scrollLeft + element.offsetWidth === element.scrollWidth;
601
+ var hitsBound;
602
+
603
+ // pick axis with primary direction
604
+ if (Math.abs(deltaY) > Math.abs(deltaX)) {
605
+ hitsBound = isTop || isBottom;
606
+ } else {
607
+ hitsBound = isLeft || isRight;
608
+ }
609
+ return hitsBound ? !i.settings.wheelPropagation : true;
610
+ }
611
+ function getDeltaFromEvent(e) {
612
+ var deltaX = e.deltaX;
613
+ var deltaY = -1 * e.deltaY;
614
+ if (typeof deltaX === 'undefined' || typeof deltaY === 'undefined') {
615
+ // OS X Safari
616
+ deltaX = -1 * e.wheelDeltaX / 6;
617
+ deltaY = e.wheelDeltaY / 6;
618
+ }
619
+ if (e.deltaMode && e.deltaMode === 1) {
620
+ // Firefox in deltaMode 1: Line scrolling
621
+ deltaX *= 10;
622
+ deltaY *= 10;
623
+ }
624
+ if (deltaX !== deltaX && deltaY !== deltaY /* NaN checks */) {
625
+ // IE in some mouse drivers
626
+ deltaX = 0;
627
+ deltaY = e.wheelDelta;
628
+ }
629
+ if (e.shiftKey) {
630
+ // reverse axis with shift key
631
+ return [-deltaY, -deltaX];
632
+ }
633
+ return [deltaX, deltaY];
634
+ }
635
+ function shouldBeConsumedByChild(target, deltaX, deltaY) {
636
+ // FIXME: this is a workaround for <select> issue in FF and IE #571
637
+ if (!env.isWebKit && element.querySelector('select:focus')) {
638
+ return true;
639
+ }
640
+ if (!element.contains(target)) {
641
+ return false;
642
+ }
643
+ var cursor = target;
644
+ while (cursor && cursor !== element) {
645
+ if (cursor.classList.contains(cls.element.consuming)) {
646
+ return true;
647
+ }
648
+ var style = get(cursor);
649
+
650
+ // if deltaY && vertical scrollable
651
+ if (deltaY && style.overflowY.match(/(scroll|auto)/)) {
652
+ var maxScrollTop = cursor.scrollHeight - cursor.clientHeight;
653
+ if (maxScrollTop > 0) {
654
+ if (cursor.scrollTop > 0 && deltaY < 0 || cursor.scrollTop < maxScrollTop && deltaY > 0) {
655
+ return true;
656
+ }
657
+ }
658
+ }
659
+ // if deltaX && horizontal scrollable
660
+ if (deltaX && style.overflowX.match(/(scroll|auto)/)) {
661
+ var maxScrollLeft = cursor.scrollWidth - cursor.clientWidth;
662
+ if (maxScrollLeft > 0) {
663
+ if (cursor.scrollLeft > 0 && deltaX < 0 || cursor.scrollLeft < maxScrollLeft && deltaX > 0) {
664
+ return true;
665
+ }
666
+ }
667
+ }
668
+ cursor = cursor.parentNode;
669
+ }
670
+ return false;
671
+ }
672
+ function mousewheelHandler(e) {
673
+ var ref = getDeltaFromEvent(e);
674
+ var deltaX = ref[0];
675
+ var deltaY = ref[1];
676
+ if (shouldBeConsumedByChild(e.target, deltaX, deltaY)) {
677
+ return;
678
+ }
679
+ var shouldPrevent = false;
680
+ if (!i.settings.useBothWheelAxes) {
681
+ // deltaX will only be used for horizontal scrolling and deltaY will
682
+ // only be used for vertical scrolling - this is the default
683
+ element.scrollTop -= deltaY * i.settings.wheelSpeed;
684
+ element.scrollLeft += deltaX * i.settings.wheelSpeed;
685
+ } else if (i.scrollbarYActive && !i.scrollbarXActive) {
686
+ // only vertical scrollbar is active and useBothWheelAxes option is
687
+ // active, so let's scroll vertical bar using both mouse wheel axes
688
+ if (deltaY) {
689
+ element.scrollTop -= deltaY * i.settings.wheelSpeed;
690
+ } else {
691
+ element.scrollTop += deltaX * i.settings.wheelSpeed;
692
+ }
693
+ shouldPrevent = true;
694
+ } else if (i.scrollbarXActive && !i.scrollbarYActive) {
695
+ // useBothWheelAxes and only horizontal bar is active, so use both
696
+ // wheel axes for horizontal bar
697
+ if (deltaX) {
698
+ element.scrollLeft += deltaX * i.settings.wheelSpeed;
699
+ } else {
700
+ element.scrollLeft -= deltaY * i.settings.wheelSpeed;
701
+ }
702
+ shouldPrevent = true;
703
+ }
704
+ updateGeometry(i);
705
+ shouldPrevent = shouldPrevent || shouldPreventDefault(deltaX, deltaY);
706
+ if (shouldPrevent && !e.ctrlKey) {
707
+ e.stopPropagation();
708
+ e.preventDefault();
709
+ }
710
+ }
711
+ if (typeof window.onwheel !== 'undefined') {
712
+ i.event.bind(element, 'wheel', mousewheelHandler);
713
+ } else if (typeof window.onmousewheel !== 'undefined') {
714
+ i.event.bind(element, 'mousewheel', mousewheelHandler);
715
+ }
716
+ }
717
+ function touch(i) {
718
+ if (!env.supportsTouch && !env.supportsIePointer) {
719
+ return;
720
+ }
721
+ var element = i.element;
722
+ function shouldPrevent(deltaX, deltaY) {
723
+ var scrollTop = Math.floor(element.scrollTop);
724
+ var scrollLeft = element.scrollLeft;
725
+ var magnitudeX = Math.abs(deltaX);
726
+ var magnitudeY = Math.abs(deltaY);
727
+ if (magnitudeY > magnitudeX) {
728
+ // user is perhaps trying to swipe up/down the page
729
+
730
+ if (deltaY < 0 && scrollTop === i.contentHeight - i.containerHeight || deltaY > 0 && scrollTop === 0) {
731
+ // set prevent for mobile Chrome refresh
732
+ return window.scrollY === 0 && deltaY > 0 && env.isChrome;
733
+ }
734
+ } else if (magnitudeX > magnitudeY) {
735
+ // user is perhaps trying to swipe left/right across the page
736
+
737
+ if (deltaX < 0 && scrollLeft === i.contentWidth - i.containerWidth || deltaX > 0 && scrollLeft === 0) {
738
+ return true;
739
+ }
740
+ }
741
+ return true;
742
+ }
743
+ function applyTouchMove(differenceX, differenceY) {
744
+ element.scrollTop -= differenceY;
745
+ element.scrollLeft -= differenceX;
746
+ updateGeometry(i);
747
+ }
748
+ var startOffset = {};
749
+ var startTime = 0;
750
+ var speed = {};
751
+ var easingLoop = null;
752
+ function getTouch(e) {
753
+ if (e.targetTouches) {
754
+ return e.targetTouches[0];
755
+ } else {
756
+ // Maybe IE pointer
757
+ return e;
758
+ }
759
+ }
760
+ function shouldHandle(e) {
761
+ if (e.pointerType && e.pointerType === 'pen' && e.buttons === 0) {
762
+ return false;
763
+ }
764
+ if (e.targetTouches && e.targetTouches.length === 1) {
765
+ return true;
766
+ }
767
+ if (e.pointerType && e.pointerType !== 'mouse' && e.pointerType !== e.MSPOINTER_TYPE_MOUSE) {
768
+ return true;
769
+ }
770
+ return false;
771
+ }
772
+ function touchStart(e) {
773
+ if (!shouldHandle(e)) {
774
+ return;
775
+ }
776
+ var touch = getTouch(e);
777
+ startOffset.pageX = touch.pageX;
778
+ startOffset.pageY = touch.pageY;
779
+ startTime = new Date().getTime();
780
+ if (easingLoop !== null) {
781
+ clearInterval(easingLoop);
782
+ }
783
+ }
784
+ function shouldBeConsumedByChild(target, deltaX, deltaY) {
785
+ if (!element.contains(target)) {
786
+ return false;
787
+ }
788
+ var cursor = target;
789
+ while (cursor && cursor !== element) {
790
+ if (cursor.classList.contains(cls.element.consuming)) {
791
+ return true;
792
+ }
793
+ var style = get(cursor);
794
+
795
+ // if deltaY && vertical scrollable
796
+ if (deltaY && style.overflowY.match(/(scroll|auto)/)) {
797
+ var maxScrollTop = cursor.scrollHeight - cursor.clientHeight;
798
+ if (maxScrollTop > 0) {
799
+ if (cursor.scrollTop > 0 && deltaY < 0 || cursor.scrollTop < maxScrollTop && deltaY > 0) {
800
+ return true;
801
+ }
802
+ }
803
+ }
804
+ // if deltaX && horizontal scrollable
805
+ if (deltaX && style.overflowX.match(/(scroll|auto)/)) {
806
+ var maxScrollLeft = cursor.scrollWidth - cursor.clientWidth;
807
+ if (maxScrollLeft > 0) {
808
+ if (cursor.scrollLeft > 0 && deltaX < 0 || cursor.scrollLeft < maxScrollLeft && deltaX > 0) {
809
+ return true;
810
+ }
811
+ }
812
+ }
813
+ cursor = cursor.parentNode;
814
+ }
815
+ return false;
816
+ }
817
+ function touchMove(e) {
818
+ if (shouldHandle(e)) {
819
+ var touch = getTouch(e);
820
+ var currentOffset = {
821
+ pageX: touch.pageX,
822
+ pageY: touch.pageY
823
+ };
824
+ var differenceX = currentOffset.pageX - startOffset.pageX;
825
+ var differenceY = currentOffset.pageY - startOffset.pageY;
826
+ if (shouldBeConsumedByChild(e.target, differenceX, differenceY)) {
827
+ return;
828
+ }
829
+ applyTouchMove(differenceX, differenceY);
830
+ startOffset = currentOffset;
831
+ var currentTime = new Date().getTime();
832
+ var timeGap = currentTime - startTime;
833
+ if (timeGap > 0) {
834
+ speed.x = differenceX / timeGap;
835
+ speed.y = differenceY / timeGap;
836
+ startTime = currentTime;
837
+ }
838
+ if (shouldPrevent(differenceX, differenceY)) {
839
+ e.preventDefault();
840
+ }
841
+ }
842
+ }
843
+ function touchEnd() {
844
+ if (i.settings.swipeEasing) {
845
+ clearInterval(easingLoop);
846
+ easingLoop = setInterval(function () {
847
+ if (i.isInitialized) {
848
+ clearInterval(easingLoop);
849
+ return;
850
+ }
851
+ if (!speed.x && !speed.y) {
852
+ clearInterval(easingLoop);
853
+ return;
854
+ }
855
+ if (Math.abs(speed.x) < 0.01 && Math.abs(speed.y) < 0.01) {
856
+ clearInterval(easingLoop);
857
+ return;
858
+ }
859
+ if (!i.element) {
860
+ clearInterval(easingLoop);
861
+ return;
862
+ }
863
+ applyTouchMove(speed.x * 30, speed.y * 30);
864
+ speed.x *= 0.8;
865
+ speed.y *= 0.8;
866
+ }, 10);
867
+ }
868
+ }
869
+ if (env.supportsTouch) {
870
+ i.event.bind(element, 'touchstart', touchStart);
871
+ i.event.bind(element, 'touchmove', touchMove);
872
+ i.event.bind(element, 'touchend', touchEnd);
873
+ } else if (env.supportsIePointer) {
874
+ if (window.PointerEvent) {
875
+ i.event.bind(element, 'pointerdown', touchStart);
876
+ i.event.bind(element, 'pointermove', touchMove);
877
+ i.event.bind(element, 'pointerup', touchEnd);
878
+ } else if (window.MSPointerEvent) {
879
+ i.event.bind(element, 'MSPointerDown', touchStart);
880
+ i.event.bind(element, 'MSPointerMove', touchMove);
881
+ i.event.bind(element, 'MSPointerUp', touchEnd);
882
+ }
883
+ }
884
+ }
885
+ var defaultSettings = function defaultSettings() {
886
+ return {
887
+ handlers: ['click-rail', 'drag-thumb', 'keyboard', 'wheel', 'touch'],
888
+ maxScrollbarLength: null,
889
+ minScrollbarLength: null,
890
+ scrollingThreshold: 1000,
891
+ scrollXMarginOffset: 0,
892
+ scrollYMarginOffset: 0,
893
+ suppressScrollX: false,
894
+ suppressScrollY: false,
895
+ swipeEasing: true,
896
+ useBothWheelAxes: false,
897
+ wheelPropagation: true,
898
+ wheelSpeed: 1
899
+ };
900
+ };
901
+ var handlers = {
902
+ 'click-rail': clickRail,
903
+ 'drag-thumb': dragThumb,
904
+ keyboard: keyboard,
905
+ wheel: wheel,
906
+ touch: touch
907
+ };
908
+ var PerfectScrollbar = function PerfectScrollbar(element, userSettings) {
909
+ var this$1$1 = this;
910
+ if (userSettings === void 0) userSettings = {};
911
+ if (typeof element === 'string') {
912
+ element = document.querySelector(element);
913
+ }
914
+ if (!element || !element.nodeName) {
915
+ throw new Error('no element is specified to initialize PerfectScrollbar');
916
+ }
917
+ this.element = element;
918
+ element.classList.add(cls.main);
919
+ this.settings = defaultSettings();
920
+ for (var key in userSettings) {
921
+ this.settings[key] = userSettings[key];
922
+ }
923
+ this.containerWidth = null;
924
+ this.containerHeight = null;
925
+ this.contentWidth = null;
926
+ this.contentHeight = null;
927
+ var focus = function focus() {
928
+ return element.classList.add(cls.state.focus);
929
+ };
930
+ var blur = function blur() {
931
+ return element.classList.remove(cls.state.focus);
932
+ };
933
+ this.isRtl = get(element).direction === 'rtl';
934
+ if (this.isRtl === true) {
935
+ element.classList.add(cls.rtl);
936
+ }
937
+ this.isNegativeScroll = function () {
938
+ var originalScrollLeft = element.scrollLeft;
939
+ var result = null;
940
+ element.scrollLeft = -1;
941
+ result = element.scrollLeft < 0;
942
+ element.scrollLeft = originalScrollLeft;
943
+ return result;
944
+ }();
945
+ this.negativeScrollAdjustment = this.isNegativeScroll ? element.scrollWidth - element.clientWidth : 0;
946
+ this.event = new EventManager();
947
+ this.ownerDocument = element.ownerDocument || document;
948
+ this.scrollbarXRail = div(cls.element.rail('x'));
949
+ element.appendChild(this.scrollbarXRail);
950
+ this.scrollbarX = div(cls.element.thumb('x'));
951
+ this.scrollbarXRail.appendChild(this.scrollbarX);
952
+ this.scrollbarX.setAttribute('tabindex', 0);
953
+ this.event.bind(this.scrollbarX, 'focus', focus);
954
+ this.event.bind(this.scrollbarX, 'blur', blur);
955
+ this.scrollbarXActive = null;
956
+ this.scrollbarXWidth = null;
957
+ this.scrollbarXLeft = null;
958
+ var railXStyle = get(this.scrollbarXRail);
959
+ this.scrollbarXBottom = parseInt(railXStyle.bottom, 10);
960
+ if (isNaN(this.scrollbarXBottom)) {
961
+ this.isScrollbarXUsingBottom = false;
962
+ this.scrollbarXTop = toInt(railXStyle.top);
963
+ } else {
964
+ this.isScrollbarXUsingBottom = true;
965
+ }
966
+ this.railBorderXWidth = toInt(railXStyle.borderLeftWidth) + toInt(railXStyle.borderRightWidth);
967
+ // Set rail to display:block to calculate margins
968
+ set(this.scrollbarXRail, {
969
+ display: 'block'
970
+ });
971
+ this.railXMarginWidth = toInt(railXStyle.marginLeft) + toInt(railXStyle.marginRight);
972
+ set(this.scrollbarXRail, {
973
+ display: ''
974
+ });
975
+ this.railXWidth = null;
976
+ this.railXRatio = null;
977
+ this.scrollbarYRail = div(cls.element.rail('y'));
978
+ element.appendChild(this.scrollbarYRail);
979
+ this.scrollbarY = div(cls.element.thumb('y'));
980
+ this.scrollbarYRail.appendChild(this.scrollbarY);
981
+ this.scrollbarY.setAttribute('tabindex', 0);
982
+ this.event.bind(this.scrollbarY, 'focus', focus);
983
+ this.event.bind(this.scrollbarY, 'blur', blur);
984
+ this.scrollbarYActive = null;
985
+ this.scrollbarYHeight = null;
986
+ this.scrollbarYTop = null;
987
+ var railYStyle = get(this.scrollbarYRail);
988
+ this.scrollbarYRight = parseInt(railYStyle.right, 10);
989
+ if (isNaN(this.scrollbarYRight)) {
990
+ this.isScrollbarYUsingRight = false;
991
+ this.scrollbarYLeft = toInt(railYStyle.left);
992
+ } else {
993
+ this.isScrollbarYUsingRight = true;
994
+ }
995
+ this.scrollbarYOuterWidth = this.isRtl ? outerWidth(this.scrollbarY) : null;
996
+ this.railBorderYWidth = toInt(railYStyle.borderTopWidth) + toInt(railYStyle.borderBottomWidth);
997
+ set(this.scrollbarYRail, {
998
+ display: 'block'
999
+ });
1000
+ this.railYMarginHeight = toInt(railYStyle.marginTop) + toInt(railYStyle.marginBottom);
1001
+ set(this.scrollbarYRail, {
1002
+ display: ''
1003
+ });
1004
+ this.railYHeight = null;
1005
+ this.railYRatio = null;
1006
+ this.reach = {
1007
+ x: element.scrollLeft <= 0 ? 'start' : element.scrollLeft >= this.contentWidth - this.containerWidth ? 'end' : null,
1008
+ y: element.scrollTop <= 0 ? 'start' : element.scrollTop >= this.contentHeight - this.containerHeight ? 'end' : null
1009
+ };
1010
+ this.isAlive = true;
1011
+ this.settings.handlers.forEach(function (handlerName) {
1012
+ return handlers[handlerName](this$1$1);
1013
+ });
1014
+ this.lastScrollTop = Math.floor(element.scrollTop); // for onScroll only
1015
+ this.lastScrollLeft = element.scrollLeft; // for onScroll only
1016
+ this.event.bind(this.element, 'scroll', function (e) {
1017
+ return this$1$1.onScroll(e);
1018
+ });
1019
+ updateGeometry(this);
1020
+ };
1021
+ PerfectScrollbar.prototype.update = function update() {
1022
+ if (!this.isAlive) {
1023
+ return;
1024
+ }
1025
+
1026
+ // Recalcuate negative scrollLeft adjustment
1027
+ this.negativeScrollAdjustment = this.isNegativeScroll ? this.element.scrollWidth - this.element.clientWidth : 0;
1028
+
1029
+ // Recalculate rail margins
1030
+ set(this.scrollbarXRail, {
1031
+ display: 'block'
1032
+ });
1033
+ set(this.scrollbarYRail, {
1034
+ display: 'block'
1035
+ });
1036
+ this.railXMarginWidth = toInt(get(this.scrollbarXRail).marginLeft) + toInt(get(this.scrollbarXRail).marginRight);
1037
+ this.railYMarginHeight = toInt(get(this.scrollbarYRail).marginTop) + toInt(get(this.scrollbarYRail).marginBottom);
1038
+
1039
+ // Hide scrollbars not to affect scrollWidth and scrollHeight
1040
+ set(this.scrollbarXRail, {
1041
+ display: 'none'
1042
+ });
1043
+ set(this.scrollbarYRail, {
1044
+ display: 'none'
1045
+ });
1046
+ updateGeometry(this);
1047
+ processScrollDiff(this, 'top', 0, false, true);
1048
+ processScrollDiff(this, 'left', 0, false, true);
1049
+ set(this.scrollbarXRail, {
1050
+ display: ''
1051
+ });
1052
+ set(this.scrollbarYRail, {
1053
+ display: ''
1054
+ });
1055
+ };
1056
+ PerfectScrollbar.prototype.onScroll = function onScroll(e) {
1057
+ if (!this.isAlive) {
1058
+ return;
1059
+ }
1060
+ updateGeometry(this);
1061
+ processScrollDiff(this, 'top', this.element.scrollTop - this.lastScrollTop);
1062
+ processScrollDiff(this, 'left', this.element.scrollLeft - this.lastScrollLeft);
1063
+ this.lastScrollTop = Math.floor(this.element.scrollTop);
1064
+ this.lastScrollLeft = this.element.scrollLeft;
1065
+ };
1066
+ PerfectScrollbar.prototype.destroy = function destroy() {
1067
+ if (!this.isAlive) {
1068
+ return;
1069
+ }
1070
+ this.event.unbindAll();
1071
+ remove(this.scrollbarX);
1072
+ remove(this.scrollbarY);
1073
+ remove(this.scrollbarXRail);
1074
+ remove(this.scrollbarYRail);
1075
+ this.removePsClasses();
1076
+
1077
+ // unset elements
1078
+ this.element = null;
1079
+ this.scrollbarX = null;
1080
+ this.scrollbarY = null;
1081
+ this.scrollbarXRail = null;
1082
+ this.scrollbarYRail = null;
1083
+ this.isAlive = false;
1084
+ };
1085
+ PerfectScrollbar.prototype.removePsClasses = function removePsClasses() {
1086
+ this.element.className = this.element.className.split(' ').filter(function (name) {
1087
+ return !name.match(/^ps([-_].+|)$/);
1088
+ }).join(' ');
1089
+ };
1090
+ exports["default"] = PerfectScrollbar;