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