phcthemes_web_theme_pack 0.1.0 → 0.2.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 (22) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/common/bootstrap/bootstrap.three.js +2377 -0
  3. data/app/assets/javascripts/common/chartjs/chart.js +14680 -0
  4. data/app/assets/javascripts/common/fastclick/fastclick.js +841 -0
  5. data/app/assets/javascripts/common/jquery-jvectormap/jquery-jvectormap.js +44 -0
  6. data/app/assets/javascripts/common/jquery-slimscroll/jquery.slimscroll.js +474 -0
  7. data/app/assets/javascripts/common/jquery-sparkline/jquery.sparkline.js +3054 -0
  8. data/app/assets/javascripts/common/metismenu/metisMenu.js +340 -0
  9. data/app/assets/javascripts/common/perfect-scrollbar/perfect-scrollbar.common.js +1318 -0
  10. data/app/assets/javascripts/common/perfect-scrollbar/perfect-scrollbar.esm.js +1316 -0
  11. data/app/assets/javascripts/common/perfect-scrollbar/perfect-scrollbar.js +1324 -0
  12. data/app/assets/javascripts/common/toaster/toastr.js +476 -0
  13. data/app/assets/stylesheets/phcthemes_web_theme_pack_appstrap.scss +4 -10
  14. data/app/assets/stylesheets/phcthemes_web_theme_pack_basic.scss +6 -0
  15. data/app/assets/stylesheets/phcthemes_web_theme_pack_bold.scss +1 -1
  16. data/app/assets/stylesheets/phcthemes_web_theme_pack_coloradmin.scss +5 -11
  17. data/app/assets/stylesheets/phcthemes_web_theme_pack_devine_villas.scss +5 -10
  18. data/app/assets/stylesheets/phcthemes_web_theme_pack_smarty.scss +4 -18
  19. data/app/assets/stylesheets/phcthemes_web_theme_pack_xero.scss +4 -10
  20. data/app/assets/stylesheets/phcthemes_web_theme_pack_zoner.scss +4 -10
  21. data/lib/phcthemes_web_theme_pack/version.rb +1 -1
  22. metadata +14 -3
