123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680 |
- /**
- * simplebar - v6.3.2
- * Scrollbars, simpler.
- * https://grsmto.github.io/simplebar/
- *
- * Made by Adrien Denat from a fork by Jonathan Nicol
- * Under MIT License
- */
- var SimpleBar = (function () {
- 'use strict';
- /******************************************************************************
- Copyright (c) Microsoft Corporation.
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted.
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
- ***************************************************************************** */
- /* global Reflect, Promise */
- var extendStatics = function(d, b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
- function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- function __extends(d, b) {
- if (typeof b !== "function" && b !== null)
- throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- }
- /**
- * Checks if `value` is the
- * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
- * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an object, else `false`.
- * @example
- *
- * _.isObject({});
- * // => true
- *
- * _.isObject([1, 2, 3]);
- * // => true
- *
- * _.isObject(_.noop);
- * // => true
- *
- * _.isObject(null);
- * // => false
- */
- function isObject(value) {
- var type = typeof value;
- return value != null && (type == 'object' || type == 'function');
- }
- /** Detect free variable `global` from Node.js. */
- var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
- var freeGlobal$1 = freeGlobal;
- /** Detect free variable `self`. */
- var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
- /** Used as a reference to the global object. */
- var root = freeGlobal$1 || freeSelf || Function('return this')();
- var root$1 = root;
- /**
- * Gets the timestamp of the number of milliseconds that have elapsed since
- * the Unix epoch (1 January 1970 00:00:00 UTC).
- *
- * @static
- * @memberOf _
- * @since 2.4.0
- * @category Date
- * @returns {number} Returns the timestamp.
- * @example
- *
- * _.defer(function(stamp) {
- * console.log(_.now() - stamp);
- * }, _.now());
- * // => Logs the number of milliseconds it took for the deferred invocation.
- */
- var now = function() {
- return root$1.Date.now();
- };
- var now$1 = now;
- /** Used to match a single whitespace character. */
- var reWhitespace = /\s/;
- /**
- * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace
- * character of `string`.
- *
- * @private
- * @param {string} string The string to inspect.
- * @returns {number} Returns the index of the last non-whitespace character.
- */
- function trimmedEndIndex(string) {
- var index = string.length;
- while (index-- && reWhitespace.test(string.charAt(index))) {}
- return index;
- }
- /** Used to match leading whitespace. */
- var reTrimStart = /^\s+/;
- /**
- * The base implementation of `_.trim`.
- *
- * @private
- * @param {string} string The string to trim.
- * @returns {string} Returns the trimmed string.
- */
- function baseTrim(string) {
- return string
- ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')
- : string;
- }
- /** Built-in value references. */
- var Symbol = root$1.Symbol;
- var Symbol$1 = Symbol;
- /** Used for built-in method references. */
- var objectProto$1 = Object.prototype;
- /** Used to check objects for own properties. */
- var hasOwnProperty = objectProto$1.hasOwnProperty;
- /**
- * Used to resolve the
- * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
- * of values.
- */
- var nativeObjectToString$1 = objectProto$1.toString;
- /** Built-in value references. */
- var symToStringTag$1 = Symbol$1 ? Symbol$1.toStringTag : undefined;
- /**
- * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
- *
- * @private
- * @param {*} value The value to query.
- * @returns {string} Returns the raw `toStringTag`.
- */
- function getRawTag(value) {
- var isOwn = hasOwnProperty.call(value, symToStringTag$1),
- tag = value[symToStringTag$1];
- try {
- value[symToStringTag$1] = undefined;
- var unmasked = true;
- } catch (e) {}
- var result = nativeObjectToString$1.call(value);
- if (unmasked) {
- if (isOwn) {
- value[symToStringTag$1] = tag;
- } else {
- delete value[symToStringTag$1];
- }
- }
- return result;
- }
- /** Used for built-in method references. */
- var objectProto = Object.prototype;
- /**
- * Used to resolve the
- * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
- * of values.
- */
- var nativeObjectToString = objectProto.toString;
- /**
- * Converts `value` to a string using `Object.prototype.toString`.
- *
- * @private
- * @param {*} value The value to convert.
- * @returns {string} Returns the converted string.
- */
- function objectToString(value) {
- return nativeObjectToString.call(value);
- }
- /** `Object#toString` result references. */
- var nullTag = '[object Null]',
- undefinedTag = '[object Undefined]';
- /** Built-in value references. */
- var symToStringTag = Symbol$1 ? Symbol$1.toStringTag : undefined;
- /**
- * The base implementation of `getTag` without fallbacks for buggy environments.
- *
- * @private
- * @param {*} value The value to query.
- * @returns {string} Returns the `toStringTag`.
- */
- function baseGetTag(value) {
- if (value == null) {
- return value === undefined ? undefinedTag : nullTag;
- }
- return (symToStringTag && symToStringTag in Object(value))
- ? getRawTag(value)
- : objectToString(value);
- }
- /**
- * Checks if `value` is object-like. A value is object-like if it's not `null`
- * and has a `typeof` result of "object".
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
- * @example
- *
- * _.isObjectLike({});
- * // => true
- *
- * _.isObjectLike([1, 2, 3]);
- * // => true
- *
- * _.isObjectLike(_.noop);
- * // => false
- *
- * _.isObjectLike(null);
- * // => false
- */
- function isObjectLike(value) {
- return value != null && typeof value == 'object';
- }
- /** `Object#toString` result references. */
- var symbolTag = '[object Symbol]';
- /**
- * Checks if `value` is classified as a `Symbol` primitive or object.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
- * @example
- *
- * _.isSymbol(Symbol.iterator);
- * // => true
- *
- * _.isSymbol('abc');
- * // => false
- */
- function isSymbol(value) {
- return typeof value == 'symbol' ||
- (isObjectLike(value) && baseGetTag(value) == symbolTag);
- }
- /** Used as references for various `Number` constants. */
- var NAN = 0 / 0;
- /** Used to detect bad signed hexadecimal string values. */
- var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
- /** Used to detect binary string values. */
- var reIsBinary = /^0b[01]+$/i;
- /** Used to detect octal string values. */
- var reIsOctal = /^0o[0-7]+$/i;
- /** Built-in method references without a dependency on `root`. */
- var freeParseInt = parseInt;
- /**
- * Converts `value` to a number.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to process.
- * @returns {number} Returns the number.
- * @example
- *
- * _.toNumber(3.2);
- * // => 3.2
- *
- * _.toNumber(Number.MIN_VALUE);
- * // => 5e-324
- *
- * _.toNumber(Infinity);
- * // => Infinity
- *
- * _.toNumber('3.2');
- * // => 3.2
- */
- function toNumber(value) {
- if (typeof value == 'number') {
- return value;
- }
- if (isSymbol(value)) {
- return NAN;
- }
- if (isObject(value)) {
- var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
- value = isObject(other) ? (other + '') : other;
- }
- if (typeof value != 'string') {
- return value === 0 ? value : +value;
- }
- value = baseTrim(value);
- var isBinary = reIsBinary.test(value);
- return (isBinary || reIsOctal.test(value))
- ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
- : (reIsBadHex.test(value) ? NAN : +value);
- }
- /** Error message constants. */
- var FUNC_ERROR_TEXT$1 = 'Expected a function';
- /* Built-in method references for those with the same name as other `lodash` methods. */
- var nativeMax = Math.max,
- nativeMin = Math.min;
- /**
- * Creates a debounced function that delays invoking `func` until after `wait`
- * milliseconds have elapsed since the last time the debounced function was
- * invoked. The debounced function comes with a `cancel` method to cancel
- * delayed `func` invocations and a `flush` method to immediately invoke them.
- * Provide `options` to indicate whether `func` should be invoked on the
- * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
- * with the last arguments provided to the debounced function. Subsequent
- * calls to the debounced function return the result of the last `func`
- * invocation.
- *
- * **Note:** If `leading` and `trailing` options are `true`, `func` is
- * invoked on the trailing edge of the timeout only if the debounced function
- * is invoked more than once during the `wait` timeout.
- *
- * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
- * until to the next tick, similar to `setTimeout` with a timeout of `0`.
- *
- * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
- * for details over the differences between `_.debounce` and `_.throttle`.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Function
- * @param {Function} func The function to debounce.
- * @param {number} [wait=0] The number of milliseconds to delay.
- * @param {Object} [options={}] The options object.
- * @param {boolean} [options.leading=false]
- * Specify invoking on the leading edge of the timeout.
- * @param {number} [options.maxWait]
- * The maximum time `func` is allowed to be delayed before it's invoked.
- * @param {boolean} [options.trailing=true]
- * Specify invoking on the trailing edge of the timeout.
- * @returns {Function} Returns the new debounced function.
- * @example
- *
- * // Avoid costly calculations while the window size is in flux.
- * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
- *
- * // Invoke `sendMail` when clicked, debouncing subsequent calls.
- * jQuery(element).on('click', _.debounce(sendMail, 300, {
- * 'leading': true,
- * 'trailing': false
- * }));
- *
- * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
- * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
- * var source = new EventSource('/stream');
- * jQuery(source).on('message', debounced);
- *
- * // Cancel the trailing debounced invocation.
- * jQuery(window).on('popstate', debounced.cancel);
- */
- function debounce(func, wait, options) {
- var lastArgs,
- lastThis,
- maxWait,
- result,
- timerId,
- lastCallTime,
- lastInvokeTime = 0,
- leading = false,
- maxing = false,
- trailing = true;
- if (typeof func != 'function') {
- throw new TypeError(FUNC_ERROR_TEXT$1);
- }
- wait = toNumber(wait) || 0;
- if (isObject(options)) {
- leading = !!options.leading;
- maxing = 'maxWait' in options;
- maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
- trailing = 'trailing' in options ? !!options.trailing : trailing;
- }
- function invokeFunc(time) {
- var args = lastArgs,
- thisArg = lastThis;
- lastArgs = lastThis = undefined;
- lastInvokeTime = time;
- result = func.apply(thisArg, args);
- return result;
- }
- function leadingEdge(time) {
- // Reset any `maxWait` timer.
- lastInvokeTime = time;
- // Start the timer for the trailing edge.
- timerId = setTimeout(timerExpired, wait);
- // Invoke the leading edge.
- return leading ? invokeFunc(time) : result;
- }
- function remainingWait(time) {
- var timeSinceLastCall = time - lastCallTime,
- timeSinceLastInvoke = time - lastInvokeTime,
- timeWaiting = wait - timeSinceLastCall;
- return maxing
- ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)
- : timeWaiting;
- }
- function shouldInvoke(time) {
- var timeSinceLastCall = time - lastCallTime,
- timeSinceLastInvoke = time - lastInvokeTime;
- // Either this is the first call, activity has stopped and we're at the
- // trailing edge, the system time has gone backwards and we're treating
- // it as the trailing edge, or we've hit the `maxWait` limit.
- return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
- (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
- }
- function timerExpired() {
- var time = now$1();
- if (shouldInvoke(time)) {
- return trailingEdge(time);
- }
- // Restart the timer.
- timerId = setTimeout(timerExpired, remainingWait(time));
- }
- function trailingEdge(time) {
- timerId = undefined;
- // Only invoke if we have `lastArgs` which means `func` has been
- // debounced at least once.
- if (trailing && lastArgs) {
- return invokeFunc(time);
- }
- lastArgs = lastThis = undefined;
- return result;
- }
- function cancel() {
- if (timerId !== undefined) {
- clearTimeout(timerId);
- }
- lastInvokeTime = 0;
- lastArgs = lastCallTime = lastThis = timerId = undefined;
- }
- function flush() {
- return timerId === undefined ? result : trailingEdge(now$1());
- }
- function debounced() {
- var time = now$1(),
- isInvoking = shouldInvoke(time);
- lastArgs = arguments;
- lastThis = this;
- lastCallTime = time;
- if (isInvoking) {
- if (timerId === undefined) {
- return leadingEdge(lastCallTime);
- }
- if (maxing) {
- // Handle invocations in a tight loop.
- clearTimeout(timerId);
- timerId = setTimeout(timerExpired, wait);
- return invokeFunc(lastCallTime);
- }
- }
- if (timerId === undefined) {
- timerId = setTimeout(timerExpired, wait);
- }
- return result;
- }
- debounced.cancel = cancel;
- debounced.flush = flush;
- return debounced;
- }
- /** Error message constants. */
- var FUNC_ERROR_TEXT = 'Expected a function';
- /**
- * Creates a throttled function that only invokes `func` at most once per
- * every `wait` milliseconds. The throttled function comes with a `cancel`
- * method to cancel delayed `func` invocations and a `flush` method to
- * immediately invoke them. Provide `options` to indicate whether `func`
- * should be invoked on the leading and/or trailing edge of the `wait`
- * timeout. The `func` is invoked with the last arguments provided to the
- * throttled function. Subsequent calls to the throttled function return the
- * result of the last `func` invocation.
- *
- * **Note:** If `leading` and `trailing` options are `true`, `func` is
- * invoked on the trailing edge of the timeout only if the throttled function
- * is invoked more than once during the `wait` timeout.
- *
- * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
- * until to the next tick, similar to `setTimeout` with a timeout of `0`.
- *
- * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
- * for details over the differences between `_.throttle` and `_.debounce`.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Function
- * @param {Function} func The function to throttle.
- * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
- * @param {Object} [options={}] The options object.
- * @param {boolean} [options.leading=true]
- * Specify invoking on the leading edge of the timeout.
- * @param {boolean} [options.trailing=true]
- * Specify invoking on the trailing edge of the timeout.
- * @returns {Function} Returns the new throttled function.
- * @example
- *
- * // Avoid excessively updating the position while scrolling.
- * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
- *
- * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
- * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
- * jQuery(element).on('click', throttled);
- *
- * // Cancel the trailing throttled invocation.
- * jQuery(window).on('popstate', throttled.cancel);
- */
- function throttle(func, wait, options) {
- var leading = true,
- trailing = true;
- if (typeof func != 'function') {
- throw new TypeError(FUNC_ERROR_TEXT);
- }
- if (isObject(options)) {
- leading = 'leading' in options ? !!options.leading : leading;
- trailing = 'trailing' in options ? !!options.trailing : trailing;
- }
- return debounce(func, wait, {
- 'leading': leading,
- 'maxWait': wait,
- 'trailing': trailing
- });
- }
- /**
- * simplebar-core - v1.3.2
- * Scrollbars, simpler.
- * https://grsmto.github.io/simplebar/
- *
- * Made by Adrien Denat from a fork by Jonathan Nicol
- * Under MIT License
- */
- /******************************************************************************
- Copyright (c) Microsoft Corporation.
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted.
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
- ***************************************************************************** */
- var __assign = function() {
- __assign = Object.assign || function __assign(t) {
- for (var s, i = 1, n = arguments.length; i < n; i++) {
- s = arguments[i];
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
- }
- return t;
- };
- return __assign.apply(this, arguments);
- };
- function getElementWindow$1(element) {
- if (!element ||
- !element.ownerDocument ||
- !element.ownerDocument.defaultView) {
- return window;
- }
- return element.ownerDocument.defaultView;
- }
- function getElementDocument$1(element) {
- if (!element || !element.ownerDocument) {
- return document;
- }
- return element.ownerDocument;
- }
- // Helper function to retrieve options from element attributes
- var getOptions$1 = function (obj) {
- var initialObj = {};
- var options = Array.prototype.reduce.call(obj, function (acc, attribute) {
- var option = attribute.name.match(/data-simplebar-(.+)/);
- if (option) {
- var key = option[1].replace(/\W+(.)/g, function (_, chr) { return chr.toUpperCase(); });
- switch (attribute.value) {
- case 'true':
- acc[key] = true;
- break;
- case 'false':
- acc[key] = false;
- break;
- case undefined:
- acc[key] = true;
- break;
- default:
- acc[key] = attribute.value;
- }
- }
- return acc;
- }, initialObj);
- return options;
- };
- function addClasses$1(el, classes) {
- var _a;
- if (!el)
- return;
- (_a = el.classList).add.apply(_a, classes.split(' '));
- }
- function removeClasses$1(el, classes) {
- if (!el)
- return;
- classes.split(' ').forEach(function (className) {
- el.classList.remove(className);
- });
- }
- function classNamesToQuery$1(classNames) {
- return ".".concat(classNames.split(' ').join('.'));
- }
- var canUseDOM$1 = !!(typeof window !== 'undefined' &&
- window.document &&
- window.document.createElement);
- var helpers = /*#__PURE__*/Object.freeze({
- __proto__: null,
- addClasses: addClasses$1,
- canUseDOM: canUseDOM$1,
- classNamesToQuery: classNamesToQuery$1,
- getElementDocument: getElementDocument$1,
- getElementWindow: getElementWindow$1,
- getOptions: getOptions$1,
- removeClasses: removeClasses$1
- });
- var cachedScrollbarWidth = null;
- var cachedDevicePixelRatio = null;
- if (canUseDOM$1) {
- window.addEventListener('resize', function () {
- if (cachedDevicePixelRatio !== window.devicePixelRatio) {
- cachedDevicePixelRatio = window.devicePixelRatio;
- cachedScrollbarWidth = null;
- }
- });
- }
- function scrollbarWidth() {
- if (cachedScrollbarWidth === null) {
- if (typeof document === 'undefined') {
- cachedScrollbarWidth = 0;
- return cachedScrollbarWidth;
- }
- var body = document.body;
- var box = document.createElement('div');
- box.classList.add('simplebar-hide-scrollbar');
- body.appendChild(box);
- var width = box.getBoundingClientRect().right;
- body.removeChild(box);
- cachedScrollbarWidth = width;
- }
- return cachedScrollbarWidth;
- }
- var getElementWindow = getElementWindow$1, getElementDocument = getElementDocument$1, getOptions$2 = getOptions$1, addClasses$2 = addClasses$1, removeClasses = removeClasses$1, classNamesToQuery = classNamesToQuery$1;
- var SimpleBarCore = /** @class */ (function () {
- function SimpleBarCore(element, options) {
- if (options === void 0) { options = {}; }
- var _this = this;
- this.removePreventClickId = null;
- this.minScrollbarWidth = 20;
- this.stopScrollDelay = 175;
- this.isScrolling = false;
- this.isMouseEntering = false;
- this.isDragging = false;
- this.scrollXTicking = false;
- this.scrollYTicking = false;
- this.wrapperEl = null;
- this.contentWrapperEl = null;
- this.contentEl = null;
- this.offsetEl = null;
- this.maskEl = null;
- this.placeholderEl = null;
- this.heightAutoObserverWrapperEl = null;
- this.heightAutoObserverEl = null;
- this.rtlHelpers = null;
- this.scrollbarWidth = 0;
- this.resizeObserver = null;
- this.mutationObserver = null;
- this.elStyles = null;
- this.isRtl = null;
- this.mouseX = 0;
- this.mouseY = 0;
- this.onMouseMove = function () { };
- this.onWindowResize = function () { };
- this.onStopScrolling = function () { };
- this.onMouseEntered = function () { };
- /**
- * On scroll event handling
- */
- this.onScroll = function () {
- var elWindow = getElementWindow(_this.el);
- if (!_this.scrollXTicking) {
- elWindow.requestAnimationFrame(_this.scrollX);
- _this.scrollXTicking = true;
- }
- if (!_this.scrollYTicking) {
- elWindow.requestAnimationFrame(_this.scrollY);
- _this.scrollYTicking = true;
- }
- if (!_this.isScrolling) {
- _this.isScrolling = true;
- addClasses$2(_this.el, _this.classNames.scrolling);
- }
- _this.showScrollbar('x');
- _this.showScrollbar('y');
- _this.onStopScrolling();
- };
- this.scrollX = function () {
- if (_this.axis.x.isOverflowing) {
- _this.positionScrollbar('x');
- }
- _this.scrollXTicking = false;
- };
- this.scrollY = function () {
- if (_this.axis.y.isOverflowing) {
- _this.positionScrollbar('y');
- }
- _this.scrollYTicking = false;
- };
- this._onStopScrolling = function () {
- removeClasses(_this.el, _this.classNames.scrolling);
- if (_this.options.autoHide) {
- _this.hideScrollbar('x');
- _this.hideScrollbar('y');
- }
- _this.isScrolling = false;
- };
- this.onMouseEnter = function () {
- if (!_this.isMouseEntering) {
- addClasses$2(_this.el, _this.classNames.mouseEntered);
- _this.showScrollbar('x');
- _this.showScrollbar('y');
- _this.isMouseEntering = true;
- }
- _this.onMouseEntered();
- };
- this._onMouseEntered = function () {
- removeClasses(_this.el, _this.classNames.mouseEntered);
- if (_this.options.autoHide) {
- _this.hideScrollbar('x');
- _this.hideScrollbar('y');
- }
- _this.isMouseEntering = false;
- };
- this._onMouseMove = function (e) {
- _this.mouseX = e.clientX;
- _this.mouseY = e.clientY;
- if (_this.axis.x.isOverflowing || _this.axis.x.forceVisible) {
- _this.onMouseMoveForAxis('x');
- }
- if (_this.axis.y.isOverflowing || _this.axis.y.forceVisible) {
- _this.onMouseMoveForAxis('y');
- }
- };
- this.onMouseLeave = function () {
- _this.onMouseMove.cancel();
- if (_this.axis.x.isOverflowing || _this.axis.x.forceVisible) {
- _this.onMouseLeaveForAxis('x');
- }
- if (_this.axis.y.isOverflowing || _this.axis.y.forceVisible) {
- _this.onMouseLeaveForAxis('y');
- }
- _this.mouseX = -1;
- _this.mouseY = -1;
- };
- this._onWindowResize = function () {
- // Recalculate scrollbarWidth in case it's a zoom
- _this.scrollbarWidth = _this.getScrollbarWidth();
- _this.hideNativeScrollbar();
- };
- this.onPointerEvent = function (e) {
- if (!_this.axis.x.track.el ||
- !_this.axis.y.track.el ||
- !_this.axis.x.scrollbar.el ||
- !_this.axis.y.scrollbar.el)
- return;
- var isWithinTrackXBounds, isWithinTrackYBounds;
- _this.axis.x.track.rect = _this.axis.x.track.el.getBoundingClientRect();
- _this.axis.y.track.rect = _this.axis.y.track.el.getBoundingClientRect();
- if (_this.axis.x.isOverflowing || _this.axis.x.forceVisible) {
- isWithinTrackXBounds = _this.isWithinBounds(_this.axis.x.track.rect);
- }
- if (_this.axis.y.isOverflowing || _this.axis.y.forceVisible) {
- isWithinTrackYBounds = _this.isWithinBounds(_this.axis.y.track.rect);
- }
- // If any pointer event is called on the scrollbar
- if (isWithinTrackXBounds || isWithinTrackYBounds) {
- // Prevent event leaking
- e.stopPropagation();
- if (e.type === 'pointerdown' && e.pointerType !== 'touch') {
- if (isWithinTrackXBounds) {
- _this.axis.x.scrollbar.rect =
- _this.axis.x.scrollbar.el.getBoundingClientRect();
- if (_this.isWithinBounds(_this.axis.x.scrollbar.rect)) {
- _this.onDragStart(e, 'x');
- }
- else {
- _this.onTrackClick(e, 'x');
- }
- }
- if (isWithinTrackYBounds) {
- _this.axis.y.scrollbar.rect =
- _this.axis.y.scrollbar.el.getBoundingClientRect();
- if (_this.isWithinBounds(_this.axis.y.scrollbar.rect)) {
- _this.onDragStart(e, 'y');
- }
- else {
- _this.onTrackClick(e, 'y');
- }
- }
- }
- }
- };
- /**
- * Drag scrollbar handle
- */
- this.drag = function (e) {
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
- if (!_this.draggedAxis || !_this.contentWrapperEl)
- return;
- var eventOffset;
- var track = _this.axis[_this.draggedAxis].track;
- var trackSize = (_b = (_a = track.rect) === null || _a === void 0 ? void 0 : _a[_this.axis[_this.draggedAxis].sizeAttr]) !== null && _b !== void 0 ? _b : 0;
- var scrollbar = _this.axis[_this.draggedAxis].scrollbar;
- var contentSize = (_d = (_c = _this.contentWrapperEl) === null || _c === void 0 ? void 0 : _c[_this.axis[_this.draggedAxis].scrollSizeAttr]) !== null && _d !== void 0 ? _d : 0;
- var hostSize = parseInt((_f = (_e = _this.elStyles) === null || _e === void 0 ? void 0 : _e[_this.axis[_this.draggedAxis].sizeAttr]) !== null && _f !== void 0 ? _f : '0px', 10);
- e.preventDefault();
- e.stopPropagation();
- if (_this.draggedAxis === 'y') {
- eventOffset = e.pageY;
- }
- else {
- eventOffset = e.pageX;
- }
- // Calculate how far the user's mouse is from the top/left of the scrollbar (minus the dragOffset).
- var dragPos = eventOffset -
- ((_h = (_g = track.rect) === null || _g === void 0 ? void 0 : _g[_this.axis[_this.draggedAxis].offsetAttr]) !== null && _h !== void 0 ? _h : 0) -
- _this.axis[_this.draggedAxis].dragOffset;
- dragPos =
- _this.draggedAxis === 'x' && _this.isRtl
- ? ((_k = (_j = track.rect) === null || _j === void 0 ? void 0 : _j[_this.axis[_this.draggedAxis].sizeAttr]) !== null && _k !== void 0 ? _k : 0) -
- scrollbar.size -
- dragPos
- : dragPos;
- // Convert the mouse position into a percentage of the scrollbar height/width.
- var dragPerc = dragPos / (trackSize - scrollbar.size);
- // Scroll the content by the same percentage.
- var scrollPos = dragPerc * (contentSize - hostSize);
- // Fix browsers inconsistency on RTL
- if (_this.draggedAxis === 'x' && _this.isRtl) {
- scrollPos = ((_l = SimpleBarCore.getRtlHelpers()) === null || _l === void 0 ? void 0 : _l.isScrollingToNegative)
- ? -scrollPos
- : scrollPos;
- }
- _this.contentWrapperEl[_this.axis[_this.draggedAxis].scrollOffsetAttr] =
- scrollPos;
- };
- /**
- * End scroll handle drag
- */
- this.onEndDrag = function (e) {
- _this.isDragging = false;
- var elDocument = getElementDocument(_this.el);
- var elWindow = getElementWindow(_this.el);
- e.preventDefault();
- e.stopPropagation();
- removeClasses(_this.el, _this.classNames.dragging);
- _this.onStopScrolling();
- elDocument.removeEventListener('mousemove', _this.drag, true);
- elDocument.removeEventListener('mouseup', _this.onEndDrag, true);
- _this.removePreventClickId = elWindow.setTimeout(function () {
- // Remove these asynchronously so we still suppress click events
- // generated simultaneously with mouseup.
- elDocument.removeEventListener('click', _this.preventClick, true);
- elDocument.removeEventListener('dblclick', _this.preventClick, true);
- _this.removePreventClickId = null;
- });
- };
- /**
- * Handler to ignore click events during drag
- */
- this.preventClick = function (e) {
- e.preventDefault();
- e.stopPropagation();
- };
- this.el = element;
- this.options = __assign(__assign({}, SimpleBarCore.defaultOptions), options);
- this.classNames = __assign(__assign({}, SimpleBarCore.defaultOptions.classNames), options.classNames);
- this.axis = {
- x: {
- scrollOffsetAttr: 'scrollLeft',
- sizeAttr: 'width',
- scrollSizeAttr: 'scrollWidth',
- offsetSizeAttr: 'offsetWidth',
- offsetAttr: 'left',
- overflowAttr: 'overflowX',
- dragOffset: 0,
- isOverflowing: true,
- forceVisible: false,
- track: { size: null, el: null, rect: null, isVisible: false },
- scrollbar: { size: null, el: null, rect: null, isVisible: false }
- },
- y: {
- scrollOffsetAttr: 'scrollTop',
- sizeAttr: 'height',
- scrollSizeAttr: 'scrollHeight',
- offsetSizeAttr: 'offsetHeight',
- offsetAttr: 'top',
- overflowAttr: 'overflowY',
- dragOffset: 0,
- isOverflowing: true,
- forceVisible: false,
- track: { size: null, el: null, rect: null, isVisible: false },
- scrollbar: { size: null, el: null, rect: null, isVisible: false }
- }
- };
- if (typeof this.el !== 'object' || !this.el.nodeName) {
- throw new Error("Argument passed to SimpleBar must be an HTML element instead of ".concat(this.el));
- }
- this.onMouseMove = throttle(this._onMouseMove, 64);
- this.onWindowResize = debounce(this._onWindowResize, 64, { leading: true });
- this.onStopScrolling = debounce(this._onStopScrolling, this.stopScrollDelay);
- this.onMouseEntered = debounce(this._onMouseEntered, this.stopScrollDelay);
- this.init();
- }
- /**
- * Helper to fix browsers inconsistency on RTL:
- * - Firefox inverts the scrollbar initial position
- * - IE11 inverts both scrollbar position and scrolling offset
- * Directly inspired by @KingSora's OverlayScrollbars https://github.com/KingSora/OverlayScrollbars/blob/master/js/OverlayScrollbars.js#L1634
- */
- SimpleBarCore.getRtlHelpers = function () {
- if (SimpleBarCore.rtlHelpers) {
- return SimpleBarCore.rtlHelpers;
- }
- var dummyDiv = document.createElement('div');
- dummyDiv.innerHTML =
- '<div class="simplebar-dummy-scrollbar-size"><div></div></div>';
- var scrollbarDummyEl = dummyDiv.firstElementChild;
- var dummyChild = scrollbarDummyEl === null || scrollbarDummyEl === void 0 ? void 0 : scrollbarDummyEl.firstElementChild;
- if (!dummyChild)
- return null;
- document.body.appendChild(scrollbarDummyEl);
- scrollbarDummyEl.scrollLeft = 0;
- var dummyContainerOffset = SimpleBarCore.getOffset(scrollbarDummyEl);
- var dummyChildOffset = SimpleBarCore.getOffset(dummyChild);
- scrollbarDummyEl.scrollLeft = -999;
- var dummyChildOffsetAfterScroll = SimpleBarCore.getOffset(dummyChild);
- document.body.removeChild(scrollbarDummyEl);
- SimpleBarCore.rtlHelpers = {
- // determines if the scrolling is responding with negative values
- isScrollOriginAtZero: dummyContainerOffset.left !== dummyChildOffset.left,
- // determines if the origin scrollbar position is inverted or not (positioned on left or right)
- isScrollingToNegative: dummyChildOffset.left !== dummyChildOffsetAfterScroll.left
- };
- return SimpleBarCore.rtlHelpers;
- };
- SimpleBarCore.prototype.getScrollbarWidth = function () {
- // Try/catch for FF 56 throwing on undefined computedStyles
- try {
- // Detect browsers supporting CSS scrollbar styling and do not calculate
- if ((this.contentWrapperEl &&
- getComputedStyle(this.contentWrapperEl, '::-webkit-scrollbar')
- .display === 'none') ||
- 'scrollbarWidth' in document.documentElement.style ||
- '-ms-overflow-style' in document.documentElement.style) {
- return 0;
- }
- else {
- return scrollbarWidth();
- }
- }
- catch (e) {
- return scrollbarWidth();
- }
- };
- SimpleBarCore.getOffset = function (el) {
- var rect = el.getBoundingClientRect();
- var elDocument = getElementDocument(el);
- var elWindow = getElementWindow(el);
- return {
- top: rect.top +
- (elWindow.pageYOffset || elDocument.documentElement.scrollTop),
- left: rect.left +
- (elWindow.pageXOffset || elDocument.documentElement.scrollLeft)
- };
- };
- SimpleBarCore.prototype.init = function () {
- // We stop here on server-side
- if (canUseDOM$1) {
- this.initDOM();
- this.rtlHelpers = SimpleBarCore.getRtlHelpers();
- this.scrollbarWidth = this.getScrollbarWidth();
- this.recalculate();
- this.initListeners();
- }
- };
- SimpleBarCore.prototype.initDOM = function () {
- var _a, _b;
- // assume that element has his DOM already initiated
- this.wrapperEl = this.el.querySelector(classNamesToQuery(this.classNames.wrapper));
- this.contentWrapperEl =
- this.options.scrollableNode ||
- this.el.querySelector(classNamesToQuery(this.classNames.contentWrapper));
- this.contentEl =
- this.options.contentNode ||
- this.el.querySelector(classNamesToQuery(this.classNames.contentEl));
- this.offsetEl = this.el.querySelector(classNamesToQuery(this.classNames.offset));
- this.maskEl = this.el.querySelector(classNamesToQuery(this.classNames.mask));
- this.placeholderEl = this.findChild(this.wrapperEl, classNamesToQuery(this.classNames.placeholder));
- this.heightAutoObserverWrapperEl = this.el.querySelector(classNamesToQuery(this.classNames.heightAutoObserverWrapperEl));
- this.heightAutoObserverEl = this.el.querySelector(classNamesToQuery(this.classNames.heightAutoObserverEl));
- this.axis.x.track.el = this.findChild(this.el, "".concat(classNamesToQuery(this.classNames.track)).concat(classNamesToQuery(this.classNames.horizontal)));
- this.axis.y.track.el = this.findChild(this.el, "".concat(classNamesToQuery(this.classNames.track)).concat(classNamesToQuery(this.classNames.vertical)));
- this.axis.x.scrollbar.el =
- ((_a = this.axis.x.track.el) === null || _a === void 0 ? void 0 : _a.querySelector(classNamesToQuery(this.classNames.scrollbar))) || null;
- this.axis.y.scrollbar.el =
- ((_b = this.axis.y.track.el) === null || _b === void 0 ? void 0 : _b.querySelector(classNamesToQuery(this.classNames.scrollbar))) || null;
- if (!this.options.autoHide) {
- addClasses$2(this.axis.x.scrollbar.el, this.classNames.visible);
- addClasses$2(this.axis.y.scrollbar.el, this.classNames.visible);
- }
- };
- SimpleBarCore.prototype.initListeners = function () {
- var _this = this;
- var _a;
- var elWindow = getElementWindow(this.el);
- // Event listeners
- this.el.addEventListener('mouseenter', this.onMouseEnter);
- this.el.addEventListener('pointerdown', this.onPointerEvent, true);
- this.el.addEventListener('mousemove', this.onMouseMove);
- this.el.addEventListener('mouseleave', this.onMouseLeave);
- (_a = this.contentWrapperEl) === null || _a === void 0 ? void 0 : _a.addEventListener('scroll', this.onScroll);
- // Browser zoom triggers a window resize
- elWindow.addEventListener('resize', this.onWindowResize);
- if (!this.contentEl)
- return;
- if (window.ResizeObserver) {
- // Hack for https://github.com/WICG/ResizeObserver/issues/38
- var resizeObserverStarted_1 = false;
- var resizeObserver = elWindow.ResizeObserver || ResizeObserver;
- this.resizeObserver = new resizeObserver(function () {
- if (!resizeObserverStarted_1)
- return;
- elWindow.requestAnimationFrame(function () {
- _this.recalculate();
- });
- });
- this.resizeObserver.observe(this.el);
- this.resizeObserver.observe(this.contentEl);
- elWindow.requestAnimationFrame(function () {
- resizeObserverStarted_1 = true;
- });
- }
- // This is required to detect horizontal scroll. Vertical scroll only needs the resizeObserver.
- this.mutationObserver = new elWindow.MutationObserver(function () {
- elWindow.requestAnimationFrame(function () {
- _this.recalculate();
- });
- });
- this.mutationObserver.observe(this.contentEl, {
- childList: true,
- subtree: true,
- characterData: true
- });
- };
- SimpleBarCore.prototype.recalculate = function () {
- if (!this.heightAutoObserverEl ||
- !this.contentEl ||
- !this.contentWrapperEl ||
- !this.wrapperEl ||
- !this.placeholderEl)
- return;
- var elWindow = getElementWindow(this.el);
- this.elStyles = elWindow.getComputedStyle(this.el);
- this.isRtl = this.elStyles.direction === 'rtl';
- var contentElOffsetWidth = this.contentEl.offsetWidth;
- var isHeightAuto = this.heightAutoObserverEl.offsetHeight <= 1;
- var isWidthAuto = this.heightAutoObserverEl.offsetWidth <= 1 || contentElOffsetWidth > 0;
- var contentWrapperElOffsetWidth = this.contentWrapperEl.offsetWidth;
- var elOverflowX = this.elStyles.overflowX;
- var elOverflowY = this.elStyles.overflowY;
- this.contentEl.style.padding = "".concat(this.elStyles.paddingTop, " ").concat(this.elStyles.paddingRight, " ").concat(this.elStyles.paddingBottom, " ").concat(this.elStyles.paddingLeft);
- this.wrapperEl.style.margin = "-".concat(this.elStyles.paddingTop, " -").concat(this.elStyles.paddingRight, " -").concat(this.elStyles.paddingBottom, " -").concat(this.elStyles.paddingLeft);
- var contentElScrollHeight = this.contentEl.scrollHeight;
- var contentElScrollWidth = this.contentEl.scrollWidth;
- this.contentWrapperEl.style.height = isHeightAuto ? 'auto' : '100%';
- // Determine placeholder size
- this.placeholderEl.style.width = isWidthAuto
- ? "".concat(contentElOffsetWidth || contentElScrollWidth, "px")
- : 'auto';
- this.placeholderEl.style.height = "".concat(contentElScrollHeight, "px");
- var contentWrapperElOffsetHeight = this.contentWrapperEl.offsetHeight;
- this.axis.x.isOverflowing =
- contentElOffsetWidth !== 0 && contentElScrollWidth > contentElOffsetWidth;
- this.axis.y.isOverflowing =
- contentElScrollHeight > contentWrapperElOffsetHeight;
- // Set isOverflowing to false if user explicitely set hidden overflow
- this.axis.x.isOverflowing =
- elOverflowX === 'hidden' ? false : this.axis.x.isOverflowing;
- this.axis.y.isOverflowing =
- elOverflowY === 'hidden' ? false : this.axis.y.isOverflowing;
- this.axis.x.forceVisible =
- this.options.forceVisible === 'x' || this.options.forceVisible === true;
- this.axis.y.forceVisible =
- this.options.forceVisible === 'y' || this.options.forceVisible === true;
- this.hideNativeScrollbar();
- // Set isOverflowing to false if scrollbar is not necessary (content is shorter than offset)
- var offsetForXScrollbar = this.axis.x.isOverflowing
- ? this.scrollbarWidth
- : 0;
- var offsetForYScrollbar = this.axis.y.isOverflowing
- ? this.scrollbarWidth
- : 0;
- this.axis.x.isOverflowing =
- this.axis.x.isOverflowing &&
- contentElScrollWidth > contentWrapperElOffsetWidth - offsetForYScrollbar;
- this.axis.y.isOverflowing =
- this.axis.y.isOverflowing &&
- contentElScrollHeight >
- contentWrapperElOffsetHeight - offsetForXScrollbar;
- this.axis.x.scrollbar.size = this.getScrollbarSize('x');
- this.axis.y.scrollbar.size = this.getScrollbarSize('y');
- if (this.axis.x.scrollbar.el)
- this.axis.x.scrollbar.el.style.width = "".concat(this.axis.x.scrollbar.size, "px");
- if (this.axis.y.scrollbar.el)
- this.axis.y.scrollbar.el.style.height = "".concat(this.axis.y.scrollbar.size, "px");
- this.positionScrollbar('x');
- this.positionScrollbar('y');
- this.toggleTrackVisibility('x');
- this.toggleTrackVisibility('y');
- };
- /**
- * Calculate scrollbar size
- */
- SimpleBarCore.prototype.getScrollbarSize = function (axis) {
- var _a, _b;
- if (axis === void 0) { axis = 'y'; }
- if (!this.axis[axis].isOverflowing || !this.contentEl) {
- return 0;
- }
- var contentSize = this.contentEl[this.axis[axis].scrollSizeAttr];
- var trackSize = (_b = (_a = this.axis[axis].track.el) === null || _a === void 0 ? void 0 : _a[this.axis[axis].offsetSizeAttr]) !== null && _b !== void 0 ? _b : 0;
- var scrollbarRatio = trackSize / contentSize;
- var scrollbarSize;
- // Calculate new height/position of drag handle.
- scrollbarSize = Math.max(~~(scrollbarRatio * trackSize), this.options.scrollbarMinSize);
- if (this.options.scrollbarMaxSize) {
- scrollbarSize = Math.min(scrollbarSize, this.options.scrollbarMaxSize);
- }
- return scrollbarSize;
- };
- SimpleBarCore.prototype.positionScrollbar = function (axis) {
- var _a, _b, _c;
- if (axis === void 0) { axis = 'y'; }
- var scrollbar = this.axis[axis].scrollbar;
- if (!this.axis[axis].isOverflowing ||
- !this.contentWrapperEl ||
- !scrollbar.el ||
- !this.elStyles) {
- return;
- }
- var contentSize = this.contentWrapperEl[this.axis[axis].scrollSizeAttr];
- var trackSize = ((_a = this.axis[axis].track.el) === null || _a === void 0 ? void 0 : _a[this.axis[axis].offsetSizeAttr]) || 0;
- var hostSize = parseInt(this.elStyles[this.axis[axis].sizeAttr], 10);
- var scrollOffset = this.contentWrapperEl[this.axis[axis].scrollOffsetAttr];
- scrollOffset =
- axis === 'x' &&
- this.isRtl &&
- ((_b = SimpleBarCore.getRtlHelpers()) === null || _b === void 0 ? void 0 : _b.isScrollOriginAtZero)
- ? -scrollOffset
- : scrollOffset;
- if (axis === 'x' && this.isRtl) {
- scrollOffset = ((_c = SimpleBarCore.getRtlHelpers()) === null || _c === void 0 ? void 0 : _c.isScrollingToNegative)
- ? scrollOffset
- : -scrollOffset;
- }
- var scrollPourcent = scrollOffset / (contentSize - hostSize);
- var handleOffset = ~~((trackSize - scrollbar.size) * scrollPourcent);
- handleOffset =
- axis === 'x' && this.isRtl
- ? -handleOffset + (trackSize - scrollbar.size)
- : handleOffset;
- scrollbar.el.style.transform =
- axis === 'x'
- ? "translate3d(".concat(handleOffset, "px, 0, 0)")
- : "translate3d(0, ".concat(handleOffset, "px, 0)");
- };
- SimpleBarCore.prototype.toggleTrackVisibility = function (axis) {
- if (axis === void 0) { axis = 'y'; }
- var track = this.axis[axis].track.el;
- var scrollbar = this.axis[axis].scrollbar.el;
- if (!track || !scrollbar || !this.contentWrapperEl)
- return;
- if (this.axis[axis].isOverflowing || this.axis[axis].forceVisible) {
- track.style.visibility = 'visible';
- this.contentWrapperEl.style[this.axis[axis].overflowAttr] = 'scroll';
- this.el.classList.add("".concat(this.classNames.scrollable, "-").concat(axis));
- }
- else {
- track.style.visibility = 'hidden';
- this.contentWrapperEl.style[this.axis[axis].overflowAttr] = 'hidden';
- this.el.classList.remove("".concat(this.classNames.scrollable, "-").concat(axis));
- }
- // Even if forceVisible is enabled, scrollbar itself should be hidden
- if (this.axis[axis].isOverflowing) {
- scrollbar.style.display = 'block';
- }
- else {
- scrollbar.style.display = 'none';
- }
- };
- SimpleBarCore.prototype.showScrollbar = function (axis) {
- if (axis === void 0) { axis = 'y'; }
- if (this.axis[axis].isOverflowing && !this.axis[axis].scrollbar.isVisible) {
- addClasses$2(this.axis[axis].scrollbar.el, this.classNames.visible);
- this.axis[axis].scrollbar.isVisible = true;
- }
- };
- SimpleBarCore.prototype.hideScrollbar = function (axis) {
- if (axis === void 0) { axis = 'y'; }
- if (this.isDragging)
- return;
- if (this.axis[axis].isOverflowing && this.axis[axis].scrollbar.isVisible) {
- removeClasses(this.axis[axis].scrollbar.el, this.classNames.visible);
- this.axis[axis].scrollbar.isVisible = false;
- }
- };
- SimpleBarCore.prototype.hideNativeScrollbar = function () {
- if (!this.offsetEl)
- return;
- this.offsetEl.style[this.isRtl ? 'left' : 'right'] =
- this.axis.y.isOverflowing || this.axis.y.forceVisible
- ? "-".concat(this.scrollbarWidth, "px")
- : '0px';
- this.offsetEl.style.bottom =
- this.axis.x.isOverflowing || this.axis.x.forceVisible
- ? "-".concat(this.scrollbarWidth, "px")
- : '0px';
- };
- SimpleBarCore.prototype.onMouseMoveForAxis = function (axis) {
- if (axis === void 0) { axis = 'y'; }
- var currentAxis = this.axis[axis];
- if (!currentAxis.track.el || !currentAxis.scrollbar.el)
- return;
- currentAxis.track.rect = currentAxis.track.el.getBoundingClientRect();
- currentAxis.scrollbar.rect =
- currentAxis.scrollbar.el.getBoundingClientRect();
- if (this.isWithinBounds(currentAxis.track.rect)) {
- this.showScrollbar(axis);
- addClasses$2(currentAxis.track.el, this.classNames.hover);
- if (this.isWithinBounds(currentAxis.scrollbar.rect)) {
- addClasses$2(currentAxis.scrollbar.el, this.classNames.hover);
- }
- else {
- removeClasses(currentAxis.scrollbar.el, this.classNames.hover);
- }
- }
- else {
- removeClasses(currentAxis.track.el, this.classNames.hover);
- if (this.options.autoHide) {
- this.hideScrollbar(axis);
- }
- }
- };
- SimpleBarCore.prototype.onMouseLeaveForAxis = function (axis) {
- if (axis === void 0) { axis = 'y'; }
- removeClasses(this.axis[axis].track.el, this.classNames.hover);
- removeClasses(this.axis[axis].scrollbar.el, this.classNames.hover);
- if (this.options.autoHide) {
- this.hideScrollbar(axis);
- }
- };
- /**
- * on scrollbar handle drag movement starts
- */
- SimpleBarCore.prototype.onDragStart = function (e, axis) {
- var _a;
- if (axis === void 0) { axis = 'y'; }
- this.isDragging = true;
- var elDocument = getElementDocument(this.el);
- var elWindow = getElementWindow(this.el);
- var scrollbar = this.axis[axis].scrollbar;
- // Measure how far the user's mouse is from the top of the scrollbar drag handle.
- var eventOffset = axis === 'y' ? e.pageY : e.pageX;
- this.axis[axis].dragOffset =
- eventOffset - (((_a = scrollbar.rect) === null || _a === void 0 ? void 0 : _a[this.axis[axis].offsetAttr]) || 0);
- this.draggedAxis = axis;
- addClasses$2(this.el, this.classNames.dragging);
- elDocument.addEventListener('mousemove', this.drag, true);
- elDocument.addEventListener('mouseup', this.onEndDrag, true);
- if (this.removePreventClickId === null) {
- elDocument.addEventListener('click', this.preventClick, true);
- elDocument.addEventListener('dblclick', this.preventClick, true);
- }
- else {
- elWindow.clearTimeout(this.removePreventClickId);
- this.removePreventClickId = null;
- }
- };
- SimpleBarCore.prototype.onTrackClick = function (e, axis) {
- var _this = this;
- var _a, _b, _c, _d;
- if (axis === void 0) { axis = 'y'; }
- var currentAxis = this.axis[axis];
- if (!this.options.clickOnTrack ||
- !currentAxis.scrollbar.el ||
- !this.contentWrapperEl)
- return;
- // Preventing the event's default to trigger click underneath
- e.preventDefault();
- var elWindow = getElementWindow(this.el);
- this.axis[axis].scrollbar.rect =
- currentAxis.scrollbar.el.getBoundingClientRect();
- var scrollbar = this.axis[axis].scrollbar;
- var scrollbarOffset = (_b = (_a = scrollbar.rect) === null || _a === void 0 ? void 0 : _a[this.axis[axis].offsetAttr]) !== null && _b !== void 0 ? _b : 0;
- var hostSize = parseInt((_d = (_c = this.elStyles) === null || _c === void 0 ? void 0 : _c[this.axis[axis].sizeAttr]) !== null && _d !== void 0 ? _d : '0px', 10);
- var scrolled = this.contentWrapperEl[this.axis[axis].scrollOffsetAttr];
- var t = axis === 'y'
- ? this.mouseY - scrollbarOffset
- : this.mouseX - scrollbarOffset;
- var dir = t < 0 ? -1 : 1;
- var scrollSize = dir === -1 ? scrolled - hostSize : scrolled + hostSize;
- var speed = 40;
- var scrollTo = function () {
- if (!_this.contentWrapperEl)
- return;
- if (dir === -1) {
- if (scrolled > scrollSize) {
- scrolled -= speed;
- _this.contentWrapperEl[_this.axis[axis].scrollOffsetAttr] = scrolled;
- elWindow.requestAnimationFrame(scrollTo);
- }
- }
- else {
- if (scrolled < scrollSize) {
- scrolled += speed;
- _this.contentWrapperEl[_this.axis[axis].scrollOffsetAttr] = scrolled;
- elWindow.requestAnimationFrame(scrollTo);
- }
- }
- };
- scrollTo();
- };
- /**
- * Getter for content element
- */
- SimpleBarCore.prototype.getContentElement = function () {
- return this.contentEl;
- };
- /**
- * Getter for original scrolling element
- */
- SimpleBarCore.prototype.getScrollElement = function () {
- return this.contentWrapperEl;
- };
- SimpleBarCore.prototype.removeListeners = function () {
- var elWindow = getElementWindow(this.el);
- // Event listeners
- this.el.removeEventListener('mouseenter', this.onMouseEnter);
- this.el.removeEventListener('pointerdown', this.onPointerEvent, true);
- this.el.removeEventListener('mousemove', this.onMouseMove);
- this.el.removeEventListener('mouseleave', this.onMouseLeave);
- if (this.contentWrapperEl) {
- this.contentWrapperEl.removeEventListener('scroll', this.onScroll);
- }
- elWindow.removeEventListener('resize', this.onWindowResize);
- if (this.mutationObserver) {
- this.mutationObserver.disconnect();
- }
- if (this.resizeObserver) {
- this.resizeObserver.disconnect();
- }
- // Cancel all debounced functions
- this.onMouseMove.cancel();
- this.onWindowResize.cancel();
- this.onStopScrolling.cancel();
- this.onMouseEntered.cancel();
- };
- /**
- * Remove all listeners from DOM nodes
- */
- SimpleBarCore.prototype.unMount = function () {
- this.removeListeners();
- };
- /**
- * Check if mouse is within bounds
- */
- SimpleBarCore.prototype.isWithinBounds = function (bbox) {
- return (this.mouseX >= bbox.left &&
- this.mouseX <= bbox.left + bbox.width &&
- this.mouseY >= bbox.top &&
- this.mouseY <= bbox.top + bbox.height);
- };
- /**
- * Find element children matches query
- */
- SimpleBarCore.prototype.findChild = function (el, query) {
- var matches = el.matches ||
- el.webkitMatchesSelector ||
- el.mozMatchesSelector ||
- el.msMatchesSelector;
- return Array.prototype.filter.call(el.children, function (child) {
- return matches.call(child, query);
- })[0];
- };
- SimpleBarCore.rtlHelpers = null;
- SimpleBarCore.defaultOptions = {
- forceVisible: false,
- clickOnTrack: true,
- scrollbarMinSize: 25,
- scrollbarMaxSize: 0,
- ariaLabel: 'scrollable content',
- tabIndex: 0,
- classNames: {
- contentEl: 'simplebar-content',
- contentWrapper: 'simplebar-content-wrapper',
- offset: 'simplebar-offset',
- mask: 'simplebar-mask',
- wrapper: 'simplebar-wrapper',
- placeholder: 'simplebar-placeholder',
- scrollbar: 'simplebar-scrollbar',
- track: 'simplebar-track',
- heightAutoObserverWrapperEl: 'simplebar-height-auto-observer-wrapper',
- heightAutoObserverEl: 'simplebar-height-auto-observer',
- visible: 'simplebar-visible',
- horizontal: 'simplebar-horizontal',
- vertical: 'simplebar-vertical',
- hover: 'simplebar-hover',
- dragging: 'simplebar-dragging',
- scrolling: 'simplebar-scrolling',
- scrollable: 'simplebar-scrollable',
- mouseEntered: 'simplebar-mouse-entered'
- },
- scrollableNode: null,
- contentNode: null,
- autoHide: true
- };
- /**
- * Static functions
- */
- SimpleBarCore.getOptions = getOptions$2;
- SimpleBarCore.helpers = helpers;
- return SimpleBarCore;
- }());
- var _a = SimpleBarCore.helpers, getOptions = _a.getOptions, addClasses = _a.addClasses, canUseDOM = _a.canUseDOM;
- var SimpleBar = /** @class */ (function (_super) {
- __extends(SimpleBar, _super);
- function SimpleBar() {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- var _this = _super.apply(this, args) || this;
- // // Save a reference to the instance, so we know this DOM node has already been instancied
- SimpleBar.instances.set(args[0], _this);
- return _this;
- }
- SimpleBar.initDOMLoadedElements = function () {
- document.removeEventListener('DOMContentLoaded', this.initDOMLoadedElements);
- window.removeEventListener('load', this.initDOMLoadedElements);
- Array.prototype.forEach.call(document.querySelectorAll('[data-simplebar]'), function (el) {
- if (el.getAttribute('data-simplebar') !== 'init' &&
- !SimpleBar.instances.has(el))
- new SimpleBar(el, getOptions(el.attributes));
- });
- };
- SimpleBar.removeObserver = function () {
- var _a;
- (_a = SimpleBar.globalObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
- };
- SimpleBar.prototype.initDOM = function () {
- var _this = this;
- var _a, _b, _c;
- // make sure this element doesn't have the elements yet
- if (!Array.prototype.filter.call(this.el.children, function (child) {
- return child.classList.contains(_this.classNames.wrapper);
- }).length) {
- // Prepare DOM
- this.wrapperEl = document.createElement('div');
- this.contentWrapperEl = document.createElement('div');
- this.offsetEl = document.createElement('div');
- this.maskEl = document.createElement('div');
- this.contentEl = document.createElement('div');
- this.placeholderEl = document.createElement('div');
- this.heightAutoObserverWrapperEl = document.createElement('div');
- this.heightAutoObserverEl = document.createElement('div');
- addClasses(this.wrapperEl, this.classNames.wrapper);
- addClasses(this.contentWrapperEl, this.classNames.contentWrapper);
- addClasses(this.offsetEl, this.classNames.offset);
- addClasses(this.maskEl, this.classNames.mask);
- addClasses(this.contentEl, this.classNames.contentEl);
- addClasses(this.placeholderEl, this.classNames.placeholder);
- addClasses(this.heightAutoObserverWrapperEl, this.classNames.heightAutoObserverWrapperEl);
- addClasses(this.heightAutoObserverEl, this.classNames.heightAutoObserverEl);
- while (this.el.firstChild) {
- this.contentEl.appendChild(this.el.firstChild);
- }
- this.contentWrapperEl.appendChild(this.contentEl);
- this.offsetEl.appendChild(this.contentWrapperEl);
- this.maskEl.appendChild(this.offsetEl);
- this.heightAutoObserverWrapperEl.appendChild(this.heightAutoObserverEl);
- this.wrapperEl.appendChild(this.heightAutoObserverWrapperEl);
- this.wrapperEl.appendChild(this.maskEl);
- this.wrapperEl.appendChild(this.placeholderEl);
- this.el.appendChild(this.wrapperEl);
- (_a = this.contentWrapperEl) === null || _a === void 0 ? void 0 : _a.setAttribute('tabindex', this.options.tabIndex.toString());
- (_b = this.contentWrapperEl) === null || _b === void 0 ? void 0 : _b.setAttribute('role', 'region');
- (_c = this.contentWrapperEl) === null || _c === void 0 ? void 0 : _c.setAttribute('aria-label', this.options.ariaLabel);
- }
- if (!this.axis.x.track.el || !this.axis.y.track.el) {
- var track = document.createElement('div');
- var scrollbar = document.createElement('div');
- addClasses(track, this.classNames.track);
- addClasses(scrollbar, this.classNames.scrollbar);
- track.appendChild(scrollbar);
- this.axis.x.track.el = track.cloneNode(true);
- addClasses(this.axis.x.track.el, this.classNames.horizontal);
- this.axis.y.track.el = track.cloneNode(true);
- addClasses(this.axis.y.track.el, this.classNames.vertical);
- this.el.appendChild(this.axis.x.track.el);
- this.el.appendChild(this.axis.y.track.el);
- }
- SimpleBarCore.prototype.initDOM.call(this);
- this.el.setAttribute('data-simplebar', 'init');
- };
- SimpleBar.prototype.unMount = function () {
- SimpleBarCore.prototype.unMount.call(this);
- SimpleBar.instances["delete"](this.el);
- };
- SimpleBar.initHtmlApi = function () {
- this.initDOMLoadedElements = this.initDOMLoadedElements.bind(this);
- // MutationObserver is IE11+
- if (typeof MutationObserver !== 'undefined') {
- // Mutation observer to observe dynamically added elements
- this.globalObserver = new MutationObserver(SimpleBar.handleMutations);
- this.globalObserver.observe(document, { childList: true, subtree: true });
- }
- // Taken from jQuery `ready` function
- // Instantiate elements already present on the page
- if (document.readyState === 'complete' || // @ts-ignore: IE specific
- (document.readyState !== 'loading' && !document.documentElement.doScroll)) {
- // Handle it asynchronously to allow scripts the opportunity to delay init
- window.setTimeout(this.initDOMLoadedElements);
- }
- else {
- document.addEventListener('DOMContentLoaded', this.initDOMLoadedElements);
- window.addEventListener('load', this.initDOMLoadedElements);
- }
- };
- SimpleBar.handleMutations = function (mutations) {
- mutations.forEach(function (mutation) {
- mutation.addedNodes.forEach(function (addedNode) {
- if (addedNode.nodeType === 1) {
- if (addedNode.hasAttribute('data-simplebar')) {
- !SimpleBar.instances.has(addedNode) &&
- document.documentElement.contains(addedNode) &&
- new SimpleBar(addedNode, getOptions(addedNode.attributes));
- }
- else {
- addedNode
- .querySelectorAll('[data-simplebar]')
- .forEach(function (el) {
- if (el.getAttribute('data-simplebar') !== 'init' &&
- !SimpleBar.instances.has(el) &&
- document.documentElement.contains(el))
- new SimpleBar(el, getOptions(el.attributes));
- });
- }
- }
- });
- mutation.removedNodes.forEach(function (removedNode) {
- var _a;
- if (removedNode.nodeType === 1) {
- if (removedNode.getAttribute('data-simplebar') === 'init') {
- !document.documentElement.contains(removedNode) &&
- ((_a = SimpleBar.instances.get(removedNode)) === null || _a === void 0 ? void 0 : _a.unMount());
- }
- else {
- Array.prototype.forEach.call(removedNode.querySelectorAll('[data-simplebar="init"]'), function (el) {
- var _a;
- !document.documentElement.contains(el) &&
- ((_a = SimpleBar.instances.get(el)) === null || _a === void 0 ? void 0 : _a.unMount());
- });
- }
- }
- });
- });
- };
- SimpleBar.instances = new WeakMap();
- return SimpleBar;
- }(SimpleBarCore));
- /**
- * HTML API
- * Called only in a browser env.
- */
- if (canUseDOM) {
- SimpleBar.initHtmlApi();
- }
- return SimpleBar;
- })();
|