rails_material_admin 0.1.5 → 0.1.9

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 (30) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +10 -20
  3. data/app/helpers/admin_helper.rb +34 -0
  4. data/app/views/admin/sessions/new.html.slim +27 -24
  5. data/app/views/layouts/admin.html.slim +16 -5
  6. data/app/views/shared/_error_messages.html.slim +12 -7
  7. data/app/views/shared/_flash_messages.html.slim +14 -0
  8. data/app/views/shared/_header.html.slim +17 -13
  9. data/app/views/shared/_sidebar.html.slim +9 -8
  10. data/config/webpack/environment.js +5 -1
  11. data/lib/generators/crud/crud_generator.rb +4 -4
  12. data/lib/generators/material_admin/material_admin_generator.rb +16 -9
  13. data/lib/material_admin/version.rb +1 -1
  14. data/vendor/javascript/packs/admin.js +18 -12
  15. data/vendor/javascript/packs/admin_style.js +5 -3
  16. data/vendor/javascript/src/stylesheets/admin/shared/common.scss +39 -2
  17. data/vendor/javascript/src/stylesheets/admin/shared/override.scss +62 -0
  18. data/vendor/javascript/src/stylesheets/shared/override.scss +0 -4
  19. data/vendor/rails_material_admin/css/plugins/bootstrap.min.scss +6 -6
  20. data/vendor/rails_material_admin/css/style.scss +33462 -8272
  21. data/vendor/rails_material_admin/js/app.js +404 -0
  22. data/vendor/rails_material_admin/js/bootstrap.min.js +4 -4
  23. data/vendor/rails_material_admin/js/dashboard.js +15 -16
  24. data/vendor/rails_material_admin/js/perfect-scrollbar.jquery.min.js +1569 -0
  25. data/vendor/rails_material_admin/js/sidebarmenu.js +52 -337
  26. data/vendor/rails_material_admin/js/sweetalert2.min.js +2 -0
  27. data/vendor/rails_material_admin/material_admin.js +8 -7
  28. metadata +8 -6
  29. data/package.json +0 -23
  30. data/vendor/rails_material_admin/js/custom.js +0 -113