@@ -0,0 +1,340 @@
1
+ /*!
2
+ * metismenu https://github.com/onokumus/metismenu#readme
3
+ * A jQuery menu plugin
4
+ * @version 3.0.4
5
+ * @author Osman Nuri Okumus <onokumus@gmail.com> (https://github.com/onokumus)
6
+ * @license: MIT
7
+ */
8
+ (function (global, factory) {
9
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery')) :
10
+ typeof define === 'function' && define.amd ? define(['jquery'], factory) :
11
+ (global = global || self, global.metisMenu = factory(global.jQuery));
12
+ }(this, function ($) { 'use strict';
13
+
14
+ $ = $ && $.hasOwnProperty('default') ? $['default'] : $;
15
+
16
+ function _extends() {
17
+ _extends = Object.assign || function (target) {
18
+ for (var i = 1; i < arguments.length; i++) {
19
+ var source = arguments[i];
20
+
21
+ for (var key in source) {
22
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
23
+ target[key] = source[key];
24
+ }
25
+ }
26
+ }
27
+
28
+ return target;
29
+ };
30
+
31
+ return _extends.apply(this, arguments);
32
+ }
33
+
34
+ var Util = function ($) {
35
+ // eslint-disable-line no-shadow
36
+ var TRANSITION_END = 'transitionend';
37
+ var Util = {
38
+ // eslint-disable-line no-shadow
39
+ TRANSITION_END: 'mmTransitionEnd',
40
+ triggerTransitionEnd: function triggerTransitionEnd(element) {
41
+ $(element).trigger(TRANSITION_END);
42
+ },
43
+ supportsTransitionEnd: function supportsTransitionEnd() {
44
+ return Boolean(TRANSITION_END);
45
+ }
46
+ };
47
+
48
+ function getSpecialTransitionEndEvent() {
49
+ return {
50
+ bindType: TRANSITION_END,
51
+ delegateType: TRANSITION_END,
52
+ handle: function handle(event) {
53
+ if ($(event.target).is(this)) {
54
+ return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params
55
+ }
56
+
57
+ return undefined;
58
+ }
59
+ };
60
+ }
61
+
62
+ function transitionEndEmulator(duration) {
63
+ var _this = this;
64
+
65
+ var called = false;
66
+ $(this).one(Util.TRANSITION_END, function () {
67
+ called = true;
68
+ });
69
+ setTimeout(function () {
70
+ if (!called) {
71
+ Util.triggerTransitionEnd(_this);
72
+ }
73
+ }, duration);
74
+ return this;
75
+ }
76
+
77
+ function setTransitionEndSupport() {
78
+ $.fn.mmEmulateTransitionEnd = transitionEndEmulator; // eslint-disable-line no-param-reassign
79
+ // eslint-disable-next-line no-param-reassign
80
+
81
+ $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();
82
+ }
83
+
84
+ setTransitionEndSupport();
85
+ return Util;
86
+ }($);
87
+
88
+ var NAME = 'metisMenu';
89
+ var DATA_KEY = 'metisMenu';
90
+ var EVENT_KEY = "." + DATA_KEY;
91
+ var DATA_API_KEY = '.data-api';
92
+ var JQUERY_NO_CONFLICT = $.fn[NAME];
93
+ var TRANSITION_DURATION = 350;
94
+ var Default = {
95
+ toggle: true,
96
+ preventDefault: true,
97
+ triggerElement: 'a',
98
+ parentTrigger: 'li',
99
+ subMenu: 'ul'
100
+ };
101
+ var Event = {
102
+ SHOW: "show" + EVENT_KEY,
103
+ SHOWN: "shown" + EVENT_KEY,
104
+ HIDE: "hide" + EVENT_KEY,
105
+ HIDDEN: "hidden" + EVENT_KEY,
106
+ CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY
107
+ };
108
+ var ClassName = {
109
+ METIS: 'metismenu',
110
+ ACTIVE: 'mm-active',
111
+ SHOW: 'mm-show',
112
+ COLLAPSE: 'mm-collapse',
113
+ COLLAPSING: 'mm-collapsing',
114
+ COLLAPSED: 'mm-collapsed'
115
+ };
116
+
117
+ var MetisMenu =
118
+ /*#__PURE__*/
119
+ function () {
120
+ // eslint-disable-line no-shadow
121
+ function MetisMenu(element, config) {
122
+ this.element = element;
123
+ this.config = _extends({}, Default, config);
124
+ this.transitioning = null;
125
+ this.init();
126
+ }
127
+
128
+ var _proto = MetisMenu.prototype;
129
+
130
+ _proto.init = function init() {
131
+ var self = this;
132
+ var conf = this.config;
133
+ var el = $(this.element);
134
+ el.addClass(ClassName.METIS); // add metismenu class to element
135
+
136
+ el.find(conf.parentTrigger + "." + ClassName.ACTIVE).children(conf.triggerElement).attr('aria-expanded', 'true'); // add attribute aria-expanded=true the trigger element
137
+
138
+ el.find(conf.parentTrigger + "." + ClassName.ACTIVE).parents(conf.parentTrigger).addClass(ClassName.ACTIVE);
139
+ el.find(conf.parentTrigger + "." + ClassName.ACTIVE).parents(conf.parentTrigger).children(conf.triggerElement).attr('aria-expanded', 'true'); // add attribute aria-expanded=true the triggers of all parents
140
+
141
+ el.find(conf.parentTrigger + "." + ClassName.ACTIVE).has(conf.subMenu).children(conf.subMenu).addClass(ClassName.COLLAPSE + " " + ClassName.SHOW);
142
+ el.find(conf.parentTrigger).not("." + ClassName.ACTIVE).has(conf.subMenu).children(conf.subMenu).addClass(ClassName.COLLAPSE);
143
+ el.find(conf.parentTrigger) // .has(conf.subMenu)
144
+ .children(conf.triggerElement).on(Event.CLICK_DATA_API, function (e) {
145
+ // eslint-disable-line func-names
146
+ var eTar = $(this);
147
+
148
+ if (eTar.attr('aria-disabled') === 'true') {
149
+ return;
150
+ }
151
+
152
+ if (conf.preventDefault && eTar.attr('href') === '#') {
153
+ e.preventDefault();
154
+ }
155
+
156
+ var paRent = eTar.parent(conf.parentTrigger);
157
+ var sibLi = paRent.siblings(conf.parentTrigger);
158
+ var sibTrigger = sibLi.children(conf.triggerElement);
159
+
160
+ if (paRent.hasClass(ClassName.ACTIVE)) {
161
+ eTar.attr('aria-expanded', 'false');
162
+ self.removeActive(paRent);
163
+ } else {
164
+ eTar.attr('aria-expanded', 'true');
165
+ self.setActive(paRent);
166
+
167
+ if (conf.toggle) {
168
+ self.removeActive(sibLi);
169
+ sibTrigger.attr('aria-expanded', 'false');
170
+ }
171
+ }
172
+
173
+ if (conf.onTransitionStart) {
174
+ conf.onTransitionStart(e);
175
+ }
176
+ });
177
+ };
178
+
179
+ _proto.setActive = function setActive(li) {
180
+ $(li).addClass(ClassName.ACTIVE);
181
+ var ul = $(li).children(this.config.subMenu);
182
+
183
+ if (ul.length > 0 && !ul.hasClass(ClassName.SHOW)) {
184
+ this.show(ul);
185
+ }
186
+ };
187
+
188
+ _proto.removeActive = function removeActive(li) {
189
+ $(li).removeClass(ClassName.ACTIVE);
190
+ var ul = $(li).children(this.config.subMenu + "." + ClassName.SHOW);
191
+
192
+ if (ul.length > 0) {
193
+ this.hide(ul);
194
+ }
195
+ };
196
+
197
+ _proto.show = function show(element) {
198
+ var _this = this;
199
+
200
+ if (this.transitioning || $(element).hasClass(ClassName.COLLAPSING)) {
201
+ return;
202
+ }
203
+
204
+ var elem = $(element);
205
+ var startEvent = $.Event(Event.SHOW);
206
+ elem.trigger(startEvent);
207
+
208
+ if (startEvent.isDefaultPrevented()) {
209
+ return;
210
+ }
211
+
212
+ elem.parent(this.config.parentTrigger).addClass(ClassName.ACTIVE);
213
+
214
+ if (this.config.toggle) {
215
+ var toggleElem = elem.parent(this.config.parentTrigger).siblings().children(this.config.subMenu + "." + ClassName.SHOW);
216
+ this.hide(toggleElem);
217
+ }
218
+
219
+ elem.removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING).height(0);
220
+ this.setTransitioning(true);
221
+
222
+ var complete = function complete() {
223
+ // check if disposed
224
+ if (!_this.config || !_this.element) {
225
+ return;
226
+ }
227
+
228
+ elem.removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE + " " + ClassName.SHOW).height('');
229
+
230
+ _this.setTransitioning(false);
231
+
232
+ elem.trigger(Event.SHOWN);
233
+ };
234
+
235
+ elem.height(element[0].scrollHeight).one(Util.TRANSITION_END, complete).mmEmulateTransitionEnd(TRANSITION_DURATION);
236
+ };
237
+
238
+ _proto.hide = function hide(element) {
239
+ var _this2 = this;
240
+
241
+ if (this.transitioning || !$(element).hasClass(ClassName.SHOW)) {
242
+ return;
243
+ }
244
+
245
+ var elem = $(element);
246
+ var startEvent = $.Event(Event.HIDE);
247
+ elem.trigger(startEvent);
248
+
249
+ if (startEvent.isDefaultPrevented()) {
250
+ return;
251
+ }
252
+
253
+ elem.parent(this.config.parentTrigger).removeClass(ClassName.ACTIVE); // eslint-disable-next-line no-unused-expressions
254
+
255
+ elem.height(elem.height())[0].offsetHeight;
256
+ elem.addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.SHOW);
257
+ this.setTransitioning(true);
258
+
259
+ var complete = function complete() {
260
+ // check if disposed
261
+ if (!_this2.config || !_this2.element) {
262
+ return;
263
+ }
264
+
265
+ if (_this2.transitioning && _this2.config.onTransitionEnd) {
266
+ _this2.config.onTransitionEnd();
267
+ }
268
+
269
+ _this2.setTransitioning(false);
270
+
271
+ elem.trigger(Event.HIDDEN);
272
+ elem.removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE);
273
+ };
274
+
275
+ if (elem.height() === 0 || elem.css('display') === 'none') {
276
+ complete();
277
+ } else {
278
+ elem.height(0).one(Util.TRANSITION_END, complete).mmEmulateTransitionEnd(TRANSITION_DURATION);
279
+ }
280
+ };
281
+
282
+ _proto.setTransitioning = function setTransitioning(isTransitioning) {
283
+ this.transitioning = isTransitioning;
284
+ };
285
+
286
+ _proto.dispose = function dispose() {
287
+ $.removeData(this.element, DATA_KEY);
288
+ $(this.element).find(this.config.parentTrigger).has(this.config.subMenu).children(this.config.triggerElement).off('click');
289
+ this.transitioning = null;
290
+ this.config = null;
291
+ this.element = null;
292
+ };
293
+
294
+ MetisMenu.jQueryInterface = function jQueryInterface(config) {
295
+ // eslint-disable-next-line func-names
296
+ return this.each(function () {
297
+ var $this = $(this);
298
+ var data = $this.data(DATA_KEY);
299
+
300
+ var conf = _extends({}, Default, $this.data(), typeof config === 'object' && config ? config : {});
301
+
302
+ if (!data) {
303
+ data = new MetisMenu(this, conf);
304
+ $this.data(DATA_KEY, data);
305
+ }
306
+
307
+ if (typeof config === 'string') {
308
+ if (data[config] === undefined) {
309
+ throw new Error("No method named \"" + config + "\"");
310
+ }
311
+
312
+ data[config]();
313
+ }
314
+ });
315
+ };
316
+
317
+ return MetisMenu;
318
+ }();
319
+ /**
320
+ * ------------------------------------------------------------------------
321
+ * jQuery
322
+ * ------------------------------------------------------------------------
323
+ */
324
+
325
+
326
+ $.fn[NAME] = MetisMenu.jQueryInterface; // eslint-disable-line no-param-reassign
327
+
328
+ $.fn[NAME].Constructor = MetisMenu; // eslint-disable-line no-param-reassign
329
+
330
+ $.fn[NAME].noConflict = function () {
331
+ // eslint-disable-line no-param-reassign
332
+ $.fn[NAME] = JQUERY_NO_CONFLICT; // eslint-disable-line no-param-reassign
333
+
334
+ return MetisMenu.jQueryInterface;
335
+ };
336
+
337
+ return MetisMenu;
338
+
339
+ }));
340
+ //# sourceMappingURL=metisMenu.js.map
@@ -0,0 +1,1318 @@
1
+ /*!
2
+ * perfect-scrollbar v1.4.0
3
+ * (c) 2018 Hyunje Jun
4
+ * @license MIT
5
+ */
6
+ 'use strict';
7
+
8
+ function get(element) {
9
+ return getComputedStyle(element);
10
+ }
11
+
12
+ function set(element, obj) {
13
+ for (var key in obj) {
14
+ var val = obj[key];
15
+ if (typeof val === 'number') {
16
+ val = val + "px";
17
+ }
18
+ element.style[key] = val;
19
+ }
20
+ return element;
21
+ }
22
+
23
+ function div(className) {
24
+ var div = document.createElement('div');
25
+ div.className = className;
26
+ return div;
27
+ }
28
+
29
+ var elMatches =
30
+ typeof Element !== 'undefined' &&
31
+ (Element.prototype.matches ||
32
+ Element.prototype.webkitMatchesSelector ||
33
+ Element.prototype.mozMatchesSelector ||
34
+ Element.prototype.msMatchesSelector);
35
+
36
+ function matches(element, query) {
37
+ if (!elMatches) {
38
+ throw new Error('No element matching method supported');
39
+ }
40
+
41
+ return elMatches.call(element, query);
42
+ }
43
+
44
+ function remove(element) {
45
+ if (element.remove) {
46
+ element.remove();
47
+ } else {
48
+ if (element.parentNode) {
49
+ element.parentNode.removeChild(element);
50
+ }
51
+ }
52
+ }
53
+
54
+ function queryChildren(element, selector) {
55
+ return Array.prototype.filter.call(element.children, function (child) { return matches(child, selector); }
56
+ );
57
+ }
58
+
59
+ var cls = {
60
+ main: 'ps',
61
+ element: {
62
+ thumb: function (x) { return ("ps__thumb-" + x); },
63
+ rail: function (x) { return ("ps__rail-" + x); },
64
+ consuming: 'ps__child--consume',
65
+ },
66
+ state: {
67
+ focus: 'ps--focus',
68
+ clicking: 'ps--clicking',
69
+ active: function (x) { return ("ps--active-" + x); },
70
+ scrolling: function (x) { return ("ps--scrolling-" + x); },
71
+ },
72
+ };
73
+
74
+ /*
75
+ * Helper methods
76
+ */
77
+ var scrollingClassTimeout = { x: null, y: null };
78
+
79
+ function addScrollingClass(i, x) {
80
+ var classList = i.element.classList;
81
+ var className = cls.state.scrolling(x);
82
+
83
+ if (classList.contains(className)) {
84
+ clearTimeout(scrollingClassTimeout[x]);
85
+ } else {
86
+ classList.add(className);
87
+ }
88
+ }
89
+
90
+ function removeScrollingClass(i, x) {
91
+ scrollingClassTimeout[x] = setTimeout(
92
+ function () { return i.isAlive && i.element.classList.remove(cls.state.scrolling(x)); },
93
+ i.settings.scrollingThreshold
94
+ );
95
+ }
96
+
97
+ function setScrollingClassInstantly(i, x) {
98
+ addScrollingClass(i, x);
99
+ removeScrollingClass(i, x);
100
+ }
101
+
102
+ var EventElement = function EventElement(element) {
103
+ this.element = element;
104
+ this.handlers = {};
105
+ };
106
+
107
+ var prototypeAccessors = { isEmpty: { configurable: true } };
108
+
109
+ EventElement.prototype.bind = function bind (eventName, handler) {
110
+ if (typeof this.handlers[eventName] === 'undefined') {
111
+ this.handlers[eventName] = [];
112
+ }
113
+ this.handlers[eventName].push(handler);
114
+ this.element.addEventListener(eventName, handler, false);
115
+ };
116
+
117
+ EventElement.prototype.unbind = function unbind (eventName, target) {
118
+ var this$1 = this;
119
+
120
+ this.handlers[eventName] = this.handlers[eventName].filter(function (handler) {
121
+ if (target && handler !== target) {
122
+ return true;
123
+ }
124
+ this$1.element.removeEventListener(eventName, handler, false);
125
+ return false;
126
+ });
127
+ };
128
+
129
+ EventElement.prototype.unbindAll = function unbindAll () {
130
+ var this$1 = this;
131
+
132
+ for (var name in this$1.handlers) {
133
+ this$1.unbind(name);
134
+ }
135
+ };
136
+
137
+ prototypeAccessors.isEmpty.get = function () {
138
+ var this$1 = this;
139
+
140
+ return Object.keys(this.handlers).every(
141
+ function (key) { return this$1.handlers[key].length === 0; }
142
+ );
143
+ };
144
+
145
+ Object.defineProperties( EventElement.prototype, prototypeAccessors );
146
+
147
+ var EventManager = function EventManager() {
148
+ this.eventElements = [];
149
+ };
150
+
151
+ EventManager.prototype.eventElement = function eventElement (element) {
152
+ var ee = this.eventElements.filter(function (ee) { return ee.element === element; })[0];
153
+ if (!ee) {
154
+ ee = new EventElement(element);
155
+ this.eventElements.push(ee);
156
+ }
157
+ return ee;
158
+ };
159
+
160
+ EventManager.prototype.bind = function bind (element, eventName, handler) {
161
+ this.eventElement(element).bind(eventName, handler);
162
+ };
163
+
164
+ EventManager.prototype.unbind = function unbind (element, eventName, handler) {
165
+ var ee = this.eventElement(element);
166
+ ee.unbind(eventName, handler);
167
+
168
+ if (ee.isEmpty) {
169
+ // remove
170
+ this.eventElements.splice(this.eventElements.indexOf(ee), 1);
171
+ }
172
+ };
173
+
174
+ EventManager.prototype.unbindAll = function unbindAll () {
175
+ this.eventElements.forEach(function (e) { return e.unbindAll(); });
176
+ this.eventElements = [];
177
+ };
178
+
179
+ EventManager.prototype.once = function once (element, eventName, handler) {
180
+ var ee = this.eventElement(element);
181
+ var onceHandler = function (evt) {
182
+ ee.unbind(eventName, onceHandler);
183
+ handler(evt);
184
+ };
185
+ ee.bind(eventName, onceHandler);
186
+ };
187
+
188
+ function createEvent(name) {
189
+ if (typeof window.CustomEvent === 'function') {
190
+ return new CustomEvent(name);
191
+ } else {
192
+ var evt = document.createEvent('CustomEvent');
193
+ evt.initCustomEvent(name, false, false, undefined);
194
+ return evt;
195
+ }
196
+ }
197
+
198
+ var processScrollDiff = function(
199
+ i,
200
+ axis,
201
+ diff,
202
+ useScrollingClass,
203
+ forceFireReachEvent
204
+ ) {
205
+ if ( useScrollingClass === void 0 ) useScrollingClass = true;
206
+ if ( forceFireReachEvent === void 0 ) forceFireReachEvent = false;
207
+
208
+ var fields;
209
+ if (axis === 'top') {
210
+ fields = [
211
+ 'contentHeight',
212
+ 'containerHeight',
213
+ 'scrollTop',
214
+ 'y',
215
+ 'up',
216
+ 'down' ];
217
+ } else if (axis === 'left') {
218
+ fields = [
219
+ 'contentWidth',
220
+ 'containerWidth',
221
+ 'scrollLeft',
222
+ 'x',
223
+ 'left',
224
+ 'right' ];
225
+ } else {
226
+ throw new Error('A proper axis should be provided');
227
+ }
228
+
229
+ processScrollDiff$1(i, diff, fields, useScrollingClass, forceFireReachEvent);
230
+ };
231
+
232
+ function processScrollDiff$1(
233
+ i,
234
+ diff,
235
+ ref,
236
+ useScrollingClass,
237
+ forceFireReachEvent
238
+ ) {
239
+ var contentHeight = ref[0];
240
+ var containerHeight = ref[1];
241
+ var scrollTop = ref[2];
242
+ var y = ref[3];
243
+ var up = ref[4];
244
+ var down = ref[5];
245
+ if ( useScrollingClass === void 0 ) useScrollingClass = true;
246
+ if ( forceFireReachEvent === void 0 ) forceFireReachEvent = false;
247
+
248
+ var element = i.element;
249
+
250
+ // reset reach
251
+ i.reach[y] = null;
252
+
253
+ // 1 for subpixel rounding
254
+ if (element[scrollTop] < 1) {
255
+ i.reach[y] = 'start';
256
+ }
257
+
258
+ // 1 for subpixel rounding
259
+ if (element[scrollTop] > i[contentHeight] - i[containerHeight] - 1) {
260
+ i.reach[y] = 'end';
261
+ }
262
+
263
+ if (diff) {
264
+ element.dispatchEvent(createEvent(("ps-scroll-" + y)));
265
+
266
+ if (diff < 0) {
267
+ element.dispatchEvent(createEvent(("ps-scroll-" + up)));
268
+ } else if (diff > 0) {
269
+ element.dispatchEvent(createEvent(("ps-scroll-" + down)));
270
+ }
271
+
272
+ if (useScrollingClass) {
273
+ setScrollingClassInstantly(i, y);
274
+ }
275
+ }
276
+
277
+ if (i.reach[y] && (diff || forceFireReachEvent)) {
278
+ element.dispatchEvent(createEvent(("ps-" + y + "-reach-" + (i.reach[y]))));
279
+ }
280
+ }
281
+
282
+ function toInt(x) {
283
+ return parseInt(x, 10) || 0;
284
+ }
285
+
286
+ function isEditable(el) {
287
+ return (
288
+ matches(el, 'input,[contenteditable]') ||
289
+ matches(el, 'select,[contenteditable]') ||
290
+ matches(el, 'textarea,[contenteditable]') ||
291
+ matches(el, 'button,[contenteditable]')
292
+ );
293
+ }
294
+
295
+ function outerWidth(element) {
296
+ var styles = get(element);
297
+ return (
298
+ toInt(styles.width) +
299
+ toInt(styles.paddingLeft) +
300
+ toInt(styles.paddingRight) +
301
+ toInt(styles.borderLeftWidth) +
302
+ toInt(styles.borderRightWidth)
303
+ );
304
+ }
305
+
306
+ var env = {
307
+ isWebKit:
308
+ typeof document !== 'undefined' &&
309
+ 'WebkitAppearance' in document.documentElement.style,
310
+ supportsTouch:
311
+ typeof window !== 'undefined' &&
312
+ ('ontouchstart' in window ||
313
+ (window.DocumentTouch && document instanceof window.DocumentTouch)),
314
+ supportsIePointer:
315
+ typeof navigator !== 'undefined' && navigator.msMaxTouchPoints,
316
+ isChrome:
317
+ typeof navigator !== 'undefined' &&
318
+ /Chrome/i.test(navigator && navigator.userAgent),
319
+ };
320
+
321
+ var updateGeometry = function(i) {
322
+ var element = i.element;
323
+ var roundedScrollTop = Math.floor(element.scrollTop);
324
+
325
+ i.containerWidth = element.clientWidth;
326
+ i.containerHeight = element.clientHeight;
327
+ i.contentWidth = element.scrollWidth;
328
+ i.contentHeight = element.scrollHeight;
329
+
330
+ if (!element.contains(i.scrollbarXRail)) {
331
+ // clean up and append
332
+ queryChildren(element, cls.element.rail('x')).forEach(function (el) { return remove(el); }
333
+ );
334
+ element.appendChild(i.scrollbarXRail);
335
+ }
336
+ if (!element.contains(i.scrollbarYRail)) {
337
+ // clean up and append
338
+ queryChildren(element, cls.element.rail('y')).forEach(function (el) { return remove(el); }
339
+ );
340
+ element.appendChild(i.scrollbarYRail);
341
+ }
342
+
343
+ if (
344
+ !i.settings.suppressScrollX &&
345
+ i.containerWidth + i.settings.scrollXMarginOffset < i.contentWidth
346
+ ) {
347
+ i.scrollbarXActive = true;
348
+ i.railXWidth = i.containerWidth - i.railXMarginWidth;
349
+ i.railXRatio = i.containerWidth / i.railXWidth;
350
+ i.scrollbarXWidth = getThumbSize(
351
+ i,
352
+ toInt(i.railXWidth * i.containerWidth / i.contentWidth)
353
+ );
354
+ i.scrollbarXLeft = toInt(
355
+ (i.negativeScrollAdjustment + element.scrollLeft) *
356
+ (i.railXWidth - i.scrollbarXWidth) /
357
+ (i.contentWidth - i.containerWidth)
358
+ );
359
+ } else {
360
+ i.scrollbarXActive = false;
361
+ }
362
+
363
+ if (
364
+ !i.settings.suppressScrollY &&
365
+ i.containerHeight + i.settings.scrollYMarginOffset < i.contentHeight
366
+ ) {
367
+ i.scrollbarYActive = true;
368
+ i.railYHeight = i.containerHeight - i.railYMarginHeight;
369
+ i.railYRatio = i.containerHeight / i.railYHeight;
370
+ i.scrollbarYHeight = getThumbSize(
371
+ i,
372
+ toInt(i.railYHeight * i.containerHeight / i.contentHeight)
373
+ );
374
+ i.scrollbarYTop = toInt(
375
+ roundedScrollTop *
376
+ (i.railYHeight - i.scrollbarYHeight) /
377
+ (i.contentHeight - i.containerHeight)
378
+ );
379
+ } else {
380
+ i.scrollbarYActive = false;
381
+ }
382
+
383
+ if (i.scrollbarXLeft >= i.railXWidth - i.scrollbarXWidth) {
384
+ i.scrollbarXLeft = i.railXWidth - i.scrollbarXWidth;
385
+ }
386
+ if (i.scrollbarYTop >= i.railYHeight - i.scrollbarYHeight) {
387
+ i.scrollbarYTop = i.railYHeight - i.scrollbarYHeight;
388
+ }
389
+
390
+ updateCss(element, i);
391
+
392
+ if (i.scrollbarXActive) {
393
+ element.classList.add(cls.state.active('x'));
394
+ } else {
395
+ element.classList.remove(cls.state.active('x'));
396
+ i.scrollbarXWidth = 0;
397
+ i.scrollbarXLeft = 0;
398
+ element.scrollLeft = 0;
399
+ }
400
+ if (i.scrollbarYActive) {
401
+ element.classList.add(cls.state.active('y'));
402
+ } else {
403
+ element.classList.remove(cls.state.active('y'));
404
+ i.scrollbarYHeight = 0;
405
+ i.scrollbarYTop = 0;
406
+ element.scrollTop = 0;
407
+ }
408
+ };
409
+
410
+ function getThumbSize(i, thumbSize) {
411
+ if (i.settings.minScrollbarLength) {
412
+ thumbSize = Math.max(thumbSize, i.settings.minScrollbarLength);
413
+ }
414
+ if (i.settings.maxScrollbarLength) {
415
+ thumbSize = Math.min(thumbSize, i.settings.maxScrollbarLength);
416
+ }
417
+ return thumbSize;
418
+ }
419
+
420
+ function updateCss(element, i) {
421
+ var xRailOffset = { width: i.railXWidth };
422
+ var roundedScrollTop = Math.floor(element.scrollTop);
423
+
424
+ if (i.isRtl) {
425
+ xRailOffset.left =
426
+ i.negativeScrollAdjustment +
427
+ element.scrollLeft +
428
+ i.containerWidth -
429
+ i.contentWidth;
430
+ } else {
431
+ xRailOffset.left = element.scrollLeft;
432
+ }
433
+ if (i.isScrollbarXUsingBottom) {
434
+ xRailOffset.bottom = i.scrollbarXBottom - roundedScrollTop;
435
+ } else {
436
+ xRailOffset.top = i.scrollbarXTop + roundedScrollTop;
437
+ }
438
+ set(i.scrollbarXRail, xRailOffset);
439
+
440
+ var yRailOffset = { top: roundedScrollTop, height: i.railYHeight };
441
+ if (i.isScrollbarYUsingRight) {
442
+ if (i.isRtl) {
443
+ yRailOffset.right =
444
+ i.contentWidth -
445
+ (i.negativeScrollAdjustment + element.scrollLeft) -
446
+ i.scrollbarYRight -
447
+ i.scrollbarYOuterWidth;
448
+ } else {
449
+ yRailOffset.right = i.scrollbarYRight - element.scrollLeft;
450
+ }
451
+ } else {
452
+ if (i.isRtl) {
453
+ yRailOffset.left =
454
+ i.negativeScrollAdjustment +
455
+ element.scrollLeft +
456
+ i.containerWidth * 2 -
457
+ i.contentWidth -
458
+ i.scrollbarYLeft -
459
+ i.scrollbarYOuterWidth;
460
+ } else {
461
+ yRailOffset.left = i.scrollbarYLeft + element.scrollLeft;
462
+ }
463
+ }
464
+ set(i.scrollbarYRail, yRailOffset);
465
+
466
+ set(i.scrollbarX, {
467
+ left: i.scrollbarXLeft,
468
+ width: i.scrollbarXWidth - i.railBorderXWidth,
469
+ });
470
+ set(i.scrollbarY, {
471
+ top: i.scrollbarYTop,
472
+ height: i.scrollbarYHeight - i.railBorderYWidth,
473
+ });
474
+ }
475
+
476
+ var clickRail = function(i) {
477
+ i.event.bind(i.scrollbarY, 'mousedown', function (e) { return e.stopPropagation(); });
478
+ i.event.bind(i.scrollbarYRail, 'mousedown', function (e) {
479
+ var positionTop =
480
+ e.pageY -
481
+ window.pageYOffset -
482
+ i.scrollbarYRail.getBoundingClientRect().top;
483
+ var direction = positionTop > i.scrollbarYTop ? 1 : -1;
484
+
485
+ i.element.scrollTop += direction * i.containerHeight;
486
+ updateGeometry(i);
487
+
488
+ e.stopPropagation();
489
+ });
490
+
491
+ i.event.bind(i.scrollbarX, 'mousedown', function (e) { return e.stopPropagation(); });
492
+ i.event.bind(i.scrollbarXRail, 'mousedown', function (e) {
493
+ var positionLeft =
494
+ e.pageX -
495
+ window.pageXOffset -
496
+ i.scrollbarXRail.getBoundingClientRect().left;
497
+ var direction = positionLeft > i.scrollbarXLeft ? 1 : -1;
498
+
499
+ i.element.scrollLeft += direction * i.containerWidth;
500
+ updateGeometry(i);
501
+
502
+ e.stopPropagation();
503
+ });
504
+ };
505
+
506
+ var dragThumb = function(i) {
507
+ bindMouseScrollHandler(i, [
508
+ 'containerWidth',
509
+ 'contentWidth',
510
+ 'pageX',
511
+ 'railXWidth',
512
+ 'scrollbarX',
513
+ 'scrollbarXWidth',
514
+ 'scrollLeft',
515
+ 'x',
516
+ 'scrollbarXRail' ]);
517
+ bindMouseScrollHandler(i, [
518
+ 'containerHeight',
519
+ 'contentHeight',
520
+ 'pageY',
521
+ 'railYHeight',
522
+ 'scrollbarY',
523
+ 'scrollbarYHeight',
524
+ 'scrollTop',
525
+ 'y',
526
+ 'scrollbarYRail' ]);
527
+ };
528
+
529
+ function bindMouseScrollHandler(
530
+ i,
531
+ ref
532
+ ) {
533
+ var containerHeight = ref[0];
534
+ var contentHeight = ref[1];
535
+ var pageY = ref[2];
536
+ var railYHeight = ref[3];
537
+ var scrollbarY = ref[4];
538
+ var scrollbarYHeight = ref[5];
539
+ var scrollTop = ref[6];
540
+ var y = ref[7];
541
+ var scrollbarYRail = ref[8];
542
+
543
+ var element = i.element;
544
+
545
+ var startingScrollTop = null;
546
+ var startingMousePageY = null;
547
+ var scrollBy = null;
548
+
549
+ function mouseMoveHandler(e) {
550
+ element[scrollTop] =
551
+ startingScrollTop + scrollBy * (e[pageY] - startingMousePageY);
552
+ addScrollingClass(i, y);
553
+ updateGeometry(i);
554
+
555
+ e.stopPropagation();
556
+ e.preventDefault();
557
+ }
558
+
559
+ function mouseUpHandler() {
560
+ removeScrollingClass(i, y);
561
+ i[scrollbarYRail].classList.remove(cls.state.clicking);
562
+ i.event.unbind(i.ownerDocument, 'mousemove', mouseMoveHandler);
563
+ }
564
+
565
+ i.event.bind(i[scrollbarY], 'mousedown', function (e) {
566
+ startingScrollTop = element[scrollTop];
567
+ startingMousePageY = e[pageY];
568
+ scrollBy =
569
+ (i[contentHeight] - i[containerHeight]) /
570
+ (i[railYHeight] - i[scrollbarYHeight]);
571
+
572
+ i.event.bind(i.ownerDocument, 'mousemove', mouseMoveHandler);
573
+ i.event.once(i.ownerDocument, 'mouseup', mouseUpHandler);
574
+
575
+ i[scrollbarYRail].classList.add(cls.state.clicking);
576
+
577
+ e.stopPropagation();
578
+ e.preventDefault();
579
+ });
580
+ }
581
+
582
+ var keyboard = function(i) {
583
+ var element = i.element;
584
+
585
+ var elementHovered = function () { return matches(element, ':hover'); };
586
+ var scrollbarFocused = function () { return matches(i.scrollbarX, ':focus') || matches(i.scrollbarY, ':focus'); };
587
+
588
+ function shouldPreventDefault(deltaX, deltaY) {
589
+ var scrollTop = Math.floor(element.scrollTop);
590
+ if (deltaX === 0) {
591
+ if (!i.scrollbarYActive) {
592
+ return false;
593
+ }
594
+ if (
595
+ (scrollTop === 0 && deltaY > 0) ||
596
+ (scrollTop >= i.contentHeight - i.containerHeight && deltaY < 0)
597
+ ) {
598
+ return !i.settings.wheelPropagation;
599
+ }
600
+ }
601
+
602
+ var scrollLeft = element.scrollLeft;
603
+ if (deltaY === 0) {
604
+ if (!i.scrollbarXActive) {
605
+ return false;
606
+ }
607
+ if (
608
+ (scrollLeft === 0 && deltaX < 0) ||
609
+ (scrollLeft >= i.contentWidth - i.containerWidth && deltaX > 0)
610
+ ) {
611
+ return !i.settings.wheelPropagation;
612
+ }
613
+ }
614
+ return true;
615
+ }
616
+
617
+ i.event.bind(i.ownerDocument, 'keydown', function (e) {
618
+ if (
619
+ (e.isDefaultPrevented && e.isDefaultPrevented()) ||
620
+ e.defaultPrevented
621
+ ) {
622
+ return;
623
+ }
624
+
625
+ if (!elementHovered() && !scrollbarFocused()) {
626
+ return;
627
+ }
628
+
629
+ var activeElement = document.activeElement
630
+ ? document.activeElement
631
+ : i.ownerDocument.activeElement;
632
+ if (activeElement) {
633
+ if (activeElement.tagName === 'IFRAME') {
634
+ activeElement = activeElement.contentDocument.activeElement;
635
+ } else {
636
+ // go deeper if element is a webcomponent
637
+ while (activeElement.shadowRoot) {
638
+ activeElement = activeElement.shadowRoot.activeElement;
639
+ }
640
+ }
641
+ if (isEditable(activeElement)) {
642
+ return;
643
+ }
644
+ }
645
+
646
+ var deltaX = 0;
647
+ var deltaY = 0;
648
+
649
+ switch (e.which) {
650
+ case 37: // left
651
+ if (e.metaKey) {
652
+ deltaX = -i.contentWidth;
653
+ } else if (e.altKey) {
654
+ deltaX = -i.containerWidth;
655
+ } else {
656
+ deltaX = -30;
657
+ }
658
+ break;
659
+ case 38: // up
660
+ if (e.metaKey) {
661
+ deltaY = i.contentHeight;
662
+ } else if (e.altKey) {
663
+ deltaY = i.containerHeight;
664
+ } else {
665
+ deltaY = 30;
666
+ }
667
+ break;
668
+ case 39: // right
669
+ if (e.metaKey) {
670
+ deltaX = i.contentWidth;
671
+ } else if (e.altKey) {
672
+ deltaX = i.containerWidth;
673
+ } else {
674
+ deltaX = 30;
675
+ }
676
+ break;
677
+ case 40: // down
678
+ if (e.metaKey) {
679
+ deltaY = -i.contentHeight;
680
+ } else if (e.altKey) {
681
+ deltaY = -i.containerHeight;
682
+ } else {
683
+ deltaY = -30;
684
+ }
685
+ break;
686
+ case 32: // space bar
687
+ if (e.shiftKey) {
688
+ deltaY = i.containerHeight;
689
+ } else {
690
+ deltaY = -i.containerHeight;
691
+ }
692
+ break;
693
+ case 33: // page up
694
+ deltaY = i.containerHeight;
695
+ break;
696
+ case 34: // page down
697
+ deltaY = -i.containerHeight;
698
+ break;
699
+ case 36: // home
700
+ deltaY = i.contentHeight;
701
+ break;
702
+ case 35: // end
703
+ deltaY = -i.contentHeight;
704
+ break;
705
+ default:
706
+ return;
707
+ }
708
+
709
+ if (i.settings.suppressScrollX && deltaX !== 0) {
710
+ return;
711
+ }
712
+ if (i.settings.suppressScrollY && deltaY !== 0) {
713
+ return;
714
+ }
715
+
716
+ element.scrollTop -= deltaY;
717
+ element.scrollLeft += deltaX;
718
+ updateGeometry(i);
719
+
720
+ if (shouldPreventDefault(deltaX, deltaY)) {
721
+ e.preventDefault();
722
+ }
723
+ });
724
+ };
725
+
726
+ var wheel = function(i) {
727
+ var element = i.element;
728
+
729
+ function shouldPreventDefault(deltaX, deltaY) {
730
+ var roundedScrollTop = Math.floor(element.scrollTop);
731
+ var isTop = element.scrollTop === 0;
732
+ var isBottom =
733
+ roundedScrollTop + element.offsetHeight === element.scrollHeight;
734
+ var isLeft = element.scrollLeft === 0;
735
+ var isRight =
736
+ element.scrollLeft + element.offsetWidth === element.scrollWidth;
737
+
738
+ var hitsBound;
739
+
740
+ // pick axis with primary direction
741
+ if (Math.abs(deltaY) > Math.abs(deltaX)) {
742
+ hitsBound = isTop || isBottom;
743
+ } else {
744
+ hitsBound = isLeft || isRight;
745
+ }
746
+
747
+ return hitsBound ? !i.settings.wheelPropagation : true;
748
+ }
749
+
750
+ function getDeltaFromEvent(e) {
751
+ var deltaX = e.deltaX;
752
+ var deltaY = -1 * e.deltaY;
753
+
754
+ if (typeof deltaX === 'undefined' || typeof deltaY === 'undefined') {
755
+ // OS X Safari
756
+ deltaX = -1 * e.wheelDeltaX / 6;
757
+ deltaY = e.wheelDeltaY / 6;
758
+ }
759
+
760
+ if (e.deltaMode && e.deltaMode === 1) {
761
+ // Firefox in deltaMode 1: Line scrolling
762
+ deltaX *= 10;
763
+ deltaY *= 10;
764
+ }
765
+
766
+ if (deltaX !== deltaX && deltaY !== deltaY /* NaN checks */) {
767
+ // IE in some mouse drivers
768
+ deltaX = 0;
769
+ deltaY = e.wheelDelta;
770
+ }
771
+
772
+ if (e.shiftKey) {
773
+ // reverse axis with shift key
774
+ return [-deltaY, -deltaX];
775
+ }
776
+ return [deltaX, deltaY];
777
+ }
778
+
779
+ function shouldBeConsumedByChild(target, deltaX, deltaY) {
780
+ // FIXME: this is a workaround for <select> issue in FF and IE #571
781
+ if (!env.isWebKit && element.querySelector('select:focus')) {
782
+ return true;
783
+ }
784
+
785
+ if (!element.contains(target)) {
786
+ return false;
787
+ }
788
+
789
+ var cursor = target;
790
+
791
+ while (cursor && cursor !== element) {
792
+ if (cursor.classList.contains(cls.element.consuming)) {
793
+ return true;
794
+ }
795
+
796
+ var style = get(cursor);
797
+ var overflow = [style.overflow, style.overflowX, style.overflowY].join(
798
+ ''
799
+ );
800
+
801
+ // if scrollable
802
+ if (overflow.match(/(scroll|auto)/)) {
803
+ var maxScrollTop = cursor.scrollHeight - cursor.clientHeight;
804
+ if (maxScrollTop > 0) {
805
+ if (
806
+ !(cursor.scrollTop === 0 && deltaY > 0) &&
807
+ !(cursor.scrollTop === maxScrollTop && deltaY < 0)
808
+ ) {
809
+ return true;
810
+ }
811
+ }
812
+ var maxScrollLeft = cursor.scrollWidth - cursor.clientWidth;
813
+ if (maxScrollLeft > 0) {
814
+ if (
815
+ !(cursor.scrollLeft === 0 && deltaX < 0) &&
816
+ !(cursor.scrollLeft === maxScrollLeft && deltaX > 0)
817
+ ) {
818
+ return true;
819
+ }
820
+ }
821
+ }
822
+
823
+ cursor = cursor.parentNode;
824
+ }
825
+
826
+ return false;
827
+ }
828
+
829
+ function mousewheelHandler(e) {
830
+ var ref = getDeltaFromEvent(e);
831
+ var deltaX = ref[0];
832
+ var deltaY = ref[1];
833
+
834
+ if (shouldBeConsumedByChild(e.target, deltaX, deltaY)) {
835
+ return;
836
+ }
837
+
838
+ var shouldPrevent = false;
839
+ if (!i.settings.useBothWheelAxes) {
840
+ // deltaX will only be used for horizontal scrolling and deltaY will
841
+ // only be used for vertical scrolling - this is the default
842
+ element.scrollTop -= deltaY * i.settings.wheelSpeed;
843
+ element.scrollLeft += deltaX * i.settings.wheelSpeed;
844
+ } else if (i.scrollbarYActive && !i.scrollbarXActive) {
845
+ // only vertical scrollbar is active and useBothWheelAxes option is
846
+ // active, so let's scroll vertical bar using both mouse wheel axes
847
+ if (deltaY) {
848
+ element.scrollTop -= deltaY * i.settings.wheelSpeed;
849
+ } else {
850
+ element.scrollTop += deltaX * i.settings.wheelSpeed;
851
+ }
852
+ shouldPrevent = true;
853
+ } else if (i.scrollbarXActive && !i.scrollbarYActive) {
854
+ // useBothWheelAxes and only horizontal bar is active, so use both
855
+ // wheel axes for horizontal bar
856
+ if (deltaX) {
857
+ element.scrollLeft += deltaX * i.settings.wheelSpeed;
858
+ } else {
859
+ element.scrollLeft -= deltaY * i.settings.wheelSpeed;
860
+ }
861
+ shouldPrevent = true;
862
+ }
863
+
864
+ updateGeometry(i);
865
+
866
+ shouldPrevent = shouldPrevent || shouldPreventDefault(deltaX, deltaY);
867
+ if (shouldPrevent && !e.ctrlKey) {
868
+ e.stopPropagation();
869
+ e.preventDefault();
870
+ }
871
+ }
872
+
873
+ if (typeof window.onwheel !== 'undefined') {
874
+ i.event.bind(element, 'wheel', mousewheelHandler);
875
+ } else if (typeof window.onmousewheel !== 'undefined') {
876
+ i.event.bind(element, 'mousewheel', mousewheelHandler);
877
+ }
878
+ };
879
+
880
+ var touch = function(i) {
881
+ if (!env.supportsTouch && !env.supportsIePointer) {
882
+ return;
883
+ }
884
+
885
+ var element = i.element;
886
+
887
+ function shouldPrevent(deltaX, deltaY) {
888
+ var scrollTop = Math.floor(element.scrollTop);
889
+ var scrollLeft = element.scrollLeft;
890
+ var magnitudeX = Math.abs(deltaX);
891
+ var magnitudeY = Math.abs(deltaY);
892
+
893
+ if (magnitudeY > magnitudeX) {
894
+ // user is perhaps trying to swipe up/down the page
895
+
896
+ if (
897
+ (deltaY < 0 && scrollTop === i.contentHeight - i.containerHeight) ||
898
+ (deltaY > 0 && scrollTop === 0)
899
+ ) {
900
+ // set prevent for mobile Chrome refresh
901
+ return window.scrollY === 0 && deltaY > 0 && env.isChrome;
902
+ }
903
+ } else if (magnitudeX > magnitudeY) {
904
+ // user is perhaps trying to swipe left/right across the page
905
+
906
+ if (
907
+ (deltaX < 0 && scrollLeft === i.contentWidth - i.containerWidth) ||
908
+ (deltaX > 0 && scrollLeft === 0)
909
+ ) {
910
+ return true;
911
+ }
912
+ }
913
+
914
+ return true;
915
+ }
916
+
917
+ function applyTouchMove(differenceX, differenceY) {
918
+ element.scrollTop -= differenceY;
919
+ element.scrollLeft -= differenceX;
920
+
921
+ updateGeometry(i);
922
+ }
923
+
924
+ var startOffset = {};
925
+ var startTime = 0;
926
+ var speed = {};
927
+ var easingLoop = null;
928
+
929
+ function getTouch(e) {
930
+ if (e.targetTouches) {
931
+ return e.targetTouches[0];
932
+ } else {
933
+ // Maybe IE pointer
934
+ return e;
935
+ }
936
+ }
937
+
938
+ function shouldHandle(e) {
939
+ if (e.pointerType && e.pointerType === 'pen' && e.buttons === 0) {
940
+ return false;
941
+ }
942
+ if (e.targetTouches && e.targetTouches.length === 1) {
943
+ return true;
944
+ }
945
+ if (
946
+ e.pointerType &&
947
+ e.pointerType !== 'mouse' &&
948
+ e.pointerType !== e.MSPOINTER_TYPE_MOUSE
949
+ ) {
950
+ return true;
951
+ }
952
+ return false;
953
+ }
954
+
955
+ function touchStart(e) {
956
+ if (!shouldHandle(e)) {
957
+ return;
958
+ }
959
+
960
+ var touch = getTouch(e);
961
+
962
+ startOffset.pageX = touch.pageX;
963
+ startOffset.pageY = touch.pageY;
964
+
965
+ startTime = new Date().getTime();
966
+
967
+ if (easingLoop !== null) {
968
+ clearInterval(easingLoop);
969
+ }
970
+ }
971
+
972
+ function shouldBeConsumedByChild(target, deltaX, deltaY) {
973
+ if (!element.contains(target)) {
974
+ return false;
975
+ }
976
+
977
+ var cursor = target;
978
+
979
+ while (cursor && cursor !== element) {
980
+ if (cursor.classList.contains(cls.element.consuming)) {
981
+ return true;
982
+ }
983
+
984
+ var style = get(cursor);
985
+ var overflow = [style.overflow, style.overflowX, style.overflowY].join(
986
+ ''
987
+ );
988
+
989
+ // if scrollable
990
+ if (overflow.match(/(scroll|auto)/)) {
991
+ var maxScrollTop = cursor.scrollHeight - cursor.clientHeight;
992
+ if (maxScrollTop > 0) {
993
+ if (
994
+ !(cursor.scrollTop === 0 && deltaY > 0) &&
995
+ !(cursor.scrollTop === maxScrollTop && deltaY < 0)
996
+ ) {
997
+ return true;
998
+ }
999
+ }
1000
+ var maxScrollLeft = cursor.scrollLeft - cursor.clientWidth;
1001
+ if (maxScrollLeft > 0) {
1002
+ if (
1003
+ !(cursor.scrollLeft === 0 && deltaX < 0) &&
1004
+ !(cursor.scrollLeft === maxScrollLeft && deltaX > 0)
1005
+ ) {
1006
+ return true;
1007
+ }
1008
+ }
1009
+ }
1010
+
1011
+ cursor = cursor.parentNode;
1012
+ }
1013
+
1014
+ return false;
1015
+ }
1016
+
1017
+ function touchMove(e) {
1018
+ if (shouldHandle(e)) {
1019
+ var touch = getTouch(e);
1020
+
1021
+ var currentOffset = { pageX: touch.pageX, pageY: touch.pageY };
1022
+
1023
+ var differenceX = currentOffset.pageX - startOffset.pageX;
1024
+ var differenceY = currentOffset.pageY - startOffset.pageY;
1025
+
1026
+ if (shouldBeConsumedByChild(e.target, differenceX, differenceY)) {
1027
+ return;
1028
+ }
1029
+
1030
+ applyTouchMove(differenceX, differenceY);
1031
+ startOffset = currentOffset;
1032
+
1033
+ var currentTime = new Date().getTime();
1034
+
1035
+ var timeGap = currentTime - startTime;
1036
+ if (timeGap > 0) {
1037
+ speed.x = differenceX / timeGap;
1038
+ speed.y = differenceY / timeGap;
1039
+ startTime = currentTime;
1040
+ }
1041
+
1042
+ if (shouldPrevent(differenceX, differenceY)) {
1043
+ e.preventDefault();
1044
+ }
1045
+ }
1046
+ }
1047
+ function touchEnd() {
1048
+ if (i.settings.swipeEasing) {
1049
+ clearInterval(easingLoop);
1050
+ easingLoop = setInterval(function() {
1051
+ if (i.isInitialized) {
1052
+ clearInterval(easingLoop);
1053
+ return;
1054
+ }
1055
+
1056
+ if (!speed.x && !speed.y) {
1057
+ clearInterval(easingLoop);
1058
+ return;
1059
+ }
1060
+
1061
+ if (Math.abs(speed.x) < 0.01 && Math.abs(speed.y) < 0.01) {
1062
+ clearInterval(easingLoop);
1063
+ return;
1064
+ }
1065
+
1066
+ applyTouchMove(speed.x * 30, speed.y * 30);
1067
+
1068
+ speed.x *= 0.8;
1069
+ speed.y *= 0.8;
1070
+ }, 10);
1071
+ }
1072
+ }
1073
+
1074
+ if (env.supportsTouch) {
1075
+ i.event.bind(element, 'touchstart', touchStart);
1076
+ i.event.bind(element, 'touchmove', touchMove);
1077
+ i.event.bind(element, 'touchend', touchEnd);
1078
+ } else if (env.supportsIePointer) {
1079
+ if (window.PointerEvent) {
1080
+ i.event.bind(element, 'pointerdown', touchStart);
1081
+ i.event.bind(element, 'pointermove', touchMove);
1082
+ i.event.bind(element, 'pointerup', touchEnd);
1083
+ } else if (window.MSPointerEvent) {
1084
+ i.event.bind(element, 'MSPointerDown', touchStart);
1085
+ i.event.bind(element, 'MSPointerMove', touchMove);
1086
+ i.event.bind(element, 'MSPointerUp', touchEnd);
1087
+ }
1088
+ }
1089
+ };
1090
+
1091
+ var defaultSettings = function () { return ({
1092
+ handlers: ['click-rail', 'drag-thumb', 'keyboard', 'wheel', 'touch'],
1093
+ maxScrollbarLength: null,
1094
+ minScrollbarLength: null,
1095
+ scrollingThreshold: 1000,
1096
+ scrollXMarginOffset: 0,
1097
+ scrollYMarginOffset: 0,
1098
+ suppressScrollX: false,
1099
+ suppressScrollY: false,
1100
+ swipeEasing: true,
1101
+ useBothWheelAxes: false,
1102
+ wheelPropagation: true,
1103
+ wheelSpeed: 1,
1104
+ }); };
1105
+
1106
+ var handlers = {
1107
+ 'click-rail': clickRail,
1108
+ 'drag-thumb': dragThumb,
1109
+ keyboard: keyboard,
1110
+ wheel: wheel,
1111
+ touch: touch,
1112
+ };
1113
+
1114
+ var PerfectScrollbar = function PerfectScrollbar(element, userSettings) {
1115
+ var this$1 = this;
1116
+ if ( userSettings === void 0 ) userSettings = {};
1117
+
1118
+ if (typeof element === 'string') {
1119
+ element = document.querySelector(element);
1120
+ }
1121
+
1122
+ if (!element || !element.nodeName) {
1123
+ throw new Error('no element is specified to initialize PerfectScrollbar');
1124
+ }
1125
+
1126
+ this.element = element;
1127
+
1128
+ element.classList.add(cls.main);
1129
+
1130
+ this.settings = defaultSettings();
1131
+ for (var key in userSettings) {
1132
+ this$1.settings[key] = userSettings[key];
1133
+ }
1134
+
1135
+ this.containerWidth = null;
1136
+ this.containerHeight = null;
1137
+ this.contentWidth = null;
1138
+ this.contentHeight = null;
1139
+
1140
+ var focus = function () { return element.classList.add(cls.state.focus); };
1141
+ var blur = function () { return element.classList.remove(cls.state.focus); };
1142
+
1143
+ this.isRtl = get(element).direction === 'rtl';
1144
+ this.isNegativeScroll = (function () {
1145
+ var originalScrollLeft = element.scrollLeft;
1146
+ var result = null;
1147
+ element.scrollLeft = -1;
1148
+ result = element.scrollLeft < 0;
1149
+ element.scrollLeft = originalScrollLeft;
1150
+ return result;
1151
+ })();
1152
+ this.negativeScrollAdjustment = this.isNegativeScroll
1153
+ ? element.scrollWidth - element.clientWidth
1154
+ : 0;
1155
+ this.event = new EventManager();
1156
+ this.ownerDocument = element.ownerDocument || document;
1157
+
1158
+ this.scrollbarXRail = div(cls.element.rail('x'));
1159
+ element.appendChild(this.scrollbarXRail);
1160
+ this.scrollbarX = div(cls.element.thumb('x'));
1161
+ this.scrollbarXRail.appendChild(this.scrollbarX);
1162
+ this.scrollbarX.setAttribute('tabindex', 0);
1163
+ this.event.bind(this.scrollbarX, 'focus', focus);
1164
+ this.event.bind(this.scrollbarX, 'blur', blur);
1165
+ this.scrollbarXActive = null;
1166
+ this.scrollbarXWidth = null;
1167
+ this.scrollbarXLeft = null;
1168
+ var railXStyle = get(this.scrollbarXRail);
1169
+ this.scrollbarXBottom = parseInt(railXStyle.bottom, 10);
1170
+ if (isNaN(this.scrollbarXBottom)) {
1171
+ this.isScrollbarXUsingBottom = false;
1172
+ this.scrollbarXTop = toInt(railXStyle.top);
1173
+ } else {
1174
+ this.isScrollbarXUsingBottom = true;
1175
+ }
1176
+ this.railBorderXWidth =
1177
+ toInt(railXStyle.borderLeftWidth) + toInt(railXStyle.borderRightWidth);
1178
+ // Set rail to display:block to calculate margins
1179
+ set(this.scrollbarXRail, { display: 'block' });
1180
+ this.railXMarginWidth =
1181
+ toInt(railXStyle.marginLeft) + toInt(railXStyle.marginRight);
1182
+ set(this.scrollbarXRail, { display: '' });
1183
+ this.railXWidth = null;
1184
+ this.railXRatio = null;
1185
+
1186
+ this.scrollbarYRail = div(cls.element.rail('y'));
1187
+ element.appendChild(this.scrollbarYRail);
1188
+ this.scrollbarY = div(cls.element.thumb('y'));
1189
+ this.scrollbarYRail.appendChild(this.scrollbarY);
1190
+ this.scrollbarY.setAttribute('tabindex', 0);
1191
+ this.event.bind(this.scrollbarY, 'focus', focus);
1192
+ this.event.bind(this.scrollbarY, 'blur', blur);
1193
+ this.scrollbarYActive = null;
1194
+ this.scrollbarYHeight = null;
1195
+ this.scrollbarYTop = null;
1196
+ var railYStyle = get(this.scrollbarYRail);
1197
+ this.scrollbarYRight = parseInt(railYStyle.right, 10);
1198
+ if (isNaN(this.scrollbarYRight)) {
1199
+ this.isScrollbarYUsingRight = false;
1200
+ this.scrollbarYLeft = toInt(railYStyle.left);
1201
+ } else {
1202
+ this.isScrollbarYUsingRight = true;
1203
+ }
1204
+ this.scrollbarYOuterWidth = this.isRtl ? outerWidth(this.scrollbarY) : null;
1205
+ this.railBorderYWidth =
1206
+ toInt(railYStyle.borderTopWidth) + toInt(railYStyle.borderBottomWidth);
1207
+ set(this.scrollbarYRail, { display: 'block' });
1208
+ this.railYMarginHeight =
1209
+ toInt(railYStyle.marginTop) + toInt(railYStyle.marginBottom);
1210
+ set(this.scrollbarYRail, { display: '' });
1211
+ this.railYHeight = null;
1212
+ this.railYRatio = null;
1213
+
1214
+ this.reach = {
1215
+ x:
1216
+ element.scrollLeft <= 0
1217
+ ? 'start'
1218
+ : element.scrollLeft >= this.contentWidth - this.containerWidth
1219
+ ? 'end'
1220
+ : null,
1221
+ y:
1222
+ element.scrollTop <= 0
1223
+ ? 'start'
1224
+ : element.scrollTop >= this.contentHeight - this.containerHeight
1225
+ ? 'end'
1226
+ : null,
1227
+ };
1228
+
1229
+ this.isAlive = true;
1230
+
1231
+ this.settings.handlers.forEach(function (handlerName) { return handlers[handlerName](this$1); });
1232
+
1233
+ this.lastScrollTop = Math.floor(element.scrollTop); // for onScroll only
1234
+ this.lastScrollLeft = element.scrollLeft; // for onScroll only
1235
+ this.event.bind(this.element, 'scroll', function (e) { return this$1.onScroll(e); });
1236
+ updateGeometry(this);
1237
+ };
1238
+
1239
+ PerfectScrollbar.prototype.update = function update () {
1240
+ if (!this.isAlive) {
1241
+ return;
1242
+ }
1243
+
1244
+ // Recalcuate negative scrollLeft adjustment
1245
+ this.negativeScrollAdjustment = this.isNegativeScroll
1246
+ ? this.element.scrollWidth - this.element.clientWidth
1247
+ : 0;
1248
+
1249
+ // Recalculate rail margins
1250
+ set(this.scrollbarXRail, { display: 'block' });
1251
+ set(this.scrollbarYRail, { display: 'block' });
1252
+ this.railXMarginWidth =
1253
+ toInt(get(this.scrollbarXRail).marginLeft) +
1254
+ toInt(get(this.scrollbarXRail).marginRight);
1255
+ this.railYMarginHeight =
1256
+ toInt(get(this.scrollbarYRail).marginTop) +
1257
+ toInt(get(this.scrollbarYRail).marginBottom);
1258
+
1259
+ // Hide scrollbars not to affect scrollWidth and scrollHeight
1260
+ set(this.scrollbarXRail, { display: 'none' });
1261
+ set(this.scrollbarYRail, { display: 'none' });
1262
+
1263
+ updateGeometry(this);
1264
+
1265
+ processScrollDiff(this, 'top', 0, false, true);
1266
+ processScrollDiff(this, 'left', 0, false, true);
1267
+
1268
+ set(this.scrollbarXRail, { display: '' });
1269
+ set(this.scrollbarYRail, { display: '' });
1270
+ };
1271
+
1272
+ PerfectScrollbar.prototype.onScroll = function onScroll (e) {
1273
+ if (!this.isAlive) {
1274
+ return;
1275
+ }
1276
+
1277
+ updateGeometry(this);
1278
+ processScrollDiff(this, 'top', this.element.scrollTop - this.lastScrollTop);
1279
+ processScrollDiff(
1280
+ this,
1281
+ 'left',
1282
+ this.element.scrollLeft - this.lastScrollLeft
1283
+ );
1284
+
1285
+ this.lastScrollTop = Math.floor(this.element.scrollTop);
1286
+ this.lastScrollLeft = this.element.scrollLeft;
1287
+ };
1288
+
1289
+ PerfectScrollbar.prototype.destroy = function destroy () {
1290
+ if (!this.isAlive) {
1291
+ return;
1292
+ }
1293
+
1294
+ this.event.unbindAll();
1295
+ remove(this.scrollbarX);
1296
+ remove(this.scrollbarY);
1297
+ remove(this.scrollbarXRail);
1298
+ remove(this.scrollbarYRail);
1299
+ this.removePsClasses();
1300
+
1301
+ // unset elements
1302
+ this.element = null;
1303
+ this.scrollbarX = null;
1304
+ this.scrollbarY = null;
1305
+ this.scrollbarXRail = null;
1306
+ this.scrollbarYRail = null;
1307
+
1308
+ this.isAlive = false;
1309
+ };
1310
+
1311
+ PerfectScrollbar.prototype.removePsClasses = function removePsClasses () {
1312
+ this.element.className = this.element.className
1313
+ .split(' ')
1314
+ .filter(function (name) { return !name.match(/^ps([-_].+|)$/); })
1315
+ .join(' ');
1316
+ };
1317
+
1318
+ module.exports = PerfectScrollbar;