perfect-scrollbar.js 45 KB

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