@@ -0,0 +1,1569 @@
1
+ /* perfect-scrollbar v0.6.10 */
2
+ (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
3
+ 'use strict';
4
+
5
+ var ps = require('../main')
6
+ , psInstances = require('../plugin/instances');
7
+
8
+ function mountJQuery(jQuery) {
9
+ jQuery.fn.perfectScrollbar = function (settingOrCommand) {
10
+ return this.each(function () {
11
+ if (typeof settingOrCommand === 'object' ||
12
+ typeof settingOrCommand === 'undefined') {
13
+ // If it's an object or none, initialize.
14
+ var settings = settingOrCommand;
15
+
16
+ if (!psInstances.get(this)) {
17
+ ps.initialize(this, settings);
18
+ }
19
+ } else {
20
+ // Unless, it may be a command.
21
+ var command = settingOrCommand;
22
+
23
+ if (command === 'update') {
24
+ ps.update(this);
25
+ } else if (command === 'destroy') {
26
+ ps.destroy(this);
27
+ }
28
+ }
29
+
30
+ return jQuery(this);
31
+ });
32
+ };
33
+ }
34
+
35
+ if (typeof define === 'function' && define.amd) {
36
+ // AMD. Register as an anonymous module.
37
+ define(['jquery'], mountJQuery);
38
+ } else {
39
+ var jq = window.jQuery ? window.jQuery : window.$;
40
+ if (typeof jq !== 'undefined') {
41
+ mountJQuery(jq);
42
+ }
43
+ }
44
+
45
+ module.exports = mountJQuery;
46
+
47
+ },{"../main":7,"../plugin/instances":18}],2:[function(require,module,exports){
48
+ 'use strict';
49
+
50
+ function oldAdd(element, className) {
51
+ var classes = element.className.split(' ');
52
+ if (classes.indexOf(className) < 0) {
53
+ classes.push(className);
54
+ }
55
+ element.className = classes.join(' ');
56
+ }
57
+
58
+ function oldRemove(element, className) {
59
+ var classes = element.className.split(' ');
60
+ var idx = classes.indexOf(className);
61
+ if (idx >= 0) {
62
+ classes.splice(idx, 1);
63
+ }
64
+ element.className = classes.join(' ');
65
+ }
66
+
67
+ exports.add = function (element, className) {
68
+ if (element.classList) {
69
+ element.classList.add(className);
70
+ } else {
71
+ oldAdd(element, className);
72
+ }
73
+ };
74
+
75
+ exports.remove = function (element, className) {
76
+ if (element.classList) {
77
+ element.classList.remove(className);
78
+ } else {
79
+ oldRemove(element, className);
80
+ }
81
+ };
82
+
83
+ exports.list = function (element) {
84
+ if (element.classList) {
85
+ return Array.prototype.slice.apply(element.classList);
86
+ } else {
87
+ return element.className.split(' ');
88
+ }
89
+ };
90
+
91
+ },{}],3:[function(require,module,exports){
92
+ 'use strict';
93
+
94
+ var DOM = {};
95
+
96
+ DOM.e = function (tagName, className) {
97
+ var element = document.createElement(tagName);
98
+ element.className = className;
99
+ return element;
100
+ };
101
+
102
+ DOM.appendTo = function (child, parent) {
103
+ parent.appendChild(child);
104
+ return child;
105
+ };
106
+
107
+ function cssGet(element, styleName) {
108
+ return window.getComputedStyle(element)[styleName];
109
+ }
110
+
111
+ function cssSet(element, styleName, styleValue) {
112
+ if (typeof styleValue === 'number') {
113
+ styleValue = styleValue.toString() + 'px';
114
+ }
115
+ element.style[styleName] = styleValue;
116
+ return element;
117
+ }
118
+
119
+ function cssMultiSet(element, obj) {
120
+ for (var key in obj) {
121
+ var val = obj[key];
122
+ if (typeof val === 'number') {
123
+ val = val.toString() + 'px';
124
+ }
125
+ element.style[key] = val;
126
+ }
127
+ return element;
128
+ }
129
+
130
+ DOM.css = function (element, styleNameOrObject, styleValue) {
131
+ if (typeof styleNameOrObject === 'object') {
132
+ // multiple set with object
133
+ return cssMultiSet(element, styleNameOrObject);
134
+ } else {
135
+ if (typeof styleValue === 'undefined') {
136
+ return cssGet(element, styleNameOrObject);
137
+ } else {
138
+ return cssSet(element, styleNameOrObject, styleValue);
139
+ }
140
+ }
141
+ };
142
+
143
+ DOM.matches = function (element, query) {
144
+ if (typeof element.matches !== 'undefined') {
145
+ return element.matches(query);
146
+ } else {
147
+ if (typeof element.matchesSelector !== 'undefined') {
148
+ return element.matchesSelector(query);
149
+ } else if (typeof element.webkitMatchesSelector !== 'undefined') {
150
+ return element.webkitMatchesSelector(query);
151
+ } else if (typeof element.mozMatchesSelector !== 'undefined') {
152
+ return element.mozMatchesSelector(query);
153
+ } else if (typeof element.msMatchesSelector !== 'undefined') {
154
+ return element.msMatchesSelector(query);
155
+ }
156
+ }
157
+ };
158
+
159
+ DOM.remove = function (element) {
160
+ if (typeof element.remove !== 'undefined') {
161
+ element.remove();
162
+ } else {
163
+ if (element.parentNode) {
164
+ element.parentNode.removeChild(element);
165
+ }
166
+ }
167
+ };
168
+
169
+ DOM.queryChildren = function (element, selector) {
170
+ return Array.prototype.filter.call(element.childNodes, function (child) {
171
+ return DOM.matches(child, selector);
172
+ });
173
+ };
174
+
175
+ module.exports = DOM;
176
+
177
+ },{}],4:[function(require,module,exports){
178
+ 'use strict';
179
+
180
+ var EventElement = function (element) {
181
+ this.element = element;
182
+ this.events = {};
183
+ };
184
+
185
+ EventElement.prototype.bind = function (eventName, handler) {
186
+ if (typeof this.events[eventName] === 'undefined') {
187
+ this.events[eventName] = [];
188
+ }
189
+ this.events[eventName].push(handler);
190
+ this.element.addEventListener(eventName, handler, false);
191
+ };
192
+
193
+ EventElement.prototype.unbind = function (eventName, handler) {
194
+ var isHandlerProvided = (typeof handler !== 'undefined');
195
+ this.events[eventName] = this.events[eventName].filter(function (hdlr) {
196
+ if (isHandlerProvided && hdlr !== handler) {
197
+ return true;
198
+ }
199
+ this.element.removeEventListener(eventName, hdlr, false);
200
+ return false;
201
+ }, this);
202
+ };
203
+
204
+ EventElement.prototype.unbindAll = function () {
205
+ for (var name in this.events) {
206
+ this.unbind(name);
207
+ }
208
+ };
209
+
210
+ var EventManager = function () {
211
+ this.eventElements = [];
212
+ };
213
+
214
+ EventManager.prototype.eventElement = function (element) {
215
+ var ee = this.eventElements.filter(function (eventElement) {
216
+ return eventElement.element === element;
217
+ })[0];
218
+ if (typeof ee === 'undefined') {
219
+ ee = new EventElement(element);
220
+ this.eventElements.push(ee);
221
+ }
222
+ return ee;
223
+ };
224
+
225
+ EventManager.prototype.bind = function (element, eventName, handler) {
226
+ this.eventElement(element).bind(eventName, handler);
227
+ };
228
+
229
+ EventManager.prototype.unbind = function (element, eventName, handler) {
230
+ this.eventElement(element).unbind(eventName, handler);
231
+ };
232
+
233
+ EventManager.prototype.unbindAll = function () {
234
+ for (var i = 0; i < this.eventElements.length; i++) {
235
+ this.eventElements[i].unbindAll();
236
+ }
237
+ };
238
+
239
+ EventManager.prototype.once = function (element, eventName, handler) {
240
+ var ee = this.eventElement(element);
241
+ var onceHandler = function (e) {
242
+ ee.unbind(eventName, onceHandler);
243
+ handler(e);
244
+ };
245
+ ee.bind(eventName, onceHandler);
246
+ };
247
+
248
+ module.exports = EventManager;
249
+
250
+ },{}],5:[function(require,module,exports){
251
+ 'use strict';
252
+
253
+ module.exports = (function () {
254
+ function s4() {
255
+ return Math.floor((1 + Math.random()) * 0x10000)
256
+ .toString(16)
257
+ .substring(1);
258
+ }
259
+ return function () {
260
+ return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
261
+ s4() + '-' + s4() + s4() + s4();
262
+ };
263
+ })();
264
+
265
+ },{}],6:[function(require,module,exports){
266
+ 'use strict';
267
+
268
+ var cls = require('./class')
269
+ , d = require('./dom');
270
+
271
+ exports.toInt = function (x) {
272
+ return parseInt(x, 10) || 0;
273
+ };
274
+
275
+ exports.clone = function (obj) {
276
+ if (obj === null) {
277
+ return null;
278
+ } else if (typeof obj === 'object') {
279
+ var result = {};
280
+ for (var key in obj) {
281
+ result[key] = this.clone(obj[key]);
282
+ }
283
+ return result;
284
+ } else {
285
+ return obj;
286
+ }
287
+ };
288
+
289
+ exports.extend = function (original, source) {
290
+ var result = this.clone(original);
291
+ for (var key in source) {
292
+ result[key] = this.clone(source[key]);
293
+ }
294
+ return result;
295
+ };
296
+
297
+ exports.isEditable = function (el) {
298
+ return d.matches(el, "input,[contenteditable]") ||
299
+ d.matches(el, "select,[contenteditable]") ||
300
+ d.matches(el, "textarea,[contenteditable]") ||
301
+ d.matches(el, "button,[contenteditable]");
302
+ };
303
+
304
+ exports.removePsClasses = function (element) {
305
+ var clsList = cls.list(element);
306
+ for (var i = 0; i < clsList.length; i++) {
307
+ var className = clsList[i];
308
+ if (className.indexOf('ps-') === 0) {
309
+ cls.remove(element, className);
310
+ }
311
+ }
312
+ };
313
+
314
+ exports.outerWidth = function (element) {
315
+ return this.toInt(d.css(element, 'width')) +
316
+ this.toInt(d.css(element, 'paddingLeft')) +
317
+ this.toInt(d.css(element, 'paddingRight')) +
318
+ this.toInt(d.css(element, 'borderLeftWidth')) +
319
+ this.toInt(d.css(element, 'borderRightWidth'));
320
+ };
321
+
322
+ exports.startScrolling = function (element, axis) {
323
+ cls.add(element, 'ps-in-scrolling');
324
+ if (typeof axis !== 'undefined') {
325
+ cls.add(element, 'ps-' + axis);
326
+ } else {
327
+ cls.add(element, 'ps-x');
328
+ cls.add(element, 'ps-y');
329
+ }
330
+ };
331
+
332
+ exports.stopScrolling = function (element, axis) {
333
+ cls.remove(element, 'ps-in-scrolling');
334
+ if (typeof axis !== 'undefined') {
335
+ cls.remove(element, 'ps-' + axis);
336
+ } else {
337
+ cls.remove(element, 'ps-x');
338
+ cls.remove(element, 'ps-y');
339
+ }
340
+ };
341
+
342
+ exports.env = {
343
+ isWebKit: 'WebkitAppearance' in document.documentElement.style,
344
+ supportsTouch: (('ontouchstart' in window) || window.DocumentTouch && document instanceof window.DocumentTouch),
345
+ supportsIePointer: window.navigator.msMaxTouchPoints !== null
346
+ };
347
+
348
+ },{"./class":2,"./dom":3}],7:[function(require,module,exports){
349
+ 'use strict';
350
+
351
+ var destroy = require('./plugin/destroy')
352
+ , initialize = require('./plugin/initialize')
353
+ , update = require('./plugin/update');
354
+
355
+ module.exports = {
356
+ initialize: initialize,
357
+ update: update,
358
+ destroy: destroy
359
+ };
360
+
361
+ },{"./plugin/destroy":9,"./plugin/initialize":17,"./plugin/update":21}],8:[function(require,module,exports){
362
+ 'use strict';
363
+
364
+ module.exports = {
365
+ maxScrollbarLength: null,
366
+ minScrollbarLength: null,
367
+ scrollXMarginOffset: 0,
368
+ scrollYMarginOffset: 0,
369
+ stopPropagationOnClick: true,
370
+ suppressScrollX: false,
371
+ suppressScrollY: false,
372
+ swipePropagation: true,
373
+ useBothWheelAxes: false,
374
+ useKeyboard: true,
375
+ useSelectionScroll: false,
376
+ wheelPropagation: false,
377
+ wheelSpeed: 1,
378
+ theme: 'default'
379
+ };
380
+
381
+ },{}],9:[function(require,module,exports){
382
+ 'use strict';
383
+
384
+ var d = require('../lib/dom')
385
+ , h = require('../lib/helper')
386
+ , instances = require('./instances');
387
+
388
+ module.exports = function (element) {
389
+ var i = instances.get(element);
390
+
391
+ if (!i) {
392
+ return;
393
+ }
394
+
395
+ i.event.unbindAll();
396
+ d.remove(i.scrollbarX);
397
+ d.remove(i.scrollbarY);
398
+ d.remove(i.scrollbarXRail);
399
+ d.remove(i.scrollbarYRail);
400
+ h.removePsClasses(element);
401
+
402
+ instances.remove(element);
403
+ };
404
+
405
+ },{"../lib/dom":3,"../lib/helper":6,"./instances":18}],10:[function(require,module,exports){
406
+ 'use strict';
407
+
408
+ var h = require('../../lib/helper')
409
+ , instances = require('../instances')
410
+ , updateGeometry = require('../update-geometry')
411
+ , updateScroll = require('../update-scroll');
412
+
413
+ function bindClickRailHandler(element, i) {
414
+ function pageOffset(el) {
415
+ return el.getBoundingClientRect();
416
+ }
417
+ var stopPropagation = window.Event.prototype.stopPropagation.bind;
418
+
419
+ if (i.settings.stopPropagationOnClick) {
420
+ i.event.bind(i.scrollbarY, 'click', stopPropagation);
421
+ }
422
+ i.event.bind(i.scrollbarYRail, 'click', function (e) {
423
+ var halfOfScrollbarLength = h.toInt(i.scrollbarYHeight / 2);
424
+ var positionTop = i.railYRatio * (e.pageY - window.pageYOffset - pageOffset(i.scrollbarYRail).top - halfOfScrollbarLength);
425
+ var maxPositionTop = i.railYRatio * (i.railYHeight - i.scrollbarYHeight);
426
+ var positionRatio = positionTop / maxPositionTop;
427
+
428
+ if (positionRatio < 0) {
429
+ positionRatio = 0;
430
+ } else if (positionRatio > 1) {
431
+ positionRatio = 1;
432
+ }
433
+
434
+ updateScroll(element, 'top', (i.contentHeight - i.containerHeight) * positionRatio);
435
+ updateGeometry(element);
436
+
437
+ e.stopPropagation();
438
+ });
439
+
440
+ if (i.settings.stopPropagationOnClick) {
441
+ i.event.bind(i.scrollbarX, 'click', stopPropagation);
442
+ }
443
+ i.event.bind(i.scrollbarXRail, 'click', function (e) {
444
+ var halfOfScrollbarLength = h.toInt(i.scrollbarXWidth / 2);
445
+ var positionLeft = i.railXRatio * (e.pageX - window.pageXOffset - pageOffset(i.scrollbarXRail).left - halfOfScrollbarLength);
446
+ var maxPositionLeft = i.railXRatio * (i.railXWidth - i.scrollbarXWidth);
447
+ var positionRatio = positionLeft / maxPositionLeft;
448
+
449
+ if (positionRatio < 0) {
450
+ positionRatio = 0;
451
+ } else if (positionRatio > 1) {
452
+ positionRatio = 1;
453
+ }
454
+
455
+ updateScroll(element, 'left', ((i.contentWidth - i.containerWidth) * positionRatio) - i.negativeScrollAdjustment);
456
+ updateGeometry(element);
457
+
458
+ e.stopPropagation();
459
+ });
460
+ }
461
+
462
+ module.exports = function (element) {
463
+ var i = instances.get(element);
464
+ bindClickRailHandler(element, i);
465
+ };
466
+
467
+ },{"../../lib/helper":6,"../instances":18,"../update-geometry":19,"../update-scroll":20}],11:[function(require,module,exports){
468
+ 'use strict';
469
+
470
+ var d = require('../../lib/dom')
471
+ , h = require('../../lib/helper')
472
+ , instances = require('../instances')
473
+ , updateGeometry = require('../update-geometry')
474
+ , updateScroll = require('../update-scroll');
475
+
476
+ function bindMouseScrollXHandler(element, i) {
477
+ var currentLeft = null;
478
+ var currentPageX = null;
479
+
480
+ function updateScrollLeft(deltaX) {
481
+ var newLeft = currentLeft + (deltaX * i.railXRatio);
482
+ var maxLeft = Math.max(0, i.scrollbarXRail.getBoundingClientRect().left) + (i.railXRatio * (i.railXWidth - i.scrollbarXWidth));
483
+
484
+ if (newLeft < 0) {
485
+ i.scrollbarXLeft = 0;
486
+ } else if (newLeft > maxLeft) {
487
+ i.scrollbarXLeft = maxLeft;
488
+ } else {
489
+ i.scrollbarXLeft = newLeft;
490
+ }
491
+
492
+ var scrollLeft = h.toInt(i.scrollbarXLeft * (i.contentWidth - i.containerWidth) / (i.containerWidth - (i.railXRatio * i.scrollbarXWidth))) - i.negativeScrollAdjustment;
493
+ updateScroll(element, 'left', scrollLeft);
494
+ }
495
+
496
+ var mouseMoveHandler = function (e) {
497
+ updateScrollLeft(e.pageX - currentPageX);
498
+ updateGeometry(element);
499
+ e.stopPropagation();
500
+ e.preventDefault();
501
+ };
502
+
503
+ var mouseUpHandler = function () {
504
+ h.stopScrolling(element, 'x');
505
+ i.event.unbind(i.ownerDocument, 'mousemove', mouseMoveHandler);
506
+ };
507
+
508
+ i.event.bind(i.scrollbarX, 'mousedown', function (e) {
509
+ currentPageX = e.pageX;
510
+ currentLeft = h.toInt(d.css(i.scrollbarX, 'left')) * i.railXRatio;
511
+ h.startScrolling(element, 'x');
512
+
513
+ i.event.bind(i.ownerDocument, 'mousemove', mouseMoveHandler);
514
+ i.event.once(i.ownerDocument, 'mouseup', mouseUpHandler);
515
+
516
+ e.stopPropagation();
517
+ e.preventDefault();
518
+ });
519
+ }
520
+
521
+ function bindMouseScrollYHandler(element, i) {
522
+ var currentTop = null;
523
+ var currentPageY = null;
524
+
525
+ function updateScrollTop(deltaY) {
526
+ var newTop = currentTop + (deltaY * i.railYRatio);
527
+ var maxTop = Math.max(0, i.scrollbarYRail.getBoundingClientRect().top) + (i.railYRatio * (i.railYHeight - i.scrollbarYHeight));
528
+
529
+ if (newTop < 0) {
530
+ i.scrollbarYTop = 0;
531
+ } else if (newTop > maxTop) {
532
+ i.scrollbarYTop = maxTop;
533
+ } else {
534
+ i.scrollbarYTop = newTop;
535
+ }
536
+
537
+ var scrollTop = h.toInt(i.scrollbarYTop * (i.contentHeight - i.containerHeight) / (i.containerHeight - (i.railYRatio * i.scrollbarYHeight)));
538
+ updateScroll(element, 'top', scrollTop);
539
+ }
540
+
541
+ var mouseMoveHandler = function (e) {
542
+ updateScrollTop(e.pageY - currentPageY);
543
+ updateGeometry(element);
544
+ e.stopPropagation();
545
+ e.preventDefault();
546
+ };
547
+
548
+ var mouseUpHandler = function () {
549
+ h.stopScrolling(element, 'y');
550
+ i.event.unbind(i.ownerDocument, 'mousemove', mouseMoveHandler);
551
+ };
552
+
553
+ i.event.bind(i.scrollbarY, 'mousedown', function (e) {
554
+ currentPageY = e.pageY;
555
+ currentTop = h.toInt(d.css(i.scrollbarY, 'top')) * i.railYRatio;
556
+ h.startScrolling(element, 'y');
557
+
558
+ i.event.bind(i.ownerDocument, 'mousemove', mouseMoveHandler);
559
+ i.event.once(i.ownerDocument, 'mouseup', mouseUpHandler);
560
+
561
+ e.stopPropagation();
562
+ e.preventDefault();
563
+ });
564
+ }
565
+
566
+ module.exports = function (element) {
567
+ var i = instances.get(element);
568
+ bindMouseScrollXHandler(element, i);
569
+ bindMouseScrollYHandler(element, i);
570
+ };
571
+
572
+ },{"../../lib/dom":3,"../../lib/helper":6,"../instances":18,"../update-geometry":19,"../update-scroll":20}],12:[function(require,module,exports){
573
+ 'use strict';
574
+
575
+ var h = require('../../lib/helper')
576
+ , d = require('../../lib/dom')
577
+ , instances = require('../instances')
578
+ , updateGeometry = require('../update-geometry')
579
+ , updateScroll = require('../update-scroll');
580
+
581
+ function bindKeyboardHandler(element, i) {
582
+ var hovered = false;
583
+ i.event.bind(element, 'mouseenter', function () {
584
+ hovered = true;
585
+ });
586
+ i.event.bind(element, 'mouseleave', function () {
587
+ hovered = false;
588
+ });
589
+
590
+ var shouldPrevent = false;
591
+ function shouldPreventDefault(deltaX, deltaY) {
592
+ var scrollTop = element.scrollTop;
593
+ if (deltaX === 0) {
594
+ if (!i.scrollbarYActive) {
595
+ return false;
596
+ }
597
+ if ((scrollTop === 0 && deltaY > 0) || (scrollTop >= i.contentHeight - i.containerHeight && deltaY < 0)) {
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 ((scrollLeft === 0 && deltaX < 0) || (scrollLeft >= i.contentWidth - i.containerWidth && deltaX > 0)) {
608
+ return !i.settings.wheelPropagation;
609
+ }
610
+ }
611
+ return true;
612
+ }
613
+
614
+ i.event.bind(i.ownerDocument, 'keydown', function (e) {
615
+ if (e.isDefaultPrevented && e.isDefaultPrevented()) {
616
+ return;
617
+ }
618
+
619
+ var focused = d.matches(i.scrollbarX, ':focus') ||
620
+ d.matches(i.scrollbarY, ':focus');
621
+
622
+ if (!hovered && !focused) {
623
+ return;
624
+ }
625
+
626
+ var activeElement = document.activeElement ? document.activeElement : i.ownerDocument.activeElement;
627
+ if (activeElement) {
628
+ // go deeper if element is a webcomponent
629
+ while (activeElement.shadowRoot) {
630
+ activeElement = activeElement.shadowRoot.activeElement;
631
+ }
632
+ if (h.isEditable(activeElement)) {
633
+ return;
634
+ }
635
+ }
636
+
637
+ var deltaX = 0;
638
+ var deltaY = 0;
639
+
640
+ switch (e.which) {
641
+ case 37: // left
642
+ deltaX = -30;
643
+ break;
644
+ case 38: // up
645
+ deltaY = 30;
646
+ break;
647
+ case 39: // right
648
+ deltaX = 30;
649
+ break;
650
+ case 40: // down
651
+ deltaY = -30;
652
+ break;
653
+ case 33: // page up
654
+ deltaY = 90;
655
+ break;
656
+ case 32: // space bar
657
+ if (e.shiftKey) {
658
+ deltaY = 90;
659
+ } else {
660
+ deltaY = -90;
661
+ }
662
+ break;
663
+ case 34: // page down
664
+ deltaY = -90;
665
+ break;
666
+ case 35: // end
667
+ if (e.ctrlKey) {
668
+ deltaY = -i.contentHeight;
669
+ } else {
670
+ deltaY = -i.containerHeight;
671
+ }
672
+ break;
673
+ case 36: // home
674
+ if (e.ctrlKey) {
675
+ deltaY = element.scrollTop;
676
+ } else {
677
+ deltaY = i.containerHeight;
678
+ }
679
+ break;
680
+ default:
681
+ return;
682
+ }
683
+
684
+ updateScroll(element, 'top', element.scrollTop - deltaY);
685
+ updateScroll(element, 'left', element.scrollLeft + deltaX);
686
+ updateGeometry(element);
687
+
688
+ shouldPrevent = shouldPreventDefault(deltaX, deltaY);
689
+ if (shouldPrevent) {
690
+ e.preventDefault();
691
+ }
692
+ });
693
+ }
694
+
695
+ module.exports = function (element) {
696
+ var i = instances.get(element);
697
+ bindKeyboardHandler(element, i);
698
+ };
699
+
700
+ },{"../../lib/dom":3,"../../lib/helper":6,"../instances":18,"../update-geometry":19,"../update-scroll":20}],13:[function(require,module,exports){
701
+ 'use strict';
702
+
703
+ var instances = require('../instances')
704
+ , updateGeometry = require('../update-geometry')
705
+ , updateScroll = require('../update-scroll');
706
+
707
+ function bindMouseWheelHandler(element, i) {
708
+ var shouldPrevent = false;
709
+
710
+ function shouldPreventDefault(deltaX, deltaY) {
711
+ var scrollTop = element.scrollTop;
712
+ if (deltaX === 0) {
713
+ if (!i.scrollbarYActive) {
714
+ return false;
715
+ }
716
+ if ((scrollTop === 0 && deltaY > 0) || (scrollTop >= i.contentHeight - i.containerHeight && deltaY < 0)) {
717
+ return !i.settings.wheelPropagation;
718
+ }
719
+ }
720
+
721
+ var scrollLeft = element.scrollLeft;
722
+ if (deltaY === 0) {
723
+ if (!i.scrollbarXActive) {
724
+ return false;
725
+ }
726
+ if ((scrollLeft === 0 && deltaX < 0) || (scrollLeft >= i.contentWidth - i.containerWidth && deltaX > 0)) {
727
+ return !i.settings.wheelPropagation;
728
+ }
729
+ }
730
+ return true;
731
+ }
732
+
733
+ function getDeltaFromEvent(e) {
734
+ var deltaX = e.deltaX;
735
+ var deltaY = -1 * e.deltaY;
736
+
737
+ if (typeof deltaX === "undefined" || typeof deltaY === "undefined") {
738
+ // OS X Safari
739
+ deltaX = -1 * e.wheelDeltaX / 6;
740
+ deltaY = e.wheelDeltaY / 6;
741
+ }
742
+
743
+ if (e.deltaMode && e.deltaMode === 1) {
744
+ // Firefox in deltaMode 1: Line scrolling
745
+ deltaX *= 10;
746
+ deltaY *= 10;
747
+ }
748
+
749
+ if (deltaX !== deltaX && deltaY !== deltaY/* NaN checks */) {
750
+ // IE in some mouse drivers
751
+ deltaX = 0;
752
+ deltaY = e.wheelDelta;
753
+ }
754
+
755
+ return [deltaX, deltaY];
756
+ }
757
+
758
+ function shouldBeConsumedByTextarea(deltaX, deltaY) {
759
+ var hoveredTextarea = element.querySelector('textarea:hover');
760
+ if (hoveredTextarea) {
761
+ var maxScrollTop = hoveredTextarea.scrollHeight - hoveredTextarea.clientHeight;
762
+ if (maxScrollTop > 0) {
763
+ if (!(hoveredTextarea.scrollTop === 0 && deltaY > 0) &&
764
+ !(hoveredTextarea.scrollTop === maxScrollTop && deltaY < 0)) {
765
+ return true;
766
+ }
767
+ }
768
+ var maxScrollLeft = hoveredTextarea.scrollLeft - hoveredTextarea.clientWidth;
769
+ if (maxScrollLeft > 0) {
770
+ if (!(hoveredTextarea.scrollLeft === 0 && deltaX < 0) &&
771
+ !(hoveredTextarea.scrollLeft === maxScrollLeft && deltaX > 0)) {
772
+ return true;
773
+ }
774
+ }
775
+ }
776
+ return false;
777
+ }
778
+
779
+ function mousewheelHandler(e) {
780
+ var delta = getDeltaFromEvent(e);
781
+
782
+ var deltaX = delta[0];
783
+ var deltaY = delta[1];
784
+
785
+ if (shouldBeConsumedByTextarea(deltaX, deltaY)) {
786
+ return;
787
+ }
788
+
789
+ shouldPrevent = false;
790
+ if (!i.settings.useBothWheelAxes) {
791
+ // deltaX will only be used for horizontal scrolling and deltaY will
792
+ // only be used for vertical scrolling - this is the default
793
+ updateScroll(element, 'top', element.scrollTop - (deltaY * i.settings.wheelSpeed));
794
+ updateScroll(element, 'left', element.scrollLeft + (deltaX * i.settings.wheelSpeed));
795
+ } else if (i.scrollbarYActive && !i.scrollbarXActive) {
796
+ // only vertical scrollbar is active and useBothWheelAxes option is
797
+ // active, so let's scroll vertical bar using both mouse wheel axes
798
+ if (deltaY) {
799
+ updateScroll(element, 'top', element.scrollTop - (deltaY * i.settings.wheelSpeed));
800
+ } else {
801
+ updateScroll(element, 'top', element.scrollTop + (deltaX * i.settings.wheelSpeed));
802
+ }
803
+ shouldPrevent = true;
804
+ } else if (i.scrollbarXActive && !i.scrollbarYActive) {
805
+ // useBothWheelAxes and only horizontal bar is active, so use both
806
+ // wheel axes for horizontal bar
807
+ if (deltaX) {
808
+ updateScroll(element, 'left', element.scrollLeft + (deltaX * i.settings.wheelSpeed));
809
+ } else {
810
+ updateScroll(element, 'left', element.scrollLeft - (deltaY * i.settings.wheelSpeed));
811
+ }
812
+ shouldPrevent = true;
813
+ }
814
+
815
+ updateGeometry(element);
816
+
817
+ shouldPrevent = (shouldPrevent || shouldPreventDefault(deltaX, deltaY));
818
+ if (shouldPrevent) {
819
+ e.stopPropagation();
820
+ e.preventDefault();
821
+ }
822
+ }
823
+
824
+ if (typeof window.onwheel !== "undefined") {
825
+ i.event.bind(element, 'wheel', mousewheelHandler);
826
+ } else if (typeof window.onmousewheel !== "undefined") {
827
+ i.event.bind(element, 'mousewheel', mousewheelHandler);
828
+ }
829
+ }
830
+
831
+ module.exports = function (element) {
832
+ var i = instances.get(element);
833
+ bindMouseWheelHandler(element, i);
834
+ };
835
+
836
+ },{"../instances":18,"../update-geometry":19,"../update-scroll":20}],14:[function(require,module,exports){
837
+ 'use strict';
838
+
839
+ var instances = require('../instances')
840
+ , updateGeometry = require('../update-geometry');
841
+
842
+ function bindNativeScrollHandler(element, i) {
843
+ i.event.bind(element, 'scroll', function () {
844
+ updateGeometry(element);
845
+ });
846
+ }
847
+
848
+ module.exports = function (element) {
849
+ var i = instances.get(element);
850
+ bindNativeScrollHandler(element, i);
851
+ };
852
+
853
+ },{"../instances":18,"../update-geometry":19}],15:[function(require,module,exports){
854
+ 'use strict';
855
+
856
+ var h = require('../../lib/helper')
857
+ , instances = require('../instances')
858
+ , updateGeometry = require('../update-geometry')
859
+ , updateScroll = require('../update-scroll');
860
+
861
+ function bindSelectionHandler(element, i) {
862
+ function getRangeNode() {
863
+ var selection = window.getSelection ? window.getSelection() :
864
+ document.getSelection ? document.getSelection() : '';
865
+ if (selection.toString().length === 0) {
866
+ return null;
867
+ } else {
868
+ return selection.getRangeAt(0).commonAncestorContainer;
869
+ }
870
+ }
871
+
872
+ var scrollingLoop = null;
873
+ var scrollDiff = {top: 0, left: 0};
874
+ function startScrolling() {
875
+ if (!scrollingLoop) {
876
+ scrollingLoop = setInterval(function () {
877
+ if (!instances.get(element)) {
878
+ clearInterval(scrollingLoop);
879
+ return;
880
+ }
881
+
882
+ updateScroll(element, 'top', element.scrollTop + scrollDiff.top);
883
+ updateScroll(element, 'left', element.scrollLeft + scrollDiff.left);
884
+ updateGeometry(element);
885
+ }, 50); // every .1 sec
886
+ }
887
+ }
888
+ function stopScrolling() {
889
+ if (scrollingLoop) {
890
+ clearInterval(scrollingLoop);
891
+ scrollingLoop = null;
892
+ }
893
+ h.stopScrolling(element);
894
+ }
895
+
896
+ var isSelected = false;
897
+ i.event.bind(i.ownerDocument, 'selectionchange', function () {
898
+ if (element.contains(getRangeNode())) {
899
+ isSelected = true;
900
+ } else {
901
+ isSelected = false;
902
+ stopScrolling();
903
+ }
904
+ });
905
+ i.event.bind(window, 'mouseup', function () {
906
+ if (isSelected) {
907
+ isSelected = false;
908
+ stopScrolling();
909
+ }
910
+ });
911
+
912
+ i.event.bind(window, 'mousemove', function (e) {
913
+ if (isSelected) {
914
+ var mousePosition = {x: e.pageX, y: e.pageY};
915
+ var containerGeometry = {
916
+ left: element.offsetLeft,
917
+ right: element.offsetLeft + element.offsetWidth,
918
+ top: element.offsetTop,
919
+ bottom: element.offsetTop + element.offsetHeight
920
+ };
921
+
922
+ if (mousePosition.x < containerGeometry.left + 3) {
923
+ scrollDiff.left = -5;
924
+ h.startScrolling(element, 'x');
925
+ } else if (mousePosition.x > containerGeometry.right - 3) {
926
+ scrollDiff.left = 5;
927
+ h.startScrolling(element, 'x');
928
+ } else {
929
+ scrollDiff.left = 0;
930
+ }
931
+
932
+ if (mousePosition.y < containerGeometry.top + 3) {
933
+ if (containerGeometry.top + 3 - mousePosition.y < 5) {
934
+ scrollDiff.top = -5;
935
+ } else {
936
+ scrollDiff.top = -20;
937
+ }
938
+ h.startScrolling(element, 'y');
939
+ } else if (mousePosition.y > containerGeometry.bottom - 3) {
940
+ if (mousePosition.y - containerGeometry.bottom + 3 < 5) {
941
+ scrollDiff.top = 5;
942
+ } else {
943
+ scrollDiff.top = 20;
944
+ }
945
+ h.startScrolling(element, 'y');
946
+ } else {
947
+ scrollDiff.top = 0;
948
+ }
949
+
950
+ if (scrollDiff.top === 0 && scrollDiff.left === 0) {
951
+ stopScrolling();
952
+ } else {
953
+ startScrolling();
954
+ }
955
+ }
956
+ });
957
+ }
958
+
959
+ module.exports = function (element) {
960
+ var i = instances.get(element);
961
+ bindSelectionHandler(element, i);
962
+ };
963
+
964
+ },{"../../lib/helper":6,"../instances":18,"../update-geometry":19,"../update-scroll":20}],16:[function(require,module,exports){
965
+ 'use strict';
966
+
967
+ var instances = require('../instances')
968
+ , updateGeometry = require('../update-geometry')
969
+ , updateScroll = require('../update-scroll');
970
+
971
+ function bindTouchHandler(element, i, supportsTouch, supportsIePointer) {
972
+ function shouldPreventDefault(deltaX, deltaY) {
973
+ var scrollTop = element.scrollTop;
974
+ var scrollLeft = element.scrollLeft;
975
+ var magnitudeX = Math.abs(deltaX);
976
+ var magnitudeY = Math.abs(deltaY);
977
+
978
+ if (magnitudeY > magnitudeX) {
979
+ // user is perhaps trying to swipe up/down the page
980
+
981
+ if (((deltaY < 0) && (scrollTop === i.contentHeight - i.containerHeight)) ||
982
+ ((deltaY > 0) && (scrollTop === 0))) {
983
+ return !i.settings.swipePropagation;
984
+ }
985
+ } else if (magnitudeX > magnitudeY) {
986
+ // user is perhaps trying to swipe left/right across the page
987
+
988
+ if (((deltaX < 0) && (scrollLeft === i.contentWidth - i.containerWidth)) ||
989
+ ((deltaX > 0) && (scrollLeft === 0))) {
990
+ return !i.settings.swipePropagation;
991
+ }
992
+ }
993
+
994
+ return true;
995
+ }
996
+
997
+ function applyTouchMove(differenceX, differenceY) {
998
+ updateScroll(element, 'top', element.scrollTop - differenceY);
999
+ updateScroll(element, 'left', element.scrollLeft - differenceX);
1000
+
1001
+ updateGeometry(element);
1002
+ }
1003
+
1004
+ var startOffset = {};
1005
+ var startTime = 0;
1006
+ var speed = {};
1007
+ var easingLoop = null;
1008
+ var inGlobalTouch = false;
1009
+ var inLocalTouch = false;
1010
+
1011
+ function globalTouchStart() {
1012
+ inGlobalTouch = true;
1013
+ }
1014
+ function globalTouchEnd() {
1015
+ inGlobalTouch = false;
1016
+ }
1017
+
1018
+ function getTouch(e) {
1019
+ if (e.targetTouches) {
1020
+ return e.targetTouches[0];
1021
+ } else {
1022
+ // Maybe IE pointer
1023
+ return e;
1024
+ }
1025
+ }
1026
+ function shouldHandle(e) {
1027
+ if (e.targetTouches && e.targetTouches.length === 1) {
1028
+ return true;
1029
+ }
1030
+ if (e.pointerType && e.pointerType !== 'mouse' && e.pointerType !== e.MSPOINTER_TYPE_MOUSE) {
1031
+ return true;
1032
+ }
1033
+ return false;
1034
+ }
1035
+ function touchStart(e) {
1036
+ if (shouldHandle(e)) {
1037
+ inLocalTouch = true;
1038
+
1039
+ var touch = getTouch(e);
1040
+
1041
+ startOffset.pageX = touch.pageX;
1042
+ startOffset.pageY = touch.pageY;
1043
+
1044
+ startTime = (new Date()).getTime();
1045
+
1046
+ if (easingLoop !== null) {
1047
+ clearInterval(easingLoop);
1048
+ }
1049
+
1050
+ e.stopPropagation();
1051
+ }
1052
+ }
1053
+ function touchMove(e) {
1054
+ if (!inGlobalTouch && inLocalTouch && shouldHandle(e)) {
1055
+ var touch = getTouch(e);
1056
+
1057
+ var currentOffset = {pageX: touch.pageX, pageY: touch.pageY};
1058
+
1059
+ var differenceX = currentOffset.pageX - startOffset.pageX;
1060
+ var differenceY = currentOffset.pageY - startOffset.pageY;
1061
+
1062
+ applyTouchMove(differenceX, differenceY);
1063
+ startOffset = currentOffset;
1064
+
1065
+ var currentTime = (new Date()).getTime();
1066
+
1067
+ var timeGap = currentTime - startTime;
1068
+ if (timeGap > 0) {
1069
+ speed.x = differenceX / timeGap;
1070
+ speed.y = differenceY / timeGap;
1071
+ startTime = currentTime;
1072
+ }
1073
+
1074
+ if (shouldPreventDefault(differenceX, differenceY)) {
1075
+ e.stopPropagation();
1076
+ e.preventDefault();
1077
+ }
1078
+ }
1079
+ }
1080
+ function touchEnd() {
1081
+ if (!inGlobalTouch && inLocalTouch) {
1082
+ inLocalTouch = false;
1083
+
1084
+ clearInterval(easingLoop);
1085
+ easingLoop = setInterval(function () {
1086
+ if (!instances.get(element)) {
1087
+ clearInterval(easingLoop);
1088
+ return;
1089
+ }
1090
+
1091
+ if (Math.abs(speed.x) < 0.01 && Math.abs(speed.y) < 0.01) {
1092
+ clearInterval(easingLoop);
1093
+ return;
1094
+ }
1095
+
1096
+ applyTouchMove(speed.x * 30, speed.y * 30);
1097
+
1098
+ speed.x *= 0.8;
1099
+ speed.y *= 0.8;
1100
+ }, 10);
1101
+ }
1102
+ }
1103
+
1104
+ if (supportsTouch) {
1105
+ i.event.bind(window, 'touchstart', globalTouchStart);
1106
+ i.event.bind(window, 'touchend', globalTouchEnd);
1107
+ i.event.bind(element, 'touchstart', touchStart);
1108
+ i.event.bind(element, 'touchmove', touchMove);
1109
+ i.event.bind(element, 'touchend', touchEnd);
1110
+ }
1111
+
1112
+ if (supportsIePointer) {
1113
+ if (window.PointerEvent) {
1114
+ i.event.bind(window, 'pointerdown', globalTouchStart);
1115
+ i.event.bind(window, 'pointerup', globalTouchEnd);
1116
+ i.event.bind(element, 'pointerdown', touchStart);
1117
+ i.event.bind(element, 'pointermove', touchMove);
1118
+ i.event.bind(element, 'pointerup', touchEnd);
1119
+ } else if (window.MSPointerEvent) {
1120
+ i.event.bind(window, 'MSPointerDown', globalTouchStart);
1121
+ i.event.bind(window, 'MSPointerUp', globalTouchEnd);
1122
+ i.event.bind(element, 'MSPointerDown', touchStart);
1123
+ i.event.bind(element, 'MSPointerMove', touchMove);
1124
+ i.event.bind(element, 'MSPointerUp', touchEnd);
1125
+ }
1126
+ }
1127
+ }
1128
+
1129
+ module.exports = function (element, supportsTouch, supportsIePointer) {
1130
+ var i = instances.get(element);
1131
+ bindTouchHandler(element, i, supportsTouch, supportsIePointer);
1132
+ };
1133
+
1134
+ },{"../instances":18,"../update-geometry":19,"../update-scroll":20}],17:[function(require,module,exports){
1135
+ 'use strict';
1136
+
1137
+ var cls = require('../lib/class')
1138
+ , h = require('../lib/helper')
1139
+ , instances = require('./instances')
1140
+ , updateGeometry = require('./update-geometry');
1141
+
1142
+ // Handlers
1143
+ var clickRailHandler = require('./handler/click-rail')
1144
+ , dragScrollbarHandler = require('./handler/drag-scrollbar')
1145
+ , keyboardHandler = require('./handler/keyboard')
1146
+ , mouseWheelHandler = require('./handler/mouse-wheel')
1147
+ , nativeScrollHandler = require('./handler/native-scroll')
1148
+ , selectionHandler = require('./handler/selection')
1149
+ , touchHandler = require('./handler/touch');
1150
+
1151
+ module.exports = function (element, userSettings) {
1152
+ userSettings = typeof userSettings === 'object' ? userSettings : {};
1153
+
1154
+ cls.add(element, 'ps-container');
1155
+
1156
+ // Create a plugin instance.
1157
+ var i = instances.add(element);
1158
+
1159
+ i.settings = h.extend(i.settings, userSettings);
1160
+ cls.add(element, 'ps-theme-' + i.settings.theme);
1161
+
1162
+ clickRailHandler(element);
1163
+ dragScrollbarHandler(element);
1164
+ mouseWheelHandler(element);
1165
+ nativeScrollHandler(element);
1166
+
1167
+ if (i.settings.useSelectionScroll) {
1168
+ selectionHandler(element);
1169
+ }
1170
+
1171
+ if (h.env.supportsTouch || h.env.supportsIePointer) {
1172
+ touchHandler(element, h.env.supportsTouch, h.env.supportsIePointer);
1173
+ }
1174
+ if (i.settings.useKeyboard) {
1175
+ keyboardHandler(element);
1176
+ }
1177
+
1178
+ updateGeometry(element);
1179
+ };
1180
+
1181
+ },{"../lib/class":2,"../lib/helper":6,"./handler/click-rail":10,"./handler/drag-scrollbar":11,"./handler/keyboard":12,"./handler/mouse-wheel":13,"./handler/native-scroll":14,"./handler/selection":15,"./handler/touch":16,"./instances":18,"./update-geometry":19}],18:[function(require,module,exports){
1182
+ 'use strict';
1183
+
1184
+ var cls = require('../lib/class')
1185
+ , d = require('../lib/dom')
1186
+ , defaultSettings = require('./default-setting')
1187
+ , EventManager = require('../lib/event-manager')
1188
+ , guid = require('../lib/guid')
1189
+ , h = require('../lib/helper');
1190
+
1191
+ var instances = {};
1192
+
1193
+ function Instance(element) {
1194
+ var i = this;
1195
+
1196
+ i.settings = h.clone(defaultSettings);
1197
+ i.containerWidth = null;
1198
+ i.containerHeight = null;
1199
+ i.contentWidth = null;
1200
+ i.contentHeight = null;
1201
+
1202
+ i.isRtl = d.css(element, 'direction') === "rtl";
1203
+ i.isNegativeScroll = (function () {
1204
+ var originalScrollLeft = element.scrollLeft;
1205
+ var result = null;
1206
+ element.scrollLeft = -1;
1207
+ result = element.scrollLeft < 0;
1208
+ element.scrollLeft = originalScrollLeft;
1209
+ return result;
1210
+ })();
1211
+ i.negativeScrollAdjustment = i.isNegativeScroll ? element.scrollWidth - element.clientWidth : 0;
1212
+ i.event = new EventManager();
1213
+ i.ownerDocument = element.ownerDocument || document;
1214
+
1215
+ function focus() {
1216
+ cls.add(element, 'ps-focus');
1217
+ }
1218
+
1219
+ function blur() {
1220
+ cls.remove(element, 'ps-focus');
1221
+ }
1222
+
1223
+ i.scrollbarXRail = d.appendTo(d.e('div', 'ps-scrollbar-x-rail'), element);
1224
+ i.scrollbarX = d.appendTo(d.e('div', 'ps-scrollbar-x'), i.scrollbarXRail);
1225
+ i.scrollbarX.setAttribute('tabindex', 0);
1226
+ i.event.bind(i.scrollbarX, 'focus', focus);
1227
+ i.event.bind(i.scrollbarX, 'blur', blur);
1228
+ i.scrollbarXActive = null;
1229
+ i.scrollbarXWidth = null;
1230
+ i.scrollbarXLeft = null;
1231
+ i.scrollbarXBottom = h.toInt(d.css(i.scrollbarXRail, 'bottom'));
1232
+ i.isScrollbarXUsingBottom = i.scrollbarXBottom === i.scrollbarXBottom; // !isNaN
1233
+ i.scrollbarXTop = i.isScrollbarXUsingBottom ? null : h.toInt(d.css(i.scrollbarXRail, 'top'));
1234
+ i.railBorderXWidth = h.toInt(d.css(i.scrollbarXRail, 'borderLeftWidth')) + h.toInt(d.css(i.scrollbarXRail, 'borderRightWidth'));
1235
+ // Set rail to display:block to calculate margins
1236
+ d.css(i.scrollbarXRail, 'display', 'block');
1237
+ i.railXMarginWidth = h.toInt(d.css(i.scrollbarXRail, 'marginLeft')) + h.toInt(d.css(i.scrollbarXRail, 'marginRight'));
1238
+ d.css(i.scrollbarXRail, 'display', '');
1239
+ i.railXWidth = null;
1240
+ i.railXRatio = null;
1241
+
1242
+ i.scrollbarYRail = d.appendTo(d.e('div', 'ps-scrollbar-y-rail'), element);
1243
+ i.scrollbarY = d.appendTo(d.e('div', 'ps-scrollbar-y'), i.scrollbarYRail);
1244
+ i.scrollbarY.setAttribute('tabindex', 0);
1245
+ i.event.bind(i.scrollbarY, 'focus', focus);
1246
+ i.event.bind(i.scrollbarY, 'blur', blur);
1247
+ i.scrollbarYActive = null;
1248
+ i.scrollbarYHeight = null;
1249
+ i.scrollbarYTop = null;
1250
+ i.scrollbarYRight = h.toInt(d.css(i.scrollbarYRail, 'right'));
1251
+ i.isScrollbarYUsingRight = i.scrollbarYRight === i.scrollbarYRight; // !isNaN
1252
+ i.scrollbarYLeft = i.isScrollbarYUsingRight ? null : h.toInt(d.css(i.scrollbarYRail, 'left'));
1253
+ i.scrollbarYOuterWidth = i.isRtl ? h.outerWidth(i.scrollbarY) : null;
1254
+ i.railBorderYWidth = h.toInt(d.css(i.scrollbarYRail, 'borderTopWidth')) + h.toInt(d.css(i.scrollbarYRail, 'borderBottomWidth'));
1255
+ d.css(i.scrollbarYRail, 'display', 'block');
1256
+ i.railYMarginHeight = h.toInt(d.css(i.scrollbarYRail, 'marginTop')) + h.toInt(d.css(i.scrollbarYRail, 'marginBottom'));
1257
+ d.css(i.scrollbarYRail, 'display', '');
1258
+ i.railYHeight = null;
1259
+ i.railYRatio = null;
1260
+ }
1261
+
1262
+ function getId(element) {
1263
+ if (typeof element.dataset === 'undefined') {
1264
+ return element.getAttribute('data-ps-id');
1265
+ } else {
1266
+ return element.dataset.psId;
1267
+ }
1268
+ }
1269
+
1270
+ function setId(element, id) {
1271
+ if (typeof element.dataset === 'undefined') {
1272
+ element.setAttribute('data-ps-id', id);
1273
+ } else {
1274
+ element.dataset.psId = id;
1275
+ }
1276
+ }
1277
+
1278
+ function removeId(element) {
1279
+ if (typeof element.dataset === 'undefined') {
1280
+ element.removeAttribute('data-ps-id');
1281
+ } else {
1282
+ delete element.dataset.psId;
1283
+ }
1284
+ }
1285
+
1286
+ exports.add = function (element) {
1287
+ var newId = guid();
1288
+ setId(element, newId);
1289
+ instances[newId] = new Instance(element);
1290
+ return instances[newId];
1291
+ };
1292
+
1293
+ exports.remove = function (element) {
1294
+ delete instances[getId(element)];
1295
+ removeId(element);
1296
+ };
1297
+
1298
+ exports.get = function (element) {
1299
+ return instances[getId(element)];
1300
+ };
1301
+
1302
+ },{"../lib/class":2,"../lib/dom":3,"../lib/event-manager":4,"../lib/guid":5,"../lib/helper":6,"./default-setting":8}],19:[function(require,module,exports){
1303
+ 'use strict';
1304
+
1305
+ var cls = require('../lib/class')
1306
+ , d = require('../lib/dom')
1307
+ , h = require('../lib/helper')
1308
+ , instances = require('./instances')
1309
+ , updateScroll = require('./update-scroll');
1310
+
1311
+ function getThumbSize(i, thumbSize) {
1312
+ if (i.settings.minScrollbarLength) {
1313
+ thumbSize = Math.max(thumbSize, i.settings.minScrollbarLength);
1314
+ }
1315
+ if (i.settings.maxScrollbarLength) {
1316
+ thumbSize = Math.min(thumbSize, i.settings.maxScrollbarLength);
1317
+ }
1318
+ return thumbSize;
1319
+ }
1320
+
1321
+ function updateCss(element, i) {
1322
+ var xRailOffset = {width: i.railXWidth};
1323
+ if (i.isRtl) {
1324
+ xRailOffset.left = i.negativeScrollAdjustment + element.scrollLeft + i.containerWidth - i.contentWidth;
1325
+ } else {
1326
+ xRailOffset.left = element.scrollLeft;
1327
+ }
1328
+ if (i.isScrollbarXUsingBottom) {
1329
+ xRailOffset.bottom = i.scrollbarXBottom - element.scrollTop;
1330
+ } else {
1331
+ xRailOffset.top = i.scrollbarXTop + element.scrollTop;
1332
+ }
1333
+ d.css(i.scrollbarXRail, xRailOffset);
1334
+
1335
+ var yRailOffset = {top: element.scrollTop, height: i.railYHeight};
1336
+ if (i.isScrollbarYUsingRight) {
1337
+ if (i.isRtl) {
1338
+ yRailOffset.right = i.contentWidth - (i.negativeScrollAdjustment + element.scrollLeft) - i.scrollbarYRight - i.scrollbarYOuterWidth;
1339
+ } else {
1340
+ yRailOffset.right = i.scrollbarYRight - element.scrollLeft;
1341
+ }
1342
+ } else {
1343
+ if (i.isRtl) {
1344
+ yRailOffset.left = i.negativeScrollAdjustment + element.scrollLeft + i.containerWidth * 2 - i.contentWidth - i.scrollbarYLeft - i.scrollbarYOuterWidth;
1345
+ } else {
1346
+ yRailOffset.left = i.scrollbarYLeft + element.scrollLeft;
1347
+ }
1348
+ }
1349
+ d.css(i.scrollbarYRail, yRailOffset);
1350
+
1351
+ d.css(i.scrollbarX, {left: i.scrollbarXLeft, width: i.scrollbarXWidth - i.railBorderXWidth});
1352
+ d.css(i.scrollbarY, {top: i.scrollbarYTop, height: i.scrollbarYHeight - i.railBorderYWidth});
1353
+ }
1354
+
1355
+ module.exports = function (element) {
1356
+ var i = instances.get(element);
1357
+
1358
+ i.containerWidth = element.clientWidth;
1359
+ i.containerHeight = element.clientHeight;
1360
+ i.contentWidth = element.scrollWidth;
1361
+ i.contentHeight = element.scrollHeight;
1362
+
1363
+ var existingRails;
1364
+ if (!element.contains(i.scrollbarXRail)) {
1365
+ existingRails = d.queryChildren(element, '.ps-scrollbar-x-rail');
1366
+ if (existingRails.length > 0) {
1367
+ existingRails.forEach(function (rail) {
1368
+ d.remove(rail);
1369
+ });
1370
+ }
1371
+ d.appendTo(i.scrollbarXRail, element);
1372
+ }
1373
+ if (!element.contains(i.scrollbarYRail)) {
1374
+ existingRails = d.queryChildren(element, '.ps-scrollbar-y-rail');
1375
+ if (existingRails.length > 0) {
1376
+ existingRails.forEach(function (rail) {
1377
+ d.remove(rail);
1378
+ });
1379
+ }
1380
+ d.appendTo(i.scrollbarYRail, element);
1381
+ }
1382
+
1383
+ if (!i.settings.suppressScrollX && i.containerWidth + i.settings.scrollXMarginOffset < i.contentWidth) {
1384
+ i.scrollbarXActive = true;
1385
+ i.railXWidth = i.containerWidth - i.railXMarginWidth;
1386
+ i.railXRatio = i.containerWidth / i.railXWidth;
1387
+ i.scrollbarXWidth = getThumbSize(i, h.toInt(i.railXWidth * i.containerWidth / i.contentWidth));
1388
+ i.scrollbarXLeft = h.toInt((i.negativeScrollAdjustment + element.scrollLeft) * (i.railXWidth - i.scrollbarXWidth) / (i.contentWidth - i.containerWidth));
1389
+ } else {
1390
+ i.scrollbarXActive = false;
1391
+ }
1392
+
1393
+ if (!i.settings.suppressScrollY && i.containerHeight + i.settings.scrollYMarginOffset < i.contentHeight) {
1394
+ i.scrollbarYActive = true;
1395
+ i.railYHeight = i.containerHeight - i.railYMarginHeight;
1396
+ i.railYRatio = i.containerHeight / i.railYHeight;
1397
+ i.scrollbarYHeight = getThumbSize(i, h.toInt(i.railYHeight * i.containerHeight / i.contentHeight));
1398
+ i.scrollbarYTop = h.toInt(element.scrollTop * (i.railYHeight - i.scrollbarYHeight) / (i.contentHeight - i.containerHeight));
1399
+ } else {
1400
+ i.scrollbarYActive = false;
1401
+ }
1402
+
1403
+ if (i.scrollbarXLeft >= i.railXWidth - i.scrollbarXWidth) {
1404
+ i.scrollbarXLeft = i.railXWidth - i.scrollbarXWidth;
1405
+ }
1406
+ if (i.scrollbarYTop >= i.railYHeight - i.scrollbarYHeight) {
1407
+ i.scrollbarYTop = i.railYHeight - i.scrollbarYHeight;
1408
+ }
1409
+
1410
+ updateCss(element, i);
1411
+
1412
+ if (i.scrollbarXActive) {
1413
+ cls.add(element, 'ps-active-x');
1414
+ } else {
1415
+ cls.remove(element, 'ps-active-x');
1416
+ i.scrollbarXWidth = 0;
1417
+ i.scrollbarXLeft = 0;
1418
+ updateScroll(element, 'left', 0);
1419
+ }
1420
+ if (i.scrollbarYActive) {
1421
+ cls.add(element, 'ps-active-y');
1422
+ } else {
1423
+ cls.remove(element, 'ps-active-y');
1424
+ i.scrollbarYHeight = 0;
1425
+ i.scrollbarYTop = 0;
1426
+ updateScroll(element, 'top', 0);
1427
+ }
1428
+ };
1429
+
1430
+ },{"../lib/class":2,"../lib/dom":3,"../lib/helper":6,"./instances":18,"./update-scroll":20}],20:[function(require,module,exports){
1431
+ 'use strict';
1432
+
1433
+ var instances = require('./instances');
1434
+
1435
+ var upEvent = document.createEvent('Event')
1436
+ , downEvent = document.createEvent('Event')
1437
+ , leftEvent = document.createEvent('Event')
1438
+ , rightEvent = document.createEvent('Event')
1439
+ , yEvent = document.createEvent('Event')
1440
+ , xEvent = document.createEvent('Event')
1441
+ , xStartEvent = document.createEvent('Event')
1442
+ , xEndEvent = document.createEvent('Event')
1443
+ , yStartEvent = document.createEvent('Event')
1444
+ , yEndEvent = document.createEvent('Event')
1445
+ , lastTop
1446
+ , lastLeft;
1447
+
1448
+ upEvent.initEvent('ps-scroll-up', true, true);
1449
+ downEvent.initEvent('ps-scroll-down', true, true);
1450
+ leftEvent.initEvent('ps-scroll-left', true, true);
1451
+ rightEvent.initEvent('ps-scroll-right', true, true);
1452
+ yEvent.initEvent('ps-scroll-y', true, true);
1453
+ xEvent.initEvent('ps-scroll-x', true, true);
1454
+ xStartEvent.initEvent('ps-x-reach-start', true, true);
1455
+ xEndEvent.initEvent('ps-x-reach-end', true, true);
1456
+ yStartEvent.initEvent('ps-y-reach-start', true, true);
1457
+ yEndEvent.initEvent('ps-y-reach-end', true, true);
1458
+
1459
+ module.exports = function (element, axis, value) {
1460
+ if (typeof element === 'undefined') {
1461
+ throw 'You must provide an element to the update-scroll function';
1462
+ }
1463
+
1464
+ if (typeof axis === 'undefined') {
1465
+ throw 'You must provide an axis to the update-scroll function';
1466
+ }
1467
+
1468
+ if (typeof value === 'undefined') {
1469
+ throw 'You must provide a value to the update-scroll function';
1470
+ }
1471
+
1472
+ if (axis === 'top' && value <= 0) {
1473
+ element.scrollTop = value = 0; // don't allow negative scroll
1474
+ element.dispatchEvent(yStartEvent);
1475
+ }
1476
+
1477
+ if (axis === 'left' && value <= 0) {
1478
+ element.scrollLeft = value = 0; // don't allow negative scroll
1479
+ element.dispatchEvent(xStartEvent);
1480
+ }
1481
+
1482
+ var i = instances.get(element);
1483
+
1484
+ if (axis === 'top' && value >= i.contentHeight - i.containerHeight) {
1485
+ element.scrollTop = value = i.contentHeight - i.containerHeight; // don't allow scroll past container
1486
+ element.dispatchEvent(yEndEvent);
1487
+ }
1488
+
1489
+ if (axis === 'left' && value >= i.contentWidth - i.containerWidth) {
1490
+ element.scrollLeft = value = i.contentWidth - i.containerWidth; // don't allow scroll past container
1491
+ element.dispatchEvent(xEndEvent);
1492
+ }
1493
+
1494
+ if (!lastTop) {
1495
+ lastTop = element.scrollTop;
1496
+ }
1497
+
1498
+ if (!lastLeft) {
1499
+ lastLeft = element.scrollLeft;
1500
+ }
1501
+
1502
+ if (axis === 'top' && value < lastTop) {
1503
+ element.dispatchEvent(upEvent);
1504
+ }
1505
+
1506
+ if (axis === 'top' && value > lastTop) {
1507
+ element.dispatchEvent(downEvent);
1508
+ }
1509
+
1510
+ if (axis === 'left' && value < lastLeft) {
1511
+ element.dispatchEvent(leftEvent);
1512
+ }
1513
+
1514
+ if (axis === 'left' && value > lastLeft) {
1515
+ element.dispatchEvent(rightEvent);
1516
+ }
1517
+
1518
+ if (axis === 'top') {
1519
+ element.scrollTop = lastTop = value;
1520
+ element.dispatchEvent(yEvent);
1521
+ }
1522
+
1523
+ if (axis === 'left') {
1524
+ element.scrollLeft = lastLeft = value;
1525
+ element.dispatchEvent(xEvent);
1526
+ }
1527
+
1528
+ };
1529
+
1530
+ },{"./instances":18}],21:[function(require,module,exports){
1531
+ 'use strict';
1532
+
1533
+ var d = require('../lib/dom')
1534
+ , h = require('../lib/helper')
1535
+ , instances = require('./instances')
1536
+ , updateGeometry = require('./update-geometry')
1537
+ , updateScroll = require('./update-scroll');
1538
+
1539
+ module.exports = function (element) {
1540
+ var i = instances.get(element);
1541
+
1542
+ if (!i) {
1543
+ return;
1544
+ }
1545
+
1546
+ // Recalcuate negative scrollLeft adjustment
1547
+ i.negativeScrollAdjustment = i.isNegativeScroll ? element.scrollWidth - element.clientWidth : 0;
1548
+
1549
+ // Recalculate rail margins
1550
+ d.css(i.scrollbarXRail, 'display', 'block');
1551
+ d.css(i.scrollbarYRail, 'display', 'block');
1552
+ i.railXMarginWidth = h.toInt(d.css(i.scrollbarXRail, 'marginLeft')) + h.toInt(d.css(i.scrollbarXRail, 'marginRight'));
1553
+ i.railYMarginHeight = h.toInt(d.css(i.scrollbarYRail, 'marginTop')) + h.toInt(d.css(i.scrollbarYRail, 'marginBottom'));
1554
+
1555
+ // Hide scrollbars not to affect scrollWidth and scrollHeight
1556
+ d.css(i.scrollbarXRail, 'display', 'none');
1557
+ d.css(i.scrollbarYRail, 'display', 'none');
1558
+
1559
+ updateGeometry(element);
1560
+
1561
+ // Update top/left scroll to trigger events
1562
+ updateScroll(element, 'top', element.scrollTop);
1563
+ updateScroll(element, 'left', element.scrollLeft);
1564
+
1565
+ d.css(i.scrollbarXRail, 'display', '');
1566
+ d.css(i.scrollbarYRail, 'display', '');
1567
+ };
1568
+
1569
+ },{"../lib/dom":3,"../lib/helper":6,"./instances":18,"./update-geometry":19,"./update-scroll":20}]},{},[1]);